没有合适的资源?快使用搜索试试~ 我知道了~
两个linux按键驱动之二 read(定时器去抖动)
3星 · 超过75%的资源 需积分: 48 25 下载量 191 浏览量
2009-09-29
07:01:00
上传
评论
收藏 11KB TXT 举报
温馨提示
试读
13页
两个linux按键驱动之二 read(定时器去抖动) 两个linux按键驱动之二 read(定时器去抖动) 两个linux按键驱动之二 read(定时器去抖动)
资源推荐
资源详情
资源评论
标签: linux 按键 设备 驱动 read
两个linux按键驱动之二 read(定时器去抖动)
//相比之下poll更为实用,但是这个代码实在太具有代表性了...涉及了下面几个知识。代码很大部分是linux设备驱动开发详解的内容。
/*
1、阻塞读取,队列概念
2、睡眠等待中断产生
3、定时器产生及相应函数
疑问:去除按键缓冲
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/regs-irq.h>
#define KEYSTATUS_DOWNX 2 // 定义按键不确定状态
#define KEYSTATUS_DOWN 0 // 定义按键按下后电平
#define KEYSTATUS_UP 1 // 定义按键抬起后电平
#define BUF_CLEAR _IO(0xFF, 0) // 清除键盘缓冲区命令
#define DEVICE_NAME "utukey"
#define MAX_KEY_BUF 16 // 按键缓冲区大小
#define KEY_NUM 6 // 按键个数
两个linux按键驱动之二 read(定时器去抖动)
//相比之下poll更为实用,但是这个代码实在太具有代表性了...涉及了下面几个知识。代码很大部分是linux设备驱动开发详解的内容。
/*
1、阻塞读取,队列概念
2、睡眠等待中断产生
3、定时器产生及相应函数
疑问:去除按键缓冲
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/regs-irq.h>
#define KEYSTATUS_DOWNX 2 // 定义按键不确定状态
#define KEYSTATUS_DOWN 0 // 定义按键按下后电平
#define KEYSTATUS_UP 1 // 定义按键抬起后电平
#define BUF_CLEAR _IO(0xFF, 0) // 清除键盘缓冲区命令
#define DEVICE_NAME "utukey"
#define MAX_KEY_BUF 16 // 按键缓冲区大小
#define KEY_NUM 6 // 按键个数
#define BUF_HEAD (utukey_dev.buf[utukey_dev.head]) //缓冲头
#define BUF_TAIL (utukey_dev.buf[utukey_dev.tail]) //缓冲尾
#define ISKEY_DOWN(key) (s3c2410_gpio_getpin(key_info_tab[key].gpio_port) == KEYSTATUS_DOWN)
#define INCBUF(x,mod) ((++(x))&((mod)-1))
#define KEY_TIME_DELAY (HZ/10) // 100ms
#define KEY_TIME_DELAY1 (HZ/100) // 10ms
#define UTUKEY_MAJOR 0 // 定义0使用自动分配设备号
unsigned int utukey_major = UTUKEY_MAJOR;
/* 定义按键设备结构体 */
struct utukey_dev
{
struct cdev cdev; // cdev结构体
unsigned int key_status[KEY_NUM]; // 记录按键状态
unsigned int buf[MAX_KEY_BUF]; // 按键环形缓冲区
unsigned int head, tail; // 按键缓冲区头和尾
wait_queue_head_t wq; // 等待队列
};
struct utukey_dev utukey_dev; // 定义设备结构体
struct utukey_dev *utukey_devp; // 定义设备结构体指针
struct timer_list key_timer[KEY_NUM]; // 定义6个按键去抖动定时器
static struct key_info // 定义按键所用资源结构体
{
int irq_no; // 占用的中断号
int irq_type; // 中断类型
unsigned int gpio_port; // 占用的引脚
unsigned int gpio_setting; // 引脚设置值
int key_code; // 按键值
char *name; // 按键的对应字符串
}key_info_tab[] =
#define BUF_TAIL (utukey_dev.buf[utukey_dev.tail]) //缓冲尾
#define ISKEY_DOWN(key) (s3c2410_gpio_getpin(key_info_tab[key].gpio_port) == KEYSTATUS_DOWN)
#define INCBUF(x,mod) ((++(x))&((mod)-1))
#define KEY_TIME_DELAY (HZ/10) // 100ms
#define KEY_TIME_DELAY1 (HZ/100) // 10ms
#define UTUKEY_MAJOR 0 // 定义0使用自动分配设备号
unsigned int utukey_major = UTUKEY_MAJOR;
/* 定义按键设备结构体 */
struct utukey_dev
{
struct cdev cdev; // cdev结构体
unsigned int key_status[KEY_NUM]; // 记录按键状态
unsigned int buf[MAX_KEY_BUF]; // 按键环形缓冲区
unsigned int head, tail; // 按键缓冲区头和尾
wait_queue_head_t wq; // 等待队列
};
struct utukey_dev utukey_dev; // 定义设备结构体
struct utukey_dev *utukey_devp; // 定义设备结构体指针
struct timer_list key_timer[KEY_NUM]; // 定义6个按键去抖动定时器
static struct key_info // 定义按键所用资源结构体
{
int irq_no; // 占用的中断号
int irq_type; // 中断类型
unsigned int gpio_port; // 占用的引脚
unsigned int gpio_setting; // 引脚设置值
int key_code; // 按键值
char *name; // 按键的对应字符串
}key_info_tab[] =
剩余12页未读,继续阅读
资源评论
- ycxzfforever2013-09-08不错!给我有了一定的指导
tjx163
- 粉丝: 18
- 资源: 392
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功