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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) Y% |5 _9 h& u  W4 `5 L
! S, O2 E5 Y) R0 Z! K
问题描述:8 b% T' ^) e2 \  A& P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" U0 y/ F( Y  M

! I6 C% G* E/ x图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% y# w9 H! f2 @/ V4 b. b; P2 c9 j3 F9 I. c
测试结果如下:2 F' Q; A3 y# N5 L
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, g4 y7 v) Q) Y- r+ _% `2 ]9 S# _1 B3 ]# i# j8 ^" d

2 m' U# T5 C5 ~3 g% T4 n+ v9 G备注:% K# |# L3 V+ {4 o6 _7 F$ l  ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" E* L: G7 A: g$ ]* I. o
2、相关代码如下:
$ R. B0 N7 X3 l% P, O7 s//UPP DMA缓冲大小512字节( A' O5 H" ^! e7 E' W7 ^
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 s8 G5 d1 a& s2 t& J9 w3 f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: W3 B! ?) v  f0 ^: Q% I* O#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! G* R$ I: V/ A' A7 s  _
) c0 A4 x9 H4 _+ C7 @

: z- g% i& K  f% Q9 i  `//upp接收、发送buffer8 l- }; U8 ?5 N0 `  f5 u
#pragma DATA_ALIGN(upp_buffer_a, 8)
% U4 d/ w0 j# F6 z$ N#pragma DATA_ALIGN(upp_buffer_b, 8)
: C4 p6 B7 w, b0 I. m3 g/ W! m6 s; W3 M4 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ [7 i1 _9 O% b" Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ J+ h+ ?( q0 I' m6 F
6 B$ s% u) L5 ^) i! \$ U7 `% W' P) H. w' r* l) w! n
static bool server_upp_data_recv(Server *server)
2 H7 H0 e9 ]; B+ w9 r- n{
6 A) t6 ^! \1 h* [/ N4 F    if(server->upp_channel_a_recv == false) {
4 V9 r+ o4 y+ R0 S% E$ W1 s( Q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 m3 g6 S4 Q  q        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& c+ A$ F! }$ b, v2 g4 U            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# }1 E/ U# \; _; m5 X! `2 j# I0 w- m$ Q" D+ p* M

1 K& `. i9 b9 y5 ^2 w; [$ ~            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 `! A: l+ ~7 h5 S4 q) q
1 B& j: i  A" @! s5 o4 l/ ^* ^1 V/ G
            server->upp_channel_a_recv = true;//7 I; p9 L7 o) [+ @% d$ e) X  n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
