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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 K8 A3 t0 V6 G1 g
, \2 @) ~& i. Z$ H& R+ u1 a- z- B问题描述:
. w9 Z8 N4 O+ b9 \4 K4 g: p. H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 p( @2 f& W( ]* T' T

) F8 v8 Q0 B. E6 \- u" ?( c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* N- o3 u1 e5 u$ k6 o8 o# u9 ^; j, t1 n5 S
测试结果如下:
& {, a. [5 Y" e# C" D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 S" T+ f  S0 q: @. |/ t+ K: e. V  u+ d1 B
9 ^6 t' j% @5 ^5 x
备注:: B$ D* _$ q' e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# K/ I6 _2 D3 ^2 c; E. m% y
2、相关代码如下:6 [: L9 M; a$ |( p. p  b' q' Q
//UPP DMA缓冲大小512字节
  `7 {# v* G1 a. H+ [, Q" k9 ~: X4 v#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
4 u, u  H6 W3 B) J; N& ^4 ]/ F* I3 v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 i/ j$ n+ P# F8 v( |
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 [( [' G8 ~% F5 K

4 z% E& p; _0 n9 J7 v
$ S; D' F6 p" w3 u//upp接收、发送buffer0 ^6 O" F- K7 g7 i" [; l
#pragma DATA_ALIGN(upp_buffer_a, 8)( ?& _/ n2 D9 |: F
#pragma DATA_ALIGN(upp_buffer_b, 8)
% J$ i) A! q+ S$ O7 r/ A( x4 a) q, X6 I3 O- F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" ~  v1 ^. v' P% b; N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* U  z0 N3 I9 U3 F+ U& z  M& V& ]. B+ Y% t
; E2 Q8 C1 _) E4 H' p# l2 ^
static bool server_upp_data_recv(Server *server) . x! B$ E; n9 X5 o
{
- m# @' E) b/ q+ k    if(server->upp_channel_a_recv == false) {+ k4 A" O0 K1 w8 I+ U9 w; g
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: e/ p4 b3 R. z7 }6 e/ x% g( X) i
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 p4 R/ j* q. b1 V9 e# C( s1 d1 c
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- N- O/ @; N/ G

! U9 k+ r! S( w, v
+ Q$ u) _! M, s% A            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- Y2 E0 V1 ~, s' t' W$ M0 B0 Z2 q  o2 b1 j% |, j3 L
            server->upp_channel_a_recv = true;//5 E4 u' s& t4 X4 ]! c
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  H8 a2 k: h! }5 J; @/ h) D1 Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% U: X) C' c+ e0 c            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& v+ y) u4 V' Y! [3 j, r% Q$ E            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 a* R/ r9 p2 g! f
& b6 Q! j- G4 g7 a0 E* a            upp_error_count = 0;
! V- C* t* ~" b1 N% A- C# P3 W            upp_dmai_int_cut = 0;
: O2 A& P' V4 F4 I- I8 W! H7 t3 Z; F% m9 K
            // fill in data " I- p! |  a/ k; B0 w8 N+ \
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 ]5 {( t/ ^! y5 c  Y' Z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: ]8 r: }5 Q3 v) [. ]
        }
- q- r3 n/ n; o  Z! J    }2 h4 n" n5 T$ }8 s) ]
    else{
; j) p& |. J+ ?        if (upp_dmai_int_cut > 0){- R# h8 ]# ^$ ?. ~& o# y
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' f6 s# u5 B9 d8 r4 w            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" ^  `' o! a- M' J$ H' l0 n+ |* h" k* v$ ]
5 o1 p- e; r& l+ F3 b6 J; C
- c" f# {# a& Z' P            //copy data to upp_recv_list_busy9 |5 R5 p) g8 ]2 o9 d
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: P4 q+ K, v+ e# R

9 \3 J; x8 q  D8 A            //
. o: m9 D' a% L7 }5 }$ i            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 H: c7 O5 Z$ T* S

+ ~. z) d! n& }4 l            //
5 j+ N. F7 ^) m/ ?+ Q            server->upp_channel_a_recv = false;//
% B( d! j- S7 M+ c% n( E) O9 n7 l; d8 {, J
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ f# u, M3 }5 ^0 O' s$ [; J
        }
5 B$ u  ~! I% t! Z1 `" y    }
' R$ s6 y& N! t, R- R/ W. I4 }8 q' Q6 u& A
8 _  v: B4 c3 X* b9 R3 B0 Q
    return true;) U- S4 y  \. w, |! A8 B  d- d& c% F
}
. v- i9 {: d3 J
  W6 W( q! f4 ?# D9 l: {static bool server_upp_data_send(Server *server)4 c" m0 p' o; W# t* E( M
{
( u! L8 k  D/ g3 [& s    if(ListMP_empty(server->upp_send_list_busy) == FALSE){& ]0 |0 q$ m6 N; [& K) x$ G
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 Z, ~/ F( B* F& _0 S' J3 ?
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 n9 T% J' z# ~' `! s; V
        char tmp[128] ={0};
" g. L  }( ]. B7 Q8 t- m1 L$ U( Y' u3 n' V' o! h$ B
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
) q. u1 v/ A! {) b& [1 t        print_log(server, data, 64);! e& X3 v6 J4 x) Z

" M  G5 g  \. U        //
& Q8 c  k% b: t4 i8 c        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. f+ u0 |' i# a4 ~
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. n& x  A' N, z  \
        print_log(server, upp_buffer_b, 64);# E- y7 o$ X8 V( ]

3 c% {+ U- K9 u: H7 B        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
2 C8 e7 y5 o( A6 X        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
% e9 Z4 _% d8 z: r$ L% A! P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
& c! c+ Q! \- G" _5 A# P  N4 r        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 B. K& q  y, B# N5 R* P8 ~. q/ E. l

! y+ P$ U8 L$ U        memset(tmp, 0, sizeof(tmp));) s' p; }) J- Q* R5 s
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' ?2 g" U( b! z4 D            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);  {/ {( h/ c" W/ x6 S) n/ H% |+ c
        server_msg_send(server, APP_CMD_LOG, tmp);
- {' o) X4 L/ [# u8 H# t' a: y7 E$ o7 _/ C
        upp_error_count = 0;4 I, ]& p! d! @2 }% D0 `
        upp_dmaq_int_cut = 0;
* i( m. k0 l1 d) U1 n' @        // fill in data , A8 c7 R- l5 c& r) G
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * p, \, Z+ ]$ s; p! u
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ X4 J+ y: x# w& k4 b7 `4 v: j  v* O
/ O2 K9 q3 o5 D1 s$ @" G& I- Q
        // wait send success9 h# y- N- `8 ]# s8 t
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; s9 E- J! J& ~' ~: U% u0 p  H  G4 ]4 Z% N  L* M7 C( q
        // make data node in free list
6 H5 \4 j+ l- U% j1 \! K# S. A        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 c; Y9 Q- H* ?' s  |0 o# U
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 e# `' X) c  Z7 ~6 ?    }: O! ]3 l% b* a& X
    return true;
3 [, n& ^4 \9 B- [  N}& q! G6 V8 b- }* W/ `" [* l3 S

7 C& V0 U1 m; x- G
, y4 X$ O( v; S$ M8 ?; M) ?
" u' y% l, v! M; F7 n* f

# V# [6 j# U9 C- q  W$ A
5 L! L& _) D( m" ^  `$ O

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
( E+ _0 {0 E6 x, {% v0 O+ j8 I2 R& a

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 10:07 , Processed in 0.041868 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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