zynq新增GPIO中斷程式

2021-08-22 14:57:02 字數 2929 閱讀 5309

//*****核心原始碼為adi官方關於ad9361的核心,編譯工具為petalinux2015.2,開發板為zynqxc7z100*****====

一、修改裝置樹:

1.開啟petalinux專案下的./project-spec/meta-user/recipes-dt/device-tree/files/system-top.dts

2.找到gpio@e000a000節點,在interrupts屬性後面新增自己的gpio。

注:gpio管腳號加32等於中斷號。

例:新增61.62.63號的中斷,0x14是他原本的中斷。interrupts = <0x0 0x14 0x4>,<0x0 0x1d 0x1>, <0x0 0x1e 0x1>, <0x0

二、修改驅動,新增中斷程式:

1.開啟核心目錄下./drivers/gpio/gpio-zynq.c  gpio驅動檔案。

2.找到驅動探測函式static int zynq_gpio_probe(struct platform_device *pdev)新增**。

在zynq_gpio_probe函式內新增platform_get_resource與request_irq中斷處理。(下面是原始碼範例)

在zynq_gpio_probe函式外新增中斷發生後的處理函式。函式名需與request_irq的第四個引數相同。

例:irqreturn_t test_interrupt_61(int irqno, void *devid)

3.有時需要新增標頭檔案:    #include

#include

#include

#include

#include

4.有時需要新增中斷屬性(部分):    

#define irqf_disabled       0x00000020    //呼叫中斷處理程式時禁用irq

#define irqf_trigger_high   0x00000004    //高電平觸發

#define irqf_trigger_rising 0x00000001    //上公升沿觸發

#define irqf_shared         0x00000080    //共享中斷    

三、編譯核心->執行程式:

1.cat /proc/interrupts能夠看到掛載的gpio中斷

2.通過按鍵或其他方式觸發中斷,核心列印中斷處理程式的內容。(我是通過vivado觸發的)

四、完成。

原始碼範例:

static int zynq_gpio_probe(struct platform_device *pdev)

ret = request_irq(res->start, test_interrupt_61, irqf_trigger_rising, "int_test61", null);

if (ret1 < 0)

printk("....test61........failed request irq: irqno = irq_res->start\n");

res=platform_get_resource(pdev,ioresource_irq,2);

if(res == null ) 

ret1 = request_irq(res->start, test_interrupt_62, irqf_trigger_rising, "int_test62", null);

if (ret1 < 0)

printk("....test61........failed request irq: irqno = irq_res->start\n");

res =platform_get_resource(pdev,ioresource_irq,3);

if(res == null ) 

ret1 = request_irq(res->start, test_interrupt_63, irqf_trigger_rising, "int_test63", null);

if (ret1 < 0)

printk("....test61........failed request irq: irqno = irq_res->start\n");

...............................

}心得:

1.request_irq函式中的第乙個屬性不能直接手動填中斷號,必須通過裝置樹獲取,進行對映之後才能使用,否者不能觸發中斷。

2.platform_get_resource函式的第三個屬性,與裝置樹gpio中斷排列的排列順序有關,從0開始數字幾就表示第幾個中斷。

例:

3.其他的平台裝置都可以新增中斷,不僅僅是gpio,但探測時傳參要是platform_device。

4.struct resource *res;如果沒有需要手動新增。

Linux下ZYNQ中GPIO中斷號獲取

使用提供的gpio to irq是最佳的選擇,裝置樹配置起來也比較方便,都不需要將中斷父結點設定為gpio0。key 驅動程式申請一下對映後的終端號key test.irq int key test.irq gpio to irq key test.key gpio 使用key test.irq就可...

Zynq 中斷程式例項分析

基礎知識 arm體系架構的處理器中通常將低位址32位元組作為中斷向量表,當中斷產生時會執行以下操作 儲存處理器當前狀態,設定中斷遮蔽位和各條件標誌位 設定當前程式狀態暫存器cpsr中相應位 將lr mode暫存器設定成返回位址 跳轉到中斷向量位址執行,從而跳轉到相應的中斷程式中執行 執行中斷處理函式...

ZYNQ中斷實驗

程式中編寫了 3 個函式,乙個是 main 主函式,乙個是中斷建立函式,另乙個是中斷呼叫 函式。首先在 main 函式中初始化定時器 timer,指定 timer 的裝置號為 xpar xscutimer 0 device id,此裝置號在 xparameters.h 的標頭檔案中定義了的。再設定定...