138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' l3 `0 f6 W, R$ G4 {

, ^: z. c3 D3 ~# H: A$ b问题描述:, x! k% M& T* r/ Z4 M. s$ ~
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:# R2 v. s! K  q! I  |: E( N+ B
' P0 m" O7 m" ]
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, [2 H; D1 P. p9 n- e3 O

+ ]/ y) K2 c( a0 E+ n# l: \2 R9 L1 T测试结果如下:5 O; x; V3 H3 n9 Q& `, h2 J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
8 Z7 A, ?  e  R
' f$ h. t. l2 M7 R  V% D, C
+ L, K" S6 b9 I备注:" M; F  H4 w7 ]- Q3 C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# I# n* e/ `2 y: }2 k' A$ P& e
2、相关代码如下:! q  R3 D* l, R/ C, Q7 t4 h
//UPP DMA缓冲大小512字节
' I. J) d4 `! F8 X#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 K/ q1 [6 u+ R; I#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ ~. C; O* z8 I& \- M2 Y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
$ j+ y- j" d! [3 A0 q) v% ?" c! m3 A6 Y2 w
/ |2 Z+ q' I% L; H
//upp接收、发送buffer  j* U3 d/ \" ~. G3 D* O6 o/ d
#pragma DATA_ALIGN(upp_buffer_a, 8)/ ]3 C* \; m9 G7 T' f3 [
#pragma DATA_ALIGN(upp_buffer_b, 8)
2 I/ k* `) y1 [2 o* B4 W' a( ~0 a) W, r7 N# i. X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];9 T* ]$ c) L# @+ V: f4 L$ Z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
9 U8 o/ ]( t* l' E6 N! {* F/ Q' s+ S4 y; O: @; c- U
, n( N% w; Z( [4 V
static bool server_upp_data_recv(Server *server)
. j& \6 {1 i; e) f' _7 b{
3 x9 b' b: j  G; p9 R* F    if(server->upp_channel_a_recv == false) {
5 a+ b8 Q+ O1 z  `$ w5 ?        server_msg_send(server, APP_CMD_LOG, "upp recv: start");' \9 M& l1 |$ n* {- A! r3 @2 y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
  y# g7 w6 w/ F! z4 n            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 U, M* @+ `2 I; v
& z; g, q7 M  a9 p- V* `# Z) A
$ L$ R1 y7 v2 ?) O) o            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 c  l5 Y" {7 {8 }$ b2 [

" P4 w$ |- k4 f4 d* |/ F* F# h            server->upp_channel_a_recv = true;//! O8 v& D& ^) q: i
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);+ _+ b% O2 @! b. B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;; G" n2 h' N2 t# C' F& O1 n7 U  X
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 y3 `# I7 ?: C. Q            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& G6 \; a; f% u0 e% @& \: C; s3 z, l6 V1 `0 t. |& G% ]! `
            upp_error_count = 0;$ t* u+ l4 R+ A; f: g8 ]
            upp_dmai_int_cut = 0;# ~: ?+ {' ^9 C1 Y
, y4 _# X/ u0 c& z3 {# S# `4 A9 L
            // fill in data
' x! y9 z# C7 e- }            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& G/ U( F7 X# J4 w" S# b            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ y) w; @* s* N$ Z3 F
        }
