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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) w/ v1 d1 ~% c. {, x) }' p) O8 Y# {0 A' B; ]
问题描述:
. A7 R4 i/ S: w' w8 T/ r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:1 ~3 R0 @. m6 o. a, V" @1 V% e
7 ]" v* e: m: _' ?( T+ d" @( C+ u* g: o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: I+ o3 u  ^7 N9 x! z3 H( w# C4 ~9 |+ W/ Z6 V
测试结果如下:& B8 m# q( {* U' ?, L, k/ s/ G
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( x. r  M9 b; K1 [
2 S. ]2 Z0 i) h, r* Z/ G' V
" k4 a$ ?9 H3 x4 t6 h( x0 A- _. N
备注:# y* i- Q% v4 J, @
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# H; `3 h2 S  c: k# Z) {1 D
2、相关代码如下:
* j9 U( _. C* p5 C' F; h. T! o7 K//UPP DMA缓冲大小512字节' G7 F# d2 ?9 `: m- @" e
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  [. t" z) C; M' U# }2 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! G7 f" G3 [" p, B1 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% u' }9 ~: S& G3 }3 [8 x0 e) Y- }5 o7 _2 Y

9 D8 K6 L& H* A8 ]" A9 D
$ v/ H4 A3 W9 E6 W" N! K* A//upp接收、发送buffer
! {: a4 t- f* l; m. d7 X#pragma DATA_ALIGN(upp_buffer_a, 8)
) a; V9 ]7 h/ n! B. ]- U, L. B! e#pragma DATA_ALIGN(upp_buffer_b, 8)
6 z) i# d% e, ^6 \2 h6 x
/ J2 J7 \; Q1 q! N/ K4 Gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) W2 Q% \) c( D- Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" N) p& Z* E* Z$ x- U+ ?1 V( D+ c" L5 q' h" a6 g. \" u
# {) T, x) O2 g" W) e
static bool server_upp_data_recv(Server *server) ; B9 o- S3 E" ]& [. |
{" \1 J/ I- }+ N; K; H6 O/ s! p
    if(server->upp_channel_a_recv == false) {6 C4 T) V" q2 U: l! A
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 E  |+ v2 z& {4 E6 D
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" d& O7 X! p& [1 v            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- c% N7 ]# X' [( C
! Z; A- ^! G( S# V) B, c$ S0 P' i; X4 u) J8 [9 U  |
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) ]/ c7 k. r' Z* j" W( R
0 y" `! C# u, K% H1 U
            server->upp_channel_a_recv = true;//
. b$ T& E( i* h* e8 _0 I            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);8 x% ^* p! u2 s0 I4 |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ A* |3 n. y5 D0 M
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ x: x7 E, C8 D+ a            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' M6 g% k- ^3 S4 q' l& S) B

( z# J* M6 C. J# U5 r4 C            upp_error_count = 0;
8 V3 t2 \$ v% f1 E8 M7 |! Y; g            upp_dmai_int_cut = 0;8 n0 B, K- |  r, M$ }6 ^

7 W5 D4 |% q; R. x. J; H! D            // fill in data   R( u( j+ c4 B( e
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 u/ W/ {9 P9 T( g/ h3 _            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 w' C; A- G& d# u0 }' z        }
) o4 [; K; P% b4 @    }
5 T0 e4 D+ Z* p8 y/ d; @- w    else{
7 v/ [. w5 @' o        if (upp_dmai_int_cut > 0){
+ g. ]" y0 L' D6 @' W; O  @, x0 d            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- u, I% |& d; R
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- W1 U- W7 K1 m0 ]8 n
7 K, l0 q7 X9 m& y+ Q9 O- p: Y
! z# [3 G% \6 o$ \4 _
            //copy data to upp_recv_list_busy1 R% X% s: X& z8 G6 h2 r( X
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 y! B" A# |9 k1 c2 V* z" q

: n2 i" {& Z& X: X' \. y* F) Y            //! f' [( b0 i9 c0 ?/ B
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ \; K( j' l# a
2 l) ?# i! J' {, J4 X            //# P  A1 s% u& i# j6 Z
            server->upp_channel_a_recv = false;//
: d% L/ H6 O+ j; }
$ E  [# P4 z! V( E! J8 u$ L            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: t: ?0 L6 j" i5 Y7 S+ O        }
4 G. y* o% L/ s: ~  Y5 N1 }7 l    }) Q: x, }: {- a& Z- c+ c

" z) R# G! I" X
/ W' n/ _3 |. T( I( _- t$ H% F    return true;5 o# C) i/ @+ Y) Y
}, V6 g3 T5 M* R3 g2 \+ w

