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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 o: R* f' e! Z$ w6 E/ C/ d" P, d

, Y% ?' J5 R; G, P; a  V, C问题描述:- t# q  f: E$ v" c9 u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 o3 T9 ]( l0 b, s2 n3 `  x: u3 Q+ a! g5 d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 j' P( l6 ?, U2 A- G& \1 c% j. P% h' W  H: d, c; q% o+ `: V
测试结果如下:& k5 D7 f# a4 e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 u# u, Y$ o4 Y2 ]: y9 r- m
9 |: U9 M" {. P0 O" Z& N/ b9 A; n9 O- v# L2 Z+ v3 s$ U3 L. V
备注:  w6 U; W  g0 ]8 I1 k0 W! {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% r/ O# W* M/ h, |3 e$ o/ s/ ^5 o& {
2、相关代码如下:$ X8 G& K( L/ F. J# U6 w* B
//UPP DMA缓冲大小512字节2 P$ _- l1 P$ \; f' y
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  n+ D; g  |. e% r4 V" X- k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 u, \" l  U; z* j; c( A0 m#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 x+ ~6 h) U1 k( D* R1 V$ y
( J7 z" Y% a% U7 X& \. E" c2 G1 s- g+ G  H- p3 ]' c
//upp接收、发送buffer5 ~) D/ m% s! g
#pragma DATA_ALIGN(upp_buffer_a, 8)- Y$ l( `2 _$ t$ M
#pragma DATA_ALIGN(upp_buffer_b, 8)9 I4 ?+ c: F* R' i) K
) f  j2 q. B. T
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 B7 K0 Z! \( e8 e+ d3 |& r" I% s" Bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 c  k1 T" E5 I8 ^9 S
/ [1 r( c1 `: S9 z0 z
  I$ B4 h( h. I  ]: R8 s$ Mstatic bool server_upp_data_recv(Server *server)
. v- X& U0 |) Y! R5 b' K; |. q{
- ?9 R: f2 A8 Z7 H6 p1 @/ O    if(server->upp_channel_a_recv == false) {' i2 g9 J  e/ ]/ J
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& ?1 f: I" w# O
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 U, ^: m# o: ?8 y$ R8 V2 T) _' G
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( O% F7 e" ^2 b- g- v! t% P
- `" y6 f4 r7 F* x1 o2 ~3 b$ n8 q

$ b$ o3 I2 c  V! d4 u; I            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 m2 ~$ }% z% Z, h' r- I
8 [/ F2 z" I/ s  |1 m/ ?
            server->upp_channel_a_recv = true;//4 `% T2 K/ f) @
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( s; g/ _% m# {8 E. h" Q
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 g# W) R/ v+ G+ j5 Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) o8 _! A/ X/ K7 E9 y0 g- N5 o
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( S0 q. n* }! e+ E
" N: N+ E7 m% Z            upp_error_count = 0;
& O( k5 Z* Y- l9 k0 }! n' t            upp_dmai_int_cut = 0;6 w8 L9 W- k. T* u, j+ e

% V3 {6 U5 y% u+ y6 x& K& o            // fill in data
* w' ?  }4 A3 n1 w# n. _3 d            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 W$ N$ z2 u- M% W1 D* j
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 S/ ?/ \4 ~9 e! S8 D0 T
        }8 Q: `4 m1 i% I/ V0 o2 Y' V
    }
6 M; V; A# [/ E5 Q; J5 B    else{
" ^" ]& I2 F. Q' \& r        if (upp_dmai_int_cut > 0){
2 k0 u+ Y: o2 k( l+ K/ r% L  r4 M& e            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# L) _; |2 b, s- u' h6 m4 u. B
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 w- X+ u( j  \$ y

* V% B5 q6 [% L6 |1 C
  o( R+ C% Z( y: K1 _            //copy data to upp_recv_list_busy$ K# A) e; J$ u" U7 ^" S: I' T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! }( p6 ~; {7 Y
. ?) h* _: m2 q% C            //
- ]! g! X  D* J; v            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ F1 C6 Q+ Z" R4 V
* b1 D) s( ]9 |' O! ^7 L
            //
3 V9 ~! E( Y; V7 _0 ^            server->upp_channel_a_recv = false;//5 q  s( m+ M9 l6 f/ W0 S/ c

8 ?: ?: ?; d5 b) D) u4 I, \7 x            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' g+ [( q8 S& k5 r# K# T6 i        }
% J8 P' m3 W  A5 e    }
1 i# r' D+ K" e
: r* F; n& G0 B
1 Z6 X; d& y6 Q: g    return true;. [' ~. F) V9 y1 H1 p
}, M7 Q* J5 m# H1 x# L& h: W

0 _- y+ X' H! |. B8 t$ Qstatic bool server_upp_data_send(Server *server)5 e0 x/ @1 _4 m8 R- H$ O
{) n+ z# ?5 L3 _+ S- R8 k8 p6 t
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! M% R' l" s7 j( I$ }# f# }  \        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 c0 O& U& U! \3 R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ ^3 B0 E# Z" c- ~" b2 ]/ x        char tmp[128] ={0};+ C% l4 |4 f; p# j
5 }4 H+ P0 S- w% U' q6 w! e
        server_msg_send(server, APP_CMD_LOG, "upp send: start");( O5 T7 I1 Y( \5 _4 m
        print_log(server, data, 64);
2 P. U2 ^" L" A! Q) b3 Q% z3 ]# r
5 K; y  [4 q0 S' i$ Z( h        //
6 f" C" K) m6 X8 |- I/ W! }/ d        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* r) y8 O; S9 p' ]9 t4 J
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ O6 n' i- j6 I
        print_log(server, upp_buffer_b, 64);/ V( U; _2 o3 M0 t9 U
6 F' `6 S, P  w0 O  }% A% i
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) b$ A9 X3 A  D3 G; S/ j5 a
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
4 m1 x8 J$ e9 x4 x' X        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( Y/ `. s9 X) T4 a        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- e2 z& j, r( C! S

/ L! E, a- c, f* l        memset(tmp, 0, sizeof(tmp));( S' P4 a/ m# ?5 m% \6 I7 y
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * Z4 n! q8 u- V6 _6 k
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ C0 @9 z  R1 ]! ~/ v/ P
        server_msg_send(server, APP_CMD_LOG, tmp);
. O' s2 c) q+ d2 ]6 M+ s3 D) j' z6 a$ O: Q
        upp_error_count = 0;2 a7 v5 f+ W+ q* @( C
        upp_dmaq_int_cut = 0;' F% q, e4 q. a" |, L8 V2 {2 }
        // fill in data & t0 N$ E) _, _2 x( y
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 x( y  [# O5 n0 l' m
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 w$ ~( i8 g. [4 d2 V+ u$ J2 @! q) |: H0 y3 D4 v
        // wait send success
1 K2 k& t0 p' D        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) I7 `: k! \7 L. I  c1 {# g/ d  v# [
        // make data node in free list
* A! k0 c4 \" z" G& M' p  A( P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ ~) l  z) }5 I8 x, `        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 t; X. Q7 V1 j% [! P  Q! i0 k
    }% r# `6 }( ?( ^6 ]* g. C3 V& U% x
    return true;) x: r9 Q1 J3 |
}$ ]% ]: ~9 a, `3 s4 c

/ S# k& x" o, Q# ]7 ]* m3 }) |

9 _* `% N$ }9 _6 [5 ^/ ]2 |$ x5 l/ R( F2 I: d, N# V% w

- X% C% j3 R& E" @7 I* H8 v
: f& [1 M/ g4 ~! F" ^2 @# O

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ h- H# }2 G) f7 I, L% l% N4 `+ s/ B! M+ Z* ~7 N! O# `! Z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 23:29 , Processed in 0.047053 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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