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;
}
相关推荐
liulilittle1 分钟前
XDP VNP虚拟以太网关(章节:二)
linux·服务器·网络·c++·通信·xdp
比奇堡派星星2 分钟前
Linux 平台设备驱动框架详解
linux·开发语言·驱动开发
孙严Pay12 分钟前
网关支付:在线交易的安全核心枢纽
笔记·科技·计算机网络·其他·微信
代码游侠13 分钟前
应用——Linux Framebuffer 图形库显示
linux·运维·服务器·数据库·笔记·算法
会飞的小新16 分钟前
Linux PCI 设备查看工具 lspci 的工作机制与使用方法
linux
xingzhemengyou116 分钟前
LINUX modprobe 智能加载和卸载内核模块
linux·服务器·前端
laplace012319 分钟前
Part 1. 大模型RAG入门基础架构介绍
笔记·语言模型·langchain·rag
【上下求索】19 分钟前
学习笔记097——Ubuntu系统中如何通过service服务的方式启动 jar 包?
java·笔记·学习·ubuntu
xingzhemengyou120 分钟前
Linux who指令查询和显示当前登录系统的用户信息
linux·服务器·网络
wadesir22 分钟前
Linux MySQL Sysbench一键部署与压测实战教程
linux·mysql·adb