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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! V- |* I$ a/ t/ _- f3 {
1 w3 g& R* M! j' T问题描述:4 c4 |! k' g( p6 E) h- V8 Y! V
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% k9 E) ?( Z# @  B& n! _+ [/ H$ [
7 ]# Z; X9 `. s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- I1 g' c8 C  i; ]- N
* j5 b3 x5 p* V2 {" ~
测试结果如下:
% R9 l9 X5 K+ u% \6 s# _138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 E, @6 E1 {2 D$ a) |, E. W9 g
7 G4 U# f4 h, u" P+ V5 R+ s* ^2 T

5 [, W9 l6 F; r) e$ n9 ~6 D( [% o备注:
/ V0 B" a! R  X9 H1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 k- b3 @1 P% M! m' L
2、相关代码如下:
1 V7 s0 h) G" {8 d# s4 n//UPP DMA缓冲大小512字节7 U7 U( e. B* k) Y1 v2 B& [1 ^
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 ~- x  M7 w/ @8 R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) V' O$ S$ y$ }2 z' r  c#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 B( w  w, f6 c! }& R! v: T- N
$ v. o# U+ m! o5 J

" D# n! r) V# y* q# _% l3 z; `//upp接收、发送buffer8 O! x5 f& f) J! C% d& j& ~
#pragma DATA_ALIGN(upp_buffer_a, 8)( a5 T# g8 ]7 _# O, f0 d
#pragma DATA_ALIGN(upp_buffer_b, 8)3 J) ?4 L, w, B/ M  T6 F- u

) w  l8 A+ z" V' d6 }unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& t# f. n( n' Z* lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, V+ s1 n( z( o$ X3 j# K3 Q( m

" _0 u- v7 U$ P) t* L% T! o" e0 \* {: Y: D3 N
static bool server_upp_data_recv(Server *server) 7 L" M1 {3 Q8 G& c- B. \6 {/ U
{
' T) h) d/ f7 i2 V0 |    if(server->upp_channel_a_recv == false) {
( A+ t5 U6 r6 q9 y8 j! B        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 B( S/ N8 v. r% r( Y& @9 r  w
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 u) ]  M) R7 T! x
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");+ ~1 ?3 N4 ~  ?  B6 \0 T
8 V5 G9 \1 M: O7 h9 a3 C3 w

1 M. ?; ^+ m% }) s1 Y5 l7 J* S            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" i/ T$ O' T. F! V0 V
$ c: J) P$ V0 h5 T: w' t' k            server->upp_channel_a_recv = true;/// B, {/ C" [3 Q- E3 G6 `7 ?' H& ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' ~) W0 y9 u* D            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;& ?% [/ ]# M: C  }- {
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- E) _0 q* K9 ?$ A0 W, X1 U            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* C2 q9 T4 Q; j. l! ?$ K/ m

! @: s4 n; E/ F8 h5 e* X" {; Q            upp_error_count = 0;) Z" B. P& j3 p8 O# x
            upp_dmai_int_cut = 0;/ ?1 b+ A& T& S. d) K8 c

5 P4 b4 m7 Y* l) {4 m) m! A            // fill in data : M# h+ d1 g+ ?2 m$ p
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) p. S! v' t) h4 A9 x0 g4 T4 Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 M# c; F/ |+ ^, b  W, ~: ]6 q; m8 p        }; P2 Z7 y* M2 \/ g0 m3 m
    }+ }" w4 U7 l! h. N! p
    else{
' K5 n2 O) Y9 F# Q# ^        if (upp_dmai_int_cut > 0){
7 s$ g5 m9 Q3 h. b5 z7 g            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% B) _8 b, k$ {) z& n5 g- O            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' }% x8 }/ O8 U% v
! s% ]0 L% O. J2 X2 v* e
# \+ W! I- Z1 r7 F, g            //copy data to upp_recv_list_busy
; X7 L- q8 m) G6 E4 C            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 @$ {) Y2 O& j, C7 L/ v) x7 @

  g  H" ]# @- ^( E1 y            //
7 k( F, _! o2 c% y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: f. X5 x4 V+ O7 n* @. _" M: @. k- @( _8 c' ?7 S
            //3 f2 Z4 F3 h+ g$ k& q  I
            server->upp_channel_a_recv = false;//
; @# Y  Q, U; T1 _- w: H
( L! A9 }: ^5 M! O            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: s6 O5 |5 H$ ?+ s6 h4 Q$ Q8 R        }% Y; B" e( c8 Z, k
    }
# c7 v; L. H8 W. o. [. ]3 x
. ~/ c7 g) K! U1 C, d( f1 }/ R
    return true;; Z, T4 p8 v0 i$ ^, b
}4 ?& `- d, K/ a- u; Q

9 V' \. Y) E5 u. a  [; x! q0 a9 qstatic bool server_upp_data_send(Server *server)9 K8 e8 D1 d  C; W8 d) y
{0 _; `0 Y" C  x" x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 P* e0 C* q( s
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 [( G" X* w' t% V        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. e7 t1 Z6 M% b! T3 _
        char tmp[128] ={0};
* R2 }) A% I+ E* U6 T5 h: {0 N
9 ?( m/ z4 \! K' v        server_msg_send(server, APP_CMD_LOG, "upp send: start");# W5 o% o' D- |& s8 ~% t8 N
        print_log(server, data, 64);
) t. I' V' `5 T; O! y# x9 C; `: y: C: I
' u0 R; b( `' Y6 I        //
/ h: i3 p8 m0 y: v        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
/ B+ I" N8 X( F$ B' J! W8 C        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' G+ Q  B% Q$ Q4 |- s! k) S/ T: @( y
        print_log(server, upp_buffer_b, 64);! M. k. ~( I9 X' k3 Q9 \

/ [5 B- n) A5 v' e; B2 L        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  U( g( e8 Y% z5 ]        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / `+ G1 R0 D, v
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ x+ }! q, p( _1 U- d% n2 p6 m
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) E7 ]; v. V2 n9 o

3 Q' m' u, K. ^' ~2 E& p        memset(tmp, 0, sizeof(tmp));% E2 B5 o( }2 Z
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 v6 c* d1 P8 X9 |            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 p. d) n( g9 R        server_msg_send(server, APP_CMD_LOG, tmp);/ j$ S3 {; i  E. J" i) n% J; {

7 M! \- m) a& o, u        upp_error_count = 0;1 s. Z- ]; Y3 y: a
        upp_dmaq_int_cut = 0;
& X, B  ~9 W7 V5 w5 b: A        // fill in data # @7 k: s7 k6 W. j
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' {6 p0 y7 \4 q; ]% s0 K7 ~        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ [/ W& a( i: P; P! S: p& ]. [. m1 x1 g! N" Z, H8 Z9 B' T
        // wait send success7 e+ ^7 d& w- I& \- |, c+ l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' ]3 h- L6 X& q; X( t5 `8 E3 G; a3 p
        // make data node in free list + \, S: e% {$ J# X3 q
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 K& F& ]: d: u1 g
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 w+ M# D& G& V8 A7 _
    }8 K4 N- {* P( T6 N# o/ P# J% c
    return true;, Q. K0 O& S, ]
}
" l6 N/ G- v( s/ ?
& r, K, o( U( x/ x6 p* ~: w8 H
" k4 F4 y2 d+ x7 E
5 y( [2 O" b$ _! D
" N$ a( N5 }( }% ?; h

* `# ?# _3 f1 W- Y4 w) C6 g

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
& ]1 S) Q; X/ [6 \
7 w& f& v5 I: P/ \6 i7 o

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 21:51 , Processed in 0.040820 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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