static RET_CODE dev_open(struct inode *inode, struct file *file)
之前老是对open这个函数中的inode和file参数不是很理解,查了些资料也是干巴巴的说教,最近把这个东东好好理一理,其实这两个函数的作用很简单,inode用来识别不同的次设备号,file用来传递私有数据(or全局数据)
看个例子:
static RET_CODE dev_open(struct inode *inode, struct file *file)
{
UINT8 dev_idx = 0;
dev_idx = MINOR(inode->i_rdev);//获取次设备号
if(dev_idx >= MAX_TUNER_SUPPORT_NUM)//看此设备好是否超过驱动所支持的最大数
{
PRINTF(LOG_DBG,"[%s]line=%d,dev_idx set error!\n", __FUNCTION__, __LINE__);
return ERR_FAILED;
}
file->private_data = (void *)&my_dev[dev_idx];//将属于每个次设备的私有数据赋值
return RET_SUCCESS;
}
有这样一种情况:板上有四个同样的设备,他们的驱动都是一样的,此时就不需要编写4份驱动代码了,我们只需要有一份代码及可,但是可以创建4个设备,这四个设备拥有同样的主设备号,但是却有不同的此设备号,代码框架可以只用一份,但是要为每个次设备设置单独的私有数据,&my_dev[dev_idx]这就是为他们准备的,每个设备的节点属性就是靠inode和file来控制的,虽然公用一份open函数但是传进来的inode和file值是不一样的。
当open不同的次设备节点时,dev_idx = MINOR(inode->i_rdev);会获取各自设备的次设备号,file->private_data = (void *)&my_dev[dev_idx]这个就可以将各自的私有数据给各自的file,每个此设备都各自拥有各自的file,这样就可以使用一份代码创建多个相同设备了。