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. Entity Framework 6.0 Tutorials(9):Stored Procedure Mapping

    Code First - Insert, Update, Delete Stored Procedure Mapping: Entity Framework 6 Code-First provides ...

  2. NAO机器人

    NAO机器人是Aldebaran Robotics公司研制的一款人工智能机器人.它拥有着讨人喜欢的外形,并具备有一定程度的人工智能和约一定程度的情感智商并能够和人亲切的互动. 教学研究类/NAO机器人 ...

  3. XE中FMX操作ListBox,添加上千条记录(含图片)

    我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...

  4. 常用SQL性能统计代码

    1 BEGIN DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'TELEDB', TABNAME=> 'WFGTEST', PARTNAME=> N ...

  5. Log--日志变大原因总结

    1. 有产生大日志操作,如重建整理索引,大量数据修改等2. 长期未提交事务,为保证为提交事务可以回滚,从最早为提交事务开始之后的所有事务,都是活动事务,不能被截断或覆盖3. 日志没有定期备份4. 镜像 ...

  6. 解决在cmder中bash(WSL)上下箭头不能使用问题

    有三种解决方式,第一种方式最简单实用 安装新版本wslbridge 这个解决方法最简单,最实用,下载第三方wslbridge,安装即可使用. 这时再进入cmder,运行bash.exe,可以发现上下左 ...

  7. Mybatis-generator逆向工程

    $.Mybatis-generator介绍 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之 ...

  8. docker系列 参考文章

    Docker 系列一(概念原理和安装) Docker 系列二(操作镜像) Docker 系列三(容器管理) 持续更新... ubuntu 安装docker 参考文章 :(https://blog.cs ...

  9. h2数据库 安装部署

    1.下载linux下的包,即全平台,网址:http://www.h2database.com/html/download.html 选择Platform-Independent Zip 2.把这个包上 ...

  10. Ubuntu16.04搭建各种开发环境的IDE: QT5 , CodeBlocks ,eclipse-cdt, PyCharm

    搭建Ubuntu下C/C++以及Python的集成开发环境,采用双系统(Win7+Ubuntu)的Ubuntu16.04-LTS系统, 关于双系统的搭建可以参考下面博客(图文十分详细):https:/ ...