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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & ~$ y, y: {, j
) U0 `+ Y1 L4 T9 T9 c3 L
问题描述:, ^) P; D7 D' G$ q- A/ M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( @5 a- m: k1 R$ n

! s& s# x( y! D& a; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 H4 ~% t; o: G* Z$ d
  [+ u/ K5 e, V( g
测试结果如下:
& s! y6 ]7 n  d6 s& u8 F+ z2 Q$ e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  i5 w+ v& G0 s, a$ Q5 m, q* T" [& G

9 n6 b4 Y* `9 {$ m; q# q
) T0 I  c7 N  h9 `4 S- j# f" N备注:3 Q7 P. E3 ^2 Q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" t/ l! g" T" k. g# O
2、相关代码如下:; V$ S4 h- R# N5 ]; \8 q; |( m7 d
//UPP DMA缓冲大小512字节* }3 c, G6 C+ ~; \7 }( f
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; D7 b! h# I9 |/ a7 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
2 k% r3 }5 t% q  w: d# i#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT): G( b7 {$ L+ T

4 l3 y7 q( g" J, X3 I  `* n/ q  Y2 d% _& i
//upp接收、发送buffer" O! x% c& V: Q: F9 A
#pragma DATA_ALIGN(upp_buffer_a, 8)
6 |  e3 t4 r1 L% \* w#pragma DATA_ALIGN(upp_buffer_b, 8)
+ Z/ M2 j: x* Q. a, k2 a, O/ _" \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 y& {7 a- `" ]9 `6 N6 I$ Cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: X/ k; {: {1 q, B, D+ C% K( p0 m
. m/ e9 ?* ?/ l& r& T& C2 U, y
+ B, c9 ?# w4 Zstatic bool server_upp_data_recv(Server *server)
8 C9 F- Y. ~; w  Q+ t# Z7 `" c; [{5 B7 b/ W, z: }0 \: K. `
    if(server->upp_channel_a_recv == false) {
* l3 U( F4 W2 [( M# e/ r        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& B2 g% x2 ?1 \, Q& w
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! z$ x* B7 E! x9 K3 S4 a5 @' A+ x# |            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- {! n( F$ T+ U9 Z1 O8 w' u. E. M& Z4 _& T1 e4 {
; f" H; r' d# p  f  a
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; J& @9 }5 ^* m, |8 ]
7 {9 C8 u; A7 C& B5 @& a( L% a            server->upp_channel_a_recv = true;//- R2 U- u; T$ k( n+ |. L$ k
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# N) @9 S1 |# t            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, t1 _# |+ U: n5 G8 C. r/ C
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, X3 C! M* ]& F) W5 h* w            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ D' X& V6 q( q! A
! e7 l4 m/ d7 M; [; |            upp_error_count = 0;
, S" G& g: H6 }. u# l            upp_dmai_int_cut = 0;3 B& {7 C8 U) ?" D& h( ~& }
; `7 b' y3 \  R! z# A4 m* H
            // fill in data * H, w* _2 b* {4 y3 b
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& h- F3 @2 K3 p4 G" w  x
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( \+ T& @# A) u        }% B  F. {- D) h* ^2 W
    }
6 B6 x% v1 D9 O9 [: `4 S8 {# r    else{
, R& i! C8 v0 n: [! y4 i        if (upp_dmai_int_cut > 0){1 e- N7 ]: ]2 x( w0 a0 n( t& ?+ N/ k
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, _' d0 L* `% V. I6 |# d
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# z! Y" V1 G; m  Y+ \! L" _

3 \" {) I% ~/ K$ w2 n8 L# P* v1 X/ a. P$ g( r- F
            //copy data to upp_recv_list_busy
: @; _! R1 K6 Y9 E/ s0 s! m            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* h" s4 Q; q, d- A
) T; D. I9 O% F" m# ]
            //
6 k6 _1 }2 ^! M9 E            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);! t7 y! w1 h" {! y/ U# Z; A

- @! ^) |3 U4 M' W            //4 c% t' e* [: ^
            server->upp_channel_a_recv = false;//
! X3 s  C* l! }- v( l1 T! x* _% X5 c( V
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 {/ {$ }  }8 t3 X) L% Q, |, ?
        }6 F3 T: D+ t7 s- S% v# S* W8 i
    }
6 F8 y# j! {: W  S8 U: w4 J& F+ O
, u2 s' Z6 z/ f2 F  [& g
    return true;
( x9 ?* a6 b/ }( a' m) _}
/ X! s2 I- o( Q4 g4 [! X% A+ E; Q8 }# P. W4 \! e
static bool server_upp_data_send(Server *server)
/ V" u0 q2 s% s9 C7 P{
. `9 D* X* u3 [# r, t' X2 _    if(ListMP_empty(server->upp_send_list_busy) == FALSE){; x; T" B6 O9 c7 Z( ]
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 R& |) i7 D- o$ _5 y
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ w/ H! @* f3 E& o  \4 s7 r+ P
        char tmp[128] ={0};" K+ j6 r! C/ C

" `6 }: M( M. ^1 h- [        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ t& f9 A& F. s' B. Z* t
        print_log(server, data, 64);
1 m0 R+ f/ M2 \1 K
/ V0 U: _2 ^! a        //
5 e+ d4 ?! v' O1 b; \3 J& _; L* {( [        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% H# m; p2 z7 w, _( }        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# U$ ]/ m5 J8 F2 k1 J/ b! k        print_log(server, upp_buffer_b, 64);
+ [, w, e* j) c
# f! \8 |; r! Q1 ?( v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" n" D6 S) u/ a! D$ c6 g6 _        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" A/ c  M2 l+ U* M6 V        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 M7 G) ^  U; A! T. T8 x
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" r7 t$ e4 f+ z2 d
% E0 c" T- Q. H
        memset(tmp, 0, sizeof(tmp));
5 }0 ~; V, ]" X% A        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 q& W* ?- r( M3 Y1 ?
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 S) O0 `: ~# |# Q( j  }# l        server_msg_send(server, APP_CMD_LOG, tmp);& `1 ?# l8 }/ ?: I% @
, m6 b$ P# F! l9 s
        upp_error_count = 0;7 T# ?$ T. M4 A. z
        upp_dmaq_int_cut = 0;
  b  k2 h/ t8 {$ M        // fill in data " m; V7 M" V( U4 w
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; q+ C8 l8 C& h
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ {0 Z, A! D2 K6 m5 d* W0 s
1 X  [& i0 ]# x4 E: c: Y5 K        // wait send success' c8 l# ~& x  g5 z# z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . v1 ?# ]' S" V
) b) Q! W' _1 m& l+ }* c
        // make data node in free list : v4 _$ d5 E3 ^) h% o  ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 U) L7 g! B+ J" @        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 c) w; ^! {% k5 t1 ?
    }+ O8 T1 K* T* t) C7 L
    return true;) ^) j2 [  i% M% T1 ]% k- t1 F
}
: G' |4 X( g  l
- ~4 `3 W- Z3 u. y! A5 T

# Z" _+ C4 N" x3 U4 |+ _
1 q9 E; Z" R* S' [7 d8 A
) S* V+ Q- M4 F+ V' o$ o

4 O$ k+ l' Q5 O! L5 k

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
# r3 E' y$ P, }, U% j0 m' r! j
+ x5 Q3 K/ c9 Z" m( h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 08:57 , Processed in 0.041728 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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