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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 l* T/ v% v4 a1 r3 n  ^/ X/ c- L4 k
问题描述:( _6 Z7 I# R  E8 s0 O! f  m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
/ \! }7 a2 x0 [  [  G/ M
. ^# `8 j5 n, X- i, L- H  ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 s* _5 D, H- W1 A' F% n- M( E: l

, L: z% J' z9 s7 R* V测试结果如下:
: R1 \8 B$ w. G" H( r7 e& `) e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- g5 ?) b4 u( E
+ v: ~& [. B$ E* q! D
6 Q' R" n  ]( I  M备注:% o5 W: d- F% i! y  _( ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( j5 E9 C' u: {& ~2 p* B0 |7 ~
2、相关代码如下:
4 F& }$ [2 J$ R" ^. t4 F% I//UPP DMA缓冲大小512字节
0 r4 F- c, J' }1 W" n2 H#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 R3 J; B4 }( u( J/ i' s3 q7 q# k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, Z. S. j, c$ i' {! O  @5 ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 ~7 Z4 b  X  A2 O8 E2 [5 t/ [) V0 ]" r
) Y& h( O0 D8 N7 S
//upp接收、发送buffer
! V) J; L( @9 w3 E2 m7 f: H1 Q#pragma DATA_ALIGN(upp_buffer_a, 8)
+ u& _6 z- d2 ?+ p# @' I) i#pragma DATA_ALIGN(upp_buffer_b, 8)4 Q  f! ^0 a5 n( B9 w& q
; I+ g! ~: K: Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; h" {+ K1 S( X" p7 g2 E! }
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ I( B; Q7 G+ R& \3 i5 V0 m" ]) |5 F! K+ i
2 x# ^  E  h% z
static bool server_upp_data_recv(Server *server)
3 [2 q. f7 n# `  }" c{
  I7 \' A3 n, H5 [5 X3 o7 C    if(server->upp_channel_a_recv == false) {( D, w5 ?) P* S% J$ z# J& R8 E" v
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ~& l: J1 q+ t; }! T( h& ^6 T        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 U& C7 H9 j, c9 n- Y/ Z& p2 N: _            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; n' O$ s2 v8 {8 p

) h' v% e( [: x# i8 W& M* X2 n6 \8 y1 t- ^6 j; H( ?
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% K! K3 r' C4 I4 e" T0 j

2 N1 [* s3 M6 H/ f            server->upp_channel_a_recv = true;//4 Q; `  Q  w! t( F. e3 V
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
, H& |7 a( u& [& N            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! a9 W* |  Z) k: r3 f5 n            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ A* Q; G0 i; B' C" f            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//  ~: Y0 ]8 }/ \6 C

) g" u. h8 n# S) I( ?% U            upp_error_count = 0;1 \+ g8 a7 H2 K- ?! Z, M
            upp_dmai_int_cut = 0;9 o! g+ M3 |2 {

- K2 x$ [4 |; w8 B5 K) W/ c" F            // fill in data 9 o5 X7 Y2 G7 L7 l8 `' s
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 Z. ]# x$ R' f% Z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 n. S; G  O  n, w. h        }5 u4 s# r: g8 E/ C. g
    }0 Z% L) N+ |9 ^4 Q# h
    else{" H: u& n4 D  {0 S7 k; \
        if (upp_dmai_int_cut > 0){1 N/ e/ [. r9 Y2 r+ c0 I
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);) p' b( P( w2 }( x: |7 c: A' O; d
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 W% y* s- v- [7 R! \: k8 ]4 V- S- r4 k

/ O, b. @7 \& f2 {) e) F5 ~            //copy data to upp_recv_list_busy# Y+ U. ]; f) R
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ e' ]1 r# e, c+ [+ a7 C* b4 ~" R+ r; u3 K2 o8 ^& v
            //
. E4 q* Z- O8 f            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ f# y6 d# P' _# }  u3 p, s1 b% G3 r
            //) R  }1 |  E! r; Z+ N
            server->upp_channel_a_recv = false;//
6 A+ G# B' t4 h) f7 c4 j- U6 J) F/ p8 h/ Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ Y  _8 f0 ~; m$ }3 D; w$ C        }6 B, k# c9 a# y3 i
    }
5 k3 \5 `1 l$ Z9 d3 W& ~9 j; H" E

; X9 k/ w. M5 x) `. m* C    return true;6 g/ b$ x7 x& d5 O* s$ G* C
}
( V. [8 V7 ~( m! c1 R3 b
: N8 b8 b) ]3 X# D, i6 Pstatic bool server_upp_data_send(Server *server)8 D4 `/ D, ]9 L3 ]9 D
{' f/ P! s" U. f) \& r6 e# G
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 F% S( k7 v  g5 U        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- D- K8 w3 i! n7 j
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# I! I) w$ ~" x; _/ [& U! q
        char tmp[128] ={0};
1 W: q  j, c3 J. A6 W/ t1 o9 l  v8 x7 ^+ K
        server_msg_send(server, APP_CMD_LOG, "upp send: start");, @, a4 s7 l1 m! B1 ]) ]# K9 g* S
        print_log(server, data, 64);  A( D! i: J/ B9 b2 g4 t2 b1 G$ x
$ W( m! m/ F- m8 L. {
        //
9 Y6 H" a/ A5 f) F, A  I1 X8 a        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, ?1 m5 y+ E& C5 i4 ~% R        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% x0 |3 I" [9 q' v        print_log(server, upp_buffer_b, 64);" p, S& j  p9 U1 N$ Z

2 E  u3 q' A  h0 Q1 ~( ~        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ \: k2 a4 k6 I! G" |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
' L( d% t, B3 l! E        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- ?8 j- I  V+ f' Q# N! _' N        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' Q1 I; ?" E  y7 Q3 W, K; n+ y9 E, c# o- c' i
        memset(tmp, 0, sizeof(tmp));
% X& g# |8 q& N6 k        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & }; F5 ]* z- y" i4 Z) g/ Y! v& L! L
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 q' o7 d6 X8 p. b        server_msg_send(server, APP_CMD_LOG, tmp);- S( l/ g" D9 g5 z& J9 U
9 F* k1 ^! E2 t
        upp_error_count = 0;1 |- l+ v+ H  `: w" |! M
        upp_dmaq_int_cut = 0;
2 d& i: E2 p2 }. V; ^        // fill in data
$ X( E* I9 E5 S8 k+ j! X1 Y* j        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 d! m6 K4 @6 Z5 p) J1 ^+ J        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& x0 V. T5 `; v, u7 {& f( ~

3 u  q' T5 `  {; N4 U" |+ d# C        // wait send success
' [$ g8 A  ]3 C/ K: _        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
% v' D7 [( z& B) ]+ N  U% S. {5 N* A* ~  e7 ]" c$ ?: F
        // make data node in free list
- V# x  F7 c1 j6 h        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, A& _, k! U7 h5 G! _        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; e$ ]- ~5 X  Z  ]) q0 k0 u    }
% w2 ]( ?* h2 B- r7 _2 @' h$ Z    return true;
" P8 }3 n; B% o% v" \  ~" D: {}
! P2 k+ ^1 Q% @$ J( k& b$ h: I; }- @3 @7 ~
7 d( t; R1 G) R9 D4 F) u

" o9 }/ j& a9 n% p

$ d0 s% }4 w% \- l# x
$ D% O  `7 H, E$ N; w+ P# z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- L( D# z5 ^* ~% ]; A
0 J) ]# Z8 I* d$ R3 i2 Y. \8 p- y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 13:18 , Processed in 0.040350 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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