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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 H% a& e# U! m* z* J5 n, y" J' \2 \7 w

/ b( `) F7 H! \: X, Y) r$ G问题描述:
. J; Y/ W$ W; q# Y2 D* \: j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 S7 B9 Z8 ]* }

3 ^5 i, _  t* `% d  M4 b3 I/ E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 f, P- S* y+ ^7 K9 _

% G4 b3 D% V' t4 F5 z9 q- @测试结果如下:
4 e6 G# A! I' ]9 @/ o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ x$ @/ O: d( h% j: l. x
/ B8 v& h7 i( ~$ j  t& E( P
0 J) J$ p$ J" t6 X6 o$ }" p/ k$ T" q备注:- n- t% K1 r6 ]. C9 d0 ?1 X+ u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  Z! A8 ~! u( @, p, T5 X/ t
2、相关代码如下:
7 a- z( y9 v* _7 J( S0 e  \5 @, g//UPP DMA缓冲大小512字节
% c4 D4 o, ]% w% ~7 d#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 l9 A) Y$ p) ~; n; S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( C- c" _8 ?# L. d6 l8 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; c- s6 O# Q/ x- J, V  {5 R+ m+ y" }
( M& h2 L- F+ q1 C8 f% w& v* C- j8 j: B7 v
//upp接收、发送buffer
, N/ @: i$ m( @# [& ]- o& B' c5 ~#pragma DATA_ALIGN(upp_buffer_a, 8)9 B+ C$ S0 P2 c* C! D# |
#pragma DATA_ALIGN(upp_buffer_b, 8)8 d+ J9 O, @9 [2 X1 f

, {5 A5 c, T$ R2 {4 D0 ~! B: kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, s) N+ P$ N  D* v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# b/ M6 W" W3 Z" I% [* @2 R
$ S% t& C, \/ s" v" y  l( s

, U7 h  _& I  k0 `) P7 [- g, _7 _static bool server_upp_data_recv(Server *server)
; P% P% c2 ~( S$ [{5 Y2 j- l% s+ v2 m+ C* @0 H
    if(server->upp_channel_a_recv == false) {
1 G( u. l/ H7 {5 X        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ ~* }8 l$ |" y, _8 l! k        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! q/ v0 c2 C" B: k3 V2 r
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# _# T0 m9 n: H) g- A. \$ C. {" d" j% ^! @1 D& }

- Q( L5 g, x+ o, O% E+ A            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& Z3 m' d; r# o

. a6 v/ p' w; R* u8 B5 S- O! `, n            server->upp_channel_a_recv = true;//4 k8 W; V. `% m; c+ ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);8 V$ J# e5 X9 K! m# m+ w
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) Y( N+ m- h. {* `
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: s3 A! |! H% p+ j6 |            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ J; `7 J9 C; d; N) A8 N# ~
! @& H& e& m9 X* x
            upp_error_count = 0;
3 _4 J: N/ _( o1 z4 W$ L6 Q            upp_dmai_int_cut = 0;
4 B# @# H) M* W0 n+ m% p. g2 O+ p
            // fill in data
0 a/ ~: ?2 U0 s' Y            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 P# s5 |1 t& J& l            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 W% \  f( Q7 K1 ^# a# w. i
        }& t9 F" s4 w9 U
    }7 ~, I  ?+ Q  n8 l, Q& n) r8 _& }3 f4 Q
    else{
4 \& d& P! c9 m4 C        if (upp_dmai_int_cut > 0){7 ?0 d5 y5 |8 k. W
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 b3 r3 D) P# J) z% M/ j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 Q1 a3 i! C: `! W/ {8 }& E6 p: u4 A2 Q$ O. u3 f$ Z; I
, G/ y, _$ |* h
            //copy data to upp_recv_list_busy
- I; ?% d1 _  \: q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ ~! w2 F2 q5 m% M  s- ]' L  ?
            //, H* q1 x. o' |. W# o) a, [
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( {/ }, x$ z, D/ k/ t7 c9 x
' `7 p( {3 \* {7 \- Q
            //
( c3 W) e9 r- K) }            server->upp_channel_a_recv = false;//) \2 K& N6 [5 J9 o1 F4 p
: [' _$ U' p% ^/ L& a& q; h" {4 d
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ E/ E" \3 Y5 ?' c5 i2 f* h/ b
        }' d4 L/ z" t6 W0 q
    }
: l& {0 _" l7 Q, I- m+ o
2 @$ j& J# C& H/ ~: M" g% t1 a
, y! M3 G: i" d8 d2 C; o3 G/ Z    return true;
9 j) C: N# K2 _3 T}/ h  ]4 d6 G$ M: U4 w

1 R+ i6 r/ X  o5 fstatic bool server_upp_data_send(Server *server)5 d$ Z- M  [. A
{
( v8 {2 T; `8 b5 E2 y1 g( I- b    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% j8 ]3 E$ w: J" t1 o. a        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# x4 _/ f: t& L# u$ ~( w5 X
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- ]+ f5 Z* ~0 O) w0 r
        char tmp[128] ={0};
2 D+ `* e# f4 [9 f
! t  X$ f9 K2 L" R9 N9 H$ _        server_msg_send(server, APP_CMD_LOG, "upp send: start");. t2 u, p0 n7 L" L, V' B
        print_log(server, data, 64);3 R. d. w: B; T

0 D% Y" W* B8 O+ Z; F        //
5 |7 r& H; I) O        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" W; D  X7 R5 y6 A: c2 v* f  Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 b! n- v) `4 S" H/ N) Z
        print_log(server, upp_buffer_b, 64);
' a) ~+ {. J" D6 M4 r' B6 X) k! N" Y% s7 @% e8 P  o
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* c: c* p% D8 }4 H$ |        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 5 O) e  i8 s$ z- D' n% E2 [
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- o. q4 V$ I/ Y( a: |6 E        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( O5 P4 b9 ?" W# `; {4 \
5 q0 q; i% h- A        memset(tmp, 0, sizeof(tmp));
8 H" c/ T1 }8 T6 }  k  k        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; h/ ]6 r* x9 W$ G0 h  z1 Q: K
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 d4 J9 E# C* X0 h" S. e% q9 [
        server_msg_send(server, APP_CMD_LOG, tmp);
- B! P, M* v" G' P% s1 ~
( P# p( B& n8 I6 _) v        upp_error_count = 0;
% B) g; l2 A0 @' @. {( |        upp_dmaq_int_cut = 0;5 C, a) E- K8 u) i
        // fill in data
% G) m6 z% [6 \1 r8 R, C0 V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & A4 X* s+ U7 t- ]" w
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ T3 _$ P4 I, y6 |- |+ H' X7 Y
, S5 t3 ~6 s3 i: }' ]+ E$ w
        // wait send success
7 \8 Z% x/ _! G/ W0 R$ \        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 K7 U3 p; T  `/ l
2 Z# w# B1 v# [        // make data node in free list
6 W4 {( o7 z9 m' x$ y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 C. O4 Q' b9 l) f, |1 `* e+ x
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  S4 ?3 W. y5 B# k    }
# P- B$ T6 H8 n) h! m    return true;2 W( }* G" j! J; L
}
, ^6 {' j- A+ G, d# |. w
- n6 N0 }; {& l* M! r2 n$ X0 [
; T; ^! G( M3 d) Y% B9 p/ M. @

! o% b# o0 [2 R5 ^; Q5 U
" F0 `$ E9 f  K" @9 f  v
" b+ S* V# t! j2 O9 L

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐7 a# T7 Q  P7 _+ @8 \6 q
( z1 f2 Q, D# W) D6 P2 {$ z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 07:54 , Processed in 0.043805 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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