鄙人不才, 画了上面的那个图来帮助理解:
- 应用程序通过打开设备文件, 进入到内核空间, 这个过程中驱动会去请求中断:
request_irq(IRQ_EINT0, buttons_irq, IRQT_BOTHEDGE, "S2", &pins_desc[0]);
- 驱动程序以可被打断的方式等待事件:
wait_event_interruptible(button_waitq, ev_press);
- 用户按下案件, 外部中断发送到 CPU
- CPU 根据设置的外部中断以及中断向量, 找到中断处理函数, 并跳进去执行
- 中断处理程序会根据中断的设备号读取按键的值:
s3c2410_gpio_getpin(pindesc->pin)
, 并写入一块共享内存 - 中断处理程序唤醒驱动程序:
wake_up_interruptible(&button_waitq);
- 驱动程序被唤醒
- 驱动程序去共享内存读中断处理函数读到的值
- 驱动将读到的值返回给应用程序:
copy_to_user(buf, &key_val,1);
文章评论