82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
// USB driver package entry point. This file registers the USB bus, class, hub, HID, storage, and xHCI drivers.
|
|
|
|
#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";
|
|
}
|
|
}
|
|
|
|
// Initializes xhci Driver.
|
|
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);
|
|
}
|
|
|
|
// Implements the driver Entry operation.
|
|
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;
|
|
}
|