天天看點

Hasen的linux裝置驅動開發學習之旅--支援多裝置的字元裝置驅動

/**
 * 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裝置驅動開發學習之旅--使用檔案私有資料的字元裝置驅動》相同*/
           

繼續閱讀