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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : P% ~$ o/ O# C

. R2 @5 D6 |. \" h+ X9 u% I5 X7 Z问题描述:
) {4 k' h* R4 t9 A' ?" ~# ~- T7 _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 D5 c5 A6 Q. M4 D3 J7 _
2 q$ V  g1 x4 [9 S) A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 f* d3 L1 ]# S8 }# t- X# ]7 E* {4 T  c" B. s/ i' w9 K& Q
测试结果如下:, i3 P( `: i4 V: |1 Z% P. p* _
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- Y' B8 U, y7 n8 j9 j
5 c& u4 W9 W& b# m" h* T& D/ r" O
3 f+ b# c* d$ ]# Z8 T( d
备注:3 `& G6 c( o* d" S0 t' ^' w8 U
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ t( P# ]7 ^; t) B
2、相关代码如下:
# v  R' K: S, A! b//UPP DMA缓冲大小512字节
. B$ t5 a7 p; r) X' @/ ^% @#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) m, D" N: Y4 T1 T0 d
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: l) z1 ~# {; o3 o$ M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& }1 ~9 y7 _: W6 r5 |& o

7 [6 A# j0 L7 X% W- l3 r* u5 I, g. k4 l+ }
//upp接收、发送buffer
! _' z% X; c: p' ^. M#pragma DATA_ALIGN(upp_buffer_a, 8)
$ x& N+ ], ^1 ^4 a2 l#pragma DATA_ALIGN(upp_buffer_b, 8)9 ?- }# K, D  d7 g
3 M, s, q5 k) n+ B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- C- }) P( a, g8 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* W+ T7 D% g; W; `" o$ C/ F

1 I, y$ D, a7 ^) \0 M  I; ~6 h; {/ X& K0 [
static bool server_upp_data_recv(Server *server) ' f# @5 R7 Z( g0 y
{) K: l, j% C: f; d
    if(server->upp_channel_a_recv == false) {, ]! s: F& w3 e+ P+ X9 D  k
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 |+ `8 R; A5 \, G0 e& G        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- J# b* ^8 y1 h! _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
, @3 L/ ]7 x7 x' V1 v$ d' S( K# S  I1 g& D) S1 e0 B7 n) V6 _

* ]8 d5 T+ L) G0 z$ z6 Z! a; O, b            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 U# Z3 U2 T. `) ?6 X4 h' L  p  \
& e) ?4 P: g8 U( {            server->upp_channel_a_recv = true;//" O& X* Q3 ]  d5 D4 q8 w
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  ~- v& r$ w# R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 ?# F  A' |$ A6 m            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;, [3 h3 {+ f  U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 D5 k: Y8 Y; X9 U% K3 u5 C
) a, {  Y3 q' f8 {" y2 W6 |            upp_error_count = 0;
9 O" H: r7 Z, ^* _            upp_dmai_int_cut = 0;/ w$ n2 }/ v- {3 J/ B' v6 }

- m* Z( G1 ~( T9 G) {            // fill in data ; n: E8 L7 c. f  }6 u/ U0 _
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, v$ f4 L& ^; V' S; A" k            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 S9 K  d7 f' Z- {8 r  \2 N2 S
        }$ M6 Y) J8 s: Z3 ?  f0 [& D
    }4 g, ]2 ]8 M1 w1 ^
    else{# Z1 W5 _# K; E
        if (upp_dmai_int_cut > 0){
8 T* B/ |" F; n. I            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  E0 r7 t7 L; e# ]$ O            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# ~; e" y# A$ F( K1 P: O
! u1 f+ h1 Z1 ]. P* L* [+ k6 L" ?

" U2 |$ x1 ~$ F6 a8 e, \7 n            //copy data to upp_recv_list_busy
& D! e$ M. z5 J9 N' v; v* S            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. N" x6 |: c! S6 j9 x. C

5 m6 Q" V) b* v% I            //
1 i% Y$ N5 r" M            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ R9 s1 h" K/ q3 f% \8 g
$ r) a& ^! z1 ^- c; h* u9 h! x8 p
            //
3 {* ~  }& H; z9 o! k/ F            server->upp_channel_a_recv = false;//
" X% Q7 L2 Q5 V) X# c4 _2 z* Y9 d
0 z' q9 T" ^/ Z0 u, ?            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 v1 L5 \  E3 w5 t' L2 Q        }5 M5 g% \9 j, h
    }
9 a; o5 |- G( A! L9 |* y. ?5 i
( G/ g/ d& n/ U7 ~) p  j& p
( G# s9 C$ }# W: x- s    return true;7 M! [. j/ t& e  V8 h6 |3 W' I
}1 w1 v6 M; p( A9 f( H

9 y. V2 D. h) O9 P0 f+ Z8 tstatic bool server_upp_data_send(Server *server)
6 Z3 K1 E* M8 _/ V/ m- p{
7 F0 Y( {% i- m4 _' F  P    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' X* ]% d$ ~4 V3 ^4 R0 [5 R6 A
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 O" U3 T- d1 z$ f- I8 ]
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) n. q5 n: o  b: F- z
        char tmp[128] ={0};
, G2 V/ ~! D: J/ f5 W& @" V& f. i, R3 [: ~% J; w+ T- j
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ `: l5 M: i7 j! Y# A) F" ~        print_log(server, data, 64);( e/ b9 G4 H# P# [, d+ p

, i: f/ f$ q: h# S* y        //
- [) z: B- |+ ~0 T# S        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' G2 w# H& v1 i6 n9 M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ [4 l3 b  a2 X  i. G
        print_log(server, upp_buffer_b, 64);. F# H( y1 B$ }! n, h4 `! i# r
5 t  n* N2 L0 D/ w( j( e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 Z0 v& i2 q- @# e) I! \
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
/ F- N, A0 X/ C* Z$ [7 t& ]        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 f) y. h  b4 X
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;6 [2 S, [; K8 S* G$ K' b7 E( z7 [" S
' u! q9 B# w6 j. h3 j
        memset(tmp, 0, sizeof(tmp));# A; U: Y6 o* H6 d/ g: ?4 @) s6 n4 i7 k
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( |$ d/ W7 I% S3 M            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 G6 D( |# r! e' V$ c8 y- w0 c        server_msg_send(server, APP_CMD_LOG, tmp);0 V& a9 G. \( o6 o& l  i2 N9 d
& j3 r* ?# @# x1 N. {7 A; h
        upp_error_count = 0;
: _# p( U, H% B+ a/ u( _  t6 h+ _% J, q        upp_dmaq_int_cut = 0;$ U. F+ ?. b9 l% l! |7 J3 B6 d3 Q
        // fill in data
( b6 I* i" ]: J        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 ~0 i& w8 B8 \' @
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( W" ~- z! g' Z7 w1 }6 {% {9 ~5 m0 h! i/ @. n
        // wait send success- I, }" w- N( n% e
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 J! F* F+ g# H2 I( D

0 l0 d+ x7 d8 O6 E        // make data node in free list . X# L; V$ k9 k0 w, J* P4 f
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 B# x8 i& J' T  W- Y2 c/ w  d        server_msg_send(server, APP_CMD_LOG, "upp send: success");) \8 x* P! L: J
    }
( D5 b- y9 w/ J9 b& t    return true;7 m$ i+ L* F  L5 U
}
- h! ^8 V3 A; s) D5 T1 C3 U
: E5 D" s: {3 ^* ]3 p9 i5 |/ m

: `. C& k( f* ]% z) M( L# R; y' l8 n. i$ b! [+ r; y

- q5 G  Z5 B6 i8 r$ Z* k- R" ~$ f2 i; \( _

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ C# d  ^2 n5 x+ }8 }& W
7 H9 Y( w3 z2 f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 08:22 , Processed in 0.041449 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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