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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 ?- T* D: B  @* ]# u8 B0 J1 k3 M2 d3 C
问题描述:
' ?" c) F/ K# K* I+ P" @0 P  O在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- u2 w4 ^) a9 ^7 w! ~' A' h

+ f8 V0 |& }( g% C; [图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 M0 \, B; k# u0 \& Y; Q& i
7 i; O1 x- g% ]% V$ x  H" g
测试结果如下:
) j9 ?% i' C; X& y8 i3 L% }0 I138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; Z5 C6 ~& T( U$ y) G" [0 H
# r* z) L" Z  Q
$ E, f) ]3 U2 L& L" g
备注:
5 Y! E- R! ~4 v2 i1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 m) n4 _1 r: O) I
2、相关代码如下:0 ~6 @, q* g. Y: a8 U; I' P" |: F
//UPP DMA缓冲大小512字节
" L5 {( P6 |% R# N5 Z0 X, o( Q. d  B#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ U% G7 y( n' B
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 }9 c0 `' ^$ l. |. o
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! |+ u9 q+ U: A7 W$ y

; G4 H& S! o1 n& j$ L
0 H: b7 d. _4 |4 f, v9 m, S//upp接收、发送buffer6 t' ~5 A1 O, k6 ]
#pragma DATA_ALIGN(upp_buffer_a, 8)& s6 d( b$ U6 ]
#pragma DATA_ALIGN(upp_buffer_b, 8)9 Z& r0 A. a8 C. X# R- x
7 I( w" w) r( T( D
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 M, v6 F7 @3 g8 ?) d; V+ u
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 N: C5 h9 o6 i" ]1 C$ D6 H
5 B- ^2 y  Y8 a' g0 l) {0 |8 ~. U" u  g8 T5 _+ ~+ {: Y' v
static bool server_upp_data_recv(Server *server)
  \2 V& ]2 R1 Y, B{
! c% C! M, Y$ ^& m7 N7 v    if(server->upp_channel_a_recv == false) {% \4 c6 G: P$ y$ s0 g: m! ^
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 e$ c! p+ z' \. p/ P3 L$ R        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% [/ A' o  H! e8 f
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 r4 e! `, V- p; ]1 G# k, g% b" J- |

+ N  g/ g/ [8 e* S            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& V* \# v8 M4 U" m1 k5 e4 r; X: W. ^
            server->upp_channel_a_recv = true;//1 x$ L8 ]* W# w4 }$ I0 l8 x
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 |- T! f8 C- [! E( d) Y/ B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;5 [& ^# A1 A! m$ V4 W7 G
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
5 }+ w& \6 p5 q# F            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 l8 O' P; W& l8 ~; V- W1 Q0 X0 [% ^: s
" [6 o/ Q: q. v( U: S8 f  u
            upp_error_count = 0;
) {# `( i1 I8 v/ P# D( Z- P* B            upp_dmai_int_cut = 0;
+ f$ s+ I6 o% i' b3 ?2 B; `% ^2 I2 j% l4 U
            // fill in data
/ D* i9 ~2 W+ O" `0 M& M3 i            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 K1 B+ q& F* C- |- V5 Z4 @3 ]            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: D' ?! R' a: W: F. ~/ w1 y9 q        }$ p, i! S' Z3 Y) V6 J8 R* |/ O$ C
    }
) n' s2 R9 Z6 ~  A    else{. b* y  Z' h- E5 L
        if (upp_dmai_int_cut > 0){1 E( \  P: l# J( l
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# S! h  C  N" d0 L- t4 E
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ r( D3 _* O+ V# f2 y3 ^2 F% y2 V* N! w

4 L( C/ a# O+ M4 W            //copy data to upp_recv_list_busy# h8 I0 u, B: J1 F  S# f6 Y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
' b  R6 n/ P2 }" R# E
7 u  ^7 G; ~' X8 F; [2 X# m' x            //
8 Y; a) E: ]4 a; T4 i1 @            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- |% ?5 Y# P3 b4 y/ ]) W5 [" C! W$ ~+ W
            //; Z' ~& d7 H3 u4 X+ R: I
            server->upp_channel_a_recv = false;//
) A: P9 |/ E* ~3 s% ~
. _- _6 }5 `; m) X5 L5 l$ u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 f3 c3 `, \, C        }
$ C# V7 B# L+ B2 f1 f    }
6 u. R  Y* K& i6 y9 w! M( `. [1 y  G2 b( Q  E) V+ L& U
5 V  u+ ^4 ~0 Q
    return true;
( G3 W( e! Z: u}
! f6 r! t* q5 u( k& y0 r, V) h  }' a; R$ J8 b9 E5 s
static bool server_upp_data_send(Server *server)6 U9 B# R- J$ v& p) T5 w
{) [  `5 v" Q- ?
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, M  B. j7 G% b+ l        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 w" y: s, s  g
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 [- f' a; }. e$ B3 G4 s! k        char tmp[128] ={0};
& {: L3 R* r3 M! v6 w  Z+ s9 ]: i6 r$ r) Z/ a
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ j6 W9 f7 x; ^) |3 O/ q6 |        print_log(server, data, 64);
3 Z8 r3 F# C& T8 X. U, N# u. I# V" q/ v/ Z( N' |
        //
. ^+ y) S+ a- m        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ j2 h: O; [+ I! F
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 J. d9 J7 `& I, C7 h
        print_log(server, upp_buffer_b, 64);
, G6 M0 E1 H  {3 T6 M& [( x
) r2 b. h1 u9 [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);5 M5 d: j7 V% z* j* q0 v6 k7 F3 S
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # A  u8 c% A& v+ S7 f  p: K& \
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
8 K' p3 n* [+ g/ P8 |5 _9 s        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" W; c( E" Z! f+ ?# x
. r! ], Y# u$ F; J2 J% T
        memset(tmp, 0, sizeof(tmp));' k* n9 @& B, T' ^7 n" _
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- c- o: z. f6 `4 N6 A& |* E            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# r3 Z+ Q6 m* F+ J- H3 P  j( \        server_msg_send(server, APP_CMD_LOG, tmp);
# e: O- X+ R6 T& h0 u  @" R7 G3 L* @  o( B
; n! _3 W/ Z' b- E; c0 A        upp_error_count = 0;( ~1 }( A4 C2 \1 q( e' c
        upp_dmaq_int_cut = 0;2 h9 G- f% M" m: q+ d, ?! F
        // fill in data / n& A3 x* P' @2 J' x
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# J7 n0 v7 o; D, u4 j7 Z        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) w$ M" L# b! [0 p# f. N/ V+ J1 I0 E& p2 Z/ @
        // wait send success
# V& R/ k; q) V- w! c$ u' M: r/ h  n        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 y; H) a6 |$ {- S0 \4 P- T& Q, w
7 }; r8 r' X5 A6 K/ x        // make data node in free list
4 [4 P& }  P/ h& s        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* J3 [: m- i( w  z. y/ Z& G: l
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
- z. d2 c0 g* A0 t  Q# h    }
" w& Y8 B9 V! U- B) R. I    return true;) ?5 n9 k% n8 @& z3 E5 P
}/ _- q( ]/ _$ {" d7 l6 n

6 @: E! U) @; q5 _$ I7 N

; M3 M( ~) R( l+ \, r, [/ l0 @  R4 t( I1 M

9 \6 a0 K: j9 D' ?- A1 F! T9 H
* j/ b) C% [* k( @2 z, d0 \

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( i6 u4 ~8 \- T' J
5 k$ `3 _5 b2 s0 K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 21:35 , Processed in 0.042794 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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