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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, s  }4 _: c! O9 V. B) I" Y
; Y9 V# _9 |7 H; o4 w; p问题描述:( u1 T. X0 @! B4 p7 S% L3 Y5 r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 h. v1 I" p& s, {1 z
! G$ Z7 l$ Y$ J* ?9 z+ U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 N) E' r( M* G% n( S
# C" x9 P- E! x8 m( R
测试结果如下:
' v* A$ u8 ~8 C* x: e; Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ D4 g* D1 g6 K
: i4 E; U# ?$ j- W

9 W6 ?, j7 z6 W' }% t0 a+ f0 B' O' [, c+ `备注:
- S% Q6 K* ?  D' d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# h$ M" i/ h' A/ r( W
2、相关代码如下:/ _  I. k1 h4 ?- F; {- h+ D1 O/ p
//UPP DMA缓冲大小512字节
2 n( o8 n5 Y) v#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" S# d7 B  v2 ~" W8 [; L& C) f#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ t& K- a8 s4 c) {8 J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' y& I% ~+ N7 ^& Z$ {7 B; j5 h2 i5 F' b, c& Z. p

$ l1 [, U5 W. @3 j//upp接收、发送buffer
4 q$ W( p/ o! s#pragma DATA_ALIGN(upp_buffer_a, 8)
; r6 v+ q6 z2 R, F' ]7 ]#pragma DATA_ALIGN(upp_buffer_b, 8)1 ?' m! s. P& M. G0 Y
1 j8 E, E/ y5 p/ S" @1 s  Z2 |' E7 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 [+ x: t: R& K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 F' T, [, X& {" ?, b  V4 I+ }' T! S' K3 R4 m/ H: q: a7 a
* _7 q' g/ J) y1 O( p
static bool server_upp_data_recv(Server *server) ' `3 T2 R( S8 y& `
{
. X) K1 g; ~/ k& l" w! W: h    if(server->upp_channel_a_recv == false) {
1 Y# P/ |- c& c4 l0 B/ O6 ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
- q6 B: o$ N! `2 G4 Y  i- R9 ~        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& w' N" R( ~. g
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ ]5 d# p3 R, H; g  y3 h3 u

) o/ t/ d, M9 y. {, j; P7 M9 q9 ?: ~6 H1 O% c0 N
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; q4 k, y4 c/ l" _+ z) l  i
" V% Q7 C/ x* N9 P# L( u
            server->upp_channel_a_recv = true;//3 C1 p: L- Z4 ]5 E* t  U% V0 H; D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! m# d# u7 M4 K2 m5 p
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( G. E9 j, K* Y5 V4 q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" i2 m! n6 A6 Q1 e  g! j            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: |8 n: A8 f/ y7 c+ ~9 Z- ], ~8 Y; g$ s( S' U' k
            upp_error_count = 0;
1 T) b# u  ?5 l- V$ s  F' U            upp_dmai_int_cut = 0;, p3 N4 i! V) b% Y; R0 x5 H
. y( s2 |1 A1 v& ]* {- p
            // fill in data 1 T4 W8 I. a1 o# s# D
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) f8 V% q6 d* T2 w
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 {' r+ Z( J$ {        }3 G" a: F; R+ X+ S6 l, Y
    }/ ]& E  c8 P# l2 r7 Z
    else{
: H8 a4 e. q1 k% i- v3 \' v        if (upp_dmai_int_cut > 0){1 w$ K" j; V9 ^1 D6 j
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( y3 j+ X! X1 v7 k- c1 h  E" m
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( ?5 Y* R" |9 G2 c3 `/ V. X( w$ S4 R: J! L( u4 a9 n0 k7 i/ ?

: H9 v5 g4 ?, l4 m0 ?            //copy data to upp_recv_list_busy4 Z$ h& j* i" [. F
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 k- g) p5 {% g4 [; n) a" t
: |7 h! g1 c8 V/ E: ?' @            //& w/ D6 F+ T1 w9 ^( A- f- ~& y$ P7 y7 z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 {9 f0 i5 w% E" I, N/ U& a' D# t. {  z: @9 R9 s& v& K4 k
            //
% y+ \2 t3 Y: K. d            server->upp_channel_a_recv = false;//2 V( L# ~7 J2 k1 t+ Y0 A

( O- B# H' v; F% e( K9 M            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 [  i: a5 W& U/ x: H7 C        }" M0 `1 z$ K8 |" A! N# v9 C
    }% h1 N7 }" |8 r
( O  p7 |9 A, o3 I2 _& c

% J: H9 t; u6 A* p: G    return true;5 F9 j; X5 @. f4 D
}2 D8 r8 Q7 y3 x6 I

: I2 R2 K" b' Bstatic bool server_upp_data_send(Server *server)# V- A" x8 Z4 }+ L
{
5 f8 d& [  R) S6 e2 v; q3 n    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
  N$ F5 b+ `; V* r- G# B        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 \5 C" F9 f+ I' N& v# z7 M        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* }8 w2 w0 V7 q5 }7 N* Y        char tmp[128] ={0};
% E5 z, c$ x2 P' }( p. x- s. L  D: g+ o
  {- g: E6 l+ \! u9 V, r        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" Y/ a' M! `+ e8 b6 N7 v/ B7 A        print_log(server, data, 64);
7 l& |7 l) s8 m. _  }2 s, y
% E7 Y! u& z7 o        //3 \2 b. w3 E8 [' g. F- G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 ?* a' }( F8 ]  g: m8 _        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' q( k+ ]! C: u. S* ]2 {7 N( s        print_log(server, upp_buffer_b, 64);' J# R3 J+ J- A. t

, n/ k  O2 O: z9 y, Q# L# [! [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 L% F  P- Q) E/ w+ w  U: b" Z
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 q% w' f. G/ k7 U+ V, L  Y: f( B
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 o' v9 N8 y0 y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: ?/ z4 x- f, i2 Z2 |2 c* Z
7 d6 n- K) F2 f' r
        memset(tmp, 0, sizeof(tmp));  e' H/ @0 W8 V* D* C) F7 ~
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 t* e/ P! u+ D- z6 T( o6 U% C            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: m: E# j" j' L% Q( R' e/ u  |& O        server_msg_send(server, APP_CMD_LOG, tmp);) c: Q% p+ Y5 R* g, C) [3 T: _

( v. w& X& b7 H8 \/ A7 ?        upp_error_count = 0;! ^( k4 _6 S1 }
        upp_dmaq_int_cut = 0;" r  U: e& Q. l' O4 b/ f# `7 H% }( R
        // fill in data
2 P7 R8 Y0 f' g        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ w: l  J* r; s0 |  U$ e6 p! L1 Q        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 R( K% e: a6 s$ @$ f7 x) C- F5 B) w0 I+ M
        // wait send success8 d: @" M+ j* D! \" H* Y' x, j
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- \. V% V4 Q! G( l
4 }" ~9 p/ F# }, c/ a& }        // make data node in free list
! n& U, m2 F; f+ V" Q7 Z4 B        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 K  N  w) X6 j& c        server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 L% ]9 T. S0 R    }
& w. O2 c8 j) S) S: H$ C3 S    return true;  l% h2 [; m# N
}: z6 C# n  E+ l, x/ u
' X) K% v% [- [4 b$ t

" L. l! ?3 q# I+ o$ o1 l5 e1 J, |8 o9 L3 h

6 x# @2 J' I. q5 Z1 N# @, w$ f
5 T" \6 [3 A8 ]$ p* d) ~, u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
: i3 j9 p5 ?" N1 K
$ P- s% F1 O- v( z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 23:17 , Processed in 0.042700 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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