Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动

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");

    //×¢2á?D????àí3ìDò

    request_irq(IRQ_EINT(27),fog_int,IRQF_TRIGGER_FALLING,"fog",0);

    //°??ü3?ê??ˉ

    fog_hw_init();

    //. ????1€×÷

    work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

    INIT_WORK(work1, work1_func);

    /* 3?ê??ˉ??ê±?÷ */

    init_timer(&fogs_timer);

    fogs_timer.function  = fogs_timer_function;

    /* ?ò?úo?×¢2áò?????ê±?÷ */

    add_timer(&fogs_timer);

    /*3?ê??ˉμè?y?óáD*/

    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");
时间: 2024-11-08 23:47:35

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

Linux嵌入式驱动学习之路⑩字符设备驱动-my_led

首先贴上代码: 字符设备驱动代码: /** *file name: led.c */#include <linux/sched.h> #include <linux/signal.h> #include <linux/spinlock.h> #include <linux/errno.h> #include <linux/random.h> #include <linux/poll.h> #include <linux/init

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

文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键,打印键值: 目录 概要 poll机制 异步通知 同步互斥阻塞 定时器防抖 概要: 查询方式: 12-3 缺点:占用CPU99%的资源.中断方式:12-4 缺点:调用read函数后如果没有按键按下,该函数永远不会结束,一直在等待按键按下. 优点:使用到了休眠机制,占用cpu资源极少.poll机制: 1

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>

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

Binder系统的C程序使用示例IPC : Inter-Process Communication, 进程间通信RPC : Remote Procedure Call, 远程过程调用 这里我们直接只用android系统中已经实现好的Bindrt系统. 具体源代码在 frameworks\native\cmds\servicemanager\目录下. service_manager.c :a. binder_openb. binder_become_context_managerc. binder

linux字符设备驱动

一.字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系. 如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获

深入浅出~Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备

【转】深入浅出:Linux设备驱动之字符设备驱动

深入浅出:Linux设备驱动之字符设备驱动 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称

Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备. 应用程序调用的流程框图: 三种设备的定义分别如下, 字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行.字符设备是面向流的设备,常见的字符设备如鼠标.键盘.串口.控制台.LED等. 块设备:是指可以从设备的任意位置读取一定长度的数据设备.块设备如硬盘.磁盘.U盘和SD卡等存储设备. 网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现.应用程序不能直接访

Linux字符设备驱动注册流程

其中一部分从伯乐在线和网络上摘抄的内容,不用于商业用途. 一.linux系统将设备分为3类:字符设备.块设备.网络设备. 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/d ev目录下对应一个设备文件.linux用户程序通过设备文件(或