volumes Move volume management code to a specialized app
This commit is contained in:
55
usb/usb.c
55
usb/usb.c
@@ -11,68 +11,25 @@
|
||||
#include <volume_info.h>
|
||||
|
||||
static bool cmdline_poll = false;
|
||||
static bool cmdline_eject = false;
|
||||
static char cmdline_dev[CMDLINE_OPT_VALUE_MAX];
|
||||
|
||||
static struct cmdline_opt cmdline_opts[] = {
|
||||
CMDLINE_OPT("p", "poll", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_poll),
|
||||
CMDLINE_OPT("e", "eject", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_eject),
|
||||
CMDLINE_OPT("d", "device", CMDLINE_OPT_VALUE_STRING, false, (char*)cmdline_dev),
|
||||
CMDLINE_END(),
|
||||
};
|
||||
|
||||
static void usb_poll(void) {
|
||||
struct device_info* infos = malloc(sizeof(struct device_info) * 1024);
|
||||
memset(infos, 0, sizeof(struct device_info) * 1024);
|
||||
for (;;) {
|
||||
device_do(cmdline_dev, XUSBCTRL_POLL_DRIVER, NULL, NULL, NULL, NULL);
|
||||
|
||||
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();
|
||||
for (volatile int i = 0; i < 1000; i++) {
|
||||
sched();
|
||||
#if defined(__x86_64__)
|
||||
__asm__ volatile("pause" ::: "memory");
|
||||
__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) {
|
||||
@@ -83,7 +40,5 @@ void app_main(void) {
|
||||
|
||||
if (cmdline_poll) {
|
||||
usb_poll();
|
||||
} else if (cmdline_eject) {
|
||||
usb_eject(cmdline_dev);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user