學習資料來源於:韋東山第三期,侵聯刪
可以從request_irq函式一路分析,interrupt相關結構體如下:
Linux中有一箇中斷資料,對於每一個硬體中斷,都有一個陣列項,這個陣列就是irq_desc陣列
當呼叫request_irq、request_threaded_irq註冊中斷處理函式時,核心就會構造一個irqaction結構體。在裡面儲存name、dev_id等,最重要的是handler、thread_fn、thread。
在irq_data結構體中,irq是軟體中斷號,hwirq是硬體中斷號
irq_domain_ops.xlate用來解析裝置樹的中斷屬性,提取出hwirq/type等資訊
irq_domain_ops.map將hwirq轉換成irq
irq_data.irq轉換為irq_data.hwirq:
irq_to_desc 是 Linux 核心中的一個函式,用於根據中斷號獲取對應的中斷描述符。中斷描述符包含了與中斷相關的各種資訊,例如中斷處理函式、中斷共享狀態等。
這個函式的原型定義在 include/linux/irqdesc.h 標頭檔案中,通常在中斷處理程式中使用。其用法如下:
struct irq_desc *irq_to_desc(unsigned int irq); // 引數說明 irq 是中斷號,函式返回對應中斷號的中斷描述符指標,型別為 struct irq_desc *。透過這個指標,可以獲取中斷描述符的各種資訊,進而進行中斷處理等操作。
獲取中斷號:
對於platform裝置驅動:
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num); // 引數說明 type:IORESOURCE_MEM/IORESOURCE_REG/IORESOURCE_IRQ num:這類資源中的哪一個
使用demo如下:
#include <linux/platform_device.h> struct resource *res; int irq; // 假設 platform_dev 是一個 platform_device 結構的指標 res = platform_get_resource(platform_dev, IORESOURCE_IRQ, 0); if (res) { irq = res->start; printk(KERN_INFO "Interrupt number: %d\n", irq); } else { printk(KERN_ERR "Failed to get IRQ resource\n"); }
也可使用platform_get_irq獲取中斷號
int platform_get_irq(const struct platform_device *pdev, unsigned int num); // 引數和返回值說明 pdev 是指向平臺裝置結構的指標, num 是中斷號的索引,用於指定裝置可能的中斷號。 如果中斷號存在,則返回該中斷號;如果中斷號不存在,則返回一個負值。
非platform裝置驅動可使用of_irq_get獲取
int of_irq_get(const struct device_node *dev, int index) // 引數和返回值說明 dev 是指向裝置節點的指標, index 是中斷號的索引,用於指定裝置可能的中斷號。 如果中斷號存在,則返回該中斷號;如果中斷號不存在或者出錯,則返回一個負值。
對於GPIO中斷可使用gpio_to_irq或gpiod_to_irq獲得中斷號:
int gpio_to_irq(unsigned int gpio); // 引數和返回值說明 gpio 是 GPIO 引腳的編號。該函式將給定的 GPIO 引腳對映到相應的中斷號,並返回該中斷號。 如果無法將 GPIO 引腳對映到中斷號,則返回一個負值。
中斷申請和中斷下半部函式可見:
https://www.cnblogs.com/lethe1203/p/18107643
https://www.cnblogs.com/lethe1203/p/18107642
https://www.cnblogs.com/lethe1203/p/18107638