diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-01-22 16:09:10 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-01-22 16:09:10 +0000 |
commit | 7dad51762decebe5d104fe7dad9eb23680cabd23 (patch) | |
tree | 4a123dae59fba7a45afa0683bedf9022cd3c6f89 /nuttx/arch/arm/src/sam3u | |
parent | 9375b285f28c3636edab8bc60540f156aa11eaf7 (diff) | |
download | px4-firmware-7dad51762decebe5d104fe7dad9eb23680cabd23.tar.gz px4-firmware-7dad51762decebe5d104fe7dad9eb23680cabd23.tar.bz2 px4-firmware-7dad51762decebe5d104fe7dad9eb23680cabd23.zip |
Use of BASEPRI to control ARM interrupts is now functional
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5548 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/sam3u')
-rw-r--r-- | nuttx/arch/arm/src/sam3u/sam3u_irq.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/nuttx/arch/arm/src/sam3u/sam3u_irq.c b/nuttx/arch/arm/src/sam3u/sam3u_irq.c index 690a075ef..ed424f91d 100644 --- a/nuttx/arch/arm/src/sam3u/sam3u_irq.c +++ b/nuttx/arch/arm/src/sam3u/sam3u_irq.c @@ -185,7 +185,7 @@ static int sam3u_reserved(int irq, FAR void *context) #endif /**************************************************************************** - * Name: up_prioritize_irq + * Name: sam3u_prioritize_syscall * * Description: * Set the priority of an exception. This function may be needed @@ -193,23 +193,17 @@ static int sam3u_reserved(int irq, FAR void *context) * ****************************************************************************/ -#if !defined(CONFIG_ARCH_IRQPRIO) && defined(CONFIG_ARMV7M_USEBASEPRI) -static int up_prioritize_irq(int irq, int priority) +#ifdef CONFIG_ARMV7M_USEBASEPRI +static inline void sam3u_prioritize_syscall(int priority) { - uint32_t regaddr; uint32_t regval; - int shift; - irq -= 4; - regaddr = NVIC_SYSH_PRIORITY(irq); - regval = getreg32(regaddr); - shift = ((irq & 3) << 3); - regval &= ~(0xff << shift); - regval |= (priority << shift); - putreg32(regval, regaddr); + /* SVCALL is system handler 11 */ - stm32_dumpnvic("prioritize", irq); - return OK; + regval = getreg32(NVIC_SYSH8_11_PRIORITY); + regval &= ~NVIC_SYSH_PRIORITY_PR11_MASK; + regval |= (priority << NVIC_SYSH_PRIORITY_PR11_SHIFT); + putreg32(regval, NVIC_SYSH8_11_PRIORITY); } #endif @@ -326,7 +320,7 @@ void up_irqinitialize(void) /* up_prioritize_irq(SAM3U_IRQ_PENDSV, NVIC_SYSH_PRIORITY_MIN); */ #endif #ifdef CONFIG_ARMV7M_USEBASEPRI - up_prioritize_irq(SAM3U_IRQ_SVCALL, NVIC_SYSH_SVCALL_PRIORITY); + sam3u_prioritize_syscall(NVIC_SYSH_SVCALL_PRIORITY); #endif /* If the MPU is enabled, then attach and enable the Memory Management @@ -478,11 +472,17 @@ int up_prioritize_irq(int irq, int priority) if (irq < SAM3U_IRQ_EXTINT) { - irq -= 4; + /* NVIC_SYSH_PRIORITY() maps {0..15} to one of three priority + * registers (0-3 are invalid) + */ + regaddr = NVIC_SYSH_PRIORITY(irq); + irq -= 4; } else { + /* NVIC_IRQ_PRIORITY() maps {0..} to one of many priority registers */ + irq -= SAM3U_IRQ_EXTINT; regaddr = NVIC_IRQ_PRIORITY(irq); } |