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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( q1 D2 N0 e( X) g% z9 m

9 c1 d8 h9 B: x- H$ }; `问题描述:0 m" S1 G: I0 |: Z' ]9 H/ U
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% S$ g' u) t3 {0 b% K. r) x
0 e: O- y2 h9 Z) {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 i* U4 y0 @& W; Z( }; m6 W+ M
- e& S2 [: l8 G0 r' B% I测试结果如下:, M  |2 {9 _: P" k* V- v, P* @1 s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 ~5 g& w/ g2 V  W. J" r, B" b
. R& A+ V7 [' _0 S* c. v$ q; A: c! w) ]
备注:
$ C2 \; `7 y) ?1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 X  ?$ T( G* R8 E
2、相关代码如下:: @$ A$ U# @& U7 K$ [
//UPP DMA缓冲大小512字节/ z" L; x# ]: x7 Y1 L: c4 M
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. a% e3 q3 u6 @8 o2 l. d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: d+ n7 b4 c9 F/ Q; l- U5 V
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) w0 k8 s  B- z5 z  `1 J1 B- h

+ Y. U1 m* |0 H
0 v5 e6 P3 |! U! g% v//upp接收、发送buffer
/ o1 d: `* [: r. S) E$ ]#pragma DATA_ALIGN(upp_buffer_a, 8); m, b, R) D/ W7 Y& e
#pragma DATA_ALIGN(upp_buffer_b, 8)* I9 `' I8 y5 H( F. ^

$ m0 ]; H. a  P! {* x  G" T6 @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 U% N% {9 U8 L, F$ v& v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! M( P/ Z' I( m* p" {6 z- U) X
9 W, i. q: s9 @* x! u2 e  b
9 Z) o( @$ a" n& [. [) h, hstatic bool server_upp_data_recv(Server *server) ! a) {% s2 g: m2 _
{
  E& I1 j; z# b) E) N( `! P    if(server->upp_channel_a_recv == false) {1 H' B4 r/ B! W0 v$ ~
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 E  M8 o2 L4 B9 G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# w8 N% T$ [6 J# N) e            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 Y1 W/ b9 Y* a" h% S
, u4 d$ d. J- a4 {/ s- h
/ u. A! R! G, e0 c- R            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% r4 b, B% c" b/ A; z, A) W

5 [! A( Q) k& O            server->upp_channel_a_recv = true;//; r# k8 [- H1 J$ Q
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 c6 G) Y/ R. T0 f$ ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;- l0 L3 E6 a* A8 x
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" g. [0 p8 k: P- ~4 f            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 `/ o7 g! q  t: ~

- g- b/ c; a% `& d            upp_error_count = 0;
6 ^( Y" [$ E: ~$ Z            upp_dmai_int_cut = 0;" h" c, t' G6 g1 l

- x5 ~0 N( r. W8 o            // fill in data
6 M/ B5 V, A( s  C. ?( B+ p: [            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' D; b2 e, i6 n5 P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ L2 ^1 G* S/ r: ?" b7 f        }: j( ~' V, u4 H
    }# o2 @. P0 C* `* H+ Z+ B+ f" ^' T/ B
    else{
  v/ P" H8 K9 z  J2 @        if (upp_dmai_int_cut > 0){! a! G% p6 e) U
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ s6 q* r( K8 Q' c            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! W1 P3 [* w0 v* `8 a: b% U5 k2 R  t  J$ @$ K( y; z2 G
8 G& }. ^3 W2 W0 o& z% e1 L6 R, F
            //copy data to upp_recv_list_busy
2 o+ Z; X: ?& b            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 Y! E, {/ E% }+ Y. u4 R
- Z: [4 }3 X8 P. I
            //
& s# B3 v1 E0 D3 T, I4 T            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 F# W* [" a4 @; ?8 G3 Z8 |7 Q: L
& l! {  k. v! S  \
            //, W$ e! z* R! N0 _. ^" Q9 h, z' Q  L
            server->upp_channel_a_recv = false;//( U. x. Y( f- N6 g7 L& w2 W
0 V- ]+ ^) }; _1 g
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 }3 a( u5 G, d' f8 {0 f+ s- o
        }
+ j8 w: C4 q9 \0 x+ I    }
: C* V% O0 P" Q% I& |1 J0 a) p# O3 q9 r; {! V$ b
9 e3 n+ i& P) S% E* W; v- w) u8 B/ a
    return true;
0 n, m( R  h7 v}' C- z0 O: w# t5 c# }9 i
+ P1 P" F/ j3 ], w
static bool server_upp_data_send(Server *server)6 c$ S! C3 |/ h1 C# u7 E. B
{0 Q8 v" u1 H  v9 D
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) v8 k+ r/ N! o        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 w$ Z/ t/ b" t' L        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: @- Z: [. V3 X5 Q7 L        char tmp[128] ={0};
; n7 ?# Z. p$ a
( D9 _! G# L: w1 a        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; ]) ^9 G+ Y- |0 v9 J9 f$ i        print_log(server, data, 64);
  J3 a+ s0 N8 `$ X2 Y. Y) C+ R7 g. ?
        //
& E. |; O) j9 F! C  a, W. L/ `7 n, Z        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' A) |1 A; e) \! p        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% U  u: O2 n' I, K8 I0 _9 W7 H, L3 Y- y
        print_log(server, upp_buffer_b, 64);
3 u/ R8 C+ t9 j5 [. k5 \8 k0 _
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);- g2 Y0 e8 a9 v* O
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - z) M% ~5 \, c2 r
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 a7 w. h( i9 e4 j1 G/ y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;8 d9 R$ c4 \% j6 H) W  _, G. A
* S& Z; u  m5 K: D. A3 N- k
        memset(tmp, 0, sizeof(tmp));2 ^8 E/ W, P& L) x0 T
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + R: {& v6 A7 a) a- r; y
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# E9 t( p$ }. j1 K
        server_msg_send(server, APP_CMD_LOG, tmp);
& ^7 b5 T$ G) t2 ~  I3 ?/ `
5 |* u2 \' T3 L& G8 c        upp_error_count = 0;
7 E- W( a- W6 I- t% E3 {9 H2 r8 Y        upp_dmaq_int_cut = 0;( P+ \  j5 B" I3 J' Y
        // fill in data
4 Q& t8 h' @, X$ i& p        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " n1 J) p4 ?/ Q! X7 ?/ a
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
& a. K6 @+ _7 J& o9 ~  L( t4 h, J+ `4 S
        // wait send success
6 D# f2 L: E/ M* X* O4 T        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( T# b9 q. j" C
* ]3 @3 |+ J! x9 v
        // make data node in free list " l; E: K6 z+ Z# w: S
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% x- F' I6 c. `( A9 t- E( J        server_msg_send(server, APP_CMD_LOG, "upp send: success");
" e, F3 x8 {6 J0 p, b    }
# \' j1 _) z2 i6 X4 o# j' Q/ b    return true;
* x) H/ j. o% V& A( [}
; O: R7 P# r+ e% t& f! ~8 h8 G3 t, g# A1 S& F: o& p% }; Y: F
' e4 v( X2 T% u  W
; U4 _) G$ K5 n$ L& W# I

8 |9 A; G3 D2 C+ w0 m: `2 V; X2 |' o! w2 O' H

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ c/ N: U; p& v+ l" r) r

1 V4 \4 C2 B% n- f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 13:40 , Processed in 0.040441 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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