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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( L: e+ Q, f+ h5 u$ b6 @) t- u* x4 }
问题描述:# ]+ M" x2 {4 q: y( j- L- i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- {& K* a6 M5 [0 s

8 d2 L: J& Z6 V$ A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: Y0 h! [9 W# {4 J: W
0 g% @$ f0 w* L9 M. v' \" i' S
测试结果如下:: ^/ E. H% f* z! ~2 h' k" o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- s: w; |; _( Z- w
7 N7 V0 {" V- C% E* ]6 D

# F, t5 {" S: R9 k+ F备注:" ~( O: [- i. p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 |4 r; |, L4 q) a" o
2、相关代码如下:8 k  |* f8 P! J0 S. D% ^1 {, _6 c
//UPP DMA缓冲大小512字节
# w2 B) m, Q# q+ |) H, b5 _) |4 `#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
4 i5 W2 h3 F8 y6 r! v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" Y1 }  Q, ]' Z: s1 }#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 v9 N1 V' V. S
( W/ @5 Z- D0 i' @1 i. U6 l
0 A! ]) `  L( N4 s( a
//upp接收、发送buffer0 _  N+ e7 R: k# j
#pragma DATA_ALIGN(upp_buffer_a, 8)/ \. j# _8 |3 C7 u& S
#pragma DATA_ALIGN(upp_buffer_b, 8)
0 M: B/ n+ G! g8 r, _, e5 \! m
) X6 D/ i4 C" m' V4 Munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# N+ d- f; m# s9 P' V# e9 f
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* x7 ~. ^- {4 I1 n# O& l! R6 y

* o8 X4 M7 @* W. |+ V- Q/ n( o, j3 {2 O9 O& A4 Y6 x
static bool server_upp_data_recv(Server *server) $ c+ T) t4 D' F( v/ ]
{- v  t1 {/ W( T( ~9 K
    if(server->upp_channel_a_recv == false) {  X8 N# U: N# Y' c
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' y$ T- P# L5 K7 o6 B        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% {2 {$ E1 ~6 M            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 i3 S! l/ U6 F/ U$ J, W# z: n2 t6 Y8 @/ w
  V$ x# w" s( O# [: |- d5 S- F+ ?
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
( ~3 f1 ^, j4 Z* d( a) d* C9 c
2 c* R0 P* w' D5 T  I* P8 s            server->upp_channel_a_recv = true;//# _8 s+ I& Z/ u9 R8 A
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
: h# c$ C6 F/ k' C& o  ^5 n            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;' a/ N* J# J2 E  V
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
6 s: B3 t5 |- Y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 D. h: `# p% c" F" h
( D& D9 ]( R8 P( r
            upp_error_count = 0;# U7 Y) ^: j  b; ]* r, j2 u
            upp_dmai_int_cut = 0;! K+ o/ C* i% k6 L+ h& x6 d# O0 D
4 D$ U% R% o! _* U( i$ S4 P
            // fill in data - B. z& o( p( Y: E) S
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 X6 N. ?0 C0 `8 c9 O
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* e( i  b* ]( L8 ?        }
# T# E) r; V0 x/ N1 J    }
8 A, [3 P/ G) y    else{
$ e% e% f& @, C        if (upp_dmai_int_cut > 0){
: L3 [# O8 Y+ Z9 o& ?            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 T6 T! z6 r" e" {" t! p4 ~            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( _9 B/ k0 |$ v* m8 c, {1 l! r. M+ \* M8 e
8 X1 p* e' c$ }% m3 R
            //copy data to upp_recv_list_busy
  x1 e$ y; z. ]0 G            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% b6 d! P! X; [/ L0 f

- u& l  r4 W) I9 |: [  ?            //
- T  D0 M! X2 K5 ~7 g            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 b( u0 J: O, N) B. D
! I, O1 m. G3 }* i% K* V0 Z: \& k            //
9 I8 c: b6 D% S) ~8 Z2 d            server->upp_channel_a_recv = false;//# h+ H4 j3 I2 ]2 g+ w# D

& G. d' f2 E2 a; b/ ^1 q- |, \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 q) l* C: h$ Q0 H& C" _* c
        }6 _7 S8 J5 X2 I! U4 q6 C* U
    }8 M) g6 L) U% }

1 b5 e+ b3 e  o$ W; |3 f: c, n9 v; b% d& [- P: u
    return true;7 D6 v! g6 N7 k" }+ f
}
' u( s9 d! S6 g6 u+ Y9 `' s% I1 o- k4 D* J+ S* e
static bool server_upp_data_send(Server *server)
# B+ m. z# e1 b# X1 j( `8 L{7 H/ Q/ J& s; N  t* r
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 D- a) A7 j% g. k3 i- U. T        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 h- W+ ]3 h7 j3 E- Q  C3 o
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. S+ Y- b) O+ R2 H6 i        char tmp[128] ={0};* z( c' x+ E/ n2 D; l9 b  m
. ~+ p  F' Z  n& h* B% v
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 d. ?! W2 W6 h3 k3 k; L. c0 ]3 s% t        print_log(server, data, 64);) Y: P  w1 G' B- E3 |8 T# F
8 C% ^% J: O# S* _; K- V1 p$ I9 ^
        //# _: e2 `( g: ?# j) e
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 g( v+ B: ]. f1 x        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% p5 J4 f3 L5 M9 ?        print_log(server, upp_buffer_b, 64);
: R" e! ~" _; i% j; H2 K. F, ~% Z  T7 |: E2 m
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! x/ H4 p9 w3 n0 N5 V( X0 G* Q" Y        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; % P. Y" @1 l9 [) P. ]8 |( o
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
" e2 t# l6 ~" L( b/ C# {9 y% ~        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' O; p0 C( [1 U
! }$ I3 U+ F" o& c0 X4 |5 V8 f        memset(tmp, 0, sizeof(tmp));7 @" Z1 s( o( H1 T
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
. h4 X, a  @, V  L            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: V: R: H0 H' a) M8 Y4 e" b/ h7 Q
        server_msg_send(server, APP_CMD_LOG, tmp);5 z- r* u0 X4 M
3 ^( ?) D2 K# ~& y* h
        upp_error_count = 0;) P& b3 g2 o4 B
        upp_dmaq_int_cut = 0;
% T- J% K9 `! B/ k' ]5 H' Y" p        // fill in data
, c% w3 ^( i+ h% X        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ \* Y8 [( c( m3 h) E5 ~
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 Q+ l/ S. L" X/ O

( E7 c' a$ d2 N9 u. |6 Y- P        // wait send success5 z; X* h) f" W8 @3 d/ Z; `- E
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ [- X! F% p6 L7 M7 d: _
! K2 B/ l& f+ k6 G: b: t" m
        // make data node in free list
: p4 f* D3 N' V9 k% ~4 ^0 u        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 k6 Z7 k$ A5 U6 n" o4 u7 V# N
        server_msg_send(server, APP_CMD_LOG, "upp send: success");; e% B7 K4 C" D/ K/ _* ~0 ?, [) y
    }
. ?: i# R7 R  V# M% f! E    return true;1 Y2 e; G' |0 |/ v
}
; L/ [! x) `6 T$ U) F8 M) j
( h* B% z5 s4 N  w0 m
6 d1 d' N% y6 C* q0 u# E$ B% D

; ]! ^2 S1 I# `+ ^1 F

6 h# h* o* b, m# x6 Y3 }
/ H* l; c( T4 I# f1 C5 u$ J

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* v( r, ~& r2 x6 g2 l
: _% e0 o! T& F; t; s' [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 10:08 , Processed in 0.041907 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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