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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 z9 g9 L4 i+ W  ^2 p) n! k( M! G) H0 ?; G7 x5 E
问题描述:
4 u& }, |" ]. Q5 M) o2 j* S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" W$ z, D( ~# X* O, [

% s6 \( i) P: `8 |0 A5 W+ a$ E+ v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. G) g$ h6 u! Y; @0 Q- L
0 _9 W/ {) G9 T, z0 i+ I! A2 L
测试结果如下:
, d' O5 l+ o/ E: Z  P8 g* P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' |. A6 J* ]0 L" {6 p" D2 Z4 a6 P6 g: v& v; ?5 R
; Y; v, e2 x! k1 O0 x& z" e; w
备注:
9 f6 [" m+ V. F3 J1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 h; i+ y3 t" |6 |: a/ Y! ~5 W/ j; p
2、相关代码如下:7 e  Y% w5 |; I
//UPP DMA缓冲大小512字节5 ~1 I4 X0 Z4 q/ z- [, p& }) |
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
) |' L! n0 P: Y- v  i  [" m- [#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( V' f4 {" ?; K% j
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); V8 U3 p; H. h4 u, u: q
1 k/ ]' d9 g3 m4 L; |
8 y1 {1 G1 f0 A+ {* }$ I
//upp接收、发送buffer! r: t; a4 F' }, e- m
#pragma DATA_ALIGN(upp_buffer_a, 8)' ?& }7 r: P# E! F, m( v' b
#pragma DATA_ALIGN(upp_buffer_b, 8)
, D/ S( f5 o, b
. g( Z0 z, M+ q" w9 _: Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# V+ m" M8 I+ V( b$ b, S# G9 n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ g0 Q/ u. i/ s6 c2 V! Z
7 k+ ]$ c- k( X0 G5 D2 T# f
0 d- i! k5 j# Z% R6 B
static bool server_upp_data_recv(Server *server)
% D- x) e. Z+ `, k7 ?! V{
6 E! X$ X- O6 q: L% W5 B% \+ a    if(server->upp_channel_a_recv == false) {
4 ~; f7 R+ u7 S0 q! E8 v* l9 L        server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ A% t( r* `) I; C
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 C7 T- e+ g# ]! s9 E0 s0 G
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: f( V5 Y6 e6 |
) X9 _# X, R& l# d" X
5 C* Z$ B, ]9 c7 R8 w/ i+ h- n            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 R: D" u: Z' d) g4 Q6 G. e+ {$ P6 r4 g% T+ f: A
            server->upp_channel_a_recv = true;//
1 r) I. l4 w! }& Z. t" P( j            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 L$ [7 Z2 l& {- @6 B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( m/ W" @) i* `4 j            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
* P- I  h/ J% l/ C  k- W& n            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//0 X8 z0 S" k+ G% ]
5 [/ }/ V3 a7 F* `/ T" G+ T; O
            upp_error_count = 0;
7 f- ~5 i' Z; U  v) w2 d$ c: Z5 B( y            upp_dmai_int_cut = 0;
0 [6 k3 y4 X3 W0 c1 F: D9 y! J1 c
9 T" r* m) X1 {9 ~8 Y% d) ]            // fill in data
# @, ^7 o. v# K6 }            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& C% Q% [# i' n, E% E4 [, _7 M2 N
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
9 @+ c# X9 O9 x1 k$ q        }6 Z' i5 e" ]8 Q6 x$ j! V' y
    }
- P1 O/ h) _! |7 o2 J% j    else{
: @3 q# C2 K$ }' {  I8 p& B8 a        if (upp_dmai_int_cut > 0){3 f7 |; J" y6 `
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# b2 g5 t* T; ?, B8 Y1 ], {            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) B- x  k/ J$ s/ H9 E8 ]+ w7 A8 }9 R1 R
/ ]# }( j9 C. Z) ?( ^$ p1 K
            //copy data to upp_recv_list_busy
/ }, s6 n  w/ k. R1 ^2 @( g* S            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);0 [8 P1 `' v4 x" C$ X: B6 K

1 f3 y" A  g/ }            //
0 F" M9 g7 E5 E( N            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- }0 u7 ]7 o- ], Y7 S( _+ R
# y% K. C: h7 l            //" f- C! r9 u' H' ?
            server->upp_channel_a_recv = false;//9 n. v+ p. {0 }2 K

! ?; C0 ]* \$ }- o3 F            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ Z( P/ V. Q  x/ v/ z+ q4 S        }8 I6 h% F# s: y" r$ l3 O
    }
! j$ L+ Q1 E0 C/ Q! D& J4 z
6 v$ p" X8 ~5 A# b& H0 b$ }. a! a9 }" P
    return true;
  o- |) A+ @* M9 ]" \7 A}/ R% T& z9 _) |" ]  ~" l7 I

! k) R4 v0 [/ {# c. Zstatic bool server_upp_data_send(Server *server)
: g( S; z5 ]" u  Q* h{) z" z  s) _* s3 {
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){( {- u; q8 x; }& r/ t
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ }" `9 @- p0 y& d8 [: u
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 \2 z& [; B; u: r        char tmp[128] ={0};
2 O2 x, P: t0 ~, u( y) y% [* [; I$ A; ]$ M( a4 a
        server_msg_send(server, APP_CMD_LOG, "upp send: start");% h: o0 E% g$ A! z
        print_log(server, data, 64);5 i# m' U; j5 f6 V: r4 u- b6 P- v
% j1 B1 g, J0 h8 K, a
        //
' l* k8 T  e( T( ~# L1 n        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 i: g# W; s5 P8 Z( v! }; G
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 |# _* L7 g9 {' ]$ B: A
        print_log(server, upp_buffer_b, 64);
+ D& m/ N5 N" o3 I# u* [3 G. d+ [1 x  H; t" o& _
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! {8 x" y' b) A8 A7 Q( B6 [        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 5 z4 h# `$ k) b  n' V
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- t6 d; V" j  }) D        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: \$ d# z, u: n& e+ t" o6 I+ f- }
        memset(tmp, 0, sizeof(tmp));
/ G: t$ t! M* V        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' T4 f. S. E7 A5 j$ o
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ G1 t( z3 f5 j, o, B
        server_msg_send(server, APP_CMD_LOG, tmp);
# z; W6 T  H2 q( K* i  m7 x  i1 x
        upp_error_count = 0;- r" V& \; m8 z' l; ^
        upp_dmaq_int_cut = 0;. g: s$ T8 D4 z9 m" Q- ^* X
        // fill in data " Y  M0 }- A- J8 p
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" C/ W4 A8 j( Z, Q8 k7 V        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  r  V! k" ?' L8 X- r
- a- D$ m& U7 F! \" C& |        // wait send success
) P: I0 x, {8 G" y8 ]        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : i/ _3 ~" a5 U3 N/ Q% a

5 W2 P8 F' S( M4 a/ [        // make data node in free list & u/ ^+ j# B8 T2 a' p* x  X
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
  B* [7 i$ G3 [  n        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) p/ O0 f$ ~% S$ C# p( y2 d    }2 i) ~6 _* R$ ?; ?" C: s/ X- K- ?. W- G
    return true;' D7 I2 ?7 D0 m6 h' D3 U! i
}1 Q, ?: D$ o4 f' g/ c/ @

$ X& w# ^$ A" H* \

4 |9 D2 O( L2 c) {1 @1 r1 X9 s0 W0 b; ^# |" @& {

( P; X/ A5 w9 O9 x2 p6 y, a
( Y  j2 m* U  Y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐- S$ G$ v% h9 J/ I) F- S

1 ^8 ]" `- c6 F) ]/ X- W

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 08:32 , Processed in 0.050384 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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