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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' N( t1 J: ]4 _1 d' W3 g) e2 _( }( Z6 R$ _% b
问题描述:) u' A) L, T+ ~6 k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  y0 Z7 |6 q: F4 F

7 F0 l: j! P2 `* k; o' z' f1 L( b9 t( p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 |0 |5 [7 Y0 }% E4 z
. W- B7 }4 i9 V测试结果如下:
: t4 R5 S$ [! K% Z9 U138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
  V6 O+ c1 {' o' L8 W
1 j% q# i: X: V5 r5 X9 `
7 L, v! B. L9 ?; ?9 {/ t9 j备注:
8 I2 P" q! p: K5 W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- ~* b0 G9 V2 F$ \& e, G4 \9 _$ \
2、相关代码如下:
+ A, j0 K5 x% V. t//UPP DMA缓冲大小512字节
5 w9 X# E) D  O8 c1 a#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, s/ b3 ]  X" R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% I6 v8 R! j  d- f: e( ^) z0 C3 ?3 ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 a5 t2 H& p5 a/ j
8 w0 n$ w6 V" u( ?) d9 A9 ?  T3 i/ _, D
//upp接收、发送buffer
1 F4 i* H: q" T#pragma DATA_ALIGN(upp_buffer_a, 8)
  u& w7 v0 Z- |5 V/ G#pragma DATA_ALIGN(upp_buffer_b, 8), D- q/ p8 ]& c% x

* M) o: D8 \! C9 \6 V5 p  ^6 w5 e- d, @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. F1 C3 F% J4 S3 I  Y: X1 v. [
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, [7 o' l( U, Q7 _
. U8 x* `1 m* N3 {. s- |1 j6 p. C

9 x# ^: v5 @; i. istatic bool server_upp_data_recv(Server *server)
- Q2 G  o4 n7 h4 i- k  H{: w6 w' [3 u7 D1 y: T6 x8 \4 a
    if(server->upp_channel_a_recv == false) {) I4 n# A! y( P, s( N0 X" }" o- ^2 o
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ C. I) X4 V) \% P/ b
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, ?) g$ k% g6 S% s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# L" Y2 ~5 W1 i0 R4 o: J) ?6 R' S" S4 D& X: f2 ]( }

, c) |" S( F  k            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* X# P: n1 V2 ^2 h- B6 _& }

  p0 G! c0 m5 A' z( f! b            server->upp_channel_a_recv = true;//- S) i* D  t; w% M; W
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
. y+ k& o7 r# T            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;/ [0 S9 Z* J/ \7 s. `9 f
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- P) @1 R/ g; f; b! C( x- \! M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' Y7 F; Q$ B8 B2 `3 `. d7 U4 |' `

% |5 F6 \: m/ b            upp_error_count = 0;
( o- y' t; ^1 u8 x6 p3 U            upp_dmai_int_cut = 0;) F% B! u# P8 _0 p* |4 ?) n

! n: @) z- `2 `( H3 T            // fill in data
- s' r" {! l; ?" [/ V/ m1 j            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) ?" k! E( P" \. w$ d
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* q- f& g. I# h- |. t* F) X        }
: h! B7 i7 X  H4 `+ k    }
% l# [& ?0 A' @    else{
, W' ^$ q% i" s: h9 p        if (upp_dmai_int_cut > 0){
4 [; _8 W1 N- h            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ a% X( [. j4 ^" r; Z. F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: S1 Z$ o+ f! \5 @7 {; Z, F" c6 {$ W& I; ^1 _( t. P

. B* r- j* l  I  r            //copy data to upp_recv_list_busy! ~1 W0 ~2 [4 l, S' k% A& l
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 j$ Q3 }! M6 ^7 G! e5 z4 B5 q

& J' U3 B" n1 M7 L  z            //
6 g) D1 u% @' K; U1 C- z) ~* G            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) A) G1 b2 ?4 i  F! D
/ [, {3 M7 K; L; B3 N4 [2 T
            //( X$ q: v- P5 `8 M
            server->upp_channel_a_recv = false;//
) }- ~# x8 X1 h* ~7 U: U2 T( H+ t4 ^$ P, {' C
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 M7 T5 f& @5 ]) B' D. J
        }6 b! V* S& e$ o0 R. m  @, f
    }
  k' e/ Z& Q; X8 v% Z
9 ?' b! y* a* X" P
. m- Q2 |0 u$ a& s: D    return true;
" I0 y2 D' |$ R' x, x}  [* p& P/ J' w8 d! [7 ?
9 L; P! F# c/ ^
static bool server_upp_data_send(Server *server)
! i- o* X0 ^# F  r{7 ]3 K8 q( b# ?, f. [% K" a
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){5 I' ?8 t! o' U" [9 F6 C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 H' q. d/ P5 O8 d5 k
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. a0 J0 B  G7 [4 g9 s4 _" u2 F
        char tmp[128] ={0};
! G$ k! h. O3 o1 O# r
/ v$ }+ y& h1 _% r- b& k/ S& A        server_msg_send(server, APP_CMD_LOG, "upp send: start");+ w/ h. R' s' R# j& v1 l
        print_log(server, data, 64);1 T1 Q  o4 ~1 E: b: @! v

, E5 |, {' W, M- j5 V1 x        //
' Y3 b; q& _6 r# m        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; v/ B" Q  _0 E4 R8 ^( Q, Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 |/ A( G2 g% w' e& M        print_log(server, upp_buffer_b, 64);
( y: R$ D6 }- @. w/ i! D/ h8 w& v9 z, Y0 ]
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
0 W0 s* T0 B. F* v& ^; r: E        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- B" f8 d$ K( [1 l        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;3 h! B- j7 E" v
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: O! v" g5 M7 b+ W% w
' C9 q& h5 M# _. K8 T
        memset(tmp, 0, sizeof(tmp));
- H2 z4 e6 O  Y        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( s+ j- }4 c: G/ n# Z# |
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ f0 ?. J$ ^  L2 L' i9 Z9 d
        server_msg_send(server, APP_CMD_LOG, tmp);
  R1 K% V; o* P/ X( {( P: s. z1 u# `
        upp_error_count = 0;3 U8 h# [# Z, G+ _# V8 g+ T3 X
        upp_dmaq_int_cut = 0;
5 Y2 R- j& I* e- n! g7 b        // fill in data . X: y! U2 S& W. H! _  |: ]
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / D) O( \( C" w# g  |
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: P' i4 q4 R' N/ Y
1 m% s" x2 ~( |# R# F, T
        // wait send success
7 d% b0 q, d6 c6 z- U1 X! }6 S( F3 o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 X( M: C2 ^0 z! O; d
9 o0 |( Y" n0 |- b
        // make data node in free list + t) l  v4 V) C5 }" Q
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- ]( c# m' {6 W2 p6 i* y3 ?        server_msg_send(server, APP_CMD_LOG, "upp send: success");( ^) T- U% Z3 R3 b- q" D: R; V" y
    }
- w( ?1 Z; J# S, K+ g& y% |) J8 X    return true;3 [2 H0 I( _8 v: @& o+ L* ^% J) T
}6 R+ r3 R( O  O5 u

2 E% z3 W, I0 C( b! f8 L7 B) c
6 b/ e" F7 m* i  _: E6 s* O2 [( l
) X! ^) M. X6 K$ z' c( q

* x5 U$ a) C  A- e: X5 F+ w. Y1 ~" i% o

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
" {+ k" i9 @) c; g; ~. I8 b& z! D$ a

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 04:20 , Processed in 0.041756 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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