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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( p) z/ d  O5 Y$ T

% v: }1 t  ^9 h) M9 Y, g问题描述:
$ P% p- Q$ L4 v7 u在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:4 ?7 Z$ ~3 a7 q9 f

( F( P) ]4 V. t" c8 \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 i: e4 Q: i" h7 i" H

; Y  x7 j. E5 T6 u( P测试结果如下:
' N% V* B# p4 j6 m% p$ L138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% @: F. I8 k4 M; E- S
) @- v( n$ J4 D: Q9 X

0 k1 d8 f  }/ H( k! o# n3 R备注:
# y; Q! w" B3 T# u1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 I" b+ W% t! [  D
2、相关代码如下:
; K2 f& g( R( F9 c* R: e//UPP DMA缓冲大小512字节* D( |& N' ^/ i9 e9 s% K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% I7 z/ N4 \9 J1 W6 J; O#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 ?! r# S) H1 |6 P#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ z0 M2 j- j) Z  z+ S
, E2 b( q  @0 i! X* m' C
2 W  O7 I* G- T% j
//upp接收、发送buffer- e9 z6 `  V5 G
#pragma DATA_ALIGN(upp_buffer_a, 8)
' b4 }1 o) j/ c& s, U#pragma DATA_ALIGN(upp_buffer_b, 8)' b# G: u* A9 W2 F, x7 j3 d& K
1 {% e; E( P5 n2 z6 U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# s5 u, w" W" Y' }( u
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, i  ]* \; W. t/ w, ?' W  h! ~. M

+ ?0 V+ A5 k2 Y: N2 ^( H+ z7 p) h. F' q! b% R: x* I
static bool server_upp_data_recv(Server *server) ' n5 n- B& d1 U
{
- c! U% V$ q; d% m  U$ `    if(server->upp_channel_a_recv == false) {
1 c" [, H+ g; W6 V( Q+ ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- v# F% r, X: L$ q8 h
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' N  Z- y2 G2 y+ K/ P( g9 B
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 b: Q, m9 |6 c0 d  d* B
5 Y6 W4 F7 {6 f: n3 e* J  C7 Q4 e5 c! J  d
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, o8 g' L- y+ l! x5 R: X: h& R
2 w6 t7 f2 Y8 v* x# @0 p7 w
            server->upp_channel_a_recv = true;//
! M" G% Y, p, z9 x            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
8 m% t! R$ [* \            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
* W. [1 r' }& V+ S) Z( C! T3 N            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 Y; J+ m) f; j  l; B            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ K! ~: Y! z" e- N* V7 \
. f" Q, K6 D" K2 d8 Q" D. t. U0 D1 C            upp_error_count = 0;
2 c% B2 P4 a1 k2 ^            upp_dmai_int_cut = 0;
; ]- {# R& \% _# p& O- N- e
  C9 D$ K9 s# J3 P            // fill in data
) ~, k. W+ ?- x/ V            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 F$ R4 S9 Z; Z0 N0 ?1 V* u            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 `. E1 d9 q) e6 b6 ^- S8 {) |6 L+ W
        }9 v/ ?% ^9 A- U8 B  e; ~
    }
* @8 e0 Z: s$ Y, ~/ v% P# \5 U3 ~    else{  Z2 `% t; e, {4 S1 ?
        if (upp_dmai_int_cut > 0){2 [- D- h. b8 ?4 _$ f, t
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 `8 R6 \+ y6 o) k* M7 o2 L8 z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. w8 `- \8 Y+ i7 I

" P/ b3 J& [& O% C/ y; K/ k$ o7 K+ S# q# l3 s; S1 d
            //copy data to upp_recv_list_busy; v0 }# W' T$ \# n
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( _/ |1 v  i3 T, R
: d& k6 U' M" U! F$ q            //1 g; m  L4 B) B" q$ m8 V8 R+ u
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, d; T' n: }0 d/ Y0 @2 J5 j

: H0 m( I. _2 R& Q2 \& \            //
: [2 _" n" v4 l, J- u  d  ~+ |            server->upp_channel_a_recv = false;//
( X8 [3 |% B* Y. q- V/ `
& G4 A6 A' i$ t# c, H# E$ u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; ?9 ~& X) t, c' L; i9 m1 Z/ |
        }5 s& P" g; K- U  l& K3 U/ u; g
    }
) ]/ G$ }9 g( n5 }- L5 \6 j
9 v5 u# a" z+ b( c/ h7 \0 q
/ k1 T5 ^) @1 X1 g% V    return true;0 g* Y: C6 [6 R0 @" r, B
}
: ]% S9 @/ G+ p0 T* m6 R; _3 V1 ?1 H6 ?% Z2 O
static bool server_upp_data_send(Server *server)
4 `% o' E1 ~1 a! O" e' `: _: a2 _{
4 Z* }, V; w3 ?! k% G2 X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 r7 j: k* P. U9 B( d1 r5 a0 Q4 s        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 z, `0 i% S4 h) G" M% `0 w        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);' _( f$ Z: [3 A: o) B! u' ]: q
        char tmp[128] ={0};9 Q$ s6 v% g/ X- S! B8 U
' ^6 y& p: @- X( V8 `' R, D2 Y
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 u; m% n- z# P% e; r        print_log(server, data, 64);
% X9 h4 ]( _. a# f- R4 Z' ]8 z
, F8 N+ s5 [6 Q, P: Z- G        //
- i: e1 v" k( J3 W% u; N        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! B- B$ P+ L. L. ~# d
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% b2 H3 A8 N- H1 V, v) v* H7 I6 E
        print_log(server, upp_buffer_b, 64);
" o! N: [% z' c) V) T1 I* x0 s9 i) H" m% T4 R; u+ k
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 z: k  Q: u; }/ r1 j- D
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 ?" j9 r  v* \& A" l% z
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
9 F9 L2 w1 n( ^- r: i( @; S/ L        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;8 z2 i* q+ v# B# p7 r4 z+ q

8 h7 K! b# `+ g  j3 l        memset(tmp, 0, sizeof(tmp));' l; Q/ K. }& l: S
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ J6 m$ R1 P5 G
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, ]/ F+ n' q. Y  l
        server_msg_send(server, APP_CMD_LOG, tmp);1 g8 Y3 S6 ]0 s" o! }
: z; N$ ]5 l5 ]
        upp_error_count = 0;
9 s/ _3 I' T( F* k        upp_dmaq_int_cut = 0;
: K8 P9 j3 p; b( V! y' l0 ]        // fill in data
, n: O8 T$ N7 Z! R; l5 Q        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 y3 m1 B: m, d- f6 x* U8 w        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 i5 f2 \1 @5 ]6 P
! h, H8 R4 V1 S- u! `0 m$ M/ d& ~
        // wait send success
% y$ S4 ]+ x# T9 I" ?7 o; a: [$ ~* h% w        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! |4 w/ q, ^2 V: l
: e6 F& X; B  R% K
        // make data node in free list
7 f6 Z3 D& V& u; B' Y2 J+ s' ]0 T        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 D* P% F+ G) ~        server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 {0 V/ M1 F; j2 [5 l    }: G7 d/ l4 `/ y6 R5 a& M9 J# n4 F
    return true;/ ?# D; c) p! x6 S5 P/ w
}
  W, A# u8 Q' g# R* F7 m/ h' I0 u" D

$ Z2 P2 g+ z& t
8 m" ~) F! @$ {. D' l( y2 o
: r8 d/ T4 j+ j. {5 f' E
5 C2 o' C; _! J) u0 _+ W

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( |) E& y# |4 k$ Q5 n& t
8 A2 n$ |% R: W' x0 u/ ]8 T; y( H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 05:19 , Processed in 0.046727 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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