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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , E( F/ m( b+ P" e; q( z* ^

2 |0 ^; d, E0 s; T问题描述:/ U8 k: |! l, |& f0 H' a" P
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( w1 t7 \6 S9 t- v  \  ?2 h, z# ]! z, c7 v" k" a7 _* |
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% P# {5 Z) B0 V& N3 n) [' ]9 T: A- k+ Y1 t
测试结果如下:
9 B! H0 e- _- ~138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" @$ i8 n1 j  W& u9 d
( k; K$ J% M& g% i0 D' {3 F8 W( A

' e+ d) W, M5 A8 f备注:9 W7 C- E, l# ?$ ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 p9 l% M) \7 P, Y
2、相关代码如下:3 V6 Q$ a: R; A4 h+ a- N
//UPP DMA缓冲大小512字节
6 p, s. F& i. P8 c#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! X4 M$ s4 }2 `! W4 g9 Q! F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- N5 M( p5 i" M3 J- N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% a' t% V% A$ M8 ]* Q# \: K0 p% N

" _1 N- H. M5 o& G
- a3 S2 g3 w! Y! R" S//upp接收、发送buffer
& v$ w0 ~  X8 {#pragma DATA_ALIGN(upp_buffer_a, 8)4 \9 \: b" t6 p
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 w" o' O& q# n
9 }& z9 R4 t/ funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];5 n* }+ @2 P  C0 u+ U6 e
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  ?! x- F! U1 u7 E

* j9 ?0 v# G6 i7 m! J0 k
8 H8 T) [4 g+ G- b7 O0 \. Q9 Wstatic bool server_upp_data_recv(Server *server) # N3 T: P% F9 a' B5 W% o  K# J+ L) Y' y
{9 w% ?& c3 Q. y8 N; N6 F
    if(server->upp_channel_a_recv == false) {& _- I1 N& [) K( d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: v# y! T6 H1 l9 K) s. w; K
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 L5 q2 _+ M( e: k2 A
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
! F6 o! Q2 k3 ]4 f' r7 D6 ]: N* V' a2 k2 k3 c

' \; Z' M' X" E2 E            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ X1 r, r* N1 c6 C0 R: Q3 C& f7 g* Y3 V$ j% r
            server->upp_channel_a_recv = true;//! H" B9 a0 M& S( t, ^5 y" P" b" h1 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);. z( w5 Q& K1 R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
4 R* k: |' e. z1 J            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) Y, U! Y2 R& b7 q2 @. n0 Y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: }! O! r2 `$ [3 A0 ?, P
1 s6 N" B0 _: r
            upp_error_count = 0;
# \5 w$ P5 J4 ^1 }7 S2 ^- b$ [            upp_dmai_int_cut = 0;5 Y3 p- y$ I& O5 Z4 g
, S" Z- N! q! T+ E
            // fill in data
$ k0 y7 ~! f5 `' i" h4 H9 |0 @            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' U# h8 o( X: {# ]$ j7 Z( z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. K* p, M$ z' H5 L9 Y" e$ D3 e* Z        }
# B$ a  ?+ i& c2 s* p6 U    }
2 x9 @; z* S" e' h5 X0 J    else{' A+ `4 q7 {/ v0 o; g5 L  ~3 }
        if (upp_dmai_int_cut > 0){
; n7 l+ `( i0 M& K- [7 ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 T* y; Y  U, @            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 g' U0 J& Q, n# i& N
8 K; ^( i* ]) P! x0 N

% \# \# O/ p- R& W1 O) h% m: Z            //copy data to upp_recv_list_busy
1 W9 G/ s2 k$ d9 P            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; I& E, s  c* P5 z$ L# s/ V6 X0 ~9 ]6 p# g' C" ^3 T5 F  ]( E
            //
9 c( X/ a5 e4 N2 F            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; [% Q* X/ C$ f, a

- P) H4 y1 u: e* K5 n            //
3 L: J* G  U0 {  s3 \            server->upp_channel_a_recv = false;//
  X! u1 [5 r8 \! g( j$ I7 l3 T
4 v1 w, r, L4 d5 i# i' f! l7 Q9 o            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' S/ \/ r3 b; ^* p* w
        }% _9 G7 Q. j6 z7 O; |5 _7 T
    }5 k* w7 S3 a5 _7 ^; h' g. z

8 G0 o2 |; X0 K- v! j# e! L
* w  V8 U; k. |9 I0 e' J2 S    return true;
, F& L" w( r7 u6 z+ t. d}
# n; U+ ], g; p8 @
: p$ E0 b( M; b9 mstatic bool server_upp_data_send(Server *server)- j5 o) \! l7 r9 r" |
{
# d" B% w- M/ c" ]6 |7 @8 j/ q$ s    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' U5 r" M% J8 {  J# }        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) J; v" E9 C1 v6 `+ M. ]        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);4 @2 W+ h$ C" p% G9 t2 F, x
        char tmp[128] ={0};
$ b: U! _' B- X3 S- Z! k
. t" e, _1 a: t  P        server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 U  f' w4 a  R: q$ {3 a  |        print_log(server, data, 64);9 C( X* j- O) M) ~( t" F9 R; F; q1 [
0 w6 e- Q2 g+ \" p7 m6 V
        //3 b  G3 X( P8 W
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& I# d5 i0 a: z: S, K% u
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  q3 T) g, g( L' n) _. J+ w
        print_log(server, upp_buffer_b, 64);
) W  Y' c$ I' o4 N8 r$ E" W/ z4 |
( s' }5 K* }' g/ t) Q$ a8 ]        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
, ~9 M1 V) ]( R        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( N5 O$ q6 e& x        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;3 Z0 w/ [6 v' c
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. @) i$ d4 w0 k: O2 X
( g% @7 P( A( Z; s! y        memset(tmp, 0, sizeof(tmp));
. q) ?5 A( t. m. U/ W/ l        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 ^1 A+ Q) }7 t/ q8 _4 Z, v7 h; t
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
* ~3 T( y: ^/ P% D5 v$ S! z: [        server_msg_send(server, APP_CMD_LOG, tmp);; `& j# J1 t) I, b

0 g+ q1 v0 u- F, L        upp_error_count = 0;' n, c9 ^; V+ s7 G) k. u
        upp_dmaq_int_cut = 0;
* ?. ?3 H& M( W4 U        // fill in data
( g) D& j. f3 i5 r, Q, |" F, W        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& H  k& j+ q- }: P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: n. {( Y( v) ]& G5 U* v5 Y- n- [- }
' c1 Q/ r2 S& K  m% [3 ]
        // wait send success' ?8 H. ?' u: J/ O" i/ h) h6 R  M; R
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 N9 {/ m& M& {' Q: L3 G$ z, a
* C5 r9 e& r' z        // make data node in free list
- E: D6 W; t" r$ u, D# |) T9 B        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 Z9 v5 C% W' n6 j& o/ @
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 D6 S$ k7 J+ X2 ^
    }
7 O  q; _2 p- Q" `    return true;8 W* y* T, y% e8 F# @
}
9 X# @9 i7 L  ~/ H! L3 W+ P
0 T: S. ^0 L( O9 ~6 Y0 M( Q. y% d3 J  ~
9 }  ]* d, H, N6 Z
3 R/ p. H0 n9 z, j0 Q  L
0 i" R! B+ D* Z$ o0 V# e

' C1 m; a" s( W) i1 S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
1 e: Z) `# e3 g) g% A! R1 N4 b( ^4 {# ^2 A

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 21:58 , Processed in 0.043220 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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