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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 i) Q+ F* s+ p: K$ ^$ ?+ G0 v! v+ _# i' c+ G
问题描述:+ z/ ]1 j; x9 l# z0 \+ e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) O/ O' _" a6 P- @( E9 S& A* o* C7 {7 X- D" c) s9 G) |6 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% t( m4 Y4 \' t7 i4 f& ?  h
+ }' L: _' d* [" A# Q
测试结果如下:8 O# v& h; s+ O  p. [
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
8 Z0 e/ g$ A* r# _9 c0 |) P
# _6 L- n  y, i' @1 ?: ]2 h3 q' V1 M( ?2 |: O7 \
备注:
9 [+ x7 w6 D+ w* l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ z) ]0 n7 P5 L
2、相关代码如下:! u: T7 x0 M: S) K  q7 c2 N) {
//UPP DMA缓冲大小512字节
9 z( h/ E; r1 X#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 o: g8 H& y- w  A# |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 Q5 n, i3 i6 ^1 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% j* P! K" @5 u. C/ L' O& ?) c8 B) m$ _( F

- Y+ V% p) B, X' z  k//upp接收、发送buffer' F2 A7 L1 W3 k  H0 x
#pragma DATA_ALIGN(upp_buffer_a, 8)" X1 u# [/ c  d) s; O+ B* x
#pragma DATA_ALIGN(upp_buffer_b, 8)5 y+ J. ]) ^# ]. F

& G; b; t# x) u4 s6 _unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' J$ z: U" j( P" S& v6 ?$ D, l& a0 @  }
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# m2 o4 g3 }" P* m5 H
7 h( x5 k$ l0 E4 T* d3 B& a" Z! k- l/ @' V" l8 ^3 U) \
static bool server_upp_data_recv(Server *server) ( w6 u8 J& r3 x5 Y
{
2 R% M2 s, B, k    if(server->upp_channel_a_recv == false) {
; [& q; {; K8 f        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  G& h9 q" n+ h: K! z4 g' v' P
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 Q! L; Q2 f' i7 R# P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ Z4 O# O) S# Y5 M: p+ j, d- D: Y) C( g  p0 x

+ t+ M3 I2 Q% f( d: ]            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# F2 E5 g3 a. d

% G  i+ K, V1 B- o! [* z, k            server->upp_channel_a_recv = true;//: a2 F) t1 h$ v9 X9 f# \
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
6 i* i0 y8 j6 O            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 X7 f' J$ T; T( v; |/ p& o  F$ u4 m
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;+ w8 f4 a. o; y7 [
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. K9 B' j) {7 K& Z. v* _0 P4 j! ^! p( s. D
            upp_error_count = 0;; X- J; J, T6 S6 {7 D; Z
            upp_dmai_int_cut = 0;# O' R( |5 c+ ]1 u
# l: d" ^$ e7 P% U* x
            // fill in data
% M& n6 M8 }2 T3 b( G            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  `1 Z  N0 F. H6 i# H            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- R/ T/ c8 @5 K) W4 O8 Y
        }- ?0 L* d9 @0 W/ _) d) d, ?
    }2 e  {" ~2 ]- E8 y2 ~" e
    else{
" J- K: R# X! O% f        if (upp_dmai_int_cut > 0){
+ S' M2 g( d$ t( F3 Q( E" }            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' A+ e+ D$ G7 k# S( D+ J, M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 x& `8 T" b2 D6 A% [1 c& C" r
9 ]* U! H: m- ^2 q( g9 Y

; ~, ^7 M0 W& i( L* v& u            //copy data to upp_recv_list_busy' u+ O9 g3 S5 P5 W! g1 h, p
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% V6 m- b9 [( `: ?6 V' C; ~3 `) O0 s5 w& D
            //5 g1 C' c6 w: `( I' _9 Y
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' F4 x; I3 j$ i* _/ B/ p. ~0 G
6 h! F  {/ b* {
            //
% T& \2 b4 p  N0 t* {/ h  i7 Y            server->upp_channel_a_recv = false;//
# L2 H: B4 z0 S7 z/ B0 Z
0 u: Z6 F* n& D2 z! a+ o) Q, e  f            server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ i; Y' X3 U0 N: ]  B
        }7 R( D: p5 J+ ?0 U% X# G3 D
    }
: M, Z' h# y! K* G: m2 V
) t* e4 i; b) B( w" n( D
1 T/ _/ O) ~  S    return true;
. r. G: Q4 g; d! B0 K3 M& c# O3 @}0 h) V' _2 s- g2 ~

! m6 [/ ^9 N# Mstatic bool server_upp_data_send(Server *server)
8 Q- e6 i. V4 t5 Z& E7 Y" e{7 }9 |- U: l5 d' r) q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) W2 Y6 [4 T+ O( N% U# i+ X# P- P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" |1 n/ U; k( X        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: J2 V* |" o& @1 w        char tmp[128] ={0};
* p' z7 p$ D3 J! C" j' L
" W/ L6 R( \* V+ i( \, _& m  w" l        server_msg_send(server, APP_CMD_LOG, "upp send: start");" @: @# k4 G7 A; K% l' W
        print_log(server, data, 64);
# ?7 k$ S, \( w  d" b& D: q% G$ Q2 _( U! d2 h
        //
* Y+ O! E' a0 s/ l* J9 f  X6 g        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 P' e8 F( o; S, V* F# y' F4 q* C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% c* a  J2 \1 \7 M
        print_log(server, upp_buffer_b, 64);
( S/ w/ `% D, S9 m! h
! F& U& j; h- [) x+ Q  r  ~        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ c, s3 Q* M  f% S* m3 R9 O
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 6 j6 q* F8 }: m+ F- V; L
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;0 b: P' T8 n/ f& n- r$ w% L
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) k- m" r$ i) `2 s- ~+ b
  M/ D; Q1 u4 Y) c
        memset(tmp, 0, sizeof(tmp));6 Q7 y% D% `# y
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 i5 l8 A2 \  x            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- k7 X0 I4 b% g+ v% I2 W        server_msg_send(server, APP_CMD_LOG, tmp);/ [: h; \# J! @7 O- I

( V0 _& [! ]' h. g( i2 {/ l6 x$ w        upp_error_count = 0;
- U- r  G5 R4 M; c- r6 U        upp_dmaq_int_cut = 0;0 T% _) E2 l* A  |6 P
        // fill in data
) o0 N/ Q( j" [- p- h        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 M: G$ S! e* W1 c0 T
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 f0 H8 p5 R' ?/ q

/ w( S0 j, X8 @& Y( }        // wait send success
" b( i+ T. H! m- m  b        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . k& I) z. z* Z9 ]9 ^

8 g+ [: t$ \7 E. k6 D2 \        // make data node in free list 0 K, l- A: ]7 F1 c' c
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' {5 q4 p. }+ M. m  W        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 v9 b0 ^5 s& k. N8 f; d) o- @& S2 T    }
7 A4 w  j- j$ s    return true;4 Y/ W: f+ F1 t$ I
}
0 M( c; S( {# m. n4 W
; W8 U, u( d2 w; y
. b' L/ F' E- M) p
) h! U0 v8 Y- H) u

0 l, i( |4 N& \5 M+ v1 V9 _' I5 C" v( @9 y6 |8 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 w! @* ]* d& R6 F
, b- w! N; i1 H/ ?; Y2 E- j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 12:33 , Processed in 0.040600 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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