The timing diagram for the DS18B20 is as follows:
Reset timing:
Read/write timing:
Here is the program code:
#include <linux/module.h>#include<linux/init.h>#include<linux/miscdevice.h>#include<linux/interrupt.h>#include<linux/io.h>#include<linux/fs.h>#include<linux/slab.h>#include<asm/irq.h>#include<linux/random.h>#include<linux/uaccess.h>#include<linux/device.h>#include<linux/delay.h>#include<mach/gpio.h>#include<linux/mutex.h>#defineGph3_0con 0XE0200C60#defineGph3_0dat 0XE0200C64#defineGph3_0pud 0xe0200c68unsignedint*gpio_config;unsignedChar*gpio_data;unsignedint*Gpio_pud;Static struct class*fog_class;//′′?¨ààStatic structClass_device *fog_class_devs;//′′?¨àà?? Ó|μ?éè±?intMajor;structMutex Res_mutex;voidDs18b20_pin_init (void) {unsignedintPin_val; Gpio_request (S5pv210_gph3 (0),"my_ds1802"); Gpio_config= Ioremap (Gph3_0con,4); Gpio_data= Ioremap (Gph3_0dat,1); Gpio_pud= Ioremap (Gph3_0pud,2); Pin_val=Readl (GPIO_PUD); Pin_val&=~ (0x0003); Pin_val|=0x2; Writel (PIN_VAL,GPIO_PUD); Pin_val=Readl (Gpio_data); Writel (Pin_val|0x1, Gpio_data);}voidDs18b20_out (unsignedCharvalue) { if(Value = =1) {gpio_direction_output (S5pv210_gph3 (0),1); } Else{gpio_direction_output (S5pv210_gph3 (0),0); }}unsignedCharDs18b20_in (void) {unsignedintPin_val; Gpio_direction_input (S5pv210_gph3 (0)); Pin_val=Readl (Gpio_data); returnpin_val&0x1;}Static voidInit_ds18b20 (void) {gpio_direction_output (S5pv210_gph3 (0),1); Udelay ( $); Gpio_direction_output (S5pv210_gph3 (0),0); Udelay ( -); Gpio_direction_output (S5pv210_gph3 (0),1); Udelay (480);}Static voidWritecode (unsignedChardat) {unsignedCharTemp,i; for(i=0;i<8; i++) {Temp= dat&0x01; Gpio_direction_output (S5pv210_gph3 (0),1); Udelay (2); Gpio_direction_output (S5pv210_gph3 (0),0); if(temp = =0x01) {Udelay (2); Gpio_direction_output (S5pv210_gph3 (0),1); Udelay ( -); }Else{Udelay ( -); Gpio_direction_output (S5pv210_gph3 (0),1); Udelay (3); } Dat= dat>>1; }}Static voidReset_ds18b20 (void) {gpio_direction_output (S5pv210_gph3 (0),0); Udelay ( -); Gpio_direction_output (S5pv210_gph3 (0),1); Udelay (480);}StaticUnsignedintReadData (void) {unsignedintRec,data,i; Data=0; for(i=0;i< -; i++) {gpio_direction_output (S5pv210_gph3 (0),0); Udelay (5); Udelay (3); Rec=ds18b20_in (); Udelay ( -); if(REC) {data|=0x8000; }Else{Data&=0x7fff; } if(i< the) Data>>=1; Udelay ( -); Gpio_direction_output (S5pv210_gph3 (0),1); Udelay (5); } return(data);}intDs18b20_open (structInode *node,structFile *Filp) { return 0;}Static intDs18b20_read (structFile * file,Char* Buffer, size_t count, loff_t *PPOs) { inttem; intDs_value; Mutex_lock_interruptible (&Res_mutex); Ds18b20_pin_init (); Init_ds18b20 (); Writecode (0XCC); Writecode (0x44); Gpio_direction_input (S5pv210_gph3 (0)); Udelay ( -); TEM=ds18b20_in (); if(TEM) {gpio_direction_output (S5pv210_gph3 (0),1); Reset_ds18b20 (); Writecode (0XCC); Writecode (0xBE); Ds_value=ReadData (); }Else{Udelay ( -); Ds_value=0xaaaa; } mutex_unlock (&Res_mutex); Copy_to_user (Buffer,&ds_value,4); return sizeofDs_value;}Static structFile_operations Ds18b20_fops ={. Open=Ds18b20_open,. Read=Ds18b20_read,};Static intDs18b20_init (void) {Major= Register_chrdev (0,"Ds18b20_drv", &ds18b20_fops); Fog_class= Class_create (This_module,"Ds18b20_class"); Fog_class_devs= Device_create (Fog_class,null,mkdev (Major,0), NULL,"my_ds1802"); Mutex_init (&Res_mutex); PRINTK ("Install module successed\n"); return 0;}voidDs18b20_exit (void) {Unregister_chrdev (major,"Ds18b20_drv" ); Device_unregister (Fog_class_devs); Class_destroy (Fog_class);} Module_init (Ds18b20_init); Module_exit (Ds18b20_exit); Module_license ("GPL");
Linux Embedded Learning-ds18b20 driver