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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, F, o* T' i# `: E2 b. q
  a3 Z" |+ P8 ?  p问题描述:
: ^, U& y0 }( ]+ u6 X% z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, M$ t' E/ O/ x: C# I& b! |
$ }3 e; A% f  j1 B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
1 y# H7 H) l# r, O1 y: g2 P* x- e" _. b# n  M
测试结果如下:
# u2 W$ w( d2 {2 U8 G: Y7 [138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: Q6 p  ~6 @, S( Y1 g- b( G; Q* _5 {8 S& a  y

5 {7 z4 U, \! O备注:% t  U) k7 Y5 o( I: S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 c; j! {4 V3 @
2、相关代码如下:
/ v; d% I1 ^) X2 a5 Z//UPP DMA缓冲大小512字节5 j2 R) q- K  }# O8 y. X# C
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ m. d: `, P" M8 |/ l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; T: c( N' c" B' ?& l4 q% l#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 _' p; b0 j* J- i6 Z
5 M# O8 f: C0 _. W/ {! r

0 A* k, n) J  C; I  c2 a+ a//upp接收、发送buffer3 ]2 P+ ^4 ~! ]  }" o# N6 L
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 r0 N% x* h1 Z; i, U. t#pragma DATA_ALIGN(upp_buffer_b, 8)$ v& |9 f, l3 B
( N. v8 x, G2 N+ ^" O$ ^8 J; Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 J7 T0 e! l  M
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ y4 B3 C9 b( k, A; B5 }& Y* b( W8 L( z: u9 \' ]
* j1 |% }0 g- s  s! t0 |; k* ^9 |
static bool server_upp_data_recv(Server *server)
: U5 Y# u/ j: C( q{7 E: z- w5 D  J- l5 ]
    if(server->upp_channel_a_recv == false) {3 o; o% r% u$ W) v& z% j
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");0 q/ E1 _$ H/ _& B0 @- J# C+ N
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 H! n0 H* u1 S9 B3 ?5 I$ j            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 a- F: i- M$ M& w6 O( I% L& x
: ]# A9 k+ z  C3 I5 G' z+ c8 d1 |2 C1 R; O. {0 s' W& b
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 J0 Z7 y' m1 z: m5 ^/ i( L7 M$ Q5 D) F; q% z9 ^) m
            server->upp_channel_a_recv = true;//
# f* h% B- u# Y( t6 I' o- y( f2 r            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
6 q* d1 B$ t" g            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
+ Q! N/ F3 m9 b1 @2 D; {            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, \1 H8 q* c& v5 t4 }; @5 W            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//0 n; u$ e& N4 m# \

  q) E9 d8 M7 o: H: ^& C$ M            upp_error_count = 0;$ D, h1 x; s- A# _0 K1 C
            upp_dmai_int_cut = 0;
7 ~4 x0 }( N: ]- W' i$ w+ p0 T7 C8 R
            // fill in data
0 Y8 V, U  ^! A8 t            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( R- X: D, y6 {7 Q3 \8 f8 U2 r
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; l( M- T+ m, f0 v6 K  t/ B        }- n( [" n5 [% Z9 i; v. d8 F1 s1 n
    }
! m. \  ]( M% w, q8 S    else{4 t; i) B7 n3 W! y  L  s
        if (upp_dmai_int_cut > 0){- r3 w) i) @3 X" `
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 c; t4 g- g1 Y: N5 P6 V5 r6 |
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% T0 o# x- D) g) e
( g+ @' H, u6 T1 ^" P2 @; f; @% |
- r' N8 [3 r9 `
            //copy data to upp_recv_list_busy: k7 S1 g0 U  w2 o/ a8 b
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" `( k' V2 E6 C% ^# }

5 @! x6 V2 B# o9 ?4 G; w% {8 O            //
- _' D1 U2 J: ~! m: F+ a. E' X* S/ E            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* A4 [, r  y% a  _6 J9 d! x- G5 ~+ q+ Z) i9 i3 z! I$ T& i7 K
            //+ D0 l5 f/ a$ f* k
            server->upp_channel_a_recv = false;//# T, |8 G$ u- ~- ?% k6 E7 @* E2 ?6 n

: R" T% V( X* W) v+ E            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 X8 W$ \& L! M9 p4 L
        }. u$ @9 X  ?0 y) P0 X6 u
    }, n; i+ R( m( a4 Z- B4 \, j# b
3 N; M* i6 M% c0 s; W  T) @% Y+ b
  A6 l) R/ A/ Y
    return true;# @$ e! ^$ L2 W; J
}0 e6 d* a: o4 s1 D3 k

