Browse Source

update sep4020: Modify the interrupt interface implementations.

aozima 12 years ago
parent
commit
29a3ae4368

+ 6 - 5
bsp/mini4020/drivers/board.c

@@ -34,7 +34,7 @@ struct serial_device uart0 =
 /**
 /**
  * This function will handle rtos timer
  * This function will handle rtos timer
  */
  */
-void rt_timer_handler(int vector)
+void rt_timer_handler(int vector, void *param)
 {
 {
 	rt_uint32_t clear_int;
 	rt_uint32_t clear_int;
 	rt_tick_increase();
 	rt_tick_increase();
@@ -47,7 +47,7 @@ void rt_timer_handler(int vector)
 /**
 /**
  * This function will handle serial
  * This function will handle serial
  */
  */
-void rt_serial_handler(int vector)
+void rt_serial_handler(int vector, void *param)
 {
 {
 	//rt_kprintf("in rt_serial_handler\n");
 	//rt_kprintf("in rt_serial_handler\n");
 	rt_int32_t stat = *(RP)UART0_IIR ;
 	rt_int32_t stat = *(RP)UART0_IIR ;
@@ -78,16 +78,17 @@ static void rt_hw_board_led_init(void)
 
 
   *(RP)GPIO_PORTE_DATA &= ~0x38;  /* low */
   *(RP)GPIO_PORTE_DATA &= ~0x38;  /* low */
 }
 }
+
 /**
 /**
  * This function will init timer4 for system ticks
  * This function will init timer4 for system ticks
  */
  */
- void rt_hw_timer_init(void)
+void rt_hw_timer_init(void)
 {
 {
 	/*Set timer1*/
 	/*Set timer1*/
 	*(RP)TIMER_T1LCR = 880000;
 	*(RP)TIMER_T1LCR = 880000;
 	*(RP)TIMER_T1CR = 0x06;
 	*(RP)TIMER_T1CR = 0x06;
 
 
-	rt_hw_interrupt_install(INTSRC_TIMER1, rt_timer_handler, RT_NULL);
+	rt_hw_interrupt_install(INTSRC_TIMER1, rt_timer_handler, RT_NULL, "tick");
 	rt_hw_interrupt_umask(INTSRC_TIMER1);
 	rt_hw_interrupt_umask(INTSRC_TIMER1);
 
 
 	/*Enable timer1*/
 	/*Enable timer1*/
@@ -119,7 +120,7 @@ void rt_hw_uart_init(void)
 	/*Disable tx interrupt*/
 	/*Disable tx interrupt*/
 	*(RP)(UART0_IER) &= ~(0x1<<1);
 	*(RP)(UART0_IER) &= ~(0x1<<1);
 	
 	
-	rt_hw_interrupt_install(INTSRC_UART0, rt_serial_handler, RT_NULL);
+	rt_hw_interrupt_install(INTSRC_UART0, rt_serial_handler, RT_NULL, "UART0");
 	rt_hw_interrupt_umask(INTSRC_UART0);
 	rt_hw_interrupt_umask(INTSRC_UART0);
 	/* register uart0 */
 	/* register uart0 */
 	rt_hw_serial_register(&uart0_device, "uart0",
 	rt_hw_serial_register(&uart0_device, "uart0",

+ 3 - 3
bsp/mini4020/drivers/dm9161.c

@@ -81,7 +81,7 @@ struct rt_dm9161_eth
 static struct rt_dm9161_eth dm9161_device;
 static struct rt_dm9161_eth dm9161_device;
 static struct rt_semaphore sem_ack, sem_lock;
 static struct rt_semaphore sem_ack, sem_lock;
 
 
-void rt_dm9161_isr(int irqno);
+void rt_dm9161_isr(int irqno, void *param);
 
 
 static void udelay(unsigned long ns)
 static void udelay(unsigned long ns)
 {
 {
@@ -201,7 +201,7 @@ static void read_phy(unsigned char phy_addr, unsigned char address, unsigned int
 }
 }
 
 
 /* interrupt service routine */
 /* interrupt service routine */
-void rt_dm9161_isr(int irqno)
+void rt_dm9161_isr(int irqno, void *param)
 {
 {
 	unsigned long intstatus;
 	unsigned long intstatus;
 	rt_uint32_t address;
 	rt_uint32_t address;
@@ -469,7 +469,7 @@ static rt_err_t rt_dm9161_open(rt_device_t dev, rt_uint16_t oflag)
 	*(volatile unsigned long*)GPIO_PORTA_INTRCLR |= 0x0080;    //Çå³ýÖжÏ
 	*(volatile unsigned long*)GPIO_PORTA_INTRCLR |= 0x0080;    //Çå³ýÖжÏ
 	*(volatile unsigned long*)GPIO_PORTA_INTRCLR = 0x0000;          //Çå³ýÖжÏ
 	*(volatile unsigned long*)GPIO_PORTA_INTRCLR = 0x0000;          //Çå³ýÖжÏ
 
 
-	rt_hw_interrupt_install(INTSRC_MAC, rt_dm9161_isr, RT_NULL);
+	rt_hw_interrupt_install(INTSRC_MAC, rt_dm9161_isr, RT_NULL, "EMAC");
 	enable_irq(INTSRC_EXINT7);
 	enable_irq(INTSRC_EXINT7);
 
 
 
 

+ 1 - 0
bsp/mini4020/rtconfig.h

@@ -20,6 +20,7 @@
 /* #define RT_THREAD_DEBUG */
 /* #define RT_THREAD_DEBUG */
 
 
 #define RT_USING_OVERFLOW_CHECK
 #define RT_USING_OVERFLOW_CHECK
+#define RT_USING_INTERRUPT_INFO
 
 
 /* Using Hook */
 /* Using Hook */
 #define RT_USING_HOOK
 #define RT_USING_HOOK

+ 2 - 2
bsp/mini4020/template.Uv2

@@ -31,14 +31,14 @@ Options 1,0,0  // Target 'RT-Thread_Mini4020'
  EnvReg ()
  EnvReg ()
  OrgReg ()
  OrgReg ()
  TgStat=16
  TgStat=16
- OutDir (.\)
+ OutDir (.\build\)
  OutName (rtthread-mini4020)
  OutName (rtthread-mini4020)
  GenApp=1
  GenApp=1
  GenLib=0
  GenLib=0
  GenHex=0
  GenHex=0
  Debug=1
  Debug=1
  Browse=0
  Browse=0
- LstDir (.\)
+ LstDir (.\build\)
  HexSel=1
  HexSel=1
  MG32K=0
  MG32K=0
  TGMORE=0
  TGMORE=0

+ 50 - 36
libcpu/arm/sep4020/interrupt.c

@@ -10,9 +10,11 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2006-03-13     Bernard      first version
  * 2006-03-13     Bernard      first version
+ * 2013-03-29     aozima       Modify the interrupt interface implementations.
  */
  */
 
 
 #include <rtthread.h>
 #include <rtthread.h>
+#include <rthw.h>
 #include <sep4020.h>
 #include <sep4020.h>
 
 
 #define MAX_HANDLERS	32
 #define MAX_HANDLERS	32
@@ -20,7 +22,7 @@
 extern rt_uint32_t rt_interrupt_nest;
 extern rt_uint32_t rt_interrupt_nest;
 
 
 /* exception and interrupt handler table */
 /* exception and interrupt handler table */
-rt_isr_handler_t isr_table[MAX_HANDLERS];
+struct rt_irq_desc isr_table[MAX_HANDLERS];
 rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
 rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
 rt_uint32_t rt_thread_switch_interrupt_flag;
 rt_uint32_t rt_thread_switch_interrupt_flag;
 
 
@@ -38,44 +40,45 @@ rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector)
 /**
 /**
  * This function will initialize hardware interrupt
  * This function will initialize hardware interrupt
  */
  */
-void rt_hw_interrupt_init()
+void rt_hw_interrupt_init(void)
 {
 {
-	register rt_uint32_t idx;
+    register rt_uint32_t idx;
 
 
-	/*Make sure all intc registers in proper state*/
+    /*Make sure all intc registers in proper state*/
 
 
-	/*mask all the irq*/
-	*(RP)(INTC_IMR) = 0xFFFFFFFF;
+    /*mask all the irq*/
+    *(RP)(INTC_IMR) = 0xFFFFFFFF;
 
 
-	/*enable all the irq*/
-	*(RP)(INTC_IER)	= 0XFFFFFFFF;
+    /*enable all the irq*/
+    *(RP)(INTC_IER)	= 0XFFFFFFFF;
 
 
-	/*Dont use any forced irq*/
-	*(RP)(INTC_IFR) = 0x0;
+    /*Dont use any forced irq*/
+    *(RP)(INTC_IFR) = 0x0;
 
 
-	/*Disable all the fiq*/
-	*(RP)(INTC_FIER) = 0x0;
+    /*Disable all the fiq*/
+    *(RP)(INTC_FIER) = 0x0;
 
 
-	/*Mask all the fiq*/
-	*(RP)(INTC_FIMR) = 0x0F;
+    /*Mask all the fiq*/
+    *(RP)(INTC_FIMR) = 0x0F;
 
 
-	/*Dont use forced fiq*/
-	*(RP)(INTC_FIFR) = 0x0;
+    /*Dont use forced fiq*/
+    *(RP)(INTC_FIFR) = 0x0;
 
 
-	/*Intrrupt priority register*/
-	*(RP)(INTC_IPLR) = 0x0;
+    /*Intrrupt priority register*/
+    *(RP)(INTC_IPLR) = 0x0;
 
 
-	/* init exceptions table */
-	for(idx=0; idx < MAX_HANDLERS; idx++)
-	{
-		isr_table[idx] = (rt_isr_handler_t)rt_hw_interrupt_handle;
-	}
+    /* init exceptions table */
+    rt_memset(isr_table, 0x00, sizeof(isr_table));
+    for(idx=0; idx < MAX_HANDLERS; idx++)
+    {
+        isr_table[idx].handler = rt_hw_interrupt_handle;
+    }
 
 
-	/* init interrupt nest, and context in thread sp */
-	rt_interrupt_nest = 0;
-	rt_interrupt_from_thread = 0;
-	rt_interrupt_to_thread = 0;
-	rt_thread_switch_interrupt_flag = 0;
+    /* init interrupt nest, and context in thread sp */
+    rt_interrupt_nest = 0;
+    rt_interrupt_from_thread = 0;
+    rt_interrupt_to_thread = 0;
+    rt_thread_switch_interrupt_flag = 0;
 }
 }
 
 
 /**
 /**
@@ -108,15 +111,26 @@ void rt_hw_interrupt_umask(rt_uint32_t vector)
  * @param new_handler the interrupt service routine to be installed
  * @param new_handler the interrupt service routine to be installed
  * @param old_handler the old interrupt service routine
  * @param old_handler the old interrupt service routine
  */
  */
-void rt_hw_interrupt_install(rt_uint32_t vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler)
+rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
+                                        void *param, char *name)
 {
 {
-	if(vector < MAX_HANDLERS)
-	{
-		if (*old_handler != RT_NULL)
-			*old_handler = isr_table[vector];
-		if (new_handler != RT_NULL) 
-			isr_table[vector] = new_handler;
-	}
+    rt_isr_handler_t old_handler = RT_NULL;
+
+    if(vector < MAX_HANDLERS)
+    {
+        old_handler = isr_table[vector].handler;
+
+        if (handler != RT_NULL)
+        {
+#ifdef RT_USING_INTERRUPT_INFO
+		    rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX);
+#endif /* RT_USING_INTERRUPT_INFO */
+            isr_table[vector].handler = handler;
+            isr_table[vector].param = param;
+        }
+    }
+
+    return old_handler;
 }
 }
 
 
 /*@}*/
 /*@}*/

+ 29 - 21
libcpu/arm/sep4020/trap.c

@@ -12,6 +12,7 @@
  * 2006-03-13     Bernard      first version
  * 2006-03-13     Bernard      first version
  * 2006-05-27     Bernard      add skyeye support
  * 2006-05-27     Bernard      add skyeye support
  * 2007-11-19     Yi.Qiu       fix rt_hw_trap_irq function
  * 2007-11-19     Yi.Qiu       fix rt_hw_trap_irq function
+ * 2013-03-29     aozima       Modify the interrupt interface implementations.
  */
  */
 
 
 #include <rtthread.h>
 #include <rtthread.h>
@@ -131,31 +132,38 @@ void rt_hw_trap_resv(struct rt_hw_register *regs)
 	rt_hw_cpu_shutdown();
 	rt_hw_cpu_shutdown();
 }
 }
 
 
-extern rt_isr_handler_t isr_table[];
+extern struct rt_irq_desc isr_table[];
 
 
-void rt_hw_trap_irq()
+void rt_hw_trap_irq(void)
 {
 {
-	unsigned long intstat;
-	rt_uint32_t i = 0;
-	rt_isr_handler_t isr_func;
-
-	/*Get the final intrrupt source*/
-	intstat = *(RP)(INTC_IFSR);;
-
-	/*Shift to get the intrrupt number*/
- 	while(intstat != 1)
-	{
-		intstat = intstat >> 1;
-		i++;
-	} 
-	/* get interrupt service routine */
-	isr_func = isr_table[i];
-
-	/* turn to interrupt service routine */
-	isr_func(i);
+    unsigned long intstat;
+    rt_uint32_t irq = 0;
+    rt_isr_handler_t isr_func;
+    void *param;
+
+    /*Get the final intrrupt source*/
+    intstat = *(RP)(INTC_IFSR);;
+
+    /*Shift to get the intrrupt number*/
+    while(intstat != 1)
+    {
+        intstat = intstat >> 1;
+        irq++;
+    }
+
+    /* get interrupt service routine */
+    isr_func = isr_table[irq].isr_handle;
+    param = isr_table[irq].param;
+
+    /* turn to interrupt service routine */
+    isr_func(irq, param);
+
+#ifdef RT_USING_INTERRUPT_INFO
+	isr_table[irq].counter++;
+#endif /* RT_USING_INTERRUPT_INFO */
 }
 }
 
 
-void rt_hw_trap_fiq()
+void rt_hw_trap_fiq(void)
 {
 {
 	rt_kprintf("fast interrupt request\n");
 	rt_kprintf("fast interrupt request\n");
 }
 }