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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 {% q; H" C' T/ z. Z  s0 W, n, x8 k9 a7 }
问题描述:8 O" |9 l; F& H4 [$ w: b1 _: h
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% e( h# Z6 z- @# G) ^. A9 o0 L; ?
  ?4 W# k5 {+ M" L. }/ n" v4 B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' A1 L# [# k4 h- w6 K7 X, D# Y  G0 m# T; _9 h+ d3 Q
测试结果如下:
5 W4 m4 @! a* g' t  A% B: y; l+ r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 y/ r7 h7 I- ~" [% t, o. i; p7 a
: @' f0 p6 i9 P) s8 d" ]8 |

$ E) Q& A$ s% u8 G, k0 t1 F) a备注:
1 L4 w' o9 o" ^3 o% {! ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. s( f( R7 S: t- D3 {9 K0 n" U
2、相关代码如下:4 w6 i* m; {6 P6 ]! Q+ i% @
//UPP DMA缓冲大小512字节  n/ R7 `7 A% y: G
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! e( l# B4 b! i' M#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! F1 d' w1 x* j) D2 D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
  Y* _+ R7 {7 E! P8 @
" w+ j; C$ F7 c  Z9 }# s1 L. ]$ f# M6 U8 o
//upp接收、发送buffer
2 u9 |8 F) h" o" W) O' c#pragma DATA_ALIGN(upp_buffer_a, 8)! w1 b+ `+ T9 r1 g5 h
#pragma DATA_ALIGN(upp_buffer_b, 8)
3 X6 d, h7 p3 E# t  R
! E0 R" @, U: |+ S0 tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 o1 e: V% Y; A& ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 r: `" m) B6 H3 u- g1 c* Q" j
. K, f* L3 L5 N1 y4 ~- T& w7 [# h) A5 O1 }- A! |$ }
static bool server_upp_data_recv(Server *server)
( y- o( V+ o, D{- N/ ~& C5 w" u7 d4 V3 {  t0 t
    if(server->upp_channel_a_recv == false) {
8 ^+ v9 G( S% p8 Q7 X& g        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ c2 |, X7 ~0 B) O5 K' @        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# ~7 a9 f: v$ h' B/ w3 w
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
% c" U2 L. [4 Q; H* M, c. c' M7 {7 g1 `% q# G1 ~3 _& d* X
9 ]/ @. G6 s% P* p( j7 G
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# q; E( P" y. A, z- V; C! f! S

( a0 `$ P- g5 e            server->upp_channel_a_recv = true;//
" c/ B/ P9 X5 L            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& D  B) n. u5 R            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;/ _4 b  c6 h$ T0 m& w- S4 }9 ~
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;- U* [' l; Y. Z  o  j3 v% t. M
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//0 \3 U: p* l' q2 L5 P$ k
% ?- X8 N- s/ W2 @+ x
            upp_error_count = 0;/ h- b9 V% C8 c  H6 F" Z: F
            upp_dmai_int_cut = 0;, a. Z* r- T: P- m

2 ]3 u. {% Q' B0 }            // fill in data % M0 {+ E7 k7 K
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 T5 B' X8 x( X$ e4 m' y
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; H0 b6 d4 D0 R/ M        }# D) v$ Q+ p9 w1 J6 X
    }
5 M+ G6 q* `8 \9 W+ A& O    else{  w: v5 D( H4 C. c9 z5 |/ _
        if (upp_dmai_int_cut > 0){
* q( d# z& X( U/ N# b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 {' D; B  m* M, ^: o  Q
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 I& U) u6 E* H$ U- p" x3 Y) P$ g1 H- P0 r* A! z

+ L$ n& S  T- c1 G3 \  h% ^, w            //copy data to upp_recv_list_busy
2 G3 v, x8 b8 n# E6 k2 x5 ~            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  S+ Q8 s# f. }# q* M: y: _/ `
6 p$ f: w/ l, ?1 d2 P. I            //( d; f1 C: I! J2 |1 P
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 q# ?# Z+ v6 a1 ~6 @/ J6 @! e
8 M3 ]4 C! {" I# p; W+ G2 |; U            //: n( H, ]3 X& |3 I- u) T
            server->upp_channel_a_recv = false;//) A/ {2 Y5 o' D( s( V6 j% @

% b5 Q$ N" z: f) J            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ Q3 F3 t1 W( z' h0 M        }& X. o) \2 c! B: I$ i
    }
  `7 G5 R1 o7 v$ W) K# v5 |# x- {0 N5 P7 }! U

' t8 x1 x, f9 |8 v$ j    return true;
7 \# K/ D+ ~& J) M7 P* Z}  ]; J; e# r' `

( [: Q7 w6 n. Cstatic bool server_upp_data_send(Server *server)9 M/ }9 u7 b0 A9 I& ^* t
{/ @$ o8 @3 i1 S( M: W! {
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: E: |) g% z, B/ R( _* |        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) N& R3 i4 y' w2 u1 T/ N6 k2 m+ x        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: D( J" a. s' C8 v( {3 x# T        char tmp[128] ={0};
, s3 T. C7 I7 }- _, R
+ O7 ?) O) g. V        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 s* Q0 O8 j- x0 `        print_log(server, data, 64);
% B0 x/ z, k& J% ^3 D* r: g3 K# s8 b3 k
        //
1 e" a1 `( l1 B+ _        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 Y$ Z) \# T# S4 p. ?4 T        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( L. N; I" e; a( n8 U
        print_log(server, upp_buffer_b, 64);9 ?2 H% [4 K' j! g$ C, w

$ t' m/ Y5 h! F; k3 k: T$ c        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) ]2 ^! Z' T1 ?  I, D8 g0 L
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 0 L: V2 Q& Q  `7 r3 A/ _/ o
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ I7 M* \- |! \3 Z) \% u3 V4 k* \
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! d3 ~0 N: ^' ^7 l2 ?3 \

7 \$ o9 y6 Q" c" K        memset(tmp, 0, sizeof(tmp));+ @; |3 K* E7 n1 n1 p/ U, l+ G
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
2 R' O. w1 k) r6 \9 g            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 j8 v  d/ M5 C! R& J# r
        server_msg_send(server, APP_CMD_LOG, tmp);' b0 i0 W1 t( q7 P2 ^2 ?% \7 Z
3 g! M1 e! P6 h, p; `
        upp_error_count = 0;2 p: m' |& {; q# ~
        upp_dmaq_int_cut = 0;
; p1 _* |3 U" n: O# v        // fill in data , i4 k6 x  y: e1 i' G. m
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ Q$ g* D. `8 c2 T7 M  A( Z
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 q; e5 e. j0 m3 q, Z

  I( w, v5 D, V. K' ]1 I; T7 U        // wait send success% o( I' ]1 |) S2 F& Y! X+ _* e
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, g* v6 K) }" l) G6 Z' r
; V. T% J9 T6 D  e! J7 y' c        // make data node in free list ( d( Z6 I; ^  ?6 ]+ z
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
  W1 k( \9 G: d0 b        server_msg_send(server, APP_CMD_LOG, "upp send: success");/ D) v0 n6 C  A9 H2 s4 Q
    }  J! x3 L* L" [) o' Z
    return true;9 q: l) x6 \2 s( P0 |
}
1 h0 v' l* {( T  m0 a2 |2 Z' V+ }$ ~  Y4 v3 m+ [3 @5 W) U

6 U$ P- h+ O7 t3 D* q
: P- M% g3 |" G" t$ G

* {8 U  O9 |. |# ]6 f0 S, {3 |. Q3 ~* l7 Z8 Z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 T9 v9 |" R# Q/ ^1 @) g7 e! v% b% j0 z' Z0 M2 K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 09:48 , Processed in 0.041078 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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