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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' v8 N1 @6 k+ B; E. ~+ k0 ?2 ?) ~8 t5 r: R% P5 ^1 x
问题描述:4 f" Y; l0 L9 b$ c: W9 Q; D! w$ G
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 D2 j( I0 k0 M0 a; T

0 t9 l( h- J+ w0 B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 w$ \4 H4 T! @& K9 O& ~" W+ C' C/ h* i2 g8 i
测试结果如下:
0 T9 ?- a! l0 o( ~$ q( ?. X4 y138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ x. _+ U' J, X. ?5 d, y& I5 @2 v) q; U
/ V5 r- p; {1 W) T$ L8 J

! m. ~7 X# L" _( M: B0 U备注:) R9 e& B/ P) I$ ^9 F0 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* |2 `0 P  B9 M8 X* y
2、相关代码如下:
# h) T1 @% l' I6 v//UPP DMA缓冲大小512字节( t' W, t1 u6 q" E; D) F
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 Z: Z; b, D% R# l& X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" G, E7 h0 }8 f: D% ~' }#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 ?2 |% {0 ^7 y  G! a* C

) }( X) b6 V) t* k5 z" o" o
# Y& c% Q7 a4 q6 Z" s( y: w//upp接收、发送buffer
9 ~& x3 d  i5 Z5 V4 e) J' `#pragma DATA_ALIGN(upp_buffer_a, 8)
$ ]& F+ a: T9 s- S. z) e1 d#pragma DATA_ALIGN(upp_buffer_b, 8)
' q9 _1 w# ~! ]3 l! p" }
$ o% g( |. f7 }3 \6 \8 Kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 f- S  x/ O* O: s. Q' y6 qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 l3 T& j6 P3 M- N; ^" D9 C- y  m5 o

* p2 W8 n* k  p9 x% T$ j' ]
$ P) ?5 v2 {* sstatic bool server_upp_data_recv(Server *server)
; |1 B/ O( r3 \, F{
% Q1 e6 @  O' S4 j* u2 R    if(server->upp_channel_a_recv == false) {
+ s" J' u- A. V% g8 w; t( |. i        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 s; {) A7 @1 ]        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ u, S8 `* ^6 x            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' R& }" ^7 F+ q+ _. @/ K6 p
3 \7 t# G( f& ~7 B, l

% }- a$ `* |! f            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  H1 O+ o& m9 q" \% {) {

# {( X' q" a) ]7 G' f& ]. r            server->upp_channel_a_recv = true;//
6 G8 \" v1 ?/ }/ Y            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 {/ z2 o; ]5 Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 ~/ o: {; P& `' Y, _! H6 i
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; l- c- g' `6 Y8 c( h1 B            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ x, `0 J" ]9 {

- L. C1 S2 f2 X$ a, r/ s            upp_error_count = 0;
' ~- i6 T- k  M. E; _- B1 G            upp_dmai_int_cut = 0;
0 v/ K* M$ M1 d" o; J: x- |+ m2 a" C8 y# v
            // fill in data ) p- E* ^/ X" w% \; x
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, I/ y+ v; `6 h* R( a
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 J7 I# y- v- V  @; C" e, H9 j/ Z
        }
5 N( p% X" u0 Z5 B    }
4 [# _8 r4 s% Z- |    else{" j( t9 S1 U5 d' |$ Y3 x8 v
        if (upp_dmai_int_cut > 0){4 Q: w  ]0 X4 |# D
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" C" ^% U8 u( Q+ o! H            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 I/ [# q1 W" T- P4 d& ^7 z# Q
8 K9 W7 q6 z' b& R2 a5 Q6 n
            //copy data to upp_recv_list_busy
  R' g- v$ r) o3 H5 Y- |+ {" [            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& K9 q! v# r/ B8 E" b! k9 A' S0 \5 w" Q5 C
            //
: X! Z2 R. e) w8 W            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' w5 F* y; ]% X: [, V& W3 M+ }+ e* h7 b8 P
            //5 `: w/ q) Y- ?1 J
            server->upp_channel_a_recv = false;//
  ~8 m: f9 K- E% C+ L. P& ^3 n4 g' C& x1 N# H
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ K4 C- A! S  M' f        }
9 A1 P" G" W* L! x+ e! W0 L0 T    }
% }; r: ?, h2 w7 V1 e+ G0 q' w5 P/ r  Q

4 j5 z; G( L5 ^: m    return true;
( [. z: H. n9 F3 k% H: N}( ?. b0 H, j' k( `- [- a

4 y' t; L1 ?6 [5 b0 V3 ], ystatic bool server_upp_data_send(Server *server)0 l* Z2 A4 X* |* C3 L
{" `+ t6 ~; _# J& v- X% t8 U" p
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" v8 `# O3 t, R0 _7 b( S# v9 e        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 d' E2 T" y: u& K! o- A" B8 W
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* w& T0 H2 I3 i0 u( {
        char tmp[128] ={0};! _% t9 h" X5 R" C9 @! o

/ ^% P$ H9 _' v: d3 I4 x        server_msg_send(server, APP_CMD_LOG, "upp send: start");: f  ~* ]9 @/ B: g
        print_log(server, data, 64);
' Q! L0 d# U; G$ D& w/ Y/ `$ z" n3 P( ]
        //
; X+ R2 k8 q0 h; W( }. k        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& h' |. b1 g! g& o% M( f3 D        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 l2 S2 N: i; l  [& W
        print_log(server, upp_buffer_b, 64);+ B% U6 y; t: h) p
+ Q, \, }& V" u+ r4 x: M
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
$ h; ]( ?; a: [; {        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" d' M- y. i  s" v4 J        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;0 l# u" m; P; R
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 a1 i( M6 Z$ h/ s: U# j) j- F
: U6 c/ n; y7 P        memset(tmp, 0, sizeof(tmp));
  \1 g# Y: P& b: ]% N+ X/ Q5 I        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 m4 N! |3 O: y1 |
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; N4 Z0 i+ N0 Z& v
        server_msg_send(server, APP_CMD_LOG, tmp);& n5 U+ m7 Y' [6 s% _
+ C6 }" o) i* A) S1 }- [
        upp_error_count = 0;( Q( Y3 e7 u2 L
        upp_dmaq_int_cut = 0;/ X& ^$ L( d9 {8 _
        // fill in data - s9 ]0 D" R1 s" d. e3 N0 |
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * Q; X) Z6 v/ q. x
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! S( Z5 z9 b1 ]. W2 E% g8 O- z* R' ?: I
        // wait send success
9 V( ?9 V4 _8 S  i6 {  A        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ R* `, D( R# ]) w
' l. M  {0 @8 V0 A0 Q        // make data node in free list + K1 l+ C1 {% b+ c& q" T
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; s; r4 v* x" E! m
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ _9 L: Y4 }: g5 m  r7 {    }( a0 g7 c0 l' }) I) c1 q1 G) k7 H
    return true;9 \5 J1 o3 J$ c+ K
}* i) T1 |# X6 E, y

/ }  V9 }5 }. d& T- `

& ~% p, ^/ _' @- r% i
& F9 F4 R$ _, V& W

3 u2 W* D  o$ E+ p; S3 E' B1 ]# M
9 V! ]) T" F' Z" d& V4 f! d% b( ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, v2 S* w4 U" |+ \1 C: E+ t
" `1 y' l% J7 ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 21:45 , Processed in 0.053930 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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