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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ {! q7 A& e" i# p
- S. i% n2 l. Z9 O" \( X问题描述:
. a4 m  a1 l2 ]在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 g  b! |6 W2 x2 B& C" a& |* b
; z( v8 ~8 l6 q, n+ j
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" `* ^2 o8 v; G" V6 }$ V2 d! F( m" z2 H7 v
测试结果如下:
7 Q2 l! w- T) I1 v# g7 E" L* `138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) P- C0 S& \0 h3 Q! l8 |5 I2 b. y6 d) h9 E. k1 q

4 B  x4 h) V6 e$ C备注:
% t! U( x# z. D0 O3 E+ Q, P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 r6 ^0 n3 w. }5 K
2、相关代码如下:
7 G# v! u5 Y3 ^; b1 x& O//UPP DMA缓冲大小512字节
# Z$ z% j% B" s/ E' b$ l' e4 y#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! D; Y8 v( Y$ M* ^* g) ^% T( N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 _0 \( X/ W, s3 c: y4 O#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 Z; ?+ a% b4 h# d

& i( W. s; V' V0 R# T& w/ j0 d
3 i# p" f: o6 f6 q4 l  }4 ^2 z//upp接收、发送buffer7 z* o4 H" e  ~5 N) u+ y2 D# L! ]  k" A
#pragma DATA_ALIGN(upp_buffer_a, 8)
" \( M* ?6 C& [: `3 l9 t" B# h#pragma DATA_ALIGN(upp_buffer_b, 8)
2 M# }2 h" e* G2 B7 j) I( e5 w* m# t2 {* M  j) m# v6 X- {
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 z: [4 \8 K. n2 B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];' j. B' j, }. m" v2 R+ k& K

1 i9 X3 w* V/ D# V8 c. z  u
6 F/ M  I$ i3 M4 s8 Vstatic bool server_upp_data_recv(Server *server) & G' ^& E. M0 i( _0 D# f1 j
{1 {+ U+ C6 }7 R' k
    if(server->upp_channel_a_recv == false) {
. b0 v) j) P7 E/ ?" Y; _        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; U; f+ d3 D  b( ^& O8 }. \        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, A( X1 Z( |( U            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 P% w5 E- V6 ^( Y9 E) x. \  Z1 C8 _8 H; Q* I
9 N6 S4 t, a3 r9 Y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( a) L9 v6 U) g: A$ R& v: q
1 i* }8 z% Y) p0 F) g
            server->upp_channel_a_recv = true;//
. Q* g# B( f. C* D) z* T/ @9 c            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);- \( K! V' a3 [9 A
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) r! [4 e3 _1 @, F( f* {* E
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;( Z" T" ~9 q6 `& c
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ ?/ E) r5 n2 U" Q  O( f9 a; [% r" Y6 O( s  Q+ H
            upp_error_count = 0;- Y4 {2 \3 j+ `2 X  c
            upp_dmai_int_cut = 0;
. M7 N8 ?) b! t
1 q, r  c/ i  q( }9 `. d/ @2 Q            // fill in data ; m9 t1 e& A8 [
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ G( P& V( w& i2 Z; m            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 J3 W  v* w; s: j        }3 ?9 W7 u4 a3 N
    }
7 A% e' H+ D0 f( T    else{
+ g% i3 K( [2 K        if (upp_dmai_int_cut > 0){( D+ A' e2 D4 ?
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. v, ~: z6 o7 g2 M0 e            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 r$ b4 S  @# S1 C9 w! V' Y$ R% g
/ E; R$ w+ w2 C; q2 H. [! M
: D; a" o+ V5 Z4 d            //copy data to upp_recv_list_busy- ]5 b  G+ j* r) I2 h& d; t
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* B6 U0 d0 Y* X( E( w# b2 Q" o( c' V# n$ M) Z8 L- Y
            //
3 F# F, t3 A, ?+ T! B            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 H7 b2 `* `4 b0 l8 P- B  N3 d
. x0 b: p3 S2 ]1 g* D' b$ j; B
            //
/ M6 W4 Z# n  a7 Y5 Z            server->upp_channel_a_recv = false;//
6 E8 [  l' J: p9 L- J) L* j5 ^) g
4 [1 J8 w( W( n2 A! H$ g: _            server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 y6 k! o$ n+ o8 W4 n
        }& T+ |1 S2 |3 o; V4 h
    }
- [& c8 D% j' k) [/ }$ Y5 s, v. d* t/ h% N
; E' n4 v$ p; j& B
    return true;; N8 w; }' g+ ~
}
# j& k* m" P5 J, ~* B& t, s- Q/ J1 b3 z' _0 }/ i6 F: {9 I
static bool server_upp_data_send(Server *server), P' e8 G7 V4 X' b4 o3 S
{
" S1 u8 j& L; Z# S7 A; @6 n) W3 V    if(ListMP_empty(server->upp_send_list_busy) == FALSE){/ J5 v! h9 w0 B8 V
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( J3 x/ n% L+ }$ a# c' [
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. P& i  D' F' c3 H" o/ ~1 l
        char tmp[128] ={0};
  r% F$ [) b& Q* ]4 f& H, n
' u+ v& J0 V0 z& v8 d% n% }) l; F        server_msg_send(server, APP_CMD_LOG, "upp send: start");2 l0 X' n; Q3 p: o
        print_log(server, data, 64);
! B0 q1 h1 r( ^8 E6 n
( l- U, X' O( H: J% I/ E' J        //1 j- N! g0 ?9 h7 L3 w% l7 Q6 b
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' Q) t# t) T& F" v0 ]1 {4 c) c& O0 P        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 V1 p2 u% w+ p, \. X! p) }
        print_log(server, upp_buffer_b, 64);( t3 J/ G! R0 M
4 t" O( l  |; Q" ]5 ]6 b
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
$ d; p1 r6 g: h: }        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
. v0 D% q; ^8 U* H8 L! X        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
, }' X( u* Y9 `9 S8 f" W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- a) W! y! D" o  g, F8 g2 O- d  J7 }5 ~8 l3 p0 @+ i
        memset(tmp, 0, sizeof(tmp));
$ H# R) D) F! H: o& K        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 R* k, u" `7 u& ^4 ]; W            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- L/ @, f5 p$ c( x        server_msg_send(server, APP_CMD_LOG, tmp);9 V9 g1 S3 B/ F* e; M
. o1 I+ b: ^/ B! Z& a" O* C
        upp_error_count = 0;
1 ?, y# h* p: U& z+ h! C) S        upp_dmaq_int_cut = 0;, |  \/ Q7 S1 P% n5 |' L
        // fill in data   e- u* V( l1 L6 Y1 p
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! {) o! s. H+ ^! F        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  d" }" p' q1 P* M. H8 {( n% t) e6 F7 g. C+ n$ W0 O
        // wait send success( c: @2 y, k! G2 M- u7 ?
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 E, f+ k4 s( {; `3 F4 M6 g. R+ C2 z2 K

+ G1 d/ X4 k( x* c9 V: l        // make data node in free list
- p/ i9 a# L" U& ^$ Z! {" H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. K: E  u0 j: ?: l/ Z$ p+ N0 U        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 [: v) p# Q! \0 Y; {    }
' g# ~. Q3 l* z! E& ]    return true;9 O1 r' v# Y- f# `) ^
}
4 E+ e& d" R! Y$ s: s
5 l' D8 m) A1 t% Y; T% g, F! B2 {
! v' n& |1 a: T

0 L8 Y  F+ u! t7 ~4 R
8 [; _( n( I6 W0 [
4 D7 o( x' f% f: i7 d2 A

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐6 H3 O  W& J: \# s9 g

9 J. D. D6 V' G/ T& Q8 B' Y* z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 10:50 , Processed in 0.043144 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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