国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux驅(qū)動(dòng)開發(fā)基礎(chǔ)_在設(shè)備樹中指定中斷以及在代碼中獲得中斷

這篇具有很好參考價(jià)值的文章主要介紹了Linux驅(qū)動(dòng)開發(fā)基礎(chǔ)_在設(shè)備樹中指定中斷以及在代碼中獲得中斷。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1 設(shè)備樹里中斷節(jié)點(diǎn)的語法

1.1 設(shè)備樹里的中斷控制器

1.2?設(shè)備樹里使用中斷

2??設(shè)備樹里中斷節(jié)點(diǎn)的示例

3?在代碼中獲得中斷

3.1 對(duì)于 platform_device?

3.2??對(duì)于 I2C 設(shè)備、SPI 設(shè)備

3.3??調(diào)用 of_irq_get 獲得中斷號(hào)

3.4?對(duì)于 GPIO?


1 設(shè)備樹里中斷節(jié)點(diǎn)的語法

參考文檔:內(nèi)核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt

1.1 設(shè)備樹里的中斷控制器

中斷的硬件框圖如下:

of_get_gpio_flags,# Linux驅(qū)動(dòng)--驅(qū)動(dòng)開發(fā)基礎(chǔ),Linux驅(qū)動(dòng)

?在硬件上,“中斷控制器”只有 GIC 這一個(gè),但是我們?cè)谲浖弦部梢园焉蠄D中的“GPIO”稱為“中斷控制器”。很多芯片有多個(gè) GPIO 模塊,比如 GPIO1、GPIO2 等等。所以軟件上的“中斷控制器”就有很多個(gè):GIC、GPIO1、GPIO2 等等。?
GPIO1 連接到 GIC,GPIO2 連接到 GIC,所以 GPIO1 的父親是 GIC,GPIO2的父親是 GIC。?

假設(shè) GPIO1 有 32 個(gè)中斷源,但是它把其中的 16 個(gè)匯聚起來向 GIC 發(fā)出一個(gè)中斷,把另外 16 個(gè)匯聚起來向 GIC 發(fā)出另一個(gè)中斷。這就意味著 GPIO1 會(huì)用到 GIC 的兩個(gè)中斷,會(huì)涉及 GIC 里的 2 個(gè) hwirq。?

這些層級(jí)關(guān)系、中斷號(hào)(hwirq),都會(huì)在設(shè)備樹中有所體現(xiàn)。?在設(shè)備樹中,中斷控制器節(jié)點(diǎn)中必須有一個(gè)屬性:interrupt-controller,表明它是“中斷控制器”。?
還必須有一個(gè)屬性:#interrupt-cells,表明引用這個(gè)中斷控制器的話需要多少個(gè) cell。?
#interrupt-cells 的值一般有如下取值:?
? ?#interrupt-cells=<1>?
別的節(jié)點(diǎn)要使用這個(gè)中斷控制器時(shí),只需要一個(gè) cell 來表明使用“哪一個(gè)中斷”。?
? ?#interrupt-cells=<2>?
別的節(jié)點(diǎn)要使用這個(gè)中斷控制器時(shí),需要一個(gè) cell 來表明使用“哪一個(gè)中斷”;?還需要另一個(gè) cell 來描述中斷,一般是表明觸發(fā)類型:?

第 2 個(gè) cell 的 bits[3:0] 用來表示中斷觸發(fā)類型(trigger type and level flags): 
1 = low-to-high edge triggered,上升沿觸發(fā) 
2 = high-to-low edge triggered,下降沿觸發(fā) 
4 = active high level-sensitive,高電平觸發(fā) 
8 = active low level-sensitive,低電平觸發(fā) 

示例如下:?

vic: intc@10140000 { 
  compatible = "arm,versatile-vic"; 
  interrupt-controller; 
  #interrupt-cells = <1>; 
  reg = <0x10140000 0x1000>; 
}; 

如 果 中 斷 控 制 器 有 級(jí) 聯(lián) 關(guān) 系 , 下 級(jí) 的 中 斷 控 制 器 還 需 要 表 明 它 的“ interrupt-parent ” 是 誰 , 用 了 interrupt-parent ” 中 的 哪 一 個(gè)“interrupts”。

1.2?設(shè)備樹里使用中斷

一個(gè)外設(shè),它的中斷信號(hào)接到哪個(gè)“中斷控制器”的哪個(gè)“中斷引腳”,這個(gè)中斷的觸發(fā)方式是怎樣的??
這 3 個(gè)問題,在設(shè)備樹里使用中斷時(shí),都要有所體現(xiàn)。?
? ?interrupt-parent=<&XXXX>?
你要用哪一個(gè)中斷控制器里的中斷??
? ?interrupts?
你要用哪一個(gè)中斷??
Interrupts 里要用幾個(gè) cell,由 interrupt-parent 對(duì)應(yīng)的中斷控制器決定。在中斷控制器里有“#interrupt-cells”屬性,它指明了要用幾個(gè) cell來描述中斷。?
比如:?

