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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . D4 l# R( U0 N

/ p1 G. H3 _$ b' j问题描述:, Y$ ^( i' P1 h3 E+ @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 ?. R& q- p1 i3 \) i

7 }# C& d  b9 ]# f' v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# ~" [2 E$ `' X: u
- _# H4 y4 O; S. [/ c
测试结果如下:
7 h9 W- H" q  ]* {138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 h9 R, c/ E8 f: q9 y3 L# w: A

- j3 H7 }1 L4 e$ }; N0 J
  }, g% m8 y- t. g备注:
" R/ w3 O' r# F5 }1 w1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
0 U9 c9 p7 L0 h  g8 k: c5 j
2、相关代码如下:8 R9 g4 R  r" d! I, P- x) C6 q
//UPP DMA缓冲大小512字节/ B3 g: q. r1 K) Y, k6 @
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 O3 w$ G0 Z( i+ [! K7 H, h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 n1 \: j! _+ S9 l: W% y: w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% g! X3 i8 x% p* ~4 Z: x
2 Z) N! U. I) z- s2 B  j, o0 X! t
" ~6 V; p% f& ?
//upp接收、发送buffer& T& D4 F; T2 m* A. N
#pragma DATA_ALIGN(upp_buffer_a, 8)& m# \9 X7 G+ K$ V$ W+ d
#pragma DATA_ALIGN(upp_buffer_b, 8)
. V) V8 q& w4 H) S% u: c
" L# L! j# M3 Y5 O2 d* tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- o$ _3 P1 L& `0 c8 T1 Punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 V3 ?( A7 Q+ W4 V4 B! \2 l0 A- g$ {7 ]/ G" o" D6 g9 r

' Y8 e7 s/ I& M, A" fstatic bool server_upp_data_recv(Server *server)
! R- I; X9 t, Z{/ Y6 Z! e8 a1 _4 h# B3 l  a
    if(server->upp_channel_a_recv == false) {% @7 p9 i% y( A7 H
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ _3 ?: O6 D' O* Y0 @( n! F( E        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 a% C5 U5 ~; m' w: N            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% j( ~; c0 S- k% C. y

, a5 ~/ l' P9 P+ M, w; s
/ m# h: `0 v+ \5 _            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; S$ E$ Z& x+ r) N" ~; Q3 r; g: g1 J, i9 w( B7 l, j
            server->upp_channel_a_recv = true;//
. x1 [* W( L' d( x/ M: ]            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
3 X6 a1 E- d2 t. I+ e3 l            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ R) N" n. w! @/ |, O            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;: E- p6 r1 O5 e6 O1 ^3 N: ^) ~0 Q
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  V: T8 r0 G1 Z# A% a
. Z8 ~9 S( Y+ E1 T' i            upp_error_count = 0;8 [$ @+ a5 w% n  ~
            upp_dmai_int_cut = 0;2 I! x! I- j6 f4 E% k5 _- j

+ V- a# P. @$ D8 X$ G            // fill in data
- u& b* x7 K2 J7 Z' t; u            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" i) C3 n! k% _! P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) k/ F1 @! l$ x        }
0 s0 u- l  D2 Q2 ]% F% L    }
! p& @6 K" n2 j    else{4 ~* N, ]* K! j& N0 H) W
        if (upp_dmai_int_cut > 0){! y& t0 l, S5 Y
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 S" C: s) ~( G. C7 h9 C            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; |. x  D2 `8 b. ^. k* h
! u  h; w/ `/ J& g& f# _5 z2 x
. R( V7 r; n# E  r3 ~. d            //copy data to upp_recv_list_busy* L) ^- j$ P4 W9 @
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 J/ f( h$ L7 x5 ?& \4 K* L; I3 z, s! m7 I
            //4 S# Y+ B* E8 A
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ Y" K; H( \/ L6 u3 U7 v
4 o$ }) _$ M" R4 u
            //( O- ?' q# I# l% c4 {
            server->upp_channel_a_recv = false;//, L9 l$ o' [/ s4 T/ u

" D( _" n  h+ R6 T# o( _            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ K: _1 z* I6 B9 @
        }
% S# \5 \* ~7 I0 A! j( m  N& D% N    }
6 P, [5 L6 l4 v6 F+ D2 E5 |  p, M: @) P& e1 u2 b' Q$ H
' N, {$ T+ C2 Z+ n# j! T' @
    return true;
: ?7 A9 L8 a3 R9 ^}7 T) P4 N) y: e* [) j2 r
3 L3 i8 ?5 a! d5 u* M1 S
static bool server_upp_data_send(Server *server)
+ X/ n- j1 m/ G6 `) p. B/ L{$ f+ x3 I, b/ `/ `
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* L5 x6 a9 R+ v6 E6 \$ F8 ]' T        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: @. L% W9 q" }) v
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% e6 ]2 g: g$ G9 |- J4 ]" i
        char tmp[128] ={0};
- q0 A7 k4 J1 D( ^( ]- J/ j4 z  D. l
        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 @2 I" C, h5 J, L6 e
        print_log(server, data, 64);
: H$ [- W3 L( P5 P/ T$ c4 l: ?( `( M( D, I" T3 T! A
        //
8 N6 m# n* \/ R( u, y( t0 e/ K        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 J8 P, P" w% k; q0 A( z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- j$ a, q+ |/ V0 A* O7 T. B
        print_log(server, upp_buffer_b, 64);
8 i4 p9 k, }, P( |0 K' e+ z% E, ~3 a. u4 e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( N& z- l9 A' O7 r! ]0 B, u. z
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 [0 z+ o6 s/ Z9 [% J        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
3 c4 N9 t0 W5 I) v9 r        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' Z& R0 K7 Q# a) q
# t  `( a/ Z- C8 C        memset(tmp, 0, sizeof(tmp));, w- i9 \# n1 Y% Q4 A* \% ~! {
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 ?1 \3 m# l) A
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" T2 }0 J( Q' y1 T: ?) d
        server_msg_send(server, APP_CMD_LOG, tmp);0 G5 _2 o) k. ^6 q$ T! l) K1 s

" z2 Y1 l+ S) [1 K, e' x        upp_error_count = 0;3 j  G! n1 O& O! J* r4 a. a( p
        upp_dmaq_int_cut = 0;2 v* I) y' V4 H# q$ i% h! Q0 ~
        // fill in data 5 t  x. N6 C! S1 z
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 o0 J: P. i: ?* |; N7 \: c        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 I( y+ {, V) V" ~4 U9 n+ B

* j! [( q3 y9 G0 e        // wait send success
% `/ ?# L2 ~6 Z1 K9 {" l: l        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % t* d: }, B! w

# C! h+ x1 w& r& o        // make data node in free list
+ I% T' e$ U& [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; Y; N( l2 {6 P/ N& S4 k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 C' h; p* K4 a- D+ {9 x- \2 m    }
4 ^& y* I! f  J6 G+ a! V# ]2 {/ ]    return true;
3 J8 v; \2 H6 O( H: h/ B) t}9 G8 Q' M& W+ u4 e- H9 T

* C/ s  n8 o1 t  u2 B# V
/ n0 e/ X# B* q  J

6 X# }3 r$ T% t0 Y0 F: I/ N
/ }2 {- q/ n. m% G% x
! j* h; K# t, H  o# m0 F( u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 ]0 P/ _- l+ d) D

4 [  [8 R9 R: m6 D2 s

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 02:50 , Processed in 0.044739 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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