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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, x0 {4 N- }& N' N
8 b$ Q5 G" B9 {+ k8 V5 k3 T- G问题描述:; K! P* g2 [' t  l
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ a" w& ~, _- y4 X2 @( t

) e5 T1 A7 g% }. D- \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! @  d; }/ t4 E+ F; r8 ^: y* i6 t: v% ^2 T
测试结果如下:
  b* C. d3 C2 G; E! J  x- u: j138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" |3 u1 X8 p8 R# [7 @
% z8 O& I4 s: D/ ?
$ ^2 U- B& F+ n1 i备注:: J, r+ c, F9 R* n) ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ }! D9 o. _* _3 ~2 U, k
2、相关代码如下:; n! M: Z7 r! Q. ^7 `& T- ^
//UPP DMA缓冲大小512字节
& B- P5 C$ i; N#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 i- ^3 @* i& a' W) a6 J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 ~  |1 }4 H; h) S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
* \5 {/ o* v5 i( L* E8 K
6 z) W. J  s- Z
$ z% v$ U2 D1 [, ^* ~//upp接收、发送buffer
8 [* @1 h  k: H, ]9 k& B* u# u9 ^#pragma DATA_ALIGN(upp_buffer_a, 8)
* e1 Z3 }. C2 r2 h#pragma DATA_ALIGN(upp_buffer_b, 8)* D) h5 Q. c, Z1 r6 m: k( @. V
% e1 r) N9 d  p7 p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ Q; m- f2 g+ Qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  a  T+ \* S/ b* u* C6 B6 G0 ?3 R4 W: y* c$ D2 J2 A
* _; K6 U2 i) b, `
static bool server_upp_data_recv(Server *server)
# W; l. U! n  z! g7 ]8 p{- @# X; L6 C' q1 x2 L/ i) A8 O
    if(server->upp_channel_a_recv == false) {$ s4 u$ j8 O3 T- M" d0 N2 Y
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* N  W7 L$ r5 Z$ q) z2 p9 \
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 J# m  X, H! f1 P: i            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ b" b8 i  b* L$ ?8 b" t, h2 D- U2 y+ O
  @$ G- K4 ?' I0 T7 }
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  c- @; [  K% k1 g- x
0 @' G9 N1 |4 `. y8 `) z/ q: t
            server->upp_channel_a_recv = true;//
& ]: Q  ]( Z- d9 p# c8 z            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- w' @* G% _% T  r            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 j9 P& U' V+ D9 A& h
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;: J% `7 j, L! [5 f
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
9 }" W; r. g- L$ H0 s, U" M4 f7 O/ f* l+ m( ~
            upp_error_count = 0;
6 I( r; ^! `" M! L            upp_dmai_int_cut = 0;
) s5 d% j* F" O9 u6 z. x1 A5 }/ ?/ \) C8 q4 L3 v3 Q
            // fill in data 0 ~( N9 ?, P0 c$ m5 L
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);$ h; y1 ]5 h; I: C! P9 A5 {( e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; W8 Q: Q1 Q/ I        }
! P- z# H3 M( i0 y# P    }' f, D5 c, `& i
    else{) Z$ z0 v, R) Y: a4 ?
        if (upp_dmai_int_cut > 0){9 b' _. c! g& Q7 Z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ {2 ^$ c6 B" w" k" T5 G3 Y' X            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: Q( f, i2 U+ N: N4 [. r' [$ ~2 ]3 n% O: u2 V

/ \; c" ?5 m; L* U# m5 I            //copy data to upp_recv_list_busy
  A/ s7 A! d1 D. ~$ i3 X6 k/ s            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 Q8 Q' e7 U0 y) M  Y$ o* T0 d. Q+ c+ p" ]9 P
            //, y- ]( d( [8 P6 _3 p! v( W) m# |' Z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  h# b6 }. M( s5 a, _+ c7 O  u& P4 y/ _, V
            //
% Y/ `+ h7 U' ]            server->upp_channel_a_recv = false;//
$ V) d, v& v& m* d# A) z* i
1 F5 Z# g( r+ ]- R- I; M7 s& o! b            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ ?& m$ \, N# f; u- {0 u
        }) ^4 [8 I. [; J- _3 b* h( Y2 W
    }
1 ~2 G2 k. v  g0 {. a4 L( h
6 C5 K) w" d6 d' `' B$ Q$ M% x3 m/ R7 W6 `2 g7 \* r8 q, t, x* o
    return true;1 Z6 ^7 C  H4 h3 t5 o6 u+ m7 D
}
9 p3 b0 P' E/ K" S2 U
0 o  i' ^3 d& I$ l: g( T% Gstatic bool server_upp_data_send(Server *server)
' P% u6 ]; @$ y; z8 g{
: W8 V2 d: n' J2 X; e+ e9 a. b& {- c    if(ListMP_empty(server->upp_send_list_busy) == FALSE){9 q. Y  ]7 Z+ r7 b$ q' D; c
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) @7 C  y0 U; k0 I4 J, L( f
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! e- I4 y9 Y8 j+ z7 p1 h" w2 w
        char tmp[128] ={0};
! G5 I5 T1 Y5 R9 z! ~) b2 p9 `9 o. h. _+ ^6 r
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" O* l  R7 a* n+ y" b3 y        print_log(server, data, 64);
+ o; D, R2 r' {" j4 Z1 i8 u( J
& D( G. E5 C2 O* D8 ^        //
8 }# w. ?, R2 a7 P6 [* I        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 y! m, S) c9 R8 w        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. \* Y; a' B$ O2 E$ v
        print_log(server, upp_buffer_b, 64);
* h  W- N5 I) \
$ f2 d( D  }1 o& c2 ?) M        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);. I' U% O! Y  j$ O. i* |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
9 E2 d8 i7 w3 z        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) _- Z* w* n6 \9 ^/ @1 K
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 i$ n4 B( `3 Z. q4 @0 S3 V

1 D/ Y/ h3 E. G1 ?+ t        memset(tmp, 0, sizeof(tmp));* R" f& I2 B: a* M& q8 Z
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& N2 }3 u8 r4 C: k" v            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 \# P% G2 t9 L) C        server_msg_send(server, APP_CMD_LOG, tmp);
4 P" D4 t2 x$ j/ X: ^; N
: w; l1 L8 f! M- y' i: n$ ~& {2 ]9 c        upp_error_count = 0;' _+ }; Z* S6 _5 f- ^
        upp_dmaq_int_cut = 0;3 R* c- }% c7 Y, {0 `
        // fill in data * m% B9 m/ t) x
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% K' \7 @+ m; \( I6 D6 m        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- ?: X. M6 B% E- v- r! e0 ?* z

3 W7 O5 }1 C! j4 b( z+ b% V        // wait send success
3 {& V: _( \6 _  ~& G        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. H7 A! h$ b4 j5 o
& l4 a9 o$ c: U/ E7 n# I4 y2 T        // make data node in free list
: p2 G) S0 q- T5 e2 m! i/ `* x        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( D' A% ]3 v4 x* ^& C# [0 _        server_msg_send(server, APP_CMD_LOG, "upp send: success");
" `& F. b1 n) [; t4 B3 P, }    }
( I" u4 c" Y8 M6 [* n# R, u% O    return true;' ^$ _% ^6 [# M% Q. ]& E. x' N
}
6 ]9 ~2 F/ a: ^9 g$ D/ [% N+ R& s  z% X

! z2 ^- @% J1 o- b8 Q- _! d# ]4 s
! P1 r5 \$ E) _! C, `6 v
/ O9 W$ a% |, _9 m' y8 s

4 ~8 d3 `! ?" X

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 A, `( o  e, k: f# Z5 F
5 g& q; e7 R, E6 A4 q) B  ^

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 09:11 , Processed in 0.042713 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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