mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 12:16:31 +00:00
new: usb控制器检测
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
CFLAGS += -I .
|
CFLAGS += -I .
|
||||||
|
|
||||||
kernel_driver_subdirs:=video interrupt
|
kernel_driver_subdirs:=video interrupt usb
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@list='$(kernel_driver_subdirs)'; for subdir in $$list; do \
|
@list='$(kernel_driver_subdirs)'; for subdir in $$list; do \
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include <common/kprint.h>
|
#include <common/kprint.h>
|
||||||
#include <mm/slab.h>
|
#include <mm/slab.h>
|
||||||
|
#include <debug/bug.h>
|
||||||
|
|
||||||
static uint count_device_list = 0;
|
static uint count_device_list = 0;
|
||||||
static void pci_checkBus(uint8_t bus);
|
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);
|
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);
|
kfree(tmp_header);
|
||||||
break;
|
break;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
|
CFLAGS += -I .
|
||||||
|
|
||||||
all: usb.o xhci.o
|
all: usb.o xhci.o
|
||||||
|
|
||||||
usb.o: usb,c
|
usb.o: usb.c
|
||||||
gcc $(CFLAGS) -c usb.c -o usb.o
|
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
|
gcc $(CFLAGS) -c xhci/xhci.c -o xhci/xhci.o
|
@ -1,11 +1,14 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
#include "xhci/xhci.h"
|
||||||
#include <common/kprint.h>
|
#include <common/kprint.h>
|
||||||
#include <driver/pci/pci.h>
|
#include <driver/pci/pci.h>
|
||||||
|
#include <debug/bug.h>
|
||||||
|
|
||||||
#define MAX_USB_NUM 8 // pci总线上的usb设备的最大数量
|
#define MAX_USB_NUM 8 // pci总线上的usb设备的最大数量
|
||||||
|
|
||||||
// 在pci总线上寻找到的usb设备控制器的header
|
// 在pci总线上寻找到的usb设备控制器的header
|
||||||
struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
|
struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
|
||||||
|
static int usb_pdevs_count = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 初始化usb驱动程序
|
* @brief 初始化usb驱动程序
|
||||||
@ -14,4 +17,38 @@ struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
|
|||||||
void usb_init()
|
void usb_init()
|
||||||
{
|
{
|
||||||
kinfo("Initializing usb driver...");
|
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!");
|
||||||
}
|
}
|
@ -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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -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);
|
@ -25,6 +25,7 @@
|
|||||||
#include "driver/mouse/ps2_mouse.h"
|
#include "driver/mouse/ps2_mouse.h"
|
||||||
#include "driver/disk/ata.h"
|
#include "driver/disk/ata.h"
|
||||||
#include "driver/pci/pci.h"
|
#include "driver/pci/pci.h"
|
||||||
|
#include <driver/usb/usb.h>
|
||||||
#include "driver/disk/ahci/ahci.h"
|
#include "driver/disk/ahci/ahci.h"
|
||||||
#include <driver/timers/rtc/rtc.h>
|
#include <driver/timers/rtc/rtc.h>
|
||||||
#include <driver/timers/HPET/HPET.h>
|
#include <driver/timers/HPET/HPET.h>
|
||||||
@ -152,6 +153,7 @@ void system_initialize()
|
|||||||
|
|
||||||
// fat32_init();
|
// fat32_init();
|
||||||
HPET_enable();
|
HPET_enable();
|
||||||
|
usb_init();
|
||||||
// 系统初始化到此结束,剩下的初始化功能应当放在初始内核线程中执行
|
// 系统初始化到此结束,剩下的初始化功能应当放在初始内核线程中执行
|
||||||
apic_timer_init();
|
apic_timer_init();
|
||||||
}
|
}
|
||||||
|
3
run.sh
3
run.sh
@ -111,7 +111,8 @@ if [ $flag_can_run -eq 1 ]; then
|
|||||||
-drive id=disk,file=bin/disk.img,if=none \
|
-drive id=disk,file=bin/disk.img,if=none \
|
||||||
-device ahci,id=ahci \
|
-device ahci,id=ahci \
|
||||||
-device ide-hd,drive=disk,bus=ahci.0 \
|
-device ide-hd,drive=disk,bus=ahci.0 \
|
||||||
-usb
|
-usb \
|
||||||
|
-device qemu-xhci,id=xhci
|
||||||
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user