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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ J! T+ I+ c5 L3 e6 s" F
3 z) k4 Y: U7 O
问题描述:
9 Z, R! @$ m$ d6 l9 @在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( d) C; @# l% N0 N4 h- E  _5 e, k
! l+ i4 c9 {% ~% f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; U$ r# |6 ^0 Q4 E+ I% _3 m

: _. I6 ?" ?2 M测试结果如下:5 f7 H/ L3 S% N# E, Y% W
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 o' J. t1 \! x' _, N4 @
' U% A- y4 U8 g4 U% {

* j. W+ U; O3 z+ _, N备注:
9 t' X8 u' e  ^+ X5 k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) E5 Y3 n7 G8 x# \
2、相关代码如下:# C; E* q; R  z
//UPP DMA缓冲大小512字节  @6 v' W8 f! P" o" m& v0 L0 t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 x  v) g+ S# Y3 B4 e9 Q$ u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# X& A. W& K* o& h5 I* w; N& @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( t( y1 S% G3 l5 t3 z

9 `$ e+ A- |* u" Z
0 Q0 A/ t7 d3 T; @: j2 O4 ~, @//upp接收、发送buffer& h" V0 |. j/ A& [
#pragma DATA_ALIGN(upp_buffer_a, 8), U3 e  X7 ?' }
#pragma DATA_ALIGN(upp_buffer_b, 8)" X& ?4 d% l* H3 s5 K5 x& u
, w1 M3 w) G5 ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, {. p# L" M% [) T5 Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ r, p7 N6 x0 V+ L2 ^, M

1 a& J& C+ Y# G% s' F) b3 ]  _& f/ z# Z( o. N; ~8 W
static bool server_upp_data_recv(Server *server)
+ S6 a. F, t. f& G2 n9 \, Y& E{
0 m) b+ g7 s5 `8 \    if(server->upp_channel_a_recv == false) {
( W9 U% S% D: d) X* m        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- z4 e( s; u- ?( b
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 z# c& O5 u9 F$ A( Q, h
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' l4 @4 I  W" \/ ^
: D5 J9 V- y; f0 s: b
: Y* \* Q1 A9 n) N- r( G" N2 q            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ ]5 c. `! g/ g, w
  J; Q* w; Z4 I. p1 K! e! ]            server->upp_channel_a_recv = true;//
* \8 c* h5 E" g0 x! {) I" u            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# V  x& }9 V5 p            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
& w/ j7 m6 Y. y/ w0 t5 a) g: _            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% H0 ~2 F7 u) ]1 y/ P& B! t            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ n' w( D; [, O0 y' N

; X* x, D) i3 E            upp_error_count = 0;
  K) C  W0 W7 q# D4 c, c: V            upp_dmai_int_cut = 0;
/ E' M$ k4 i! d4 M+ b; {
" F5 w, }; v9 l* t            // fill in data
- g- ~9 L. n) J9 {9 G" ^+ y, D            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' f- |- _  a! X" g+ o: q            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 J/ c) L# M+ j0 R6 b' |1 S
        }
6 ~7 m) [, E  W& ]2 G    }
& M" i3 b# r% N% T& Q    else{
0 T$ Y; ]& O+ ^2 A/ Z2 ?        if (upp_dmai_int_cut > 0){3 B: o" R" n2 q6 w) z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, ?- a) P7 ?, E6 J            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) |1 r. T  {- q+ B! {" d
3 D. v* N6 r6 Q% |' r. I5 l) L; G
            //copy data to upp_recv_list_busy/ w0 U! s' i2 k3 `
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  ?  c1 P8 |" O4 g/ R' ^3 D, I0 A# m/ I5 o2 o. f
            //
/ a/ i9 n0 f8 P! e3 A; M" ]1 i/ k- m            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
: i4 O4 G6 Z- ~
0 s# r( m0 H4 ]  w            //
9 a( m6 ~* [0 Z- A1 |( ^3 C            server->upp_channel_a_recv = false;//
! M/ ~5 T$ Y) P% @/ i9 n3 @5 e) p- z5 u
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ B% z' H7 N  E2 S8 k        }
+ ~/ p. x- R+ D  l3 e8 c/ J    }  l! j+ v  c& b5 e0 ?+ |
8 [  s; f- n2 m! A; H0 n

4 r: w0 [. Q5 n9 }$ ]" a% H    return true;; O: [; @% d8 \+ t3 B# z( |
}
6 v' r2 |& ^0 r! V6 |$ F3 w2 N7 L! _7 a4 z9 j
static bool server_upp_data_send(Server *server)1 U, O: F/ d2 l  ], i
{0 y& B  P, B" K1 D" U/ X. C
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) j* o) l" f) l! |2 i        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 V' B& q8 y# F2 _( ?
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* j) u% O/ h' W& E# p3 V        char tmp[128] ={0};
$ z2 I  a2 p9 k7 S) D, s' O8 v
' \% M, g  M' o' v7 q        server_msg_send(server, APP_CMD_LOG, "upp send: start");% }" n8 b$ X0 s- A  D8 _
        print_log(server, data, 64);7 h: `5 r+ r) W) ?7 M

  ^  I" d: f' i4 a& ?' s, o        //
& B, W  A, Z  s! g9 H5 @        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 N: J, k/ z* R7 [' M4 o, G6 v  G        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" ]' @* a) R$ J$ _- V        print_log(server, upp_buffer_b, 64);
% i) m3 D3 {+ M6 X, [! a! v: E4 R) ^' d
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);5 i  z! {" v8 s' V* X
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
% l1 }/ l) D: Y9 M        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) k3 f/ `7 L) Z, F0 e8 U
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# R$ g/ j" y& {% k/ I

' F& Z" Q. j; u( {4 h        memset(tmp, 0, sizeof(tmp));
, ^4 I! ?; Y5 m9 @( j        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 h# }% I: ^5 b3 T" j3 c' z$ U' F$ |, e            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ \  A! `9 d- G        server_msg_send(server, APP_CMD_LOG, tmp);1 F  S8 p2 t! u+ ?( t& T
/ ?+ G7 k+ L. B( X3 L- ]
        upp_error_count = 0;
; X5 S, `1 f, }3 k7 z        upp_dmaq_int_cut = 0;
2 M: b7 Q( `+ u8 {, h' h7 D" ^) R. g1 H        // fill in data
/ m5 F, W/ s* l* {8 c7 C+ R( k2 o        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 Z) _- i/ j* y3 ]0 H/ ^& j, I
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! k) E2 v: ^) b2 X7 Q1 [
/ q3 W# J6 H% U$ O1 R0 T
        // wait send success
2 q3 G& O2 I" i1 h0 a; X# l        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ |7 a, g- \$ l: U% P4 w
& E; r, z5 B* M7 t) |5 @2 [" y        // make data node in free list + X  `, f% C! T. w
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 J5 s: Z9 f. m
        server_msg_send(server, APP_CMD_LOG, "upp send: success");. M) G/ h& T' b) k& m
    }
+ x2 v8 V* ?& ]$ a    return true;) F* B+ I8 u, m# j
}
; ?# y+ R+ [# O# y7 r
, i# Y' ~. N6 L* ^

5 d8 b' ^! F7 \% _5 v( ?0 g: P' |# o

. W& e1 D, w# M5 ?& P" O2 Y9 N* m2 S: V7 g% A

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
& e# m8 V5 U9 q8 I
" m/ h) E% u. X& q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 18:57 , Processed in 0.041950 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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