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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 i8 `: [' S& V. O4 _0 d8 a/ E& o
9 Z, @7 U+ D& w7 Y  y问题描述:! j0 R; V. z) Z; D- Q- C. C& m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% H( @. k! ^0 V) [, m* G" V

% P* q% {) T  h8 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ a% b* N1 S" i

6 {1 y' q4 t) S8 G# n) e- [测试结果如下:! ]9 t9 b& t" y4 l! V
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 r# t+ R- {3 [1 i0 i! N4 Z% U! |5 i$ `' @

8 b% m1 w& h1 g1 @- |+ ~备注:0 g& f7 w4 `0 Y' n, i: g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 F& Y2 ~/ e/ e6 R) E' Y6 a
2、相关代码如下:8 v$ K/ x3 S: q/ Y) O
//UPP DMA缓冲大小512字节0 c8 h8 T# w  f- ~
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍& P! g, b1 B4 H+ z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 [  e9 H; p  y; E5 H1 D
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. B( D5 Q3 f3 q) U: F/ L4 J# C7 S. N4 }. S  K3 Z
+ a1 T+ D, b: E/ j" ^
//upp接收、发送buffer
2 |' |7 u0 i5 ?" D: C$ K#pragma DATA_ALIGN(upp_buffer_a, 8)
8 b  M; [: Z' R; A#pragma DATA_ALIGN(upp_buffer_b, 8)
8 a% B9 G, F/ {2 d
- B' G" E0 Y) c; c; i! V: Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' d* t% q( s& [: S  Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# ?- u% \" K0 ?$ R3 l
9 {3 A& N# V, L( @+ |5 j2 F* Z
9 m7 _9 v& p( M7 I) a1 u5 ~static bool server_upp_data_recv(Server *server)
! Y* X2 b$ [+ A1 P6 C, \8 W: ^$ l{8 Z) H" B0 r- M+ p8 m- s: L' q0 ]2 L
    if(server->upp_channel_a_recv == false) {/ Q0 \! R. ^+ `+ N# m' L  V
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 H6 f5 e5 g, X5 Z6 j        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 W8 L, y- R* ^* t4 L5 }7 t7 |            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 t% f7 l$ Q( {" L

# w( G% c8 _( d" ]4 D1 H2 V
9 h4 x( `( a0 f7 ~            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" _2 i8 H* l2 \; S2 v0 [$ s

) R1 M5 ]' u9 T+ V( F# t- w! r& s; {            server->upp_channel_a_recv = true;//1 I7 A8 P" S  V3 W5 x. S
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);& }" I% x/ ^/ K8 ?9 |& P
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ b% v  E+ W7 U: J7 q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' Q- k( G( E  B; I7 t
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 r7 k( r* U/ z9 `$ J: x- z4 S) }; e
& @2 a! [' t3 {6 \1 v/ b            upp_error_count = 0;$ D' |! Z$ q* x' C- R) B; E( I
            upp_dmai_int_cut = 0;
) Z6 T0 a8 K/ R: v) L3 l( T  o3 N' Z% K+ s  \" J# E
            // fill in data
7 E1 H) Z+ |0 k/ N( t! C* U- P            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 G  l# b, [0 I. M# M7 x' J7 N4 [2 G            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 H) n0 C2 X3 l. Y5 g% [9 t
        }
7 k3 d. R7 |$ l8 c) ?    }" b& H% l( c1 l9 g
    else{
0 A: k) Y8 _- K        if (upp_dmai_int_cut > 0){0 v2 a; L1 Y3 s, m" Q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 e* {" ^1 _1 \6 s            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ v, r, ?9 b/ n% s7 E3 H& ]

