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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& Q. C  Y& n0 z% Z, |- J5 d; i& v/ L9 z7 C8 \
问题描述:
: @' N7 y8 V! m' w6 v% Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  t  A2 T  n7 J3 A1 H# F
, n5 J+ [$ D) b4 e: c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 E: A2 C+ X" B  b0 J' k/ m* R, F) P
; x# |7 d( N+ y2 P, x  J+ u测试结果如下:
6 s) ~) x1 A6 l5 J! {$ `$ h138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  P, b1 X0 K' x$ v% h
5 q# o& A6 k, Q
9 M- ?" @! Q3 o: |  @" T
备注:( n# \) w; @2 C8 F1 V
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 f5 m, t( C8 E- X
2、相关代码如下:
/ I; o+ M0 X- p! Q//UPP DMA缓冲大小512字节
0 h3 z* B% o% G6 v- w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' [' U+ _1 u/ O2 g/ E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 V- j& `4 a; [#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 l8 A! W' d3 f( z8 ?
: I/ O. z9 \1 f6 a5 @# J; z9 n- t
9 i# Y$ r' k1 O//upp接收、发送buffer
. h- L- L2 B7 G2 t8 q#pragma DATA_ALIGN(upp_buffer_a, 8); z8 b' f0 l3 p8 Z
#pragma DATA_ALIGN(upp_buffer_b, 8)
: m1 \' N7 F5 l( ~! L3 x. I1 O
8 K- _8 ?* l( y% u$ d/ junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 W* t8 P" q. @, i; l# K6 D9 D* c, }unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: g# C$ R0 i" E+ j6 t" b

6 m" @3 {2 f7 f. l, F' r0 Q
* Z2 d$ K1 X' }2 `4 pstatic bool server_upp_data_recv(Server *server) 2 |) t; {  q+ J3 o$ U9 z+ J- G
{# b) y6 L' h4 m" y) s$ i) k
    if(server->upp_channel_a_recv == false) {
5 V+ m/ w- l6 \        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! w1 p7 n" R7 d! ]3 h
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# E6 w+ A+ h! W2 i            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");+ L& l( k( G- k( m2 Z+ n

! P# }2 H2 L# k$ L7 c$ }( ~- _7 c( @  p5 J+ f) Y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 @, j% L# t7 a! P( \+ X& h! r$ o9 E$ s7 Y. M( T
            server->upp_channel_a_recv = true;//
7 B' ~; U: e( m$ L+ F0 j) j) H            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& m: F' M8 _$ a            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;# v2 T& G/ x, {* P0 c* l
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;" E+ B: U* a' ?# p9 j
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; }& k; C; d+ g1 D% a4 [) a' [4 D" C
) f/ [. k+ q. F; v5 m$ j& X/ [% C  w            upp_error_count = 0;
. Z# w6 X0 m7 t            upp_dmai_int_cut = 0;- b0 u7 S0 [' O) {- y, }

* S7 I* z  E' N) J% v            // fill in data ) ]$ {1 X$ Z( U% l7 c; V) S/ j" t
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  q$ R8 l/ a* r" `  Z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 w# M( N% P3 p7 C8 p' y2 t
        }; ?8 z) ]8 B) g; P9 Q2 r
    }
% p% P. c6 K# l5 p4 T" w. w    else{
" a3 G5 ]! g, l5 o1 \        if (upp_dmai_int_cut > 0){) n+ U2 B9 i+ w
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);8 p7 D2 `7 a* H8 u
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 U. m) B1 F$ R7 G- \$ @" B5 m* X' R0 M

! [9 f  B3 P$ Y! ?; b; J! N2 l
$ K% g: {. W1 |7 w& t% k% ?            //copy data to upp_recv_list_busy
9 _! i, D. Z& V& P( j- b( \+ |8 U            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. m6 i" j& `3 I# I2 p8 r
2 ]# S% N0 r2 A- U            //9 ]3 m) p; l+ v6 X4 c$ H7 a1 h; m
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ ^; C- z7 x* V  w  R# n( s7 S) b2 G: C9 @& p8 S* T+ r
            //1 V3 o$ b3 @2 {* O3 {$ z
            server->upp_channel_a_recv = false;//5 O- m% D& @) W* ^2 O$ L9 ~
