linux按键platform驱动样例学习

本文介绍了Linux按键platform驱动的编写流程,重点关注中断处理和延时消抖。平台设备涉及结构体初始化,如s3c_button_info和button_device,设备注册及中断设置。platform_driver部分涵盖probe和remove函数,中断注册通过request_irq实现,并使用定时器进行消抖操作。open函数中为中断分配资源,read函数阻塞等待中断响应,close函数释放资源。整个驱动程序深入解析了按键驱动的中断服务流程和消除抖动的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按键驱动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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值