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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 \' y6 N4 ^2 Y. U4 ?" I
: D8 N# M4 J, z# r" ~- T/ r4 T问题描述:
2 v. c* h1 a, }4 c! L1 t在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! v1 f# q& ]4 G. ?
6 F+ ?0 `* t# D$ B# S0 A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ y1 q5 d  Z0 M

# S4 n; c& Q8 E& \9 d3 V. x! ]7 C测试结果如下:
/ N1 T- q( d' z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# ?; i; R2 Q" ?0 c4 u2 J

$ @$ Y6 [3 E: y% Z0 J
1 i2 @" d! p9 D8 E& E' u备注:
6 B1 A6 Z: D4 g( r, g. b( n1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 M3 J, C0 K+ v, L* |- J
2、相关代码如下:, P$ C* ?7 [' N8 A! M' v8 c: }+ Y
//UPP DMA缓冲大小512字节
5 S1 }% }6 s6 Q7 `#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# E! N' y( ^2 Z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- J" J4 ?; S6 @, \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 E9 y7 \  [8 Q( `) L

! ~: A  O" \; v2 q5 l
& Z+ ~0 t4 _/ q6 k8 v* D4 M7 l//upp接收、发送buffer2 J+ p" y# Q: H& u
#pragma DATA_ALIGN(upp_buffer_a, 8)4 n  \2 y# D! R
#pragma DATA_ALIGN(upp_buffer_b, 8)
- V! ~% n* ^+ t/ R5 g2 l4 s3 [' ^2 Y  \5 z% X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: K! s# H. S& Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  v* F6 M. F4 _) Q

6 o) B8 d4 R1 a+ {
4 W# C* {8 |' I8 u# U+ u+ f6 Mstatic bool server_upp_data_recv(Server *server) 4 {+ `$ n  W4 H% v' K0 G
{$ M$ I6 u) C$ S4 F' R1 c) C
    if(server->upp_channel_a_recv == false) {5 i6 X  q& J) g( Q* ^3 m: Z& ~
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 L* c; N* W" ^$ P1 K        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) y4 I+ O: G' Y& J9 D  ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& D: A5 v" f6 P; {3 j5 ~+ L
1 _, P/ _. N' p% U

1 Y3 U0 [3 s; [- X) q. u            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ L6 b  _# t& B5 b0 `1 ?' z; r3 q. j' ]/ F
            server->upp_channel_a_recv = true;//
) ^; H; Z5 {' h( z5 J            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% S, s/ \( w. Z1 }9 \
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ |# ?( [6 k+ O! S8 O7 c9 U
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;5 Y& v+ g, R/ J) i$ U! k
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ T6 l( Q" ?5 a" u
" Y: M/ ]  z7 o8 q
            upp_error_count = 0;. G1 k' P, O8 ?8 g$ `' U+ t
            upp_dmai_int_cut = 0;
! s/ Z7 C# K5 j! m
, r0 u5 F' E! s. ]            // fill in data " r8 s& g' p- ]
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& O! f' z6 @. R8 P; Z" Q4 x- g
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( A8 Y7 z7 W5 {0 v# ?4 V: p3 U6 M
        }
$ l3 a; K3 j+ S2 Z" H1 Y4 \# Q    }
% @+ L& G" C+ W9 q5 N    else{8 y' h; b$ r, ?  N$ M  ]. B
        if (upp_dmai_int_cut > 0){. }/ |6 |$ X7 n( [
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& s, S* s5 ]$ J& E$ f4 ?! g# U
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* X' ?. G& }, [, ]; K9 ^
0 H4 ^' Q) ?; f+ W
  ]5 T) G. g2 t4 b" o+ y            //copy data to upp_recv_list_busy
; U4 c6 m1 X, G5 N" X8 ^1 ]; I            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);# ~8 r3 b1 b' U0 l5 v

5 n0 m1 C, i. X, R" H0 i& K9 }            //
: C3 b4 P8 H) N7 F& M8 P( k            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* k" {. \2 \6 ?% t* p
9 G2 e% ], [1 |* ]
            //
4 ~: E/ k. b" i+ |0 g4 G& }            server->upp_channel_a_recv = false;//2 G6 V& x( M$ c% A6 X& Q/ z
, J# g1 _" z) J
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 l. }" c, A* ]$ Q4 h
        }' K0 k9 v, |7 }; R5 R! }/ ^: E7 ]
    }
$ `5 X" n6 X$ S. |
; _% D4 [" G( M1 t7 R
7 Y7 u- r5 p& t1 p    return true;7 n2 n1 h# |# Q; `0 Z3 H' W
}! Z# [2 N' Z9 l' Z5 Y2 y

( R$ T* D$ q  k$ C( f2 _+ B) xstatic bool server_upp_data_send(Server *server)* c5 W# e7 j4 L- N7 p
{' b1 p- Q" T& [2 c8 b2 g# T
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 ^% T, {6 w  U% ^; M+ y( l$ ^        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  `7 u5 i! F1 H8 c' ^' t6 ^        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* V; i6 U  x# M0 e
        char tmp[128] ={0};5 j# ~$ x0 y" Y( I$ o# D4 `

# o$ `7 q# Y# r/ P; A        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 u6 b6 }- H  C$ M% H
        print_log(server, data, 64);2 u& F! L2 X5 G& @9 w; p: a  Y

8 T7 M! k1 p' M6 Y        //
* F) G; Q. M2 [- e' V8 D3 r        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);  z* v; [6 j2 W) Y9 C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. A  P& u7 v! f  P' f+ M        print_log(server, upp_buffer_b, 64);- a6 z2 g- Q1 u) F

- ^! L( Q; q; L! k        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);4 ^* ^) @. K8 \& K( v
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
, v, c! |4 q1 C+ T1 t        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" K1 {* C0 f2 R2 ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' h# B% t0 T% |5 f* ]9 u6 h) q: u! @6 V
. H+ U* G- t7 V3 y        memset(tmp, 0, sizeof(tmp));) V- [' e: J! }
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
0 w8 d& |4 Q& j* V: B            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 f4 _! {/ @7 r+ U; O) |        server_msg_send(server, APP_CMD_LOG, tmp);
7 v: q' A+ u( S* A6 _+ Y* }9 [0 M4 |: O* H4 V
        upp_error_count = 0;
: C* m  M% L) k) `) Q% P; z, V        upp_dmaq_int_cut = 0;
; H- p+ m" K6 `4 p) s) _        // fill in data $ q+ o3 u2 }( I0 R/ C
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : E5 Q; m6 G0 Y" |" z& ?& X$ {
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 ^9 U& M$ V) N; X/ y/ v6 B
" U- g) h8 C, m+ S/ P$ A
        // wait send success
) U# g+ W- Q+ k% D3 E/ S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ z9 [  l7 x# Y8 N9 w
* }! ^7 I* o  E9 ]% }- X
        // make data node in free list , x# k+ p6 n! m- I
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 N) l3 v9 ?+ P$ K/ H: x( @
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
. W- g* W7 S  f3 Z    }
: X/ G3 \; p/ {! E2 o) x    return true;, }. y+ o5 H3 z0 V6 S
}
, m# s+ W; p' v$ d; F8 N9 G  c( w" b6 e4 N  h- v7 j5 u

7 m' O- l: V$ i/ A+ Y% v0 D- l  j& h  l! M! l4 l- Y
. X" w/ V/ f6 Q' n

& w) Y: {& b! F+ O" c4 B6 O" D! L

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 i# U* x! Q: J7 P, q

8 n" _, O/ _3 \7 Q* |8 j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 04:19 , Processed in 0.039358 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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