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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & y: C( s* d( ~9 H9 r. C( z  Q! y: N
  [1 p* Q( _' z1 c$ D8 }  W
问题描述:6 W. |0 l* k  Z2 e& Q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) i! ]5 O- o( b! V/ v3 \4 d

  x7 T) z1 ]& U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 ~! J) L$ R) T( _5 H" N3 b  ^7 @$ ?, n8 e$ a+ ^; k9 ~; O
测试结果如下:
  v2 z% X2 |- ^( ]8 W, Y; O8 p" f' o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- e+ |2 I' X. m: T
& D0 E7 M7 R8 n3 I# |
# c" E* D" C  B2 y* G备注:" `5 h3 p6 }) x5 w' `; k' M( v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) B8 ]' T& O+ s6 [/ K$ }( B+ I0 c
2、相关代码如下:
7 ]% ]( W; V1 i$ |//UPP DMA缓冲大小512字节" X! z; A' e- r+ z
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! I( D1 }" }# A$ b! M9 o1 t8 _
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. J( Q0 u" A* r3 [$ i5 G1 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 ]+ R0 \- r" |1 o4 V

& _' `1 _, h# J& m( P$ B! u( P9 [& b. N1 i
//upp接收、发送buffer
" o% ?( T, E, k' @4 o& O#pragma DATA_ALIGN(upp_buffer_a, 8)) t. ?) T$ R3 q) P4 t; x
#pragma DATA_ALIGN(upp_buffer_b, 8)3 u' x1 J8 t- M+ P" G7 e
( M" [  i: H. m+ m) X& Y  E
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! y$ V% U" h2 uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  S; Z: a( _. P( Z' R, t7 A6 v; C- t  |
- ~- F: p/ P) \0 d, O4 c% p  b6 u
static bool server_upp_data_recv(Server *server)
$ P2 R; t  M+ Y- I- [7 @4 Z$ e5 l{
2 l1 x1 V& s# k) U    if(server->upp_channel_a_recv == false) {
0 j0 T$ L8 ^& Y  A/ E% f) Z9 l4 E        server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ k" X% ~8 H" P$ D/ W' I
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 ]+ S0 }+ ^8 t- F/ }: K4 k
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" Y7 }+ A" T+ j% f3 Y  p
9 @% k8 N9 @. {/ g; j) V1 B5 W! Y$ b, {8 u5 F2 U
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& `! ]# R+ g& L% U6 A

& ~7 A0 {$ m, D2 d. v            server->upp_channel_a_recv = true;//
. I0 y6 N( i  J% y8 z* N  d            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 o' @: F3 B4 t: _2 b1 n            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. z3 F8 Z! Q# Z$ U# @8 ]2 `
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; r9 {" V2 S+ l9 J            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% o0 ^( p9 V2 W2 U$ p
) @8 x  y% d* L! z! u2 T, a% V            upp_error_count = 0;! X' R6 f, a# k
            upp_dmai_int_cut = 0;  G3 i  {, D4 C1 c1 k  l6 L

! E. r! K& N4 T  I) n+ f7 ^& `2 ^1 E            // fill in data
7 N8 o1 r1 s/ U! `2 R- ^            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 p9 D* f! e- A2 ?            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ S+ k. H6 |3 `$ c9 o( N5 Q
        }
2 P, T" J2 x# A: S! F: h! Z" n$ `- _0 e    }  \+ q5 e, j) J5 [
    else{
# F+ y' u) S7 J' X' K# R) I4 O9 z        if (upp_dmai_int_cut > 0){
% Y/ y8 E5 d2 u: I+ d: x6 l1 d6 o            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( _6 N- y1 p2 @* q7 \. e
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* [; R  i$ b5 ^( ?3 ^

% d: [  w7 l4 B! o6 t+ y" [" \1 G, ~  C* B# h* d" @
            //copy data to upp_recv_list_busy
9 U! j( @  G0 U% k            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; ?2 m! z# {" @+ ?) B$ o* n* k) n/ ~, ?
            //0 L" q9 J% M. ?$ `' k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ v" m1 P! |5 ?) v5 M. [) Z1 K

& u. _/ |4 M( @2 l! Z: l: o4 R            //
5 ?% t' h$ z; k3 S8 `            server->upp_channel_a_recv = false;//3 r& e3 h/ M7 |6 C; x6 n: B* I

0 a% r4 p; s! Y2 q            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 x, b, j. g! F" n5 r. D        }
7 m9 F3 N5 L9 @3 F0 F0 X    }
4 n2 c# _) Y% N( t9 c9 t6 l
: C/ A+ D  o, a3 L! O- b8 Z; t$ \3 b: B* c$ X' _, Q5 d- R6 _: S; N5 u) Y8 s! A
    return true;
7 }: [# d& B+ u8 Z}  H; B$ k! ]7 l; Y: f% @0 _

$ C! t! I# G' J; ystatic bool server_upp_data_send(Server *server)
" G$ E4 G3 P) W# m) H: [, u{0 A9 `) [9 u4 ?5 E
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" n& x( V2 x5 A: C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 ^* Q8 e& Q3 A& a% P3 ~. Z. Q2 a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
, ]+ c8 P- T, t) S  ~/ W        char tmp[128] ={0};. W0 L8 s! a0 Q3 B, H( m
0 n0 |8 \  Y# v2 v
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
* J5 ~7 t; y8 \, _        print_log(server, data, 64);2 c. ?0 T5 N) R0 w( F
1 {0 l& O9 w# S# v  ~% H
        //
% d) ?6 s1 H2 D4 K* y        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& a, N" Y2 ?7 z7 t) z4 P: ^" h9 }        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 E  X3 s' y. L& Y6 u" i: U/ ?. I
        print_log(server, upp_buffer_b, 64);/ e" u' L5 ^, c% l8 l! i/ ~

: _" I! C$ j9 u4 e* w# T9 w2 R% Y        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 D- t& P% q7 ]6 P5 u! T3 R) f
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 6 J' Q% u4 j3 B4 [& Z
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
5 G6 p3 P; U% n8 |        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 y4 {: V1 s4 J* }; Z

- W+ ]1 H+ u" D        memset(tmp, 0, sizeof(tmp));
/ N! o) Y' {+ T7 |* y( w        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
. l, a5 }, g9 \            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);1 p3 u" ^3 N; e( m4 ?% A$ X
        server_msg_send(server, APP_CMD_LOG, tmp);& a6 B; S* L' }- {0 G2 `
9 T; j/ Y7 {) G0 R' J" c7 c
        upp_error_count = 0;/ l/ [* D2 q6 e% g
        upp_dmaq_int_cut = 0;
& T- T6 z0 g; W0 z+ t7 d0 @/ w0 R! W        // fill in data
6 V- z0 ]2 G6 Z. B        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( d  K2 [3 v; j9 v        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ J1 F5 k+ h) n: A* A- ~6 L

5 \( w7 Z; h/ j; z* k; j        // wait send success8 l7 a9 @9 `) c; n' b
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 a  p) s1 r: v9 U& Y

1 H. V1 ?. X1 O( y( R: R        // make data node in free list 0 z% S: ?& w8 Q9 y# ~( R
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' w% t& Z7 N3 x+ \8 v5 t+ [, G        server_msg_send(server, APP_CMD_LOG, "upp send: success");
. @6 s% m4 J  _3 e0 u    }
4 u, m) y4 d, K6 s/ }    return true;
9 M; J5 b0 g2 s/ y( ^}7 N# Q7 a# |$ d# s
: ~6 b7 k. [' [% c0 @, s

* e6 P. }5 T. ^" Y& F/ v. T% m
9 u% e  ?  o% F! U. j/ E
* W$ K; W( B6 V: N& e# a

- P& m; a+ h$ o' b

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
" W8 b6 E# {. s$ l5 z5 H& L. s, ]& K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 14:50 , Processed in 0.043532 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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