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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & @% u3 w3 V0 B; t+ U: V

" ^; N1 D6 C0 h9 I问题描述:
( S, r* [) F  z) W8 M8 ?# [! p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ Y6 \0 L" g9 O+ i- e8 c3 X
+ h2 ~. d6 j7 c) R, \. f8 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; ]$ x$ P+ T/ A+ l0 }. L9 }7 X

" O7 ^- Q; ^: @测试结果如下:' {6 J1 N! E, X! r0 j6 {2 I
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) v$ P- ]  ]& h# r7 ?# v: L% @

9 R; w" _' {( _" r' p: B5 N# P* d7 `; H7 B6 F& p
备注:
) r2 y6 f7 N- m; A. S1 ^! e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 N4 S% D- J3 M% h9 A2 E$ y& U
2、相关代码如下:! U6 O# C: q5 q* m
//UPP DMA缓冲大小512字节
9 H. l7 q. K# ?#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. S: B* q2 ^. C' L
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 v) E7 L+ S  u7 ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# c0 F% _, {9 c& Z; K$ v4 m# ^
; N1 n' c4 y) c* A

* B' p1 g/ A5 u9 L) N$ H4 {+ _/ Y8 Z$ x* p//upp接收、发送buffer
7 v8 G6 l! F) ]! e* s  O. T#pragma DATA_ALIGN(upp_buffer_a, 8)3 p( |# k1 a4 D, B0 R
#pragma DATA_ALIGN(upp_buffer_b, 8)
" n2 A  F  n  H* ^8 m
  r  B  V/ @. @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( A7 J0 X) [3 Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% A+ P4 F' D+ p0 W/ h2 `1 g
3 l: O$ ^" C9 {( e
+ T6 [& @$ M( L. p# W) d4 e! O
static bool server_upp_data_recv(Server *server) 0 G; [# P2 r( ]. ^  @
{
4 S, Y0 U; y2 b% s. X. Z$ H    if(server->upp_channel_a_recv == false) {
2 {# v: k( Z. V# X2 w# L9 t1 C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
" O5 y" j* f' g        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" B6 h- S0 Z. d7 l) ]; l            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ {- F* f- T6 Q  D* \' z& ^9 {( e6 [4 s. P0 `
4 i1 F7 Z0 U1 ]- [* G( p$ C, A
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ d; R' f2 g2 Y7 u0 u' o! |
2 d+ g6 m9 d" t
            server->upp_channel_a_recv = true;//
( S( I; A! S: ]- I2 E$ _            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 [  p: Y2 i. O. E" c            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;/ m' f, r1 b5 q- k( C
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;! x3 A3 z1 h5 P; w3 W
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' f1 c- ?" ]6 w9 @; Y2 C! P4 s2 d
% _2 [* g5 X! E: C$ q            upp_error_count = 0;
2 F3 Y# P5 [% E( a( m' A$ Y            upp_dmai_int_cut = 0;  Y+ ^- \2 G0 F+ l- f+ M5 ^
% V6 j8 y# o) b4 ^) Z3 J1 |
            // fill in data
  T, V7 A+ {. z. Y8 E) T! Y# J            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( V/ h6 \. T. V9 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) c" A, {9 r0 s) p* y6 Y        }1 `5 V$ z; e( e3 b( v, \. ~' V) ?; K
    }8 c8 Y5 P& K. z- ^+ P
    else{
! T. v+ a* p0 e! R% L% q        if (upp_dmai_int_cut > 0){) R1 {7 B3 J% b8 N7 }* H
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 p$ t0 Q5 S  N) B% U            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# d" F3 P! }1 L; p, ^% b$ H% g, L; Z2 c# I
' r% r" j1 [0 N1 [% [
            //copy data to upp_recv_list_busy1 N8 j0 J! i+ }
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" x! f) x; y  n
" h! l& P! ~7 I, t/ j4 R  q/ S7 h
            //' d6 ~5 |" D! {; B
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' D! @& L6 b2 l) N# ?
8 g" w" i4 n' w8 n2 r) K
            //: d, m7 L$ e' w  `- v
            server->upp_channel_a_recv = false;//! P  U4 U4 |+ h, S) t( ^

1 }' y% J! O' a7 K; _6 [9 o. i+ m            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ V- Z/ i: {9 _. b, E$ b2 ^        }
" M4 `! i, |4 Z  P& z    }
3 m' A8 {8 w$ W5 Q$ `3 l
! W4 _6 p% M( W& T1 ]; {; N9 V% L
! G! |3 U, j5 l9 t2 h    return true;* L5 v; k5 h2 B
}* h2 E. ^! X* _- T
2 [3 j; {% {& ?1 r
static bool server_upp_data_send(Server *server)
- j  v  n9 f! i* V1 h' N* Q9 U{) Q- o7 [" J2 x* F/ s3 B+ k
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ V* K- t$ ~9 C6 N) @# b
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. W$ d( D/ y% s2 ?
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ ^, ~/ W; J" q. v+ {
        char tmp[128] ={0};
" X% _- L1 C8 ?9 q# N# q  D9 d* H" F6 N6 X2 }
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ b% ]; i" E% w        print_log(server, data, 64);
# Y4 H6 E( F, a0 w& B& w( b) p  c6 E
        //) }% x2 D8 G$ {$ f6 h% s9 c
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 y/ q9 L, F) f2 \
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 R; o$ g8 C4 K6 N3 o1 n1 m4 `% Q
        print_log(server, upp_buffer_b, 64);4 l$ M6 A7 x( c, K* B/ R

, _, I9 u) ~: m$ H# X# |        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ W* q2 M9 n4 s; f% j6 y( r2 e
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- p3 T2 u' j1 Z: A) O        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# r0 u" ?# s. {
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! B0 l# Y  f( z0 V
  w, a& i- y4 L7 c5 W: }8 [3 N
        memset(tmp, 0, sizeof(tmp));
4 c  v# k* ^: s9 ^* D0 l' a        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, l% Z$ @3 K" l- d0 `            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 }; \: u4 r' _' V8 P        server_msg_send(server, APP_CMD_LOG, tmp);  ~* x# v* K4 C9 {0 I

# E! I! N) l  R+ ^9 C7 v, g9 R        upp_error_count = 0;. P3 Q6 i0 ?$ h" P
        upp_dmaq_int_cut = 0;0 W: p- G0 N$ x! O, e
        // fill in data
' C, a1 v% \9 d9 w% @; e        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, [/ z+ Y. e) z- K" D" ~8 Y3 H% }. M  t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! `6 o  r7 e; F0 E0 z

* I- R/ M9 J9 h  u9 R# Q        // wait send success# j7 J7 c8 q/ d7 x
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 v8 g& B; C7 i# i! R( t

- n+ m9 _$ M3 |0 ~        // make data node in free list ( |6 D6 O. W# d( h; w  ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
7 T& r  m* }6 B        server_msg_send(server, APP_CMD_LOG, "upp send: success");' J% Y' F' G; @) t# s" i$ e( b# n
    }
, W5 l' D) ^. A% K& c    return true;
. X7 r  b; v' Y% ]7 C" n}
3 d4 t5 ]  a* K) e- G
8 E; \: ~; z) {& V
( h, T" e/ n: ]4 A# V5 ~
5 e) c0 w  T' t: y) |. `; V: `  J

6 J; Q) u* l4 l+ d& P; K+ p" N" ]/ c5 V( K( e; S7 K

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 K1 ~% B; I/ _) N2 }

' I" W9 ~, H9 X* S; z1 ?5 S

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 18:35 , Processed in 0.041890 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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