]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/PIC32MEC14xx_MPLAB/src/MEC14xx/interrupts/girq24.c
Add PIC32MEC14xx port and demo application.
[freertos] / FreeRTOS / Demo / PIC32MEC14xx_MPLAB / src / MEC14xx / interrupts / girq24.c
1 /*****************************************************************************\r
2 * (c) 2014 Microchip Technology Inc. and its subsidiaries.\r
3 * You may use this software and any derivatives exclusively with\r
4 * Microchip products.\r
5 * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS".\r
6 * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,\r
7 * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,\r
8 * AND FITNESS FOR A PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP\r
9 * PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.\r
10 * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,\r
11 * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND\r
12 * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS\r
13 * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.\r
14 * TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL\r
15 * CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF\r
16 * FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.\r
17 * MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE\r
18 * OF THESE TERMS.\r
19 *****************************************************************************/\r
20 \r
21 /** @file girq24.c\r
22  *Interrupt service routines for MIPS using vanilla GCC and MCHP XC32\r
23  */\r
24 /** @defgroup MEC14xx ISR\r
25  *  @{\r
26  */\r
27 \r
28 #include "appcfg.h"\r
29 #include "platform.h"\r
30 #include "MEC14xx/mec14xx.h"\r
31 #include "MEC14xx/mec14xx_girqs.h"\r
32 #include "MEC14xx/mec14xx_gpio.h"\r
33 #include "MEC14xx/mec14xx_bbled.h"\r
34 #include "MEC14xx/mec14xx_trace_func.h"\r
35 \r
36 \r
37 typedef void (* GIRQ24_FPVU8)(uint8_t);\r
38 \r
39 \r
40 /* MIPS M14K internal counter is connected to GIRQ24 bit[0]\r
41  * It is a simple counter which fires an interrupt when its \r
42  * count value is equal to a match value.\r
43  * \r
44  */\r
45  \r
46 #if GIRQ24_DISAGG == 0\r
47 \r
48 \r
49 void girq24_dflt_handler(uint8_t inum)\r
50 {\r
51     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].EN_CLR = (1ul << inum);\r
52     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].SOURCE = (1ul << inum);\r
53 }\r
54 \r
55 void __attribute__((weak)) m14k_counter_handler(uint8_t inum)\r
56 {\r
57     uint32_t r;\r
58 \r
59     (void) inum;\r
60 \r
61     r = _CP0_GET_COUNT();\r
62     r += (M14K_TIMER_COMPARE);\r
63     /* Write of CP0.Compare clears status in M14K */\r
64     _CP0_SET_COUNT(r);\r
65 \r
66     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].SOURCE = (1ul << 0);\r
67 \r
68 }\r
69 \r
70 /*\r
71  * TODO - FreeRTOS M14K Software Interrupt 0 handler\r
72  * is vPortYieldISR in port_asm.S\r
73  * vPortYieldISR was designed to be entered directly by the\r
74  * CPU not via a higher level ISR handler.\r
75  * One work-around is to modify vPortYieldISR to do the work\r
76  * of girq24_handler below. It must determine which GIRQ24 source\r
77  * was active: M14K counter, SoftIRQ0, or SoftIRQ1.\r
78  */\r
79 void __attribute__((weak)) m14k_soft_irq0(uint8_t inum)\r
80 {\r
81     (void) inum;\r
82 \r
83     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].SOURCE = (1ul << 1);\r
84 \r
85 }\r
86 \r
87 void __attribute__((weak)) m14k_soft_irq1(uint8_t inum)\r
88 {\r
89     (void) inum;\r
90 \r
91     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].SOURCE = (1ul << 2);\r
92     \r
93 }\r
94 \r
95 void girq24_b_0_2( void )\r
96 {\r
97     uint32_t d;\r
98 \r
99     d = JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].RESULT & (GIRQ24_SRC_MASK);\r
100 \r
101     if ( d & (1ul << 0) )\r
102     {\r
103         m14k_counter_handler(0);\r
104     }\r
105 \r
106     if ( d & (1ul << 2) )\r
107     {\r
108         m14k_soft_irq1(2);\r
109     }\r
110 }\r
111 \r
112 \r
113 const GIRQ24_FPVU8 girq24_htable[GIRQ24_NUM_SOURCES] =\r
114 {\r
115     m14k_counter_handler,   /* m14k_counter_handler, */\r
116     m14k_soft_irq0,         /* m14k_soft_irq0, */\r
117     m14k_soft_irq1,         /* m14k_soft_irq1 */\r
118 };\r
119 \r
120 void __attribute__((weak, interrupt, nomips16, section(".girqs")))\r
121 girq24_isr(void)\r
122 {\r
123     uint32_t d;\r
124     uint8_t bitpos;\r
125 \r
126     d = JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].RESULT & (GIRQ24_SRC_MASK);\r
127     while ( 0 != d )\r
128     {\r
129         bitpos = 31 - ((uint8_t)__builtin_clz(d) & 0x1F);\r
130         (girq24_htable[bitpos])(bitpos);\r
131         d &= ~(1ul << bitpos);\r
132     }\r
133 }\r
134 \r
135 #else\r
136 \r
137 void __attribute__((weak, interrupt, nomips16))\r
138 girq24_b0(void)\r
139 {\r
140     uint32_t r;\r
141     \r
142     r = _CP0_GET_COUNT();\r
143     r += (M14K_TIMER_COMPARE);\r
144     _CP0_SET_COUNT(r);\r
145 \r
146     JTVIC_GIRQ->REGS[MEC14xx_GIRQ24_ID].SOURCE = (1ul << 0);    \r
147 }\r
148 \r
149 void __attribute__((weak, interrupt, nomips16))\r
150 girq24_b1(void)\r
151 {\r
152 \r
153     _CP0_BIC_CAUSE(0x100ul);\r
154  \r
155     jtvic_clr_source(MEC14xx_GIRQ24_ID, 1);\r
156 }\r
157 \r
158 void __attribute__((weak, interrupt, nomips16))\r
159 girq24_b2(void)\r
160 {\r
161 \r
162     _CP0_BIC_CAUSE(0x200ul);\r
163 \r
164     jtvic_clr_source(MEC14xx_GIRQ24_ID, 2);\r
165 }\r
166 \r
167 #endif\r
168 \r
169 /* end girq24.c */\r
170 /**   @}\r
171  */\r
172 \r