]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A9_RZ_R7S72100_IAR_DS-5/Source/RenesasFiles/drivers/intc/intc_driver/intc.c
Add missing +TCP code.
[freertos] / FreeRTOS / Demo / CORTEX_A9_RZ_R7S72100_IAR_DS-5 / Source / RenesasFiles / drivers / intc / intc_driver / intc.c
1 /*******************************************************************************\r
2 * DISCLAIMER\r
3 * This software is supplied by Renesas Electronics Corporation and is only\r
4 * intended for use with Renesas products. No other uses are authorized. This\r
5 * software is owned by Renesas Electronics Corporation and is protected under\r
6 * all applicable laws, including copyright laws.\r
7 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING\r
8 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT\r
9 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE\r
10 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.\r
11 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS\r
12 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE\r
13 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR\r
14 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE\r
15 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\r
16 * Renesas reserves the right, without notice, to make changes to this software\r
17 * and to discontinue the availability of this software. By using this software,\r
18 * you agree to the additional terms and conditions found by accessing the\r
19 * following link:\r
20 * http://www.renesas.com/disclaimer\r
21 *\r
22 * Copyright (C) 2012 Renesas Electronics Corporation. All rights reserved.\r
23 *******************************************************************************/\r
24 /*******************************************************************************\r
25 * File Name   : intc.c\r
26 * $Rev: 17531 $\r
27 * $Date:: 2013-04-10 12:58:44 +0100#$\r
28 * Description : Aragon Sample Program - Interrupt process\r
29 *******************************************************************************/\r
30 \r
31 \r
32 /******************************************************************************\r
33 Includes   <System Includes> , "Project Includes"\r
34 ******************************************************************************/\r
35 #include "r_typedefs.h"\r
36 #include "dev_drv.h"                /* Device Driver common header */\r
37 #include "devdrv_intc.h"            /* INTC Driver Header */\r
38 #include "iodefine.h"\r
39 \r
40 /******************************************************************************\r
41 Typedef definitions\r
42 ******************************************************************************/\r
43 \r
44 \r
45 /******************************************************************************\r
46 Macro definitions\r
47 ******************************************************************************/\r
48 #define INTC_ICDISR_REG_TOTAL   (((uint16_t)INTC_ID_TOTAL / 32) + 1) /* ICDISR  */\r
49 #define INTC_ICDICFR_REG_TOTAL  (((uint16_t)INTC_ID_TOTAL / 16) + 1) /* ICDICFR */\r
50 #define INTC_ICDIPR_REG_TOTAL   (((uint16_t)INTC_ID_TOTAL /  4) + 1) /* ICDIPR  */\r
51 #define INTC_ICDIPTR_REG_TOTAL  (((uint16_t)INTC_ID_TOTAL /  4) + 1) /* ICDIPTR */\r
52 #define INTC_ICDISER_REG_TOTAL  (((uint16_t)INTC_ID_TOTAL / 32) + 1) /* ICDISER */\r
53 #define INTC_ICDICER_REG_TOTAL  (((uint16_t)INTC_ID_TOTAL / 32) + 1) /* ICDICER */\r
54 \r
55 /******************************************************************************\r
56 Imported global variables and functions (from other files)\r
57 ******************************************************************************/\r
58 \r
59 \r
60 /******************************************************************************\r
61 Exported global variables and functions (to be accessed by other files)\r
62 ******************************************************************************/\r
63 \r
64 \r
65 /******************************************************************************\r
66 Private global variables and functions\r
67 ******************************************************************************/\r
68 /* ==== Global variable ==== */\r
69 static uint32_t intc_icdicfrn_table[] =\r
70 {\r
71     0xAAAAAAAA,            /* ICDICFR0  :  15 -   0 */\r
72     0x00000055,            /* ICDICFR1  :  19 -  16 */\r
73     0xFFFD5555,            /* ICDICFR2  :  47 -  32 */\r
74     0x555FFFFF,            /* ICDICFR3  :  63 -  48 */\r
75     0x55555555,            /* ICDICFR4  :  79 -  64 */\r
76     0x55555555,            /* ICDICFR5  :  95 -  80 */\r
77     0x55555555,            /* ICDICFR6  : 111 -  96 */\r
78     0x55555555,            /* ICDICFR7  : 127 - 112 */\r
79     0x5555F555,            /* ICDICFR8  : 143 - 128 */\r
80     0x55555555,            /* ICDICFR9  : 159 - 144 */\r
81     0x55555555,            /* ICDICFR10 : 175 - 160 */\r
82     0xF5555555,            /* ICDICFR11 : 191 - 176 */\r
83     0xF555F555,            /* ICDICFR12 : 207 - 192 */\r
84     0x5555F555,            /* ICDICFR13 : 223 - 208 */\r
85     0x55555555,            /* ICDICFR14 : 239 - 224 */\r
86     0x55555555,            /* ICDICFR15 : 255 - 240 */\r
87     0x55555555,            /* ICDICFR16 : 271 - 256 */\r
88     0xFD555555,            /* ICDICFR17 : 287 - 272 */\r
89     0x55555557,            /* ICDICFR18 : 303 - 288 */\r
90     0x55555555,            /* ICDICFR19 : 319 - 304 */\r
91     0x55555555,            /* ICDICFR20 : 335 - 320 */\r
92     0x5F555555,            /* ICDICFR21 : 351 - 336 */\r
93     0xFD55555F,            /* ICDICFR22 : 367 - 352 */\r
94     0x55555557,            /* ICDICFR23 : 383 - 368 */\r
95     0x55555555,            /* ICDICFR24 : 399 - 384 */\r
96     0x55555555,            /* ICDICFR25 : 415 - 400 */\r
97     0x55555555,            /* ICDICFR26 : 431 - 416 */\r
98     0x55555555,            /* ICDICFR27 : 447 - 432 */\r
99     0x55555555,            /* ICDICFR28 : 463 - 448 */\r
100     0x55555555,            /* ICDICFR29 : 479 - 464 */\r
101     0x55555555,            /* ICDICFR30 : 495 - 480 */\r
102     0x55555555,            /* ICDICFR31 : 511 - 496 */\r
103     0x55555555,            /* ICDICFR32 : 527 - 512 */\r
104     0x55555555,            /* ICDICFR33 : 543 - 528 */\r
105     0x55555555,            /* ICDICFR34 : 559 - 544 */\r
106     0x55555555,            /* ICDICFR35 : 575 - 560 */\r
107     0x00155555             /* ICDICFR36 : 586 - 576 */\r
108 };\r
109 \r
110 \r
111 /******************************************************************************\r
112 * Function Name: R_INTC_RegistIntFunc\r
113 * Description  :\r
114 * Arguments    : uint16_t int_id\r
115 *              : void (* func)(uint32_t)\r
116 * Return Value : DEVDRV_SUCCESS\r
117 *              : DEVDRV_ERROR\r
118 ******************************************************************************/\r
119 int32_t R_INTC_RegistIntFunc(uint16_t int_id, void (* func)(uint32_t int_sense))\r
120 {\r
121     if (int_id >= INTC_ID_TOTAL)\r
122     {\r
123         return DEVDRV_ERROR;\r
124     }\r
125 \r
126     Userdef_INTC_RegistIntFunc(int_id, func);\r
127 \r
128     return DEVDRV_SUCCESS;\r
129 }\r
130 \r
131 /******************************************************************************\r
132 * Function Name: R_INTC_Init\r
133 * Description  :\r
134 * Arguments    : none\r
135 * Return Value : none\r
136 ******************************************************************************/\r
137 void R_INTC_Init(void)\r
138 {\r
139     uint16_t offset;\r
140     volatile uint32_t * addr;\r
141 \r
142     for (offset = 0; offset < INTC_ICDICFR_REG_TOTAL; offset++)\r
143     {\r
144         INTC.ICDICFR.LONG[offset] = intc_icdicfrn_table[offset];\r
145     }\r
146 \r
147     addr = (volatile uint32_t *)&INTC.ICDIPR0.LONG;\r
148     for (offset = 0; offset < INTC_ICDIPR_REG_TOTAL; offset++)\r
149     {\r
150         *(addr + offset) = 0xF8F8F8F8;\r
151     }\r
152 \r
153     addr = (volatile uint32_t *)&INTC.ICDIPTR0.LONG;\r
154     for (offset = 8; offset < INTC_ICDIPTR_REG_TOTAL; offset++)\r
155     {\r
156         *(addr + offset) = 0x01010101;\r
157     }\r
158 \r
159     for (offset = 0; offset < INTC_ICDICER_REG_TOTAL; offset++)\r
160     {\r
161         INTC.ICDICER.LONG[offset] = 0xFFFFFFFF;\r
162     }\r
163 \r
164     R_INTC_SetMaskLevel(31);\r
165 \r
166     INTC.ICCBPR.BIT.Binarypoint = 0;\r
167 \r
168     INTC.ICCICR.LONG = 3;\r
169 \r
170     /* Distributor Control Register */\r
171     INTC.ICDDCR.BIT.Enable = 1;\r
172 }\r
173 \r
174 /******************************************************************************\r
175 * Function Name: R_INTC_Enable\r
176 * Description  :\r
177 * Arguments    : uint16_t int_id\r
178 * Return Value : DEVDRV_SUCCESS\r
179 *              : DEVDRV_ERROR\r
180 ******************************************************************************/\r
181 int32_t R_INTC_Enable(uint16_t int_id)\r
182 {\r
183     uint32_t reg_value;\r
184     uint32_t mask;\r
185 \r
186     if (int_id >= INTC_ID_TOTAL)\r
187     {\r
188         return DEVDRV_ERROR;\r
189     }\r
190 \r
191     mask = 1;\r
192     mask = mask << (int_id % 32);\r
193 \r
194     reg_value = INTC.ICDISER.LONG[int_id / 32];\r
195     reg_value |= mask;\r
196     INTC.ICDISER.LONG[int_id / 32] = reg_value;\r
197 \r
198     return DEVDRV_SUCCESS;\r
199 }\r
200 \r
201 /******************************************************************************\r
202 * Function Name: R_INTC_Disable\r
203 * Description  :\r
204 * Arguments    : uint16_t int_id\r
205 * Return Value : DEVDRV_SUCCESS\r
206 *              : DEVDRV_ERROR\r
207 ******************************************************************************/\r
208 int32_t R_INTC_Disable(uint16_t int_id)\r
209 {\r
210     uint32_t reg_value;\r
211     uint32_t mask;\r
212 \r
213     if (int_id >= INTC_ID_TOTAL)\r
214     {\r
215         return DEVDRV_ERROR;\r
216     }\r
217 \r
218     mask = 1;\r
219     mask = mask << (int_id % 32);\r
220 \r
221     reg_value = INTC.ICDICER.LONG[int_id / 32];\r
222     reg_value |= mask;\r
223     INTC.ICDICER.LONG[int_id / 32] = reg_value;\r
224 \r
225     return DEVDRV_SUCCESS;\r
226 }\r
227 \r
228 /******************************************************************************\r
229 * Function Name: R_INTC_SetPriority\r
230 * Description  :\r
231 * Arguments    : uint16_t int_id\r
232 *              : uint8_t priority\r
233 * Return Value : DEVDRV_SUCCESS\r
234 *              : DEVDRV_ERROR\r
235 ******************************************************************************/\r
236 int32_t R_INTC_SetPriority(uint16_t int_id, uint8_t priority)\r
237 {\r
238     uint32_t icdipr;\r
239     uint32_t mask;\r
240     volatile uint32_t * addr;\r
241 \r
242     if ((int_id >= INTC_ID_TOTAL) || priority >= 32)\r
243     {\r
244         return DEVDRV_ERROR;\r
245     }\r
246 \r
247     priority = priority << 3;\r
248 \r
249     addr = (volatile uint32_t *)&INTC.ICDIPR0.LONG;\r
250 \r
251     icdipr = *(addr + (int_id / 4));\r
252 \r
253     mask = (uint32_t)0x000000FF;\r
254     mask = mask << ((int_id % 4) * 8);\r
255     icdipr &= ~mask;\r
256     mask = (uint32_t)priority;\r
257     mask = mask << ((int_id % 4) * 8);\r
258     icdipr |= mask;\r
259 \r
260     *(addr + (int_id / 4)) = icdipr;\r
261 \r
262     return DEVDRV_SUCCESS;\r
263 }\r
264 \r
265 /******************************************************************************\r
266 * Function Name: R_INTC_SetMaskLevel\r
267 * Description  :\r
268 * Arguments    : uint8_t mask_level\r
269 * Return Value : DEVDRV_SUCCESS\r
270 *              : DEVDRV_ERROR\r
271 ******************************************************************************/\r
272 int32_t R_INTC_SetMaskLevel(uint8_t mask_level)\r
273 {\r
274     if (mask_level >= 32)\r
275     {\r
276         return DEVDRV_ERROR;\r
277     }\r
278 \r
279     mask_level = mask_level << 3;\r
280     INTC.ICCPMR.BIT.Priority = mask_level;\r
281 \r
282     return DEVDRV_SUCCESS;\r
283 }\r
284 \r
285 /******************************************************************************\r
286 * Function Name: R_INTC_GetMaskLevel\r
287 * Description  :\r
288 * Arguments    : uint8_t * mask_level\r
289 * Return Value : none\r
290 ******************************************************************************/\r
291 void R_INTC_GetMaskLevel(uint8_t * mask_level)\r
292 {\r
293     *mask_level = INTC.ICCPMR.BIT.Priority;\r
294     *mask_level = *mask_level >> 3;\r
295 }\r
296 \r
297 /* END of File */\r
298 \r