138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - d$ d. S" H3 v$ `: ?
9 C+ |5 q4 ~  W/ ?
问题描述:; E" _+ r2 W8 N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- N9 h: b1 ~8 r' ]7 z" k

. R, |. d8 H# W- M图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ A! L( d, \2 ^$ m8 |
/ K3 I3 K- c2 \* j0 A
测试结果如下:
3 m4 Y" C2 F$ U' y4 I138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* o1 f; a0 z9 ]! H" G. H1 y# C- G+ u; n2 R
8 }3 r7 z0 a3 O+ ?0 e) U
备注:  y/ o8 Z1 B3 t4 v2 x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* p3 A5 m# \5 `4 F" n% v; r0 o  `
2、相关代码如下:
& X$ b" i$ w' I7 F, h9 k' F2 M//UPP DMA缓冲大小512字节+ ]+ S3 d3 F, s+ \* y$ d' R$ E
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; `# v8 J8 O( [# M6 `; ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 Z3 R3 Z! K) A6 ]; H* M8 h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 B4 p' \9 n) M& e6 D6 f7 j/ c

7 }( r9 Y7 W# r- o1 G" z( \//upp接收、发送buffer
  [7 R+ r- g1 w% _- R#pragma DATA_ALIGN(upp_buffer_a, 8)
9 ~$ f" V5 P9 J, W#pragma DATA_ALIGN(upp_buffer_b, 8)- `$ b: |9 o2 A/ }$ K
8 V3 k. W9 j0 p- C0 n5 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! s) _. u! r4 U$ T0 q# N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( R3 d2 I5 U7 g) I% k+ C5 g2 i7 G  z# C$ A0 d, h0 H" l

3 b( V% b- ], D# Hstatic bool server_upp_data_recv(Server *server) ' h" |. d  w. m1 j5 ^3 a: B6 U
{
! L; {5 W4 X7 _& Y5 y    if(server->upp_channel_a_recv == false) {
' J6 W2 |/ I. p% \& ^7 N% K        server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ ]  I' c! J& x) }4 l: {& ]* U
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 n# i, `! R8 N: G  b( }3 E# U6 A: ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( L( r0 ^* U+ o# n  c2 D1 p7 x* c2 N/ N/ ?) ]
# o4 l9 y8 H0 P1 K% C& C" F
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);) F. t2 P# g( Q4 K  \9 n; N

4 n( V0 C+ J, _2 s            server->upp_channel_a_recv = true;//2 m: x! H- y* M; k1 R. I8 P2 }
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 M- L( ?0 h* u& c) C1 c* m; B            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
) ~6 }8 e, o; J- ]# q  J# q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" D2 G3 a6 H% P; E( g            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: {0 e' v! W& `' Z+ m
. c* e* F8 n7 d* E' H# n/ u: \
            upp_error_count = 0;6 t1 O0 p: a% \9 {9 K* G1 v
            upp_dmai_int_cut = 0;1 C/ V0 \" J& u9 F5 S+ O( i0 b

