Esempio n. 1
0
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;
}
Esempio n. 2
0
File: main.c Progetto: 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;
}