Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
ec0852cf
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ec0852cf
编写于
10月 07, 2002
作者:
W
wdenk
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Initial revision
上级
ed247f48
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
204 addition
and
0 deletion
+204
-0
cpu/74xx_7xx/interrupts.c
cpu/74xx_7xx/interrupts.c
+204
-0
未找到文件。
cpu/74xx_7xx/interrupts.c
0 → 100644
浏览文件 @
ec0852cf
/*
* (C) Copyright 2001
* Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* interrupts.c - just enough support for the decrementer/timer
*/
#include <common.h>
#include <mpc8xx.h>
#include <mpc8xx_irq.h>
#include <asm/processor.h>
#include <commproc.h>
#include <command.h>
/****************************************************************************/
unsigned
decrementer_count
;
/* count value for 1e6/HZ microseconds */
/****************************************************************************/
static
__inline__
unsigned
long
get_msr
(
void
)
{
unsigned
long
msr
;
asm
volatile
(
"mfmsr %0"
:
"=r"
(
msr
)
:
);
return
msr
;
}
static
__inline__
void
set_msr
(
unsigned
long
msr
)
{
asm
volatile
(
"mtmsr %0"
:
:
"r"
(
msr
));
}
static
__inline__
unsigned
long
get_dec
(
void
)
{
unsigned
long
val
;
asm
volatile
(
"mfdec %0"
:
"=r"
(
val
)
:
);
return
val
;
}
static
__inline__
void
set_dec
(
unsigned
long
val
)
{
asm
volatile
(
"mtdec %0"
:
:
"r"
(
val
));
}
void
enable_interrupts
(
void
)
{
set_msr
(
get_msr
()
|
MSR_EE
);
}
/* returns flag if MSR_EE was set before */
int
disable_interrupts
(
void
)
{
ulong
msr
=
get_msr
();
set_msr
(
msr
&
~
MSR_EE
);
return
((
msr
&
MSR_EE
)
!=
0
);
}
/****************************************************************************/
int
interrupt_init
(
void
)
{
#ifdef DEBUG
printf
(
"interrupt_init: GT main cause reg: %08x:%08x
\n
"
,
GTREGREAD
(
LOW_INTERRUPT_CAUSE_REGISTER
),
GTREGREAD
(
HIGH_INTERRUPT_CAUSE_REGISTER
));
printf
(
"interrupt_init: ethernet cause regs: %08x %08x %08x
\n
"
,
GTREGREAD
(
ETHERNET0_INTERRUPT_CAUSE_REGISTER
),
GTREGREAD
(
ETHERNET1_INTERRUPT_CAUSE_REGISTER
),
GTREGREAD
(
ETHERNET2_INTERRUPT_CAUSE_REGISTER
));
printf
(
"interrupt_init: ethernet mask regs: %08x %08x %08x
\n
"
,
GTREGREAD
(
ETHERNET0_INTERRUPT_MASK_REGISTER
),
GTREGREAD
(
ETHERNET1_INTERRUPT_MASK_REGISTER
),
GTREGREAD
(
ETHERNET2_INTERRUPT_MASK_REGISTER
));
puts
(
"interrupt_init: setting decrementer_count
\n
"
);
#endif
decrementer_count
=
get_tbclk
()
/
CFG_HZ
;
#ifdef DEBUG
puts
(
"interrupt_init: setting actual decremter
\n
"
);
#endif
set_dec
(
get_tbclk
()
/
CFG_HZ
);
#ifdef DEBUG
printf
(
"interrupt_init: enabling interrupts (msr = %08lx)
\n
"
,
get_msr
());
#endif
set_msr
(
get_msr
()
|
MSR_EE
);
#ifdef DEBUG
printf
(
"interrupt_init: done. (msr = %08lx)
\n
"
,
get_msr
());
#endif
return
(
0
);
}
/****************************************************************************/
/*
* Handle external interrupts
*/
void
external_interrupt
(
struct
pt_regs
*
regs
)
{
puts
(
"external_interrupt (oops!)
\n
"
);
}
volatile
ulong
timestamp
=
0
;
/*
* timer_interrupt - gets called when the decrementer overflows,
* with interrupts disabled.
* Trivial implementation - no need to be really accurate.
*/
void
timer_interrupt
(
struct
pt_regs
*
regs
)
{
set_dec
(
decrementer_count
);
timestamp
++
;
#if defined(CONFIG_WATCHDOG)
if
((
timestamp
%
(
CFG_HZ
/
2
))
==
0
)
{
#if defined(CONFIG_PCIPPC2)
extern
void
pcippc2_wdt_reset
(
void
);
pcippc2_wdt_reset
();
#endif
}
#endif
/* CONFIG_WATCHDOG */
}
/****************************************************************************/
void
reset_timer
(
void
)
{
timestamp
=
0
;
}
ulong
get_timer
(
ulong
base
)
{
return
(
timestamp
-
base
);
}
void
set_timer
(
ulong
t
)
{
timestamp
=
t
;
}
/****************************************************************************/
/*
* Install and free a interrupt handler.
*/
void
irq_install_handler
(
int
vec
,
interrupt_handler_t
*
handler
,
void
*
arg
)
{
}
void
irq_free_handler
(
int
vec
)
{
}
/****************************************************************************/
void
do_irqinfo
(
cmd_tbl_t
*
cmdtp
,
bd_t
*
bd
,
int
flag
,
int
argc
,
char
*
argv
[])
{
puts
(
"IRQ related functions are unimplemented currently.
\n
"
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录