1 Y* K* x9 _& z5 t7 b( O3 I0 q! x: kstatic bool server_upp_data_send(Server *server)# h$ x$ q1 G8 G: o0 }  p
{0 @) f. h* Y! f  l
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ f! x& X7 N0 B9 A
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 `5 {; h6 F/ H" I: A7 C8 @
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# k' q8 g2 V- ^1 m        char tmp[128] ={0};6 P  ~- }* o$ L7 X9 w% l4 D- A

. Z# `  J' ?6 {- S+ N: p# U        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 B4 f( v: n9 g. [* g8 V        print_log(server, data, 64);4 y2 _. f" o! F6 Z4 U( g7 E# h# @
) m! }7 L; A& R7 F% D$ P5 j7 Y& b. C
        //2 [& J* C3 J$ d5 s' D# J& _
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) N' z# H/ G7 }" b  K9 Y1 f
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ i' x0 g: b/ f9 Z% T2 ~- g* |        print_log(server, upp_buffer_b, 64);" e2 n, }/ _2 Q! Z; f/ j

0 V0 F6 S$ i' x' c  e7 ^- V6 e        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ c9 P& G+ e+ R" d) ~, l' J
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 f* v$ J# e% `# V% b2 c3 R5 [        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ {" z) W1 F+ h9 E% o
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 J0 p7 C7 W5 H. J0 W6 _0 ?+ t
0 X9 {; x' K( [1 F& C- P* c        memset(tmp, 0, sizeof(tmp));
, m# Y+ L& [6 |/ Q# D2 x        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 ?! {5 X/ R6 X2 E4 ^7 ~6 M6 y
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 Y1 j4 g9 d( g, @* o        server_msg_send(server, APP_CMD_LOG, tmp);
$ P0 G& j! ?7 l3 e7 S" N& u, o
% B& M( J! j6 D; T* y        upp_error_count = 0;/ M( C. y1 W  G$ k, x% J+ @
        upp_dmaq_int_cut = 0;
; i- ^( A3 ?! K. h1 E        // fill in data
2 r' V' _$ Q5 v- Q2 z& Q        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% }0 \% @2 D8 O5 O# \! h        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- f0 F5 {  ]; g/ p# j- q+ h  A# }! Q/ i9 L5 d" }) _+ _$ q
        // wait send success+ P; T( M$ w) [, }; x) q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " k: E& r& O  k" J$ H5 B- U

0 k/ B& h  T0 G0 c/ n        // make data node in free list
! Y9 w4 {$ e$ R2 C3 a) ^  N        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);! a3 [0 O' j6 }
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% r6 ^) D; a& F! g  }* f    }% O! z+ \0 h% l* u( B
    return true;
+ E( o; l% {5 R}+ }8 u4 T( S" m  V3 O: A0 Q: w
! W9 i* Q- X; H- [, A
. T" W! _9 h9 I0 n9 k. q+ \- T  o7 p

; i5 g0 R; h3 V, s

! b8 b! y- M( C; c  k3 r( V+ Z+ m; c

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
' G; f8 `, l5 f
, G* w1 G( p8 e5 t4 `5 Y) v) z$ Z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 22:35 , Processed in 0.041635 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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