阅读:1733回复:4
我学linux驱动-scull_open
最近在看Linux Device Drivers, 2nd Edition,与大家共同进步。
这段代码叫做 位切分 ,这个名词专业巴!呵呵,就是针对不同的设备,填入不同的file operation.今天重读,多懂了一些。 int scull_open(struct inode *inode, struct file *filp) { Scull_Dev *dev; /* device information */ int num = NUM(inode->i_rdev);获得设备号 int type = TYPE(inode->i_rdev);获得设备类 /* * 如果filp->private_data为空,type大于0,对应type置operation. * */ if (!filp->private_data && type) { if (type > SCULL_MAX_TYPE) return -ENODEV; filp->f_op = scull_fop_array[type]; return filp->f_op->open(inode, filp); /* dispatch to specific open */ } /* type 0, check the device number (unless private_data valid) */ dev = (Scull_Dev *)filp->private_data; if (!dev) { if (num >= scull_nr_devs) return -ENODEV; dev = &scull_devices[num]; filp->private_data = dev; /*把真正的Scull_Dev指针放在private_data段*/ } MOD_INC_USE_COUNT; /* 把设备使用者计数加1*/ /* now trim to 0 the length of the device if open was write-only */ if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) { if (down_interruptible(&dev->sem)) /*获取semaphore*/ { MOD_DEC_USE_COUNT;/*不成功,把设备使用者计数减1*/ return -ERESTARTSYS; } scull_trim(dev); /* ignore errors */ up(&dev->sem);/*释放semaphore*/ } return 0; /* success */ } |
|
沙发#
发布于:2003-11-05 19:02
what are you supposed to do?
|
|
板凳#
发布于:2003-11-12 21:42
这里补充一下,因为很多人没有看过Linux Device Drivers这本书,
scull 是这本书里面虚拟的一个驱动程序,没有真正的硬件,为了讲解驱动开发方便才假设的一个硬件 |
|
地板#
发布于:2004-06-04 16:46
int num = NUM(inode->i_rdev);获得设备号?
int type = TYPE(inode->i_rdev);获得设备类? 可是我调试一下,type一直为0啊。感觉根本没有按照位切分来做,就是一个从设备号。百思不得其解 [编辑 - 6/4/04 by sweijcn] |
|
|
地下室#
发布于:2004-06-04 17:49
原来是建立设备的时候,从设备号是采用位切分编码的意思。例如:mknod /dev/scull_s0 c 254 48的时候,对应type=3,num=0。我是新手,自己没有理解,呵呵
[编辑 - 6/4/04 by sweijcn] |
|
|