This finishes ALL AVR assembly language

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3685 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-06-08 23:30:39 +00:00
parent 6cb172c83a
commit f6dd22048a
8 changed files with 2074 additions and 1973 deletions

View File

@ -1,125 +1,176 @@
/********************************************************************************************
* arch/avr/src/at90usb/at90usb_exceptions.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************************/
/********************************************************************************************
* Included Files
********************************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include "excptmacros.h"
/********************************************************************************************
* Pre-processor Definitions
********************************************************************************************/
/********************************************************************************************
* External Symbols
********************************************************************************************/
.file "at90usb_exceptions.S"
.global up_doirq
/********************************************************************************************
* Macros
********************************************************************************************/
/********************************************************************************************
* Exception Vector Handlers
********************************************************************************************/
.section .handlers, "ax", @progbits
HANDLER at90usb_int0, AT90USB_IRQ_INT0, excpt_common /* External interrupt request 0 */
HANDLER at90usb_int1, AT90USB_IRQ_INT1, excpt_common /* External interrupt request 1 */
HANDLER at90usb_int2, AT90USB_IRQ_INT2, excpt_common /* External interrupt request 2 */
HANDLER at90usb_int3, AT90USB_IRQ_INT3, excpt_common /* External interrupt request 3 */
HANDLER at90usb_int4, AT90USB_IRQ_INT4, excpt_common /* External interrupt request 4 */
HANDLER at90usb_int5, AT90USB_IRQ_INT5, excpt_common /* External interrupt request 5 */
HANDLER at90usb_int6, AT90USB_IRQ_INT6, excpt_common /* External interrupt request 6 */
HANDLER at90usb_int7, AT90USB_IRQ_INT7, excpt_common /* External interrupt request 7 */
HANDLER at90usb_pcint0, AT90USB_IRQ_PCINT0, excpt_common /* Pin Change Interrupt Request 0 */
HANDLER at90usb_usbgen, AT90USB_IRQ_USBGEN, excpt_common /* USB General USB General Interrupt request */
HANDLER at90usb_usbep, AT90USB_IRQ_USBEP, excpt_common /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
HANDLER at90usb_wdt, AT90USB_IRQ_WDT, excpt_common /* Watchdog Time-out Interrupt */
HANDLER at90usb_t2compa, AT90USB_IRQ_T2COMPA, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match A */
HANDLER at90usb_t2compb, AT90USB_IRQ_T2COMPB, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match B */
HANDLER at90usb_t2ovf, AT90USB_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
HANDLER at90usb_t1capt, AT90USB_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
HANDLER at90usb_t1compa, AT90USB_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match A */
HANDLER at90usb_t1compb, AT90USB_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match B */
HANDLER at90usb_t1compc, AT90USB_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/counter1 compare match C */
HANDLER at90usb_t1ovf, AT90USB_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
HANDLER at90usb_t0compa, AT90USB_IRQ_T0COMPA, excpt_common /* TIMER0 COMPA Timer/Counter0 Compare Match A */
HANDLER at90usb_t0compb, AT90USB_IRQ_T0COMPB, excpt_common /* TIMER0 COMPB Timer/Counter0 Compare Match B */
HANDLER at90usb_t0ovf, AT90USB_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
HANDLER at90usb_spi, AT90USB_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
HANDLER at90usb_u1rx, AT90USB_IRQ_U1RX, excpt_common /* USART1 RX complete */
HANDLER at90usb_u1dre, AT90USB_IRQ_U1DRE, excpt_common /* USART1 data register empty */
HANDLER at90usb_u1tx, AT90USB_IRQ_U1TX, excpt_common /* USART1 TX complete */
HANDLER at90usb_anacomp, AT90USB_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
HANDLER at90usb_adc, AT90USB_IRQ_ADC, excpt_common /* ADC conversion complete */
HANDLER at90usb_ee, AT90USB_IRQ_EE, excpt_common /* EEPROM ready */
HANDLER at90usb_t3capt, AT90USB_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
HANDLER at90usb_t3compa, AT90USB_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
HANDLER at90usb_t3compb, AT90USB_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
HANDLER at90usb_t3compc, AT90USB_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
HANDLER at90usb_t3ovf, AT90USB_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
HANDLER at90usb_twi, AT90USB_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
HANDLER at90usb_spmrdy, AT90USB_IRQ_SPMRDY, excpt_common /* Store program memory ready */
/* Common exception handling logic. */
excpt_common:
#warning "Missing Logic"
/****************************************************************************************************
* Name: up_interruptstack
****************************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 0
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip CONFIG_ARCH_INTERRUPTSTACK
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end
/********************************************************************************************
* arch/avr/src/at90usb/at90usb_exceptions.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************************/
/********************************************************************************************
* Included Files
********************************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include "excptmacros.h"
/********************************************************************************************
* Pre-processor Definitions
********************************************************************************************/
/********************************************************************************************
* External Symbols
********************************************************************************************/
.file "at90usb_exceptions.S"
.global up_doirq
.global up_fullcontextrestore
/********************************************************************************************
* Macros
********************************************************************************************/
/********************************************************************************************
* Exception Vector Handlers
********************************************************************************************/
.section .handlers, "ax", @progbits
HANDLER at90usb_int0, AT90USB_IRQ_INT0, excpt_common /* External interrupt request 0 */
HANDLER at90usb_int1, AT90USB_IRQ_INT1, excpt_common /* External interrupt request 1 */
HANDLER at90usb_int2, AT90USB_IRQ_INT2, excpt_common /* External interrupt request 2 */
HANDLER at90usb_int3, AT90USB_IRQ_INT3, excpt_common /* External interrupt request 3 */
HANDLER at90usb_int4, AT90USB_IRQ_INT4, excpt_common /* External interrupt request 4 */
HANDLER at90usb_int5, AT90USB_IRQ_INT5, excpt_common /* External interrupt request 5 */
HANDLER at90usb_int6, AT90USB_IRQ_INT6, excpt_common /* External interrupt request 6 */
HANDLER at90usb_int7, AT90USB_IRQ_INT7, excpt_common /* External interrupt request 7 */
HANDLER at90usb_pcint0, AT90USB_IRQ_PCINT0, excpt_common /* Pin Change Interrupt Request 0 */
HANDLER at90usb_usbgen, AT90USB_IRQ_USBGEN, excpt_common /* USB General USB General Interrupt request */
HANDLER at90usb_usbep, AT90USB_IRQ_USBEP, excpt_common /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
HANDLER at90usb_wdt, AT90USB_IRQ_WDT, excpt_common /* Watchdog Time-out Interrupt */
HANDLER at90usb_t2compa, AT90USB_IRQ_T2COMPA, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match A */
HANDLER at90usb_t2compb, AT90USB_IRQ_T2COMPB, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match B */
HANDLER at90usb_t2ovf, AT90USB_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
HANDLER at90usb_t1capt, AT90USB_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
HANDLER at90usb_t1compa, AT90USB_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match A */
HANDLER at90usb_t1compb, AT90USB_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match B */
HANDLER at90usb_t1compc, AT90USB_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/counter1 compare match C */
HANDLER at90usb_t1ovf, AT90USB_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
HANDLER at90usb_t0compa, AT90USB_IRQ_T0COMPA, excpt_common /* TIMER0 COMPA Timer/Counter0 Compare Match A */
HANDLER at90usb_t0compb, AT90USB_IRQ_T0COMPB, excpt_common /* TIMER0 COMPB Timer/Counter0 Compare Match B */
HANDLER at90usb_t0ovf, AT90USB_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
HANDLER at90usb_spi, AT90USB_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
HANDLER at90usb_u1rx, AT90USB_IRQ_U1RX, excpt_common /* USART1 RX complete */
HANDLER at90usb_u1dre, AT90USB_IRQ_U1DRE, excpt_common /* USART1 data register empty */
HANDLER at90usb_u1tx, AT90USB_IRQ_U1TX, excpt_common /* USART1 TX complete */
HANDLER at90usb_anacomp, AT90USB_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
HANDLER at90usb_adc, AT90USB_IRQ_ADC, excpt_common /* ADC conversion complete */
HANDLER at90usb_ee, AT90USB_IRQ_EE, excpt_common /* EEPROM ready */
HANDLER at90usb_t3capt, AT90USB_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
HANDLER at90usb_t3compa, AT90USB_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
HANDLER at90usb_t3compb, AT90USB_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
HANDLER at90usb_t3compc, AT90USB_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
HANDLER at90usb_t3ovf, AT90USB_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
HANDLER at90usb_twi, AT90USB_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
HANDLER at90usb_spmrdy, AT90USB_IRQ_SPMRDY, excpt_common /* Store program memory ready */
/********************************************************************************************
* Name: excpt_common
*
* Description:
* Exception Vector Handlers
*
* On Entry:
* The return PC and the saved r24 is on the stack, r24 now contains the IRQ number
*
* PCL
* PCH
* R0
* --- <- SP
*
********************************************************************************************/
excpt_common:
/* Save the remaining registers on the stack, preserving the IRQ number in r14 */
EXCPT_PROLOGUE
/* Call up_doirq with r24 = IRQ number, r22-23 = Pointer to the save structure. The stack
* pointer currently points to the save structure (or maybe the save struture -1 since
* the push operation post-decrements -- need to REVISIT this).
*/
in r16, __SP_L__ /* Get the save structure pointer in a Call-saved register pair */
in r17, __SP_H__ /* (Careful, push post-decrements) */
movw r22, r16 /* Pass register save structure as the parameter 2 */
USE_INTSTACK rx, ry, rz /* Switch to the interrupt stack */
call up_doirq /* Dispatch the interrupt */
RESTORE_STACK rx, ry /* - Undo the operations of USE_INTSTACK */
/* up_doiq returns with r24-r25 equal to the new save structure. If no context
* switch occurred, this will be the same as the value passed to it in r22-23.
* But if a context switch occurs, then the returned value will point not at a
* stack frame, but at a register save area inside of the new task's TCB.
*/
cp r16, r24
cpc r17, r25
breq .Lnoswitch
/* A context switch has occurred, jump to up_fullcontextrestore with r24, r25
* equal to the address of the new register save ared.
*/
jmp up_fullcontextrestore
/* No context switch occurred.. just return off the stack */
.Lnoswitch:
EXCPT_EPILOGUE
reti
/****************************************************************************************************
* Name: up_interruptstack
****************************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 0
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip CONFIG_ARCH_INTERRUPTSTACK
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end

View File

@ -1,277 +1,277 @@
/****************************************************************************
* arch/avr32/src/at90usb/at90usb_head.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
/****************************************************************************
* Pre-processor definitions
****************************************************************************/
/* Stack is allocated just after .bss and before the heap */
#define STACKBASE (_ebss+CONFIG_IDLETHREAD_STACKSIZE-1)
/* The RAMPZ register is only available for CPUs with more than 64Kb of FLASH.
* Only the AT90USB646, 647, 1286, and 1287 are supported by this file.
*
* - Support for the EPLMX instructions is assumed if RAMPZ is present
* - If RAMPZ is not present, support for LPMX is assumed
*/
#if defined(CONFIG_ARCH_CHIP_AT90USB1286) || defined(CONFIG_ARCH_CHIP_AT90USB1286)
# define HAVE_RAMPZ 1
#endif
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_nommuhead.S"
.global __start /* Entry point */
.global _sbss /* Start of .bss. Defined by ld.script */
.global _ebss /* End of .bss. Defined by ld.script */
.global _sdata /* Start of .data section in RAM */
.global _edata /* End of .data section in RAM */
.global _eronly /* Start of .data section in FLASH */
.global up_lowinit /* Perform low level initialization */
.global os_start /* NuttX entry point */
.global vectortab
.global at90usb_int0 /* External interrupt request 0 */
.global at90usb_int1 /* External interrupt request 1 */
.global at90usb_int2 /* External interrupt request 2 */
.global at90usb_int3 /* External interrupt request 3 */
.global at90usb_int4 /* External interrupt request 4 */
.global at90usb_int5 /* External interrupt request 5 */
.global at90usb_int6 /* External interrupt request 6 */
.global at90usb_int7 /* External interrupt request 7 */
.global at90usb_pcint0 /* Pin Change Interrupt Request 0 */
.global at90usb_usbgen /* USB General USB General Interrupt request */
.global at90usb_usbep /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
.global at90usb_wdt /* Watchdog Time-out Interrupt */
.global at90usb_t2compa /* TIMER2 COMPA Timer/Counter2 Compare Match A */
.global at90usb_t2compb /* TIMER2 COMPB Timer/Counter2 Compare Match B */
.global at90usb_t2ovf /* TIMER2 OVF Timer/Counter2 Overflow */
.global at90usb_t1capt /* TIMER1 CAPT Timer/Counter1 Capture Event */
.global at90usb_t1compa /* TIMER1 COMPA Timer/Counter1 Compare Match A */
.global at90usb_t1compb /* TIMER1 COMPB Timer/Counter1 Compare Match B */
.global at90usb_t1compc /* TIMER1 COMPC Timer/Counter1 Compare Match c */
.global at90usb_t1ovf /* TIMER1 OVF Timer/Counter1 Overflow */
.global at90usb_t0compa /* TIMER0 COMPA Timer/Counter0 Compare Match A */
.global at90usb_t0compb /* TIMER0 COMPB Timer/Counter0 Compare Match B */
.global at90usb_t0ovf /* TIMER0 OVF Timer/Counter0 Overflow */
.global at90usb_spi /* STC SPI Serial Transfer Complete */
.global at90usb_u1rx /* USART1 Rx Complete */
.global at90usb_u1dre /* USART1 Data Register Empty */
.global at90usb_u1tx /* USART1 Tx Complete */
.global at90usb_anacomp /* ANALOG COMP Analog Comparator */
.global at90usb_adc /* ADC Conversion Complete */
.global at90usb_ee /* EEPROM Ready */
.global at90usb_t3capt /* TIMER3 CAPT Timer/Counter3 Capture Event */
.global at90usb_t3compa /* TIMER3 COMPA Timer/Counter3 Compare Match A */
.global at90usb_t3compb /* TIMER3 COMPB Timer/Counter3 Compare Match B */
.global at90usb_t3compc /* TIMER3 COMPC Timer/Counter3 Compare Match C */
.global at90usb_t3ovf /* TIMER3 OVF Timer/Counter3 Overflow */
.global at90usb_twi /* TWI Two-wire Serial Interface */
.global at90usb_spmrdy /* Store Program Memory Ready */
/****************************************************************************
* Macros
****************************************************************************/
.macro vector name
jmp \name
.endm
/****************************************************************************
* Vector Table
****************************************************************************/
/* The AT90USB has 38 interrupt vectors including vector 0, the reset
* vector.
*/
.section .vectors, "ax", @progbits
.func vectortab
vectortab:
jmp __start /* 0: Vector 0 is the reset vector */
vector at90usb_int0 /* 1: External interrupt request 0 */
vector at90usb_int1 /* 2: External interrupt request 1 */
vector at90usb_int2 /* 3: External interrupt request 2 */
vector at90usb_int3 /* 4: External interrupt request 3 */
vector at90usb_int4 /* 5: External interrupt request 4 */
vector at90usb_int5 /* 6: External interrupt request 5 */
vector at90usb_int6 /* 7: External interrupt request 6 */
vector at90usb_int7 /* 8: External interrupt request 7 */
vector at90usb_pcint0 /* 9: PCINT0 Pin Change Interrupt Request 0 */
vector at90usb_usbgen /* 10: USB General USB General Interrupt request */
vector at90usb_usbep /* 11: USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
vector at90usb_wdt /* 12: Watchdog Time-out Interrupt */
vector at90usb_t2compa /* 13: TIMER2 COMPA Timer/Counter2 Compare Match A */
vector at90usb_t2compb /* 14: TIMER2 COMPB Timer/Counter2 Compare Match B */
vector at90usb_t2ovf /* 15: TIMER2 OVF Timer/Counter2 Overflow */
vector at90usb_t1capt /* 16: TIMER1 CAPT Timer/Counter1 Capture Event */
vector at90usb_t1compa /* 17: TIMER1 COMPA Timer/Counter1 Compare Match A */
vector at90usb_t1compb /* 18: TIMER1 COMPB Timer/Counter1 Compare Match B */
vector at90usb_t1compc /* 19: TIMER1 COMPC Timer/Counter1 Compare Match c */
vector at90usb_t1ovf /* 20: TIMER1 OVF Timer/Counter1 Overflow */
vector at90usb_t0compa /* 21: TIMER0 COMPA Timer/Counter0 Compare Match A */
vector at90usb_t0compb /* 22: TIMER0 COMPB Timer/Counter0 Compare Match B */
vector at90usb_t0ovf /* 23: TIMER0 OVF Timer/Counter0 Overflow */
vector at90usb_spi /* 24: STC SPI Serial Transfer Complete */
vector at90usb_u1rx /* 25: USART1 Rx Complete */
vector at90usb_u1dre /* 26: USART1 Data Register Empty */
vector at90usb_u1tx /* 27: USART1 Tx Complete */
vector at90usb_anacomp /* 28: ANALOG COMP Analog Comparator */
vector at90usb_adc /* 29: ADC Conversion Complete */
vector at90usb_ee /* 30: EEPROM Ready */
vector at90usb_t3capt /* 31: TIMER3 CAPT Timer/Counter3 Capture Event */
vector at90usb_t3compa /* 32: TIMER3 COMPA Timer/Counter3 Compare Match A */
vector at90usb_t3compb /* 33: TIMER3 COMPB Timer/Counter3 Compare Match B */
vector at90usb_t3compc /* 34: TIMER3 COMPC Timer/Counter3 Compare Match C */
vector at90usb_t3ovf /* 35: TIMER3 OVF Timer/Counter3 Overflow */
vector at90usb_twi /* 36: TWI Two-wire Serial Interface */
vector at90usb_spmrdy /* 37: Store Program Memory Ready */
.endfunc
/****************************************************************************
* Reset Entry Point
****************************************************************************/
.section .init, "ax", @progbits
.func __start
__start:
/* Clear the zero register, clear the status register and initialize the
* IDLE thread stack
*/
clr r1
out _SFR_IO_ADDR(SREG), r1
ldi r28, lo8(STACKBASE)
ldi r29, hi8(STACKBASE)
out _SFR_IO_ADDR(SPH), r29
out _SFR_IO_ADDR(SPL), r28
/* Copy initial global data values from FLASH into RAM */
.global __do_copy_data; /* Required to suppress dragging in logic from libgcc */
__do_copy_data:
#ifdef HAVE_RAMPZ
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
ldi r16, hh8(_eronly)
out _SFR_IO_ADDR(RAMPZ), r16
rjmp .Lcopystart
.Lcopyloop:
elpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#else
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
rjmp .Lcopystart
.Lcopyloop:
lpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#endif
/* Clear uninitialized data */
.global __do_clear_bss; /* Required to suppress dragging in logic from libgcc */
__do_clear_bss:
ldi r17, hi8(_ebss)
ldi r26, lo8(_sbss)
ldi r27, hi8(_sbss)
rjmp .Lclearstart
.Lclearloop:
st X+, r1
.Lclearstart:
cpi r26, lo8(_ebss)
cpc r27, r17
brne .Lclearloop
/* Perform any low-level initialization */
call up_lowinit
/* Now start NuttX */
call os_start
jmp exit
.endfunc
/****************************************************************************
* Heap Base
****************************************************************************/
/* This global variable is unsigned long g_heapbase and is
* exported from here only because of its coupling to other
* uses of _ebss in this file
*/
.data
.globl g_heapbase
.type g_heapbase, object
g_heapbase:
.word _ebss+CONFIG_IDLETHREAD_STACKSIZE
.size g_heapbase, .-g_heapbase
.end
/****************************************************************************
* arch/avr32/src/at90usb/at90usb_head.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
/****************************************************************************
* Pre-processor definitions
****************************************************************************/
/* Stack is allocated just after .bss and before the heap */
#define STACKBASE (_ebss+CONFIG_IDLETHREAD_STACKSIZE-1)
/* The RAMPZ register is only available for CPUs with more than 64Kb of FLASH.
* Only the AT90USB646, 647, 1286, and 1287 are supported by this file.
*
* - Support for the EPLMX instructions is assumed if RAMPZ is present
* - If RAMPZ is not present, support for LPMX is assumed
*/
#if defined(CONFIG_ARCH_CHIP_AT90USB1286) || defined(CONFIG_ARCH_CHIP_AT90USB1286)
# define HAVE_RAMPZ 1
#endif
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_nommuhead.S"
.global __start /* Entry point */
.global _sbss /* Start of .bss. Defined by ld.script */
.global _ebss /* End of .bss. Defined by ld.script */
.global _sdata /* Start of .data section in RAM */
.global _edata /* End of .data section in RAM */
.global _eronly /* Start of .data section in FLASH */
.global up_lowinit /* Perform low level initialization */
.global os_start /* NuttX entry point */
.global vectortab
.global at90usb_int0 /* External interrupt request 0 */
.global at90usb_int1 /* External interrupt request 1 */
.global at90usb_int2 /* External interrupt request 2 */
.global at90usb_int3 /* External interrupt request 3 */
.global at90usb_int4 /* External interrupt request 4 */
.global at90usb_int5 /* External interrupt request 5 */
.global at90usb_int6 /* External interrupt request 6 */
.global at90usb_int7 /* External interrupt request 7 */
.global at90usb_pcint0 /* Pin Change Interrupt Request 0 */
.global at90usb_usbgen /* USB General USB General Interrupt request */
.global at90usb_usbep /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
.global at90usb_wdt /* Watchdog Time-out Interrupt */
.global at90usb_t2compa /* TIMER2 COMPA Timer/Counter2 Compare Match A */
.global at90usb_t2compb /* TIMER2 COMPB Timer/Counter2 Compare Match B */
.global at90usb_t2ovf /* TIMER2 OVF Timer/Counter2 Overflow */
.global at90usb_t1capt /* TIMER1 CAPT Timer/Counter1 Capture Event */
.global at90usb_t1compa /* TIMER1 COMPA Timer/Counter1 Compare Match A */
.global at90usb_t1compb /* TIMER1 COMPB Timer/Counter1 Compare Match B */
.global at90usb_t1compc /* TIMER1 COMPC Timer/Counter1 Compare Match c */
.global at90usb_t1ovf /* TIMER1 OVF Timer/Counter1 Overflow */
.global at90usb_t0compa /* TIMER0 COMPA Timer/Counter0 Compare Match A */
.global at90usb_t0compb /* TIMER0 COMPB Timer/Counter0 Compare Match B */
.global at90usb_t0ovf /* TIMER0 OVF Timer/Counter0 Overflow */
.global at90usb_spi /* STC SPI Serial Transfer Complete */
.global at90usb_u1rx /* USART1 Rx Complete */
.global at90usb_u1dre /* USART1 Data Register Empty */
.global at90usb_u1tx /* USART1 Tx Complete */
.global at90usb_anacomp /* ANALOG COMP Analog Comparator */
.global at90usb_adc /* ADC Conversion Complete */
.global at90usb_ee /* EEPROM Ready */
.global at90usb_t3capt /* TIMER3 CAPT Timer/Counter3 Capture Event */
.global at90usb_t3compa /* TIMER3 COMPA Timer/Counter3 Compare Match A */
.global at90usb_t3compb /* TIMER3 COMPB Timer/Counter3 Compare Match B */
.global at90usb_t3compc /* TIMER3 COMPC Timer/Counter3 Compare Match C */
.global at90usb_t3ovf /* TIMER3 OVF Timer/Counter3 Overflow */
.global at90usb_twi /* TWI Two-wire Serial Interface */
.global at90usb_spmrdy /* Store Program Memory Ready */
/****************************************************************************
* Macros
****************************************************************************/
.macro vector name
jmp \name
.endm
/****************************************************************************
* Vector Table
****************************************************************************/
/* The AT90USB has 38 interrupt vectors including vector 0, the reset
* vector.
*/
.section .vectors, "ax", @progbits
.func vectortab
vectortab:
jmp __start /* 0: Vector 0 is the reset vector */
vector at90usb_int0 /* 1: External interrupt request 0 */
vector at90usb_int1 /* 2: External interrupt request 1 */
vector at90usb_int2 /* 3: External interrupt request 2 */
vector at90usb_int3 /* 4: External interrupt request 3 */
vector at90usb_int4 /* 5: External interrupt request 4 */
vector at90usb_int5 /* 6: External interrupt request 5 */
vector at90usb_int6 /* 7: External interrupt request 6 */
vector at90usb_int7 /* 8: External interrupt request 7 */
vector at90usb_pcint0 /* 9: PCINT0 Pin Change Interrupt Request 0 */
vector at90usb_usbgen /* 10: USB General USB General Interrupt request */
vector at90usb_usbep /* 11: USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
vector at90usb_wdt /* 12: Watchdog Time-out Interrupt */
vector at90usb_t2compa /* 13: TIMER2 COMPA Timer/Counter2 Compare Match A */
vector at90usb_t2compb /* 14: TIMER2 COMPB Timer/Counter2 Compare Match B */
vector at90usb_t2ovf /* 15: TIMER2 OVF Timer/Counter2 Overflow */
vector at90usb_t1capt /* 16: TIMER1 CAPT Timer/Counter1 Capture Event */
vector at90usb_t1compa /* 17: TIMER1 COMPA Timer/Counter1 Compare Match A */
vector at90usb_t1compb /* 18: TIMER1 COMPB Timer/Counter1 Compare Match B */
vector at90usb_t1compc /* 19: TIMER1 COMPC Timer/Counter1 Compare Match c */
vector at90usb_t1ovf /* 20: TIMER1 OVF Timer/Counter1 Overflow */
vector at90usb_t0compa /* 21: TIMER0 COMPA Timer/Counter0 Compare Match A */
vector at90usb_t0compb /* 22: TIMER0 COMPB Timer/Counter0 Compare Match B */
vector at90usb_t0ovf /* 23: TIMER0 OVF Timer/Counter0 Overflow */
vector at90usb_spi /* 24: STC SPI Serial Transfer Complete */
vector at90usb_u1rx /* 25: USART1 Rx Complete */
vector at90usb_u1dre /* 26: USART1 Data Register Empty */
vector at90usb_u1tx /* 27: USART1 Tx Complete */
vector at90usb_anacomp /* 28: ANALOG COMP Analog Comparator */
vector at90usb_adc /* 29: ADC Conversion Complete */
vector at90usb_ee /* 30: EEPROM Ready */
vector at90usb_t3capt /* 31: TIMER3 CAPT Timer/Counter3 Capture Event */
vector at90usb_t3compa /* 32: TIMER3 COMPA Timer/Counter3 Compare Match A */
vector at90usb_t3compb /* 33: TIMER3 COMPB Timer/Counter3 Compare Match B */
vector at90usb_t3compc /* 34: TIMER3 COMPC Timer/Counter3 Compare Match C */
vector at90usb_t3ovf /* 35: TIMER3 OVF Timer/Counter3 Overflow */
vector at90usb_twi /* 36: TWI Two-wire Serial Interface */
vector at90usb_spmrdy /* 37: Store Program Memory Ready */
.endfunc
/****************************************************************************
* Reset Entry Point
****************************************************************************/
.section .init, "ax", @progbits
.func __start
__start:
/* Clear the zero register, clear the status register and initialize the
* IDLE thread stack
*/
clr r1
out _SFR_IO_ADDR(SREG), r1
ldi r28, lo8(STACKBASE)
ldi r29, hi8(STACKBASE)
out _SFR_IO_ADDR(SPH), r29
out _SFR_IO_ADDR(SPL), r28
/* Copy initial global data values from FLASH into RAM */
.global __do_copy_data; /* Required to suppress dragging in logic from libgcc */
__do_copy_data:
#ifdef HAVE_RAMPZ
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
ldi r16, hh8(_eronly)
out _SFR_IO_ADDR(RAMPZ), r16
rjmp .Lcopystart
.Lcopyloop:
elpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#else
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
rjmp .Lcopystart
.Lcopyloop:
lpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#endif
/* Clear uninitialized data */
.global __do_clear_bss; /* Required to suppress dragging in logic from libgcc */
__do_clear_bss:
ldi r17, hi8(_ebss)
ldi r26, lo8(_sbss)
ldi r27, hi8(_sbss)
rjmp .Lclearstart
.Lclearloop:
st X+, r1
.Lclearstart:
cpi r26, lo8(_ebss)
cpc r27, r17
brne .Lclearloop
/* Perform any low-level initialization */
call up_lowinit
/* Now start NuttX */
call os_start
jmp exit
.endfunc
/****************************************************************************
* Heap Base
****************************************************************************/
/* This global variable is unsigned long g_heapbase and is
* exported from here only because of its coupling to other
* uses of _ebss in this file
*/
.data
.globl g_heapbase
.type g_heapbase, object
g_heapbase:
.word _ebss+CONFIG_IDLETHREAD_STACKSIZE
.size g_heapbase, .-g_heapbase
.end

