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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
% {; u/ r1 U' {# `/ i4 F
, G" B% ]! w% B问题描述:
% |6 ^" j3 g4 H& D; @$ n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 x6 E6 k# n" l' o9 I
# r  B# k, J9 S6 s( O; D图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 ]/ p/ |% s6 l  Z9 b; _4 R

; R6 o2 p; S3 ]测试结果如下:
' ?# R- {3 i' t( B# _  g  z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?+ ]+ U7 U$ w6 Q: R8 n
8 i4 N1 N. x  G, D) z& x
! h& a1 I! \* G8 ?% i* p! E5 x( ]
备注:
1 P7 b- c7 R& |8 B0 a5 Z% k1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 I, G- H$ J7 v4 L9 e
2、相关代码如下:2 a5 [2 B! ?' U. o& Z; W
//UPP DMA缓冲大小512字节7 ~/ W2 S% n# W! D2 W+ ]: E
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 [" D6 L+ F7 u7 v0 I: M
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; c4 _& h: A  a- X0 p" K- I, B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); X8 J" t/ n: T- A

1 k! |8 g0 q2 _: G& ^( C. Q. ?. N+ K* _/ W2 i
//upp接收、发送buffer
) Q* O& Q& s& r#pragma DATA_ALIGN(upp_buffer_a, 8)
- s3 M3 ^( O% p. t/ F. V' I#pragma DATA_ALIGN(upp_buffer_b, 8)7 o$ ~1 r* e7 X: X' r  Q4 V5 \: I

' B2 |2 Q7 ]  c1 yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 C. E4 V$ u2 U" s: Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 V+ V$ a8 F" D9 Q" c% k4 ^7 q8 H* g: t- [4 [
% X4 ?0 A. m# W/ m! d4 u
static bool server_upp_data_recv(Server *server)
/ f) y1 S% T; |5 D; [4 F( }{. L+ E9 C4 ]. [% X. q" |* P% k
    if(server->upp_channel_a_recv == false) {$ f% }; _# n* o& c6 K
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");. z0 \3 T2 y9 B/ U. c* Y2 B. j
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ D/ e: C+ f' Y/ X5 w, S5 _1 q" \            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 \) K; D1 h! j2 q( R8 H$ m
, G) r! ~! p, D5 p  {
3 W3 O1 W+ ]- q+ H- X. R- j            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 C& L: O. }% U; Y2 E1 E6 r

& }/ T" g) b, m6 `" q            server->upp_channel_a_recv = true;//
( `5 ^* D8 y4 v+ k* s# ^# O& {            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 A. h/ @( Y$ Z' T4 P8 n6 E  W
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, R5 s( N% k! t8 H$ h
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
* i) K# O  |/ S, d            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: v9 s6 K; ~' J4 L  {" G$ V! u
( Q& t5 r) S+ V& t0 |" F5 U            upp_error_count = 0;
$ N- T6 s! r0 D( K+ N            upp_dmai_int_cut = 0;
; c6 w! K! U& C& Z
4 T$ D' v5 ^2 T. w  O# T. `* L            // fill in data
+ C6 Q: t, H$ a5 b: Z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
$ `, p, y/ p6 H1 ~! s$ M* M            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 o' F4 i, s9 J9 ]        }
3 R0 `+ p+ u( b8 c$ d0 r    }
2 Y+ R9 l, G  B& A8 a    else{; z$ b% z3 L. b8 A. Y$ c" J5 |
        if (upp_dmai_int_cut > 0){
' \9 S* e1 }8 n+ l( D6 I            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' X4 d7 X  g. x7 j, \; w4 P            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, i# @1 F  A, P2 a
. n! l. B) M- }3 |6 C: e5 |) K; {& n
            //copy data to upp_recv_list_busy5 M& n% U5 \* k; a& y7 C- n0 K- D: {
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);/ [, F- p4 b- c# ~; x
, u. t3 Z$ [2 o3 \; R2 E
            //
8 h( h' k/ j7 r) g! Y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* [8 U2 _* ]/ _- i- N6 a+ {6 ?$ d  G$ b3 n2 z
            //
' R$ @+ X  j& I            server->upp_channel_a_recv = false;//
# G7 n3 p5 k% @2 h( t* D
6 `+ V6 ^& p# ^) v+ u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 S, y& O6 |" R# V" [  Z2 L        }5 f4 g; I' U$ I" @) O
    }
) p- R+ K5 c" C- y( i# H4 ?' ~1 p* f4 @# t7 G
& R( V' Y1 S5 x$ S8 s) \1 e
    return true;0 u0 l* [7 V* S+ x
}
7 P! e* }' Y  A6 K# ?" U
; a; b8 t( j/ u) Jstatic bool server_upp_data_send(Server *server)
5 c$ M* M3 }- B0 K{
6 f. F( ]" }, e8 b2 M; i7 K) \    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) j0 _; B( s5 V2 ~/ g. y
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 D3 T: m' r# g6 G# o
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: ~1 E% N0 @% r" _* h7 `
        char tmp[128] ={0};
2 y1 h8 ]7 Q' G& R- V
5 L' {! Y- |$ |% @2 e        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 d% p3 C' {- t* {% X
        print_log(server, data, 64);
5 b8 K8 A- ]* R5 h+ r& U
6 n& O9 Y4 s* p0 h+ Y! `6 l* a        //+ R/ U2 e+ X! l; I5 o0 M1 C
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! h  i/ p5 \4 J8 N4 J' v- s4 s        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: w9 J8 J& S/ W  M0 H4 i" z
        print_log(server, upp_buffer_b, 64);
( ~8 j" F# K. ]6 `: B9 |6 \5 T9 ^: j' V& u8 u! }1 }9 @( g. m; p
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);/ v) L( P% p# ?5 _! |5 ^& y) {
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; . E$ l. B6 w" c; Z2 I1 `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;8 i9 l( j3 h0 j- i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: x8 h! r0 A4 R! \( l
  E8 Q6 W& R" |4 t
        memset(tmp, 0, sizeof(tmp));% I) ~% n& K( I$ Y2 _9 Z! [
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( H7 k9 r5 O2 H' E            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 {% F' [# Y- z  E        server_msg_send(server, APP_CMD_LOG, tmp);6 w( m: I8 F3 q) U5 E7 q8 d. z; @

2 ^1 v% f; r1 o2 }2 C+ ]4 {4 r0 E        upp_error_count = 0;
0 U& c9 c# Z4 c; H6 o; U* W" }        upp_dmaq_int_cut = 0;! a! o' N9 c& B2 u/ V4 A0 {# B
        // fill in data
) A  P1 P4 |, g* r( N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & i' s5 N: M+ d1 @
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( v5 m" e; Z8 a1 {6 n  B$ p( h

+ t1 R4 ]/ \4 l9 k" v. S0 H# d5 Z) Q        // wait send success  `0 T5 e8 I% Q& B% a+ _& x
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 e! x6 \/ \) K% \: }* A0 r" x& M. O0 Z# H+ M; r
        // make data node in free list
& g- {0 Y: |0 b4 n* K0 |7 [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" `) _* x) P, p5 ~) b* }& n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");. p% H* [( J2 U3 ]# x% t
    }0 f2 J) x* n; |% L' r
    return true;; [) o2 E) j9 r- _7 Q: t: K% a
}
2 `# _& w% N& w8 t
4 Z6 q. i. j+ I7 i

) P. ^0 w; \' h3 R
: v0 J* t1 q+ i+ G- u; d! g9 N7 Z

) A  k6 t9 y& G; D; j
) i1 p; c0 L5 J! H* x" _& w

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐6 u) F& b' ?$ X; o7 ~

4 v4 K' c( |- f* F& D4 |; D

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 02:53 , Processed in 0.041195 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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