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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ |1 b1 V* b4 j) c: e- Q% d) J7 V+ |+ f. x  a# I3 Y6 j4 x: \. [' X- R
问题描述:
( `! j8 i& N& r9 i+ a  w4 {- X9 n7 U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
  e# b; V, S' g1 J; {9 W  m% X( c
0 \" r& W" w8 U4 n, X& K7 B) `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" E9 x# [5 i8 n) u* B

0 A$ i1 C0 e& x" R  Q" R# Q测试结果如下:
  I/ ^5 Q+ ]  n6 c' r, D- H5 N% S: |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ C1 h1 l% w. O$ W1 x" D" F3 S8 |# c+ R  L+ ]2 m7 A; N; A

, V: M/ H0 c. |备注:9 Z6 N' Y' j" k: L2 y# t) L' i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 [6 F4 p* `8 A4 ?! G' |9 p( m# Z
2、相关代码如下:( F+ u6 z$ Q* u: m& m0 g$ a
//UPP DMA缓冲大小512字节3 s  |: e( {8 W% [! [* q3 Z# c
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ k2 X( m6 \: @& d0 V9 s#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" r& ?/ h0 S. N6 _9 P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ @5 S$ L9 D0 _6 B8 G4 S' l
; R8 k. P9 d* E* ~8 K% d0 I+ F6 b; x9 J* V- H
//upp接收、发送buffer& }7 C0 u9 _. \( q
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 U$ K  p& a0 q, \( x#pragma DATA_ALIGN(upp_buffer_b, 8). |9 ~+ X5 k0 ]

- H) S7 L: t) y* junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% Q" B" e( G0 w& ^8 k/ J5 B0 T- `
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 v3 @. [8 T7 x* ~9 g
; f. B2 |7 {3 G. I1 s
- a5 n2 T! P% H& f0 Z; k/ T& c
static bool server_upp_data_recv(Server *server) ; N: o4 E; ~8 K  s. t7 O% S
{$ o" A( L# U  c+ R
    if(server->upp_channel_a_recv == false) {
' J% _( }; b  M7 o2 n, }        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 g8 ?9 e, j) N3 z, [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: ]4 N1 s# X) w, A2 V; k
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: o/ i, s% p  |# Z. [
4 k+ n  ]/ K/ K

1 A8 L2 N5 w6 t+ K, b. D9 {/ P            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  _1 p5 h9 J: j- f- I

$ ?$ _7 G- O3 ~; H* f9 }            server->upp_channel_a_recv = true;//: A3 p: f7 Y5 {( W8 B6 m3 G
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 J& ?8 d0 M5 o8 y( U
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: p# U( ^  D4 u* p! P" p& [2 I
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 c2 I% Q% X' W0 t# s( z
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. A0 H. U$ n: I7 j& Q6 w
0 G6 B  r# W0 z" l& N            upp_error_count = 0;6 e# e: C4 l' M- V
            upp_dmai_int_cut = 0;3 J' K  K: ^( W5 \

0 l& P% b7 M9 ?6 a; M            // fill in data
6 U9 `) M/ O' Q( i* R  S            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( c# z$ z1 F" G4 B+ g0 e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ ]& \( k8 P  ~' d
        }
