138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 J& E5 v2 Y% X
9 z" V  M0 H8 F8 R问题描述:
# ^' f% O' i1 g+ S2 E  I在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 f( o% X9 u% a% \/ }% C

* a4 d0 W! G4 P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 c1 h/ Y9 j' D2 i# Q( s' \6 ?% D
$ r/ c0 Z0 d8 I9 L
测试结果如下:
$ l. b4 v% W6 r7 v- e" |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ s& u. `% u% s3 J7 P& a8 Q4 R# |9 }+ H, A

, L; Q, z, r7 C& r备注:
" n% S( y( T8 G1 b% g! ^1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 p0 K7 l8 x9 a, j, g+ d- A
2、相关代码如下:4 o3 D9 }4 w4 \9 [. V& \" i
//UPP DMA缓冲大小512字节
4 m* o) z6 e) k* R" j) B9 ?0 `#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍8 k9 w9 T. J/ B" t! @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( C' q: ^; r, S2 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" g" O! d4 L. H

1 P- \% s# h) A7 S4 T: v" W# ~6 L
& m3 z- ^+ l, v. v6 O& g! m. y//upp接收、发送buffer
" \6 @' }1 h4 B. o7 D#pragma DATA_ALIGN(upp_buffer_a, 8)/ r; D+ W! w/ z6 y2 L7 N5 C
#pragma DATA_ALIGN(upp_buffer_b, 8)
: G# v9 ^6 c+ s5 r& j  O" I: f# b' V, _* v4 U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; s$ [% z" d9 ^7 r: Y) uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 k9 W1 J/ F3 N

3 Y( D2 ]1 S8 Q2 V- \( @& u
) I2 n( e' t( ^9 G2 E$ o; vstatic bool server_upp_data_recv(Server *server)
9 a# f! G  _. C{
/ s' n/ c$ R' l: ]    if(server->upp_channel_a_recv == false) {
$ a. X- y+ a& D  ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
9 H7 @4 z% h. _6 Z% r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; W7 {0 B9 A- P- S" y* t
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' l- R; q1 |, A( S
. a) ^% t( W% Z: y. s' ]% f

) A+ A4 Y( E' [; h7 h3 Q8 Q- a5 E            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 S) g  F- C2 [& S; I) ?- X: `" ]; K  s" N/ ]" b1 Z6 \
            server->upp_channel_a_recv = true;//% S' F3 a, B0 U! C7 I
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);# a! }& M$ ?% u2 u* B) V) Y& [
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, Q! P# J) S+ c/ Q  l" v9 z0 T4 f2 Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 V$ S* u: j6 f! n0 ~  I
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" Y3 j  w+ f; T
+ M, ^5 S! c2 z
            upp_error_count = 0;! y* `, [8 l2 d& ]5 ^
            upp_dmai_int_cut = 0;
6 w( w( G9 Y$ l- s; Y$ {  v5 P) x
            // fill in data
" m1 P3 z9 t+ G) T            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 w( N: Z/ I4 Q7 l  B
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 |( M& v. s1 b1 W        }! [! u9 T7 m' M6 [" P: g8 N
    }
/ V; `2 J. S2 t- I    else{
" m, _  W$ w* A+ b3 U- |        if (upp_dmai_int_cut > 0){
4 D1 {- S! h$ J3 D, Z1 ~. z4 Y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);  w" F& f8 @' O: p- ~
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# E1 {& i8 H. m8 @; w
; W$ s/ D. ~- q( x) |% t
0 p# Z( P' {- N: t. ~/ V0 R' B% G            //copy data to upp_recv_list_busy
6 S' y5 ]8 V8 S, a9 C1 ~% [            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% H0 ?# }" W- S  W; @7 i1 c- r4 t- L* x, v3 v, f+ x
            //
' \' e7 m0 I( r) w            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. N6 ^- z3 j; f& M) T9 L* S1 H( @
            //8 M/ c  N5 W* B( T# q
            server->upp_channel_a_recv = false;//! L' z. x, E, q$ K- S! Q

4 U9 q* s4 Q8 z, a# ~            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' u7 ?, s- W& d7 A3 f0 Q: t. U
        }: z& m4 l4 |7 Z0 n
    }2 j+ w# i' i9 L
1 x# G. I  X- C
9 M! {( I2 L& O; p: R
    return true;
8 ?1 x. V& v4 Y7 l  v$ X; R- L}% N% s1 y0 S5 {: \% Z4 R! q5 {7 P
& ~' v! i" r6 d9 p; G
static bool server_upp_data_send(Server *server)# H+ ~+ r" T$ G! M* v: I0 h" x
{, ?( e" d# k! ?: W1 ]
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ p- A: H6 j) s5 I
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: J9 B, b( f- s: M. d2 E
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% f- M, E: u) [" r; K0 Z1 j- g& C
        char tmp[128] ={0};' X" K1 H1 J$ d9 T3 M# I! A

* S6 j2 x. r% ^6 @        server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 I5 }, D, @3 v9 L1 }1 R        print_log(server, data, 64);3 P( S- k' i( r5 D

' M5 ^% |4 u  q4 `) @) a7 y2 C        //
4 J+ N) a2 \& O        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) G/ H6 W' d" A& M( o* `9 k/ s- T
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, }) u- J! x3 l
        print_log(server, upp_buffer_b, 64);
' w- L- p6 G) M5 \) p2 V) d0 E8 e! ?. ~
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 X( g& a" V0 ?& Z( R        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
: I3 d5 [  J# z        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( J; ^7 R0 ?" B9 d1 Y! V5 T        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) v' p' ?( q$ [4 T; I. E9 A
" p7 ?4 T: E* u4 @  U
        memset(tmp, 0, sizeof(tmp));8 a# N+ M# ~6 v& R
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - h: B7 r& t8 M5 u% C" U' ^
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! X) [; x1 e$ V  v, t5 q        server_msg_send(server, APP_CMD_LOG, tmp);2 C! `% B- L1 w& C/ s" a
; ^- c$ u( m# C
        upp_error_count = 0;  e( W) z1 X; Z4 c% E3 v# i$ k$ \
        upp_dmaq_int_cut = 0;1 s3 [& ~/ _# F+ x' Q) d
        // fill in data
! H& V8 Q: f+ n1 K/ m+ V6 m        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * O0 W0 e0 d$ G0 e+ v1 I: V& d
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");4 X6 `5 R( U& l2 M& p' C; l

6 P& x- \$ P* \* J        // wait send success! R3 D* S4 ~( y9 c7 X/ _
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * I/ c" ?3 N) M

3 \8 `4 r" S8 ?' i' F# r4 N' a        // make data node in free list 8 N5 M6 H! e9 E3 B
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: A, B, n1 S& X4 q        server_msg_send(server, APP_CMD_LOG, "upp send: success");
# ~/ m) ~& D4 S+ A3 E/ x6 y    }
5 @$ W6 [; z& l* e) h    return true;2 `% U* Q1 q/ K0 ^
}7 j* K. N- u4 z

0 c  p6 V( D' b# t& d( @

# A9 E! w6 I+ G7 R$ q3 K' I5 S7 B" a

8 o) q* G( V5 ~! I$ V- S+ b3 l; W  G" S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 a# k/ g; q1 Y( z  z, E
5 g! C6 k4 m1 |/ S

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 20:28 , Processed in 0.045660 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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