1 /*******************************************************************************
\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
20 * http://www.renesas.com/disclaimer
\r
22 * Copyright (C) 2012 Renesas Electronics Corporation. All rights reserved.
\r
23 *******************************************************************************/
\r
24 /*******************************************************************************
\r
25 * File Name : intc.c
\r
27 * $Date:: 2013-04-10 12:58:44 +0100#$
\r
28 * Description : Aragon Sample Program - Interrupt process
\r
29 *******************************************************************************/
\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
40 /******************************************************************************
\r
42 ******************************************************************************/
\r
45 /******************************************************************************
\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
55 /******************************************************************************
\r
56 Imported global variables and functions (from other files)
\r
57 ******************************************************************************/
\r
60 /******************************************************************************
\r
61 Exported global variables and functions (to be accessed by other files)
\r
62 ******************************************************************************/
\r
65 /******************************************************************************
\r
66 Private global variables and functions
\r
67 ******************************************************************************/
\r
68 /* ==== Global variable ==== */
\r
69 static uint32_t intc_icdicfrn_table[] =
\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
111 /******************************************************************************
\r
112 * Function Name: R_INTC_RegistIntFunc
\r
114 * Arguments : uint16_t int_id
\r
115 * : void (* func)(uint32_t)
\r
116 * Return Value : DEVDRV_SUCCESS
\r
118 ******************************************************************************/
\r
119 int32_t R_INTC_RegistIntFunc(uint16_t int_id, void (* func)(uint32_t int_sense))
\r
121 if (int_id >= INTC_ID_TOTAL)
\r
123 return DEVDRV_ERROR;
\r
126 Userdef_INTC_RegistIntFunc(int_id, func);
\r
128 return DEVDRV_SUCCESS;
\r
131 /******************************************************************************
\r
132 * Function Name: R_INTC_Init
\r
135 * Return Value : none
\r
136 ******************************************************************************/
\r
137 void R_INTC_Init(void)
\r
140 volatile uint32_t * addr;
\r
142 for (offset = 0; offset < INTC_ICDICFR_REG_TOTAL; offset++)
\r
144 INTC.ICDICFR.LONG[offset] = intc_icdicfrn_table[offset];
\r
147 addr = (volatile uint32_t *)&INTC.ICDIPR0.LONG;
\r
148 for (offset = 0; offset < INTC_ICDIPR_REG_TOTAL; offset++)
\r
150 *(addr + offset) = 0xF8F8F8F8;
\r
153 addr = (volatile uint32_t *)&INTC.ICDIPTR0.LONG;
\r
154 for (offset = 8; offset < INTC_ICDIPTR_REG_TOTAL; offset++)
\r
156 *(addr + offset) = 0x01010101;
\r
159 for (offset = 0; offset < INTC_ICDICER_REG_TOTAL; offset++)
\r
161 INTC.ICDICER.LONG[offset] = 0xFFFFFFFF;
\r
164 R_INTC_SetMaskLevel(31);
\r
166 INTC.ICCBPR.BIT.Binarypoint = 0;
\r
168 INTC.ICCICR.LONG = 3;
\r
170 /* Distributor Control Register */
\r
171 INTC.ICDDCR.BIT.Enable = 1;
\r
174 /******************************************************************************
\r
175 * Function Name: R_INTC_Enable
\r
177 * Arguments : uint16_t int_id
\r
178 * Return Value : DEVDRV_SUCCESS
\r
180 ******************************************************************************/
\r
181 int32_t R_INTC_Enable(uint16_t int_id)
\r
183 uint32_t reg_value;
\r
186 if (int_id >= INTC_ID_TOTAL)
\r
188 return DEVDRV_ERROR;
\r
192 mask = mask << (int_id % 32);
\r
194 reg_value = INTC.ICDISER.LONG[int_id / 32];
\r
196 INTC.ICDISER.LONG[int_id / 32] = reg_value;
\r
198 return DEVDRV_SUCCESS;
\r
201 /******************************************************************************
\r
202 * Function Name: R_INTC_Disable
\r
204 * Arguments : uint16_t int_id
\r
205 * Return Value : DEVDRV_SUCCESS
\r
207 ******************************************************************************/
\r
208 int32_t R_INTC_Disable(uint16_t int_id)
\r
210 uint32_t reg_value;
\r
213 if (int_id >= INTC_ID_TOTAL)
\r
215 return DEVDRV_ERROR;
\r
219 mask = mask << (int_id % 32);
\r
221 reg_value = INTC.ICDICER.LONG[int_id / 32];
\r
223 INTC.ICDICER.LONG[int_id / 32] = reg_value;
\r
225 return DEVDRV_SUCCESS;
\r
228 /******************************************************************************
\r
229 * Function Name: R_INTC_SetPriority
\r
231 * Arguments : uint16_t int_id
\r
232 * : uint8_t priority
\r
233 * Return Value : DEVDRV_SUCCESS
\r
235 ******************************************************************************/
\r
236 int32_t R_INTC_SetPriority(uint16_t int_id, uint8_t priority)
\r
240 volatile uint32_t * addr;
\r
242 if ((int_id >= INTC_ID_TOTAL) || priority >= 32)
\r
244 return DEVDRV_ERROR;
\r
247 priority = priority << 3;
\r
249 addr = (volatile uint32_t *)&INTC.ICDIPR0.LONG;
\r
251 icdipr = *(addr + (int_id / 4));
\r
253 mask = (uint32_t)0x000000FF;
\r
254 mask = mask << ((int_id % 4) * 8);
\r
256 mask = (uint32_t)priority;
\r
257 mask = mask << ((int_id % 4) * 8);
\r
260 *(addr + (int_id / 4)) = icdipr;
\r
262 return DEVDRV_SUCCESS;
\r
265 /******************************************************************************
\r
266 * Function Name: R_INTC_SetMaskLevel
\r
268 * Arguments : uint8_t mask_level
\r
269 * Return Value : DEVDRV_SUCCESS
\r
271 ******************************************************************************/
\r
272 int32_t R_INTC_SetMaskLevel(uint8_t mask_level)
\r
274 if (mask_level >= 32)
\r
276 return DEVDRV_ERROR;
\r
279 mask_level = mask_level << 3;
\r
280 INTC.ICCPMR.BIT.Priority = mask_level;
\r
282 return DEVDRV_SUCCESS;
\r
285 /******************************************************************************
\r
286 * Function Name: R_INTC_GetMaskLevel
\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
293 *mask_level = INTC.ICCPMR.BIT.Priority;
\r
294 *mask_level = *mask_level >> 3;
\r