11/*
22 * File : interrupt.c
33 * This file is part of RT-Thread RTOS
4- * COPYRIGHT (C) 2017, RT-Thread Development Team
4+ * COPYRIGHT (C) 2017-2021 , RT-Thread Development Team
55 *
66 * This program is free software; you can redistribute it and/or modify
77 * it under the terms of the GNU General Public License as published by
2020 * Change Logs:
2121 * Date Author Notes
2222 * 2018-02-08 RT-Thread the first version
23+ * 2020-03-02 Howard Su Use structure to access registers
2324 */
2425
2526#include <rthw.h>
@@ -38,9 +39,6 @@ static void rt_hw_interrupt_handler(int vector, void *param)
3839 rt_kprintf ("Unhandled interrupt %d occured!!!\n" , vector );
3940}
4041
41- #define readl (addr ) (*(volatile unsigned int *)(addr))
42- #define writel (value ,addr ) (*(volatile unsigned int *)(addr) = (value))
43-
4442/**
4543 * This function will initialize hardware interrupt
4644 */
@@ -63,20 +61,20 @@ void rt_hw_interrupt_init(void)
6361 /* set base_addr reg */
6462 INTC -> base_addr_reg = 0x00000000 ;
6563 /* clear enable */
66- INTC -> en_reg0 = 0x00000000 ;
67- INTC -> en_reg1 = 0x00000000 ;
64+ INTC -> en_reg [ 0 ] = 0x00000000 ;
65+ INTC -> en_reg [ 1 ] = 0x00000000 ;
6866 /* mask interrupt */
69- INTC -> mask_reg0 = 0xFFFFFFFF ;
70- INTC -> mask_reg1 = 0xFFFFFFFF ;
67+ INTC -> mask_reg [ 0 ] = 0xFFFFFFFF ;
68+ INTC -> mask_reg [ 1 ] = 0xFFFFFFFF ;
7169 /* clear pending */
72- INTC -> pend_reg0 = 0x00000000 ;
73- INTC -> pend_reg1 = 0x00000000 ;
70+ INTC -> pend_reg [ 0 ] = 0x00000000 ;
71+ INTC -> pend_reg [ 1 ] = 0x00000000 ;
7472 /* set priority */
75- INTC -> resp_reg0 = 0x00000000 ;
76- INTC -> resp_reg1 = 0x00000000 ;
73+ INTC -> resp_reg [ 0 ] = 0x00000000 ;
74+ INTC -> resp_reg [ 1 ] = 0x00000000 ;
7775 /* close fiq interrupt */
78- INTC -> ff_reg0 = 0x00000000 ;
79- INTC -> ff_reg1 = 0x00000000 ;
76+ INTC -> ff_reg [ 0 ] = 0x00000000 ;
77+ INTC -> ff_reg [ 1 ] = 0x00000000 ;
8078}
8179
8280/**
@@ -85,20 +83,16 @@ void rt_hw_interrupt_init(void)
8583 */
8684void rt_hw_interrupt_mask (int vector )
8785{
88- rt_uint32_t mask_addr , data ;
89-
86+ int index ;
9087 if ((vector < 0 ) || (vector > INTERRUPTS_MAX ))
9188 {
9289 return ;
9390 }
9491
95- mask_addr = (rt_uint32_t )( & INTC -> mask_reg0 ) ;
96- mask_addr += vector & 0xE0 ? sizeof ( rt_uint32_t * ) : 0 ;
92+ index = (vector & 0xE0 ) != 0 ;
93+ vector = ( vector & 0x1F ) ;
9794
98- vector &= 0x1F ;
99- data = readl (mask_addr );
100- data |= 0x1 << vector ;
101- writel (data , mask_addr );
95+ INTC -> mask_reg [index ] |= 1 << vector ;
10296}
10397
10498/**
@@ -108,20 +102,16 @@ void rt_hw_interrupt_mask(int vector)
108102 */
109103void rt_hw_interrupt_umask (int vector )
110104{
111- rt_uint32_t mask_addr , data ;
112-
105+ int index ;
113106 if ((vector < 0 ) || (vector > INTERRUPTS_MAX ))
114107 {
115108 return ;
116109 }
117110
118- mask_addr = (rt_uint32_t )( & INTC -> mask_reg0 ) ;
119- mask_addr += vector & 0xE0 ? sizeof ( rt_uint32_t * ) : 0 ;
111+ index = (vector & 0xE0 ) != 0 ;
112+ vector = ( vector & 0x1F ) ;
120113
121- vector &= 0x1F ;
122- data = readl (mask_addr );
123- data &= ~(0x1 << vector );
124- writel (data , mask_addr );
114+ INTC -> mask_reg [index ] &= ~(1 << vector );
125115}
126116
127117/**
@@ -136,7 +126,7 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
136126 void * param , const char * name )
137127{
138128 rt_isr_handler_t old_handler = RT_NULL ;
139- rt_uint32_t pend_addr , en_addr , data ;
129+ int index ;
140130
141131 if ((vector < 0 ) || (vector > INTERRUPTS_MAX ))
142132 {
@@ -151,19 +141,11 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
151141 isr_table [vector ].handler = handler ;
152142 isr_table [vector ].param = param ;
153143
154- pend_addr = (rt_uint32_t )(& INTC -> pend_reg0 );
155- en_addr = (rt_uint32_t )(& INTC -> en_reg0 );
156- pend_addr += vector & 0xE0 ? sizeof (rt_uint32_t * ) : 0 ;
157- en_addr += vector & 0xE0 ? sizeof (rt_uint32_t * ) : 0 ;
144+ index = (vector & 0xE0 ) != 0 ;
145+ vector = (vector & 0x1F );
158146
159- vector &= 0x1F ;
160- data = readl (pend_addr );
161- data &= ~(0x1 << vector );
162- writel (data , pend_addr );
163-
164- data = readl (en_addr );
165- data |= 0x1 << vector ;
166- writel (data , en_addr );
147+ INTC -> pend_reg [index ] &= ~(0x1 << vector );
148+ INTC -> en_reg [index ] |= 0x1 << vector ;
167149
168150 return old_handler ;
169151}
@@ -173,7 +155,7 @@ void rt_interrupt_dispatch(rt_uint32_t fiq_irq)
173155 void * param ;
174156 int vector ;
175157 rt_isr_handler_t isr_func ;
176- rt_uint32_t pend_addr , data ;
158+ int index ;
177159
178160 vector = INTC -> vector_reg - INTC -> base_addr_reg ;
179161 vector = vector >> 2 ;
@@ -184,13 +166,11 @@ void rt_interrupt_dispatch(rt_uint32_t fiq_irq)
184166 /* jump to fun */
185167 isr_func (vector , param );
186168 /* clear pend bit */
187- pend_addr = (rt_uint32_t )(& INTC -> pend_reg0 );
188- pend_addr += vector & 0xE0 ? sizeof (rt_uint32_t * ) : 0 ;
189169
190- vector &= 0x1F ;
191- data = readl ( pend_addr );
192- data &= ~( 0x1 << vector );
193- writel ( data , pend_addr );
170+ index = ( vector & 0xE0 ) != 0 ;
171+ vector = ( vector & 0x1F );
172+
173+ INTC -> pend_reg [ index ] &= ~( 0x1 << vector );
194174
195175#ifdef RT_USING_INTERRUPT_INFO
196176 isr_table [vector ].counter ++ ;
0 commit comments