소스 검색

new: usb控制器检测

fslongjin 2 년 전
부모
커밋
afb80d4d6e
8개의 변경된 파일67개의 추가작업 그리고 7개의 파일을 삭제
  1. 1 1
      kernel/driver/Makefile
  2. 2 1
      kernel/driver/pci/pci.c
  3. 3 2
      kernel/driver/usb/Makefile
  4. 37 0
      kernel/driver/usb/usb.c
  5. 11 1
      kernel/driver/usb/xhci/xhci.c
  6. 9 1
      kernel/driver/usb/xhci/xhci.h
  7. 2 0
      kernel/main.c
  8. 2 1
      run.sh

+ 1 - 1
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 \

+ 2 - 1
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;

+ 3 - 2
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

+ 37 - 0
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!");
 }

+ 11 - 1
kernel/driver/usb/xhci/xhci.c

@@ -1 +1,11 @@
-#include "xhci.h"
+#include "xhci.h"
+
+/**
+ * @brief 初始化xhci控制器
+ * 
+ * @param header 指定控制器的pci device头部
+ */
+void xhci_init(struct pci_device_structure_header_t *header)
+{
+    
+}

+ 9 - 1
kernel/driver/usb/xhci/xhci.h

@@ -1 +1,9 @@
-#pragma once
+#pragma once
+#include <driver/usb/usb.h>
+
+/**
+ * @brief 初始化xhci控制器
+ * 
+ * @param header 指定控制器的pci device头部
+ */
+void xhci_init(struct pci_device_structure_header_t *header);

+ 2 - 0
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();
 }

+ 2 - 1
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