diff --git a/drivers/input/usbhidd/src/main.rs b/drivers/input/usbhidd/src/main.rs index 15c5b77820..3b90a1708d 100644 --- a/drivers/input/usbhidd/src/main.rs +++ b/drivers/input/usbhidd/src/main.rs @@ -134,6 +134,43 @@ fn send_key_event(display: &mut ProducerHandle, usage_page: u16, usage: u16, pre return; } }, + // Consumer page (0x0C): media keys, application launch keys. + // Linux 7.1 hid-input.c maps these to KEY_VOLUME*, KEY_MUTE, etc. + // OrbKeyEvent.scancode is u8 so we map common consumer usages to + // the 0xF0-0xFF block reserved for vendor keys. + 0x0C => { + let sc = match usage { + 0x00E2 => 0xF0u8, // Mute + 0x00E9 => 0xF1u8, // Volume Up + 0x00EA => 0xF2u8, // Volume Down + 0x00B0 => 0xF3u8, // Play + 0x00B1 => 0xF4u8, // Pause + 0x00B3 => 0xF5u8, // Next Track + 0x00B4 => 0xF6u8, // Previous Track + 0x00B5 => 0xF7u8, // Stop + 0x00CD => 0xF3u8, // Play/Pause (same as Play) + 0x0183 => 0xF8u8, // AL Config + 0x018A => 0xF9u8, // Email + 0x0192 => 0xFAu8, // Calculator + 0x0194 => 0xFBu8, // My Computer + 0x0221 => 0xFCu8, // Search + 0x0223 => 0xFDu8, // Home + _ => { + log::warn!("unmapped consumer usage {:#06X}", usage); + return; + } + }; + let key_event = OrbKeyEvent { + character: '\0', + scancode: sc, + pressed, + }; + match display.write_event(key_event.to_event()) { + Ok(_) => (), + Err(err) => log::warn!("failed to send consumer key event: {}", err), + } + return; + } _ => { log::warn!("unknown usage_page {:#x}", usage_page); return; @@ -374,6 +411,12 @@ fn main() -> Result<()> { event.value ); } + } else if event.usage_page == 0x0C { + // Consumer page: media keys, application launchers. + // Linux 7.1 hid-input.c: maps to KEY_VOLUME*, KEY_MUTE, etc. + // Fired as key events with scancode = 0xC0000 | usage. + let pressed = event.value != 0; + send_key_event(&mut display, 0x0C, event.usage, pressed); } else if event.usage_page >= 0xFF00 { // Ignore vendor defined event } else {