]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D2x_Xplained_IAR/AtmelFiles/target/sama5d2/board_lowlevel.c
Add SAMA5D2 Xplained IAR demo.
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D2x_Xplained_IAR / AtmelFiles / target / sama5d2 / board_lowlevel.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2015, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 /**\r
31  * \file\r
32  *\r
33  * Provides the low-level initialization function that called on chip startup.\r
34  */\r
35 \r
36 /*----------------------------------------------------------------------------\r
37  *        Headers\r
38  *----------------------------------------------------------------------------*/\r
39 \r
40 #include "chip.h"\r
41 #include "board.h"\r
42 #include "compiler.h"\r
43 #include "timer.h"\r
44 \r
45 #include "cortex-a/cpsr.h"\r
46 \r
47 #include "peripherals/aic.h"\r
48 #include "peripherals/matrix.h"\r
49 #include "peripherals/pio.h"\r
50 #include "peripherals/pmc.h"\r
51 \r
52 #include <stdio.h>\r
53 \r
54 /*----------------------------------------------------------------------------\r
55  *        Functions\r
56  *----------------------------------------------------------------------------*/\r
57 \r
58 extern void Undefined_Handler();\r
59 extern void Abort_Handler();\r
60 extern void FIQ_Handler();\r
61 extern void FreeRTOS_IRQ_Handler();\r
62 \r
63 /**\r
64  * \brief Performs the low-level initialization of the chip.\r
65  * It also enable a low level on the pin NRST triggers a user reset.\r
66  */\r
67 void low_level_init(void)\r
68 {\r
69   uint32_t i;\r
70 \r
71         /* Setup default interrupt handlers */\r
72         aic_initialize();\r
73 \r
74         /* Configure clocking if code is not in external mem */\r
75         if ((uint32_t)low_level_init < DDR_CS_ADDR)\r
76         {\r
77                 pmc_switch_mck_to_slck();\r
78                 pmc_set_mck_h32mxdiv(PMC_MCKR_H32MXDIV_H32MXDIV2);\r
79                 pmc_set_mck_plla_div(PMC_MCKR_PLLADIV2);\r
80                 pmc_set_mck_prescaler(PMC_MCKR_PRES_CLOCK);\r
81                 pmc_set_mck_divider(PMC_MCKR_MDIV_EQ_PCK);\r
82                 /* Disable PLLA */\r
83                 pmc_set_plla(0, PMC_PLLICPR_IPLL_PLLA(0x3));\r
84                 pmc_select_external_osc();\r
85                 /* Configure PLLA */\r
86                 pmc_set_plla(CKGR_PLLAR_ONE | CKGR_PLLAR_PLLACOUNT(0x3F) |\r
87                         CKGR_PLLAR_OUTA(0x0) | CKGR_PLLAR_MULA(82) |\r
88                         CKGR_PLLAR_DIVA_BYPASS, PMC_PLLICPR_IPLL_PLLA(0x3));\r
89                 pmc_set_mck_divider(PMC_MCKR_MDIV_PCK_DIV3);\r
90                 pmc_set_mck_prescaler(PMC_MCKR_PRES_CLOCK);\r
91                 pmc_switch_mck_to_pll();\r
92         }\r
93 \r
94    /* select FIQ */\r
95     AIC->AIC_SSR = 0;\r
96     AIC->AIC_SVR = (unsigned int) FIQ_Handler;\r
97 \r
98     for (i = 1; i < 31; i++)\r
99     {\r
100         AIC->AIC_SSR = i;\r
101         AIC->AIC_SVR =  (unsigned int) FreeRTOS_IRQ_Handler;\r
102     }\r
103 \r
104     AIC->AIC_SPU =  (unsigned int) Undefined_Handler;\r
105 \r
106     /* Disable all interrupts */\r
107     for (i = 1; i < 31; i++)\r
108     {\r
109         AIC->AIC_SSR  = i;\r
110         AIC->AIC_IDCR = 1 ;\r
111     }\r
112     /* Clear All pending interrupts flags */\r
113     for (i = 1; i < 31; i++)\r
114     {\r
115         AIC->AIC_SSR  = i;\r
116         AIC->AIC_ICCR = 1 ;\r
117     }\r
118     /* Perform 8 IT acknoledge (write any value in EOICR) */\r
119     for (i = 0; i < 8 ; i++)\r
120     {\r
121         AIC->AIC_EOICR = 0;\r
122     }\r
123 \r
124         /* Remap */\r
125         matrix_remap_ram();\r
126 \r
127         // timer_configure(BOARD_TIMER_RESOLUTION);\r
128 }\r
129 \r
130 /**\r
131  * \brief Restore all IOs to default state after power-on reset.\r
132  */\r
133 void board_restore_pio_reset_state(void)\r
134 {\r
135         unsigned int i;\r
136 \r
137         /* all pins, excluding JTAG and NTRST */\r
138         struct _pin pins[] = {\r
139                 { PIO_GROUP_A, 0xFFFFFFFF, PIO_INPUT, PIO_PULLUP },\r
140                 { PIO_GROUP_B, 0xFFFFFFFF, PIO_INPUT, PIO_PULLUP },\r
141                 { PIO_GROUP_C, 0xFFFFFFFF, PIO_INPUT, PIO_PULLUP },\r
142                 { PIO_GROUP_D, 0xFFF83FFF, PIO_INPUT, PIO_PULLUP },\r
143         };\r
144 \r
145         pio_configure(pins, ARRAY_SIZE(pins));\r
146         for (i = 0; i < ARRAY_SIZE(pins); i++)\r
147                 pio_clear(&pins[i]);\r
148 }\r
149 \r
150 void board_save_misc_power(void)\r
151 {\r
152         int i;\r
153 \r
154         /* disable USB clock */\r
155         pmc_disable_upll_clock();\r
156         pmc_disable_upll_bias();\r
157 \r
158         /* Disable audio clock */\r
159 //      pmc_disable_audio();\r
160 \r
161         /* disable system clocks */\r
162         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_DDR);\r
163         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_LCD);\r
164         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_SMD);\r
165         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_UHP);\r
166         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_UDP);\r
167         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_PCK0);\r
168         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_PCK1);\r
169         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_PCK2);\r
170         pmc_disable_system_clock(PMC_SYSTEM_CLOCK_ISC);\r
171 \r
172         /* disable all peripheral clocks except PIOA for JTAG, serial debug port */\r
173         for (i = ID_PIT; i < ID_PERIPH_COUNT; i++) {\r
174                 if (i == ID_PIOA)\r
175                         continue;\r
176                 pmc_disable_peripheral(i);\r
177         }\r
178 }\r
179 \r