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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 Z( N2 I4 ]! W. A$ }- Y3 ^

1 Y+ a. n2 f$ u问题描述:/ @; n( F2 y0 x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, G7 ~$ ?: V7 p+ d1 w. M
4 I; j4 l: w; t6 z$ M- D# N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ W4 g1 U. i( S, w# a7 B  D* w) `

9 A. {: K- A+ z" P测试结果如下:
' d3 R. o3 `0 q  _. D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  U/ d0 S) p, H" Y+ {7 q) n

; Z+ s0 g4 `. G% h# z- Y; {: O9 e9 H/ I6 M$ ?
备注:; C& ?. a$ a% F9 T2 g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
6 G) G" K0 ?0 w4 C& q2 \! S; V# o
2、相关代码如下:
: [) F/ v& @/ i3 e1 h5 l//UPP DMA缓冲大小512字节
& D# c  _% H5 w5 Y  u/ \, m#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 f8 y* O" M, I$ f#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# f6 b, B  _& o) v5 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 r) z$ J" M. G" g5 Y0 R7 C- O

. Y+ W0 L" [; k) G2 A
+ T' [7 g7 B- j! Z//upp接收、发送buffer
; \0 q8 C1 M6 k! R5 q- `0 O- f#pragma DATA_ALIGN(upp_buffer_a, 8)! V8 U( |( r* x& i, J
#pragma DATA_ALIGN(upp_buffer_b, 8)8 ]0 M& K0 r) \$ F1 b- ?

6 E0 w3 J2 N7 f9 Z# s3 }$ c4 j) \5 zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& z( W6 g4 U+ punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 A; ^! I, v: ^4 I( _8 ~9 f+ M8 M, \1 f' M" f+ f" |0 s

1 _5 Z, m/ |( \) y4 |( ~1 v1 gstatic bool server_upp_data_recv(Server *server) % A8 V  a& w# b; N* s/ Z0 k9 V
{
6 {5 a/ N) u' S) b" X2 i, w3 B    if(server->upp_channel_a_recv == false) {7 b2 L" d7 q5 n: N$ X9 a6 ?3 G
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( Q- f2 d& p% m9 O% A% ?0 n        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 M. h2 V8 S) c- H/ w3 V3 B            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 U+ j5 j5 U, x4 }$ M/ W
  w, n8 {" j7 a* o  ^, r- o

7 s" f: N; U' }, c4 o            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* \# ?+ p8 `3 f2 T: F0 r! Q! ^  S0 Y4 M7 d; S
            server->upp_channel_a_recv = true;//
. I) U! B( d* b; w& g            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
) X+ @! s' z4 u: N2 a            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;  N9 k9 r0 x% T! g- @7 I
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
2 f) u3 l8 [7 W7 g            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 E$ D. L+ M! d  F+ ?9 F, n7 P
; l) w5 J( M7 A6 J' l
            upp_error_count = 0;
: c, o/ m" f3 e: D            upp_dmai_int_cut = 0;
  o" ]3 q5 _* I& c  _, d% y0 S" j& ^4 ^4 x5 y
            // fill in data
. J. ]4 r1 U& R* v5 h2 k5 o            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 P! |4 M5 U( Y" i9 z  e            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ p  v5 s! }6 P. O7 t) j        }% Q7 z, {$ J" M7 R8 ^/ H# D
    }
& U8 c" ]8 \. E    else{! n3 H, m* T' K- a
        if (upp_dmai_int_cut > 0){
$ l# b/ O+ u( E+ p            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 b6 e- {' g: u            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' p5 o/ E+ z) v6 c2 P$ I
2 N, ?4 p$ ]4 W' h

6 h4 K6 U9 X' x5 n7 G            //copy data to upp_recv_list_busy
( L$ @( p, }8 V1 B& A" @            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 f- u6 J9 w( o6 b" q
. o  J: ?% C( S' v5 q            //. r1 E* n; ~3 p3 v* m3 {
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' b5 w7 z6 Q2 K2 A( L
8 X/ @4 f( y% N- l  ^1 e( A9 n6 V2 f
            //! {% [) b9 A8 ?$ B& @
            server->upp_channel_a_recv = false;//
4 N& R6 `# t$ o* O" S& T/ y$ Y! \3 o3 o" E, I# Y
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 r6 U8 D% y! g) m% Y& a2 e" L
        }
! H" {* J  d% ?" d6 d2 J3 J) e+ e    }
* F5 d, {. G3 E) W! t. R" i" y( K. k( R% N% P8 P3 f" ?2 M/ N
; h7 w  z. X1 H$ c' J
    return true;
1 r. b+ H5 g, h5 ]1 }2 |; K}; |! Y% B& h2 [# F$ s

% h- b% `! `& ]static bool server_upp_data_send(Server *server)
' t/ h& m+ j7 v( u. {{
% Q# z- F9 X. u4 T) ]' Z0 X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: K" b( ?! a0 a5 W. u. w9 i4 H- [
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" U5 E& b/ X4 W        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 u" W( g  S) n! a9 E7 f" w3 U        char tmp[128] ={0};
9 z4 Q' r* I, @! W5 E
1 J/ \7 u, N+ G2 h# B% v1 W6 q        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 b2 _" F+ M+ y0 D6 S
        print_log(server, data, 64);
6 k" s+ E  }$ c; }- {5 L& `
& q/ L; u9 ?0 m6 m, r- z2 E        //
* K* c4 o3 v/ V& R5 n- L; X. [        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 h+ M* A$ v2 j! }, @/ N
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ N  [9 \! p$ f; |
        print_log(server, upp_buffer_b, 64);
3 c& J: `" R8 s8 `, v! }
, _& ]$ ]1 t/ d( F: G! X3 g        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 {# l! m% N5 y3 C: Q/ Y7 ?
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) S% e, e) }$ E" J" d2 O
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
8 V3 n+ ], Q/ w2 g& N) n! W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, N7 O* ]+ l- G5 R
7 {% D8 ]+ o% f' u8 I+ X. }: e        memset(tmp, 0, sizeof(tmp));
6 O2 f; ]' a3 I& q. ^8 G        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ O. E) X# u; [# I  f
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 N- k; Q+ }; W2 k
        server_msg_send(server, APP_CMD_LOG, tmp);( k2 C# Y( d3 w$ J6 K% g5 M$ `

& L/ _/ e4 B% \2 V! y        upp_error_count = 0;, `7 v2 C& w/ b0 F) c# P& b
        upp_dmaq_int_cut = 0;
# e# L1 u! W4 a( j# o2 a1 |! d/ v        // fill in data / I% E/ H6 P0 Q. v$ U4 k, E
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 \: x  D( R1 x5 o7 k        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 n( L! t' ^+ \& w; _! W+ H
" |) h" n1 U% N  i: B* d& W0 l: ?        // wait send success
/ U; n. `. Y5 o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , v2 j& k1 J; l5 w- }$ F
- }/ T$ O% e4 V6 ^7 D. L. ?) h
        // make data node in free list
3 `7 W+ ?8 _4 ^  L5 @+ P+ o        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) h8 ?% u! r: {. k$ W) ~* j        server_msg_send(server, APP_CMD_LOG, "upp send: success");) m' d: i& K6 i. W6 r, M  u
    }8 u+ @1 C- T, o9 Z; Y$ F, {5 d. T
    return true;
# l" g- [1 J( l$ U; M/ L5 a/ }( V}
- g. b, S' F, e$ M& @- n  c. N  E9 ]5 y* x0 Z
# v4 o3 d5 Q: f- I! A

6 Q. M& P) F! f' ]9 ^# m
2 w7 w/ r' B- y0 b! i

1 \4 U3 T& K& I* R0 d, X5 w4 w( o- [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 r9 }5 z& J' G
7 A4 \& ?6 [* {  }( H6 k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-18 05:57 , Processed in 0.041176 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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