1 /* ----------------------------------------------------------------------------
\r
2 * SAM Software Package License
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2015, Atmel Corporation
\r
6 * All rights reserved.
\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
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\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
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
33 * Provides the low-level initialization function that called on chip startup.
\r
36 /*----------------------------------------------------------------------------
\r
38 *----------------------------------------------------------------------------*/
\r
42 #include "compiler.h"
\r
45 #include "cortex-a/cpsr.h"
\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
54 /*----------------------------------------------------------------------------
\r
56 *----------------------------------------------------------------------------*/
\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
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
67 void low_level_init(void)
\r
71 /* Setup default interrupt handlers */
\r
74 /* Configure clocking if code is not in external mem */
\r
75 if ((uint32_t)low_level_init < DDR_CS_ADDR)
\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
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
96 AIC->AIC_SVR = (unsigned int) FIQ_Handler;
\r
98 for (i = 1; i < 31; i++)
\r
101 AIC->AIC_SVR = (unsigned int) FreeRTOS_IRQ_Handler;
\r
104 AIC->AIC_SPU = (unsigned int) Undefined_Handler;
\r
106 /* Disable all interrupts */
\r
107 for (i = 1; i < 31; i++)
\r
110 AIC->AIC_IDCR = 1 ;
\r
112 /* Clear All pending interrupts flags */
\r
113 for (i = 1; i < 31; i++)
\r
116 AIC->AIC_ICCR = 1 ;
\r
118 /* Perform 8 IT acknoledge (write any value in EOICR) */
\r
119 for (i = 0; i < 8 ; i++)
\r
121 AIC->AIC_EOICR = 0;
\r
125 matrix_remap_ram();
\r
127 // timer_configure(BOARD_TIMER_RESOLUTION);
\r
131 * \brief Restore all IOs to default state after power-on reset.
\r
133 void board_restore_pio_reset_state(void)
\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
145 pio_configure(pins, ARRAY_SIZE(pins));
\r
146 for (i = 0; i < ARRAY_SIZE(pins); i++)
\r
147 pio_clear(&pins[i]);
\r
150 void board_save_misc_power(void)
\r
154 /* disable USB clock */
\r
155 pmc_disable_upll_clock();
\r
156 pmc_disable_upll_bias();
\r
158 /* Disable audio clock */
\r
159 // pmc_disable_audio();
\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
172 /* disable all peripheral clocks except PIOA for JTAG, serial debug port */
\r
173 for (i = ID_PIT; i < ID_PERIPH_COUNT; i++) {
\r
176 pmc_disable_peripheral(i);
\r