1.[bsp][sam9260] Modify the define of irq get and ack function.

This commit is contained in:
ardafu 2015-05-04 16:17:40 +08:00
parent a13132b302
commit cc6b290640
2 changed files with 41 additions and 52 deletions

View File

@ -146,7 +146,7 @@ void at91_aic_init(rt_uint32_t *priority)
*/ */
for (i = 0; i < AIC_IRQS; i++) { for (i = 0; i < AIC_IRQS; i++) {
/* Put irq number in Source Vector Register: */ /* Put irq number in Source Vector Register: */
at91_sys_write(AT91_AIC_SVR(i), i); at91_sys_write(AT91_AIC_SVR(i), i); // no-used
/* Active Low interrupt, with the specified priority */ /* Active Low interrupt, with the specified priority */
at91_sys_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]); at91_sys_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]);
//AT91_AIC_SRCTYPE_FALLING //AT91_AIC_SRCTYPE_FALLING
@ -201,12 +201,11 @@ static void at91_gpio_irq_init()
*/ */
void rt_hw_interrupt_init(void) void rt_hw_interrupt_init(void)
{ {
rt_int32_t i;
register rt_uint32_t idx; register rt_uint32_t idx;
rt_uint32_t *priority = at91sam9260_default_irq_priority; rt_uint32_t *priority = at91sam9260_default_irq_priority;
at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) at91_extern_irq = (1UL << AT91SAM9260_ID_IRQ0) | (1UL << AT91SAM9260_ID_IRQ1)
| (1 << AT91SAM9260_ID_IRQ2); | (1UL << AT91SAM9260_ID_IRQ2);
/* Initialize the AIC interrupt controller */ /* Initialize the AIC interrupt controller */
at91_aic_init(priority); at91_aic_init(priority);
@ -341,7 +340,7 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
/*@}*/ /*@}*/
/*
static int at91_aic_set_type(unsigned irq, unsigned type) static int at91_aic_set_type(unsigned irq, unsigned type)
{ {
unsigned int smr, srctype; unsigned int smr, srctype;
@ -354,13 +353,15 @@ static int at91_aic_set_type(unsigned irq, unsigned type)
srctype = AT91_AIC_SRCTYPE_RISING; srctype = AT91_AIC_SRCTYPE_RISING;
break; break;
case IRQ_TYPE_LEVEL_LOW: case IRQ_TYPE_LEVEL_LOW:
if ((irq == AT91_ID_FIQ) || is_extern_irq(irq)) /* only supported on external interrupts */ // only supported on external interrupts
if ((irq == AT91_ID_FIQ) || is_extern_irq(irq))
srctype = AT91_AIC_SRCTYPE_LOW; srctype = AT91_AIC_SRCTYPE_LOW;
else else
return -1; return -1;
break; break;
case IRQ_TYPE_EDGE_FALLING: case IRQ_TYPE_EDGE_FALLING:
if ((irq == AT91_ID_FIQ) || is_extern_irq(irq)) /* only supported on external interrupts */ // only supported on external interrupts
if ((irq == AT91_ID_FIQ) || is_extern_irq(irq))
srctype = AT91_AIC_SRCTYPE_FALLING; srctype = AT91_AIC_SRCTYPE_FALLING;
else else
return -1; return -1;
@ -373,54 +374,36 @@ static int at91_aic_set_type(unsigned irq, unsigned type)
at91_sys_write(AT91_AIC_SMR(irq), smr | srctype); at91_sys_write(AT91_AIC_SMR(irq), smr | srctype);
return 0; return 0;
} }
*/
rt_uint32_t rt_hw_interrupt_get_active(rt_uint32_t fiq_irq, rt_uint32_t* id) rt_uint32_t rt_hw_interrupt_get_active(rt_uint32_t fiq_irq)
{ {
rt_uint32_t irqstat; //volatile rt_uint32_t irqstat;
rt_uint32_t id;
if (fiq_irq == INT_FIQ) if (fiq_irq == INT_FIQ)
{ return 0;
*id = 0;
}
else //IRQ
{
/* get irq number */
*id = (rt_uint32_t)at91_sys_read(AT91_AIC_IVR);
/* clear pending register */
irqstat = (rt_uint32_t)at91_sys_read(AT91_AIC_ISR);
}
return irqstat; //IRQ
/* AIC need this dummy read */
at91_sys_read(AT91_AIC_IVR);
/* clear pending register */
id = at91_sys_read(AT91_AIC_ISR);
return id;
} }
void rt_hw_interrupt_ack(rt_uint32_t fiq_irq) void rt_hw_interrupt_ack(rt_uint32_t fiq_irq, rt_uint32_t id)
{ {
if (fiq_irq == INT_FIQ)
{
/* new FIQ generation */ /* new FIQ generation */
if (fiq_irq == INT_FIQ)
return;
} /* new IRQ generation */
else
{
// EIOCR must be write any value after interrupt, // EIOCR must be write any value after interrupt,
// or else can't response next interrupt // or else can't response next interrupt
/* new IRQ generation */ at91_sys_write(AT91_AIC_EOICR, 0x0);
at91_sys_write(AT91_AIC_EOICR, 0x55555555);
}
} }
#ifdef RT_USING_FINSH #ifdef RT_USING_FINSH
void list_irq(void) void list_irq(void)
{ {

View File

@ -1,17 +1,26 @@
/* /*
* File : interrupt.h * File : interrupt.h
* This file is part of RT-Thread RTOS * This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2011, RT-Thread Development Team * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
* *
* The license and distribution terms for this file may be * This program is free software; you can redistribute it and/or modify
* found in the file LICENSE in this distribution or at * it under the terms of the GNU General Public License as published by
* http://www.rt-thread.org/license/LICENSE * 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2013-07-06 Bernard first version * 2015-04-14 ArdaFu first version
*/ */
#ifndef __INTERRUPT_H__ #ifndef __INTERRUPT_H__
#define __INTERRUPT_H__ #define __INTERRUPT_H__
@ -19,7 +28,4 @@
#define INT_FIQ 0x01 #define INT_FIQ 0x01
rt_uint32_t rt_hw_interrupt_get_active(rt_uint32_t fiq_irq, rt_uint32_t* id);
void rt_hw_interrupt_ack(rt_uint32_t fiq_irq);
#endif #endif