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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( [+ o" Y) J7 R  ?# T$ z! a

1 Y5 \+ e, C$ J' S! \  x问题描述:- E( \5 Q( x) p+ }8 X* Y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% I4 p, k: O4 K6 R5 N  T  v" X
- c! q7 i3 M; E2 m图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
1 Q- X0 F) @, k% {: N7 ?7 t! s: B# a, `- s; [! `
测试结果如下:, ?/ ?# a9 R4 D7 T
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, t, d" ^- ^! u6 N% M7 v7 V* h; j: i7 ~, i  D

4 ^2 n9 Z! Y8 q1 ^+ |6 U+ u9 N% X备注:. C0 X$ P+ U4 a0 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 P* z- U! P5 y2 h1 K
2、相关代码如下:- d0 R& l& O! X' ^4 J( L0 X$ F
//UPP DMA缓冲大小512字节0 C. N2 C3 c% h- p  }7 @8 C
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ R  O  A+ z9 o, Y8 q5 D) _+ u) f
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
% e! l7 s8 M# G0 o& q' {#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' m0 a& [; U/ c2 r, N2 x% L! U7 k$ [6 {. E* b
0 L0 u+ K7 `, _4 B2 i
//upp接收、发送buffer, d& o, t* D! Z, [  ?
#pragma DATA_ALIGN(upp_buffer_a, 8)( Z% T- x  g- n' X
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 V0 J- t# f0 M4 H, P
2 K: Q4 I! g" H9 \  B$ m! i1 tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 Y6 s- N0 |: N: f9 h3 R* junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* E0 o. x2 m7 _% A5 S1 @
" F4 m& u6 }2 y1 v
5 ^! ~- ^0 V" ostatic bool server_upp_data_recv(Server *server)
1 X; v- b5 q; a+ ^, |. y{+ q9 p/ w9 K" f+ p
    if(server->upp_channel_a_recv == false) {
) r0 S$ C- _+ i" R; @* L        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! [3 |/ a( N, a+ S6 ~% V        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% g8 I- r3 E. c' \4 i. U, m5 p
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* p5 a$ C) ?8 G5 R
' H" R" B/ F$ n

8 N! L  ]# |1 x$ ~- a0 A* {. r            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 Z2 i$ A1 ?( I: m" x

) E; A6 F: {" {. A/ V1 A            server->upp_channel_a_recv = true;//
3 Y! w5 O( c' @' Y3 ]9 F; r            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# b4 _* |7 o0 \3 G% `5 d: Y            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
9 s0 K# X4 t6 ~; F7 @, o4 |$ y8 R            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 q, Q2 B5 t0 T! F
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 p: C) ~2 M7 W8 |
7 r/ O& m$ t& o2 ~8 q9 K            upp_error_count = 0;
5 E7 P4 x8 l  T            upp_dmai_int_cut = 0;
+ R8 `2 [0 E  c, k) [( O% I- g! L. k# T! ^
            // fill in data 2 }8 s9 N% j. j* x& }7 b# |* U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 n; F- C/ v% q, c            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ V7 N$ R7 I, n: o  W, i, Q( V
        }
& b5 Z1 f2 E6 N' p    }$ H: b) a% ?9 H7 L( x  ~  n
    else{
  Y  c6 X3 O3 r7 v/ p; D5 y$ ]        if (upp_dmai_int_cut > 0){; B4 L$ E% G/ o9 R7 e/ T3 r
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 Z5 y  V4 G: |& A! X( {5 W. g( d) Y
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 o7 W* n4 G" f: o% |( V' B
' y6 Y( k: z3 i2 ]! s! ]+ A* U

, O" K5 x- |6 M$ R0 ]" h+ r            //copy data to upp_recv_list_busy, {5 I5 L: D  e
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 ]' |+ b: M, Z! K+ ]* `$ C

