BUTTON驱动(一个驱动管理多个button设备)(基于Linux-3.4.2)

/*

*注意:本文仅用于学习记录和交流,若有错,望指正,谢谢

*/

-----------------------------------------------------分割线-----------------------------------------------------------

1.动态申请设备号后要获取major

2.多个设备结构体的内存申请

3.添加多个设备结构体

另写接口函数很重要:

4.自动创建多个设备节点

一个class,多个device_create

5.open中irq的注册

根据_node->i_cdev->dev这个dev_t找到次设备号,依据minor来注册:

结合实际的button_desc[]

6.irq注册前最好gpio_request

7.IRQ中依据irq找到对应的gpio

法1:上述依据板载实际IRQ与GPIO的对应关系  自己编写接口函数

法2:不同的IRQ对应不同的irq_handler

8.read/write阻塞的两种方式

    法1(隐式使用wait_queue):在read/write中判断为不可读的阻塞时,直接:

    

    使用等待队列等待唤醒,并满足cond;

    并在irq中唤醒:

    

    即:在不可读且阻塞时,陷入睡眠并等待唤醒;当irq发生并在irq_handler中唤醒并置位等待cond后;

            read中的等待队列被唤醒且满足条件则继续执行。

    法2(显示使用wait_queue):

        先定义一个等待队列元素,并将等待队列元素add到等待队列头部;

        在read/write中判断为不可读的阻塞时:

        //set_current_state(TASK_INTERRUPTIBLE);

        //schedule();//显示调用其他进程,让出CPU使用权

        并等待唤醒:(IRQ或者XXX来唤醒):

        

0.按键抖动

猜你喜欢

转载自blog.csdn.net/Carl_0/article/details/87856502