按键驱动platform的编写流程和led驱动的差不了太多,只是多了一个中断机制和延时消抖的过程,延时消抖可以用内置定时器来做。
platform_device
首先来看设备结构体
static struct platform_device s3c_button_device = {
.name = "s3c_button",
.id = 1,
.dev =
{
.platform_data = &s3c_button_data,
.release = platform_button_release,
},
};
name成员设为s3c_button,.dev->platform_data依旧是以自定义的s3c_button_platform_data类型的结构体传入,还有就是relese函数的处理。
struct s3c_button_info
{
unsigned char num; /*Button nubmer 按键号*/
char * name; /*Button nubmer 按键名*/
int nIRQ; /*Button IRQ number 中断号*/
unsigned int setting; /*Button IRQ Pin Setting 中断引脚配置*/
unsigned int gpio; /*Button GPIO port 对应的IO引脚*/
};
/* The button plaotform device private data structure */
struct s3c_button_platform_data //按键数据结构体
{
struct s3c_button_info *buttons; //用来访问按键硬件信息的指针
int nbuttons;//按键数量
};
/* Button hardware informtation data*/ //具体的相应按键信息
static struct s3c_button_info s3c_buttons[] = {
[0] = {
.num = 1,
.name = "KEY1",
.nIRQ = IRQ_EINT0,//中断号
.gpio = S3C2410_GPF(0),
.setting = S3C2410_GPF0_EINT0,//datasheet手册上对应的IO中断口
},
[1] = {
.num = 2,
.name = "KEY2",
.nIRQ = IRQ_EINT2,
.gpio = S3C2410_GPF(2),
.setting = S3C2410_GPF2_EINT2,
},
[2] = {
.num = 3,
.name = "KEY3",
.nIRQ = IRQ_EINT3,
.gpio = S3C2410_GPF(3),
.setting = S3C2410_GPF3_EINT3,
},
[3] = {
.num = 4,
.name = "KEY4",
.nIRQ = IRQ_EINT4,
.gpio = S3C2410_GPF(4),
.setting = S3C2410_GPF4_EINT4,
},
};
/* The button platform device private data */
static struct s3c_button_platform_data s3c_button_data = {
.buttons = s3c_buttons,
.nbuttons = ARRAY_SIZE(s3c_buttons),
};
struct button_device
{
unsigned char *status; /* The buttons Push down or up status */
struct s3c_button_platform_data *data; /* The buttons hardware information data */
struct timer_list *timers; /* The buttons remove dithering timers */
wait_queue_head_t waitq; /* Wait queue for poll() */
volatile int ev_press; /* Button pressed event */
struct cdev cdev;
struct class *dev_class;
} button_device;
自定义了s3c_button_info结构体数组用来存放不同按键的基本信息,s3c_button_platform_data这个结构体包含了s3c_button_info成员,还有成员的数量,总线数据嘛,顾名思义。
与LED驱动不同的是,按键多自定义了一个结构体button_device来存放设备更多的信息,包括定时器结构体,按键事件,同时还包括了总线信息s3c_button_platform_data,可以说button_device是信息最全的包含设备的信息。
platform_driver
static struct platform_driver s3c_button_driver = {
.probe = s3c_bu