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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. f  {% e6 L0 ^+ s$ \' z" l# b7 |: @5 b" A
问题描述:
; n0 K0 D0 C! `( N$ J; U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
8 T& y2 @+ K, _4 ?
1 T1 W% R, m4 l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ z! k  }# H& H' |7 D) E
- ]- {8 S! f: ]1 E
测试结果如下:
( ^5 Q1 ^( c& u138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 {$ V/ A' e$ q2 {! Z& w
+ S; Y- r  @7 P" R+ ^/ ]+ ?0 A+ ?; I/ y. h/ ~# D5 R! W
备注:; |- r' x/ X# k& C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 T  ^0 F. S& s8 E$ s" Y5 I
2、相关代码如下:( ?4 q: u- i7 Z5 B4 M
//UPP DMA缓冲大小512字节) g* X" Y( D' i+ K# X2 L
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
3 R' h: O9 V" b4 I# ]8 m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' L* T& n) q8 W. n+ U& P
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# B0 [+ F+ {+ q( x* y, c# S5 ?( D# }% j8 x; t

& O9 L7 x2 V& t# w//upp接收、发送buffer3 F- u2 ^/ {( m- F9 k1 ~. b5 N
#pragma DATA_ALIGN(upp_buffer_a, 8)" T( y% j; h4 [' @1 t1 f- M
#pragma DATA_ALIGN(upp_buffer_b, 8)3 I9 {7 o2 b1 U4 z
# R: ], f7 a) ~; d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) C8 ]* F3 P" b" H9 k4 i/ N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 O5 ^2 ~! M) f9 I' J' X

7 [& E9 {" {# d! ~! B9 x4 P9 z- G; ]$ v% u9 h, c
static bool server_upp_data_recv(Server *server)
' M2 i: d$ [2 k  g0 l) b{
# R: G* q7 W# U    if(server->upp_channel_a_recv == false) {- i, d! M2 ~, y  @/ ^5 h& w5 @$ x2 V
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");; F6 V6 T8 y/ f$ a
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 p0 ]% y9 M: z# i; `            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" C/ A/ `( `* A. m( y2 A
( Q6 p5 ]" z! O
& E5 l/ C1 [/ |, L/ S
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 d( F& A% {9 n6 v  |! r" p  w

7 ?9 C5 s4 j: C2 Y/ F/ w            server->upp_channel_a_recv = true;//) H5 v$ O) r, R/ i6 U" W1 r! k3 X
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 {& K) b4 g% D) ]& G            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;4 p& O% e( J8 ?" o8 L: v1 G
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- D7 q( ^0 H3 p$ k            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
& |2 k4 x8 n5 M+ O! O9 p* x$ A, o4 H
            upp_error_count = 0;
: f$ Y+ m" h8 [4 ]' T+ [( v5 Q            upp_dmai_int_cut = 0;1 {; h* w5 N5 J( r  j3 y

+ e; G0 M/ w) _# j" s+ {4 u" [, \            // fill in data 5 j; x$ `4 o; X8 X5 A8 }
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" Z3 q; T* P, }. @5 Z& l0 |) n            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");  O# F0 `, M: w* f
        }
" d( a2 q* B5 W7 J3 m8 T" i    }
2 _/ J4 @/ f# F' L4 q5 ^    else{. p; Y* y' {# ?+ [4 I7 f
        if (upp_dmai_int_cut > 0){
1 x  {0 K( P- E4 f9 s            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ ?5 g! H% N7 h% @
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. P) j" w/ N% Y  U! W
" V9 _2 @. i- j
5 z7 ^" R$ M& w/ w1 R8 B1 \            //copy data to upp_recv_list_busy
( o( v  X$ ^0 U0 b1 S; b            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 L6 p1 R; @/ W0 J( W
7 x& I7 w* P6 U, X. m5 J" y, ~6 `            //! K3 }' z* F0 [0 H1 d$ U! C1 P
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ D1 ^/ r9 |+ E" P6 U: L# Q# b, y0 ~5 n' U$ k! b0 K
            //
. q' }+ k0 D* U$ @& Q, {5 s            server->upp_channel_a_recv = false;//
7 @. E5 M  ]& w: S( c6 |* H3 s3 K$ G
# t$ [9 v5 h# r0 }0 B3 |5 i/ o$ c' v            server_msg_send(server, APP_CMD_LOG, "upp recv: success");# L0 ^3 k) w7 c2 X( q& I( y; G
        }, `5 u8 f6 A- k! i
    }
( _% C0 P1 F  G) K5 J
8 Y& d# _! q  m% @  U/ ^
5 c+ }7 r# ?2 b; [  E" E, y$ D9 h: O    return true;
' {. L. X' c; f" s  i}
+ ~# z7 @' H8 g
1 A. f1 M( t: l6 ostatic bool server_upp_data_send(Server *server)
( }! y& i; ^5 a! r: m+ ]{
+ [$ o6 o. S  }- {8 c8 C' u3 l" X    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 ^( L8 U# M/ y) ^
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ [  y+ b  d% O; U$ l5 {
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 J4 P: j( b: O, t3 s6 ~& q7 G
        char tmp[128] ={0};5 L% i% @* A8 g, k, _  O

  p9 u( T7 T% |* [* a        server_msg_send(server, APP_CMD_LOG, "upp send: start");
: M. G8 o$ Q7 I        print_log(server, data, 64);7 p6 ?) n1 S: [% d

) h2 r: |1 j- x- I) o9 k) ~- S4 h        //, f6 j4 @  O7 n8 m2 X8 l% o' h3 L
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ Y! x* Y) B' g9 Y6 H4 M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! X$ g/ M' f" v% W' P( O, c: P        print_log(server, upp_buffer_b, 64);  o" d& G% C: E; l9 ]

' i) r/ l+ Z4 j# f) C3 e        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
7 c, v4 w9 [5 c3 `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
5 g. m  K. [! {  h! g        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
! Z/ J2 Y: ^( \1 A: K: `- s        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# v1 q: w0 A; t( P- f7 c7 c
1 B, T$ l& g2 h7 `( v4 K% j0 F
        memset(tmp, 0, sizeof(tmp));
# u! ^5 Y- Q6 {$ `$ {  i        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% |: q; r- `% Z3 x' u# b0 C            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; d) M2 z, n6 K) K0 j9 C2 N+ g8 B
        server_msg_send(server, APP_CMD_LOG, tmp);
" L/ E: V$ P' F$ A- L  q5 i& h5 j- l' s. \2 m/ W0 @" T8 n
        upp_error_count = 0;
1 G2 k  J  D0 |$ R8 g7 ?        upp_dmaq_int_cut = 0;
- [$ N5 a- @7 A4 s2 S" h) f1 {        // fill in data
2 Z; {% H! e, V' C        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 L5 H7 i: v7 ~* p2 J2 Y4 x# ~
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# [2 D4 K$ B) L1 E* a9 G* [/ Q, S+ L; H
        // wait send success
6 A: x& l% J7 q2 U1 Y        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( J8 C, `% y! S  c8 X  x% D/ [7 `4 R$ T. y' @
        // make data node in free list
7 L! o- w+ `1 t" a        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
* L) X7 Z$ Q8 m  i        server_msg_send(server, APP_CMD_LOG, "upp send: success");- l# y5 \: L& G. i5 |6 \" O8 _
    }& c/ C4 z9 Q( z# \2 I" J
    return true;
3 @4 L( B. p8 B4 f- y}2 L$ E. M/ U" J3 `) t/ G
! }5 W" L& Q, O; w: D; y

! m( v3 g  z0 b% L/ x, p3 S( c3 Y9 u/ ]. s' j- }
# o2 R* p- z( E" B* {# a5 W
- D% F3 s! O. m7 G2 d

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 O9 p- U+ S6 n: e/ o9 W( n
& n* s4 s3 t9 `5 y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 13:07 , Processed in 0.043442 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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