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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 6 b( P. e3 f+ ]- t5 W

/ J% }: O4 g: H+ x问题描述:
5 e. ]. f4 u9 ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ @: ]; B: c8 i9 o6 P% P: `$ a& X# Q
. {7 T) O+ P6 P  v' d$ {/ z( G
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% Y0 i6 l: {  R
$ v  K1 }9 m# g0 F/ o* j; A5 y测试结果如下:7 I7 J& S0 r5 O7 a% S6 x4 y5 z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 a# L/ o5 y+ O

2 x0 l& w! }9 c( v- V' y2 J' M
  b: \/ G5 [9 H+ M备注:
. K5 t5 n. ~2 l% G6 S/ C/ P! e3 }4 f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 u9 _3 }  ^' b! d3 I
2、相关代码如下:
0 a, i; u- c4 O% a  q//UPP DMA缓冲大小512字节, ]6 ~% V4 V8 C, ]2 M: B$ j
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; u8 K. |/ M9 a( N8 r8 S" P#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' V( \/ ?& l% a. M1 s! Y7 d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. H- p" D7 r, D" P& _* V$ {3 c9 `1 f1 r7 i' I. ~, l

& d) i$ _4 {/ x, B//upp接收、发送buffer
3 w% _2 O3 P+ `  W& e#pragma DATA_ALIGN(upp_buffer_a, 8)
" Z: K9 S2 Z$ {( f8 e; ?#pragma DATA_ALIGN(upp_buffer_b, 8)) W: x9 ~1 _( w- D0 m9 s2 t7 H- o) `$ O
3 J& {5 I" K" H  P7 W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 w+ V' ]7 S0 Y) [unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 R' v4 C: s# R5 U- @

) u) s7 C; Q# Z& [: ?$ w8 }1 A! y- e
static bool server_upp_data_recv(Server *server)
; j7 l1 z0 X  B, T, A  w+ P( q{
# T9 P, x" V; z$ B    if(server->upp_channel_a_recv == false) {
# a* R4 Q4 f* s0 b- j        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
- P/ }( u! n6 I- R0 ], i        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 B3 L0 b! t8 t5 t5 U0 K- w            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 ?" o8 K) i; {8 a) E0 D+ r; X8 k* d
" B; K  I. h: [4 d: b
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- |% Y7 s5 Y# v4 k. s* f7 y
' L8 H, e1 d7 a5 t            server->upp_channel_a_recv = true;//
& g. M2 M; [0 N' j0 z. H            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);9 X7 P' Q% D  {+ j$ E
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ V0 l* {0 M  W) l# i& j            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 h" D, c% h$ L, T2 o- W5 d' s+ v            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 Q) ^( }$ n( e& r  ~9 _
/ o& A) L' V9 A7 T4 J" f) v, D$ D            upp_error_count = 0;
1 ~) E# ^! C) `! W+ {            upp_dmai_int_cut = 0;
3 N& T! |) E( {- Q  U: z$ ?; |$ j: [; Q  ~! O% b5 M' V& x( @- G9 W: Z
            // fill in data + j' V( m, H+ N8 {4 n9 ^0 }% a+ ]
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ m' Z8 A* @* h- |/ O            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. X# s" f; l5 T/ S9 l) t* u        }
1 Q& M* }: ~; T! N& f& C    }4 w4 ~5 F7 Y( Z* v+ Z. ~
    else{3 `0 j1 H# Y' p3 n$ F
        if (upp_dmai_int_cut > 0){
/ S" G! t7 Q, ]) o5 L: M            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# v3 S: p% D8 H% J( g4 ^
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; u- E- E6 v% d' j- |
. S0 v/ F3 W# ?) Z3 W0 @6 q- ]5 G; S2 o/ R0 s9 ]7 _
            //copy data to upp_recv_list_busy$ D6 K1 T( T. r! ]
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 p* t+ j: ?+ K6 @3 I' l* B. l9 @0 Y2 v) c
            //
5 v) a% D+ `- v4 d            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 @% i( E) {8 [: ]( z  [$ ~
  u0 u5 F7 m1 v5 }9 q. g            //
# X. i/ o" T, X3 H            server->upp_channel_a_recv = false;//: Y! ?( G- P9 l$ o4 v  q
" w, }/ e4 J% b+ ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 A' v5 a! S% ^0 E  V        }
" M( v# Y$ r4 i    }4 s4 j7 ^) f8 G) I
; V& p( L3 i# Y/ p* O4 Q( ?# T
+ r8 S) v2 M' ~3 d0 u, W' e
    return true;
) g' I0 t" U/ k}$ Z3 u, W  u' k/ ]

3 Y* y  N3 y1 e$ I  Z. rstatic bool server_upp_data_send(Server *server)
2 h. _& v+ o0 |' N! B{
/ J% K% b2 N$ M5 T$ g! r* H' D    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" U. j. F: l& [0 v& V3 c1 J- }
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) Y) f6 K. W6 z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 M) h3 e' m3 o) l2 n( Y        char tmp[128] ={0};7 e1 {" }$ W5 J  ?
6 W, V: S  |1 Y% \
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
% ]( N4 L- p! A# E1 g        print_log(server, data, 64);
5 x8 w+ s% q" z8 m1 |% t# c, ]( {; \, o- a( `) H3 j
        //! t0 _: Z) R3 U4 j( n
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 C9 N( ]6 G# m1 W4 h* Y; }1 x) w        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: c* C8 _2 P1 @. J) T$ y% e
        print_log(server, upp_buffer_b, 64);
1 \, \0 ~9 X8 P) j7 O8 ?. c1 E) ?. A0 y2 V6 u9 k
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  f* B  K$ e/ d% F) d5 `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
! @$ F" t  A) ]8 ^& T9 g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ y1 D% w6 n! S/ @$ b
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* ~; J/ r3 q; Q0 E: f! k' T6 M  I8 {8 {8 `3 `5 E! `
        memset(tmp, 0, sizeof(tmp));
+ a6 z2 b; r  s; U$ x- p1 K! {        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # G5 `, }/ a8 v: i) }
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 G+ N; z0 j9 J! Z7 t        server_msg_send(server, APP_CMD_LOG, tmp);
2 l% ]6 N; k& a8 K( Z/ V$ E. O( b0 I& e& G( D
        upp_error_count = 0;/ D+ r5 J" [3 h5 e5 ?+ y( A1 O
        upp_dmaq_int_cut = 0;. i9 \& V: f" h9 _% Q% ]) {( N! \
        // fill in data
4 h5 e0 x1 o1 c- |) M& ^        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! d" W1 j4 `; ^5 X, n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: V. H- N8 g3 K, @0 ]2 m

# B" Y6 z/ \/ T4 T9 h* b  O        // wait send success, L( f& Q* Z- ~- a
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
  p) o; g9 s' p5 ?% R9 x$ b* Z( A/ t% K0 o$ @9 p" T
        // make data node in free list
8 r0 k* A7 J' w( h        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 M* B) }8 P, U6 J        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 z  j8 N7 y+ h5 B3 w' i1 O    }
+ v+ `% N- K' v4 K- g# ~) z    return true;
: v' S  L- R$ b3 l}3 A! l" b* ?1 p2 n) J0 P
& t1 p$ j) D7 K$ @* H2 i/ c

7 n. C( z8 M/ F8 c* u: m, C! f0 ~9 T9 @* T- M. w

. P  V6 E; F- x1 ^2 J
9 T( n, L0 A+ W, k& y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐8 |# L, E8 `; _' k  t
  _( V9 o, X+ d$ q7 P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-14 12:22 , Processed in 0.039660 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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