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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 K+ Y2 M4 t0 Y! F+ R
  X+ i3 k) i7 {% e
问题描述:
% O$ a& e6 F* D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" U/ f& _# P4 s
4 ]; V( [9 B4 v. k& H" W9 _& C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% ~" ?. r0 V5 p- D7 O2 {* p# g* I6 C3 i
测试结果如下:. }% B3 w& D2 k+ v, c% ~  \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  C) z4 t, i6 N7 x
4 E4 c. p6 h& Q- y3 X9 Y% u4 j7 W' y
& v& l! F# ?' ~5 r1 x
备注:# W/ v& G! e! s  n. ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% T$ N$ B& E' m' [
2、相关代码如下:
3 N0 b2 [( z6 }' u5 c//UPP DMA缓冲大小512字节
+ Y3 b8 f* R% M6 B3 J. B1 u& y+ m& V( T#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 V) Q- s- k7 F7 J$ F#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" M0 `, W& R- Z: D4 d/ W% h0 ~: g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% ^/ r( ]  {- Y& I; o

. p. u* g/ Q9 ]  Z7 B4 R$ k6 P$ y  O! c
//upp接收、发送buffer
' u% G4 X) ~7 x. J5 O( F; v; Q#pragma DATA_ALIGN(upp_buffer_a, 8)$ j" O" ~+ J) \9 Z' h9 h5 O  H
#pragma DATA_ALIGN(upp_buffer_b, 8)4 P; I& z2 d( U6 T7 o
7 g, @: V+ n, _# m9 z  B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% z( _2 P) ?; V* s6 v' `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, a) c& A& ?  `% j  b7 C' s) @1 O! O  E" V) _8 T0 \

1 Q* P( h; x( F! xstatic bool server_upp_data_recv(Server *server)
' w- O5 K" g. P3 |6 B3 ]6 K) i! v{6 P; m- I! Z0 M+ a9 b& Z
    if(server->upp_channel_a_recv == false) {
9 N6 ?7 u2 d* c        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% C8 R/ N# k4 U% @; S4 I% E        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {/ ^  s6 M9 p! L& s' `' u0 W
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Z2 X# o: @4 L5 f! i: g
, A7 u( b! E+ u0 ?; s
; U1 {% R) I/ _+ \  Z6 z! @: F
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' Z( [! @9 H( B+ O6 @1 w$ @- d
# o0 n& u% `" h! b- p% [$ c
            server->upp_channel_a_recv = true;//
# Z1 n2 d4 v2 O            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ T$ |9 E7 E' p/ F! Q" y            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 i0 ]# i5 L) _2 W9 B
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;4 V( o" a4 M2 h4 b! u) B
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" W3 f, P- H( U6 }6 i: {) H- h7 ?
7 L# X. m% w( n: H. Q1 W/ T
            upp_error_count = 0;* R. W+ |( s& T4 o3 n% Q) y
            upp_dmai_int_cut = 0;
( H2 A: L3 f1 M( b3 J6 ?
. y# d- I5 I# E' J5 K' B' m            // fill in data 0 L9 p& M# r, }) K
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ]1 Q/ z, N4 K1 ^            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! T5 w7 Z+ _1 D        }( i( ]: C1 F5 u8 K* p: v
    }
, x9 |" K2 u1 m3 G  @1 F. u    else{
9 \6 F7 @7 I2 ]! @# P        if (upp_dmai_int_cut > 0){
5 M, n9 ?6 o/ p; z8 B7 P8 R            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) D  \5 H* u5 Z5 v) i  Q' c/ _8 i            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);2 I2 a. W8 v# {% ?3 d  s0 g
7 `, i; u0 ^. ?

! f0 G4 q( \2 V7 h% X; q            //copy data to upp_recv_list_busy5 n6 ~: O' b# J9 G" R9 H9 _
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
" x8 q- L* {" W. ?' ^  e8 l! p* e* Z- T
            //( R9 I) ^1 z6 ~" n+ t* `3 q4 C
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ f0 O( ^- _) y* e$ Q) c9 C8 w! ?5 ]$ l- U
            //
+ n; O  ?2 q# ?            server->upp_channel_a_recv = false;//
/ ~4 z4 R( o; Y' ^" C$ \) L
+ [, F1 M1 ]5 U- Q0 p+ z, q            server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 w0 ~# l8 D5 {7 ?3 t* Z* w1 x
        }" Q8 @8 w; h0 E( S1 B
    }
- ~7 \! g3 g9 |0 P0 l' W8 d( V# B. d% G0 n6 I  d7 p( n
# s4 d4 j3 S4 S( f$ Z1 `$ I
    return true;
6 Y& r4 R( \, l0 \5 P& W}
# f  X# X0 B: K1 v" D, F' Z9 Z8 g- Z, z0 v! h/ Z
static bool server_upp_data_send(Server *server); l, D4 W/ M' B3 C! N
{
3 _; D6 c6 P0 q* N* q" _# G    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ Q/ X# X! i2 Z3 ?; c, Y- N        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- A6 Z& X- q  e3 Z& T* Z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 }4 Y6 E. O5 E+ k
        char tmp[128] ={0};' f! k2 E" P' a
4 r- O) J5 c: j; q3 t' z2 o; Q! W
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
) d! m+ H1 V; h( j$ D        print_log(server, data, 64);1 G8 C' U0 ~( ]# z8 R' |, O
5 I) U+ p: \2 G  ?
        //0 J3 R# A: j2 ^* l& g# L0 V2 G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! G9 ^/ t. J* i' u
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 G# U$ R0 u% l4 p3 y- D/ r
        print_log(server, upp_buffer_b, 64);