; \3 r1 F& M! A$ x0 J            //! X% n) g7 L0 c- {3 U! |
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! g# ?/ M, p- l. R: R8 X
+ d& N  z4 w1 |4 L0 u" a4 P: ^            //; k4 J5 |" o6 A6 {; h
            server->upp_channel_a_recv = false;//7 x  l/ `! u, O" a& d; V# `" n
* A7 U" ~$ A- c5 s
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 Y, n" J. z/ ]% N        }0 a& n* Y# \5 k, }0 c! [* a8 @2 j
    }# O3 D6 e$ g  j) R7 m! A0 s' h
" {$ g; N- ^8 @) O: x

6 Z7 T7 |2 L! S0 I2 N    return true;
% H6 P, ~7 O( u% O. w2 g}$ |) \5 I) |9 d1 ~# s% A! ^" r9 U
/ i: F+ \2 [! g0 O" S
static bool server_upp_data_send(Server *server)0 l: ]$ \1 ?! }4 j
{
7 A! v" p7 U0 W: c+ H! @# O, N1 `    if(ListMP_empty(server->upp_send_list_busy) == FALSE){/ c/ Y% ^  u- L" G
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( C: ~4 W( T% x5 g% B0 a* R8 T        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 \- c" x8 o* }* G% t        char tmp[128] ={0};
- K$ h$ R4 ]- S; A4 \! U+ W% c; P2 V- q  k5 A
        server_msg_send(server, APP_CMD_LOG, "upp send: start");' O  p9 B3 b; L1 a2 L
        print_log(server, data, 64);
) ]( J; u1 i! z+ Y( U3 s
) p- Q; {% _! Z6 g  O$ R% Y0 D        //4 [( a+ e! n4 E% L9 u3 L
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 H9 H$ N* J# ], a
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! s- T/ H1 G6 e
        print_log(server, upp_buffer_b, 64);
9 g' _: e) d0 u6 b% q
. @! s  y. c! ]4 {" G        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: G; x( M6 J1 i: e6 Z( C6 s+ X
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
! d/ s+ ~  x  ]8 S" J        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
8 w2 W1 b7 }, D; J* C        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ Y+ N2 `7 c% ~" f9 a! L7 j
, r9 S0 B7 H$ W% ^3 h0 \
        memset(tmp, 0, sizeof(tmp));
  s2 _: _: [8 F  }        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! g  d$ }6 {7 `7 b+ @( |            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ M1 `  {% s% _
        server_msg_send(server, APP_CMD_LOG, tmp);
5 U0 d# m+ ^& x( o
+ V( `9 P6 A! ~8 t- ?: V        upp_error_count = 0;) m& z; p$ {+ |, d3 s! Y
        upp_dmaq_int_cut = 0;
& h7 x& K5 V, W8 T  e9 j7 ^, o2 M        // fill in data 0 h1 n7 q3 |( [  [5 |" r  r
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) b0 n9 ?' D, Y$ l& }" m        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! [" E; {# q0 c% I
6 {4 h2 \  m, ~7 @* X
        // wait send success" W! i6 I: q/ q( Q/ s
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & C4 W3 i6 t& r/ ]

) g$ L8 [; b8 l- Z        // make data node in free list 5 t2 D8 s* T4 `. I/ S
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: q  ~+ v/ a( A# z5 U: a        server_msg_send(server, APP_CMD_LOG, "upp send: success");) [+ ~: [; X4 ^. G
    }
0 t2 Z1 P; P" F1 E7 L! m2 J    return true;7 ]$ r& j) k. U7 V# E- G' w
}
. D6 M. b* `- J# e8 ]8 \' B/ e
: \6 S6 J: T* X  {! c

, a% y& t+ K6 b# E. Y: i$ \  H8 u: n* S( l
- h8 Q+ x$ H# B1 t" y9 K5 J# ~

; ^3 u& \9 N% n! v

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ R: ^4 k: a. [$ y! F
  K" [# z! V0 F( }/ e

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 16:33 , Processed in 0.041605 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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