资源简介
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工程师激活原厂导航
相关资源
- ZYNQ VIVADO SDK调试技巧
- zynq下pcie nvme硬盘接口实现
- zynq-7000-vxworks-bsp.zip
- zedboard ubuntu16.04文件系统
- 《Xilinx ZYNQ-7000 AP SoC开发实战指南》符
-
Bare me
tal HDMI for ZedBoard with ADV7511 - 黑金zynq教程
- FPGA加速的硬件框架ZYNQ
- pynq HDMI(zynq芯片也可使用 hdmi in
- pynq HDMI(zynq也可使用 hdmi in hdm
- xilinx zynq官方培训课程
- zcu102用lwip实现TCP传输
- zcu102试验emio
- zcu10_PS端LED开关工程
- 将ZYNQ的EMIO映射到PS端串口1使用
- zynq soc 7010 核心板原理图
- 基于vivado平台的zynq PicoBlaze
- 米联ZYNQ图像处理教程
- zynq++88E1111的lwip
- 基于Xilinx Zynq-7000的AD7414试验
- XILINX开发板ZC706指导手册 Evaluation Bo
- 资源:ZED-Board从入门到精通一:ZYNQ结
- hls 教程zynq 7000 fpga教程,超过200页的
- ZYNQ双核AMP官方例程双核分别跑Linux+裸
- ZYNQ进阶之路14工程.rar
- hls_rgb2gray.zip
- ZYNQ PS响应PL中断例程
- AMP SOURCE
- 基于ZYNQ的的FPGA基础入门
- zynq 图像处理教程fpga教程,含例程手
评论
共有 条评论