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设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/
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设备驱动开发学习之旅--使用文件私有数据的字符设备驱动》相同*/
相关文章推荐
- Hasen的linux设备驱动开发学习之旅--支持多设备的字符设备驱动
- Hasen的linux设备驱动开发学习之旅--支持轮询操作的设备驱动
- linux设备驱动开发学习之旅--支持阻塞的设备驱动
- linux设备驱动开发学习之旅--支持轮询操作的设备驱动
- Linux设备驱动开发学习(4):字符设备驱动(未完)
- linux设备驱动开发学习之旅--使用文件私有数据的字符设备驱动
- Hasen的linux设备驱动开发学习之旅--支持阻塞的设备驱动
- Hasen的linux设备驱动开发学习之旅--使用文件私有数据的字符设备驱动
- Linux设备驱动开发基础---字符设备驱动程序开发之基于中断的按键驱动
- linux设备驱动开发学习之旅--linux设备驱动中的并发与竞态
- Hasen的linux设备驱动开发学习之旅--简单字符驱动实例globalmem
- Linux设备驱动学习(4)-字符设备驱动
- Linux设备驱动开发基础---字符设备驱动程序开发之mini2440_LED驱动
- Linux设备驱动开发详解--笔记6--字符设备驱动
- Linux设备驱动开发详解-第6章字符设备驱动(二)-支持2个globalmem
- 嵌入式学习-驱动开发-lesson2-LED字符设备驱动
- Linux驱动开发学习--字符设备驱动结构
- Linux设备驱动开发基础---字符设备驱动程序开发之mini2440_ADC驱动
- 嵌入式学习-驱动开发-lesson1-字符设备驱动模型
- linux设备驱动开发学习之旅--简单字符驱动实例globalmem