资源简介

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


评论

共有 条评论