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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑   G# L5 y. ?# ~9 b

$ g6 m! b0 V+ ]! E! O% s问题描述:
9 c* B, n2 {- K: h% [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; i# C3 c% |" r# w- f' g  F
( E! r2 I  X+ Z4 t* c  s0 C; f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! E, J& B1 J- ?* j0 e8 b0 m
8 a1 T5 p* g0 v  L; q# n. F; z测试结果如下:8 e8 A+ C7 {8 H* N6 f
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. X  Q& C; h/ _
9 U) r0 g$ l9 u: _; _

+ x: a2 z6 ~7 Q$ [备注:
2 {) h) t  M! E# a& {1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, y- j) P6 F- o  I9 C2 \
2、相关代码如下:
9 q9 s' u% X) F, @' O//UPP DMA缓冲大小512字节, ^+ W& k* E0 ^
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# y% S9 v1 v1 T* H. V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, R2 H  J# ~( v2 F5 {- T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' b" P4 X! D" V, e0 `
% G/ [/ G2 S0 h. O- D8 l9 M! V$ g6 i# Z$ P) k$ q
//upp接收、发送buffer
% e4 I; r7 s6 @  {+ ?# c  C4 m) B#pragma DATA_ALIGN(upp_buffer_a, 8)
  F5 `; l2 u8 q1 ~: k3 b  {/ `#pragma DATA_ALIGN(upp_buffer_b, 8)3 [; r, P8 @& D- T$ N0 A7 k
/ R4 {- Q, C% z% U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( p3 G. m$ O" q, d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% e$ r9 n# y# P, g/ U( x
0 {3 I4 @5 I/ ]8 {$ K2 k/ I
' n1 v* b4 b$ L' Y* ~4 |
static bool server_upp_data_recv(Server *server) " A0 T! U* J. J
{
  V1 b$ g8 C" R) Z! ~    if(server->upp_channel_a_recv == false) {7 ~2 \2 x) L1 U8 ]
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 T4 Z2 A2 F" |% d1 k" y        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 N2 I9 @  G; Q% Q) b  t
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 g$ K* M6 n& q2 W

) e4 Y* i. _9 H; e% y$ O
5 B' h2 K  x( f1 R0 i! t7 A            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  Y: y) l9 Z6 `" D) u

, _$ r3 b  D8 ~$ Q- e            server->upp_channel_a_recv = true;//* ~" y' C$ A$ L( r' j
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
1 ~/ i! a+ ]8 i) R) t, b$ c5 Y- a            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" _5 s% l# e. i: G* F            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' Q, p. H9 R3 w- T& m- A) _
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; l8 b5 O# @5 X
' d0 J& M4 [9 S" ?0 k' W            upp_error_count = 0;
6 O1 P: R* ]+ _6 R) n& m            upp_dmai_int_cut = 0;8 ~# k& j, Z+ g" o' H

/ w7 J$ c+ i/ h3 g: o! j& P9 R            // fill in data
: H4 X3 l1 I! q9 y            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ y2 Z8 y" w; Z6 F8 `
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 }. G4 }  q8 ~: ^' J$ V! {! R! r
        }( P  n& L! H. H, \
    }
$ e& W4 ]5 W7 a" [. Y    else{
( A0 P/ J1 E' o0 R        if (upp_dmai_int_cut > 0){- D: [( S7 Q' U2 F4 X2 B' x3 i
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 C' q) V$ u# f- H0 D$ \1 F/ r
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& }7 t4 C5 v9 \1 q4 m* X' _, D" g- y9 q

& P) r4 l1 P9 Q  |: @3 D7 ]            //copy data to upp_recv_list_busy5 x# _: W: y% q8 |0 Z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, d1 J# }8 a2 @8 r& F8 L
1 z% I0 v6 W- k% Q% j9 W
            //$ N6 V- s7 @0 t1 ?+ ?6 j4 E7 M; p
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! Z8 r  I8 {1 o# G; h4 A; r& C
: r6 E, C) X  V) n  ^% V            //
$ m0 H& D3 ^+ V, A, x  M3 L            server->upp_channel_a_recv = false;//
& J) r' ^3 x5 R/ [
: K( r6 w$ _9 D9 z. |) D$ C$ {            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ S( i$ s, c; n) n7 W        }
- A, I/ W, F  Y+ W0 o% O; q0 u    }- `) n- G! Y2 y+ P* V/ K2 Z$ G

7 u% R! ^8 f4 M2 L9 p9 ?" |2 E; B; h. v% o
    return true;2 r4 d8 a/ t; i  j7 k
}
; s9 B) Y" V+ y5 ]. ~( H6 f9 Y# N5 m! y6 P
static bool server_upp_data_send(Server *server)
0 K% i! G  c+ Y6 y{$ M6 e6 U) {( A0 O3 u* O
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: L( e" h9 H+ h0 A- G        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  c* K4 W# E% g1 g+ I2 e
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 \' L6 E0 w) H% c! O( h! H5 ]
        char tmp[128] ={0};$ V6 T  j( c9 R/ ?' i; L7 P
8 m0 f$ O$ \% a- E- U7 ^, g
        server_msg_send(server, APP_CMD_LOG, "upp send: start");. c! O  ?6 u- A$ g* m) b
        print_log(server, data, 64);3 S* c( u" G7 Y  m! X8 a
+ n. f# c- }1 }& t
        //, \# l  ~5 r  {/ k' T
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' q& s8 m9 E+ c! ^% _2 t  Y! o& b
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 G8 e( b8 \! ?0 W9 n        print_log(server, upp_buffer_b, 64);
: |+ q6 j8 ?$ i  Z8 \! m+ L& m8 f, D, r. N- p
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 `  B$ ^# h2 R* N. T. M2 o
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! d) B) O# u. \" r8 e* M
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;  k8 ]) j2 m# R6 A/ X
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 _' l  S  A; ]/ K, n
, Y4 m9 q1 Z( y9 ^) i# B
        memset(tmp, 0, sizeof(tmp));
; {1 `4 r  U& q7 m& I4 R% t6 b( m        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) ]$ [: o6 b3 H9 j
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 I+ T; o3 d9 I0 I5 x  N
        server_msg_send(server, APP_CMD_LOG, tmp);* @  ]  }, Y, A$ {
" c# A( M' h1 k6 X  {0 D/ N. H
        upp_error_count = 0;: s& ?4 H7 ~1 ]. U) h2 K
        upp_dmaq_int_cut = 0;7 P+ h! B* I) e5 O% Z" S1 {+ n
        // fill in data
7 K% i5 U; j7 a. W, ~7 P        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" n" m/ P# c$ {1 n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. F; B- f9 ?" ^
3 W! j& T, R  b( Y6 [        // wait send success
0 t) e5 z8 a/ ]3 T% P        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 T# `: ]" j0 `: w) Q
% ~% L& A7 ]- L3 f# ~1 S% q        // make data node in free list ) a( @" K! f* `- r
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, M7 m$ [% o; V. P+ M# v+ m        server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 X% u- X# {' G3 {- W# k5 j( x8 }    }
) M& H# E: W' m4 `1 E% x- I    return true;
$ R$ c3 R- f- f) R8 y: C: q3 S: A! [}* K5 ]  K( G* W
$ K1 r" z2 [( u' P

2 c7 R4 i+ ?+ P- M0 F. f9 e
: _/ r# V1 n( ]' L
; o2 r1 a5 U; e; }
, [9 s' }; A0 X$ s" _

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 `# K0 ^# Z4 V! v/ p' m- `) m* p! c( H# w; e: A

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 13:02 , Processed in 0.041226 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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