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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# P; T" i$ u% j" b" g& v
, [3 e: `# V/ E" ?' m5 P; D6 T问题描述:
% S7 V( K9 r" S* [8 M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& p3 G/ ^7 n2 ?/ P/ D+ D- V

2 _; _6 _' M! s' N图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 M7 c/ b8 B) `% B! c+ e$ f
5 g# h: |2 J& U' ?% q; C7 ?测试结果如下:0 k! d  T) N3 I" x) s- e$ S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% \' v* q( _; P1 G4 |

0 C; z7 i" y+ q6 v9 D
4 [" u3 X/ g5 {) s9 |3 g. E$ }备注:
$ U6 E* K- K$ k# W) P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
4 E# u( S9 {# h4 Y& {1 x7 _
2、相关代码如下:
) ?/ C' I% L" k5 n+ x5 V2 Y$ `4 T//UPP DMA缓冲大小512字节: p8 ?) B' v  {* |6 ?$ Q! Y2 Y
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- F3 s, U. D/ k2 L7 }9 M" a6 a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 x, v8 ~, p; Z1 l7 u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 h$ U  S: o# a1 t1 _2 L, P! t4 s( G# G4 n8 P6 M
; P, X; f8 t" _
//upp接收、发送buffer
) R. X/ A) e3 v6 @' K" x4 Y#pragma DATA_ALIGN(upp_buffer_a, 8)
) U1 M0 g3 ?2 q#pragma DATA_ALIGN(upp_buffer_b, 8)8 a1 o8 H! r) q" G6 x" ?- g

; e3 m8 B" k4 F& B8 B7 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 a( ]! X2 ~5 L: Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];' y  F3 E6 M4 P7 r2 e