View File

@ -1,118 +1,169 @@
/********************************************************************************************
* arch/avr/src/atmega/atmega_exceptions.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************************/
/********************************************************************************************
* Included Files
********************************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include "excptmacros.h"
/********************************************************************************************
* External Symbols
********************************************************************************************/
.file "atmega_exceptions.S"
.global up_doirq
/********************************************************************************************
* Macros
********************************************************************************************/
/********************************************************************************************
* Exception Vector Handlers
********************************************************************************************/
.section .handlers, "ax", @progbits
HANDLER atmega_int0, ATMEGA_IRQ_INT0, excpt_common /* External interrupt request 0 */
HANDLER atmega_int1, ATMEGA_IRQ_INT1, excpt_common /* External interrupt request 1 */
HANDLER atmega_int2, ATMEGA_IRQ_INT2, excpt_common /* External interrupt request 2 */
HANDLER atmega_int3, ATMEGA_IRQ_INT3, excpt_common /* External interrupt request 3 */
HANDLER atmega_int4, ATMEGA_IRQ_INT4, excpt_common /* External interrupt request 4 */
HANDLER atmega_int5, ATMEGA_IRQ_INT5, excpt_common /* External interrupt request 5 */
HANDLER atmega_int6, ATMEGA_IRQ_INT6, excpt_common /* External interrupt request 6 */
HANDLER atmega_int7, ATMEGA_IRQ_INT7, excpt_common /* External interrupt request 7 */
HANDLER atmega_t2comp, ATMEGA_IRQ_T2COMP, excpt_common /* TIMER2 COMP timer/counter2 compare match */
HANDLER atmega_t2ovf, ATMEGA_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
HANDLER atmega_t1capt, ATMEGA_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
HANDLER atmega_t1compa, ATMEGA_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match a */
HANDLER atmega_t1compb, ATMEGA_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match b */
HANDLER atmega_t1ovf, ATMEGA_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
HANDLER atmega_t0comp, ATMEGA_IRQ_T0COMP, excpt_common /* TIMER0 COMP timer/counter0 compare match */
HANDLER atmega_t0ovf, ATMEGA_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
HANDLER atmega_spi, ATMEGA_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
HANDLER atmega_u0rx, ATMEGA_IRQ_U0RX, excpt_common /* USART0 RX complete */
HANDLER atmega_u0dre, ATMEGA_IRQ_U0DRE, excpt_common /* USART0 data register empty */
HANDLER atmega_u0tx, ATMEGA_IRQ_U0TX, excpt_common /* USART0 TX complete */
HANDLER atmega_adc, ATMEGA_IRQ_ADC, excpt_common /* ADC conversion complete */
HANDLER atmega_ee, ATMEGA_IRQ_EE, excpt_common /* EEPROM ready */
HANDLER atmega_anacomp, ATMEGA_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
HANDLER atmega_t1compc, ATMEGA_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/countre1 compare match c */
HANDLER atmega_t3capt, ATMEGA_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
HANDLER atmega_t3compa, ATMEGA_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
HANDLER atmega_t3compb, ATMEGA_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
HANDLER atmega_t3compc, ATMEGA_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
HANDLER atmega_t3ovf, ATMEGA_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
HANDLER atmega_u1rx, ATMEGA_IRQ_U1RX, excpt_common /* USART1 RX complete */
HANDLER atmega_u1dre, ATMEGA_IRQ_U1DRE, excpt_common /* USART1 data register empty */
HANDLER atmega_u1tx, ATMEGA_IRQ_U1TX, excpt_common /* USART1 TX complete */
HANDLER atmega_twi, ATMEGA_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
HANDLER atmega_spmrdy, ATMEGA_IRQ_SPMRDY, excpt_common /* Store program memory ready */
/* Common exception handling logic. */
excpt_common:
#warning "Missing Logic"
/****************************************************************************************************
* Name: up_interruptstack
****************************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 0
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip CONFIG_ARCH_INTERRUPTSTACK
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end
/********************************************************************************************
* arch/avr/src/atmega/atmega_exceptions.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
********************************************************************************************/
/********************************************************************************************
* Included Files
********************************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include "excptmacros.h"
/********************************************************************************************
* External Symbols
********************************************************************************************/
.file "atmega_exceptions.S"
.global up_doirq
.gloal up_fullcontextrestore
/********************************************************************************************
* Macros
********************************************************************************************/
/********************************************************************************************
* Exception Vector Handlers
********************************************************************************************/
.section .handlers, "ax", @progbits
HANDLER atmega_int0, ATMEGA_IRQ_INT0, excpt_common /* External interrupt request 0 */
HANDLER atmega_int1, ATMEGA_IRQ_INT1, excpt_common /* External interrupt request 1 */
HANDLER atmega_int2, ATMEGA_IRQ_INT2, excpt_common /* External interrupt request 2 */
HANDLER atmega_int3, ATMEGA_IRQ_INT3, excpt_common /* External interrupt request 3 */
HANDLER atmega_int4, ATMEGA_IRQ_INT4, excpt_common /* External interrupt request 4 */
HANDLER atmega_int5, ATMEGA_IRQ_INT5, excpt_common /* External interrupt request 5 */
HANDLER atmega_int6, ATMEGA_IRQ_INT6, excpt_common /* External interrupt request 6 */
HANDLER atmega_int7, ATMEGA_IRQ_INT7, excpt_common /* External interrupt request 7 */
HANDLER atmega_t2comp, ATMEGA_IRQ_T2COMP, excpt_common /* TIMER2 COMP timer/counter2 compare match */
HANDLER atmega_t2ovf, ATMEGA_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
HANDLER atmega_t1capt, ATMEGA_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
HANDLER atmega_t1compa, ATMEGA_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match a */
HANDLER atmega_t1compb, ATMEGA_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match b */
HANDLER atmega_t1ovf, ATMEGA_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
HANDLER atmega_t0comp, ATMEGA_IRQ_T0COMP, excpt_common /* TIMER0 COMP timer/counter0 compare match */
HANDLER atmega_t0ovf, ATMEGA_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
HANDLER atmega_spi, ATMEGA_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
HANDLER atmega_u0rx, ATMEGA_IRQ_U0RX, excpt_common /* USART0 RX complete */
HANDLER atmega_u0dre, ATMEGA_IRQ_U0DRE, excpt_common /* USART0 data register empty */
HANDLER atmega_u0tx, ATMEGA_IRQ_U0TX, excpt_common /* USART0 TX complete */
HANDLER atmega_adc, ATMEGA_IRQ_ADC, excpt_common /* ADC conversion complete */
HANDLER atmega_ee, ATMEGA_IRQ_EE, excpt_common /* EEPROM ready */
HANDLER atmega_anacomp, ATMEGA_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
HANDLER atmega_t1compc, ATMEGA_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/countre1 compare match c */
HANDLER atmega_t3capt, ATMEGA_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
HANDLER atmega_t3compa, ATMEGA_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
HANDLER atmega_t3compb, ATMEGA_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
HANDLER atmega_t3compc, ATMEGA_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
HANDLER atmega_t3ovf, ATMEGA_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
HANDLER atmega_u1rx, ATMEGA_IRQ_U1RX, excpt_common /* USART1 RX complete */
HANDLER atmega_u1dre, ATMEGA_IRQ_U1DRE, excpt_common /* USART1 data register empty */
HANDLER atmega_u1tx, ATMEGA_IRQ_U1TX, excpt_common /* USART1 TX complete */
HANDLER atmega_twi, ATMEGA_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
HANDLER atmega_spmrdy, ATMEGA_IRQ_SPMRDY, excpt_common /* Store program memory ready */
/********************************************************************************************
* Name: excpt_common
*
* Description:
* Exception Vector Handlers
*
* On Entry:
* The return PC and the saved r24 is on the stack, r24 now contains the IRQ number
*
* PCL
* PCH
* R0
* --- <- SP
*
********************************************************************************************/
excpt_common:
/* Save the remaining registers on the stack, preserving the IRQ number in r14 */
EXCPT_PROLOGUE
/* Call up_doirq with r24 = IRQ number, r22-23 = Pointer to the save structure. The stack
* pointer currently points to the save structure (or maybe the save struture -1 since
* the push operation post-decrements -- need to REVISIT this).
*/
in r16, __SP_L__ /* Get the save structure pointer in a Call-saved register pair */
in r17, __SP_H__ /* (Careful, push post-decrements) */
movw r22, r16 /* Pass register save structure as the parameter 2 */
USE_INTSTACK rx, ry, rz /* Switch to the interrupt stack */
call up_doirq /* Dispatch the interrupt */
RESTORE_STACK rx, ry /* - Undo the operations of USE_INTSTACK */
/* up_doiq returns with r24-r25 equal to the new save structure. If no context
* switch occurred, this will be the same as the value passed to it in r22-23.
* But if a context switch occurs, then the returned value will point not at a
* stack frame, but at a register save area inside of the new task's TCB.
*/
cp r16, r24
cpc r17, r25
breq .Lnoswitch
/* A context switch has occurred, jump to up_fullcontextrestore with r24, r25
* equal to the address of the new register save ared.
*/
jmp up_fullcontextrestore
/* No context switch occurred.. just return off the stack */
.Lnoswitch:
EXCPT_EPILOGUE
reti
/****************************************************************************************************
* Name: up_interruptstack
****************************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 0
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip CONFIG_ARCH_INTERRUPTSTACK
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end

View File

@ -1,271 +1,271 @@
/****************************************************************************
* arch/avr32/src/atmega/atmega_head.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
/****************************************************************************
* Pre-processor definitions
****************************************************************************/
/* Stack is allocated just after .bss and before the heap */
#define STACKBASE (_ebss+CONFIG_IDLETHREAD_STACKSIZE-4)
/* The RAMPZ register is only available for CPUs with more than 64Kb of FLASH.
* At present, only the ATMega128 is supported so RAMPZ should always be
* available.
*
* - Support for the EPLMX instructions is assumed if RAMPZ is present
* - If RAMPZ is not present, support for LPMX is assumed
*/
#define HAVE_RAMPZ 1
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_nommuhead.S"
.global __start /* Entry point */
.global _sbss /* Start of .bss. Defined by ld.script */
.global _ebss /* End of .bss. Defined by ld.script */
.global _sdata /* Start of .data section in RAM */
.global _edata /* End of .data section in RAM */
.global _eronly /* Start of .data section in FLASH */
.global up_lowinit /* Perform low level initialization */
.global os_start /* NuttX entry point */
.global vectortab
.global atmega_int0 /* External interrupt request 0 */
.global atmega_int1 /* External interrupt request 1 */
.global atmega_int2 /* External interrupt request 2 */
.global atmega_int3 /* External interrupt request 3 */
.global atmega_int4 /* External interrupt request 4 */
.global atmega_int5 /* External interrupt request 5 */
.global atmega_int6 /* External interrupt request 6 */
.global atmega_int7 /* External interrupt request 7 */
.global atmega_t2comp /* TIMER2 COMP timer/counter2 compare match */
.global atmega_t2ovf /* TIMER2 OVF timer/counter2 overflow */
.global atmega_t1capt /* TIMER1 CAPT timer/counter1 capture event */
.global atmega_t1compa /* TIMER1 COMPA timer/counter1 compare match a */
.global atmega_t1compb /* TIMER1 COMPB timer/counter1 compare match b */
.global atmega_t1ovf /* TIMER1 OVF timer/counter1 overflow */
.global atmega_t0comp /* TIMER0 COMP timer/counter0 compare match */
.global atmega_t0ovf /* TIMER0 OVF timer/counter0 overflow */
.global atmega_spi /* STC SPI serial transfer complete */
.global atmega_u0rx /* USART0 RX complete */
.global atmega_u0dre /* USART0 data register empty */
.global atmega_u0tx /* USART0 TX complete */
.global atmega_adc /* ADC conversion complete */
.global atmega_ee /* EEPROM ready */
.global atmega_anacomp /* ANALOG COMP analog comparator */
.global atmega_t1compc /* TIMER1 COMPC timer/countre1 compare match c */
.global atmega_t3capt /* TIMER3 CAPT timer/counter3 capture event */
.global atmega_t3compa /* TIMER3 COMPA timer/counter3 compare match a */
.global atmega_t3compb /* TIMER3 COMPB timer/counter3 compare match b */
.global atmega_t3compc /* TIMER3 COMPC timer/counter3 compare match c */
.global atmega_t3ovf /* TIMER3 OVF timer/counter3 overflow */
.global atmega_u1rx /* USART1 RX complete */
.global atmega_u1dre /* USART1 data register empty */
.global atmega_u1tx /* USART1 TX complete */
.global atmega_twi /* TWI two-wire serial interface */
.global atmega_spmrdy /* Store program memory ready */
/****************************************************************************
* Macros
****************************************************************************/
.macro vector name
jmp \name
.endm
/****************************************************************************
* Vector Table
****************************************************************************/
/* The ATmega128 has 35 interrupt vectors including vector 0, the reset
* vector.
*/
.section .vectors, "ax", @progbits
.func vectortab
vectortab:
jmp __start /* 0: Vector 0 is the reset vector */
vector atmega_int0 /* 1: External interrupt request 0 */
vector atmega_int1 /* 2: External interrupt request 1 */
vector atmega_int2 /* 3: External interrupt request 2 */
vector atmega_int3 /* 4: External interrupt request 3 */
vector atmega_int4 /* 5: External interrupt request 4 */
vector atmega_int5 /* 6 : External interrupt request 5 */
vector atmega_int6 /* 7: External interrupt request 6 */
vector atmega_int7 /* 8: External interrupt request 7 */
vector atmega_t2comp /* 9: TIMER2 COMP timer/counter2 compare match */
vector atmega_t2ovf /* 10: TIMER2 OVF timer/counter2 overflow */
vector atmega_t1capt /* 11: TIMER1 CAPT timer/counter1 capture event */
vector atmega_t1compa /* 12: TIMER1 COMPA timer/counter1 compare match a */
vector atmega_t1compb /* 13: TIMER1 COMPB timer/counter1 compare match b */
vector atmega_t1ovf /* 14: TIMER1 OVF timer/counter1 overflow */
vector atmega_t0comp /* 15: TIMER0 COMP timer/counter0 compare match */
vector atmega_t0ovf /* 16: TIMER0 OVF timer/counter0 overflow */
vector atmega_spi /* 17: STC SPI serial transfer complete */
vector atmega_u0rx /* 18: USART0 RX complete */
vector atmega_u0dre /* 19: USART0 data register empty */
vector atmega_u0tx /* 20: USART0 TX complete */
vector atmega_adc /* 21: ADC conversion complete */
vector atmega_ee /* 22: EEPROM ready */
vector atmega_anacomp /* 23: ANALOG COMP analog comparator */
vector atmega_t1compc /* 24: TIMER1 COMPC timer/countre1 compare match c */
vector atmega_t3capt /* 25: TIMER3 CAPT timer/counter3 capture event */
vector atmega_t3compa /* 26: TIMER3 COMPA timer/counter3 compare match a */
vector atmega_t3compb /* 27: TIMER3 COMPB timer/counter3 compare match b */
vector atmega_t3compc /* 28: TIMER3 COMPC timer/counter3 compare match c */
vector atmega_t3ovf /* 29: TIMER3 OVF timer/counter3 overflow */
vector atmega_u1rx /* 30: USART1 RX complete */
vector atmega_u1dre /* 31: USART1 data register empty */
vector atmega_u1tx /* 32: USART1 TX complete */
vector atmega_twi /* 33: TWI two-wire serial interface */
vector atmega_spmrdy /* 34: Store program memory ready */
.endfunc
/****************************************************************************
* Reset Entry Point
****************************************************************************/
.section .init, "ax", @progbits
.func __start
__start:
/* Clear the zero register, clear the status register and initialize the
* IDLE thread stack
*/
clr r1
out _SFR_IO_ADDR(SREG), r1
ldi r28, lo8(STACKBASE)
ldi r29, hi8(STACKBASE)
out _SFR_IO_ADDR(SPH), r29
out _SFR_IO_ADDR(SPL), r28
/* Copy initial global data values from FLASH into RAM */
.global __do_copy_data; /* Required to suppress dragging in logic from libgcc */
__do_copy_data:
#ifdef HAVE_RAMPZ
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
ldi r16, hh8(_eronly)
out _SFR_IO_ADDR(RAMPZ), r16
rjmp .Lcopystart
.Lcopyloop:
elpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#else
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
rjmp .Lcopystart
.Lcopyloop:
lpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#endif
/* Clear uninitialized data */
.global __do_clear_bss; /* Required to suppress dragging in logic from libgcc */
__do_clear_bss:
ldi r17, hi8(_ebss)
ldi r26, lo8(_sbss)
ldi r27, hi8(_sbss)
rjmp .Lclearstart
.Lclearloop:
st X+, r1
.Lclearstart:
cpi r26, lo8(_ebss)
cpc r27, r17
brne .Lclearloop
/* Perform any low-level initialization */
call up_lowinit
/* Now start NuttX */
call os_start
jmp exit
.endfunc
/****************************************************************************
* Heap Base
****************************************************************************/
/* This global variable is unsigned long g_heapbase and is
* exported from here only because of its coupling to other
* uses of _ebss in this file
*/
.data
.globl g_heapbase
.type g_heapbase, object
g_heapbase:
.word _ebss+CONFIG_IDLETHREAD_STACKSIZE
.size g_heapbase, .-g_heapbase
.end
/****************************************************************************
* arch/avr32/src/atmega/atmega_head.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/irq.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
/****************************************************************************
* Pre-processor definitions
****************************************************************************/
/* Stack is allocated just after .bss and before the heap */
#define STACKBASE (_ebss+CONFIG_IDLETHREAD_STACKSIZE-4)
/* The RAMPZ register is only available for CPUs with more than 64Kb of FLASH.
* At present, only the ATMega128 is supported so RAMPZ should always be
* available.
*
* - Support for the EPLMX instructions is assumed if RAMPZ is present
* - If RAMPZ is not present, support for LPMX is assumed
*/
#define HAVE_RAMPZ 1
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_nommuhead.S"
.global __start /* Entry point */
.global _sbss /* Start of .bss. Defined by ld.script */
.global _ebss /* End of .bss. Defined by ld.script */
.global _sdata /* Start of .data section in RAM */
.global _edata /* End of .data section in RAM */
.global _eronly /* Start of .data section in FLASH */
.global up_lowinit /* Perform low level initialization */
.global os_start /* NuttX entry point */
.global vectortab
.global atmega_int0 /* External interrupt request 0 */
.global atmega_int1 /* External interrupt request 1 */
.global atmega_int2 /* External interrupt request 2 */
.global atmega_int3 /* External interrupt request 3 */
.global atmega_int4 /* External interrupt request 4 */
.global atmega_int5 /* External interrupt request 5 */
.global atmega_int6 /* External interrupt request 6 */
.global atmega_int7 /* External interrupt request 7 */
.global atmega_t2comp /* TIMER2 COMP timer/counter2 compare match */
.global atmega_t2ovf /* TIMER2 OVF timer/counter2 overflow */
.global atmega_t1capt /* TIMER1 CAPT timer/counter1 capture event */
.global atmega_t1compa /* TIMER1 COMPA timer/counter1 compare match a */
.global atmega_t1compb /* TIMER1 COMPB timer/counter1 compare match b */
.global atmega_t1ovf /* TIMER1 OVF timer/counter1 overflow */
.global atmega_t0comp /* TIMER0 COMP timer/counter0 compare match */
.global atmega_t0ovf /* TIMER0 OVF timer/counter0 overflow */
.global atmega_spi /* STC SPI serial transfer complete */
.global atmega_u0rx /* USART0 RX complete */
.global atmega_u0dre /* USART0 data register empty */
.global atmega_u0tx /* USART0 TX complete */
.global atmega_adc /* ADC conversion complete */
.global atmega_ee /* EEPROM ready */
.global atmega_anacomp /* ANALOG COMP analog comparator */
.global atmega_t1compc /* TIMER1 COMPC timer/countre1 compare match c */
.global atmega_t3capt /* TIMER3 CAPT timer/counter3 capture event */
.global atmega_t3compa /* TIMER3 COMPA timer/counter3 compare match a */
.global atmega_t3compb /* TIMER3 COMPB timer/counter3 compare match b */
.global atmega_t3compc /* TIMER3 COMPC timer/counter3 compare match c */
.global atmega_t3ovf /* TIMER3 OVF timer/counter3 overflow */
.global atmega_u1rx /* USART1 RX complete */
.global atmega_u1dre /* USART1 data register empty */
.global atmega_u1tx /* USART1 TX complete */
.global atmega_twi /* TWI two-wire serial interface */
.global atmega_spmrdy /* Store program memory ready */
/****************************************************************************
* Macros
****************************************************************************/
.macro vector name
jmp \name
.endm
/****************************************************************************
* Vector Table
****************************************************************************/
/* The ATmega128 has 35 interrupt vectors including vector 0, the reset
* vector.
*/
.section .vectors, "ax", @progbits
.func vectortab
vectortab:
jmp __start /* 0: Vector 0 is the reset vector */
vector atmega_int0 /* 1: External interrupt request 0 */
vector atmega_int1 /* 2: External interrupt request 1 */
vector atmega_int2 /* 3: External interrupt request 2 */
vector atmega_int3 /* 4: External interrupt request 3 */
vector atmega_int4 /* 5: External interrupt request 4 */
vector atmega_int5 /* 6 : External interrupt request 5 */
vector atmega_int6 /* 7: External interrupt request 6 */
vector atmega_int7 /* 8: External interrupt request 7 */
vector atmega_t2comp /* 9: TIMER2 COMP timer/counter2 compare match */
vector atmega_t2ovf /* 10: TIMER2 OVF timer/counter2 overflow */
vector atmega_t1capt /* 11: TIMER1 CAPT timer/counter1 capture event */
vector atmega_t1compa /* 12: TIMER1 COMPA timer/counter1 compare match a */
vector atmega_t1compb /* 13: TIMER1 COMPB timer/counter1 compare match b */
vector atmega_t1ovf /* 14: TIMER1 OVF timer/counter1 overflow */
vector atmega_t0comp /* 15: TIMER0 COMP timer/counter0 compare match */
vector atmega_t0ovf /* 16: TIMER0 OVF timer/counter0 overflow */
vector atmega_spi /* 17: STC SPI serial transfer complete */
vector atmega_u0rx /* 18: USART0 RX complete */
vector atmega_u0dre /* 19: USART0 data register empty */
vector atmega_u0tx /* 20: USART0 TX complete */
vector atmega_adc /* 21: ADC conversion complete */
vector atmega_ee /* 22: EEPROM ready */
vector atmega_anacomp /* 23: ANALOG COMP analog comparator */
vector atmega_t1compc /* 24: TIMER1 COMPC timer/countre1 compare match c */
vector atmega_t3capt /* 25: TIMER3 CAPT timer/counter3 capture event */
vector atmega_t3compa /* 26: TIMER3 COMPA timer/counter3 compare match a */
vector atmega_t3compb /* 27: TIMER3 COMPB timer/counter3 compare match b */
vector atmega_t3compc /* 28: TIMER3 COMPC timer/counter3 compare match c */
vector atmega_t3ovf /* 29: TIMER3 OVF timer/counter3 overflow */
vector atmega_u1rx /* 30: USART1 RX complete */
vector atmega_u1dre /* 31: USART1 data register empty */
vector atmega_u1tx /* 32: USART1 TX complete */
vector atmega_twi /* 33: TWI two-wire serial interface */
vector atmega_spmrdy /* 34: Store program memory ready */
.endfunc
/****************************************************************************
* Reset Entry Point
****************************************************************************/
.section .init, "ax", @progbits
.func __start
__start:
/* Clear the zero register, clear the status register and initialize the
* IDLE thread stack
*/
clr r1
out _SFR_IO_ADDR(SREG), r1
ldi r28, lo8(STACKBASE)
ldi r29, hi8(STACKBASE)
out _SFR_IO_ADDR(SPH), r29
out _SFR_IO_ADDR(SPL), r28
/* Copy initial global data values from FLASH into RAM */
.global __do_copy_data; /* Required to suppress dragging in logic from libgcc */
__do_copy_data:
#ifdef HAVE_RAMPZ
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
ldi r16, hh8(_eronly)
out _SFR_IO_ADDR(RAMPZ), r16
rjmp .Lcopystart
.Lcopyloop:
elpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#else
ldi r17, hi8(_edata)
ldi r26, lo8(_sdata)
ldi r27, hi8(_sdata)
ldi r30, lo8(_eronly)
ldi r31, hi8(_eronly)
rjmp .Lcopystart
.Lcopyloop:
lpm r0, Z+
st X+, r0
.Lcopystart:
cpi r26, lo8(_edata)
cpc r27, r17
brne .Lcopyloop
#endif
/* Clear uninitialized data */
.global __do_clear_bss; /* Required to suppress dragging in logic from libgcc */
__do_clear_bss:
ldi r17, hi8(_ebss)
ldi r26, lo8(_sbss)
ldi r27, hi8(_sbss)
rjmp .Lclearstart
.Lclearloop:
st X+, r1
.Lclearstart:
cpi r26, lo8(_ebss)
cpc r27, r17
brne .Lclearloop
/* Perform any low-level initialization */
call up_lowinit
/* Now start NuttX */
call os_start
jmp exit
.endfunc
/****************************************************************************
* Heap Base
****************************************************************************/
/* This global variable is unsigned long g_heapbase and is
* exported from here only because of its coupling to other
* uses of _ebss in this file
*/
.data
.globl g_heapbase
.type g_heapbase, object
g_heapbase:
.word _ebss+CONFIG_IDLETHREAD_STACKSIZE
.size g_heapbase, .-g_heapbase
.end

