字符设备驱动

1 引言

  • APP:open("/dev/xxx"),read,write    ——  设备字符驱动文件包含属性、主设备号和次设备号
  • C Library
  • System call interface
  • 内核:根据文件类型为字符设备,查找字符设备。根据主设备号查找file_operation;
  • 根据调用类型,选择不同的操作函数;

2 简单驱动程序

  • a. 定义file_operations结构体,然后填充该结构体,构造底层驱动函数;其中file_operations结构体定义在\include\linux\fs.h中。
  • b. 使用register_chrdev(主设备号,名字,结构体file_operations)在内核中注册该字符设备驱动;
  • c. 定义驱动入口函数fun1/fun2...,调用注册函数register_chrdev();
  • d. 用宏module_init(fun1),在内核中注册该字符设备;
  • e. 出口函数funx()调用unregister_chrdev();
  • f. 用宏module_exit(funx),从内核卸载该字符设备。

注:

  • APP调用接口时,调用字符设备时,主设备号查找外设类型。
  • Makefile基于内核编写,make后生成xxx.ko文件。
  • 使用insmod xxx.ko命令加载驱动;使用rmmod xxx卸载驱动;
  • 使用mknod /dev/xxx c 主设备号 次设备号创建字符设备;也可以使用程序class_create()/class_device_create()创建设备节点。
  • APP使用open("/dev/xxx",O_RWD)命令打开设备文件。

调试心得:

  1. Makefile文件中M=`pwd`语句,需要使用键盘按键中的~键,而不是“键;

3 查询机制

  • 软件框架
  • 操作硬件寄存器:将虚拟地址用ioremap()映射为物理地址,用iounmap()解除映射。
  • 使用copy_from_user从用户空间拷贝数据,使用copy_to_user拷贝数据到用户空间。

4 中断机制

  • 硬件中断信号产生;
  • CPU发生中断,跳到中断异常地址;
  • 调用中断处理函数,保存被中断现场,处理中断信号,恢复中断现成,退出
  • 中断。

注:

  使用request_irq()函数注册中断;

  使用exe 5</dev/xxxx命令打开中断;

  使用exec 5<&-命令关闭中断;

  使用free_irq()函数释放中断。

  wait_event_interruptible(wq, condition)函数使程序休眠

  wake_up_interruptible()唤醒程序

5 Polling机制

  在file_operations中定义一个poll的成员;

  在poll函数中调用poll_wait();

内核:

  - sys_poll

    - poll_initwait()

      - init_poll_funcptr()

        - __pollwait  将poll_wait的对象插入到poll队列中

    - do_poll()

      - do_pollfd()

      - 判断是否满足条件,如果满足,直接break

      - schedule_timeout()  定时休眠

Poll函数用法:

  include <poll.h>

  调用poll()函数

 6 异步通知

使用signal()框架:

应用程序:注册信号处理函数;

  调用signal(SIGIO, fun_pointer)

  调用open()函数,打开设备;

  调用fcntl(fd, F_SETOWN, pid)函数,告知驱动程序进程ID;

  调用oflags = fcntl(fd, F_GETFL);

  调用fcntl(fd, F_SETFL, oflags | FASYNC);改变fasync标记,最终调用驱动初始化或释放fasync:初始化/释放fasync_struct.

驱动程序:

  file_operations函数注册fasync系统调用,在该系统调用中初始化发信号时结构体fp;

中断:

  按键触发中断;

  调用kill_fasync(fp, sig, band)函数发送信号到应用层;

7 同步、互斥和阻塞

 原子操作框架:

  atomic_t v = ATOMIC_INIT(0);  定义原子变量v并初始化为0

  automic read(atomic_t *v);    返回原子变量的值

  void atomic_inc(atomic_t *v);   原子变量增加1

  void atomic_dec(atomic_t *v);   原子变量减少1

  int atomic_dec_and_test(atomic_t *v);  自减操作后测试其是否为0,为0则返回true,否则返回false。

信号量:

  定义信号量

    struct semaphore sem;

  初始化信号量

    void sema_init(struct semaphore *sem, int val);

    void init_MUTEX(struct semaphore *sem);

 

    static DECLARE_MUTEX(button_lock);  /*定义信号量并初始化*/

  获得信号量

    void down(struct semaphore *sem);

    int down_interruptible(struct semaphore *sem);

    int down_trylock(struct semaphore *sem);

  释放信号量

    void up(struct semaphore *sem);