: i% U8 \  w) u            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( }3 D* g+ m" O% ]$ m5 q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, @+ `( i! D9 m' @9 S% i            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" p/ L+ Y' Y$ l8 @/ t4 m
0 |; @4 ?" X' c7 r$ G            upp_error_count = 0;, x/ c% h' A; N1 W. \7 ^
            upp_dmai_int_cut = 0;
  p: Z( g3 ^( g8 B* ]. {
% V1 P& J# k9 g5 t" K            // fill in data
; S" B( N- z4 v( _            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, u' S/ L6 ^. Y2 [( ?# ^% n7 Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" \6 ~; H6 o' t+ B
        }
, p2 w6 ^/ f$ p; |: n2 n1 D4 w( ?* ~    }% ?/ [4 x, p. J% B
    else{3 N* k9 }" p* o, [0 h6 g
        if (upp_dmai_int_cut > 0){# D/ c3 o; a- _% P# k$ u/ P0 f
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" P# z/ m! |: H7 l7 D
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( a: e  M' F# J! _7 R: j

/ M. ?, k1 f& \& p! Q. j1 x
; E9 A, k; J- N9 f* k            //copy data to upp_recv_list_busy
: {4 d; o. _- T            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) `6 I( i2 M' g9 n' @. S* @4 Y! ~# j+ w
; N2 J3 e# j2 @* C6 E* h% A
            //6 t% z: l) `5 X! I+ c2 H, ^" V
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" w/ s9 E1 I, U( W% j5 g4 }6 M" x* \' _, }5 ^
            //  a" Y1 ]- O) m8 h6 u7 X
            server->upp_channel_a_recv = false;//& f  _9 Z) P- ]1 }0 J5 {
2 Q; w4 w3 D7 ?5 S/ K/ f4 L
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& \4 {! L+ y8 y. E( i
        }8 J8 }- M! H3 O: X/ N
    }; ?( b. E: H5 P+ h* Y

7 V: E$ a) _5 W" `- |
9 ~) G& U! h# ?6 w$ D+ m  z    return true;: _* n9 G5 |" V/ X5 B! V, f4 j: Y) h
}8 k) O' F# ~. h/ y& w
' t  @  G4 d" N
static bool server_upp_data_send(Server *server)
/ t1 S* f( q; N: s+ L, k0 T{" r' Y* u9 b* c1 p  b% A
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 h+ I1 m* m7 N+ ~3 @  D6 z, J( P# L8 f        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 c- a, r9 u2 z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 J! T+ M0 [% S2 }* m5 j        char tmp[128] ={0};. r/ k7 v, o1 t

( M( m0 X8 S' [0 C  B6 Z" n+ }0 f        server_msg_send(server, APP_CMD_LOG, "upp send: start");% U6 H- o" T- @, Y3 e& B1 J
        print_log(server, data, 64);6 I/ n3 j' s& @/ J. }5 ^

. ?5 L' }0 K" ]2 K2 q        /// s( E% D' m9 `1 ?; A: `
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% w8 I! ~! l0 s9 \
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% `8 a4 Q- B' \        print_log(server, upp_buffer_b, 64);
. e3 `$ q$ k% R' {7 H7 C" ?5 J, R' P! b
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) W  d3 E$ m: e' U
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; : `9 M, v( I; i8 @/ q' W- \
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( y: w1 Z% L6 ?# `1 i$ R7 J# z
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v: ?0 m, D8 c; ~  m. J* J( |. `  U0 e& D% G1 z
        memset(tmp, 0, sizeof(tmp));) e* c2 S: w+ J- I
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " _# o7 j9 g: ?1 h/ Q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 Y! J9 |" o- @: ~6 Y        server_msg_send(server, APP_CMD_LOG, tmp);: x% M" z  p( ?& l3 j: ^" D1 T( ^

: V5 f/ t" Z' n' E        upp_error_count = 0;
  h4 ~' S: V% l* `        upp_dmaq_int_cut = 0;: l# J$ O! ]( p: {6 P, i- _% I
        // fill in data
- {8 D/ W, I8 j! g        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) |. s  i7 V8 A
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");) W; H$ f" D/ R# H3 |

( Q- F5 o1 o- U' X# n        // wait send success
) p! l" U& z! I1 r  C& g; C        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ \+ g! ?, {* w6 ^- V" R8 o' J! ^; ]
, O3 }* ?8 e) x' [% [% N& d2 `        // make data node in free list
8 k# X. h* A5 q9 x$ l( J        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 a: ?2 k# k* @7 k+ N3 k! O
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* J' t/ V! R9 _% N* Z
    }4 ]& n) Z, }( ^  E8 q+ C( a+ y. t
    return true;
# E- s4 R8 j5 B  g6 S1 @( s9 w1 ]! M}, A" B- z4 R3 `  p  `3 h3 f
& O! h  m. ~: G0 u- |$ ^" W4 n
0 {+ K2 W! P* C: j5 e  C
8 ?; d" b5 l( n2 ^- ]. C; w1 e
6 B  Y: J" \$ i+ @$ R- t2 X% X6 s
9 Q* l1 {9 A1 [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 X2 Z9 k+ F4 H0 k, Z9 ^8 s6 I8 h

  \  V: V/ b' Z7 q/ A% |6 d& i2 ^

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 21:06 , Processed in 0.045937 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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