138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
+ O" H1 i' ]* w2 X5 N  P& `& Q2 q- ~% u
问题描述:! ?' r8 V; m+ E3 Y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ M/ K1 C0 o3 ^8 j# C8 s/ A

7 ~' {- v. H! E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: L- ^. H$ i( o' P+ n  R! s

3 ]7 y& Y5 u) W5 R) m% G; D测试结果如下:
' a% `$ K. M/ a: M" O9 b2 T138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% l7 v7 w$ E1 ^5 B4 Y
% p& N! h# q8 q; G  e
0 P7 @+ }* P: K' w1 Z3 f- Z
备注:' g' ?7 g+ r7 R' ^, |  u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 V( N- K: p  V, Z2 e
2、相关代码如下:
6 o8 K/ V0 t" l//UPP DMA缓冲大小512字节) C0 m1 h. h) W8 _  U
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; |: Y; J. b, t2 n* k  V5 z! q' R#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" E0 o9 T1 E' k3 Q2 i3 D1 [& x& D& N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! N" y. t% Z& o4 n+ P

, s2 s$ P! m3 l" W# Y$ U* t8 L4 ]$ `& M( n: v( y, k. E* n: H( \. i2 J
//upp接收、发送buffer) i1 w/ @5 N  W! O# D1 \  b
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 J. v; ~& C: f! n# ]# S- ^2 d9 b#pragma DATA_ALIGN(upp_buffer_b, 8)
& K# s; o7 F, D0 b, M) X
, z" X* C8 e* J$ i: @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 j- `  @6 a$ U+ S6 N) d! I3 V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 o/ J& O' v! l  `3 S7 [' g

, F, D" O+ h( x4 B0 [
6 u  d1 l  A' B0 Q1 sstatic bool server_upp_data_recv(Server *server) , z( ]+ ?$ a* q- z) U
{- `! G& e2 _* R/ a3 A  d
    if(server->upp_channel_a_recv == false) {: x1 J( v  n/ K( i' C
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( B1 }( x& G1 h' P        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& V# L% X( ?/ A# |            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# [5 K) P) n; i0 b3 I" ]8 Y: v$ P. d2 v
  ]* Z2 D% l2 ?  h
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; W) ^& s6 R8 j

- W. X: ~' B0 E3 Q            server->upp_channel_a_recv = true;//& y- L; b/ |0 j4 @, c8 R- ]/ Q
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
6 K9 @/ |3 P3 B1 @9 N4 H; g9 o: @            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
4 \9 G" ^8 ]0 s& @            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;: W( K4 W8 t# q0 y2 z. R& Y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- s- L. P$ A) }7 C' ?( B  J

4 @, U  w& X0 S9 ?            upp_error_count = 0;
$ H" p7 k2 A8 x; }8 e3 m' [            upp_dmai_int_cut = 0;1 _* Y0 ^5 E$ d4 G# ~9 e+ U/ y
$ N: \$ m; ^5 P2 c9 F9 Y
            // fill in data 6 n' j" [" r8 d, e3 ~1 `
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
$ T( V  h! d- [9 Q4 l! _4 \* x            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; r. e" ~; H. s' K$ F        }
  ^; R  R' g' e4 f( {    }! ?) P2 B6 A" x2 I1 x5 M3 T" x
    else{
9 a1 q; P5 o% m% O, T        if (upp_dmai_int_cut > 0){1 {9 H8 |6 C! ?7 V- h9 s
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& @6 V2 B; y( x2 U  H            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% E1 U6 y% m' |7 Q' S

4 W) x% i: V7 K3 l! ?" T6 ^! X5 w' F  A# v# g& n
            //copy data to upp_recv_list_busy( `( b% O9 |# l' `0 k. s* Y$ T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, ^1 `& E. y. \2 z1 Y8 c. t) P+ \8 u3 v
            //1 J$ X& j. L6 o* ~7 I
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" w' O, @8 q) B8 G7 T: Z6 n

/ Z3 K+ x7 g5 f8 e5 c2 H            //
$ t: l0 A8 }- b( L: |' y" U            server->upp_channel_a_recv = false;//2 b) r9 O! m9 t( c; b* |9 K

8 f2 J7 S$ {( a- W& ?$ n            server_msg_send(server, APP_CMD_LOG, "upp recv: success");5 s  w. |7 M- ]8 {
        }
0 \  W) l5 J0 k7 h    }
6 U& e7 r. A5 b7 Q+ D; x5 _
$ ?$ V! L0 H$ L4 F7 r+ L8 b6 ?/ W2 ~: q, k5 s' q
    return true;
( i7 }' `- ^5 B. g$ Y% a}
3 ^; o' a$ z3 t) O
2 k( C, e+ B; j# u  Dstatic bool server_upp_data_send(Server *server)
: W( T0 A& @( L1 K7 z# p{
- m2 Z( }; k% ^1 l    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% k9 u0 V4 I/ X' e
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& i. e- `' b% l  i1 r) ~! v" _" M        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
  H$ ^) w9 t* Q1 ^        char tmp[128] ={0};, @: H# F9 G: j5 m
7 ]! d/ v$ C0 Y  V* b. E
        server_msg_send(server, APP_CMD_LOG, "upp send: start");2 A! f2 S) G" t' c8 }
        print_log(server, data, 64);
% U: n, q1 i  @+ n) c) I- Z& B8 ^: W4 y  G" j8 a2 {+ A5 M7 t
        //" O( I: v7 u! y- N$ f2 X. V( M0 l
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* L0 e+ ~0 S  R: N5 F+ J! e1 T
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% x3 u6 N  t! J) _% o7 ^        print_log(server, upp_buffer_b, 64);! I- g7 E/ W) k8 J; o

8 g* H( ~0 e7 [, N! D        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 \2 X" a! p* O, z; l, [
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; " T; |. A& ^4 R0 u1 j
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ z7 ]7 ^6 u8 H0 z$ L# n! L* I
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 `* _& I% t0 j: u) b( g  v" Y2 r# J& G2 w2 d+ V8 ~
        memset(tmp, 0, sizeof(tmp));
" [: t2 ]" T- [% ^4 _        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
# D+ {1 b3 n; n# [; T' D+ E. h            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);9 k7 t2 h4 o; A
        server_msg_send(server, APP_CMD_LOG, tmp);
1 v2 x. w' T' O2 Z9 W, ?
8 g. Z) ^5 O6 Z, L1 r. P( A$ K0 i        upp_error_count = 0;; L, q; D, Z: W
        upp_dmaq_int_cut = 0;$ s, ?( M6 I% t$ |5 Z1 B
        // fill in data + f0 t' Y. a. @/ h6 a) L5 u
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - m% G+ j1 U0 I& Q" G% V
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 s5 ]8 e7 E5 _% ]; }7 Q2 Y
3 S# Q3 v3 r) C( _# o$ U        // wait send success
! ]( n6 N- N; f* h: r        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 V( A8 s3 @6 `, r$ G* J+ v1 R  w
1 u8 ^( }' }( ^* a' j
        // make data node in free list . W+ s; F6 P. E) {6 B% ]1 u
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: W; @9 T) C- i( a# S* l( O/ V        server_msg_send(server, APP_CMD_LOG, "upp send: success");0 E( [. f! l2 l* v2 R- y
    }
* J; ]: j, _! R    return true;0 u: ]0 j: p$ P) J, K
}
0 L6 I9 w; s3 `: C6 X
5 ^+ b# c& `1 r7 M% _

" `  x  W& }) h6 o4 W" `. S  i. `) S& v

5 E. e. I- ~; i3 P6 Q1 j
: K: ~$ U0 v, ?$ V

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
* m. k" v4 ?( b+ Q) l9 n3 H* i
; t: L, M9 a" g$ q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 18:28 , Processed in 0.036796 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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