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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % |  h5 e9 z3 k7 o/ g+ l, M) W/ @$ \

; y3 J( @) ]! }4 ^+ x7 c6 H1 j- [问题描述:
! t5 j* {2 x7 ~' |# @4 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:% I3 G$ o6 p3 X$ U

/ G" i/ A0 W4 G8 V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ b9 x4 M9 F& e

$ B1 w8 C; I3 A9 j. Z' R5 j- Z测试结果如下:
+ z& o/ m3 N! O8 h( S  \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 l5 `) X! @( e2 t* {+ b
, j8 M5 `0 h1 ]3 ^/ N6 C0 }
1 [" D: Q3 k5 A2 A' e. @
备注:
% V/ z8 t+ b3 @+ k3 W4 W4 B$ H1 o1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% }. n  D- S7 o1 `1 t# ?- Q) K
2、相关代码如下:. q4 o1 u. ]  d$ K: w& h
//UPP DMA缓冲大小512字节! Y/ n! U: q5 d4 i/ L) P$ x0 e
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; S: N$ y! r' G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ l$ c% O! g( F# K& m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); [  b- {, J% O

: X2 N# m7 V6 ^8 m4 U  k
4 j/ S+ K: k0 C' k# H, \//upp接收、发送buffer7 v. ]- I  T5 n, R9 u; X% C! r  o
#pragma DATA_ALIGN(upp_buffer_a, 8); `) \$ {& @7 B8 \) _# Q- G
#pragma DATA_ALIGN(upp_buffer_b, 8)8 M, b' ]  O# T+ Q& d
- O) Z! \2 X5 l' X" |
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* ]) A5 S, X% T* O3 @* B+ O) ~
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 S2 q, y3 P2 h" A" b, Y/ v+ P& W4 T$ H# q5 `- R* F# s* W9 p3 n  \0 D; O

/ x' ], C( {, s" Y/ r7 Ystatic bool server_upp_data_recv(Server *server) 6 E1 W) Y7 p" Z* W# [
{
4 v. R: Q8 T4 j7 W" }% s    if(server->upp_channel_a_recv == false) {5 e) q( t& M2 O, O
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
  X! E6 t$ l+ s' w- {5 A        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 a  {0 w* t: R4 O8 J            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, J4 `: `! N9 E3 X* K
# W7 X9 i& H4 B9 W

' w, S7 Z6 x& `4 `' W            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
! E% u/ x4 h) @2 p" p* F
3 |4 M  |: o) ~& e2 g            server->upp_channel_a_recv = true;//
& v' m' _' _. E$ H1 L; I" G            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% ^* q+ u2 ]" ?' V$ ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;' s# `4 t0 e6 [4 u$ M
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
5 H* X3 q& ?4 U- @            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ |. J  A- f# N% S; V/ P6 h( g( {

4 y# P# P: d0 k$ g# v- V' ^            upp_error_count = 0;
4 _+ o% V5 L  F8 \" ]6 {5 p            upp_dmai_int_cut = 0;) M' V: ?/ e1 [/ t# t+ l, q, W& [2 r
& @5 X8 i: l, Q* K& {) o
            // fill in data
6 a2 C$ i8 a" s            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" Q' r% e: P. g5 n# y  G9 b3 @- h            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 c* u; a; G9 S/ C. h% y        }; Y3 Z$ @. l% _: o
    }- Q; p3 ]( A3 g
    else{; g8 K; x, n9 k; H4 S" S
        if (upp_dmai_int_cut > 0){
3 x+ a5 ]* s. R/ G            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. s* u5 M* X* A            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& b1 y: S$ w  q& w, ~: @+ S8 Y$ W& y

' g! Y" X& c# o, V9 {            //copy data to upp_recv_list_busy
" f  Z) [$ a! |            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, J5 e( }6 r; \4 i+ n, M$ }6 E/ k/ m$ h% n( I/ g; r
            //3 Y. T% `, T& m5 A" N' m7 _
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ }9 a' [$ m, D- T5 P1 H6 y7 R
) V9 P3 B; Z( X            //0 D/ A3 e9 [1 `/ N, e! r
            server->upp_channel_a_recv = false;//
/ x2 d% }7 P/ w% r0 f9 [
8 T/ E0 j/ J1 s            server_msg_send(server, APP_CMD_LOG, "upp recv: success");# t/ g  f* ?2 ?) z" j+ [/ v, f
        }! A5 Y" ?2 Q& M  @; t% J4 `" Y' t
    }. K- x& }9 j3 C
