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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& N/ l) _! K" w1 @9 J" v$ |' M+ V7 B2 p; M+ ]( Z( E
问题描述:" a' b% X, M3 {7 D: [
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% M7 S$ ?$ {! a7 ^8 C7 t7 X* {7 ^' B! e
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. y8 N0 ?7 S6 i9 e

4 W3 B0 N! G1 C+ \# c+ O测试结果如下:3 t& j# L8 c5 b- V$ Q( m: E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 ~  y: Z" E, ~5 n4 N

1 Y$ }% h5 Q$ e% t3 u7 o# ?: c( l6 T
备注:* t% @7 f. N9 Q  @9 i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 }5 ]  |  s4 k
2、相关代码如下:
3 l# J/ v4 y4 X; B4 a//UPP DMA缓冲大小512字节  \  d  N) F) o& P5 F
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! q8 w6 o( ]5 U  F#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 R0 M5 q/ I. V5 G2 @: P5 T0 _
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ S2 K- e9 D& H, O! X+ z+ S8 Z

) y9 d" s' |# x, ?. {# w) N
. b8 w1 z! S8 @1 [8 J3 P//upp接收、发送buffer- @1 x; J( m0 m' v0 v
#pragma DATA_ALIGN(upp_buffer_a, 8)) {& s3 k" p7 _* s( A5 R
#pragma DATA_ALIGN(upp_buffer_b, 8): ?2 Y( s, c8 d2 G

% D$ X7 w- g/ Dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) g9 ^# r2 n$ E" B) [& B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( i$ T1 `( ?8 x9 b
8 G7 V! G4 y8 G7 |! C+ P9 a* R
. n" W) \# j6 f, s2 L. o. H2 @1 ystatic bool server_upp_data_recv(Server *server)
+ j8 V8 A+ z2 R/ r& k( l{
! N5 X' |! ?+ `    if(server->upp_channel_a_recv == false) {$ [9 z7 M; v) X" ^4 `
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, ^! x7 {" z: B; g0 r$ A        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ D$ c* h1 o7 r" n. s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% `1 Y: e( }+ o: s
& D# s& O. b8 t# u  S1 X

' F6 G7 [( E) B& F            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% N8 w8 A- W- u* |3 R) |

1 q7 q, }5 j1 l" M3 d            server->upp_channel_a_recv = true;//
( L% I' v, T' I5 }            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
. p, Y6 s8 I8 t% a/ R5 o* w1 W            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 b$ }; w0 c; p4 h/ x
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! q" k" w  j. e+ d3 l( B% i) i            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% J* E1 X5 O2 |  O+ y- {
. g" ?) X; \+ ]7 m
            upp_error_count = 0;
9 F, B6 E! e: Z1 W            upp_dmai_int_cut = 0;
% m; l! M/ X4 \1 t4 @- q, {6 @" p
' O+ F8 G- f; K9 N$ _( X! j5 R' R            // fill in data 8 b3 y5 F* v5 M. t: P
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);; h5 h- p$ b" D4 e. y9 ^  u
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ h8 o& _- e/ ]) |/ ]3 G. I        }
# S" F, j) B9 C, u    }! _* |" v4 D" n4 s- j6 \
    else{
. Y0 O$ g' }- A        if (upp_dmai_int_cut > 0){$ Q" s5 G& d$ C% e/ h' j' i
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 G0 F- \: C$ t7 e  s            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' T, b5 ]0 f( {% }# R- }( X" T- |
) I; @* y1 k& [% \' i

* N( }5 T8 x1 ~1 s$ {" x            //copy data to upp_recv_list_busy
) W- b- `8 A& L* n$ K5 @6 S  r* ^* B            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: V1 r2 Y- G( R7 @' y5 }" J# F3 ~* x
0 R/ q$ Z" C/ S) k3 l: Z: k            //6 {+ o3 N- }8 C1 w) k; W
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" P6 V( @$ M' ]4 D$ S8 j, w* F; r! q
            //
. S8 ~# p+ C- [" {            server->upp_channel_a_recv = false;//( h# ~: N9 n4 P: B" q
% l8 ]  {2 m" H# Q) z" f/ @& E
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");/ M8 \& h- a& e. y- |; j7 F$ \. L
        }
; `" q( k! q- r) E6 ^, F    }( m- P/ B0 L0 O8 n

  s* y  n& A( C6 S& z# F1 f" s( d: g, W1 N) u
    return true;
: A1 u. s; ~! J1 P: c}: V$ [8 W% U2 Q- Y! ^: k" z; ^+ k  c

( @: W- U3 x5 ]$ k  S: [0 Zstatic bool server_upp_data_send(Server *server)
4 r" f+ Y6 G8 \{
4 ~: J. R) v8 t: \    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ b5 s- G" E& u        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 G! f% _) p/ u& G' r% |% I
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 q# H  j. j- O, H3 r& e" |
        char tmp[128] ={0};
: E) B& r; ]. D- n& U
3 m" Q; _0 d. D6 L/ D$ B        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 z+ S! k  V! q+ u7 ^; B        print_log(server, data, 64);
1 C3 j2 ]& v" w$ `- N- T  ]1 B. J2 j1 H" I, d. v* Z7 e
        //) [5 J9 }8 [$ A) S" j
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 |% \) t* h' @- F6 h, l
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 [1 Y( `9 \8 j$ l" n" W( ?        print_log(server, upp_buffer_b, 64);
7 u9 T% W5 ?1 |8 {) U% b/ Y& k; G4 O% i  g
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 f, G  J& w/ h9 I  T7 {0 a% g- m; y" }
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 C# A8 r9 E3 w) I        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;  P2 O+ G1 t) {  S/ F
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: K7 v) y1 q5 }$ ^4 [
! \1 s7 _( p3 T* r
        memset(tmp, 0, sizeof(tmp));
1 e; }9 I4 y* e% y2 c& I% n' d- t* z        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 G5 `- w  J) w8 S+ e
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% q' t" |, j! p2 \5 z6 o        server_msg_send(server, APP_CMD_LOG, tmp);
  ?# A) e- E! \2 f$ c
3 d+ v' Y* S3 l- m$ s9 E        upp_error_count = 0;
- B1 {. L. s! R2 Y2 c" p        upp_dmaq_int_cut = 0;" d0 T  r1 n* O' j% z9 Q4 S
        // fill in data ' ?! ?+ r) X" S; u: d, Z8 Y  |
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 ^1 O; D( x! {- G# J$ G4 d5 ~
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% g/ C7 g- \+ P, E- G% e9 U
+ M: _. j/ d) o# e) x7 ]- A        // wait send success
8 V9 O# }) y" {+ g        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! H  t1 F, i  [/ I5 V  O9 x' V

7 r. e4 r* C& L/ Y        // make data node in free list
+ g, P4 R% g6 a' u5 I        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _+ z% c  Z% @
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 ~4 h) [$ C. y/ y    }
' T9 {8 b# \. K% H    return true;+ t+ F/ E0 _; R+ R; t/ ]* _9 T
}
: O2 h4 r3 [8 q4 N! m& f! ]( z' t

+ h/ q% ?' S6 ?- G3 G
+ J' w  a5 O( m/ _$ w6 x/ U; L
; l. f- Q+ ^5 H2 x# r0 O/ o- \

: E) C+ ?. o- `2 L9 b

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- @) H' G5 v! e& |! ^  T
2 \# B' z" F. o, I) R' x/ h0 ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-18 09:05 , Processed in 0.041207 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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