Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7533559
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2012-07-24 15:06:58

open 方法

open 方法提供给驱动来做任何的初始化来准备后续的操作. 在大部分驱动中, open 应当进行下面的工作:

  • 检查设备特定的错误(例如设备没准备好, 或者类似的硬件错误
  • 如果它第一次打开, 初始化设备
  • 如果需要, 更新 f_op 指针.
  • 分配并填充要放进 filp->private_data 的任何数据结构

但是, 事情的第一步常常是确定打开哪个设备. 记住 open 方法的原型是:

int (*open)(struct inode *inode, struct file *filp);

 

container_of这个宏用来找到适当的设备结构:

struct scull_dev *dev; /* device information */

dev = container_of(inode->i_cdev, struct scull_dev, cdev);

filp->private_data = dev; /* for other methods */

一旦它找到 scull_dev 结构, scull 在文件结构的 private_data 成员中存储一个它的指针, 为以后更易存取.

release 方法

release 方法的角色是 open 的反面. 有时你会发现方法的实现称为 device_close, 而不是 device_release. 任一方式, 设备方法应当进行下面的任务:

  • 释放 open 分配在 filp->private_data 中的任何东西
  • 在最后的 close 关闭设备

 

点击(此处)折叠或打开

  1. /* 打开操作 */
  2. int mem_open(struct inode *inode, struct file *filp)
  3. {
  4.     struct mem_dev *dev;

  5.     dev = container_of(inode->i_cdev, struct mem_dev, cdev);    // 获得设备结构体指针
  6.     filp->private_data = dev;        // 将设备结构体指针赋值给文件私有数据指针

  7.     return 0;
  8. }

  9. int mem_release(struct inode *inode, struct file *filp)
  10. {
  11.     return 0;
  12. }


源码: test.rar   

阅读(4705) | 评论(0) | 转发(8) |
给主人留下些什么吧!~~