/*
*注意:本文仅用于学习记录和交流,若有错,望指正,谢谢
*/
-----------------------------------------------------分割线-----------------------------------------------------------
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.按键抖动