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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / ?) f5 r" U# I' y2 V- y; X7 _! W0 {/ j

3 |5 R  Q% \6 L; l问题描述:
( L" I( O* v+ |1 m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
  s1 W/ P' Y( B# u
* F- @2 V/ O3 S; E. Q) U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 V3 b2 e0 E0 ], @

9 @& v8 Y! R( a% A" G! j测试结果如下:- m! @; y& o* S5 P- V4 x4 m. L, s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 J9 e# Z1 u- B+ r: x4 z" A

( @& k; q, o0 O6 ^& x  B0 v5 s0 c0 u0 v! l
备注:2 K/ L, S( d$ ~: |
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: @/ Z. E- c2 a  q% X: L
2、相关代码如下:2 \% v1 S  G5 D/ b- {
//UPP DMA缓冲大小512字节/ n3 @" X, e2 B0 u4 t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 v' z1 Z, N/ j( G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 O8 n6 t6 T# z# }: q7 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" \5 @/ [, c6 ?% ?5 [
6 h2 o4 L8 K3 Z, `

: q' f9 B# d  K- Q//upp接收、发送buffer
4 C2 O, p% j' ^- Y# O$ T# Y#pragma DATA_ALIGN(upp_buffer_a, 8)
8 D. m* ?9 M. t# Y& b2 Z#pragma DATA_ALIGN(upp_buffer_b, 8)
1 h7 c6 t1 V8 g8 n# t
7 u$ |3 P1 v0 U* ^1 S* G' m* gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];2 A4 t0 c/ b4 g" u$ }3 v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, Q; H: y2 w; Z

; `5 s1 ~) s$ o8 {+ c3 f" H
' H1 @$ e* U  p# d% Q* U' z, Q9 Gstatic bool server_upp_data_recv(Server *server) : V( Z: `% P- X1 _9 J9 t, w* Y' y
{
! J1 R6 t: }# O    if(server->upp_channel_a_recv == false) {
, x$ I" _% N+ K& N) @; x* F' W9 \4 l        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Q4 Q: i! g& `& T& d& f9 W
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  q% v7 q2 o; z4 v2 I7 Z+ J& W% f
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! T* |, S4 K/ ~0 g! f+ I

" y0 P9 o  Q1 R! t# r) ?/ `
# `& K6 I% U( M* T4 X; W  ]; F            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
( Y! D- a  Z7 Y# e/ h7 U0 U: V, |% i; z0 Y+ L
            server->upp_channel_a_recv = true;//
% o$ j2 i# ^0 B            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 }4 w9 n" E1 Q. p            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% ?) R1 ~9 {* _            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
( c+ u  h; w  J( D8 |3 m            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" G8 L% U. E  ^; c: K( M8 w. [3 ]2 \3 ?
            upp_error_count = 0;
% V5 K* n6 Y! b            upp_dmai_int_cut = 0;6 c* C: v: m+ f7 g3 ^' h

7 Z! b8 ~' ^* f1 L# |2 Y            // fill in data
) @, g" b/ L% C7 p1 r( c            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& }! K# h0 J7 v, t4 `9 V
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 Z- U5 r# f& D; M        }
' `9 o( k: u, l, ]    }; ?; |7 g3 F% r4 X
    else{) D* p  U% a# l. T, H% t
        if (upp_dmai_int_cut > 0){5 I( J" D3 A7 _" p
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ J; {" L8 r# E0 N4 r            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 ~& B1 u% {" V3 N5 {+ ~
' ~3 P2 S: m$ S% ~* u" ^
+ V# R3 S. G4 q
            //copy data to upp_recv_list_busy6 {/ M+ X/ }/ p2 [: n5 T# ^
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% [/ R) K- _0 j/ c

" w. M" r, m  |% B; ~3 X            //
7 ]. D  L+ z1 r7 _: N1 f- P            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. p2 r8 J4 f8 m" W- n8 D) J+ C% l, N* w1 S  o: y* C# z) |- I( F! O
            //
; ]5 x) @0 o; ~: v! q# S            server->upp_channel_a_recv = false;//! B+ z* Q9 o8 m* |) o$ E$ e

  ~9 T- ^. B- f! p* l) D/ l            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ o' m# _; i6 d! @" }$ Q        }
2 S' o* {3 p5 Q- a    }' u8 K# O6 a2 D/ j7 M4 K" I- e

4 U, `4 p9 v+ f; O# Q% ]/ q5 q2 Y$ j4 g
    return true;
: z2 [3 `& S8 o! M}2 c; Y% V( }+ O/ E

; ^7 ?4 }- |3 C: K+ |0 Tstatic bool server_upp_data_send(Server *server)0 e  |. j3 d0 b/ l* u* D7 N% q) f
{. b* v, L, _2 n; U
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, ~" V( F' A* R" V) M/ c        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 m# ]  F8 w. u8 B( E2 h        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" U% w( o! r; ]% ]! a9 U
        char tmp[128] ={0};& T3 ^. G0 s: {  F" I8 D
2 k5 O, y' k  a# U  P* Y" h. U& u
        server_msg_send(server, APP_CMD_LOG, "upp send: start");- t9 `4 R* n7 C
        print_log(server, data, 64);
% q2 Y. `  S8 Z( r* y7 P2 a4 D3 T2 F& L) ?
        //
# x1 y' |3 r% r# ]% \( d        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ |) }$ @* g/ _$ F$ K
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- w+ P( F% }- d2 Z4 d
        print_log(server, upp_buffer_b, 64);; x" z: ?# w8 L! E( j' ^1 Z
/ s) @/ ^% o( n8 t. m3 j
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);  n  M/ q* t: E: \" o
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 4 o+ D1 g0 x1 r( B) [. [# ~
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;% B9 |0 T/ @/ `  |
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 K, m7 D$ T1 S6 g7 z5 Z; O
0 {% H- h& h  j        memset(tmp, 0, sizeof(tmp));' P  t3 S5 d( S
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 C& h* ~) l" E" S
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& ]8 _* W  Q+ [% R$ d9 y        server_msg_send(server, APP_CMD_LOG, tmp);; W1 Z6 I! b+ J0 A% j

  U+ T1 Z3 e7 n) T$ l+ A        upp_error_count = 0;0 H' }4 k" _5 {, P/ Y
        upp_dmaq_int_cut = 0;" k" V7 @  {$ D$ ?
        // fill in data
$ n$ K- M2 a5 k$ U+ _9 Q/ R        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ B2 r( F: [8 Y$ W9 D- z: s" |        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) g. L$ d6 Q' b8 K6 d0 N( D" T, H) f; D! F& L* @0 \
        // wait send success3 ]0 y' t6 k8 d1 [' L8 C
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
6 }' Y. H, G) B! Q/ z4 B
1 b% x0 B% R4 }/ i5 h        // make data node in free list 4 P. V3 m1 M# ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ `* g$ C- x9 ]1 ^
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 p5 `! T: x! Q/ m    }
% K) ^; G9 ?8 N: t    return true;2 s8 n* `+ Q& G9 \5 D
}0 P, ~' H. W# W+ {5 r! M
# a: Z" v0 H& E3 |7 x: }  ~8 I) d

; O2 Y( S. _; |9 W, E5 A  o5 f8 u2 K' k; s1 z. W
. M* e* B' x! k9 M

1 E  A" F3 a9 P1 c) [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% b' l8 T8 N$ N" s2 a% {- `0 h' N4 I

% w* f7 ?& p5 `" t7 E7 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 09:44 , Processed in 0.045435 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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