interrupt結構體和相關函式

lethe1203發表於2024-04-01
學習資料來源於:韋東山第三期,侵聯刪
可以從request_irq函式一路分析,interrupt相關結構體如下:
0
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

相關文章