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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 V6 [8 O2 i6 Z* P* D: }9 r; Q

4 S+ ~( v% F4 O& o问题描述:
8 V! P- W; ?0 {# i/ N; b6 g4 d2 p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" s4 \2 Y% D' `/ ]+ ~! s9 a/ u" U7 \( o5 Q) k6 F9 C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& |2 s! i& S# l% U% ]1 A
* Q6 V# ~/ w/ \" e: j5 u测试结果如下:
. z+ z+ F, `. L9 K  k9 |& C138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 o* A- {0 Y9 k/ l$ h
5 r7 g" l. G+ X4 \1 w9 l) k
5 h. L  }$ g' Y3 H* }6 A& s
备注:
: h' J! d8 l. u( u% l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ Y* {7 m! z# ]6 i& r
2、相关代码如下:
+ S4 J3 k0 z0 Z# Z+ _# l//UPP DMA缓冲大小512字节
% `+ Q/ k( L  a& v9 F#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 `* C' S0 m' w& b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT  g( x# ~2 _& p: d7 K, z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% k/ M  l( Z0 F, X; b
' {6 K( w7 a/ t3 R+ t2 D! A$ W( Q: W8 i) E4 Y$ M% h
//upp接收、发送buffer
( L3 `5 v1 h" _/ Q5 B5 b2 }0 q#pragma DATA_ALIGN(upp_buffer_a, 8)5 H; W) ?; ?, O
#pragma DATA_ALIGN(upp_buffer_b, 8)0 F9 ?: F% d* q: {8 Q" ]% o
1 }: h0 r( P3 `" G. n' B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ h7 w  q* l! E) J) g  `- Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 g( D& O+ y5 v- p7 `2 N& x
. R$ }+ l& f8 Z! Q

* q" ?. {  D: I& ^' u& estatic bool server_upp_data_recv(Server *server) ( }! @4 X1 h: n" ~1 i  O
{
9 ]$ J: Q: r2 [# K    if(server->upp_channel_a_recv == false) {
1 Q* d# A# c2 y) Y4 m0 O5 r2 W2 F, z        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 O3 G0 u( d( e2 m1 \4 Y+ T; ^) [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 C8 m2 X! X" ^; c8 ~) B; V0 ]+ q
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ E6 v# E. C. Q; X5 J
: y( @, Z4 s) g' m* i9 l# R! n+ \) U; j/ q% |2 g
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 s+ T6 L0 |" C5 `, H3 a  C

/ P3 I  x" Q, C$ [: u( @            server->upp_channel_a_recv = true;//! i; h1 n- `: L
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' [  C% X6 i. V& ]5 E            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 A1 v: T0 u; I  n4 |6 o
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
8 t% D; A# o, a) P' |            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 x5 |$ g8 D$ |

. l8 D* _8 f; ?            upp_error_count = 0;
1 ?4 w9 {% u" ~            upp_dmai_int_cut = 0;
5 n! u" I2 g% W: f/ Z8 @3 R5 f
$ _- o' ^# s& b8 o            // fill in data
- l9 \- H4 D# N- [            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% E( ?/ y9 ]2 Z' j5 E& T$ Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 t: t6 q- ^0 [! P/ J+ Z
        }' L6 \, R' H- X1 c2 |' B
    }
6 l( ^8 `6 [' h+ ?4 `+ o    else{
7 v% ], w# ~+ r/ B& _$ L, V$ d        if (upp_dmai_int_cut > 0){
, G$ {! E& r4 |            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' S& D. U7 T: C: M7 r- O9 v
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 s' E9 N' i, K+ k, A. ^
# D' H2 F) t& n, |4 z, b2 w& J8 h
" z  e) w1 _" M0 s9 ^% E; p            //copy data to upp_recv_list_busy
+ }6 L6 L2 }- G# J3 q8 r3 w            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% c% @$ S7 ?1 s8 q4 l0 N

# W5 j' Z* s: ]) O/ M% h            //5 O( I: W+ I% [3 X
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 {( n" H: T- a$ Q+ D2 Y
; C1 s. h) N7 C* j2 Z* o
            //; N$ J+ I' @) G
            server->upp_channel_a_recv = false;//8 Z3 W5 r; X0 H7 V* e) w7 ~

# v) `9 O3 `/ C: H1 H* g# F' z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 _1 Y$ ~$ a. m
        }; {& l7 Q1 U# W/ M5 U
    }
5 A! a; B. w/ Q. F2 ?7 N" R2 A4 \* R
3 U( G% |0 W6 L
    return true;
5 c7 o9 h7 d9 \1 W6 s; ~( J, k}
; U. L. U9 j5 l, N+ P0 Y9 s
& v% d2 h5 x9 w: {" M5 K; Kstatic bool server_upp_data_send(Server *server)
* [' r9 ]8 t, E1 S9 C5 I{! }9 ~; T- v" k4 J) E: C: \+ {' v, q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){# v8 O. _( j  H' M
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 G4 f  e* V+ L3 q1 Z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
& W9 O% y: N3 V        char tmp[128] ={0};  j4 j: ?* K0 g  U
8 i5 ~. `( ^) i. v# s3 {- N
        server_msg_send(server, APP_CMD_LOG, "upp send: start");: _3 b, a# T2 @& {2 O/ e/ S2 ?
        print_log(server, data, 64);. z: e" I9 w2 |9 a5 s  ]
9 X' {/ n& E; q# K* Y. ]) ?0 j
        //
! t- q  P( |! J& c# j        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; y3 N  X3 _& M4 m9 i7 w; s
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 u. s6 A, [- n$ T. M        print_log(server, upp_buffer_b, 64);
3 B$ }, r3 Y+ T- m
0 E; m2 V" `9 H+ A2 U7 h% P        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; D0 t* T+ G9 P6 G. C
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 y* c% R: I: N' f2 i3 N# Q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
7 Q# c5 r+ z! l$ F        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, _; l6 }% F0 {8 k0 k' U9 x0 G8 Z+ g; n
        memset(tmp, 0, sizeof(tmp));
# d8 Q( [5 J7 ?6 c% F0 w" c        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: [/ s0 M7 k. A. Z            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& F2 Y1 a- E9 K+ a# ?3 S7 F        server_msg_send(server, APP_CMD_LOG, tmp);
9 M4 ^6 O& K- G+ o7 g, G1 C& \6 w. `' N
9 l$ v% [4 o* Y' K+ l- P( ^0 e        upp_error_count = 0;
/ Q6 Y. N. `" R: ?9 x% ?& R        upp_dmaq_int_cut = 0;
0 h( V: {0 B- x- n- o, Z        // fill in data 3 k7 i, b3 @- p
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( h! a& {2 w' n* m" T! k        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" M2 f9 a; o2 H9 n
! n  A0 |* z( [" f/ d! m- D8 W
        // wait send success; q2 Z: t, ~; T7 `
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   c/ t* X; [+ A

: G9 b8 q% L: v4 g/ ]( S        // make data node in free list 1 {, _1 }( b2 E2 W7 t" x6 c6 n
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- p% F1 E, [5 b# W        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ _, F6 y8 Q; U, N9 n6 n
    }8 L, O5 P8 @- q8 x, K" a6 q5 W
    return true;
3 A  B0 w4 M6 k}% }7 N' ?0 W5 n9 P# o% _8 ^
( _/ s5 j4 W4 ~3 u$ ^4 X
# x- L1 T; x) y6 p$ L; j/ S
0 i$ d, ~: G8 F% m2 Q

4 z" f) u7 T2 N3 B7 {. H* y% S% L* u) }

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
$ H. ]# x7 z' ]' |, g" p, g7 G
$ @$ a5 ?6 t  Y$ ^+ {3 c

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 06:06 , Processed in 0.047057 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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