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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- F9 C; E$ s% }( I/ l2 m
7 Y/ c+ t  n0 x. Q问题描述:! w$ f% n- ~+ c% F: o
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ b; V) m! f6 E  e
( }- d. D" Q0 \; s% W- ?  I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 ]- _3 z. U# T* M/ z' O( ]

2 M* A- S1 f9 U% w% q% b测试结果如下:
. R$ y! k  s0 r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- f+ K3 V* ]8 q( H8 G$ D+ O- G0 R9 m& P2 J+ _2 D

$ j( V# O, h2 G7 f备注:+ Q5 B) Z/ y* `% n, n
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ B( h7 y3 f" E- f1 |# R
2、相关代码如下:
. [+ s! J: [* b' x# e//UPP DMA缓冲大小512字节- n- J+ u! H- X# V, Q& I( g+ g2 b
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. d+ V# t. H7 Y* w4 H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
/ B9 [& k5 Y9 j' L+ T* ]4 F' H! C#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 q6 A' _' s9 e
8 \0 p6 i' t9 D3 ]( f3 i

8 I) x7 L9 j3 h- `//upp接收、发送buffer+ C' X6 r  L3 X" q8 }; b; f
#pragma DATA_ALIGN(upp_buffer_a, 8)& F4 l5 u, I* _% ]+ }1 C
#pragma DATA_ALIGN(upp_buffer_b, 8)  b* U% I/ `* q1 x1 z& V
% {+ G2 b0 A$ u- d5 w8 x
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];, ]% m+ I1 k: W3 W- y% g0 E  X& ?7 v. ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 r! j0 U7 ?& u' \% I; m- G8 R

1 @  O0 [# I+ Q3 Z: g+ v# ^1 j( Z: X& _# _1 b
static bool server_upp_data_recv(Server *server)
- D6 A/ M, D! u( Q, r3 N{1 W4 k1 ~. H1 w: I: S* S" K5 d
    if(server->upp_channel_a_recv == false) {
, \% W/ S3 ~5 K! V- r  j5 W3 j        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% i0 B8 X4 v  A6 f6 v        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ F) J# n- M& U6 K) m
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( `, a: V1 q1 |* \; Z* Q/ C

" u% N  |3 l& y6 Q1 k% j1 o) n  J
: t6 {9 D8 c# k" u  k, V            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ ~2 |" O) S6 q  v
2 A0 I9 T0 q) F7 u            server->upp_channel_a_recv = true;//
2 o" j$ T4 U6 A: @2 i            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ G8 j4 Z/ J. [' F& _8 s            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 g- l6 ?3 a! j! ^: v2 k: R% a' b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; A' V4 \5 k# X5 ~- Q            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" u9 ?9 k1 }/ Q8 ]
( S' T2 o  X; ?  v" j% k
            upp_error_count = 0;! j! A. I% B; I2 n9 C! Y
            upp_dmai_int_cut = 0;8 R+ e6 I6 e! Z2 K% s0 c) Y
) l% ]; A7 y7 e+ I3 E( C
            // fill in data
) F  R+ e* B6 {3 [, @% q/ |4 ]: D            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 {& x4 R% H; V, m            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; n. n0 y# Q. I; g
        }5 @$ Q7 X; J4 i2 K7 L2 h. l# Q
    }
4 Y+ P$ [' w; Z' |    else{
0 d6 K8 M4 Z1 h& {        if (upp_dmai_int_cut > 0){# [+ x1 ~- @8 ]2 o1 k. f# F3 z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# L4 K; K* f( E            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; w5 a6 y1 P2 \1 K  `- ~
2 s3 V% X6 \+ I9 d3 ^

0 Y2 \( M( E! d3 R% Q, L            //copy data to upp_recv_list_busy
% t5 j6 p& j/ T% p            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) \- q. [: H/ P

2 H/ d3 [1 X/ t! a' ]            //6 Y2 s. q# [& |( K7 F9 L' m; }
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ n. A0 z) y+ ~% h# A

+ Y* v1 J2 x2 c4 G+ _1 s  U( L            //: \  p1 W* R7 R
            server->upp_channel_a_recv = false;//% ]2 P* b2 X8 R! N3 ^& u
/ x! q2 ?( o% z* o' p7 f1 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 ]. x1 |" O3 \7 L        }1 S! K1 v, D, v
    }
4 X* S" w1 s/ o1 R9 a: i9 q* Y0 M. E0 _# [$ O* ~% b9 l: |
$ U* R! b4 {3 x: Z
    return true;& F6 k6 I& o. Y7 c
}& j* w3 }% V/ H  R% m5 F, C
2 n& E& i7 ?0 s2 s1 t3 {8 E* K
static bool server_upp_data_send(Server *server)1 R: j& [- ~3 Y" _, i
{
# |, s( R3 B- f5 [* j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 c5 ~' [; X% U; s        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% }- O" w, j' e& {5 Y
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 N; j  o" I4 b  R- r; @# Q4 C* O
        char tmp[128] ={0};
6 {' [5 H( w6 J) ]) O4 B% v
* j4 \% Y% ]0 y6 d5 L% W        server_msg_send(server, APP_CMD_LOG, "upp send: start");! ^$ D6 _! z; d# Y$ B
        print_log(server, data, 64);
* Q3 G5 \# _0 |8 M( |1 S# C  g) u  [, e8 k1 Y5 R
        //
1 i; F* u/ J1 I. N/ \: Q( j        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* @. [- u8 g3 y2 h) q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 b1 K4 f9 [: r2 b, T, f. M$ H5 D
        print_log(server, upp_buffer_b, 64);( g7 j+ L0 E- `  ^9 f, [

& w* d: q  w5 W; E$ ]- d; m        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" R1 J1 H1 e# @, H: l  A        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & H( q6 M1 K  E6 ], |2 m) b* N# e
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 d9 ~3 \/ ^) ~( I' a8 Z) D
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% U7 l9 t9 `' q
3 u! e9 d; W+ S* K! }) Y1 Q3 k% a        memset(tmp, 0, sizeof(tmp));
. t$ S1 T" J4 D* v        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 ?& s$ U5 {; |8 }' W8 X
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' R, |" [2 `3 T+ W$ J; }9 m# G        server_msg_send(server, APP_CMD_LOG, tmp);
* ~' I& |3 o" E7 k/ |: G
0 k+ r7 g! N; |4 A9 R- F        upp_error_count = 0;1 E' h; S- Z- O& ?) ^6 g
        upp_dmaq_int_cut = 0;
9 Q! u1 ^+ y6 G" x5 c        // fill in data . C% h3 i$ L4 h. X6 Z
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ Y% X3 c) x. G% w. {' ?        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
: A- S1 |/ t' [2 l
' F. N. g9 O* L: N& a. M8 H        // wait send success. Q' e& g  o# p* S
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 h. q& ]: D7 O, V

9 w/ w' }- Z7 L7 c- i$ d        // make data node in free list
2 C7 b2 h5 _5 M! o3 p/ g        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% v& v/ y, p& A) g' b
        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 i* [5 i. _4 D/ v% U0 f2 v3 b
    }
% @8 K' d" ]7 y& `/ e2 I' w    return true;
# Z7 @4 a8 }3 Z- |  l  a8 S/ l}
  U/ n6 L0 R! u6 _, s  u( o
& M1 w3 B% Q: M- K3 d' y
% F& Y- ^( {2 _2 U0 l1 r

- v8 \2 F) K0 @, \) I8 _! [
& |' K) R9 e4 d

% g6 M  W8 ?5 @6 P/ p

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: b1 |3 y+ Y; i8 Y. i& U
" d) J4 K2 O) _9 ~: y0 \  }8 @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 22:35 , Processed in 0.052059 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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