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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 R4 g$ s8 k) o% f$ C

! e1 |+ L6 F) u. z) y! m9 Y1 }* X问题描述:
! g7 f$ S* B: x在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 D! o* E  G/ V+ |8 y5 {

  ^; I6 x  X8 g4 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 Y" B  Z( c* n4 G9 L

" _% _3 _. m9 y0 A- c测试结果如下:' d" b4 ?9 U4 J+ f+ W5 t$ P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) E3 x% }4 r3 M( ~, k2 z% I
- ?7 Q( W/ N, p' f, b
" b+ L5 d: u6 Z/ k; B+ s3 O, |
备注:, w: m; U0 G( q0 l
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" k1 H# X9 f4 f5 E( E) L
2、相关代码如下:
3 x! G- ?) t# a( \* {//UPP DMA缓冲大小512字节
2 P. d4 {2 E, O) e9 R$ E$ ^8 I3 E#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, i9 z+ {9 V2 V% \& v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 r* M6 V6 e+ t& Z! s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( A# d4 m6 ]7 l# g5 c
& p  P5 w# Q/ Y* U. p7 S( R; e* H, B* \9 D. o( Q9 ^; z
//upp接收、发送buffer; t; N$ T5 ^5 h, p
#pragma DATA_ALIGN(upp_buffer_a, 8)0 I  y5 Q5 y* a
#pragma DATA_ALIGN(upp_buffer_b, 8)
* }3 X9 T- ]7 A& H; p4 a0 Z, f9 l- S$ L: ^& w! w
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% \7 J; P. N/ `# H9 w. V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* `9 W/ J. I" A. A% t9 v% U$ G/ y
0 F2 V+ c3 {/ U. X& U; P. N; n
+ j. |1 ~% |2 N6 P  @
static bool server_upp_data_recv(Server *server) $ a8 v% q. t2 |9 p& d
{4 B5 r9 z, y: @$ \$ J/ V7 z
    if(server->upp_channel_a_recv == false) {- Y$ n# j2 n# G* q$ p
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 J& Q7 y+ @5 t, S4 e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 v  j% d. K( ]1 E- A' }6 j: @            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# {2 A2 a$ S1 T4 X
  T* l6 _# e1 Y# q
, Q7 H$ a9 ~9 L
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& l) c% h0 Y9 U; P  \  C, q7 T* g# s! y0 g( I# T) @+ O
            server->upp_channel_a_recv = true;//
( p% h" b) B4 a0 Y3 O            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);/ q5 M) g9 f8 g3 |3 M' J
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;# t) y$ d: X" ?! L3 y
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
( P# Y0 D+ N1 P8 f            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
! y* {1 H- f0 Q% G2 f# y% l$ ^) P! b! n3 g
            upp_error_count = 0;
' T( ~3 }7 x: U" x            upp_dmai_int_cut = 0;
5 e0 O, i- e) `% {6 d2 r6 T+ v
9 Z, R5 Q7 z- b/ L6 J: F3 @            // fill in data 2 B7 ?# z6 ~1 _! U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- ^- h* S" R3 S) X- n/ ]" |' x! L
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 h" k5 R. K7 x. K
        }
3 X0 k. s# F, V/ e# J    }( {7 ~' A: x$ a- \1 S1 H
    else{$ _' B0 A# N8 m: b( q
        if (upp_dmai_int_cut > 0){
; p8 A% {/ j( ^- @$ ?* F6 n  ~$ E            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) \( m% U2 N3 k  s; T* O$ j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 l2 f" g" W; V2 s( C
" g: l8 f3 K+ B% `" M' k4 I
, ]7 ?7 I7 ]8 ~            //copy data to upp_recv_list_busy
0 s* \- T# N8 I$ u            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 S& R! H0 T# W' u" J7 K$ G$ z! X% ^' v' [
            //
, K1 I7 R$ U+ n            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) ?+ B( {8 k  S! Y  J+ g+ N' n# N" L
" Q8 e, o5 J* w" w( n$ }
            //  W+ R6 f7 g3 e- W
            server->upp_channel_a_recv = false;//$ l" ^0 b5 t  j6 H2 @
1 P/ k' {: e7 z* P
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ \- V9 O1 a# k( j. R) s3 X        }4 _3 d9 k* `+ c- k
    }
& j6 b1 {% r, @( X0 V7 a7 c- e( w4 V6 C

* r: ]1 {: V( ?6 z  z    return true;
! w' e: ~- ?2 y# ~9 G$ B& R, U}- J4 {; r. \3 y  G" S
, k9 I# o* L7 _# ~
static bool server_upp_data_send(Server *server)2 m3 \( Z2 D6 R& E9 F
{: i  R2 f% j3 p
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ H% L- Z* t# `. s1 o# {# C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 ?2 Z, b$ d* b        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
/ c8 W% O! q" S        char tmp[128] ={0};
1 \' F$ P  c9 p# ~6 Z: R$ h2 ?- l
4 i+ m# P: V$ j" E        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. T6 O; n; h# }% p& K  E2 e/ G6 g        print_log(server, data, 64);# O3 X" w0 ^+ W

$ |; ^: |& e/ B( e5 q1 i0 x        //
! b% {, t4 M2 m( W& R7 A5 W8 W3 \        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" H! B# l, e* s# e+ ~3 B) T/ q
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 O( M1 L; q1 @        print_log(server, upp_buffer_b, 64);' h& J, y' q2 ~0 L" e
, D% `2 _% L2 {& s' N
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
' {3 z4 u9 f8 p  B  y8 `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- g; _" I2 w) J7 T0 c7 M1 ^+ l0 a' v        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
  B, R. U: Y% W. z9 ]/ W5 L        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 ^( b4 ?3 c1 q+ `# C# r
# U/ J- q, U0 R/ f9 Z+ `        memset(tmp, 0, sizeof(tmp));
# V6 X* Y7 {) s9 |' f        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + y  h$ O9 a0 K3 \2 r* w/ r
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( l5 j$ B0 ]& [6 ]  s        server_msg_send(server, APP_CMD_LOG, tmp);
% P  a7 l7 U7 Q6 @. p8 v0 {+ H
9 S& K+ b* ]2 q0 h: @6 d+ b        upp_error_count = 0;& H" H* t2 _; _" T$ o& f+ I% g
        upp_dmaq_int_cut = 0;
; @% r) D5 _- W  B0 s, U        // fill in data
! B( q$ K: N/ y# K        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 D+ w0 E5 m. {! ^4 Y- @/ U        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
: w$ j, V; W: |. r7 W
, a8 t: G5 ?- _6 N# u: r+ K5 N        // wait send success3 i% e4 |4 i- g
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ _  T' W5 u4 f" r7 g3 s1 g" @& F( Y7 A$ P: _! w0 X
        // make data node in free list
/ }3 T4 |/ m6 I0 N5 g1 t' v8 l        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% X8 E+ y+ R: E+ o
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ ]5 O' u4 z2 Q. K  z
    }$ Y# {% X% P, z. M! c
    return true;
0 Q: Y7 J# ~( y6 I" _}
- q' H) ]8 i0 O0 D  @: f0 i9 [, a1 a4 F; u6 x9 r
5 b/ U0 l) q9 e! ~+ i
/ @% _* W) c' _6 J( c, v

# {& m! z, G( {9 P4 N3 Y
! M0 f# A; C2 W- T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
& @. g6 z; R# W  `1 `# x6 @/ G' s: E6 r% S0 Y: U) K! `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 22:27 , Processed in 0.044568 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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