一.输入子系统:
1.1作用:将输入型设备的共性部分提取出来规范化,便于输入型设备的移植与硬件修改的再编写
1.2 输入模型:输入设备驱动 输入内核 输入事件驱动 后面二者内核已经写好,开发者只需要写好输入设备驱动
1.3 输入子系统设备驱动编写流程:以按键为例
初始化:
(1) 分配input_dev结构体:input_dev *dev=input_allocate_device();
(2)声明可能会产生的事件类型:set_bit(EV_KEY,dev->evbit); EV_KEY(按键) EV_ABS(触摸屏坐标事件),EV_SYN()同步事件,可以或起来同时满足
(3)声明上报的按键类型:如果上报是按键,声明可能上报的健编号set_bit(KEY_3,dev->keybit);
(4)注册输入设备inpu_register_device(dev);
(5)注册中断处理函数,为数据中断中断口注册处理函数request_irq(IRQ_EINT0,key_int,IRQF_TRIGGER_FALLING,”key”,(viod *)3);
以上为输入子系统需要做的初始化,后面可以在中断处理程序中使用工作队列减少中断处理时间。
上报: 在中断处理函数中调用工作队列去读硬件,真正的处理中断之间,处理过程关键步骤如下,还可以加上定时器去抖
上报产生的事件input_report_key
告诉核心上报结束input_sync
差异化:省去的字符设备open close read(工作等待队列)等操作 内核已经完成这些部分,输入子系统只需要在初始化输入设备以及中断处理中中上报事件就可以了
1.4 工作原理:
(1)架构:设备驱动(鼠标,键盘,触摸屏等)<-->核心层(input core)<-->事件层(mouse handler,keyboard handler,ts handled)<-->用户空间
(2)执行流程:用户空间的读写操作会在事件层根据设备文件的信息匹配到设备号,匹配到对应的设备类型,找到对应的内核读写文件操作函数,在到对应的handle管理的数据buf中读取数据,设备驱动再将数据上报以后经过核心层转换存储到事件层handler管理buf中等待应用读取
二.触摸屏驱动:
1 .初始化:
(1)获取时钟并使能:adc_clk=clk_get(NULL,”adc”); clk_enable(adc_clk);
(2)将cpu有关的物理地址转换成虚拟地址ioremap
(3)让触摸屏进入等待中断的模式:设置AD转换时钟,设置中断屏蔽位,进入等待中断模式,这些都是配置cpu工作模式,写cpu的寄存器
(4)分配输入设备结构input_allocate_device
(5)设置上报的事件类型和按键类型:dev->evbit[0]=BIT(EV_SYN)|BIT(EV_KEY)|BIT(EV_ABS);dev->keybit[BITS_TO_LONGS(TIB_TOUCH)]=BIT(TIB_TOUCH);
(6)设置信息进行赋值给设备描述符,可以忽略
(7)为ADC中断和TC中断注册其处理函数:TC中断响应触摸屏被按下和弹起的中断,ADC中断响应将此时的按压的坐标模拟信号转换成数字信号。request_irq(); 中断号为:IRQ_TC,IRQ_ADC
(8)注册输入型设备
2.数据处理:
(1)在TC中断函数中去读取数据,需要加锁使这部分代码不可重入,判断数据是按下还是弹起
(2)在TC中断中启动xy坐标的ad转换
(3)当ad转换完成后会调用ADC中断函数,在ADC中断函数中从寄存器中获取到了xy的坐标,然后又开启ad转换,连续四次取值然后获取其平均值提高准确度
(4)将相关数据上报input_report_key(表明按键按下),input_report_abs(坐标值,触摸事件按下),然后结束上报input_sync,然后解锁TC中断加上的不可重入锁5. 弹起的操作流程一样
注:可以采用定时器的方式将计算部分放到定时函数中去