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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : ~0 L" u" J" b+ C
- _& G: C0 t3 h) Y4 D. u
问题描述:
; n' T* K9 K0 s3 ]1 Z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. K5 H& D+ }, o- D3 a

& ^3 D) y$ U, W9 z图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* F2 S" G- i$ m( T4 O* |' f3 v9 b

- D: A$ j4 q8 j. B9 s5 t& z测试结果如下:
  t+ ^4 V4 |( ?3 G( r0 _' w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* f  H5 U" s, m

( B& t6 a6 X1 s. c( L  F  L( n
; A+ Y. b+ Y5 ~: J+ {* {5 h5 w备注:
2 s- @6 ?  s+ m, e- T- @( M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 @# }9 E: I1 z
2、相关代码如下:
7 m; G3 E0 w9 [/ t: h//UPP DMA缓冲大小512字节
. x$ I) O$ g1 ?: H+ f+ e) M#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍4 ^0 x1 i2 i) G. m0 Z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 L6 R# F; n* A7 ]! p#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 b4 X- u6 Q( `. b5 ?7 {6 l: Z3 O. R# Q% F! q7 k

, `5 h# y# w% w  h//upp接收、发送buffer
6 t( x1 |) [" N3 x#pragma DATA_ALIGN(upp_buffer_a, 8)9 E+ }% F; P& E- c2 A
#pragma DATA_ALIGN(upp_buffer_b, 8)4 n# J) i. E+ H3 w
) U. e# y( p% c1 ^, w7 K3 r' Q9 }6 {
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, F# c. I8 {, @  F  A7 p
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  ?5 t2 w$ e3 D0 ~" ]6 f5 X+ z& ]9 E; F; `, u
/ v0 g2 i6 Q4 D0 m& u
static bool server_upp_data_recv(Server *server)
: {! ]  F+ y8 V, m{
! z2 i, X( W1 S0 F6 \9 ]    if(server->upp_channel_a_recv == false) {0 t0 P5 r: G/ \* Y% `$ z% a3 I" ^$ i
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ O" P* S, I5 ^8 q; C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 m# q* p; b- j- G6 N# v+ k( R
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- [2 M% u8 ]9 D3 x2 f0 q/ w

7 Z' W% C. {7 I% y8 T1 }9 ]0 G8 G5 z  f- x5 s3 @
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 H( V3 j& Q2 l% T- ~" q6 r3 E

( G% j; a% b" X" o4 c2 e( E& J/ C* m            server->upp_channel_a_recv = true;//8 D; f* B! \$ J. }- U7 Y# i2 w
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
8 _! ~9 {8 s  l) X+ k            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, ^9 w! M6 P+ U% m; f$ P- U8 E% C
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! ^  p8 ^( F: M( [  E            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ ?* X7 X5 d4 N$ S2 w( m+ |' u6 a
! A: E* ~' B  c            upp_error_count = 0;3 Z) B$ L) r/ j# \
            upp_dmai_int_cut = 0;# g- a3 h; K$ Y& q* ^: ]

' H& n+ K; I" U. Z& G$ I4 V            // fill in data
4 n* l8 |% G3 u6 L4 r: H            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 V9 ?$ _5 C, }: A, z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; d2 o' b+ t/ w* t) b" T
        }
( G' `3 F- z5 o6 b6 f    }
; \! c7 e. @8 I' X, J- Y  v    else{
' l5 f' E$ t6 b5 `5 R$ d        if (upp_dmai_int_cut > 0){
0 ]( R1 ]; y8 @4 _( R            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ l8 {& }3 J- X            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 {8 m% o, w! k) {' ?( O( D1 j# a2 l' O" U1 s$ |

/ h3 a% A0 n, R7 J  v) h" v            //copy data to upp_recv_list_busy
! Z. u5 s5 h" r& F; t            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);& E9 \' w  D: }! `8 A+ m1 k+ j

, ~, U! U" x) B  A            //
0 n( p5 {# K( h4 f            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
, ^8 ~# s" y  Y/ G6 g6 w3 R
( `# q8 ~" g4 Z- x            //
$ r' h1 x& G/ V2 u$ H0 B: O5 S* s            server->upp_channel_a_recv = false;//
% K) w4 A4 T: u& n& z/ O+ V! t& p! z$ {3 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: D4 w3 o( F0 e6 p
        }0 E1 J+ @# N$ g8 C
    }/ K! Y8 ^; D; G- b/ ]  E

; w7 N! G* O8 S5 d: d5 o9 @) v
0 F, ^  S( l7 ^# F, V/ ^/ ~    return true;
; ~! U+ Y% R1 K  J& Y- U}2 o* [$ M  r9 @

% Z9 C: \2 _3 u& a  H. Tstatic bool server_upp_data_send(Server *server)
5 `: E; B3 S$ w$ t' `9 y( f9 O{. J) z7 B. }% w7 F! l
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
5 W" g% g! R8 ?5 Y, e3 c3 _% L        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 L9 l  H; z) _: e8 k9 D0 f        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 V( Q0 l/ _7 i
        char tmp[128] ={0};6 W) @; q, B( o/ Q# b" }

+ B, j% w# ]% V" _0 r7 e3 a        server_msg_send(server, APP_CMD_LOG, "upp send: start");- \, L) J" \, v% h6 z% I6 T, c/ l
        print_log(server, data, 64);
& c2 S) V+ ^0 Z" n9 k, i5 a
' t0 [+ Y/ [7 G4 R- m5 h! B& a        //
4 W' O# C! [7 U! o8 X2 j        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; U2 H% m$ t( I- ?) h, i9 p3 C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 J' f* S% R. k* C* J
        print_log(server, upp_buffer_b, 64);' j# {- c3 B+ z+ h

+ A! I; b6 ~  @/ t, X8 @8 I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
) S! v! g5 m' q* Y) u" G$ `+ M        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  T( J! E  M% V1 d3 o        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 X7 `$ e5 p7 n9 @8 b! z
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# C) h- E6 Z7 D" b; t6 n6 L! s

" K# q/ \6 u) M1 ~3 l" L        memset(tmp, 0, sizeof(tmp));2 C% u# V9 f# J9 n! t+ \2 I
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : q$ T2 {( D: g; f7 y5 g! D, B, D
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 g, n# ^/ l! J* C& O5 x        server_msg_send(server, APP_CMD_LOG, tmp);
' Q$ P9 U# {+ B) O3 G/ i2 b
+ k; ]: K; a+ K$ R        upp_error_count = 0;
4 B5 v" s1 t: c' N" ^, Y9 M' K        upp_dmaq_int_cut = 0;
; w: g6 z. c* h: s        // fill in data
) _& V. x7 ^4 k: x5 m# X; {+ y- I        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' [/ T1 @: b0 M% Z" l6 ^1 X# q+ D9 ?/ t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- D+ S3 B% X  {- r# b2 L

; s7 U8 u8 I* f: K' G4 |' \9 R        // wait send success, d. @" b7 D3 P: Y
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 b. A0 m  i7 w0 ^$ d
, T! c, M& C0 _  W% q7 t5 L$ n4 D
        // make data node in free list
$ d" i* A- o" w( b' `- \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: w/ I/ r! V+ G, v" }& b, R% _
        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 c, V9 [/ z! i4 ^: c9 K4 j1 `
    }
) Z3 f  S/ k) B8 \* @% F    return true;
9 x+ t- v3 k/ U5 V}
7 ?- V& I* H5 ]2 U6 w7 I* d. g  S+ U8 C9 c2 Y% @
" m, ?" i- T; G% s

' n3 M' O- M4 X( ~( F
! C0 `# x* {1 C1 u4 C3 X  y
" O1 ?+ b4 [/ Q; M

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 _  l4 I0 e; A1 o/ s0 ?6 Y" k9 r3 T: M/ y/ p$ b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 19:52 , Processed in 0.049902 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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