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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % l$ u4 z- J. ~. H3 N

4 l/ l6 C3 u$ l) ?7 ^9 H问题描述:
6 Z9 m7 ~: P7 T8 G& ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ ?5 m: ^+ B. g1 w
3 m- H- C, u6 v4 W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
1 U2 s/ K: D6 H9 D. K% l  c; q. h3 U' ?
测试结果如下:
% g' C2 F0 t' J* v& q- C3 ~1 ~138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 E5 t' m4 |2 X3 k* X' F& t% @: K9 D( L0 f& k* I9 R4 j! D
- W) Q& |  G* Y; A) N
备注:
: ~. A3 E- V/ d6 ]5 d8 I  X7 E. u1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, X: q# R% K4 z$ _- j" {
2、相关代码如下:
0 V) _6 w! X3 c& V2 p; v//UPP DMA缓冲大小512字节+ I) ?; H1 @) P% K! _: Q
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! ?1 L8 V( s; u5 C1 q! N5 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; J& ^; ]) J/ ^% ^/ X( D! e6 N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# h* K- S2 {* M
0 @9 t, u0 ~! L# v3 A* b
4 v$ o2 S% r2 J- Q" B7 u//upp接收、发送buffer1 B, P1 T6 f& t
#pragma DATA_ALIGN(upp_buffer_a, 8); y8 |  {5 ?: P+ X8 c: z
#pragma DATA_ALIGN(upp_buffer_b, 8)
! @* A9 w& v6 o2 ~" t" f& j; E' L' S+ q. Y2 t
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 T! B' z9 |9 r# v- _
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 a. [6 C9 B) Y8 Y% M
% k' b) u& r6 ?: O3 x4 N" m8 w+ U+ w
static bool server_upp_data_recv(Server *server)
; V' i3 X0 j: P{
8 {0 T' p3 Z. @! O8 g7 L' w: d    if(server->upp_channel_a_recv == false) {
: a& g( @/ R! x8 ?1 h& f        server_msg_send(server, APP_CMD_LOG, "upp recv: start");; g: t2 h3 P0 H% n4 t4 J
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' A6 p; i# ]" H* Q% ^# `& A3 T, {2 F
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 h$ K. _. y, x# K+ K1 w- n8 P. j1 E

# o3 U- q. F/ n3 _7 E" U            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, ^! {/ U/ ?- A) R+ V2 }9 q2 E

1 T0 M. T6 K7 j8 s  n9 H- @/ R            server->upp_channel_a_recv = true;//
. C) a& ]' E) A( |2 g6 T            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ B2 \# l/ e6 p& M            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: e0 a  }" W& Y/ J
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, {( L" ]( _5 n! a$ i* E  N            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- b, ~. ~6 ]8 O% ]  t2 I

5 T/ C, k+ b4 V6 Y" W            upp_error_count = 0;0 L% w$ B% a) C: {, t6 L9 O3 l
            upp_dmai_int_cut = 0;
1 |, K5 r1 w- P5 Y. u% b; s
, F3 G( _) U/ o            // fill in data
; t6 h3 I9 x( m5 y            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 X9 N" p5 w0 \7 V2 _2 U7 e8 N2 {
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* g& u6 k4 d0 q" o3 z        }9 S4 C! h, j3 C- M% ], u
    }* c  o8 B! y; z* P7 I6 w
    else{
& r+ C, V# ^3 E        if (upp_dmai_int_cut > 0){
9 H# l8 _; Q3 R  a, T: V% o" e* k            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 B! @( V! \/ j) I7 x  t% L
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ Q( k# V' n5 J% ~, M9 ^
; G$ @+ L% |0 P: b$ M

+ n, N5 n( _7 N0 [4 @0 _' c3 }            //copy data to upp_recv_list_busy
" a4 I9 S+ ~4 `            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 Y* V# H$ v9 V! \6 m1 ?2 P  L$ N# X
            //
4 z7 W7 S0 m' X8 x- m$ B$ J/ ?& I            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 c$ e+ D! I5 R, ?
, k2 z# k$ g$ O) G7 W: Z
            //
7 G2 B% t  P3 Y4 n+ l            server->upp_channel_a_recv = false;//% t6 H7 R; S% ^( ~$ [2 `% h
3 P7 ?: B) E. ~& \
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 f, }& ?8 P  [* B% V
        }  o4 e8 _& X1 K% b
    }
, l$ |; S% ^* D0 h9 |3 |, X  E, y: P7 }0 \7 ]; }9 L. Y6 [

7 W0 S/ P/ R8 `& w  b2 j    return true;
1 O: A3 A2 q7 H& ^$ |7 _& d}, |8 D0 j3 G: ^
9 K& u" Q2 D+ q
static bool server_upp_data_send(Server *server)
" s* V1 Y6 c1 o' k) _{% K/ Y* T; I  [5 F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; T: |( C2 P& Q6 e        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 n" n* `; d  h, X1 |
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) x0 |- G3 H# g/ N        char tmp[128] ={0};
5 ~) [- I/ S$ |% K5 F# Z8 q  S& {3 X8 q5 `0 L# B3 \
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 s, a6 G# Z8 x& l        print_log(server, data, 64);
9 U6 G  n3 ]& P( o: H* S. {4 a# d5 V6 G4 M. M1 ~. K
        //
) h# n, _- w1 h1 r7 ~# X" P        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( N' k/ \- u, @  F: i! K8 T- T
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' o/ T! M! h( R0 m
        print_log(server, upp_buffer_b, 64);
$ @" C4 g+ b' ?( J" K) Q2 s0 K4 e8 s4 \. \9 Y( d/ V  Y
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
9 p( u2 F8 e6 b7 `+ e        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ; ]: W. X. }/ G3 D% O2 {, w
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" X6 p8 I# ]$ Z( r( L
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 C, b7 C+ ?' a% U$ q
0 b  U9 _3 k" j7 p        memset(tmp, 0, sizeof(tmp));9 C. n# \( U; @5 N& }4 X- B
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; L' z1 y5 {+ \            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 C& }% b6 Y* r2 J" X7 ?7 X        server_msg_send(server, APP_CMD_LOG, tmp);1 \' s% N9 \3 h7 R4 `+ q3 k8 w( @& U

/ p. M  K" I' z0 n4 H, C        upp_error_count = 0;: L- m( x) [" D3 X4 A0 k- C
        upp_dmaq_int_cut = 0;9 n$ N' u' v3 u# \, w" V
        // fill in data
- t0 N7 \# T2 k  R: a        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 C5 A( u0 T8 ]
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 w* E& L  l" `( j" n& \2 g

! [& Z+ q* Y3 J  {! m        // wait send success
0 H" O. L. n* G+ t7 K1 c0 m        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 Y  a! w! b- B. c
8 \4 O5 y: S5 M8 n, b
        // make data node in free list
0 A3 }0 ~4 \7 J; l9 n  W        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 C5 s- a: r* {4 |1 k; j( W        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 j0 d9 S& G( r- D+ W
    }
2 D7 Y0 ^. Z$ k9 K    return true;8 k/ P, s; l! i7 ~
}& C+ `8 y* j' ?0 y) n1 H! Z

- W& X& \- x1 ~0 Y8 a8 G/ g( \  ~

* x# n1 y( s$ n1 _9 }+ I" G, G' d# v; Y* L( s+ T% V" ?! o
: ^& ?0 y6 p; O

" c- r! J. W/ {" Q7 U

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 F1 |6 a' ^, ~; a$ z7 e5 a* r2 O

6 `: h8 U- Y- B2 B2 d3 I* `% l

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 20:34 , Processed in 0.047430 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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