- /**
- * 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设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/
linux设备驱动开发学习之旅--支持多设备的字符设备驱动
最新推荐文章于 2025-08-29 16:10:24 发布
本文介绍了一个支持多个设备的Linux字符设备驱动程序的实现方法。该驱动程序能够为每个设备分配独立的设备结构,并通过文件私有数据进行管理。文中详细展示了设备驱动的初始化、设备注册与注销等关键步骤。

1383

被折叠的 条评论
为什么被折叠?



