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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' e2 [8 Q5 }+ H$ R, d) O3 K2 o" `3 \+ a0 d
问题描述:
+ A! t+ f  l4 v9 {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; a; A; d1 z2 s) u* N8 P. t) U; N7 q

' ^% n5 |3 d- z: ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. M6 i- b0 A$ K/ R" M6 p

( H3 M/ _% X0 ?测试结果如下:  F( b" l/ x  }1 F* u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' A) j: m6 a+ R3 H( j* t

- Z' S/ y1 a1 b4 v5 z
# P, p1 s9 u3 O4 g, U- R备注:  {; y  z% b. K8 ]- K6 W+ O
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: M, l& R9 r% h0 o
2、相关代码如下:
; I+ q& n4 @2 \/ O; b2 G: P//UPP DMA缓冲大小512字节
) M! W  M# v0 q3 }" ~0 V#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍& @4 @. R& M/ Z& ~) D# i, q
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 O: E, |! ?$ I4 x( `$ _7 d+ _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 }# k# v- |) \# Z, k2 S4 [; v! v' l# K
, n# {% n6 J6 ?) X0 a3 s
//upp接收、发送buffer0 Q  F% J  E+ T" {( N0 t) U
#pragma DATA_ALIGN(upp_buffer_a, 8)
- N3 ]& Q6 L2 r; u#pragma DATA_ALIGN(upp_buffer_b, 8)
; \% ^) l4 A# b" b- r! G) v  \  }
( J$ x1 X' P, [0 i8 H$ w0 H& xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
  G$ B9 [& `3 G5 ]( n3 D6 l) @unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, Q6 \1 f( }: G

. u5 c& `8 d1 {2 A- n9 V7 \
! }: I+ _5 K0 a. w, y% t9 kstatic bool server_upp_data_recv(Server *server)
8 l# h+ N1 W. j  m( {' u{* t% Z* m5 ^: b& S# c
    if(server->upp_channel_a_recv == false) {6 O/ ?; p5 }5 z# g- C
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ U& p* g$ n( X* Y8 D( f        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  S$ }+ n) q6 P5 y' V
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ E0 ]( d5 ?8 i0 l* S

5 Q. k, Y+ V( q( S2 ?0 Y' c2 [; y8 n# I
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 N! ~" t4 ^: L, Z* U6 z! O
/ `0 ]7 y3 s2 G$ A
            server->upp_channel_a_recv = true;//
8 s& E& w/ A/ S$ c; }  [* o( B) L3 i            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# T. [' D4 w4 n2 E" z, w9 a1 p. n) g            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 }9 t1 ?* j' t+ f' q* ^
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 @, j- a6 t( d2 _
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% @: [- E; u& |& N7 x
2 T9 N7 ]- Q) b. c
            upp_error_count = 0;
  R7 @, `* U  F5 v* H/ |& P: Q' G            upp_dmai_int_cut = 0;
! X' c* E$ u( y& B4 L# F( w
& t2 ~3 P5 v; F8 Y1 [0 _0 B            // fill in data % |. p4 W; {1 M& e  ~2 ?# j; o
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" ?* C9 t  \6 R% g. R$ p            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 Z+ D$ n& F4 _0 y  K1 S- p! U
        }% z4 g/ x' R& F; |
    }
* e5 X* e+ }6 l* K    else{
7 y% e! ^0 v) @4 E9 k5 [- `        if (upp_dmai_int_cut > 0){
# I, I4 g9 l( c! H, c" z            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 Q+ ^. x% H6 e; P            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' P, c) l) K3 \* o" _

# g# y  B8 I& N
5 B6 u3 R0 M) k, N$ u1 d            //copy data to upp_recv_list_busy
7 b  t$ N4 N' B$ |' d8 r            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 P* {5 d) E" S( J% S
# s$ b: l* _9 W% `# \* v
            //
# r5 }8 ?, d$ X4 P            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: Y2 O# ?' x8 H; ~% R4 V/ _0 U* e& Y; g7 C* x1 q5 c2 O# q- g
            //6 N4 p" ?& A9 B' u1 h& K8 x
            server->upp_channel_a_recv = false;//
' f7 P! e0 Q3 `/ J: ]7 D, E# ~0 Z- {& |; ?5 C' _; \/ |% p. m( m$ y
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: A, n5 Q3 m. H2 b
        }7 A7 A* k8 U, i# `9 v" i" _& V. ]
    }
; U+ P0 _9 T" ]- L& D, ]# y) Q0 n" e7 E1 J

$ C" e, V+ G, r! z* S    return true;
+ T; s/ v3 }2 a$ G}4 c/ o$ Y/ |% g" J+ q6 \3 b

# z6 ^6 E. h& o+ r. Estatic bool server_upp_data_send(Server *server)( N3 [# N) s3 u6 W( U
{
! F0 j1 M0 z) S    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: @% t' Y% m2 L1 R* [0 v& B
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);* O# d9 Z  j3 `: V  i, U
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( P# ]( \; G  p' U# g0 n        char tmp[128] ={0};
: Y/ ~: @7 Z9 u5 V+ f* f/ U$ B  E" i+ S% Q7 D+ ^0 @
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; Q' [- {8 W! z2 m, k        print_log(server, data, 64);- H  l1 |9 s; ?# F; X9 v
8 S/ F7 i% m  T! s8 x
        //
$ P& k( G; f0 _- Q1 Q        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ e- f. K" t9 h6 V        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
8 Q! ~" T4 A4 I/ \2 K: O1 D' \2 B% W        print_log(server, upp_buffer_b, 64);4 h8 D; g  A. `4 u/ Q- a3 u

2 ^' o8 X, U1 Z/ \9 ]. {        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);2 i" M9 e% M0 l6 ^% e8 d
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 4 E3 n" q1 ^2 g* ~& @) q
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
' T3 L" V$ Y) l  F2 F        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  h7 T& ~# m3 Z5 q" c; g  u: F! T( ^) u* H- f2 M
        memset(tmp, 0, sizeof(tmp));- `: g/ [& ]2 A4 D
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ ]! m: B- ~& }6 l- K            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 V( Q7 p% P  g- N. l( @        server_msg_send(server, APP_CMD_LOG, tmp);$ V! t& a2 s" W' T& Z7 O

/ }3 j- i% r. L# r4 C* D5 G        upp_error_count = 0;
" j9 O& ~9 v& n7 g% [1 ^4 Y5 D        upp_dmaq_int_cut = 0;1 H$ @% n( l2 L, z
        // fill in data
3 Y: W9 l  J2 J' s2 R        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - F4 \$ W! E5 ^4 r7 ?# v
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 Y" F  y. Q* i$ S0 r2 k* O
+ w6 h7 d& k5 o& F% R
        // wait send success5 \+ M* k( g2 P; Q" m" z/ F
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - s4 ?# h& d, t( q5 M, [

% l* L& p  Q% S3 {4 |        // make data node in free list
0 S0 v4 d! M* M7 l) c        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 v. h: y0 D& T  ~7 v* s3 e$ X' E
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ f; l# Y5 d! {) d$ q! ^5 j0 j    }7 {$ H+ t& @/ k& D
    return true;
3 K/ s, s, |6 J+ R( [- x- g0 c}! E+ Y$ s0 f: H* w& K
# s- N! M0 d4 e5 N8 R& b. z
0 P+ _( ^/ X) S, B3 o. _
$ ~! m2 p# E% v; Q% V0 u

" g, Q+ [: x3 W# f6 P" e5 U* O5 s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 k& X8 d2 u+ \7 N

( K1 H! P  y" k# \" T2 a

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 14:37 , Processed in 0.042091 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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