字符设备驱动程序


驱动:

#include <linux/module.h>
#include <linux/init.h>

#include <linux/types.h>
#include <linux/fs.h>	//struct file_operations
#include <linux/errno.h>

#include <linux/cdev.h>	//struct cdev
#include <asm/uaccess.h> //copy_from_user和copy_to_user
#include <linux/slab.h>


struct cdev mdev;//静态分配cdev

dev_t devno;//设备号

int dev1_regs[5];
int dev2_regs[5];





/*#######################################################
		   (2)实现设备操作
#######################################################*/
loff_t  mem_lseek(struct file *filp, loff_t  offset, int whence)
{
	loff_t new_pos = 0;
	switch (whence)
	{
		case SEEK_SET:
			new_pos = 0+offset;
		break;
		case SEEK_CUR:
			new_pos = filp->f_pos + offset;
		break;
		case SEEK_END:
			new_pos = 5*sizeof(int)+offset;
		break;
	}
	filp->f_pos =new_pos;
	return new_pos;
}

ssize_t  mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
	int *reg_base = filp->private_data;
	copy_to_user(buf, reg_base+(*ppos),size);
	filp -> f_pos += size;
	return size;
}

ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
	int *reg_base = filp->private_data;
	copy_from_user(reg_base+(*ppos),buf,size);
	filp -> f_pos += size;
	return size;
}



//定义的结构体如果是指针,访问成员时就用 -> 如果定义的是结构体变量,访问成员时就用 .
int mem_open(struct inode *node, struct file *filp)
{
	
	int num = MINOR(node->i_rdev);
	if (num == 0)
	{
		filp->private_data = dev1_regs;
	}
	if(num == 1)
	{
		filp->private_data = dev2_regs;
	}
	return 0;
}


int mem_close(struct inode *node, struct file *filp)
{
	return 0;
}




/*#######################################################
		   (1)驱动初始化
#######################################################*/

const struct file_operations memfops = 
{
	.llseek = mem_lseek,
	.read 	= mem_read,
	.write	= mem_write,
	.open	= mem_open,
	.release=mem_close,
};

int memdev_init(void)
{
	
	//初始化cdev	
	cdev_init(&mdev, &memfops);

	//注册cdev
	alloc_chrdev_region(&devno, 0, 2, "memdev");
	cdev_add(&mdev, devno, 2);

	return 0;
}

/*#######################################################
		   (3)驱动注销
#######################################################*/
void memdev_exit(void)
{
	cdev_del(&mdev);
	unregister_chrdev_region(devno,2);
	
}

module_init(memdev_init);
module_exit(memdev_exit);

应用程序write_mem.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	int fd = 0;
	int src = 2013;
	
	/*打开设备文件*/
	fd = open("/dev/memdev0",O_RDWR);
	
	/*写入数据*/
	write(fd, &src, sizeof(int));
	
	/*关闭设备*/
	close(fd);
	
	return 0;	

}

应用程序read_mem.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	int fd = 0;
	int dst = 0;
	
	/*打开设备文件*/
	fd = open("/dev/memdev0",O_RDWR);
	
	/*写入数据*/
	read(fd, &dst, sizeof(int));
	
	printf("dst is %d\n",dst);
	
	/*关闭设备*/
	close(fd);
	
	return 0;	

}



猜你喜欢

转载自blog.csdn.net/weixin_38663832/article/details/79941883