Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lfmiao0
rt-thread
提交
dfe26e21
R
rt-thread
项目概览
lfmiao0
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
dfe26e21
编写于
3月 03, 2021
作者:
B
Bernard Xiong
提交者:
GitHub
3月 03, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4412 from howard0su/intr_cleanup
Cleanup Interrupt for F1S
上级
31fdf98e
b22b7cbd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
38 addition
and
70 deletion
+38
-70
bsp/allwinner_tina/libcpu/interrupt.c
bsp/allwinner_tina/libcpu/interrupt.c
+30
-50
bsp/allwinner_tina/libcpu/interrupt.h
bsp/allwinner_tina/libcpu/interrupt.h
+8
-20
未找到文件。
bsp/allwinner_tina/libcpu/interrupt.c
浏览文件 @
dfe26e21
/*
* File : interrupt.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2017, RT-Thread Development Team
* COPYRIGHT (C) 2017
-2021
, RT-Thread Development Team
*
* 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
...
...
@@ -20,6 +20,7 @@
* Change Logs:
* Date Author Notes
* 2018-02-08 RT-Thread the first version
* 2020-03-02 Howard Su Use structure to access registers
*/
#include <rthw.h>
...
...
@@ -38,9 +39,6 @@ static void rt_hw_interrupt_handler(int vector, void *param)
rt_kprintf
(
"Unhandled interrupt %d occured!!!
\n
"
,
vector
);
}
#define readl(addr) (*(volatile unsigned int *)(addr))
#define writel(value,addr) (*(volatile unsigned int *)(addr) = (value))
/**
* This function will initialize hardware interrupt
*/
...
...
@@ -63,20 +61,20 @@ void rt_hw_interrupt_init(void)
/* set base_addr reg */
INTC
->
base_addr_reg
=
0x00000000
;
/* clear enable */
INTC
->
en_reg
0
=
0x00000000
;
INTC
->
en_reg
1
=
0x00000000
;
INTC
->
en_reg
[
0
]
=
0x00000000
;
INTC
->
en_reg
[
1
]
=
0x00000000
;
/* mask interrupt */
INTC
->
mask_reg
0
=
0xFFFFFFFF
;
INTC
->
mask_reg
1
=
0xFFFFFFFF
;
INTC
->
mask_reg
[
0
]
=
0xFFFFFFFF
;
INTC
->
mask_reg
[
1
]
=
0xFFFFFFFF
;
/* clear pending */
INTC
->
pend_reg
0
=
0x00000000
;
INTC
->
pend_reg
1
=
0x00000000
;
INTC
->
pend_reg
[
0
]
=
0x00000000
;
INTC
->
pend_reg
[
1
]
=
0x00000000
;
/* set priority */
INTC
->
resp_reg
0
=
0x00000000
;
INTC
->
resp_reg
1
=
0x00000000
;
INTC
->
resp_reg
[
0
]
=
0x00000000
;
INTC
->
resp_reg
[
1
]
=
0x00000000
;
/* close fiq interrupt */
INTC
->
ff_reg
0
=
0x00000000
;
INTC
->
ff_reg
1
=
0x00000000
;
INTC
->
ff_reg
[
0
]
=
0x00000000
;
INTC
->
ff_reg
[
1
]
=
0x00000000
;
}
/**
...
...
@@ -85,20 +83,16 @@ void rt_hw_interrupt_init(void)
*/
void
rt_hw_interrupt_mask
(
int
vector
)
{
rt_uint32_t
mask_addr
,
data
;
int
index
;
if
((
vector
<
0
)
||
(
vector
>
INTERRUPTS_MAX
))
{
return
;
}
mask_addr
=
(
rt_uint32_t
)(
&
INTC
->
mask_reg0
)
;
mask_addr
+=
vector
&
0xE0
?
sizeof
(
rt_uint32_t
*
)
:
0
;
index
=
(
vector
&
0xE0
)
!=
0
;
vector
=
(
vector
&
0x1F
)
;
vector
&=
0x1F
;
data
=
readl
(
mask_addr
);
data
|=
0x1
<<
vector
;
writel
(
data
,
mask_addr
);
INTC
->
mask_reg
[
index
]
|=
1
<<
vector
;
}
/**
...
...
@@ -108,20 +102,16 @@ void rt_hw_interrupt_mask(int vector)
*/
void
rt_hw_interrupt_umask
(
int
vector
)
{
rt_uint32_t
mask_addr
,
data
;
int
index
;
if
((
vector
<
0
)
||
(
vector
>
INTERRUPTS_MAX
))
{
return
;
}
mask_addr
=
(
rt_uint32_t
)(
&
INTC
->
mask_reg0
)
;
mask_addr
+=
vector
&
0xE0
?
sizeof
(
rt_uint32_t
*
)
:
0
;
index
=
(
vector
&
0xE0
)
!=
0
;
vector
=
(
vector
&
0x1F
)
;
vector
&=
0x1F
;
data
=
readl
(
mask_addr
);
data
&=
~
(
0x1
<<
vector
);
writel
(
data
,
mask_addr
);
INTC
->
mask_reg
[
index
]
&=
~
(
1
<<
vector
);
}
/**
...
...
@@ -136,7 +126,7 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
void
*
param
,
const
char
*
name
)
{
rt_isr_handler_t
old_handler
=
RT_NULL
;
rt_uint32_t
pend_addr
,
en_addr
,
data
;
int
index
;
if
((
vector
<
0
)
||
(
vector
>
INTERRUPTS_MAX
))
{
...
...
@@ -151,19 +141,11 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
isr_table
[
vector
].
handler
=
handler
;
isr_table
[
vector
].
param
=
param
;
pend_addr
=
(
rt_uint32_t
)(
&
INTC
->
pend_reg0
);
en_addr
=
(
rt_uint32_t
)(
&
INTC
->
en_reg0
);
pend_addr
+=
vector
&
0xE0
?
sizeof
(
rt_uint32_t
*
)
:
0
;
en_addr
+=
vector
&
0xE0
?
sizeof
(
rt_uint32_t
*
)
:
0
;
index
=
(
vector
&
0xE0
)
!=
0
;
vector
=
(
vector
&
0x1F
);
vector
&=
0x1F
;
data
=
readl
(
pend_addr
);
data
&=
~
(
0x1
<<
vector
);
writel
(
data
,
pend_addr
);
data
=
readl
(
en_addr
);
data
|=
0x1
<<
vector
;
writel
(
data
,
en_addr
);
INTC
->
pend_reg
[
index
]
&=
~
(
0x1
<<
vector
);
INTC
->
en_reg
[
index
]
|=
0x1
<<
vector
;
return
old_handler
;
}
...
...
@@ -173,7 +155,7 @@ void rt_interrupt_dispatch(rt_uint32_t fiq_irq)
void
*
param
;
int
vector
;
rt_isr_handler_t
isr_func
;
rt_uint32_t
pend_addr
,
data
;
int
index
;
vector
=
INTC
->
vector_reg
-
INTC
->
base_addr_reg
;
vector
=
vector
>>
2
;
...
...
@@ -184,13 +166,11 @@ void rt_interrupt_dispatch(rt_uint32_t fiq_irq)
/* jump to fun */
isr_func
(
vector
,
param
);
/* clear pend bit */
pend_addr
=
(
rt_uint32_t
)(
&
INTC
->
pend_reg0
);
pend_addr
+=
vector
&
0xE0
?
sizeof
(
rt_uint32_t
*
)
:
0
;
vector
&=
0x1F
;
data
=
readl
(
pend_addr
);
data
&=
~
(
0x1
<<
vector
);
writel
(
data
,
pend_add
r
);
index
=
(
vector
&
0xE0
)
!=
0
;
vector
=
(
vector
&
0x1F
);
INTC
->
pend_reg
[
index
]
&=
~
(
0x1
<<
vecto
r
);
#ifdef RT_USING_INTERRUPT_INFO
isr_table
[
vector
].
counter
++
;
...
...
bsp/allwinner_tina/libcpu/interrupt.h
浏览文件 @
dfe26e21
/*
* File : interrupt.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2017, RT-Thread Development Team
* COPYRIGHT (C) 2017
-2021
, RT-Thread Development Team
*
* 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
...
...
@@ -20,6 +20,7 @@
* Change Logs:
* Date Author Notes
* 2018-02-08 RT-Thread the first version
* 2020-03-2 Howard Su Define same regsiters as an array
*/
#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__
...
...
@@ -74,34 +75,21 @@ struct tina_intc
volatile
rt_uint32_t
base_addr_reg
;
/* 0x04 */
volatile
rt_uint32_t
reserved0
;
volatile
rt_uint32_t
nmi_ctrl_reg
;
/* 0x0C */
volatile
rt_uint32_t
pend_reg0
;
/* 0x10 */
volatile
rt_uint32_t
pend_reg1
;
/* 0x14 */
volatile
rt_uint32_t
pend_reg
[
2
];
/* 0x10, 0x14 */
volatile
rt_uint32_t
reserved1
[
2
];
volatile
rt_uint32_t
en_reg0
;
/* 0x20 */
volatile
rt_uint32_t
en_reg1
;
/* 0x24 */
volatile
rt_uint32_t
en_reg
[
2
];
/* 0x20, 0x24 */
volatile
rt_uint32_t
reserved2
[
2
];
volatile
rt_uint32_t
mask_reg0
;
/* 0x30 */
volatile
rt_uint32_t
mask_reg1
;
/* 0x34 */
volatile
rt_uint32_t
mask_reg
[
2
];
/* 0x30, 0x34 */
volatile
rt_uint32_t
reserved3
[
2
];
volatile
rt_uint32_t
resp_reg0
;
/* 0x40 */
volatile
rt_uint32_t
resp_reg1
;
/* 0x44 */
volatile
rt_uint32_t
resp_reg
[
2
];
/* 0x40, 0x44 */
volatile
rt_uint32_t
reserved4
[
2
];
volatile
rt_uint32_t
ff_reg0
;
/* 0x50 */
volatile
rt_uint32_t
ff_reg1
;
/* 0x54 */
volatile
rt_uint32_t
ff_reg
[
2
];
/* 0x50, 0x54 */
volatile
rt_uint32_t
reserved5
[
2
];
volatile
rt_uint32_t
prio_reg0
;
/* 0x60 */
volatile
rt_uint32_t
prio_reg1
;
/* 0x64 */
volatile
rt_uint32_t
prio_reg2
;
/* 0x68 */
volatile
rt_uint32_t
prio_reg3
;
/* 0x6C */
volatile
rt_uint32_t
prio_reg
[
4
];
/* 0x60 - 0x6c */
}
;
typedef
struct
tina_intc
*
tina_intc_t
;
#define INTC ((tina_intc_t)INTC_BASE_ADDR)
void
rt_hw_interrupt_init
(
void
);
void
rt_hw_interrupt_mask
(
int
vector
);
void
rt_hw_interrupt_umask
(
int
vector
);
rt_isr_handler_t
rt_hw_interrupt_install
(
int
vector
,
rt_isr_handler_t
handler
,
void
*
param
,
const
char
*
name
);
#endif
/* __INTERRUPT_H__ */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录