子系统分装和优计划
2021-08-24 淮安装修公司
ZDNet软件频道 最简单的按键驱动就是一个中断处理函数,当用户有按键,通过read函数向应用层上报按键信息。而我们这里讲的keyboard子系统,主要是对按键进行了分装和优化,这里我们主要讲的是可以实现跨平台的按键驱动。不管你是使用三星的平台,还是Atmel的平台,你只要知道如何在你的BSP中添加平台数据,并且知道如何在应用程序中使用这个驱动,那么你就不用因为新的平台而再次编写按键驱动了。
按键驱动属于input子系统,源码路径在/driver/input/keyboard下,我们的跨平台按键驱动文件是/driver/input/keyboard/Gpio_keys.c
查看/driver/input/keyboard/Makefile
obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o
查看/driver/input/keyboard//Konfig
config KEYBOARD_GPIO
tristate \"GPIO Buttons\"
如果是1千元钞票 depends on GENERIC_GPIO
所以配置内核make menuconfig时,需要选中这一项。
现在先来看如何移植,比如我们现在要给mini2440开发板上的key1和key2编写按键驱动,根据资料知道,key1用的是GPG0端口,key2用的是GPG3端口。下面就看移植代码了,在mach-mini2440.c这个mini2440开发板的BSP中添加如下代码
static struct gpio_keys_button s3c_buttons[] = {
{
.code = KEY_LEFT, //键值,驱动人员可自己设定,但用户必须知道
.gpio = S3C2410_GPG(0),
.active_low = 1, //下降沿触发方式
.desc = \"key1\",
},
{
.code = KEY_RIGHT,
.gpio = S3C2410_GPG(3),
.active_low = 1,
.desc = \"key2\",
},
};
static struct gpio_keys_platform_data s3c_button_data = {
.buttons = s3c_buttons,
.nbuttons = ARRAY_SIZE(s3c_buttons),
};
static struct platform_device s3c_button_device = {
.name = \"gpio-keys\",
.id = -1,
.num_resources = 0,
.dev = {
.platform_data = s3c_button_data,
}
};
然后把这个s3c_button_device加入到mini2440_devices数组
static struct platform_device *mini2440_devices[] __initdata = {
s3c_button_device, //添加
};
最后添加头文件
#include linux/gpio.h
#include linux/gpio_keys.h
这样配置完后,进行make zImage生成zImage内核镜像。
下面大致说说/driver/input/keyboard/Gpio_keys.c
static struct platform_driver gpio_keys_device_driver = {
.probe = gpio_keys_probe, //探测
.remove = __devexit_p(gpio_keys_remove),
.driver = {
.name = \"gpio-keys\", //驱动名
.owner = THIS_MODULE,
#ifdef CONFIG_PM
.pm = gpio_keys_pm_ops, //电源管理
#endif
}
};
static int __init gpio_keys_init(void)
{
return platform_driver_register(gpio_keys_device_driver); //平台驱动注册
}
关于这个Gpio_keys.c的其他代码在此就不看了,总结下,probe函数主要是申请端口,然后注册中断,并将其放在input子系统中。当用户有按键时,触发按键中断服务程序,进行一些简单数据处理后交给底半部,由工作队列完成向input子系统上报键值的操作,同时设计了定时器,目的是为了能更加精确报告按键事件。我在学习input子系统的时候,就是拿了一个按键写入了input子系统中,也用到了工作队列和定时器,跟Gpio_keys.c代码原理类似,如果需要可以参考。
Keyboard驱动测试
用户可以先通过cat /sys/class/input/input0/name判断input设备名
然后应用层通过访问/dev/input/event0来读取按键,接着利用访问input设备格式判断键值区分不同的按键是否被按下。
成都哪里能治疗不孕不育成都男科权威医院
常州白癜风哪里治疗好

-
-
恩惠昆仑鸿星发展训练营开幕约40名中国球员参
昆仑鸿星发展训练营开幕 约40名中国球员参与其中由中国冰球协会主办的昆仑...
- 家居风水 2020-09-12
-
恩惠昆仑鸿星发展训练营开幕约40名中国球员参
-
-
定投合理月入8000元5年还清贷款
定投合理 月入8000元5年还清贷款李先生单身,25岁,在广州一家外企做销售,...
- 家居风水 2020-08-14
-
定投合理月入8000元5年还清贷款
-
-
曼城名将经纪人球员今夏很可能加盟中超
曼城名将经纪人:球员今夏很可能加盟中超纳斯里今夏将离开曼城 ...
- 家居风水 2020-08-04
-
曼城名将经纪人球员今夏很可能加盟中超
-
-
河南主帅崔建军胜利来之不易还有差距盼再提
河南主帅崔建军:胜利来之不易 还有差距盼再提高赛后发布会 中国...
- 家居风水 2020-08-04
-
河南主帅崔建军胜利来之不易还有差距盼再提
-
-
去年海南土地出让入库365亿同比提高51
去年海南土地出让入库365亿 同比提高51%全省国土环境资源工作会议23日在海口...
- 家居风水 2020-07-11
-
去年海南土地出让入库365亿同比提高51
-
-
点名表扬周琦的天亮了他真已赢得主帅信任搭配
点名表扬!周琦的天亮了 他真已赢得主帅信任周琦凭借努力得到了主帅的认...
- 家居风水 2020-06-06
-
点名表扬周琦的天亮了他真已赢得主帅信任搭配