# interrupt ## interrupt * 通知CPU事件發生,CPU需對事件做出回應 * 從process contex 切換到 interupt context ## interrupt handler * 負責處理硬體中斷 * 不能呼叫會進入睡眠的function * 因為interrupt有最高的優先等級 * 處理時會關閉中斷 ## VIM3L * 從 hikey-linaro/arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts 的include往下追到 meson-g12-common.dtsi * 看到裡面的gpio-intc 裡有 interrupt-controller,可見他只有8個channel * 電路圖:https://dl.khadas.com/Hardware/VIM3/Schematic/VIM3_V13_Sch.pdf * datasheet: https://dl.khadas.com/Hardware/VIM3/Datasheet/S905D3_datasheet_0.2_Wesion.pdf * 根據 https://docs.khadas.com/linux/vim3/Gpio.html * 測試 GPIOZ15 無法export , GPIOH_4可以,故使用這根來實作 ![](https://i.imgur.com/coenwb2.png) * 根據![](https://i.imgur.com/yL2ouI4.png) 可得 interrupts-extended 後面的參數為何 * ## request_irq(irq, handler, irqflags, devname, dev_id) * levle trigger * IRQF_TRIGGER_HIGH * IRQF_TRIGGER_LOW * edge trigger * IRQF_TRIGGER_FALLING * IRQF_TRIGGER_RISING * IRQF_SHARED * 有多個中斷處理程序共享irq * 使用dev來區分,dev不能重複 * dev * 如果有設定 IRQF_SHARED就必須設定 ## devm_request_threaded_irq(dev, irq, handler,thread_fn irqflags, devname, dev_id) * 將中斷處理程序加入線程的概念 * thread_fn 可以跟一般thread一起競爭cpu資源 * 避免中斷處理佔用太多資源 * handler 在 interrupt context中執行 * thread_fn 在 process context 中執行 * IRQF_ONESHOT * 執行完 thread_fn 才會 enable interrupt * level edge 使用可以避免程式一直卡在 handler ![](https://i.imgur.com/eXiffpn.png) ![](https://i.imgur.com/nVoOAJT.png) ![](https://i.imgur.com/1koMfdf.png) ![](https://i.imgur.com/35R5Rzm.png) ![](https://i.imgur.com/4v3C19x.png) ![](https://i.imgur.com/kXA7yKb.png) ![](https://i.imgur.com/NpAJEar.png) ![](https://i.imgur.com/AtGK2RN.png) ![](https://i.imgur.com/42WQgb8.png) ![](https://i.imgur.com/vUPwuHI.png) ![](https://i.imgur.com/1tkubQv.png)