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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " L% ]& l8 M/ [- w1 R  I# n) h

, a: X& z; O7 @7 [问题描述:2 x* X- L' K4 J& H
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! n: o" L. V" Z' a- f/ }, c" o
# V5 a* m- O! @0 ^. T. B7 P; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' w+ p3 L8 y1 A/ d; a- `+ q3 _! T' S$ |
测试结果如下:9 w7 Y( Q) x0 D1 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# V8 |* u& Z: f2 H1 x$ J2 e6 I* |+ M
$ R; D9 e5 i0 h
: O8 c, l: ~8 b& x' c备注:$ Q$ Y& {% A7 O3 Y8 @
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) z( e2 u3 {8 G  `* I  @! T
2、相关代码如下:# _" f5 |) I+ c! H4 }/ K$ o8 K
//UPP DMA缓冲大小512字节3 k2 H% r, e# _$ t  _3 p+ a5 ^
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# J7 i- A# w/ |- h0 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 ]/ D* S3 N1 A, Z/ Z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" H& H6 W5 M, [- G, {6 O
$ }2 h1 S; |! G1 ^8 ^5 @6 d# T% O$ i7 {4 u
//upp接收、发送buffer
# t6 w  A3 S, E3 {6 Q9 G#pragma DATA_ALIGN(upp_buffer_a, 8)# {% Z! f& c4 F7 t
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 m$ f7 M4 B: G- C. ]2 ~+ K' _: K8 y+ V
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 p! g$ w, O6 H; J- junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ i9 ?% ?! v& m' z9 b2 s4 ~( @! i$ V& h  |

! r, L1 j6 x" ]0 F8 X0 Bstatic bool server_upp_data_recv(Server *server)   r! K) s) z. ^3 R6 `( k5 v0 ?
{" X% w$ p8 C1 R8 V, z& ]% Z
    if(server->upp_channel_a_recv == false) {0 u  v  x, {+ B  {
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 A2 t: I) [1 h/ A& F# @3 |
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 l2 q: D) s$ Z- I+ J! r  D
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 D% B( x$ f) ?" ~% d8 T* Z0 c, V$ v9 o- t! e

  b' t6 h3 b( r  t1 z            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 x8 W2 K/ p0 @3 ^" y& l* _! y! p- R- u& Z. I6 k
            server->upp_channel_a_recv = true;//$ _3 r2 N8 H# H, x, B
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ `  N. Z' o( Q' J0 v" l: ^' U            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;- ?$ L( l: a' P
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% v; F) {7 x! W7 Z. M0 \- `            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ ]$ Y' G5 m; F% Y3 A1 I& G. D- `
; Z5 p  e/ A: ]; q$ t) I            upp_error_count = 0;- b, Q6 S3 Y# y* g3 z
            upp_dmai_int_cut = 0;
0 H& _5 m; F. F6 g5 C) _7 h3 `, _) E0 Q# U& _7 }( z4 L; ]
            // fill in data
' X: N7 X8 _& |% I# p            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' Y0 l: ]3 t2 ]& m% i            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; o; [& `) u! j8 A1 E* Y        }2 t2 g. i% g; u  ?: n  N
    }/ ~+ a7 L3 a. k7 X( y
    else{. g  c' P5 y' }$ \, D
        if (upp_dmai_int_cut > 0){! z: r7 [2 M! I6 r3 N7 }
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' C. K0 c; W$ w2 c7 n7 [3 S8 _            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' ~# c4 t* X$ [6 ^/ y0 f) `7 I8 Y0 U6 w; a$ c
6 F' a/ O  y+ C0 H$ \$ M/ h! [
            //copy data to upp_recv_list_busy/ u9 }+ v: s0 ^& v3 r# g0 W
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" `& q9 I1 P0 O' t5 O
1 [. c1 m* N) M$ _5 [4 g
            //- u8 q2 H' [2 A9 u1 k, r1 i
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ C- g  o$ y; E' b$ ?) Q1 P- |
( z' h& z' ?8 v5 n/ `3 A/ g8 W            //
0 A, s4 |7 U, @* J9 K3 {1 H            server->upp_channel_a_recv = false;//
* P5 r9 Q" k8 M* H4 U' ^: _7 }8 g/ I* u& y1 f) o( d7 v
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, U, ~  ~1 Z7 x+ k) L  f        }+ {1 F  B6 [8 \: V5 V" q
    }( H4 k  U2 h' e- m
. M5 T8 w) N- {; V$ ^7 `
# {; d6 J1 c5 u$ o6 Z# M
    return true;
$ @: K$ c4 d4 ]7 @2 @, C: S* r}
6 O/ z# e- C% ]8 |0 g2 A0 Z7 H' a* n
static bool server_upp_data_send(Server *server)" O' H$ _+ w4 B3 T
{
4 A3 I6 K, t4 ^9 ~' O1 Q! b- G) G    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) K6 d( x8 H, B9 d
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 F  h2 N  b1 l! a
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ b8 X0 z: L2 z) n        char tmp[128] ={0};
: J5 x6 P$ s+ h6 S+ c
( M  g! @( B3 g& M6 X  k- B        server_msg_send(server, APP_CMD_LOG, "upp send: start");: A' v5 v' y. `+ Z4 G2 O8 R
        print_log(server, data, 64);, k7 n  @4 F" y6 }5 T7 C* `1 Z

9 ^# a2 M- N* Y        //
( B4 d: ]4 m3 h1 J% {        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);4 i1 ?& R1 M/ ?  F9 O7 i
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
  ]/ H6 K8 G* a; M3 P; u; p! w        print_log(server, upp_buffer_b, 64);0 P# j( L7 \! n% e6 e
% m. h7 l' q7 R% z) ?1 ~
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 N; q6 C9 e, {( ]* v
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 4 c! ~' E. O! W& \+ h: J0 @  _
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ z! O0 Z3 e7 S& O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* R, {% t9 ]5 f# t
  k. G( w: U, G3 u5 v- }
        memset(tmp, 0, sizeof(tmp));$ I/ q6 K3 D5 L3 s5 S
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 q) z  n5 c; C8 U6 Q  {' s( {- |
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 N& a% M  o8 O# i
        server_msg_send(server, APP_CMD_LOG, tmp);5 C' U! s' Y5 _  d7 l5 p
- S" J% Q+ H" Z  x4 n# B
        upp_error_count = 0;
+ \) r$ g; f9 P# }8 h; {5 n. Z        upp_dmaq_int_cut = 0;
  z6 c- D5 G' f$ z" k        // fill in data   ]! r1 o0 G: [8 c
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . x7 p0 ?. `  Y: I8 e% p* L
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 y" M/ P0 f. O( J1 r& D

- m0 ^2 a& d$ d$ f: W        // wait send success+ C8 n4 A1 Y3 w, `4 Q& v
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. G8 w+ {7 R! c/ H3 u1 @2 Z9 Z4 i; w, U0 `4 Z4 v2 V7 w, Q
        // make data node in free list
6 L+ x' N' _! G! J) l0 q4 s6 P. w        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 S3 T- u6 |7 k8 o        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 n4 T4 k) q, b+ V7 Z, l' i    }. e- p+ J; Z4 h, X: O/ _
    return true;4 X, d; m. H2 R- P+ P2 ?
}6 g% [6 I# _, L

/ I+ {- t$ [4 ]; S! d; ^+ r. I

8 P9 r3 ~: A' B8 y
4 P( G$ }" S3 }/ F: E" ]2 B1 q

1 ^( w3 p7 r- G4 ~6 }% R/ J  n! M3 B8 E7 u/ o3 F- A

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ n" r/ u3 V8 g7 p0 l; W8 ~

% S7 J5 i- y% U3 C

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 15:30 , Processed in 0.064678 second(s), 35 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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