【引用】linux驱动开发中open 方法
来源:互联网 发布:百家cms分销系统 编辑:程序博客网 时间:2024/05/22 01:25
open 方法提供给驱动来做任何的初始化来准备后续的操作. 在大部分驱动中, open 应当进行下面的
工作:
● 检查设备特定的错误(例如设备没准备好, 或者类似的硬件错误
● 如果它第一次打开, 初始化设备
● 如果需要, 更新 f_op 指针.
● 分配并填充要放进 filp->private_data 的任何数据结构
但是, 事情的第一步常常是确定打开哪个设备. 记住 open 方法的原型是:
int (*open)(struct inode *inode, struct file *filp);
inode 参数有我们需要的信息,以它的 i_cdev 成员的形式, 里面包含我们之前建立的 cdev 结构. 唯一
的问题是通常我们不想要 cdev 结构本身, 我们需要的是包含 cdev 结构的 scull_dev 结构. C 语言使
程序员玩弄各种技巧来做这种转换; 但是, 这种技巧编程是易出错的, 并且导致别人难于阅读和理
解代码. 幸运的是, 在这种情况下, 内核 hacker 已经为我们实现了这个技巧, 以 container_of 宏的形
式, 在 <linux/kernel.h> 中定义:
container_of(pointer, container_type, container_field);
这个宏使用一个指向 container_field 类型的成员的指针, 它在一个 container_type 类型的结构中, 并
且返回一个指针指向包含结构. 在 scull_open, 这个宏用来找到适当的设备结构:
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 成员中存储一个它的指针, 为以后更易存
取.
http://www.deansys.com/doc/ldd3/ch03s05.html(第 1/3 页)2009-5-4 17:43:443.5. open 和 release-Linux设备驱动第三版(中文版)- -
识别打开的设备的另外的方法是查看存储在 inode 结构的次编号. 如果你使用 register_chrdev 注册
你的设备, 你必须使用这个技术. 确认使用 iminor 从 inode 结构中获取次编号, 并且确定它对应一个
你的驱动真正准备好处理的设备.
scull_open 的代码(稍微简化过)是:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
/* now trim to 0 the length of the device if open was write-only */
if ( (filp->f_flags & O_ACCMODE) == O_WRONLY)
{
scull_trim(dev); /* ignore errors */
}
return 0; /* success */
}
代码看来相当稀疏, 因为在调用 open 时它没有做任何特别的设备处理. 它不需要, 因为 scull 设备设
计为全局的和永久的. 特别地, 没有如"在第一次打开时初始化设备"等动作, 因为我们不为 scull 保持
打开计数.
唯一在设备上的真实操作是当设备为写而打开时将它截取为长度为 0. 这样做是因为, 在设计上, 用
一个短的文件覆盖一个 scull 设备导致一个短的设备数据区. 这类似于为写而打开一个常规文件, 将
其截短为 0. 如果设备为读而打开, 这个操作什么都不做.
在我们查看其他 scull 特性的代码时将看到一个真实的初始化如何起作用的.
工作:
● 检查设备特定的错误(例如设备没准备好, 或者类似的硬件错误
● 如果它第一次打开, 初始化设备
● 如果需要, 更新 f_op 指针.
● 分配并填充要放进 filp->private_da
但是, 事情的第一步常常是确定打开哪个设备. 记住 open 方法的原型是:
int (*open)(struct inode *inode, struct file *filp);
inode 参数有我们需要的信息,以它的 i_cdev 成员的形式, 里面包含我们之前建立的 cdev 结构. 唯一
的问题是通常我们不想要 cdev 结构本身, 我们需要的是包含 cdev 结构的 scull_dev 结构. C 语言使
程序员玩弄各种技巧来做这种转换; 但是, 这种技巧编程是易出错的, 并且导致别人难于阅读和理
解代码. 幸运的是, 在这种情况下, 内核 hacker 已经为我们实现了这个技巧, 以 container_of 宏的形
式, 在 <linux/kernel.h> 中定义:
container_of(pointer, container_type, container_field);
这个宏使用一个指向 container_field 类型的成员的指针, 它在一个 container_type 类型的结构中, 并
且返回一个指针指向包含结构. 在 scull_open, 这个宏用来找到适当的设备结构:
struct scull_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_da
一旦它找到 scull_dev 结构, scull 在文件结构的 private_da
取.
http://www.deansys.com/doc/ldd3/ch03s05.html(第 1/3 页)2009-5-4 17:43:443.5. open 和 release-Linux设备驱动第三版(中文版)- -
识别打开的设备的另外的方法是查看存储在 inode 结构的次编号. 如果你使用 register_chrdev 注册
你的设备, 你必须使用这个技术. 确认使用 iminor 从 inode 结构中获取次编号, 并且确定它对应一个
你的驱动真正准备好处理的设备.
scull_open 的代码(稍微简化过)是:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_da
/* now trim to 0 the length of the device if open was write-on
if ( (filp->f_flags & O_ACCMODE) == O_WRONLY)
{
scull_trim(dev); /* ignore errors */
}
return 0; /* success */
}
代码看来相当稀疏, 因为在调用 open 时它没有做任何特别的设备处理. 它不需要, 因为 scull 设备设
计为全局的和永久的. 特别地, 没有如"在第一次打开时初始化设备"等动作, 因为我们不为 scull 保持
打开计数.
唯一在设备上的真实操作是当设备为写而打开时将它截取为长度为 0. 这样做是因为, 在设计上, 用
一个短的文件覆盖一个 scull 设备导致一个短的设备数据区. 这类似于为写而打开一个常规文件, 将
其截短为 0. 如果设备为读而打开, 这个操作什么都不做.
在我们查看其他 scull 特性的代码时将看到一个真实的初始化如何起作用的.
0 0
- 【引用】linux驱动开发中open 方法
- Linux 驱动开发中常用的内存分配方法浅析
- linux驱动开发 方法谈
- Linux驱动开发之模块化加载方法
- 学习linux驱动开发的方法
- Linux开发板中安装WIFI驱动
- arm-linux开发中驱动模块详解
- 工程中linux的LED驱动方法
- linux内核中添加驱动的方法
- linux驱动开发-用户open操作在整个系统中的流程
- JNI中新建文件、读写普通文件和驱动文件的方法综述fopen/open/creat/
- Linux学习:应用层open调用驱动层open过程
- linux wlan open source的驱动
- android开发中APP引用方法总数过多
- 【Linux开发】linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write
- 嵌入式linux下usb驱动开发方法--看完少走弯路
- 嵌入式linux下usb驱动开发方法--看完少走弯路
- 嵌入式linux下usb驱动开发方法--看完少走弯路
- 十年前、十年后...献给集体奔三的80后
- 一哥们拒绝女生的N种理由,笑不死你不算完!
- 【引用】如何在Linux中配置YUM
- 【引用】什么是AT指令集
- cvFindContours 获取轮廓中的所有点
- 【引用】linux驱动开发中open 方法
- 外国小美女翻唱自拍《会呼吸的痛》
- 高铁侧翻脱轨撞高楼:650名乘客被活埋
- GNOME、XWindow、KDE区别?
- 【引用】linux sed用法
- 用minicom 进行自动化测试 --通过bash脚本操作minicom
- xp 下硬盘安装fedora 15
- 如何写出漂亮的代码 (转载)
- makefile 学习笔记2