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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 \. b5 R4 `6 j7 k7 Z" @( W

0 y" Q0 v" p% x% a/ N3 d* [问题描述:4 a' v8 E& s" V# F" J5 R  W) p( s" t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( M: E6 G- V: s& v# \+ f' k: @/ M* I$ j$ t
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 W- b( {3 A# s6 @1 i! }) C

4 ~4 e6 Q, B0 ^. \) Z& {4 F测试结果如下:
9 ^' S0 W. p- E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 ~! k6 c8 a8 m4 G0 y
- }- _% X* R" \! g5 G+ N# K
" ?9 b! [) R1 d/ D备注:
& B7 P9 f$ }# v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
1 k% g4 `- `6 J% E  A  R4 s
2、相关代码如下:8 G1 X* L6 L* f) d
//UPP DMA缓冲大小512字节. c! k4 W6 p' L2 o8 K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ p) k- ]4 u1 _. h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT. ?$ V3 J5 @" v; ~9 r0 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, O# Y* {/ M$ b- z5 ]' Z6 F# N% E1 g- u$ B+ q, O+ ?! E7 F
& x  W9 H% @. Q
//upp接收、发送buffer3 [  [4 {! i8 j# N
#pragma DATA_ALIGN(upp_buffer_a, 8)
' d) R7 A6 e. g8 W4 v#pragma DATA_ALIGN(upp_buffer_b, 8)& H$ f- Q7 A  z1 e) H/ R4 u

. ^4 G/ k6 d6 q! N( Zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* J* R, d: k/ o8 K+ t9 f. Q! d) p
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
  {, d+ a" D2 b) M1 F
( p3 m/ G% C3 g+ E% o' O; ^
  o' X% @# X7 u2 b: jstatic bool server_upp_data_recv(Server *server)
1 v8 P! ^) F6 ?& A{
6 G3 H; v; n: f* {& V8 I# [8 v! _: W    if(server->upp_channel_a_recv == false) {1 f! F. n  P& n$ J3 Y( G
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
* N$ ?% `. v5 r7 p" H3 l' b, I        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% T9 k& X0 G" ~# Q0 q# \
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( F6 {1 l( K. k. P3 q7 c

; S% Z5 R7 w- ?9 l
7 w% Z) x; D9 I            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 R/ P0 F- S2 P( p5 T3 j0 W
' j9 I4 I: ]: z' b            server->upp_channel_a_recv = true;//; y% A1 Q# @9 o; _( ]
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);1 M5 g, t: w# }. _8 j
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;' O) W+ n+ l3 ]- z8 p: K
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 A- a, q- y  C9 @+ S/ p8 V
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 p: C/ B5 z4 P! T# q$ r* T$ @2 t
! c! a. C3 s6 C, q3 R1 D            upp_error_count = 0;
4 ^; \' s, q7 B/ I- z, ~( d! y            upp_dmai_int_cut = 0;
6 @. v3 v5 _7 r* c$ j/ v. X* c4 M: ^7 E
            // fill in data
- P2 j$ U4 r% l4 v            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 e: l4 }% m' C5 F2 j
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: C2 v6 w1 d7 N/ z" k, `; s
        }
# X; Y; q* s4 n* i    }
2 q- ~- G$ C: x) P5 a    else{! X$ S1 L1 P+ A( `; c; d; S
        if (upp_dmai_int_cut > 0){
1 W2 p5 ^% ?. B* S3 W" N/ f5 J            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( g  e4 o3 s1 w. C) l9 c* K* p! k- a
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% w2 y& v. A' |3 q; A' H8 q* `
0 _" l1 F: p1 O$ i- D7 f1 H* S
2 ]( U" |* U( M, G: v2 J4 k+ a( ]* e
            //copy data to upp_recv_list_busy4 ^$ ]3 }8 _' X, B" P
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! B) x4 E6 v, L3 B# \$ w/ P) J  N6 T$ l6 W5 ^6 Y: B* H: I1 ~% G
            //
0 ]+ a# A  V& x            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ r* v) A# i( R% ]7 {
  H. q$ j% I( K
            //2 n7 }. L% d: i) o. {* y
            server->upp_channel_a_recv = false;//
. j; M- S" F7 M3 o8 U+ D/ ?
+ C8 c8 [) G& t5 ?9 ]0 C5 q9 }$ R            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 ^! H0 U6 I7 ~
        }
