DS18B20 Linux驱动程序 基于AT91SAM9260(二)

2014-11-24 08:42:19 ? 作者: ? 浏览: 4
rite_byte(TEMP_CONVET); /*start temperature convertion*/



//mdelay(1);


//ds18b20_set_input(index);


//mdelay(1);


mdelay(800);



ds18b20_reset();


ds18b20_write_byte(SKIP_ROM); /*skip ROM operation*/


ds18b20_write_byte(READ_TEMP); /*start read temperature*/


data[0]=ds18b20_read_byte();


data[1]=ds18b20_read_byte();


printk("%x,%x \n",data[1],data[0]);


ds18b20_set_output(HIGH);


return 0;


}


static int ds18b20_open(struct inode * s_node,struct file * s_file)


{


return 0;


}


static ssize_t ds18b20_read(struct file *DS1820_file,char * buf, size_t count, loff_t * l)


{


ds18b20_read_temp();


buf[0] = data[0];


buf[1] = data[1];



return 0;


}


struct file_operations ds18b20_fops =


{


.owner = THIS_MODULE,


.open=ds18b20_open,


.read=ds18b20_read,


};


struct class *myclass ;


static int __init ds18b20_init(void)


{


int ret;


ret = register_chrdev(char_major,DEV_NAME, &ds18b20_fops);


myclass = class_create(THIS_MODULE,DEV_NAME);


device_create(myclass, NULL, MKDEV(char_major, 0), NULL, DEV_NAME);



if(ret<0)


{


printk(KERN_ALERT "DS18b20 REG FAIL!\n");


}


else


{


printk(KERN_ALERT "MAJOR = %d\n",char_major);


}


printk(KERN_INFO "Temperature Sensor Driver For ds18b20\n");


ds18b20_reset();



return ret;


}


static void __exit ds18b20_exit(void)


{


unregister_chrdev(char_major,DEV_NAME);


class_destroy(myclass);


printk(KERN_INFO PFX "ds18b20 dirver removed\n");


}


module_init(ds18b20_init);


module_exit(ds18b20_exit);


MODULE_AUTHOR("St.Dickens");


MODULE_DESCRIPTION("temperature sensor driver for ds18b20");


MODULE_LICENSE("Dual BSD/GPL");


===================================makefile========================================


# Makefile2.6


ifneq ($(KERNELRELEASE),)


#kbuild syntax. dependency relationshsip of files and target modules are listed here.


obj-m := ds18b20.o


else


PWD := $(shell pwd)


KVER = 2.6.27


KDIR := /home/dickens/linux-2.6.27


all:


$(MAKE) -C $(KDIR) M=$(PWD) modules


clean:


rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions


endif


==============================随便写了个测试程序=======================================


#include "stdio.h"


#include "sys/types.h"


#include "sys/ioctl.h"


#include "stdlib.h"


#include "termios.h"


#include "sys/stat.h"


#include "fcntl.h"


#include "sys/time.h"


#define DEV_NAME "/dev/ds18b20"


void delay(unsigned int time)


{


while(time>0)


time--;


}


int main()


{


int fd;


unsigned char buf[2];


float result;


int times=5;


//打开设备文件


fd=open(DEV_NAME,O_RDWR | O_NDELAY | O_NOCTTY);


if(fd<0)


{


printf("Open Device Fail!\n");


return -1;


}


//读取当前设备数值


else


{


printf("OPEND!\n");


}


while(times>0)


{


read(fd, buf, 1);


result = (float)buf[0];


result /= 16;


result += ((float)buf[1] * 16);


printf("%.1f `C\r\n", result);


times--;


sleep(5);


}


close(fd);


}


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: