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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : u  k+ b, `4 s9 q" S) h

6 I& L$ I6 Q. k! f/ _- s, Q问题描述:4 W( r: e+ o5 q' C/ N
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ o- m6 A) o0 u9 k  p; y5 g* e* v
4 @2 }" Y9 {( [& O3 N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% L# |8 r  W/ L3 k! T5 l9 G+ V. Q8 C
9 u! B' h9 Y9 ~8 G* u测试结果如下:
6 t9 A, o# f7 V& {  i; U7 ]% k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
0 n2 i+ L. x5 ]9 K" g9 E" g- S
  b  s8 n( }; U/ R# R+ D
& k6 K  f4 C4 Q6 B# z1 V2 |; [( t' ]备注:5 s* O1 Q( Z0 |8 j7 S
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, }4 {1 L/ E5 {8 ^0 M- h/ d
2、相关代码如下:! ?- R/ Q3 w# ?" C1 f& y6 H
//UPP DMA缓冲大小512字节
8 v+ A* X+ v: r#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' k+ ~2 _6 P7 `0 f; v. L6 u( l# p
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT# V8 _# u+ m! v. A3 B
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 ^" k) U/ Q. S) S( A6 l' C
5 N9 f/ \, G6 a0 J5 D
, Y0 N. K' R5 `* k1 [
//upp接收、发送buffer
/ X7 f/ h! \4 `- k#pragma DATA_ALIGN(upp_buffer_a, 8)
5 u  A# F" i* A2 D/ i#pragma DATA_ALIGN(upp_buffer_b, 8)- r. T9 H8 Q  [

  T( P2 F$ ^! E; Q' ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" {. ?, W# p* sunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- U! s7 E1 \6 c
* ~7 s4 ?' G6 [0 o) N
& G: @. I  O6 Q6 I
static bool server_upp_data_recv(Server *server)
2 v; e  z, x3 H{" d5 f( O$ C" ~' [# a
    if(server->upp_channel_a_recv == false) {
) j( ]' P% [8 P5 Q% f: `        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 Y5 o" [+ z; H1 G; A        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; y! W7 \: I8 S
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# f6 l5 G5 ~- ^3 _: l0 K8 H8 E

2 X6 Y7 J7 a5 a1 d: p) `* c" y; a" Q7 s$ U1 T) i4 @4 q& @
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
) t4 }; r2 Y& D7 q7 ^& E2 U$ `, U* e* f: b' t, K! V! p; \
            server->upp_channel_a_recv = true;//( y/ A* S$ f" f1 w$ E
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 t* B" _5 a5 H$ P% G2 x  I- `
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
0 H- w& a7 A3 @4 Z3 ]            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: S" E) Z6 e( a( S7 d; e$ h" [            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# t0 q* }* _3 K5 h3 d% Q
4 @# K" U8 s/ Y, V1 ~            upp_error_count = 0;8 P7 R+ Y+ t4 K& _& c
            upp_dmai_int_cut = 0;
, T, M% W# O! c0 H% y% s
6 }- [2 S% S" c2 [0 I8 M: o" w            // fill in data
; }3 F3 e& l- x            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. T7 {: }: M( j1 N' }1 ]6 Q3 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( _2 ~' T! s& A/ e8 t
        }
# {" J1 z3 ~. B! F    }
. E9 C* Q: I7 j, k$ Q( @    else{
. f4 K4 F' y/ F3 ~7 i" J1 p        if (upp_dmai_int_cut > 0){
0 c5 N& X5 b- k8 s3 \1 q            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! l. Z3 \5 [- i& M/ F, [5 n            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 K* |' v: g; Y, N. d
5 n% J- U# n2 w" w  y
4 ]; m/ I3 M$ v% a            //copy data to upp_recv_list_busy
# \( `, O6 r- ~" W            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ T# p  O* O( Z; w' B$ G, ]9 P
' D, s  c! s/ o7 ]
            //9 V' S) E, b# c8 J  A3 x' W& q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
6 E; D: @4 W1 x1 u5 _% A% B- K& p' N- J2 P& c* H
            //+ Z. l# r: H, f$ J1 ?6 L
            server->upp_channel_a_recv = false;//
' ~0 C! u% R: n0 l) B
; ]& U4 Z8 a; e9 K# o            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 I5 W  M' w  y, f, |4 b" r
        }& C6 Y  n3 `5 v/ [
    }! [2 [2 e4 }  M" Y4 g; w

! l5 W/ C% C& E" n7 T/ c, K3 J% b- Q" D
    return true;
6 `  z. D3 b* x5 @! p}  i, o: i+ t6 q8 N8 W9 S

3 G1 P6 l2 ]* [, Nstatic bool server_upp_data_send(Server *server)
; @1 u8 u$ \+ ?/ m/ o{
& K2 D$ e5 E3 |0 Y2 W    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ d% b- i* H3 `4 ?
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 o$ `2 p% g+ g8 x# p
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 H; N# ]7 V# j& R. S7 D
        char tmp[128] ={0};6 b6 C  Y& K# J- j$ `$ c

4 W/ p; [. S  b+ T8 q        server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 P5 }6 N  p+ \9 I# I' O8 _& Y& Y        print_log(server, data, 64);: W& L( g% o7 m- X" O
! ?: }: L0 D: v7 Y9 J
        //
/ j* Q* Z6 n+ l, S3 y9 L6 f: s* i0 ?0 _        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) u. W* p# ~2 A4 C        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% l' ^) x& k6 v# K8 _$ h; k; l
        print_log(server, upp_buffer_b, 64);8 f8 ]" `) ?6 K% F# U- r
4 F) X0 [% q6 w$ r3 j1 [( b
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
6 I: z4 k8 [% v3 B2 O8 X        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ c5 `! z0 e0 f  {; T
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
9 }' S# B8 |1 U2 }7 a- \- V        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 S1 y' X9 o0 M9 d5 m7 O
. S: F' G/ P/ O0 r2 x        memset(tmp, 0, sizeof(tmp));
1 P+ ~* V" Z& b) H7 C0 s        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
5 O- A2 u7 M" Y" X# i3 o$ t1 L! P            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ H* c0 `: o1 e3 ^: f# N
        server_msg_send(server, APP_CMD_LOG, tmp);; c1 H3 T3 F6 N% l  J: D. m
2 w  j7 ~& f. W" Z  Z4 }3 k$ I( O
        upp_error_count = 0;
* W8 i! O; W0 ^9 A) M% f# c        upp_dmaq_int_cut = 0;
$ D, e+ r) G$ f4 F  E- `        // fill in data
2 E& W; k/ I% w' c        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, v! R) O7 J$ o        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! D1 [* x7 `2 U) R1 t# a9 Y* M" U
        // wait send success: E, S' O; I; n  P" b/ C9 c: _  J
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * G/ _5 C& R' z8 Q, f

% E, g/ D& D) L; |% E        // make data node in free list ) c" V7 X, ]* o3 a, F
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
* w1 ^8 U  G5 H8 z7 e: I        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% c$ p4 s  s+ d% U    }
- L# U9 n. T, b2 V& F    return true;
8 S. i1 h, A$ @: Y! t6 y8 f' ]" y# u3 T}
( q- d$ T# `9 V0 `/ f5 e, H" r9 G5 Q. D9 O  r3 C

0 L* A: V/ H# D
) L4 i1 M8 O0 `! J
! U; F& U1 {, j" M1 G6 o

: |) w: y3 \6 m) p3 g2 x. x' G

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
# I% F0 m, E* G2 M, A- ^$ i( U! j* }- j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 17:05 , Processed in 0.040761 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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