138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 S& y% e6 [+ Z2 m. i) [  E7 T: Q' l
问题描述:. a7 ^4 @0 F% x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  h5 H" O$ K3 p" X6 l
3 G# s2 X8 d7 _- _3 u2 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 e! n# l% [  f. }# G' ^4 N$ z- ]- B. u1 D
测试结果如下:# q# q2 K: \- t
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 T& O) X% a" p1 k+ v  z* n
/ K+ ^7 `/ W" S$ Y9 I+ v& G
8 U) s3 i3 M  @% Y. B
备注:% M& a! _$ H. z" B, d  k3 b8 ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ M9 t0 \) s. \; N5 Y$ x
2、相关代码如下:0 e; q" t0 P  z: ~" O
//UPP DMA缓冲大小512字节+ U1 E; K' o5 w7 v0 u8 x8 c8 f: B
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. {4 O( H/ K0 |' Z5 p' b3 j#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 O4 b! a9 @8 s$ H$ M+ y* D2 o#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 L4 b4 \1 g! G7 k& J6 M
# f1 W- m% {- f% V
% u% v' d$ }$ D& K; E: i" U- e
//upp接收、发送buffer
3 U1 S) \( E6 q$ H1 o( _#pragma DATA_ALIGN(upp_buffer_a, 8)0 U4 j- W( Q+ |5 t) S/ o
#pragma DATA_ALIGN(upp_buffer_b, 8)" ]& |+ W8 ^- r- [* ~  v: _. |
+ {/ ^5 U, G7 ?! B' g% y3 Z; x/ ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: K. v+ A2 [9 F  d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 v3 M1 {  a$ a8 @7 f3 F
3 [- [- r2 Q) w2 Y* @. a, F7 ^2 t! M* i, j- [. N
static bool server_upp_data_recv(Server *server) 5 ~8 F; E4 c7 f1 O# q" M
{8 t: e6 k; e9 X
    if(server->upp_channel_a_recv == false) {
6 ~- Y" b; {2 o        server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ J/ C! W9 Y1 l( f3 Z# q
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. P& p0 K, \0 G5 ]" g. ~" U8 K. [            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- ^- t0 q/ |( x7 d; \
2 t) Z# S8 d3 z4 w6 H% E3 [) G) m% c5 s. X) q- Y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ C8 E: R: _% E* G* k, \2 e6 u) y4 X
6 j6 }+ N5 P! \" Z! L3 S$ h* C
            server->upp_channel_a_recv = true;//
- c+ m* Y( G9 t            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, I6 [/ v: c3 B1 i
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: D0 p9 E# h) H$ o
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
8 r; D2 m2 w, w2 Y. }6 Y7 b            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 S+ \  @+ O) H/ f  r4 b
' ~4 v5 z* E6 O* J( [7 s
            upp_error_count = 0;
, k' d: N9 ]& H: i            upp_dmai_int_cut = 0;# f) _4 @& Y% v

1 e  k: d; q) O) G6 s3 m            // fill in data
& l8 \" p! S% ?9 w- g+ h            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);$ v/ y4 W  T' ^7 W3 i) L
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");% ?- c* D7 n" |' s( j
        }+ g0 p+ a' A8 \2 h1 S# w# [8 r2 {$ h
    }
, E8 a6 J3 s: y' t% x, E    else{; ~  d3 Q  k$ x$ `* y
        if (upp_dmai_int_cut > 0){6 _4 w; [/ b5 \7 E. Z" k" a+ u5 R
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- [' y. w; Z! m* X3 h" g) O            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 Q, W% f1 D7 s7 ^* ?

2 G- I0 R7 L1 @* V5 z9 D! j& d7 U! M1 v
            //copy data to upp_recv_list_busy
, k. H. v7 a0 m& _  K7 S            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 d; k; O7 F0 K- {+ z& m4 a; H' Y* e
; W9 X& v* L& C; h/ w
            //
$ S* l; {' g, O" i. x8 j            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 O& ]2 g4 `$ d4 y, v

6 c9 }6 [# Z8 o; c( l, R8 R            //( ?1 w7 X1 h% A, ~3 j6 m
            server->upp_channel_a_recv = false;//
1 U* [& G/ E/ ?- y
$ p$ C) X% g. i1 a. z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' x2 U9 w, c$ p  l& C        }% ]2 G# o! r; J2 `- |8 K
    }
3 I) v! f2 }' k4 D( J. F  M% z- U" h8 E* P+ M: D- U% C3 {

% I/ v, N0 o- T; G( a    return true;
  t$ g  v" Y4 m" Q2 {0 a}6 I4 g! ?% F( s+ y6 p* |" r
( J4 d2 G; C! W1 _6 q+ }
static bool server_upp_data_send(Server *server)
, B% E' k7 P6 ^; j' ^{
) b) ^; U; k; J7 e: u$ d8 |    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 A: N9 Q% O' |        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ v, U' k" J( d0 |
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 m+ ^, C2 c# U1 `/ n' @        char tmp[128] ={0};
  L/ u( D1 ]( y$ r! w7 {8 W  d" v) s; ?. ~% j
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# t  @2 A0 w. Z8 f        print_log(server, data, 64);- \8 {2 I0 c/ v8 t4 V& ]
( n) `, h9 [% O4 t
        //. k1 Z7 H4 |  w) G" n5 J6 y( @3 F- g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, {0 _5 q1 n) g4 i6 h
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) O7 a( b" M$ a. |! d  P0 Z        print_log(server, upp_buffer_b, 64);
1 U/ l5 p) x, r6 U( P* M, F
# m& u5 M- H9 `% y        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);* x: W" S% {( J- G
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' z9 r$ K! Z* x5 Z$ A
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
% }0 V/ e& f" c+ b' d$ ?7 D        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  c/ u3 o( `4 C- L0 a
; F3 M( w8 z6 B" c% }- a        memset(tmp, 0, sizeof(tmp));
5 l$ G  S2 O+ M+ z/ C# n; B5 B        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& h- Q6 [" @; _0 j. J: W6 u            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' Z" K- m3 S1 v, n        server_msg_send(server, APP_CMD_LOG, tmp);1 c( c5 w2 P6 b
0 D- G; h0 k( g$ s* H
        upp_error_count = 0;
) n$ }! M: H3 q; ~  T" g4 _) |        upp_dmaq_int_cut = 0;8 p4 l9 n' o2 _% q! n1 e0 r$ F
        // fill in data : D4 F: n4 x9 k7 g; P# R$ A
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 C1 t: e' s5 x1 [8 I  z; n0 k1 v) h        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ l% Y+ ?( L; f' p1 \, W; d, R
0 F* G# X0 r) u+ z$ f( z        // wait send success
: P, w% n7 q* B5 ~        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 k0 D  M: T) ]( `. X" c; `4 o4 @$ q! @
        // make data node in free list
: H4 `. Y5 V/ N1 J' a        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; B7 c! i0 C4 O0 z0 K' T% ^3 ~5 [2 r0 J# j
        server_msg_send(server, APP_CMD_LOG, "upp send: success");% F) D% W( H* _! Y
    }
5 ~9 x" _! \6 z% v4 ?# n" Q1 Q    return true;4 N+ ^; A6 Z" U' H2 t5 h6 _& [3 [
}5 q" V2 M% q' {# _! I
/ t. L2 y5 z2 N7 ^" `( |0 W( w# o

" W  C& w- k4 }- m
- h5 x3 _5 ^2 S! a! F% V

% w& i# x; @; v1 P9 F5 j5 ^8 G9 |4 J9 P# T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
3 L: s: [! i+ k1 m2 r( l
! ?4 a$ |% G& q) z1 y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-4-6 08:33 , Processed in 0.041534 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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