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

本文介绍了一个支持多个设备的Linux字符设备驱动程序的实现方法。该驱动程序能够为每个设备分配独立的设备结构,并通过文件私有数据进行管理。文中详细展示了设备驱动的初始化、设备注册与注销等关键步骤。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Author:hasen 
  3.  * 参考 :《linux设备驱动开发详解》 
  4.  * 简介:android小菜鸟的linux 
  5.  *           设备驱动开发学习之旅 
  6.  * 主题:支持多设备的字符设备驱动 
  7.  * Date:2014-10-31 
  8.  */  
  9.   
  10. /*globalmem设备文件打开函数*/  
  11. int globalmem_open(struct inode *inode ,struct file *filp)  
  12. {  
  13.     /*将设备结构体指针赋值给文件私有数据指针*/  
  14.     struct globalmem_dev *dev ;  
  15.     dev = container_of(inode->i_cdev,globalmem_dev,cdev) ;  
  16.     filp->private_data = dev ;  
  17.     return 0 ;  
  18. }  
  19.   
  20. /*globalmem设备驱动模块加载函数*/  
  21. int globalmem_init(void)  
  22. {  
  23.     int result ;  
  24.     dev_t devno = MKDEV(globalmem_major ,0) ;  
  25.       
  26.     /*申请字符设备驱动区域*/  
  27.     if(globalmem_major)  
  28.         result = register_chrdev_region(devno,2,"globalmem") ;  
  29.     else{  
  30.         /*动态获得主设备号*/  
  31.         result = alloc_chrdev_region(&devno,0,2,"globalmem") ;  
  32.         globalmem_major = MAJOR(devno) ;  
  33.     }  
  34.     if(result < 0)  
  35.         return result ;  
  36.     /*动态申请设备结构体的内存*/  
  37.     globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev),GFP_KERNEL) ;  
  38.     if(!globalmem_devp){ /*申请失败*/  
  39.         result = -ENOMEM ;  
  40.         goto fail_malloc ;  
  41.     }  
  42.     memset(globalmem_devp,0,2*sizeof(struct globalmem_dev)) ;  
  43.       
  44.     globalmem_setup_cdev(&globalmem_devp[0],0) ;  
  45.     globalmem_setup_cdev(&globalmem_devp[1],1) ;  
  46.     return 0 ;  
  47. fail_malloc :  
  48.     unregister_chrdev_region(devno,1) ;  
  49.     return result ;  
  50. }  
  51.   
  52. /*globalmem设备驱动模块卸载函数*/  
  53. void globalmem_exit(void)  
  54. {  
  55.     cdev_del(&globalmem_devp[0]->cdev) ;/*删除cdev结构*/  
  56.     cdev_del(&globalmem_devp[1]->cdev) ;/*删除cdev结构*/  
  57.     kfree(globalmem_devp) ;  
  58.     unregister_chrdev_region(MKDEV(globalmem_major,0),2) ;/*注销设备区域*/  
  59. }  
  60.   
  61. /*初始化并添加cdev结构体*/  
  62. static void globalmem_setup_cdev(struct globalmem_dev *dev, int index)  
  63. {  
  64.     int err , devno = MKDEV(globalmem_major ,index) ;  
  65.     cdev_init(&dev->cdev,&globalmem_fops) ;  
  66.     dev->cdev.owner = THIS_MODULE ;  
  67.     err = cdev_add(&dev->cdev,devno,1) ;  
  68.     if(err)  
  69.         printk(KERN_NOTICE "Error %d adding globalmem %d\n",err,index) ;  
  70. }  
  71.   
  72. /*其他的代码和《Hasen的linux设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值