Example #1
0
File: main.c Project: 21rcc/ioio
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;
}
Example #2
0
File: main.c Project: Aym3nTN/ioio
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;
}