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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 z2 o6 R5 {( [( P5 ~5 D
+ n7 B; z/ d  y# Q# T
问题描述:2 F! r) ]) s) ]' D3 I4 N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. Y; z( S& U  \" Z" }

/ Y5 a' A, A& k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
+ c3 d0 n9 |4 `1 U/ }0 h* }+ _/ l( W5 I0 Q3 h% Y" v7 |
测试结果如下:
2 z7 J; k& w" n* e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" [* c' T) W3 _( Y( Y2 M+ Q, x; w5 y- C' \  T- M2 @" u
3 i8 B7 a% o6 N1 c0 z
备注:! F7 X( @/ @' g# r: e% |& C0 P# ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" `! d4 u7 U9 G5 \4 {
2、相关代码如下:/ N) D% A$ d7 h* j* y' Q
//UPP DMA缓冲大小512字节
$ r9 q' H3 X+ d* o9 G  m( D. [#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: `4 {1 b  Q" q, G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 K$ u9 w: q. |+ {$ v' P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( u+ T$ I) S' M# \8 t/ U4 r0 L( ~  j& j  l

$ |2 e3 {# p/ G9 w$ D3 M# g4 X$ s//upp接收、发送buffer+ i& x! p8 T5 K* x& k
#pragma DATA_ALIGN(upp_buffer_a, 8)  }0 T) d' F8 p3 y# e% o  {
#pragma DATA_ALIGN(upp_buffer_b, 8), n4 ~9 K8 U5 r4 U

  |# R* l; n( g# [0 w9 h) m! ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# s- e; r# q3 B% Q. s& \: k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( P: I/ w) V) T1 L. I
# i" l4 \* i- D! U% Q+ {, {( \! N) N

; Y0 |' u% g0 S# Tstatic bool server_upp_data_recv(Server *server) , s- R* l+ f7 }
{
# S) g, k2 s- H( n7 n/ a6 a    if(server->upp_channel_a_recv == false) {
3 k/ @' y8 m5 [+ z5 ~1 b/ N1 _        server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 |) \5 V" T3 o( i/ n  X
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% I- t2 p5 w1 N3 D            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 t$ P0 K% i" t! a9 N
9 N  I% E& ]8 H: T. I, F  o+ \0 {: W
# o* b, K6 k5 P; _* [( k- U4 R7 w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ v/ y9 A& K4 o9 I7 U' E1 U6 h8 v3 R; Y# F. c1 ?0 e
            server->upp_channel_a_recv = true;//
% |( |( N% e- Z7 O4 `8 O            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
9 z3 J2 P! a& K6 H, X- p- z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;6 C- _% P5 e0 u( W2 O6 U
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& T4 [4 N/ G; ^' W$ n0 W6 n6 J            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ O; ?3 h7 J4 |4 @; d% t4 J

' W% O3 \* H+ c1 G: U, b            upp_error_count = 0;  k# h* k) i2 q: `/ I, x8 ^( t4 z
            upp_dmai_int_cut = 0;
" E9 z1 Y+ D$ Q6 S% e! u
" H+ \5 m  w$ O, R            // fill in data
5 G, |* s9 O& _% E$ ?/ L$ x            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: e1 u" U% S" S7 P! o, N            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 q' M# ]5 @5 l) P& |. N        }
* I4 G: c8 F# D$ d4 G1 l! ?3 M    }( U/ w7 i0 `# @" n
    else{& B2 j( l, O3 D2 F" b5 b
        if (upp_dmai_int_cut > 0){2 @$ `6 R% d& x6 E5 K
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. X3 ?$ U; f9 v6 e; }& e2 c
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; x6 I. a" v: c, {0 a' f' n

9 P3 D5 ]" h, r& w/ \) {: r
( ^4 L. |$ s5 o; g! _            //copy data to upp_recv_list_busy
& G& D% @( z- m4 K            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; R! k' Z, G/ Y+ T; S
! b/ N/ C2 s3 H% l, l
            //
2 ~9 D3 O$ I( K# C% A! j' l            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 k# N, k! w$ Q7 b5 q. H' ?  o* K) l1 X" m! k! d! P3 C
            //
# U8 U. K4 B, S, d$ }: H            server->upp_channel_a_recv = false;//
! G& W, T! ^  w5 \
/ Y: u3 ?8 M3 _# L            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 f. X5 J% {  T. g$ k) R3 Y$ A' [/ x' f        }
# t* q/ y. ~5 l6 N, D. G+ l    }2 @8 {5 U( i' s  Q

' C  U- y  C/ R5 }
5 D: j6 l0 M- D. P( j! @* Z    return true;
5 p3 A, \. W1 c7 K2 R' a6 L( Y}& @/ I0 n  k: v$ v: _

5 b3 q# L( Z( X& B1 Z! X4 u/ b# j2 fstatic bool server_upp_data_send(Server *server)( [5 i7 ?# M9 ?- z, u2 k( a0 p2 J
{) J7 `: g* \% _9 k# g6 d% l
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* j; h% f9 @, c+ p( D
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ @. D' d' s  ~0 z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 {" G9 W6 V6 ]% Q" t0 ^: O  r8 w        char tmp[128] ={0};! E3 |0 W4 M# f2 g8 \
2 H& j$ T, w; ~# Z
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 s* e2 l; g1 x2 q/ D* D3 a        print_log(server, data, 64);
% P7 [' M: q" |# n) q5 H& a' J, I. _8 a8 |7 j& x2 b! [  O
        //% f9 B: y$ N  O3 m% x$ Y
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 Z, {3 @- f) a) q8 ^, M7 x        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 v3 L, y8 o; ~6 d+ l        print_log(server, upp_buffer_b, 64);* C: @) t* X4 N  ~' W

+ A- y' @  w& {, r  v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 K5 \3 M0 ], j/ C  s) k$ W
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
. o3 k, Q' I# M' f/ ~# V! a4 g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
) O0 v. [5 ?1 O8 I4 ?        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 ~: _+ c8 K$ \$ O  X# p
9 m, k( N9 J" H+ k1 I/ m        memset(tmp, 0, sizeof(tmp));! k8 O! j/ f, I, x3 b" A
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 A/ t* N# j1 e7 C! Z
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ H5 x8 X& ^9 }! L) y" K7 T, i
        server_msg_send(server, APP_CMD_LOG, tmp);4 A& O2 V  T5 h) }: h

, ]7 _1 ~: a! }6 {: p( A, v# E9 t        upp_error_count = 0;9 x, a2 ^. ]& c. d$ D5 k
        upp_dmaq_int_cut = 0;- f4 a, U* e* M6 s+ |) Y( f6 n& d
        // fill in data
$ |7 Q- w) l+ X1 C& ?( ~        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % r; w* R. l6 L& ]/ e
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ r: m; F5 ~* T
# A' K% s; V8 _4 [4 O        // wait send success
7 W8 y( O$ u5 D        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " \6 ~$ z7 m+ a! x3 C+ C

) u" I$ q5 _: P        // make data node in free list
7 `% X* D8 T5 e. j) h( w        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# Q2 L* A* G2 d6 i. o$ u" [        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& O- G* u1 L6 }$ |/ d    }
. Z, [. d  I. W4 E' H' i  [( r/ B    return true;# l' }' p2 K" H/ }- R
}
3 n: f: c( ^% K  N
$ n8 S6 ~  U) b* @

7 W% |4 E3 t' l& o: |6 c, @
4 D2 l/ z: p, s

2 T2 `/ W+ b4 a' ~% Q/ t, e% ?) U, h: [$ K; u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
( L) ^  K% M( L( g4 M: g+ P
: m. G3 h: F7 h+ c/ i3 j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 21:39 , Processed in 0.038383 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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