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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * I, K4 ^& F* ~

; N- O8 Y; Z# q问题描述:- l' `( }4 Z& H
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
: |2 H- S: n' P" [# a
3 X' p' K  q; ?" H5 Y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& n# w% o  {2 ~# }2 S+ A* e1 u- S+ ?% i! F" H
测试结果如下:
1 u& e) ^6 F& [5 ^! t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) J- a$ X4 h' @. A+ ]7 P" Y
& F) b" |3 K. J

# `4 Y+ h" D8 J2 L% N! H. g" a备注:
/ S: z! x5 J# }. y' ^( |7 e/ `: \  r1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- N9 v0 y3 a( p* L: L; D
2、相关代码如下:3 g* i- ]3 @0 j/ \6 Z4 T
//UPP DMA缓冲大小512字节; E" }4 a7 [2 v. [7 D& O
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. @. y- q& p* K- o8 S% l' L8 `8 Q/ V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ y% a# ]8 @+ s% u) I4 S% x& E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
# O) G2 h/ Y" I1 z1 D; j/ H8 Z, l% G

& d: y( h; B8 M0 V//upp接收、发送buffer& G* ^' S+ L) B* z3 \7 P7 }" a& U
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 @& w3 i+ Z) y* ~#pragma DATA_ALIGN(upp_buffer_b, 8)
3 t: o' Y: T  z* f+ Y. |7 R2 |& x; c( G5 ?6 o( E; Z  T& `% o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* v2 B% P* [  J! o1 [/ G; U3 s) t
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ |* U& v" a: [* i, ?& y) b0 s
/ d3 a4 Z( a8 C- _8 ]

2 P, q, a0 K9 b" ~+ V& Mstatic bool server_upp_data_recv(Server *server)
/ ?  J0 Z7 A% F! r! y{
1 D5 J: h4 s6 A    if(server->upp_channel_a_recv == false) {2 p) t6 Y& h  E! N
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 B6 C+ a4 j! [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 k7 j% [( }  }. l+ R
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");+ M1 j( u$ ?/ M9 p' ~
" M( r' h4 t4 ?3 C- G
4 s$ b- p8 g' j; {; Z
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 N" A$ R- d& z
# }/ S+ I* u) f8 L  ?, O% G            server->upp_channel_a_recv = true;//
& A6 n7 z/ C. b) v2 H            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( L2 a' N( O3 R+ z9 E" X. @6 H( z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;% m. z- [' N" _6 G# G2 I/ l  t
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
4 k! t( b" S- v9 w% Y( f& l            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% R" n* c4 ~5 N8 w

1 v# h6 u- U$ A( ?; e, B6 ^. A2 c7 i            upp_error_count = 0;  E7 Z7 E* A  O5 B0 S( M: B
            upp_dmai_int_cut = 0;
0 I% F. l6 j" G/ Q7 O( J9 w9 A% L( G
$ V9 S% c! N2 ~: o. d7 D0 H/ ?) c: D            // fill in data
2 f5 ]1 y3 L5 S0 [' {  G            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. [5 h9 V, b5 i/ {            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 C* U0 i% c4 U- q0 H        }/ z, n3 S" A$ b2 P* G. {/ I! s' Q
    }8 h7 T) f1 u( D
    else{' j1 M- h' Y! k! o: s% H3 F
        if (upp_dmai_int_cut > 0){
8 D8 @  y- B4 S1 d, O# f* E2 c            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& \4 p+ b! k; A9 x# F7 b: h6 i' o
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 P4 i+ z+ C( b8 T
0 p# G8 z- A+ T# X! C

7 o  h5 O5 L# S8 O            //copy data to upp_recv_list_busy3 ?5 A) }! O% ~1 ^0 ~: d
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 w; P4 I; y' r" ?
* P* r) j. a* j: @6 J# B  f0 ]! b# V8 h            //
5 L: P- I+ T0 B" m            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" n! @1 L1 ^" l! m
* F: y0 @# W, p# [! e
            //
7 Y6 u+ @7 D. }# _9 O. `9 I6 T3 @" u            server->upp_channel_a_recv = false;//
1 r/ E- w: S6 N1 u
& ]& J- G0 u0 h1 Z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ Z$ A0 R7 ^8 D! i5 X4 r. V
        }1 S/ S+ X) q6 d+ q6 E$ u9 i
    }