+ a5 ^) E5 q! T9 d) R0 J    }
) l- Q7 d  j; I0 b2 }1 D* R1 o/ I  L

, R1 K0 v, D- X6 y    return true;$ Y. q3 y; L2 ?; c
}0 ^* l/ y, ]. m, \
- @) M% {; U- U/ s2 h! N2 Y6 i
static bool server_upp_data_send(Server *server)
! I0 c9 C. h- b# i{# Q0 ~! b& }$ P: z% u  _0 s3 l# h
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ C3 N+ `" A- ^! A+ z1 w- Q* Q        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- T+ T* S6 i* h* ^5 P" G        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( A- p+ O' h: I0 I        char tmp[128] ={0};
" y. d) u4 a7 C9 P' Q3 t/ b9 {& b- {$ l
        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 V* q9 m; ~: ]8 Q
        print_log(server, data, 64);
% C' E' d  P+ _6 F8 E( t3 t2 f, @  [5 p, {' @7 b3 I: b
        //0 z4 t3 o" R8 n/ X' b4 e; C2 b* D
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% I' i( T/ j0 d1 o0 P% j* |" H8 l8 t) N        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 ]7 y" s- b1 O+ x2 Y; o: b" S
        print_log(server, upp_buffer_b, 64);
* x; \, ?4 t4 B2 c! K3 J* P2 }4 g6 x5 ^" {8 X2 u1 X
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( }) x5 M( S" R  ~. r( ^' h
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # e( L6 N) |6 T; B9 ~$ @
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# I8 \+ ?8 v! W/ s9 i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# \. ?# K5 j* ]
8 y0 i: M; a+ v7 K& p9 N' n+ z
        memset(tmp, 0, sizeof(tmp));7 h, Q" l8 G  ~/ s8 }9 g3 ?8 C
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; O$ }# I+ V3 y" |; g6 s            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& }! L. K) f4 k5 C2 o4 [( k" z. {
        server_msg_send(server, APP_CMD_LOG, tmp);
$ M1 B0 p! t0 e  Q# _5 R. w
) `* n* x7 s; K4 a        upp_error_count = 0;- c, d, R! J/ S2 b
        upp_dmaq_int_cut = 0;1 J2 e) r! Q  {1 u
        // fill in data
& I" g$ B' R/ W5 d6 A& J        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ m2 o6 [0 W( g/ q- w9 Y  n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ S4 C! {0 Z/ I$ D5 Y0 g; b0 F4 m; M- A3 C3 [
        // wait send success
( l6 F" o( x# d& V        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 [+ O2 _: s9 M6 x

. c3 m+ N4 z6 I; D        // make data node in free list - F  W7 M- U, \( ]# a5 ]+ K
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 f; N, U% N+ n2 E6 ^. l
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 P: [- O$ u* ]* [    }& [/ k8 N6 ]9 |0 S$ b0 m; c" I
    return true;
! X  E* p3 U, S8 E& W! A}
$ d' s% P+ o+ r" P( @9 Y! F% z7 g# E+ Y& r: Y
) U8 l: F0 B! d$ a7 u
7 b5 I+ s- `) M1 y

! b6 G0 V( F8 p* V
" M, ~5 v$ y4 b$ T* h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐! a7 N# B. D5 s6 P
; l2 W5 u1 J2 \: \/ ~0 e

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 02:24 , Processed in 0.042447 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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