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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 Q* w* X1 g: U' @2 B

* l8 Y* S, b' f( V+ _" e, ~) R问题描述:
! ~9 H  z6 \$ ~在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, P1 k$ U, L2 \% @1 c

; E2 X0 ~% K6 T图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) t8 x0 e' [! r& f2 E. j+ x" U2 d. p: Q. a! i3 ~+ i! ?
测试结果如下:
0 y) Q$ [  r+ h. S! z8 R: K138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 P+ {" D: P& s  ^+ d! ~

) N# m) Z+ |: w
! L1 n6 t+ l+ ]3 @备注:& b- o  K4 l6 F- [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ w$ q/ ~% t' g, b, l' L9 b/ a3 P! B
2、相关代码如下:$ D* C9 e0 m9 o1 n9 e, o
//UPP DMA缓冲大小512字节% L, v( @7 p; @/ o* |- ?( f
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: a, G6 W( ]5 o4 e& N
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT7 o5 Z+ I8 V! o* w  V- D1 A
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); Q( u7 i4 T2 W! {: ]$ H% I- H

2 `0 o! h$ s( n  v
/ ?. }, e: x: H& R8 t. w//upp接收、发送buffer
# F' t# c  E, Q2 C" Q3 L7 p#pragma DATA_ALIGN(upp_buffer_a, 8)
. e* L2 O* Q  T' u! U#pragma DATA_ALIGN(upp_buffer_b, 8)/ c6 F* d$ r1 u( ^6 B5 E

+ S! G/ w1 u% p  i' bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 X- P! D2 T( r$ ^& o  b3 i
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& [$ _& W3 c  y9 R% I/ G$ X  ^+ o1 O! t# K' x8 J$ N% m
6 ^7 \( i' O: u3 n- h$ O5 ^3 G
static bool server_upp_data_recv(Server *server) 8 ^& A. j6 \3 X1 r9 w
{
( a  g0 t& r$ z0 M    if(server->upp_channel_a_recv == false) {* [1 p$ ]' G- {. _7 R& B2 f6 o
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
. n/ _% }: a0 h3 ]- {7 J" Y        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 K% J4 c5 h8 d. C& W" x: ~
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
  z3 w$ K, s, Q
: s3 o! [+ T0 B) D  h* P$ q
% q7 g9 K& W0 E/ d: Z. {            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 y: G+ m0 R# c

: i6 C# `2 D) P# h. p. y            server->upp_channel_a_recv = true;//
- V( z" N- ?$ z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
* E+ J3 j4 h6 ]7 Q; S            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
8 ^! o5 \$ v. w8 U1 z. x: _8 I            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;! l4 k# V6 @% I5 _
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; h7 @( \$ ~8 R# D1 }7 N

0 ?% W6 _7 `) _& o( Y) y: C            upp_error_count = 0;
; n* ~' l8 w4 o. x            upp_dmai_int_cut = 0;
7 Y* c" b; S: W. X7 W# K4 p( _( t$ r: {+ @9 k8 Q
            // fill in data
) o+ K0 s* {6 A            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 m0 F3 i9 B+ x1 `0 ~            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 W- K/ b- S; L) B& O2 p
        }. b5 H# l) o4 p& a5 `
    }
