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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , N2 h& R# F* D+ \& o: Z. D
  U( o! b2 C$ Y! X0 j0 l# J) U0 F& E
问题描述:
+ |4 _1 H4 f& c  S9 W在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
3 c9 D) q4 {- D* j9 t
$ j* @' B8 n* G3 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! v5 G5 `7 i6 M' ]1 i, }. E0 j, g9 r' Y% H: a' E8 A
测试结果如下:
" Y# w6 E9 h6 A+ P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ o$ Y) |% o+ @1 P. m6 F* {$ a# y) [
! O" x" y# H: k

: e5 [  h8 d: b; S' S8 k备注:
5 X( c" u# `" S7 X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 r3 @7 K7 u' v
2、相关代码如下:( L0 t2 E: e; ^6 w3 d
//UPP DMA缓冲大小512字节
- ?: R2 _2 d; h. K% D# L#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ C1 `9 O$ D- B! P5 p* @, P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* p7 I' b1 t" P. M1 F& y$ @
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ X1 a1 V3 T+ G  H+ T( L3 }  G9 e3 N/ i3 e. {- [+ e# \. {- j! A

. V  J! a0 _' w; M( P* Z9 I//upp接收、发送buffer
9 D8 R. _0 D8 [3 ]+ s#pragma DATA_ALIGN(upp_buffer_a, 8)1 L1 c4 y; w3 z6 {% _! v7 d! T
#pragma DATA_ALIGN(upp_buffer_b, 8)6 [- s6 u3 Q& a8 g, c8 r

# ]) l/ X" ?- z" Ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# f6 Y, G) k5 z8 |( I
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- W: c1 H3 N8 Q6 @
! L. z8 ~; t2 j

! Y' t: w% A( K0 o' e! lstatic bool server_upp_data_recv(Server *server)
# I3 V- L, }. U9 D- ]3 H+ Z{
4 V4 ^& y( j7 f4 W6 e/ Y    if(server->upp_channel_a_recv == false) {
, t5 J* n, J4 x- g  B" O2 ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 p0 H3 ^- ]/ X$ ~9 J( ?& B
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) I3 z+ r) P8 b. _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 S( i# @1 ]! ?# Z; M: y
7 E; J: p3 Q" L2 _) d
* m6 l* M, m* t5 S! r3 q! H            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ j+ R# T/ j# M/ h: ~, g5 u3 J

7 X: y' i: r$ N: c) ]% G            server->upp_channel_a_recv = true;//
" k  v0 l, M% ?: E& T0 h2 T  q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 J' o! u# {2 k$ ^% p
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;  p, |( x! ^& a
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;5 ?1 i2 D, l& ]
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ m' |) l; A2 v3 K4 Q- E& J: ~

: h) o3 ^. l$ Y5 n* L" A            upp_error_count = 0;
# B5 a: S; v5 s1 E4 z7 B! j& I" ]- C            upp_dmai_int_cut = 0;8 z0 U) H7 P2 {& J% S

; V4 i) ]" i3 O) {7 ~            // fill in data
! }0 x/ @2 o3 u2 A* d, ?+ S* ]) S            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  E5 g+ s5 Q, `! V4 z8 r7 p: k% X
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 y. C5 \5 @8 q. c# y+ c        }; v! q+ _" w3 a" Q- H& V+ E
    }/ [6 [, x9 }& \! W6 x: U
    else{
: E2 T3 d: g" h; u1 F" R, B3 U- b        if (upp_dmai_int_cut > 0){
6 X5 W6 B) o5 ?: z            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 D4 g( t* C5 g1 j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ c  N' i6 p" z
6 d+ S* b- y& P4 A* I1 r' I4 H) l3 I9 Q0 V- k, X
            //copy data to upp_recv_list_busy( M2 K" ]9 g7 [3 |
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 k; ~# G) I7 h3 @6 i

% m$ [! G% @: i$ A5 w2 `            //
' _1 [: a; M$ ^( B8 N$ x! |            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" e4 w% s% O6 K# W. P  r6 T) g! v& b. C3 t& x
            //) H% G- s4 \8 @2 E0 _
            server->upp_channel_a_recv = false;/// S: I0 z) L. E: W  z( ?" H* i

) F; s0 {2 [4 d, h. S. Z; h            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" Y$ a4 [5 k* g! I$ K        }/ F: M- N" p) s/ y0 |) U
    }
