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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - L0 e$ k: H4 P
4 R) H6 F7 J5 t' Z- Z9 E6 D% D
问题描述:: |0 {; G: n! h% ]( b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:: I) a/ M  u& R6 }9 q( {
4 ?) `( x" ^% x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 e6 C8 ?& G% t# C+ l+ A5 [; L

" {% @4 B$ c1 c& H测试结果如下:
9 p2 I7 f- }0 j, g3 P' K/ W/ ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# M5 N9 B- W6 k2 ^$ I7 i. Z0 d( v6 [: H% ~6 X

( s: C8 k" R4 T备注:
0 ^) K1 O& S. c1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 R1 I0 z: u" V
2、相关代码如下:2 f, K8 U& H; b9 u
//UPP DMA缓冲大小512字节
0 A. N% {0 q# x, G% [$ I' E#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 f7 q1 Q( g7 r& y1 ~" Y% ?
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 b: K3 h# a% {6 P1 c#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 [5 d2 e9 s! I! H; k7 j9 U: {6 \
- X9 L, j) C# }5 L. R

; z" ?- U0 O+ E//upp接收、发送buffer+ G9 Q. L& c/ r+ N: S+ N9 q1 f( }
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 D- w5 r4 Z  ~$ E$ {. ^/ o#pragma DATA_ALIGN(upp_buffer_b, 8)
/ ?6 @  r- K' e! @! W+ t* P: s4 K2 C, z7 t
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 R5 P2 ~# ~1 ^8 t! d+ R' `' |# r6 r7 z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
- f4 N2 b5 `- y1 b9 z! B' Q1 }  T( U1 J/ A

- l1 |/ ~8 I" Q/ w, j  {5 Ostatic bool server_upp_data_recv(Server *server)
5 A$ |+ ?. y8 Z{+ W' [3 b' @6 i, J
    if(server->upp_channel_a_recv == false) {
! M, f5 C& v, W' D6 C3 R        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: @0 _: ^/ f- n$ v) ?# u        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% e) v0 }' {6 L/ s6 n; Q% D$ h            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
% v% W4 L3 ^5 K% l1 q; n8 p8 Y9 V9 t0 S* o# K9 R
3 L8 X6 s4 w* D8 g7 y( K
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  ^! a! E6 M( Y/ P  K

; g' M9 F) h2 O' X: A/ [" m            server->upp_channel_a_recv = true;//0 h! a7 {+ N2 Y' Q% i; G# r
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
  ?9 m+ j% f# E9 T5 e8 v            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 F0 b8 W- U' R            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  x; }1 I' g1 j' j) |( G
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 p, @5 c+ R5 k4 s1 A0 d/ ]7 z
, \. ]) ]6 ~5 d/ D& U            upp_error_count = 0;
  k, R& a) k1 W7 `8 c2 z2 K            upp_dmai_int_cut = 0;
! j5 o6 Z1 l, t) X
3 H) q' x& J: A            // fill in data " I: C8 y5 f( d+ R7 ?4 f0 L
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- J+ w7 p& e9 s' C$ g7 J3 L            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
" [/ a* v) O) J; d& G* W. j        }
* Y! n% q4 h: O. W" A! s# h1 J    }
5 L3 Y+ c8 }' }* V# h) S' \' X6 H    else{0 G4 ^* k0 X5 G" G. H
        if (upp_dmai_int_cut > 0){
. f9 f" h0 e: P/ j% V            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 J* b: D( Q4 k
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  u! p; B- s0 [& Z  B9 j4 ?
# ]9 c4 K7 P" g! X1 g+ n) U5 f) k
. K" H7 G0 n( z' N# @) N
            //copy data to upp_recv_list_busy. j8 U% G5 h4 A6 M& Q+ a
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 j+ @1 T2 i7 p% V% t- m; m6 r; S% x4 t' a( W; C0 D) f
            //; b0 M' y0 b  d
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 M4 w9 V# G- H/ V# Q4 B
8 I$ K9 f2 Q. w            //
) F! n) _7 F) q2 Y* M3 C2 T            server->upp_channel_a_recv = false;//3 g9 A) p8 J+ @( _
6 [2 i3 @( W- H0 _3 k& s/ _8 K
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! a' t: a, U" \" y        }
7 n8 L! V* k! ~; ?0 i/ b0 ]    }* l9 {: v* i; ?5 f0 j
; ?8 D$ p6 F- O9 V

; N# y; \$ I8 o' Q3 A    return true;
5 }% _3 b4 c3 Q4 }0 T4 s6 R$ T}, d0 R# {  I& [$ T* L) B

. h$ q# X) T* t4 l/ w  K1 d4 istatic bool server_upp_data_send(Server *server)
( R& \+ K9 B# W! b( [{: }% H2 d: n4 t& s& T+ R2 a. U
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 w4 @0 p" A! g. W8 f& \( J) g  H        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 w. r) F# r$ ~5 B6 m2 ~
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 i  J' s0 {. h5 b        char tmp[128] ={0};
  |2 U/ A& S- a+ j0 g( D+ l/ l$ l3 I# u4 Y
        server_msg_send(server, APP_CMD_LOG, "upp send: start");; B' u# Z, {, c. z5 d0 z
        print_log(server, data, 64);5 O; F% j  H5 f; m
2 o4 ]1 D0 X8 M8 }. ]+ k
        //* \: b3 l7 Z( E
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 _/ l4 h1 b! f2 g; I. ^# R% }
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ }5 Q( i$ ]. x
        print_log(server, upp_buffer_b, 64);
# [2 d7 J6 [6 j% d  H
* H- w, o% ~& I& w1 M% d. z) @        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);, i- b5 v) u4 I% m+ g0 g" o( Z
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! V9 ~6 r% V( C
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ Q9 `2 E3 r: U; n, \# Y" E1 l; F; j& _        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* G% Y# l) V% f  q) u

1 f; {1 D. F% k- l" N        memset(tmp, 0, sizeof(tmp));: ~  W$ m/ r0 L9 j& L  q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 d* p3 x9 `7 g' J  ?            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! b- p4 k% |+ Q
        server_msg_send(server, APP_CMD_LOG, tmp);2 y! z. e% p5 J! y  U5 Z5 `$ i' u
4 @- l" O( I7 d2 @5 V3 k
        upp_error_count = 0;6 |4 z# L/ V, }+ p1 I4 [( `
        upp_dmaq_int_cut = 0;  D  q3 R0 \3 O1 T3 P
        // fill in data
8 c- g: k, A: N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# @- d1 f0 L2 A: D$ v7 w) S' D        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( K  W6 ~% d$ F7 I9 z; g+ ~  S2 V$ \  o) S* M1 B: G8 E8 b
        // wait send success
. S7 c. ~1 H/ @# P/ s. u) t        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& x) a" q2 F7 B; d0 W. `+ @* S2 j
- L9 ^+ R4 t3 ^5 S. _        // make data node in free list
& ?5 r# j- {' ?. \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( C5 `3 n) O# `- A0 p        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& G4 n  v# K' B* }9 i5 T( s4 s    }! H6 B# W' f! _$ ?" K) W; n
    return true;  U5 s+ h5 j* x4 f" J
}( _% M% i6 `% n1 V  G
0 v3 x  p# `, m! f' |) j6 F
. h: T; L7 _+ ?

; j: W0 D1 T: z! r7 ^7 `

$ Z4 T$ G$ K# w1 z
$ }! K8 ^* y3 i7 g7 n. ], {

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* S' i) Q6 E8 l( ]  b8 `2 q

$ u, c" D0 i8 x/ x" p( a

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 17:58 , Processed in 0.040836 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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