LM75 温度传感器驱动开发流程
基于 RK3588 平台的 Linux 内核温度传感器驱动深度分析
源码路径:
kernel/drivers/hwmon/lm75.c
目录
1. 概述
1.1 什么是 LM75
LM75 是一款经典的数字温度传感器,广泛应用于嵌入式系统中。它通过 I2C 总线与主控芯片通信,具有以下特点:
- 接口类型:I2C(两线串行接口)
- 测温范围:-55°C ~ +125°C
- 精度:典型值 ±2°C(-25°C ~ +100°C)
- 分辨率:可配置 9-12 位
- 工作电压:3.0V ~ 5.5V
- I2C 地址:0x48 ~ 0x4F(8 个可选地址)
1.2 兼容芯片列表
LM75 已成为行业事实标准,多家厂商生产兼容芯片。当前驱动支持的 32 种芯片:
| 厂商 | 芯片型号 | 特点 |
|---|---|---|
| National | LM75/LM75A/LM75B | 原版,9-11 位分辨率 |
| Texas Instruments | TMP75/100/101/105/112/175/275 | 12 位分辨率 |
| Maxim/Dallas | DS75/DS1775/DS7505 | 可变分辨率 |
| Analog Devices | ADT75 | 12 位分辨率 |
| Microchip | MCP9800/1/2/3 | 12 位分辨率 |
| NXP | PCT2075 | 31 种采样时间 |
| ST Microelectronics | STLM75/STDS75 | 低功耗 |
1.3 驱动文件组织
kernel/drivers/hwmon/
├── lm75.c # 主驱动文件 (931 行)
├── lm75.h # 温度转换辅助函数
├── Kconfig # 配置选项
└── Makefile # 编译配置
关键代码位置标注:
- I2C 设备 ID 表:lm75.c:638-666
- 设备树匹配表:lm75.c:669-775
- Probe 函数:lm75.c:556-636
- 温度读取:lm75.c:325-366
2. LM75 硬件原理
2.1 寄存器映射
LM75 通过 4 个主要寄存器进行控制和数据访问:
┌─────────────────────────────────────────────────────────────┐
│ LM75 寄存器映射 │
├──────────────┬───────────┬──────────────────────────────────┤
│ 寄存器地址 │ 名称 │ 功能说明 │
├──────────────┼───────────┼──────────────────────────────────┤
│ 0x00 │ TEMP │ 温度数据寄存器(只读) │
│ 0x01 │ CONF │ 配置寄存器(读写) │
│ 0x02 │ HYST │ 滞后温度寄存器(读写) │
│ 0x03 │ OS │ 过温关断阈值(读写) │
│ 0x04* │ IDLE │ PCT2075 空闲寄存器 │
└──────────────┴───────────┴──────────────────────────────────┘
* 仅 PCT2075 支持
2.2 温度数据格式
温度寄存器(TEMP,地址 0x00)存储 16 位温度数据:
┌────────────────────────────────────────────────────────────┐
│ 温度寄存器数据格式(以 11 位为例) │
├────────────────────────────────────────────────────────────┤
│ Bit 15 Bit 14 Bit 13-5 Bit 4-0 Bit 3-0 │
│ ┌──┐ ┌──┐ ┌──────┐ ┌─────┐ ┌─────┐ │
│ │ 0│ │ 0│ │ D10-0│ │ D-1│ │ D-2│... │
│ └──┘ └──┘ └──────┘ └─────┘ └─────┘ │
│ 未使用 符号位 整数部分 0.5°C 0.0625°C │
├────────────────────────────────────────────────────────────┤
│ 示例:+25.5°C = 0b00000001100100 = 0x019C │
│ -10.5°C = 0b11111101010100 = 0xFEAC(补码) │
└────────────────────────────────────────────────────────────┘
分辨率对照表:
| 分辨率位数 | 温度精度 | 转换时间(典型) |
|---|---|---|
| 9 位 | 0.5°C | ~50 ms |
| 10 位 | 0.25°C | ~100 ms |
| 11 位 | 0.125°C | ~200 ms |
| 12 位 | 0.0625°C | ~400 ms |
2.3 配置寄存器
┌────────────────────────────────────────────────────────────┐
│ 配置寄存器 (0x01) │
├────────────────────────────────────────────────────────────┤
│ Bit 7 │ Bit 6-5 │ Bit 4-2 │ Bit 1 │ Bit 0 │
│ ┌──┐ ┌─────┐ ┌───────┐ ┌───┐ ┌───┐ │
│ │OS│ │ MQ │ │ FQ │ │POL│ │SD │ │
│ │F_│ │ │ │ │ │ │ │ │ │
│ │INT│ └─────┘ └───────┘ └───┘ └───┘ │
└──────────┴──────────┴────────────┴─────────┴─────────────┘
│ OS_F_INT: 0=比较器模式 1=中断模式 │
│ MQ[1:0]: 采样时间设置(不同芯片定义不同) │
│ FQ[2:0]: 故障队列长度 │
│ POL: 输出极性 0=低电平有效 1=高电平有效 │
│ SD: 0=连续转换 1=关断模式 │
└────────────────────────────────────────────────────────────┘


2870

被折叠的 条评论
为什么被折叠?