i2c@7000c000 { 
  gpioext: gpio-adnp@41 { 
    compatible = "ad,gpio-adnp"; 
 
    interrupt-parent = <&gpio>; 
    interrupts = <160 1>; 
 
    gpio-controller; 
    #gpio-cells = <1>; 
 
    interrupt-controller; 
    #interrupt-cells = <2>; 
  }; 
...... 
}; 

? ?新寫法:interrupts-extended?
一個(gè)“interrupts-extended”屬性就可以既指定“interrupt-parent”,也指定“interrupts”,比如:?

interrupts-extended = <&intc1 5 1>, <&intc2 1 0>; 

2??設(shè)備樹里中斷節(jié)點(diǎn)的示例

of_get_gpio_flags,# Linux驅(qū)動(dòng)--驅(qū)動(dòng)開發(fā)基礎(chǔ),Linux驅(qū)動(dòng)

?從設(shè)備樹反推 IMX6ULL 的中斷體系,如下,比之前的框圖多了一個(gè)“GPC?INTC”:

of_get_gpio_flags,# Linux驅(qū)動(dòng)--驅(qū)動(dòng)開發(fā)基礎(chǔ),Linux驅(qū)動(dòng)

?GPC ?INTC 的 英 文 是 : General ?Power ?Controller, ?Interrupt?Controller。它提供中斷屏蔽、中斷狀態(tài)查詢功能,實(shí)際上這些功能在 GIC 里也實(shí)現(xiàn)了,個(gè)人覺得有點(diǎn)多余。除此之外,它還提供喚醒功能,這才是保留它的原因。?

3?在代碼中獲得中斷

?之 前 我 們 提 到 過 , 設(shè) 備 樹 中 的 節(jié) 點(diǎn) 有 些 能 被 轉(zhuǎn) 換 為 內(nèi) 核 里 的platform_device,有些不能,回顧如下:

  • 根節(jié)點(diǎn)下含有 compatile 屬性的子節(jié)點(diǎn),會(huì)轉(zhuǎn)換為 platform_device?
  • 含有特定 compatile 屬性的節(jié)點(diǎn)的子節(jié)點(diǎn),會(huì)轉(zhuǎn)換為 platform_device?如果一個(gè)節(jié)點(diǎn)的 compatile 屬性,它的值是這 4 者之一:"simple-bus","simple-mfd","isa","arm,amba-bus", ?那么它的子結(jié)點(diǎn)(需含 compatile 屬性)也可以轉(zhuǎn)換為 platform_device。
  • 總線 I2C、SPI 節(jié)點(diǎn)下的子節(jié)點(diǎn):不轉(zhuǎn)換為 platform_device?某個(gè)總線下到子節(jié)點(diǎn),應(yīng)該交給對(duì)應(yīng)的總線驅(qū)動(dòng)程序來處理, 它們不應(yīng)該被轉(zhuǎn)換為 platform_device。?

3.1 對(duì)于 platform_device?

一個(gè)節(jié)點(diǎn)能被轉(zhuǎn)換為 platform_device,如果它的設(shè)備樹里指定了中斷屬性,那么可以從 platform_device 中獲得“中斷資源”,函數(shù)如下,可以使用下列函數(shù)獲得 IORESOURCE_IRQ 資源,即中斷號(hào):?

/** 
 * platform_get_resource - get a resource for a device 
 * @dev: platform device 
 * @type: resource type   // 取哪類資源?IORESOURCE_MEM、IORESOURCE_REG 
*                      // IORESOURCE_IRQ 等 
 * @num: resource index  // 這類資源中的哪一個(gè)? 
 */ 
struct resource *platform_get_resource(struct platform_device *dev, 
unsigned int type, 
unsigned int num); 

3.2??對(duì)于 I2C 設(shè)備、SPI 設(shè)備

對(duì)于 I2C 設(shè)備節(jié)點(diǎn),I2C 總線驅(qū)動(dòng)在處理設(shè)備樹里的 I2C 子節(jié)點(diǎn)時(shí),也會(huì)處理其中的中斷信息。一個(gè) I2C 設(shè)備會(huì)被轉(zhuǎn)換為一個(gè) i2c_client 結(jié)構(gòu)體,中斷號(hào)會(huì)保存在 i2c_client 的 irq 成員里,代碼如下(drivers/i2c/i2c-core.c):?

of_get_gpio_flags,# Linux驅(qū)動(dòng)--驅(qū)動(dòng)開發(fā)基礎(chǔ),Linux驅(qū)動(dòng)

