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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, q4 r# u9 z+ y/ R
7 A0 x5 |4 V2 a" e: N! o2 `问题描述:+ q' f, \! `- Y* Y/ O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; T0 e2 V- c; G: v) v- ^* Q8 \
$ t9 c; |# B; P' ^2 G0 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* l7 q4 C6 j3 v8 u% n$ E$ k
& ], d, F/ y) u
测试结果如下:
# J, R' Q; G7 @& {6 E! i138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 U' Q% w8 ^0 g) _$ {5 O% Z$ B: P5 N% w3 L

3 E8 i4 s- ~6 ^0 C  s备注:
2 Y" R5 y+ p6 U# \$ M' v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 ~- A% j4 ~3 ]7 T6 N
2、相关代码如下:
6 c# [, B+ |0 Y" x# j# k//UPP DMA缓冲大小512字节0 l7 q2 g# t0 W& n
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) X  G4 `3 R8 V/ L  F6 f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 h8 Z1 ^& H6 x2 k' u$ u4 ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 A3 A" |+ u) I6 e7 e$ Y- r! w- g1 [1 J8 e" V

# k$ r( T1 t: A; f3 _8 }//upp接收、发送buffer
" W  l) p7 m: v: U8 w7 a( [' m#pragma DATA_ALIGN(upp_buffer_a, 8)
3 m0 P: {* M' H$ z#pragma DATA_ALIGN(upp_buffer_b, 8)8 P% K5 G5 j6 z- Z+ d# O
# k# s$ J; `) A, a8 b2 w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% z$ [9 A* Q1 j* M! Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, k/ s6 K+ H+ c

5 @9 \/ @' j* a7 o# y
1 U- g: p7 @2 N! g/ K* D& \5 Nstatic bool server_upp_data_recv(Server *server)
3 ?% z2 `6 I; `7 |$ A4 y' Z( V( y5 Y{
1 E; w3 ~) X! h; v    if(server->upp_channel_a_recv == false) {
' C% B& V. x: J7 `        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, B- ]' E0 s5 F3 V  F# q* j- K        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 D% o  G7 I0 v
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- b+ _7 p  t1 a) _

