=================================================================================================
因为Linux内核3.0自带Dallas 1-wires设备驱动,路径为:drivers/w1,所以在写驱动之前我首先进行了内核自带的单总线设备通用驱动移植(其实主要原因是温度传感器是我自己刚刚焊接上去的,想确认下其能否正常工作);此类驱动为Master/Slave模式:Master目录下为主控制器驱动,我们用到的是w1-gpio.c;Slave目录下是从设备驱动,我们使用的DS18B20属于温度传感器,所以使用w1_therm.c这个驱动。w1-gpio.c是单总线的IO操作方法,用于模拟单总线时序;w1_therm.c是DS18B20的内部操作方法(读写寄存器),和IO时序无关;我们可以将驱动结构看成是将“w1_therm”挂接到“w1-gpio”总线上,由w1-gpio控制w1_therm工作。
=====================================================================================
一、在mach-smdk2440.c中添加对设备DS18B20的支持:
[leiyuxing@centos6 linux-3.0]$ vim ./arch/arm/mach-s3c2440/mach-smdk2440.c
246 #include <linux/w1-gpio.h>//加入w1-gpio.h头文件,以使用w1_gpio_platform_data结构体
247 #if 1
248 /* DS1820B add by leiyuxing 2016.8.22*/
249 static void w1_enable_external_pullup(int enable)
250 {
251 if(enable)
252 s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_UP);
253 else
254 s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_NONE);
255 }
256
257
258 static struct w1_gpio_platform_data ds18b20_w1_gpio = {
259 .pin = S3C2410_GPG(0),
260 .is_open_drain = 0,
261 .enable_external_pullup = w1_enable_external_pullup,
262 };
263
264
265 static struct platform_device s3c_ds18b20_device ={
266 .name = "w1-gpio",
267 .id = -1,
268 .dev = {
269 .platform_data = &ds18b20_w1_gpio,
270 },
271 };
272 #endif
273 static struct platform_device *smdk2440_devices[] __initdata = {
........
........
288 &s3c_ds18b20_device,//add by leiyuxing 2016.8.22
};
切记!!一定要把 platform_device s3c_ds18b20_device 的这些结构体定义放在smdk2440_devices前,否则编译时会一直出现未声明的错误!!!
说明:设备名称是“w1-gpio”,这个和w1-gpio.c驱动中的驱动名称一致,才能注册这个设备驱动。通过FL2440开发板底板原理图可以看到只用到了GPG(0)这个管脚。
好了我们接下来配置内核,支持W1-gpio和ds18b20驱动:
重新编译内核并在开发板上更新内核,启动target,便可以测试温度了:
当时测试到温度的时候发现室温有点高,特意去看了下空调,原来空调制冷模式开错了,哈哈!
但做这么多真正的意义在于我焊接的温度传感器是可以工作的,排除了硬件上的问题我就可以放心地写代码测试了!!
标签:温度传感器,ds18b20,platform,device,w1,驱动,S3C2440,gpio From: https://blog.51cto.com/u_15834920/5767594