drivers/hid/hid-appleir.c
Source file repositories/reference/linux-study-clean/drivers/hid/hid-appleir.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/hid/hid-appleir.c- Extension
.c- Size
- 9307 bytes
- Lines
- 345
- Domain
- Driver Families
- Bucket
- drivers/hid
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/device.hlinux/hid.hlinux/module.hhid-ids.h
Detected Declarations
struct appleirfunction get_keyfunction key_upfunction key_downfunction battery_flatfunction key_up_tickfunction appleir_raw_eventfunction appleir_input_configuredfunction appleir_input_mappingfunction appleir_probefunction appleir_remove
Annotated Snippet
struct appleir {
struct input_dev *input_dev;
struct hid_device *hid;
unsigned short keymap[ARRAY_SIZE(appleir_key_table)];
struct timer_list key_up_timer; /* timer for key up */
spinlock_t lock; /* protects .current_key */
int current_key; /* the currently pressed key */
int prev_key_idx; /* key index in a 2 packets message */
};
static int get_key(int data)
{
/*
* The key is coded accross bits 2..9:
*
* 0x00 or 0x01 ( ) key: 0 -> KEY_RESERVED
* 0x02 or 0x03 ( menu ) key: 1 -> KEY_MENU
* 0x04 or 0x05 ( >" ) key: 2 -> KEY_PLAYPAUSE
* 0x06 or 0x07 ( >> ) key: 3 -> KEY_FORWARD
* 0x08 or 0x09 ( << ) key: 4 -> KEY_BACK
* 0x0a or 0x0b ( + ) key: 5 -> KEY_VOLUMEUP
* 0x0c or 0x0d ( - ) key: 6 -> KEY_VOLUMEDOWN
* 0x0e or 0x0f ( ) key: 7 -> KEY_RESERVED
* 0x50 or 0x51 ( ) key: 8 -> KEY_RESERVED
* 0x52 or 0x53 ( ) key: 9 -> KEY_RESERVED
* 0x54 or 0x55 ( ) key: 10 -> KEY_RESERVED
* 0x56 or 0x57 ( ) key: 11 -> KEY_RESERVED
* 0x58 or 0x59 ( ) key: 12 -> KEY_RESERVED
* 0x5a or 0x5b ( ) key: 13 -> KEY_RESERVED
* 0x5c or 0x5d ( middle ) key: 14 -> KEY_ENTER
* 0x5e or 0x5f ( >" ) key: 15 -> KEY_PLAYPAUSE
*
* Packets starting with 0x5 are part of a two-packets message,
* we notify the caller by sending a negative value.
*/
int key = (data >> 1) & KEY_MASK;
if ((data & TWO_PACKETS_MASK))
/* Part of a 2 packets-command */
key = -key;
return key;
}
static void key_up(struct hid_device *hid, struct appleir *appleir, int key)
{
input_report_key(appleir->input_dev, key, 0);
input_sync(appleir->input_dev);
}
static void key_down(struct hid_device *hid, struct appleir *appleir, int key)
{
input_report_key(appleir->input_dev, key, 1);
input_sync(appleir->input_dev);
}
static void battery_flat(struct appleir *appleir)
{
dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
}
static void key_up_tick(struct timer_list *t)
{
struct appleir *appleir = timer_container_of(appleir, t, key_up_timer);
struct hid_device *hid = appleir->hid;
unsigned long flags;
spin_lock_irqsave(&appleir->lock, flags);
if (appleir->current_key) {
key_up(hid, appleir, appleir->current_key);
appleir->current_key = 0;
}
spin_unlock_irqrestore(&appleir->lock, flags);
}
static int appleir_raw_event(struct hid_device *hid, struct hid_report *report,
u8 *data, int len)
{
struct appleir *appleir = hid_get_drvdata(hid);
static const u8 keydown[] = { 0x25, 0x87, 0xee };
static const u8 keyrepeat[] = { 0x26, };
static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 };
unsigned long flags;
if (len != 5 || !(hid->claimed & HID_CLAIMED_INPUT))
goto out;
if (!memcmp(data, keydown, sizeof(keydown))) {
int index;
Annotation
- Immediate include surface: `linux/device.h`, `linux/hid.h`, `linux/module.h`, `hid-ids.h`.
- Detected declarations: `struct appleir`, `function get_key`, `function key_up`, `function key_down`, `function battery_flat`, `function key_up_tick`, `function appleir_raw_event`, `function appleir_input_configured`, `function appleir_input_mapping`, `function appleir_probe`.
- Atlas domain: Driver Families / drivers/hid.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.