File diff suppressed because it is too large Load Diff

View File

@ -1,373 +1,373 @@
/****************************************************************************
* arch/avr/src/avr32/up_exceptions.S
*
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/avr32/avr32.h>
#include <arch/irq.h>
/****************************************************************************
* External Symbols
****************************************************************************/
.global avr32_int0irqno /* Returns IRQ number of INT0 event */
.global avr32_int1irqno /* Returns IRQ number of INT1 event */
.global avr32_int2irqno /* Returns IRQ number of INT2 event */
.global avr32_int3irqno /* Returns IRQ number of INT3 event */
.global up_doirq /* Dispatch an IRQ */
.global up_fullcontextrestore /* Restore new task contex */
/****************************************************************************
* Macros
****************************************************************************/
/* Exception entry logic. On entry, thee context save area looks like: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
/* Upon joining common logic, the context save are will look like: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 SR PC */
/* ^ ^+3*4 */
/* and r10 will hold the exception's IRQ number */
.macro HANDLER, label, irqno
\label:
st.w --sp, r10
mov r10, \irqno
rjmp avr32_xcptcommon /* FIXME!!! Need IRQ in a register */
.endm
/****************************************************************************
* Exception Vector Table
****************************************************************************/
/* The Exception Vector Base Address (EVBA) register will contain "a */
/* pointer to the exception routines. All exception routines start at this */
/* address, or at a defined offset relative to the address. Special */
/* alignment requirements may apply for EVBA, depending on the */
/* implementation of the interrupt controller." */
/* REVISIT: This alignment requirement may be different on other AVR32s */
.text
.balign 0x200
.global vectortab
.type vectortab, @function
vectortab:
lda.w pc, avr32_unrec /* EVBA+0x00 Unrecoverable exception */
lda.w pc, avr32_tlbmult /* EVBA+0x04 TLB multiple hit */
lda.w pc, avr32_busdata /* EVBA+0x08 Bus error data fetch */
lda.w pc, avr32_businst /* EVBA+0x0c Bus error instr fetch */
lda.w pc, avr32_nmi /* EVBA+0x10 NMI */
lda.w pc, avr32_instaddr /* EVBA+0x14 Instruction Address */
lda.w pc, avr32_itlbrot /* EVBA+0x18 ITLB Protection */
lda.w pc, avr32_bp /* EVBA+0x1c Breakpoint */
lda.w pc, avr32_invinst /* EVBA+0x20 Illegal Opcode */
lda.w pc, avr32_unimpinst /* EVBA+0x24 Unimplemented instruction */
lda.w pc, avr32_priv /* EVBA+0x28 Privilege violation */
lda.w pc, avr32_fp /* EVBA+0x2c Floating-point */
lda.w pc, avr32_cop /* EVBA+0x30 Coprocessor absent */
lda.w pc, avr32_rddata /* EVBA+0x34 Data Address (Read) */
lda.w pc, avr32_wrdata /* EVBA+0x38 Data Address (Write) */
lda.w pc, avr32_tddtlbprot /* EVBA+0x3c DTLB Protection (Read) */
lda.w pc, avr32_wrdtlbprot /* EVBA+0x40 DTLB Protection (Write) */
lda.w pc, avr32_dltbmod /* EVBA+0x44 DTLB Modified */
.rept 2
lda.w pc, avr32_badvector /* EVBA+0x48-0x4c No such vector */
.endr
lda.w pc, avr32_itlbmiss /* EVBA+0x50 ITLB Miss */
.rept 3
lda.w pc, avr32_badvector /* EVBA+0x54-0x5c No such vector */
.endr
lda.w pc, avr32_rddtlb /* EVBA+0x60 DTLB Miss (Read) */
.rept 3
lda.w pc, avr32_badvector /* EVBA+0x64-0x6c No such vector */
.endr
lda.w pc, avr32_wrdtlb /* EVBA+0x70 DTLB Miss (Write) */
.rept (3+4*8)
lda.w pc, avr32_badvector /* EVBA+0x74-0xfc No such vector */
.endr
lda.w pc, avr32_super /* EVBA+0x100 Supervisor call */
/****************************************************************************
* Interrupts
****************************************************************************/
/* The interrupt controller must provide an address that is relative to the */
/* the EVBA so it is natural to define these interrupt vectors just after */
/* the exception table. On entry to each interrupt handler, R8-R12, LR, PC */
/* and SR have already been pushed onto the system stack by the MCU. */
/* */
/* An interrupt may disappear while it is being fetched by the CPU and, */
/* hence spurious interrupt may result. */
.balign 4
.global avr32_int0
avr32_int0:
mov r12, 0 /* r12=interrupt level 0 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int1
avr32_int1:
mov r12, 1 /* r12=interrupt level 1 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int2
avr32_int2:
mov r12, 2 /* r12=interrupt level 2 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int3
avr32_int3:
mov r12, 3 /* r12=interrupt level 3 */
/* Common interrupt handling logic. R12 holds the interrupt level index */
avr32_intcommon:
mcall .Lavr32_intirqno /* Get the IRQ number of the int0 event */
cp.w r12, 0 /* Negative returned if spurious interrupt */
brge avr32_common /* Jump to the common xcptn handling logic */
rete /* Ignore spurious interrupt */
.Lavr32_intirqno:
.word avr32_intirqno
/****************************************************************************
* Exception Vector Handlers
****************************************************************************/
/* Exception Handlers: */
/* On entry to each, the context save area looks like this: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
HANDLER avr32_unrec, AVR32_IRQ_UNREC /* Unrecoverable xcptn */
HANDLER avr32_tlbmult, AVR32_IRQ_TLBMULT /* TLB multiple hit */
HANDLER avr32_busdata, AVR32_IRQ_BUSDATA /* Bus error data fetch */
HANDLER avr32_businst, AVR32_IRQ_BUSINST /* Bus err instr fetch */
HANDLER avr32_nmi, AVR32_IRQ_NMI /* NMI */
HANDLER avr32_instaddr, AVR32_IRQ_INSTADDR /* Instruction Address */
HANDLER avr32_itlbrot, AVR32_IRQ_ITLBPROT /* ITLB Protection */
HANDLER avr32_bp, AVR32_IRQ_BP /* Breakpoint */
HANDLER avr32_invinst, AVR32_IRQ_INVINST /* Illegal Opcode */
HANDLER avr32_unimpinst, AVR32_IRQ_UNIMPINST /* Unimplemented intsr */
HANDLER avr32_priv, AVR32_IRQ_PRIV /* Privilege violation */
HANDLER avr32_fp, AVR32_IRQ_FP /* Floating-point */
HANDLER avr32_cop, AVR32_IRQ_COP /* Coprocessor absent */
HANDLER avr32_rddata, AVR32_IRQ_RDDATA /* Data Address (RD) */
HANDLER avr32_wrdata, AVR32_IRQ_WRDATA /* Data Address (WR) */
HANDLER avr32_tddtlbprot, AVR32_IRQ_RDDTLBPROT /* DTLB Protection (RD) */
HANDLER avr32_wrdtlbprot, AVR32_IRQ_WRDTLBPROT /* DTLB Protection (WR) */
HANDLER avr32_dltbmod, AVR32_IRQ_DLTBMOD /* DTLB Modified */
HANDLER avr32_itlbmiss, AVR32_IRQ_ITLBMISS /* ITLB Miss */
HANDLER avr32_rddtlb, AVR32_IRQ_RDDTLB /* DTLB Miss (RD) */
HANDLER avr32_wrdtlb, AVR32_IRQ_WRDTLB /* DTLB Miss (WR) */
HANDLER avr32_super, AVR32_IRQ_SUPER /* Supervisor call */
HANDLER avr32_badvector, AVR32_IRQ_BADVECTOR /* No such vector */
/* Common exception handling logic. Unlike the interrupt handlers, the */
/* exception handlers do not save R8-R12, and LR on the stack. Only the PC */
/* and SR have been pushed onto the system stack by the MCU. The following */
/* logic creates a common stack frame for exception handlers prior to */
/* joining to the common interrupt/exception logic below. */
/* */
/* The context save area looks like this on entry to the HANDLER above. */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
/* Upon joining common logic here, the context save are will loke: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 SR PC */
/* ^ ^+3*4 */
/* and r10 will hold the exception's IRQ number */
/* */
/* either (1) non-time-critical, or (2) fatal. Obvious, that would not be */
/* the case if TLB missing handling is required. Such time-critical vector */
/* handling should be handled differently. */
avr32_xcptcommon:
/* Save r10-r12, lr on the stack: */
/* xx xx xx xx xx xx xx xx xx xx xx LR 12 11 10 SR PC */
/* ^ ^+4*4 ^+6*4 */
stm --sp, r11-r12, lr
/* Move SR and PC into the expected position: */
/* xx xx xx xx xx xx xx xx xx SR PC LI 12 11 10 SR PC */
/* ^ ^+8*4 */
ld.w r12, sp[4*4]
ld.w r11, sp[5*4]
stm --sp, r11-r12
/* Save r8 and r8: */
/* xx xx xx xx xx xx xx xx xx SR PC LI 12 11 10 SR PC */
/* ^ ^+6*4 ^+8*4 */
st.w sp[6*4], r9
st.w sp[7*4], r8
/* Move the IRQ number in r12 and fall through to the common event handling */
/* logic. */
mov r12, r10
/****************************************************************************
* Common Event Handling Logic
****************************************************************************/
/* After this point, logic to manage interrupts and exceptions is */
/* equivalent. Here we have: */
/* */
/* R8-R12, LR, SR, and the PC on the stack. */
/* R12 holds the IRQ number to be dispatched. */
/* */
/* The context save area looks like this: */
/* xx xx xx xx xx xx xx xx xx SR PC LR 12 11 10 09 08 */
/* ^ ^+8*4 */
/* This function will finish construction of the register save structure */
/* and call the IRQ dispatching logic. */
avr32_common:
/* Disable interrupts in the current SR. This is necessary because the */
/* AVR32 permits nested interrupts (if they are of higher priority). */
/* We can support nested interrupts without some effort because: */
/* - The global variable current_regs permits only one interrupt, */
/* - If CONFIG_ARCH_INTERRUPTSTACK is defined, then there is a single */
/* interrupt stack, and */
/* - Probably other things. */
ssrf AVR32_SR_GM_SHIFT
/* Save the SP (as it was before the interrupt) in the conext save */
/* structure. */
/* xx xx xx xx xx xx xx xx SP SR PC LR 12 11 10 09 08 */
/* ^sp */
mov r8, sp
sub r8, -8*4
st.w --sp, r8
/* Saving R0-R7 is all that is left to complete the context save. */
/* 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^sp */
stm --sp, r0-r7
/* Now call up_doirq passing the IRQ number in r12 and the base address */
/* of the register context save area in r11. */
mov r11, sp
/* Switch to the interrrupt stack if so configured. Move the current */
/* stack pointer into a preserved register (r7) and set the interrupt */
/* stack pointer. */
#if CONFIG_ARCH_INTERRUPTSTACK > 3
mov r7, sp
lddpc sp, .Linstackbaseptr
#endif
/* Call up_doirq with r12=IRQ number and r11=register save area */
mcall .Ldoirqptr
/* Restore the user stack pointer. */
/* 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^sp */
#if CONFIG_ARCH_INTERRUPTSTACK > 3
mov sp, r7
#endif
/* On return, r12 will hold the new address of the register context */
/* save area. On an interrupt contex switch, this will (1) not be the */
/* same as the value of r12 passed to up_doirq(), and (2) may not */
/* reside on a stack. */
cp.w sp, r12
brne 1f
/* No context switch... do the simple return. First, restore r0-r7. */
/* xx xx xx xx xx xx xx xx SP SR PC LR 12 11 10 09 08 */
/* ^sp */
ldm sp++, r0-r7
/* Skip over the saved stack pointer and return from the interrupt. */
/* xx xx xx xx xx xx xx xx xx SR PC LR 12 11 10 09 08 */
/* ^sp */
sub sp, -4
rete
/* Context switch... jump to up_fullcontestrestor with r12=address of */
/* the task context to restore. */
1:
lddpc pc, .Lfullcontextrestoreptr
.Ldoirqptr:
.word up_doirq
.Lfullcontextrestoreptr:
.word up_fullcontextrestore
#if CONFIG_ARCH_INTERRUPTSTACK > 3
.Linstackbaseptr:
.word .Lintstackbase
#endif
.size vectortab, .-vectortab
/************************************************************************************
* Name: up_interruptstack
************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 3
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip (CONFIG_ARCH_INTERRUPTSTACK & ~3)
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end
/****************************************************************************
* arch/avr/src/avr32/up_exceptions.S
*
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/avr32/avr32.h>
#include <arch/irq.h>
/****************************************************************************
* External Symbols
****************************************************************************/
.global avr32_int0irqno /* Returns IRQ number of INT0 event */
.global avr32_int1irqno /* Returns IRQ number of INT1 event */
.global avr32_int2irqno /* Returns IRQ number of INT2 event */
.global avr32_int3irqno /* Returns IRQ number of INT3 event */
.global up_doirq /* Dispatch an IRQ */
.global up_fullcontextrestore /* Restore new task contex */
/****************************************************************************
* Macros
****************************************************************************/
/* Exception entry logic. On entry, thee context save area looks like: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
/* Upon joining common logic, the context save are will look like: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 SR PC */
/* ^ ^+3*4 */
/* and r10 will hold the exception's IRQ number */
.macro HANDLER, label, irqno
\label:
st.w --sp, r10
mov r10, \irqno
rjmp avr32_xcptcommon /* FIXME!!! Need IRQ in a register */
.endm
/****************************************************************************
* Exception Vector Table
****************************************************************************/
/* The Exception Vector Base Address (EVBA) register will contain "a */
/* pointer to the exception routines. All exception routines start at this */
/* address, or at a defined offset relative to the address. Special */
/* alignment requirements may apply for EVBA, depending on the */
/* implementation of the interrupt controller." */
/* REVISIT: This alignment requirement may be different on other AVR32s */
.text
.balign 0x200
.global vectortab
.type vectortab, @function
vectortab:
lda.w pc, avr32_unrec /* EVBA+0x00 Unrecoverable exception */
lda.w pc, avr32_tlbmult /* EVBA+0x04 TLB multiple hit */
lda.w pc, avr32_busdata /* EVBA+0x08 Bus error data fetch */
lda.w pc, avr32_businst /* EVBA+0x0c Bus error instr fetch */
lda.w pc, avr32_nmi /* EVBA+0x10 NMI */
lda.w pc, avr32_instaddr /* EVBA+0x14 Instruction Address */
lda.w pc, avr32_itlbrot /* EVBA+0x18 ITLB Protection */
lda.w pc, avr32_bp /* EVBA+0x1c Breakpoint */
lda.w pc, avr32_invinst /* EVBA+0x20 Illegal Opcode */
lda.w pc, avr32_unimpinst /* EVBA+0x24 Unimplemented instruction */
lda.w pc, avr32_priv /* EVBA+0x28 Privilege violation */
lda.w pc, avr32_fp /* EVBA+0x2c Floating-point */
lda.w pc, avr32_cop /* EVBA+0x30 Coprocessor absent */
lda.w pc, avr32_rddata /* EVBA+0x34 Data Address (Read) */
lda.w pc, avr32_wrdata /* EVBA+0x38 Data Address (Write) */
lda.w pc, avr32_tddtlbprot /* EVBA+0x3c DTLB Protection (Read) */
lda.w pc, avr32_wrdtlbprot /* EVBA+0x40 DTLB Protection (Write) */
lda.w pc, avr32_dltbmod /* EVBA+0x44 DTLB Modified */
.rept 2
lda.w pc, avr32_badvector /* EVBA+0x48-0x4c No such vector */
.endr
lda.w pc, avr32_itlbmiss /* EVBA+0x50 ITLB Miss */
.rept 3
lda.w pc, avr32_badvector /* EVBA+0x54-0x5c No such vector */
.endr
lda.w pc, avr32_rddtlb /* EVBA+0x60 DTLB Miss (Read) */
.rept 3
lda.w pc, avr32_badvector /* EVBA+0x64-0x6c No such vector */
.endr
lda.w pc, avr32_wrdtlb /* EVBA+0x70 DTLB Miss (Write) */
.rept (3+4*8)
lda.w pc, avr32_badvector /* EVBA+0x74-0xfc No such vector */
.endr
lda.w pc, avr32_super /* EVBA+0x100 Supervisor call */
/****************************************************************************
* Interrupts
****************************************************************************/
/* The interrupt controller must provide an address that is relative to the */
/* the EVBA so it is natural to define these interrupt vectors just after */
/* the exception table. On entry to each interrupt handler, R8-R12, LR, PC */
/* and SR have already been pushed onto the system stack by the MCU. */
/* */
/* An interrupt may disappear while it is being fetched by the CPU and, */
/* hence spurious interrupt may result. */
.balign 4
.global avr32_int0
avr32_int0:
mov r12, 0 /* r12=interrupt level 0 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int1
avr32_int1:
mov r12, 1 /* r12=interrupt level 1 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int2
avr32_int2:
mov r12, 2 /* r12=interrupt level 2 */
rjmp avr32_intcommon /* Jump to common interrupt handling logic */
.balign 4
.global avr32_int3
avr32_int3:
mov r12, 3 /* r12=interrupt level 3 */
/* Common interrupt handling logic. R12 holds the interrupt level index */
avr32_intcommon:
mcall .Lavr32_intirqno /* Get the IRQ number of the int0 event */
cp.w r12, 0 /* Negative returned if spurious interrupt */
brge avr32_common /* Jump to the common xcptn handling logic */
rete /* Ignore spurious interrupt */
.Lavr32_intirqno:
.word avr32_intirqno
/****************************************************************************
* Exception Vector Handlers
****************************************************************************/
/* Exception Handlers: */
/* On entry to each, the context save area looks like this: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
HANDLER avr32_unrec, AVR32_IRQ_UNREC /* Unrecoverable xcptn */
HANDLER avr32_tlbmult, AVR32_IRQ_TLBMULT /* TLB multiple hit */
HANDLER avr32_busdata, AVR32_IRQ_BUSDATA /* Bus error data fetch */
HANDLER avr32_businst, AVR32_IRQ_BUSINST /* Bus err instr fetch */
HANDLER avr32_nmi, AVR32_IRQ_NMI /* NMI */
HANDLER avr32_instaddr, AVR32_IRQ_INSTADDR /* Instruction Address */
HANDLER avr32_itlbrot, AVR32_IRQ_ITLBPROT /* ITLB Protection */
HANDLER avr32_bp, AVR32_IRQ_BP /* Breakpoint */
HANDLER avr32_invinst, AVR32_IRQ_INVINST /* Illegal Opcode */
HANDLER avr32_unimpinst, AVR32_IRQ_UNIMPINST /* Unimplemented intsr */
HANDLER avr32_priv, AVR32_IRQ_PRIV /* Privilege violation */
HANDLER avr32_fp, AVR32_IRQ_FP /* Floating-point */
HANDLER avr32_cop, AVR32_IRQ_COP /* Coprocessor absent */
HANDLER avr32_rddata, AVR32_IRQ_RDDATA /* Data Address (RD) */
HANDLER avr32_wrdata, AVR32_IRQ_WRDATA /* Data Address (WR) */
HANDLER avr32_tddtlbprot, AVR32_IRQ_RDDTLBPROT /* DTLB Protection (RD) */
HANDLER avr32_wrdtlbprot, AVR32_IRQ_WRDTLBPROT /* DTLB Protection (WR) */
HANDLER avr32_dltbmod, AVR32_IRQ_DLTBMOD /* DTLB Modified */
HANDLER avr32_itlbmiss, AVR32_IRQ_ITLBMISS /* ITLB Miss */
HANDLER avr32_rddtlb, AVR32_IRQ_RDDTLB /* DTLB Miss (RD) */
HANDLER avr32_wrdtlb, AVR32_IRQ_WRDTLB /* DTLB Miss (WR) */
HANDLER avr32_super, AVR32_IRQ_SUPER /* Supervisor call */
HANDLER avr32_badvector, AVR32_IRQ_BADVECTOR /* No such vector */
/* Common exception handling logic. Unlike the interrupt handlers, the */
/* exception handlers do not save R8-R12, and LR on the stack. Only the PC */
/* and SR have been pushed onto the system stack by the MCU. The following */
/* logic creates a common stack frame for exception handlers prior to */
/* joining to the common interrupt/exception logic below. */
/* */
/* The context save area looks like this on entry to the HANDLER above. */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx SR PC */
/* ^ ^+2*4 */
/* Upon joining common logic here, the context save are will loke: */
/* xx xx xx xx xx xx xx xx xx xx xx xx xx xx 10 SR PC */
/* ^ ^+3*4 */
/* and r10 will hold the exception's IRQ number */
/* */
/* either (1) non-time-critical, or (2) fatal. Obvious, that would not be */
/* the case if TLB missing handling is required. Such time-critical vector */
/* handling should be handled differently. */
avr32_xcptcommon:
/* Save r10-r12, lr on the stack: */
/* xx xx xx xx xx xx xx xx xx xx xx LR 12 11 10 SR PC */
/* ^ ^+4*4 ^+6*4 */
stm --sp, r11-r12, lr
/* Move SR and PC into the expected position: */
/* xx xx xx xx xx xx xx xx xx SR PC LI 12 11 10 SR PC */
/* ^ ^+8*4 */
ld.w r12, sp[4*4]
ld.w r11, sp[5*4]
stm --sp, r11-r12
/* Save r8 and r8: */
/* xx xx xx xx xx xx xx xx xx SR PC LI 12 11 10 SR PC */
/* ^ ^+6*4 ^+8*4 */
st.w sp[6*4], r9
st.w sp[7*4], r8
/* Move the IRQ number in r12 and fall through to the common event handling */
/* logic. */
mov r12, r10
/****************************************************************************
* Common Event Handling Logic
****************************************************************************/
/* After this point, logic to manage interrupts and exceptions is */
/* equivalent. Here we have: */
/* */
/* R8-R12, LR, SR, and the PC on the stack. */
/* R12 holds the IRQ number to be dispatched. */
/* */
/* The context save area looks like this: */
/* xx xx xx xx xx xx xx xx xx SR PC LR 12 11 10 09 08 */
/* ^ ^+8*4 */
/* This function will finish construction of the register save structure */
/* and call the IRQ dispatching logic. */
avr32_common:
/* Disable interrupts in the current SR. This is necessary because the */
/* AVR32 permits nested interrupts (if they are of higher priority). */
/* We can support nested interrupts without some effort because: */
/* - The global variable current_regs permits only one interrupt, */
/* - If CONFIG_ARCH_INTERRUPTSTACK is defined, then there is a single */
/* interrupt stack, and */
/* - Probably other things. */
ssrf AVR32_SR_GM_SHIFT
/* Save the SP (as it was before the interrupt) in the conext save */
/* structure. */
/* xx xx xx xx xx xx xx xx SP SR PC LR 12 11 10 09 08 */
/* ^sp */
mov r8, sp
sub r8, -8*4
st.w --sp, r8
/* Saving R0-R7 is all that is left to complete the context save. */
/* 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^sp */
stm --sp, r0-r7
/* Now call up_doirq passing the IRQ number in r12 and the base address */
/* of the register context save area in r11. */
mov r11, sp
/* Switch to the interrrupt stack if so configured. Move the current */
/* stack pointer into a preserved register (r7) and set the interrupt */
/* stack pointer. */
#if CONFIG_ARCH_INTERRUPTSTACK > 3
mov r7, sp
lddpc sp, .Linstackbaseptr
#endif
/* Call up_doirq with r12=IRQ number and r11=register save area */
mcall .Ldoirqptr
/* Restore the user stack pointer. */
/* 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^sp */
#if CONFIG_ARCH_INTERRUPTSTACK > 3
mov sp, r7
#endif
/* On return, r12 will hold the new address of the register context */
/* save area. On an interrupt contex switch, this will (1) not be the */
/* same as the value of r12 passed to up_doirq(), and (2) may not */
/* reside on a stack. */
cp.w sp, r12
brne 1f
/* No context switch... do the simple return. First, restore r0-r7. */
/* xx xx xx xx xx xx xx xx SP SR PC LR 12 11 10 09 08 */
/* ^sp */
ldm sp++, r0-r7
/* Skip over the saved stack pointer and return from the interrupt. */
/* xx xx xx xx xx xx xx xx xx SR PC LR 12 11 10 09 08 */
/* ^sp */
sub sp, -4
rete
/* Context switch... jump to up_fullcontestrestor with r12=address of */
/* the task context to restore. */
1:
lddpc pc, .Lfullcontextrestoreptr
.Ldoirqptr:
.word up_doirq
.Lfullcontextrestoreptr:
.word up_fullcontextrestore
#if CONFIG_ARCH_INTERRUPTSTACK > 3
.Linstackbaseptr:
.word .Lintstackbase
#endif
.size vectortab, .-vectortab
/************************************************************************************
* Name: up_interruptstack
************************************************************************************/
#if CONFIG_ARCH_INTERRUPTSTACK > 3
.bss
.align 4
.globl up_interruptstack
.type up_interruptstack, object
up_interruptstack:
.skip (CONFIG_ARCH_INTERRUPTSTACK & ~3)
.Lintstackbase:
.size up_interruptstack, .-up_interruptstack
#endif
.end

