1. Linux混杂设备驱动模型

① 在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有混杂设备形成一个链表,对设备访问时内核根据次设备号查找相应的混杂设备。

② Linux中使用struct miscdevice来描述混杂设备

struct miscdevice  {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
};

③ Linux中使用misc_register函数来注册一个混杂设备驱动

int misc_register(struct miscdevice * misc)

④ Linux中使用misc_deregister函数来注销一个混杂设备驱动

int misc_deregister(struct miscdevice *misc)

2. Linux按键设备驱动

① request_irq函数用于注册中断

int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_reg*), unsigned long flags, const char* devname, void* dev_id);

(1)irq:中断号

(2)handler:中断处理函数

(3)flags:与中断管理有关的各种选项

(4)devname :设备名

(5)dev_id:共享中断是使用,区分不同中断

(6)返回0表示成功,或者返回一个错误码

② 在flags参数中,可以选择一些与中断管理有关的选项

(1)IRQF_DESABLED(SA_INTERRUPT):如果改位置位,表示是一个“快速”中断处理程序;如果没有置位该位,是一个“慢速”中断处理程序

(2)IRQF_SHARED(SA_SHIRQ):该位表明中断号是被多个中断源共享的

③ 快、慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF位)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务

④ 中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

(1)不能使用可能引起阻塞的函数

(2)不能使用可能引起调度的函数

⑤ 当设备不再需要使用中断时(通常在卸载驱动时),应当把它注销,使用函数:

void free_irq(unsigned int irq, void* dev_id);

⑥ 进程上下文和中断上下文

(1)进程上下文:用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器的值、变量等。所谓的“进程上下文”,可以看做是用户传递给内核的这些参数以及内核要保存的那一整套变量和寄存器的值以及当时的环境。

(2)中断上下文:用户通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实可以看做就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)

⑦ Linux按键设备驱动简单示例

#include <linux/module.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/io.h> #define GPGCON 0x56000060 irqreturn_t key_int(int irq, void *dev_id)
{
//1. 检测是否发生了按键中断 //2. 清除已经发生的按键中断 //3. 打印按键值
printk("key down!\n"); return 0;
} void key_hw_init(void)
{
unsigned short data;
unsigned int *gpio_config; gpio_config = ioremap(GPGCON, 4); data = readw(gpio_config);
data &= ~0b11;
data |= 0b10; writew(data, gpio_config);
} int key_open(struct inode *node, struct file *filp)
{
return 0;
} struct file_operations key_fops =
{
.open = key_open,
}; struct miscdevice key_miscdev = {
.minor = 200,
.name = "Mini2440Key",
.fops = &key_fops,
}; static int button_init(void)
{
misc_register(&key_miscdev); //按键硬件初始化
key_hw_init(); //注册中断处理程序
request_irq(IRQ_EINT8, key_int, IRQF_TRIGGER_LOW, "Mini2440Key", 0); return 0;
} static void button_exit(void)
{
free_irq(IRQ_EINT8, 0);
  misc_deregister(&key_miscdev);
} module_init(button_init);
module_exit(button_exit);

Linux混杂设备驱动的更多相关文章

  1. Linux混杂设备驱动学习

    Linux混杂设备是字符设备的一类,主要是混杂设备拥有相同的主设备号(10),但是次设备号是不同的.所有的混杂设备行程一个链表,对设备访问时内核更据次设备号查找到相应的混杂设备. 混杂设备用struc ...

  2. linux 混杂设备驱动之adc驱动

    linux2.6.30.4中,系统已经自带有了ADC通用驱动文件---arch/arm/plat-s3c24xx/adc.c,它是以平台驱动设备模型的架构来编写的,里面是一些比较通用稳定的代码,但是l ...

  3. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  4. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  5. 深入理解Linux字符设备驱动

    文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...

  6. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  7. Smart210学习记录----beep linux字符设备驱动

    今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...

  8. Linux块设备驱动详解

    <机械硬盘> a:磁盘结构 -----传统的机械硬盘一般为3.5英寸硬盘,并由多个圆形蝶片组成,每个蝶片拥有独立的机械臂和磁头,每个堞片的圆形平面被划分了不同的同心圆,每一个同心圆称为一个 ...

  9. linux lcd设备驱动剖析四

    在"linux lcd设备驱动剖析二"文章中,我们详细分析了s3c24xxfb_probe函数. 文章链接:http://blog.csdn.net/lwj103862095/ar ...

随机推荐

  1. linq to object 未完待续

    1.linq to string string s2 = "abc"; var data2 = s2.Where(x => x.CompareTo('a') > 0). ...

  2. 黑盒测试实践--Day7 12.1

    黑盒测试实践--Day7 12.1 今天完成任务情况: 录制小组作业中的自动化测试工具实践视频 汇总大家提交的各种作业模块,打包完成小组共同作业 小组成员完成个人情况说明后在截止时间前分别提交作业 小 ...

  3. [GO]给导入包起别名

    package main import io "fmt" //引用fmt这个包时,名字重命名为io import _ "os" //引用os这个包,但是不调用, ...

  4. 分享一个好用的功能强大的节点树jQuery插件

    http://www.treejs.cn/

  5. javascrip总结12:逻辑运算符与等号运算符

    1 逻辑运算符 逻辑运算的结果只有true 或者 false. 1.1 与&&: 两个表达式为true的时候,结果为true. 1.2 或|| 只要有一个表达式为true,结果为tru ...

  6. 挂载ISO 和 KILL 掉占用进程

    mount -t iso9660 -o loop,user VMware-tools-linux-8.6.0-425873.iso /mnt/cdrom fuser -m -v -i -k  /mnt ...

  7. 简单工厂(Simple Factory)模式

    工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...

  8. 数组Byte [] 和 string 相互转换

    using System; using System.Collections.Generic; using System.Text; namespace NET.MST.Fourth.StringBy ...

  9. HBase优化实战

    本文来自网易云社区. 背景 Datastream一直以来在使用HBase分流日志,每天的数据量很大,日均大概在80亿条,10TB的数据.对于像Datastream这种数据量巨大.对写入要求非常高,并且 ...

  10. 正确处理类的复合关系------新标准c++程序设计

    假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...