static bool MessageDone() { // TODO: check pin capabilities switch (rx_msg.type) { case HARD_RESET: CHECK(rx_msg.args.hard_reset.magic == IOIO_MAGIC); HardReset(); break; case CHECK_INTERFACE: CheckInterface(rx_msg.args.check_interface.interface_id); break; case READ_FINGERPRINT: if (!ReadFingerprint()) { log_printf("Failed to read fingerprint"); return false; } break; case WRITE_FINGERPRINT: if (!WriteFingerprint(rx_msg.args.write_fingerprint.fingerprint)) { log_printf("Failed to write fingerprint"); return false; } break; case WRITE_IMAGE: rx_message_state = WAIT_FILE; rx_message_remaining = rx_msg.args.write_image.size; if (!EraseFingerprint()) { log_printf("Failed to erase fingerprint"); return false; } file_checksum = 0; log_printf("Starting to receive image file"); IOIOFileInit(); break; // BOOKMARK(add_feature): Add incoming message handling to switch clause. default: log_printf("Unexpected message type: 0x%x", rx_msg.type); return false; } return true; }
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; }