07 2022 档案
摘要:在前面讲中断等过程,我们通过request_irq申请中断,然后注册了中断服务函数。事件触发中断以后所有待处理的任务都在中断服务函数中执行。一般来说,中断服务函数会在中断请求关闭的条件的执行,一般简单的事件这样做没问题,满足外部中断讲究一个快进快出的原则,一旦要处理复杂的事物时,中断禁止的时间一长,
阅读全文
摘要:现在我们已经能够使用GPIO外设产生一个外部中断了,下面要做的就是如何在用户APP里获取到中断产生的信息。 用户APP的思路是在while循环里一直调用read函数从内核里读取驱动的信息,内核在文件被read的时候向用户态APP传递数据。驱动程序在每次按键按下后触发中断,中断通过定时器消除按键抖动后
阅读全文
摘要:我们在上一章的已经实现了定时器的基础功能使用,但是对于一个机械按键来说,因为有机械抖动会重复触发中断不能直接使用。所以我们今天要把中断功能加上定时器,来实现按键消抖的效果。 整个驱动的思路也是比较简单的,在设备结构体中定义一个定时器,当中断触发,我们不再中断里执行按键需要触发的程序而是启动定时器,如
阅读全文
摘要:在Linux驱动开发过程中,最常用到的就是定时和中断了。在前面章节我们大致了解了如何在Linux内核中实现定时功能,在下面的部分我们来学习一下中断的使用。 先回顾一下在裸机开发过程中我们怎么做的中断(忘记的可以看一下前面的章节:点击跳转): 首先使能中断,并初始化相应的寄存器 注册中的服务函数,向中
阅读全文
摘要:在上面一张我们在一个基础IO外设上加上了定时器功能,但是在设备驱动挂载完成后直接就运行定时器了,这样肯定是不行的。一定是需要一个APP程序和底层驱动进行交互。APP起码具备的功能有启动、停止定时器,修改定时器工作周期的功能。 在前面所有的APP中我们主要用了file_operations结构体中的o
阅读全文
摘要:定时器和中断是我们最常用到的功能,在前面裸机开发的时候我们通过EPIT、GPT等定时器实现定时功能,那种算硬件定时器。今天我们来看下如何在Linux内核里实现软件定时功能的。 Linux内核时间管理 Linux系统在运行的时候有大量的函数需要时间管理,比如调度程序、延时程序等。并且我们在驱动开发的时
阅读全文
摘要:今天我们来试一下在GPIO子系统下实现按键的使用。这篇总结主要目的是让我们直到GPIO在作为输入的时候是怎么使用的,真正的使用环境中是不可能将按键输入按照这个模式使用的。同时,我们还可以回顾一下上一章的原子操作,一同来完成按键驱动操作 设备树修改 回顾一下我们写裸机的时候,KEY是复用在UART1_
阅读全文
摘要:我们在前面讲了处理竞争和并发问题的四种机制,下面可以通过一些驱动来检验一下。 原子操作 原子操作用了最基础的一个虚拟的设备来演示,在设备模块被加载后生成了设备节点,我们使用APP程序打开设备节点后是有个线程访问了该设备里的数据,当另外一个APP重新要打开这个数据时就无法正常访问了。 1 /** 2
阅读全文
摘要:今天要讲的是Linux的一些基本概念。由于Linux是个多任务系统,肯定存在多个任务共同操作一个设备也可以说是操作同一段内存的情况,这种情况就叫做共享资源的并发访问。 并发与竞争 为了把事情讲清楚,我们比方有一个变量a,然后有条线程1要修改a的值,如果a的内存对应的映射地址是0x10000000,那
阅读全文
摘要:在前面我们大致讲了下pinctrl和gpio两个子系统的基础概念,但是二者在内核中的流程分析如果后面有机会我们在来看一下,下面我们要结合实际开发板的功能来使用一下这两个子系统(教程给定的是使用LED,但是无论如何LED无法点亮,驱动流程是没问题的,改用蜂鸣器来操作) 设备树的修改 设备树的修改主要分
阅读全文
摘要:在前面两章我们通过设备树实现了最基础的点灯操作,但是实质上还是在设备树里写出来要操作的寄存器地址,然后在驱动中内核通过of函数获取到寄存器物理地址后经过映射后进行操作,整个过程其实和裸机开发的流程基本一样,而在Linux中,GPIO这种最基本的操作是有专门的驱动框架来供我们使用的,这就是pinctr
阅读全文