“扩展板空气温湿度传感器驱动移植”的版本间的差异
(→实验平台) |
(→实验步骤) |
||
第33行: | 第33行: | ||
==实验步骤== | ==实验步骤== | ||
+ | <ol> | ||
+ | <li>导入交叉编译工具链</li> | ||
+ | linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi | ||
+ | |||
+ | <li>内核配置</li> | ||
+ | 内核中没有SI7006的驱动,但是可以找到SI7020和SI7005的驱动,通过查阅资料及芯片手册对比,可以发现SI7020和SI7006兼容,所以使用SI7020的驱动即可。 | ||
+ | drivers/iio/humidity/si7020.c | ||
+ | 执行make menuconfig配置内核对应选项 | ||
+ | |||
+ | <pre> | ||
+ | linux@ubuntu:$ make menuconfig | ||
+ | Device Drivers ---> | ||
+ | <*> Industrial I/O support ---> | ||
+ | Humidity sensors ---> | ||
+ | <*> Si7013/20/21 Relative Humidity and Temperature Sensors | ||
+ | </pre> | ||
+ | <li>修改设备树</li> | ||
+ | 参考linux内核文档: | ||
+ | Documentation/devicetree/bindings/i2c/i2c-stm32.txt | ||
+ | 修改设备树文件: | ||
+ | arch/arm/boot/dts/stm32mp157a-fsmp1a-extended.dts | ||
+ | 由于i2c1在stm32mp151.dtsi中已完成定义,这里需要在原有基础添加与硬件对应的相关信息,在文件stm32mp157a-fsmp1a-extended.dts末尾集成并添加i2c1相关内容: | ||
+ | |||
+ | <pre> | ||
+ | &i2c1 { | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | pinctrl-0 = <&i2c1_pins_b>; | ||
+ | pinctrl-1 = <&i2c1_pins_sleep_b>; | ||
+ | i2c-scl-rising-time-ns = <100>; | ||
+ | i2c-scl-falling-time-ns = <7>; | ||
+ | status = "okay"; | ||
+ | /delete-property/dmas; | ||
+ | /delete-property/dma-names; | ||
+ | |||
+ | si7020: si7020@40 { | ||
+ | compatible = "silabs,si7020"; | ||
+ | reg = <0x40>; | ||
+ | }; | ||
+ | }; | ||
+ | </pre> | ||
+ | 仿照设备树对于i2c管脚的配置添加i2c1管脚配置: | ||
+ | |||
+ | <pre> | ||
+ | &pinctrl { | ||
+ | i2c1_pins_b: i2c1-0 { | ||
+ | pins { | ||
+ | pinmux = <STM32_PINMUX('F', 14, AF5)>, /* I2C1_SCL */ | ||
+ | <STM32_PINMUX('F', 15, AF5)>; /* I2C1_SDA */ | ||
+ | bias-disable; | ||
+ | drive-open-drain; | ||
+ | slew-rate = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | i2c1_pins_sleep_b: i2c1-1 { | ||
+ | pins { | ||
+ | pinmux = <STM32_PINMUX('F', 14, ANALOG)>, /* I2C1_SCL */ | ||
+ | <STM32_PINMUX('F', 15, ANALOG)>; /* I2C1_SDA */ | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | </pre> | ||
+ | <li>重新编译内核和设备树文件</li> | ||
+ | linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040 | ||
+ | <li>更新系统内核和设备树</li> | ||
+ | <li>测试</li> | ||
+ | 系统启动后可以查看目录/sys/bus/iio/devices/ | ||
+ | <pre> | ||
+ | root@fsmp1a:~# ls /sys/bus/iio/devices/ | ||
+ | iio:device0 | ||
+ | </pre> | ||
+ | 如果系统中有多个iio设备,这里可能会有很多个iio目录,确定哪个目录是我们的设备对应目录,可以通过查看/sys/bus/iio/devices/iio\:device0/name信息确认: | ||
+ | <pre> | ||
+ | root@fsmp1a:~# cat /sys/bus/iio/devices/iio\:device0/name | ||
+ | 0-0040 | ||
+ | </pre> | ||
+ | 由显示信息每个驱动对应设备可能有所不同,当前显示内容为设备的物理地址,与设备树中地址一致,可以确认iio:device0是当前设备对应目录 | ||
+ | 查看当目录下内容: | ||
+ | |||
+ | <pre> | ||
+ | root@fsmp1a:~# ls -l /sys/bus/iio/devices/iio\:device0/ | ||
+ | total 0 | ||
+ | -r--r--r-- 1 root root 4096 Feb 7 15:51 dev | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_offset | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_raw | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_scale | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_offset | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_raw | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_scale | ||
+ | -r--r--r-- 1 root root 4096 Feb 7 15:51 name | ||
+ | drwxr-xr-x 2 root root 0 Feb 7 15:51 power | ||
+ | lrwxrwxrwx 1 root root 0 Feb 7 15:50 subsystem -> ../../../../../../../bus/iio | ||
+ | -rw-r--r-- 1 root root 4096 Feb 7 15:50 uevent | ||
+ | </pre> | ||
+ | 文件说明:<br> | ||
+ | 文件in_ temp_scale为温度标尺,计算公式如下,公式来自与驱动对应代码: | ||
+ | |||
+ | <center>[[Image:62-3-1.png]]</center> | ||
+ | |||
+ | Scale<sub>temp</sub>=(175.72×1000×4)/65535=10.725097656 | ||
+ | |||
+ | in_ temp_offset为数据偏移,计算公式如下,公式来自于驱动对应代码: | ||
+ | |||
+ | <center>[[Image:62-3-2.png]]</center> | ||
+ | |||
+ | <center>offset<sub>temp</sub>=(-46.85×65536)/(4×175.72)=-4368</center> | ||
+ | |||
+ | in_ temp_raw为原始数据,计算公式如下,公式来自于驱动对应代码: | ||
+ | |||
+ | <center>[[Image:62-3-3.png]]</center> | ||
+ | |||
+ | <center>Raw<sub>temp</sub>=Code<sub>temp</sub>/4 </center> | ||
+ | |||
+ | 阅读SI7006芯片手册可以看到温度的计算公式为: | ||
+ | |||
+ | <center>Temperature(℃)=(175.72×Code<sub>temp</sub>)/65535-46.85</center> | ||
+ | |||
+ | 上述公式与驱动返回值看不出直接对应关系,所以我们按照驱动提供的scale、offset及Raw的计算公式对公式进行处理,得到最终公式计算过程如下: | ||
+ | </ol> |
2021年3月23日 (二) 17:36的版本
实验原理
打开扩展板原理图对照扩展板可以看到扩展板有1个温湿度传感器SI7006,如下图:
由上图可见可通过I2C总线与SI7006通信。
查看原理图可知数据线I2C1_SDA、I2C1_SCL和I2C_INT1管脚对应关系如下:
原理图网络编号 | 对应管脚 | 管脚功能 | 管脚功能码 |
---|---|---|---|
I2C1_SCL | PF14 | I2C1_SCL | AF5 |
I2C1_SDA | PF15 | I2C1_SDA | AF5 |
查看SI7006芯片手册确认设备七位从机地址为:0x40
实验平台
华清远见开发环境,FS-MP1A平台
实验步骤
- 导入交叉编译工具链
- 内核配置
- 修改设备树
- 重新编译内核和设备树文件
- 更新系统内核和设备树
- 测试
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
内核中没有SI7006的驱动,但是可以找到SI7020和SI7005的驱动,通过查阅资料及芯片手册对比,可以发现SI7020和SI7006兼容,所以使用SI7020的驱动即可。
drivers/iio/humidity/si7020.c
执行make menuconfig配置内核对应选项
linux@ubuntu:$ make menuconfig Device Drivers ---> <*> Industrial I/O support ---> Humidity sensors ---> <*> Si7013/20/21 Relative Humidity and Temperature Sensors
参考linux内核文档:
Documentation/devicetree/bindings/i2c/i2c-stm32.txt
修改设备树文件:
arch/arm/boot/dts/stm32mp157a-fsmp1a-extended.dts
由于i2c1在stm32mp151.dtsi中已完成定义,这里需要在原有基础添加与硬件对应的相关信息,在文件stm32mp157a-fsmp1a-extended.dts末尾集成并添加i2c1相关内容:
&i2c1 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&i2c1_pins_b>; pinctrl-1 = <&i2c1_pins_sleep_b>; i2c-scl-rising-time-ns = <100>; i2c-scl-falling-time-ns = <7>; status = "okay"; /delete-property/dmas; /delete-property/dma-names; si7020: si7020@40 { compatible = "silabs,si7020"; reg = <0x40>; }; };
仿照设备树对于i2c管脚的配置添加i2c1管脚配置:
&pinctrl { i2c1_pins_b: i2c1-0 { pins { pinmux = <STM32_PINMUX('F', 14, AF5)>, /* I2C1_SCL */ <STM32_PINMUX('F', 15, AF5)>; /* I2C1_SDA */ bias-disable; drive-open-drain; slew-rate = <0>; }; }; i2c1_pins_sleep_b: i2c1-1 { pins { pinmux = <STM32_PINMUX('F', 14, ANALOG)>, /* I2C1_SCL */ <STM32_PINMUX('F', 15, ANALOG)>; /* I2C1_SDA */ }; }; };
linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040
系统启动后可以查看目录/sys/bus/iio/devices/
root@fsmp1a:~# ls /sys/bus/iio/devices/ iio:device0
如果系统中有多个iio设备,这里可能会有很多个iio目录,确定哪个目录是我们的设备对应目录,可以通过查看/sys/bus/iio/devices/iio\:device0/name信息确认:
root@fsmp1a:~# cat /sys/bus/iio/devices/iio\:device0/name 0-0040
由显示信息每个驱动对应设备可能有所不同,当前显示内容为设备的物理地址,与设备树中地址一致,可以确认iio:device0是当前设备对应目录 查看当目录下内容:
root@fsmp1a:~# ls -l /sys/bus/iio/devices/iio\:device0/ total 0 -r--r--r-- 1 root root 4096 Feb 7 15:51 dev -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_offset -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_raw -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_scale -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_offset -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_raw -rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_scale -r--r--r-- 1 root root 4096 Feb 7 15:51 name drwxr-xr-x 2 root root 0 Feb 7 15:51 power lrwxrwxrwx 1 root root 0 Feb 7 15:50 subsystem -> ../../../../../../../bus/iio -rw-r--r-- 1 root root 4096 Feb 7 15:50 uevent
文件说明:
文件in_ temp_scale为温度标尺,计算公式如下,公式来自与驱动对应代码:
Scaletemp=(175.72×1000×4)/65535=10.725097656
in_ temp_offset为数据偏移,计算公式如下,公式来自于驱动对应代码:
in_ temp_raw为原始数据,计算公式如下,公式来自于驱动对应代码:
阅读SI7006芯片手册可以看到温度的计算公式为:
上述公式与驱动返回值看不出直接对应关系,所以我们按照驱动提供的scale、offset及Raw的计算公式对公式进行处理,得到最终公式计算过程如下: