1,Linux X86 PS/2 键盘驱动框架流程(以下均已Intel 8042键盘控制器为例):
1.1 设备初始化注册流程:
键盘控制器硬件驱动(i8042.c) -> 串口驱动核心(serio.c) -> 串口驱动(atkbd.c) -> 输入驱动核心(input.c) -> 输入事件驱动程序(keyboard.c) -> 虚拟控制台驱动模块;
注册流程:
1.1.1,键盘控制器硬件驱动(i8042.c):
首先键盘硬件驱动程序读写键盘硬件控制器寄存器,配置寄存器并获取相控制器硬件信息(PS/2键 盘控制器一共有三个寄存器加一个命令端口,命令数量也不多,数据手册下载地址:PS/2硬件数据手册) ,注意:Intel8042键盘控制器内部已经实现了PS/2时序协议,硬件驱动程序只需要读写相关寄存器即可;
将8042键盘控制器作为平台设备(struct platform_device)挂接在平台总线(struct bus_type)上,并将获取到的硬件信息及相关软件数据结构信息保存在平台设备实例中;
将8042键盘硬件控制器驱动(struct platform_driver)注册到平台总线上,平台总线匹配平台设备和平台驱动,并调用平台驱动的probe方法,在probe方法中分配并初始化串口数据结构实例(struct serio),将平台设备信息放入串口数据结构实例中;最后将串口结构实例注册进入串口驱动核心(serio_register_port);
1.1.2,串口驱动核心(serio.c)
串口驱动核心负责匹配串口和串口驱动,匹配之后,调用串口驱动的atkbd_connect方法;
1.1.2,PS/2键盘串口驱动(atkbd.c)
将串口驱动(struct serio_driver)注册到串口核心并匹配到串口设备之后,调用串口驱动的atkbd_connect方法,在atkbd_connect方法中分配并初始化输入设备(struct input_dev),最后将输入设备注册到输入子系统核心;
1.1.3, 输入驱动核心(input.c)
输入子系统请移步:输入子系统介绍
1.1.4,输入事件驱动程序(keyboard.c)
键盘输入事件驱动程序负责处理键盘输入设备上报的键盘输入事件信息,并将信息传递给虚拟控制台模块;
1.2 设备中断流程:
8042硬件中断(i8042_interrupt) -> 串口核心中断(serio_interrupt) -> 串口驱动中断(atkbd_interrupt) -> 输入子系统核心中断(input_event) -> 输入时间驱动程序中断(kbd_event)
1.3,PS/2键盘设备驱动注册及中断时序图:
其中有平台总线模块,串口总线模块,输入子系统模块;