ds18b20 linux 驱动,Linux嵌入式学习-ds18b20驱动

#include #include#include#include#include#include#include#include#include#include#include#include#include#include

#define GPH3_0CON 0xE0200C60

#define GPH3_0DAT 0xE0200C64

#define GPH3_0PUD 0xE0200C68unsignedint *gpio_config;

unsignedchar *gpio_data;

unsignedint *gpio_pud;static struct class *fog_class; //′′?¨àà

static struct class_device *fog_class_devs; //′′?¨àà??ó|μ?éè±?

intmajor;structmutex res_mutex;void Ds18b20_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);

}void DS18B20_OUT( unsigned charvalue)

{if( value == 1)

{

gpio_direction_output( S5PV210_GPH3(0), 1);

}else{

gpio_direction_output( S5PV210_GPH3(0), 0);

}

}

unsignedchar DS18B20_IN( void)

{

unsignedintpin_val;

gpio_direction_input( S5PV210_GPH3(0));

pin_val=readl(gpio_data);return pin_val&0x1;

}static void Init_DS18B20(void)

{

gpio_direction_output( S5PV210_GPH3(0), 1);

udelay(200);

gpio_direction_output( S5PV210_GPH3(0), 0);

udelay(600);

gpio_direction_output( S5PV210_GPH3(0), 1);

udelay(480);

}static void WriteCode(unsigned chardat)

{

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(100);

}else{

udelay(100);

gpio_direction_output( S5PV210_GPH3(0), 1);

udelay(3);

}

dat= dat>>1;

}

}static void Reset_DS18B20( void)

{

gpio_direction_output( S5PV210_GPH3(0), 0);

udelay(500);

gpio_direction_output( S5PV210_GPH3(0), 1);

udelay(480);

}static unsigned int ReadData(void)

{

unsignedintrec,data,i;

data= 0;for(i=0;i<16;i++)

{

gpio_direction_output( S5PV210_GPH3(0), 0);

udelay(5);

udelay(3);

rec=DS18B20_IN();

udelay(20);if(rec){

data|= 0x8000;

}else{

data&= 0x7fff;

}if(i<15)

data>>=1;

udelay(20);

gpio_direction_output( S5PV210_GPH3(0), 1);

udelay(5);

}return(data);

}int ds18b20_open(struct inode *node, struct file *filp)

{return 0;

}static int ds18b20_read(struct file * 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(100);

tem=DS18B20_IN();if(tem)

{

gpio_direction_output( S5PV210_GPH3(0), 1);

Reset_DS18B20();

WriteCode(0xcc);

WriteCode(0xbe);

ds_value=ReadData();

}else{

udelay(50);

ds_value= 0xaaaa;

}

mutex_unlock(&res_mutex);

copy_to_user(buffer,&ds_value, 4);return sizeofds_value;

}static struct file_operations ds18b20_fops ={

.open=ds18b20_open,

.read=ds18b20_read,

};static int Ds18b20_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;

}void Ds18b20_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");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值