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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% W3 J* q8 L# I7 S& ~
% x1 A9 _& L. M问题描述:5 r. h; ]6 p3 C! N- r% C2 A
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 s( I) Y4 W! U; d

7 X; L7 P* I: F$ F  H( d图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ x( |1 Z  `: r8 d% q

1 X5 L4 L- R. F) Q9 b" h测试结果如下:" j/ j( ~1 ~9 C* J" l) L" o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; o1 B/ S2 V9 h* `6 I) k. `( M
! \; P& Z1 @) }" _# Q4 E

3 s0 V: D( a* f备注:
( b- d$ `+ ?, n' f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% S" l3 a+ S3 l( _$ N
2、相关代码如下:$ ~/ P4 G; o- X6 v' |3 B
//UPP DMA缓冲大小512字节+ d) B, l, N+ n# |3 V0 u/ l
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: Q& J7 i2 h6 a, h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 t$ r" J/ b: j1 a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& ]1 }& z2 J1 x' {8 ?) J9 ?& S
# ~5 l' F$ p! M) s4 q6 V
2 q+ g' p; \: }6 H. a( [
//upp接收、发送buffer- `! V7 O. @' r: H- t
#pragma DATA_ALIGN(upp_buffer_a, 8)2 W  [* Y5 T2 T
#pragma DATA_ALIGN(upp_buffer_b, 8)
6 h: B! d2 J; P/ _  \: H) _0 G9 K9 D! u# l8 A0 ~6 s9 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ S; h: z' l6 y  n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  W( k( |7 V% M8 G6 O' Y. }
* V- p2 q8 H: n6 `1 N- z# d
5 b' h7 ~, B$ z' kstatic bool server_upp_data_recv(Server *server) 6 |! O: Z; J- z9 n& ]6 V- p
{
6 ^5 H- x! p+ R# r" N- K/ ~    if(server->upp_channel_a_recv == false) {
% a+ l; W( t: H4 @        server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ ~" A  a) U* Z, V
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 t$ X! E6 n& k8 }" n" T            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& H2 B0 c) N, ]& ?" U9 O5 N, ~) j
  M2 n; A. G+ |' O) F! U
8 ]) g9 |+ G( y; c' ]+ g            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 J/ c8 S4 D9 K2 w; Q
4 }; S! p& `! @" n3 d/ S' r
            server->upp_channel_a_recv = true;//# i3 p& Y6 ]& j  I. `$ b
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
" g) z! i: D, D+ X# G            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
1 T# B  c. K0 ]9 Z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ [( d# t0 U( g* T" E; M1 [
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; z0 I0 J2 M# @7 X! J: B" }9 `$ X7 N6 N; n
            upp_error_count = 0;
& W/ r3 O6 A% |9 Q            upp_dmai_int_cut = 0;
! F" w5 S* B) |" x0 [6 R1 H6 N5 `) E4 I" f0 _
            // fill in data 2 B; G4 d1 P) j$ j& q: q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" j* r: g# k1 x; ?* R5 b: f- O
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" p) `0 l9 c; R, V; _4 i: [6 k3 s, S        }% j1 n$ n$ y# Q# m
    }
. T; b- b2 R4 B) e- r    else{
1 g7 p( ^- z" c- ?8 c; [        if (upp_dmai_int_cut > 0){/ r& P, i2 E* A0 n6 _, V
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& Z- ^7 _# q+ T" x/ [8 o
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 \  U9 d3 ?1 N! E, e& |
& y5 ]$ `* i; S' A
$ G' [) p: I: x' s) p, D0 f( }7 l
            //copy data to upp_recv_list_busy$ ^- @$ @) F6 N, ^' Z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! ~* x, W' v5 v* `$ W" n3 G- K  f0 R: U1 P3 ^
            //
$ N* U. `5 w& u6 s5 L8 s, o            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' z0 P( M/ X) Q  o& n# [9 X
5 h# X( T: t; ]' _7 C& V# J
            //- N, a: l+ V; V% Q5 A- a) Z7 f
            server->upp_channel_a_recv = false;//' ]0 V: Q, a) i4 ^3 Y% h! T4 h

: w, e+ A( d6 ~; j7 ~            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 m' N5 ~  b4 l( I        }
" n; v/ S/ ^( j9 Z2 D2 M    }
* H9 L# o, ~6 s9 |/ [2 w/ z' ^7 j7 B) `2 @# H: o

7 f5 x8 q/ H. K( A' i    return true;
. z0 U9 d! i! D2 r$ g5 w}4 q+ V2 f) M7 F) Y2 ^& A

7 d: l& {* ?! ^$ q6 e5 ?- N' qstatic bool server_upp_data_send(Server *server)# ?+ }- p" o) `5 {+ E- B  P
{
$ @# U4 V$ I5 ?& ^$ L% a5 M    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 o5 Y& a, X$ @& J8 B. S% S2 i2 s        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 |3 G, A5 M3 C2 G; ?        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
& s: \2 K/ }0 p9 J0 w        char tmp[128] ={0};
8 d* `1 C$ H, ]5 H; G" |+ J2 ]! p
4 F) P2 t) x# |        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  D  P! \; a+ ?: _        print_log(server, data, 64);
# V: M+ l+ \' b
* n) M: S0 H" X% R        //" Z- f6 K' x* S6 S3 `" X) C
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 x% c1 `9 E$ D        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 c( B# v7 z5 N+ o1 C% o1 O9 E  u
        print_log(server, upp_buffer_b, 64);+ a% E) n5 B# X8 |# }
$ X4 f& v) m3 s+ q' k* _& o
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ j+ p3 j3 @# \6 b4 |% F
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
/ n$ R. F! ^6 {* ~# _# J) M6 g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; @8 y/ h% f8 q4 v# ^: R+ O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 A+ T3 B! `" ~2 j3 A* u0 L4 s) K' Z0 e, ~0 x% h) I
        memset(tmp, 0, sizeof(tmp));& s6 d8 H- E* e, G% S& ^0 A# x
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 a: F8 g$ P/ U4 ~: l1 q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 Z! b- W( C# r        server_msg_send(server, APP_CMD_LOG, tmp);
  h. N1 u9 V8 ~2 p
- |* |! m( _( `4 l        upp_error_count = 0;2 w0 H$ S. E6 T( j. K
        upp_dmaq_int_cut = 0;  L- z1 a5 A/ p% k. u# t
        // fill in data
+ _/ L6 P7 R1 k5 Q7 o0 v        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% a# L& [' o) E8 M2 ^+ U7 `        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 Q0 c1 X, I9 w) r  v: O5 z. \( b- T5 f6 J' J( B' t: G
        // wait send success
8 f; v4 H4 W. \# }" Z        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 L# c" R! x! h0 d; G
0 k* I+ o/ ?' p# z4 }/ n) K! f        // make data node in free list
5 D' s* ^; s' l* Q7 G        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 Y/ e! o, u# {/ w& m
        server_msg_send(server, APP_CMD_LOG, "upp send: success");% n6 ?; ^% T  C( ]& t
    }
- r7 `) r' a3 A, @$ X% |6 w    return true;3 w+ R; k; L: y# Y( r2 f4 q
}  K+ U3 [! k  [9 `
, U. i9 ^  X' B! x5 L0 |
& e$ W0 D& v8 n4 G: M

0 @5 x! Z! {3 g

5 a: t" Y. J; t* @/ T; x  p. m# e4 K4 S) C

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 m/ q0 p7 u% Y( {* M
4 R- x) T9 ]2 ?5 i( z5 r4 q6 n" T

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 21:32 , Processed in 0.042802 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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