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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. a/ |2 w. s, @& O( {& h- |+ R, z( b0 ]
问题描述:2 a# Z0 N' H8 i1 g- a+ z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. E1 g7 V1 F$ P6 H3 z) _

% n' V: A9 l+ @8 u& i' C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  ^4 Q& N# M; X( Q' i, q! Q7 S) o) V
. |; @  P" Q* i, d: E" i
测试结果如下:
. r/ `3 {' k7 A1 H5 l8 t" M138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) N1 u9 ^& n1 L5 J

- j+ w$ {$ s* v* F1 F; @
. x. G) Y7 H: n: i: M$ ]7 {备注:: P* W$ U) k& C0 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' g5 ^+ ?( t+ y7 H3 s& P: m
2、相关代码如下:& W8 Q- H( D! ^5 V5 v8 g' m
//UPP DMA缓冲大小512字节/ V+ q$ U7 u. A
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. d; J" i& r( E( W4 k9 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 C  \( r6 F% q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 g# }; j/ d( z& y$ u+ C2 N1 j# n
) B2 Y0 t; `5 u/ h) u$ r
, D& G: {4 _$ B; m
//upp接收、发送buffer/ W# v; F+ R+ p; O$ l& }" F4 O
#pragma DATA_ALIGN(upp_buffer_a, 8)
! n4 i5 @2 g( A5 ~1 |1 W1 d#pragma DATA_ALIGN(upp_buffer_b, 8): @7 u; N0 [0 J7 c
4 y2 }& w! u) [
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% e! j* Y# R# d7 Q4 `( U) g6 k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 r' s8 C' D( _6 ~6 ]. W1 S- |- E9 P1 P0 \# s9 `# S' a
6 R0 l2 M! i* q1 U+ J$ R! s
static bool server_upp_data_recv(Server *server) % [, b# q2 ~6 Q" Q6 J
{
' g* X( m6 s: a    if(server->upp_channel_a_recv == false) {
/ g3 Q8 g/ t& T, c6 I/ c        server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ Z1 l3 P4 F( S' Z+ I, j
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, P6 U0 y9 G, S  L            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ A# e+ M! `9 L
" X* Q' ]5 ], r# N: C' q

- R1 d4 y# t: v+ x/ t  `: J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: X' ~0 H! l4 e( L2 C

2 k. l+ D9 f( b1 m7 D& [, I+ D            server->upp_channel_a_recv = true;//) |, Z& ]7 f2 d. ^3 T8 s+ H( C
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 m. w- I' ^; ~2 G$ Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
' G/ C0 ]& m" \% l" j: u) T7 A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;1 y, J* n( [" n* y% t
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 O0 f) S0 _1 Z& w+ X; A
/ H' |8 w4 E% B0 }" x# B
            upp_error_count = 0;4 K1 X9 L" w& ]! T- ]+ P
            upp_dmai_int_cut = 0;0 L4 C' d# ~3 v% L( ?  a

$ z6 P8 A7 e  b. v' O            // fill in data
$ b9 {( P8 n/ ~2 A* b3 Q  B- s2 P            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( t1 x$ R. G9 D- W; h: ?" }
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 B2 U( |0 L) m1 A4 p
        }
- O/ j. ^; y6 }6 |( `    }$ U8 ~+ ^, p! P+ w7 m/ O* E- t
    else{% H- O0 T% F. w
        if (upp_dmai_int_cut > 0){
1 M! `  C4 Z1 E/ j5 J( \% P, ]) f) {            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 c) q# p' _8 {2 b& n- J& f' M            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 J1 G% ]! G# Y8 N* {9 Y" T
$ H! I5 q" |$ |1 P: E$ E  e

" C7 U2 A" R6 ^0 ^; M" X8 g( u- R            //copy data to upp_recv_list_busy
; Z2 y6 a8 z& ~2 U: @' Y            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- h2 b4 g4 h  W! G- R
) w" N1 J% x6 I9 Y3 G% i            //9 y$ K5 [  b/ d; O' H/ [
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 b9 a$ A; \, ]& Q0 v9 l
& ]: q6 a) i) y- ]6 z: x
            //
