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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % O+ z4 H/ b: ^7 \4 }

- ]0 d% _6 C% t) G问题描述:
- L5 T* E# h3 e& ~. h2 J在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; d; B+ G* W  Z# R4 U- V
6 i3 z% _) l) D
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 N9 S5 Q5 J9 b" k) v4 P9 Y# H5 g7 ~. @- c4 ^# t
测试结果如下:' r7 V7 E8 m- K: S! V3 ?
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" m. a  P: j, j3 ?) G. D
( N& E  f: z' Y  b% G7 m' y- u

5 B+ j; o- a8 ~, V: v备注:  `9 h% K& o) r5 r8 Z( g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 v: D+ C1 S0 p3 k" p/ L
2、相关代码如下:. C; F0 n8 }4 O, P$ I% F
//UPP DMA缓冲大小512字节" j$ b6 @- r$ Q" @, S; |2 }
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) E( S; q9 r! J% z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- H2 G/ g4 i! V# |9 }9 A" _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 W3 l+ G, W+ d- L6 m9 J- |

6 L- X8 A4 f/ h: d7 V% ?
5 A, M' r+ _0 ^! k  a//upp接收、发送buffer
' k' p) i, c8 l/ m4 _- k#pragma DATA_ALIGN(upp_buffer_a, 8)
' |6 o4 D0 s7 `  @& c/ R# D#pragma DATA_ALIGN(upp_buffer_b, 8)
& F4 v" N7 n% @7 ?1 }' h) I$ c9 o; P
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% A3 k; F( c2 T! G- e& A0 v+ u! bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ [! g  c. G4 C9 ^) b5 e, n. g* {3 u

" A. q' B  k0 I/ v1 @static bool server_upp_data_recv(Server *server)
8 F' R# U" I/ q$ d9 Z/ ?. K1 k{! k' E3 b8 s- u' A( R
    if(server->upp_channel_a_recv == false) {' C  }1 q+ X- B- Q
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: Y! m& Q7 S0 l3 q3 Y" c3 i        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 p" N4 O; w6 {+ E
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" \/ x) b+ s8 r: q: O6 U* y' ?* s7 N2 r1 M& M8 X

# d4 h# f; L9 k            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 N9 A5 z+ }" H6 a% Z3 @2 a: J% Z6 r' l. v1 c, j9 u- M; ?
            server->upp_channel_a_recv = true;//3 [7 o; m0 U, {' {) [" J
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
3 c; {& `3 e5 g# [            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;- ^" h8 a, G6 y" {
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. H0 j# i: W- j# Q0 s            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// A6 ~; Z, }! X% A

( l6 P" |( k0 F; b            upp_error_count = 0;
8 h9 G+ G, H# D4 \; J. ?0 p6 ~            upp_dmai_int_cut = 0;$ v" \/ {) X: z5 W, v

7 V! T+ f, W. b2 c. G/ T            // fill in data
) ?6 R/ N( t% O) T' S( r            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);% |, `( q4 o9 B; v! z; P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- Z* _5 @+ Q( Y( O        }3 Z5 L0 @( R' B+ k
    }
% V, w0 d6 [4 q! l/ ]$ @2 H    else{$ E+ }/ Z* j9 L- f
        if (upp_dmai_int_cut > 0){" R1 O  K, f  J, |( D
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);* R6 P* J* U1 Q6 E: `  s0 Y
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; E2 @& C: m5 P$ A' j
: ?% V& L, J2 ]2 a0 U

! u- d3 e" H2 d& M- E            //copy data to upp_recv_list_busy
0 O# Q9 z0 k, l- O4 I            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; M! D" Q8 Y/ L1 t
. @) O. l) B5 X+ \  {            //1 ]) q3 J- }6 s3 Y
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 {7 H7 F. A4 l! f6 G

) B7 R6 @# o+ P            //
+ l3 u. F6 `- j) q( G; G            server->upp_channel_a_recv = false;//; q. f" ?3 N) {( g) X6 A8 z
! ~2 U3 T7 z5 [8 h5 r2 G
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");. L) N4 \, G. ?
        }
& w8 |/ D. }+ A6 l! S. c0 }  @# \# `    }
8 I1 U2 Q7 P9 @+ J6 M' w+ [1 ?' B$ C# e9 r3 B! U

/ A8 p8 ~8 d& ~! i1 ?    return true;) |. C: S1 {: K9 g
}" }; q  e2 |/ m5 V  Z

4 g$ ]3 q6 `+ Y  V  e- x: k% @static bool server_upp_data_send(Server *server)) {- @+ s3 y, T! _+ q
{
# j" j2 C$ G6 [0 y0 [( x) U    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! X/ T5 b, j4 y$ a7 e1 x
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 w1 n" a! {7 _- N; m7 c- a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 _  H( f' J1 e! o4 ^8 Q$ p        char tmp[128] ={0};
( @2 I) V' m( X8 S" H+ U* N, k% \* J; c( w. Q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");0 o' E" n" s' `2 J* z% q
        print_log(server, data, 64);- N3 W" Z9 A1 K* u9 z$ b5 }1 [1 i
$ P3 q+ V; ]$ ]( M/ [2 q0 T
        //
- P( D# f: ?! I( a        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 O, N) C8 A5 n# a7 Q8 O        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 P+ b; r6 g' k3 n/ U6 Z        print_log(server, upp_buffer_b, 64);* U# y0 s8 a" b( G6 x

: `9 E; Z" P; ~: {8 H! z        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; g# H5 z( }+ g+ O2 i, V, L+ Z
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 A, c/ F4 Q5 h* d. W% j& ~% a- y
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ p( q' N' Y! U& A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! \9 F+ v. W* p/ g4 V( h: g
# y( l6 I& Q! l% J) z: C- ?0 H
        memset(tmp, 0, sizeof(tmp));& N3 l+ v% i" Q8 D: d
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 x! {- }& [! N+ I9 J# G            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: V2 q9 W: q9 {0 F$ P        server_msg_send(server, APP_CMD_LOG, tmp);
4 g* f; G  P# \8 {
7 G9 d6 e0 q' s- i% Q        upp_error_count = 0;9 v) x$ ~, m4 v- v
        upp_dmaq_int_cut = 0;, ^! K1 |( |5 Z, A
        // fill in data
, f; S4 T: ~- ~) u0 c& e7 b        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! T4 m2 t& k0 a, ^- s1 z$ W        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: A4 i$ g5 v( F1 u9 D1 }" X
4 U; s& w+ A0 [! Z
        // wait send success
; p$ W2 i. s# f: G$ _  K; [        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 X3 ?! Y# d% q* J' u
( S! Y" y* Y, _' G0 C; w
        // make data node in free list ! x5 n/ s+ W9 D& g- s7 }
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( p& d8 e  s2 H, I
        server_msg_send(server, APP_CMD_LOG, "upp send: success");8 e4 W5 r6 N( l: C( I
    }
0 K( [6 R3 }- F& V% }. @- o    return true;
% Y5 }  j3 ]5 ~}
) o  c- j9 B) v3 f5 t. C2 G- Z# Y) Y/ v/ H& s9 X9 ?1 N

8 g( x9 `5 ?1 V
7 u% s! H! E! Z7 J3 X" @
/ m. l! K4 n. `' D4 m6 F; T

! }0 d( m& _  ^* |. r8 t) B; t

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 B! r4 v' f! c+ `
3 y4 d  u4 b& b; ?* m

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-3 11:26 , Processed in 0.057903 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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