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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / n+ Q: C1 ^, i7 _4 O% V* a
8 m" |$ @% E6 z* d
问题描述:
* C: ?7 a. C+ _! o! p* |% D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  R( ^7 f0 @# ?( j; D* T3 k

% H+ @  i. @" F; n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 y0 x6 _+ `* j$ \4 B( g0 m" b, _7 l* p' L
测试结果如下:
9 q/ M  d; \8 [3 T6 L4 A" T  `138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& G8 q, T' u+ R: m

* Q2 |& ]" U- s
. v* M$ g# k1 o/ {6 D" }备注:" e( x+ o) j3 g; m' L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: s: v( |# e" v6 s
2、相关代码如下:: u% }  U" u4 J! o6 w5 w% @1 {! U
//UPP DMA缓冲大小512字节
8 y6 C, A- {+ h! E1 ]7 S#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. i/ Y5 [% K: }$ Z( G% h! ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) A# F' r# r+ ~/ k3 u- d
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; N3 B; S+ F6 R6 W" x/ I3 C& x7 d. ?5 x/ {& d
9 E0 b0 X( G' \
//upp接收、发送buffer. Z2 H7 C  S- ]' i+ t+ O6 L, ^
#pragma DATA_ALIGN(upp_buffer_a, 8); T( ^# b; N) m7 R+ |  \) G
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 u; P0 H& h9 h" H: a1 U& e- }( I7 `6 v3 P! Z! o0 ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 d  A" Y4 o7 t: b5 U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 F( \( P+ {9 S6 I4 O7 P2 D1 k/ n) b% m, D* o

3 P. v5 x. l+ K9 Sstatic bool server_upp_data_recv(Server *server) 2 b% P  C. u: T7 i) N' g) f  s1 b
{
% A) y- x: A9 Q  O4 W+ M+ x2 r9 u    if(server->upp_channel_a_recv == false) {
! o5 ?2 `2 p! i        server_msg_send(server, APP_CMD_LOG, "upp recv: start");; R- X1 b( w% [/ q- D
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' G& e' \$ |  K8 `  U
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 U. s9 w% o" n
1 a( O+ r+ v) G1 S- A  d: k5 Z4 s( P
6 Q7 h, I0 v, d            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 E3 O/ L* r' F& }( Y; ~; T
+ A0 p$ P# E! k
            server->upp_channel_a_recv = true;//- R% l- ], C# X
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! ^" y5 V, o8 C
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;4 Q* c/ L0 d0 m: F
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ Y' o* Z, D1 U2 [
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 w; Z; x0 ?: @' N% _& H
- E  R" H7 X5 d/ [            upp_error_count = 0;& v" f5 m+ Q; }( P" h
            upp_dmai_int_cut = 0;
6 p8 g0 b, ]8 ^0 C1 k1 N# j2 w, r+ m' s6 P8 N" U. Z
            // fill in data ; V) Z4 t( U# Y; X; k) ~) P; n
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 |& F: K; G& M5 T. G5 A( E. {5 r% U
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* q. j+ X6 Y2 a4 I        }
  T- p4 K; L1 N    }/ p+ ~5 D( i( G6 T' |/ _9 A
    else{' n1 E+ [  g0 p% s8 g/ h
        if (upp_dmai_int_cut > 0){
% P( ]' g2 T0 d' Q+ W6 N  W  v            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 o& H% G% `7 {! R            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ m- w) Q% D. O8 U* g3 e
6 B" g8 Y8 i0 N3 u
+ ~/ c9 p1 Z$ q9 ?* f; ^5 j            //copy data to upp_recv_list_busy
2 O4 z0 z9 [9 o            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 Z4 f# F' m5 d: {3 }* o* k. ]8 E
  I, e. L. D2 v" ^: Z
            //! s1 F( W8 [7 E0 \' R
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! D$ q& j6 D6 x, @, q  I- o( i9 V" h
            //" h( E0 ~' _3 G" g7 F
            server->upp_channel_a_recv = false;//* r( [2 R: s* h1 r. [

# n  W4 h5 t% y% R: Q6 n, e            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
( e3 o: \& c, Z        }+ ~6 D7 c! W0 [! @- z' Q- }/ G
    }- @  C! O4 ~) A" o" x( L9 Y
3 w$ i5 t) B6 e5 ]5 E7 z% b

$ ]3 l( g! R5 k6 a# _( }7 o+ r  ?    return true;
6 |% j. E1 N, M9 c( a& B}7 W" N2 b) b( O$ [
& q5 h7 x4 B* E  v0 d9 [
static bool server_upp_data_send(Server *server)2 G' y3 O! Q6 z/ e2 X
{' I* V  ?3 V) {) l
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: G! q) ]- X( ~; D# }# v
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& d3 j9 X5 n/ C8 ], P        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 U, {2 U3 r1 g3 B        char tmp[128] ={0};5 c& i" \' c0 V2 c
& [, t9 B) m) @
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' |, p0 H2 v& h$ H0 }9 w        print_log(server, data, 64);
0 ?6 a) T( J$ D  Q6 d# X! f4 J: e  O# I: o, l9 y% @  A
        //+ J# K- \6 l: h% F- M
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 j: \4 R& L, X* X$ p' `+ ]* l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ O  n& `: ?0 e. L        print_log(server, upp_buffer_b, 64);
; n% K9 U, m8 t6 i- a) k" s" W. v$ B) m! C) @, w8 U' K
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
+ ]# ]' t# a0 L0 K; r* ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! H7 B* `+ z: H& F4 e2 A
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
$ c! k1 y: Z  \9 W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) \9 h. M  K9 V/ i$ I% Z& |8 |7 a0 P& n) j
        memset(tmp, 0, sizeof(tmp));
3 n4 G# \4 N0 ~* Q" h# R2 m: \        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, W( I3 z+ |  e5 S            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( v8 ~: A' D( R% g) J
        server_msg_send(server, APP_CMD_LOG, tmp);- I1 N4 g$ q, G9 Z6 A: |
9 @" j/ r3 l9 b8 Z2 P2 z, p
        upp_error_count = 0;9 S5 ^9 a  n. M4 r( \2 }0 R' A, q2 L
        upp_dmaq_int_cut = 0;( g9 h# _9 K' i, v8 l
        // fill in data % O7 e$ X7 g. ?- _
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * v( C8 E2 o; K
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 ]/ H0 D3 I8 l6 d
7 W( q6 V0 {! }+ d+ F8 B
        // wait send success6 y& ]+ i) U" @! ]0 l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   t" u" x# Q' a& m) H+ r* I

0 ]; m4 b+ ^, h7 |$ ?9 ]5 Y        // make data node in free list 4 q' [+ Q& o9 I1 ?0 a" f& U' _3 z
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ y6 ~# j0 t; l        server_msg_send(server, APP_CMD_LOG, "upp send: success");% w* b& V& ^# x3 G  N5 X) o) ^
    }
3 J$ \0 l3 l: R" W    return true;' |+ \2 p$ y0 _1 ?1 |
}% ^. h' A" o. v6 P3 d" T

" Y0 q" F- w% T4 o# H

3 H0 b/ L0 O( }
4 Q) `# v! M3 t. p, R
0 c" G% M( m/ i$ B

& z2 W: W+ L1 i2 _3 H! `  u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐; ~5 n) G4 V8 j4 P6 Z
" F7 X0 u) z" Y* ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-8 06:49 , Processed in 0.039985 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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