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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 k6 v  t, Z6 Z
. J, d7 t) W  ~8 E问题描述:
0 B' M: [+ G5 w' w3 E9 C  X在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; s( U( g) H1 n; `, E1 m

- U0 ?5 I) Y% ~( ?6 m+ l8 X1 ?; i图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 t3 i" k9 G- @( X  r& O; I2 w! g
. o1 q5 L- U9 A, Y
测试结果如下:
2 b0 T2 [, |# R: A138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; w+ o( f1 m: [- L! y0 k# i4 u9 g- M
3 b8 H/ ]9 K8 v% t& ~; x; M  r. `) W, V* L* L" V$ v; S. R
备注:
" E3 O! n' |- A( M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  p8 }# b9 D8 y, t2 B5 j
2、相关代码如下:. p- _, J# _' W# t, ]4 x
//UPP DMA缓冲大小512字节9 J% ^! ]/ H2 ~2 g  v
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ }; }7 ^6 P9 c: y: r7 v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( l$ j0 g  |; {# Q' g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# r% U( |" S* M7 e! u* g% d) Z0 {$ j9 ?2 ^6 T; H+ p* @6 S: V

: \+ Z8 m) U0 m' }) o//upp接收、发送buffer8 [' |* @& Q4 i) T  X
#pragma DATA_ALIGN(upp_buffer_a, 8)9 S3 d( g9 }+ `
#pragma DATA_ALIGN(upp_buffer_b, 8)0 s' t) Q0 `/ p6 s) P, ?- [: v: W' ]

8 E5 u8 V1 s5 k- Munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 u6 W' i( T' q+ ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* e0 H1 ?. T% P# _2 _  Y! X9 r- i

