智能家居温湿度传感器驱动程序:
1. 本驱动使用platform模型进行设计,分为Temp_And_Humidity_device和Temp_And_Humidity_driver两个文件
2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
Temp_And_Humidity_device
Temp_And_Humidity_driver
3. 加载driver驱动模块之后自动对gpio进行初始化,初始化成功会输出:
[ 36.605575] entering Temp_And_Humidity_driver_init
[ 36.605702] entering Temp_And_Humidity_dirver_probe
[ 36.609147] Temp_And_Humidity_dirver_probe: gpio init finished!!! //GPIO初始化成功
[ 36.605702] entering Temp_And_Humidity_dirver_probe
[ 36.609147] Temp_And_Humidity_dirver_probe: gpio init finished!!! //GPIO初始化成功
4. 本驱动注册成功后生成 /dev/smarthome_temphumi_sensor_control 节点
5. 对 smarthome_lightcontrol 设备节点的操作主要有:
1)打开操作open
2)关闭操作close
3)读操作read,操作方法:
声明一个结构体:
struct DHT11_Data{
1)打开操作open
2)关闭操作close
3)读操作read,操作方法:
声明一个结构体:
struct DHT11_Data{
unsigned short humi_int; //8bit湿度整数数据
unsigned short humi_float; //8bit湿度小数数据
unsigned short temp_int; //8bit温度整数数据
unsigned short temp_float; //8bit温度小数数据
unsigned short check_sum; //8bit校验和
//校验和 = (8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据)(取低8位)
//驱动程序里面已对数据进行校验处理,处理结果会以错误类型代码的形式发送给用户空间应用程序。
//校验和 = (8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据)(取低8位)
//驱动程序里面已对数据进行校验处理,处理结果会以错误类型代码的形式发送给用户空间应用程序。
unsigned short error_code; //错误类型代码
};
};
然后使用read函数读取驱动,将结构体的地址作为缓冲区的首地址。
读取完成后,请先对结构体里面的错误代码进行检查。以下是错误代码表:
#define DHT_NO_ERROR 0 //没有错误,可以直接使用结构体里面的数据
#define DHT_ERROR_NO_RESPOND 1 //温湿度传感器没有响应,数据异常
#define DHT_ERROR_RESPOND_TIMEOUT 2 //温湿度传感器响应超时,数据异常
#define DHT_ERROR_AFTERRESPOND_TIMEOUT 3 //温湿度传感器后响应超时,数据异常
#define DHT_ERROR_PROBEBIT_TIMEOUT 4 //温湿度传感器前导信号异常,数据异常
#define DHT_ERROR_DATABIT_TIMEOUT 5 //温湿度传感器数值传送异常,数据异常
读取完成后,请先对结构体里面的错误代码进行检查。以下是错误代码表:
#define DHT_NO_ERROR 0 //没有错误,可以直接使用结构体里面的数据
#define DHT_ERROR_NO_RESPOND 1 //温湿度传感器没有响应,数据异常
#define DHT_ERROR_RESPOND_TIMEOUT 2 //温湿度传感器响应超时,数据异常
#define DHT_ERROR_AFTERRESPOND_TIMEOUT 3 //温湿度传感器后响应超时,数据异常
#define DHT_ERROR_PROBEBIT_TIMEOUT 4 //温湿度传感器前导信号异常,数据异常
#define DHT_ERROR_DATABIT_TIMEOUT 5 //温湿度传感器数值传送异常,数据异常
#define DHT_ERROR_CHECK_SUM_FAIL 10 //温湿度传感器数据校验失败,数据异常
请不要在数据异常情况下使用结构体的数据。
读操作所用总时间约为2秒(由传感器本身决定)。由于数据有时会波动,请酌情考虑在应用程序中使用算法去抖。
其它详见例程。
6. 在打开驱动文件后,会对设备驱动使用互斥锁进行上锁操作。避免其他进程或线程同时访问驱动文件,打乱通信时序。直到关闭驱动文件才解锁。
请不要在数据异常情况下使用结构体的数据。
读操作所用总时间约为2秒(由传感器本身决定)。由于数据有时会波动,请酌情考虑在应用程序中使用算法去抖。
其它详见例程。
6. 在打开驱动文件后,会对设备驱动使用互斥锁进行上锁操作。避免其他进程或线程同时访问驱动文件,打乱通信时序。直到关闭驱动文件才解锁。
7. 重构了整个室内机驱动的框架
模块单独调试时请将driver文件里面的SINGLE_MODULE宏修改为1(独立申请内存)
整体调试时请将driver文件里面的SINGLE_MODULE宏修改为0(内存由框架代码统一申请)
8. 开启模块调试信息请将driver文件里面的DEBUG宏修改为1,关闭设为0。
8. 开启模块调试信息请将driver文件里面的DEBUG宏修改为1,关闭设为0。
9. 温湿度传感器测量范围(以25摄氏度环境下测量为准)
湿度:20%RH --- 90%RH
温度:0℃ --- 50℃
温度:0℃ --- 50℃
DHT11工作时序图
Temp_And_Humidity_device.c
#include <asm/uaccess.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>