#include #include #include #include #include #include #include #include #include #include static void usb_poll (void) { struct device_info* infos = malloc (sizeof (struct device_info) * 1024); memset (infos, 0, sizeof (struct device_info) * 1024); int device_count = get_device_info (infos, 1024); struct device_info info; bool found = false; for (int dev = 0; dev < device_count; dev++) { info = infos[dev]; if (info.type == DEVICE_TYPE_USB_CTRL) { found = true; break; } } if (found) { mprintf ("Polling device %s\n", info.key); for (;;) { device_do (info.key, XUSBCTRL_POLL_DRIVER, NULL, NULL, NULL, NULL); for (volatile int i = 0; i < 1000; i++) { sched (); #if defined(__x86_64__) __asm__ volatile ("pause" ::: "memory"); #endif } } } free (infos); } static void usb_eject (const char* dev_key) { struct volume_info* volume_infos = malloc (sizeof (*volume_infos) * 100); memset (volume_infos, 0, sizeof (*volume_infos) * 100); size_t count = get_volume_info (volume_infos, 100); for (size_t i = 0; i < count; i++) { struct volume_info* info = &volume_infos[i]; if (strcmp (info->device_key, dev_key) == 0) { int ret = volume_delete (info->volume_name); mprintf ("Deleted volume %s: %s\n", info->volume_name, str_status[ret < 0 ? -ret : ret]); break; } } free (volume_infos); } void app_main (void) { char commandbuf[32]; memset (commandbuf, 0, sizeof (commandbuf)); char devnamebuf[32]; memset (devnamebuf, 0, sizeof (devnamebuf)); if (env_get (process_get_pgid (), "C", (void*)commandbuf, sizeof (commandbuf)) != ST_OK) { mprintf ("ERROR C=???. No command provided\n"); return; } if (strcmp (commandbuf, "poll") == 0) { usb_poll (); } else if (strcmp (commandbuf, "eject") == 0) { if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) { mprintf ("ERROR No device provided\n"); return; } usb_eject (devnamebuf); } else { mprintf ("ERROR unknown command %s\n", commandbuf); } }