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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) y3 \1 f8 r5 W$ \
; k7 N5 Q6 {; t4 M& W. d
问题描述:! n9 r( e% v& u% G
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 Q! y- @2 V$ q6 E) F2 o
; F% C& }- @; U1 B; i% ?
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: u% [. m& |7 Y/ _+ Q- ~
* ]7 d4 w$ o* D; u0 E, J
测试结果如下:0 s9 ~- C; |' h( M
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# `! w5 X) B+ l9 N
( d4 `/ j2 F. s0 D9 X; b+ E

8 K$ g3 k- D( |5 U  I0 a备注:
3 U3 @, B1 A% |# j; }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ Y1 s) y8 p: f/ B' r# v" Y
2、相关代码如下:
1 x1 r2 }! w4 Z& Q& @4 J* S//UPP DMA缓冲大小512字节1 b* O' |# C, C0 s  n5 X$ t. A
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) U/ X& E% N9 n0 i' B1 v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 t5 J' ~, _4 y, s( P: w. g: H! a; e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# r; f) @4 w4 B% v, c2 I
6 z' e: f8 Z* R4 P3 h

: d, k6 i. x/ x* ?, l8 b2 f//upp接收、发送buffer1 {- U& P7 G3 P0 M4 ~
#pragma DATA_ALIGN(upp_buffer_a, 8)
# G: L+ ?% z: }( R( @) Y' ^* L; i: b#pragma DATA_ALIGN(upp_buffer_b, 8)- |" l1 W, N/ \1 `4 z9 y$ @8 r

! P/ Q# `6 @. Z/ F: j) Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 Y; N, `( G* E+ W! H2 A, j) [, x
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
! K; {) Q; L7 o3 V3 L) j: T0 I+ R  ?$ V& j6 U/ D
3 S! e2 D9 I- t8 y2 G
static bool server_upp_data_recv(Server *server)
! b5 z! A7 q, D2 D$ b$ Y. C7 g3 ?6 n: \{
( U/ T" G5 b4 J! R* Y    if(server->upp_channel_a_recv == false) {
. M4 [2 w5 N# b- g% |, b$ J        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& E3 e; p# D3 v( n9 E' y        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 D, ?, a! ]6 k( r            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 v: Y7 l4 x7 K6 i
8 |9 Y- T6 e: Z

) D% E* Z) I3 Y1 m% Z6 K% @            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 D: B2 f2 o3 L% p5 u" @1 D
$ V7 C' O! S; C9 P" D            server->upp_channel_a_recv = true;//, J8 L# l, Y1 R& ~  e) G4 y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);# e; T8 B" f' O- L$ O
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
; D1 j! M* i8 m- Y( N, X- o            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
2 w; Q/ z) a* ?% Q" Y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, y9 o: t# o/ t7 u" I3 c* R0 j9 j# i) j3 b
            upp_error_count = 0;
3 p0 r. X# }, E5 P' G. r            upp_dmai_int_cut = 0;+ ]7 f# Z3 D2 Z  g2 t7 ^* F5 j

* D$ w1 y$ y. i" A* f( }- @            // fill in data
6 c4 N9 u' `. v+ ^, T3 ]            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 b4 y9 H/ ~6 F3 b& F            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ b8 Q* ]& B' I- }, r8 {        }9 Y7 B- `4 F3 `7 Z7 }
    }
! K4 h; `3 G- G* V  H: E+ F0 Y    else{( ?" l( T" c8 E2 e3 j
        if (upp_dmai_int_cut > 0){
; g- L+ m/ K/ A) `            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ ^* m$ L6 h5 c4 u6 b4 m
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- l$ ]. b0 ?6 r4 L$ c- b) U
& k7 A) A$ D' Y+ W+ F8 V

/ \6 Y; A; \3 g            //copy data to upp_recv_list_busy# N# x3 e$ ?  u; ^9 j& x
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, ~6 P/ A5 B1 J: }) |( r- z, A: @8 H8 R4 o7 o5 v
            //
/ P9 V4 X9 A7 y, `/ ~( L            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 d0 ?& U8 x/ s& q3 K7 O/ ^4 ?/ Y0 G
            //
9 I+ _& b" p8 @% q( q8 B            server->upp_channel_a_recv = false;//, g. k) x; p5 d7 s1 o4 E+ H

2 D9 Q/ _' ?' x# N  _            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 i6 F5 z- [: F7 e9 A; N& N0 f        }# D! I$ F" z% A% g2 H
    }
* S4 ^" ?& j1 k. \  G
5 r& K* v7 w, M
7 e* O$ {1 m! {3 _( e% h    return true;" M$ d  r8 h' X# K! b3 s
}! Z( n) Y7 V! s, r7 I

: \& D3 I7 }, a5 Y' t7 bstatic bool server_upp_data_send(Server *server)+ o5 N: q0 @* j+ `
{
+ W; Q" l9 r2 p! u    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) i- `* [! t6 g# d1 z, \. _
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" I. V  f, m4 N5 V0 v5 ^        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 K0 A/ v% @6 [7 W+ o2 Q6 g
        char tmp[128] ={0};
' p! u* b, _: v$ t5 Z6 p7 \+ Q" g' x0 L& I. k
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 P/ Y0 y- l1 s, W' b        print_log(server, data, 64);& y% Z$ {6 k0 V1 y
0 {2 _2 g9 T- {
        //
6 K  A: \: n) ]/ W# J9 d, V! y- j. V        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ Y0 J8 }1 Y2 q2 a5 n) C3 l% g9 T        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 y9 K3 l2 @: u" d# D& s0 B
        print_log(server, upp_buffer_b, 64);
# N! I  d- O0 B( |5 S' \9 |1 l9 b- w. d- Y+ n6 M. i6 N- [! ]& }
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 |+ Y" G; j% w# D        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 O9 B/ w: |, J; `+ [% p! s
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) H1 o" z; a7 D! F
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 `$ n9 ~$ R/ |  J8 i( \
# z( k( M( n; R0 C0 U* l+ q6 J  F
        memset(tmp, 0, sizeof(tmp));; m" ]& _! G* Q8 H
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ s' @% w0 X! b5 H6 W+ _& r
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, F( N+ [  D) t+ z/ ~        server_msg_send(server, APP_CMD_LOG, tmp);6 v4 s8 A" x# L$ j- E
% M, H  C, U, A
        upp_error_count = 0;
- i5 D, k. f( ^$ v% W        upp_dmaq_int_cut = 0;2 y# w# B8 P$ a- M6 h, a
        // fill in data / t3 [1 G+ c3 Y: [$ a* K
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 d6 n; X3 H5 `! t
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( u3 I; @, t& D; E2 D2 w& A) ]# L* N6 p9 P
        // wait send success! v6 @) [9 S: M8 o: L
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; F. {1 i% s, P: d) L
, K% W1 H! t" C4 T, z' f( [
        // make data node in free list + i4 s. q$ f# }1 p7 l4 D
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 |3 M8 z% N* N: ?& c; f+ U        server_msg_send(server, APP_CMD_LOG, "upp send: success");. w  f7 b8 U: G& B
    }2 `' z+ n. @6 @3 d+ \
    return true;6 g. @1 a4 J7 }( ?" f, i2 g
}3 [$ U/ }( U) M2 g, a

2 s# X4 k- o$ s9 p. i: E& L

8 P, }) ^' H2 r; A; J5 i' q# z: T2 {' u/ o6 l+ {
0 p1 }/ L4 P5 P" j# ]
; K% s6 I* i8 w1 r  U1 n$ X7 D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐' x, i& f( L6 c- L& j

  Z3 S& P4 \, C) o& P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 17:04 , Processed in 0.044616 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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