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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 i1 ?( P5 b6 @/ {( A# Q  g- ^2 G8 T% O8 T: G: T2 R
问题描述:
+ {7 q, g' r. n6 I) p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  L+ k( J% J/ T' h( z

; I! @+ u/ f: H! a' [: g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 ]  F2 d& I& ~

6 Y5 Y' J' B. f( I) q测试结果如下:
7 t3 E2 \/ O3 @% W2 f- h2 L138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. j- q/ g6 y* N0 h5 G
4 `% ?6 H$ @, v' q  A; r, j/ _8 d
3 ^. p3 H+ `& x. A备注:7 f) h# P0 Z& s; s# h; o8 p5 [7 ]
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" h' X  S, j4 d1 ~/ I
2、相关代码如下:- j, i; \# t7 K/ G: n
//UPP DMA缓冲大小512字节
( \: E9 h' n0 X7 ~6 o8 G  P2 a3 G4 ?#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" L5 j% G- Y* B/ [8 M6 {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, [  i4 E2 w% N#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 R2 c% r& }& W; J5 m' W3 y6 V0 L

( t7 X4 R4 y9 Q( C% L# X
9 k6 X' G; F" F8 T/ H//upp接收、发送buffer! _* J% i8 V4 k0 q! l% s$ `2 B
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 r8 {' U% o" A, R; w2 R' n( k. a#pragma DATA_ALIGN(upp_buffer_b, 8)7 Z) R! M" T& ?

. M- V3 j% ?/ ]) h5 Y) ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% W- v3 \* V5 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 a% x) C8 }0 A1 \, I

: H# c) i* h5 v4 S7 j2 r8 c% Y# k% R7 Y3 o3 @6 F
static bool server_upp_data_recv(Server *server)
& x: t, q1 {7 L$ F7 \3 W{
* c  e; P' M7 ~2 R' q( F( y  d    if(server->upp_channel_a_recv == false) {
& Z( i$ I6 h) N        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! z- m7 M6 b, F4 y) h
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
; P8 `2 m" G; n0 f            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( a, S% A# Q! d4 b/ z7 U

& h) X* o7 f& Z4 e8 s9 w2 `4 P4 q) Z+ v- `5 R3 w6 I( p
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 t# s- F8 i, w/ N/ S7 s5 x+ ]
" x- g1 X5 b+ H5 q& L- v- `1 g            server->upp_channel_a_recv = true;//. Q$ b" M* w0 h8 f- n: X
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
; n: U! Q# K. ~8 E0 u            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;* k8 |! P" V. [6 I
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
0 r$ I% l/ V# o. Y0 C0 c3 F" l            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; I& H9 }. ]& ~2 @0 m$ n! z3 a

6 `: ?0 S( A1 p0 p9 j% M& j            upp_error_count = 0;4 W! S1 U- I$ W2 z
            upp_dmai_int_cut = 0;
) S- C# E5 n* H9 q/ O0 Z& \2 V9 c$ E" o5 w- {
            // fill in data + X% `- ^% y3 Z$ ]$ q% q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);% M) {% N; k& x  s. T$ C+ M
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 H0 T/ \: Y- l, w2 a& ^& {8 {        }, N7 A6 _" [; }' s4 I3 w% I! {
    }
& `+ e* r+ L  {8 j1 H) q% E    else{
% O& L# @/ H, R1 Z$ F        if (upp_dmai_int_cut > 0){' j, }6 @: u! t) l9 j. q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 e0 a+ E, P% z  i3 y4 M7 i            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 p! ^# b) h7 F7 v, a7 q# Z' u
. L# H1 Y# {3 k  a3 p0 h
4 B: w$ Y& \  m5 \' }- e/ E# q            //copy data to upp_recv_list_busy* @- d( a' {" ^3 j
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 u3 ^  I! K6 {/ e/ |/ q" W& ]  M8 D
: D; K+ }$ s+ y            //# m  N7 S7 a: y& Q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  u5 S0 O0 t1 n

5 E7 Q8 n- O7 p! y            //
( n/ w0 v: T' `/ a+ w; Q            server->upp_channel_a_recv = false;//* b! j1 H5 `( D  e, a8 z
* ]! P( s6 F0 X) }  T; a
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 ]1 O* v  q4 ^# ?7 O        }
* _3 x. c9 i+ c  l7 E+ E. ^2 g3 F    }' ?: l; i$ d$ R. H7 D

  T2 y9 W# h; Y3 P. r
4 y8 u' ^) |2 p7 n1 E) ~% O1 @    return true;
5 g- d8 X' {3 f; Y2 a" L" }}0 P) i) |" a$ o

: ]8 {$ B: R4 d7 n+ V. I! E9 Rstatic bool server_upp_data_send(Server *server)
/ m8 a! M+ M; H" K0 p* Z! z6 d{( {2 w5 w9 P/ P# X2 K. c1 C  P* |
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ I( ]* Z& j) V# Y0 u) J$ Y, v+ a        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% E+ J7 c* f9 {        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ `0 L# R. d6 K1 a        char tmp[128] ={0};
6 j: @- b8 g# K; {9 l2 D( L, w: d) W# |: D8 Y8 n
        server_msg_send(server, APP_CMD_LOG, "upp send: start");0 n' A0 C% u8 `3 ~" Z
        print_log(server, data, 64);  E  \6 b0 d, v" T, R; O7 w% `
