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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% A: x; p6 T6 |; {+ C( A& j3 g
9 z7 w+ l+ U/ Y" X! ~问题描述:% c; S6 u9 k( ^% P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ u7 m. A/ y% g3 U# P
# T( F* c$ `$ m3 C+ a# X图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' z) O" i* T- @3 ]+ H- B# ^
/ C  j/ p3 S: v. W0 G5 w3 M测试结果如下:
) e* n6 W8 H( A1 e$ K  ?138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 a6 k' [% t! i& a% r1 B5 F
% A( m* e- I- I% U7 W
3 `7 d5 `" z! P
备注:
# {# W+ k* D9 p8 A) S- y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) p4 z1 t: n  X# y$ ]) Z* K3 f( N) k
2、相关代码如下:2 b' A* ]( K+ p
//UPP DMA缓冲大小512字节6 K  \- _7 a  [* K9 g# d% Y" @
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 @  q. D) A- F; D- c- M  G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! C; t6 r6 L1 r#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 |1 m% v4 x5 D+ c& g

8 e& L6 ]. q% v% J2 f8 j( b! z) ?9 r3 t- \
//upp接收、发送buffer- ^$ s$ E$ d/ B5 T- m7 Q, P- p0 R
#pragma DATA_ALIGN(upp_buffer_a, 8)4 j$ Z4 S* w0 h( J- ]/ P
#pragma DATA_ALIGN(upp_buffer_b, 8)& W! {4 Y; k8 o( K8 g' t
! {, B7 t9 x# g: c0 B4 U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! q* [7 U! `/ D: s- s3 munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& V5 o8 A! E$ s! X, U0 x! W( X" n
# e# @" h' m* Y
. a/ h. A  h8 H# a
static bool server_upp_data_recv(Server *server) 2 d- L2 F6 r# Y8 g+ V
{% d- G% e4 a$ X6 m
    if(server->upp_channel_a_recv == false) {
& ]* [: _: n4 P5 E  M3 q$ m' n        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ G. ]# z0 q8 M# U: w# @" f        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 a8 P5 W9 y! L* y7 |! Z            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");) G, e. |0 ]/ e) R: c7 h" l
8 `7 X# g6 u7 ^1 D5 ~

- I' K4 ]) n. |6 [1 ?9 s            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; f0 Y4 R/ `. J" l9 j  ~- y  p

, S2 U2 ^$ v$ R( f+ r            server->upp_channel_a_recv = true;//
& H/ [+ r& l" P" `- v            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
, {* m& g. H1 s7 {6 m            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
) d3 f: h/ V9 _& ^            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. Y, A' a/ B* X( B
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, t$ ?: v6 f' j* z& r( B
& e- r1 h6 y' o* c! ?/ g            upp_error_count = 0;4 a2 `# b* V( H& l0 K' `
            upp_dmai_int_cut = 0;# \6 \8 f/ d; E* m: O# [8 @
( o) Q( \( P( m) ~4 B) T8 B
            // fill in data 8 [5 P( y* q3 `! N4 q" }
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" A2 l4 S' z  w( j+ u  K* n' Y0 S9 ]            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' M7 i5 e* t; C* w
        }; q. B; D9 G. d, A- K/ m
    }# N& A9 x4 g& q' v9 _2 D
    else{
! E, e( A% D) W" i        if (upp_dmai_int_cut > 0){
; M* e4 @0 X  O6 \; O            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" j+ E9 G% q. C4 S# ]% h* V# T. e, [1 E            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: a% x4 b" Q- z: g
2 I, r6 q4 R$ H4 U! `9 `: }/ j5 k- h$ u& q+ q. b
            //copy data to upp_recv_list_busy
7 k% m+ Y0 W: u3 I8 x4 o            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 H' O7 \( p- `* S' z$ d( A' {# I6 I  g8 `" x1 N3 t# i
            //
1 U8 v2 ?% t) o! G            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 f" t9 C2 A# r% q
: c; P# z  I: i! A. B' f- M( E
            //
$ l4 u3 L. Q2 }9 n$ d; R* \            server->upp_channel_a_recv = false;//8 Q. T! ?( i/ I3 W2 w

8 Q8 j& w  o6 r+ u" F            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 @% e7 y, {) H& N" j$ ~% s  Y        }
" |7 s0 m  ?3 g    }
% k/ _: i: I' b4 H$ }" l" g
* Y. j3 g& B$ s/ h( ?% }! O
( M% Q- R1 W5 A# _$ m    return true;3 `* k) a  f9 v3 c3 s
}
1 L( t& Z4 }- o- Q# S
7 N' f+ h, G& B) I; Vstatic bool server_upp_data_send(Server *server)7 S5 ~% c4 N. P7 R) ?
{! W8 A) C3 {( L9 z5 d: {
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* y' B& I' h1 y& D8 m: K
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ m- w6 j& I& R1 d5 g
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 K$ e3 ^' s1 f8 Z: L% m/ z
        char tmp[128] ={0};
$ N( y. n4 c0 J. ^. l( T2 Y' H! M5 v+ k
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 D3 X$ K3 k9 I8 z* n, x) h        print_log(server, data, 64);
. ^5 e1 x2 i# y* h+ \7 r
- y" B1 X; i% X+ `3 ]/ F% [+ o        //
( y4 h4 I& q' z+ C) T: K1 F1 P        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* x6 ]4 _! i/ K, A9 P
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ {6 j) y9 C8 g7 @' P8 z
        print_log(server, upp_buffer_b, 64);
! e; Y/ D! o; R0 r2 z# L
% @; J0 f) N( U        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ j& I/ N, }+ g9 O- n- G6 {
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) E8 S( }9 H7 P3 e) u; l
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# f9 E3 ]9 j2 d: [
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
! M% C5 M: R4 G( E! t
0 u) D5 A* u- }! k2 ~        memset(tmp, 0, sizeof(tmp));
, [: A" g6 [" T( q: K  [        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 H+ Z9 ?5 Q; @6 B            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& \8 m8 ]1 e1 s/ k$ S        server_msg_send(server, APP_CMD_LOG, tmp);
% C' m3 O) A6 F7 H9 S1 g8 q- \& o$ |# t; q6 G% x, F5 l
        upp_error_count = 0;( _8 f, _# e; M' b& n
        upp_dmaq_int_cut = 0;
* e( d7 S+ k2 j# ], U$ O        // fill in data 7 Z1 {1 ~) M) z( Y( j3 q2 i
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& z! ]2 U+ F( ^- R! _+ ]) M        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
* B! {- d% v( o  C! r7 [, F% A
3 a2 E6 R0 Z% q" ~' q        // wait send success& K& m, Y5 u5 Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
: o6 _2 W" k2 g% Q
- c" F+ V8 u2 N% W8 f        // make data node in free list
; Q9 y# [! }; U; b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 x9 ^0 |$ U1 z& m
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
! H" `# r5 _, x0 U  {    }& f" F  f. U% }- z
    return true;; _9 `7 b  ?' Z( s% h
}& W" Z$ g: K0 Q+ C- x8 S

+ F% H8 |/ r+ F) g

! ^& P4 Y6 u* u" S& N* ~
# B4 `+ M  p& O5 A! @2 ]9 V5 h

& {: I8 ^5 @; ?" G' r3 m+ P* |) ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% ?5 V3 X' V. P

4 s: _5 d1 E0 c5 Q5 M7 i( C, X5 t6 \/ ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 05:20 , Processed in 0.040470 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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