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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' \! I) z7 |( c/ ^  W: v* P4 f3 m! t; E9 q) R
问题描述:  |+ `1 o# a' b+ M4 ]% V" A
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 o8 F5 n. ~) o/ y7 f% N! {
( l% W6 {1 N9 Q4 ^$ V' t% ~
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 |4 H* s7 X/ N1 I: F' W% U# p
+ A4 I9 y( p1 ?" ]  U  \3 E: W2 }$ _
测试结果如下:5 g& o+ Q, q" Y/ ^* A
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& D! ]" `8 l" q9 ^% |" `+ y; {1 ]. Y1 v; U* m

4 G1 F( {8 `& ?备注:
% u6 }7 |6 A; f+ B8 c# l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 l' m: x" F: R) R4 _; b+ D6 @
2、相关代码如下:
+ b/ R+ i2 R2 ^* w" p: {- c//UPP DMA缓冲大小512字节
; x( p$ v0 A9 m+ F; a. }#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: q& r$ j) Z  ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 O+ n" P) j' g8 I  u
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 c+ T/ f8 u: V& l% L

# e1 {* ~7 C* f' j+ H1 P
  M7 B$ a  J' |3 t0 r//upp接收、发送buffer. y6 N" |( g* ^9 C- {
#pragma DATA_ALIGN(upp_buffer_a, 8)
* z4 t: G4 Q9 d. l. K#pragma DATA_ALIGN(upp_buffer_b, 8)
* R$ p# M% q' _& y" P5 U  d* @( j3 x7 u5 s$ _; j1 C
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 ?% L0 e8 R9 q; v& u- @" C, ^
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  m' T+ C+ N! @- j

1 c5 E+ \& o: `4 C* h% r3 d$ K+ M; _+ X& h2 Y: p
static bool server_upp_data_recv(Server *server)
0 D3 V5 w4 S# l, Z1 y4 S{# @6 G3 w" H( _- k# L% B
    if(server->upp_channel_a_recv == false) {7 S8 Y8 R" _" ]7 z
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) F7 s5 ^+ D* {, Z) \6 I9 R9 Q
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& Y) j2 ~. m) C. x3 E* C6 ?3 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
* N( H9 g( M  |' V6 H! ^; q7 Y3 {4 {) G$ l
6 z! D$ X% k3 w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ K3 k; P4 e$ w7 `2 `8 k5 N' X
/ G9 v) J! p3 P' E            server->upp_channel_a_recv = true;//6 |' u0 q  {6 x8 G4 y- y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
* k2 i& m* g# E6 X) j9 \6 q$ E            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 y) y9 B, j" P4 c& ]2 P
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. E3 _& H& ~$ c* g, x: B            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, Q4 S1 i# U4 X2 ?2 F( Y' n" H

9 w# q+ c. O3 s' I0 {1 D5 A            upp_error_count = 0;
8 C' d& a( V- K; R* U' V            upp_dmai_int_cut = 0;1 c! c+ J: a8 Y; o
  s3 `4 S" ?$ g9 T5 j
            // fill in data # N$ U% K/ w' ^
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: O# N; k* v% }! Q/ I$ J+ p
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- t: q6 o6 J6 D! J+ j1 \        }6 G% B( T+ \3 l5 u
    }* ^1 P( P* f! P$ D9 d1 U
    else{
) C& P2 c0 o7 Y2 g        if (upp_dmai_int_cut > 0){& N% r$ A0 t3 G; V  t; o' |! @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 }7 |+ r0 z+ U  ?6 D! o            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, i, \  w# l6 g/ j  b  u, A5 b. `" t+ E9 [/ r3 a
7 d+ w3 I9 u4 w' U
            //copy data to upp_recv_list_busy; g% M+ u' K0 L
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: d) |, O+ Y% b! h& j6 K/ g! G7 |: S+ r! s  `
            //- M+ b+ N* s2 w* ~: p! h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! B& `- }( e3 h  }$ ]
) Y, A" H% t( A2 x# c0 `5 q& j
            //( l0 A8 Q8 I: C" }
            server->upp_channel_a_recv = false;//  }! g$ ?3 T" O3 s& P

! d% H# h3 S$ p" ~$ n- {3 R            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; H; F" ?/ x7 {: u
        }
. x5 G+ e$ r. D" V+ D4 k! S    }
% c4 X& F) `  z- w3 _  t& g( a3 M
' c% H$ ?2 T7 k5 @8 x, g8 A% o7 h( l3 T, L3 x8 P
    return true;+ e# y/ S3 D7 N7 n+ n
}$ u8 [6 h3 n/ y" A: m
2 {% {- S) U6 H7 g
static bool server_upp_data_send(Server *server)! h+ l% u# U" o& w
{  U3 i! n) U, a
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 o! |, V& [" }, N" ^5 X        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- @' w6 S* o# s$ l: w
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
  t. [  \# }  v  ~        char tmp[128] ={0};
$ m  z7 j/ e# w' g
2 h* M) W2 c  S        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. `" O$ ^7 j- Y3 H        print_log(server, data, 64);/ L' ?; b4 F. w7 b5 E
7 L& [1 c7 r( N  F( \
        //
8 b9 `. w  K; ^5 l+ h  w        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ D4 L& E( |, E- Z. o" k
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 G8 u8 g% I% J! y4 L        print_log(server, upp_buffer_b, 64);- R5 Y) P) m. W+ h) h+ }: [: F. k

5 i9 ~! @% p$ g2 n% y! U6 g8 g, O        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ W* p  N4 l0 p  A8 q* u
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
' j, P5 m% ~5 [) {1 B7 V& ^; u        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 z$ d, _4 V) O0 V1 F- K
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 T/ O0 x1 J0 H5 W0 o

+ n" l, o2 U9 w. T        memset(tmp, 0, sizeof(tmp));
' C4 U; V9 m3 |! T9 B. a        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 d- g& ~; O) i( u1 ?+ F            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 w* h: y5 K- W$ k) p9 C        server_msg_send(server, APP_CMD_LOG, tmp);
$ V  t# z" I8 D2 ~: }- I) m5 L- b5 c3 A' I% Y2 |1 ]* Y+ `
        upp_error_count = 0;7 {$ M8 _7 L$ p: x6 D
        upp_dmaq_int_cut = 0;$ s' [# p* Q/ m* [* A! T
        // fill in data " ]7 c2 o/ _7 {3 a3 b/ u% n. y
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 W( z; l" o- A% H        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ d! }2 J3 F- x! ]# h

+ A, a) r' }/ u& r        // wait send success4 _( U% M7 P5 G
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* ?' ~4 q( G  E8 S* X9 j) l8 g) g( E5 O
        // make data node in free list + l! j' A) {0 X! b
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# Z1 G- {3 i/ f4 O
        server_msg_send(server, APP_CMD_LOG, "upp send: success");' F, I. b/ ?$ z- J, D! [# v
    }
3 I. N# U, s) j8 e, V    return true;2 F( J' O& k3 [1 v) c
}
3 \: l/ i3 [+ @. J9 O' j7 q3 F& P# x( x4 B
0 M+ Z, i9 H7 _! c. a" `- U

" L( k+ A; d% B2 q" C9 Z3 _$ F+ k
! z: U' \; W" n) V  `5 Q$ c$ W
& a+ i, O- P. c

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% i3 U" B5 e2 W. N: E3 g9 N7 q; X

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-25 20:48 , Processed in 0.042045 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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