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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# a& K, J1 v, T; G4 O4 U. b
- s0 b' b# x2 i0 f, A8 ^问题描述:
* r* ~4 p  o$ N9 R& \6 t0 S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) H0 V: i  D4 z9 r: h

. U4 A# A/ e# q/ L( P7 K图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 `$ P7 Z; O" `# e! e" L2 x6 E; N

2 Y: J* ?* ?% u测试结果如下:6 }! A1 o# d* I& C, Z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; x* j1 T6 f' p, z5 Z: r
/ {1 d6 @2 M- y0 z

8 @2 X& j8 m- J; K6 o! Z1 M; @备注:
; }: S, v$ [7 h8 h1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 |& {  o2 V3 k/ A2 Y
2、相关代码如下:
) c. U; n* T' S* g//UPP DMA缓冲大小512字节
/ B# u1 P0 f  {/ e2 u% P9 a#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
* l; X! O% Q, ]1 L1 q0 q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; ~+ A- `, a3 }8 M7 B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! I8 ~  t: {# e9 }" X7 f
1 K! V( }$ U: ^& `

. C8 n, P% |% y% B; _1 [' S- D+ Y//upp接收、发送buffer$ B, Z- E! l8 ~+ ?$ p$ h
#pragma DATA_ALIGN(upp_buffer_a, 8)
, s4 \9 ?- Y: ?# V3 I% U& m1 k+ \#pragma DATA_ALIGN(upp_buffer_b, 8)6 E# x9 v( W% U
( \2 p( F$ |4 k" p) g( h
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& }+ n5 A. S) U+ L. `1 uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ w& G+ L. u; C
! N6 |% L. z) n+ l' v7 P; C
3 S# R( R# A; p( J# P0 }9 O, E: B
static bool server_upp_data_recv(Server *server) , P! j0 t- V* a7 H  |
{+ t' E& V! g% n% d; \8 [
    if(server->upp_channel_a_recv == false) {7 G' l& z4 A4 q+ K* s
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! N$ L, t/ R1 E9 l* \: ]        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 Y$ q! k8 c; e# J2 l9 y2 P            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ U- |: J3 M$ }  a2 x$ `% D
4 u5 B# E0 \  L& U5 J+ |/ `8 K7 ~1 R* @  e2 Q; V) S( S
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 F3 m/ p) O1 h0 n1 t: C
  E; R: V% h0 P8 W' P
            server->upp_channel_a_recv = true;//* @" e8 C) R) K4 ]( {" I
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 v; C9 c# i9 O  p
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 w, u  t/ V( r4 F: t0 q
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: b# B' f* U' u0 N            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 C8 c' g+ o( S4 O4 K. B" X
. x3 |4 p5 J2 {5 q9 V            upp_error_count = 0;( w1 v# E9 ?8 |0 F  p5 p
            upp_dmai_int_cut = 0;
% k2 J+ d' \! c1 R+ ^; \  Z+ p3 a' w1 H3 d, E; Z% y- n" a) W
            // fill in data
  M, r; w) ]. L9 u' Q, Q3 Z! F            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
( v3 T) S+ m; H( Q) k- Y" p$ A            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ h; x. o5 J& q( p8 P# H- ^* k
        }5 \" ], D  Z6 ?  l
    }. o4 h% T6 f& u; }
    else{5 O5 k! X" @  r& }/ d: o
        if (upp_dmai_int_cut > 0){
1 ?$ ~# R0 V  T& e            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 W. l" l# Y. A            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! u, M8 Y' ^# P7 n8 {) g
& ?5 a; ]. S6 h: o9 m3 z6 N6 W  ]  A; e$ d) K) }( m5 k0 Y; v
            //copy data to upp_recv_list_busy
" c( G& |2 }" ?; E+ H            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 [! a1 t8 K' C8 o; d& q7 I
9 @3 N) K+ E/ l8 U$ [% c
            //
" @. A8 Q6 V9 ^, N9 f            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 O5 _1 ~3 @8 d. S3 P- i: J5 j- `. ^; J# w$ |
            //$ D$ D3 w$ e4 H% _
            server->upp_channel_a_recv = false;//
0 e" x5 \$ h' @& d# o' f- j0 H  j! B7 J' ]4 j. }% \/ ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 q& d3 a5 p1 D4 c2 M        }
" N+ F' }9 n& ]0 E    }
& Z9 ?/ U3 t6 ]
1 o% z$ b) E9 T
, _7 a1 A! k) {5 d' ?2 L/ D5 @) Q4 p    return true;' r- i6 _6 b: N' m
}
8 T# \7 W& G: I1 H& i' Y
. [: d" ~0 q  L. h! ostatic bool server_upp_data_send(Server *server)
& Y6 {. a4 c, H7 D' W{
4 }6 u3 U( R3 s2 ]$ L& y/ O, s8 D    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# N) S; D- Y! o$ x  l/ u        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ a5 C4 T7 [6 Q0 D5 J
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 k/ \1 I$ y$ s        char tmp[128] ={0};
+ d7 m+ e5 q# C. q9 S& i7 z! E5 b; s0 H) e% k- i% \  o) q# P
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
) o% b* q& X: B5 c        print_log(server, data, 64);
1 J5 d- G8 L8 L! f& e2 t
3 r9 H1 k, K  d* C3 G1 l        //3 o5 ^3 M- l# i2 I: q9 c* S
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
4 Q- B* c3 I, I4 {' c' o        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; T, [$ I/ K+ _
        print_log(server, upp_buffer_b, 64);$ C. O9 h: R# q( g6 P+ w0 J; H

0 _* R& i  V, `        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 g* X* G% a' b) m
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# Z6 d; t9 c" ~9 x8 ~        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" g2 [1 p8 Z; d1 A* U9 r- B1 _- d
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
; Z. e: Q* z1 s& v6 c
% s0 _4 C! C* n        memset(tmp, 0, sizeof(tmp));
' u8 ^# {6 L! \; c$ N9 b0 T: y        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + e, K) i' H, y7 g
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 N9 q2 ]% N& I4 T! `( A
        server_msg_send(server, APP_CMD_LOG, tmp);
2 n; Q1 a) C# h0 `
/ a' h6 I8 b  t        upp_error_count = 0;3 o* n6 I$ K% `: T0 l
        upp_dmaq_int_cut = 0;
. |1 q0 X* O( a, q, e  X5 e        // fill in data
4 {0 w+ q; l9 [4 f" [; p5 l/ v        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 c8 e, k5 ?1 \. u9 x        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
* ]/ n" `3 J1 ?7 Q- n1 S
# N  X) G* ]4 \8 ~! w        // wait send success
" b& a* H9 m+ ~3 a% i& v% ^7 ?        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 Q$ R( G% q/ r" C: I

: \7 `1 @* }4 h. v' A( s* q0 g$ x        // make data node in free list
1 w* ]- a/ \3 s8 ?! Z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% z( \+ S5 u* O8 ]        server_msg_send(server, APP_CMD_LOG, "upp send: success");
! ^& `" o# u( E# O4 @6 i    }
7 ^  r% ]7 C. {/ k    return true;2 s/ x& B% Z! F& |) q* |
}
+ l! _% e2 v) P
. b; o7 n+ a) O% T; ~' A$ U  g
1 {- S, o' h! [2 h! x, G
7 r, C1 \  P. Y- H
8 W" B8 `4 b6 f+ d% `7 R2 r$ G
8 ]2 p7 R  ]" s0 P+ z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐# ]1 e4 M* t* y
6 ^1 \4 U( w6 T. m) ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 21:16 , Processed in 0.046213 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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