138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 Y; p; o, M1 A* H/ i$ E
2 U) \, T: W8 P, ~! p3 L0 x, D( z问题描述:% {6 K) s% J" i3 Q/ @# }2 B
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& l. _# q/ }. k+ O; w  |
1 t, I- _- i& X7 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。& E3 E9 y( ^4 ]7 g
6 F; {& X2 ~4 H! |% g
测试结果如下:9 v, b) E+ m9 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ b" Q; v& r0 D5 n: q3 \! t" z( |/ Q5 T1 a: t% D  ?

. _$ n2 g. @- i3 P6 b/ D* }" G备注:
- O- ?3 n; F6 G% g( ~: g  F- v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 n; I" e0 m" M" P) T0 r/ {
2、相关代码如下:
& G1 }& {' Z+ w8 t( G+ M//UPP DMA缓冲大小512字节
  U) d; x$ W; x3 o+ r#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: E' C9 r1 [5 w; v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 U* h" M! R4 j3 c5 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& q9 ^1 r7 B' s
# n/ g2 Z2 p; l; j* Q: [5 s8 @. V5 K: m" s' [
//upp接收、发送buffer
: U  m& Y* e% x- p5 _. H8 z4 a#pragma DATA_ALIGN(upp_buffer_a, 8)
: w1 ?& P5 s% S# p$ P2 b7 {#pragma DATA_ALIGN(upp_buffer_b, 8)
: @  ]  ^, G# q! \2 N+ j! u; l" [, g4 @% D3 I! C8 d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& Q) C. j6 i" e' u/ _9 Yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
/ I& M( ~% }( {4 h( ?2 K
+ p) f4 X  f8 @3 @8 Y: P0 u6 l$ c! F' l
static bool server_upp_data_recv(Server *server) * ]/ N) o6 u1 h6 \
{; F/ x  G% C+ j, _
    if(server->upp_channel_a_recv == false) {" _  {- t, k( M5 [
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; F' F; [6 W/ H2 ^& ]# }$ [        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& a9 Q& W: a' t' p$ f7 L7 x            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 k3 i4 L" A6 z, s1 a
6 D; I* ~3 _3 A6 \) f
4 `  I" b% S  t/ T  l            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& [6 X- G! f+ ^
, p/ v, Z9 N  W, x  z/ [
            server->upp_channel_a_recv = true;//
: V% W! W9 w: g% i3 c! [; Y            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
3 T, ^& n$ a6 G            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;$ c" I5 M" N2 |8 U
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) {/ f1 J4 j( G5 m! L: X' O
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% Y8 W; P: d* |; s2 Y
! ^7 K; D7 L7 b$ Z5 S
            upp_error_count = 0;
$ f1 {& S7 v6 r( a8 M8 l7 Z            upp_dmai_int_cut = 0;
+ X/ e, j9 @7 x) H& E8 g, m( Y9 G8 t5 S6 q' x
            // fill in data
: P5 L# }7 P# ]9 m- T, W$ |8 A            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 y- H& z% F6 N6 S5 \( c
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 Z8 G% ~, c6 d( Q
        }
& n$ N+ v+ o! V" A    }
; G7 n6 p2 s) {5 C, d: D    else{
; L: o6 z  F" A( Y2 v        if (upp_dmai_int_cut > 0){- p( B  @; x& ^3 T5 o
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 B. F7 Q: H3 p' x            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);/ t) q5 F9 l  y- |* q. o
+ V4 W2 o+ Y* J. W# F
1 ]) V) D: R# n! V3 J" T. W5 t. u
            //copy data to upp_recv_list_busy
$ U$ Z+ H  L8 D            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 C' h5 Z4 f: s9 e

) f: G, D; b% u& b' ^0 m- C            //
$ U3 X3 [, v, L9 W. y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" x: {& d2 r9 K, b% |; y0 O
2 @% F7 I! B- \8 X" I+ q            //5 d8 O+ o% E4 {: N" A
            server->upp_channel_a_recv = false;//9 J# `% F" O7 E  K1 p& L4 \3 J  v

- g; `4 u% I. }" G( w  |) k! D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 M+ y# M" B+ J) v& @- A- B
        }
" r9 g0 Z( V6 {8 ?2 L  Q    }, R& d$ }& T. Q% d4 @  ^' k

9 k; e3 q+ Q- P5 _* e! G4 V/ ~7 `8 y' ~* ?( Y! K5 r1 F
    return true;& R/ P& C: C# [. Y3 h4 u9 k
}
' p! R4 A6 b6 j: q( v- K3 o
/ h1 q. x. N* z2 s8 l( _) z( N- {6 bstatic bool server_upp_data_send(Server *server)" K% q  n+ c8 l
{
$ l' q# ]) Q* C) x2 x7 n/ v    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% g5 D  K3 l$ j2 Q4 ?
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; Q$ M4 p; |# b& p( F# d, {) G
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ i! e! ^, ?4 C3 N" }5 ]
        char tmp[128] ={0};
' T, y" q0 B8 U, ?1 X; ^  h# }$ q8 a, s  T' E
        server_msg_send(server, APP_CMD_LOG, "upp send: start");: K/ e/ u6 ?( E
        print_log(server, data, 64);& s/ l" Q# y9 Q* S

7 l. Q3 s" j: D  @. Q, F        //5 [  m) C# q3 J
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 N9 o6 k( J/ u" P' j        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 ~6 {, e$ p) }. \5 I: l! C        print_log(server, upp_buffer_b, 64);
+ B; N9 F( [" S* |- Q- z) f
7 Q# Z) m. c4 j# Z) H        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
, r7 H5 d& T! ~        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
8 r" J4 u9 Z* _- I* t+ ]; ?        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" z, k+ k- o; s4 y' e( w4 C
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 `( i" I" d% F6 ?& _! ^5 B- A( p* S- }- i) F! ]- q5 L
        memset(tmp, 0, sizeof(tmp));' k$ v( R9 ~8 m( `+ S1 H# H
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ S4 ?2 s5 d9 |3 T9 L; x$ i            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" V' L+ u5 @3 R) i1 n5 d% k        server_msg_send(server, APP_CMD_LOG, tmp);/ ^8 P, k6 F/ X$ ^, M
6 j& E9 j  G6 a8 P
        upp_error_count = 0;% s. Z1 o( q+ L  |8 ?
        upp_dmaq_int_cut = 0;$ m& h# z1 |, j  \+ }2 M- s, Z
        // fill in data
8 I, O) o2 N8 K& G! j$ B) o        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, _* j0 x' U1 c, e        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' {7 Z" g  ^8 A. Z; g
) A- G3 A! l5 E2 G7 \7 }        // wait send success# G5 I9 D$ k+ G1 m2 Y- M
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ; A4 `, d+ n- n
" B- M9 S1 e! K5 d3 r8 ~
        // make data node in free list
( U' ^! E8 i0 d6 [3 p9 \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 K' p5 f( E$ V& O
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ a" N: ^. g; L& l% u( U& z0 F  u
    }" N# A" I4 C6 [( A* J
    return true;% c9 ?5 s& E1 p* p; [
}" q: Y+ B6 T* q
6 g2 [# ]& P: @7 w: r3 g3 ^
! j/ v2 y2 D/ J/ B

, K! x! H- |- v! D

, [9 v& @3 r# Z5 U# B! A! k. @3 N( w' O% u2 l, `) p6 n# N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 u6 |9 e2 ~  G; \1 @& {
4 {! E, s. ]" s1 C- k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-14 08:26 , Processed in 0.039537 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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