9 J! Y3 G( o- O, c, h  I2 |+ c            server->upp_channel_a_recv = false;//& q% s7 ^8 k' H! ]
- N8 s9 z3 ^. Y( s& J' N$ R
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 }- N5 h1 J+ J        }5 c, z( V! k  |% O' e& {% j) y
    }; u! z) E7 ^1 _& b9 [

, q  r) _/ M8 A) Q: W0 h. |- Y8 f4 `4 I; l
    return true;
( S  k& c8 M" w. R/ _}
1 W# _) r0 D5 @0 Y) G# x8 C# x* W% i9 Y8 ]: R
static bool server_upp_data_send(Server *server)+ L9 Q& M5 z+ D; H1 i0 [
{1 N* F4 h' o: s
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- f  j0 U. R* `( W+ `5 ~+ B6 G* \
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, X# j9 D+ m0 F% P4 X
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 F6 \$ S; x- q: D7 W" l        char tmp[128] ={0};
" O7 J- }$ ?* z+ I, q$ u% T6 J+ N4 q) a" c; `# B
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 |( p$ I3 n% c' o, G+ d  W) J) A        print_log(server, data, 64);  ~% `/ ~" i3 C! V. s# k' I

7 _1 `9 o2 F% F3 z" }        //. ]3 v8 J5 p% B' h: U
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! m8 V1 N8 T' s/ m0 t, j4 H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 O1 X0 l( d/ \. ?# G1 T        print_log(server, upp_buffer_b, 64);
2 E/ P4 I$ }0 N% e5 E7 |3 @' S- B) v- V' ?
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& Q8 {% F+ ~3 b1 {" l  r* Z        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  [7 \2 D+ e, `- U' f* l3 h3 f. y        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;3 d- B' Y5 V/ k  @( P( `2 i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& D- M# a6 K; a. b' l' }
4 I  ^. v6 [5 i- A8 C
        memset(tmp, 0, sizeof(tmp));  \6 T, a1 r% X9 T1 [7 i+ Q7 E
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' q1 t& E' l: q' v& y: h) m5 u
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 u9 ?4 K6 d; X; _# Z8 g: K9 ^
        server_msg_send(server, APP_CMD_LOG, tmp);% z0 p* H# r0 w5 T/ d1 A' `
! E9 C' I) i# D+ L
        upp_error_count = 0;" b5 B( C, M( K0 K3 `" ^
        upp_dmaq_int_cut = 0;
6 h4 `( t" v5 T4 C        // fill in data # O: p* D( y/ L/ Y) X5 i/ s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; {5 s" j- z! z* ]/ I7 l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# T. o* \! j2 a  A# Z8 F
0 v% ]7 b6 t5 M        // wait send success& ~7 {+ Z8 J1 c) Y" }: \: U
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
  ^% G* c1 t* X9 D5 x# p
, L3 _' d+ ?& ?! @5 r        // make data node in free list
6 w# f: i( \, l$ b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _( S3 n3 a! E. ^! n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 d- N0 X, Z) J- K: ]    }4 z8 v3 \) I: ^) ^; c
    return true;
/ Z8 G4 J3 F$ f; ~8 ~* Z0 P" T* f}7 q% @$ O) @0 n: N, K

4 Q+ g) E& i- e3 y8 W0 r
0 L. n* T# S3 ?" `0 H- K# h; O
% g9 g+ i- S4 S; K; D6 [

$ z7 F+ }9 T3 m* X' Z& p. z4 e, f& Y  s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
2 d# H% I( E% u2 [
5 N) N6 Y5 Z' y- P; @1 l( V  s2 r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 02:29 , Processed in 0.037252 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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