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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# L; {9 U/ p" m7 y9 z" j: G% {# M% ^0 A) n% w; [) P' j
问题描述:* l' U; f% k* a0 o. C: G% k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& B( T5 S' c" |6 v9 }: H
# m3 ^8 J3 ]' M$ g2 ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ W, M6 L7 P' b+ q% [+ p, e

1 d' B" h. U9 ?% I测试结果如下:
6 H- s  M9 h1 X3 f3 G2 R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' h! r& P' J4 y; B% r
8 U% Z9 x8 {/ N0 g! o5 D1 x% g3 c: z2 D  a8 l& J0 v) [+ n
备注:
; h2 x- |' x0 {/ C. g1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( t. C% M1 H- w9 X3 l
2、相关代码如下:2 N) \. c/ y5 F$ j1 q7 h
//UPP DMA缓冲大小512字节& ^5 u8 u- I& Z5 c7 }! c3 M( g
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; T( d% _- w0 U! a; O6 }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: N6 f2 U" g) q# N* t4 J- I
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ G; \5 k3 e7 l0 H  d

- w. A# ?, D5 M( B& z! Q" R# {, W. k( x/ \) \, ?
//upp接收、发送buffer
& a6 i8 b" T2 @: l#pragma DATA_ALIGN(upp_buffer_a, 8): v6 w; ]& g1 q) T- \: G
#pragma DATA_ALIGN(upp_buffer_b, 8)( ]# H  g" l! z/ W
1 u1 c1 u) n! f! s6 N
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
* L6 V% A6 h: xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, y% I( @: C  ]- u& w
* ?) K( M$ T3 J* W$ p' @
! i4 ^. }3 k# S( y1 w, B% T2 ?static bool server_upp_data_recv(Server *server) 8 A1 [8 t9 L2 m" N1 V7 C6 b
{8 m6 C+ @; Q1 R( g
    if(server->upp_channel_a_recv == false) {. ]% v5 l# d5 U4 S
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 d( O$ b( A0 _; p
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ @! j. X, A0 n7 F- `4 w" M            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! ~# K5 ^6 C0 x- o, z4 y: F
& `* y5 `8 G6 T# g

$ a9 W! o, s4 z$ g5 {# B            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  S+ U7 I! [: n: ?# v
& J/ K/ a" g4 K; }2 h. e$ I
            server->upp_channel_a_recv = true;//1 o3 {- {: f5 I" @/ l
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ k. P% E, e+ D5 a7 {# n. |- u            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  |/ }/ x$ d0 x% Y! [: r) V            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
' @( h1 j  _% ^+ d- A  j            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) e% h9 r) P4 d" y" i$ d* K# }5 f& I$ x- X" ]  W6 s
            upp_error_count = 0;
/ m9 E; A+ O. |9 w            upp_dmai_int_cut = 0;5 n- C4 h# Y5 b  Y- w
2 b# C% W6 S8 A" j6 E
            // fill in data
5 r8 `; F5 O9 F% o" p. P            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 ]- Q0 R0 k  }            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ d* D* d9 ?! `  e        }  P5 O* R  O' t1 w
    }- G; N/ P7 I3 O* q3 b
    else{; u6 N9 B7 i; X8 }0 n1 a5 h
        if (upp_dmai_int_cut > 0){
/ }  [8 k7 G; }$ R4 L6 r            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 t& c' f! Z) E' x            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 y* a& Q. B( [7 q/ z) C$ f* l6 P; C0 X# k' |- h
3 I5 c+ N6 U- u$ i
            //copy data to upp_recv_list_busy' K. J: V' y  i  E) S' E  V
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' q( O+ H1 h* z7 |* w
4 K+ A, Y! }7 S/ R" M+ k+ U: U
            //
/ ^$ _2 o5 J* }, O  r( m' o. w! w            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" U' ?  E* p  S  M/ s; {# ~/ t" A
  J1 n, u! e1 j; X
            //) n# n$ d$ x7 y# X7 ?0 F
            server->upp_channel_a_recv = false;//
- Z; {9 Y" z" B1 ]4 g
7 g- u' X# k: D, D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ V  q. O; v  b1 x1 Z# _0 A        }
# S3 A, H4 c6 H. o    }
( m. G+ k6 b. T7 o% C7 O& ?+ B4 C
! Y4 p; m. A4 l& _/ [( ?5 F6 ?7 [
    return true;" f2 e0 O, v* S5 C; L
}4 P  V0 t( X5 g3 |1 _; `5 e$ \

6 I  I' r; }+ o  R4 Fstatic bool server_upp_data_send(Server *server)* L9 x! N7 J! A2 Y& {
{9 D# V# O: b9 Z$ E( Y
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% u& I6 k: q# ?# ^% I7 P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 s2 Y! G  a' M% d9 M0 x        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! m$ k# e% I- `9 q7 _7 g        char tmp[128] ={0};
9 G) F8 c' }1 u  f1 Z8 J- V8 R8 l9 R. f! @
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
- M1 d) `7 f6 S6 b        print_log(server, data, 64);
( L  \' f7 _  V2 ?5 z8 {4 N/ m! x) [# E6 O0 `1 o0 X- ?
        //% w3 g& P( W* S+ H% \
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);9 D9 O: B% P' \$ Z0 `- t
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  l: C9 U1 G  z7 _" w8 |9 s5 b
        print_log(server, upp_buffer_b, 64);
; l* m$ U8 B) D3 p3 U4 h& q% |
$ _6 c& d) E' v; B+ f4 v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
( b0 m7 q- e& k/ X8 X$ N& F        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 ?" Z% `/ i3 v/ o- H
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
& f4 U; f! K' v0 s        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;  h, A9 O7 Q# U: Y

. r. w) W( @6 O3 S& @8 Z2 T( o        memset(tmp, 0, sizeof(tmp));- v- c7 A$ X+ }  N3 Z# c
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" h% z" K+ H5 v7 M0 k  [$ k            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ E: F" |9 J5 t# w% g' d
        server_msg_send(server, APP_CMD_LOG, tmp);& Q# O2 Z) C" s0 i8 I

* w" r+ H1 c, G2 d4 C7 z7 {! w        upp_error_count = 0;
4 Q, I( ?1 |3 p3 T) ]. Q        upp_dmaq_int_cut = 0;
+ U3 L' c& {3 o3 K5 @7 A" h        // fill in data 1 m  h- c% f* ]6 ]. t
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   v* H: V( p$ P7 y
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! S  g. ]5 ?) ?% H
: a; N* E3 @( d. S. ^. B0 N
        // wait send success
5 w- I+ C  _+ I" n        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # q4 e  ^9 Y4 ?$ a5 S3 a# P! ]
3 g0 k7 w& d: f: x7 J
        // make data node in free list
, k- x7 X* r, R) Z& l# S; B- L9 Q        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, E5 D9 F% q+ |% K2 p9 A
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
# Q5 r/ }; D$ ]    }, G  G. [" J3 N) E- ^& Y
    return true;
8 w0 h0 o$ U/ f2 `+ ^9 t0 b4 g}
) L: r# {) @& l4 W/ o+ E- Y7 ?2 y- _  L9 X8 a

4 h- b7 Z; B2 \7 R( F3 \# ]8 J# t$ z9 i( w* J2 S. d6 K. x) q
) N' G5 B+ I2 p" v+ p+ u

9 w7 }! g( |) C- z- z7 {

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
# T3 l3 k$ u3 [# G% Q$ B1 t% @/ I1 W: l: |0 v

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 06:20 , Processed in 0.038807 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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