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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 ?4 \8 c2 R0 W: Z
- R9 @' D" c6 V$ i& i2 j' k
问题描述:9 k& r( \; \# Z4 w& c+ k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; K  j3 X  t. v" y- Q+ |' y* F2 x$ C7 O9 [7 Z! \7 _7 S7 k0 E
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% L4 d5 ^. S" P+ G- z4 K* o
# n, G" |5 V3 z测试结果如下:
6 u1 U2 F/ b0 C5 G! K) G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 H: R# I2 q1 ~- y1 I

5 b; o4 ~: E% R8 x; S/ Y) g6 p, ]: \
备注:3 p  U. V& C9 R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" f' V$ ^6 |; C: ?/ e( m
2、相关代码如下:
" J. Q2 |. b. {/ V. ?//UPP DMA缓冲大小512字节# a' z- P: v* j7 Z9 G
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! h0 X6 H. W. `* d
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 p8 D  R, v$ |- X. ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* I' }/ N- ?7 v/ o4 z5 N( p
/ a$ r% w$ O, c( ]2 b+ o1 J9 F0 Y8 h! j9 ]+ \/ [( Z
//upp接收、发送buffer* r/ ]5 f8 E& K- V" }
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 U1 Z5 x: X3 g8 M& P1 r* R#pragma DATA_ALIGN(upp_buffer_b, 8)
. N. ]$ ^+ U; u* O) ?5 W& Q7 c9 i
- ^2 l. J  f/ N; bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
* x: [1 U" N; t7 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 }0 x* U" A0 l) a7 f6 J
! A2 d, y% r7 A( }1 i, t0 M
$ ^' s% P7 R" w" @; G; bstatic bool server_upp_data_recv(Server *server) , f9 Z. ~+ m# n4 I  K. c( S
{
/ @" h' n, O5 U7 V7 G  W9 d    if(server->upp_channel_a_recv == false) {) r  s) Z" {' P6 ?9 X, V5 _' V
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 h7 D& f# K% ]* D  X9 G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {, y  o5 b* k6 t
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 ^, m! W) F7 v8 g6 D
4 C- {3 M$ V0 d. W0 l

  |2 P+ \, z9 U            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) p" J8 S" u1 z- x

2 e+ _2 _0 t, Q. @# C0 |$ b- m* e' o            server->upp_channel_a_recv = true;//
0 U; N8 f! Z- H+ S            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 Q1 U. s, @" ?! N; M# l
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
+ I$ F. j' z8 ~2 P; p            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% u( ^; O% ~# X7 A" W9 g: ?6 z' r
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& d3 ~8 u" T/ k& Z( e: N. O
& U- [8 ]6 O& w- `7 I            upp_error_count = 0;
, @  G% K/ W2 U            upp_dmai_int_cut = 0;( |4 s% _0 S# W: I' N

, D. g4 I+ p- l3 g& `  [. A# d3 H' z            // fill in data
: W2 `% S/ B* l. q            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& h5 o: j0 `6 o2 j" a, w9 b+ y, e            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 T; l8 {2 n( I& X        }
& M! w, W* N% J7 y7 G1 a4 ~    }; A3 Z, z1 F1 `! s6 X
    else{
6 d/ e, R9 w8 [) [/ B; O        if (upp_dmai_int_cut > 0){' n; o7 w$ d7 R2 O$ i3 I' H: o
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 S1 ~' q7 s- b  e4 a
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# ~/ N' U+ y1 s! ]
& @2 r+ u* G0 r+ d$ t2 h2 R$ c3 n' T3 z2 w' v, Y
            //copy data to upp_recv_list_busy
" V4 v8 J4 R4 f2 ]/ f            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ o' N- O( O9 ^' y( a5 Y7 R! q8 i+ p! N8 W/ h7 c- u8 G8 a
            //
6 Q! ]' H) r- {; w. Z6 @( G6 S            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) V3 u( S2 a8 m4 X. z2 M9 y  }+ P
8 e% O8 X3 G7 ]0 q7 w
            //' g7 C0 C" a2 |6 t
            server->upp_channel_a_recv = false;//
0 J5 d2 C  X4 X1 k* W" R; I5 p/ \+ ^; ~  s' A) ?( T
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ w: T2 w+ |4 f4 M! i: r        }3 g' B( z3 R4 G8 X& v
    }
