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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 E6 E+ g8 M0 l, d& C( T% Z: J- V0 l) v' f0 e* @- j
问题描述:
9 ]/ F3 k! ~1 R; l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:1 Q- v" t. M* _/ y4 w3 o) ~! [) ]8 _
7 Y4 E# A: V: A2 r4 ]. x' d+ |1 I
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; y# I1 z% v  G4 k: n

+ v8 c" N" d% {0 \: w测试结果如下:8 k( x/ O6 }( {' s7 B
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: m9 ~8 J, {2 V
' h# i! C5 l+ e) t/ s: ~

9 o. G' a! f6 H' ?备注:
) e+ m. i, K% B; j' Z4 m# }  W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 Q, z8 z5 c+ B! I0 ?9 ~) r
2、相关代码如下:8 |1 ?+ s, j0 n- z  _
//UPP DMA缓冲大小512字节, R( M, j7 v# o
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ |6 D7 ]- e7 F5 w% ~% B/ ]& J. P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ E9 ?& g& @1 r$ X2 R# d! `/ T
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 d6 T: h3 D& R, N4 I' N) i

3 V: \% i( g7 i  Z3 b% F
+ h) l( [% c0 T! `" z//upp接收、发送buffer2 F3 ]) p% D8 M: f
#pragma DATA_ALIGN(upp_buffer_a, 8)3 E- C8 N5 h5 X  E$ |
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 v% S# K2 N$ M6 h* X1 z9 \) E% g6 v; e  K! C' Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ X& e5 k; x$ @2 q; C
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' @% G( \! Z% I5 E" [$ F8 i8 b# I& r0 `9 ^: N) o
: ?; D5 j* \" Q+ @- G4 P
static bool server_upp_data_recv(Server *server)
$ _" Q. z/ C  [, e& W{9 q6 l% T. X, z) F2 I
    if(server->upp_channel_a_recv == false) {" Z2 I2 b& j$ L* x7 {) m7 {
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 ]( h8 w0 h! m- B! g        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 U: n: v4 u1 m! _# u$ p            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 Z: `( `# G. S( z( |
  b. K3 N  |$ j
9 j+ @" Y2 L8 ^# Z1 S' P            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 l% J0 W7 M& s- Q, _
( u5 S$ Z2 M2 q' `' }
            server->upp_channel_a_recv = true;//
& |9 O2 m, m  r# P6 }            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- T% r  j  c6 R& _% }+ l            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
9 X9 N" I7 M3 M. K  o2 M3 k6 w            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
5 z* e$ R/ M+ _& n9 e4 h! m            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( F# L1 `1 b! @. R6 H. A8 z- C# }) L: V; [# z
            upp_error_count = 0;
1 {3 W8 `* k: P; D( h- n( V( x# _            upp_dmai_int_cut = 0;" ]1 r  [$ k5 g; x: F$ i: j# |, t
, X! C  D, c4 l
            // fill in data , Z+ S/ U. m0 r1 |- K" x
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 n% W$ R6 I/ f( _: S3 x            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ j* @6 ~  q5 }+ U        }
* ^0 U( P. L  L    }& g' V4 b. J/ G
    else{# U$ y4 |3 z' x7 y
        if (upp_dmai_int_cut > 0){' n; f* f, P5 i- j; _! s) |
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 Q- H3 S$ `5 {5 `$ L            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# _+ j0 n- a( g  y4 J
% U4 E( M3 \$ B2 M# k2 S) l  n% d# a2 I7 g; t1 n: I
            //copy data to upp_recv_list_busy
. [6 i' [) @) r            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ P3 W2 z3 V; D9 I2 J, {# w# q6 w: {: R: m6 y7 D
            //+ I, b# O, V; g" t
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  N" v7 P' F  d7 X/ C. p
+ x1 r" O6 n# `+ V1 n# J9 ^- s' `
            //
" E! g8 b+ ^6 d* i# Q            server->upp_channel_a_recv = false;//
+ f/ i& w% U* N' b/ E
. }( D; c+ y4 {+ ]' T- l; w# O( ]            server_msg_send(server, APP_CMD_LOG, "upp recv: success");* g" p+ ?/ {3 R2 z$ C
        }
. T" ?% S& g, u3 t+ o6 ^  s    }. x6 Q- ]9 {" e

# x1 @( C" @" o5 S; ^. C6 M- Y) [/ m& H; U) N( |# f3 Z
    return true;9 k9 P; \+ d1 y/ Z3 Y) G: Q
}
4 ^" }: f5 H" X# F
9 X  g3 a$ c' k  T9 u, `static bool server_upp_data_send(Server *server)
- a. ~4 G) i# l( b0 o, O! Y; A7 K' L{
; S8 R( q; y  B/ B+ f    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 s5 l+ \, f+ M  x9 C        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  }2 `4 P6 O8 o) M3 y
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, T: ]) N* t( b, M6 L
        char tmp[128] ={0};
( H9 h4 f2 H& v( _6 K, V
7 P; \7 A! Y7 A        server_msg_send(server, APP_CMD_LOG, "upp send: start");
% x# x; j8 u8 E) }        print_log(server, data, 64);
  k2 ^# |! H% l. g: a
( W& t2 H. _  N        //& L) L. S8 v: e, x- J5 @4 a& v" b
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 D; ~! S2 ?2 S6 y6 D6 {        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);4 @: z# O- [: x) Y; K, n
        print_log(server, upp_buffer_b, 64);
' H+ D* b& k9 p7 H  E. d) @- `0 d
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
1 K2 }& U. Z9 E. x        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 ~1 m5 M) ]5 ?. C7 M        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
' y: D* S0 j* k1 P" n" @" W" `1 g  O        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 q( s1 _( [% N9 H3 \

8 t$ {' O  \& v2 V1 k7 s0 V' K        memset(tmp, 0, sizeof(tmp));6 h0 F$ S- Y% n1 Q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 e, y0 f, ?9 V$ v' u1 q1 j6 x- q8 a            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 u' R- w& x3 X" n9 Y; U; h" [
        server_msg_send(server, APP_CMD_LOG, tmp);, \  t1 ]3 F- B" @( l+ Y) F# u; ]
* F( `; c8 B# I. T* }. s0 s! g# ?8 @. z+ P
        upp_error_count = 0;
& X4 s# {) B+ V" F        upp_dmaq_int_cut = 0;9 K" \1 ~0 {% U  ~  x' }
        // fill in data # x2 S( {  N& X( {+ r
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! {7 w* U9 L1 Q1 G        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- P3 K, s& A  T6 t! V

6 w, E# G% q% N2 D1 c( U% E& i/ w        // wait send success
: t$ v3 Z' ^3 W% i        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' j" s% e% }, |  V; p! f4 V$ {
, d& D* D, I: E+ S9 ^, O7 e
        // make data node in free list # z; g. q! P  @3 f
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 Q( p& }( s% c$ i9 J        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) m+ V' _0 C1 O    }  E! X! {) `! J, z+ L% u* q4 R. D
    return true;
8 Z/ N1 E: m% }$ c- m6 i}
6 o$ P+ [% `  G0 A" i
/ g5 x( z( Y# ~: w

- A9 v5 t9 X8 M& R
' q( b& [. e1 T- m& E" Y
: C1 c% i. ~+ B' Y3 ?+ _
9 Z0 q$ Z& m( r7 m2 ^9 u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ S3 r, O5 m( k
6 K# V" H1 n! ]+ ]6 }! |# ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 04:14 , Processed in 0.042182 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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