% c" d; C7 ~3 Q. F
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");% j- L; ~5 F$ o; w: ^! t, h% X$ ^
        }
9 S( n2 o# {8 G    }- t8 ]/ p: o& x% F, x2 J$ s

& T% Z; G. C8 x) D9 Y  I4 ^! o5 Z; N: w& x
    return true;6 @% ?  K/ m4 s9 |$ ]7 _% B; Y3 a
}
: m! v- t( J; [5 @! W8 U
9 U2 d9 a6 B7 Y6 Lstatic bool server_upp_data_send(Server *server)
: K1 q% \' f3 p$ t2 q1 ?{
- I' a& d# ]* a2 X* P( p* i( A    if(ListMP_empty(server->upp_send_list_busy) == FALSE){  q, P6 \) q+ u3 g: P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 v3 A/ I+ e4 U
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 M( n9 c6 P! O5 N! |% q8 A        char tmp[128] ={0};, H  q. @. _# z* m+ h- U
$ N2 H1 q9 ~3 M" l( }8 L
        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 ~: O- D+ ?' V- i6 G
        print_log(server, data, 64);
$ F% r% z  B$ {2 C% _
: o, y% ?8 q, m& ]- [        //2 q5 I: p# p6 Z; [' l: T0 R
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( h7 c/ w; K$ F- J3 w" @, H2 A        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 H8 N6 ~7 j/ y& T# ]8 T+ Q' z        print_log(server, upp_buffer_b, 64);
& {/ K. I2 B4 \$ }) D, V1 B( d6 ~( n2 F. @9 R
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);! I: V. E* Z  ]6 `) w
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! ]- U) o' v6 t& T0 Z
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) W3 t$ |/ q+ J8 f
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* ~' m: R" m4 v8 q6 i2 N9 O8 _3 s: N* C. d) D, J
        memset(tmp, 0, sizeof(tmp));* M$ u; `+ n! @0 y7 `
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 ^6 ?1 O2 H  e! ?' ^  q  V
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& a/ Z4 t' _" Q        server_msg_send(server, APP_CMD_LOG, tmp);
( E7 H5 M% z2 F" m: P: R; J
" p) {+ u4 B6 `8 S6 Q2 s7 s        upp_error_count = 0;: t3 C0 }/ d5 X; m2 ^
        upp_dmaq_int_cut = 0;
) W: I4 F4 }0 @        // fill in data 2 o8 o) ?, \! Y8 C$ F% H0 P0 i
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 J# H6 t2 r# y5 d9 ~4 n; g8 Y        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 _" J3 \; Q  q- n

& O- p. D- v  a* ?$ X. j        // wait send success
5 z4 @; L1 p4 ?+ w9 B, N  B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! A7 r( ?4 E7 S- J3 @  I

' G" U$ i9 O" `9 C        // make data node in free list
0 I: |2 `: [3 P# I        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* d2 A, h6 R" ^  \9 {8 I: x# h
        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 ^* S0 j8 A. V9 S$ m7 Q5 ~8 q6 P
    }7 t" C! i4 J. l  T0 P
    return true;
- @0 m6 |3 s% E3 }, _3 U}! Y1 w1 v1 H/ a7 v- }
' R2 b' k% Q' ~$ Q2 l* W2 y
% W( ?+ _! Q$ R, |
( `/ ~3 N0 c# s/ X- d

  C# x0 x, P& a& c6 C8 H
: ^* M, @1 m* F$ V0 k

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐  s2 `: n0 {8 M2 p" P
. a& K: n5 Y2 ^5 \

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 15:43 , Processed in 0.048089 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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