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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 Q+ a# m3 l+ I& @

, W2 R; ]1 H2 v: x; o5 d$ z0 }8 i# a问题描述:6 d" z4 v. C4 _/ m0 m- U5 i
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ [! T* ?7 A0 d
" S# ~) j$ N* d+ Y& ~5 O图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 q6 H% v6 D8 W8 [* ~. P  U

2 x' m* B  R& {! Y5 H& [" s测试结果如下:
1 K0 o$ _; a( x- v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 }3 Q5 ^8 }+ ^& x4 w
, E$ r6 F7 k; J( O! r2 ]* S# L2 q2 ~# N. T
备注:
0 G/ F7 o* \, D9 q( V8 I3 A1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) C' ]! N' v# X% u% Q
2、相关代码如下:1 N1 A7 H. ^8 b; F5 r9 ^4 M
//UPP DMA缓冲大小512字节# a$ d- x: _4 {$ w! F6 r% p% @9 o
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! [$ Y2 L% P& O$ T+ k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* N. T; @9 x# }6 P. @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: U+ l! E/ Y" F
' Z, l, h: D6 i3 `# o; o" e2 i9 {- |! Y! D  s% |& E+ [
//upp接收、发送buffer
9 R, k! H; E  X3 ?# X7 _2 Q3 r+ t. B#pragma DATA_ALIGN(upp_buffer_a, 8)
3 x7 ~8 H9 [0 }/ K/ @5 J- @#pragma DATA_ALIGN(upp_buffer_b, 8)
5 h* E5 K: S0 h3 u2 j1 T& f% I' Z* ?! j- C3 h* T0 Y7 E2 y1 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 P# `1 t! J* r- d1 G" b
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];. D- f6 C2 E: k6 J3 J7 z0 G. k" h
  f) q/ [  n* N& C$ ?, I
! ?; w; x. _" w% U7 H8 Z
static bool server_upp_data_recv(Server *server)
' S1 q# i. F9 D- c# ?' p" i{
! M$ [/ ?1 s9 {- S: `; A( {/ S    if(server->upp_channel_a_recv == false) {  V; O; \* N) r: d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: Q* T' s* O% A
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" [$ O$ f4 s& n  q
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ W3 n; f  y) Q# I6 d8 j
6 g6 U. w$ \% d- G- l5 Q$ \# b: Y4 U9 }  p8 [& y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 n9 C3 N! a% y& S) S8 O3 [; x( F

5 {9 @2 c* h! r            server->upp_channel_a_recv = true;//# e/ y6 h! g: a, R+ X" C
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);& T/ `/ V9 |$ @& k! M
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 N4 O2 l7 V4 R
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;6 Z8 [/ a7 I& a- h! S7 R, j
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 ]# v( y9 T4 j' A  S4 Y3 U5 c" C) J# P9 o. c! L& r
            upp_error_count = 0;
: a8 `" `4 k& Y! w" M% f( p' ~            upp_dmai_int_cut = 0;; b5 `3 B' C+ _6 q; Z6 }$ J2 u1 P

: v7 k  X4 ?/ `0 x            // fill in data & i+ H$ B$ f- s
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 D1 F9 }' Y* H& ^: s& O6 e            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
' F7 s1 q6 l1 k4 ?& a        }# W! Q: `2 h: I2 R/ w* m
    }
' o7 L( v3 \: s1 g    else{
% j- e" x) ?* `0 O; B        if (upp_dmai_int_cut > 0){; c. x5 c9 G+ C& H. F
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% r! K+ r8 R! J
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 |) }' a# l! B; t. ]

, i1 y* H$ n* U. ]8 P& X8 h" H; G, I. \' Z7 b
            //copy data to upp_recv_list_busy
+ U! e! n9 h0 J            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);  d9 [% g( l1 \9 M

' Z  r  z8 F6 V; t            //
& t) Z; h. P1 ^9 ?1 @* Y; x) i            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);- K$ t9 D- r' d9 |3 Q