! b) {- B7 D5 f; u9 `4 t( y( ]2 R
+ e4 Z6 d3 I1 N; b0 }/ u1 t
, q) f9 @7 G8 J    return true;+ Y& V9 d' U: g: \; y1 h/ f0 v- T: l
}
5 y; T0 f$ ~' W/ z
% j/ D6 [+ u$ P' U6 f. N% t% cstatic bool server_upp_data_send(Server *server)
5 n, G( `* M( b& s* u{2 v2 `( |% e( y
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 }  \! z- c& j2 m) H
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  ^7 O) x# {  Y* l/ B8 d9 v, f        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ y. a% U9 G+ q5 F4 A5 ~( ], B) S2 {( w) }
        char tmp[128] ={0};
; j& e& T- y' u
8 I7 \! C. |$ `        server_msg_send(server, APP_CMD_LOG, "upp send: start");( O5 ^: }& t' Q- o
        print_log(server, data, 64);
( G3 d8 u6 I$ f) Y; G8 g
: a; n0 [6 j4 n. n7 X* q3 B' M        //
9 r1 [+ ?% N$ j) l# Q6 r        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 s$ F; j, i8 z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 x- I; S6 a% H
        print_log(server, upp_buffer_b, 64);
/ d' J  G& Y0 P$ x5 Q4 P
( ?8 ]2 J8 r1 H7 n        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 ~8 {' O3 Z( j! [' k2 z$ }
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
8 {! P) l: h& U0 T( u' y4 y        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- B" T+ j8 F' G0 ?  g) Z        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 ?1 A6 ^  Y; m7 {1 W7 p! Q( A9 @4 {# m# {( n8 h7 ~7 Q
        memset(tmp, 0, sizeof(tmp));
6 X3 I" e: _% W7 B9 U$ J8 d4 |( U        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
+ i  b* U6 c$ R. K            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 h: \/ i$ X! H. s        server_msg_send(server, APP_CMD_LOG, tmp);
7 _" f: B8 z! ?9 b$ t- w. [3 {' I9 M3 v+ K
        upp_error_count = 0;( U; K! T7 N; Z! s. C  `
        upp_dmaq_int_cut = 0;
* O4 N, _  Q$ `) N8 G        // fill in data 6 ?/ C5 {0 x: Z7 i* _
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * B% D+ u1 c" `% X( T& x% U% J/ z+ R
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 b4 Y- B. i& L8 v6 j; g: [7 D
) t) H/ b4 v/ ~0 O/ R. c9 q        // wait send success
3 ~# D3 u8 Q" h; l; V: i, ?        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . j9 O1 ^8 y: Q- R

1 F/ {# J, h4 z# u( O- K: E        // make data node in free list
, i2 q+ ?+ Y' N; p, p; G3 {/ Y. N        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 J: ]; A, G, t; S5 r
        server_msg_send(server, APP_CMD_LOG, "upp send: success");- ?" P2 E% z2 k+ O7 f
    }3 o/ g1 ]; S1 A# O
    return true;
8 p8 P# e2 M" n: ]8 `" d}0 n5 c. [3 e% S8 y
8 h5 H2 L; a0 t6 K/ \( b' @' i

8 M) o0 q; d: u6 Q. a9 v5 I% @( {' [, V
: G% I  L$ |+ Q$ T4 P9 A7 A
; U! q  q  v$ G$ q. \5 k

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐# u7 ]( L7 J  B8 U8 d/ ]$ `
5 {/ K( M" S2 K. u' ^, T' u" r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 09:06 , Processed in 0.059043 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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