1. TMP75AIDR温度传感器驱动移植实战指南
在嵌入式Linux开发中,温度传感器的驱动移植是硬件适配的基础工作之一。TMP75AIDR作为TI公司推出的数字温度传感器,因其高精度和I2C接口的便利性,被广泛应用于各种嵌入式设备中。本文将详细介绍如何在RK3568平台上完成TMP75AIDR的驱动移植全过程。
1.1 硬件连接与原理分析
TMP75AIDR与主控RK3568通过I2C5总线连接,这是整个驱动工作的物理基础。根据芯片手册,TMP75AIDR的I2C地址由A0、A1、A2三个引脚的电平状态决定:
- A0/A1/A2全部接地时,设备地址为0x48(二进制1001000)
- 每个引脚可独立配置为高电平或低电平,共8种组合
- 原理图中这三个引脚均接地,因此地址确定为0x48
注意:实际项目中务必确认硬件连接与地址配置一致,错误的地址设置是驱动无法工作的常见原因。
1.2 Linux内核驱动支持现状
Linux内核已经内置了TMP75系列传感器的通用驱动(lm75.c),位于drivers/hwmon目录下。该驱动具有以下特性:
- 硬件监控子系统集成:通过HWMON框架提供标准化的温度监控接口
- 多芯片兼容:支持TI、Maxim、ADI等厂商的LM75兼容芯片
- 完整功能支持:
- 温度读取(9-12位分辨率可调)
- 温度阈值设置(上限/滞后值)
- 用户空间sysfs接口
- 设备树自动探测:支持通过of_match_table自动识别设备
驱动注册关键代码分析:
c复制static struct i2c_driver lm75_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "lm75",
.of_match_table = of_match_ptr(lm75_of_match),
.pm = LM75_DEV_PM_OPS,
},
.probe = lm75_probe,
.id_table = lm75_ids,
.detect = lm75_detect,
.address_list = normal_i2c,
};
1.3 内核配置与编译
确保驱动正确编译进内核是移植成功的关键步骤:
- 进入内核配置界面:
bash复制make menuconfig
- 按以下路径启用驱动:
code复制Device Drivers --->
<*> Hardware Monitoring support --->
<*> National Semiconductor LM75 and compatibles
- 验证.config文件:
makefile复制CONFIG_SENSORS_LM75=y
经验分享:建议使用
make savedefconfig生成精简配置,便于版本管理。同时,在嵌入式开发中,模块化编译(M)不如直接编译进内核(y)可靠。
1.4 设备树节点配置
设备树是Linux内核识别硬件的关键,对于TMP75AIDR需要正确配置I2C子节点:
dts复制&i2c5 {
status = "okay";
clock-frequency = <400000>; // I2C总线速率400kHz
pinctrl-names = "default";
pinctrl-0 = <&i2c5m0_xfer>; // 引脚复用配置
tmp75aidr: tmp75@48 {
compatible = "ti,tmp75";
reg = <0x48>;
status = "okay";
};
};
关键参数说明:
- compatible:必须严格匹配驱动中的
of_match_table,使用"ti,tmp75" - reg:I2C地址0x48,与硬件设计一致
- status:"okay"表示启用设备
- clock-frequency:建议明确指定I2C速率,避免兼容性问题
1.5 驱动验证与调试
驱动加载后,可通过以下步骤验证功能:
- 检查设备是否成功识别:
bash复制dmesg | grep lm75
[ 3.456789] lm75 5-0048: hwmon0: sensor 'tmp75'
- 查看sysfs接口:
bash复制ls /sys/class/hwmon/hwmon0/
device name power subsystem temp1_input temp1_max temp1_max_hyst uevent
- 读取温度值(单位为毫摄氏度):
bash复制cat /sys/class/hwmon/hwmon0/temp1_input
25000 # 表示25.000°C
- 设置/读取温度阈值:
bash复制# 设置上限温度(30°C)
echo 30000 > /sys/class/hwmon/hwmon0/temp1_max
# 读取当前上限值
cat /sys/class/hwmon/hwmon0/temp1_max
1.6 常见问题排查
在实际移植过程中,可能会遇到以下典型问题:
问题1:设备未出现在sysfs中
可能原因及解决方案:
- I2C总线未启用 → 检查设备树中i2c5节点的status
- 地址配置错误 → 使用i2cdetect工具扫描设备
- 驱动未编译进内核 → 确认CONFIG_SENSORS_LM75=y
问题2:温度读数异常
排查步骤:
- 确认电源电压稳定(3.3V±10%)
- 检查I2C信号质量(可用示波器观察SCL/SDA)
- 验证传感器位置是否远离热源
问题3:驱动加载但功能不全
解决方法:
- 检查内核版本是否过旧(建议4.4+)
- 确认使用的compatible字符串完全匹配
- 查看dmesg是否有错误日志
1.7 性能优化建议
对于需要高精度温度监测的场景,可以考虑以下优化措施:
- 调整采样率:
bash复制# 设置更新间隔为500ms
echo 500 > /sys/class/hwmon/hwmon0/update_interval
- 提高分辨率:
修改驱动代码,在probe函数中配置配置寄存器:
c复制i2c_smbus_write_byte_data(client, LM75_REG_CONF, 0x60); // 12位分辨率
- 添加滤波处理:
在用户空间实现移动平均滤波算法,平滑温度波动。
1.8 实际应用扩展
TMP75AIDR驱动移植成功后,可以进一步开发上层应用:
- 温度监控服务:
c复制#include <stdio.h>
#include <stdlib.h>
int read_temperature() {
FILE *fp = fopen("/sys/class/hwmon/hwmon0/temp1_input", "r");
if (!fp) return -1;
int temp;
fscanf(fp, "%d", &temp);
fclose(fp);
return temp;
}
- 过热保护机制:
bash复制#!/bin/bash
while true; do
temp=$(cat /sys/class/hwmon/hwmon0/temp1_input)
if [ $temp -gt 80000 ]; then # 超过80°C
echo "Critical temperature reached!"
shutdown -h now
fi
sleep 5
done
- 历史数据记录:
bash复制# 每10秒记录一次温度到CSV文件
while true; do
date +"%T" | tr -d '\n' >> temp_log.csv
echo -n "," >> temp_log.csv
cat /sys/class/hwmon/hwmon0/temp1_input >> temp_log.csv
sleep 10
done
通过本指南的详细步骤,开发者应该能够顺利完成TMP75AIDR在RK3568平台上的驱动移植工作。在实际项目中,建议结合具体应用场景对温度采样策略和报警机制进行定制化开发。