[Linux外设驱动详解]15.LM75温度传感器驱动开发流程

LM75 温度传感器驱动开发流程

基于 RK3588 平台的 Linux 内核温度传感器驱动深度分析

源码路径:kernel/drivers/hwmon/lm75.c


目录

  1. 概述
  2. LM75 硬件原理
  3. 驱动架构设计
  4. 核心数据结构
  5. 驱动初始化流程
  6. 温度读取与转换
  7. HWMON 子系统集成
  8. 设备树配置
  9. 电源管理
  10. 调试与测试

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        # 编译配置

关键代码位置标注


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=关断模式                            │
└────────────────────────────────────────────────────────────┘

2.4 I2C 通信时序

LM75 传感器 I2C 总线 主控 (RK3588) LM75 传感器 I2C 总线 主控 (RK3588) 读取温度流程 START + 地址(0x48) + W 传递地址 寄存器地址(0x00) 选择温度寄存器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustaUncle

一杯咖啡,换我肝到天亮!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值