Example #1
0
/*! \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;
}
Example #2
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;
}
Example #3
0
/** 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();

		
	}
}