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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 j! q  I9 R- W2 A3 H8 {; N+ J3 ?1 U! V0 a  ]/ b$ _+ y1 R3 L
问题描述:
% y0 \/ U) @' K( g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- v: A7 g) z* d2 I/ C3 s3 V
) E5 `( m6 F$ T& c1 Z7 G, z+ U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- m# ^* O  l. a0 }/ P' N) C7 a" v
: M6 t3 a* [0 Z" ^2 @
测试结果如下:
0 \4 D0 H/ |) d- U1 ~9 s138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' q, _! K8 C2 f5 d: g: y; U: v. K% w$ r, X6 m" v& @8 M5 T

3 w/ H$ D8 V0 R5 p9 j# m2 Q备注:0 K( D# V! D4 _  N, K, i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( S' X+ ]8 w3 D/ o8 ^' U6 N
2、相关代码如下:
6 i* y. b3 H$ Q3 c//UPP DMA缓冲大小512字节' `0 M0 T' q* v4 a$ t7 S3 z) [) B
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
5 h5 h, P7 x$ o: N0 x7 q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. V! L7 X6 ?  C; n& m9 }# j
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 Z9 E; N+ s$ ~; o2 U+ d) X& Z7 O* }2 f5 z+ ]* }3 i6 A
: o9 h% I, P! {' D9 p
//upp接收、发送buffer( C- K. T, {6 n6 Q# [; Q- h: L
#pragma DATA_ALIGN(upp_buffer_a, 8)
  e1 b% ]+ {, C#pragma DATA_ALIGN(upp_buffer_b, 8)# [3 v* T5 w0 i. v8 C8 i
' i. ^3 v( e$ p5 p/ e# p0 |
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];0 z+ s% i+ W$ c0 B/ V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: U' ^" [  c  k! r" I$ [( o7 L* h
7 [7 u3 c, W( g' Z* s) z
4 r1 u% z# U2 s8 J5 F- H# K0 L. I
static bool server_upp_data_recv(Server *server)
3 a" }: K& r* f& m. A/ L{/ F, X* T4 M  F* r8 ~/ M; Y
    if(server->upp_channel_a_recv == false) {( s; y* \, |- N7 u* J$ ]! D& a
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! H/ [  I7 K4 c& ]& @
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 [0 f; d: f, g            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; U# i8 T. ]/ a  t
$ t- R# h; \  L% y" a* K$ c
, L- C( A( W* S( |            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
( C4 ~  W# u- z/ P) ^3 |; G& A5 G* K: n: B8 o6 X
            server->upp_channel_a_recv = true;//
" N7 j# [$ H9 ^  H9 F. o, F            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* t) ?! J! m* ?/ o6 C
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
9 H6 u( x, d2 p3 ?/ y' ?. ~' m            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ W  w0 y9 M9 s  B) f
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 p% E8 ]! v2 L0 K% `: M3 M0 Z
  i: |" E7 h& _% T6 {' ]& t+ g            upp_error_count = 0;
7 m+ l# ?# L" N1 [2 p, e: Q! u            upp_dmai_int_cut = 0;4 D6 Q) e6 y3 c- S

. q$ |9 r) K, s            // fill in data
& Q; b* `6 m8 P& I            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 o* V/ U  q! a, Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 m- `5 E! ~1 D1 u1 L        }
. U- w) F' D+ y9 l$ Z    }/ a, g2 @. |3 ?7 f' G/ b1 A
    else{
" |. h" S  }9 |- Z: R        if (upp_dmai_int_cut > 0){
7 E# }! p5 `1 g  ~: b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) S7 H. s. X2 {; H+ e            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 ~4 b9 U) `( q2 ]! ]5 \  P7 P- @% z! C

* i& J" \, D* r# ?! J            //copy data to upp_recv_list_busy, {; O. D' T% G
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* d) J% H( X- o; s+ l$ P0 z8 H) {( e' l1 _6 @$ K4 D- M
            //
9 a' m1 u2 e$ o            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
. d  v6 A% `! @" Z9 l/ Y5 o4 R0 ~! c6 g5 `; Y* Z* q+ }
            //; B5 z1 t& J; E# r% P  B
            server->upp_channel_a_recv = false;//
/ H3 m, v7 ~! z, T
, \9 x3 J7 _1 ^1 U" b  }' N6 u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# ?9 e4 f$ b! P' E! ~4 K        }
& Q% T% [" G/ j9 ~: u" L    }
1 \9 y, c8 x* [5 I* y( q
2 ?! V% s7 ~; t8 Y2 ^3 Y4 l: E6 b$ L9 u  T) k% B  f7 I, l1 S
    return true;. z4 ~0 E& n  M5 ]  T- a
}+ \2 I! O3 q$ f9 @2 Z8 Z
) E# n$ x/ ?2 Q. F- R
static bool server_upp_data_send(Server *server)
  i7 q' G# w7 z( W1 r* o* I{7 _3 a% ~" |) y9 o7 t. e. a  {2 q% h# @, v
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# |( s5 j6 s3 N' F9 z" z1 E7 _        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 O# n: C7 ^1 S
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, i6 t; n$ v) i0 c2 ]" E7 k7 d        char tmp[128] ={0};0 }5 f) T& U: I; M' a

9 V8 C0 t4 \/ E1 e. K8 {        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 q% \  @% P1 V5 x( k4 U        print_log(server, data, 64);& p2 Q. {1 G$ ]4 p

6 U/ Y7 e* m& }; h6 F        //
/ l  S1 ?7 f6 S  f$ `        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
  `: @! f, h4 |7 m2 {) `        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
  {9 S* @+ u; P: U+ l9 y        print_log(server, upp_buffer_b, 64);  l" E: s5 ~9 g3 |

: {$ _0 ^& c/ A6 h, v+ [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);4 V2 Q) ~. n: L4 G* A7 r
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; , m( L3 t' h+ E: P# k
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
; k9 C+ V; u& o2 o7 O        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' H9 s1 U) x! X

9 x3 e, x2 ]. ~  y  S        memset(tmp, 0, sizeof(tmp));
& o7 l- @$ d: U1 W7 A* o% _* o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 J2 s* w- j( H. R" Z5 W            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ s: u3 @- [+ V' Z* r1 e        server_msg_send(server, APP_CMD_LOG, tmp);! V, x6 E9 G; Q5 @1 F7 J
( o: p; y. U5 P) s" V
        upp_error_count = 0;6 {0 e# B- h. J( D. P! Q/ g
        upp_dmaq_int_cut = 0;
. V+ f* Z- ^5 x& p* I3 {        // fill in data & k( C6 }6 ]4 {3 Y% T
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . r% |/ G) D# ^8 W0 V1 N' z9 w1 `
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% x+ R# l$ r: J9 B2 l& s6 _' F, s# \- z! K4 `4 t
        // wait send success( c# X' d( K# q) D7 M4 e/ z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & L% ?' C5 E4 o: h' A5 s

" e9 V% }( M. m$ R1 x0 }2 Z6 n" L        // make data node in free list 5 Y# ?* I: ?  f+ y, M* w, ?5 _
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: [; ~' ?& N5 z& q" b, x9 O
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* T2 n$ c% A7 z  C9 }3 Q
    }1 I3 g' G; x( h8 T
    return true;
0 k/ p  ?  l2 r0 V$ P}* u  ^6 n5 l0 p2 e9 i6 v  `9 X

* s( g  U" [, q3 m/ y3 z
7 R! x  ?6 [( A) o

; e9 n' v  D6 V6 ^

8 z0 ?+ g" N- C# }! s
4 m* J  I( F8 q1 W" `3 }

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐; r* e+ b  B4 G

. k: u: G3 _% [2 k* s" m# I

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 20:17 , Processed in 0.042594 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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