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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ m  _4 N6 U8 J: t

4 r) a. g. J' B' Z; w问题描述:
2 u  e# R2 p. V在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 A& ~* v& [, s) y9 x3 N
% v; ^" p$ x4 V  m图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: ]" v, h  Q) e2 \3 F4 p5 W' T- v% L/ m0 }% k( m$ m9 W. c( F/ D
测试结果如下:7 c: `* f$ p2 P1 y0 |
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 Z2 U9 p0 `& h3 T' j" ~9 R

6 A2 {& y: \# X9 }; {  q, R" n
8 }2 S$ `7 Z, q* {6 l备注:
: F8 J& G  l, P/ S4 Y( h& P1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- c5 f% D. y5 f. j) I8 U: Z1 H1 E
2、相关代码如下:
, x* @8 {4 {8 b" x  H. X//UPP DMA缓冲大小512字节1 ?& x1 L. b" d* t3 C- T
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ q/ z. a1 T4 m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' b8 h7 x; j' K7 @0 p: ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ i: ]. E, G7 S/ f1 t+ A- G/ Y& Q3 f
7 D/ ~) `# l0 A1 u
//upp接收、发送buffer! y. C$ w+ [2 {. \5 U6 k
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 e! ~  a; [0 w# i#pragma DATA_ALIGN(upp_buffer_b, 8)! l+ |" E3 H3 j" A7 u) L* X) ?5 u* v
7 L' m% `' D& w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- @& T* N- O1 y7 Y# }unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ w, [% |( ?2 B  q! S' A- L: A
2 X0 {+ N3 R6 O; }& d

4 c( E2 M  V0 estatic bool server_upp_data_recv(Server *server)
3 E6 R+ `8 I. u( G' X; b{2 p$ W% \' ]- g0 ?! s- R
    if(server->upp_channel_a_recv == false) {
+ @  Y8 {- n) T; d' h4 {4 i        server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 {! A( E- V# t1 N6 N4 W) p5 G
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 Z4 ]8 `; v2 j3 P* ?$ l  r            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* K2 d0 {! U0 `; X1 {* }" e6 T
; V# m+ c, e* A  f1 b- D7 M
3 M1 g1 E" ?$ {) X  o; Y4 ^
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  S" }' T! M1 ?5 t
. ^9 \; G, s' o) p9 m6 Q
            server->upp_channel_a_recv = true;//
% L6 j, N: K' _! z8 d$ @% L% Q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);+ W$ T( ^$ ~" Z) v  v' F( X! Y; B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
1 A3 r8 m+ Q, V) \            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;& y8 _0 p' v) Y. z! {
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: x' P, m" @; p: T7 _* S
3 D4 l# Y% l# p6 d; \8 W            upp_error_count = 0;. z9 O" Q/ t) V) M  ~3 B
            upp_dmai_int_cut = 0;+ t4 o$ s5 h7 h3 V4 x* _+ R* J4 g
! }& N$ j4 t. b, x, I- E3 W
            // fill in data , Y3 k& ]; |" G) I: K
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" P: T5 j. l8 k+ w( s
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ F1 [. ~) Z$ [, N% L
        }& N4 B$ Z4 f1 L  Y
    }
  @) }: r9 P0 G1 g1 }9 G    else{9 e9 {" l' V" k4 V$ J
        if (upp_dmai_int_cut > 0){
; t. I! U; d0 a8 {            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) E5 B: _! T0 q4 n3 A1 W% @1 M            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% Z( {, v0 {( P: b0 m/ T
" X0 H: P1 o; G" o) p% _+ J/ a

# M) ~$ d; A" M$ `            //copy data to upp_recv_list_busy) A" ~) r- E, U* K8 g  V. O- u
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ ^! ?) l$ w' v2 K+ S
9 t* H9 U- m% u+ M0 x1 b& R. d6 z
            //
% Y. h4 _4 L) W5 G/ C2 I" \* X) L            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" w1 d" y  e8 m# ~' _' i2 l3 x: \# b0 d
            //
$ U1 [) |& F  w; m4 P9 A6 D* S            server->upp_channel_a_recv = false;//; q. J. R# L. U
$ W$ D5 T7 Q% f
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 e1 t3 n2 ]' X: K        }$ B" K! {0 E7 O* t1 c6 Q) b
    }
* e2 u  y: r3 O  [! Q2 D6 G2 Y
2 W2 F" o! s# Y
  N; }4 U  q3 K$ J9 L    return true;( l1 D# {. I8 _4 p
}
- V9 d" @; d; n/ [" u
5 ]5 ~# j2 F1 Y6 t) estatic bool server_upp_data_send(Server *server). j1 U2 L! d" {( Z$ ~! F
{2 j3 E% g6 [# H7 D3 H0 w
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: Q* M2 R8 j6 I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 R+ d! d8 b+ C* J3 @, r9 w% Q        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 e7 W' Q( Y: I( S+ l% X9 F
        char tmp[128] ={0};
0 ]" G. y2 P' q/ v9 V' {" D( O! s# l% \
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. g. I! o" K+ l  G        print_log(server, data, 64);
0 m3 }% Q* d0 l' c/ P9 A/ p; F: B6 p1 W6 X1 M1 W7 O
        //- p+ Y: C2 ]. d+ I, R4 g: D+ \: R- {
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; r# y& g8 V: C$ p        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 r" F: X" @3 j% B- P+ a/ X
        print_log(server, upp_buffer_b, 64);
' }' \6 q6 |5 S
2 \8 R0 a5 n8 m9 t5 R- g0 N        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
; B- W2 J/ l# t0 _1 a" ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; + x& `. n+ j; h2 G2 [
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
" c* G4 U. R/ L) L4 |        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& \$ E2 \# ~% N/ c' S) \( z
* p0 F! {- Q' Y- ?, ~" x7 V% I        memset(tmp, 0, sizeof(tmp));3 @' R4 L/ @. i' e* s0 Y% N
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 Q# [# F' b$ M) s
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 l; F; a+ y* [' J+ ^3 g# k5 w+ w) s
        server_msg_send(server, APP_CMD_LOG, tmp);
0 K' {* y% n: I5 |8 m
9 C: c. S5 }' Q        upp_error_count = 0;
7 ^) ?& f2 w" y0 I        upp_dmaq_int_cut = 0;: c% [0 n& U0 f4 ]9 U, G+ A5 W" F
        // fill in data
& x' C' B1 _4 B* M2 H$ y+ k: d        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# `: g3 b* y2 M: \' o3 b        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# ~3 {, M! P0 a2 D! P: I) [

0 {- U' T0 Q: {6 c  V+ `        // wait send success
3 N) {; D& H" J/ M        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 N. Q# p$ ~; h( ]/ d: e. [7 j) Q3 J
# q  g! j- }1 w& u2 u0 Z$ O# Z
        // make data node in free list
* c7 l! n9 ]% x! [) k0 D) Y$ u. _! V        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) R3 r1 L# c$ w, ~* {
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
' P7 U# Q4 X& `7 o. Z1 s- @    }  u; L% E! q3 ]4 Z! A. a% o
    return true;" Z# a' b# p9 q' |+ v- h7 m5 f
}
, |" O" ~" j- Y/ J6 a+ K: ~2 F9 @0 \1 _) U  m

3 c) Y' i1 M" X1 h) y6 _1 U1 w! _7 a) \' _7 M! b9 ^9 u

# `, N; F2 ~' j! O( K, s
  u* N  ^; i* S! Y/ R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐- w% B# a- a( x% ?) @

* r4 s/ o0 |8 S  c) m1 D* @' ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 04:31 , Processed in 0.038541 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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