View File

@ -1,158 +1,158 @@
/****************************************************************************
* arch/avr32/src/avr32/up_fullcontextrestore.S
*
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/avr32/avr32.h>
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_fullcontextrestore.S"
/****************************************************************************
* Macros
****************************************************************************/
/****************************************************************************
* Name: up_fullcontextrestore
*
* Descripion:
* Restore the full-running contex of a thread.
*
* NOTE: Thus function must handle one very strange case. That is when
* this function is called with up_sigdeliver(). That case is strange in
* two ways:
*
* 1. It is not a context switch between threads. Rather, up_fullcontextrestore
* must behave more it more like a longjmp within the same task, using the
* same stack.
* 2. In this case, this function is called with r12 pointing to a register
* save area on the stack to be destroyed. This is dangerous for two
* reasons: (a) there is a period of time where the stack contents still
* contain valid data, but are outside of range protected by the stack
* pointer (hence, interrupts must be disabled), and (b) there is the
* very real possibility that the new stack pointer might overlap with
* the register save area and stack usage in this function might corrupt
* the register save data before the state is restored. It turns that
* an extra 3 words in the register save structure size will protect its
* contents (because that is the number of temporaries pushed onto the
* stack).
*
* Input Parameters:
* r12 = A pointer to the register save area of the thread to be restored.
*
* C Prototype:
* void up_fullcontextrestore(uint32_t *regs);
*
* Assumptions:
* Interrupts are disabled.
*
****************************************************************************/
.text
.global up_fullcontextrestore
.type up_fullcontextrestore, @function
up_fullcontextrestore:
/* Initially, r12 points to the r7 save area. Restore r0-r7. */
/* regs: 07 06 05 04 03 02 01 00 xx xx xx xx xx xx xx xx xx */
/* ^r12 */
ldm r12++, r0-r7
/* Now, r12 points to the SP (r13) save area. Recover the value of */
/* the stack pointer (r13). We will need to save some temporaries on */
/* the final stack. */
/* regs: 07 06 05 04 03 02 01 00 SP xx xx xx xx xx xx xx xx */
/* ^r12 */
ld.w sp, r12++
/* Now r12 points to the SR save area. Skip over the SR for now. */
/* regs: 07 06 05 04 03 02 01 00 SP xx xx xx xx xx xx xx xx */
/* ^r12 */
sub r12, -1*4
/* Get the pc, lr, and r12 (in r10, r9, and r8) and move them to the */
/* stack. We can now use r12 and lr as scratch registers. */
/* regs: 07 06 05 04 03 02 01 00 SP xx PC LR 12 xx xx xx xx */
/* ^r12 */
/* stack: lr, r12, pc */
/* ^sp */
ldm r12++, r8-r10 /* Get r10=pc, r9=lr, r8=r12 */
#if 0 /* See comments below */
stm --sp, r8-r10 /* Save r12, lr, and pc from the stack */
#else
st.w --sp, r10 /* Save R10=PC on the stack */
st.w --sp, r8 /* Save R8=r12 on the stack */
st.w --sp, r9 /* Save R9=lr on the stack */
#endif
/* Now r12 now points to the r11 save area. Restore r8-r11. */
/* regs: 07 06 05 04 03 02 01 00 SP xx PC LR 12 11 10 09 08 */
/* ^r12 */
ldm r12++, r8-r11
/* r12 now points +4 beyond the end of the register save area. Restore */
/* SR. NOTE: This may enable interrupts! */
/* regs: 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^r12-4*8 ^r12 */
ld.w lr, r12[-4*8]
mtsr AVR32_SR, lr
/* Restore PC, LR and r12. Hmmm.. I need to study the behaviour of ldm */
/* when r12,lr, and pc on in ldm reglist16. I'm not sure that I want */
/* that behavior. */
/* stack: lr, r12, pc */
/* ^sp */
#if 0
ldm sp++, r12, lr, pc /* Restore r12, lr, and pc from the stack */
#else
ld.w lr, sp++ /* Recover lr from the stack */
ld.w r12, sp++ /* Recover r12 from the stack */
ld.w pc, sp++ /* Jump to the address on the stack */
#endif
.end
/****************************************************************************
* arch/avr32/src/avr32/up_fullcontextrestore.S
*
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/avr32/avr32.h>
/****************************************************************************
* External Symbols
****************************************************************************/
.file "up_fullcontextrestore.S"
/****************************************************************************
* Macros
****************************************************************************/
/****************************************************************************
* Name: up_fullcontextrestore
*
* Descripion:
* Restore the full-running contex of a thread.
*
* NOTE: Thus function must handle one very strange case. That is when
* this function is called with up_sigdeliver(). That case is strange in
* two ways:
*
* 1. It is not a context switch between threads. Rather, up_fullcontextrestore
* must behave more it more like a longjmp within the same task, using the
* same stack.
* 2. In this case, this function is called with r12 pointing to a register
* save area on the stack to be destroyed. This is dangerous for two
* reasons: (a) there is a period of time where the stack contents still
* contain valid data, but are outside of range protected by the stack
* pointer (hence, interrupts must be disabled), and (b) there is the
* very real possibility that the new stack pointer might overlap with
* the register save area and stack usage in this function might corrupt
* the register save data before the state is restored. It turns that
* an extra 3 words in the register save structure size will protect its
* contents (because that is the number of temporaries pushed onto the
* stack).
*
* Input Parameters:
* r12 = A pointer to the register save area of the thread to be restored.
*
* C Prototype:
* void up_fullcontextrestore(uint32_t *regs);
*
* Assumptions:
* Interrupts are disabled.
*
****************************************************************************/
.text
.global up_fullcontextrestore
.type up_fullcontextrestore, @function
up_fullcontextrestore:
/* Initially, r12 points to the r7 save area. Restore r0-r7. */
/* regs: 07 06 05 04 03 02 01 00 xx xx xx xx xx xx xx xx xx */
/* ^r12 */
ldm r12++, r0-r7
/* Now, r12 points to the SP (r13) save area. Recover the value of */
/* the stack pointer (r13). We will need to save some temporaries on */
/* the final stack. */
/* regs: 07 06 05 04 03 02 01 00 SP xx xx xx xx xx xx xx xx */
/* ^r12 */
ld.w sp, r12++
/* Now r12 points to the SR save area. Skip over the SR for now. */
/* regs: 07 06 05 04 03 02 01 00 SP xx xx xx xx xx xx xx xx */
/* ^r12 */
sub r12, -1*4
/* Get the pc, lr, and r12 (in r10, r9, and r8) and move them to the */
/* stack. We can now use r12 and lr as scratch registers. */
/* regs: 07 06 05 04 03 02 01 00 SP xx PC LR 12 xx xx xx xx */
/* ^r12 */
/* stack: lr, r12, pc */
/* ^sp */
ldm r12++, r8-r10 /* Get r10=pc, r9=lr, r8=r12 */
#if 0 /* See comments below */
stm --sp, r8-r10 /* Save r12, lr, and pc from the stack */
#else
st.w --sp, r10 /* Save R10=PC on the stack */
st.w --sp, r8 /* Save R8=r12 on the stack */
st.w --sp, r9 /* Save R9=lr on the stack */
#endif
/* Now r12 now points to the r11 save area. Restore r8-r11. */
/* regs: 07 06 05 04 03 02 01 00 SP xx PC LR 12 11 10 09 08 */
/* ^r12 */
ldm r12++, r8-r11
/* r12 now points +4 beyond the end of the register save area. Restore */
/* SR. NOTE: This may enable interrupts! */
/* regs: 07 06 05 04 03 02 01 00 SP SR PC LR 12 11 10 09 08 */
/* ^r12-4*8 ^r12 */
ld.w lr, r12[-4*8]
mtsr AVR32_SR, lr
/* Restore PC, LR and r12. Hmmm.. I need to study the behaviour of ldm */
/* when r12,lr, and pc on in ldm reglist16. I'm not sure that I want */
/* that behavior. */
/* stack: lr, r12, pc */
/* ^sp */
#if 0
ldm sp++, r12, lr, pc /* Restore r12, lr, and pc from the stack */
#else
ld.w lr, sp++ /* Recover lr from the stack */
ld.w r12, sp++ /* Recover r12 from the stack */
ld.w pc, sp++ /* Jump to the address on the stack */
#endif
.end

