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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 F# K' ]2 Z2 s, K
8 S4 n9 F5 _" o* ?& G3 g
问题描述:8 ?7 t/ N# d' K$ C. B: ]2 B  }
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" [$ A0 u" R: w% Q; \
) W$ e% m. i# s4 m" E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' O- n( H# A) Q+ Q

8 g6 s. R! \9 C3 c' [+ A2 c/ r+ g测试结果如下:1 h+ J6 Y% c; I, q7 Q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 x: T! t; V0 w$ l! r% J$ p- s
6 T) S% P8 O/ X  A

& i8 T) F5 ^* O% M/ L; }备注:6 f+ {; s& N2 I
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 u0 Q7 Q* J/ B; ?6 f
2、相关代码如下:
+ f( s( ~9 f9 D- r1 F* s//UPP DMA缓冲大小512字节4 Q1 N' R0 ~  _2 @" ^% v; A/ i
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  J  C" V5 r  o2 [7 Z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 r4 {% s+ P" |1 w8 ]; y' v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 S- v  _& O  N3 V1 d' e' [3 G' [. D, v% J$ {
+ c" E, b! W0 b3 L0 \
//upp接收、发送buffer
/ a" Q3 _6 x" h2 b#pragma DATA_ALIGN(upp_buffer_a, 8)
0 \" c  h3 y; j) Z) H: t#pragma DATA_ALIGN(upp_buffer_b, 8); D) ]8 n. w$ q: {7 d1 O' p

5 }- {) r0 N3 N4 \unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! a; v5 l' T6 m( b' ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 `$ f, ]& t: g7 s  _
3 h( J1 ]2 c% T3 Z) L: {
0 r4 H/ N* U- |8 G: s, [& W/ Q
static bool server_upp_data_recv(Server *server) % J: a6 p8 E% z$ [. o; C* n" f
{4 j1 B8 i5 I2 S8 S1 [+ K, N8 M
    if(server->upp_channel_a_recv == false) {: D( M3 x5 w1 m( j) o0 s$ m! ~
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; V; ~- x# ]- p! u& `+ z        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, d0 y: S0 x  Z% k& @+ C            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 i( l# f8 p6 z9 ]  C2 A+ {- J6 S1 H# B/ p  c  ^+ N
/ d& S0 F( i8 s: X/ ]  \
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 h; i$ b" u# s9 x6 z6 j3 X2 Y$ C8 y
            server->upp_channel_a_recv = true;//
5 T1 t7 O/ b& M' R3 N  |& j            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; _. C0 {9 T! w* g8 a) B5 [
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( [: I& K5 m. S) h; I  w8 A  V6 n$ I
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) q; j, O2 L9 E& M* w+ l. J8 N1 l
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; ~; j' M( i$ ?
( V- }% k7 T" @3 G. A
            upp_error_count = 0;/ H; z0 O3 a4 s+ a( Q( h
            upp_dmai_int_cut = 0;4 u8 E; f7 Y8 h, j1 Q8 t

- D7 v1 H; S3 H6 b            // fill in data
& S- ^& T" b: y7 }- L2 o1 u' g3 t& X            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  }+ B' P3 r  p            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 |! U4 _- G- {1 D6 J1 G" F/ H1 y6 M
        }
' `, T! Z/ N1 Y5 o; b$ y; |    }, _$ S" F) M2 b7 v1 |8 k/ p
    else{
( H- X" n* p) Q* o        if (upp_dmai_int_cut > 0){
6 p4 K& V0 J. O9 l8 H            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 F* c) C- J+ M& }/ f  u
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( c" r2 t  M2 s' k9 e+ w" Y% N9 H( d0 F+ D; w
- g! ~9 P' a, Z
            //copy data to upp_recv_list_busy0 {8 w, l3 \! x0 f" m
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 Z2 o% K- q. G/ Y

7 }1 A) k" N" H% e& W4 ?# ?$ w            //
& B3 R" x* r9 M4 b            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ m: Y! L) }- h5 W8 Y$ X
! A% B) h; X! M) q( z            //
; t' i) q' M% F            server->upp_channel_a_recv = false;//
! t1 m8 ?4 x( [2 t, V$ n& D* e
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% c# B* m0 f1 h- y9 V        }
* x+ c0 O+ Q8 Z% r+ W/ T    }+ F6 s$ V" }5 e. y& b

" {+ \+ E* Q8 B
# p+ `- j  h2 t8 ^) t3 ^    return true;& _( c, F  R: N" q" M
}
( g5 i) w4 j, e6 {2 Q/ |
% ]% @, F( M$ ?8 ]' @+ X" Zstatic bool server_upp_data_send(Server *server)9 N! h9 b0 s% x
{- N# }$ |" }" N' j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- z4 V! s) t9 V: n2 W+ L        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* ^9 X8 n2 y- U" H2 q' a: _& j1 e        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 r* e4 }( Q: d/ F  Q% n$ {7 g- B8 A        char tmp[128] ={0};
4 j+ F9 s5 C  G  p+ F( V  |/ F1 q& b6 |+ W" [+ B% }
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 l# A) l( u  M6 ~5 O        print_log(server, data, 64);
) e( O' A  O( C2 q. R4 a' |" B) r; v$ F- A% [  s! K& v
        //9 `. g. c, a" J. s
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 B" f. v4 {; {$ j$ G, v" |        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% C1 m( E" [7 h
        print_log(server, upp_buffer_b, 64);
9 H9 d+ ^  f( s
9 l' P* z# e; f7 r/ F        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);* u% g$ t# T1 |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# P- `9 u- ]8 M- F7 K, M+ g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 I- Q% p0 U3 \        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 f: G6 p. `7 h! W5 [+ ~

( A. g5 {  k' a$ W        memset(tmp, 0, sizeof(tmp));
7 Y6 w. h# q, b        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( C9 ?! A8 d) x3 }
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 |; u. y! S9 l9 h/ ~- y        server_msg_send(server, APP_CMD_LOG, tmp);
0 g7 B4 ~6 Y: o1 i# t( m6 d3 v) M$ X, I* \3 C1 ^; R4 Q
        upp_error_count = 0;: U8 L0 @) q# s
        upp_dmaq_int_cut = 0;
$ w- F# O/ d0 b2 k        // fill in data + i) z0 C/ E1 q) ~9 g
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* g8 \5 G+ j/ J4 z        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ C7 W7 R- ^3 |3 T; p5 |  ~

: s& p- b0 g3 a( V6 V1 r        // wait send success
5 s9 }/ [# W( c! J) C" w$ z8 @        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( r9 v4 z9 o. ^, @$ x4 v2 ^* W0 C
4 ^: U' q0 E! V, ]9 s! y4 M        // make data node in free list
* _" w/ X" P2 f. \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. T. r1 @5 C, f" Z& A; G
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 s- t! ~% P  q3 `' F    }
& j6 @4 Z$ O, u- ~1 }+ m/ _    return true;
& b& b* V; w. U& c}; A' Y! g1 v& s3 n# s1 |
( ^1 L; J9 P+ `% r: ?# P- w: L

( s$ Q! {7 F3 `9 u& T
# ~( |; X' u# O0 `
* c* O; J) J4 i9 R% a2 ~% A
$ h2 U. }4 u6 A, v  R$ i0 H

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 [/ X7 H% K3 @  d- o2 c. k- i
3 c0 g$ c& a8 T8 L" Z8 R

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 20:08 , Processed in 0.042112 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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