/*! \details */ int boot_main(){ boot_event(BOOT_EVENT_START, 0); stack_ptr = (void*)(((u32*)boot_board_config.program_start_addr)[0]); app_reset = (void (*)())( (((u32*)boot_board_config.program_start_addr)[1]) ); if ( check_run_app() ){ boot_event(BOOT_EVENT_RUN_APP, 0); //assign stack pointer to stack value app_reset(); } else { boot_event(BOOT_EVENT_RUN_BOOTLOADER, 0); run_bootloader(); } while(1); return 0; }
void RAWHID_PROTOCOL_task() { if (state.status != EXECUTING) return; uint8_t hdr = state.msg[0]; switch (hdr) { case MESSAGE_DFU: run_bootloader(); break; /* well... */ case MESSAGE_WRITE_PAGE: if (state.len != SPM_PAGESIZE + 2) { state.status = MESSAGE_ERROR; return; } const uint8_t pageno = state.msg[1]; uint32_t addr = LAYOUT_BEGIN + pageno*SPM_PAGESIZE; flash_write_page(addr, (uint8_t*)state.msg + 2); break; case MESSAGE_ACTIVATE_LAYOUT: if (state.len != 1) { state.status = MESSAGE_ERROR; return; } LAYOUT_set((const struct layout*)LAYOUT_BEGIN); break; case MESSAGE_DEACTIVATE_LAYOUT: if (state.len != 1) { state.status = MESSAGE_ERROR; return; } LAYOUT_deactivate(); break; default: state.status = WRONG_MESSAGE_ERROR; return; }; state.status = IDLE; }
/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. * * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced */ void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { //CDC_Device_SendString(&VirtualSerial_CDC0_Interface, "CDC_Device_ControlLineStateChanged"); if(CDCInterfaceInfo->Config.ControlInterfaceNumber == 2) { //CDC_Device_SendString(&VirtualSerial_CDC0_Interface, "ContlEv Int2\n"); /* fire a reset jennic event if there is a high-low-high transition within * SWITCH_TIMEOUT ms on the dtr line */ // static clock_time_t previous_change = 0; static bool currentDTRState = false; static unsigned long jennic_reset_time = 0; /* dtr line changed? */ if ((CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != currentDTRState) { unsigned long delay = millis()-jennic_reset_time; currentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); if(delay < 250 && currentDTRState){ jennic_reset_event = true; } //jennic_reset_event = currentDTRState && (delay < 250); jennic_reset_time = millis(); /* returns the usb frame clock in ms */ } } else if(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS==1200) { bool currentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); if (!currentDTRState && millis() > 5000) run_bootloader(); } }