//*****核心原始碼為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 的標頭檔案中定義了的。再設定定...