mini2440 驱动ds18b20

发布者:superstar11最新更新时间:2024-06-24 来源: elecfans关键字:mini2440  驱动ds18b20 手机看文章 扫描二维码
随时随地手机看文章

想着有个ds18b20,于是就写了一个18b20的驱动。是在mini2440上面实现的。

ldd3的大师说得好,linux驱动应该尽可能多的提供机制,而不是提供策略。我觉得说得太有道理了。驱动本身就不应该涉及到太多策略问题,策略问题应该尽可能多的由应用程序去提供。作为驱动,应该尽可能多得去实现提供硬件的功能,然后留出接口给上面的应用程序调用。

其实ds18b20驱动比较简单,无非就是在单片机驱动18b20的基础上,家里一个字符驱动设备的外套。下面直接上代码吧。

驱动代码:

  1. #include    

  2. #include    

  3. #include    

  4. #include    

  5. #include    

  6. #include    

  7. #include    

  8. #include    

  9. #include    

  10. #include    

  11. #include    

  12. #include    

  13. #include    

  14. #include    

  15. #include  //自动创建设备需要此头文件   

  16.   

  17. #define DQ     S3C2410_GPF(3)      //mini2440里面是这样定义GPIO的   

  18. #define DQ_IN  S3C2410_GPIO_INPUT  //设置DQ为输入   

  19. #define DQ_OUT S3C2410_GPIO_OUTPUT //设置DQ为输入   

  20.   

  21. #define D_MAJOR 0                  //定义主设备号   

  22. #define D_MINOR 0                  //定义从设备号   

  23. #define DEV_NAME 'ds18b20'         //定义设备名   

  24.   

  25. static int ds18b20_major = D_MAJOR;//ds18b20主设备号   

  26. static int ds18b20_minor = D_MINOR;//ds18b20从设备号   

  27. static struct class *my_class;     //定义class,用于自动挂载设备   

  28. static struct class_device *my_device; //自动挂载设备   

  29.   

  30. static struct ds18b20_dev{           //放在一个结构体中            

  31.     struct cdev cdev;                //这个结构体比较简单,但是建议以后将用户的东西都放在一个结构体中   

  32. };  

  33.   

  34. struct ds18b20_dev *ds18b20_devp;  

  35.   

  36. void ds18b20_reset(void)             //重启ds18b20   

  37. {  

  38.     s3c2410_gpio_cfgpin(DQ, DQ_OUT); //设置为输出   

  39.     s3c2410_gpio_pullup(DQ, 0);      //设置下拉   

  40.     s3c2410_gpio_setpin(DQ, 0);      //拉低总线   

  41.     udelay(500);                     //需要将总线拉低480~950us   

  42.     s3c2410_gpio_setpin(DQ, 1);      //释放总线   

  43.     udelay(60);                      //DS18B20拉低信号,60~240us表示应答   

  44.     s3c2410_gpio_cfgpin(DQ, DQ_IN);  //读入DS18B20拉低信号   

  45.     while(s3c2410_gpio_getpin(DQ));  //等待DS18B20应答   

  46.     while(!s3c2410_gpio_getpin(DQ)); //等待DS18B20释放总线       

  47. }  

  48.   

  49. void write_ds18b20(unsigned char Data)           //写命令到ds18b20   

  50. {     

  51.     unsigned char i;  

  52.     s3c2410_gpio_cfgpin(DQ, DQ_OUT);              //设置为输出   

  53.     s3c2410_gpio_pullup(DQ, 1);                   //���拉       

  54.     for(i=0;i<8;i++){  

  55.         s3c2410_gpio_setpin(DQ, 0);              //拉低总线   

  56.         udelay(10);                              //需要拉低10~15us   

  57.    

  58.         if(Data&0x01)  

  59.             s3c2410_gpio_setpin(DQ, 1);  

  60.         else  

  61.             s3c2410_gpio_setpin(DQ, 0);  

  62.         udelay(40);                             //需要拉低20~40us来写0   

  63.         s3c2410_gpio_setpin(DQ, 1);            //释放总线   

  64.         udelay(1);                            //稍微延时   

  65.         Data >>= 1;          

  66.     }  

  67. }  

  68.   

  69. static unsigned char read_ds18b20(void)    //读ds18b20   

  70. {  

  71.     unsigned char Temp=0,i;  

  72.     for(i=0;i<8;i++){  

  73.         Temp >>= 1;  

  74.         s3c2410_gpio_cfgpin(DQ, DQ_OUT);  //DQ为输出状态   

  75.         s3c2410_gpio_setpin(DQ, 0);       //拉低总线,启动输入   

  76.         udelay(1);                        //拉低总线约1us   

  77.         s3c2410_gpio_setpin(DQ, 1);       //释放总线   

  78.         s3c2410_gpio_cfgpin(DQ, DQ_IN);   //DQ为输入状态   

  79.         if(s3c2410_gpio_getpin(DQ))  

  80.           Temp |= 0x80;  

  81.         udelay(45);      //延时45us   

  82.     }  

  83.     return Temp;  

  84. }  

  85.   

  86. static int ds18b20_open(struct inode *inode,struct file *filp)  

  87. {  

  88.     filp->private_data = ds18b20_devp;  

  89.     ds18b20_reset();  

  90.     printk(KERN_NOTICE 'open ds18b20 successfuln');  

  91.     return 0;  

  92. }  

  93.   

  94. static ssize_t ds18b20_read(struct file *filp,char __user *buf,size_t size,loff_t *ppos)  

  95. {  

  96.     unsigned long err;  

  97.     struct ds18b20_dev *dev = filp->private_data;  

  98.     unsigned char result[2] = {0x00, 0x00};       //这个是用来存放从ds18b20读到的值   

  99.     ds18b20_reset();                              //reset ds18b20   

  100.     write_ds18b20(0xCC);                          //跳过ROM   

  101.     write_ds18b20(0x44);                          //温度转换   

  102.     ds18b20_reset();                              //reset ds18b20   

  103.     write_ds18b20(0xCC);                          //跳过ROM   

[1] [2]
关键字:mini2440  驱动ds18b20 引用地址:mini2440 驱动ds18b20

上一篇:mini2440 编译U-Boot-1.1.6遇到的一些问题
下一篇:U-Boot-2011.03移植nandflash到mini2440

推荐阅读最新更新时间:2024-11-07 22:31

Mini2440通过GPIO驱动LED
以下是驱动的源码。 #includelinux/config.h//配置头文件 #includelinux/kernel.h//用于调用kmalloc和kfree #includelinux/sched.h//调度,进程睡眠,唤醒,中断申请,中断释放 #includelinux/timer.h/ #includelinux/init.h//用户定义模块初始函数名需引用的头文件 #includelinux/module.h #includeasm/hardware.h #includeasm/arch/S3C2440.h #defineDEVICE_NAMEquot;ledsquot; staticunsignedlongled_t
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(五)---激活RTC驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在初始化文件中加入RTC 设备结构 Linux-2.6.32.2 内核对24
[单片机]
mini2440裸机DMA(1)
第8章 直接存储器存取DMA 在DMA章接种一共有四个通道的DMA源,而每一种源由包括9个寄存器。则我们只需要配置好久个寄存器就可以操作好DMA了。 这里主要以通道0位讲解 第一个寄存器 DISRC pDMA- DISRC=srcAddr; //设置源地址 第二个 寄存器DISRCC pDMA- DISRCC=(0 1)|(0 0); //设置源控制寄存器 inc,AHB 第三个寄存器 DIDST pDMA- DIDST=dstAddr; //设置目的地址 第4个寄存器 DIDSTC0 pDMA- DIDSTC=(0 1)|(0 0); //设置目的控制寄存器 inc,AHB
[单片机]
<font color='red'>mini2440</font>裸机DMA(1)
u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(3)
根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动 【1】增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分 用gedit打开cpu/arm920t/start.S,定位到134行附近,如下代码 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) /* turn off the watchdog */ 由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,修改后代码如下: #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) |
[单片机]
u-boot-2009.08在<font color='red'>mini2440</font>上的移植(一)---建立<font color='red'>mini2440</font>工程环境(3)
DS18B20的51单片机驱动源代码
#include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit duan=P0^0; sbit wei=P0^1; //#define DQ RC1 //#define DQ_HIGH() TRISC1=1 //#define DQ_LOW() TRISC1=0;DQ=0 //__CONFIG(0x3B31); sbit DQ=P1^3; //const uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, // 0x07,0x7f,0
[单片机]
一起学mini2440裸机开发(九)--ARM中断控制系统
ARM处理器程序的执行流程种类 ●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。这一过程描述了应用程序顺序执行的状态。 ●跳转执行:通过B、BL跳转执行,实现程序在一定范围内的跳转执行。这一过程描述了ARM处理器程序执行过程中的过程调用。 ●中断处理:在应用程序执行过程中,发生中断后,ARM处理器在执行完当前指令后,跳转到上述中断对应的中断处理程序处去执行,执行完中断处理程序后,再返回到发生中断的指令的下一条执行处接着执行。这一过程描述了ARM处理器对异常中断的响应情况。 S3C2440中断系统概述 在ARM处理器运行过程中,需要与系统的各类外部设备进行通信,包括发出控制信息、读取外部设备的状态信
[单片机]
一起学<font color='red'>mini2440</font>裸机开发(九)--ARM中断控制系统
MINI2440启动配置文件/etc/init.d/rcS文件分析
Mini2440启动配置文件说明 对于mini2440,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。 由于默认的内核命令行上有init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox本身。这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数
[单片机]
【重温经典】mini2440驱动程序之LED驱动(基于Linux-2.6.32.2)
一、LED资源介绍 1、LED对应的GPIO(已上拉) LED1 nLED1 GPB5 LED2 nLED2 GPB6 LED3 nLED3 GPB7 LED4 nLED4 GPB8 2、硬件电路 二、驱动代码(mini2440_leds.c) 以混杂设备注册,主要实现了ioctl接口,应用程序操作时,只需要打开这个设备文件,然后发一个ioctl的命令就会进入到内核空间,接着调用该驱动的ioctl函数来设置相应的状态。 (1)、设置GPIO为输出模式 for (i = 0; i 4; i++) { s3c2410_gpio_cfgpin(led_table ,
[单片机]
【重温经典】<font color='red'>mini2440</font><font color='red'>驱动</font>程序之LED<font color='red'>驱动</font>(基于Linux-2.6.32.2)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved