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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - W: C& w7 C1 n- I- i
3 `& R% k" O' I
问题描述:9 j+ X( R3 K5 J$ e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 B3 s1 C# V# j1 a2 w9 O
5 [9 K2 D7 I' E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! x# d6 N" h+ l* l; E
# W1 m4 F) J  `) x测试结果如下:8 T. G* u: n/ X& ~
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) L7 X* D8 ?' c( a" o
% y" T9 }- O# q) H4 m, ^+ R6 f( m/ ~2 h
备注:
9 Z( N8 x/ o$ V7 P4 G0 p6 ^/ Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# D- g' m( c! O
2、相关代码如下:
' d4 B% g2 O+ q2 O. R% Y//UPP DMA缓冲大小512字节) C! F& y7 Q6 e' \& O
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: l& n) B% q' ]( k: `! r# D: M#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# \0 K. ]( ?8 t( z* w
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" D$ M! [: l( K9 e' D( A  J
7 [+ \# w8 v6 @+ b& R0 `
% Q' h9 s9 E& w$ K  l
//upp接收、发送buffer
. j. H8 ~4 K' H& D5 n' V#pragma DATA_ALIGN(upp_buffer_a, 8)1 [4 t# C2 Z. e; z
#pragma DATA_ALIGN(upp_buffer_b, 8)
: S& b0 c/ r# h
/ n  _$ R- e0 Y5 k* Runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. a% I/ J8 X7 u/ e; y( w/ e+ N. bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* _' h- `; R& \6 P
  R/ O8 k! q3 `8 f3 i

8 y2 F0 U5 p( r) istatic bool server_upp_data_recv(Server *server) " |! B+ x: k4 l& c. d! t( M! N
{
: }! R6 _3 t1 B    if(server->upp_channel_a_recv == false) {! M3 P" Q/ T1 h# Y% k) l0 H
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Z: u5 w1 H4 v  H9 }/ G, a
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: [9 Z/ x+ [- }8 q1 A            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* `$ J2 c, T% _5 B$ a7 ]+ S" J3 i6 y

5 z: _2 P# [- s
% U& Z7 ?* o& Y: d3 g            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, d4 [0 {/ y' W1 G7 v$ v* N8 E* C8 B+ v) {" @
            server->upp_channel_a_recv = true;//
' z1 z# x# B4 f/ A; Z) w4 K( k8 @            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ d( ~% t6 `$ {# @, J* `            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! f, X. x: f- f$ y2 E8 H" t            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- M4 }3 N) p! a0 j- X, b2 ^            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 P8 [9 t! {, l5 ?' C* _" ]3 T. J/ z1 @% z
            upp_error_count = 0;0 X9 _* R+ u/ E) n: j0 G+ m
            upp_dmai_int_cut = 0;: v( q6 s" L) }2 i
- P0 X1 g1 K" J, m, T
            // fill in data ! ^1 ]/ g! H- w
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
) D- v% `! f4 }            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! K6 S+ C% t; z& |# o: \; r        }' E* n( x: f1 \! [2 p) X, g
    }
  Q6 {9 C9 |% J' M* y( _6 f    else{
  f7 N+ U6 H1 w# U; m2 p        if (upp_dmai_int_cut > 0){
, E4 A, x, K# q# B8 m4 \7 L3 ]            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 s# Q3 o+ h; a' M' t  M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# L* n" z7 z: c

) _5 _/ m' ]& `9 L2 N) s: r. m  V/ X' G: _& s  A* ]' B3 ?
            //copy data to upp_recv_list_busy% q& G  q, C! ?# k3 _
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 Z. X3 l# O$ c; B5 I# |5 z$ b2 @& r* i+ R8 e
            //
% i! u6 n" j, k4 p            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 s, x1 T5 ]- K

. Y6 `$ B8 P8 O/ M% X7 h1 o            //
. o# ~0 a# d. E# _) s. C            server->upp_channel_a_recv = false;//4 f' E5 @0 I* H3 i
' l' ^8 v# @3 ?$ p0 Y2 ]" ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ {; f- N: k# L7 K/ y6 X        }- @+ o: F# U: Q9 R' X1 i1 s' {
    }
; t2 D" V2 Y5 M5 R% T- H0 B- g0 F9 Y' S1 |3 r8 {6 Y

4 l+ R# z9 S8 Y    return true;
: H; T; Q* t: R}
8 l: w5 v! j4 n& }
; a  ]9 n! J( ~! p$ P# O! g+ Q' Sstatic bool server_upp_data_send(Server *server)) a) |: j- O, ^/ p3 k7 T; ^- W
{# x0 \1 q# O0 F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
6 o- s8 L) B2 I/ d- t        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 z' [4 c* D+ c4 L  ]        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- v8 \" X% \( _7 o3 |
        char tmp[128] ={0};
1 f6 G& ~- F3 R6 y9 x7 ^3 D% O1 @+ H& V! M7 v$ R# s3 d- y5 f) b# w
        server_msg_send(server, APP_CMD_LOG, "upp send: start");" \0 R! R: C9 L6 ]
        print_log(server, data, 64);
0 `; d- r; o8 b- Y9 N
8 P2 @, `' }, e1 c3 Y5 B        //! B9 b; m4 R6 l, o# q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' e! ~( A- Z) [8 L( m0 \
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% H- ?% `7 d& |) `7 h7 P+ Y1 e/ C        print_log(server, upp_buffer_b, 64);- y3 M: J$ b9 z7 }% D+ Y6 L
: c0 k+ ~; ]  P
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);# U9 n" u3 t$ v* J4 Y8 g. k- M
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
+ y$ l' v. @' @        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 ]- O+ ~8 k+ z6 I. V" X% w3 S+ t* H* k& y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 y9 q5 ?* q; q" y

- R4 ?' B, O, F6 {        memset(tmp, 0, sizeof(tmp));
1 X4 P) g4 u' m9 D8 I        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ z! `& J* N9 W7 M+ D            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! j, R- A7 i+ f7 D$ E
        server_msg_send(server, APP_CMD_LOG, tmp);% m$ d, j. s, y
' X& {/ l: Y9 t  S' Y
        upp_error_count = 0;
4 ?! N2 F% r/ f8 A! C        upp_dmaq_int_cut = 0;$ ~7 l' ]1 u2 f0 v/ S
        // fill in data
! E* t# }: X. z7 F" N$ z5 N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 J1 @- V! Y' K7 t/ z9 U# P6 U1 h        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ S5 {: p% p. s- [0 C* }" f9 k. P/ h8 f2 h) L6 _5 g
        // wait send success
: y9 P& o2 C) o! n' Y0 q, B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ j" B0 I0 T3 p5 \
8 G4 X% }1 M: F) _        // make data node in free list
) `3 g1 D9 c: R7 o0 u  I, K1 e1 Q        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# V/ F0 z0 h! ~: i  ^4 h4 s4 C        server_msg_send(server, APP_CMD_LOG, "upp send: success");# g, _% u+ S( {7 X2 X" B5 b, x
    }/ V% x; Y4 C7 [/ U
    return true;
) g1 m$ K, j) `}
% u* M# L: U5 B
4 l% y! ]/ U) `' ^1 V

) c! e+ j# h! w7 V0 d& _3 D
* k# q! U6 M& O) R
5 a+ l7 @2 ?- T
/ y; n$ h/ D8 W. {- J4 J4 f" R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 A& Y+ h: P7 I8 M/ [6 ?# @# [; O, j4 D1 o

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 10:56 , Processed in 0.042613 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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