138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6631|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. ^" @* x* l% H7 `; C' M' O6 i, }! v) _: P
问题描述:
- ~" T2 r( i$ W7 f在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% |( A  W8 Q) W; C3 _4 Q3 M6 \, G: r0 d# x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" e0 `: v  [  {2 I+ B

9 B6 q7 r& K3 x7 W测试结果如下:* L+ s( Q# [- ]/ e7 D
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# @7 O- C+ y9 X( g7 y
9 h# v; H  D$ C) _7 ]0 ]' w: y/ N1 n  m$ ~7 D/ I: k. M: R' b1 `! p
备注:
4 C9 h% l$ Q9 w& h$ X  J" ?* v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 D, A3 L1 k' [9 q, K6 z
2、相关代码如下:
, {1 r9 N% ]3 V$ D9 r2 V. I//UPP DMA缓冲大小512字节
0 M+ p6 B, [3 j" Z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ I: ~% u! U% T( D4 o6 b! |5 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 R: [( f2 Y7 S: U* m, Z9 z. ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' b9 d3 H- H7 @

  \- v  _5 d" j
, B6 M9 A' [2 n4 b//upp接收、发送buffer7 B: L% }; O0 A$ w3 C& b
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 }4 u5 r% H; n) c& M0 M8 o#pragma DATA_ALIGN(upp_buffer_b, 8)' q9 ~- O1 _: r8 J5 _
- c: j& c0 X( ~1 l0 F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ k5 j5 ~  o, N: P3 I2 N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- f& [+ e1 P$ B% h) g  d8 E
! E# \- P* L' c9 W/ Z9 b& q0 e

1 E& p4 K# E2 s# C  @static bool server_upp_data_recv(Server *server) 7 T0 v" p( X% B7 R& v2 g; h
{* h& |* c: Z" S, k$ S% ]
    if(server->upp_channel_a_recv == false) {
' x8 A7 u" Z' q6 q4 f        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! z" O+ ]" K* g8 e/ ?9 `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ d& A3 A3 ]% E, J( ^# r$ ^- z
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, M! \: E* F/ ]+ I+ ~" c0 i
& {: |& G8 B  G1 Q+ M# [

' o- r5 q& n* x) G- f$ W. \8 ?            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& a9 A3 o. h' o; z2 _
; o4 u/ `6 I2 t/ L+ s7 \1 k
            server->upp_channel_a_recv = true;//6 ]* l3 H$ ]0 Z0 i
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);9 p. a  ]2 C- [+ W" @
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" ^7 `" N$ ^" K0 P            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ Y' U3 U9 v  C: e. X5 E0 H            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: @' V6 e% x: W4 \0 p0 Z4 {

7 Q( N# H; x# [  X% W; A            upp_error_count = 0;
. g# g1 y/ \0 B  ?; v            upp_dmai_int_cut = 0;* m3 n0 A  q$ s4 i0 B$ q7 C* t. K
) O) N: C* r1 i2 B8 Q$ w+ ?
            // fill in data * ?: _/ f# C' [1 k
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 `3 e% x0 X- f/ s            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 k' O. P# S7 I. g( o# K( f        }* Z1 w7 ]5 s. O: t9 A6 u* Z9 S* z
    }
9 n3 b" c5 c/ c3 ?) f% T2 s6 O    else{8 H7 Z. L+ z; g  E9 L
        if (upp_dmai_int_cut > 0){
9 z' Q8 @# X- |2 m7 w, j2 D            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 k/ m8 `$ D" R. A1 L( L  k: t3 `            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" m+ H, s3 W" \
" R6 I* [1 G9 O$ h) q; P

# I4 ^- R( d5 [- G0 D* Y, E4 C            //copy data to upp_recv_list_busy; R/ S9 T/ x; j4 I+ G+ J
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 L, g% F" T+ ^, I4 Q! Y9 F
5 T6 u5 n( z6 A2 w4 O5 b; j            //
" k, k  ?5 x% c& I0 _0 ]            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; O# h" l( O5 v9 J0 A# s- Y+ Y, D+ U$ J
            //
. R, W8 @. n7 N9 E8 W5 B            server->upp_channel_a_recv = false;//! D1 [, o' V* x. p% i  `
$ X: m+ J: F0 A
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, S! ]7 o* P) ^- z* M4 z' S        }- p2 H% x  g( ^' k
    }
