mountain8848
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1733回复:4

我学linux驱动-scull_open

楼主#
更多 发布于:2003-10-09 21:09
最近在看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 */
 }
LinuxARM7
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2004-01-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-05 19:02
what are you supposed to do?
wumengyun
驱动牛犊
驱动牛犊
  • 注册日期2003-11-06
  • 最后登录2003-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-12 21:42
这里补充一下,因为很多人没有看过Linux Device Drivers这本书,
scull 是这本书里面虚拟的一个驱动程序,没有真正的硬件,为了讲解驱动开发方便才假设的一个硬件
sweijcn
驱动牛犊
驱动牛犊
  • 注册日期2002-10-05
  • 最后登录2004-11-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-04 16:46
int num = NUM(inode->i_rdev);获得设备号?
int type = TYPE(inode->i_rdev);获得设备类?
可是我调试一下,type一直为0啊。感觉根本没有按照位切分来做,就是一个从设备号。百思不得其解

[编辑 -  6/4/04 by  sweijcn]
沈卫杰
sweijcn
驱动牛犊
驱动牛犊
  • 注册日期2002-10-05
  • 最后登录2004-11-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-04 17:49
原来是建立设备的时候,从设备号是采用位切分编码的意思。例如:mknod /dev/scull_s0 c 254 48的时候,对应type=3,num=0。我是新手,自己没有理解,呵呵

[编辑 -  6/4/04 by  sweijcn]
沈卫杰
游客

返回顶部