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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# Z9 i: t' q) ^. X$ a# C$ G9 C4 f' G3 r
问题描述:
, q/ h6 B, R4 f! H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. A( v& X+ U5 u+ q" F" D. b, N$ Q0 C+ `
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 A! G' q' h" Y$ |# ~0 `. s/ \, m3 F7 {
测试结果如下:8 G! @1 q( r& l: h8 v: _% Q6 n- b8 P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: q, j& Y$ G) Y1 a/ n1 m8 I! b' O  P) R! u

, ~/ a. ]( ]4 {备注:
4 y- t' ?2 Q5 J. _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% n5 g  C5 B. w! Y4 }$ z
2、相关代码如下:8 X. h" ~6 i' u0 |# s. c1 g/ G
//UPP DMA缓冲大小512字节0 h# B" _! f6 i- G; `9 Z: ^& g
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* v9 |! p% S7 f6 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 N: P. V$ y9 F% I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 L% P1 n: F; D

& h; j7 D) B$ }: o" z/ y9 L6 |  f
//upp接收、发送buffer& F6 N, i' U( ?+ m1 g; i- j
#pragma DATA_ALIGN(upp_buffer_a, 8)! v1 q- I, y, Z, _1 c8 v
#pragma DATA_ALIGN(upp_buffer_b, 8)
: n5 @+ u7 l* [
' a/ c. x. v& t1 f/ k1 bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: Q6 ~9 I( F0 N$ v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 k5 E5 y' E; b; l# e& ]% @  Y! Y- F6 q& K" D1 d  @& j0 O" `' i

( d1 f0 M7 y# n& W% a" P) astatic bool server_upp_data_recv(Server *server)
" N- g0 z$ ?1 {, o( M+ a) @{
# n7 I4 t# K  D  M# u/ U7 h    if(server->upp_channel_a_recv == false) {
$ K6 W$ w4 g+ p: _2 V3 D2 s0 C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 f% f  U1 t, c* u  ~% M        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
2 J/ c5 R0 i  r- l. ~7 B8 X: J            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 N. A4 h. Y% M  ]! K: X" `
+ `2 D3 J5 [; j7 l* g6 Y
6 w4 C) Q* H% M" ^7 j' @; t
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- [* N1 s; E1 M) W
; D+ d; b$ U- S) |' _$ |
            server->upp_channel_a_recv = true;//
/ P; a  P  p7 o8 z4 c            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
" Z: ^6 ~1 n/ q            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
. [9 s4 \/ h3 A9 B! o, m% I7 i            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 l, m2 L! n5 `) d! ~: X            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 Q! j/ r. x9 g( u; }

6 N' t/ O4 |( Q' D7 {8 M& ?- |' n            upp_error_count = 0;
4 _) x$ z( w; R& C! @7 P            upp_dmai_int_cut = 0;
$ F0 B: _9 V# ^! Z" q5 D2 O9 i+ K/ M# r
            // fill in data
- }$ g+ u  l% W: \            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% `. X3 B9 e2 P            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" M  G5 |' \" I4 S( f$ C        }/ n  Q4 S2 l; R$ w1 K$ r& n/ \& w
    }3 \$ c& @% i/ g& l" I
    else{
% q, s( Z, T' m) w        if (upp_dmai_int_cut > 0){
5 }: v8 H9 R. Q) y6 o            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) ^& t, A5 f4 ]# ?$ S  a. }1 ]            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& A7 q7 z. _! S. Z
. F! @7 z6 P! M& v+ Z% E1 q0 `, H; |3 F  F# [4 b
            //copy data to upp_recv_list_busy- F. o- w9 y; K% N7 ~6 c
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' {8 t) M' K1 B1 h7 P& _9 f" `4 d- g# e* W) p; I3 {
            //* t+ _& Y, f5 r% u2 [5 }  ?! e
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ W4 S0 ^0 b% E
3 N; L8 E" y% ?; n& B0 D5 E: ]
            //* C2 M0 ?  d3 @9 E
            server->upp_channel_a_recv = false;//- A" H& ^/ ?7 A

+ t. L" i3 T% Q1 r7 b            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# a1 @2 T8 X2 ]3 l        }: x8 h5 \) I. b
    }
% B' C$ u8 }2 x. ^% d
/ c& }, m/ E: ~  R
% v7 b& I- u" ?, a    return true;
% R5 R; x2 P+ V6 ?$ G}
. V) j# r4 @0 T+ k! i, U) R1 m% Q) U% [$ t0 i3 G; x/ N. F" Y
static bool server_upp_data_send(Server *server)+ }( Q& q( m9 d' I7 a  K
{' g. X3 b+ h/ ^+ Z9 v5 Y/ ?& D, F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) _0 e" V. R* N9 a" V8 A3 z* r  V        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* e5 A) P" F5 p        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( Q% d8 e$ u: o1 d. p# t( G
        char tmp[128] ={0};
% m) L  f  x& l+ U1 o3 ?3 ?; M
0 e' {  o6 D$ ~7 b' p        server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 X# K1 }' N5 p8 I) R  y* G* P        print_log(server, data, 64);
$ b3 Q: Q; T2 x1 d: e1 ~, j+ K
        //& w/ W  r7 \0 a4 Z
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 ^2 O$ p7 t* B4 l9 E+ x( S        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& f; M! A# g; l8 H* {( s6 ?        print_log(server, upp_buffer_b, 64);9 J' j4 Q) p% V
$ Z8 Z) i0 q5 x/ v
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# u5 E7 d, ~; n5 B: Q7 R        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
; e7 L4 w. j3 b  {        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 l3 m. X' |* q  ^        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) U5 ^3 g+ A+ H; N
' ?2 D+ F0 n. d4 F9 q' x        memset(tmp, 0, sizeof(tmp));
4 ^( O6 q- E& c  z; i        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * R+ k5 `8 N: M6 n; O, ~! A
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' I1 q( c# G7 `6 |. ?        server_msg_send(server, APP_CMD_LOG, tmp);, y' h* U1 Q- o/ x# r& P

# l9 s7 Z& D# z- o) e' g# C% C0 a        upp_error_count = 0;
! D) L: y1 B' V1 |* O& P, l! K        upp_dmaq_int_cut = 0;3 k) p8 C. }8 G2 Q: c2 `: U  g2 w
        // fill in data , G6 O2 i5 U1 p* P7 Q3 P# a
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 Z7 v: i$ n: P* T6 P3 G8 }
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% H5 t2 o0 j9 j+ T3 B& t9 {9 H: S% k0 C
/ u6 T2 K0 A2 M; O        // wait send success% h6 u4 R* Y$ X
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " T/ D- {5 [; L/ \" c
3 r* o" L8 f8 @5 a- O5 K8 O8 O- _
        // make data node in free list
- s+ @2 F" [8 [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 H" j: }4 F7 k! z1 E  i, ^
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
* P6 m# H% L' ^1 U; A* i, j) E    }, [0 _2 m% j" I/ w
    return true;
- c6 f3 a# E) R# ^7 z( [7 u}
. J& X5 I( C' A7 m" `8 {# {% l- J# K9 B

: f+ d, Y+ ~4 K. U! T- w. `% \2 s0 J; t& f( ]% T
# n; G1 z: \  \0 x+ o

- X" ?5 f2 ~5 |0 [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
7 x. m& x$ p6 M1 i$ _! ^2 M- c$ ?* P9 m* N  V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 03:10 , Processed in 0.046816 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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