属性系统
属性系统传感器驱动的主要组成部分。在传感器驱动中通常使用属性系统实现传感器的打开、关闭、参数设置读取等功能。一个简单的例子如下:
HWMON驱动
hemon子系统,可以理解成 hardware monitor——监控硬件设备的传感器,包括温度传感器等等。通常一个典型的例子是LM75温度传感器。这个传感器的使用非常广泛,其代码在linux内核中的位置:$(LINUX SOURCE CODE)/driver/hwmon/lm75.c。这里我们有一个简单的HWMON例子:
我为hwmon也写了一个及其简单的测试代码,有点懒,不爱写了。。。
ioctl
ioctl属于高级字符驱动程序操作,详细的说明可以参考《ldd3》的第六章。在传感器驱动中,一般通过HWMON或者MISC设备驱动来实现和调用ioctl方法。在本文中我们将在MISC驱动中实现IOCTL方法。
MISC驱动
Linux的MISC子系统通常用来实现不太好分类的字符设备,比如AD、看门狗以及一些传感器。在传感器驱动中,通常使用MISC驱动提供一个文件接口,通过该文件接口,用户层代码可以使用ioctl来传递命令和参数,从而控制传感器的工作。
一个MISC驱动的简单代码如下:
注:在Linux的misc子系统中,misc_register和misc_deregister分别用来注册和删除MISC设备。misc_register将结构体miscdevice注册成MISC设备,并将file_operations和该设备关联起来,这样我们可以通过在/dev下生成的文件接口使用ioctl传递控制参数。
驱动测试文件代码如下:
注:MISC驱动的文件接口和SYS路径都在测试代码中宏定义了,我们获取/dev/misc_example的文件描述符之后,使用ioctl方法与MISC驱动交互。
说明
以上代码在64位ubuntu12.04上编译并测试通过。