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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; r# F6 B7 t. |5 ~) B/ X
! `% f1 I; [7 a$ G$ e
问题描述:
7 b5 _  G2 ^& v) {在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& x6 B& Y8 C9 k6 s: w0 {# {! [
$ z. Q- c; g6 b! {, z6 c  s
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 b& K: a1 R, v3 ^- d8 R5 O5 X
8 I% p( @, T) V3 T测试结果如下:2 ]5 |1 m: }, Q$ }! ~+ B
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- f- ^# y" q6 \; b% j( f4 ?8 c5 I

3 ~# f- ?8 j9 f8 s- C) \1 a4 Q0 ?/ U8 b
备注:
$ J4 u6 S1 {& s8 o( Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- X6 \3 r  E% H0 c6 |# G1 _4 L
2、相关代码如下:
) x) `7 R7 _% B3 _1 H//UPP DMA缓冲大小512字节$ x2 ]; ~+ z! X7 U; }$ h
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 o/ j7 k! r" C* U& U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( U* w4 \/ x% l3 J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* T8 O# c/ p; w4 u! T/ Z8 J! [8 Q4 L7 W+ I( C! S2 v
- L+ S1 N7 O+ u" R# D
//upp接收、发送buffer
4 u* b( m3 \2 V& @% k#pragma DATA_ALIGN(upp_buffer_a, 8)
2 A% w6 D& }$ V- x  \, u: `#pragma DATA_ALIGN(upp_buffer_b, 8)) `' F6 X: ?' l/ R1 o: J  S

1 y2 o$ I3 ]! D; y/ `4 Z  V% I0 C3 h. dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! v2 J8 t  P; ^unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ ~7 W: G3 e. |* L2 C+ A/ z

6 D0 C! h/ A+ a. \+ `; t7 `; f1 I4 h( k$ o3 A# ?
static bool server_upp_data_recv(Server *server)
; H  I1 ?4 T1 `+ q{
7 |$ Z8 t7 j: P: ~" ?  y    if(server->upp_channel_a_recv == false) {2 F) K" B# H. h& j1 @9 V' J
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% P! K: V0 `7 Y( s2 T" _% h2 j$ Q        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, ?" r4 ]2 r0 n+ o* A            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
7 w7 v6 C6 g# Y3 F
+ {4 \4 J2 C! l2 U' S. P0 ^# x2 q; q; r) _  F7 E) L
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 W2 ~4 j. g, [; z' L4 R9 K* G) x1 m+ D, C9 o5 Z
            server->upp_channel_a_recv = true;//2 ^. F* @+ V- k2 ^+ P; ~" i! k
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);8 v" r$ E  N4 T0 i) }+ M
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ Y6 S- G. X; V$ f+ f* u0 @            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
* a4 `! F$ W( S2 E1 M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 W  N8 p& A, w( A+ x6 f5 y- h8 S) T
( D) G% Q1 b0 L7 g# b0 z& |- ^
            upp_error_count = 0;0 f+ F  q+ B" ?8 U
            upp_dmai_int_cut = 0;
: N: H  m  @- \
+ r% }# ?7 A; Y/ o            // fill in data + _) I. h) R* c  s- B
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, w" F3 d) ^4 w- _7 C! l            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" }7 r: T, h+ `5 p) V) B1 y% K- V
        }
8 ~1 `4 U: |4 _5 h  c1 o) `    }
  u9 x" n$ K8 R& ~! ^    else{7 I" |& H6 Q7 u+ D1 o( {  \
        if (upp_dmai_int_cut > 0){, |! H3 Y. B9 {
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 v* n/ W: C% z( U4 N            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! i) M$ y* O% Q( x3 [( N7 u; p. H0 f( T( Q% E0 _, w$ r

/ N  n5 x- r4 H7 j  y/ {            //copy data to upp_recv_list_busy9 f1 i% j- M% @8 Y* P4 r7 P* v8 E# z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 z+ C6 e8 _' l2 A% e1 j
8 A3 S& H- h# H/ B9 _4 I/ Z            //
2 |7 t' G* B; K9 n: Z" |, v            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, m% R$ b2 s( p0 d& {7 c
; D* G3 u2 O2 j) W            //
& T9 p4 D5 S9 u4 \            server->upp_channel_a_recv = false;//
  m: F' \, Q1 r8 l# Y9 [( e& Y* Y
) J& K8 T3 B. e6 v& t9 H            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  k& G' O! V. K$ d9 a        }6 @2 w1 ^% k' {6 m
    }
- w! ~+ ^, q. m- C  E
2 H. h2 f& M3 F! ^) v. g8 _: ]& U- p2 V& G
    return true;
9 e! M8 E1 I' C. t- B4 Z9 K}- ]2 s3 ]; U2 L. w# N' q8 |( x

  S( k5 H! ^# I0 w9 D. l3 Bstatic bool server_upp_data_send(Server *server)& O7 z$ n! O  F; \& c; v& |) A" T& a* I
{
1 f0 P. ]' K7 K+ b    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 G" g. q" G9 o        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% _# H8 j; P! h        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 V7 A& v* l' g8 K* P        char tmp[128] ={0};1 \; m5 n) \8 }; \1 G6 o
* o/ r6 q9 q+ W7 G
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* }3 \5 a6 I+ U3 ]1 f/ C1 T* H
        print_log(server, data, 64);7 S5 R% o3 a0 _4 O" W7 L
+ y* I7 L* ?! x4 ~: Q7 ?+ |
        //5 q1 R( u3 [0 Q) o/ W- q6 T8 @
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 l, a# u- I2 T! q' a        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' X1 e" E' ?0 [0 J: w, y        print_log(server, upp_buffer_b, 64);( g+ @2 f0 \7 t" O
. C/ u  J( t+ z9 x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
8 L5 `% K9 N$ i) |/ ?        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
) ~: Y4 z( x- t7 P% g. I        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) M$ m8 n  b5 M6 D! t+ f7 ]
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. Q/ N1 w7 Q& c% r# F
' c4 @6 p& e) F( L" n
        memset(tmp, 0, sizeof(tmp));3 n3 J% i4 |, a1 H3 s# A# P! i
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 r- s0 p! a; U" a3 c, N% O' H
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; Z' T7 i0 m! j) A  S        server_msg_send(server, APP_CMD_LOG, tmp);0 B/ w5 O. Q; j2 k) Y: q+ O

4 q# Q: F4 M0 g( c- P1 |        upp_error_count = 0;2 L" g% u. Q$ X& @
        upp_dmaq_int_cut = 0;6 i' I2 L8 A! g+ I* \  a: v3 k9 B
        // fill in data   g" `4 u/ L* u6 i8 z+ c
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ z! z' }+ Q/ L
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' }/ X1 o4 s' q) H% R0 M" ^! R4 a. v3 J0 \' K* }
        // wait send success& a* f. c( Q# x4 x: \" V) c/ D
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; @" H$ N3 Z+ E
! c. |+ j" _% w) z0 y% S/ s        // make data node in free list ) [, H3 N& s, R) T  h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 H- D, W" j" _* G5 Y7 z
        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 @) H- W, B5 V- ^+ A# \
    }
6 j) Z# ~* {5 N* L3 R    return true;
  b; l0 Y0 \1 t# {& R$ ^6 a}  M3 b6 h8 Q2 ?% `0 p

9 |+ h9 V: y7 t
/ r' Q7 T) w* p4 A7 f& q
# C7 E  s" I: k) ]- B
4 J" D9 J0 P0 `$ `6 Y( C
/ W: _$ W# E1 ~4 `3 C2 k, o  N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, v4 S3 C" b' l
. \: Z& F" M+ T: H+ n  g

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 03:42 , Processed in 0.043972 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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