2 ^1 Q  e0 S7 ~& p3 {  c( k5 e2 q" o
; x0 P+ @$ N7 E; U3 b! R  F6 U7 Q/ f2 n7 A4 D8 C) N, B
    return true;3 H9 z$ n1 i) r
}* ^# N# C# p1 v# E" g
) x: |5 y1 i: [) y
static bool server_upp_data_send(Server *server)
0 F7 k5 q- l' l  E+ c" _{: v5 z1 o1 q# ?3 I5 Y
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, Y7 M- n. m( F2 N7 |! _0 }0 w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  r. k% c; b  j  A  f3 T1 @4 a- H8 T. T        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# j8 M; ]; B6 w: _# i
        char tmp[128] ={0};& H$ w9 z. p/ G' C
& U6 R8 t& j, g5 Z8 P2 w0 ^
        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 y( Q  L% a# ]9 v" o/ A
        print_log(server, data, 64);- f& x) j5 R& N" A$ L$ c

% N8 l* J5 j; y( g, K        //
: H" D* j4 u7 {7 l# N4 X0 a        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! T; _! b3 x% B$ F
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% o  }& x( g  x9 Y! W# Q, x) D
        print_log(server, upp_buffer_b, 64);- `/ v# T0 L2 V8 O

* U* ]1 W. f9 q; U' @; g        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
; y- ~- B$ R8 O% z  A/ g        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 3 Q  H% Y: ]4 ]- l2 K& m8 j
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# @# r6 y8 p; g; n4 E  Q
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: U( z3 k$ J; F5 @3 D8 S& q7 D, z! Z' q' @
        memset(tmp, 0, sizeof(tmp));
! W! a" e$ ?$ q1 G& H, ^3 `        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; S% s7 i0 j) v$ j1 F1 f            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 l' `" J! v' {        server_msg_send(server, APP_CMD_LOG, tmp);  t9 }) N& @6 q5 t" s9 j0 f

2 u* D% E  k, A: ]: {        upp_error_count = 0;$ h; M* b. `0 P( b3 [
        upp_dmaq_int_cut = 0;
3 D* x" `/ Y* O1 d8 }- h8 }+ i% t        // fill in data
; ~' X2 n4 W/ _6 _3 D        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 Y1 O/ U5 [7 |$ N6 y$ P! K, Q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, @4 O& \; e! }" c( D6 r% f( a! p1 C

8 h# E3 F3 e  Z9 o        // wait send success" J# Z/ C2 n* @8 d. y" I5 e
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - x2 K/ k2 V. l' Z- j: j

' s3 n; J5 t" E7 u9 V1 f& _        // make data node in free list
; d0 k& m. _6 `7 w+ G        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" g- q2 y: X( N# l8 |6 c% K. C        server_msg_send(server, APP_CMD_LOG, "upp send: success");" M' V. |" E2 |+ \! D, k! U8 x5 H
    }* p3 c; }# l! [. g# Y- n: `$ w
    return true;+ f, ?( }0 r& {; }
}
3 D" R8 f/ N" f+ T4 Y& P( t5 U# W) ]6 K) B
8 Q) y- N+ E# x7 Q

3 V+ w& x. g: l% y  [6 X) @

9 M  p4 F- j1 G0 c
4 e: Y, O; g4 {7 E( k- G

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 C5 E0 T( ]# H! W; r/ f; C0 @5 R# s$ q  s0 S( s

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 17:33 , Processed in 0.043576 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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