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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) Z0 {, J+ t, d* a3 ^
4 ~- n9 h/ D6 t' M2 f$ U/ C3 [* C
问题描述:) V# \/ s- C' @4 J  w% _/ q# B
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  K/ A" E4 ?1 h, H- \) F
: R0 K! z2 [; e" `2 m1 t" L
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, N" f$ e4 _1 n9 n' F% y

' W: [) W. G% Z, S9 X' y: s测试结果如下:# y' j. x- q8 q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 d9 _, A6 A0 P8 r1 ~- |$ p+ Z9 @
7 m+ x6 u$ t( I
3 U! k  ?$ f1 J. ^% k* P备注:
3 m0 x! E$ r! A& A1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; F7 X* w! M# ?' o9 c& z/ |0 N2 ?
2、相关代码如下:
/ p+ C% h4 b  d5 V7 ~1 i; R//UPP DMA缓冲大小512字节% j8 n+ Z& w. C
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 \2 R+ ?% c/ G! h0 Q: v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( D  D+ J1 e: o5 k8 f#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 I2 i! `) i8 K, y4 D) s3 Y  t6 [  s5 ^

; k# ~: `, U5 Y  P: G//upp接收、发送buffer8 E8 h& _& E8 m' p# ?1 {  C
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 b( O3 y) a7 F#pragma DATA_ALIGN(upp_buffer_b, 8)
, x6 s$ {1 r: q1 ?2 ]1 Y3 \
9 p' \5 |1 }4 A) v4 l0 H2 Hunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* K7 \" @% X7 C: H7 {" d4 B2 o- R# L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" L  ^+ Y& X2 l! e6 Y
0 X8 J# a7 ?) P% n
+ c/ K- e! S  R8 F+ [  [) ~static bool server_upp_data_recv(Server *server) & R2 i& o( j8 Y; _, d$ B* M% h4 _
{/ r( G, B  s: a0 @3 D& B
    if(server->upp_channel_a_recv == false) {
" G; K- M4 v7 P& g* y: W  f        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; y+ j" e5 n2 R; _# {        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 d/ P$ a% R/ |* d9 u. Q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 z3 B0 {# E. F* V$ U2 b

! _! h# U6 q$ X: Q  W
" C: }# m: q8 v- {: i8 ?  T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 @' `4 ^, e. D- N% z$ n5 t% h

( p5 L" b) v2 s0 w; Y  h8 P) q            server->upp_channel_a_recv = true;//
; a& |  {% |9 P$ b            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ ]- p/ {2 a7 i2 R2 A8 ^% g            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 o! _' z3 `9 Y+ n2 L1 c3 x            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
3 |# @) y+ o$ D3 c/ ?            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' n' {" v8 u& a- U
. {) ^  ~1 S) ^5 n2 o
            upp_error_count = 0;
1 f9 h: ]: q% }- d( A/ v/ v) C            upp_dmai_int_cut = 0;0 {" _/ i$ S7 ~7 ~! _6 {/ h

. P' t7 F4 X: x0 h7 g+ ?1 _, }8 R            // fill in data
/ K/ w1 I8 O8 P; R1 l            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% Z2 O: |+ p5 x( v1 q9 K/ A( ]8 p7 x            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");8 {2 x, z6 x0 f" w% q
        }% ^: y: c& o2 n0 X
    }) Q- Y) I0 K  A: R& d: C
    else{0 F4 m2 M0 `9 D3 x; P" P* i, s- C
        if (upp_dmai_int_cut > 0){
" {- J3 g% S  l6 X# r            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& _) R! V; y6 H( p3 g# j9 I
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 Z8 J1 L' ]; w( U# q
( _7 I1 S5 ?8 w+ o( t) W# r+ N

/ A) k. k: v' s4 ]' _            //copy data to upp_recv_list_busy
' e, X* v3 X. v% \4 T3 Z% E6 e            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 I, o/ |6 [& Z& P$ z- V* i# x# @
( d) T, h0 @0 z/ ?
            //
! w, G+ A. W& G& V/ r- e            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 Z5 A6 v( ]1 x7 O1 t& Q0 T( r

; s. ~* I& v" p7 i1 p7 J7 C            //
8 |- f' V& K7 h6 e  I3 F( `" t( r            server->upp_channel_a_recv = false;//
) P" @0 L) D: n0 @6 I/ @% Y0 A
0 S$ k4 z4 `3 }4 u3 j2 w$ z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- j* k4 g! t' e* Q& I1 _        }( H9 `- k" ]; B0 E& |
    }( u/ s: F" m% H1 O. O2 [- }

* ?# L6 }% X6 t; i0 I. r0 T
1 U( @7 {, Z3 C4 F7 D8 Z! y    return true;$ u, A1 B# l& p" `7 F* I# ^4 d
}3 g7 x& r. R7 x3 ~; b% N

3 g+ {2 i( ?5 K: l6 L5 A% Pstatic bool server_upp_data_send(Server *server)0 p( T0 b  r* K& L
{
8 w  P0 k+ I* X; X+ l2 R    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 }1 q' D8 c/ ^8 N. ^" O        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 l" V/ d! y; \& ?5 T; n5 C        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; I  a7 I5 n' J' J( E( w        char tmp[128] ={0};, h! E7 H8 B8 x( S0 |

% v9 R0 F* S3 t3 Y- Z# n# K        server_msg_send(server, APP_CMD_LOG, "upp send: start");9 D$ S" i* W1 S
        print_log(server, data, 64);
2 Q  d% `5 F8 y4 w( W$ J
! M- t4 }4 t' m+ y3 O( Q- t. k        //
9 U. @% A( n- g7 D3 \! a' f3 l        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' e3 f% `: ^: S% N' k7 D0 q
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 T* M0 K0 N3 L1 n- i0 `
        print_log(server, upp_buffer_b, 64);
* X6 ^/ s  U( M- ?# e
3 B; O! K6 O% }        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& Z0 X: {2 d) H$ U1 I: j! h% E, D        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 J+ O2 g* C3 W! e        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
  x: B3 B( S- A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: W5 c  }" B- m0 D& j- P
$ Y8 z9 O. u" _$ @8 J        memset(tmp, 0, sizeof(tmp));
4 Q+ _$ H+ g0 B) A- S  P" B        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; T0 R6 @6 V5 T" i
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) e# t0 |  a2 i+ D; E; M1 t
        server_msg_send(server, APP_CMD_LOG, tmp);
) z1 q+ I7 g9 Q- K  K# m
# T7 Z; q8 H/ v  v        upp_error_count = 0;
* u% h% S4 ?$ A, ^3 i4 H6 i        upp_dmaq_int_cut = 0;5 R6 P! s$ S# B  K  ~+ B
        // fill in data % q4 z, H6 v' f1 w# d
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
  N) x/ f: B7 k: W% A8 P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 J( `5 y/ n# f4 m$ W8 E  u* y/ _1 R, |  {. n1 @: m; n# h2 }. k
        // wait send success
* j4 N' R! u9 v        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 s) o- {' |* R' `  u' x( M: v( m$ t4 C* M
        // make data node in free list % {1 o0 b0 o6 H* _( B" M
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);3 N  m" n- }8 R& i
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* v9 n! Q2 S7 u
    }: d6 I! s% |8 [
    return true;
  N; Q  A9 Q: b: a: `' w}
# ]/ @# w% \2 Z9 C. p8 e" f, Q# j5 b' C' W6 B4 p% d# K

+ O( e1 ]' I$ `9 b
: s8 B5 x+ @% {4 s$ b
0 \. h( N+ S& P5 q1 A" ~4 o3 v
  s3 r6 d& R2 N( y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐/ F4 f+ @8 g; w% ?; s
! t. E$ t6 A8 e# @/ r; f. Z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-25 12:25 , Processed in 0.049314 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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