0 F. Z( @( `6 m    else{
$ z3 a) Z/ L& c# m) c; H2 q  K        if (upp_dmai_int_cut > 0){
% X& g4 h2 a/ x) \# C            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; O: @9 X1 @; a. Q: [% p
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 x, V& O/ D3 R8 H- ?
2 _" P& v8 T8 w( u- {
% r5 Y1 O/ h  H
            //copy data to upp_recv_list_busy
/ D% n9 f( i# C4 e+ H- }7 L3 N            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% ^& F6 E5 ]* T0 O
8 x9 r/ ^  c) p/ e, I) z) V
            //" \3 k% J' H/ c% ?9 ^; x
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  O4 e+ c0 ^) p+ X8 }; n& K. r) K' S# C
            //5 Q# u, j4 K; }
            server->upp_channel_a_recv = false;//% ]- S; b/ S7 }
5 ]8 b% s8 |4 X
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; h/ u7 x1 R- R' U/ k/ _
        }* I+ M- [7 E! B% ?
    }) Y1 Q( ~$ o+ m9 I: C
- v4 C4 r+ N9 j9 i" N

/ o# n0 l- f9 }) M% M    return true;
) }' e' o" B6 a0 r+ |' R. r. Q}
4 r5 z- }6 \$ p7 {' m) j, W
+ V* ^: j2 d" O+ T* Jstatic bool server_upp_data_send(Server *server)
; }% c' L9 y6 J: b/ b{
9 m5 t! ^2 ^) T& ?* r$ p2 }    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 i2 w/ M9 Z( u* f( d4 Q- z5 m+ ?+ X        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ g5 s  h0 p0 Y( l8 G1 O. Z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% Q. n$ y5 k9 y, k) A, k5 @
        char tmp[128] ={0};
9 T( p2 j8 ^+ T1 A- ^& O$ q
5 E% Z9 W, c9 |        server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 s2 |% a7 Y. V! T' x        print_log(server, data, 64);
& o9 j" _: s+ M
- V, r/ l+ p& b6 F, n- o        //. d0 I& D4 B% n4 B; j% K3 N& S+ k
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ e& u6 ]& s* y+ i9 ~8 |% s+ M        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 R* _! ]' g3 }# s7 u& |! W
        print_log(server, upp_buffer_b, 64);
& r: Y  d1 C/ t, G2 Q9 @
9 {( ^6 {# F( i* N! k8 N        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ p8 W/ ~1 H+ g! |0 u
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ( B# {8 |$ n1 K+ ~- y3 M
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, u6 T* t9 k( |7 W% E+ Z0 [
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: K, `$ e) j, J9 }% o3 t6 X1 \
( b8 O2 c: e: N# Q  [
        memset(tmp, 0, sizeof(tmp));6 K6 B7 z0 R. P3 e/ X& y( ?
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' W4 G9 K( E* l/ I/ h( M  c' X            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 }& R# c: h: T& t4 O* E        server_msg_send(server, APP_CMD_LOG, tmp);
" J/ ~  y7 `% O# x9 p/ o% w1 n. A4 a3 h2 c4 `. V5 x' m' B; m
        upp_error_count = 0;6 B1 l$ I/ o/ X; u0 g7 n, ?: c3 Y! h" f+ V$ M
        upp_dmaq_int_cut = 0;# p" k! \- E; Z+ F
        // fill in data % p1 u7 b# A; ]7 w/ |$ {1 Z3 k6 o
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 N3 e) e. h, R        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 R9 N1 P1 Y, G+ D! I! I1 J* q9 j: |2 h5 a, b! K
        // wait send success9 o% m! D, K" P9 g1 c$ c) @4 z* J' k
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
9 h- v# O1 U) p( ?' N! w) k
! S+ g' A/ c4 }8 m/ l9 u        // make data node in free list : p9 h+ i  Z' \# i% K) V# w
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" K, S7 z- {  i" O        server_msg_send(server, APP_CMD_LOG, "upp send: success");( D! ^9 F7 N# i
    }
( A. }7 x: k; {) C    return true;8 o  \) s. _8 a7 S1 N# F% w
}0 ^1 k# C7 ^* b/ g: [
3 x( V& \( d6 c" W; c

6 a8 v0 N! r1 K# M1 m# [& m
+ C! l' y, y7 e  {2 z) m7 M

. `; |# u) c5 t" k+ D/ j& R7 a2 z! G' P

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: Y% I8 [- f$ G; B: @
) T; U. |9 C( U  o5 }) p

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 06:00 , Processed in 0.043349 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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