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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
+ x( z- K2 W* y# U, k
" F2 Y% Z) S' \- ?2 g问题描述:" f8 T7 {+ c/ R( [- O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 q1 t4 R& ~" i8 b8 `& g: [& Y6 X' o8 F# j8 f
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
( J4 X; r& X0 d1 O
  z& o3 ^4 `: S测试结果如下:2 g5 D9 X+ Z0 t( w1 J! F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 v4 Y! C* C7 l, Y  C& b% ]" Q( m6 J8 B; M

, l; u$ @1 [4 ?- ]1 h备注:" b$ [( a& H: O- e% t/ Y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 L1 t, y: w  o7 l% L* j  Q
2、相关代码如下:& [) u7 Y2 F3 K# K" {: t& z
//UPP DMA缓冲大小512字节
) A$ g, U& M$ a. Q9 s5 K, ^% a#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) Z. Q" b( w+ f) v% {
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ V0 b! e3 L# h2 Q) s3 f#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 _( V# q) ?8 p
. S7 r& J: o7 @" [7 h
! Z9 u$ g. O$ R& r( X//upp接收、发送buffer5 M3 C4 X* t$ q7 ~) n- M: {% y, r$ @- [
#pragma DATA_ALIGN(upp_buffer_a, 8)
5 g0 y) K0 K3 d#pragma DATA_ALIGN(upp_buffer_b, 8)
6 z# k' I7 G8 e6 R1 Q. D' L% h1 O2 e
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- f0 W0 n: a1 q( [# H7 uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" |& W2 h) r/ F- ^3 ~
! }7 D6 c1 P6 Y8 R/ ], C. J
3 e# L; k5 i3 r1 l4 xstatic bool server_upp_data_recv(Server *server)
; N: E5 c$ I. K( F8 r{
) Z9 e! ~, b; e; F    if(server->upp_channel_a_recv == false) {
$ O! _2 p- A+ X. W( D) @* a        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# x5 X. j) u8 G& B1 w        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 K3 ?$ \) Z; R9 X" t            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ a4 p7 Q$ _: h, a
) @! z; l, g- U$ I) X$ c. v: W3 p2 f, g3 S
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ H& V' R$ F. C$ [; V  Q
2 L# r7 J; D0 J8 H1 o            server->upp_channel_a_recv = true;//- F8 p) w4 }7 K  L- Q
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);1 O9 P; b/ V* \5 Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) N" \; Q# }" W! z* G! _
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;: b' i& v3 x5 v9 |" S: R1 M. v7 Q
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 I8 k- z" M1 B6 ~
2 J, t: n; Z9 `+ a
            upp_error_count = 0;
- v! Q% w( [( ?7 g1 D            upp_dmai_int_cut = 0;& q+ J- b6 H7 M- [! |/ [6 ~
  M2 m1 N8 |: u- R0 `- V/ p
            // fill in data
) A, v$ N% P8 _% N            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' A7 s. j3 |; Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* |! ?- N% V  \
        }7 o9 Z+ f; T0 D/ b: ]! Q
    }* b' ]+ x+ ^) A6 s0 U- H! y; W! L
    else{# V* z- S, q9 Q1 e3 F6 P
        if (upp_dmai_int_cut > 0){
. d# V. g, k, T" q! b( y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! [) C, b3 a8 y0 q6 L6 r            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ w& C7 E2 o" M! u
2 A0 Y2 J7 V# m

! w6 t& \; T3 J8 k& C/ d            //copy data to upp_recv_list_busy* i& G! ?# z- H0 h% F
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* z. p; i9 L/ K
% n$ S8 e% V. k" r
            //
8 a$ x- T* F6 \: L! A% z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' I1 S) @9 N6 X7 X2 c( M
$ s4 {- m1 q2 r( i/ [/ U& v
            //
( }3 h0 Y( f: T# d$ B' z            server->upp_channel_a_recv = false;//4 F4 P3 C( ~5 Z! q. x1 N

: p( y" `4 n8 P            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# s# ^  H0 G, y9 W0 ^3 l( H        }
2 w- A" v9 K( K- S! x7 N- ^3 n    }
4 H2 |* P; a7 X. [2 D7 A8 ^
+ N. I  s8 T; S% N. P; z% B  m0 P8 L6 I& Z! d6 L% }5 u
    return true;( s3 M& x0 s( n, ?4 n1 r( Y, G; a9 g
}' U  R' n/ n+ E

( T1 Z, a( o: {static bool server_upp_data_send(Server *server)- |3 f- Q  P6 s  x. f
{1 V" t" p$ a8 V, o
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* {# {' y0 N5 X! O, S& L$ Z2 L6 V% l( K        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 h2 H) s2 h8 O- ~+ [1 Y& Z1 [        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( w, P& I; F6 a$ t# X
        char tmp[128] ={0};
1 N, g& ?9 ?- I. c, l$ ?) y! u! v2 k. s
        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 ?$ n2 N2 Y3 \0 c& D" w' ]2 B
        print_log(server, data, 64);7 l# ?- U* A/ v; C( I' d2 f

. K" U2 z* G7 ]. e( A$ F# y        //# e% t6 `1 m& x+ F8 Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: k6 i0 \4 c5 l) f6 U        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ v. t9 X& w9 n2 e! s2 J. D: a: H        print_log(server, upp_buffer_b, 64);3 W, W' P4 [, r7 V% m

6 p  ~4 D/ M. k2 w9 V        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ m/ W: e8 v; V- q+ W6 j: ]; N
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" g) _. k0 {; W$ |: l        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ p6 [# y  b$ X! J
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; R2 u7 r9 H  a4 j4 Z" f
6 {; `1 w+ _9 A' o2 [: S        memset(tmp, 0, sizeof(tmp));
# g' K: u. L- m$ Z        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: }+ U: n' Y) r/ r5 S, d' W            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( }5 r. o# w6 g( H$ v5 B  j        server_msg_send(server, APP_CMD_LOG, tmp);5 F3 L& M5 h; W0 C) R% _) I

3 l' c/ [& X% o/ f        upp_error_count = 0;
5 n; Q8 K& S  n9 @; h7 x) h        upp_dmaq_int_cut = 0;
' x, S6 @( w5 M0 d% A6 `; M: J5 u( t        // fill in data
2 u; ^& j* z7 |( j( q% G* G        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & a+ C7 N( l4 u/ }  J
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% Z8 m% {& R" ]& W0 W4 a
- ~: X) J/ A8 Y
        // wait send success+ X9 m/ U: n9 m. o3 Q9 J( t
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 x  K0 F5 g/ a) M# v/ {8 h$ ^

+ {. W, ?' m# {/ b& G        // make data node in free list
6 _# {/ l, ^: P) }0 H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& c- X. u( x/ {" [  _7 a        server_msg_send(server, APP_CMD_LOG, "upp send: success");/ G4 s6 |. M$ w. @% u1 w; b1 c/ i
    }& A" W# G4 o4 [& G/ Q, h
    return true;
& {! D4 Y1 M; c0 x9 |8 k0 y}
' x9 E! Q) \$ i1 I/ F
& P, f6 x$ Y1 e5 N

5 P! X% U' J. n0 L
& m' ?9 J! `$ W! T3 U2 @

9 f* l8 p( d! z
4 }$ R' j4 ]4 G9 W

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
: S1 T4 B; e5 J0 N4 h8 b5 l3 N" j/ \: }) n

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 08:35 , Processed in 0.039947 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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