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

来源:互联网 发布:怎么查自己的淘宝账号 编辑:程序博客网 时间:2024/05/22 15:41
/** * 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设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/

0 0
原创粉丝点击