; ~2 A# ?, X+ b  X5 c# h: ?9 K( p4 k$ r6 m6 b: c$ B8 _( p6 U
            //copy data to upp_recv_list_busy+ `5 A: Z- x# |
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
/ f, {$ l9 c6 _& K/ t* N  _, j
( v  [- L* v3 Q% B            //% u/ P/ v2 M6 S$ H( |+ a3 e8 v+ U
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 U4 [0 k) N1 z

! O# t! s2 r. y' b            //8 ?/ |4 i" Z8 j+ s% `  V  ^7 H- B' ]
            server->upp_channel_a_recv = false;//
: f: z" V4 R% {" q  d7 ?' ?3 b2 H4 Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" z% C8 f- u' Q% e7 i& l        }
/ P2 H: w1 U* K, {$ f6 l  W    }
5 c8 \$ K! {& ]" z
1 W  t8 {" {6 T: t! f7 B4 S: Z$ h
9 z2 N3 K- o0 c+ k) R# l    return true;
( m9 [+ g( G) }7 W8 _' D) h* d}
- T7 t" j5 @* H; \
* ~$ s+ `9 x& C9 m  Mstatic bool server_upp_data_send(Server *server)7 W- b' y5 i8 H6 G5 v% y  N# V
{1 \. U+ E( c4 T  q; j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ g: r2 \0 Z$ D8 Q        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 V+ D/ R/ ?/ M4 @+ s! n7 t  t
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; _( q9 j8 O5 Y% o% k( n        char tmp[128] ={0};
; v: y% Q' w, s% ?# o/ V% n: n$ @* S# f
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ x% ?" ~0 q7 `$ t) r$ I        print_log(server, data, 64);
, P; R* N( _" M5 }, Y
% ^) b" L! X8 |, s        //
4 T7 q7 M# D; Z1 n1 {        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 u% Q4 g7 \( e, O- n  W
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% z% D/ ]6 ^/ D. Y8 S/ M8 i        print_log(server, upp_buffer_b, 64);; g+ v0 ^( w4 s' T# E* S
/ K  n' E& P- u& O$ t: H
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 h8 K* q3 [6 I4 s4 s# d* L
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / G1 Z/ B$ S) c6 q4 N( ]
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- F- B/ _3 e% X$ Y! N. f5 y7 L# f
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 |. G+ G  ?7 F3 x2 s1 l7 z6 Q

3 x: Z1 |& z6 S/ c9 @  g1 D' `        memset(tmp, 0, sizeof(tmp));
1 e/ \& i; I% N- \' R+ v% e        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - k8 X& r: v. Y; ~  S. x
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" G' Z. L. m! A9 x( o" J7 {
        server_msg_send(server, APP_CMD_LOG, tmp);7 z/ i/ z6 Z. x) r5 q
0 k+ ?2 `! v; ]+ `
        upp_error_count = 0;
" i4 p. ]0 g' l% H' p3 u        upp_dmaq_int_cut = 0;
: F: Y, M3 E( W' ]" T, T        // fill in data 0 I0 N$ }9 ^& d! [8 Y/ H# N. N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 e0 u" S( T  n/ P) W# B        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 l# ^6 ~; A4 Y% u4 u) x

5 @; E# o3 X3 H$ ]        // wait send success
$ m$ t" j; P6 k: o6 J! n7 u$ _        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % I* D0 H9 c' [: r/ G! o

+ \& q! i4 f& l" w. |" T) U$ r        // make data node in free list * m  z- d, _' i  }
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) O9 {: i/ |; w# r
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, E3 E7 [; U$ ?7 ?' B8 J2 U- S    }1 S4 X7 E3 z' C) `" K+ P+ \5 d* s
    return true;+ `7 b2 d$ q$ U) d6 H. [
}; c& P3 C8 A$ V% A' o

1 m/ D7 d9 y! T+ S' N# N, e

5 i$ I0 \! ]; f$ L- _( L3 W; N( O
# ?: d3 b4 j& b& D7 f; b( Z- P

; u/ b, W9 [3 q% J# b" T7 U0 k/ J( T4 O: A6 a4 X5 a/ u. p

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 y4 B7 \/ U: v6 t" L+ M
$ q/ s+ K, t" o( v

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 09:02 , Processed in 0.071240 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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