sysfs 文件系统

    linux 2.6 内核中引入了 sysfs 文件系统,是用户空间与内核空间进行交互的一个媒介。比起古老的 proc 文件系统,它是基于内核的数据结构,因此组织结构上更加严密。它的设计使内核的信息更易获取,而且更加清晰。内核空间与用户空间的映射关系如下表所示:

内核空间(internel)用户空间(externel)
内核对象
(kernel objects)
目录
(directories)
对象属性
(object attributes)
普通文件
(regular files)
对象关系
(object relationshiops)
符号链接
(symbolic links)
 

驱动 

    就温度传感器来说,驱动程序可以用内核 sysfs 文件系统提供的接口建立对应的温度传感器的目录结构。应用程序通过访问对应目录下的普通文件,即可获取相应的温度传感器属性值。
 
    可以仿照 linux 2.6 内核提供的 kobject-example.c ( 位于 <linux src>/samples/kobject/kobject-example.c ) 建立一个温度传感器的访问接口。比如可以在驱动中,使用 temperature作为 /sys/kernel/ 目录下的温度传感器对象目录,并在这个目录下建立一个叫 temp 的文件,即作为温度传感器的一个属性,和一个mode文件,提供温度传感器的工作模式。    根据以上说明,我们的温度传感器驱动需要在模块初始化中,使用语句
temp_kobj = kobject_create_and_add(“temperature”, kernel_kobj) 
    创建 temperature 目录,然后利用
sysfs_create_group( temp_kobj,  &attr_group )  
    创建 temperature 目录下的属性文件组( 这里包含 temp 和 mode 两个文件 ),其中 attr_group 是我们自己定义的属性相关文件,通过它,我们描述了 temperature 目录里具有的属性文件,以及各文件的 show 和 store 函数。对于本例来说,可用一个属性数组 attrs 描述这一属性组 attr_group。attrs 数组包此处包含两个元素,分别对应 temp 和 mode 文件。这里仅就 temp 文件给出说明。temp 文件的 temp_show 提供了应用程序访问该文件的底层方法,为了模拟变化的温度,应用程序每读一次 temp 文件,我们就随机的改变温度。所以,在 temp_show 方法里,使用了 linux 提供的 get_random_bytes 函数产生随机数(包含在头文件 linux/random.h 中)。temp_show 里根据模式的不同,提供了获取单时点温度和平均温度的两种方法。
 
 

HAL接口测试

    驱动加载后,我们就可以看到 sysfs 文件系统中多出了 /sys/kernel/temperature/ 这一目录,且目录下边有个文件 temp, 我们可以使用 cat /sys/kernel/temperature/temp 读取它的值,于是这一文件就为应用程序访问温度传感器驱动提供了上层的通用接口。  在测试程序 test_temp.c 里,通过打开 /sys/kernel/temperature/temp 文件,并每隔一秒读取一次文件内容( 注:每读一次应使用 lseek 函数将文件指针移到开头 )。打开 /sys/kernel/temperature/mode 查看和设置模式。编译后在命令行中运行:./test_temp,测试结果如下图所示:
  a
b
c

Logo

更多推荐