linux驱动-poll使用笔记

前言

一个项目中使用了赛灵思的FPGA,需要fpga这边和arm这边进行数据通讯,通讯方式使用的是一段fpga和arm共享的ddr内存,把这块内存做了一个fifo,并通过中断出发,我在arm这边实现一个驱动来接收处理中断,然后读取fifo.

驱动的结构体

c 复制代码
struct ddr_fifo_dev {
	int 			index;
	dev_t 			devid;
	struct cdev		cdev;
	struct miscdevice miscdev;
	struct device * device;
	struct device_node * nd;
	char 			name[64];
	struct fasync_struct * async_queue;
	wait_queue_head_t r_wait;
	struct file  *	file;
	int     		openflag;
	int    			irq_id;
	void __iomem  * regbase;
	phys_addr_t 	physreg;
	size_t			physreglen;

	phys_addr_t 	rxfifostart;
	size_t			rxfifolen;

	phys_addr_t 	txfifostart;
	size_t			txfifolen;

	atomic_t    	irq_flag;
};

poll处理函数

c 复制代码
static unsigned int ddr_fifo_poll(struct file * file, struct poll_table_struct * poll_table)
{
	unsigned int mask = 0;
	struct ddr_fifo_dev * df_devdata = 
		container_of(file->private_data, struct ddr_fifo_dev, miscdev);
	//添加这个文件结构到等待队列
	poll_wait(file, &df_devdata->r_wait, poll_table);
	if (atomic_read(&df_devdata->irq_flag)==0) {
		//没有数据,这个接口返回0,等待内核的下次调用
		mask = 0;
	}else{
		//有数据,返回POLLIN | POLLRDNORM后,调用poll的进程会被内核唤醒
		atomic_dec(&df_devdata->irq_flag);
		mask = POLLIN | POLLRDNORM;
		dev_dbg(df_devdata->device, "POLLIN irq_flag=%d\n",atomic_read(&df_devdata->irq_flag));
	}
	return mask;
}

中断处理函数

  1. 每次进入中断后,操作寄存器清除中断标记
  2. 唤醒等待队列上的进程
  3. 原子计数加一
c 复制代码
static irqreturn_t irq_interrupt(int irq, void * dev_id)
{
	struct ddr_fifo_dev * df_devdata = (struct ddr_fifo_dev *)dev_id;
	ddr_rxfifo_irq_clear(df_devdata->regbase);
	wake_up_interruptible(&df_devdata->r_wait);
	atomic_inc(&df_devdata->irq_flag);
	return IRQ_HANDLED;
}
相关推荐
偶像你挑的噻1 天前
5-Linux驱动开发-关于LED的字符设备
linux·运维·驱动开发·stm32·嵌入式硬件
i***48611 天前
【漏洞复现】CVE-2019-11043(PHP远程代码执行漏洞)信息安全论文_含漏洞复现完整过程_含Linux环境go语言编译环境安装
linux·golang·php
AA陈超1 天前
UE5笔记:GetWorld()->SpawnActorDeferred()
c++·笔记·学习·ue5·虚幻引擎
百***66171 天前
linux上redis升级
linux·运维·redis
小糖学代码1 天前
网络:4.1加餐 - 进程间关系与守护进程
linux·网络
生椰拿铁You1 天前
openxlpy学习笔记
笔记·学习
AA陈超1 天前
ASC学习笔记0025:移除所有属性集
c++·笔记·学习·ue5·虚幻引擎
小兔薯了1 天前
6. Linux 硬盘分区管理
linux·运维·服务器
努力的Andy1 天前
Linux 云服务器新增硬盘:从分区、格式化到挂载的完整指南
linux·运维·服务器
裤裤兔1 天前
linux卡在启动界面的解决办法
linux·运维·服务器·centos·centos7·linux系统