* H5 \% J8 d- B# a- c; \/ M2 R1 a
* h8 T. P2 {" |" q6 {: P
2 j4 T$ `7 n2 W4 e8 u    return true;& }( C5 \& l! [# G: o. b' b' K
}
3 i& r) U; l2 ]! W' y9 k0 F; J
static bool server_upp_data_send(Server *server)
1 p1 \- u- d, l4 _{
1 F* W0 L1 H6 u8 i2 S9 s  M1 e% W, G    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; u0 `8 _1 q( Z2 d$ Y" c        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, P; j- o9 w6 X: d1 b# _: p* }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 ]/ b. P+ T1 Z( f( H5 r
        char tmp[128] ={0};& G. D& h9 c) e

) y4 s- W* ]9 p/ _& O        server_msg_send(server, APP_CMD_LOG, "upp send: start");) Q: W* c2 O! m. q' n; T
        print_log(server, data, 64);
3 D3 T: n" l: j8 E! ^3 y9 X  c. ^7 G# i* W
        //
9 {. K3 e# U: n$ X% g# G        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% M; ~" L. @' p! F+ H        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, m8 t' V7 b9 [" N$ r' Y
        print_log(server, upp_buffer_b, 64);9 ^6 {1 ^4 u" l6 K2 E2 ~

: Q  H6 A% k6 x+ _, u/ F( z6 V        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);5 B5 [! F. @$ P8 ?. ?* Q4 K
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 a, B2 ^( K0 M/ n' U& ?7 J        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, I2 S# k8 |" z& J$ f) g" w  m4 A
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, _# {* E: ^: l$ U6 @* H$ R1 k
* U" `, r0 @9 N; a) M. y
        memset(tmp, 0, sizeof(tmp));
# F- U: f$ o5 Z2 S        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 _$ u, r& s7 a6 Y  c# r
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; J; a4 q% K$ v: D5 c9 h        server_msg_send(server, APP_CMD_LOG, tmp);
  T/ Z( [5 h5 d, m
8 V) {* J3 h) T        upp_error_count = 0;
" f& t8 o6 O6 q$ T9 B/ u        upp_dmaq_int_cut = 0;# D9 ]% {. u# j# o# K1 X4 y* Q" ~
        // fill in data 9 _$ I# S. c4 e! a7 ~5 ?2 D
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 f5 K& e+ ?1 S) |, Q' ?
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 Q! Z, D* l5 {( h7 H( z& R  O* n

' K  o: h$ k8 w. |9 S- N/ `        // wait send success
, v2 \; t3 S; d        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 [3 ^1 D0 l9 {! m
5 G* c$ e0 b/ t6 a/ O
        // make data node in free list
# G  p; e; Q; }  @" E        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 r# p& D1 L: L6 O
        server_msg_send(server, APP_CMD_LOG, "upp send: success");& W$ {9 F- n6 H( R
    }
6 @, p) S; P3 q% }9 Q0 X2 t    return true;4 F5 j+ |# d+ z' K4 p9 }1 T
}
! {5 u' G% W8 ?  F
* K. P( j# {2 B
# G( k  {3 [; A7 w6 I4 `* v) k

5 i) Y0 Y! H' Y9 V( P

% a; t! Z8 d* Y- s( y1 W
, ^6 {1 r* g, n/ B' k: T; ], i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
2 ?5 l0 T( [, y( K0 m) `/ n8 _: t; k6 `/ M

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-19 11:24 , Processed in 0.055790 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表