- S. A* o/ M* h! u6 H
% \3 Z# M! K/ p) R        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
% R9 G5 D8 ]4 Z9 ^9 ?. W# N+ ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 S5 w* G/ S9 q* L6 c; E+ v" Q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! |  h+ [9 }/ I8 V" X* k6 i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( s& X6 S! T0 J( k

) j# M1 P+ g8 t2 `1 E        memset(tmp, 0, sizeof(tmp));
9 |- z6 _: J4 W$ {4 x        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * f6 C! u% m) A
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" m8 E. o- U5 G        server_msg_send(server, APP_CMD_LOG, tmp);% V& n$ |* N3 X7 ]( P, X/ R4 }

) M* }& @$ Z& y: j) a/ h1 [        upp_error_count = 0;& f  U, l/ X' E! O
        upp_dmaq_int_cut = 0;
1 y9 O$ y7 j3 A0 K1 Y+ t/ O        // fill in data
5 J7 _  i9 I( s        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 O; B* k7 }- I( S) ?# K& n
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* i/ A/ ]+ m3 e8 g
1 W2 i1 U* W6 \
        // wait send success
" A- Z( e  |& i) G        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! S" `% h# d) }2 ?- M7 w+ i" W' _4 D/ _; c( m; @" `
        // make data node in free list
3 P. o- E. X% O- M% b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% B7 h0 @) u5 ^7 W/ d. a( j8 B        server_msg_send(server, APP_CMD_LOG, "upp send: success");% {+ [9 w5 U5 `; ~4 R0 [! ?$ Y
    }
  P& n/ F: J% A) V    return true;0 Z) P2 _0 `* v$ @8 P) F8 b
}
" U2 u# C# ^' S7 M6 v$ o. m" T+ s6 @7 ^

' c9 J& n# B/ C- T3 }- h" y
/ j$ |5 ]) Y. U/ Z- T& z7 ]: Q

7 h( S) D8 ^. E( A: w5 ?
+ E1 C5 V, `! }9 {" ]

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( l, O3 T1 Q1 C* W% {

' S6 ]/ J. F: K7 T6 c( w

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 06:35 , Processed in 0.042799 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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