主要内容
主要内容:
1,输入子系统的作用和框架
2,输入子系统的编程方式–学会最简单的输入子系统的开发方式
3,输入子系统和平台总线的结合编程方式—驱动所有按键
4,输入子系统的工作原理和代码分析—学习内核的设计思想
输入子系统的作用
1,输入子系统的作用和框架
什么是输入设备:
1,按键/keyboard
2, mouse
3, touchscreen :gt811, ft56xx
4, joystick 游戏杆
有多个输入设备需要驱动的时候,假如不考虑输入子系统
a, gt811
设备号,创建文件,硬件初始化,实现fop,阻塞
硬件初始化
b, ft56xx
设备号,创建文件,硬件初始化,实现fop,阻塞
硬件初始化
多个输入设备有共同点:
获取到数据(操作硬件),上报给用户(xxx_read, copy_to_user, 阻塞)
差异化 通用
多个输入设备,有部分差异,也有部分通用
内核就会考虑,将通用代码编写好,将差异化的代码留给驱动工程师
设计成输入子系统:使得应用编程人员和驱动编程人员编程的时候变得简单统一
1, 兼容所有的输入设备
2, 统一的编程驱动方法(实现差异化硬件操作)
3, 统一的应用操作接口:/dev/input/event0,event1
open("/dev/input/event0"),
read(fd, struct input_event): struct input_event buff可以认为是一个统一的数据包
输入子系统的框架
框架:驱动分成三层
应用层
---------------------------------
input handler层:数据处理者
完成fop:实现xxx_read(), xxx_open
将数据交给用户:数据从input device层
不知道具体数据是什么,只知道把数据给用户
----------------------------------------------------------
input 核心层:管理层
----------------------------------------------------------
input device设备层:
抽象出一个对象,描述输入设备信息
初始化输入设备硬件,获取到数据
知道具体的数据是什么,但是不知道数据如何给用户
---------------------------------
硬件层:mouse
ts, keyboard,joystick
编程: 主要在input device层
最简单的输入设备驱动程序编写
1.搭建驱动模块基本框架
2.在init函数中分配、初始化、注册input device对象
static int __init simple_input_init(void)
{
//编写输入子系统代码
/*
1,分配一个input device对象
2, 初始化input device对象
3,注册input device对象
*/
int ret;
inputdev = input_allocate_device();
if(inputdev == NULL)
{
printk(KERN_ERR "input_allocate_device error\n");
return -ENOMEM;
}
//当前设备能够产生按键数据
__set_bit(EV_KEY, inputdev->evbit);
//表示当前设备能够产生power按键
__set_bit(KEY_POWER, inputdev->keybit);
ret = input_register_device(inputdev);
if(ret != 0)
{
printk(KERN_ERR "input_register_device error\n");
goto err_0;
}
return 0;
err_0:
input_free_device(inputdev);
return ret;
}
3.在exit函数中释放资源
input_unregister_device(inputdev);
input_free_device(inputdev);
4.insmod前后查看ls /dev
输入子系统中硬件初始化和上报数据
2,输入子系统的编程方式–学会最简单的输入子系统的开发方式
前提:input 核心层代码和input handler层需要在内核中必须有:
drivers/input/evdev.c // event handler
drivers/input/input.c // 核心层
make menuconfig
Device Drivers --->
Input device support --->
-*- Generic input layer (needed for keyboard, mouse, ...) // input.c
<*> Event interface //input han