在支持設備樹的系統中使用中斷一般有2種方式。
一、DTS配置interrupt節點
這裏有個挺好的博客,鏈接地址:https://biscuitos.github.io/blog/DTS-interrupt/
也即,找到dts文件中的GPIO中斷控制器節點,然後在你的dts驅動節點中根據interrupt cells數量做下聲明。
二、通過宏 gpio_to_irq 獲取
我在實驗中是通過這個方式實現的中斷功能。gpio_to_irq 函數的參數傳入對應的 gpio 序號,這裏我用的是 GPIO0,所以傳入的參數就是0,然後系統會自動幫你計算得到處理器真實的中斷編號;
三、申請中斷
1、int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)
2、int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags,const char *devname, void *dev_id);
實際上2者底層實現是類似的,request_irq 可以看作爲 request_threaded_irq 的 thread_fn 函數置成了 NULL;
方法2是在實現時會調用 kthread_create 創建一個內核線程來實現中斷線程化,目的就是爲了可以給像線程一樣管理中斷,賦予不同優先級,保證實時性。
有疑問可以Mail或評論哦~:-D