资源简介
Linux在增加了设备树后,中断驱动的编写模式不一样了,很多介绍Zynq中断的文档还是介绍以前的方法,中断函数不能正常进入。一个源码给Zynq新手学习、参考。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE(“GPL“);
#define DEVICE_NAME “axi_timer_0“
#define XIL_AXI_TIMER_TCSR_OFFSET 0x0
#define XIL_AXI_TIMER_TLR_OFFSET 0x4
#define XIL_AXI_TIMER_TCR_OFFSET 0x8
#define XIL_AXI_TIMER_CSR_INT_OCCURED_MASK 0x00000100
#define XIL_AXI_TIMER_CSR_CASC_MASK 0x00000800
#define XIL_AXI_TIMER_CSR_ENABLE_ALL_MASK 0x00000400
#define XIL_AXI_TIMER_CSR_ENABLE_PWM_MASK 0x00000200
#define XIL_AXI_TIMER_CSR_INT_OCCURED_MASK 0x00000100
#define XIL_AXI_TIMER_CSR_ENABLE_TMR_MASK 0x00000080
#define XIL_AXI_TIMER_CSR_ENABLE_INT_MASK 0x00000040
#define XIL_AXI_TIMER_CSR_LOAD_MASK 0x00000020
#define XIL_AXI_TIMER_CSR_AUTO_RELOAD_MASK 0x00000010
#define XIL_AXI_TIMER_CSR_EXT_CAPTURE_MASK 0x00000008
#define XIL_AXI_TIMER_CSR_EXT_GENERATE_MASK 0x00000004
#define XIL_AXI_TIMER_CSR_DOWN_COUNT_MASK 0x00000002
#define XIL_AXI_TIMER_CSR_CAPTURE_MODE_MASK 0x00000001
#define TIMER_CNT 0xE8000000
static struct platform_device *pdev;
void *dev_virtaddr;
static int int_cnt;
static int xilaxitimer_open(struct inode * inode struct file * filp)
{
return 0;
}
static int xilaxitimer_release(struct inode * inode struct file *filp)
{
return 0;
}
static int xilaxitimer_read(struct file *filp char *buffer size_t length loff_t * offset)
{
return 0;
}
static const struct file_operations xilaxitimer_fops =
{
.owner = THIS_MODULE
.open = xilaxitimer_open
.release = xilaxitimer_release
.read = xilaxitimer_read
};
static struct miscdevice xilaxitimer_dev =
{
.minor = MISC_DYNAMIC_MINOR
.name = DEVICE_NAME
.fops = &xilaxitimer_fops
};
static irqreturn_t xilaxitimer_isr(int irqvoid*dev_id)
{
unsigned int data;
/*
* Check Timer Counter Value
*/
data = ioread32(dev_virtaddr + XIL_AXI_TIMER_TCR_OFFSET);
printk(“xilaxitimer_isr: Interrupt Occurred ! Timer Count = 0x%08X\n“data);
/*
* Clear Interrupt
*/
data = ioread32(dev_virtaddr + XIL_AXI_TIMER_TCSR_OFFSET);
iowrite32(data | XIL_AXI_TIMER_CSR_INT_OCCURED_MASK
dev_virtaddr + XIL_AXI_TIMER_TCSR_OFFSET);
/*
* Disable Timer after 100 Interrupts
*/
int_cnt++;
if (int_cnt>=100)
{
printk(“xilaxitimer_isr: 100 interrupts have been occurred. Disabling timer“);
data = ioread32(dev_virtaddr + XIL_AXI_TIMER_TCSR_OFFSET);
iowrite32(data & ~(XIL_AXI_TIMER_CSR_ENABLE_TMR_MASK)
dev_virtaddr + XIL_AXI_TIMER_TCSR_OFFSET);
}
return IRQ_HANDLED;
}
static const struct of_device_id xilaxitimer_of_match[];
static int xilaxitimer_probe(struct platform_device *pdev)
{
struct devi
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 432 2018-10-09 15:42 Linux4.0版 zynq Axitimer自编驱动源码\Makefile
文件 5370 2018-10-16 13:23 Linux4.0版 zynq Axitimer自编驱动源码\xilaxitimer.c
目录 0 2018-10-16 13:52 Linux4.0版 zynq Axitimer自编驱动源码
----------- --------- ---------- ----- ----
5802 3
- 上一篇:开通局域网共享(访问本机无需验证即可进入)
- 下一篇:odis工程师激活原厂导航
相关资源
- Xilinx SDK常用API集合
- Xilinx Zynq SoC教程+IP核教程+FPGA数字信号
- EBAZ4205控制板原理图和PCB.zip
-
Zybo_zynq_def.xm
l网表文件 - zynq使用的OLED芯片SSD1306驱动程序
- zedboard OLED IP
- Xilinx Zynq SoC与嵌入式Linux设计实战指南
- Vivado2018.1及license,亲测可用
- Xilinx_Zynq-7000 封装库
- ZYNQ7000原理图
- ZYNQ7021 串口UART0
- Xilinx Zynq-7000嵌入式系统设计及实现
- ZYNQ-7000系列所有型号PFGA管脚分配表
- CAN ZYNQ中 PS 端 CAN接口的基本使用方法
- ALINX_ZYNQ_MPSoC(AXU3CG)SDK开发教程高级
- 基于Zynq平台的动态智能家居系统的设
- 基于 ZYNQ 7020 的 FPGA + ARM 开发
- 基于ZYNQ linux CAN通讯开发
- Vivado2018 1 2 3 license
- Xilinx Zynq-7000 嵌入式系统设计与实现
- XILINX-zynq-7000-Z系列FPGA选型指南
- 最全的xilinx vivado ip核license
- ZYNQ7020SCH PCB
- zynq7020 CLG400 pcb
- AD9361 和Zynq及其参考设计说明.docx
- 基于zynq平台linux外设驱动分析-内核部
- Xilinx-Zynq Altium 封装库 原理图 PCB
- zynq 7020封装文件
- zynq pl读写ddr 实现vga高清显示
- UG1144-xilinx-PetaLinux工具文档:参考指南
评论
共有 条评论