// 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; }