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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , o+ K" B' y4 C5 o* F+ E
# t$ G4 Z( `! ~- V) M8 p
问题描述:  q3 I6 n  r. I: }) O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ a" }) u% Y3 Y2 \* X
- Y$ X1 O7 q* a; T3 S2 {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, ^; F- f+ _$ Z! U  N

/ V  P0 a7 i" J1 L$ v% n+ v$ E测试结果如下:+ T" J6 i4 y2 q- k
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 e" H6 D+ D) T" T% P) o" j
, U" b3 \7 Y+ p' A& p0 _8 ]

3 p* T" @+ w" M- n* @备注:
4 w% D4 B  |/ `$ K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ R% c* _5 Q. T  i0 d# z# ?
2、相关代码如下:
/ @) {+ i& I6 N, X5 W1 A//UPP DMA缓冲大小512字节
2 r9 s7 {7 ?& i1 F#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 E8 o" q0 f% `: ?8 R6 W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, n1 B+ f+ C  V8 E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 q0 h$ l' p. F6 T
) w' \& e: ^( }$ w; R# {
) N0 k* p& p4 o5 t//upp接收、发送buffer8 L* O0 \* \/ ?4 N/ h1 ^, p- K
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 d5 [& Y" r4 n; Z9 U#pragma DATA_ALIGN(upp_buffer_b, 8)* k( \8 T4 j. q8 _/ ?# Z  I
% U. `" O; ]  m- c+ `2 h# o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 A. l& m( r! d0 k) U9 a) ]2 i! s6 ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" q8 i% }% s6 ^" l( C& O) |( i$ v% [4 K

2 @8 S4 W5 B8 g9 D/ Ustatic bool server_upp_data_recv(Server *server)
/ n: u% A1 J# u, d) ]{- N3 @( d" H0 @. E, H9 X" e% d: Z
    if(server->upp_channel_a_recv == false) {
. H7 G/ z; I% W+ v% L: n        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( @4 ?' l: K$ e2 _# f9 C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 \+ n2 q) K5 V) q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 Y" K* N1 A' M6 L. ?! Y: d

' [% g: c, e; w( I( h$ A: B# Z7 t: X8 A; w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( D% C! Y( ^  P* H* Q7 r( M

+ I9 ~6 q7 N, X5 s( u9 c1 e0 [            server->upp_channel_a_recv = true;//
7 A0 ~. T$ r" F4 `# v' X* x1 u* V            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- ^6 I+ ]& W/ O! D% p2 b' s# p            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;! L) T$ ~* J1 q1 N6 s8 x% E
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- Y/ p, e" Z4 x7 H7 O( Q' E            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ [5 O( ]2 y& w0 [  E

2 F; z% {# s1 W  e            upp_error_count = 0;9 A- q! x* j( _8 @, j9 Y$ D
            upp_dmai_int_cut = 0;, l& _) {, p9 E6 K6 x- @
. A. C+ }9 d4 {+ `
            // fill in data
' @$ p) m+ W) }; f2 G" j9 y$ O4 j            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; [( s2 v2 m9 k  w. D8 C7 |! I5 H            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 u& V+ P4 P6 \) H4 v        }- v, a3 ?( r2 D
    }' L  r3 s  U; g* X9 Q
    else{
) Q) w. o" Y  }8 P        if (upp_dmai_int_cut > 0){
) d2 }1 J8 @( K  K5 ~3 u! w            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" ~% M1 U6 X1 J$ o. E2 {$ ^            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 o4 F+ G: [* r/ q( u/ H
9 [2 a. @  T6 h. g( g* C6 V- m3 `9 e$ ~( }# e0 s, y
            //copy data to upp_recv_list_busy
: \3 o- X2 c$ X            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 F/ U0 [4 g2 b* M, \3 a+ s3 f( `
            //1 ?5 e4 }; |7 Y9 n7 [: X) y! S
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 i! z$ W5 v1 k1 Z8 ^. @% Q- H6 m* \: t* _, M+ z5 O& F
            //
" u- `" k" F9 N% r# q1 r            server->upp_channel_a_recv = false;//
4 j8 F* n& _1 B# G5 P9 r' M: l. z8 d
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ t( l- t, b# D        }6 ?3 p* R7 Z: P7 V0 Y" Q, C5 G: B( ~
    }5 t; \, }. O4 w: P& Z5 ~

9 z& N  I, {( a) J) {4 h; X' Y
; A% e$ S; ^7 N' O4 q# m  |) Z" ~    return true;
7 O3 ]& E7 H  X}
# u2 d5 G5 {+ p( [3 O. j7 O9 P( }$ S/ n/ |9 z; i  K3 _2 u
static bool server_upp_data_send(Server *server)5 L2 `9 c+ \; q7 q  d
{/ D5 Q% G' K: B& Q0 ?( r
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" d1 b, D  @  ^        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" |; a, H$ w* J# h        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
8 u1 ~. S! g3 t+ h( e9 z! t( J        char tmp[128] ={0};6 |# B1 G. U* o/ M6 `7 }/ {

( _+ V; ^) c0 O- l9 h7 ?8 N        server_msg_send(server, APP_CMD_LOG, "upp send: start");  M& L1 s. J# R: J5 f$ T
        print_log(server, data, 64);
3 U8 L# g7 H' l$ \6 y2 V2 y* g  s3 n
        //: E1 H9 M# u. k8 V0 d" H/ ^+ q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ B+ {5 d! k2 M9 e( E
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ [  |- r0 R0 {) _$ o
        print_log(server, upp_buffer_b, 64);# \9 L' q5 {  j
, ?3 ]0 m( a9 e7 h/ Y5 H+ {
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
/ R, S/ t8 T4 q/ l        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 3 d/ `0 L0 J9 @3 l0 b
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( |6 D9 V) S0 D: m/ F9 L+ y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. z( ]7 e( ~* @" M* [' u- f; A
/ K* D6 t0 [) I. P, O. n$ j2 u
        memset(tmp, 0, sizeof(tmp));% E( \: \- ^% q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) Z+ a$ _1 F8 e* q4 q0 D+ c: _            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 o1 F; N: o- p6 Q5 e0 y        server_msg_send(server, APP_CMD_LOG, tmp);) }: K7 }( \/ D* P4 s
- ~$ t( @: z& x1 h
        upp_error_count = 0;. I8 H4 H# x% {- l
        upp_dmaq_int_cut = 0;
  n5 `7 B" q3 T; f, V        // fill in data + R0 w  k- e) A9 T! [& ]3 G3 G
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . ?4 j4 @4 T8 h" y8 e
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 b' M) K! n5 R' j% ]$ j+ `7 O6 ~/ X4 A# t
        // wait send success
( W% M4 v2 k% ]        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( }0 o2 {) `/ r, j/ a
) L5 K- A% g6 s3 U3 U3 i$ u        // make data node in free list ; {( t0 ^# I& z$ x3 J
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 C5 C: F5 `- ]. u' v) O* y: [
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 k/ _1 X! w1 E; [9 Y3 [
    }  k, P8 \6 w4 K" x) O
    return true;* B3 c3 N! v( a: m% f9 U+ c4 M4 A
}! M* d* m2 V! K8 H0 }

( M8 d2 ~4 ?# J3 a2 F1 G& L  s

3 c' x0 `9 j  c; ?* ^; s' p& s6 T4 e: j, f( k$ O, M

1 L7 [! l% v; T4 G1 v. r; L
) u) K6 N5 Q  a: ~. ^! e

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
+ Y1 d4 S+ u/ T' [
- i, q  @! |0 F6 I7 ?5 L5 O

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 19:46 , Processed in 0.053810 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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