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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 k4 p1 l0 _2 n1 ^, D$ T3 ^3 [. r) Z. s
问题描述:% y' S) b, M" c/ m/ V; l  m8 k8 M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 _) Y2 I6 G6 z. ~+ O$ |# m
, U) E+ o7 f& `' `1 Z  D# O9 P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" H( F4 b6 X4 x4 f3 J
1 }; g" O4 N' |& ^3 c/ n0 O  @
测试结果如下:- T& c  y2 `& F7 M% b
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 \# J- n9 S# s' {  u3 D6 S6 K3 \) n9 ~. H
+ l- F2 T/ ?1 U0 X( t" v
备注:' e8 G4 C  h3 R+ j" L" T: F
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; x* N1 V* ]$ a: b! o5 v" V7 f
2、相关代码如下:
0 _( [: d$ v3 j) a- R//UPP DMA缓冲大小512字节0 A$ l. r" E! K+ i0 v& N
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' L' r/ Y# n$ d- ]2 B- l$ F; V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 I* F) y* k# m. A#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 G% Q$ C" @5 c# f4 x+ Q5 m9 u' C/ ^, R

# r7 K/ b1 O4 B, O//upp接收、发送buffer! G9 h7 d. L7 l% s4 R* S4 A
#pragma DATA_ALIGN(upp_buffer_a, 8)) t2 Z- A3 ^; F8 d( l
#pragma DATA_ALIGN(upp_buffer_b, 8), F- J* Z- Q% X7 |4 j
( {" w% b/ w. {) G, e
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 M+ R5 N; C* T/ ?3 m6 O+ ]# L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 Z% k. N8 m. i/ L! O
, _4 E. f3 `. d& l7 U  p9 r. t
5 ?1 @1 z' P/ g; N' n$ C
static bool server_upp_data_recv(Server *server) . H) }6 y3 O/ x7 N
{1 Q# _4 y- M7 ?- O
    if(server->upp_channel_a_recv == false) {
* H* S9 M9 l- K5 X0 O- @' ~+ w        server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 m" [. g& Y& B9 ]
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 o" D8 B# m1 w0 r! j$ d. I7 l            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 M$ n- ^: x1 Q, c
9 i- h& Z8 J' X' p' t+ r7 v
5 ^- i2 ^& C; a* W6 P5 i
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. S; V* k! i4 x4 C, K2 v* M& x- o- @
            server->upp_channel_a_recv = true;//3 R. s% g/ M& l3 R
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 h5 b8 p! L3 S6 m! O0 ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;; d9 ~3 u" _' B) |" E" x. ~
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ p( {" u1 M" A, i' V) i            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- J1 @' V  e/ d& e, C) C# d7 S3 q: q0 \2 w0 l3 v5 q
            upp_error_count = 0;4 A6 q5 o4 ^: x' c* _
            upp_dmai_int_cut = 0;# q. @# x1 c% Z1 r- ^

* J5 c8 g" y' c7 m1 w; h: c1 n            // fill in data
. L/ [% q3 V9 |' f3 _  d, m            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 f3 E& x* b  p, C6 F6 e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& e" L6 W( L! _& z: }# z" r        }+ D. c! i( g" i. Q# [' z+ q9 U
    }) n+ D! ^) N: ^* N9 ]* G
    else{& h" z+ ]1 z4 z/ H5 @
        if (upp_dmai_int_cut > 0){: g. K% `$ H& }5 \) M0 o" g
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! C+ S: m* b! D$ s1 X2 F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 y/ W! n0 t# m. c" C2 W

# c! I5 H+ p; n+ h
: U" _4 s& W" O- l' T            //copy data to upp_recv_list_busy$ ^+ s  j7 x+ {) w- ]. g/ T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 }. H: e; k( k- A2 J: f; s
3 T+ b7 D6 g9 @; ]/ m3 o            //! G; }1 a. p) P8 Q5 S/ o# p
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 |/ w  D( q; P  u2 r! ~
+ _6 n/ x& Y. W" j" E5 Z1 `
            //$ ^5 m) N( U/ h# u% [: W' @/ {
            server->upp_channel_a_recv = false;//) s4 ~( P/ B, g0 t$ W) C2 K

, J2 I$ n* F0 _2 S) ^            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 y8 |) u8 `( j$ [1 d$ o1 h
        }
4 q9 N, i  K3 a0 i- C$ m2 m( N    }( r8 O. p/ x9 {6 g7 e( B

2 X% e  x$ j/ h5 `
/ d7 W/ C3 @. i2 y- E# h- j+ l+ O    return true;  L/ ~1 G0 V& V8 {
}
/ _$ P8 C! ~% ^* d) k( L2 u
. L# |/ U. W( L0 S$ Xstatic bool server_upp_data_send(Server *server)
. I* ~+ G/ c. _{% L9 e, z6 i# `7 X6 @9 r
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* s% W1 b8 m( {+ M% C: ^
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; q- v4 Q/ C* z! H0 J        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ v8 }" l. E4 r' v# V        char tmp[128] ={0};
; O1 j7 S, K7 ?% ^/ K) f% T9 A$ }6 e3 a% ^+ }4 K7 [
        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 E3 E  ^$ ^* o
        print_log(server, data, 64);2 B- W" S/ @0 t# A) v# Z& X5 E

6 ?  r( R) J: t: u        //5 A& w/ u5 U- ^" T1 J0 I$ Z7 C
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 P/ l8 I7 e  F; M. [$ x2 X
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 v- f+ k, i: A/ V* S4 O+ V) i        print_log(server, upp_buffer_b, 64);
8 S( j& r8 h* _4 l. _/ Z; W5 a# u# p; o
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);0 o4 Z  h; _% B3 Y0 x) X
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 6 w. b$ o; @4 ?  E. B5 U3 _. Y) B
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
' S  i7 p9 u8 d/ U. [        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 t/ q3 o9 O. d5 {, u+ o# F" A1 `' q1 A. Z0 b( I0 M
        memset(tmp, 0, sizeof(tmp));0 I. r& @$ b; `- D: @; n
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 W3 n0 t7 y) T3 y6 S
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 F" j6 I, l4 c# i3 r
        server_msg_send(server, APP_CMD_LOG, tmp);
) M# q! Q/ Z9 r4 |8 E
; s3 z2 D( F- L4 |) O; j4 y8 v        upp_error_count = 0;! Q9 M( o3 {* Q9 ~% @0 l
        upp_dmaq_int_cut = 0;
! k- u2 M. m8 i2 x2 t        // fill in data
- {6 ?& {6 z$ T0 j. T7 m; ?" I        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 |  b+ K( \% [/ R6 V0 h. Z2 x
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) [" Q% v. ^9 ^- w7 B- F4 O: Q, B7 j1 s& ]6 L% }
        // wait send success4 P3 Q9 R* B  K9 p$ I
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! s- {; ^$ l* P7 c% W; w  V) F  G6 Z
        // make data node in free list
& {7 G2 `2 O) B* q" g% `        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 l! N3 I  i& p6 I/ V
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ N0 s, u- O1 F2 d/ n  C" g; E
    }
2 F5 S1 n* @/ U    return true;
% j0 A; o' e9 e3 Y1 Y7 d( g# a}: d; C( [9 Y* n) Z4 k- Q1 I
* X8 u" H; P& V0 A8 @/ S2 |
5 d2 u! P6 t7 o

* M$ V& A5 o' w0 j

8 b- J" f3 ^! B9 F( W' P* K! G; N9 \" q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐# E4 R; p. U& I* F
$ {3 g2 t( t; {6 @6 ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 12:54 , Processed in 0.039737 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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