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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& d9 R/ t! r8 t% E6 a
1 j/ T0 u- B% ^9 T* H- h问题描述:
- l. H$ s; B* A1 G3 Y7 ]5 g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ m% {( d( o9 w+ W1 v5 F8 P& B: T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 R& M+ x3 \0 x3 G: I7 n5 K# u/ X! Z( k1 k$ u6 _! t& t& m4 {
测试结果如下:7 t5 M5 m' Y+ e. U4 O  m  F
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 ?8 S$ Z! W/ x7 ]0 R% p; Z: v% F( X$ d+ \

# Y' Y9 Q! ^9 X  j+ c9 _2 Q' \备注:
& J; v5 d2 ^. w6 y+ F! t8 g* x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 K' U3 [6 w5 k% s' o' o  K9 V
2、相关代码如下:: `# V, Q+ D3 ~! b8 r
//UPP DMA缓冲大小512字节
8 s+ |4 V5 v: E- {9 j; j#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: n( V0 q% y% q
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; Z$ s8 l4 z0 F3 c; l/ b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 _: W) \# p  C0 A7 n* u; s1 I$ t! ]6 ~( @
0 ^/ z& J: |. L) ~
//upp接收、发送buffer
# N/ ?7 N# Z, W* C: w  }8 L* J#pragma DATA_ALIGN(upp_buffer_a, 8), o) w7 X" P* o6 d$ e6 X
#pragma DATA_ALIGN(upp_buffer_b, 8)% X4 L/ p- S: s( G0 v
/ x2 c  r# |9 f4 p9 O1 p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# }$ V  k7 ?" `6 i1 E  p* U( L
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 f. i$ d3 u# A$ {/ E- |
. u+ K9 Q- X5 a, V
9 m4 w$ m! U8 e
static bool server_upp_data_recv(Server *server)
7 q7 {# p% z2 {7 z" P/ y{
2 K9 J2 E  M( C* u9 H1 s* `3 r    if(server->upp_channel_a_recv == false) {
; b0 V$ n+ I3 F- N; M- F        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( o( _/ y+ N) v4 A2 I0 l- @& Q
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 I& R: n) O% x: l( l; u' ^            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ A4 Q% E% @+ K3 {! c% `5 q6 |6 I/ _8 r  n2 t3 K2 h
( q  p/ `9 @: d* a
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 s# w8 |9 N# g6 \# N* {

& P9 t' Q9 @% e' \: f( m6 \            server->upp_channel_a_recv = true;//
) u: O3 A6 J& v; }; s! ~            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* B* l, s  {+ R, B; a
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;; E/ S! U+ n# i, V& G
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% X; `" R3 I! s; E" W6 ?            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- @. G( Q4 D6 W0 ^6 U% @
* u" ]4 q7 O# V( T$ D  R
            upp_error_count = 0;; f4 s" p0 Y" S% ?( q
            upp_dmai_int_cut = 0;3 o  M# f0 ~6 r( [. D+ g8 k% J
6 z- n0 J6 [/ }" F: d
            // fill in data
  @+ j, @: O# }, U3 H            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 m/ S2 l7 f5 X# B# T9 W& z' L6 u            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 t! E$ y, z! o. t1 X0 J; c  \        }0 S9 e0 ^% K+ b7 Y& d( q- n3 s
    }
2 w$ c% H8 ]. f( i- L2 Q/ m! S, g8 U8 i    else{
: I/ J/ b. ?% a2 u2 ?        if (upp_dmai_int_cut > 0){( i/ w# v8 L5 F$ L1 G3 G/ x
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  l- R" r9 Q0 \/ d' `4 n% Y; j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ F4 I# ~( E' t6 ^5 o+ o  z

# l7 B9 k5 D# ^3 u2 y8 L' [- x; [0 H( S
            //copy data to upp_recv_list_busy7 y0 U7 c, o3 H0 ^
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; q/ f* U* z& D5 Q: Q

+ J% }4 `. L  d& A            //
: w0 [7 k' F  a# ~( H. h1 @            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);- R9 {% t9 ?: M/ E* B" L" [

# o, B# r' F# q1 F/ S            //8 ?& y2 A9 c9 {+ u
            server->upp_channel_a_recv = false;//
" W% W2 K0 G# M6 k$ L+ T/ o. ^8 N1 O4 l/ e9 U! E4 B  e
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");  B+ R5 w3 g3 z9 P, g3 @0 `- p: o5 |
        }
3 _- P3 K  H( v0 g' |5 }    }0 d, i- P6 H6 C6 n9 U/ c

% k' X- o. G/ ]6 W8 N, ~' b: n; E/ Z5 Z7 `
    return true;1 _; {) B4 t" a- |+ o" r. A& O6 P) s
}
! `# w3 U5 Q$ i, P$ |2 {1 R( R- s* N/ Y) ]" _5 X  W; m; O8 V
static bool server_upp_data_send(Server *server)# Z1 N# w. q- r3 c! V) V; j
{% }4 D! g0 V" O) ]0 V' B9 W2 x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: n+ h, w. e( k
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 O2 Z2 y' a4 c9 f) P% }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 L% ?' i, z/ n        char tmp[128] ={0};) T: H1 O. \: e8 d# A2 d
* E! l. {$ ^- i# ~! ~
        server_msg_send(server, APP_CMD_LOG, "upp send: start");1 ~" v6 [+ Q# Q3 m8 w
        print_log(server, data, 64);8 t2 [" d+ [9 v1 m$ |8 T3 t- {8 p

+ }: |8 T9 k$ Q9 S3 ]        //
  C4 k6 [4 P) H% n) W: t/ E        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 R1 t+ b; M' @1 h        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# a$ ~: v, k$ @  u# M, H$ O
        print_log(server, upp_buffer_b, 64);
+ U% L: k* ]* d6 b6 U. ~! r8 h. D' z$ L6 u, \; C
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( l  z& u- j& L6 B
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' E. d" m( S; q. ?: v
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;  c/ ^5 x3 y6 f! e" R4 @. D
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) c8 t8 G- R1 a( F6 ~2 K% D. B
4 I6 M; `9 s/ F5 x% f% k! a6 `
        memset(tmp, 0, sizeof(tmp));
. U4 h7 Z2 F3 ^0 t9 a; g4 T% t        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( V  `5 S3 A& k$ {8 l9 L, [
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 a* F  q' o0 H; o& A$ ^        server_msg_send(server, APP_CMD_LOG, tmp);
  y9 ^; P; w0 A: l: O4 u! a6 u: Q; F1 q- K) }( g
        upp_error_count = 0;
/ [* a5 c1 f" f( U! W        upp_dmaq_int_cut = 0;8 K7 T) _+ U* u5 u& u, o
        // fill in data 4 k4 d5 C* x2 K; ?6 @) s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% G4 E+ R0 L  w8 m        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 u1 }: A  c; t+ l# T9 @* x; X

- Y) b8 _2 N2 O% H# O  g9 R- |4 D        // wait send success
4 N* V  w9 Z& c        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   D8 s  z) V- \; q! |/ q5 `

$ Q! w6 D$ l1 C2 b; W7 q) e3 D1 e4 R        // make data node in free list & d7 P, a/ @% x; n" {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) b) k2 G' [3 `9 |" _        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: P* W7 j. h, y' P& d0 c    }, y' w7 P& J' r9 v/ ?) P
    return true;6 W2 a3 P0 _; z& ]1 l
}
, l+ \- h/ d$ ?& h
6 O1 s/ O' g& d

$ K( v! C$ D$ h! I7 O3 A0 X  w, h4 b

  ]7 ?8 i$ b) R( t( L1 `6 Q' Z% u1 Y( N+ h/ d2 b

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
7 j3 A. U! Y. Y1 @" D  v- E) X9 U% `8 L. w' N& c) W, a; F

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 01:51 , Processed in 0.038968 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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