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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 {1 _- l# m$ H: c$ U- |) J
' u0 J( C3 G$ x# v+ S2 T
问题描述:
8 K2 U" G. M" D: g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; E. {; ~, P: N6 N3 ?( ~9 `. b8 v. P# T$ |
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 m' u  K4 F- `# a2 X0 D5 X0 i. z0 n+ Y3 c
测试结果如下:) J( d7 O3 `0 ^9 r( @5 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 ]  c2 e( I7 L. Q$ ?5 ~
, t  D6 A. }* n* z

* _4 d: B7 y' E, w备注:! Y6 D8 y( a$ Z! ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& t: y; f# X% F5 }0 u8 u7 K
2、相关代码如下:
8 N+ j7 Q  x1 v1 O4 u$ Y9 x//UPP DMA缓冲大小512字节& j& r2 n: V2 H! b9 K# G) M/ U
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ Z8 n$ B4 I. z: j* ^; g" I; W- s- h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 o' \' P6 g. R$ E& r+ V$ X: ^8 U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 j! q5 C- y8 c  O" f+ G  o7 r' ]: U2 J' l& F
3 Y4 J4 D# D8 ]
//upp接收、发送buffer
& J4 [: d& g' a/ l2 D#pragma DATA_ALIGN(upp_buffer_a, 8)
6 h3 y. C( K/ W7 u+ t, F7 ]1 x#pragma DATA_ALIGN(upp_buffer_b, 8)
3 {" c) D( }( L9 u/ a( A- w1 A8 n& V
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% k' J, a3 E+ E5 c* p0 [8 }: bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, K( `; H9 Z6 C# _8 `  O0 q2 E( Y/ e6 M7 h* y/ d2 Z) n
( B% v* [3 I+ [+ @8 N0 b6 L) s) o
static bool server_upp_data_recv(Server *server) / H# [1 \3 \3 P  }$ i
{6 D& ~/ h/ d8 o+ W- n
    if(server->upp_channel_a_recv == false) {
+ d5 }2 i2 V  q( }  J        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) {) Z" n5 U- W5 [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& L: u0 ?) e3 H" x) Y" j            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 {, \" u5 @; A$ G3 Z
  S' f) v  A# m- N0 ^, w. t( [$ O
6 L5 c4 V5 \0 J- p1 x            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% p9 g7 o7 z: U5 {, O, Z) C8 i$ S# [0 `: y& a4 @
            server->upp_channel_a_recv = true;//3 B* J: S# a: D( M# }( Q* a- g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);' w, v9 B- l6 g& T) ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) U& `- D, o( b
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;1 G( e, I9 z! s
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 Q4 \7 f. y# C2 s; v
* r7 l6 w$ x4 M* {) y5 _, S, g
            upp_error_count = 0;, p& u/ S+ k$ K% a) d8 W2 J
            upp_dmai_int_cut = 0;- I/ x8 B5 W- p1 l2 g$ C& q
8 |9 p! R( Y4 y' O1 Q3 f
            // fill in data - I. w8 ?, _, z  u, R- S# I
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- v: S& p) i8 Y( U3 G            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# u+ A+ u$ b7 `! y9 i        }2 t5 x/ ?" c: X8 }% E5 {0 N
    }
8 e9 v8 K8 B( V    else{# n. F1 c* M2 e5 v
        if (upp_dmai_int_cut > 0){, P) U* v7 x% o9 p" n/ ^
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ |0 _+ J" z1 _6 s9 E- l
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ t. z0 b6 Z8 C
; f" W1 `) B! K/ o& }
; [# m. Q" w8 y  }) U; w            //copy data to upp_recv_list_busy
9 m6 q$ e* V1 _/ ?& Q7 t            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 H( m  W3 I- ~7 j+ Z* ]

$ [, b. p9 D) r5 F, ~            //7 u3 y+ U5 L8 f5 h& K
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ I; D% p& ~9 c- y3 }5 g; S( M/ E% H' v! o3 ^& b4 R
            //7 \/ Y" z% s5 s! o, ~1 h3 f" E
            server->upp_channel_a_recv = false;//
1 y+ F; C) b$ W* o/ c# O' |, Z, a0 m+ Z1 B- z
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! }0 ~2 U' k! w: h& f+ _        }4 t) T; {. k5 `3 s" o& |8 ^
    }
3 z$ M8 k+ Y; ]# j+ f0 {' y' D% P* C: a: v- t% J

  Z3 y3 t. L/ Z* T4 E0 t    return true;
# [# ~) B$ U* y! e}
" ?2 l. @  h5 h) o! e6 H. u
( w* t" ~4 c3 z4 i6 M0 bstatic bool server_upp_data_send(Server *server)
' E9 Y6 K+ A" d' _+ Y5 d. X1 x{9 H* y. v* X) R" B& I: P: x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 l' S9 Z0 w6 L- \
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' v1 g% \' U# Z. B$ a3 }        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ i' z  n! Q$ g& o- Z
        char tmp[128] ={0};
- F6 \0 \) e0 x8 U9 I0 l/ p& E5 x2 \" h8 n6 q' Z. j7 H
        server_msg_send(server, APP_CMD_LOG, "upp send: start");1 ]' ~! s; T! J  f# j& U: s
        print_log(server, data, 64);
: X! z$ H. K1 y+ B# m5 H, ^+ _  j+ ~/ F! ?9 s) |0 w2 N5 D6 K: ?" _
        //3 b" M2 S, D$ W/ w9 ?/ f# |4 b5 F
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 r# k" n7 P2 J& y0 p
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 e; S7 p# E) {: S        print_log(server, upp_buffer_b, 64);
  \, b, N, r' N5 B  B; E
. w' a% v& |, j        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! H4 x2 w; C; |        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; + g1 @) Q0 q1 o8 o& F, O
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- Y/ E7 W$ s: ^
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- O7 [$ n% f( O2 E
% H' n6 t; Z8 b        memset(tmp, 0, sizeof(tmp));
7 I7 @" J! _; W* ~0 Q( B        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" e2 s% S; ]; }0 P4 O' C4 x            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; ]* B# \# M2 N3 U
        server_msg_send(server, APP_CMD_LOG, tmp);9 ?, d0 R& l( ^6 P7 W

# l6 G  M0 J% X2 D0 Z: X        upp_error_count = 0;  s: D  g4 H& Y' i: T4 t
        upp_dmaq_int_cut = 0;
% v3 z/ Q. k2 m# y" b        // fill in data
: A. ^3 A4 }7 F, m+ V4 U        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ d8 y3 \$ I$ ?. v* W% W
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' f4 [& k  r  O! x' g

" x- Q8 y* w# r$ n( a- M  h( G* y        // wait send success0 M( |7 F3 G# B" J+ U0 w
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 _' L- m; G$ C9 z
# b/ w1 k9 x" z. _
        // make data node in free list
0 T% W- i2 b, o        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 v- B; R5 y3 ?3 E5 ^
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ X- L7 r- M$ L+ b& R7 M  z! z
    }
" F4 ^7 L  T- v! N% v  n. H6 L    return true;
; ?0 O( _; b/ i, d( \; F}3 a3 a2 Z2 M, o: B- M
% `% }: I  r* o/ o
4 M% N6 D9 W2 Q+ n1 {: L6 C
1 l( G& `9 r5 X* P
8 G  [7 ], `6 `$ B2 T, a2 V
) K* q! M* V5 w% E7 Y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐, }5 N" q5 [, ]( V: p* E
9 X9 U( K* B& g. r; p

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 21:51 , Processed in 0.041933 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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