?對(duì)于 SPI 設(shè)備節(jié)點(diǎn),SPI 總線驅(qū)動(dòng)在處理設(shè)備樹里的 SPI 子節(jié)點(diǎn)時(shí),也會(huì)處理其中的中斷信息。一個(gè) SPI 設(shè)備會(huì)被轉(zhuǎn)換為一個(gè) spi_device 結(jié)構(gòu)體,中斷號(hào)會(huì)保存在 spi_device 的 irq 成員里,代碼如下(drivers/spi/spi.c):

of_get_gpio_flags,# Linux驅(qū)動(dòng)--驅(qū)動(dòng)開發(fā)基礎(chǔ),Linux驅(qū)動(dòng)

?3.3??調(diào)用 of_irq_get 獲得中斷號(hào)

如果你的設(shè)備節(jié)點(diǎn)既不能轉(zhuǎn)換為 platform_device,它也不是 I2C 設(shè)備,不是 SPI 設(shè)備,那么在驅(qū)動(dòng)程序中可以自行調(diào)用 of_irq_get 函數(shù)去解析設(shè)備樹,得到中斷號(hào)。

3.4?對(duì)于 GPIO?

可以使用 gpio_to_irq 或 gpiod_to_irq 獲得中斷號(hào)。?舉例,假設(shè)在設(shè)備樹中有如下節(jié)點(diǎn):

gpio-keys { 
    compatible = "gpio-keys"; 
    pinctrl-names = "default"; 
 
    user { 
        label = "User Button"; 
        gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>; 
        gpio-key,wakeup; 
        linux,code = <KEY_1>; 
    }; 
}; 

那么可以使用下面的函數(shù)獲得引腳和 flag:?
button->gpio = of_get_gpio_flags(pp, 0, &flags);?
bdata->gpiod = gpio_to_desc(button->gpio);?
再去使用 gpiod_to_irq 獲得中斷號(hào):?
irq = gpiod_to_irq(bdata->gpiod);?文章來源地址http://www.zghlxwxcb.cn/news/detail-578165.html

