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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 h7 ]3 o! }3 x6 V) B5 G+ b3 Z8 |: j2 [
问题描述:
% a4 c5 [) O. J1 A& ^# G在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 ?$ G2 y% z1 b; e

- {# q: N2 {9 \5 s! c2 a* `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
$ m7 q  X3 |2 M3 d
( ]: d( S+ P9 K2 l0 a测试结果如下:
1 ]1 F; \3 n( \9 H  T/ ]' d0 x138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 l$ w5 V3 ?% H* J, l( ]# S5 b

, [0 f' E: r; m% r! U+ |! e" L9 s' p" p, \
备注:
) N2 x% a6 X( H0 s" Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, ^. p# m$ z2 Y, ~# f$ X, H
2、相关代码如下:
& U4 G) Z( O; {+ S: i1 |4 ?' H//UPP DMA缓冲大小512字节
, L9 e9 e3 q; z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 @9 ?+ R+ s. @' w2 P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 d3 t2 M5 h% u! @0 L2 p
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- ~& Q: R7 p6 P/ A: l4 _
, M0 W5 J  T! s6 ^. s) x& |( @5 s; h0 T! h9 K9 }# U! ]
//upp接收、发送buffer
" U' x/ c$ N' ]$ {0 d2 z#pragma DATA_ALIGN(upp_buffer_a, 8)
* c9 Y$ I. R! R#pragma DATA_ALIGN(upp_buffer_b, 8)
2 K8 b1 i$ w4 s  O
3 e& d: \+ E( \' Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ j( |- \6 m! D/ T0 q- @3 d: ?: uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. I+ b' |( M; F! P
  L" P# C! j  s9 Y5 u
0 |1 T1 ~) |1 L+ a5 o  ?& h9 D8 Jstatic bool server_upp_data_recv(Server *server)
: f/ C" H' t1 ?0 Y* D{! L' r$ ?& B, W
    if(server->upp_channel_a_recv == false) {% W& M$ w9 X" `  ^' U& N( f
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");% q1 u  m# l% V
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
; o, g% ], v; y5 j) [( t            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 U8 d' n* _1 {; `8 e0 \. x2 g. j
5 `; P" U; U! H
% N' a3 X. {/ E+ d4 C2 P% _
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) A' z5 B5 w6 Y7 E4 d9 C

! n. @# M! w4 G: c* ^$ q7 Z3 E            server->upp_channel_a_recv = true;//( N) U3 D9 @7 V+ H! z! O
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
8 G4 y' b7 r* f+ q3 z. ~) F7 v            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 B$ ^% u  I- n1 G0 F, C4 A9 g3 U8 a
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
5 O+ s1 R- |$ `            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% b6 I/ c) T( D+ [' u1 v; o0 q/ R
3 h  J/ v: c0 g% M6 _$ N* u9 S            upp_error_count = 0;
6 S1 H8 n" F3 l4 H+ \: J            upp_dmai_int_cut = 0;
, m+ e, |7 S5 Z) q  o  I
7 E0 t$ I( D, Z, @: R            // fill in data
% X) p. ^0 Q& j! ?! |" }! k# V            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  g' o0 J' F: R2 O4 J4 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");8 p" R, Q  Q  Z
        }+ [9 V/ _8 e# q" k3 u/ o# |! z
    }
: Z" [5 ^( ?' Y    else{1 I8 C+ ?5 ]6 s* P! ?: u
        if (upp_dmai_int_cut > 0){2 ^4 E8 k3 R8 M9 K  a/ t
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; {0 Q1 ?3 e) |5 E3 t& G            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- @& b) o/ j' v8 {5 a3 x
6 P9 J9 m0 |) l: q# a4 e1 ], T4 D

& ?/ q1 {) G: x* L3 j            //copy data to upp_recv_list_busy/ o( C. z  r1 ^  Q! _2 P7 X2 m; x
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' C$ v4 }0 v! n: G, J

3 l% N8 _8 R3 ]% g. ~  X1 W            //0 M! U1 N( ~  w6 ?
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 a" j) D- J$ s+ f
7 \  G6 `/ G1 L( j; U
            //
# J3 H4 F( C2 ~% i4 k) a( h            server->upp_channel_a_recv = false;//; v3 P' X- n# H$ N! ]

: b# o6 o9 y5 k1 z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 ~# d: a, p" t. o: s# o; L, ]
        }/ x9 k+ n2 t3 L$ g4 J, L
    }
5 Z# w1 [  @! s9 Q8 R1 x2 s& j6 k% R. K( [( @8 y

. u5 o8 u: }; t, r% l: T    return true;
2 b( V' w3 V4 b5 w2 v$ r2 A}$ J4 \7 g4 o% q8 E& k$ i
& {5 ], J1 D( V
static bool server_upp_data_send(Server *server)" m6 |* d( I* y. M- B$ j2 G
{
1 _4 G1 i* Y$ ~4 \- ~2 f    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 @0 u  F: J+ E" `/ X3 Q        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( Y/ d; j2 u. v8 I
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( f8 H  M( x/ e6 f+ m: U
        char tmp[128] ={0};5 H) G/ ]6 \/ k5 H0 b8 g

. t4 w- ^1 P) S' S" q6 J        server_msg_send(server, APP_CMD_LOG, "upp send: start");. W1 n1 K* X7 k4 f$ \5 x- r# P
        print_log(server, data, 64);7 h2 V, @7 m7 h3 h9 y# ^4 D) g: o- F

7 {9 n# f2 ?' Y4 d: G) P" f7 O        //
' P/ Z+ ~/ h# o4 a2 o, [        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 W6 h1 K+ N" d# s& ]% y& E! |6 \        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 ~2 k! p; s6 [8 O+ c        print_log(server, upp_buffer_b, 64);
1 n2 P) w1 S6 y& H3 ]' H
" M4 K: {% F; o2 x* @        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: F( s: A* ~$ W; e' n- U9 E) L
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 d& |7 E( h6 Z% g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 F& [, [& W4 f' y, v  N7 A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. h. ~+ W+ V( y( [1 b
& w2 v& q9 q7 a: K/ U- ?8 J4 |
        memset(tmp, 0, sizeof(tmp));
% ?+ g! U) v* a5 e$ N5 i1 g, u( R        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 p" C+ _7 s+ {6 ]2 N
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 K/ V$ w2 V0 T5 _8 j
        server_msg_send(server, APP_CMD_LOG, tmp);
: c1 {* p; ]. T8 {. i
" Q+ w9 Q$ i* C) G        upp_error_count = 0;
# m9 C' I; V, U; T& x        upp_dmaq_int_cut = 0;
( \. z( P# h! d% p( P- o9 m2 ]        // fill in data & a  N2 f8 L6 g5 N, ^
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n4 r# A" r0 j  e* h' q        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  b0 M/ Y. a8 k# C9 S3 ]5 u
( }' @9 U% l7 j5 _( X: b
        // wait send success
& X# H% y% \# t; m. S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 d# H4 g9 N1 q5 i

. i( L* f& a! @- o9 J% `- {        // make data node in free list
: k  D' a5 ^( o" c$ s4 T        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& c2 N# P0 i- A! v/ b
        server_msg_send(server, APP_CMD_LOG, "upp send: success");, m$ c9 C0 ~+ s( T, O( D
    }' w; k: T  t4 s
    return true;
5 v' k& }6 v; [}
" \/ `7 I$ g( d5 \" {* o5 i0 [* H1 w4 S8 v

. i' |# P4 {. a) ~
( a5 n( R3 d/ C8 o

! U1 N1 D$ I: g
1 J' c0 X( E: A8 S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 W8 |  N: Q7 n0 o. A
4 t) N, ~/ H* T% S& m2 P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 10:09 , Processed in 0.037537 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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