主题 : 我有一DS18B20探头驱动程序看不懂,求高手指教 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 65870
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
贡献值: 0 点
综合积分: 4 分
注册时间: 2012-03-23
最后登录: 2012-04-11
楼主  发表于: 2012-04-11 19:52

 我有一DS18B20探头驱动程序看不懂,求高手指教

/************************* TQ2410_ds18b20.c文件开始 **************************/
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <linux/autoconf.h>
#include <linux/module.h>


typedef unsigned char BYTE;

#define DS18B20_PIN S3C2410_GPF4
#define DS18B20_PIN_OUTP S3C2410_GPF4_OUTP
#define DS18B20_PIN_INP S3C2410_GPF4_INP
#define HIGH 1
#define LOW 0
#define DEV_NAME "DS18B20"
#define DEV_MAJOR 232
static BYTE data[2];

MODULE_AUTHOR("sunrise");
MODULE_LICENSE("Dual BSD/GPL");
BYTE DS18b20_reset (void)
{

s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);

s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
udelay(100);


s3c2410_gpio_setpin(DS18B20_PIN, LOW);
udelay(600);


s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
udelay(100);


s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);

if(s3c2410_gpio_getpin(DS18B20_PIN)){ printk("DS18b20 reset failed.\r\n"); return 1;}

return 0;
}


void DS18b20_write_byte (BYTE byte)
{
BYTE i;
s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);

for (i = 0; i < 8; i++)
{
s3c2410_gpio_setpin(DS18B20_PIN, LOW); udelay(1);
if(byte & HIGH)
{
s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
}
else
{
// s3c2410_gpio_setpin(DS18B20_PIN, LOW);
}
udelay(60);

s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
udelay(15);

byte >>= 1;
}
s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
}

BYTE DS18b20_read_byte (void)
{
BYTE i = 0;
BYTE byte = 0;
for (i = 0; i < 8; i++)
{
s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);
s3c2410_gpio_setpin(DS18B20_PIN, LOW);

udelay(1);
byte >>= 1;

s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);

if (s3c2410_gpio_getpin(DS18B20_PIN)) byte |= 0x80;
udelay(60);
}
return byte;
}

void DS18b20_proc(void)
{
while(DS18b20_reset());

udelay(120);

DS18b20_write_byte(0xcc);
DS18b20_write_byte(0x44);

udelay(5);

while(DS18b20_reset());
udelay(200);

DS18b20_write_byte(0xcc);
DS18b20_write_byte(0xbe);

data[0] = DS18b20_read_byte();
data[1] = DS18b20_read_byte();
}

static ssize_t s3c2440_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
DS18b20_proc();

buf[0] = data[0];
buf[1] = data[1];

return 1;
}

static struct file_operations s3c2440_18b20_fops =
{
.owner = THIS_MODULE,
.read = s3c2440_18b20_read,
};

static int __init s3c2440_18b20_init(void)
{
if (register_chrdev(DEV_MAJOR, DEV_NAME, &s3c2440_18b20_fops) < 0)
{
printk(DEV_NAME ": Register major failed.\r\n");
return -1;
}

//devfs_mk_cdev(MKDEV(DEV_MAJOR, 0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEV_NAME);

while(DS18b20_reset());
}

static void __exit s3c2440_18b20_exit(void)
{
//devfs_remove(DEV_NAME);
unregister_chrdev(DEV_MAJOR, DEV_NAME);
}
module_init(s3c2440_18b20_init);
module_exit(s3c2440_18b20_exit);



级别: 新手上路
UID: 69004
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2012-04-29
最后登录: 2012-06-07
1楼  发表于: 2012-04-29 22:00
很简单的驱动程序啊!看这本书 http://product.dangdang.com/product.aspx?product_id=20169737