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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - ?2 m& {) U2 R! V; Q* I
& N* I! \5 K, n3 x+ V0 g' \+ K
问题描述:
# E, L0 ]) i( S  A' Y: r  L, T) \在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; O: M0 b. U$ G. E+ K
8 o% P* _2 c# U# T; e! Y
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: k& X9 l) z3 Q  h
, v; R* o' N! L  I) q
测试结果如下:& V$ J) y0 _/ `0 Z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: ~' x/ a* Q2 B- V6 c
/ ?+ X% v; z/ l$ e% r
6 r/ J+ t$ R) h. W8 ?备注:
" e( f* m) u8 `9 q: ?$ w1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 [- o5 C# I2 a5 K
2、相关代码如下:
0 j1 b/ a: a" u5 ]5 B$ [//UPP DMA缓冲大小512字节2 {9 p! @( g7 t/ k+ o( m3 w
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% d/ |% b" Y  G4 }: r' Q' D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( \/ |6 q( J. l5 I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 \$ Z  d4 H0 m4 I$ r

6 P9 L" G; J) Q' g  Y; |) M2 f+ S
//upp接收、发送buffer
6 Q8 K( G" e: |  a; y2 j2 L#pragma DATA_ALIGN(upp_buffer_a, 8)9 r+ t6 a) I. K$ }
#pragma DATA_ALIGN(upp_buffer_b, 8)
. \+ ~/ L7 O# K' n
: d0 a. n. |) T# s1 }( eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 O; C! ~; a) p6 I1 ^& c7 W% o5 F
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% ?6 b+ U4 r; _
, T# n+ A! A: y! ]

$ B7 [1 M# J6 p: y/ ~static bool server_upp_data_recv(Server *server)
/ j6 B0 _: M+ A: t8 E{- F1 {" i, _" o; q
    if(server->upp_channel_a_recv == false) {- o9 c' k8 h2 I' `/ m" ~
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- p+ o0 ?) q- |. _; x  d  V
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 ~# u3 S% b& r- c5 `            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 j6 t3 _9 }. ]9 X4 }
* L' D8 e1 G6 k
. a" x! z& S1 b; i' Q" a- X' s            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 F" {% X+ e6 M! {4 ~

# o/ K8 B! b) R6 c' c" J            server->upp_channel_a_recv = true;//% L% S# M( n) Y+ Z
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! Z  ?. {! B8 ^+ l# [, N% j
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. B3 R; M, `8 @
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;$ e% C) Y) o! K8 v
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( b/ K# l5 H5 \8 W9 x5 F$ q" ]) ^( a: E. t5 D6 S: H
            upp_error_count = 0;  B# {! q$ A7 ]- W. J
            upp_dmai_int_cut = 0;5 ~; z4 v* G1 j, m& m+ h
# ]" Q2 [' }9 w% a
            // fill in data
( O! h3 k$ |8 C& T5 Q" B            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# T3 r) S# }$ \, J% r8 m$ }# l
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 e' w5 Q- C' _" k# s
        }
5 }4 D  |+ A7 z. X    }0 n2 x: {& h! C% w
    else{" Y2 G! c! K% s- h& N
        if (upp_dmai_int_cut > 0){
( }" S5 }4 {* N. n            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);8 v; J3 [0 F2 }8 s" {/ p1 K: E
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) ~6 ?9 p: m: x% e' g5 P0 `, @
3 j" G/ J( _) x$ d

3 i" [" g# b: @* N& y1 `  z! n7 ?            //copy data to upp_recv_list_busy
: W% K7 c! `9 {! q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# M# i1 S+ {6 J9 @$ O+ H! U# z% V' \, b3 e' W9 ]
            //3 w) {( ]% H: d
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% l  G/ t% c, h! p: P7 z2 K6 y7 ]% S! `0 m& R
            //
+ M  ^5 u2 K" x& w8 T' O; b            server->upp_channel_a_recv = false;//- f5 h! h' D- y9 N/ t! }3 b8 ]3 \
4 w" `. Q7 y$ w
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" e* ]4 E& ?9 H        }2 ]' y% j' f! _% k
    }0 M. J9 E+ ?2 q# m
& |6 }. O3 W% Q
) E% U- @: s. p
    return true;. q' {9 h! U3 m5 z$ m2 f% g
}8 o  t1 j( h; Y" u  G& F

- F: @' L9 F- S" r6 A8 wstatic bool server_upp_data_send(Server *server)
- `+ @0 u4 L  \$ }) c; `2 N{& y" R' Y' A; C0 Q' D
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- b4 r$ D8 M: H: J, k$ u        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# v# J/ V* }4 P; Z0 w# f; d( E8 j        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) {3 I/ S' `: Q& z! c, R: s        char tmp[128] ={0};
% g+ w' e: Q. o) N5 @" P: ?
$ b3 k8 W- P. z* l& T( w8 ^        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 ^* Z5 F/ F  |) w8 A: J; t: U: }
        print_log(server, data, 64);* l+ k1 h& X7 e( B5 [
7 }# P8 l' S; w" Z. i# a. Y
        //
* i# h# {2 ?& c  W. c/ x        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 v: e1 P0 p) [1 W( h9 T5 p
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ B) _4 k6 _* [        print_log(server, upp_buffer_b, 64);- D) j3 T) a" I) L$ R2 W$ Y4 f- q$ ?
( y  r  W+ A+ i. @4 I2 v
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 F5 A% J: U9 }% E# w; ?
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 8 J; ?. ~, j. [1 L' a
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) f6 y- D9 r* J* Z# P& E" l
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 r+ o! g2 v5 _3 h! n, J# U# A0 v

2 F( K6 u' b: C% H* t8 c8 L; [6 @6 R        memset(tmp, 0, sizeof(tmp));
& q( v  o$ j- m* Z/ l) j# L        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 K% L" t$ p2 {: I- ^! A9 B            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, Z( `+ ]/ T5 J: Z
        server_msg_send(server, APP_CMD_LOG, tmp);
- d- q( f2 v; [/ p2 X
3 T1 _8 n. Z9 i1 X+ }( \        upp_error_count = 0;
6 @! u" v5 ]5 Q) [        upp_dmaq_int_cut = 0;
2 q8 X. o! u: x; b5 Z* u$ M: L! ?        // fill in data
& q$ O9 L# E8 l1 a        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; ^8 i6 y8 H9 u8 J3 t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 g" ~" o. ^; D0 b3 |
( |$ ]. ~$ s# R* `9 a2 e        // wait send success, \2 h( q1 a1 K8 E, z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   J  t. m4 \7 L. }5 k
' ~0 F2 ~. \# I) F: H3 ~8 O
        // make data node in free list
7 W2 ~' F4 @# \( C7 R8 ~8 b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, Y) d/ P) G( B# b$ r9 m        server_msg_send(server, APP_CMD_LOG, "upp send: success");! G  E1 D$ H+ X) R. P5 ]( e
    }
1 P: l/ H0 A* \5 D1 d  S  g    return true;
3 d( R" _- H/ j, i}
% P" |! u8 p' O" N4 |# |- W5 @- v- [# A
6 u4 {5 a7 r- b7 _5 s. J
+ t5 I  t$ T! l/ p, }! p* u

. H  C$ b& o8 o. ~0 O1 ~
5 l: e/ ]: P! E" h2 @: I- f: e4 c3 \

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
5 b# _: p+ \2 q# {4 @
8 H. K0 ?$ ~8 e" I0 u4 Y; v# \7 X; `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 04:00 , Processed in 0.043144 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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