字符驱动程序设计学习笔记4-1

来源:互联网 发布:mac安装应用程序 编辑:程序博客网 时间:2024/06/05 03:30

设备驱动程序中用到的头文件和头文件中包含的函数

#include <linux/module.h>

#include <linux/kernel.h> /* printk()*/

#include <linux/init.h> /* for __init, __exit */

#include <linux/slab.h> /* kmalloc()*/

#include <linux/types.h> /* size_t */

#include <linux/errno.h> /* errorcodes */

#include <linux/io.h>

#include <linux/fs.h>

#include <linux/cdev.h> /* structcdev */

#include <linux/device.h> /*device_create(), device_destroy() */

#include <linux/platform_device.h>

#include <linux/interrupt.h> /*request_irq(), free_irq() */

其中__init 和__exit

size_t反应内存中对象的大小(以字节为单位),size_t方便了程序在不同系统间的移植,在不同系统中size_t的定义可能不一样。

size_t的定义请参考文章http://blog.csdn.net/avrmcu1/article/details/15230135

函数前面的双下划线代表函数是底层的函数,需要谨慎使用。通常会有不带双下划线的函数调用带双下划线的底层函数。双下划线的说明请参考文章

http://blog.csdn.net/avrmcu1/article/details/17750843

 

/*文件打开函数*/

Linux 3.0内核

int  gpio_open(structinode *inode, struct file *file )

{

structsimple_gpio *gpio;

gpio=container_of(inode->i_cdev,structsimple_gpio,gpio_cdev);

file->private_data=gpio;//将设备结构体指针赋值给文件私有数据指针

return 0;

}

Linux 2.6内核

int globalmem_open(struct inode *inode,struct file *filp)

{

struct globalmem_dev*dev;

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

filp->private_data=dev;

return 0;

 

}

container_of()的作用是通过结构体成员的指针找到对应结构体的指针,这个技巧在Linux内核编程中十分常用。

container_of()的第1个参数是结构体成员的指针,第2个参数是整个结构体的类型,第3个参数是传入的结构体成员(第1个参数)的类型。

container_of的具体原理见http://blog.csdn.net/avrmcu1/article/details/16921011

 

关于文件私有数据指针file->private_data用来保存自定义设备结构体的地址。自定义结构体的地址被保存在private_data后,可以在read,write等驱动函数中传递和操作设备结构体。

当驱动中有多个设备时,相比于全局变量,private_data的优势就会显现出来。

   

在设备驱动程序的设计中,需要关心结构体file和inode


File结构体代表一个打开的文件(设备对应于设备文件),系统中每个打开的文件在内核空间都有一个关联的struct file,它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核和驱动源代码中,struct file的指针通常被命名为file或filp(file pointer)。File结构体中包括file_operations ,文件读/写模式,当前读写位置,文件私有数据指针private_data指针等的声明。

Inode结构体是Linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。Inode结构体中包含文件的访问权限、属主、组、大小、访问时间、最后修改时间等信息。

File和inode结构体的详细介绍请参考文章:

http://blog.csdn.net/avrmcu1/article/details/17717401

 

 

 

0 0