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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
/ c4 a, l/ n3 H- W& S: _
' f" H# s. {+ M3 @2 M问题描述:7 v+ N9 h5 @) L% [( v6 [1 v* U
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) M8 J& f" o, P* t, E
5 q* Q# W# r( j" z+ m2 l& A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. `/ T1 w. M. u$ ?! i8 k  C2 T
* a6 y6 e9 q8 b  h& i" s7 U# w
测试结果如下:
4 n' K6 P, {  X3 N138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ l/ @5 F4 e4 z+ {7 f7 l% ]# A4 T5 k# @4 i

3 V( l, {1 y4 ?* r5 J备注:
" G8 ?1 {* [* Y. `; b1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: o! \+ _4 N" X$ W- C  d
2、相关代码如下:- ?, e/ U# F; }# O
//UPP DMA缓冲大小512字节
9 Y# j" H0 l7 i+ F- [' p( ~# V#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  Y# q1 U9 B4 E# [( G3 K
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ M2 b% l& j" B& L
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% \3 x; h. s9 V+ k( B7 f" h$ m# ~

/ ^% E8 @5 `/ W/ @" `2 [, U//upp接收、发送buffer
8 p" Y: Q! P8 Q- I#pragma DATA_ALIGN(upp_buffer_a, 8)
3 U/ i4 Y* H& X. f6 b1 F  M#pragma DATA_ALIGN(upp_buffer_b, 8)* {' K) K" h( U/ ?9 r+ R
" d4 D4 B/ [7 w" L7 L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];/ {! x  `0 b0 Y) v! B0 F' N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 ~( W# [* q3 s9 ]: S
7 i: A3 P1 e& c+ b$ p% @
2 p' m6 E' C' K3 t$ e! C# A: @7 wstatic bool server_upp_data_recv(Server *server) & D5 U2 \2 e- ?) }5 N7 n
{3 F" x) ^+ c' |+ F+ }/ u: f7 p1 S
    if(server->upp_channel_a_recv == false) {& s# x. n' A3 _/ E1 H7 m& ]5 i" X
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  e4 ^' G3 k/ [0 O* w
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
0 M, Z* A; ?. m            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 \0 O2 M5 S/ Y7 W4 J) G. p# o

( F$ ]  q' `+ f* \- o
, g( Q5 o, I  B& _. @            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% f5 V6 L. f+ _' K! J

0 e5 l3 X! z$ d2 L, w            server->upp_channel_a_recv = true;//7 a% X7 D; F, |. j  N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! r9 r1 }: R: h8 j  |1 N            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 l2 R7 ]8 A: `. e, w- }            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
8 r9 F6 I4 S+ P2 G' e            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 v' q- \! W+ s% C4 Q" d, P
' _/ G* w4 _9 ]0 M! w
            upp_error_count = 0;
% o3 O  U* D; m1 [            upp_dmai_int_cut = 0;
1 [* O4 a; J/ w' _4 H: h6 O: O* u3 X. ?% G6 E& C
            // fill in data
2 n# F( j7 i! w% m2 i4 Z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 k( e% W3 H* B; D: r* K            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' C' h0 u0 E8 G/ j6 k+ h3 \& L
        }7 z- S2 N4 M& R5 Q& L5 h
    }
' o! [* [  H" `    else{/ U0 `( z) \) r
        if (upp_dmai_int_cut > 0){  \/ X; y. T# l0 i
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. `+ W4 }' B! _9 f) E* s8 `
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 S" _2 w/ k9 P' M

7 c1 M: L# c5 h" y$ d, T5 _* z- w9 u/ q, Q; n. I4 u
            //copy data to upp_recv_list_busy
" Y( }$ P& ], `4 z7 B- `- r0 _( \            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 y+ m  \( B, x3 O5 x+ r( i$ r# p3 J& X. t: ~
            //
- L2 a% X- b4 q: v4 Z' L            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);1 M. h$ Y$ r5 b) W+ u
) s& Q' m0 |) s5 |& O; k5 \; E# n
            //# j( t6 h: o& ?2 k! G) ~8 D; t, V
            server->upp_channel_a_recv = false;//
+ C! }6 l, `& o" o& |6 i- P
0 s; V5 t6 K+ Y  H/ T, I            server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 S! r* ?5 w8 S
        }
5 g( g7 N& |* j# ^2 k    }
* f! {) F' B- R/ O/ U3 r3 K
8 N) [. ]7 Y  P/ J/ N2 q) @7 [
* k/ @! {7 v# z% _: W  v; Z    return true;6 x& c/ ~8 S, }* J* T' \* ~% L  T
}
) y" p- v! l% ~. T1 g. V( r
  ]: C$ F; D' O  J: m5 z8 E$ @) A6 @static bool server_upp_data_send(Server *server)
5 ~4 r0 B( f+ V" h' t1 U/ ^{
+ D, \- y! o5 X7 }5 m( e/ h/ M6 N    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) p6 T; g( _% ?* p* g3 s
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 K5 t# i8 a" q) a3 A. ]( K
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% w3 H* k) k/ k7 E; o        char tmp[128] ={0};
9 t  ?' n) E9 r1 U- t) T8 F5 M
, p6 `3 {" l/ |$ \& b% X, B        server_msg_send(server, APP_CMD_LOG, "upp send: start");0 y6 E. |% W% t0 b$ D2 n
        print_log(server, data, 64);
$ z7 n+ @  P5 Q5 Y6 c+ R
- _8 W. F1 ~: w5 y& {' m: W9 g        //
2 W% J7 J$ h6 R( s0 G        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. r4 u/ i3 v% h' W3 M0 J+ f
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
  \2 V* H( J% j0 A: ]% h        print_log(server, upp_buffer_b, 64);
: G8 T& H2 T5 q& x/ D0 v+ d
( \/ ^9 K' u$ u        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 f. I4 @. T5 V! }4 k
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  R7 F! f6 B  l7 p. S0 {        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;& u4 T5 O! A. I. B9 ?% ~0 G* q" v
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. K  U* w% f+ |0 ^6 N! _# w
  t0 v: U* h5 P9 T3 P. u1 ]        memset(tmp, 0, sizeof(tmp));0 N9 I/ l$ H7 |# ]( m1 p7 R4 a) f
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 C' E& o- g) n+ z4 u! W! r            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: C" U9 r7 I/ O& r
        server_msg_send(server, APP_CMD_LOG, tmp);
, c! w6 U& D5 o) X1 h, h* A$ h) ^" d4 m! p
        upp_error_count = 0;
3 P( f' J4 X& P2 _9 u& j        upp_dmaq_int_cut = 0;
5 p# U" S. K, [* X6 o& \. w        // fill in data
) x' s  Q8 U. f        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 ~4 T6 F7 `+ n% k1 T$ c" H/ j$ U  O        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: ~/ ^) g; a3 Q' k

& v; U3 R& v) K        // wait send success+ C7 K  f  `& C% `7 B% O# ~
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 |% B0 P7 \  Z: S& C3 R8 `% v7 F% Q( \; T0 S  k9 L: v
        // make data node in free list
9 n& c' W; m7 N) z$ A: A4 d, k        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) {! ~+ O. U  O4 L& t6 c        server_msg_send(server, APP_CMD_LOG, "upp send: success");3 ?& N0 V: k/ t: P" l$ P2 }4 V
    }- z' _; ^: @# Q* p# L
    return true;7 e( U% D9 D' p* o$ y8 P6 Y
}
3 W. a" ~  p8 W  r: n% ?9 q1 D  S: t5 p: |

2 H4 N# U( i1 f; o
  V! V' H* o* ]) c
0 V; i( O! }2 g" E( T

6 s- U- S3 B; ^# {" ?  ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 d* R3 y; d0 ]/ e3 Q4 z
# O' a! O, I7 @+ M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 21:34 , Processed in 0.046109 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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