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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) y$ l) |: k; H/ h  p* Z5 Y3 _; t4 z
问题描述:) J7 N: J! H# b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; z, r' h/ a  ^/ f* h
/ p6 S: L6 O% Q1 J) U  ?图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) C$ v" n# l$ ~, f+ C

" I7 a& q, j0 v5 c测试结果如下:# _) P. b& v6 i
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ W0 k$ y8 c8 x; x" }8 _
1 Y7 T/ l6 z5 s& V* l9 x+ n
3 {( Q  E3 ?! w* z. o% p( h- S1 I: `备注:
( [2 p7 X9 T2 C+ Z( z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 j) e, Z: g; R- I
2、相关代码如下:
4 z4 P; N! c5 p% @  y1 [" V' Z//UPP DMA缓冲大小512字节
9 ?7 P6 J2 A: e6 e: M& Q% j#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ w1 x4 `' Y  s7 p2 R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% e6 D8 ]! f( Y" U5 A9 z- t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
  t) Q2 g: h: k; k0 j! h/ B2 E( {) U+ ]9 W. T2 f$ t6 S/ u

% y1 t8 o, U: t//upp接收、发送buffer
( E" I% p1 q% t4 j) B1 _#pragma DATA_ALIGN(upp_buffer_a, 8)
8 W4 t! }; W& [( q#pragma DATA_ALIGN(upp_buffer_b, 8); l; P! @) f: f7 d) r) v

+ _4 ?* [; Z* S" K0 S; ~3 Sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 ^2 C, ]/ X) \2 \4 I  yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& G5 u' v' v( g9 V% Z0 T
' T6 W' l, z/ a$ C- _3 S
, `& W5 U; \; |* c8 ystatic bool server_upp_data_recv(Server *server) / I, y1 |- c1 ^$ J- l
{& \! o+ {: c! h1 z& w
    if(server->upp_channel_a_recv == false) {8 H9 U" j) d# R! s
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: C( P1 ^& w* B' G7 `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. j, f! z! C2 u' X' x% l
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# u( |: D6 d; H; N/ Z# L1 H
7 a5 _4 h5 M% a) k' |
& N# a4 y1 x8 Y& d' n            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ I4 S  p4 K; I4 J: S, H) {
& p4 f  A$ d1 P- e
            server->upp_channel_a_recv = true;//
; ~3 W3 B- J3 n, M            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, v7 s3 ]/ Q4 [$ N& \8 v
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
. W% L; B, `* g* L/ o- {1 ]            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% l8 J* w; v# d: k# o6 O7 V, N
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' _) Q# y& Q/ L

2 w0 R; A  L4 p+ r* A8 U- h. L            upp_error_count = 0;
+ X: @% F) @8 |# `+ R1 Y& y            upp_dmai_int_cut = 0;1 h6 a4 {( w  o
- |; A% l1 @% l4 C0 n
            // fill in data + _: w, F5 W  k* |; |8 H' |7 x
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 r  Z1 X/ \" _6 L% w6 |
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% x- a, n+ _/ P. t        }) @3 z2 G1 U7 M2 h% D2 p
    }* c% N$ k6 P) `# m
    else{4 \: m9 X  S- I( N2 |
        if (upp_dmai_int_cut > 0){* r. b( t+ U, ~7 B' @0 }
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# ?2 u* c  `- G            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" H4 o4 Q# W+ o' T$ \$ ^' B( w; e5 G( l8 ]( C# j

7 m9 |2 @; f% {# k5 ?& D            //copy data to upp_recv_list_busy- H+ o' X5 P" e
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) y7 [  Z4 D1 c6 Z- z

* m7 }7 P8 R* E5 n% e" Y            //% a; Z3 x3 C. e7 o* C) l1 Y, J
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 \  h" c0 c0 ^: e
; ~% E, `  e$ _& K& l# _$ s
            //5 z: k5 Y- L# K0 z, Z' O4 j
            server->upp_channel_a_recv = false;//7 A# H# S. W) }3 _

- I, W% P4 }) I' f            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 ^; S* W. x& @8 v* ~1 i4 Z        }$ [+ D4 ^" b0 a4 M1 f
    }% B4 l! a; U& s+ ]- E% W

3 M  B5 a. F; r& ^$ R  ?
& w0 _- Y6 ], r( N. g    return true;
5 [4 c2 }- T' X: _( v, y' ]) c9 {}
, ?: c# }, @1 e+ f  ~1 Q  C4 u* {" n7 t+ p
static bool server_upp_data_send(Server *server)
  ?- t1 N5 D# \6 V0 w" R4 s- K{
, y, q9 f* x9 W$ O, x  N. p2 Z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 v5 T) j, @8 }# F3 f. @
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 o  @" M# W4 P        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) J) ~; S: N' U# C& |9 a6 ]
        char tmp[128] ={0};' C  S- `5 S  A% u% \

, F( ?2 p$ G) t5 m9 ~9 d        server_msg_send(server, APP_CMD_LOG, "upp send: start");. I; K3 z8 z% A" m; O) v; p
        print_log(server, data, 64);* f3 ~# f# ]: P4 w- ]

$ g" {% b8 t2 y  X  m* M5 v/ x4 q        //
- n" D# |9 k% z' _        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( c: R9 s5 X0 i# y0 C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);7 i# o/ h$ H$ z. c
        print_log(server, upp_buffer_b, 64);
2 T6 u, K& |0 F8 m5 d$ r% q% }9 j
7 K# a. U" C, o8 P' K6 S8 R  r        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);& A6 `6 X7 T: B+ V3 O6 ^( }
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 6 q. t" c' [, u! ~, _- }$ ^. `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! M% t. D$ I' i$ E+ H' r
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# u/ V) C- c% e7 U# _+ j+ s. U. m. ^8 h: Y; p
        memset(tmp, 0, sizeof(tmp));6 R0 z' l6 ]7 ~: w
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + W" I; E) R0 K# R/ i
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 Q* K! A& J+ U! F! Y: q% z9 H8 L* N        server_msg_send(server, APP_CMD_LOG, tmp);1 A3 w4 {4 N! d$ O) C6 D/ ^
* B8 p) Y6 u, r8 Y; h6 j
        upp_error_count = 0;
4 Q8 T# W' J  a5 w7 \        upp_dmaq_int_cut = 0;  J' Q3 [$ I( ~# }
        // fill in data " |% T4 @- ?( ]% F. N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; k  R, F) `, A
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
; _9 a, ^% z6 T0 f  _  j" k
4 G. [" V+ S0 e% z3 V        // wait send success1 W1 f* b) w" ^+ {. @& x
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# n. Q, B% |3 F6 G  v
. Q9 _- G) G% e" r' P/ s$ w0 e        // make data node in free list ) a& W8 V6 R1 V9 c& a# X+ X# Y: h) K
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. K$ K- b: S' k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 b' Z% l: p9 i0 Q  B    }1 u) a2 N8 z. K  X
    return true;# P: T. K$ q, R$ u+ M
}
& L0 B  \7 \5 g5 Z: l0 t
7 X6 X- [; f5 L7 x9 Q8 j
# w6 g* |6 s1 T' _/ m4 l4 C* K
+ W" N8 t7 C  E4 v6 c

$ c7 c# R( q  n" S$ l) ^; P$ ^( T  k
2 X3 \5 @- p( m9 h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
# ?7 W2 k2 R- c4 d7 @6 |; f( O4 N: C) W7 S6 Z& f4 w$ s

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 03:52 , Processed in 0.042764 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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