這幾天看linux的中斷,有很多不明白,向大神們請教。
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
對于中斷申請函式中的第一個引數,irq,自己原本理解的是硬體手冊上的中斷號,后來發現不對,應該是linux內核中的IRQ號。
例如對于三星exynos4412芯片中的GPX1_1和GPX1_2對應的硬體中斷號為25,26


在使用request_irq時第一個引數需要有個轉換的程序,如下
request_irq(IRQ_EINT(9),key_handler,IRQF_TRIGGER_FALLING,"KEY1",NULL);
完成對中斷的申請。
現在不理解的是,在設備樹形式下,如何來完成的,我是參考的這篇博客上http://blog.csdn.net/zqixiao_09/article/details/50916212(設備樹)和http://blog.csdn.net/zqixiao_09/article/details/50908125(中斷驅動)
設備樹下的中斷如下

驅動獲取中斷如下

代碼的64 65行獲取設備資源,然后67 68行拿出了資源的res->start就能直接賦值給irq引數了?platform_get_resource已經把硬體中斷號轉換為linux的中斷號了嗎?我理解的不知道對不對,如果是的話,這中間是個什么程序呢?
uj5u.com熱心網友回復:
有大神給解釋一下不,不明白啊uj5u.com熱心網友回復:
沒人回答嗎 自己頂一下,uj5u.com熱心網友回復:
先回答,IORESOURCE_IRQ這個屬性取出的就是已經分配好的中斷號。平臺不一樣,但是思路大致相同吧。
設備樹里配置中斷常見的兩種:1.interrupts屬性 2.自定義一個gpio,在驅動里處理
定義為interrupts屬性的節點會在kernel起來的時候,優先被處理中斷相關的屬性:
我沒記錯的話
start_kernel->init_IRQ->irqchip_init->of_irq_init
這個是高通的流程,在of_irq_init里會掃描設備樹的中斷控制器節點并初始化
我不確定你們有沒有經典的gpio_to_irq這個API,這個函式追一下,再按照上面的流程追一下,應該能對整個處理理解深刻一點。
uj5u.com熱心網友回復:
https://blog.csdn.net/weixin_42462202/article/details/86751040轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131697.html
標籤:驅動開發/核心開發
