usb.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "usb.h"
  2. #include "xhci/xhci.h"
  3. #include <common/kprint.h>
  4. #include <driver/pci/pci.h>
  5. #include <debug/bug.h>
  6. #define MAX_USB_NUM 8 // pci总线上的usb设备的最大数量
  7. // 在pci总线上寻找到的usb设备控制器的header
  8. struct pci_device_structure_header_t *usb_pdevs[MAX_USB_NUM];
  9. static int usb_pdevs_count = 0;
  10. /**
  11. * @brief 初始化usb驱动程序
  12. *
  13. */
  14. void usb_init()
  15. {
  16. kinfo("Initializing usb driver...");
  17. // 获取所有usb-pci设备的列表
  18. pci_get_device_structure(USB_CLASS, USB_SUBCLASS, usb_pdevs, &usb_pdevs_count);
  19. if (WARN_ON(usb_pdevs_count == 0))
  20. {
  21. kwarn("There is no usb hardware in this computer!");
  22. return;
  23. }
  24. // 初始化每个usb控制器
  25. for (int i = 0; i < usb_pdevs_count; ++i)
  26. {
  27. switch (usb_pdevs[i]->ProgIF)
  28. {
  29. case USB_TYPE_UHCI:
  30. case USB_TYPE_OHCI:
  31. case USB_TYPE_EHCI:
  32. case USB_TYPE_UNSPEC:
  33. case USB_TYPE_DEVICE:
  34. kwarn("Unsupported usb host type: %#02x", usb_pdevs[i]->ProgIF);
  35. break;
  36. case USB_TYPE_XHCI:
  37. // 初始化对应的xhci控制器
  38. xhci_init(usb_pdevs[i]);
  39. break;
  40. default:
  41. kerror("Error value of usb_pdevs[%d]->ProgIF: %#02x", i, usb_pdevs[i]->ProgIF);
  42. return;
  43. break;
  44. }
  45. }
  46. kinfo("Successfully initialized all usb host controllers!");
  47. }