=================================================================================================
因為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,便可以測試溫度了: