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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 T4 E! V$ V7 Z6 A, a0 H

' c1 o! v  b1 N" X+ c问题描述:
2 Y! X6 d, t4 r  U- `) l7 T! _) e& l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" K% E" o3 @! _+ d! J5 }& U2 v/ A6 @% L# F* L& _2 l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" q. I  `: O5 A& U  T8 g0 [2 X

4 a+ k  x- p+ k' A0 `! |测试结果如下:
. S( S; z/ D- @' n4 w4 N138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' T% X' I9 P" Z4 G, j4 j' `

- i4 s) _  `! H( N; n- M4 i3 u: s! D5 g5 c
备注:
: o8 v& M! H+ r1 a4 b' A) ~$ d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ e! A* \5 J, y) q( Q# X2 f
2、相关代码如下:
+ s& ]( @/ \/ N, F: p! _- ^//UPP DMA缓冲大小512字节
! _# F0 \/ `. Y/ X2 ^+ y#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! l9 b, o1 W( l* h% u8 u! O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 b& G+ L# |$ K; w" i2 J#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 C8 M% v4 N9 M# ?; Z9 N: ~
/ _7 h# h1 u# `* j
; ~, F5 {+ b: U% h) u6 }//upp接收、发送buffer
. R, Z7 f+ ]- s- A; _6 O8 G  @#pragma DATA_ALIGN(upp_buffer_a, 8)
, _7 c3 L7 e/ e7 n" z1 P#pragma DATA_ALIGN(upp_buffer_b, 8)2 i- }8 J" J. ^' w5 q. i: A

" v  F# [$ Y9 K$ m% qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
1 }6 B# t+ }# u" E' }- lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! C+ w' E& \" p* o9 o, H# Q) D  m  Q) \$ P! m' @

" z, e" D2 L9 x6 z7 Q) G& Mstatic bool server_upp_data_recv(Server *server) 4 c. t5 V' W$ S1 `: H( L
{" A8 j8 S5 T$ M: Z
    if(server->upp_channel_a_recv == false) {
5 \$ o( q9 o" Z6 B5 U7 I: \: f" ?        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 p5 s! O0 m/ _6 s& [+ }        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 E  V9 l5 p  c5 c# }3 U. P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 d! [1 @5 D# S& {2 K" z$ T. q) Y1 C

/ f8 M4 f! u$ t' V
2 x* m+ L/ _* L- q2 T9 W+ T0 J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% {8 ^9 z) n6 p% D* m
8 @. {2 H" C0 U% q8 w            server->upp_channel_a_recv = true;//
3 t  w4 ^% y( \! r3 F" C& E6 J! F            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);. q% s2 w6 H8 Y& W# ^( Z  |( j
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 J: \1 Q8 ~: ^1 O9 T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
6 i* o+ L2 M* W# C$ r- n% {" e5 o# `            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% R( d5 E& K& N. q. [
) O9 ^( j) f+ n- c4 O% `7 R
            upp_error_count = 0;( [" K3 D: C3 c6 d9 P
            upp_dmai_int_cut = 0;
) A+ {5 u% M8 [- A7 j% h3 c# |  b% _& Y0 _9 u
            // fill in data
( ]. ]( y/ ?5 \6 Q0 S3 w            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% P6 l7 Q/ P+ H6 P  ]            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  p) T+ @2 V  m5 p$ e$ N        }' O4 R: X  F4 v; N3 u  ^/ K# p6 e
    }
1 w( r$ j& ^" [) e' o: q    else{' Z8 [! _  y7 A! e; Q9 |! Y
        if (upp_dmai_int_cut > 0){+ f) ?, X" S8 T) v9 Z& i
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" U' G1 Z2 ~. d8 t
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) [  K; H' J: ]1 D7 E
: o- L$ y4 H+ B3 u8 j
, ]& q% e- h9 P" b) i. C            //copy data to upp_recv_list_busy
# `5 \; F+ ]2 m% D            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 J( c7 G# u" Y! g0 L( Q% r/ o; g* y; t  Y" ~
            //' i0 r5 r& l! t5 V7 O
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 y% N8 [( }( K7 u9 J+ _/ t
3 E2 q; i1 w9 M
            //
# ^& _4 c7 B' l* [# Y            server->upp_channel_a_recv = false;//
/ K! u4 Z5 q; y7 f6 c4 \5 n$ g0 i) H- v( P
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& T/ j) {/ P# W! ?+ g
        }
9 c* V+ H8 |" w' Q/ d    }
% g7 g$ F; u; A' @( q' T8 u4 Q
9 v6 i6 Z; B9 q, _. b( b6 c& E" x, Q7 c( N" ~# G! u
    return true;8 W6 @  G; i' j0 ^
}
) y4 }, M1 i7 }3 @: Q5 J  R. Y
) q* W  n8 ~; l/ l9 s8 [& tstatic bool server_upp_data_send(Server *server)2 U3 A5 u$ x& M/ x
{6 ]8 A! P! `8 H9 K! ^4 [
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- X8 I2 ?" w. Q, x, z/ A) h
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 S- U% t5 d$ Q1 k2 j# g$ b
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 j% b6 t9 `  X  s+ f
        char tmp[128] ={0};0 a1 z( E+ G. p5 N% U# I

( b0 Z4 F$ H2 o) V! n' V+ F        server_msg_send(server, APP_CMD_LOG, "upp send: start");- C' l/ C; g. I
        print_log(server, data, 64);9 Z% i  e/ @& Q
  |5 c; b/ W7 c/ ~0 E  o6 e9 \
        //
. Q* c6 c) I6 b. P9 o9 y  v        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 _1 G' V% r) ^; F% f7 ?3 c        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' ]3 [2 k& E& W, U2 m, w        print_log(server, upp_buffer_b, 64);: `/ f3 T) u( G) s
9 d, g' P* w9 a3 g0 s* I* z$ }
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 y1 p; Y7 E, Z4 ]
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; " r% [( {  H$ _5 v' u
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' X& o2 {( r; @; F. U  @
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* {1 P2 a6 V% K% F% ]% i# e- y' e0 e
        memset(tmp, 0, sizeof(tmp));4 h. q1 n3 C) A9 Y9 [+ ]6 T
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- O0 G" _" L$ t6 }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 c+ @$ Q& d0 a- Z8 B( D9 i0 }
        server_msg_send(server, APP_CMD_LOG, tmp);, b" X/ ^  i& E# p  s( E- L4 b# x0 M

. n7 |' i; u# ?8 p        upp_error_count = 0;
  {0 b+ Z3 c* O, v7 l9 |( r        upp_dmaq_int_cut = 0;
8 e: n- Q3 e( @        // fill in data ) k9 W3 V- R' T* C
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% s  D% ^: z& ~  }: a. P3 ?& G        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# o4 @% V9 Z0 U$ x. C: q) c5 G5 u& C8 N# C* L7 f& n
        // wait send success
1 r' x8 G3 l4 v6 {        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
0 ~* ?# o" u* y# c) \8 e1 x: X2 {+ ?! r6 R" [
        // make data node in free list % L  \# ^) V% K8 A9 T2 T
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 b' R6 B  C3 V4 O( n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* f. L3 U# h/ N& B) h; K
    }
' i- j6 P* [  f4 L& ]: @0 p6 C. l  K    return true;- E) n9 s/ q8 J: n$ @; `
}, n9 w; k9 ^" e$ w6 y# @

4 K! J! ?( x3 G3 N
; ?4 E2 k5 f: r4 |$ M. I6 _
3 G# s: o; S9 k/ J; o+ W2 j* h

5 v1 ?7 [; C" y8 b
& L6 j% U3 q# ]' i, H7 N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
$ R7 Z# n7 F6 y" {( c6 M  ?3 M+ @5 \8 ]  Y. e2 z! ?, Y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-29 00:26 , Processed in 0.045832 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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