Kernel: Fix USB code

Fix USB Keyboard scan code table for bottom row of keyboard

Support multiple interfaces on a single USB device

Add usb mouse to default qemu settings
This commit is contained in:
Bananymous 2024-07-15 11:48:48 +03:00
parent 75875d3a8f
commit 4cd9252ff6
5 changed files with 19 additions and 15 deletions

View File

@ -81,8 +81,7 @@ namespace Kernel
DeviceDescriptor m_descriptor; DeviceDescriptor m_descriptor;
BAN::UniqPtr<DMARegion> m_dma_buffer; BAN::UniqPtr<DMARegion> m_dma_buffer;
// FIXME: support more than one interface from a configuration BAN::Vector<BAN::UniqPtr<USBClassDriver>> m_class_drivers;
BAN::UniqPtr<USBClassDriver> m_class_driver;
}; };
} }

View File

@ -154,7 +154,7 @@ namespace Kernel
break; break;
case USB::InterfaceBaseClass::HID: case USB::InterfaceBaseClass::HID:
if (auto result = USBHIDDriver::create(*this, interface, j); !result.is_error()) if (auto result = USBHIDDriver::create(*this, interface, j); !result.is_error())
m_class_driver = result.release_value(); TRY(m_class_drivers.push_back(result.release_value()));
break; break;
case USB::InterfaceBaseClass::Physical: case USB::InterfaceBaseClass::Physical:
dprintln_if(DEBUG_USB, "Found Physical interface"); dprintln_if(DEBUG_USB, "Found Physical interface");
@ -218,7 +218,7 @@ namespace Kernel
break; break;
} }
if (m_class_driver) if (!m_class_drivers.empty())
{ {
dprintln("Successfully initialized USB interface"); dprintln("Successfully initialized USB interface");
return {}; return {};
@ -309,8 +309,8 @@ namespace Kernel
void USBDevice::handle_input_data(BAN::ConstByteSpan data, uint8_t endpoint_id) void USBDevice::handle_input_data(BAN::ConstByteSpan data, uint8_t endpoint_id)
{ {
if (m_class_driver) for (auto& driver : m_class_drivers)
m_class_driver->handle_input_data(data, endpoint_id); driver->handle_input_data(data, endpoint_id);
} }
USB::SpeedClass USBDevice::determine_speed_class(uint64_t bits_per_second) USB::SpeedClass USBDevice::determine_speed_class(uint64_t bits_per_second)

View File

@ -6,6 +6,7 @@
#include <kernel/USB/HID/Mouse.h> #include <kernel/USB/HID/Mouse.h>
#define DEBUG_HID 0 #define DEBUG_HID 0
#define DUMP_HID_REPORT 0
namespace Kernel namespace Kernel
{ {
@ -57,7 +58,7 @@ namespace Kernel
using namespace USBHID; using namespace USBHID;
#if DEBUG_HID #if DUMP_HID_REPORT
static void dump_hid_collection(const Collection& collection, size_t indent); static void dump_hid_collection(const Collection& collection, size_t indent);
#endif #endif
@ -211,7 +212,7 @@ namespace Kernel
return BAN::Error::from_errno(EFAULT); return BAN::Error::from_errno(EFAULT);
} }
#if DEBUG_HID #if DUMP_HID_REPORT
{ {
SpinLockGuard _(Debug::s_debug_lock); SpinLockGuard _(Debug::s_debug_lock);
dump_hid_collection(collection, 0); dump_hid_collection(collection, 0);
@ -222,9 +223,11 @@ namespace Kernel
{ {
case 0x02: case 0x02:
m_hid_device = TRY(BAN::RefPtr<USBMouse>::create()); m_hid_device = TRY(BAN::RefPtr<USBMouse>::create());
dprintln("Initialized an USB Mouse");
break; break;
case 0x06: case 0x06:
m_hid_device = TRY(BAN::RefPtr<USBKeyboard>::create()); m_hid_device = TRY(BAN::RefPtr<USBKeyboard>::create());
dprintln("Initialized an USB Keyboard");
break; break;
default: default:
dwarnln("Unsupported generic descript page usage 0x{2H}", collection.usage_id); dwarnln("Unsupported generic descript page usage 0x{2H}", collection.usage_id);
@ -326,7 +329,9 @@ namespace Kernel
void USBHIDDriver::handle_input_data(BAN::ConstByteSpan data, uint8_t endpoint_id) void USBHIDDriver::handle_input_data(BAN::ConstByteSpan data, uint8_t endpoint_id)
{ {
ASSERT(m_endpoint_id == endpoint_id); // If this packet is not for us, skip it
if (m_endpoint_id != endpoint_id)
return;
if constexpr(DEBUG_HID) if constexpr(DEBUG_HID)
{ {
@ -672,7 +677,7 @@ namespace Kernel
return result.release_value(); return result.release_value();
} }
#if DEBUG_HID #if DUMP_HID_REPORT
static void print_indent(size_t indent) static void print_indent(size_t indent)
{ {
for (size_t i = 0; i < indent; i++) for (size_t i = 0; i < indent; i++)

View File

@ -155,10 +155,10 @@ namespace Kernel
s_scancode_to_keycode[0x37] = keycode_normal(3, 10); s_scancode_to_keycode[0x37] = keycode_normal(3, 10);
s_scancode_to_keycode[0x38] = keycode_normal(3, 11); s_scancode_to_keycode[0x38] = keycode_normal(3, 11);
s_scancode_to_keycode[0xE5] = keycode_normal(3, 12); s_scancode_to_keycode[0xE5] = keycode_normal(3, 12);
s_scancode_to_keycode[0xE0] = keycode_normal(4, 1); s_scancode_to_keycode[0xE0] = keycode_normal(4, 0);
s_scancode_to_keycode[0xE3] = keycode_normal(4, 2); s_scancode_to_keycode[0xE3] = keycode_normal(4, 1);
s_scancode_to_keycode[0xE2] = keycode_normal(4, 3); s_scancode_to_keycode[0xE2] = keycode_normal(4, 2);
s_scancode_to_keycode[0x2C] = keycode_normal(4, 4); s_scancode_to_keycode[0x2C] = keycode_normal(4, 3);
s_scancode_to_keycode[0xE6] = keycode_normal(4, 5); s_scancode_to_keycode[0xE6] = keycode_normal(4, 5);
s_scancode_to_keycode[0xE4] = keycode_normal(4, 6); s_scancode_to_keycode[0xE4] = keycode_normal(4, 6);

View File

@ -31,6 +31,6 @@ qemu-system-$QEMU_ARCH \
-drive format=raw,id=disk,file=${BANAN_DISK_IMAGE_PATH},if=none \ -drive format=raw,id=disk,file=${BANAN_DISK_IMAGE_PATH},if=none \
-device e1000e,netdev=net \ -device e1000e,netdev=net \
-netdev user,id=net \ -netdev user,id=net \
-device qemu-xhci -device usb-kbd \ -device qemu-xhci -device usb-kbd -device usb-mouse \
$DISK_ARGS \ $DISK_ARGS \
$@ \ $@ \