input子系统是管理输入的子系统,和pinctrl、gpio子系统一样,都是Linux内核针对某一类设备创建的框架。
2. in系统运维是干嘛的pulinux重启命令t子系统的作用
输入设备都是典型的字符设备,比如按键、鼠标、键盘、触摸屏等。
这些设备的工作机理是底层在按键、触摸等动作发生时产生一个中断,或者通过软件定时器去查询时间,然后CPU通过SPI、I2C等总线读取键值、坐标等数据,并将它们放linux是什么操作系统入一个缓冲区,由驱动模块管理这些缓冲区,通过驱动的read接口就可色的笔顺以让用户读取键值、坐标等数据。
显然 ,在这些输入设备英文工作中,只有中断、读取键值/坐标这些操作是与硬件相关的,而输入事件的管理则对输入设备是通用的,因此,Linux内核设计了input子系统,由核心层处理公共的工作。
有了inp输入设备和输出设备的区别ut子系统后,驱动编写时就不需要考虑应用层的事情,只需要按照input子系统的要linux常用命令求,上报输入事件即可。
3. input子系统的框架
input子系统分为input驱动层、input核心层、input事件处理层。
- input驱动层:输入设备的具体驱动程序,sed比如按键驱动,向内核层报告输入事件
- input核心层:对下提供设备注册和操作接口,对上通知input事件层对输入事件进行处理
- input事件层:和用户空间进行交互
二、input子系统使用方法
1. 输入设备
input子系输入设备的作用统的核心层会向Linux内核注册一个字符设备,主设备号为INPUT_MAJOR,
因此,input子系统所有设备主设备号都为13,在使用input子系统时不需要再注册字符设备,只注册一个输入设备即可。
1.1. input_dev结构体
Linux内核用 input_dev 结构体描述一个输入设备,定义在文件 include/linux/input.h
文件中,如下:
struct input_dev {
const char *name;
const char *phys;
const char *uniq;
struct input_id id;
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
unsigned int hint_events_per_packet;
unsigned int keycodemax;
unsigned int keycodesize;
void *keycode;
int (*setkeycode)(struct input_dev *dev,
const struct input_keymap_entry *ke,
unsigned int *old_keycode);
int (*getkeycode)(struct input_dev *dev,
struct input_keymap_entry *ke);
struct ff_device *ff;
unsigned int repeat_key;
struct timer_list timer;
int rep[REP_CNT];
struct input_mt *mt;
struct input_absinfo *absinfo;
unsigned long key[BITS_TO_LONGS(KEY_CNT)];
unsigned long led[BITS_TO_LONGS(LED_CNT)];
unsigned long snd[BITS_TO_LONGS(SND_CNT)];
unsigned long sw[BITS_TO_LONGS(SW_CNT)];
int (*open)(struct input_dev *dev);
void (*close)(struct input_dev *dev);
int (*flush)(struct input_dev *dev, struct file *file);
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
struct input_handle __rcu *grab;
spinlock_t event_lock;
struct mutex mutex;
unsigned int users;
bool going_away;
struct device dev;
struct list_head h_list;
struct list_head node;
unsigned int num_vals;
unsigned int max_vals;
struct input_value *vals;
bool devres_managed;
};
发表评论