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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑   q: R! J) s5 A. D+ g* K, u$ c  c* k
. O8 x# l2 @% i, t# ^4 H
问题描述:
! e8 J# E% j1 @, J, Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
  R8 h7 w- O" Z1 v( b! r% J8 a9 N4 ~7 W  M- M& |
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 F) B7 B/ q; g. ]% o, T* t* l8 g* B* d/ |% i$ j$ q7 ?; W( d: r' a; h
测试结果如下:! g( z- w/ v3 m) Q3 x: J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ n2 B( W) v! R8 Q2 R6 }: I

' U$ X+ ]; b$ f9 b( h2 q; G) e7 |. w: t- }' g8 Z
备注:
* c* j+ \2 G4 k) D& G1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! ?/ ]4 c, y# p8 y: O% H5 V* _
2、相关代码如下:
: j& @% x8 J3 K$ j7 N. \; z//UPP DMA缓冲大小512字节
, h0 r+ d( ^; `# ^! g5 n+ g#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- x0 f% A- z- o#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" x0 X! z0 [+ g5 U% g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' a" B( U" w! c3 k; y- ^

% c" ?2 T- ~. J: a- c, M- ]
7 J) N  q9 f4 w/ r//upp接收、发送buffer
% K1 B$ h3 u8 H" `#pragma DATA_ALIGN(upp_buffer_a, 8)
# k; Z/ O' S, f1 r1 U#pragma DATA_ALIGN(upp_buffer_b, 8)$ X' |) I' C6 L8 w! C) U( }5 i

6 P2 I2 h+ e/ T, k2 c& u2 iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( c# b) H" L0 Z, s
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" I# n" J& T2 @$ Z( y
; W% V$ Y1 y8 y* s0 n8 u# Z# p9 J0 n. Q6 I' o4 Z8 F
static bool server_upp_data_recv(Server *server)
8 W6 Y3 [/ k3 `{1 U  o: T; F* A2 k
    if(server->upp_channel_a_recv == false) {+ P1 D! p( q$ s6 Q2 H$ D! h
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* J( g7 Y& L3 e" w0 m! w, C
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- ]: ~) ]/ [9 s) Y
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
  P" A# ^/ E0 f( W0 D5 d- b3 k0 k' y6 u! q  }) M

$ e" U. T" U5 s8 A5 |            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' }  P1 d0 X2 ?& S1 s. D
% n- K% U7 D4 q8 ~6 B' `0 @; I            server->upp_channel_a_recv = true;//9 W' t& S. S' }* c% c& i
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! ?, T# g! G& b            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
# J9 H" h- W+ E3 d% I" Q- P' x            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
/ B! U; u4 e  r$ \            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' \4 u8 h0 W8 B9 V# b* K$ ]: N
7 ~* |+ w; v% f
            upp_error_count = 0;( f. [3 l  i3 f+ i
            upp_dmai_int_cut = 0;% `2 e! D1 n  M  T( }# k# c( H$ ]
1 d: ?! @' r( x" c& P4 t
            // fill in data
) s2 y1 r( [$ ?1 ]4 `  R            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 A% I5 U; U, f" t* |6 p
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");& e7 E9 o( o* T# b. |% }
        }
9 _0 @3 L' `+ N* Y& Y- ?    }
+ b& R) f3 G# K8 O    else{  [; @6 G2 \" h( N
        if (upp_dmai_int_cut > 0){
) q& ]2 ]- I0 ?% T6 r! N' y% q            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 L! E% V' [. n# E4 `
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ `5 B% D) [" E- G

1 l2 z3 s1 C1 |: I& _; }( F' ]" E% P7 C# b* Z# o8 O
            //copy data to upp_recv_list_busy1 A  T* U+ p; [$ Q. E
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ V( ?3 X) o* [& t, o
# c" D! X3 D3 p* }. _2 W- y6 {            //8 O) X8 n# u: s7 X; g
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: R8 f/ m  k( }' L0 q1 V5 g3 s6 ]
% ]) N/ O2 g/ G: z, d0 C
            //! J/ j  C& |5 P# J* c$ m' E* `$ N( @: o8 |
            server->upp_channel_a_recv = false;//
! G" y/ h* u6 R9 K2 s. V2 C* O1 Q$ U- j9 _, T
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 |$ J7 B2 O4 N4 ]$ A  F. h
        }
/ \" L4 {$ G/ t4 f2 I    }* I; m3 \) ~. G
, ?6 S  |& W9 I- u

( m7 b  [" M% @; E* }  ], {, t    return true;8 y, v. S, F2 h+ B5 R
}, x1 f# I0 M, M( F3 L# W
( ]2 w3 O# l& _0 u
static bool server_upp_data_send(Server *server)
0 \$ l' N1 |( u: b2 Q; k{
4 g* q( H* ]7 V% B/ M7 T    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! R3 M! r: T$ [7 o4 h0 K
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" h9 y0 U5 o1 P/ a9 K- t8 z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 Q' k" F+ S: B9 `) F. |( P0 x& a( h9 p
        char tmp[128] ={0};: h/ k3 H/ f5 C% t2 X- ]3 w
+ [) r  g; k& d* @5 B9 W/ Y) h
        server_msg_send(server, APP_CMD_LOG, "upp send: start");: K: o1 j! \9 O- ^$ S6 w
        print_log(server, data, 64);7 ?% m+ M7 C" W3 k7 j

) N+ m" t5 o3 J7 e- t: j$ Y        //  B5 [+ R/ U5 T5 j: J5 G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) U0 x" g; _8 ?        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 v3 r# W9 F$ S        print_log(server, upp_buffer_b, 64);: O1 M! ]; W2 j$ {) x2 G3 s

" l/ a! f$ D) a2 k0 U$ }        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
+ b" P! E$ y2 Y# z" f0 n        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 8 s& e* ]6 m/ i& ~2 x. {& k
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;: J, \# o9 ^! K  Z" G- @
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 R( U5 x; p; B7 f7 f$ M  T) w
# h! r8 E% D: M! ?
        memset(tmp, 0, sizeof(tmp));6 g  @- r! k* m8 t. n8 l
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% U5 ~8 N* }# a% h% c5 r) S            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 L& P2 k8 O& U        server_msg_send(server, APP_CMD_LOG, tmp);- x7 \* y/ J6 L( l, }
: D) b1 ^: c4 G8 t/ K4 l' `
        upp_error_count = 0;$ v6 C, s. h1 j4 t0 R1 r/ C: f8 Q
        upp_dmaq_int_cut = 0;7 p7 |; F1 q+ N* X
        // fill in data
5 M  \& x' P; p' z! ~5 ^2 J        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 G# e1 j5 m1 C: L$ v5 z- ^        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 b3 N, B( J( C  I/ X
- \' v. G; T* J4 x0 g# F0 E
        // wait send success; }- C2 M3 f: Y% l6 j
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 |: i+ T  ]$ E# ?& E3 ?
& Q- W$ x5 S( N
        // make data node in free list
# [( L2 t1 f% p( ^4 B4 G) N3 e        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 f; R% o4 S& m+ s: U! V' K
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* l8 r/ ?4 e* V) J
    }
" ]7 t2 z: e  g3 ]* L5 h/ \# s    return true;
- k2 y4 ~+ y, s: Y7 y0 N; R9 f}3 h  h2 L% h! S" z* y4 w( h

$ L5 n& _% I/ N. Q' M2 B; p5 X8 }$ d! Y
* D! B' S6 u5 \' R0 a

, \0 x5 E1 |4 z0 e. d0 b

  m5 d! J3 q, N! a/ C
/ l2 l, J7 t, s9 l

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: c. J( T9 h5 {3 N- `
2 A2 k0 _! s  A8 N& U9 m8 ]2 k% T- y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 04:46 , Processed in 0.042235 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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