Hasen的linux设备驱动开发学习之旅--支持多设备的字符设备驱动

本文详细介绍了如何在Linux环境中开发支持多设备的字符设备驱动,包括设备文件打开函数、设备驱动模块加载和卸载等关键步骤,通过实例展示了如何实现文件私有数据的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * Author:hasen
 * 参考 :《linux设备驱动开发详解》
 * 简介:android小菜鸟的linux
 * 	         设备驱动开发学习之旅
 * 主题:支持多设备的字符设备驱动
 * Date:2014-10-31
 */

/*globalmem设备文件打开函数*/
int globalmem_open(struct inode *inode ,struct file *filp)
{
	/*将设备结构体指针赋值给文件私有数据指针*/
	struct globalmem_dev *dev ;
	dev = container_of(inode->i_cdev,globalmem_dev,cdev) ;
	filp->private_data = dev ;
	return 0 ;
}

/*globalmem设备驱动模块加载函数*/
int globalmem_init(void)
{
	int result ;
	dev_t devno = MKDEV(globalmem_major ,0) ;
	
	/*申请字符设备驱动区域*/
	if(globalmem_major)
		result = register_chrdev_region(devno,2,"globalmem") ;
	else{
		/*动态获得主设备号*/
		result = alloc_chrdev_region(&devno,0,2,"globalmem") ;
		globalmem_major = MAJOR(devno) ;
	}
	if(result < 0)
		return result ;
	/*动态申请设备结构体的内存*/
	globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev),GFP_KERNEL) ;
	if(!globalmem_devp){ /*申请失败*/
		result = -ENOMEM ;
		goto fail_malloc ;
	}
	memset(globalmem_devp,0,2*sizeof(struct globalmem_dev)) ;
	
	globalmem_setup_cdev(&globalmem_devp[0],0) ;
	globalmem_setup_cdev(&globalmem_devp[1],1) ;
	return 0 ;
fail_malloc :
	unregister_chrdev_region(devno,1) ;
	return result ;
}

/*globalmem设备驱动模块卸载函数*/
void globalmem_exit(void)
{
	cdev_del(&globalmem_devp[0]->cdev) ;/*删除cdev结构*/
	cdev_del(&globalmem_devp[1]->cdev) ;/*删除cdev结构*/
	kfree(globalmem_devp) ;
	unregister_chrdev_region(MKDEV(globalmem_major,0),2) ;/*注销设备区域*/
}

/*初始化并添加cdev结构体*/
static void globalmem_setup_cdev(struct globalmem_dev *dev, int index)
{
	int err , devno = MKDEV(globalmem_major ,index) ;
	cdev_init(&dev->cdev,&globalmem_fops) ;
	dev->cdev.owner = THIS_MODULE ;
	err = cdev_add(&dev->cdev,devno,1) ;
	if(err)
		printk(KERN_NOTICE "Error %d adding globalmem %d\n",err,index) ;
}

/*其他的代码和《Hasen的linux设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值