1.1 中斷概述 ARM 架構 linux 內核中,有 5 種常見的異常,其中中斷異常是其一,Linux 內核將所 有中斷統一編號,使用一個 irq_desc 結構體來描述這些中斷,里面記錄了中斷名稱、中斷狀 態、中斷標記、并提供了中斷的底層硬件訪問函數(如:清除、屏蔽、使能中斷),提供了這 個中斷的處理函數入口,通過它還可以調用用戶注冊的的中斷處理函數。linux 內核的中斷體 系已經很完善了,驅動工程師需要做的就是調用 request_irq 函數向內核注冊中斷處理函 數,下面我們來看看 request_irq 函數的定義: static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) 第一個參數 irq:中斷號,與平臺架構相關; 第二個參數 handler:用戶中斷處理函數; 第三個參數 flags:中斷標記 第四個參數 devname:中斷名字,可以通過 cat /proc/interrupts 查看; 第五個參數 dev_id:在 free_irq 中有用,也用做區分中斷處理函數; 有注冊就得對應著有注銷,驅動的注銷函數是 free_irq,其定義如下: void free_irq(unsigned int irq, void *dev_id) 第一個參數 irq:中斷號,與 request_irq 中的 irq 一致,用于定位 action 鏈表; 第二個參數 dev_id:用于在 action 鏈表中找到要卸載的表項;同一個中斷的不同中斷 處理函數必須使用不通的 dev_id 來區分,這就要求在注冊中斷共享時參數 dev_id 必須唯 一。 1.2 設備樹文件修改 這里我們選用 back 按鍵用于測試,它的網絡標號是“DISP0_WR”,對應的 IO 管腳編 號是“NANDF_WP”,對應的宏定義為“MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 ” 這個管腳在 gpio-keys 驅動中已經使用,我們需要在設備樹中將其屏蔽,然后在設備樹 文件中增加測試例程的設備樹代碼。 打開“arch/arm/boot/dts/imx6qdl-sabresd.dtsi”設備樹文件。 將 gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; 屏蔽掉,如下圖所示。
01.jpg (13.91 KB, 下載次數: 60)
下載附件
2019-8-29 10:56 上傳
在“itop_max485_ctl”之后添加以下代碼: key_int{ compatible = "itop,key_int_name"; pinctrl-names = "default"; gpio_key_int = <&gpio6 9 GPIO_ACTIVE_LOW>; status = "okay"; }; 添加完成之后如下圖所示,
03.jpg (23.24 KB, 下載次數: 56)
下載附件
2019-8-29 10:56 上傳
重新燒寫設備樹文件,在開發板“/sys/bus/platform/device”目錄下會有 key_int 文件 夾生成,表明設備注冊完成。 1.3 測試驅動 驅動源碼在壓縮包“獨立中斷例程_V1.0”中。 使用“insmod key_int.ko”命令加載驅動模塊。如下圖。
04.jpg (13.84 KB, 下載次數: 61)
下載附件
2019-8-29 10:56 上傳
按下按鍵“Back”,會有打印信息,如下圖所示。
05.jpg (14.74 KB, 下載次數: 56)
下載附件
2019-8-29 10:56 上傳
卸載驅動如下圖。
06.jpg (9.23 KB, 下載次數: 50)
下載附件
2019-8-29 10:56 上傳
測試完成。
9911245-4af7a16ceefa7f25.webp.jpg (105.36 KB, 下載次數: 64)
下載附件
2019-8-29 10:56 上傳
|