到了這里,關(guān)于Linux驅(qū)動(dòng)開發(fā)基礎(chǔ)_在設(shè)備樹中指定中斷以及在代碼中獲得中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——LED 模板驅(qū)動(dòng)程序的改造:設(shè)備樹(十一)

    Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——LED 模板驅(qū)動(dòng)程序的改造:設(shè)備樹(十一)

    ?個(gè)人名片: ??作者簡介:學(xué)生 ??個(gè)人主頁:妄北y ??個(gè)人QQ:2061314755 ??個(gè)人郵箱:2061314755@qq.com ??個(gè)人WeChat:Vir2021GKBS ?? 本文由妄北y原創(chuàng),首發(fā)CSDN ?????? ??座右銘:大多數(shù)人想要改造這個(gè)世界,但卻罕有人想改造自己。 專欄導(dǎo)航: 妄北y系列專欄導(dǎo)航: C/C++的基

    2024年02月21日
    瀏覽(14)
  • 【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】09.Linux驅(qū)動(dòng)之GPIO中斷(附SR501人體紅外感應(yīng)驅(qū)動(dòng)代碼)

    【IMX6ULL驅(qū)動(dòng)開發(fā)學(xué)習(xí)】09.Linux驅(qū)動(dòng)之GPIO中斷(附SR501人體紅外感應(yīng)驅(qū)動(dòng)代碼)

    Linux驅(qū)動(dòng)的GPIO中斷編程主要有以下幾個(gè)步驟: 1、 通過GPIO號(hào)獲取 軟件中斷號(hào) (中斷編程不需要設(shè)置GPIO輸入輸出,當(dāng)然申請(qǐng)GPIO,設(shè)置輸入也沒問題) 參數(shù) 含義 gpio GPIO引腳編號(hào) 2、 注冊(cè) 中斷處理函數(shù) ,設(shè)置中斷 觸發(fā)方式 (上升沿、下降沿等) 參數(shù) 含義 irq 軟件中斷號(hào)(通過

    2024年02月11日
    瀏覽(23)
  • 驅(qū)動(dòng)開發(fā) day8 (設(shè)備樹驅(qū)動(dòng),按鍵中斷實(shí)現(xiàn)led亮滅)

    //編譯驅(qū)動(dòng)? (注意Makefile的編譯到移植到開發(fā)板的內(nèi)核) ? ? ? ? make arch=arm //清除編譯生成文件 ? ? ? ? make clean ****************************************** //安裝驅(qū)動(dòng) ? ? ? ? insmod mycdev.ko //卸載驅(qū)動(dòng) ? ? ? ? rmmod mycdev ? 需要在內(nèi)核路徑/arch/arm/boot/dts/? 修改 stm32mp157a-fsmp1a-dts 文件 *

    2024年02月14日
    瀏覽(47)
  • linux驅(qū)動(dòng)之中斷(一) --- 設(shè)備樹中描述中斷

    linux驅(qū)動(dòng)之中斷(一) --- 設(shè)備樹中描述中斷

    本文僅介紹如何在Linux驅(qū)動(dòng)中使用中斷 linux中的中斷不可嵌套(中斷不可打斷其他中斷) 不宜在中斷中做耗時(shí)長的事情 耗時(shí)的事情應(yīng)當(dāng)放在中斷下半部中 中斷下半部是可以被其他中斷打斷的, 而且可以用線程來執(zhí)行 內(nèi)核對(duì)中斷下半部有三種方式 1,軟中斷 2, tasklet(用軟中斷實(shí)現(xiàn)

    2024年02月03日
    瀏覽(20)
  • linux驅(qū)動(dòng)開發(fā) - 09_中斷

    鏈接: C/C++Linux服務(wù)器開發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂 在裸機(jī)中使用中斷需要做一大堆的工作,比如配置寄存器,使能 IRQ 等等。 Linux 內(nèi)核提供了完善的中斷框架,只需要申請(qǐng)中斷,然后注冊(cè)中斷處理函數(shù)即可,使用非常方便,不需要一系列復(fù)雜的寄存器

    2024年02月03日
    瀏覽(18)
  • <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-內(nèi)核定時(shí)器與中斷

    <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-內(nèi)核定時(shí)器與中斷

    <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-內(nèi)核定時(shí)器與中斷 交叉編譯環(huán)境搭建: <Linux開發(fā)> linux開發(fā)工具-之-交叉編譯環(huán)境搭建 uboot移植可參考以下: <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細(xì)記錄(第一部分) <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細(xì)記錄(第二部分) <Linux開

    2024年02月08日
    瀏覽(26)
  • Linux驅(qū)動(dòng)開發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開發(fā)雜項(xiàng)設(shè)備Demo

    Linux驅(qū)動(dòng)開發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開發(fā)雜項(xiàng)設(shè)備Demo

    若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 紅胖子網(wǎng)絡(luò)科技博文大全:開發(fā)技術(shù)集合(包含Qt實(shí)用技術(shù)、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機(jī)、軟硬結(jié)合等等)持續(xù)更新中… 上一篇:《Linux驅(qū)動(dòng)開發(fā)筆記(三

    2024年02月05日
    瀏覽(50)
  • [驅(qū)動(dòng)開發(fā)]Linux內(nèi)核定時(shí)器與中斷的簡單應(yīng)用

    首先介紹一下定時(shí)器原理。 在linux系統(tǒng)中定時(shí)器有分為軟定時(shí)和硬件定時(shí)器。 以海思某款芯片為例,定時(shí)器模塊又稱為Timer模塊,主要實(shí)現(xiàn)定時(shí)、計(jì)數(shù)功能。 Timer 具有以下特點(diǎn): 帶可編程 8 位預(yù)分頻器的 32bit/16bit 減法定時(shí)器/計(jì)數(shù)器。 Timer 的計(jì)數(shù)時(shí)鐘為 3MHz 時(shí)鐘。 支持 3 種

    2024年02月20日
    瀏覽(34)
  • 4、Linux驅(qū)動(dòng)開發(fā):設(shè)備-設(shè)備號(hào)&設(shè)備號(hào)注冊(cè)

    4、Linux驅(qū)動(dòng)開發(fā):設(shè)備-設(shè)備號(hào)&設(shè)備號(hào)注冊(cè)

    ??點(diǎn)擊這里查看所有博文 ??隨著自己工作的進(jìn)行,接觸到的技術(shù)棧也越來越多。給我一個(gè)很直觀的感受就是,某一項(xiàng)技術(shù)/經(jīng)驗(yàn)在剛開始接觸的時(shí)候都記得很清楚。往往過了幾個(gè)月都會(huì)忘記的差不多了,只有經(jīng)常會(huì)用到的東西才有可能真正記下來。存在很多在特殊情況下有

    2024年02月15日
    瀏覽(44)
  • Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn)(一)——設(shè)備驅(qū)動(dòng)模型

    Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn)(一)——設(shè)備驅(qū)動(dòng)模型

    在早期的Linux內(nèi)核中并沒有為設(shè)備驅(qū)動(dòng)提供統(tǒng)一的設(shè)備模型。隨著內(nèi)核的不斷擴(kuò)大及系統(tǒng)更加復(fù)雜,編寫一個(gè)驅(qū)動(dòng)程序越來越困難,所以在Linux2.6內(nèi)核中添加了一個(gè)統(tǒng)一的設(shè)備模型。這樣,寫設(shè)備驅(qū)動(dòng)程序就稍微容易一些了。本章將對(duì)設(shè)備模型進(jìn)行詳細(xì)的介紹。 設(shè)備驅(qū)動(dòng)模型

    2024年02月16日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包