Files
nt-lite/code/drivers/bus/usb/usb.c
T

79 lines
2.1 KiB
C

// usb.c - USB bus driver entry point and host-controller driver registration.
#include "usb.h"
DRIVER_OBJECT gXhciDriver;
const HAL_API* gUsbHal;
static const IO_DEVICE_ID gXhciIds[] = {
{ IoBusPci, { "PCI\\CC_0C0330", sizeof("PCI\\CC_0C0330") - 1 } },
};
static const IO_DRIVER_ID_TABLE gXhciIdTable = {
gXhciIds,
sizeof(gXhciIds) / sizeof(gXhciIds[0]),
};
const char* UsbControllerName(uint8_t progIf) {
switch (progIf) {
case 0x00: return "UHCI";
case 0x10: return "OHCI";
case 0x20: return "EHCI";
case 0x30: return "xHCI";
default: return "USB";
}
}
static KSTATUS UsbInitializeXhciDriver(void) {
memset(&gXhciDriver, 0, sizeof(gXhciDriver));
IoInitializeDriverObject(&gXhciDriver, SYS_SV_LITERAL("xhci"));
gXhciDriver.IdTable = &gXhciIdTable;
gXhciDriver.DriverAddDevice = XhciAddDevice;
gXhciDriver.MajorFunction[IRP_MJ_PNP] = XhciDispatchPnp;
return IoRegisterDriverObject(&gXhciDriver);
}
KSTATUS DriverEntry(const HAL_API* hal) {
if (!hal) return STATUS_INVALID_PARAMETER;
DbgPrint("usb: driver loading\n");
gUsbHal = hal;
KSTATUS st = UsbInitializeBusModel();
if (!KSUCCESS(st)) {
DbgPrint("usb: bus model initialisation failed st=0x%x\n", st);
return st;
}
st = UsbInitializeCompositeDriver();
if (!KSUCCESS(st)) {
DbgPrint("usb: composite driver initialisation failed st=0x%x\n", st);
return st;
}
st = UsbInitializeHidDriver();
if (!KSUCCESS(st)) {
DbgPrint("usb: HID driver initialisation failed st=0x%x\n", st);
return st;
}
st = UsbInitializeStorageDriver();
if (!KSUCCESS(st)) {
DbgPrint("usb: storage driver initialisation failed st=0x%x\n", st);
return st;
}
st = UsbInitializeHubDriver();
if (!KSUCCESS(st)) {
DbgPrint("usb: hub driver initialisation failed st=0x%x\n", st);
return st;
}
st = UsbInitializeXhciDriver();
if (!KSUCCESS(st)) {
DbgPrint("usb: xHCI driver initialisation failed st=0x%x\n", st);
return st;
}
DbgPrint("usb: driver initialized\n");
return STATUS_SUCCESS;
}