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

本文详述了嵌入式设备驱动开发的关键步骤,包括动态申请设备号、设备结构体内存分配、设备节点自动创建、IRQ注册及处理、GPIO请求、按键抖动消除等,同时介绍了read/write操作的两种阻塞实现方式。
7769

被折叠的 条评论
为什么被折叠?



