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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 V/ \% u' J4 ~7 j3 d  Z) f1 s. p
( e. B* H: O+ q- Q/ {; [9 Z- P问题描述:
9 g: |( [6 }7 l* ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, |6 |. t& N/ T- ^
6 U& t9 y4 N3 r( F6 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 n- H0 I5 `- b5 ~, q7 L1 a+ b
- k1 n! j/ j6 q' G+ _6 a$ ~2 ?测试结果如下:- }: r- Z( ]  t( R7 r
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 k2 d3 Y( g: l( K$ ^% w& D2 N
6 [. `5 M* M" M4 `  P& K/ g
! C6 U) O5 [8 l. g7 D% o备注:
. V" E$ [) [( Q& q, K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: ~& Z: [! }- M1 U9 V0 y
2、相关代码如下:0 b3 T" ~2 ?2 l: D% F# ~' w& E& }
//UPP DMA缓冲大小512字节! w( w) D) a. \. f
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 t+ N& ^4 v# S( ~( S% {4 E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 {  a2 ^' [6 M  I' P- }! j+ R
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
3 p0 A2 x- O& ]8 s/ u: G) d- @8 D1 T

; ^/ E0 ~8 F# J0 L//upp接收、发送buffer
% O5 S9 F' w0 x6 S& Q/ B#pragma DATA_ALIGN(upp_buffer_a, 8)+ E- u7 b% w! o' X4 z
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 [* o$ E2 V3 O* Y) X5 P; {0 B4 j- o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# M4 Z, @, C1 [/ v  dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' @# ^2 B5 ]& b8 U) R( Y! I
& A1 ?9 [) k9 ~7 w) J& n/ H: N  `0 `9 P5 C7 n# d2 F% W1 R. H
static bool server_upp_data_recv(Server *server) ) r2 K' P& z# [( k. v
{
" t1 n' [; ~# y9 T: X    if(server->upp_channel_a_recv == false) {
; V& D# F2 P8 \3 l2 m2 _7 h- d& ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
  l7 j  k- f) S, I* b; r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; }' S7 x- y% h4 c
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* s, H$ A$ S2 s% y4 D5 m" P

; I+ q$ E- j" B6 V8 F$ F" M: _
1 k' d* f, y9 |; w# A            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( v% y' e: f; T( i" ^& {

! G: p% B; K% r/ B            server->upp_channel_a_recv = true;//
, m1 y. z8 `7 u6 o) m& W6 _. Z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( O5 O2 {8 \3 d, O
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;  s$ f/ F6 j+ i; n( s
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
4 |+ P( X2 ^+ o9 o+ o            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% p6 c6 f4 ?6 \8 ]7 M
: s- G) b  b( i* I, ]& T/ T- N$ x            upp_error_count = 0;
# S# ~0 e% D6 a. l9 y- {            upp_dmai_int_cut = 0;6 E9 A2 Y4 Y0 k0 Q
% t8 d) D* E7 O' l$ q
            // fill in data : r- y! r8 q8 f1 z  V
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. d9 ]  v3 ^' X, r" w
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* [. ~4 C5 j: R4 A- L7 A; w& K
        }3 c1 {( ]( l4 d4 N, F  M
    }1 n1 s$ k$ i% }/ S
    else{" ^9 S7 P4 b: `0 `+ |' D  h
        if (upp_dmai_int_cut > 0){  a4 J2 p' f  U% x% p9 E! t0 j
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 |+ X5 A! @( O0 x' f            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' N8 g2 C3 i- q0 ^( U# D( a9 i3 U6 ?0 @  n. q

' ]: c7 c/ K4 ?/ C) s- B            //copy data to upp_recv_list_busy
  _+ O( X2 S5 c1 Y4 R            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, q& t% j; w5 D( \, F2 u! ~
6 l4 e# H: L% C" {9 R% Q5 i
            //
( B! Y% d% @' G) m/ X/ k            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 h% l3 M3 B6 F  s; p2 @* }% c8 Z8 P+ _) a7 z
            //
1 r" N7 R. _& o            server->upp_channel_a_recv = false;//
! s3 K+ y0 }1 P# U+ G, t) K- K$ C3 ?- C* Y% o$ B6 U" y8 W' [% R6 [
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 S$ n1 P: r- C" v4 ]        }
% u$ ^4 f. E( M( d# m6 D    }5 {4 v  r2 n# l" Y+ h' |% o
  K4 E! d8 H3 W3 H. V6 B

3 A+ a+ a& R/ [! L6 |    return true;' m1 q4 M% L% _5 ^# z4 c  z
}) T- V6 E& W3 U+ k
; p+ c* n$ i3 [4 j. R# W( U6 x9 ]$ Y% P
static bool server_upp_data_send(Server *server)  Q: ?0 T, E" [0 ~5 `
{
6 V. ^" L$ i7 e& s    if(ListMP_empty(server->upp_send_list_busy) == FALSE){; C1 R, T7 k# }% A7 j" c8 L
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) n# h7 V" G+ L. ?) O) T        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, P2 K7 X' r1 u4 r! y$ a5 e' @, ~
        char tmp[128] ={0};7 N% `: S5 V/ F" w
5 F" S. Y6 u2 o9 B2 j  F; d5 E" j/ w
        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 l. w+ a3 |' u0 y& Q
        print_log(server, data, 64);
% p+ o& c" n2 S5 ?# @2 U% e  @: \( c  M8 ]
        //
" p. z! _5 t. n1 ?- {( q3 w        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' z/ j% e: ~1 ?6 w+ @        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 q* [  x* u, K/ f% d% w8 q4 K5 w
        print_log(server, upp_buffer_b, 64);
/ T: W1 e( |8 `
0 M, [% J: G- X( ^7 `& q        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);- ~, m% ^/ x8 z. T2 `
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) b) ]& C+ {% a
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
: j- s8 y, N) p, o$ u5 h3 T        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 ~/ Z& r) P6 h9 }; t# n; B" L. R# y
5 S) n: Z, b7 l' S9 G! Q, y        memset(tmp, 0, sizeof(tmp));0 }; u& z! [, X# q) H
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! H$ O  _" G6 w4 X8 E! @( }
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" u8 F/ z* U' W) F" M8 x2 ]
        server_msg_send(server, APP_CMD_LOG, tmp);( K" ^2 E4 N0 C" z% x

( [) a5 z8 \( o  P8 f2 A: M. o        upp_error_count = 0;% _2 x; r6 R# k3 ~- Y
        upp_dmaq_int_cut = 0;
9 b+ Y0 O! e! F. S& ^        // fill in data / g8 S5 u) u. y7 o$ @" q; n: o/ o
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 k3 g9 L+ d0 N8 u) O8 e: ~; L1 `
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. M% S8 n0 F; p5 x; {0 m9 b- X: f
1 J, Y% F% G: c# t& x0 f
        // wait send success
+ y" P8 Z0 y, ~        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( z& W- x7 _+ b; _

7 ]) _/ Q* L9 b% [' W        // make data node in free list
% ]; E5 y! m1 y0 R3 m        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( b% P$ T! a0 h, M        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: z8 }$ O' I8 m- H5 }+ ]    }
3 O# ~4 `0 }  X  y: ~- W; X3 N. K    return true;: H0 ^; R9 K$ F" A
}% x- Q6 a5 Z4 i) d# W
0 [( o3 {$ b: v2 g7 R3 X' f) d1 R

4 P8 C1 c) Q' A. O2 B4 g) }7 K7 [! c' c" J8 e1 L! o

7 @& f2 r9 u/ T( W' Y! P0 _0 F; J6 s$ l) m. `3 i% r( _9 c

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
: `9 U6 j2 J# a" b1 u
$ M; A3 _7 t" }7 U1 l

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 02:55 , Processed in 0.045711 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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