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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' p8 @$ ]- T- B9 h6 u4 u7 D
3 w# N' U. B  u; h) n
问题描述:! H& X7 E9 E: h# q+ l( u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 P3 a! A6 Y9 E' v! G. f6 E3 t7 k0 @- V8 }8 x$ W  s6 S
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 r4 ?( O5 F0 X
. m" R7 T! i* n; [. k5 ~  G9 u9 W# c
测试结果如下:$ P! l, x( {* F+ q! u% E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 w( e2 t) I" C0 `3 ]) G1 D* i( q2 d( q+ l$ P, g5 _

# [5 \* e7 _- w1 I备注:
, S$ D; E$ B* S* @3 o# Y$ q* T, {( ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* [* o+ x4 b. H5 V0 O- a
2、相关代码如下:
- j/ x) O( O  R9 t" v7 f; X//UPP DMA缓冲大小512字节; Y* P% _; w5 T1 f# U6 N" @
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ N2 [4 n0 \: \
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 v0 f3 }1 i6 }% V) a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- ]9 W9 X* C. @/ U6 X# j! V: ^$ c! ?. R( B. w9 v5 W

$ d* U) z( x7 g$ w" v//upp接收、发送buffer1 Y% x! f6 Y; Z  J, A# N6 R
#pragma DATA_ALIGN(upp_buffer_a, 8)6 v! R! k1 e( v5 M: B5 z
#pragma DATA_ALIGN(upp_buffer_b, 8)
- ~* P- U, d' l/ c- d2 T
' c% m6 @8 l) u& |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 e6 R' k0 k& D! e6 e2 ^# Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];! d& N  S- J2 d, H. B  C

& a' `4 r  u' B( O2 z  k: {5 _  z
* X2 i2 A( q4 N/ @  R8 Q1 Z. {- Z; rstatic bool server_upp_data_recv(Server *server)
; u4 D6 f& D$ J! e  w  y4 J{: I3 B1 `* S1 H" S- `! ?( I! D' E
    if(server->upp_channel_a_recv == false) {
  J8 J2 @* k7 v% j; }9 T" k/ |% Z        server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ c  C) s5 J# k* ~% @
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) i5 ^) T% K- M5 k
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 w, [# X8 i- j7 u/ j$ \( ]

; n, B; D; @& Q' W+ _0 a  R: x, T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 {0 X, ~/ j+ l" Y: [; Q; k6 r

! a( U, l7 X# P            server->upp_channel_a_recv = true;//  X. f; |, k4 O8 ]( B! s5 N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( f" \* K5 ^+ e) _& r) x$ c1 _+ N
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 P' b( k, l" _/ c5 {/ V
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 ^7 \# d; N" K) ~; X1 H# g  ]            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  X9 W+ n! n, [5 T, W. I/ S
9 T- S8 J/ @) X9 v            upp_error_count = 0;
8 Y. v  {8 X' [3 d5 t            upp_dmai_int_cut = 0;$ |' r* p  h! `7 T" o4 [9 M: J
* F' ^% L9 M7 |% |& w
            // fill in data 0 ^: e1 L6 u# J! }" R3 X  @7 Z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 y3 h0 x) t1 X+ d
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 c  l. d3 w0 \" r2 I0 i
        }3 s- @; R/ E# R( I9 f" p
    }
* j1 F( F: [  p* o    else{
; ^+ A  m3 Y, i- V        if (upp_dmai_int_cut > 0){
9 O( C! E' B' |! M( K            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ H8 [/ J. s3 b: C7 _9 S
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" i0 ], }( Q) Y! _8 O

! {0 J  q. @8 T% v, C
3 y+ M: Y7 |$ h6 d! \            //copy data to upp_recv_list_busy% M; ^6 o! c5 }- Q  f* U( k) {, J
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 [  ?4 ]. Y8 ^) x2 e3 S( a8 i
. G, @, g# }3 Q  Q( b0 f* ^
            //
" b5 T8 C) f; ]; N, J" g            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 N( J$ l$ `+ m- J4 A4 [  s
% ?4 h# _7 y4 d4 E# d& I# I. B
            //
# K! e8 ^! a9 n, [  r  P3 @1 G  z            server->upp_channel_a_recv = false;//9 q* n  A7 ]7 y% O* w( ?9 Z

7 X1 t8 e# G0 g; P3 Q8 p0 g/ J$ ?1 p            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' N$ K) h% u, p- q" ?2 C
        }
, l6 _/ M4 @/ k* u1 i2 J# Z" N1 @    }
3 F8 c, @& ~- n3 R* x+ D( @7 S/ W+ ?1 T5 A5 s3 m/ q; o6 l

1 j% ]' B% ?9 C    return true;  a1 ~* ?+ j5 e* H" E
}1 H7 a  p+ o$ ]4 E, ^
! z% d- E* r: u& o2 h
static bool server_upp_data_send(Server *server)
; }$ Q( x% ]7 x; m+ Y+ }{5 y  [# e; X( V# e8 K
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! T3 |$ H" x% z0 a! E( U        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& Q: n8 C9 Z) [, p, K3 s4 J% U        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ J9 i% }% V, g) u7 z  a        char tmp[128] ={0};4 O  H* E$ Q! V- d

1 N4 T: o8 Y; N7 M        server_msg_send(server, APP_CMD_LOG, "upp send: start");- `& n" {5 M# @% T/ J+ K
        print_log(server, data, 64);' U1 R8 D7 b0 m

3 Z3 I, D5 ^& p$ \        //
" T& k) }+ W3 r, l/ ]# D        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& J  V- {3 D& j8 X
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" @: L- p: Y& y5 @1 @2 B7 o        print_log(server, upp_buffer_b, 64);
( m8 y, x9 B/ _+ U$ z
/ x" y3 @" Q* |3 B5 `" |4 B        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! ]7 T( K  S  t0 @7 O        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; : W4 u3 s9 \2 ]. V% {! N
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;2 k/ L7 T6 ?% a6 v9 E- n7 T" ]* D
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; f" y( K, P1 u1 W' q

. x. {& n+ M, d4 U0 h2 s! }        memset(tmp, 0, sizeof(tmp));
( K4 I+ y8 i4 ]( x" n) A        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ Q1 H; K; J( [. C# l) r) v; ~
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ |5 s8 k/ k! ~7 c" R2 x5 |        server_msg_send(server, APP_CMD_LOG, tmp);% s# Q+ ~' Q5 Q8 U
; n, E& C0 l8 z! U% |8 B
        upp_error_count = 0;2 D0 y  R+ V& N+ d0 |* ?+ q2 S" ^4 n
        upp_dmaq_int_cut = 0;
+ D5 z6 o9 n$ n$ x! Z        // fill in data 9 n2 i# L  K$ G6 x3 D2 f
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) d2 e  I7 ?8 `( u4 i6 E
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  P9 N+ M# s8 C$ \5 ~9 m
! m, _9 m5 S- B        // wait send success
8 T# Q$ @% y, ]- K/ G( \        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& w$ Q/ {6 [6 L2 s3 m4 f7 R( y, S; D/ Z3 I' v0 f5 R( _
        // make data node in free list ( N" R- x1 D* I$ u0 l, t# t" ]
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% }' ^, M7 ~, ?$ ~2 }
        server_msg_send(server, APP_CMD_LOG, "upp send: success");& ]4 r0 x: w4 ?5 r( D4 Q) U2 a$ F
    }* O; c! s* }0 S
    return true;
' C) ^5 X, q* @+ T: \}! s6 V; r' M0 s0 O$ Z
, W" f8 ~/ E+ d: T' q6 A$ L0 o) c/ v8 N
( k, c7 h8 u% h5 v& a

- N8 v0 R9 d; i6 U5 @

. S$ t0 M8 I) K) b" w4 Y2 S2 H! T( r" S  f8 J( O( z! l* P: ?) u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, c- _! T9 W, e8 L1 T' R; Q$ W1 C$ w5 Y  \! t( k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 10:45 , Processed in 0.044374 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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