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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' _- F9 Q7 [0 v4 q- G/ j6 w2 {

) j0 z) c1 R, y8 y, O问题描述:
7 s1 N7 ]$ q; u" U2 i, W在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) m; b* g0 k6 h; h( a
. H6 Q. V, w: g6 n- Q- B图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% \  o4 |! M6 E- f
+ c' w  ^7 x* \% ?2 c# l测试结果如下:
' U3 E: n, x. `* {9 _6 Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 c- A9 Z, u$ d5 K7 t

, w, H* ^( P7 ]. \
/ g" e$ W. \9 h1 x2 t. H0 E5 w+ s) Y: a备注:
6 ~6 s" F: D: k2 e/ v$ D2 N% H1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; g; h* ?7 W9 r# _1 C
2、相关代码如下:/ u$ J0 g5 J0 z! z
//UPP DMA缓冲大小512字节
4 z0 F' Z+ e1 o) z1 s#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ h$ F) ]9 y$ n: N7 g+ J+ u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! @1 R+ o0 v0 L4 _( B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 Z8 J9 h( D- b. P& O/ m1 u
7 A6 s- }* b5 l& I# p4 o" l9 A) m! }$ K5 r/ W3 B
//upp接收、发送buffer5 }5 Y5 H) z1 |
#pragma DATA_ALIGN(upp_buffer_a, 8)* Z5 H* p1 @  M4 L5 H1 d
#pragma DATA_ALIGN(upp_buffer_b, 8)6 [+ p& j8 _6 W) M+ \3 T! w
* M* e; P/ P% E7 Y; h
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' W; k- I. o4 Q! s) Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% i) v4 u: d2 F) v' U) ~5 J4 y5 B; I) E. i
$ r4 z$ N1 K7 c/ X
static bool server_upp_data_recv(Server *server) ; {* u' J/ {, b2 q
{5 j# ^$ U, c+ R/ w4 c8 A' o$ B- i5 O/ \
    if(server->upp_channel_a_recv == false) {# [+ g$ E3 X* i, {2 H' d3 j
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( E. n. N+ x, Z/ y! \* Y, c" V        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 @# S( U0 e& N+ W# z2 g            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: t9 n+ j7 s4 Y$ t, z2 J+ q
' w% A! j9 a  C- }8 ^9 L
5 p2 n: `8 Y, F4 n: ~            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);# D' b; ^% B# ~" c

3 H. ~3 B/ [  @            server->upp_channel_a_recv = true;//
9 ?- F1 r6 ~0 X" w; y5 I# Z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);$ l5 R: A' D) l/ H6 f, B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 v/ ?' g  H: D0 i) v8 b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 h' a) ^6 Q" V9 O" U            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( T* b3 O6 |% r. P6 q! H' H

- i8 {( Y" v% a2 o: Z. s8 Y% N* a8 b. I            upp_error_count = 0;
1 m6 q0 s: W& y$ N+ o            upp_dmai_int_cut = 0;
3 X; j) Y0 F7 |; |7 C' Z. c: j) U- u8 X% Q+ i, U. I/ i6 I3 c  y
            // fill in data
, b0 m9 O, v8 ?1 F            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) H5 c: P, s- o/ C: p, j. r
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- |3 H9 Y) K5 u  n( ?# P        }
$ v0 Q1 V5 N: t4 k6 N  K- x! D; e! d    }
* Q$ h% n. X# B7 c+ E* k6 M0 ^2 e8 S    else{) m- k" o# Z! x) Y
        if (upp_dmai_int_cut > 0){) n, \* m2 Z* n  e2 l7 Y9 d$ F: s
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& H& N- F5 C8 W' w% c
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 b# o+ D' L/ s/ O9 b! k4 n
  {5 z+ L* p0 y
6 E; r7 h- h) O9 A8 Y& S            //copy data to upp_recv_list_busy
' w+ e2 ~, T# K            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% Q3 a" K$ u# {6 e5 m' ?0 Q
2 T( E2 F9 R% g: H; D            //' j$ b# _' v& L" A
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 W6 a  q& B0 ^* ?* o" w0 X5 [, a+ p1 _3 j+ N
            //9 i+ F2 D/ Z9 M  x, h+ x: X  \
            server->upp_channel_a_recv = false;//
( }; m8 _/ t5 d& q
  x  V7 W+ R/ I# N2 X            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& m8 E8 @* o/ y( v( g' Z- x7 i
        }& a; n9 X; C+ t! B; Z
    }
, H. I* T6 P. [3 [) _0 v
5 }6 J/ @! ^1 ^$ Z# \1 L2 \$ |" u& q5 k# p6 {" F' m) ]
    return true;
! Q( y& `8 [1 J# ^}
9 \7 T  @. O% U
, W, [5 v. T: A! cstatic bool server_upp_data_send(Server *server)
+ K% C6 i+ o+ A+ j, b. J6 F) {{' L' m" E6 f( Q2 n. H. k
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) n3 N- [- V& ]) x        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, |3 a" P! @9 V- ]5 ~6 E' g8 S, j7 |        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 V+ m# i5 W% d' y4 a1 f+ C  ?        char tmp[128] ={0};
& A! }* f  L7 p8 V! t
) r0 O9 [7 l. N3 w( ^7 D' X        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 D4 f' E% R* B, V* `
        print_log(server, data, 64);
. [8 ]" q: n' [6 C% c
$ z9 X6 w( y2 o, i        //
+ P) y+ T0 b0 G3 T! f* W* ?        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 W- }8 I" \! e- t+ Q  I9 n. X
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 g* _1 @8 B- ]        print_log(server, upp_buffer_b, 64);
" w  m4 T5 G7 @1 X6 {# n( s
$ [% t/ K1 W4 f% G  ?7 \        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( K! [8 _. R/ {3 e/ S4 N
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
* h/ o9 q6 Q8 j# [5 D( Y# m        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, Z/ \1 F/ B' Y* e% t& ?  H
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 w; _- e  ~" N  `/ x
% m( v0 N% S& ]7 W+ T. d% \3 m
        memset(tmp, 0, sizeof(tmp));/ \# t/ z' K0 }! a
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 N) F* `6 E/ p! f            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 d( B- k6 m0 J1 Q$ j0 @7 @* ?
        server_msg_send(server, APP_CMD_LOG, tmp);& V% j4 Y) W/ Q

- y* P+ l* t# h- O        upp_error_count = 0;
0 _% {- u! P% [0 [. X( B        upp_dmaq_int_cut = 0;4 e+ Z, X5 l' i: Q$ p' a) a
        // fill in data
3 u9 m* a/ g3 R5 q        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: G: {3 L  m$ m2 r        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' Q* L  F5 N# B& ~1 F

9 G( q2 G1 z; ?5 {6 p* v6 [        // wait send success
: {1 |; h& t. [! b- {        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( x# Z' |7 j6 D$ k! i3 ]7 W) A6 s* `) G# j. A
        // make data node in free list ( ~& K  o, c* D  U5 k
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" K$ W1 r+ _& N( K4 m6 N        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  x9 x6 X# h6 S2 m% C5 @    }9 B% i8 _) o6 Q; y, K7 }2 |
    return true;  U2 c, I( Z' C+ s+ d
}
: B$ K, w" G3 d$ d7 B- w; E& S) M, A, }' L  C& U1 f

( G! ?) m/ H+ l
. e( ^- v* y6 j% h- k+ Q

! p9 q, E+ b( f6 v& @( w- d$ o1 {# I! u5 E! G3 @

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: F6 ~" W- H9 e9 A* [9 G7 r' ]

( U& n. E: q! l# L( N9 z2 n6 R

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 23:42 , Processed in 0.039502 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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