2 Q/ V: e+ Y2 \4 l0 J! @" I  V
! O- C5 g( o* w$ N8 Y8 q7 g: [            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 a& H6 a0 r$ Q8 x1 ]. N
. r+ @, S5 e" y4 V+ q7 n            server->upp_channel_a_recv = true;/// e7 I8 O7 O" b
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
4 ?( G5 K# `1 }7 p! S' v" a            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% [  n* ~7 C3 p8 }* j7 z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 V2 V5 J3 w5 ^1 V  D, M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- k6 I) G( w' @. ?
6 v& x/ k  w8 `! s- H  L            upp_error_count = 0;
9 j3 T6 b- y2 e% v% g7 t3 `            upp_dmai_int_cut = 0;/ v( s3 z7 J0 [1 {4 v) ?$ M
1 Z; ~3 h; X/ ?) [1 J
            // fill in data
4 g; p6 G4 N& S# {            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ p" U+ T2 @- U0 j( D; s. K. M, v" g
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");& D7 f* Z# X- o+ v# l; |- v
        }
) V6 I. G6 b% ~/ E# w$ ~8 T/ f7 K    }
8 f1 z3 I7 j* i% {9 x* r( h; g$ u, n    else{$ E5 M8 E" K# o! u
        if (upp_dmai_int_cut > 0){
- g$ u$ Q  Q" V$ T' ~1 l7 x            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" o4 s# {7 b* A, ?" m            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Y6 x. i3 y' [) ~9 G/ M, z6 t( c+ ^( r  N
0 q8 W; H. ?9 Q" T1 {+ Y$ E; O+ t
            //copy data to upp_recv_list_busy7 @4 t4 b; t- l
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' Z" K9 h7 Y; a$ p8 G
( n+ _1 M, o! y- D' ]
            //4 u- b+ `  Q! ~* h+ V
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 _! L) x/ a1 K/ a. N% M& A" f" n

* k. U' c( g8 ~1 t# j7 G" v            //
' e, ~6 ~( I1 k2 \, w& I' l            server->upp_channel_a_recv = false;//
# |+ {: t+ l- t
( U& Z7 p+ r6 n1 v" u5 w+ t            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' s2 V' C& s- h/ E) E
        }( K# y3 r( j. P4 W$ a
    }9 D5 r4 j  ^# C7 C; h5 @

5 B1 F2 ~& I* G
, Q4 E0 T5 j$ a    return true;7 V) L) E9 g- l( \. y* e
}
2 X) V& z! B+ o' [- q5 l. u& D+ w# X" ~- S, ^+ B; z: x( a
static bool server_upp_data_send(Server *server)
% w. `% l& O# m& e8 h{$ p* y0 Z9 L, \- t: }- H1 j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ]  n- V2 l3 U6 |5 J
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# |9 A1 [7 x5 r. H6 q; l7 ~% Z& Q+ _        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 b) h( j9 G3 b' `& C! }        char tmp[128] ={0};
& Z' U/ q! \/ u7 B
' c/ v) ^  J. j& @. z: R        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 V* {0 u* T# b6 |: R) {2 s) Z: ]        print_log(server, data, 64);
/ X8 b3 ^: ~+ p( R; H8 z1 ^/ G* f. m# Z6 Z' t% V  O4 ]
        //
3 ]+ Z. v7 @% A. h        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
  H1 H3 @" a2 F        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# J9 C8 _' U+ T" V( t, S7 p1 O& b        print_log(server, upp_buffer_b, 64);
+ X% Q& X( a! H( ^
* E5 i- |# u/ `# z; {7 u        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( k  a# J3 x  ^/ \7 ?
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # x0 p" j( _4 C
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;6 n3 ?  c! F3 P5 `# S/ p
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ S' V" a' B3 n/ l5 q  P
( N# |; b6 G( P( N: ~
        memset(tmp, 0, sizeof(tmp));
8 I# p/ l) U4 o, C$ X$ d6 L        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! J7 p. x8 W5 R' |+ ~' Q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# f! b; X) y  \1 f* C! q0 l2 Q        server_msg_send(server, APP_CMD_LOG, tmp);
/ g& m) B5 b3 i
$ z6 j6 H9 `% n3 \        upp_error_count = 0;( f6 E  F: L9 R  g) h
        upp_dmaq_int_cut = 0;
, `9 p, F  ^3 `) f* I2 r. t- R        // fill in data
! U6 w0 \' Y" E: \/ t' v" z6 u        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" ~* x7 k9 D7 H8 a; d& G+ i+ K        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 `( J6 y3 M) f1 C) z- x' Q7 x$ @& d: P
        // wait send success" h: f% @; z" t- v
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 T& w% d  s( J& c. f  S0 W8 _! m, Q  k2 ^+ ^5 T9 _& M
        // make data node in free list
! q% L* [# n: O  w0 v" P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* X$ F  N- F. i0 p  h6 i
        server_msg_send(server, APP_CMD_LOG, "upp send: success");% m6 W! p3 g' q
    }
  b1 G& ~* \7 `& C    return true;% g4 U! c1 ~8 N7 E5 x
}
4 K% w' L% t( P5 ~0 ]! V! P& j/ j) C5 r1 \: K

9 M8 E5 `' y1 a, q' a/ S7 y- V) u4 d4 ~  B" j! O$ ^4 g" j

, Y( w1 x+ J' R  _9 ]0 u2 A- w. U
# G3 g# j6 W& r2 v+ x: l

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, V9 k: B( ^% b/ u3 g( r3 p
# R4 _2 `& {% t$ l9 [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 10:49 , Processed in 0.044017 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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