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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " e$ @0 O2 y. a6 v

, {, b+ }9 n. V" |& ~/ W- U问题描述:
* F- [; A7 q+ T" e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% P& n4 d4 L( [8 R4 e5 [1 v. @
, t5 M' o8 h, `2 m0 e& s- f: E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 A9 V  F" `/ H8 V, J

& y5 `! q* `: @) k0 {+ E3 O测试结果如下:
0 G5 {" U$ [! m! A3 w; s- B1 {138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?" [% E$ n) M3 A- `& Q
) V: W! H! T. ]8 x$ I
9 ^# Q/ n6 ~0 o# `  y
备注:
) o2 ]" H+ y3 F) o0 L. g8 h- T8 ^1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 s; b; Y; l7 F3 {4 M
2、相关代码如下:+ R* _1 k' U* C
//UPP DMA缓冲大小512字节# {4 {; F% b) L+ G: H$ ^( r
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' a, j$ X9 e+ r4 E# C, _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) |7 C: J% n1 Z8 {& B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
  |- K9 I- K5 p9 a0 a" `# I, g, Y+ P' _) O7 k
0 V7 c1 R, Z, G# R5 v1 z: }
//upp接收、发送buffer, ^% m! T5 `, V7 c# X
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 Q# }2 r8 e( M1 F6 X" n2 o#pragma DATA_ALIGN(upp_buffer_b, 8)3 E6 N  N, Y; t, h6 P

0 L  t) u4 S$ `0 H! Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 R0 @. \) x2 L& M2 Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ {$ @' _; w- ~6 Z# [: @) n

( s& T' l& U6 I' d+ `: x2 f& ?' |1 ^, b% `2 T0 Q8 l
static bool server_upp_data_recv(Server *server) 3 E( I2 n1 l; y9 |" K9 H+ X; H
{
* A2 v' d# S% l* @9 a    if(server->upp_channel_a_recv == false) {2 K' ?( G5 z3 J; G8 _! I# D
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, t. z) p+ Y2 c) V2 |        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# a" X$ L4 k2 N8 Y! K
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 J) u* w& c, m2 T3 F) E- c

' l) O. Z% v' Q  u- s1 o; \: c8 c( ~/ Q& Q2 X6 x3 l
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ g: D8 J# X6 |! {8 M% q; d! }. S% Z$ e/ w+ d& u
            server->upp_channel_a_recv = true;//
; u8 ~" G' d4 L# A            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);. j( K) k2 G; A* Y
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" s) |/ M7 _% o+ ^            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% P& j% ^2 S5 b$ b( m
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 |9 O6 j: V" q: Q5 }" Z+ L
. l9 z# o! ?( }0 z3 ]: [! i            upp_error_count = 0;# S' u3 X8 K! l1 }/ [
            upp_dmai_int_cut = 0;
0 A3 l2 o% p2 k( e: ?6 n  b- Z) h2 U! z8 v* R
            // fill in data ) m: d/ g) G" \; |+ {
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 c# |: M  Z/ E: H            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 z$ w  w& m/ t        }
7 L  ~9 B, q) v    }3 f; N+ z$ G" R0 i0 L
    else{! y4 ?' ?% D9 R% ^; @: Q7 Z: t: M& d
        if (upp_dmai_int_cut > 0){
+ m0 g# Y( s8 ]! w; w            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% ~4 G& L; W. [, }7 J6 [8 B( I            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 L& G+ P. o/ T" o
3 k, `$ N! L7 w: r1 Z$ k1 E
% W* e" Q" e$ g( D+ B! V            //copy data to upp_recv_list_busy
/ A0 e' t& r) E1 d) O            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. m! H2 p4 P& J
% c, v5 H0 n1 f& T
            //
* n/ R3 t3 P: Q: C            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 u. l1 l0 T" O$ s7 w6 O$ N% ~2 m
  ?4 \5 h  }6 K% V3 z8 L
            //
. H8 n3 Q0 _& U            server->upp_channel_a_recv = false;//
/ L, Z' f" v) z2 I8 h4 N0 B
! Y2 V! N$ h5 l! C& x3 e7 o& ~5 L            server_msg_send(server, APP_CMD_LOG, "upp recv: success");. s) j0 J0 L6 J
        }' ?4 \$ \/ w: ]9 i3 h5 ]' _" t
    }6 D, F9 j! \- s5 e2 {' }' @& ]* R: R
& i' J$ U% x3 ^+ W! w
& v* a  b( z) g% |' q; P
    return true;/ E, W" u& I5 K8 t* D$ ?) P9 ?
}  j" r- H! u8 a) E7 ?7 h$ n

$ F9 E+ X2 g0 g- tstatic bool server_upp_data_send(Server *server)
. s% q, k/ q5 y: R) d% `' k{
2 G( j. S  k" D8 l& w, o3 R6 _. _    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' x& m- B3 @( s. G3 B
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 I! u5 R! g$ U1 {- B        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);- M; k' P9 E4 o
        char tmp[128] ={0};
0 I# s7 J, m- d3 k- G4 {( Y# O6 y" l* q# F7 G" z8 [8 X
        server_msg_send(server, APP_CMD_LOG, "upp send: start");7 d3 R* O7 I/ N3 F+ Z" m# V
        print_log(server, data, 64);& I4 e* G6 C) V  A
; z! M+ ~& V+ @  c. @+ G
        //
( {) ?7 U' u; S        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! R0 t. x1 p# s        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ H; @' h1 _, L7 G9 ]
        print_log(server, upp_buffer_b, 64);
7 M% l) \" E" Y4 k+ h) N
5 D# g7 q" B/ Y# S5 Q8 W        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 a& W, f, O6 k" l( o  Z# V        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 [; G5 {. p  M) R3 j& ~) y        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! [  l1 b5 k/ v2 C6 k. @
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;% s+ K4 C% c" R
& ?- u" _6 b/ u( {$ t: a: `
        memset(tmp, 0, sizeof(tmp));
& d$ w2 o5 {& g( G        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 i- b1 O; e, N  U. D/ |            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);  D" a: t; f' R& ]  y  ~! m
        server_msg_send(server, APP_CMD_LOG, tmp);
7 O- {; G: G  V( `
9 o1 ?# V1 {  _6 B4 s! r8 @        upp_error_count = 0;
/ x# x5 I1 F9 |* l: e9 X, d5 T& g        upp_dmaq_int_cut = 0;2 z  k6 I" V' A
        // fill in data & Y6 _& f5 G7 p( `! q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
& z$ I  F/ A7 p4 g# R1 E: |        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 Z9 i( j& O* P: F# H
6 u$ l( a6 O+ c% p* `/ T
        // wait send success
3 \  l* k1 N2 @8 g3 }. g        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' C1 m7 M) l( z6 }4 c7 O7 n# W' B2 Z  e9 _  }/ K1 e; Z8 T* K& ?
        // make data node in free list : I2 [8 g. D; c# B1 z* z
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# o2 \1 Y' A* I8 `
        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 D8 A5 U) a' ^( z, D$ A
    }* P* \" h1 s/ }4 A
    return true;
1 _! u9 W9 \$ \  W3 x  N}
6 A7 j+ r% U  `9 e, y
- L/ F; L& ?% q! Y0 ]5 j
) d9 ^, p% M6 C9 {7 W

1 r$ w) U: O/ P  {. M/ W
6 P  k# F" N$ ^9 S* P. L) c2 q

! ]9 h' z* d4 H

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
  L+ @" p# o. [6 K5 R0 x5 u4 B& F0 C5 g8 F' w3 i9 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 09:13 , Processed in 0.042159 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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