网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
天线制作 GPS 地标
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | Open source | GNU | Linux | BSD | Solaris | AIX | HP-UX | IRIX | Mac OS X | Minix | Tru64 | SCO UNIX | Network | Security | X-Window | Database | 应用服务 | Programming | 经典著作 | 永远的纪念 | 杂项
 当前位置: Home > Linux > 设备驱动 > 文章  
Linux设备驱动编程之结构化设备驱动程序
文章来源: 天极开发 文章作者: 宋宝华 发布时间: 2006-10-31   字体: [ ]  
 

  阅读本文请首先阅读:《Linux设备驱动编程之内存与I/O操作》(天极原文)

  在1~9节关于设备驱动的例子中,我们没有考虑设备驱动程序的结构组织问题。实际上,Linux设备驱动的开发者习惯于一套约定俗成的数据结构组织方法和程序框架。

  设备结构体

  Linux设备驱动程序的编写者喜欢把与某设备相关的所有内容定义为一个设备结构体,其中包括设备驱动涉及的硬件资源、全局软件资源、控制(自旋锁、互斥锁、等待队列、定时器等),在涉及设备的操作时,仅仅操作这个结构体就可以了。

  对于"globalvar"设备,这个结构体就是:

struct globalvar_dev
{
int global_var = 0;
struct semaphore sem;
wait_queue_head_t outq;
int flag = 0;
};
open()和release()

  一般来说,较规范的open( )通常需要完成下列工作:

  1. 检查设备相关错误,如设备尚未准备好等;
  2.  如果是第一次打开,则初始化硬件设备;
  3. 识别次设备号,如果有必要则更新读写操作的当前位置指针f_ops;
  4. 分配和填写要放在file->private_data里的数据结构;
  5. 使用计数增1。

  release( )的作用正好与open( )相反,通常要完成下列工作:

  1. 使用计数减1;
  2. 释放在file->private_data中分配的内存;
  3. 如果使用计算为0,则关闭设备。

  我们使用LDD2中scull_u的例子:

int scull_u_open(struct inode *inode, struct file *filp)
{
 Scull_Dev *dev = &scull_u_device; /* device information */
 int num = NUM(inode->i_rdev);
 if (!filp->private_data && num > 0)
  return -ENODEV; /* not devfs: allow 1 device only */
  spin_lock(&scull_u_lock);
 if (scull_u_count && (scull_u_owner != current->uid) && /* allow user */
(scull_u_owner != current->euid) && /* allow whoever did su */
!capable(CAP_DAC_OVERRIDE)) {
  /* still allow root */
  spin_unlock(&scull_u_lock);
  return -EBUSY; /* -EPERM would confuse the user */
 }

 if (scull_u_count == 0)
  scull_u_owner = current->uid; /* grab it */

 scull_u_count++;
 spin_unlock(&scull_u_lock);

 /* then, everything else is copied from the bare scull device */

 if ( (filp->f_flags & O_ACCMODE) == O_WRONLY)
  scull_trim(dev);
 if (!filp->private_data)
  filp->private_data = dev;
 MOD_INC_USE_COUNT;
 return 0; /* success */
}

int scull_u_release(struct inode *inode, struct file *filp)
{
 scull_u_count--; /* nothing else */
 MOD_DEC_USE_COUNT;
 return 0;
}

  上面所述为一般意义上的设计规范,应该说是option(可选的)而非强制的。

--
原文链接: http://dev.yesky.com/200/2645700.shtml

 
推荐文章
·让arm-linux支持普通USB摄像头
·Linux设备驱动编程之复杂设备驱
·深入浅出Linux设备驱动之并发控
·深入浅出Linux设备驱动之字符设
·深入浅出Linux设备驱动编程之内
·深入浅出Linux设备驱动编程之引
·Linux设备驱动编程之定时器
·Linux设备驱动编程之中断处理
·Linux设备驱动编程之异步通知
·Linux设备驱动编程之阻塞与非阻
·Linux设备驱动编程之内存与I/O操
·摄像头(WebCam)在Linux操作系
·中星微芯片(301,302)USB 摄像头
·Linux的I2C驱动架构
 
 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
相关分类
热点文章
·摄像头(WebCam)在Linu
·在Linux中使用中星微301
·中星微芯片(301,302)USB
·Linux设备驱动编程之内
·深入浅出Linux设备驱动
·Linux培训园地:Linux下
·Linux的I2C驱动架构
·让arm-linux支持普通USB
相关文章
·Qt/Embedded在嵌入式Lin
·Linux设备驱动编程之复
·如何编写Linux操作系统
·深入浅出分析Linux设备
·Linux培训园地:Linux下
·Linux培训园地:Linux下
·深入浅出Linux设备驱动
·Linux培训园地:Linux下
更多...
 
 

Copyright(c) 2001-2009 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统