最近拿到一块imx6ull板子,上面有一颗温湿度传感器sht30,需要读取其数值。本人能力有限,自己写驱动还有一点困难,好在 linux内核里自带了很多器件的驱动,只需要找到相关的驱动文件根据要求修改一下设备树、添加进内核里编译就可以。
目前新版本的linux都支持设备树,刚开始我认为只要找到内核里的相关驱动文件,根据匹配表里的属性添加好设备树就可以了。万万没想到,linux内核自带的sht3x驱动竟然不支持设备树,支持直接name比对,那就只能根据要求添加i2c_board_info信息了。
内核自带的驱动文件是kernel/drivers/hwmon/sht3x.c,打开文件找到如下位置:
该驱动支持两款温湿度传感器,我的板子上的是sht30,连接在i2c1接口,设备地址为0x44,所以添加i2c_board_info信息如下:
static struct i2c_board_info sht3x_i2c_board_info __initdata = {
I2C_BOARD_INFO("sht3x", 0x44),
};
光添加了i2c_board_info信息还不够,还需要实例化i2c设备,根据sht3x驱动文档kernel/Documentation/hwmon/sht3x.rst介绍,
实例化方法需要参考kernel/Documentation/i2c/instantiating-devices.rst文档介绍,这个文档里介绍了多种实例化i2c接口的方法,经过测试有的方法不适用,我用了Method 2: Instantiate the devices explicitly。
需要在init函数中实例化,代码如下:
static int __init sht3x_init(void)
{
int ret = 0;
struct i2c_adapter *adapter;
adapter = i2c_get_adapter(0);
i2c_new_client_device(adapter,&sht3x_i2c_board_info);
ret = i2c_add_driver(&sht3x_i2c_driver);
return ret;
}
支持设备驱动文件部分就修改好了,接下来就是如何让这个驱动编译到内核了。打开驱动目录下的Makefile文件,如下:
通过文件可以知道要想编译sht3x驱动到内核里就需要让CONFIG_SENSORS_SHT3x编程y。所以有两种方法:
1.修改makefile文件,直接将CONFIG_SENSORS_SHT3x改成y,然后make一下,用新生成的zImage文件启动就可以了;
2.改配置文件,可以通过menuconfig修改
选中SHT3x这个选项,保存后重新make,用新生成的zImage文件启动就可以了。
或者打开.config文件进行修改,修改如下:
保存退出后重新make,用新生成的zImage文件启动就可以了。
好了,到此,SHT30驱动就添加成功了,可以直接通过hwmon进行读取数据了,文件在/sys/class/hwmon/,进去后会发现里面会有hwmon0 hwmon1 hwmon2等文件
可以通过ls -l命令查看详情,根据器件地址找到相应的器件驱动对应的文件,如下:
由上图可以知道sht3x的驱动对应的文件是hwmon1,进入hwmon1文件里可以看到很多属性文件,如下:
具体每一个属性对应的啥意思可以参考kernel/Documentation/hwmon/sht3x.rst具体介绍
可以通过cat指令一个一个参看相关属性的数值。
温度为29.362度。
其他的属性自己去探索吧。