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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 + T8 D- i% L( Q( x, k7 r

3 |( m4 c' ~4 ^问题描述:
' h, @3 B, I% _6 D1 X: `5 n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. J9 b1 y* _: N5 W) z) c/ a* q
/ K% f4 h4 Q, k' |; x" Z' p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% x9 m' ]! q; C# a
) ?- f1 ]1 j! G- n测试结果如下:( }5 s4 ]( H2 N) N( K1 `
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) K; I* m+ f5 t4 @4 I

" f; Q! o$ x6 ~) @7 E" }# |: k% y" w! p
备注:
- C6 G$ U' f/ x) ~) F& T9 V1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ ?* O' y: i! `
2、相关代码如下:0 ~. q( N$ f( S4 h" _3 }
//UPP DMA缓冲大小512字节
1 k4 B$ M. j- ?' d#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ R+ _( Q8 A  P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' P" a+ t$ D1 N, ]1 A#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 \: s2 X) L! W5 s

( p" v; u) B8 P& p% }9 o" e
5 X- h1 Q' E% k# ^/ n$ K//upp接收、发送buffer: `8 q4 ^- l" a7 E! Q4 B
#pragma DATA_ALIGN(upp_buffer_a, 8)
& }3 ^8 G6 M( f8 f#pragma DATA_ALIGN(upp_buffer_b, 8)5 F8 g2 Q. P. f! V- J0 G

. o% i# c" o  C5 o) I$ q1 Q9 sunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! P# ^- V- N, z$ Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% H- V9 C7 ]2 p$ |( @7 M
/ ~' G; R0 _" n0 `2 A  l
9 ?9 G/ @% Q7 E' |% Xstatic bool server_upp_data_recv(Server *server) ) b6 }8 {+ t& b. C6 p
{% _' ?. n1 e/ y4 U. p
    if(server->upp_channel_a_recv == false) {
. s! ?$ }+ e# h/ N        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 v2 N! V/ X6 p  R; a        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% C' J" }6 E9 ]* s8 \5 ^0 _: ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 {7 [. }1 S- p8 S# I4 J9 P" M# [  z% [* O1 m1 C
- H" K# s7 a# V# V. b
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* o3 U3 m: h  b# h1 }
3 w& I- y0 @* M  M! P! z
            server->upp_channel_a_recv = true;//
* F  ?7 R' ?) {% ^) q/ N" n5 P            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
3 n! p' B2 J- O: S            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. j) ~- x3 X+ U- o1 x8 L+ R* x8 G
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ t3 v! \5 s5 x! _" w4 z% ~) [            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% y! c5 n) p) X/ U* M: @# }$ H5 k( p$ E
            upp_error_count = 0;- e4 o5 w4 I5 H4 \( s
            upp_dmai_int_cut = 0;' R% H# K. G( k6 I# `
! X6 m8 W! S% J- [
            // fill in data 1 i4 U! S2 L/ w0 s' E0 o) C
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 ]1 y8 b, A+ |7 t1 @5 m            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) P& M" V  s# g3 Q/ N
        }2 q$ Q* d# @7 J/ {5 G2 I. }8 S8 V
    }
- x, d9 h) \1 }$ M1 y    else{
  p) D7 E3 z, E' }% j! G        if (upp_dmai_int_cut > 0){
1 a9 q3 b8 t* D, y# F$ W4 k            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" W5 z. H# h8 n, c+ m5 `, j. u; {- {            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Q, U- F3 @- I$ B
# R. ^/ f& H1 h% d
* j2 j  y. t5 z" C- I- m            //copy data to upp_recv_list_busy
5 ?% e; i" U3 {. z5 @3 C            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' w. w1 ]6 c8 l$ W

  [, ]& b* ?( y            //
9 l; i- P: ]7 U" g& j# e            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);, A2 {5 Y  Q2 t- P6 u( [# R

+ }0 m- g- V2 X9 {9 N            /// l$ l, Y. X6 R" x- ?, k
            server->upp_channel_a_recv = false;//
  h) U, O* w$ t( P- a3 y3 s% L1 U$ S' s6 M4 Q7 Z" V8 @
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& M4 l% g; d' g* H        }6 G- g& W5 Q2 M1 G+ V, s* _
    }
6 a6 G, C3 q2 O& Q' C( B: |. e" {
& ^* ]5 ]1 f( Y% z8 L: T$ @
6 U$ b9 V% R! X3 k- k1 h    return true;
7 _: s5 W$ \+ C( p  R9 w* O}
- F) u6 e0 ~( x
; P, Z; R8 T5 Lstatic bool server_upp_data_send(Server *server)6 R  Y/ b, t, \+ y+ c. f
{* L& g4 u, y; |5 f; Y8 L/ W5 g
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 l3 P8 w6 E/ Y+ f0 y/ ?
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 t6 y8 O$ j4 ^* k/ J! _; G
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( B8 L9 L9 X# b$ H" F8 m
        char tmp[128] ={0};
! {$ B. Z% F6 k! B) b9 r* Y0 Y0 n4 P3 i4 j" i7 E
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* @( x3 Y' I( I2 g6 h: S
        print_log(server, data, 64);/ a9 X8 d+ Z" p: r4 K
( W0 B# I1 V3 [# N
        //! A: ]% t& C- O7 L( V$ X
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& G) t* q2 N2 z, e5 X9 w/ g        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  K, {$ ^/ O/ T4 ~) F( J: p
        print_log(server, upp_buffer_b, 64);4 ?2 ~- ~% c; {7 w( d; i" _

  j+ l5 L( o& g* V  E9 m- f        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
) s( M' _6 C5 ~4 z( E" w! l        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
% Q' j( C+ K3 q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
3 t6 r, t2 C& `( K7 Z6 g        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ i. c/ t$ Z& S* w5 [9 ^2 G
8 a6 Z" f4 ^5 E) Z4 I# b8 j0 v7 r
        memset(tmp, 0, sizeof(tmp));4 F5 z3 k7 g9 y1 K6 A0 B3 H; M5 ~
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + x/ T0 ~) k) G1 z, E
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 M: W" Z  g& B/ l        server_msg_send(server, APP_CMD_LOG, tmp);
1 i9 X# H5 A. u0 V3 y  @5 |0 u$ l9 _+ O7 U' N
        upp_error_count = 0;: \, M; N# l" y$ p/ Y) i
        upp_dmaq_int_cut = 0;
1 V2 `: E0 f4 O+ r5 {        // fill in data 7 g3 @0 X" H5 u+ T
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * L" v/ P6 M, T9 ]. f7 e* \  j+ z
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ }4 A. M( N. t. ^# |8 i  z9 b

# r7 I' N5 C* R- Y( |; w        // wait send success
; y2 r# Y7 W& D+ M4 W8 e        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 |! R0 s  Q9 U$ _, R" p5 m+ S6 \) g2 T/ t9 B3 }: d) U5 e
        // make data node in free list
1 c( J% v8 s8 M        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- }1 B0 K( Q3 [9 H  o6 }
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 s; F# i/ x* A" B- d: w    }
, \* S1 @1 `7 l$ u( }    return true;; d; A. }3 ?7 S5 ~
}9 M; _+ S2 G- S4 O3 l

6 K! [& f9 E, o5 i+ h$ ^  \3 r
: R2 \3 v% D8 l5 g! e. u

* r  |! [# y# k8 ^- c% \: x

4 g' s4 l) o* M
2 J+ k( Y# d3 d; y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐' T; x5 m6 p! W

5 ^/ E6 h. W0 l  l/ Y' u

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 13:58 , Processed in 0.048998 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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