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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 B7 w1 U) D  u, J: \; u& e; s! N; Q' D0 J
问题描述:
& w! B" F5 \  @" h5 S4 z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. c/ G. m  C# V, a5 k# c
+ ~1 Z3 h0 G) Y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; Z1 y' W7 L: L1 m9 z" Y" ?& _0 ?& {' E
测试结果如下:4 Y! _" J! L1 O% |8 T
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" H, t) v" ~: c) W) b
4 y+ l. [& E  f7 V# r

' t; M6 ]" H! i* C9 |备注:
) F8 r$ Z1 A) X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?! [5 s6 f( k  M7 H4 J- S0 b2 F7 Y. ?
2、相关代码如下:" r, E  R3 ~9 R' R+ M" B+ l
//UPP DMA缓冲大小512字节
9 W4 c: d. @6 f#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 \- J" j6 h, o/ B% C  s2 v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& d6 P4 E. e5 l/ ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ R- M. B& s- u. x! \  H! d2 g
3 s2 r( D: |: x0 t# j4 s# m9 s8 {  x1 U1 b( f2 w
//upp接收、发送buffer) E5 m1 O; j) {2 M, C. a9 }# U
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 c. Z4 [8 ]8 V1 R+ V#pragma DATA_ALIGN(upp_buffer_b, 8)' Y0 Z1 s  H; {3 D2 c. B

& c. V& o9 a0 l1 r) zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" l9 P; f& }1 T$ |& ]unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, N9 ]# X4 _2 J7 m1 \0 Q1 E3 z3 g6 A/ A8 ^! U- U  a2 _/ f
- |1 r. h$ t* U% W! b
static bool server_upp_data_recv(Server *server) 0 K; M+ H( ?8 M
{1 H8 A- Y5 v8 X8 d6 `. z8 C
    if(server->upp_channel_a_recv == false) {
) m& l2 `; `( r# l        server_msg_send(server, APP_CMD_LOG, "upp recv: start");. N5 B) {, u8 j) U, N0 ]. F) J
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" B" s; Y: o- x& @$ P. H            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 v. }$ ~* X/ z" j% i5 m# q7 X2 d3 s) L& J8 ?$ e9 w! B1 b/ i

4 S% k" B+ }1 ]            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# A6 c, q7 u7 I2 |, ~! A

  l0 o% K/ P0 V5 L* [2 i            server->upp_channel_a_recv = true;//2 o9 W$ e( _& G
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);) b4 s* ]5 K* Z$ W$ Z7 @1 C2 V
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( K# A7 F2 z7 g: C            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;+ z) H: k9 Q. L
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; U7 a) c9 i2 @- @! H
1 i# ]8 z3 K& }! Y( J5 G" J! H8 k% G
            upp_error_count = 0;
7 O' `9 n( E6 D9 S            upp_dmai_int_cut = 0;2 s- n% ^/ `7 g7 x! \

1 ?8 Q, C. x5 W. ^            // fill in data
) f& Q! h) o" y0 O1 X4 S$ s            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& Y. f7 Q8 E& _+ p6 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ A5 @' r; X( _$ y5 o
        }/ u& }1 z% U3 Y% _+ L$ u2 J) H
    }6 A4 a1 m- m+ w1 ~/ v/ H
    else{
+ r$ N. T! n* V) M) v7 E4 V& n        if (upp_dmai_int_cut > 0){) V) B, }) u  T! A. g" _
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
* t+ Q* _; ^, b3 l* `            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( m6 t4 O1 `) Y5 \% d! a
3 P. B  D4 G: e4 v" s$ s, T. h* i' R

/ K9 a" [: _/ M. k            //copy data to upp_recv_list_busy
* g) T- Y$ Y2 J0 f& B* H8 k  U  t0 l: w            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 O  \% _* {" R2 Y& |9 J
& v' j+ u: I4 h. P; C  p9 I
            //% C2 ?7 w  p' P" F) W, O/ q$ |
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 ?1 U4 W6 S( n  R
# F9 M, m# ?8 D* w2 W! r( ?) u. G# C            //
' u( m, I. X" G/ d            server->upp_channel_a_recv = false;//- }* R9 o1 ^* B
& C; ?3 P1 O4 _6 i, p7 i2 [
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- u3 J$ Q  W1 i( ?0 H, E        }: ^. Y0 i9 v1 X8 b
    }( X5 u" \$ n" t0 r

/ E" v+ R: f, r) Q5 R" h7 `  I( R1 E2 M, _% n; o( M* W
    return true;; G9 u. F3 N$ q
}. R7 G9 V8 R: x& |: H
5 I" ~' j3 a! t$ L4 [) u
static bool server_upp_data_send(Server *server)
  a/ m$ W+ l: H  b{7 j$ B. Y0 B7 |2 \4 x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 H: |2 ^( K9 s" E9 y        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);' K. N/ j' W- \( k. c
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! i* j/ ^6 _4 W% C        char tmp[128] ={0};$ M& ]) b2 F% J5 U* M
7 o$ E3 o: x3 j! J4 |
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 m1 P4 |" ?- O        print_log(server, data, 64);
  q( B5 ]* Q  g" ~$ u3 {& q+ `2 ]- o& m; M) e. Z6 s
        //% A( R4 w7 q5 I6 l7 k
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 `  L' `2 }  |7 t5 r$ f8 A        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* t- e- ?0 i" ?7 _0 s) P        print_log(server, upp_buffer_b, 64);
+ \) S) p( w( u) J: B$ h" @( B' W: _* b% [. g# B7 H
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 G1 R. {( t5 f* n$ k) [7 \6 K
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 4 m* _3 p3 f2 Z. s
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;% B# u6 u/ X8 p) X6 B7 s+ t
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, D( V) E  B$ f- L  t
9 ~  O( I) o% W( h        memset(tmp, 0, sizeof(tmp));
) r7 x; r$ E3 \1 {' `- I        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F& k1 ?8 L* g3 ]! h2 U            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! H# `- u. E- v1 ]0 X# c$ c        server_msg_send(server, APP_CMD_LOG, tmp);0 O& K) \$ Z' x
; Z$ R: l, M2 Z* F/ @! l3 H1 H
        upp_error_count = 0;
! ^  _! b" |0 `        upp_dmaq_int_cut = 0;  D) C  y* }* X, p: ]2 C/ Q
        // fill in data
- e  k- s6 l8 x1 V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 ?3 c& T& ?% E* x& X- s        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. t8 J: z# Q( C! x

: S7 b/ m; x# ~8 U: [' A        // wait send success4 @2 g+ s8 i+ I; }" M7 }! h
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! S: r: c- @6 M+ |) `2 N( l! m3 A
1 l: ?( @1 g0 U3 Q; q, \* P
        // make data node in free list
, M2 w4 b% e% }& z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 a# U6 [4 Z9 h; t0 F7 g+ ^
        server_msg_send(server, APP_CMD_LOG, "upp send: success");) z. F/ S# ], }; `
    }, e7 c! K1 E; ?* A! A
    return true;
" d0 t& _, F9 w: D" k}
  ^' \. `. o% F3 `0 B7 q  r3 `! R- B& C) [2 Q

( o8 M* X, F6 w- m0 O- y  \/ ^% ]7 e5 u( r* h9 v. |

9 \2 S: K( s- `; Z) f- g- k* l# c7 U* b6 f( s- L1 E* M( N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
+ K8 r( e! v# p$ {, D
! F  b' g) r2 I9 ~: L# Q6 M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 09:06 , Processed in 0.038596 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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