|
@@ -1,11 +1,14 @@
|
|
|
#include "usb.h"
|
|
|
+#include "xhci/xhci.h"
|
|
|
#include <common/kprint.h>
|
|
|
#include <driver/pci/pci.h>
|
|
|
+#include <debug/bug.h>
|
|
|
|
|
|
#define MAX_USB_NUM 8 // pci总线上的usb设备的最大数量
|
|
|
|
|
|
// 在pci总线上寻找到的usb设备控制器的header
|
|
|
struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
|
|
|
+static int usb_pdevs_count = 0;
|
|
|
|
|
|
/**
|
|
|
* @brief 初始化usb驱动程序
|
|
@@ -14,4 +17,38 @@ struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
|
|
|
void usb_init()
|
|
|
{
|
|
|
kinfo("Initializing usb driver...");
|
|
|
+ // 获取所有usb-pci设备的列表
|
|
|
+ pci_get_device_structure(USB_CLASS, USB_SUBCLASS, usb_pdevs, &usb_pdevs_count);
|
|
|
+
|
|
|
+ if (WARN_ON(usb_pdevs_count == 0))
|
|
|
+ {
|
|
|
+ kwarn("There is no usb hardware in this computer!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化每个usb控制器
|
|
|
+ for (int i = 0; i < usb_pdevs_count; ++i)
|
|
|
+ {
|
|
|
+ switch (usb_pdevs[i]->ProgIF)
|
|
|
+ {
|
|
|
+ case USB_TYPE_UHCI:
|
|
|
+ case USB_TYPE_OHCI:
|
|
|
+ case USB_TYPE_EHCI:
|
|
|
+ case USB_TYPE_UNSPEC:
|
|
|
+ case USB_TYPE_DEVICE:
|
|
|
+ kwarn("Unsupported usb host type: %#02x", usb_pdevs[i]->ProgIF);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case USB_TYPE_XHCI:
|
|
|
+ // 初始化对应的xhci控制器
|
|
|
+ xhci_init(usb_pdevs[i]);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ kerror("Error value of usb_pdevs[%d]->ProgIF: %#02x", i, usb_pdevs[i]->ProgIF);
|
|
|
+ return;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ kinfo("Successfully initialized all usb host controllers!");
|
|
|
}
|