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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 e! b( A3 w% r4 u' v1 @
! u& \/ N$ ]5 P6 r7 `
问题描述:( [2 y5 n# \4 Y0 m' q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ }  C; a' H+ n

- _) j/ i: N8 F图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* `' I. t, S. d3 U0 @
, z( k  W1 h: m7 {测试结果如下:
' \1 H, t4 M2 Q9 i/ X: ]138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 W& U3 g& u& K- E5 N% |7 H/ n

# Z0 K' d% s  ?- H6 [  E+ m/ r
+ T8 W' E+ Y% O  q% _. `" M. a" ^备注:, g: r3 \7 b/ ?- R( U, m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 r; o1 ~" t" [& ~7 U9 g
2、相关代码如下:+ @6 E4 o* D6 ?8 h5 M- q
//UPP DMA缓冲大小512字节4 B* G' O( A  \  _5 @, C% _
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 t" J; T/ v5 b: y9 S7 M
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 [2 E# Y9 h7 n
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ b6 C/ S3 x7 K2 C

( F& {* {. T8 D- A7 a
9 \4 {, n( X2 m1 S//upp接收、发送buffer1 ]1 K- N2 H- W" W4 t& m
#pragma DATA_ALIGN(upp_buffer_a, 8)& @4 \8 q0 Z+ n% M. S. Z
#pragma DATA_ALIGN(upp_buffer_b, 8)
" g' D* I" d! M, o2 X& x! C9 \# \; L) E! D' a- i
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 i+ D  n# J9 h. ~+ c! D2 q9 ]unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 F. [) H# [- b; I/ X
. z/ U& m5 P/ i, V6 Y6 Q
: `4 n2 ?! Z" t3 n0 b4 a
static bool server_upp_data_recv(Server *server)
5 \! y3 I- Y9 T7 ]{! a: h3 Y6 K1 c/ r& D- |" e$ e
    if(server->upp_channel_a_recv == false) {" Q4 p- X& {# T8 d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 c( G# Z, p: T2 }  r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 {) O, A7 Z. m1 [# L0 J" k* o4 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. _' x  F7 w1 I# ]& T5 W* l
2 E* ^8 F/ P& u/ A& F+ `: c

' o) y$ I7 q( D, [( Q, P4 }1 c5 z            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ H) b+ V1 j* K' C2 {$ H' ?
7 U1 a" }3 M* n# q. W7 t. _            server->upp_channel_a_recv = true;//
* I- ^8 {2 K) [            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 |; V: c) D2 L( s5 H* P            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;* s: w; m) M: ~( T" C$ ?- n9 w! L
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;! R& e# u! I: l/ X
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ E6 x9 e& \$ j) V) O' @

0 o* _. l: x6 W. o. L            upp_error_count = 0;+ f6 P$ n% c! K8 b+ m" |7 ?6 A6 R
            upp_dmai_int_cut = 0;
) a% ]9 c, [$ U1 T1 ^  l3 `( G+ D. R4 ], ^" V$ l. Z1 V
            // fill in data . L1 h5 W# t, _4 x$ R  F
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
# s* O8 V: c! \& F) |6 [2 [( D            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");% a; R/ b/ o2 I* E! W1 [2 g
        }
3 s1 ]/ v- v: Z0 ^6 O1 \' a    }7 @0 g5 ^0 ]) [2 k/ E
    else{9 r# \: F" \" Z
        if (upp_dmai_int_cut > 0){- q  J7 c7 @9 Q! R; w
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% c, E7 h# ?. L; R+ }4 N6 M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- b  h1 X' N/ C6 f

5 U  `0 X9 z& }3 X
. g" I8 F' z& O& Y+ T            //copy data to upp_recv_list_busy
) E0 M0 v/ N/ S7 j! U, [& x5 }9 v            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) ~) ^$ o6 v9 X4 Z/ q
  E/ l" t( a1 T8 g) D2 y! ~$ m
            //2 {" r/ K* C0 K8 b) ]7 S" i! k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 F, q" h* _7 K( ?: W. v. S

$ c$ {( U9 {3 X$ k9 s+ i            //
+ c) q1 g( T' g$ D2 j9 C            server->upp_channel_a_recv = false;//8 M8 N0 ]  {1 S; G9 |2 M5 z( {
* [9 l7 z" W3 s5 p( |% ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' R$ J' c. t4 W
        }
) a4 P8 a: c! k. |' K2 I    }
) T: N5 M6 b; C" b3 E4 W. v
& K% n- C( A& W* f" `( X
) g( r% d" @. z7 H    return true;1 J! Z. ^, K8 v5 E1 b4 r, G
}
3 }9 p1 S! o8 v' I! P& G& U1 n+ ]
3 A1 }# u+ i  d4 A' \static bool server_upp_data_send(Server *server)
' S! Q9 n# V6 Y' [" Q6 P{
1 n1 }& D. E. ?& Q    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* l7 W8 X& p3 m) k
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 Y4 T8 N" ]$ \0 t. \& S        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ a5 B" G7 @( i  t; Q
        char tmp[128] ={0};# G0 H/ L( |% C- K: e6 h% y
3 D: i4 v. N1 T$ v
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
( Q! k; R; R( q2 ]. a& [        print_log(server, data, 64);3 p- D0 t6 n5 G7 A; J3 R
6 h  z3 ~5 l4 f6 @. u  A* w3 K) C
        //* }3 o7 Y  a; n% Y. o1 f! d/ ^3 I
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 l. d' g, C0 a' p. ^5 h  Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);7 A( U% i7 L! P7 v- j
        print_log(server, upp_buffer_b, 64);' V2 m# P; H4 J! f& P
; K$ S" }9 C3 Z0 o1 g# L
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 H8 ^  f  W1 K+ L        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & y  Q+ V% F1 ]: [7 [4 K! S3 I
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) D2 M/ u1 n- w$ D* O2 ^
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' E$ C8 m4 c5 E. a. K9 z5 R1 X- I" Y9 z3 [& w6 e( R
        memset(tmp, 0, sizeof(tmp));
% q7 T' d( g; v0 Y' H        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ C# i; ?* Y! G! H- a            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( H! n3 B/ E4 E  @- B$ ]        server_msg_send(server, APP_CMD_LOG, tmp);
. y, u* t( D( N+ f  k9 b5 J1 i3 Y/ o$ B$ R, h
        upp_error_count = 0;
' b3 x. ]8 \: h6 S: {" Q        upp_dmaq_int_cut = 0;5 c2 [6 r8 \6 U' h* R9 `
        // fill in data
4 I* s! h& a5 P% N. p5 U  u4 ~        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( {* Q, l: z7 f: n0 I& b1 `; \
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& `5 _6 ]( }( A7 O' a$ n5 f5 W" R
6 T+ C3 e+ W9 ?, |4 f. S. S' ?
        // wait send success* R( Z: v( y. n' \; A
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 g$ o* {& Z  j2 Q6 Q% H: Q9 ]3 W* r/ T6 d. W- V
        // make data node in free list 0 t5 R$ V2 X' D# k* P) B
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- _  Z7 j! A+ |5 C        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 x* a4 a1 R) _* {    }; i+ G4 H$ Z8 m8 r
    return true;; _1 i7 x) V9 A+ E5 A
}
/ S% W% O4 M& A% ^$ G! I0 ]7 i
5 M4 I4 c: V$ [; n, Z- _  N/ x
4 s* L9 K  [( `* i" Y; C& E7 T) ]

: B) G/ |7 P: c1 X9 q; ?: [- g
5 E0 F! \+ k+ O" ]- C, {; A

5 `7 Y# g, W0 w6 E" ~- ^+ |' w

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
' C+ j; K5 a& P: c/ n( }+ L4 J, U
; N( I% L6 E. K; a' ^0 e' c+ t" M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 19:28 , Processed in 0.044465 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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