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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# [" s# L: O! i  @. `5 Y, l6 I9 l5 n* q
问题描述:
. H! @, i. ?2 m5 h; U# Z5 ]$ v: x/ ~在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 @, r; j. c, C! ?/ j4 ^* u! ]
4 i: x* H9 S6 L( {" Z# s3 [) i9 [
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; _; `% y/ y( u. R( T) ^. R$ M# J+ l* [
测试结果如下:+ ], F! ]$ I; J1 a; ^; \1 [# s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: S3 T; _! n5 {  {
- K2 u* |0 @5 @% ?  R; B3 L8 V8 \# {* ], B; r0 I/ w& f3 U
备注:
" T5 d) O( O3 L, Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# z, k: @7 a! S$ a* ~/ N
2、相关代码如下:: A6 y: R6 _& w; M1 ~
//UPP DMA缓冲大小512字节
; Q0 ~. J" u+ V3 |#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
) F- n2 C; ^+ E0 g#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) p* y+ f( _" r0 K1 [7 v
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' `" c: h) ~1 o& z
4 @) L, c" r+ e: \) I  ?
; S9 L1 [0 H5 C$ r. c  r+ Z
//upp接收、发送buffer/ H6 q- D6 y! P5 i2 Q. A
#pragma DATA_ALIGN(upp_buffer_a, 8); u4 }* f% p2 h# ]- H
#pragma DATA_ALIGN(upp_buffer_b, 8)4 }, J9 {; W& r" ?9 }
- P2 i" t/ p7 C* a# R
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: u* c/ y$ @$ [! W% uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
9 |1 R" H' R7 z* n3 [: B$ j( @
; ~1 v) a5 u8 z2 ~
  L; J3 i  V* }2 U2 Xstatic bool server_upp_data_recv(Server *server)
) [+ `! x* ?$ f1 B  a& ~{
+ f1 W3 F( Z; H    if(server->upp_channel_a_recv == false) {
  {! J9 j" e. `! k# b        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. F) [( [7 n/ M5 [        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# `+ n# |: E) E$ D' b' J8 L7 a            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 Z6 W3 k3 I2 V$ }4 \9 {6 a, A# P7 q0 p9 q
9 U1 l0 e; M: L; J1 l+ o8 G
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 P  [0 {, }; V1 Q& ?# v
/ L. q6 O5 Z" D0 U& J9 W9 D            server->upp_channel_a_recv = true;//" ]$ S. p- [( Q/ v' H: L
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 A( D: g2 u- |! g$ k! P
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 K0 U! A% p" ~- z/ n4 S4 B
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" M" T# l& F7 Z$ N! Q$ ?            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! J) O5 x3 x3 B$ U2 ], w) g
+ c0 M" y, \, T+ C
            upp_error_count = 0;
' V3 w4 c1 l" v( _' E            upp_dmai_int_cut = 0;- e1 t9 Z' ~/ I# m& N: F

% c$ o! Y8 i2 Z6 v( n            // fill in data ; O' K/ L- ^5 A8 O5 t" a. Y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);* ?. z: f# D! ?& \( w0 X
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 {' f; ]. _- W: N* ]7 e1 _6 N; B
        }1 |% a) P' b7 K" x
    }
1 O& b9 `, V2 ~0 j    else{" p* [7 [) N8 Q$ _3 [( H" M
        if (upp_dmai_int_cut > 0){
: ~. C0 `* Q/ {  \) q            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" ]' E0 B. Q6 L2 N& r; p
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- N* c5 A# X' s* H* j
( L+ _! V6 W6 A' x) e) ?
6 s. `: M  a+ y6 K+ F: @9 D            //copy data to upp_recv_list_busy3 \3 f/ Z& n& t& p# A+ p' T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. B5 e8 ]6 M! s: e4 |8 X% U

$ B: G: {$ e0 K' W" \2 p  s            //! u: V2 J8 P; m$ A2 g; z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; ^- c: k& \# k/ y
" z/ D" l# q: ~8 k5 }' N- G+ a            //* [, l. ?4 @" r; a& M- E, m
            server->upp_channel_a_recv = false;//7 \: i( V- e) M, S3 L
% \0 h9 x, P8 s
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: o) Q) ^1 h$ f6 W1 d5 N2 i* ^        }
# q/ M) X9 |+ X    }/ W' k3 b7 U8 N, c
! o' w3 A& ?8 a

( A7 ~, @9 E+ E# B" w    return true;
4 {' g* @8 O. Y; m0 n, i}
1 q' x( C7 N& U1 I& W/ [( U* m3 F# A# [  n$ R
static bool server_upp_data_send(Server *server)& W' r( }6 \7 a& M
{
' _' r1 Y: p. A& g1 R- e9 \    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" L3 n, u- ]& a$ C7 {. t; E. k
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! G7 }7 R' D: ^        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 W4 N# A9 }! j: _        char tmp[128] ={0};
! w* G# d) |% ?6 {
+ x: o- L) ~* g9 ]" z+ d+ p0 W        server_msg_send(server, APP_CMD_LOG, "upp send: start");1 Y  _, B. O& K
        print_log(server, data, 64);
/ \1 L- D8 h9 v5 z
4 z9 o/ g$ `3 q" _* d        //
: H# A0 n5 Q1 i* Y5 i: Y* \        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 d$ L) `+ f7 G, W, n$ R
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 n! c* o" t0 i1 y
        print_log(server, upp_buffer_b, 64);4 G' R) {1 R, i- P9 G7 v* |) j

9 i9 K5 A0 x7 I8 _9 u        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ P' i( C' B0 |4 R
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; . k( F4 D9 Z/ F  m( e  x+ p, T0 V% _
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
  m1 I6 c& [1 S" I' x+ P# v& Y        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- D! G9 V+ b6 T* f3 a+ j/ K$ ~( J2 G' x" C# \- _' P- r$ ]
        memset(tmp, 0, sizeof(tmp));
- C3 Y. G/ M; ]- t/ ^% C+ s+ e- D- C        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 U9 q. u8 G0 b7 e# I
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, j: G6 K1 I$ L1 b        server_msg_send(server, APP_CMD_LOG, tmp);
) Q9 e- t# y2 s6 O
! j. l! i1 r% J' p4 _4 o8 R        upp_error_count = 0;/ k0 p) B3 N2 _+ q( ^2 n' A
        upp_dmaq_int_cut = 0;
) F3 J# u7 }9 ]% X! c& H! o8 R        // fill in data
; N/ n1 Z! X% S% d        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% ~! Z: e) Y7 {' R        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 i( i: I" i4 t- r$ M) F$ b) i
# l% f' e- I3 o7 L" r, f
        // wait send success
4 t! v  L. U+ P4 d5 p        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' q  U# D, O6 \, N( h1 T

; G$ M, V2 \6 L. c; I: c        // make data node in free list . G& y' _3 `% V
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: u5 E" N" y; y$ b' q$ N
        server_msg_send(server, APP_CMD_LOG, "upp send: success");6 |' J& @. z2 u
    }
( ]" q' I/ T" |  W    return true;
" B6 X0 L; i  C' [0 S' H. J- L}8 h3 s8 D4 n1 E  x2 |$ X0 p( u" r
: a+ H$ t' v1 M! {6 k$ r

, W& h% A) S& `  _
/ U! h/ \! r$ A! |  o5 S
& ~* W0 q& F2 |8 _

  |4 ?1 C# S7 m* W  K0 j8 U

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, v+ Z' h  f' b9 {! y$ ^2 `0 h! |
: @/ p) }- ~1 f! |! r; n: r( @; @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 03:32 , Processed in 0.052421 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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