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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & y, e" @7 M# r9 j  T9 g8 t

$ e. x* o2 a8 Z9 S8 X问题描述:
6 B, d5 Z' U, t/ w8 f$ v0 ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) k; {. W8 L% Z" H& `! {% j- w, N, F9 L( z% X# o" O+ f& z# d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* W& M. v' h- y  t* A0 G8 w5 N) k
2 S% U  m8 A6 b" l测试结果如下:5 ^  I: y1 }' ^
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 Z& s- N8 x' r- h" Q. m8 P
) y5 ]9 L: E$ U, a- v9 B1 j9 _( Z
备注:3 }; y3 ^2 `4 p  r9 }
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 z% F/ e2 v2 k  b3 Z
2、相关代码如下:
% N( S& p6 j/ N5 c* H//UPP DMA缓冲大小512字节
% |5 v& K" ~! m' U#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 `8 c# T1 Z2 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" ~# y) i4 \9 Q5 N2 j! T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, [8 \! b9 d5 g2 u- l
1 \6 d, }/ K! Y
: d# K  B$ `& T//upp接收、发送buffer* ~. s+ h6 r7 h: R8 S" v$ g
#pragma DATA_ALIGN(upp_buffer_a, 8)/ {- [! x5 {, |3 h
#pragma DATA_ALIGN(upp_buffer_b, 8)  `. P8 @$ K8 @9 o

8 L4 l4 G9 s: runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 `' z- }. g+ j7 e; f
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ |& W1 J* J  x2 x- J* i" R+ R$ H$ s9 R' \  a

; x% v, p/ B% I" y4 v$ fstatic bool server_upp_data_recv(Server *server)
# z1 J' n3 \1 k- @  R# `{" ]) m( c1 K1 R4 p
    if(server->upp_channel_a_recv == false) {" [) ?4 \, q+ U# M& N) I6 C7 G
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 k  T, W) _% b9 D- Q( R        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  q+ r2 a9 Z5 M; J6 X5 D
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# B1 h3 v2 O: d3 R+ J& R( ?  d- ]$ k! O4 o6 y# x4 L: p# O
( ~9 h4 t0 k' B7 d8 o
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  ~: D4 c2 U2 n. ~
( g8 H9 D# `  W; _' w0 e
            server->upp_channel_a_recv = true;//( n, R. _, D4 L3 ~5 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; O4 q* q/ @$ i: B# ~
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ K) ~% A9 s( \: ~8 s
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;9 O4 |: I7 s9 i/ @$ U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 V* |. D2 J) N) I& d4 J1 @$ X9 ]. G) z$ N
            upp_error_count = 0;
7 ~: F1 e1 f& Y3 s$ }            upp_dmai_int_cut = 0;
4 {% ~% h; M5 t9 c' V* T
4 r; r8 R( J4 Z% ~            // fill in data
7 j# e: e! V+ b" [6 `            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 n, w0 J9 t1 R: t, [  f4 j) m
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, U: {4 L* O& t4 q, U
        }8 ~0 L2 E. D) |# A3 M9 d9 j
    }9 T" J  o5 n# t0 H& }
    else{0 J3 F4 V) E! h- p# V
        if (upp_dmai_int_cut > 0){! e2 S6 O7 v' e  d. O# `
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 v; d& u% F2 P) S3 u3 X            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ o+ ^( j  B6 |5 @* U( H; @5 ~; Q' s" h
  `, h4 j# d- ?2 _/ s4 C- w
            //copy data to upp_recv_list_busy
( g* ^: O5 E: f, }8 l            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  `0 ^3 W8 |* T/ S: E# }( K
! h, M6 l8 [. ]% r4 @1 [            //
" m/ _% G5 h3 Y! t! T! x1 L            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 w' e0 |9 n& L# ^1 e1 K
! a% t/ w+ T+ h& I2 p) g
            //
4 {' V$ K, m+ c3 i            server->upp_channel_a_recv = false;//
; o  h. f8 N0 m& r. t
; p3 z9 R: \& @+ E            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& l& M5 a9 Z$ t
        }; k9 I% [0 Z9 U* _! N
    }+ Y$ E! I; Z% I  W* P) N

, N: x4 d# X; [0 P" N
9 }$ a8 g3 m! Y2 H    return true;
0 K/ d0 q7 B! i# V3 k& o; H}
% a2 K8 Y/ t* @/ x, ~! L4 q& |; `  x# R
static bool server_upp_data_send(Server *server)
# `& U* F& f6 }6 [{
. \; q" V  h# c    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! b1 b8 P: \+ I+ J" ~7 f7 {) b        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 U7 }7 w+ t+ C5 v        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 k! X- p6 H9 Z: P' m* E7 n        char tmp[128] ={0};, I7 l7 r5 ?6 s3 |

& ~  t# o7 m8 ]1 r, o        server_msg_send(server, APP_CMD_LOG, "upp send: start");
) {8 t4 @% b, z1 A        print_log(server, data, 64);% J' m1 `2 r+ ^- S% R
/ q% j8 t; d: M8 q
        //" N* ^) p4 y% e- t% h0 s( }
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 `  l& g) n9 @' v/ w        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. w* g9 h! q% W
        print_log(server, upp_buffer_b, 64);1 _# s- J4 N/ a# j

( F. ~7 F# ?. N  A        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# U5 ]. k0 Y& _. j* o. Q" Q        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - i% |+ l# W* v3 G& E+ k
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ h2 m  N/ j7 D1 x2 ?
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 n5 Y+ k  J5 x4 Z- D- _
5 R% i& c. l* ?* c4 g2 p        memset(tmp, 0, sizeof(tmp));
7 t8 `; M; G3 E9 h5 I& w* y        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 B( [  H- I2 t% l! ]' d            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% L6 J& F1 ~; @
        server_msg_send(server, APP_CMD_LOG, tmp);
1 g) `, _/ }( R6 }* J6 v  @. h3 Z: w9 v
        upp_error_count = 0;
' U+ }3 ?4 v- c$ O        upp_dmaq_int_cut = 0;
5 G2 r- {- @" J8 A$ H. b: U4 |: |        // fill in data 9 E6 r8 `5 F' s+ n& y- |
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 E8 x3 x# \# M
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. W( \1 S% n7 G  B( N
' ^1 N9 W' g/ j) ]! ]. O
        // wait send success
8 t/ U# W/ g: e4 X9 k! [7 R4 o1 p        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
  b& I8 E+ H" m% X# G* N$ V: }
5 o9 y# G4 r) B+ G: v# s6 N: V5 ^        // make data node in free list
& e7 y5 S! s7 |( `- P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 H# Y* o$ S; {% T
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
- v3 h. d' c  i+ g3 Y" X    }: ?. C0 W0 m$ f7 y$ ^
    return true;1 u4 i% ]8 H3 \
}9 N7 q  `, r! n& B+ f4 O

; f' |$ j9 ]0 J* i
4 v6 Y1 t# C6 A$ K: W# |4 o$ R
) D% a) `- t; m/ C/ f3 J
3 p4 `' B/ `; b+ h9 P7 G

1 l7 I- G) O1 X; @, ^3 R( ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐  _6 p. x: s& O/ }/ m7 B% T0 F

8 ~+ C" S. W! F) t2 c

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 02:03 , Processed in 0.056709 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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