int main() { log_init(); // If bootloader mode not requested, go immediately to app. if (!ShouldEnterBootloader()) { OscCalibrateCached(); log_printf("Running app..."); __asm__("goto __APP_RESET"); } // We need to enter bootloader mode, wait for the boot pin to be released. while (!led_read()); // Now we can start! led_init(); #ifdef SIGNAL_AFTER_BAD_RESET if (RCON & 0b1100001001000000) { SignalRcon(); } #endif log_printf("Hello from Bootloader!!!"); if (IsPin1Grounded()) { log_printf("Erasing config."); EraseConfig(); } OscCalibrateCached(); Blink(5); USBInitialize(); while (1) { // Wait for connection while (!(USBGetDeviceState() == CONFIGURED_STATE && CDCIsDtePresent())) USBTasks(); log_printf("Connected!"); BootProtocolInit(); while (USBGetDeviceState() == CONFIGURED_STATE && CDCIsDtePresent()) { static char in_buf[64]; USBTasks(); BYTE size = getsUSBUSART(in_buf, sizeof(in_buf)); if (!BootProtocolProcess(in_buf, size)) { log_printf("Protocol error. Will detach / re-attach."); USBSoftDetach(); __delay_ms(2000); USBDeviceAttach(); break; } BootProtocolTasks(); } log_printf("Disconnected!"); } return 0; }
int main() { ADB_FILE_HANDLE f; ADB_CHANNEL_HANDLE h; #ifdef SIGNAL_AFTER_BAD_RESET if (RCON & 0b1100001001000000) { SignalRcon(); } #endif log_init(); log_printf("Hello from Bootloader!!!"); InitializeSystem(); BootloaderConnInit(); while (1) { BOOL connected = BootloaderConnTasks(); mLED_0 = (state == MAIN_STATE_ERROR) ? (led_counter++ >> 13) : !connected; if (!connected) { state = MAIN_STATE_WAIT_CONNECT; } switch(state) { case MAIN_STATE_WAIT_CONNECT: if (connected) { log_printf("Device connected!"); if (ADBAttached()) { log_printf("ADB attached - attempting firmware upgrade"); state = MAIN_STATE_WAIT_ADB_READY; } else { log_printf("ADB not attached - skipping boot sequence"); state = MAIN_STATE_RUN_APP; } } break; case MAIN_STATE_WAIT_ADB_READY: if (ADBConnected()) { log_printf("ADB connected - starting boot sequence"); manager_path = DUMPSYS_BUSY; DumpsysInit(); h = ADBOpen("shell:dumpsys package ioio.manager", &RecvDumpsys); state = MAIN_STATE_FIND_PATH; } break; case MAIN_STATE_FIND_PATH_DONE: fingerprint_size = 0; strcpy(filepath, manager_path); strcat(filepath, "/files/" PLATFORM_ID ".fp"); f = ADBFileRead(filepath, &FileRecvFingerprint); state = MAIN_STATE_WAIT_RECV_FP; break; case MAIN_STATE_FP_FAILED: #ifdef BYPASS_SECURITY state = MAIN_STATE_AUTH_PASSED; break; #endif auth_result = AUTH_BUSY; AuthInit(); f = ADBFileRead("/data/system/packages.xml", &FileRecvPackages); state = MAIN_STATE_AUTH_MANAGER; break; case MAIN_STATE_AUTH_PASSED: if (!EraseFingerprint()) { state = MAIN_STATE_ERROR; } else { IOIOFileInit(); strcpy(filepath, manager_path); strcat(filepath, "/files/" PLATFORM_ID ".ioio"); f = ADBFileRead(filepath, &FileRecvImage); state = MAIN_STATE_WAIT_RECV_IMAGE; } break; case MAIN_STATE_RECV_IMAGE_DONE: if (WriteFingerprint()) { state = MAIN_STATE_RUN_APP; } else { state = MAIN_STATE_ERROR; } break; case MAIN_STATE_RUN_APP: BootloaderConnResetUSB(); pass_usb_to_app = 1; log_printf("Running app..."); __asm__("goto __APP_RESET"); default: break; // do nothing } } return 0; }