MQ-2烟雾气敏传感器模块在X210v3开发板上的驱动。

现在需要一个MQ-2烟雾气敏传感器模块的驱动。其检测烟雾超过一定的标准后,会返回一个不同的电平,和按键驱动差不多。

但是在编写驱动的时候,需要用GPH2_3号引脚。但是在内核中先ioremap地址然后配置,发现无法控制gpio,也无法进入中断。

后来发现,如果需要使用gpio,需要先申请,然后才能使用。

具体程序如下:

#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 <mach/gpio.h>

#define GPH2CON 0xE0200c60

#define GPH2DAT 0xE0200c64

static struct class *fog_class;     //创建类

static struct class_device *fog_class_devs;   //创建类对应的设备

struct work_struct *work1;

struct timer_list fogs_timer;

unsigned int *gpio_data;

unsigned int fog_num = 0;

wait_queue_head_t  fog_q;

void work1_func(struct work_struct *work)
{ mod_timer(&fogs_timer, jiffies + (HZ /10)); } void fogs_timer_function(unsigned long data)
{ unsigned int fog_val; fog_val = readw(gpio_data)&0x08;
if (fog_val == 0)
{ fog_num = 1; printk("press down\n"); } wake_up(&fog_q); } irqreturn_t fog_int(int irq, void *dev_id)
{ schedule_work(work1); //return 0; return IRQ_HANDLED; } void fog_hw_init()
{ unsigned int *gpio_config; unsigned short data; gpio_request(S5PV210_GPH2(3),"my_fog"); gpio_config = ioremap(GPH2CON,4); data = readw(gpio_config); data &= ~(0b1111<<12); data |= 0b1111<<12;
writew(data,gpio_config); gpio_data = ioremap(GPH2DAT,1); } int fog_open(struct inode *node,struct file *filp)
{
return 0;
} ssize_t fog_read(struct file *filp, char __user *buf, size_t size, loff_t *pos) { wait_event(fog_q,fog_num); // printk("in kernel :fog num is %d\n",fog_num); copy_to_user(buf, &fog_num, 4); fog_num = 0; return 4; } struct file_operations fog_fops = { .open = fog_open, .read = fog_read, }; struct miscdevice fog_miscdev = { .minor = 200, .name = "fog", .fops = &fog_fops, }; int major; static int fog_init() { int ret; major = register_chrdev( 0,"fog_drv", &fog_fops ); fog_class = class_create(THIS_MODULE,"fog_class"); fog_class_devs = device_create(fog_class,NULL,MKDEV(major,0),NULL,"my_fog"); if (ret !=0) printk("register fail!\n"); //×¢²áÖжώŠÀí³ÌÐò request_irq(IRQ_EINT(27),fog_int,IRQF_TRIGGER_FALLING,"fog",0); //°ŽŒü³õÊŒ»¯ fog_hw_init(); //. ŽŽœš¹€×÷ work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL); INIT_WORK(work1, work1_func); /* ³õÊŒ»¯¶šÊ±Æ÷ */ init_timer(&fogs_timer); fogs_timer.function = fogs_timer_function; /* ÏòÄÚºË×¢²áÒ»žö¶šÊ±Æ÷ */ add_timer(&fogs_timer); /*³õÊŒ»¯µÈŽý¶ÓÁÐ*/ init_waitqueue_head(&fog_q);
return 0; } static void fog_exit() { del_timer(&fogs_timer); unregister_chrdev( major, "fog_drv" ); device_unregister(fog_class_devs); class_destroy(fog_class); } module_init(fog_init); module_exit(fog_exit); MODULE_LICENSE("GPL");

Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动的更多相关文章

  1. Linux platform平台总线、平台设备、平台驱动

    平台总线(platform_bus)的需求来源? 随着soc的升级,S3C2440->S3C6410->S5PV210->4412,以前的程序就得重新写一遍,做着大量的重复工作, 人 ...

  2. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  3. Linux嵌入式学习-ds18b20驱动

    ds18b20的时序图如下: 复位时序: 读写时序: 以下是程序代码: #include <linux/module.h> #include <linux/init.h> #i ...

  4. 字符设备驱动程序--LED驱动

    编写驱动程序需要编写那些代码: 1.硬件相关的驱动程序 2.Makefile的编译程序 3.还需要编写一个相关的测试程序 比如说:一个摄像头驱动程序 1.驱动程序的编写,需要编写一些硬件相关的操作,编 ...

  5. Linux嵌入式学习-USB端口号绑定

    由于ubuntu USB设备号为从零开始依次累加,所以多个设备每次开机后设备号不固定,机器人每次开机都要蛋疼的按顺序插, 在网上找到一种方法:udev的规则 udev的规则说明,可以参考博客说明:ht ...

  6. Linux嵌入式学习-mount命令+nfs挂载失败原因【转】

    NFS 挂载失败原因[待搜集] 1.挂载时若出现mount.nfs: Input/output error 解决:在客户端也需启动portmap服务 service portmap status[查看 ...

  7. Linux嵌入式学习-交叉编译openssl

    利用arm-none-linux-gnueabi-gcc交叉编译openssl,生成静态库文件libcrypto.a ,libssl.a 1.从openssl官网下载openssl最新版本,我下载的是 ...

  8. Linux嵌入式学习-远程过程调用-Binder系统

    Binder系统的C程序使用示例IPC : Inter-Process Communication, 进程间通信RPC : Remote Procedure Call, 远程过程调用 这里我们直接只用 ...

  9. Linux嵌入式学习-网络配置-ping外网、主机和域名

    之前用的nfs挂载的文件系统,今天用yaffs2制作的文件系统并写入到nandflash中.但是网络却无法使用了. 首先,我们配置网卡. ifconfig eth0 192.168.1.230 bro ...

随机推荐

  1. JZOJ2020年8月10日提高组T3 玩诈欺的小杉

    JZOJ2020年8月10日提高组T3 玩诈欺的小杉 题目 Description 是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有\(N*M\)个有黑白棋的棋子(一面为黑,一面为白),一开始都是 ...

  2. 使用SpringSecurity Oauth2.0实现自定义鉴权中心

    Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...

  3. 一条 SQL 语句在 MySQL 中如何执行的

    一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...

  4. moviepy音视频剪辑:TextClip不支持中文字符以及OSError: magick.exe: unable to read font 仿宋_GB2312.ttf的解决办法

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的.对于编解码的问题 ...

  5. 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解

    一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...

  6. 定位方式 及CSS高级技巧

    定位 background-position 背景位置 浮动,在一个浮字上面,我们的定位,在一个位上.CSS离不开定位,特别是后面的JS特效,天天和定位打交道. 为什么要使用定位? 元素的定位属性 元 ...

  7. 使用 typescript 快速开发一个 cli

    cli 的全称 command-line interface(命令行界面),也就是前端同学常用的脚手架,比如 yo.vue cli.react cli 等. cli 可以方便我们快速创建项目,下图是引 ...

  8. 团队作业4-Day4

    团队作业4-Day4 项目git地址 1. 站立式会议 2. 项目燃尽图 3. 适当的项目截图 4. 代码/文档签入记录(部分) 5. 每人每日总结 吴梓华:完成了排位模式与练习模式的界面实现,整合代 ...

  9. MySQL锁:02.InnoDB锁

    目录 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式.显式锁 InnoDB锁类型 共享锁 排他锁 意向锁 InnoDB锁兼容性 InnoDB行锁范围.粒度 InnoDB行锁粒度一览 意向插 ...

  10. centos7下安装iostat命令

    [root@node01 yum.repos.d]# yum intall -y sysstat Loaded plugins: fastestmirror No such command: inta ...