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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 f" h' z5 x& U/ `& i6 `- v

  x' [; x) k) a) W% u( f问题描述:. i' V7 H* Q9 j, V" {, N' O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 ]* x  o3 K. O- w8 @% X+ D( h& L; ]% p* U& C/ |* Z( E+ O- \! b
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 p9 t9 M9 I; L8 u: x1 y
, a# H0 d/ D1 s5 I2 ^测试结果如下:- p' C) y" E1 p% x
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- p3 w# z, P1 D2 `3 c& r

% V2 f4 j+ U" Q$ s% v+ N. Q+ g) {& n6 B! f8 J+ g# i* S- @8 X
备注:5 r# b5 b3 g& t5 C) [1 t
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  T1 r9 h* S& G( B
2、相关代码如下:! e: Z' p( ~/ j& m' f
//UPP DMA缓冲大小512字节
8 r6 F( t( K. Q! x; r9 a& p3 Z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, h* h7 B- ~# b1 G- B! ~4 l#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, d* U8 u- _. X#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 N/ j; w2 C3 U9 i, x' k
, H, V7 d! Q- S3 {/ |% w( d: B7 T7 X
//upp接收、发送buffer
; T8 A7 P+ C9 T5 Q( a+ B#pragma DATA_ALIGN(upp_buffer_a, 8)1 m6 f( e5 V% P7 Y4 I: o$ k: J
#pragma DATA_ALIGN(upp_buffer_b, 8)
1 g% G, `7 a& ^% `5 F, S+ X, _6 ~2 k7 Y5 V  Z) @1 O) x
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) E) W5 F8 g0 s
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# |3 Z( |& k, T  s) E$ Y1 J: Z) ~2 R
$ z" y7 F, f4 ~  @! n
static bool server_upp_data_recv(Server *server) 2 }& h2 Q4 e5 e* F
{# C0 g2 |6 r, p# B% k  ^. |
    if(server->upp_channel_a_recv == false) {* f. D) P5 t3 m& T8 L3 I. s! \+ X
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& w( S( l' o2 C8 l9 i7 F. Q        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ S7 r7 [# o" F: {  V( L0 v
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 e2 m. @: q. m- R
  C. S4 `" ?$ i) X6 L, V3 y2 j* O  v
7 D) o6 W. G* ?, ?
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' f* w2 b) u7 b; k

3 y- T5 g$ L" t% R# I, e            server->upp_channel_a_recv = true;//
" c+ J9 ~4 ]+ H2 M4 a: D' _            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 C: @0 M+ n, g$ m, w! m
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
0 |7 s1 m" J' T3 B6 A9 A* b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. f6 I! j) n+ f; y3 j+ H2 ]            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; ~( K1 `1 j) O( |( Z( W
6 i9 s% `, H. ]            upp_error_count = 0;0 T; i9 L& {- A2 H, C/ V
            upp_dmai_int_cut = 0;
3 f- V- P) {' [7 c" Z# v: [: S# U" y7 ^. U4 `% e: w+ v4 v1 [- t
            // fill in data
. M6 ~# h, A- G3 |- f9 @# R6 D            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. y3 J, Q9 x6 Q5 [  G3 |4 {8 P            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ o/ g8 l' ~: m& @        }  {. {  R0 v  S
    }; U( e4 ]+ Z$ i8 v
    else{
6 D" m, Q% c9 _' [4 I4 j        if (upp_dmai_int_cut > 0){# z, u' {$ U$ `$ [1 Y+ i9 J1 m
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. z+ Y" ]5 [' w  k            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- P, o8 Z% g" P0 t
0 A( e8 X2 [& w+ w- M" U/ u
2 J: W( r/ p7 A0 O) Z
            //copy data to upp_recv_list_busy: B3 W; U- f8 s& z( [
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% D$ e* d! J6 S7 O% G2 b7 W& P7 o
% }+ G, A2 s6 ~% J9 s$ P, g! C
            //7 ?1 t3 n, S4 T8 J
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* Q- [) r% Q2 D, K) [) m  [; A7 I4 o; }
            //
7 c) Y0 b3 A1 k( Q  a) c0 p2 |            server->upp_channel_a_recv = false;//
/ z7 O, B2 _. f" X! g" U  o% O7 L! L: G3 g: A
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: j, i' V7 j5 e8 `4 m( R# z/ i        }# A8 L1 |1 r5 @; C7 [5 ~& m8 ~
    }
! G5 Y# E, H3 c' U. `3 u
. _2 u- ~& O% m/ p! K5 n- p4 e, `& ^3 M. z! ~# z
    return true;7 `3 d, Q) s+ X5 ~5 `0 P
}
2 l. U- w( [' Y/ b9 t: W
3 N, B) a2 d% W0 ostatic bool server_upp_data_send(Server *server)  ^% A& A8 `; g, p
{  E1 u) F* a1 A( c! t; y: a( _
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){. E/ w0 V" g$ g6 u$ {
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( ?. `  w5 k& J1 ]
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- H! ^3 t/ x0 B' H8 U
        char tmp[128] ={0};& x9 s2 B% L" y& Y
7 k+ G! E9 }& h4 x1 K8 R
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 O0 t: _1 y  Q9 ^0 e) \  K        print_log(server, data, 64);9 z+ S8 i( C( X% H/ p
2 w' U' z8 L; T7 Q4 `
        //
, I5 w7 S: C1 R8 @1 `        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- s" v3 P! i5 t1 J& K9 L: M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- l' j; g' y' p$ M; [
        print_log(server, upp_buffer_b, 64);0 |3 w& h( J7 w

& z1 w" c$ Y  ^$ V& m. S) p1 l        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);. i9 b+ I# ~+ _3 j
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) \5 V  F! Y; `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 s5 g0 [# E2 r+ z- z
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ p" p1 c5 X2 [3 X
: X( X% r/ g9 ~
        memset(tmp, 0, sizeof(tmp));
2 ~: ]: y8 p+ n8 }  ]        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 p$ t1 W- }2 ]( x! F8 _            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ M4 I7 R$ `( G. x; [2 Z
        server_msg_send(server, APP_CMD_LOG, tmp);
$ E) C" n) g: d. ~2 `0 q! [& \( ]+ ]' h+ B, P+ m
        upp_error_count = 0;
4 B, @7 h% j& B5 s& U7 w; f        upp_dmaq_int_cut = 0;; g" D! ]1 t; O( @9 R7 l. D
        // fill in data & S6 M1 m1 x3 m7 [$ ~
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 G7 O6 m! Q, O, B* N5 H5 u1 f' ?        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# T  n  s) K* e8 _' a. }$ _  K5 n+ a6 {# c& |# A4 A
        // wait send success0 b5 v8 u$ E) E5 B  a1 P
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
% ^% D7 s$ k5 L( L# j5 z
* J/ ~& c! r9 i! }, y8 E# W        // make data node in free list
# ^% ]$ r2 m, \4 X/ e, H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 e& t4 h  M& g; Y. T3 J9 b, Y
        server_msg_send(server, APP_CMD_LOG, "upp send: success");6 k: u0 ~! R$ s
    }
# S  j) x. M1 v1 A1 Y    return true;
4 W# V, r1 ~/ y7 Q- Q}* K5 z0 Y3 U/ a7 J7 D$ B% b

. g  \, g; }7 V2 s1 C
; T( ?- J- }$ Q5 ]! a
# A7 G+ X- r5 i  C- m
2 o; E4 o8 s8 y+ S1 o2 M6 M# L9 p7 |
0 h) e6 n- S4 X1 v; ~

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& y0 B' Z: Z6 F4 R* d" F" @8 C

, q# m# g( h. \  ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 12:41 , Processed in 0.047244 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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