/* * Code generated from Atmel Start. * * This file will be overwritten when reconfiguring your Atmel Start project. * Please copy examples or other code you want to keep to a separate file * to avoid losing it when reconfiguring. */ #include "driver_init.h" #include #include #include struct spi_m_sync_descriptor SPI_0; struct qspi_sync_descriptor QUAD_SPI_0; struct calendar_descriptor CALENDER_INTERFACE; struct usart_sync_descriptor USART_DBG; struct mci_sync_desc IO_BUS; struct usb_h_desc USB_HOST_INSTANCE_inst; void QUAD_SPI_0_PORT_init(void) { // Set pin direction to input gpio_set_pin_direction(PB11, GPIO_DIRECTION_IN); gpio_set_pin_pull_mode(PB11, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB11, PINMUX_PB11H_QSPI_CS); gpio_set_pin_direction(PA08, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA08, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA08, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA08, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA08H_QSPI_DATA0); gpio_set_pin_direction(PA09, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA09, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA09, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA09, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA09H_QSPI_DATA1); gpio_set_pin_direction(PA10, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA10, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA10, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA10, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA10H_QSPI_DATA2); gpio_set_pin_direction(PA11, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA11, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA11, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA11, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA11H_QSPI_DATA3); // Set pin direction to input gpio_set_pin_direction(PB10, GPIO_DIRECTION_IN); gpio_set_pin_pull_mode(PB10, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB10, PINMUX_PB10H_QSPI_SCK); } void QUAD_SPI_0_CLOCK_init(void) { hri_mclk_set_AHBMASK_QSPI_bit(MCLK); hri_mclk_set_AHBMASK_QSPI_2X_bit(MCLK); hri_mclk_set_APBCMASK_QSPI_bit(MCLK); } void QUAD_SPI_0_init(void) { QUAD_SPI_0_CLOCK_init(); qspi_sync_init(&QUAD_SPI_0, QSPI); QUAD_SPI_0_PORT_init(); } void CALENDER_INTERFACE_CLOCK_init(void) { hri_mclk_set_APBAMASK_RTC_bit(MCLK); } void CALENDER_INTERFACE_init(void) { CALENDER_INTERFACE_CLOCK_init(); calendar_init(&CALENDER_INTERFACE, RTC); } void SPI_0_PORT_init(void) { gpio_set_pin_level(PB26, // Initial level // pad_initial_level // Low // High false); // Set pin direction to output gpio_set_pin_direction(PB26, GPIO_DIRECTION_OUT); gpio_set_pin_function(PB26, PINMUX_PB26C_SERCOM2_PAD0); gpio_set_pin_level(PB27, // Initial level // pad_initial_level // Low // High false); // Set pin direction to output gpio_set_pin_direction(PB27, GPIO_DIRECTION_OUT); gpio_set_pin_function(PB27, PINMUX_PB27C_SERCOM2_PAD1); // Set pin direction to input gpio_set_pin_direction(PB29, GPIO_DIRECTION_IN); gpio_set_pin_pull_mode(PB29, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB29, PINMUX_PB29C_SERCOM2_PAD3); } void SPI_0_CLOCK_init(void) { hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_CORE, CONF_GCLK_SERCOM2_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_SLOW, CONF_GCLK_SERCOM2_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_mclk_set_APBBMASK_SERCOM2_bit(MCLK); } void SPI_0_init(void) { SPI_0_CLOCK_init(); spi_m_sync_init(&SPI_0, SERCOM2); SPI_0_PORT_init(); } void USART_DBG_PORT_init(void) { gpio_set_pin_function(PB12, PINMUX_PB12C_SERCOM4_PAD0); gpio_set_pin_function(PB13, PINMUX_PB13C_SERCOM4_PAD1); } void USART_DBG_CLOCK_init(void) { hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM4_GCLK_ID_CORE, CONF_GCLK_SERCOM4_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM4_GCLK_ID_SLOW, CONF_GCLK_SERCOM4_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_mclk_set_APBDMASK_SERCOM4_bit(MCLK); } void USART_DBG_init(void) { USART_DBG_CLOCK_init(); usart_sync_init(&USART_DBG, SERCOM4, (void *)NULL); USART_DBG_PORT_init(); } void IO_BUS_PORT_init(void) { gpio_set_pin_direction(PA21, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA21, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA21, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA21, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA21I_SDHC1_SDCK); gpio_set_pin_direction(PA20, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA20, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA20, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA20, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA20I_SDHC1_SDCMD); gpio_set_pin_direction(PB18, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PB18, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PB18, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB18, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PB18I_SDHC1_SDDAT0); gpio_set_pin_direction(PB19, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PB19, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PB19, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB19, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PB19I_SDHC1_SDDAT1); gpio_set_pin_direction(PB20, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PB20, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PB20, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB20, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PB20I_SDHC1_SDDAT2); gpio_set_pin_direction(PB21, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PB21, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PB21, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PB21, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PB21I_SDHC1_SDDAT3); } void IO_BUS_CLOCK_init(void) { hri_mclk_set_AHBMASK_SDHC1_bit(MCLK); hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID, CONF_GCLK_SDHC1_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID_SLOW, CONF_GCLK_SDHC1_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); } void IO_BUS_init(void) { IO_BUS_CLOCK_init(); mci_sync_init(&IO_BUS, SDHC1); IO_BUS_PORT_init(); } /* The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock * for low speed and full speed operation. */ #if (CONF_GCLK_USB_FREQUENCY > (48000000 + 48000000 / 400)) || (CONF_GCLK_USB_FREQUENCY < (48000000 - 48000000 / 400)) #warning USB clock should be 48MHz ~ 0.25% clock, check your configuration! #endif /** \brief VBus control callback * VBus must be always turned on if this callback is disabled. */ WEAK void my_vbus_ctrl_func(void *drv, uint8_t port, bool onoff) { /* Turn on/off your root hub port power */ } void USB_HOST_INSTANCE_CLOCK_init(void) { hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, CONF_GCLK_USB_SRC | GCLK_PCHCTRL_CHEN); hri_mclk_set_AHBMASK_USB_bit(MCLK); hri_mclk_set_APBBMASK_USB_bit(MCLK); } void USB_HOST_INSTANCE_PORT_init(void) { gpio_set_pin_direction(PA24, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA24, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA24, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA24, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA24H_USB_DM); gpio_set_pin_direction(PA25, // Pin direction // pad_direction // Off // In // Out GPIO_DIRECTION_OUT); gpio_set_pin_level(PA25, // Initial level // pad_initial_level // Low // High false); gpio_set_pin_pull_mode(PA25, // Pull configuration // pad_pull_config // Off // Pull-up // Pull-down GPIO_PULL_OFF); gpio_set_pin_function(PA25, // Pin function // pad_function // Auto : use driver pinmux if signal is imported by driver, else turn off function // Auto // Off // A // B // C // D // E // F // G // H // I // J // K // L // M // N PINMUX_PA25H_USB_DP); } void USB_HOST_INSTANCE_init(void) { USB_HOST_INSTANCE_CLOCK_init(); usb_h_init(&USB_HOST_INSTANCE_inst, USB, NULL); USB_HOST_INSTANCE_PORT_init(); } void system_init(void) { init_mcu(); QUAD_SPI_0_init(); CALENDER_INTERFACE_init(); SPI_0_init(); USART_DBG_init(); IO_BUS_init(); USB_HOST_INSTANCE_init(); }