input分析linux,Linux input子系统框架分析

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为字符设备 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值