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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 z# Q9 C1 m+ R- p: O! Q2 c# ]) g' i
问题描述:
2 f3 t+ r5 y# w: u( H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- j5 ^6 B; c- b* P
9 B1 |& G+ ~8 ?5 k% s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# r( `% S/ Z+ w4 U! K1 r, a2 _1 R/ G
* E( A' e* |; Y$ L- u
测试结果如下:, b% E1 e3 ~' z0 Y2 S& u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 f* F& ?& ^7 K6 u4 G7 s0 d0 X
" }+ b' @+ v' F3 K/ O# o# d; b( W' y& I
% |! t; g" @6 h0 h9 u; u备注:
7 J; u! m6 \  u1 @1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" Y/ h& N) Z4 ?% i; o
2、相关代码如下:2 p: ~0 o# G' c4 s! k; H! \
//UPP DMA缓冲大小512字节
3 s% \# d: P5 V5 C+ n#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ D- w7 {, r, a) K#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 R3 Y( f' X7 N  j" _/ e4 W$ G
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! E& P1 Q3 T; G* q7 U. _4 ~% b
: u% i0 q: E. |- B) {

& d' J+ a$ ^) ^- O//upp接收、发送buffer
+ W9 _7 R" o9 M) S1 y; P  p/ [: }#pragma DATA_ALIGN(upp_buffer_a, 8)
: F! B5 }  S* N# ^#pragma DATA_ALIGN(upp_buffer_b, 8)
4 q; k, a7 {. p( ?4 |- x1 y5 Z# J
1 ]7 F1 G( s. S) H! C: O  nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 Q# f) ~0 ]& |+ d2 x; c9 M7 qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 c2 v6 W( i8 n
  ^0 `& D8 c9 M% A7 W! e  S# E% c# R( `

6 N+ Q; Z  K2 j& B1 w, l) E( dstatic bool server_upp_data_recv(Server *server)
& x8 y' z% k$ G, {{1 V+ I" ?4 v; L6 N, |) b4 ^9 A% r' g% \  |
    if(server->upp_channel_a_recv == false) {+ W- W  L! F1 e2 M/ \1 P* g
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 G' D4 x/ p( ]9 P- G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
' @' n5 C2 u( O! f+ U            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# I; n$ H' b' q( ?' t* K; J( P! t- s6 z, n
5 Z# e4 _5 G/ @/ W) I* N7 X
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" o* ~: l  j5 i* J6 r
7 v4 d7 v' r, T3 {' q, E            server->upp_channel_a_recv = true;//0 {( y/ \% b& V7 h9 d  ~
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; s: m3 q4 `. S/ K2 u% u6 |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;  D  p+ f2 n7 w7 r1 C; q7 f
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;4 C) X( Y. o5 M/ @" S6 z0 l. g
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# Y$ N6 p* l" l- ^. r3 n
* r0 W- D/ p8 `/ O* P/ |# v            upp_error_count = 0;& f- `8 s% G, b  p; v
            upp_dmai_int_cut = 0;
+ k2 {7 F. b& N5 o- D; @
! j& x6 Q, u6 j% ^9 ?            // fill in data
' B# r6 A& T, K* c( \            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 N$ c. H- u# [* U8 T' _+ O            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: \$ n9 o% R/ O$ H% o' H
        }$ _9 K1 V. W+ Z7 z! S" r4 j
    }+ X+ h- B# S$ Y2 \9 J6 l
    else{  w3 p' h) {+ B6 ^* n
        if (upp_dmai_int_cut > 0){2 v0 m4 j2 S. {' J
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 L% a1 a5 u" y3 W  u* I2 _
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 w" j: G/ b' x
5 h. M" }$ l, M: |( X5 K3 n/ I* C0 ^
            //copy data to upp_recv_list_busy
2 y/ C- m6 I& X7 m7 \9 V4 @            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  e( @4 S9 N4 @5 v0 @1 w1 ]) H" [  P4 l
            //% @4 B7 [3 g, w! z; V% u
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: U8 W; g" d  v2 l( n5 ]5 ]8 I9 W) i8 |8 g5 D# V
            //
6 }8 Y+ O2 F+ G' M            server->upp_channel_a_recv = false;//8 g( t) k5 T/ a1 f( j

" y' X1 h0 \; i4 _0 D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
( [5 L6 t3 Q0 n" Z: \+ s7 [        }) |$ F+ ~! r; l$ @
    }% c: ?1 r# B7 N& j2 t6 P! l3 F: x; n
6 E, y* I/ ?8 A+ _( H  S! j) q

8 H" X0 O  b* @+ D- @( G, q    return true;+ S4 w# [" `  i) a9 }: x
}
! C! b& d$ @  p' J& b+ v9 w2 [* G& z" G1 e
static bool server_upp_data_send(Server *server)' H5 [6 l9 e# _, N" x: I
{
6 f+ V- n$ l% v) z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 ]; n* @% F9 L, I$ i        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 P) ~1 z. Q- v" u1 r$ v        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" R$ h4 I# [3 a. C, W$ {
        char tmp[128] ={0};
) u9 R; u  l3 y  O2 K! t$ M; a, X/ w7 d8 }& U
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# h: A  v( w! O        print_log(server, data, 64);
2 {; K  W8 a5 k7 r% s( S; w% S! E$ p- y2 u# z2 r8 D+ i
        //
/ ?1 t# z8 s. Y0 G1 ], b4 g        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; e( K; K" A$ t7 J        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 T. j' _- d- d        print_log(server, upp_buffer_b, 64);) b- s4 e+ J3 ^: ?; l7 N3 F; X
9 p$ N; m: r" c! a, ]
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ F  K. j' t# s* p
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
% M! G! @0 L; p# E8 d        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ q) q/ x- H7 _
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, B# \4 Z4 q% m# y; c, o" `& ]
5 ]+ V) m, O( r$ n; Q1 F
        memset(tmp, 0, sizeof(tmp));/ g  e8 \+ }4 X
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 P9 @3 @, h) N8 p4 m( I0 U' j            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 X3 E1 }- d4 h  r        server_msg_send(server, APP_CMD_LOG, tmp);
4 X' a' n  K4 t0 C* v' V
4 S8 V1 }8 w. C4 K3 Y  }$ u5 g* S        upp_error_count = 0;
9 F( H* V' n! H. a7 h        upp_dmaq_int_cut = 0;( E* B; Y! A. K; O6 Q# ~6 ?
        // fill in data ) t4 |+ i/ B; W: W+ `
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 q7 Q. y! t( ?) ?9 b$ w        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 E8 G( e" N' \! y( `, z$ P
8 _! L1 f9 l  S1 ~& k; z
        // wait send success
1 U+ p" [+ d0 y$ A; V1 d        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 \1 i  F$ v% c" j# _( a% |! I2 u1 ~5 k+ P
        // make data node in free list ; S% ]. K: y8 ]# w  l* o- ?# {) _) D
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
$ H6 C$ N+ K+ N% `' @; f8 L8 ~7 ]        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) Q% E9 Y5 e5 O6 V  Z, X# h4 ~    }
: O# s: k% ?; v* U% P3 f) L' k- p    return true;
7 H" |/ [1 C9 ]}
0 v( _- e! \& J# y0 i8 _& D( v# P$ ]
( ]5 r( }2 K  {/ r4 P" Z$ A

- L( i6 n/ h+ `
7 L7 Y! G0 @+ G; f

, ]2 F0 P6 ?( ?
4 ], b3 u% u: D7 V% {8 x! O5 z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐. C7 t1 c. Y( w; v7 H

8 M3 P$ Y3 y4 R$ H# H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 11:06 , Processed in 0.040347 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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