/** * \brief SAMD21 SAM-BA Main loop. * \return Unused (ANSI-C compatibility). */ int main(void) { #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES P_USB_CDC pCdc; #endif DEBUG_PIN_HIGH; /* Jump in application if condition is satisfied */ check_start_application(); /* We have determined we should stay in the monitor. */ /* System initialization */ board_init(); __enable_irq(); /* Initialize LEDs */ LED_init(); #if !defined(BOARD_LED_FADE_ENABLED) LED_on(); #endif LEDRX_init(); LEDRX_off(); LEDTX_init(); LEDTX_off(); /* Start the sys tick (20 us) */ SysTick_Config(VARIANT_MCK / 50000); /* If SDCARD_ENABLED defined, read optional external pins and run SD Card bootloader (if enabled). */ #if defined(SDCARD_ENABLED) uint8_t bootloaderMode = SD_BOOTLOADER_MODE_NO_UPDATE; #if defined(SAM_BA_INTERFACE_USE_PIN) uint8_t sdcardStatus = SD_BOOTLOADER_NOT_CALLED; #endif #if defined(SDCARD_USE_PIN1) pinConfig(SDCARD_PIN1_PORT, SDCARD_PIN1_PIN, SDCARD_PIN1_CONFIG); #endif #if defined(SDCARD_USE_PIN2) #if !defined(SDCARD_USE_PIN1) #error "main.c: When SDCARD_USE_PIN2 is defined, SDCARD_USE_PIN1 must also be defined" #endif pinConfig(SDCARD_PIN2_PORT, SDCARD_PIN2_PIN, SDCARD_PIN2_CONFIG); #endif #if (defined(SDCARD_USE_PIN1) && defined(SDCARD_USE_PIN2)) bool pin1 = isPinActive(SDCARD_PIN1_PORT, SDCARD_PIN1_PIN, SDCARD_PIN1_POLARITY); bool pin2 = isPinActive(SDCARD_PIN2_PORT, SDCARD_PIN2_PIN, SDCARD_PIN2_POLARITY); if (pin1) { bootloaderMode = SD_BOOTLOADER_MODE_UPDATE; } else if (pin2) { bootloaderMode = SD_BOOTLOADER_MODE_UPDATE2; } #elif defined(SDCARD_USE_PIN1) if (isPinActive(SDCARD_PIN1_PORT, SDCARD_PIN1_PIN, SDCARD_PIN1_POLARITY)) { bootloaderMode = SD_BOOTLOADER_MODE_UPDATE; } #else bootloaderMode = SD_BOOTLOADER_MODE_UPDATE; #endif if (bootloaderMode != SD_BOOTLOADER_MODE_NO_UPDATE) { #if defined(SAM_BA_INTERFACE_USE_PIN) sdcardStatus = sdBootloader(bootloaderMode); #else sdBootloader(bootloaderMode); #endif } #endif /* When using SAM_BA_INTERFACE_USE_PIN, check the pin to determine which SAM-BA interface to use. */ #if defined(SAM_BA_INTERFACE_USE_PIN) uint8_t sambaInterface = SAM_BA_NONE; pinConfig(SAM_BA_INTERFACE_PIN_PORT, SAM_BA_INTERFACE_PIN_PIN, SAM_BA_INTERFACE_PIN_CONFIG); if (isPinActive(SAM_BA_INTERFACE_PIN_PORT, SAM_BA_INTERFACE_PIN_PIN, PIN_POLARITY_ACTIVE_LOW)) { // pin is low #if ((SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_USBCDC_LOW)) sambaInterface = SAM_BA_USBCDC_ONLY; #elif ((SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_ACTIVE_LOW)) sambaInterface = SAM_BA_USBCDC_ONLY; #elif ((SAM_BA_INTERFACE == SAM_BA_UART_ONLY) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_ACTIVE_LOW)) sambaInterface = SAM_BA_UART_ONLY; #endif } else { // pin is high #if ((SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_USBCDC_HIGH)) sambaInterface = SAM_BA_USBCDC_ONLY; #elif ((SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_ACTIVE_HIGH)) sambaInterface = SAM_BA_USBCDC_ONLY; #elif ((SAM_BA_INTERFACE == SAM_BA_UART_ONLY) && (SAM_BA_INTERFACE_PIN_POLARITY == PIN_POLARITY_ACTIVE_HIGH)) sambaInterface = SAM_BA_UART_ONLY; #endif } #endif /* Check if we should continue with a SAM-BA interface (if compiled and enabled). * Only show LED_STATUS_FILE_NOT_FOUND if a SAM-BA interface is not available. * LED_STATUS_FILE_NOT_FOUND occurs if there is no SD Card, no FAT16/FAT32 * filesystem, or no file (UPDATE.BIN or UPDATE2.BIN) in the root directory. */ #if defined(SAM_BA_INTERFACE_USE_PIN) #if defined(SDCARD_ENABLED) if (sambaInterface == SAM_BA_NONE) { if (sdcardStatus == SD_BOOTLOADER_FILE_NOT_FOUND) { LED_status(LED_STATUS_FILE_NOT_FOUND); } else if (sdcardStatus == SD_BOOTLOADER_NOT_CALLED) { LED_status(LED_STATUS_NO_SAM_BA_INTERFACE); } } #else #if (SAM_BA_INTERFACE == SAM_BA_NONE) LED_status(LED_STATUS_NO_SAM_BA_INTERFACE); #else if (sambaInterface == SAM_BA_NONE) { LED_status(LED_STATUS_NO_SAM_BA_INTERFACE); } #endif #endif #else #if (SAM_BA_INTERFACE == SAM_BA_NONE) LED_status(LED_STATUS_NO_SAM_BA_INTERFACE); #endif #endif /* Enable the appropriate SAM-BA interfaces. When using SAM_BA_INTERFACE_USE_PIN, * the peripheral and pins are only setup for the selected/enabled interface. */ #if defined(SAM_BA_INTERFACE_USE_PIN) if (sambaInterface == SAM_BA_UART_ONLY) { #endif #if SAM_BA_INTERFACE == SAM_BA_UART_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES /* UART is enabled in all cases */ serial_open(); #endif #if defined(SAM_BA_INTERFACE_USE_PIN) } else if (sambaInterface == SAM_BA_USBCDC_ONLY) { #endif #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES pCdc = usb_init(); #endif #if defined(SAM_BA_INTERFACE_USE_PIN) } #endif ledDirection = 4; DEBUG_PIN_LOW; /* Wait for a complete enum on usb or a '#' char on serial line */ while (1) { #if defined(SAM_BA_INTERFACE_USE_PIN) if (sambaInterface == SAM_BA_USBCDC_ONLY) { #endif #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES if (pCdc->IsConfigured(pCdc) != 0) { main_b_cdc_enable = true; } /* Check if a USB enumeration has succeeded and if comm port has been opened */ if (main_b_cdc_enable) { sam_ba_monitor_init(SAM_BA_INTERFACE_USBCDC); /* SAM-BA on USB loop */ while( 1 ) { sam_ba_monitor_run(); } } #endif #if defined(SAM_BA_INTERFACE_USE_PIN) } else if (sambaInterface == SAM_BA_UART_ONLY) { #endif #if SAM_BA_INTERFACE == SAM_BA_UART_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES /* Check if a '#' has been received */ if (!main_b_cdc_enable && serial_sharp_received()) { sam_ba_monitor_init(SAM_BA_INTERFACE_USART); /* SAM-BA on Serial loop */ while(1) { sam_ba_monitor_run(); } } #endif #if defined(SAM_BA_INTERFACE_USE_PIN) } #endif } }
/** * \brief SAMD21 SAM-BA Main loop. * \return Unused (ANSI-C compatibility). */ int main(void) { #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES P_USB_CDC pCdc; #endif DEBUG_PIN_HIGH; /* Jump in application if condition is satisfied */ check_start_application(); /* We have determined we should stay in the monitor. */ /* System initialization */ board_init(); __enable_irq(); #if SAM_BA_INTERFACE == SAM_BA_UART_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES /* UART is enabled in all cases */ serial_open(); #endif #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES pCdc = usb_init(); #endif DEBUG_PIN_LOW; /* Initialize LEDs */ LED_init(); LEDRX_init(); LEDRX_off(); LEDTX_init(); LEDTX_off(); /* Start the sys tick (1 ms) */ SysTick_Config(1000); /* Wait for a complete enum on usb or a '#' char on serial line */ while (1) { #if SAM_BA_INTERFACE == SAM_BA_USBCDC_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES if (pCdc->IsConfigured(pCdc) != 0) { main_b_cdc_enable = true; } /* Check if a USB enumeration has succeeded and if comm port has been opened */ if (main_b_cdc_enable) { sam_ba_monitor_init(SAM_BA_INTERFACE_USBCDC); /* SAM-BA on USB loop */ while( 1 ) { sam_ba_monitor_run(); } } #endif #if SAM_BA_INTERFACE == SAM_BA_UART_ONLY || SAM_BA_INTERFACE == SAM_BA_BOTH_INTERFACES /* Check if a '#' has been received */ if (!main_b_cdc_enable && serial_sharp_received()) { sam_ba_monitor_init(SAM_BA_INTERFACE_USART); /* SAM-BA on Serial loop */ while(1) { sam_ba_monitor_run(); } } #endif } }