LINUX下ADC按键驱动程序

本文详细介绍了在Linux环境下,如何实现ADC按键驱动。通过分析ADC驱动,讲解了从初始化定时器、注册中断到设备读取的过程。在中断处理函数中,利用ADC的高阈值和低阈值中断来检测按键的按下和松开状态,同时通过等待队列实现在中断发生时唤醒阻塞的进程。最后展示了驱动程序的源码,包括ADC的中断服务程序、设备的打开和关闭以及读取操作。
摘要由CSDN通过智能技术生成

ADC按键驱动

Adc键盘原理图如下,将串联电阻之间分别用按键引出来与地相连,当按键按下时端电压会发生改变。基本思想是在ADC驱动基础上,对采样电压进行判断,检测是哪一个按键按下。

1.      ADC驱动分析

在init()函数中,首先获取adc的时钟,并用clk_enable进行使能,然后使用ioremap将ADC寄存器地址映射到kernel中(内核中对ADC只能使用虚拟地址进行访问),之后调用probe()函数完成定时器的初始化和ADC寄存器的初始化。

/

内核定时器使用步骤:

<1>使用static struct timer_list adc_key_timer定义一个名字为adc_key_time的定时器。

<2>adc_key_time.function =adc_key_timer_fun 定义一个定时器中断服务函数。

<3>add_time(&adc_key_timer)将定时器在kernel 中注册

<4>mod_timer(&adc_key_timer,jiffies+HZ)最后激活定时器开始计时,时间由jiffies+HZ设定。

 

调试方法:

<1>寄存器初始化一般放在probe函数中,可以使用prink来反映寄存器(特别是中断)是否配置成功

<2>在单板下使用如下命令:

           cd  /proc/gcore      

           echo  RD  fe005400  7 > regs  ///fe005400为寄存器地址  7为读取寄存器个数

来读取寄存器内是否被设置成功

/

接下来使用request_irq函数完成ADC中断的注册,需要注意的是在该函数中,ADC的中断号需要加一,并且中断标志位设置成为IRQF_SHARED。在初始化最后部分使用misc_register将ADC当做misc设备完成注册。

 

2.      在file_operations结构体中主要定义了三个函数,其中adc_key_open是完成设备打开、adc_key_release是设备关闭,adc_key_read()是完成设备的读取。在adc_key_read()函数中,首先定义一个全局变量ev_adc作为按键按下的标志位,当按键没有按下时,使用wait_enent_interruptible进入等待队列,当按键按下触发中断后,使用wake_up_interruptible唤醒等待队列,然后在read函数中将按键标志位ev_adc清零,使用copy_to_user()函数将kernel中的数据传递到应用层,供用户使用。然后使用mod_timer()触发定时器,跳入定时器中断服务程序中去。

Android系统的ADC按键驱动主要涉及到驱动层和应用层两个方面。 驱动层: Android系统的ADC按键驱动主要是由Linux内核的Input子系统来实现的。Input子系统是Linux内核中一个用于处理输入设备的子系统,主要功能是接收来自输入设备的数据,并将其传递到应用程序。 在Android系统中,Input子系统主要负责处理键盘、鼠标、触摸屏等输入设备的数据。对于ADC按键,一般都是通过GPIO口连接到处理器上,因此需要通过驱动程序来读取GPIO口的状态,以检测按键的按下和松开。 在Linux内核中,GPIO的读取是通过sysfs文件系统实现的。因此,驱动程序需要将GPIO口的状态映射到sysfs文件系统中的一个文件,以便应用程序能够读取GPIO口的状态。 应用层: 在Android系统中,应用程序一般使用Java语言编写。对于ADC按键,应用程序可以通过Android提供的KeyEvent类来处理按键事件。 当用户按下或松开ADC按键时,Linux内核会将这个事件传递给Android系统的Input子系统。Input子系统会将这个事件转换成一个KeyEvent对象,并将其发送给应用程序。 应用程序可以通过监听KeyEvent对象来处理按键事件。当用户按下或松开ADC按键时,应用程序可以根据不同的按键事件来执行不同的操作,例如打开应用程序、切换菜单、调节音量等。 综上所述,Android系统的ADC按键驱动主要是由Linux内核的Input子系统和应用层来实现的。在驱动层,需要通过驱动程序来读取GPIO口的状态,以检测按键的按下和松开;在应用层,需要通过监听KeyEvent对象来处理按键事件,以执行不同的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值