kernel: laptop touchpads over I2C-HID
A laptop's touchpad is on the chipset's I2C bus, found only through ACPI (PNP0C50 / ACPI0C50), and SchOS had no I2C at all, so the touchpad of every recent laptop did nothing. kernel/acpi/i2c_hid.c drives the DesignWare I2C controller every x86 chipset uses (AMDI0010 on Ryzen) by polling, speaks HID over I2C to the device the _DSM points at, and feeds the reports through the USB HID parser. On AMD the interrupt pin's level is read every tick, so a report is read exactly when one is waiting; elsewhere the input register is polled. The touchpad is driven in mouse mode, which it starts in after a reset: motion, clicks and taps become /dev/input/event1 like any mouse. The HID parser now prefers a descriptor's relative pointer over an absolute one for this, and takes descriptors from transports other than USB. Untested on hardware: QEMU emulates no I2C touchpad. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
parent
4a7165c951
commit
e43f56c619
5 changed files with 733 additions and 15 deletions
|
|
@ -12,6 +12,7 @@
|
|||
#include "core/klog.h"
|
||||
#include "dev/usb.h"
|
||||
#include "dev/acpi.h"
|
||||
#include "dev/hid.h"
|
||||
#include "arch/vmap.h"
|
||||
#include "core/hwinfo.h"
|
||||
|
||||
|
|
@ -391,6 +392,9 @@ kmain(uint64 fb_addr)
|
|||
usb_hotplug_start();
|
||||
// Where AML runs for the SCI: the power button, GPEs, notifications.
|
||||
acpi_thread_start();
|
||||
// Laptop touchpads, on the chipset's I2C bus; found through ACPI, so after
|
||||
// the namespace is loaded, and polled from a thread of their own.
|
||||
i2c_hid_start();
|
||||
// The debugger's own thread, for the same reason netinit's comes after
|
||||
// sinit: kthread_create needs a usable process table. From here on Ctrl-G
|
||||
// on the console answers, with no filesystem mounted and nothing in
|
||||
|
|
|
|||
Loading…
Reference in a new issue