! H0 l$ @: _7 K. c; E/ e
7 ]0 ?. E! i$ z$ s5 z" Dstatic bool server_upp_data_recv(Server *server) & X" T# K6 e: N) H2 }  Z* ]1 u+ U
{3 `6 X# W6 I- m9 n
    if(server->upp_channel_a_recv == false) {
3 E6 X3 B7 \+ k4 Q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
  F7 n& h, R( Y# i. e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ g- b' T2 G! B
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ L' r$ k. t$ U# F2 c& _% x9 Q
$ G5 `. [  y9 v7 w0 C: e( e! Q. J

; m  m8 u( p: @            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' l$ L0 V5 _* `

* e2 a* i: X4 {: V2 E0 L            server->upp_channel_a_recv = true;//
, }8 S3 j) w% ]            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, i: P4 W4 w3 r# I& W8 c8 T
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 v) b: a9 e7 A( @, _            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;( G+ B; f! y* ^1 J' W- v$ I
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 @1 r# j3 U% q% P; E: W

7 y3 T% S& [$ i6 r& P            upp_error_count = 0;
7 j4 \8 e2 [; W8 m            upp_dmai_int_cut = 0;) @0 V5 t+ d' |

8 @+ O! w6 t  m1 Q% N7 o            // fill in data - G- q# e; T: C# A: U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) O  r1 M2 U0 M' X0 ]$ p, C
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( a% g: L1 o/ t3 r7 k& A        }
8 Z; N5 E& `3 C/ ^5 p    }
& I1 K9 |* E5 v    else{
% J+ @$ Z8 [& x& f+ ]- }        if (upp_dmai_int_cut > 0){
9 g- w8 p, i; I, b) P* A( Y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 F5 w# _0 l! ~/ t4 m            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. Y* d8 I, r& f: g
+ j) B# l8 r) z( X. f! R/ ]2 O. @; u. R# I6 N$ W% ^3 \
            //copy data to upp_recv_list_busy
& }1 r6 F7 M+ m$ _; M5 _/ h            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" I$ K4 @7 j- f+ G
7 [( z% U0 R" {
            //% P! D/ Y. b) d
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( A. S: ]4 M8 I! z3 X5 I. v
$ v( X, x7 D! y1 x
            //
' ~, f( w# ]  G$ ~8 o# Z            server->upp_channel_a_recv = false;//
" ~9 F# W1 F# |
. R; w9 d9 m6 O5 f- w            server_msg_send(server, APP_CMD_LOG, "upp recv: success");# T9 G- b# c5 m1 p( m% D% a  Y- j
        }
3 q4 V. I" W) b4 c2 n: z2 }/ F5 x) ^    }
( L; {( A- Z0 t/ _8 z9 U- R2 Y
0 E/ {$ G: L: D* U
2 G6 A# p. g4 H. l    return true;# N! ~3 k# O/ p+ Y: `% U8 B
}
2 b  k! y- N4 {
4 P# W% a) N' {. d+ Ostatic bool server_upp_data_send(Server *server)
. T( R2 o# M) p; B% B8 R8 L# a{
  o" U1 T" R0 r+ N    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 _' d+ j/ P# x        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 ^& u$ Q9 B  b# P( Z/ a. x8 r
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. q. J9 h! }! w' j* o* X3 R/ F
        char tmp[128] ={0};& l/ c, e, s5 y* S% P% h8 k3 Q% `$ F

6 H* p5 e3 [/ `) h: V: P        server_msg_send(server, APP_CMD_LOG, "upp send: start");  w, G( o( ^. E- [) i
        print_log(server, data, 64);
: \. W" ^7 H' f& e
" ?8 O% s$ I3 X        //( j' F9 _+ i  O6 B% f8 y
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);9 }! I+ \6 C* F
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 f$ r- ]9 I, s        print_log(server, upp_buffer_b, 64);; @; {, H! @4 G* k% [8 u

' V, `! K5 i; C7 W        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 M3 d% O0 Q, I9 @7 k
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
5 r7 s, I; P- c' t# b" j9 d1 }) i        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# x8 u7 u% \% b/ h8 B5 g8 @- D" o
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 Q* r) i' I6 Q6 ~- v7 ~1 Y% X% c
% F' |, M& N+ ]3 F. f
        memset(tmp, 0, sizeof(tmp));
" @' `$ `: b# c$ T/ R        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ D! Q, z) K) I9 W" I            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 D6 j3 P& r9 d% L# h3 m% A' y        server_msg_send(server, APP_CMD_LOG, tmp);, k1 ^7 K. Z: k8 v  }) g6 F( V

& z/ w' G; P7 `2 T8 p        upp_error_count = 0;
% n% Y# k$ w6 T' Q$ C        upp_dmaq_int_cut = 0;0 S& K* R! m* z3 O* }
        // fill in data 8 `5 k7 f1 k9 S
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / t  D9 g8 A- i* O
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 t; V, _% ]# r" [
# J/ x  C& O  M: s* U        // wait send success
7 l6 r$ L+ O$ Y  S. f- @        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 ]4 N7 g( X7 v1 E9 g: D& ]0 P, X+ Y# `' r
        // make data node in free list & g. _2 X8 C) v& X) W* h/ r! d
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 N6 c0 y6 E4 Q$ i' V        server_msg_send(server, APP_CMD_LOG, "upp send: success");! e  z- o1 C% _$ O) w! w  Y- }
    }
, M  T% l$ B) a' j1 f! W6 j& K    return true;& f7 a) b% p3 r* L
}
7 H6 \' J$ H( E, b0 ^% b, b6 i0 ^
* F0 v5 R% o0 i( b# f3 x: T
5 m6 C" C, b4 c1 R' @3 P) ~& m% U% \
) s: J5 x" H8 ~- \8 u; r: E9 E. Q

, p6 a; ?+ L& D3 P5 x( q$ H2 h
- U& _; z8 Z0 Y0 C( A! ~

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- c2 }/ {2 K  B4 Y
8 t+ \( }  S+ R. R6 m2 h  [5 J

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 22:09 , Processed in 0.039715 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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