, T/ {5 l1 O8 U            //8 t& c. k8 m7 r. P8 O* B. `
            server->upp_channel_a_recv = false;//
7 r% l. @! a8 Q1 m8 I5 c: s' h& g9 F4 y) V3 U, G! c
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 Y8 [0 ?. U4 F9 c( J  q
        }' H( t* o. m- X- r  ~
    }! Q& a+ p0 E0 y8 k' u$ W/ v

4 u! k* a" {  a; L; N0 f' u% ~
4 c1 S# ~6 j* p    return true;$ }' \2 l( p( ]: F( D" P+ i  m' b) [
}  k/ B! d# v# y, K5 z
8 _  R& V( ?" a* Q
static bool server_upp_data_send(Server *server)
' N. b1 Y1 d1 h7 t% }' `3 c/ [# E{( T6 n$ l' F8 Z4 U0 z- l
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 a6 f# v+ z2 Y& Q+ @, \
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% ~0 J& O! u' V2 V  t        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ h, G* _* v( M9 P9 V. |/ q' u
        char tmp[128] ={0};2 ^: G5 V! X, p1 n

& M3 l5 [  _/ K9 O        server_msg_send(server, APP_CMD_LOG, "upp send: start");
, C8 \3 `$ j$ h/ w2 w, x        print_log(server, data, 64);
7 G9 A& v/ A  H  T$ Q; n
1 [$ {/ b* D- M) Z5 ]/ t3 W  J, e        //* }7 A' a  l; R
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: |  z: K- f1 V* m) ^        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 ~& C4 u1 A+ U, r4 `( w        print_log(server, upp_buffer_b, 64);
$ G8 V& S' U  j' a  @& I9 E! f# l* O" e$ p1 g% J, _! c1 a6 J
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
! X( T3 e; H# Q/ i& r& \        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! G9 h0 V2 V5 X
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;2 a- Z* Q. _4 C) @0 J
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ g; P1 ?4 L, t0 Y7 N) X8 l$ Q
9 m- \% s4 x8 K2 r4 I% e3 ?! c        memset(tmp, 0, sizeof(tmp));
7 b( d! ]1 A1 a" g) }0 L" z4 q        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 q1 [! I8 y8 w; F6 X            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 P2 f; S: F( t! T: @        server_msg_send(server, APP_CMD_LOG, tmp);5 l: y; g/ M$ K( r4 l& b( {+ y! Z( l
+ @# i5 h3 W. {- V8 O
        upp_error_count = 0;
+ q& H- k6 a' l. ~2 K( h# G        upp_dmaq_int_cut = 0;
" t; w; a6 |7 P' q        // fill in data : O: ?% G" h; _7 }5 L; ?
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 g6 q! ~5 F0 |7 i
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# E& ]" ^- w- `; G" ~/ t( Q9 m% H2 U/ H3 q: `& A
        // wait send success
$ D6 M; l* ]9 d) H, P. c. `4 S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / ^: ]4 e# H. a% x% V$ \/ _

' L4 Y( T. n* e' Z7 N3 y: B8 T: V        // make data node in free list
$ O6 X. I0 y" R3 ^; e% J( z: E        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ I1 t. c1 B$ A( ]4 V/ u        server_msg_send(server, APP_CMD_LOG, "upp send: success");3 D7 ], T' j5 B
    }
. u: i# n9 H1 U$ M1 ^% y8 M    return true;
& l$ ?: R+ a8 Y6 n6 T8 l}8 o8 P% F. M+ }' D0 s$ h7 S
/ o  x6 d! I6 B; V) E
: W! l) T4 N2 }# w; }. t
) B  W) s' j% S% T

4 E# o3 |7 }) D8 Y- ^9 H1 ]' d1 A) a  J

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐' I. T) [# u' @% _; ?
9 b  s$ H* m9 X2 J* ]1 u3 C4 [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 04:24 , Processed in 0.042572 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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