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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - }. E: g# u: n" f, d4 q  n

. v) E# ~/ J  d2 F9 I, [% ~2 a3 a4 q问题描述:4 h0 j- C- L- e: n' _# i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- X5 _- R8 K" g- B* @

1 ?: q$ c/ K2 l1 h& y: }图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  T) _0 i& y/ \) m4 R# h' Y
6 _5 e' h+ K- J% j. J( V' f7 l
测试结果如下:' U" d! a: N& `$ U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 }! I+ h5 U  {) K/ r9 \( g3 |- G3 U$ `
. ]$ a4 d8 w3 K+ |; k' N% `8 a
2 i5 o; }9 M' M# ?, Q" I
备注:
6 y! o7 l( W7 t' B) N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; D- @1 h  ?$ @( b; u# U+ @9 L
2、相关代码如下:
' D9 @7 z+ H, W( x//UPP DMA缓冲大小512字节2 _  d8 r  `1 f- `! P8 r& x  [7 `
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' j: z2 M& H0 g: X# J0 h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" O' N; [# x: w7 K" h/ Y! m& Q8 ^; V
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ W' z7 G3 T4 l% A% J

0 H8 Y& K( V( O
" ^2 @$ y# N3 B# R  f7 ^; `) L//upp接收、发送buffer8 ]4 C7 v3 \( W6 s) n! p
#pragma DATA_ALIGN(upp_buffer_a, 8), Y9 @4 q/ k9 p
#pragma DATA_ALIGN(upp_buffer_b, 8)
; Y6 f2 `; d$ z: _% t' f  D- R& W6 n
% t  k# @  p/ Sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" X7 s# g! N- o. M, @" i) ~: q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
6 W. Q; r6 _) G& m( `0 C
5 _! Z! s! g  H, @# V$ ^# z$ ?  m$ u$ Y9 `2 a5 J
static bool server_upp_data_recv(Server *server) 7 v8 A" p* U! Z4 G4 G& p
{0 M: s5 z% `7 g' \5 R
    if(server->upp_channel_a_recv == false) {! n. E! |7 q- F$ Z
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* V1 m) c4 C/ J4 Q4 {0 [) q( x        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! A  c$ P4 v' N& D
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 c: t  b  \! R( v6 K
& P8 x( j- h; P- t5 A$ E
+ @' \$ W7 S% x+ T6 x' @7 N
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 S$ I. U$ w4 s. k) C
0 ~+ f3 B8 D( `7 j; `% T4 q            server->upp_channel_a_recv = true;//  J9 g2 f( Y# P* d
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
" P2 I# |6 y$ w. ~" {! I            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 c/ ~7 q4 ]* @9 ~            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# k. w1 y8 ]3 E" T            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' d, e, @" y: B, p  Y: C  c: \2 K: K
            upp_error_count = 0;1 c/ Q6 K, R) G. f' z8 |$ F5 F
            upp_dmai_int_cut = 0;
# N+ r. ^+ c7 h0 E. [6 J! f6 G
! f" T" P( e  l: R% W& n            // fill in data ! f/ p. f% X  A5 Y1 `4 e
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( ~+ s# i" r, F& z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* Y9 Q( J8 U6 @( M$ i: T  P) L8 W
        }( ]: `' H) Z3 b* m6 X
    }
. M0 |* G6 {: E    else{
/ `# _3 `& @! n) K        if (upp_dmai_int_cut > 0){
/ V( j* i8 t$ o6 R) E: G            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 x1 z9 N* L: a6 a$ b            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. l8 G  g1 b9 m- Z4 z

" N, y0 E/ D3 e8 d0 n, O: i3 j. ?/ a, p/ _( B  i
            //copy data to upp_recv_list_busy; O, ?1 R$ x$ {, W  [
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; k! I2 V5 ^8 K. x
& d4 A9 {' s' X0 `3 n) e            //
& R0 @! x6 {+ B3 M) ?            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 J* d) b7 X7 q" A) M& H6 u
# c* a* o8 k  c5 s9 x            //
! m! q& J8 Q' x. `  t, f  K            server->upp_channel_a_recv = false;//; b& s5 i6 R" \$ m$ V

( F/ u6 n# V- r2 r5 d8 z/ G            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: x+ m( X" \* O' q" \        }6 N7 Z5 [, ]& h5 k% @3 p+ D
    }% @2 u" K$ h" b# U9 @$ H

- |* S+ Q/ \: E, \9 u8 L4 ~4 \
% p7 b/ J6 P! D+ U# ?    return true;
' ~+ \" _2 t; T7 g! X( G& y}
9 |7 `$ u$ G' u. t. U" U/ S
8 D2 l) ^" D' T( H( L+ L6 rstatic bool server_upp_data_send(Server *server)9 Q- ^& M( e6 P1 A( X; M+ G8 s8 N
{+ k4 M- O1 Z7 U
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( w$ \. E6 ~/ u3 _        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ s$ c" z9 x. _0 |! u6 y8 C1 B
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 H# r6 S3 b3 P; l& s
        char tmp[128] ={0};, B6 [( W( y8 t0 E& o2 w
% c6 m  W! E) N4 |+ i3 ]
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# ?1 O. R7 R$ e, m8 Z        print_log(server, data, 64);
7 N5 }( q' u) o/ g0 E( X' q! N) o, t& R* ^1 E1 H$ k; T
        //, ~/ ?, X+ l# h* h; ]$ u0 [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! g9 K1 v$ b* D2 g+ D3 J- u- E        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" E( b  V% q2 \. Z1 {* d+ r( l! y
        print_log(server, upp_buffer_b, 64);
. Y; L6 Y% B+ ~  [5 |2 a6 I* W% ?$ Q, [
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; F4 Z3 u, g" o% j* \* X. s( k2 s
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ y0 @7 I. G; G& u2 b2 z: a5 ]
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 }* F. B7 y0 X( v  j3 `0 ?& C$ }2 ]
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 K% b; ~8 u4 }/ Y+ Y) f. V* e! T% ]+ U3 t( I
        memset(tmp, 0, sizeof(tmp));: P  K! b6 u5 U
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 u6 @& ]/ ~8 y            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" Z* |5 V8 X% }* {$ D
        server_msg_send(server, APP_CMD_LOG, tmp);
- F: z; [4 i4 n8 r  y9 S; Y5 [( {6 E4 H: U6 U: X
        upp_error_count = 0;
* w* }8 t$ }; W7 k        upp_dmaq_int_cut = 0;
8 K6 B4 c6 e* t! d, h5 L        // fill in data
0 L# _" H- H! `, f: R4 n# r  k. x        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; |' \8 u' v+ b' m$ i; I        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ {. s  i2 J% c1 n3 |8 Z0 U) D+ ?3 K

: E* O# o. ]7 ]; v        // wait send success
6 ?; O9 s$ |8 i% Y9 R        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 T4 `/ D& x4 @# u1 f% Q9 o
+ F  g8 N" f+ U% [$ I6 D        // make data node in free list , M8 W% q0 t8 s
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
! F/ I# L: q0 j% O        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& _# N! u7 B5 u1 ?: b; P    }
0 u: H* c* i1 p    return true;
8 z( m0 U; R4 B! |$ x, A- N/ ]}% M* t; a$ _6 \' e

% u" ]- c6 U9 ^- i6 p4 t
: H. F: @0 m2 q& s$ [

  [4 S, \4 w$ D9 n; L
' Q" L' W- e! W  a" N" y! k

8 @$ p) U0 Y9 b. P

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% n3 t) i. l2 m' ~
$ v1 Y* Q; e2 Q: v

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 02:53 , Processed in 0.041086 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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