138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & X% N  F) N( \8 [

, l! B1 M  V! e- _4 S# Y! h问题描述:+ d. U4 K) b  Y) ^2 n
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- `6 V4 M2 O! k* `6 |
2 T2 v$ e8 T; g7 [/ [
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 z$ m% N: ^' D8 z! n
$ [% M$ ^0 |- a+ m8 U测试结果如下:0 y2 F4 B9 {9 X
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 p4 n6 ]5 }% v& G
8 |# E7 L  P, w1 I& \' W3 u
6 F8 y; b3 Z. ^备注:; W) ?! {. T+ H0 P
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?& ]+ i& H9 G; C6 t4 k" N
2、相关代码如下:
2 J3 m3 m7 E" s/ |8 w: I7 H" x//UPP DMA缓冲大小512字节3 J) U6 c, Z) M% j4 v
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 s, U# `  I- u6 |2 a+ s3 G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: S" S% h& T  Q1 T
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; F0 b" H. Q' C. i/ Y* k3 M4 \$ d3 t: c( @1 S6 \9 F% h
2 k! |- c% Q% a# l  T  v
//upp接收、发送buffer
, B1 \8 ?$ z$ Y4 q7 w#pragma DATA_ALIGN(upp_buffer_a, 8)- Q- h8 X( k' _7 o3 W4 a
#pragma DATA_ALIGN(upp_buffer_b, 8)
; d* Z! @4 z) |
$ ~9 `: N$ M9 ^- tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; n6 X' }# m" P2 O) F6 p) S
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];2 n% B1 O9 A2 X( @# T6 o) }
% Q8 Y( |7 ~: }7 U( J: i1 U* n

9 |! u% M( V, H# f3 P3 xstatic bool server_upp_data_recv(Server *server)
7 }' l6 L/ ^# j  ^; i& B{
( ~' o5 f' e* P7 p0 ^3 d# `& f- e! g    if(server->upp_channel_a_recv == false) {
# b, k% d) t0 [+ S9 |        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& t4 |( v! V' H' r" s
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' K. V0 c( F  X
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ l# Q4 {: A5 m2 @
  E# ~; y3 c. d0 g8 N, a
8 k, Q; C! \: f( Y6 e1 A            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ ~' R( c6 o) l6 M- D: m
  j: m: I" s+ J  J
            server->upp_channel_a_recv = true;//
+ U: c0 k; z6 x$ U  G            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 {) o  Y( @3 b/ |8 V
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;* Y* w" [" a# y) u# u8 d2 T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
) }' z' H& t3 m; k& W8 l            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" i) N2 O% E4 Y$ l. V
; |1 ]! N* \! N3 T            upp_error_count = 0;" D" I$ W! u9 \& R4 v
            upp_dmai_int_cut = 0;- D+ C; e* U- @- l

1 f8 D( |% F, p8 g  E            // fill in data 2 M1 N0 Q7 }2 C" _' ~) \
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);4 X2 K' F1 z  U% ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 Q9 C1 E/ s8 G/ M- X9 p/ Y        }7 j& s4 g8 C" E7 Q+ ?0 n
    }. F! g) n* O- \6 i! x/ `! N. n8 s
    else{
- n4 z1 I' P* t9 s        if (upp_dmai_int_cut > 0){! t$ S! h( e+ v& P# @0 G. q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, R& @: p$ ~! p, X( Q            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ k* U5 y0 }9 L6 ]3 y# X( U; y8 O8 Z/ [, j# D" N. x9 l/ y: P

# D( c- \2 o2 m            //copy data to upp_recv_list_busy
+ k. Y5 g6 Q  Z! p. G            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, `" p: @& \& b9 P- B2 f" \
5 r6 E3 r% Z$ L4 p: d2 W' Q
            //
% q) a7 Q$ D$ c# k5 T* p; L" G  v+ T            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, {* i7 I6 W- V' m) ]) o9 {; D( G' P( Z: j" z; N
            //( v# ?6 v& o5 A" P* c1 }; G
            server->upp_channel_a_recv = false;//, o0 x' E/ E) J! Z5 |% r& k+ n1 W6 k

2 X' ?* R8 n) I/ v( q) K/ r6 l* p' G            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 R4 L5 ]1 u3 j# ?        }* _/ J: k% F$ x  `* W
    }  _9 N, T8 Q% |! l! L

# h# C9 \; k1 {4 P- n4 {6 D8 N0 ^2 g. O! r1 i+ `( d5 ~
    return true;; |2 M# U' A: @
}9 R: n  j( O- H4 P7 J" i3 i! y

% X+ |9 i) E- g! a1 |- N$ X& xstatic bool server_upp_data_send(Server *server)) E- o7 H# a* @2 d
{
% i( ^! ]$ I3 U    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% x% W( L/ Z1 Q# @- K  l7 u        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 E: H$ k% j3 }1 O" @
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, a2 g* d  \% p- G
        char tmp[128] ={0};
$ x# C5 j3 g" r6 R8 q# ?. U
5 y4 P1 C0 @: w; L" o0 y        server_msg_send(server, APP_CMD_LOG, "upp send: start");: V2 E; ~' P& w! Q# C2 Z
        print_log(server, data, 64);& C. t' z$ X5 ?+ D
/ b) ~1 Y, Q; ]# x
        //
- n  y! B% Q4 U        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 Y0 D# T& u8 {% R/ x9 ]: w
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 g# a" R- m; x' `
        print_log(server, upp_buffer_b, 64);
* |4 \% |( f" e( |+ x0 c, l6 A+ ?/ e( T' `5 a& {+ b
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! e. P% ~, ^1 u# y        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - }! F' I) I: O7 P2 `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! e2 f  i. A' h& b$ i; ?
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* F& u7 f& J2 b1 p0 k7 ^2 e* s; d
# B- A% @4 R1 X7 E# R  N        memset(tmp, 0, sizeof(tmp));( x; [8 ?. g$ K7 ~) Q7 k0 @* G
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% T( k6 P; C1 E( T$ K, K/ s( L            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 t0 L( n& ^/ V1 x# h. J/ _& ~        server_msg_send(server, APP_CMD_LOG, tmp);/ ~5 ~$ G7 @+ U  ~  S% s/ T3 ~& v

% c0 b+ w1 {; F. W        upp_error_count = 0;
, N5 O$ C4 v! Q  w$ h9 p9 D        upp_dmaq_int_cut = 0;% j0 b0 N/ B' l
        // fill in data
/ p; E. ]2 O; n; V& ~# b( i        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ B" h, B( {0 f- ^( ?
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) k) J5 h% ]7 o( _( q" @, [' d- m6 Z
        // wait send success
5 u# e$ z7 d* H        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; T2 u! I. U' v) p; a& a6 q7 A

( l2 Q) B/ h3 i6 j- ]/ y        // make data node in free list
' c$ x2 e6 {6 `2 m/ |8 ?& v: _1 x        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 A9 ^* o, e. N
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ U" m+ j% {8 B1 j- `4 _    }
* M3 a& u* s; l+ W    return true;: H1 q; o* ^. P' X- ~$ a" p
}4 G' h% e. R0 ?0 Y; |5 m

3 K0 Z% S6 F9 b' A4 y+ A5 `) I7 Z
. A. O. h* t9 X0 ?1 e# X! I, u
1 F7 L4 _% u6 d* o

. c1 W5 ^1 n: L+ D& @6 h
" U  {* b+ D" s! F" i5 h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐, F& X! z) J% J# Z& {8 d# u; c
6 p/ p" t0 G( v5 A; F

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 06:47 , Processed in 0.041697 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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