View File

@ -1,84 +1,84 @@
/****************************************************************************
* arch/avr/src/avr32/up_syscall6.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Based on Bran's kernel development tutorials. Rewritten for JamesM's
* kernel development tutorials.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
.file "up_syscall6.S"
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Globals
****************************************************************************/
/****************************************************************************
* .text
****************************************************************************/
.text
/****************************************************************************
* Name: sys_call6
*
* C Prototype:
* uintptr_t sys_call6(unsigned int nbr, uintptr_t parm1,
* uintptr_t parm2, uintptr_t parm3,
* uintptr_t parm4, uintptr_t parm5,
* uintptr_t parm6);
*
****************************************************************************/
.global sys_call6
.type sys_call6, @function
.align 2
sys_call6:
stm --sp, r3, r5, r6, lr
sub lr, sp, -16
mov r8, r12
ldm lr, r3, r5, r9-r12
scall
ldm sp++, r3, r5, r6, pc
.size sys_call6, . - sys_call6
/****************************************************************************
* arch/avr/src/avr32/up_syscall6.S
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Based on Bran's kernel development tutorials. Rewritten for JamesM's
* kernel development tutorials.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
.file "up_syscall6.S"
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Globals
****************************************************************************/
/****************************************************************************
* .text
****************************************************************************/
.text
/****************************************************************************
* Name: sys_call6
*
* C Prototype:
* uintptr_t sys_call6(unsigned int nbr, uintptr_t parm1,
* uintptr_t parm2, uintptr_t parm3,
* uintptr_t parm4, uintptr_t parm5,
* uintptr_t parm6);
*
****************************************************************************/
.global sys_call6
.type sys_call6, @function
.align 2
sys_call6:
stm --sp, r3, r5, r6, lr
sub lr, sp, -16
mov r8, r12
ldm lr, r3, r5, r9-r12
scall
ldm sp++, r3, r5, r6, pc
.size sys_call6, . - sys_call6