! t4 @1 `3 m9 f- Q4 M" n7 r$ T            // fill in data 5 R; N5 j0 A* N, j. N6 D
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  ~; V5 M7 `0 w8 {$ b! h- I
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- ?1 Y1 d% X  g7 ?
        }. |' i. t8 E+ Y4 o& b! \! Q
    }2 W6 O, U0 A3 }; h* B, w9 m3 _( h
    else{
( Y6 s: ]- k( m        if (upp_dmai_int_cut > 0){
4 N4 ?4 c( o- v# W9 b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 [8 `7 k/ @! ?( N) o7 B/ [
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
8 Y4 h+ J; a; U5 t- H, X8 r( \. I4 E
2 D9 D) F3 v: S7 M7 Z; k# \
            //copy data to upp_recv_list_busy+ m/ O- I; b9 X4 i% T: c
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# b2 @* m" ?( [; j% H9 G9 i6 c0 E$ E, V( c+ ^9 d3 n! e
            //3 V& ^7 Y# t6 |! Q# b
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# A4 s" S% c% Q  W" U. |

+ L, {1 t" ?) c/ f  j            //+ c! j" g6 \5 w+ i
            server->upp_channel_a_recv = false;//8 r; a3 S* T  `" }, O2 [
7 B7 ^3 v4 K, ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 Y2 k2 q+ q& n8 B7 `        }0 q" B3 \9 s7 @1 H
    }( s3 J1 o# ^+ {

. \+ v1 V6 x: M1 g  v
7 a; i2 S: ]/ P' `1 O: W: f    return true;
+ e2 Y" E  u8 [: {- x1 ^}
7 [( v8 ]) z- m, q* _9 P
$ I1 q+ @# H: J8 ?+ Ustatic bool server_upp_data_send(Server *server)
. X% C! B$ i; ]' K* w% U{
/ E% o0 _/ c( ^4 E- X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( c: a; }. e& x* j4 C9 C" x& u( }        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! o0 g0 d5 V! r3 B6 a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);' a& t$ \# Y2 m* D8 z% @
        char tmp[128] ={0};
/ j5 _; b) W! `% ?3 k
2 n& o2 H! ]9 _* Q0 r- Y6 i        server_msg_send(server, APP_CMD_LOG, "upp send: start");' T5 A$ ]5 m" u% ^& t5 H0 b; ]
        print_log(server, data, 64);
  X4 S. m' O. n3 l8 c4 x1 W+ j' R0 M8 ]  Y' r, b& e2 a, S9 B# C
        //6 f; O2 g3 y) z2 Z' O
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( P0 j5 e- f( U1 m5 t
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" ~% X: c2 K! y( _. T. E- _7 `
        print_log(server, upp_buffer_b, 64);" Q/ h8 I  H6 h) ~( L5 c: @

5 N  l. x% A3 F+ b* k! N2 e        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 z/ q( J; p  N% S; w! S5 [
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 r  `& W' d5 ?
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
8 e7 r7 Q4 s! N0 q        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 T, s& r: v1 Y' h! {, X9 u( e( p: A% q8 h
        memset(tmp, 0, sizeof(tmp));
: y4 T6 Y% \8 w9 T. }9 O. o8 _        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 y0 T2 s" B4 G, g% t6 o
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 O$ B7 I' {- M) `$ x
        server_msg_send(server, APP_CMD_LOG, tmp);- a0 t2 j& D- u$ Z. Q" r) p
2 B( m2 W8 j4 D: D$ w& A  U
        upp_error_count = 0;
3 @" m0 @# ?2 @. U* n4 s        upp_dmaq_int_cut = 0;2 x3 ~6 }' e, V: `* k
        // fill in data 2 [. v5 T  d. \. ^! Q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 R, N$ L, K' y$ J% y* B        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 g/ f+ N, M+ b* H+ H8 N4 c' M+ y( z$ F4 u8 V7 N( k
        // wait send success
# j3 w+ K+ ^: F$ ^/ ~        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( h3 A0 r! z/ j6 b

+ u5 C, k7 ^& \4 T4 T7 o        // make data node in free list
9 j) v6 }3 a# L/ H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);  R$ V% o# g, q/ e6 d6 S, \
        server_msg_send(server, APP_CMD_LOG, "upp send: success");) Z4 R1 W1 Q% B( _2 Z
    }
5 x- p( J1 Q$ F3 \/ T( E    return true;
- T/ R9 R! M) w' h}2 V8 j  g! }3 b8 h8 e
; L% k8 Y/ z6 B1 V
' Q* N: o/ c. S, E

- t9 m! t+ ?7 n3 Q

3 L7 A: t0 e1 C4 `7 E( K6 P" D6 P$ l

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% J. l+ ^2 G. h( V8 _# u. B
1 {6 t8 W. n) M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 16:31 , Processed in 0.038494 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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