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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 c( R- E) \0 ?* }0 S. z8 F! u
! R/ x, ^' i$ ]1 m6 e问题描述:2 Y- v4 o6 n0 e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- c2 }# D5 |9 v+ s% C& v+ R5 }- D. ?; r! n4 Z  y/ z* O! N  P# b3 g* _& j+ g" d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* @- T8 ^/ W$ u5 W+ L* ^

+ U$ R+ f. W5 a8 s9 ^测试结果如下:: D& K. ?4 J5 e: C; \9 [7 ]9 s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 \/ E6 p+ G( b# t! B8 S$ a1 [$ W2 y; \1 C* R" r! S! y! y
2 s4 q1 q, c- o2 y
备注:1 C7 m4 l7 ^3 q' ]9 ?4 e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 @4 t9 i7 N# u  I2 c
2、相关代码如下:
7 E& {* O, M) u' f//UPP DMA缓冲大小512字节+ W0 c# V" H; n6 ^8 o. y
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" N" W% V7 k' l  d9 _
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ y! d/ M, E4 O& U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)4 B1 k* r' Q( i

5 i+ j1 P' X% R4 l1 A: j
" Q8 ~! [: b1 H/ r& Q//upp接收、发送buffer
& n; ^( k" t: f4 Y7 l. H% ]#pragma DATA_ALIGN(upp_buffer_a, 8)
6 R' f( g6 J8 m% A# A! O#pragma DATA_ALIGN(upp_buffer_b, 8)
" L% T1 J# z( e; @
9 Q" W! {9 i( E  F/ c- kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ `3 K* h# g: Z, P* e1 ?unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  O+ K! s0 q; B+ [: H5 U& @& M2 _

* ~, Z( o) T: Ustatic bool server_upp_data_recv(Server *server) 4 s  ^! y0 q/ s9 i
{
/ g9 w- [! Q0 V; g5 P8 }, u    if(server->upp_channel_a_recv == false) {. B$ d9 q9 D" m8 r- G5 h
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 B2 f' x; k8 e) U
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 o. W6 h6 c: y, `
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
  S& R6 ], p# e+ \2 m
& }. }, n; ^. _& c8 o
3 c* f/ Q  ~2 M5 E% p2 T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 G* a8 q$ F# ~2 ?( S) g/ H/ a$ \

* d+ h9 Q& F- g+ V3 o% g" G            server->upp_channel_a_recv = true;//  _) V6 I/ {2 n) ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 {8 M" U0 k1 {) E( q( O6 P7 w
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ ^, Z0 |3 L8 r8 K
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;! [( A( j  j( L; N  S, o
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 @2 g) N- r  i2 K6 _
, I6 m# H$ o- s- E) M9 x4 q            upp_error_count = 0;  |' m& h3 m4 t# t; a% A$ ~
            upp_dmai_int_cut = 0;
' a: X$ |5 K2 Z- `& ~5 |# r2 o! s7 P1 C# y3 a" Z
            // fill in data
. w$ J8 Y/ I; R0 K( z& U            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ [0 f' K# x* C1 ~9 {% Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ o8 _, G/ s" J# q& F5 T  @
        }
6 {9 T+ r4 V8 }; q1 |; i    }
% Q: h8 v& u* `4 U. z8 k0 K    else{7 l7 \9 y2 R, n0 t$ X* G
        if (upp_dmai_int_cut > 0){
6 `- `/ h: d7 B3 z            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
( c" l3 ~8 b* r5 U0 i5 d: C            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ `4 U+ m2 P5 j  [! ^$ c

, r, J) P  T( D" g8 M$ \
; c3 j# M& U. l/ M            //copy data to upp_recv_list_busy/ l3 W$ o7 A' G* ~* t; u
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: F! `2 n% w; ^: b

; w8 t" M2 N7 D            //
6 C8 D7 s# H2 j# `& ?            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# K% ~$ u- [; \  Z3 P- a
! e6 o( }8 J  P* P, p/ e$ u            //
4 K- m1 s1 {/ t/ |' f) ]            server->upp_channel_a_recv = false;//
& w! P% }; a" t, l3 E8 ]: t  p" H6 }3 y: i2 `& w) c& E/ U2 \+ i
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, H+ ?( U* b) o9 W6 D( n
        }
( S0 P9 X# T' B- g. R    }
; {, b! x) Q4 e: `4 W5 P9 S+ p3 ~6 m8 |. j$ R! m

. B' I$ h+ j: g  f5 D2 S+ [! ~    return true;
: o3 E3 H% \4 s" v0 \: \$ P# G}
0 M! E  y) p- }5 i% ]( k  B- z- x5 I. R7 B! ~
static bool server_upp_data_send(Server *server)
" C8 P: E) X( [6 A* a{
2 v9 |7 J3 S; b5 w* a: C5 f4 H    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 m/ i6 `; o; P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) }) @- U3 r/ ~: N5 P. |- {) E        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" s5 m3 [) V2 O1 t
        char tmp[128] ={0};( W" P) ^7 y) J6 v3 g

) ?/ a% z) E2 V0 U& c( W+ G- l        server_msg_send(server, APP_CMD_LOG, "upp send: start");- N  E  L) P5 n9 i5 @/ {9 j
        print_log(server, data, 64);7 p$ g4 [" \0 F. @

2 G  o5 T" G+ _* E; n6 ?        //
) |% v8 B  i, f        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);4 H/ `  w  g* ]8 U6 o/ P+ e4 L  I
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( i9 Z7 y' C2 ^3 b
        print_log(server, upp_buffer_b, 64);  N- J+ ?& M( b1 ^

: g& T( a" X3 ^" B! C( [4 j        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);5 ?) U* w+ H3 b# S! }
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
, Q0 x& Z; ]2 c5 D        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; r) T! Z; y4 l
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- s0 m) S7 U" v7 _$ q
* o4 M7 i  t5 _0 m
        memset(tmp, 0, sizeof(tmp));
- y1 v/ b+ ]6 _+ h        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , ]6 a. c) @* {& y3 H- G/ F
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& L8 x& o2 }* R" g% c6 c9 f' x        server_msg_send(server, APP_CMD_LOG, tmp);
0 a; a4 X! g1 ~" h1 k. Q5 ?! q2 e+ Z" n( T/ \9 C8 G
        upp_error_count = 0;& e, f& Y# s4 q* L7 \' ^8 ?$ ^2 R
        upp_dmaq_int_cut = 0;/ C: c7 q, w# O' i
        // fill in data
4 C" ^& ?& y3 N4 ]        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) H. M: H7 X* k; v+ s# C$ R
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
  B0 Z! T5 @; t* Z, L. q! ]9 a( ^! _9 x- D& Z+ I1 I
        // wait send success
2 B- c; }0 I; M- D        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 Z& `: e+ u+ X8 J
! Q1 r( f6 p9 w6 U# A6 O
        // make data node in free list $ n" a5 d! m' r3 h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 w/ E0 g2 g/ x) Y1 ~        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ H& `9 r0 p3 G0 `
    }4 ^! l) c* O3 F2 a4 p
    return true;! z' ?, R5 i# N) _
}0 A0 P$ Q; [0 E' f$ U
( E+ ~; p6 O$ r3 [6 _% K+ k
3 V, f& k  i+ ^% G5 ^
8 L7 N2 b) U9 ]3 s! e
5 ^& B+ P1 B8 U4 S# ]
9 [* b4 f% B% D! C

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-6 15:03 , Processed in 0.041220 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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