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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( I' I8 w, N. g# T; @9 @/ s  F' j1 n3 k) A: m2 c  W1 b8 ^
问题描述:! o* m; k; ]# S' P+ m1 P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) `' E0 G: I3 \: E
# |: z" B; u' s: D/ c2 r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: T3 Y/ |* w$ \$ [+ h: U5 |' C, c+ o
测试结果如下:
- c7 N# P1 S0 f, u/ \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 C3 T/ y$ M) c& y% C% ^& w" a& `

# b+ W+ {0 N; f, V! Q  k' T
7 \0 G" R+ Y1 G" X# |0 }$ G备注:: u" f1 M8 @8 ^4 k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( ]2 t- s9 `# x7 z  p4 e6 Y
2、相关代码如下:% Q- Z* B6 E1 P# p- \6 D8 ~
//UPP DMA缓冲大小512字节
8 n. Q* M" C5 j+ T! Z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! R! Y( L: O6 E7 {* U  g#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* `( [& P( F( e( T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# p3 o6 o; f2 X; l( k7 ^
; F) A( f- F6 t& P  W7 u

& G  v3 `+ R6 b; [//upp接收、发送buffer5 P2 t$ h- T- `. s
#pragma DATA_ALIGN(upp_buffer_a, 8)
& E  Y  j6 ~/ g5 s, o5 p#pragma DATA_ALIGN(upp_buffer_b, 8)3 P# U; W( q- L' j# D
, ~; d" o# p" `5 t- A  _
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: I1 a) W9 C- q* W8 O% {; k5 L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; B1 g  \& f8 N
; ]- u0 l2 C' K8 P/ b' ]) J
6 J4 D( ~1 h; o+ U( z% d5 p0 j0 _static bool server_upp_data_recv(Server *server)
! x0 K- Q; }* e5 S) J* b{
' |: `" u4 x2 y. y    if(server->upp_channel_a_recv == false) {
2 h9 u  Z& Z* ~  A: {        server_msg_send(server, APP_CMD_LOG, "upp recv: start");% c, P/ T3 C  v6 I. Y6 i  R( [( d
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( L2 P$ R. i6 F- C            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- q' c; ~. u3 a* y" K+ m/ j/ H1 L2 k  q2 c; P; v* _( w9 z/ P

  G! N- ^$ g1 y" d8 e6 r& M, N            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ ~+ ]) R: C; h9 O" z% k" M* R# [  i
            server->upp_channel_a_recv = true;//
) Z" ~7 ~/ a% D+ C5 Z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! I' k) C  s7 |- ^
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" p% `- B1 A6 h% n# `- A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) B/ Y& k0 T9 g0 c+ Z
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
* G/ `: o* X- B! d  q7 O$ l1 A4 ?: X  q
            upp_error_count = 0;
- P" _8 k; h$ L% a; O* r            upp_dmai_int_cut = 0;
7 a) U& i% h  y9 S( U  I
; {/ ^2 ~: j7 |" {% K            // fill in data & ~6 i1 w- _6 ]6 }: l6 U! S
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 g1 {% B0 S4 C            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( A% B# X+ ~9 X
        }5 D) O! d- z$ h/ r. F: i
    }
: `2 M6 u% ?+ m" l4 q$ r    else{
* z- H( q' p5 w: f3 E% B4 m5 V* @        if (upp_dmai_int_cut > 0){1 S/ x) r4 a( M! Z/ z, ~
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);) ?/ M. h* r. {* W
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- B  d  q6 m$ d$ N4 P. r
: \! [' {  f% M0 Q4 _; ~; W0 e1 U- _" s  G9 M
            //copy data to upp_recv_list_busy
; y; h* N$ y  [/ R2 W' R0 [. Q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
) E& |; K# P& j) E1 N2 ~& V
( H9 W9 o6 n  Y( C# X( [            //1 M  e7 A) L7 D1 L3 P
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  R7 u5 r5 C! d& U& V4 Y( A* i; x$ v( A, p2 S. b
            //) s4 D- P! L# v% s" p! d4 u: m2 T4 b1 g7 b
            server->upp_channel_a_recv = false;//. B7 Y3 Z0 M  g

4 c5 T) H6 H: l' M& ~            server_msg_send(server, APP_CMD_LOG, "upp recv: success");( e! @1 E. d; j1 X
        }/ m5 I$ B6 G7 t! a! @
    }; J; @' ^. |3 D
! r4 [( F6 N- L* G/ H4 H% t6 f

4 Q: r6 D- n( q7 s# M0 N    return true;% N, Q5 Q! H( r9 Y6 x. Q8 a
}7 T/ W! ^2 M! s3 b/ M# i/ O
+ I" X; ]! I  _6 g& ]$ z
static bool server_upp_data_send(Server *server)+ v* u6 V* Z9 F/ z2 C2 t9 y# Y  X
{
  v( h9 e4 O3 G8 e5 V    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ H  P+ u+ J2 t! ^7 W8 Y- C        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 c3 k- A2 }# E- v0 G
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 O: P: G8 U% W& X: G4 i; r        char tmp[128] ={0};
0 a, g$ r2 b- H8 X  ]( @
6 Z2 _4 T+ D% k" J        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 m1 J1 ], @/ n6 Y% G/ T3 c. J
        print_log(server, data, 64);& t: g- W. ^3 X" ~7 x% i* q& ~" C
' d3 }4 q4 V$ y- R( I, o
        //
# K. n. Q7 R. H8 M3 S) m- T1 Z$ r' S        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& _8 B* W  D% H9 a" q1 o
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 t. ]: V5 R, N" ]2 M        print_log(server, upp_buffer_b, 64);, S; d5 K$ |7 {$ g

0 f& x, s% ^$ W6 r4 E" t) I; @        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 S4 l  D. G4 t4 D% N2 T
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 C, z1 d' B4 `9 o, p+ {7 `        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ j. q/ x, W- s        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( y% R! g# V+ n: [$ `
/ o6 j7 _  d" d% P% C
        memset(tmp, 0, sizeof(tmp));
9 Y5 ]& m6 b+ ^7 f5 Z# H6 b' t        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; m* D5 Q# U- J9 f# D            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) }% r8 Q5 i4 N& M' R& w
        server_msg_send(server, APP_CMD_LOG, tmp);% B) N. f9 D, D9 `7 R4 Z
$ \! k3 z1 h$ H7 \, w. N
        upp_error_count = 0;
4 k# N3 A5 l7 F" z        upp_dmaq_int_cut = 0;
. a4 Q+ x' F' t# u        // fill in data
" u* c' L2 c9 E9 W        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% B% y# F/ F( W1 }, y3 \: E6 t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  {% N( {- c& t4 K& L0 u9 x2 C5 H- J1 f0 L
        // wait send success
& h' X9 \" h8 K( n        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 d9 H' t' M7 U  ~" R! }! a/ K4 p/ C+ J" ~" b4 J* @% r0 F. |8 a
        // make data node in free list & m) _& P7 D: i
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
7 r4 [4 |) l6 @- h- K2 l        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 t6 g4 N& n- c# ~. y    }1 c4 {& D8 i7 v* L9 N& r. e5 r" g
    return true;
+ H# G% ]7 x- O}
; D6 A$ D) Y+ Q0 A' n4 [0 G+ m7 e5 \/ v3 z
. m9 ]) N5 l3 y- \; ?% `

# p6 p" C8 L7 a: Z* n

; m8 i$ j( U0 t9 v' l$ `( n
( P0 o( U" t1 H# x

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐8 Z8 G: l2 n( t/ ^+ Y

1 A7 K* H; V, e* h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 08:48 , Processed in 0.041820 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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