% R7 g" O0 b( |
        //
7 b8 _& j9 z0 e) j4 l. q        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; G8 m7 p: i8 H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% B% o' K% G4 K- b6 J        print_log(server, upp_buffer_b, 64);" W; L& }# @* y$ ]' B8 ~& Q
# j) f* G5 p- E
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);  J- w$ V0 {& p9 w( g
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& O! J/ U  y# E5 p        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 Z2 E0 f0 u, e8 V0 M5 z6 @        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* `' H( b/ x8 g  b

0 l6 Z* I& W: W) v/ w, \4 s% N        memset(tmp, 0, sizeof(tmp));/ M% L+ V5 r. R2 L) e8 H+ a
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 n2 |8 P, t- V( T0 h5 V) l! m) W  K8 M
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% S, y) p, @; W: C3 T
        server_msg_send(server, APP_CMD_LOG, tmp);
( v4 B7 f  M% j3 u8 j, K2 _5 [8 e3 T0 }# E. S' }
        upp_error_count = 0;
. J. b# z' @& I( |  |( ~- U' _        upp_dmaq_int_cut = 0;
0 k7 c/ K+ Z$ f/ b        // fill in data
6 ?7 H9 ]' V4 ~0 S* Z        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! H3 V% E: p( L* ^4 D+ V5 ?! z
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# g$ ?4 n5 F' c2 Z; j, K2 c% m" y6 c! u% V5 S" h8 ]7 r/ Z/ [/ S
        // wait send success5 i1 X5 L$ W( R% w+ o) x0 s# h" y
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* P5 E% X! F* s' j- o- x6 |& h9 t: ]6 _) d9 k
        // make data node in free list - F( l7 o* F' ]: b$ U: l
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _. ~! l0 S8 I1 F8 S6 i( b' U, t
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, t: T2 J* W( q2 q4 W    }
6 O* P8 N+ ^6 n    return true;2 x, y- r: M- `% R* t  ?! G5 f
}
9 R* K  r% Q" o7 e" c8 b4 r) V4 V; Q1 {

! |3 U% t0 r4 L) \8 B8 e+ B' A
5 W7 N; q$ [' D6 U+ z
- V9 X& G. K7 u6 S; \" g

; B/ a$ J& D7 d  S1 W" G6 K

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
3 z6 `3 }* v: `- a( P, P, s
. P1 X: t5 T# R% ]  v4 P! f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 13:32 , Processed in 0.040373 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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