; l$ x: B& }: m! Y, e" ?

# n' N) l) c0 M1 f- Z" f    return true;
! f1 M" t$ M0 M' }}. [5 `! v- y, v* u2 g

+ N! R; i) H  I* x3 o9 |1 bstatic bool server_upp_data_send(Server *server)
9 w% d6 e9 U9 Z! D% `9 E9 c: M{
/ U! x# E5 ^# a9 i$ Q( j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; R+ M) S2 w) y& C5 t( }# X3 C$ I  O" l        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 }& M0 P/ I1 y" x  B. |
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ p/ p2 ?9 x" G9 b
        char tmp[128] ={0};
- i/ P0 a* J  o1 V4 {
1 @. P3 X8 m% g9 R* a# s5 U        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' C: V2 L# ?/ o& b8 j. W( x        print_log(server, data, 64);9 }  ~3 {/ j1 Y" v5 \

; Q% h8 }% O. p- Y% n* u        //% c6 X2 F+ j! N* m6 u( l. ?
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 Z6 w$ t# _$ f; \5 @7 k- _, d) ~) N        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ C. C2 F. d3 C& Z+ O- G        print_log(server, upp_buffer_b, 64);! E, `. f: C0 L7 w  G7 F# `, m

; W6 ]. L; L) h0 @1 S! @- \        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" d/ ]- S* o+ w, M, W" a: N/ S* x6 [        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
; ~2 l! _" n, o" R        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
/ T; s& m6 F2 F' e2 _        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# B: X# A. R/ `5 X3 x8 x7 k' V: Y8 _2 Q, z6 d+ b( I
        memset(tmp, 0, sizeof(tmp));( t% Q& X9 Y0 y" f9 `" B
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! f$ N" v5 P. n0 z            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" z; d% {0 r% y& |& U2 a        server_msg_send(server, APP_CMD_LOG, tmp);
* R& U% b5 z* I- C& O% Y- M5 v# k" q! J+ q5 S: ~
        upp_error_count = 0;1 q9 q) u3 @( J' }- M" @& n! T) E
        upp_dmaq_int_cut = 0;- C" H* ?6 K" ^8 h/ z3 f& v
        // fill in data
  v. k; F1 o2 T1 g        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - A2 o/ }) @' m  {
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 K  f6 ]6 H, f, C6 ^
3 c; T9 c! ?& ?. n6 |+ T5 }4 P: w
        // wait send success' l1 m! ]' a& P3 I- ?5 M' C+ m
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. Z8 A0 U& M; ~( j* l7 j+ {+ R' r/ d6 W: V1 F: L5 i( \4 n
        // make data node in free list / W* ~2 n7 p3 i5 c) `/ i
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 S1 z4 s' F6 p) _
        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 q4 u- B, o8 R; j' i6 M
    }5 |6 f6 k' f( J
    return true;) \  d1 l! s( ^
}
) l2 z( S& S2 O9 W' e3 _0 i! L+ @) q& ~" @1 l# A7 `
7 V& A( p0 }  Q: v
3 B& ^! _1 q6 O- K: Y
$ B( a3 J0 T, g  X  ], G" K

+ a4 ]4 O( d$ a7 ]9 c

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 x# N3 ^. U. P, ~9 H2 a

' ^5 E& y- e( \- N

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 14:15 , Processed in 0.043822 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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