阻塞

8 定时中断

1. 定义结构体timer_list

2. 在驱动入口函数中调用init_timer(),并且设置如下成员:

  function:中断函数,

  expires:设置中断定时时间(若不设置,默认为0,会立即进入一次中断处理函数),

  data:中断处理函数输入参数。

3. 调用add_timer()函数将定时器注册到内核中;

4. 调用mod_timer(),设置定时器超时时间:系统当前时间jiffies+超时时间。

  

  

转载于:https://www.cnblogs.com/lyndon-jiang/p/11026027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yii2的Console定时任务创建

https://www.cnblogs.com/dwj97/p/6632848.html 设置定时任务 linux下&#xff0c;运行crontab -e 30 21 * * * /usr/local/php/bin/php /your_project_path/yii test/test //应用程序 上面的例子表示每晚的21:30执行上面的定时程序 下面是定时任务设置的一些基本介绍 基本格…

数据库基础知识——TCL语言

1.TCL含义 TCL&#xff0c;事务控制语言。通过一组逻辑操作单元&#xff08;一组DML——sql语句&#xff09;&#xff0c;将数据从一种状态切换到另外一种状态&#xff0c;即要么全部成功&#xff0c;要么全部失败。2.特点 &#xff08;ACID&#xff09; 原子性(atomicity)&a…

谷歌时间晶体登上Nature,诺奖得主重大猜想成为现实

来源&#xff1a;机器之心没有能量的供给&#xff0c;没有能量的消耗&#xff0c;它的循环运动会永远持续下去。时间晶体就像是一个「永动机」在不同状态之间永久循环往复而不消耗任何能量。来自斯坦福大学、谷歌、马克思 普朗克复杂系统物理研究所和牛津大学的研究团队声称已…

【GoWeb开发实战】Beego的路由控制

Beego的路由控制 二、路由控制 web框架中&#xff0c;路由是重要的一环&#xff0c;对于beego的路由配置如何&#xff1f; 2.1 默认路由 让我们从入口文件main.go先分析起来吧&#xff1a; package mainimport (_ "beegoDemo/routers""github.com/astaxie/beego…

数据库基础知识——视图

视图 含义&#xff1a;理解成一张虚拟的表 视图和表的区别&#xff1a; 使用方式占用物理空间视图完全相同 不占用&#xff0c;仅仅保存的是sql逻辑表完全相同 占用 视图的好处&#xff1a; 1、sql语句提高重用性&#xff0c;效率高 2、和表实现了分离&#xff0c;提高了安…

挑战唯物论?诺奖得主彭罗斯:意识产生可能是大脑内的「量子叠加」的结果...

来源&#xff1a;新智元量子物理学取得了巨大成功&#xff0c;但其解释仍然不确定。大脑由神经元组成&#xff0c;而神经元又由分子组成&#xff0c;很可能会受到量子效应的影响。量子力学和神经科学能否融合成「量子意识」理论&#xff1f;「我们是谁」&#xff1f;恐怕没有什…

完全背包

题目描述 即0-1背包&#xff0c;把每个物品只能拿一次改为能拿无数次。 思路 //这个位置的状态是不拿&#xff0c;第一次拿&#xff0c;和第n>1次拿 dp[i][j]max(max(dp[i-1][j],dp[i-1][j-v[i]]w[i]),dp[i][j-v[i]]); 拿0次&#xff1a;dp[i-1][j]; 拿1次&#xff1a;dp[i-…

下一个是什么?2022年值得关注的22项新兴技术

来源&#xff1a;参考消息网英国《经济学人》网站11月8日发表题为《下一个是什么&#xff1f;2022年值得关注的22项新兴技术》的文章。在文章列举的22项新技术中&#xff0c;既有今年大热的“元宇宙”、太空旅游、脑机接口&#xff0c;也有备受期待的量子计算、艾滋病病毒疫苗……

数据库基础知识——变量

1.系统变量 1.1 全局变量 作用域&#xff1a;针对于所有会话&#xff08;连接&#xff09;有效&#xff0c;但不能跨重启 查看所有全局变量 SHOW GLOBAL VARIABLES;查看满足条件的部分系统变量 SHOW GLOBAL VARIABLES LIKE %char%;查看指定的系统变量的值 SELECT global.aut…

防止ARP欺骗

