ZYNQ Linux 使用UIO中斷

2021-10-09 15:58:36 字數 3351 閱讀 8853

zynq中的uio驅動和中斷程式學習【xilinx-petalinux學習】

testing uio with interrupt on zynq ultrascale

何曄: 當zynq遇到linux userspace i/o(uio)

在kernel/drivers/uio/uio_pdrv_genirq.c中第255行新增, 如下:

static

struct of_device_id uio_of_genirq_match=

,,,}

;

新建裝置樹檔案system-user.dtsi(include sdk生成的裝置樹),內容如下:

(該工程使用sdk自動生成的裝置樹)

裝置樹中斷號:uio0(29)和uio1(30)中斷號是在axi_gpio中斷號(31)基礎上遞減的(如果遞增中斷不會觸發)。

/*

* caution: this file is automatically generated by xilinx.

* version:

* today is: tue sep 15 13:54:36 2020

*//include/

"system-top.dts"/;

uio@0

; uio@1;}

; chosen ;}

;

pin-uio-test.c

/*

* */

#include

#include

#include

#include

#include

#include

#include

#include

void

usage

(void

)int

main

(int argc,

char

*ar**)

}/* open the uio device file */

fd =

open

(uiod, o_rdwr);if

(fd <1)

for(i =0;

;++i)

}return0;

}

gpio-uio-test.c

/*

* */

#include

#include

#include

#include

#include

#define in 0

#define out 1

#define gpio_map_size 0x10000

#define gpio_data_offset 0x00

#define gpio_tri_offset 0x04

#define gpio2_data_offset 0x08

#define gpio2_tri_offset 0x0c

#define gier 0x011c

#define ip_ier 0x0128

#define ip_isr 0x0120

void

usage

(void

)int

main

(int argc,

char

*ar**)

}/* open the uio device file */

fd =

open

(uiod, o_rdwr);if

(fd <1)

/* mmap the uio device */

ptr =

mmap

(null

, gpio_map_size, prot_read|prot_write, map_shared, fd,0)

;/* print interrupt registers */

value =*(

(unsigned*)

(ptr + gier));

printf

("%s: gier: %08x\n"

,ar**[0]

, value)

; value =*(

(unsigned*)

(ptr + ip_ier));

printf

("%s: ip_ier: %08x\n"

,ar**[0]

, value)

; value =*(

(unsigned*)

(ptr + ip_isr));

printf

("%s: ip_isr: %08x\n"

,ar**[0]

, value)

;/* enable all interrupts */

printf

("%s: enable all interrupts in regs\n"

, ar**[0]

);/*axi gpio中斷:只要有電平變化就會觸發中斷*/*(

(unsigned*)

(ptr + gier))=

0x80000000

;//使能axi gpio ip核全域性中斷*(

(unsigned*)

(ptr + ip_ier))=

0x1;

//使能通道1中斷*(

(unsigned*)

(ptr + ip_isr))=

0x1;

//清中斷

while(1

) value =*(

(unsigned*)

(ptr + gpio_data_offset));

if(value)*(

(unsigned*)

(ptr + ip_isr))=

0x1;

//清中斷}}

說明:由於axi_gpio 輸入電平變化一次就觸發一次中斷,所以按鍵按下和鬆開都會觸發一次中斷,測試程式中檢測輸入電平為1才列印一次,所以中斷號是間隔的

ZYNQ Linux使用SPI驅動

title zynq linux使用spi驅動 entryname xilinx zynq using spi driver in linux date 2020 10 14 10 02 57 categories tags driver linux spi vivado中雙擊zynq ps核 例如...

專案使用中Linq使用總結

本文旨在和分享linq在專案中的實踐,曾經我參與過的專案都能看見linq的影子。linqtosql linqtostring linqtoxml linqtoentity 等等.個人認為linq是近年來微軟推出的非常成功的一項技術。比如,當我熟悉linq之後,再用sql寫商業邏輯時,感覺已經不再適應...

專案使用中Linq使用總結

本文旨在和分享linq在專案中的實踐,曾經我參與過的專案都能看見linq的影子。linqtosql linqtostring linqtoxml linqtoentity 等等.個人認為linq是近年來微軟推出的非常成功的一項技術。比如,當我熟悉linq之後,再用sql寫商業邏輯時,感覺已經不再適應...