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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # J; W5 _7 d/ v: Z+ h/ g2 B6 b
9 Q. p2 y" |& V  F
问题描述:
# O8 ?& K  Z& \/ B* p) P5 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 K  k. D; S- s6 R

# _% n: w' t8 H! D5 H$ E! B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
, b1 m+ a3 B% R* @2 a0 u
' A  ]% m7 S( A; Y测试结果如下:
$ s- l- a: h9 F! P: [' Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 K, u7 r! r5 u$ Q- Y
2 z6 n7 U2 n. i6 X$ k* F5 D! Y7 r4 A2 H7 s1 w9 r( U8 C
备注:
9 a$ M$ Z3 g' k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, c. \4 `& o+ p+ Y9 ]8 j2 O& O* y
2、相关代码如下:
/ I! b+ E# ]" v- t+ l: L//UPP DMA缓冲大小512字节, g% p9 z, K# V, \6 d% n
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) ?2 v) F# m9 x) z# M
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 ^5 H8 j" x4 c; G- k$ i2 P#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ Q0 S( m. U6 ]' U& C
& [0 U) v7 i) h! r! w9 M
( e* M5 m, _/ i; G5 v$ _* I//upp接收、发送buffer, t* x$ D+ e7 T8 k5 Q
#pragma DATA_ALIGN(upp_buffer_a, 8)  F) o2 t% s$ T9 A* I, [& s7 r% {
#pragma DATA_ALIGN(upp_buffer_b, 8)3 t3 M" v$ S8 A$ R  J7 C

$ O+ A) K4 u# P8 W$ |9 C1 }, l: u7 qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ C  R; E. ]2 o4 V1 z( u2 ~* c
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: f& j6 U- g2 B1 l, p7 `' p2 Z
. }9 t$ a$ C, m' V$ z8 {1 _' L# e

# a1 M$ F7 g0 y! H0 g9 P8 x+ M, qstatic bool server_upp_data_recv(Server *server) 1 [8 ?9 B! i) y' ^
{! Y( G- z4 T" c) G
    if(server->upp_channel_a_recv == false) {
+ B% x( i1 A# m/ N+ U        server_msg_send(server, APP_CMD_LOG, "upp recv: start");" U: n5 K$ Q. t8 s0 r  f/ R1 n
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( r! p6 N. Y( u7 b/ c            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 O( |5 I8 r$ l5 I# ~( O7 P
5 K& y) e  i) j: M+ n% C1 z
. Y  p+ e- r( D2 S' J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 h6 E- X/ g2 C3 ~, t! u* j2 a5 L! X3 D. [. @8 d" @- Q$ A4 m, s
            server->upp_channel_a_recv = true;//
0 w2 m* @  D! A6 l( m  q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
7 g5 F! t% S8 F6 b3 N' u& [            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  H" \1 k$ C8 }  e9 ?            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
  R& q4 P8 C! P3 d; l            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 i$ d5 s! }5 O: v9 C0 W
* w' o8 T: D% G8 a3 I2 W            upp_error_count = 0;$ |0 T5 ?+ q" `! u, u6 Z( n
            upp_dmai_int_cut = 0;" L) f# ]+ ^! N7 g! ^, b& _
) }* }0 b9 w! i2 |, t  N: _9 X
            // fill in data ! Y+ X% n+ K! X4 Y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 i; n' L8 ]& n4 g" F# a            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' c* o" `/ D4 B7 _* `. M
        }2 F/ z0 S$ J6 J7 |
    }% a: T% R/ _! p" \) t& V
    else{/ B0 [, \3 b! u+ s+ b; Z( u/ l
        if (upp_dmai_int_cut > 0){2 f& C& m) g1 B( ^
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 u, |3 p$ H/ T1 h5 @) g
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: N' I$ v! P, K% ^# Q
$ D) g2 K, \" ~2 D7 Y! ?2 S* E$ I
" T% g2 J8 S. K; @- B# \* U# O
            //copy data to upp_recv_list_busy
/ r4 l) K+ x/ I) y4 O4 \1 U: g            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; q/ ~* Q4 A2 A1 S; u
' t; B9 y6 q$ [# n: x- A            //4 x! R+ P! u; X9 |$ g
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. N2 a% t" @' W' `! d6 \4 O( R
; P/ t$ _4 |/ p            //
# I( V  ?- P. \  V/ V6 i0 @            server->upp_channel_a_recv = false;//
& d" Y) F) F  O: K7 e" d% f3 ]! ]' j: p2 [6 D) Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, a" [* p: W# {$ O        }
+ }# }8 p* B& b5 m: @: W1 w; ^9 h1 g    }. }  ?! \- t% i" Q5 T, c

