subsys_initcall(input_init) /* 在kernel启动时候加载,进入input_init函数*/
static int __init input_init(void) /* input系统的入口函数*/
/*input_init分析之第1部分*/
1、err = class_register(&input_class); /*注册class类*/
__class_register(class, &__key);
/*__class_register主要包含以下部分*/
struct subsys_private *cp = kzalloc(sizeof(*cp), GFP_KERNEL);/*分配内存;subsys_private结构体用于描述系统中所有的设备集合 的合集,现在是用来描述sys/devices/目录下的设备*/
error = kset_register(&cp->subsys);/*注册kset,kset用于描述subsys和kobject之间的桥梁*/
......... /*构造需要创建的cls类结构体参数*/
error = add_class_attrs(class_get(cls));/*创建class类*/
/*input_init分析之第2部分*/
err = input_proc_init(); /*创建proc信息;主要包含下面三个部分*/
proc_bus_input_dir = proc_mkdir("bus/input", NULL); /*proc_bus_input_dir proc目录结构体指针,创建proc/bus/input目录 */
entry = proc_create("devices", 0, proc_bus_input_dir,&input_devices_fileops);
/*entry 和上面proc_bus_input_dir结构体类型一样,只是局部结构体指针,用来描述创建的proc/bus/input/devices目录,参数中proc_bus_input_dir就是父目录;input_devices_fileops为proc/bus/input /devices节点的操作函数的入口地址*/
entry = proc_create("handlers", 0,proc_bus_input_dir,&input_handlers_fileops);/*entry 和上面proc_bus_input_dir结构体类型一样,只是局部结构体指针,用来描述创建的proc/bus/input/handles;input_devices_fileops为proc/bus/input/devices节点的操作函数的入口地址*/
备注:debug的时候大家可以查看linux系统已经注册的input设备信息:
linux:/ # cat proc/bus/input/devices
I: Bus=0000 Vendor=0001 Product=0001 Version=0100
N: Name="Hi keyboard"
P: Phys=
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=sysrq rfkill kbd event0
B: PROP=0
B: EV=3
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe
I: Bus=0000 Vendor=0001 Product=0002 Version=0100
N: Name="Hi mouse"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: PROP=0
B: EV=7
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=103
I: Bus=0000 Vendor=0000 Product=0000 Version=0100
N: Name="qwerty"
P: Phys=
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=mouse1 event2
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=2658000 11000003
I: Bus=0006 Vendor=046d Product=0002 Version=0000
N: Name="Hi Keypad"
P: Phys=
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=sysrq rfkill kbd event3
B: PROP=0
B: EV=3
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe
linux:/ # cat proc/bus/input/handlers
N: Number=0 Name=rfkill
N: Number=1 Name=kbd
N: Number=2 Name=sysrq (filter)
N: Number=3 Name=mousedev Minor=32
N: Number=4 Name=joydev Minor=0
N: Number=5 Name=evdev Minor=64
linux:/ #
/*input_init分析之第3部分*/
err = register_chrdev_region(MKDEV(INPUT_MAJOR, 0),INPUT_MAX_CHAR_DEVICES, "input");
/* 注册input为字符设备 */