Linux嵌入式学习-ds18b20驱动
ds18b20的时序图如下:
复位时序:
读写时序:
以下是程序代码:
#include <linux/module.h> #include <linux/init.h> #include <linux/miscdevice.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/fs.h> #include <linux/slab.h> #include <asm/irq.h> #include <linux/random.h> #include <linux/uaccess.h> #include <linux/device.h> #include <linux/delay.h> #include <mach/gpio.h> #include <linux/mutex.h> #define GPH3_0CON 0xE0200C60 #define GPH3_0DAT 0xE0200C64 #define GPH3_0PUD 0xE0200C68 unsigned int *gpio_config; unsigned char *gpio_data; unsigned int *gpio_pud; static struct class *fog_class; //´´½¨Àà static struct class_device *fog_class_devs; //´´½¨Àà¶ÔÓ¦µÄÉ豸 int major; struct mutex res_mutex; void Ds18b20_Pin_Init(void) { unsigned int pin_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 char value) { if( value == 1) { gpio_direction_output( S5PV210_GPH3(0), 1); } else { gpio_direction_output( S5PV210_GPH3(0), 0); } } unsigned char DS18B20_IN( void ) { unsigned int pin_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 char dat) { unsigned char temp,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) { unsigned int rec,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) { int tem; int ds_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 sizeof ds_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");
Linux嵌入式学习-ds18b20驱动的更多相关文章
- Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动
MQ-2烟雾气敏传感器模块在X210v3开发板上的驱动. 现在需要一个MQ-2烟雾气敏传感器模块的驱动.其检测烟雾超过一定的标准后,会返回一个不同的电平,和按键驱动差不多. 但是在编写驱动的时候,需要 ...
- Linux嵌入式学习-mount命令+nfs挂载失败原因【转】
NFS 挂载失败原因[待搜集] 1.挂载时若出现mount.nfs: Input/output error 解决:在客户端也需启动portmap服务 service portmap status[查看 ...
- Linux嵌入式学习-USB端口号绑定
由于ubuntu USB设备号为从零开始依次累加,所以多个设备每次开机后设备号不固定,机器人每次开机都要蛋疼的按顺序插, 在网上找到一种方法:udev的规则 udev的规则说明,可以参考博客说明:ht ...
- Linux嵌入式学习-交叉编译openssl
利用arm-none-linux-gnueabi-gcc交叉编译openssl,生成静态库文件libcrypto.a ,libssl.a 1.从openssl官网下载openssl最新版本,我下载的是 ...
- Linux嵌入式学习-远程过程调用-Binder系统
Binder系统的C程序使用示例IPC : Inter-Process Communication, 进程间通信RPC : Remote Procedure Call, 远程过程调用 这里我们直接只用 ...
- Linux嵌入式学习-网络配置-ping外网、主机和域名
之前用的nfs挂载的文件系统,今天用yaffs2制作的文件系统并写入到nandflash中.但是网络却无法使用了. 首先,我们配置网卡. ifconfig eth0 192.168.1.230 bro ...
- Linux嵌入式学习-Mplayer交叉编译-undefined reference to `clock_gettime' MPlayer
編譯Mplayera. 配置.configure# ./configure --host-cc=gcc --cc=arm-linux-gcc --target=arm --enable-static ...
- Linux嵌入式学习-交叉编译mplayer
http://bbs.gkong.com/archive.aspx?ID=286721
- Linux内核调用I2C驱动_驱动嵌套驱动方法
禁止转载!!!! Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于 ...
随机推荐
- 3D显微镜笔记
1. 三视图:能够正确反映物体长.宽.高尺寸的正投影工程图(主视图,俯视图,左视图三个基本视图)为三视图,这是工程界一种对物体几何形状约定俗成的抽象表达方式. 附上自己大二时候设计的减速器--设计了两 ...
- uniapp cli版本中如何引入scss?
一.安装依赖 npm i node-sass@4.14.1 sass-loader -D 二.在脚手架版本新建项目成功后,官方为我们准备了uni.scss文件,在这个里面写即可全局使用. ... 一. ...
- keil/MDK代码配色
个人配色方案,仅供参考.
- Flutter——Dart Extension扩展方法的使用
dart的extension方法可以给已经存在的类添加新的函数,通过extension我们可以封装一些常用方法,提高开发效率. 例一:扩展String 给string添加一个log打印方法 exten ...
- 老猿学5G:3GPP和中国移动5G计费架构概览
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿学5G这个专栏主要记录笔者因工作原因学习了解5G计费相关知识,文章按时间顺序循序渐进的介绍5G基础概念以及5G计费相关知识,该专栏前期已经完结, ...
- 第四十一章、PyQt显示部件:TextBrowser、CalendarWidget、LCDNumber、ProgressBar、Label、HorizontalLine和VerticalLine简介
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在Designer中,显示部件有Labe ...
- flask对数据库的外键 主键
近期一直在学flask框架,后悔当初没有好好学习数据库.一个外键的知识,真的是太....蓝瘦香菇 创建数据库 class Users(db.Model): __tablename__ = 'users ...
- css外边距重叠及避免方法
<html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...
- Tomcat 知识点总结
Tomcat 学习笔记.本文相关配置均为 tomcat8 下,其他版本可能略有不同.如有错误请多包涵. 架构 首先,看一下整个架构图 接下来简单解释一下. Server:服务器.Tomcat 就是一个 ...
- Algorithm homework 1
一.已知下列递推式: \[C(n)= \begin{cases} 1 & , & n = 1 \\ 2C(n/2) + n - 1& , & n \geq 2 \end ...