Linux设备驱动 -- TMP75AIDR驱动移植

查看原理图

TMP75AIDR和RK3568采用I2C通信,使用I2C5。

根据TMP75AIDR芯片手册知道I2C地址是由A0 A1 A2决定的。

此原理图芯片I2C地址是0x48。

内核支持

内核中已经有该芯片的驱动支持,使用的是hwmon子系统实现的驱动。

驱动源码位置:kernel/drivers/hwmon/lm75.c

源码文件中定义了支持的设备:

c 复制代码
static const struct of_device_id lm75_of_match[] = {
	{ .compatible = "adi,adt75", .data = (void *)adt75 },
	{ .compatible = "dallas,ds1775", .data = (void *)ds1775 },
	{ .compatible = "dallas,ds75", .data = (void *)ds75 },
	{ .compatible = "dallas,ds7505", .data = (void *)ds7505 },
	{ .compatible = "gmt,g751", .data = (void *)g751 },
	{ .compatible = "national,lm75", .data = (void *)lm75 },
	{ .compatible = "national,lm75a", .data = (void *)lm75a },
	{ .compatible = "national,lm75b", .data = (void *)lm75b },
	{ .compatible = "maxim,max6625", .data = (void *)max6625 },
	{ .compatible = "maxim,max6626", .data = (void *)max6626 },
	{ .compatible = "maxim,mcp980x", .data = (void *)mcp980x },
	{ .compatible = "st,stds75", .data = (void *)stds75 },
	{ .compatible = "microchip,tcn75", .data = (void *)tcn75 },
	{ .compatible = "ti,tmp100", .data = (void *)tmp100 },
	{ .compatible = "ti,tmp101", .data = (void *)tmp101 },
	{ .compatible = "ti,tmp105", .data = (void *)tmp105 },
	{ .compatible = "ti,tmp112", .data = (void *)tmp112 },
	{ .compatible = "ti,tmp175", .data = (void *)tmp175 },
	{ .compatible = "ti,tmp275", .data = (void *)tmp275 },
	{ .compatible = "ti,tmp75", .data = (void *)tmp75 },
	{ .compatible = "ti,tmp75c", .data = (void *)tmp75c },
	{ },
};

驱动通过I2C子系统注册:

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,
};

module_i2c_driver(lm75_driver);

驱动提供的功能:

  • 温度读取(支持9-12位分辨率)
  • 温度上限设置
  • 温度滞后设置
  • 通过hwmon子系统暴露到用户空间
  • 支持设备树自动探测

配置内核使能支持TMP75AIDR

c 复制代码
Device Drivers  --->
	 <*> Hardware Monitoring support  --->
		 <*>   National Semiconductor LM75 and compatibles

内核配置项,确保其值等于y:

复制代码
CONFIG_SENSORS_LM75=y

配置选项定义文件:kernel/drivers/hwmon/Kconfig

编写设备树节点

c 复制代码
&i2c5 {
	...
    ...
    tmp75aidr: tmp75@48 {
        compatible = " ti,tmp75";
		reg = <0x48>;
        status = "okay";
    };
};
  • compatible属性:值必须为ti,tmp75

  • reg属性:设备的i2c地址,根据原理图得知其值是0x48。

  • status值必须是okay,表示已启用。

编写配置好设备树节点,重新编译内核。

用户空间访问

驱动加载后,会在sysfs中生成相应节点,可直接通过如下方式读取温度:

shell 复制代码
root@M3:~# ls /sys/class/hwmon/hwmon0/
device  of_node  subsystem    temp1_max       uevent
name    power    temp1_input  temp1_max_hyst  update_interval

# 查看hwmon设备
ls /sys/class/hwmon/

# 读取温度值
cat /sys/class/hwmon/hwmon0/temp1_input
    temp1_input  temp1_max_hyst  update_interval

# 查看hwmon设备
ls /sys/class/hwmon/

# 读取温度值
cat /sys/class/hwmon/hwmon0/temp1_input
相关推荐
H_oRIZoN_1 天前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
GeW1 天前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu1 天前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊1 天前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩1 天前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
笨笨饿1 天前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
m0_459872921 天前
Linux 系统基础
linux·运维·服务器
吴声子夜歌1 天前
Shell编程——数组
linux·运维·shell
blueSatchel1 天前
ros-humble仿真-建图-导航
linux·ros2
Lucis__1 天前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc