参考:基于FS_S5PC100的LM75温度传感器驱动程序添加与测试
LM75A是嵌入式中常用的温度传感器,常用来监测板上温度。
LM75A的接口是i2c接口,i2c的设备地址一般为48(要根据原理图来定),温度采集范围是-55°C-+125°C
原理图
u-boot中的移植
在配置文件中添加相应的宏定义,重新编译烧写。
$vi include/configs/p1020ndae
/\* I2C SYSMON (LM75) \*/
#define CONFIG\_DTT\_LM75 1 /\* ON Semi's LM75 \*/
#define CONFIG\_DTT\_SENSORS {0} /\* Sensor addresses \*/
#define CONFIG\_SYS\_DTT\_MAX\_TEMP 70
#define CONFIG\_SYS\_DTT\_LOW\_TEMP -30
#define CONFIG\_SYS\_DTT\_HYSTERESIS 3
在u-boot中移植,没有相应的命令可以直接读取温度,但是可以用i2c调试命令来读取寄存器。
linux Drivers移植
硬件描述部分
新版的内核,大部分芯片都是使用device tree来描述硬件信息的,但是为了兼容老芯片,还是提供platform的移植方法。
以下只用其一即可。
platform总线移植
以S5PC100平台为例,在内核S5PC100平台代码中添加一个I2C设备用来描述LM75
- 打开平台代码源文件:
$ vim (kernel_dir)/arch/arm/mach-s5pc100/mach-smdkc100.c
2. 在结构体:
static struct platform_device \*smdkc100_devices[] __initdata = {
...
};
的定义后面添加如下代码:
static struct i2c_board_info i2c_devs0[] __initdata = {
{ I2C\_BOARD\_INFO("lm75", 0x90 >> 1 ), },
};
在函数smdkc100_machine_init中的
/\* i2c \*/
s3c\_i2c0\_set\_platdata(NULL);
s3c\_i2c1\_set\_platdata(NULL);
之后添加如下代码:
i2c\_register\_board\_info(0, i2c_devs0, ARRAY\_SIZE(i2c_devs0));
device tree移植
在相应的i2c设备子树中添加lm75a的节点
i2c@3000 {
lm75a@48 { +
compatible = "nxp,lm75a"; +
reg = <0x48>; +
}; +
rtc@68 {
compatible = "dallas,ds1339";
reg = <0x68>;
};
};
driver移植
执行make menuconfig
,在内核菜单中使用/
来搜索lm75
结果
找到lm75的驱动配置所在位置,进入配置后选择lm75温度传感器的驱动程序:
Location:
-> Device Drivers
-> Hardware Monitoring support (HWMON [=y])
-> <\*> National Semiconductor LM75 and compatibles
重新编译内核和设备树
$make uImage
$make p1020rdb-pd_32b.dtb
重新烧写u-boot或者kernel和设备树
使用tftp烧写。
linux下的lm75验证
sensors命令
sensors是linux下自动检测和读取传感器的命令
用手捂住lm75,温度会有变化。
测试程序验证
以下是测试程序源码,例程中也展示了sysfs接口的使用方法
#include <stdio.h>
#include <fcntl.h>
int main() {
int n, temp_int;
float temp_float;
char buf[10];
int fd = open("/sys/bus/i2c/devices/0-0048/temp1\_input", O_RDONLY);