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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 B9 p9 w; ~2 B5 b8 C2 A0 F$ z- S: i: ^5 T
问题描述:( I8 u1 I0 g0 v: F6 `% w
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* f4 P) w! l: q# Q
" U2 x% `6 }: R% v" O. o
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 S6 c! ?/ R/ @7 _5 v, Y: R, V
4 _& N) P* a# `. N- O' M
测试结果如下:/ t$ s# [/ i" I- g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' T0 X# [3 a0 D) N- E, I
4 C: H2 y/ o1 N( N
3 O7 S& b$ y, s) J) M备注:
  E: I- p  h/ l+ S; V5 U1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ H3 T4 W8 ~' k7 @
2、相关代码如下:
) C6 z9 [2 m9 y* c, i; W7 ]//UPP DMA缓冲大小512字节
$ ?$ `; u0 ~' z2 y# v! ]4 R#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! T; r# i) r. s9 h/ C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* _* O- M3 ~' G6 ]" ?$ ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 Y( s( l$ M  a+ [, ]
: |: M) o* ^% g8 f" h+ o3 H" d  F* t3 I1 K
//upp接收、发送buffer
- c: y$ A4 G# c0 X$ `, D#pragma DATA_ALIGN(upp_buffer_a, 8)0 e# W- }! o5 w' ^
#pragma DATA_ALIGN(upp_buffer_b, 8)6 ~+ c& V! p2 }. v
* U, h7 h# T( @  l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, t$ l5 J  a# Y: d% |' w, ]0 a
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  {2 G& q, R( ~' x) W
, ^4 [5 {. X' S5 e- D
( m4 U$ @; Y: @5 o2 @+ A; {+ L! e2 w
static bool server_upp_data_recv(Server *server)
( D5 C8 J( ^# |. e5 o{
; @8 V1 l! J+ I: n    if(server->upp_channel_a_recv == false) {2 G  @% C, ]3 Z! {- G" }
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! J- B9 R1 n2 J! _        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
) C. v6 \1 w9 q0 S, s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! i% O* d5 ~" x0 e/ {. K/ b5 g8 g
* Z' v5 j8 b/ z+ \
" V4 H( q) x8 c3 R1 w2 b4 Y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 l5 z! m1 l: |, M. s* t8 q6 B5 g* q( U% t# }$ c
            server->upp_channel_a_recv = true;//
3 m+ F  f  t( ?7 v            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( F/ h5 j$ f) Z2 i3 q            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 x: A  J' t" X$ x
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  D3 Z0 g7 _$ S3 \( z' S) l
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. R8 _7 y  b: G6 {
1 y- X' k& |' h5 Z+ e            upp_error_count = 0;
. G3 @% C/ P; {7 F            upp_dmai_int_cut = 0;' ]2 E# {' ?+ i) _, ]' j( Q
" n, o+ q5 p5 l0 [1 j+ T' q
            // fill in data * V+ i# n2 b/ s# l; s+ p( e4 M
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 F8 s5 u& \: f  {3 Z& _+ z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ Q. l) j6 C/ [+ i' I) W; f        }9 Q6 G' K+ R" O' v$ t; t6 Z' h7 j
    }: V3 E6 [. e, z2 \( w% e: }
    else{& U2 R$ J. V6 l) Z$ |2 v; s
        if (upp_dmai_int_cut > 0){) P* z$ h) W- l  _. U6 q; U
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 W  r- S) A4 t1 n* D  s
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" f9 X5 e! ~, ?2 }$ t8 L+ b+ Z' `7 v: v. \" Y+ [/ o* d5 s0 `

4 o3 ~7 s" H3 ^0 Z# E! L% |            //copy data to upp_recv_list_busy7 k. ]( U/ T: P6 M2 a+ T& s
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 P! q) l+ A! B& l3 s
, R0 v$ {: F% L1 C- x- u            //- M, o2 m( A( U7 }
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 E8 Q) c8 s1 E1 L: k/ ~# Q  \2 K* }* h. b' R0 a
            //# U  E% E. D; z! I4 |7 n
            server->upp_channel_a_recv = false;//
2 [. ^$ j# o1 h! v
8 `( ^4 |# x0 i2 ]7 W$ _            server_msg_send(server, APP_CMD_LOG, "upp recv: success");  s5 B2 Q7 I8 `2 N0 {
        }, m/ r6 Z* _0 o5 i  }, ]
    }+ L1 w( v9 @% m1 {

! C/ U! [" p* e* E& A% O6 R
" G- I% c4 ?0 G# D# G  g* l    return true;
/ A6 k$ C* z" h1 M$ e+ u) a}
& \: h# c8 T, c! k2 k% E6 _# M  B9 K; B9 u
static bool server_upp_data_send(Server *server)
, J( ^. @* s' \% n{
: J: h3 b( p* o+ C: c! l+ n    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! }7 M, K+ b3 h2 g, I
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 C. h" m/ U* ^% |  r/ I; X        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. f) _1 S' ~7 B2 V
        char tmp[128] ={0};+ F8 K9 R6 \# b/ i" I: Z

1 q2 W6 c* s9 t4 H! i        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 q/ x2 ]* K$ N+ O
        print_log(server, data, 64);4 ^, z0 d1 g, V2 t2 G$ J2 y

+ m: r2 d2 ~2 D$ j        //% a: }( e) X4 Z4 k- t+ H5 Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ U) P0 v5 [* y* i( N8 y
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% {1 @9 i! I7 r( y% D
        print_log(server, upp_buffer_b, 64);
/ v# U% S' C/ y8 {( F( b/ j5 k' W6 N' t- m, h8 G9 [. M+ y" r. c$ a
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);2 n0 j  \# y: x& e6 O+ l' d2 u
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" @# F% ^# |) W: Y& i        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 Z2 `  M: \; `3 o
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 R! N0 m5 b0 g* o/ y: I+ ^8 A! n0 j
: z4 ^) o& r2 k: v# V5 \
        memset(tmp, 0, sizeof(tmp));
/ [/ Z9 m" C; F& o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : i( [+ c4 N, f, r* f9 F
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 g: J- [2 }$ \- P        server_msg_send(server, APP_CMD_LOG, tmp);
5 Z* T  }2 G2 `# ]# b. U# @
7 u& W# t! ~! J& _- _        upp_error_count = 0;
+ B$ x& n- v4 G5 T4 ^. ]        upp_dmaq_int_cut = 0;& I1 ~3 M: R) W$ ?9 S
        // fill in data
  t' U4 q9 d1 J9 g3 Q3 K        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% }; [- Q* x$ p: ]4 P! S        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& R$ B/ O# B/ j& |. [6 k

% P, t# M+ h* L2 O" ?        // wait send success
4 U% t% R5 o# X( M! m        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / w. c" h" W% O" x9 y
& [# P+ M: P0 V, Z
        // make data node in free list
/ T* w. a& S5 m9 ~5 W3 |9 X* {. O" P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);  W+ J8 A$ P: Y5 F# f' J5 B* v
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
" K; K: P# _4 I    }
$ z9 H/ D6 [, n0 Z    return true;
2 x; I5 {% f9 t# \6 H; z7 |- C}
1 c  A3 k" b8 U4 }- W! n, x$ f' ]# v2 w4 k
; P  y4 R( `( n

* n% e5 R6 u' t, \4 {) [1 _

( B- \" i0 d+ N6 g' N
3 n! T, F+ ~# D) N" z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 e. n1 b3 A- a6 P, V# [
' i- N+ j/ i) W8 ^! j) w' h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 03:42 , Processed in 0.041125 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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