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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# h: X& F' H- ?5 g( A/ y7 ~) p  S% c+ [5 n: f" E& e
问题描述:
; M4 W7 W% m: f4 R4 J/ Z7 p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; G4 v* T. [; d4 g* E: Y" {
$ d' {4 K4 Q9 E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& ]2 v! l. `1 `1 W% a5 }
  Z: u2 a4 j3 D! ?* K测试结果如下:
  H. H7 k- ~9 J. K: a138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 d/ X6 U- d$ |2 R/ z+ Z0 G6 u" K6 v& v  K( k9 S
& F9 v$ X6 i8 e' ~, P' }8 @- }
备注:0 [" }& @4 t! Y/ o
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?& o6 g% G. F2 K! f
2、相关代码如下:
. |* o- l' J+ O//UPP DMA缓冲大小512字节
6 _' G! s* ?- ]8 r: R#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ P7 [/ s7 w" o& k5 W7 U+ e) V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 c1 u) f6 ~% h! \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; y: o* B! t; ]" B7 }: H4 }3 r2 d) ^9 m/ h" N
# g3 R$ v' c; ]9 p
//upp接收、发送buffer$ D/ c# h' ^& \! M0 m0 S
#pragma DATA_ALIGN(upp_buffer_a, 8)% F0 p3 l  L) j5 S! |1 V
#pragma DATA_ALIGN(upp_buffer_b, 8)
# [" |7 y4 v8 ~( U4 ~# T& U- t3 g/ k4 f0 O1 L% r+ t* ^  l  c/ k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 I6 L# x  ~# r" b# ?8 `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" {, [7 [9 A0 I  h2 N5 ?
8 t% |! l. P6 h# y( [% X" ?/ n

  n; z: |+ s" w: S+ w  X$ Zstatic bool server_upp_data_recv(Server *server) ' p: A1 \8 l6 D% O1 t
{8 T9 {6 p2 ]7 [' N# b+ c
    if(server->upp_channel_a_recv == false) {, n% |  n( ^$ z3 U1 W
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( L' }( T2 q3 ]9 v3 F
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: ]7 D: Q8 ?) P8 |: K            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 R/ C; N' e; Q# H2 A
: y) P4 y, ?9 e
4 |  f6 B2 i* N            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, C0 p" }# z& w0 x8 Y
5 _7 I: Z$ h2 |9 j: g! f            server->upp_channel_a_recv = true;//9 w! `, q# U9 W/ x* T& g5 D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 B3 G7 w0 ~6 U            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
2 b/ A8 J8 @9 Z# O- A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 s# x; _  K) x6 j- E9 j
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//  ~% s) d8 I2 }

2 n, e2 q6 @0 ^! ]0 Y/ g6 _) B            upp_error_count = 0;1 L: ]0 x+ m2 Z& {3 ~! K
            upp_dmai_int_cut = 0;
( D4 y) ^+ R# r* k( C  L
3 |! p- I6 c  M+ y* u- f            // fill in data ( d& Z7 [1 Z8 D9 I+ M) k
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ B& A% n% L! C: Z6 b            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 @' [* p* E* h/ \; P) O9 B/ `  c+ _        }
5 `) A7 E; l2 \6 o    }
/ `% q9 i# H) e2 ~7 L    else{2 U, a! M$ q; E' V
        if (upp_dmai_int_cut > 0){
' e8 K, s. T2 K) T8 ?            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 `( C2 {/ B1 f/ l) G# w
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ U6 M/ A$ N* G7 ?9 w7 k% {8 o
% b2 H3 q6 |$ e! Q( G- m
            //copy data to upp_recv_list_busy
( D! c1 [' y1 J$ Q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 L9 @& Z5 l( [9 {0 D1 D
, F* ?9 J" \4 o4 h. t( S7 F8 V
            //
  z& u3 v, r9 M            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 p; O6 T& K; C) B
! b9 t( U* D) S; [  q            //
+ z' I$ R7 H& x% W/ D# E4 f            server->upp_channel_a_recv = false;//
# A+ l4 d2 T1 }" J3 _& i9 u
$ J( V4 q  w2 d+ @9 F' k            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  a- ^* G% |" N9 t! V* v4 x8 g% a        }
4 v( `4 f+ p. P/ Z; U    }
: F3 C9 d" V) o# C( I1 U5 u! F( O/ N0 e% @5 w/ t' S9 z" t) b' d6 f

( N; o& j# H; @8 `; t( M& X    return true;
; j! b* L) `& k- t7 j}
+ T) Q2 A# q% p( A
- d6 W& U& `; O; [% W; astatic bool server_upp_data_send(Server *server)1 w6 K/ r- {# t0 K' A1 `
{
7 r) g/ L0 H, }$ p* L# E5 |* i5 x    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ A  s: f2 l. P4 V% R1 a( w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ k. U9 z  O# e# c0 t  V
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);' k* X2 t  ?- I, p4 g
        char tmp[128] ={0};; I" s4 R5 S. L$ Q

- _1 f( j0 k. a        server_msg_send(server, APP_CMD_LOG, "upp send: start");2 b  P) P* F# x- J# L2 e- ]
        print_log(server, data, 64);5 T2 `: [" H. S2 b7 r( \

5 A; J, Q* _0 [$ x# m        //
5 b& M0 a) g0 s, v- L4 `6 X9 e        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; _2 L9 ~) ]8 o4 s7 D7 Y        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% y& I: Y7 i6 a. Y" u
        print_log(server, upp_buffer_b, 64);7 s$ v+ f( {" v. b. U$ d' W

4 s& _+ [% _: P5 g" c) C# C        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
8 T! `4 B  @, u: `/ |0 |( N4 w0 I( f        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 i8 l7 Z' g2 l- Q+ h+ V+ n
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
0 i7 D) t+ |5 W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 s, Y2 f% b6 N% ~
4 y1 E+ X/ }& S% C
        memset(tmp, 0, sizeof(tmp));/ B6 j$ G' H& \& e: v0 _6 x3 h
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : w" K" I/ I* ]* g" F1 Z
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" N1 s" C# w5 w8 A4 z0 V" c2 d        server_msg_send(server, APP_CMD_LOG, tmp);
% F" d- m9 Q1 m' ~: ]( M% r3 M& X0 w9 b) u5 l2 ]' k* ^
        upp_error_count = 0;
! C- i! q. s1 b) C  X+ a        upp_dmaq_int_cut = 0;
; c* C; ~& e. U  w        // fill in data : P, v3 j  U# V6 i0 N* ~
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
9 @! ^4 y1 k4 b; m6 F! P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 P8 ?) F! Q! k/ D; f$ R  Z
0 s/ A  w+ Y1 M
        // wait send success
  V! ~- x, e9 S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# Y4 _! e4 O+ q8 f- h' v& X4 b% ^( F9 C1 q- w/ c
        // make data node in free list
& Z% y8 W* V3 ~5 e( @        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( ?  P0 E$ }$ o7 b. k) p        server_msg_send(server, APP_CMD_LOG, "upp send: success");" j0 s( G6 ~+ B
    }
& p5 f3 |" ]2 u6 u# K7 K- F9 ^+ ~! Q    return true;  v+ ]' S+ F4 B( C5 X2 _9 Q6 a7 ?
}# q- y  D6 o$ e

8 u! f5 g( V) l- T: u7 C  n
$ d. d& h) v. j  M
7 C9 `3 A2 V3 ~  I$ B$ P) O

9 R) p1 t, S* X& T# U0 b+ x0 I5 k) y# P% z4 z6 B

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 g' h0 M, N" p. N/ i3 P7 i' u$ w, b+ {7 l; l' b7 O

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 23:41 , Processed in 0.052245 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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