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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 ]' t5 Z6 r- \9 D& o& p

1 u* E: h4 J/ g  e/ N问题描述:
9 c4 C1 ]0 d0 g$ a1 u9 M在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 [+ H: [+ G* M9 u, X5 J8 E

+ S$ g0 L, h1 S- t" ~; m7 f# v. W! ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 ]. |% P: u% T6 S) C
. W$ T- h: X; a) p测试结果如下:
( e4 D7 q' R0 c: `) k$ @7 U3 t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; v5 ?5 }6 N! W
5 \& P; z% S2 Q* Q! @0 l5 ]* Y' ]9 P' t) T( q
备注:, t/ X8 m  P, R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?  i' L+ ~( _, @( `9 B: ?, W8 V
2、相关代码如下:
. W+ Y. s5 Y+ M/ I3 C" q7 {//UPP DMA缓冲大小512字节0 J  |' ?5 l* w) N
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) L/ R; V" u* N, H. u" n+ w# v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; m/ U. \( l  j3 S#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 G& t2 b4 k! ~# F0 v+ v; V

9 D+ ?. F& U) W! _  g# C) o; W
//upp接收、发送buffer
! S2 K: c! S: a& p#pragma DATA_ALIGN(upp_buffer_a, 8)( ~0 f- ]9 a0 }4 }- c$ S
#pragma DATA_ALIGN(upp_buffer_b, 8)
+ S( ~5 k- w* |5 a/ V& Z
$ q& r. n! r7 m; Munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) q- w6 |7 A" W
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- Z/ r) V) d( q3 W& S4 P& i( n
8 Z9 n+ c, j/ L/ S& Z

- R7 k/ z; g& i& Lstatic bool server_upp_data_recv(Server *server)
+ I& ?. A5 t& v: z/ z- I% {( }  r{
  _4 h) N' L1 b& ]9 S    if(server->upp_channel_a_recv == false) {% K5 w5 Y+ h/ y( H4 d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 @" W2 k! i( p2 y; b) i
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 }3 C! d9 B* z0 c" T* H- G
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 j$ B+ U2 t: F6 H$ }" C8 A
" g# q' @/ I' w: _/ D: j. p
4 T0 k/ O  w! h& S
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* l( ]2 Q8 N' i# w& x2 O. A! @
' M2 y6 v$ {  \% B5 L& |            server->upp_channel_a_recv = true;//
5 J$ W+ x- [6 B% g8 P: _1 k( U            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);+ C$ N! w6 m. A% g3 T4 x5 O! f
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
: h6 D% ~1 s+ G8 ?7 |+ ^# P, H            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ p1 ^3 m/ Z: \) b2 {            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" B  t. ~& v: ^2 c* }* s

9 O) K0 ?0 `1 v# t! z5 ~            upp_error_count = 0;
# k4 h0 ~: `. j: K            upp_dmai_int_cut = 0;
' G7 T; V( s' J( G' F+ [+ q+ W) h! h
            // fill in data
" o! e4 x4 M* F9 j            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, ^, x  T+ i+ A0 p            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* ?/ T9 F$ ~- X. m+ \  t        }
8 O+ @8 Q3 p+ y7 m+ h. }    }! t' \# Q; v, U
    else{1 k' R! O7 w% N9 k% \
        if (upp_dmai_int_cut > 0){% }+ o$ S3 h# C( @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& Y0 }( G" K, T3 ^4 Y6 c            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. G  Q5 d; Y, x5 o- U6 V7 H

  l7 S) Z4 S2 Z; U  x/ d( {
1 Z7 O4 A" v3 U0 X) m2 t8 I            //copy data to upp_recv_list_busy
0 N% O3 j; g! _# A            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 o" @6 z) Z; D5 F* ]: q' m& s

7 [' i& ~. v: T( @3 p3 Q            //
6 l+ F: ?3 H" N3 M0 ?8 ~            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( P4 Y: Z. ^4 U$ ~# c
- [; W, m/ ]. Z) I9 Q
            //
* I/ v. U2 b. o& i2 |2 g0 f( N( I& K            server->upp_channel_a_recv = false;//$ b( Y0 I8 Y" O& r

: ?0 c+ ~2 x  Z9 Z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 v; N: m' a0 I- v# R
        }1 m1 K* V; }, S
    }+ H: ?2 W: v  Y3 ]0 Z
2 J- [7 J7 S9 ~- }* v

. g) i, U1 U" \9 q7 H    return true;
9 O: o9 C6 v" X6 C9 i5 ^}1 W" C3 b$ n4 g$ J$ n6 Q4 l! F
( n" P5 Z! }8 e. c7 a
static bool server_upp_data_send(Server *server)
. \- P1 u$ ^) N6 v5 e/ N/ t{
7 ^* }9 p: i3 O3 X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" q' l, x6 ~% P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 y4 S& l' O0 u& J+ `
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# a  [2 @& A5 l+ r3 q
        char tmp[128] ={0};- H! U& Y0 e: @

: E3 k7 K& M3 p* D/ n# S% y        server_msg_send(server, APP_CMD_LOG, "upp send: start");+ F! o' ?) s# p5 S) e# y
        print_log(server, data, 64);
1 O+ H; Y& z5 }/ H* ]) v! s
# Z% u$ r- L& s# m        //
0 D3 N7 J4 e# X        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- z2 I( M( d7 I$ N/ }. h% p5 }0 n5 R        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( T! y+ R  `' a) L$ `: k# l        print_log(server, upp_buffer_b, 64);
( W* u1 D. U  n: _& _% d% v
; Y& k) S/ v: o/ z5 z        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 h6 Z5 |3 p  h8 Y- C! a8 j8 F
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
+ N6 T: u0 I7 g  c        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
5 g% M8 H1 O9 F$ `: k$ I        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 f; P: V) q; O4 O6 K* @$ k' p" b
3 M; T4 \/ s' |0 E( b  Z        memset(tmp, 0, sizeof(tmp));; B# D* k# r! F6 b* O' L
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " ^" E% ~+ V! E: E- n: e# d
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' X' W9 g- [9 t+ F% F4 G
        server_msg_send(server, APP_CMD_LOG, tmp);6 V/ ?( U+ ]8 `' W

* E* g* z* x  O2 P9 f) b        upp_error_count = 0;
3 v: [4 O0 w- I- D        upp_dmaq_int_cut = 0;. N0 i/ @5 C, w/ J
        // fill in data 9 v  K8 R3 n7 Y4 \" \7 N4 W
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- y' I5 r( B5 c        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" Q/ T$ N3 B+ P4 L9 q5 ?9 E/ u& h0 U$ J/ S# H* e4 C
        // wait send success' ?2 n- U6 m; c2 e& b" J+ J
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 d, S- N3 [1 M: e0 w$ D! N9 [/ L5 G; g6 Y( T; [
        // make data node in free list 4 f9 w# ]2 e1 N, q& c+ n3 m, h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% d1 v& `/ c6 \% o- V4 q$ T% ^6 k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");( ]* x0 T0 t6 o4 p" H
    }  w+ T1 E9 C% _& N& Q4 ?
    return true;
$ u# B. d1 c2 F: i$ o}
- G' @$ \' T9 U0 h. Z# ~( v' t- a7 H4 n: _9 `0 x! j3 R

: b/ ?, i/ j1 Y5 Q0 @6 M# Q3 s4 ]* v# D) I2 x# S" Q4 G2 ]8 h

. ~3 A1 S7 c9 B/ z) {) ^1 y1 s4 r. k: v- ~

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 b, `. k3 v" v5 y
) B  W, U" z1 R8 y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 15:19 , Processed in 0.040005 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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