前言&#xff1a; 曾经因为宿舍里面的同学经常熬夜打游戏&#xff0c;好言相劝不管用&#xff0c;无奈之下使用arp欺骗他们的主机&#xff0c;使之晚上11点之后游戏延迟&#xff0c;掉线&#xff0c;最后&#xff0c;一到11点同学们就都上床睡觉了。 防止arp欺骗的三种思路&…

孙文智/胡霁/汪小京团队揭示延迟满足的神经基础

来源&#xff1a;北京脑编辑&#xff1a;绿萝导语&#xff1a;20 世纪 60-70 年代&#xff0c;斯坦福大学心理学家瓦尔特•米舍尔团队进行了一系列有关自制力的心理学实验&#xff0c;其中包括著名的棉花糖实验&#xff0c;得出结论&#xff1a;「能为偏爱的奖励坚持忍耐更长时…

数据库基础知识——存储过程和函数

文章目录1.存储过程1.1 创建存储过程1.2 调用存储过程1.3 删除存储过程1.4 查看存储过程2.函数2.1 创建函数2.2 调用函数2.3 函数的删除和查看2.4 函数和存储过程的区别1.存储过程 含义&#xff1a;一组经过预先编译的sql语句的集合 好处&#xff1a; 1、提高了sql语句的重用…

为什么数学家、统计学家和机器学习专家会用不同方式解决问题?

来源&#xff1a;数学建模andMATLAB原文作者&#xff1a;Nir Kaldero翻译&#xff1a;Fibears原文链接: http://www.galvanize.com/blog/2015/08/26/why-a-mathematician-statistician-machine-learner-solve-the-same-problem-differently-2/#.VeUQMNOqoVU乍一看&#xff0c;机…

Bing每日壁纸API分享

CSS中设置背景图片 可以使用此API直接在CSS中设置背景图片: background-image: url(https://bing.biturl.top/?resolution1920&formatimage&index0&mktzh-CN); background-size: 100%; background-repeat: no-repeat;演示地址&#xff1a;http://my.mojxtang.com/…

数据库基础知识——流程控制结构

文章目录1.分支1.1 if函数1.2 case语句1.3 if elseif语句2. 循环1.分支 1.1 if函数 语法&#xff1a;if(条件&#xff0c;值1&#xff0c;值2) 特点&#xff1a;可以用在任何位置1.2 case语句 语法&#xff1a; 情况一&#xff1a;类似于switch case 表达式 when 值1 then …

搭建Java开发环境及相关工具

1、JDK安装及环境配置 此处安装JDK1.8的版本&#xff0c;官方下载地址&#xff1a; https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择window64位的&#xff0c;具体的安装步骤和环境配置可参考&#xff1a; https://blog.csdn.net/…

眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”

来源&#xff1a;脑极体元宇宙太太太火了&#xff0c;以至于还没来得及认真聊一聊技术本身&#xff0c;各种炒房团、割韭菜、融资潮、付费课……就纷至沓来&#xff0c;我看不懂但大受震撼。吃多了瓜&#xff0c;颇有一种“累了毁灭吧”的虚无感。不过&#xff0c;元宇宙的技术…

数据库高级知识——mysql架构介绍(一)

文章目录1.MySQL简介1.1 概述1.2 Mysql高级2.Mysql Linux版的安装2.1 MySQL下载官网2.2 安装与卸载2.3 查看MySQL安装版本2.4 mysql服务的启停2.5 登录mysql2.6 设置开机自启动2.7 MySQL相关文件2.8 修改字符集3.Mysql配置文件3.1二进制日志log-bin3.2 错误日志log-error3.3 慢…

美国大胆预测:未来300年的人类竟然是这样的!

来源&#xff1a;云犀科技编辑&#xff1a;小艾 关于未来&#xff0c;人们越来越向往300年后人类社会的发展又会是什么样子呢&#xff1f;对于未来&#xff0c;大家又是怎么预测的呢&#xff1f;▼5年后▼三维全息虚拟技术正式大规模商用&#xff0c;可以通过VR、AR技术进行远程…

数据库高级知识——mysql架构介绍(二)

文章目录1.Mysql逻辑架构介绍1.1 总体概览1.2 查询说明2.Mysql存储引擎2.1 查看命令2.2 各个引擎简介2.3 MyISAM和InnoDB2.4 阿里巴巴、淘宝用哪个1.Mysql逻辑架构介绍 1.1 总体概览 和其它数据库相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中…