5 C3 p% j1 o% u( t    }
# i' M$ M* z( @/ i; H    else{
- J5 m9 q1 r5 J0 |7 L) ~        if (upp_dmai_int_cut > 0){
( f; x  x1 e0 k8 j4 `0 R            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# [& x' J# [: L5 V; ]1 g
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- d4 }2 X& \# v

. q2 R* g' E6 E( K1 c+ C# \. D2 H; z1 T; l1 {2 T
            //copy data to upp_recv_list_busy( O9 h6 v3 r) k  _8 e* ?4 E) F
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 e- C' @" @' w: i3 e* F# i9 M0 b3 z7 V+ d

' B+ l" M" D; {: `: M+ K- K+ G% A            //
4 S7 E8 I1 W) V            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' Z* U6 v3 Q5 m* q

5 y7 _% t$ ?1 I5 W0 t  _5 n            //
' @2 Z( N: L  _            server->upp_channel_a_recv = false;//
7 k" l) r4 i3 n/ G" |2 ]
7 S: T' H0 U" v            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 U; Q4 o7 Z5 g7 x. d' P. G- B2 a, M        }
0 u, A7 X! L! x6 c8 u. N4 J    }+ J4 R- _3 D9 x4 d
% j$ z7 M' [, y' ^8 a* f

- R, Y& i7 O- Y$ D    return true;
7 J0 v; @% r* V% [}
+ R" }" w; N# e5 V* f, p* u/ O; M# R9 G4 L$ e
static bool server_upp_data_send(Server *server)
( i( x" D% s( U5 T! t. n0 S{; w2 A$ D  w+ }. T
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){# b, ~8 ]% ^, {3 u6 t% ]
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 M8 x; O# L3 V& l+ R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! n" M$ {: h* {9 `' A/ o
        char tmp[128] ={0};$ F( K+ ?9 R! A8 @, Z) H. F7 X
( h' k( ]6 w1 I) e! L
        server_msg_send(server, APP_CMD_LOG, "upp send: start");! V  k% M& }. m& d
        print_log(server, data, 64);
5 ^, |- q3 Z: A
9 B. j$ X3 |7 l5 G/ z! q4 w! g; G        //) @. E! O2 p& l" P  b. I3 D
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);  m7 y/ @; w& ?# p2 z6 k  B8 A  N" h
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  i- |  ^1 [( z) d0 y" }
        print_log(server, upp_buffer_b, 64);
) D1 w3 l; ~3 p4 f! ~& @+ G/ m- m( ~! Q
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
9 C9 \6 X! }! Q; Q4 N$ z: C1 f# E/ l        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
; o& c6 ]1 W. D3 h9 z' P* w        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( L, e& q: N; x$ {( I9 n
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 Q- T1 m$ A1 Y- `; n, q* n

. O, _# J3 a9 `1 E5 j. f8 e        memset(tmp, 0, sizeof(tmp));3 j6 i8 z* ?/ n* I
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; b, B* F9 y6 x; a+ V
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" V. }# G) L8 h, S# q        server_msg_send(server, APP_CMD_LOG, tmp);
8 W6 \1 {9 I* q/ Q3 `# m/ k; q3 V. C
        upp_error_count = 0;
2 r. V  `2 U) K- t" A        upp_dmaq_int_cut = 0;! ~$ ?# D  x4 C9 f
        // fill in data . s) L" g/ W: m/ z3 s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # m2 @6 V3 M' T
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" G* i- {: ^: b. a2 y* G! s$ u, m; L1 V3 d
        // wait send success" s' P6 z- }/ g0 a" S7 S! m9 [+ h
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; y3 h; h1 {7 `* T9 R6 b

' U2 _" Q& F$ B        // make data node in free list
5 X! s7 E4 Y; G* v        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, _4 g2 p5 u) E8 y3 [
        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 W: S0 P$ i9 c% L
    }
: c: ]9 d  }" S* j" U    return true;
9 K# s6 E0 \0 w}5 ]3 e3 L/ p8 `- [6 ~, e; |3 f
2 X" }+ W- p* E  N9 B$ k- r6 V* m7 w
, ~1 k4 P9 m: H$ R0 M& f
% B) `' n% i7 e# r( M0 z
" ~& D. L. I- y. l) C- U: _

- z- {6 _; f* z! R' p2 `  t! X, V

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
* y( d, k8 R$ a! H. y1 @# u
5 f+ ]5 i- \4 p  a

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-13 22:55 , Processed in 0.041548 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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