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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , O. I2 H; V$ _) U' E

. i4 I  z3 ]$ @7 w; }, u  Z2 z问题描述:
: h  c6 m1 b0 E9 i4 n% |) O6 `- ^7 z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ t$ ~$ z; ?- L

: u/ s* {$ o: t+ i  S. x8 R图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: C: h* b$ V4 \+ H

  h$ X2 [3 [0 e  o# Z% p* u测试结果如下:
# k8 f0 b; S- F$ s- l, W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: k' _5 }' J: q5 P1 I: k& y  V
! y) a2 e+ ?" D
" A2 n; G5 U" s" E$ v4 p! j
备注:
4 c5 c7 a: _! a) Z$ U1 l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 N8 g) a: V! R6 E# k
2、相关代码如下:9 V6 J& `- `6 O; d% o( Z
//UPP DMA缓冲大小512字节$ w2 x3 {1 T8 F) }2 J5 E
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ ^7 i! e' }$ N$ o( X% o
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 F, Z3 `" e, q* v# \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 ]9 A6 ^$ o* L$ s/ q

2 y$ S, i% Z: N* [6 z
! z5 J! T. _4 L5 j; ?5 f( D//upp接收、发送buffer
  P5 y: |5 O7 @7 ~# _#pragma DATA_ALIGN(upp_buffer_a, 8)  p4 o3 f1 `$ v3 P! x& h
#pragma DATA_ALIGN(upp_buffer_b, 8)
, W5 S: J2 D2 ^: x9 `) a" K" l! p. q  O; f1 [% h
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 A+ `0 r* M, T8 yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: G( g# b3 q: p* K9 G1 s: D4 V9 X, H
* J9 S7 U6 z+ }- c9 B/ L
$ a& B, j4 L1 S7 f8 E8 X# l6 v
static bool server_upp_data_recv(Server *server) 2 F. k1 a" c) A2 o
{7 p8 P* S: E! E& }6 y: }
    if(server->upp_channel_a_recv == false) {
" J; H5 q, d3 Z        server_msg_send(server, APP_CMD_LOG, "upp recv: start");# ]% W! h& e4 S' _9 L: U
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 i2 i3 x1 {. F; o, I
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 m: z% n5 E# O: W" c0 e& W% L" y& I/ |/ b. K7 l5 A, V
3 M: {0 s. B6 ]. H
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
  [/ I' Q) ^2 ~1 Q* `: n& g% z
4 i# Y5 z2 D$ _& Q7 a            server->upp_channel_a_recv = true;//
$ F* P% ^0 v; c. @2 [+ H8 O  D5 ]            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
4 g5 a- x. i( p            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( L+ z1 h5 n7 N  I( k! \            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 f% p2 H; w- G5 e
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& z8 u! q% \; [9 a. U  j$ I

5 ?0 I) }# m) G& F            upp_error_count = 0;
" p, `* x& b) c2 r            upp_dmai_int_cut = 0;
! i- j$ u) J7 X  @# f9 a4 o& \6 H. C8 |9 i$ u
            // fill in data
; K( K! I/ n/ `; r            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 W+ {) j( G5 Q" U. |            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% S1 L0 e8 x4 Z2 L7 `        }
0 R8 F9 |% w% m: c' B9 Y4 b    }- t9 ~$ \+ m4 [  v! i5 r
    else{& h0 v$ f0 o5 J! R4 z2 B
        if (upp_dmai_int_cut > 0){
" T) u  [. o% W, r$ Q" y* K" A            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. P. ?" Y$ W5 e+ k            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# f1 P/ _4 T8 n$ h. c) @
5 ^6 s. ~) C! l2 h4 w: X6 S0 Q3 N9 _7 \. v* W
            //copy data to upp_recv_list_busy
; N: b! ?# e6 v2 k0 i; g# ?$ l( r            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! y6 K5 o0 }( a" v- x7 H

. n' m7 y9 Z- L- i2 n            //
6 G/ L4 e/ m9 _$ T# Q4 i            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 g* a7 l" h# _6 b' u8 n2 x" p+ |& p% m6 s6 k
            //" U0 Q5 L# X# V* f) e
            server->upp_channel_a_recv = false;//7 D0 d: ]" n9 I. E* O* [7 |% g8 X8 b3 ?
) z! L1 c$ w( d$ {0 j9 X! C- b  i2 G7 c
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' L$ I/ `4 O5 K  c  w        }& |% S% `! Z- p5 L* V; `
    }
/ J# G) u/ I; W# I7 E# b9 E* T
# g' `: S2 e# h6 F: @% s0 {. L+ M- h# k
    return true;
! v$ D2 u$ h5 q}
/ H! V, i" N& s; H* p, I8 K5 Y6 C  d- q$ a3 s3 u
static bool server_upp_data_send(Server *server)
, O+ h5 O* M* y* c$ m{- Z" D7 B) ^: @
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
  A- e# t4 i/ r! {. C  c4 A3 G        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 k. k6 f5 H* ?( d
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 t! B! B/ R0 W- w2 P% @        char tmp[128] ={0};5 {5 L' q7 v" i
2 b8 s0 W; o$ |
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* z( g$ W+ d5 t0 b% g; s$ N
        print_log(server, data, 64);5 Q! E2 ]5 A$ @

7 A9 |9 o2 E; ^5 B, L        //* D. b2 B, [# [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 C. W( a% P5 G4 }. ~        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! u; d9 `, _! ?; r  l, a
        print_log(server, upp_buffer_b, 64);# I2 D8 V. |( Q3 \# E
% P" ]/ n2 D, C, I' B
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);- |, z! W6 ~% L. J! V- x
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & J+ _- c: Y  h1 \- B5 a' _
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' ?1 p0 Q) ~0 J. u2 w7 Q! M
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;  ?3 s! K1 I# `7 }1 Q8 H$ R
: u' U, N# O; E1 D- a
        memset(tmp, 0, sizeof(tmp));# s6 E9 R) c: F/ C/ u8 k9 U
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 E( O2 l* I1 P& K+ A. C
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 i8 p0 a0 |9 q+ C: d( ~
        server_msg_send(server, APP_CMD_LOG, tmp);. d5 ^. b( n+ T5 O5 M! z3 T4 T8 r
- j2 p" [2 G) h* F. h, w
        upp_error_count = 0;
- k4 L6 V& E6 |% V1 J% J$ L        upp_dmaq_int_cut = 0;
9 W. u) v  y+ e1 P1 a        // fill in data   t0 ^8 ~3 q% q7 S6 M: q0 b$ P
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 k& ^9 _' Z2 y. A' @        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 Z9 a, O$ v; x9 g$ B
7 \' y1 O: c* a( l7 w        // wait send success
$ [5 C! J0 z& m$ o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . h) G: |9 V9 _7 y) w

( _  M( ]6 ?) q9 m+ W6 L4 D; R        // make data node in free list + v# K9 l/ w% r
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);8 y. l0 j1 |7 L( O; M+ Z
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
+ \% I2 t2 Z# {    }
5 L: X6 ?# n3 y! a" c    return true;
0 \& o' L& S+ U0 z/ f; e" T* p: @4 q}/ e5 |5 L) q8 A, `7 [2 k4 f. r  A
4 u% ~3 Z( ], w3 s$ d5 z
5 V6 C+ x5 v+ r

9 i4 D- Q/ n) y: E5 V" B

5 C7 D" [6 Y7 A3 D/ S. @7 }5 z
$ Q2 T! d! V% ~2 z9 }- [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
  x% }0 P) |+ p  X$ \, L2 d* ~, q/ O) p/ \! ]+ f( _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 15:15 , Processed in 0.057605 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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