|
|
|
@ -0,0 +1,212 @@
|
|
|
|
|
#include <kernel/USB/HID/Keyboard.h>
|
|
|
|
|
#include <LibInput/KeyEvent.h>
|
|
|
|
|
|
|
|
|
|
#define DEBUG_KEYBOARD 0
|
|
|
|
|
|
|
|
|
|
namespace Kernel
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
static BAN::Optional<uint8_t> s_scancode_to_keycode[0x100] {};
|
|
|
|
|
static bool s_scancode_to_keycode_initialized = false;
|
|
|
|
|
|
|
|
|
|
static void initialize_scancode_to_keycode();
|
|
|
|
|
|
|
|
|
|
void USBKeyboard::start_report()
|
|
|
|
|
{
|
|
|
|
|
for (auto& val : m_keyboard_state_temp)
|
|
|
|
|
val = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void USBKeyboard::stop_report()
|
|
|
|
|
{
|
|
|
|
|
using KeyModifier = LibInput::KeyEvent::Modifier;
|
|
|
|
|
|
|
|
|
|
if (!s_scancode_to_keycode_initialized)
|
|
|
|
|
initialize_scancode_to_keycode();
|
|
|
|
|
|
|
|
|
|
// FIXME: RawKeyEvent probably should only contain keycode.
|
|
|
|
|
// Modifier should be determined when converting to KeyEvent.
|
|
|
|
|
|
|
|
|
|
uint8_t modifier = 0;
|
|
|
|
|
if (m_keyboard_state_temp[0xE1])
|
|
|
|
|
modifier |= KeyModifier::LShift;
|
|
|
|
|
if (m_keyboard_state_temp[0xE5])
|
|
|
|
|
modifier |= KeyModifier::RShift;
|
|
|
|
|
if (m_keyboard_state_temp[0xE0])
|
|
|
|
|
modifier |= KeyModifier::LCtrl;
|
|
|
|
|
if (m_keyboard_state_temp[0xE4])
|
|
|
|
|
modifier |= KeyModifier::RCtrl;
|
|
|
|
|
if (m_keyboard_state_temp[0xE2])
|
|
|
|
|
modifier |= KeyModifier::LAlt;
|
|
|
|
|
if (m_keyboard_state_temp[0xE6])
|
|
|
|
|
modifier |= KeyModifier::RAlt;
|
|
|
|
|
|
|
|
|
|
if (m_keyboard_state_temp[0x39] && !m_keyboard_state[0x39])
|
|
|
|
|
m_toggle_mask ^= KeyModifier::CapsLock;
|
|
|
|
|
if (m_keyboard_state_temp[0x47] && !m_keyboard_state[0x47])
|
|
|
|
|
m_toggle_mask ^= KeyModifier::ScrollLock;
|
|
|
|
|
if (m_keyboard_state_temp[0x53] && !m_keyboard_state[0x53])
|
|
|
|
|
m_toggle_mask ^= KeyModifier::NumLock;
|
|
|
|
|
|
|
|
|
|
modifier |= m_toggle_mask;
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < m_keyboard_state.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
if (m_keyboard_state[i] == m_keyboard_state_temp[i])
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
const bool pressed = m_keyboard_state_temp[i];
|
|
|
|
|
|
|
|
|
|
if (pressed)
|
|
|
|
|
dprintln_if(DEBUG_KEYBOARD, "{2H}", i);
|
|
|
|
|
|
|
|
|
|
auto opt_keycode = s_scancode_to_keycode[i];
|
|
|
|
|
if (opt_keycode.has_value())
|
|
|
|
|
{
|
|
|
|
|
LibInput::RawKeyEvent event;
|
|
|
|
|
event.keycode = opt_keycode.value();
|
|
|
|
|
event.modifier = modifier | (pressed ? KeyModifier::Pressed : 0);
|
|
|
|
|
add_event(BAN::ConstByteSpan::from(event));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_keyboard_state[i] = m_keyboard_state_temp[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void USBKeyboard::handle_variable(uint16_t usage_page, uint16_t usage, int64_t state)
|
|
|
|
|
{
|
|
|
|
|
if (usage_page != 0x07)
|
|
|
|
|
{
|
|
|
|
|
dprintln_if(DEBUG_KEYBOARD, "Unsupported keyboard usage page {2H}", usage_page);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (usage >= 4 && usage < m_keyboard_state_temp.size())
|
|
|
|
|
m_keyboard_state_temp[usage] = state;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void USBKeyboard::handle_array(uint16_t usage_page, uint16_t usage)
|
|
|
|
|
{
|
|
|
|
|
if (usage_page != 0x07)
|
|
|
|
|
{
|
|
|
|
|
dprintln_if(DEBUG_KEYBOARD, "Unsupported keyboard usage page {2H}", usage_page);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (usage >= 4 && usage < m_keyboard_state_temp.size())
|
|
|
|
|
m_keyboard_state_temp[usage] = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void initialize_scancode_to_keycode()
|
|
|
|
|
{
|
|
|
|
|
using LibInput::keycode_function;
|
|
|
|
|
using LibInput::keycode_normal;
|
|
|
|
|
using LibInput::keycode_numpad;
|
|
|
|
|
|
|
|
|
|
s_scancode_to_keycode[0x35] = keycode_normal(0, 0);
|
|
|
|
|
s_scancode_to_keycode[0x1E] = keycode_normal(0, 1);
|
|
|
|
|
s_scancode_to_keycode[0x1F] = keycode_normal(0, 2);
|
|
|
|
|
s_scancode_to_keycode[0x20] = keycode_normal(0, 3);
|
|
|
|
|
s_scancode_to_keycode[0x21] = keycode_normal(0, 4);
|
|
|
|
|
s_scancode_to_keycode[0x22] = keycode_normal(0, 5);
|
|
|
|
|
s_scancode_to_keycode[0x23] = keycode_normal(0, 6);
|
|
|
|
|
s_scancode_to_keycode[0x24] = keycode_normal(0, 7);
|
|
|
|
|
s_scancode_to_keycode[0x25] = keycode_normal(0, 8);
|
|
|
|
|
s_scancode_to_keycode[0x26] = keycode_normal(0, 9);
|
|
|
|
|
s_scancode_to_keycode[0x27] = keycode_normal(0, 10);
|
|
|
|
|
s_scancode_to_keycode[0x2D] = keycode_normal(0, 11);
|
|
|
|
|
s_scancode_to_keycode[0x2E] = keycode_normal(0, 12);
|
|
|
|
|
s_scancode_to_keycode[0x2A] = keycode_normal(0, 13);
|
|
|
|
|
s_scancode_to_keycode[0x2B] = keycode_normal(1, 0);
|
|
|
|
|
s_scancode_to_keycode[0x14] = keycode_normal(1, 1);
|
|
|
|
|
s_scancode_to_keycode[0x1A] = keycode_normal(1, 2);
|
|
|
|
|
s_scancode_to_keycode[0x08] = keycode_normal(1, 3);
|
|
|
|
|
s_scancode_to_keycode[0x15] = keycode_normal(1, 4);
|
|
|
|
|
s_scancode_to_keycode[0x17] = keycode_normal(1, 5);
|
|
|
|
|
s_scancode_to_keycode[0x1C] = keycode_normal(1, 6);
|
|
|
|
|
s_scancode_to_keycode[0x18] = keycode_normal(1, 7);
|
|
|
|
|
s_scancode_to_keycode[0x0C] = keycode_normal(1, 8);
|
|
|
|
|
s_scancode_to_keycode[0x12] = keycode_normal(1, 9);
|
|
|
|
|
s_scancode_to_keycode[0x13] = keycode_normal(1, 10);
|
|
|
|
|
s_scancode_to_keycode[0x2F] = keycode_normal(1, 11);
|
|
|
|
|
s_scancode_to_keycode[0x30] = keycode_normal(1, 12);
|
|
|
|
|
s_scancode_to_keycode[0x39] = keycode_normal(2, 0);
|
|
|
|
|
s_scancode_to_keycode[0x04] = keycode_normal(2, 1);
|
|
|
|
|
s_scancode_to_keycode[0x16] = keycode_normal(2, 2);
|
|
|
|
|
s_scancode_to_keycode[0x07] = keycode_normal(2, 3);
|
|
|
|
|
s_scancode_to_keycode[0x09] = keycode_normal(2, 4);
|
|
|
|
|
s_scancode_to_keycode[0x0A] = keycode_normal(2, 5);
|
|
|
|
|
s_scancode_to_keycode[0x0B] = keycode_normal(2, 6);
|
|
|
|
|
s_scancode_to_keycode[0x0D] = keycode_normal(2, 7);
|
|
|
|
|
s_scancode_to_keycode[0x0E] = keycode_normal(2, 8);
|
|
|
|
|
s_scancode_to_keycode[0x0F] = keycode_normal(2, 9);
|
|
|
|
|
s_scancode_to_keycode[0x33] = keycode_normal(2, 10);
|
|
|
|
|
s_scancode_to_keycode[0x34] = keycode_normal(2, 11);
|
|
|
|
|
s_scancode_to_keycode[0x31] = keycode_normal(2, 12);
|
|
|
|
|
s_scancode_to_keycode[0x28] = keycode_normal(2, 13);
|
|
|
|
|
s_scancode_to_keycode[0xE1] = keycode_normal(3, 0);
|
|
|
|
|
s_scancode_to_keycode[0x64] = keycode_normal(3, 1);
|
|
|
|
|
s_scancode_to_keycode[0x1D] = keycode_normal(3, 2);
|
|
|
|
|
s_scancode_to_keycode[0x1B] = keycode_normal(3, 3);
|
|
|
|
|
s_scancode_to_keycode[0x06] = keycode_normal(3, 4);
|
|
|
|
|
s_scancode_to_keycode[0x19] = keycode_normal(3, 5);
|
|
|
|
|
s_scancode_to_keycode[0x05] = keycode_normal(3, 6);
|
|
|
|
|
s_scancode_to_keycode[0x11] = keycode_normal(3, 7);
|
|
|
|
|
s_scancode_to_keycode[0x10] = keycode_normal(3, 8);
|
|
|
|
|
s_scancode_to_keycode[0x36] = keycode_normal(3, 9);
|
|
|
|
|
s_scancode_to_keycode[0x37] = keycode_normal(3, 10);
|
|
|
|
|
s_scancode_to_keycode[0x38] = keycode_normal(3, 11);
|
|
|
|
|
s_scancode_to_keycode[0xE5] = keycode_normal(3, 12);
|
|
|
|
|
s_scancode_to_keycode[0xE0] = keycode_normal(4, 1);
|
|
|
|
|
s_scancode_to_keycode[0xE3] = keycode_normal(4, 2);
|
|
|
|
|
s_scancode_to_keycode[0xE2] = keycode_normal(4, 3);
|
|
|
|
|
s_scancode_to_keycode[0x2C] = keycode_normal(4, 4);
|
|
|
|
|
s_scancode_to_keycode[0xE6] = keycode_normal(4, 5);
|
|
|
|
|
s_scancode_to_keycode[0xE4] = keycode_normal(4, 6);
|
|
|
|
|
|
|
|
|
|
s_scancode_to_keycode[0x52] = keycode_normal(5, 0);
|
|
|
|
|
s_scancode_to_keycode[0x50] = keycode_normal(5, 1);
|
|
|
|
|
s_scancode_to_keycode[0x51] = keycode_normal(5, 2);
|
|
|
|
|
s_scancode_to_keycode[0x4F] = keycode_normal(5, 3);
|
|
|
|
|
|
|
|
|
|
s_scancode_to_keycode[0x29] = keycode_function( 0);
|
|
|
|
|
s_scancode_to_keycode[0x3A] = keycode_function( 1);
|
|
|
|
|
s_scancode_to_keycode[0x3B] = keycode_function( 2);
|
|
|
|
|
s_scancode_to_keycode[0x3C] = keycode_function( 3);
|
|
|
|
|
s_scancode_to_keycode[0x3D] = keycode_function( 4);
|
|
|
|
|
s_scancode_to_keycode[0x3E] = keycode_function( 5);
|
|
|
|
|
s_scancode_to_keycode[0x3F] = keycode_function( 6);
|
|
|
|
|
s_scancode_to_keycode[0x40] = keycode_function( 7);
|
|
|
|
|
s_scancode_to_keycode[0x41] = keycode_function( 8);
|
|
|
|
|
s_scancode_to_keycode[0x42] = keycode_function( 9);
|
|
|
|
|
s_scancode_to_keycode[0x43] = keycode_function(10);
|
|
|
|
|
s_scancode_to_keycode[0x44] = keycode_function(11);
|
|
|
|
|
s_scancode_to_keycode[0x45] = keycode_function(12);
|
|
|
|
|
s_scancode_to_keycode[0x49] = keycode_function(13);
|
|
|
|
|
s_scancode_to_keycode[0x46] = keycode_function(14);
|
|
|
|
|
s_scancode_to_keycode[0x4C] = keycode_function(15);
|
|
|
|
|
s_scancode_to_keycode[0x4A] = keycode_function(16);
|
|
|
|
|
s_scancode_to_keycode[0x4D] = keycode_function(17);
|
|
|
|
|
s_scancode_to_keycode[0x4B] = keycode_function(18);
|
|
|
|
|
s_scancode_to_keycode[0x4E] = keycode_function(19);
|
|
|
|
|
|
|
|
|
|
s_scancode_to_keycode[0x53] = keycode_numpad(0, 0);
|
|
|
|
|
s_scancode_to_keycode[0x54] = keycode_numpad(0, 1);
|
|
|
|
|
s_scancode_to_keycode[0x55] = keycode_numpad(0, 2);
|
|
|
|
|
s_scancode_to_keycode[0x56] = keycode_numpad(0, 3);
|
|
|
|
|
s_scancode_to_keycode[0x5F] = keycode_numpad(1, 0);
|
|
|
|
|
s_scancode_to_keycode[0x60] = keycode_numpad(1, 1);
|
|
|
|
|
s_scancode_to_keycode[0x61] = keycode_numpad(1, 2);
|
|
|
|
|
s_scancode_to_keycode[0x57] = keycode_numpad(1, 3);
|
|
|
|
|
s_scancode_to_keycode[0x5C] = keycode_numpad(2, 0);
|
|
|
|
|
s_scancode_to_keycode[0x5D] = keycode_numpad(2, 1);
|
|
|
|
|
s_scancode_to_keycode[0x5E] = keycode_numpad(2, 2);
|
|
|
|
|
s_scancode_to_keycode[0x59] = keycode_numpad(3, 0);
|
|
|
|
|
s_scancode_to_keycode[0x5A] = keycode_numpad(3, 1);
|
|
|
|
|
s_scancode_to_keycode[0x5B] = keycode_numpad(3, 2);
|
|
|
|
|
s_scancode_to_keycode[0x58] = keycode_numpad(3, 3);
|
|
|
|
|
s_scancode_to_keycode[0x62] = keycode_numpad(4, 0);
|
|
|
|
|
s_scancode_to_keycode[0x63] = keycode_numpad(4, 1);
|
|
|
|
|
|
|
|
|
|
s_scancode_to_keycode_initialized = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|