' r# C, F! ~0 ^4 R5 S' K) ]3 \static bool server_upp_data_recv(Server *server)
# |, Y2 V5 e0 s5 H) o8 {6 b( O% z{
, `5 @! p" \+ J1 |    if(server->upp_channel_a_recv == false) {
6 Q7 U1 T; e/ a        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( G  C% ]; n% ^2 R! h% r1 G& s( m
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% A& L* {$ s, U            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' `- X  W3 |# v; N6 P0 H. w/ h6 L$ n
7 D( _1 m% a# N' P3 y
# a) J% G2 B: r# L            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 [7 x. x2 z& O$ I! f! {( x6 P$ }

5 ]% \# \: b; o/ D  _& C            server->upp_channel_a_recv = true;//! ]  a- f4 r; b
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 J7 P* |1 I8 ], w
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;! d7 Y6 B/ d* g5 h
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;1 v5 E/ K  Y0 B" y' ]8 c. E
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* u: V- @* ?. p* R6 Y
* X9 L8 I& [4 ~* h" T
            upp_error_count = 0;2 y6 ~( h0 {, V* t% Q4 ?
            upp_dmai_int_cut = 0;
! x2 S, d  G0 P, f6 ?  z6 T% w: ]4 @7 I9 Y4 t' z) ~
            // fill in data
/ q6 N9 y6 I& ~( U1 C8 G            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 \$ L& i6 ^$ C' X
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( k+ d( L4 {- Y
        }# m' i( s% q2 {: U" T, x1 O4 c
    }: @. c, S' a6 K" W1 H" ~& m
    else{
: R, @. d  ^: q0 L- ]        if (upp_dmai_int_cut > 0){
4 G& d* x1 o! m5 A            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; W, o" t& u; s: w1 w
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* N8 ~9 x' `2 K% X4 Y/ N! Y8 \6 m5 E; P2 z4 |) `

) a; {% \/ ]. U! c            //copy data to upp_recv_list_busy
- B" |, m9 n" R. B0 n/ V            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( X; C" Q2 I2 M. }0 U5 i
) l4 d$ P; m9 q8 c            //
4 ^2 O6 T) V+ {8 l/ ^; i            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  ]3 C  y, t! l. |( y

, A# J; t" c" y' o6 @1 j( @+ G) d9 F            //
5 J% X; C9 s) i4 g: h- Y            server->upp_channel_a_recv = false;//' p& s* c: s: I1 L
- l3 F+ @2 l' N* s- |# v
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' `# p4 P# ~& c. R9 T' f- c        }
# \1 m( T' q  |1 g: D9 A* N' E    }$ Y" n6 f& e. v5 ?  V

. O( U: c6 M: h
5 J' k- d9 L6 I1 i" h    return true;  T2 e) R. R& Q- k1 q9 B2 u
}
$ G+ h( V3 G: R' j, I: V2 k0 G9 z9 A/ Q3 P; y( ?2 ?, K
static bool server_upp_data_send(Server *server)
* b+ ~  z2 G& ?; U$ i0 M{9 |1 D2 r4 w. [" {9 @% }0 B
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
5 _% b# \  A  y! J% ?& f( p$ \        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 \0 t) V9 J+ {( N
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. Y5 k( \* m/ S/ G" X) m        char tmp[128] ={0};8 D! w" g3 l$ A/ V. e5 b7 N" L

$ j# c. x' Q% s2 N* Q# a5 w        server_msg_send(server, APP_CMD_LOG, "upp send: start");$ j: G$ L7 U7 U. V% D
        print_log(server, data, 64);4 h! T& T: P: l9 `

  H$ M) Z7 a) v2 r  `, ^; \0 y  c# Y        //
4 j  {+ G+ L7 F* X; S% s* z        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 u+ [" ^( B  D9 w( `0 f
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 Q2 N8 h/ t( H: f( `: D) N- m; i
        print_log(server, upp_buffer_b, 64);- ~6 X, e" Z( `4 v4 o7 _0 g; d& ~

7 s% m1 A' x& h        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
0 w( o6 H6 T8 s4 |        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ T, k5 B$ ?" K
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ r. ]2 T# q% o7 R4 l* x; b/ O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, x* E+ D. Y5 O% z" a9 I
2 Z2 }8 B% r% x2 W$ }
        memset(tmp, 0, sizeof(tmp));
3 R' S; _/ L2 j7 k$ G9 x        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( i( l3 T' ~4 A* x" }
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' f8 x! u, g6 F8 n" q
        server_msg_send(server, APP_CMD_LOG, tmp);, l- S9 x% w9 I, v1 [

2 ?- S4 p1 {) |- X        upp_error_count = 0;
, @9 o+ S2 b9 b! i* J" r7 |/ Z0 J        upp_dmaq_int_cut = 0;
3 R0 @8 l/ t+ {4 j# Z0 z        // fill in data 8 @7 f8 X/ l% v/ l4 T* E9 b, G
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   M! i: u- U; G" B
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) S, q- e* p: j1 s$ n: I' y. ~: Z2 m, R# g  ]
        // wait send success7 B& T) ^. M. L( L1 B5 ?# P8 Z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( @2 G  o! ]: j4 n
1 ]; ^7 n9 W, L1 _# Y/ R8 W
        // make data node in free list
) d! w* b6 G  A/ w5 H8 {) D) v        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* l3 u! k/ M4 e, ]( g. u0 f1 P, W
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; M4 x0 M: a8 }! H: H& A4 w  [    }! `0 P: S8 I/ I
    return true;
" [$ D+ g% K' p7 A: i: A0 y% M}
5 t1 m" J4 |, O9 s( Z+ d; `% `
& q2 N/ ?3 K1 X, Q( A% [% d+ z

. j' F) H  l1 u
1 i+ x% x" g+ D. _

) U5 d, q2 {, j+ s( n# U; u/ ]# r  Y2 P% a. ^# A: F1 m7 r7 B

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 {5 Z. S7 j( Y; ^

9 _; |( f/ C8 J5 C* E8 p3 l

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 08:23 , Processed in 0.042135 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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