- g; _+ m4 A) d% k9 w# y$ O# k+ m$ s0 B$ {3 X/ Y5 n" K; z
5 V3 S& O3 x% |2 R2 w4 z: _9 r" E: p
    return true;# [! I" ^* U2 I  @
}: w$ y4 B, c$ W- E
9 W7 }/ l- `- J& J: g3 @" q& g
static bool server_upp_data_send(Server *server)! x6 O2 p' r4 X
{
  G9 y1 l5 I  X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 a& O) t! \; E- C% ~% `
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% h1 ]9 g( x' J4 @3 P$ B. U1 q
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 G+ y! D! H5 e
        char tmp[128] ={0};* P4 f7 H2 @7 `/ X, q5 t
1 q9 P, T2 n0 F
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 p. ~; f' q- P3 e3 ^        print_log(server, data, 64);; K- z: ]7 ]+ o! k8 \( P5 e( Y' z
3 `2 n* _+ J: C0 W9 O
        //8 r- t- s; y4 }% Z1 _3 f4 {. X
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& }4 c" R" d$ r4 Z        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 \8 M% o" J& E# M/ ?) k! k$ r
        print_log(server, upp_buffer_b, 64);
( L8 E  j! |; a5 Q8 t: f. r9 G! d/ ^4 ?+ o7 j; a
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
) w: G  B0 t' T8 Y8 e        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- `( J( T7 e/ F' j        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
1 ]3 \# d  R$ y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: h- ]1 H6 E* Z7 J1 x

: Z9 P) v6 |1 e; T        memset(tmp, 0, sizeof(tmp));2 V0 Z8 C! @2 J# a3 C
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: x6 s! t+ L, F/ N3 E2 _1 B4 V            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 ]7 ^8 s/ [+ z, D' x: ^1 c
        server_msg_send(server, APP_CMD_LOG, tmp);; O) Z5 c6 k, T

% \% v- }" m" m8 ^$ @+ m8 R4 l        upp_error_count = 0;
6 d6 J7 x, h) U" t9 m4 j" G1 M$ a0 J  a        upp_dmaq_int_cut = 0;& C+ I! P! H: H+ z+ }$ u
        // fill in data 3 c$ g9 j% j& Y* \, v2 R0 [
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 Z' a9 l. C) H0 ^" ^* _        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 _8 N& L+ ?* A! L7 r) X
2 p+ m) h8 ^6 O; I. G- U
        // wait send success
; V2 X+ H; p3 ?7 a. \        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 c" e1 p4 ]/ E* m

  }; z) }$ }8 Y7 `+ Q' r' y6 M        // make data node in free list
  i  X: N: a0 g( P) N        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 Z' h/ A: m% Q# I- K- G8 A7 O6 w% O        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) V8 K# t* t5 k: W6 E    }0 I! S! w' C* L9 }
    return true;$ Y! b) d- b- b" t9 ~6 m6 Q
}
6 N4 v- w7 j6 E! Q4 s$ e6 u+ E; H) _: w5 C: Y0 k8 v3 ]6 A

5 k% [7 j3 a+ K+ t9 f! I
5 f$ D3 V/ N; \" h* P; h# f4 Q

1 e" `: c; H% v0 q/ ?2 H4 `- @5 F5 j8 r- J5 ]9 \9 @, e. j; _6 [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐. ?' q. U, r4 d- `! y

, x2 ~4 k% Y/ ?  B4 ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 15:26 , Processed in 0.040255 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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