138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 t% Y8 t) P5 K1 j
( Y- ?2 G. ?* Q% Y: S
问题描述:
/ t/ @8 g2 e" N. H# q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ x+ P+ b) X9 H/ {2 a+ X. h) h! L! |9 e4 l1 Z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: }& W- V( W3 `, e! V. \9 b" }/ b8 v4 g/ K! [9 R
测试结果如下:
" ?1 T2 }1 N' b& J+ m; i9 D0 G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* d: d8 r' k6 B) Q; B9 x
- [3 }0 C9 z( \: u

: F9 s! h! L( K8 U  m# Q% h备注:
# s; N8 y2 \) o! l$ _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" W  d( _% N9 N8 k( Q* f
2、相关代码如下:
" |5 g0 i5 d+ b# A. f& B//UPP DMA缓冲大小512字节* e( @/ U9 V) ~4 ]0 x
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
9 e/ Q& Y! b2 b4 t#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: b+ g, r; T. L& d7 t0 S+ i
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: c  d2 C8 F7 e* a/ u* u( P2 p( p3 h3 C

" [3 b: G5 m$ |* t//upp接收、发送buffer
" W; @( y0 n% [9 R9 F4 h#pragma DATA_ALIGN(upp_buffer_a, 8)
! I$ f7 K$ v: M6 Z1 R#pragma DATA_ALIGN(upp_buffer_b, 8)- a) v: V/ n* w

7 o, E# x4 _/ C  W2 |9 nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 b; k/ s* s+ E7 r; h* V8 Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* F# i$ U) a2 d% [% f5 d7 m4 B) Y4 l* l/ U1 ]% B. U. a, p( z8 U% s
! u$ n1 p7 Z8 n+ b0 N$ Z
static bool server_upp_data_recv(Server *server) 7 w, C9 x8 q! Y7 C( `
{
4 \0 E0 Y* r# ]$ G/ r    if(server->upp_channel_a_recv == false) {' G& K5 R, C( e
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Y5 N- |1 e, a& _6 r2 F
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 v# W& P- w+ C8 f7 G            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");% @2 m# {7 ?$ E3 P$ f6 f

( Z5 G; P/ j/ d4 c' I: Y2 u
, q2 A* J# i8 |- P            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
# L' T& x9 w) ]# o3 N. T. t  y2 ]) x1 \2 G) _1 m; c) K6 \
            server->upp_channel_a_recv = true;//3 r( ]0 q" @. ^
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);' O% M* }% N+ x  R3 s& t# @' ]7 F' P
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;) k# a( x7 x% A4 `& D2 C
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;4 V- Q- a$ T$ d
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# z; m, B( ]- z2 C7 \8 t8 A0 k, F6 k+ \4 |" U
            upp_error_count = 0;3 r9 ]& Q* U  `0 r# G
            upp_dmai_int_cut = 0;
% I$ e2 C1 g5 U9 g+ E  \% N; K" [* \8 ^2 l+ Z- S: H
            // fill in data / I2 L+ n/ ^8 t/ g
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' L7 c) H# e; D# Z1 f
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 [* k/ N+ }8 g* O. d2 H2 r" |        }
% {4 q8 V" S  i( _* [9 h    }
# [/ T8 h3 Q# N    else{2 T7 z# j/ P2 k$ ~/ `% u! ~
        if (upp_dmai_int_cut > 0){
# g" D2 x6 P$ l. i2 z# M+ \            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 U7 J; I+ X/ S
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);& z! S( `, z$ q. s3 Q  b

; _8 z6 E" I7 N0 k
: d5 x) E% F! Z- E& O# H            //copy data to upp_recv_list_busy5 A# x# W1 u  y; {- N
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; K, v# p$ F9 ~
: a6 O7 G# E4 G* v            //
, X! [' w. @: O6 S6 B" P: M            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  g  s. g& H+ f2 e

$ |4 ?- d) j5 ~2 B5 n: z            //" K6 k* A% f6 s, g+ h% O
            server->upp_channel_a_recv = false;//
( L6 e% B5 l/ O3 f% W
) A2 z  O5 N2 h; \* D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ x# i  V) ?+ m/ N        }, Y+ l6 b8 B% C3 W
    }  M5 V+ Y' f7 D; S$ y
% e- T& ?4 W) u% p( w3 Y

7 p9 m+ m4 {8 ~$ t$ t7 R    return true;
# f2 F6 D3 J5 H( M% Y}6 I! `% R' f7 w& Y4 T3 o& s

7 g1 i. k- D1 y) G, kstatic bool server_upp_data_send(Server *server)* E( z' W0 f. a1 C% ?4 m# j
{% i/ ]; q# i  I+ \
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: I6 A, ~2 S5 v
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% C: v$ J, M' a$ j- \4 O        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 o) a" W1 I' l  k' p. i/ \5 v4 w        char tmp[128] ={0};
8 c' D7 d! `2 N" m. {1 t* w/ J+ z% V! x5 S  N. o
        server_msg_send(server, APP_CMD_LOG, "upp send: start");# n! a" d4 K, p1 z- L. j; g
        print_log(server, data, 64);
9 d6 x9 S" \! P, f  \, g3 i" c
* A/ V1 M1 F% ?5 n& }        //
; R" V6 ?: t- z  E  v, o        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ Z" i5 k3 A+ K" a: v        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ e( U( {0 f: z. j  i        print_log(server, upp_buffer_b, 64);3 D& M3 b4 D4 Z  f
/ N: C2 K" ^# I' V1 ?% x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# E1 T2 i# S4 t% P5 `  k" r        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
* z; B3 M- M; p        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
# z/ s/ y  F, n  a        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;  ?, {. y! _' c$ X1 c2 r
  ~7 ^6 r# K: P
        memset(tmp, 0, sizeof(tmp));' t4 D* V- k+ [/ w8 E
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 {  F+ @! r& C1 F* ]: G7 N" k            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) J& Z& D) M  ?) V
        server_msg_send(server, APP_CMD_LOG, tmp);
" D' W! H0 K' j/ O% M
+ t: i- X8 _" x0 L2 s) \; v2 x, O        upp_error_count = 0;: V& b% m0 `% D7 T7 `$ ]
        upp_dmaq_int_cut = 0;
4 d5 d! ?/ R, W0 k        // fill in data 2 s! u, M* H$ a
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 L$ H+ S/ d; S
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 w  H' {& t( Q" l" C
6 F6 Z; g8 v  H& O) a        // wait send success
5 o  l: d' ]* J5 ^3 E        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 @3 g1 Q3 z3 v: J+ N
3 y8 ~! V4 r4 e* m* ]: f* S9 k
        // make data node in free list
, ~  E! q" Y0 T- x        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);0 m% G. G% [* C2 `3 R, d, U
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: q1 K& {* t+ A    }- F$ J0 _! `2 b+ H! _/ t, \" E
    return true;% p- j. ~# L: {; G3 U% B8 d
}
* m' s2 n9 e, ~, U% t9 n( j1 f
2 l5 t1 M# B+ h! K) {+ o

# Y2 B7 N9 R% B8 D( j' M
3 W- H6 [! z+ q5 L) F" u
2 v. Z9 Q; z0 ~, l& W& p+ L( t" D( x

& R3 B2 E4 I' h3 [: a6 m

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐2 G( ~0 P6 W; x+ @  L5 J/ {
% J5 F% ?, N; |" ~, Z% |% X' ~, |. K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 04:48 , Processed in 0.040574 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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