Linux adc-keys 驱动数据结构
时间: 2023-05-25 10:05:42 浏览: 116
struct adc_keys_platform_data {
unsigned input_count;
struct gpio * gpio_list;
unsigned * key_codes;
unsigned * adc_values;
unsigned poll_interval;
unsigned settle_delay;
struct input_dev * input_dev;
};
struct adc_keys_data {
struct adc_device * adc;
struct gpio * gpio_list;
unsigned * key_codes;
unsigned * adc_values;
unsigned poll_interval;
unsigned settle_delay;
struct input_dev * input_dev;
struct work_struct work;
int last_key;
};
相关问题
Linux adc-keys 驱动的数据结构及其分析
adc-keys 是一个内核模块,用于支持通过 ADC(模拟数字转换器)读取键盘按键数据的设备驱动程序。其数据结构与分析如下:
1. struct adc_keys_platform_data
该结构体为 adc-keys 提供了硬件相关的信息,包括 ADC 通道号、键位数组以及 ADC 转换值的范围等信息。具体定义如下:
```
struct adc_keys_platform_data {
int num_adc; // ADC 通道数目
u16 adc_keycodes[MAX_ADC_KEYS]; // ADC 转换值对应的键码
u16 adc_keyvals[MAX_ADC_KEYS]; // ADC 转换值的实际值
int adc_key_nsamples; // ADC 转换值的采样次数
int adc_key_hold_time; // 长按时间
int adc_key_range; // ADC 转换值的范围
int acdbank; // ACDBANK(在某些板卡上才使用)
int iface; // IFACE(在某些板卡上才使用)
int stby_gpio; // 待机模式时是否需要禁止 ADC 转换
enum overflow_policy overflow_policy; // ADC 转换值超出范围时的处理策略
int allow_suspend; // 是否允许系统进入 suspend 模式
int wakeup_source; // 是否允许该设备作为唤醒源
int sleep_voltage; // 系统进入 SLEEP 状态时的电压
};
```
2. struct adc_keys_state
该结构体为 adc-keys 驱动提供了内部状态,用于记录键位状态、长按状态等信息。具体定义如下:
```
struct adc_keys_state {
struct input_dev *input; // 与该设备关联的 input_dev
struct delayed_work work; // 延迟工作队列,用于判断长按状态
s32 value; // 当前 ADC 转换值
s32 last_value; // 上一个 ADC 转换值
s32 active_idx; // 当前键位的索引
s64 event_time; // 上一个事件的时间戳
int state; // 按键状态(按下、弹起等)
bool hold_reported; // 是否已经上报长按事件
bool use_hold; // 是否开启长按功能
};
```
3. adc_keys_probe
adc-keys 设备驱动的 probe 函数,在设备挂载时会被 kernel 调用。此函数会读取和分析硬件相关的数据,包括通道数目、键码和实际值之间的映射关系等,并用这些信息初始化设备状态等数据结构。
4. adc_keys_read
adc-keys 设备驱动的 read 函数,用于从 ADC 通道中读取键码信息。此函数首先进行 ADC 转换,然后通过查找 adc_keycodes 和 adc_keyvals 数组来映射实际值到键码。如果转换值超出了 adc_key_range 的范围,则根据 overflow_policy 进行相应的处理。
5. adc_keys_work
该函数作为延迟工作函数,在事件到来时可以被调用。它用于判断长按状态,如果长按事件未被上报,则在相应的时机上报长按事件并打印相应的信息。
总之,adc-keys 设备驱动通过一系列的数据结构来管理硬件和内部的状态信息,并通过 read 函数读取硬件信息、通过 work 函数处理事件的机制来实现键盘按键数据的采集和上报。
阅读全文