& c7 o0 |" a" t2 Rstatic bool server_upp_data_send(Server *server)
9 O' }0 h4 d% s# X1 J$ v{1 [: {9 G5 h/ j* c5 q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# g+ }1 e( ]. G! I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: g$ J$ O6 P, {+ `/ G* _8 F( {
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# x: v7 e- I) c0 K
        char tmp[128] ={0};
7 v( L: c" p* k5 l9 z$ A
+ ]4 D  z1 P' K1 H7 G* Y        server_msg_send(server, APP_CMD_LOG, "upp send: start");7 \+ {( [6 e6 W/ V4 j) I. B: Q0 j
        print_log(server, data, 64);+ {1 @5 c% r0 U
/ t# n1 g) ^- c) F& H
        //! }& j  n8 y. v& g7 W7 j: N0 _+ ~. M$ g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 O& n& {7 R% ?) J/ E+ f
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 `( c% H& A4 p/ P  ]) a+ g
        print_log(server, upp_buffer_b, 64);
. {( T! M& r1 ~  N& q" k* K, j+ _6 p4 T7 Q9 ?$ N( g& t
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);& r/ v/ b: G; z* D1 Y8 \6 d9 R/ y
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- R& L5 k- s. r/ [        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
$ m% T+ A- j1 m9 [! B        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ [2 }; W+ B$ x( V; y
+ E9 [  F0 I2 _' {+ o
        memset(tmp, 0, sizeof(tmp));6 }3 v: E8 b6 r4 p, _" S. u
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 \2 m8 I7 \# |1 _            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% r' s1 r* k5 D7 Z( V        server_msg_send(server, APP_CMD_LOG, tmp);' K8 a9 A! g& R$ K, b% U6 r
( p8 t  x4 Y& S+ c4 K/ F; D$ `8 n
        upp_error_count = 0;
! Q* `& u; F1 q# h: q        upp_dmaq_int_cut = 0;* J) R! L# |. |& s5 k- C0 F) S
        // fill in data
9 f$ q  v1 a) I        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' S, @* H: M% |9 c' `/ Y        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
$ e$ H: L6 V$ z1 g
& D  K9 m4 n2 ^- ~9 Z/ ?        // wait send success  `% v2 X) m& P1 Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
+ ^. ?% v, T3 G* l. B
; s$ Q: B+ |! U7 a3 @7 ~        // make data node in free list 1 {* t0 t1 d: S7 _- R* S* {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 k$ d9 m  R9 ?$ g) c# n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; B- \- Z. _1 C( h6 r* G. z    }+ C& p# E. W; A! F; E8 O, a+ ^" [
    return true;
! G! @2 f! t. `$ r9 s9 H}/ S8 ?: e% [5 d; M

5 l  s( l) u5 S/ g+ E
7 `  k" h) z8 a  J
% g& N: g/ y7 K1 s
1 L1 D& ~" ?% e. H0 S( U

; e# G5 y9 C8 C  h( g" S  f6 ?+ z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
' A3 t: J# y! w* `  k1 j
0 |' u* u( w2 b% B. K: u

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 09:36 , Processed in 0.044158 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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