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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 s9 x) H) B  p8 w0 o; A& q/ J+ k% o: y  A
问题描述:0 T+ f' A. B2 ~: t3 b1 J
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* Q( l. k4 X; S/ C% m, F7 \
' n0 N1 R1 U+ J
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ h% v! S4 V- J( {  S) P$ D

8 ?# ]1 |- Y' t/ t测试结果如下:3 [9 {- r4 b* H% D7 W; r( w* u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' X1 H" {6 l5 _: ?3 \
, L3 X2 Q7 X' u6 l( T

; b0 }: {4 @1 _$ `+ n# m备注:
9 R9 z7 j8 T6 z4 ?1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# W' h$ U% `7 {! T
2、相关代码如下:6 l! \' g) D" f4 n7 g+ ?" \
//UPP DMA缓冲大小512字节
  I. _/ G' x1 d3 B2 @: w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 J* o8 V+ g: V9 o; _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* r5 {' i! N, m6 R, ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& h5 ~- @6 V/ j# A* x3 x2 p
' k# `9 v7 O% ^: l  Q5 `# b. w
5 Z6 D. O/ @0 ~+ j% h
//upp接收、发送buffer
- ]& t8 a. i. l- Q4 Z' r- I#pragma DATA_ALIGN(upp_buffer_a, 8)  g' J% j. }+ |
#pragma DATA_ALIGN(upp_buffer_b, 8)
* k; n, N7 a! R9 A( F# Y- u
) }( I5 k! g+ S" Y8 Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 p6 u% X0 x, z& Y. a, d: H8 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  T2 q5 P: Y! j( [: t0 X+ ~" [$ @0 O' ]* J: ]9 R
. Y, p" I: o' T, p8 O  X4 ?6 `
static bool server_upp_data_recv(Server *server)
% M. F0 l& ~9 e) G' l{
8 q' _% B+ p0 N/ r, e( B( n    if(server->upp_channel_a_recv == false) {
) m7 \7 U( [( a. I; R        server_msg_send(server, APP_CMD_LOG, "upp recv: start");% P+ U: u( P& z0 a
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 X' _0 m: n: \: o            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- x# i( V, F3 \) j6 a4 I
! \! F% D( T/ _0 c# Y' O( u& ]
& M$ \2 s$ h1 B8 W& b9 U            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 ^7 F4 D. x7 a- d  F5 U( Q
% b7 \4 _/ g$ D" t% d( B. M( n  G
            server->upp_channel_a_recv = true;//
5 ]. ?, C7 j' Z, k  p( }" P            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
  ?- y# a9 w2 E6 q8 z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 U0 O% I* U* w" n4 h/ v3 ]; T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  U6 R5 d8 L+ H8 }+ U, {, v
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; Z7 T, c0 P6 s0 {  e: y
! K" l: F5 x% e! \& o
            upp_error_count = 0;4 M3 _# I; A$ y- o7 @
            upp_dmai_int_cut = 0;
# u  ?5 M7 c# K9 S9 p4 O' q0 k1 h, L0 n+ E# L7 u4 K- X4 s. h% Q) a
            // fill in data   }; \1 e/ z7 U  f) i, S
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ M: i& S1 w5 m4 B% Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 b+ q/ y% _5 a& |" i/ r* w7 w
        }1 x1 o; h0 e) D! f. V/ u) O& a1 X5 `7 @
    }# X: R8 w& |$ |0 I/ `/ _+ ^& Y6 y
    else{5 W0 C4 T/ s9 J3 h
        if (upp_dmai_int_cut > 0){& O1 ^, t' T/ F* N0 y. W
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 }8 _' c2 L4 K8 v            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 y: W3 ]/ `3 d6 e  k
5 V# j- B1 p! S( L' N' Y

5 B$ g* q7 e. B# \            //copy data to upp_recv_list_busy
: D1 x( M. ~+ G: P8 g8 @            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* T4 h" S0 h0 _$ F  k. {
% _$ f0 ?$ w. j) k  h1 U% f8 m& C
            //
0 G, @9 E" f/ B( W            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 v- Y- b% I% |) W2 o4 Q' v6 @2 M- s& E; t/ I
            //5 u4 o, W$ T) W! b; U$ }( Y  I
            server->upp_channel_a_recv = false;//( F$ m& F. S  j1 g- I2 f
9 Y+ w. v' N4 G/ _, {
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 J( D/ [4 C) y) X/ Q7 y! g
        }
7 t& x1 c8 Q9 p# U0 d9 r# ~    }
% Y/ R: C6 W) S. f: a9 W. O1 w9 Q! i9 x/ {6 _

) ~1 ^6 v+ I- Z; A8 f0 t6 Y9 E0 V    return true;7 Z9 O9 V  u5 `6 J! S
}) X! l; b' n. o( N- C; g0 O

6 u( ^% {8 O1 V9 N; q1 j! sstatic bool server_upp_data_send(Server *server), |# _/ W0 @1 H& S8 B
{7 T8 r- [: ]7 }# ~% E7 A) s5 W  E7 [
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 ?1 E1 e3 s9 e/ g- v4 ?1 f
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 ^1 q3 c( p& ~; C$ @        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( Q, B8 _: k& c, C" q8 b6 k
        char tmp[128] ={0};5 ^3 D: s, O! t% X$ v
1 Y$ J! o& N: t" L
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ s6 ?3 [2 q8 U        print_log(server, data, 64);# k3 ]/ w  A2 u8 l6 k5 F2 {

9 ~0 W9 F6 E- F2 b        //
, \* J& e# e( D% b* v        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, M( G" I; B7 V/ A1 o        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 i4 W! |3 |- `$ [        print_log(server, upp_buffer_b, 64);3 W3 k/ h4 H. f9 k9 S+ j( B9 o

% u$ z4 w/ K' x! _/ [6 v" I" t4 u        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
6 q7 a1 T  j( u7 n) R  a( m  j        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 w3 i0 `) D# B, u" ]! W: l+ f        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;: [# n! Z3 q! o6 E$ X( T7 D
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: T" f" T9 V4 r' d7 J5 k5 D9 C; ^5 L3 j  N3 w1 K: I& h4 d
        memset(tmp, 0, sizeof(tmp));
. m; ~# N' q5 C4 v9 n1 J9 \        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 T. n7 D% F/ D- R, c$ K( }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 a3 L; \; w) K* Q9 x# _
        server_msg_send(server, APP_CMD_LOG, tmp);7 s$ h- G/ `; X/ W2 L, o- K$ g; O! p

6 S/ p6 Z1 B6 L% K. A6 a! [" B        upp_error_count = 0;
; c* ]4 `! @' A7 X        upp_dmaq_int_cut = 0;) Z# f/ _9 E3 J7 m+ ?! D
        // fill in data
. `% Q4 G/ W$ N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* G! y& C  I  Q2 r" ^9 b: D4 _; ?0 o, t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 C; k* A2 ^$ c- i" q. |3 \* U+ O( P
        // wait send success: }) h8 \! F" i" J6 x' q1 `" V
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 R# I$ p9 A( y

* v* [( [; H2 D# Y        // make data node in free list + p7 l5 w6 E6 H2 }( A( C: o: e
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 v' c2 n3 I( s( V
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 B7 H- [* h9 q    }2 U; W2 D$ F5 Y3 ~( e2 C- A1 b
    return true;0 G/ Z4 p5 o) E3 a( x) q$ O
}
. ?$ W- Z$ w4 A* y# c
7 j! E- {* A; f1 z& j

1 {/ i2 u/ }; t4 t, F9 [0 l; i- m3 v! s6 ]9 b% R

8 {9 l: {/ R% J9 Q- @# b3 |- Q4 i0 P

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
. w3 k2 @0 B7 e+ M4 w/ E& _5 u6 E8 l2 L' w0 N3 h* ]- A( ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 11:22 , Processed in 0.039648 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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