您的位置:首页 > 运维架构 > Linux

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

2014-11-25 17:50 465 查看
[cpp] view
plaincopy





/**

* 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设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: