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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : a6 W0 a- Y& E
' s1 k0 g& _) Y' C
问题描述:: q8 `0 b5 x  t" |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* [' ^% j& E  h5 _/ Z# T6 }2 q4 [5 X& U. k! p$ x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: K: v5 C% F: V# w8 r
' F7 E7 y4 |0 t- P测试结果如下:
) e/ P, Z) \, R* J4 X: f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 @+ w' V1 x2 F) A, s
) L4 S. N' o1 T1 Q/ A
, L2 a5 I4 s+ W0 D/ y备注:
2 e' P- g" X6 T1 o, I1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 z* U; l4 Y2 q% M+ N4 ^9 Q( e" K
2、相关代码如下:$ _$ ^7 `$ G6 a9 J' q8 z' g2 _
//UPP DMA缓冲大小512字节
$ f2 A3 D8 I" n, l#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( ]# U4 @4 Y% J( u$ y. |* y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& ?, u9 d! }+ Q6 q; a#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 t7 }2 E4 M7 S/ ~3 g4 M

# M2 m5 Z% I& I8 T4 i; B& h. q1 {% g9 a
//upp接收、发送buffer
% v: C* J$ d$ ~#pragma DATA_ALIGN(upp_buffer_a, 8)
6 K8 x& R  S8 \+ [#pragma DATA_ALIGN(upp_buffer_b, 8)
) a  c  S- j$ O1 s- b/ d7 _  ^; N1 d: l# K1 h6 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];- T; t4 D6 a  G: J# R  o2 Y& `: ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. H5 k0 F5 s) ?  a% c( @

9 G4 S. C# T6 ~) b$ f; f0 [
) g" V# R( O3 ?, \! X( Y% a4 i. ?3 @static bool server_upp_data_recv(Server *server) ! O& j4 Z5 e2 e& ]' a
{  y) p" N3 `9 ^3 J3 a
    if(server->upp_channel_a_recv == false) {
1 z5 o. A2 \2 O2 s1 ~6 e2 m        server_msg_send(server, APP_CMD_LOG, "upp recv: start");" i4 e% q0 L! x* z
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: K& Q. l: L) p9 O! |
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 k: i7 _% h  U( _) U' {! B& F$ z1 R/ a/ c

6 b, u) ~# Z2 ?" K% J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 ^( p$ f2 L" m& K# T  M( I

9 n+ A+ }7 Y0 j5 i" ]' p1 |$ K0 u: S2 G            server->upp_channel_a_recv = true;//
" H) n$ ]/ l$ g8 h' M            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( R: n# _' q' }9 N0 z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
) {  _1 r0 ~0 T7 V% U* t            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;" _' h1 D4 C3 j5 ?( s. P, w
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( y& ^6 M7 t9 G% f

! Y7 }' s) p1 k) Q8 Z1 B            upp_error_count = 0;& P' F% ?( Y; e
            upp_dmai_int_cut = 0;
3 g9 V% P+ E0 R2 S. n. V) R2 O3 |2 o8 V2 G) y
            // fill in data
2 W. L) l9 [. p$ c  R% z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' ^! N' g- C% b1 Q            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, W9 [# e8 E& z" I' X$ B/ U        }
% |3 _6 T) Q( u. p& w    }
! r$ S$ d* T) l    else{! p, Z+ G- S( o) T1 s
        if (upp_dmai_int_cut > 0){
* S  ~( |$ _5 Y" ~/ t8 k% n            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ L  Q; c" l& A9 r! o            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' O# c6 Z6 u5 M* x3 E9 R
3 D" v& D3 a5 `  Z! \- [8 }. I" o

9 l' A0 ~9 i0 ^9 z( U3 g, x4 R            //copy data to upp_recv_list_busy
! p/ t( P- V9 |+ h) v            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* I1 X, C& `6 l. H8 ~4 x5 {3 i& b' R8 n" H
            //! r" K% V( o* g% K- F3 o4 o
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' V. l+ c  v" r1 K% I, _
4 h# H. Z: Z3 S+ {* \$ h' F7 O
            //. B5 U! ]# b  I- L0 s! i1 `
            server->upp_channel_a_recv = false;//5 a& _0 j6 e' Q# L6 i1 a
6 r+ c2 p4 E9 D; T
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, Q- f% t9 x' Q( p* h  _3 @0 j% @
        }0 L  w7 Z( p2 v( `% y5 ?$ {& J. W
    }! e' s, H& n* n  j; M1 S. u0 b
$ u: m$ ?0 x! D5 `) W2 O/ S% L" g
( }4 Q: [6 _. M$ L' y0 n: Y' l/ j* K6 m( u
    return true;
: m8 s+ F1 E& ?6 @$ X# `1 x4 M. o/ f}
" t8 g9 ?. `+ {
! A- s( ~/ G- v5 w+ n$ X3 A& Tstatic bool server_upp_data_send(Server *server)
7 Q: P7 h+ D4 ?' q5 Q1 T2 W' j{
: j& V0 I% y1 D    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 z  d& Z2 z) Y- _' t1 f        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# {4 E. R5 l, f8 t; b
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% x; r* T  p' E9 x- i3 |6 j6 l        char tmp[128] ={0};
  ]* a$ G( D( k7 }" y) Y4 D8 F
; F' o/ |& u- G        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" ?8 K1 c3 {/ P* G# T4 Z5 j        print_log(server, data, 64);1 T) d/ ?# d% \6 |" U3 q# F% {
- V3 E  c7 H/ j+ A0 ~# [
        //% Q9 x! F: I, x& D* ?- A. i
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 P7 b4 J4 O6 d! z; [! S- ~# R
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 V" H2 L+ u4 _% [# k( S" a        print_log(server, upp_buffer_b, 64);: y  z' b0 ^+ j  j) O

4 Q$ _2 e2 f( U        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# a! t& j4 h- E/ M' N' n        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' |0 n- u4 T2 X
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
; I- x' f; V2 h        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
4 {$ b  \6 e! E' w6 w5 L6 x8 H: a3 q
( ?/ U6 Q. n8 f1 X4 {        memset(tmp, 0, sizeof(tmp));) X  `! i; m2 _2 u
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 `: S- ^+ Z, |* ?9 |4 F9 ^
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ [) r$ s# h" N
        server_msg_send(server, APP_CMD_LOG, tmp);) m( _( v$ G. g' M* b

, H/ L( d& _8 l9 R* p' O        upp_error_count = 0;% E9 ~7 }) Z1 h2 R
        upp_dmaq_int_cut = 0;+ {0 l5 `3 Q3 u+ S; E( A
        // fill in data 9 r; s' {/ K# X
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) ~( }0 e; {6 h7 D        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- C* f( D6 L8 K# F9 q; [/ i% c
2 R: y6 s0 d/ A7 Y: y
        // wait send success
, |# M- D/ ~6 H" P) F/ Q        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 4 X4 \. X% m5 y& }# Y3 V) h
; ~7 m: h8 x& C) n% T
        // make data node in free list
# D6 j6 x' D9 c5 a8 b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 R) i# Q4 K5 s% j        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  N+ Y5 M( s& s& O4 v& y    }+ T3 b" s+ \' c, ~' m
    return true;
, ^# _1 |: E* p  X}7 |! _' K  t. X9 J

9 ^! E: \( q; z. A) q: _

) \5 X( b. s% }  H7 t; F# x: Q: v

$ _. t7 a/ a" h+ b) @. p8 u
4 M$ ]% M& r. g5 p6 ^( d

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
# j8 F9 C) J2 Y/ K1 R# v6 w( _* Q3 c# }

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 21:51 , Processed in 0.038696 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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