1 E, E5 T8 W' r0 j
1 _& t2 N6 z2 `# h  N    return true;
: W5 p' F3 Q, a( `/ d$ p8 g}
" S7 W# M) \7 q& S( Z. l& O
. N$ e7 R8 |6 [; Ustatic bool server_upp_data_send(Server *server)
0 G2 h  e. j: t' E( _{
1 w# d& e  D: e& C* j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 q, T$ ~7 y, S( M  {5 y6 g        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- Y4 X% A2 Z1 _' E, M
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- \/ Y7 c+ r. s. z( h- p
        char tmp[128] ={0};; [7 N4 R/ y1 d5 k
, M/ e. _- r6 u1 f
        server_msg_send(server, APP_CMD_LOG, "upp send: start");! v0 o% {" {2 V! a( x
        print_log(server, data, 64);
3 u! H- b+ L8 L' e9 g+ f  o% O7 w" M5 ^4 T* x$ [
        //" W; ]) u: {. I' |8 d7 Y
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; J- Y0 R( g% ~) |. Y$ i
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 X% j" w4 @( _) I2 Y5 S8 O) d+ {* C
        print_log(server, upp_buffer_b, 64);
: S4 Y" h% O0 g4 f& P7 Q! u' ?/ f! F2 U4 H6 a7 }3 h
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 N0 T$ W5 J" |0 X- Q        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 ^5 ]  K+ O* Z* d        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 v6 y/ S$ g4 E  T" @9 G
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* t& H$ k* U& |9 Q* N0 J4 H2 H& _5 b7 R2 [9 [' J1 M
        memset(tmp, 0, sizeof(tmp));
4 K: H. j- Z# ^- o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" K9 A# ~7 c" n" ^; E            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ I% {: j/ m# p  x( ]0 x        server_msg_send(server, APP_CMD_LOG, tmp);
' M- h8 b7 k2 M- A% h6 p: M7 x0 \8 u, [+ n) @: I+ @" r
        upp_error_count = 0;' f+ m. M4 H" W4 O6 M
        upp_dmaq_int_cut = 0;$ M# O1 r( P: ]) p
        // fill in data : Z9 @5 e6 r" ^1 r9 S7 T+ A: C
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . I8 U$ p7 `0 _6 M$ i% _
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  ~- G5 M' I7 q" n. W& n$ T

5 Z9 s4 x+ U/ J# l: c  W        // wait send success( o6 J* A" z" x! h- {
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. e4 _/ U" {% {, g8 y: ^! I4 y2 E: z& S  u: ?
        // make data node in free list
7 c+ P  t- u& @/ f( P  U        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 }. `& v7 F5 K$ P' C
        server_msg_send(server, APP_CMD_LOG, "upp send: success");  m, c/ x. K5 s7 K# S2 j% e0 ^
    }
$ q  j! X+ F* m7 `/ z% C    return true;+ R, e8 p# X  [
}1 @& S. Z5 R% P" Z! ?  Z* Z& t8 x

! J6 l. b9 G1 F8 l+ t3 w
0 u/ G9 M' h! _% K1 ~/ Q: m! Q

* i- k4 t' y- W$ ^

# N/ F& G( a  l2 b$ j9 |: [$ d9 Y: Q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐2 z& y3 A; v) C) s: A  p1 r3 i
$ |- v8 a5 e% b" x- F* ?1 w7 \9 q+ M1 z3 D

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 03:22 , Processed in 0.044187 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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