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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) {7 h6 ?' ^1 p- h" c8 w2 y

# H" K+ K: s) ~, Q4 h6 T# A3 s$ x问题描述:. j1 D3 q$ p# r4 x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 F& S7 Z* z% J" Q
) [; F7 h1 ^: h6 r% f9 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ y) ?/ ~7 s6 A4 N" Y

' T4 x' o' P3 R7 K# P测试结果如下:
4 Y. q' h% Q+ ]6 X" y0 B138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 l- r3 \% N% `1 Y% v6 b. U. P+ a2 e( {
& [( s6 T% o7 ~. v. B* E5 T
备注:+ a2 B( u8 c& Q" g+ t1 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, M3 t/ W1 c; S0 H; @
2、相关代码如下:3 s$ T& ?6 y; B
//UPP DMA缓冲大小512字节7 h  P& ~/ b& ]  Q! d  \% G, e" Z
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  b/ H; ]# ~1 l6 U' P/ z! m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 U7 r4 G0 @; {/ \' a1 t; s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 y, c  s% y; g+ c/ a' r

4 m1 t9 U5 K% q' l( L- y5 [, Q% S8 o: W
//upp接收、发送buffer
- |' ^7 F2 Z2 Z$ d6 {: m5 ~* o0 b#pragma DATA_ALIGN(upp_buffer_a, 8)
  |# B( k( ^4 B+ v#pragma DATA_ALIGN(upp_buffer_b, 8)
. s+ Y2 u; `6 [+ c2 k
; d/ ~; ~- W$ o' uunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 x9 |2 X1 }1 Nunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 p* Q1 I4 |' N( P2 ^! d7 K9 a

7 T6 Y- O7 l9 m% V5 ~- h
7 x% P9 |4 w& z+ F1 [7 vstatic bool server_upp_data_recv(Server *server)
/ C/ }0 }! o( }# h. d) ~# v7 }0 {{1 U0 e( r2 O, v5 j$ I) K6 j) z
    if(server->upp_channel_a_recv == false) {( v, y# g1 o2 D* Z( r/ Q; c" `, `' l3 \) r
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ e! c3 L/ Z3 {. y$ w' A) C/ i        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* l8 c1 e" N3 B+ X7 ?/ {4 o
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 z: u+ m. K8 C+ \* i8 A+ a6 L  Z
& S! M: Y9 h% {, I" W
% W% Y0 B  a4 c2 n- _) H, S+ e            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 i4 A( O& @3 i3 B0 m! t+ i9 L1 t8 M' P9 f0 [  t9 u0 B
            server->upp_channel_a_recv = true;//
0 ]% X& Z* X+ c/ u& o# z+ f            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' u1 r: p+ R7 j; o" H  ~. v( g' H            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;4 h- B( f9 h" F  [+ z2 t
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; }9 g5 m+ X, {# ]' C$ f4 X4 u            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 h: [$ L2 k( Y3 L
  g! G8 F0 d' i' R% q/ [
            upp_error_count = 0;
- t6 p; P5 M+ K; Q, d            upp_dmai_int_cut = 0;# N3 _7 d2 y8 Y: R
2 y1 {# X: z+ s! p# H3 b0 w
            // fill in data 1 c7 i+ R8 _' |
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 d8 j7 {( F- c5 d) ]7 Z) V            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' c* z7 X2 |5 D* Z+ v& P. i" \
        }
$ g* h4 D2 w, r; X5 F, M    }
; X  q2 S: R8 E8 l& V    else{
& F2 Z* `5 }9 i, B        if (upp_dmai_int_cut > 0){
5 e: a. \* m- `8 e+ C7 U1 U9 [            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' a/ l2 M8 s% b- k& I; P1 o
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 t" I8 w$ k& E/ e6 Q0 U

  h4 h- N  I6 T2 n
" a$ o; F8 Z8 n+ o( _; d( J( {            //copy data to upp_recv_list_busy
8 _6 T* g5 e7 T5 [1 c            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' O* x3 p& s7 I4 {# a1 U6 w

) L4 a( k  x7 f* }1 m* [  L            //  t5 H4 T" v- X, d
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; x) G) N+ f4 V
+ }* @+ J) ]# i6 e" w! p3 k            //! @" E# z+ ^; ~& c
            server->upp_channel_a_recv = false;//  k3 [" l' O) [; T: k
9 @* B7 s5 v+ f
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 X; M6 m) k" x6 r- v3 ?! W        }) l; r( n; ~7 P
    }' e2 @$ Z' P& k( h

+ M7 e' ^$ ?1 B/ w' Q4 }3 g+ \* P& `1 A5 v5 @* H
    return true;
; [* x- j! f  v* X- u0 s$ {}
' D( D. J# G8 l$ D6 \) J+ ^8 h+ M: {
static bool server_upp_data_send(Server *server)" @9 {8 s' ^, `- _
{
- B0 j$ C8 r& G3 x6 @    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 o# V+ `8 _6 i, H
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 r0 a* S4 e( k3 t. a! h) O( L        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& m$ l  @1 o, R
        char tmp[128] ={0};3 Z/ V  v8 @* q+ ]5 k. E$ n8 T

- {; G2 W7 x: ?0 e4 u        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 e7 y; u7 `1 T5 r+ R& m9 d        print_log(server, data, 64);3 O, _7 k4 Q; T
9 n) Z, i7 S( q: C" f, P
        //
5 g. e% i! J. s3 l& _        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* X* E  M/ r/ J' e7 D
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; j# u0 Z0 t7 Q8 y7 o        print_log(server, upp_buffer_b, 64);! D8 h4 z0 I9 x1 y9 R8 Y
9 Q4 ]. G: k/ h7 R2 k( f2 ^
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 c4 [- {" W0 t  ?
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
, X* @. C6 O; b6 |) \! d4 L9 Z        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; ^. o9 r& H1 k
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( }4 K' O3 K4 \: ~  H4 ?1 I0 @& g
& C& j- n. Y, E0 g- q3 W# l
        memset(tmp, 0, sizeof(tmp));
" P  O5 a8 l# y$ N% o        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ! x0 T7 V" J$ o5 U0 H* G
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ I' a+ l5 p: B4 D. k) }7 X% B% f        server_msg_send(server, APP_CMD_LOG, tmp);
/ z! w7 L) d& Z! h1 z; X( @0 c) W7 V+ \! l  m
        upp_error_count = 0;6 r( {9 Q5 Q0 J* G
        upp_dmaq_int_cut = 0;& b8 m# D8 D( X4 ?7 ]& M
        // fill in data
' R9 w6 i3 {- v- u- r        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , d% M* E1 g) @& [$ f  c9 i
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- l6 I, e+ e7 w) s/ U$ H- t; h$ x
        // wait send success
* Q, U) Q$ G; ]; Y4 @: c: a        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ d0 J% @7 ^  i# Z# j+ }( h5 G: {& O" @: l9 n" c: k5 s. \
        // make data node in free list
% \0 u2 _) _' k* T        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. u: _, l. _; v7 U7 z        server_msg_send(server, APP_CMD_LOG, "upp send: success");) l8 s  m4 @8 d( t
    }; e( a! E% n5 p" l" L7 A
    return true;* k# |7 C3 x( r4 B6 F4 d* E' r$ o
}
% T8 ~/ X/ `9 V1 M2 I6 h) u
" o5 |' L4 r. I2 |; Z6 P, L

# P# i6 P, H; B6 c8 {
; H  l5 ]+ m6 I6 c

0 ?% s1 L( A( l9 y6 s$ E: k  j) E( I" Y! J, h9 B

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
2 p, U6 n7 q+ R' b; r/ d6 U
, r- J; v8 M& v

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 13:45 , Processed in 0.050295 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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