48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
#include <device/def_device_op.h>
|
|
#include <device/device.h>
|
|
#include <device/storage/partitions.h>
|
|
#include <device/storage/usbdrv.h>
|
|
#include <device/usb/usb.h>
|
|
#include <device/usb/xhci.h>
|
|
#include <devices.h>
|
|
#include <libk/lengthof.h>
|
|
#include <libk/printf.h>
|
|
#include <libk/std.h>
|
|
#include <proc/proc.h>
|
|
#include <proc/reschedule.h>
|
|
#include <sys/debug.h>
|
|
|
|
static atomic_int usb_ms_counter = 0;
|
|
|
|
static struct device* usb_ms_init(struct xhci* xhci, struct xhci_usb_device* usb_device,
|
|
struct proc* proc, struct reschedule_ctx* rctx) {
|
|
static device_op_func_t ops[] = {
|
|
[XDRV_GET_SIZE] = &usbdrv_get_size,
|
|
[XDRV_GET_SECTOR_SIZE] = &usbdrv_get_sector_size,
|
|
[XDRV_GET_DEVICE_TYPE] = &usbdrv_get_device_type,
|
|
[XDRV_READ] = &usbdrv_read,
|
|
[XDRV_WRITE] = &usbdrv_write,
|
|
[XDRV_PARTITION_RESCAN] = &usbdrv_partition_rescan,
|
|
};
|
|
|
|
struct usbdrv_init init = {
|
|
.xhci = xhci,
|
|
.usb_device = usb_device,
|
|
};
|
|
|
|
char key[30];
|
|
snprintf(key, sizeof(key), "usbdrv%d", atomic_fetch_add(&usb_ms_counter, 1));
|
|
|
|
struct device* device = device_create(DEVICE_TYPE_DRIVE, key, ops, lengthof(ops), &usbdrv_init,
|
|
&usbdrv_fini, &init, proc, rctx);
|
|
|
|
if (device != NULL)
|
|
device_probe_partitions(proc, rctx, device);
|
|
|
|
return device;
|
|
}
|
|
|
|
struct usb_driver_info usb_driver_infos[USB_DRIVER_MAX_MATCHES] = {
|
|
{.if_class = 0x08, .if_subclass = 0x06, .if_proto = 0x50, .init = &usb_ms_init},
|
|
};
|