diff --git a/kernel/driver/Makefile b/kernel/driver/Makefile index f297f37e8..06e53d615 100644 --- a/kernel/driver/Makefile +++ b/kernel/driver/Makefile @@ -1,7 +1,7 @@ CFLAGS += -I . -kernel_driver_subdirs:=video interrupt +kernel_driver_subdirs:=video interrupt usb all: @list='$(kernel_driver_subdirs)'; for subdir in $$list; do \ diff --git a/kernel/driver/pci/pci.c b/kernel/driver/pci/pci.c index c72c85a9a..d29d1eff8 100644 --- a/kernel/driver/pci/pci.c +++ b/kernel/driver/pci/pci.c @@ -1,6 +1,7 @@ #include "pci.h" #include <common/kprint.h> #include <mm/slab.h> +#include <debug/bug.h> static uint count_device_list = 0; static void pci_checkBus(uint8_t bus); @@ -420,7 +421,7 @@ void pci_checkAllBuses() { tmp_header = (struct pci_device_structure_header_t *)pci_read_header(&header_type, 0, 0, func, false); - if (header->Vendor_ID != 0xffff) // @todo 这里的判断条件可能有点问题 + if (WARN_ON(header->Vendor_ID != 0xffff)) // @todo 这里的判断条件可能有点问题 { kfree(tmp_header); break; diff --git a/kernel/driver/usb/Makefile b/kernel/driver/usb/Makefile index f46cfe6bd..aab3468b7 100644 --- a/kernel/driver/usb/Makefile +++ b/kernel/driver/usb/Makefile @@ -1,8 +1,9 @@ +CFLAGS += -I . all: usb.o xhci.o -usb.o: usb,c +usb.o: usb.c gcc $(CFLAGS) -c usb.c -o usb.o -xhci.o: xhci.c +xhci.o: xhci/xhci.c gcc $(CFLAGS) -c xhci/xhci.c -o xhci/xhci.o \ No newline at end of file diff --git a/kernel/driver/usb/usb.c b/kernel/driver/usb/usb.c index 9d0a34d94..596d91506 100644 --- a/kernel/driver/usb/usb.c +++ b/kernel/driver/usb/usb.c @@ -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!"); } \ No newline at end of file diff --git a/kernel/driver/usb/xhci/xhci.c b/kernel/driver/usb/xhci/xhci.c index cd1eba28c..ca2b8d2a1 100644 --- a/kernel/driver/usb/xhci/xhci.c +++ b/kernel/driver/usb/xhci/xhci.c @@ -1 +1,11 @@ -#include "xhci.h" \ No newline at end of file +#include "xhci.h" + +/** + * @brief 初始化xhci控制器 + * + * @param header 指定控制器的pci device头部 + */ +void xhci_init(struct pci_device_structure_header_t *header) +{ + +} \ No newline at end of file diff --git a/kernel/driver/usb/xhci/xhci.h b/kernel/driver/usb/xhci/xhci.h index 7b9637ef9..52aa9bc1e 100644 --- a/kernel/driver/usb/xhci/xhci.h +++ b/kernel/driver/usb/xhci/xhci.h @@ -1 +1,9 @@ -#pragma once \ No newline at end of file +#pragma once +#include <driver/usb/usb.h> + +/** + * @brief 初始化xhci控制器 + * + * @param header 指定控制器的pci device头部 + */ +void xhci_init(struct pci_device_structure_header_t *header); \ No newline at end of file diff --git a/kernel/main.c b/kernel/main.c index e5e776c54..90402976a 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -25,6 +25,7 @@ #include "driver/mouse/ps2_mouse.h" #include "driver/disk/ata.h" #include "driver/pci/pci.h" +#include <driver/usb/usb.h> #include "driver/disk/ahci/ahci.h" #include <driver/timers/rtc/rtc.h> #include <driver/timers/HPET/HPET.h> @@ -152,6 +153,7 @@ void system_initialize() // fat32_init(); HPET_enable(); + usb_init(); // 系统初始化到此结束,剩下的初始化功能应当放在初始内核线程中执行 apic_timer_init(); } diff --git a/run.sh b/run.sh index 65c2e3dd0..f4e887075 100644 --- a/run.sh +++ b/run.sh @@ -111,7 +111,8 @@ if [ $flag_can_run -eq 1 ]; then -drive id=disk,file=bin/disk.img,if=none \ -device ahci,id=ahci \ -device ide-hd,drive=disk,bus=ahci.0 \ - -usb + -usb \ + -device qemu-xhci,id=xhci fi else