' m; h+ i5 l0 w. @5 U1 p    }$ z. s2 m5 v8 R
    else{
" I, c: @2 T" `8 I2 {7 `        if (upp_dmai_int_cut > 0){
& \# H+ ]- s0 ^: A2 Q% @1 ~1 f            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ W' O2 Z7 g( o/ D0 |# w            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# X- g! c6 s( `" w4 b% V- r

3 g, H0 c- y8 h: f
! u0 E7 `/ Z; w5 r$ p' x) G! x$ H, S2 A            //copy data to upp_recv_list_busy
1 b% z" A+ i  `8 a/ m! v/ A            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 I4 S6 e9 S: Y8 H

! L  B# ]1 t) M; q. S9 L4 H            //
9 {  `) l& f1 Z. A            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 {4 Y- S, s+ \- G" |- M2 V
: R- {4 r4 X0 r: a            //1 S! u0 b% u4 x% [
            server->upp_channel_a_recv = false;//
0 Q4 a3 s! a+ }* d, i! x4 @( [0 D9 I( K# e# e; {- s0 W6 y6 q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 K" W* S6 z% j1 e
        }
  ^! `! m1 ]% S5 S& G0 ^+ _    }
" z2 \; Y7 j( b0 v1 a8 Y; C' Z- V. @! u- ^3 h6 R

2 h# N4 Q! g& y9 B    return true;0 P1 ?4 J# k$ g2 z2 S
}
) D: {) W' ]% |6 B0 X4 b% D2 _  k' x8 m: v
static bool server_upp_data_send(Server *server)6 |" Q$ Z0 y! d7 x, h
{
2 V2 F/ `, P5 }4 t% b; Y    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) ^- t  M6 F: g/ C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* z( V& n0 U' k        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% C5 J7 T9 r2 X' U1 x        char tmp[128] ={0};
) @' G7 C; U/ ]
1 R& T) _2 s; b/ l5 L$ F# @7 T" y  C3 w        server_msg_send(server, APP_CMD_LOG, "upp send: start");9 u# w9 e: q* x/ L- r
        print_log(server, data, 64);
- O7 r) \: y: @3 F  N7 ?6 q% k1 R! I1 \
        //
" @* S2 L3 h; w/ g( y        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 F* }) C/ W8 ~4 z        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ }+ Q3 y5 J( W
        print_log(server, upp_buffer_b, 64);
; F/ k4 M' C! Y9 [2 I. t8 ?( U. y3 r4 q3 B. c" w! x: _# {6 U7 k' o- x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 i3 ^! j6 r3 [1 h/ I        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) k, t5 \/ _; C- o  P4 c3 _
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 Y0 H% f8 t) I0 Z        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 E- u6 |& I# u7 t: ]( T) y) O2 [7 u2 E- J5 T% R; r/ u
        memset(tmp, 0, sizeof(tmp));& p: l+ v4 y( |
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, g* B0 l+ {; d* D  d            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 p- n! L, x! w' J  X* }4 ~        server_msg_send(server, APP_CMD_LOG, tmp);
5 e7 d& t: K& r* `  }* C4 y
) S4 a. p' h* g' c  r1 e7 _        upp_error_count = 0;
  a. ^+ e* V( _. {3 v; L        upp_dmaq_int_cut = 0;: ]- W( ~/ c: p& Q9 S& F7 B9 D( B* |
        // fill in data
8 b3 G/ t% r1 q* K6 V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
! `; F1 i2 I6 g! p        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' J0 e( z+ N2 s* s9 j+ b! b, \+ h' r. m; Y' f. _; P$ z
        // wait send success
8 x6 w' u0 h0 e7 ~4 B: B5 m; K        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 V6 ?& h( d( a+ A2 |, f( Y5 u  g4 v  I9 u0 b
        // make data node in free list 7 f; ~& W: v2 j, Y# f
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ o! W" q! F% V
        server_msg_send(server, APP_CMD_LOG, "upp send: success");' ?# b" ~( C5 I
    }
# w+ t3 {8 Z: s* ?7 i' G    return true;8 T$ `5 n$ p& R: c! a5 L) z
}
7 Q1 \& y+ f* ~3 {& v" u. K0 q0 S' e0 H0 k! d1 q* ?& W* h

7 {7 ^; S  Q; W* z( n+ f4 b1 K
1 e! A' {# Q7 _# b+ {

, J7 [* f0 W* D2 ~5 h$ P
: g5 A: g# T# K7 R4 a

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐) `9 u" f6 z3 ^& N

7 E4 A8 O  I9 H: ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 16:48 , Processed in 0.042646 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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