Linux Embedded Learning-ds18b20 driver

Source: Internet
Author: User

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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.