当前位置:编程学习 > C/C++ >>

mini2440 驱动ds18b20

今天下午闲着蛋疼,看鸟哥实在看不进去,想着有个ds18b20,于是就写了一个18b20的驱动。是在mini2440上面实现的。
 
         ldd3的易做图说得好,linux驱动应该尽可能多的提供机制,而不是提供策略。我觉得说得太有道理了。驱动本身就不应该涉及到太多策略问题,策略问题应该尽可能多的由应用程序去提供。作为驱动,应该尽可能多得去实现提供硬件的功能,然后留出接口给上面的应用程序调用。
 
         其实ds18b20驱动比较简单,无非就是在单片机驱动18b20的基础上,家里一个字符驱动设备的外套。下面直接上代码吧。
 
         
 
         驱动代码:
 
[cpp] 
#include <linux/init.h>   
#include <linux/module.h>   
#include <linux/delay.h>   
#include <linux/kernel.h>   
#include <linux/moduleparam.h>   
#include <linux/init.h>   
#include <linux/types.h>   
#include <linux/fs.h>   
#include <mach/regs-gpio.h>   
#include <mach/hardware.h>   
#include <linux/cdev.h>   
#include <asm/uaccess.h>   
#include <linux/errno.h>   
#include <linux/gpio.h>   
#include <linux/device.h> //自动创建设备需要此头文件   
  
#define DQ     S3C2410_GPF(3)      //mini2440里面是这样定义GPIO的   
#define DQ_IN  S3C2410_GPIO_INPUT  //设置DQ为输入   
#define DQ_OUT S3C2410_GPIO_OUTPUT //设置DQ为输入   
  
#define D_MAJOR 0                  //定义主设备号   
#define D_MINOR 0                  //定义从设备号   
#define DEV_NAME "ds18b20"         //定义设备名   
  
static int ds18b20_major = D_MAJOR;//ds18b20主设备号   
static int ds18b20_minor = D_MINOR;//ds18b20从设备号   
static struct class *my_class;     //定义class,用于自动挂载设备   
static struct class_device *my_device; //自动挂载设备   
  
static struct ds18b20_dev{           //放在一个结构体中            
    struct cdev cdev;                //这个结构体比较简单,但是建议以后将用户的东西都放在一个结构体中   
};  
  
struct ds18b20_dev *ds18b20_devp;  
  
void ds18b20_reset(void)             //重启ds18b20   
{  
    s3c2410_gpio_cfgpin(DQ, DQ_OUT); //设置为输出   
    s3c2410_gpio_pullup(DQ, 0);      //设置下拉   
    s3c2410_gpio_setpin(DQ, 0);      //拉低总线   
    udelay(500);                     //需要将总线拉低480~950us   
    s3c2410_gpio_setpin(DQ, 1);      //释放总线   
    udelay(60);                      //DS18B20拉低信号,60~240us表示应答   
    s3c2410_gpio_cfgpin(DQ, DQ_IN);  //读入DS18B20拉低信号   
    while(s3c2410_gpio_getpin(DQ));  //等待DS18B20应答   
    while(!s3c2410_gpio_getpin(DQ)); //等待DS18B20释放总线       
}  
  
void write_ds18b20(unsigned char Data)           //写命令到ds18b20   
{     
    unsigned char i;  
    s3c2410_gpio_cfgpin(DQ, DQ_OUT);              //设置为输出   
    s3c2410_gpio_pullup(DQ, 1);                   //上拉       
    for(i=0;i<8;i++){  
        s3c2410_gpio_setpin(DQ, 0);              //拉低总线   
        udelay(10);                              //需要拉低10~15us   
   
        if(Data&0x01)  
            s3c2410_gpio_setpin(DQ, 1);  
        else  
            s3c2410_gpio_setpin(DQ, 0);  
        udelay(40);                             //需要拉低20~40us来写0   
        s3c2410_gpio_setpin(DQ, 1);            //释放总线   
        udelay(1);                            //稍微延时   
        Data >>= 1;          
    }  
}  
  
static unsigned char read_ds18b20(void)    //读ds18b20   
{  
    unsigned char Temp=0,i;  
    for(i=0;i<8;i++){  
        Temp >>= 1;  
        s3c2410_gpio_cfgpin(DQ, DQ_OUT);  //DQ为输出状态   
        s3c2410_gpio_setpin(DQ, 0);       //拉低总线,启动输入   
        udelay(1);                        //拉低总线约1us   
        s3c2410_gpio_setpin(DQ, 1);       //释放总线   
        s3c2410_gpio_cfgpin(DQ, DQ_IN);   //DQ为输入状态   
        if(s3c2410_gpio_getpin(DQ))  
          Temp |= 0x80;  
        udelay(45);      //延时45us   
    }  
    return Temp;  
}  
  
static int ds18b20_open(struct inode *inode,struct file *filp)  
{  
    filp->private_data = ds18b20_devp;  
    ds18b20_reset();  
    printk(KERN_NOTICE "open ds18b20 successful\n");  
    return 0;  
}  
  
static ssize_t ds18b20_read(struct file *filp,char __user *buf,size_t size,loff_t *ppos)  
{  
    unsigned long err;  
    struct ds18b20_dev *dev = filp->private_data;  
  &
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,