随笔分类 - Linux开发板学习——Linux驱动开发
摘要:在前面我们已经完成了基本的寄存器读写操作,下面我们就可以根据数据手册来完成基础AD功能的实现。 初始化 初始化的过程基本上是从AD板供应商提供的Demo移植的。 1 void ADS1256_CfgADC(ADS1256_GAIN_E _gain, ADS1256_DRATE_E _drate) 2
阅读全文
摘要:在前面章节我们已经完成了最基础的驱动框架的搭建,下面就需要在GPIO可以正常工作的条件下进行IC的读写操作。首先我们要完成最基础的读写操作,然后所有的操作都是基于这个读写操作都基础上完成的。 写入值 对IC进行的所有操作都基于写入数据的基础上衍生来的,比如想要读取AD转换后的码值也要写入对应的指令。
阅读全文
摘要:我们通过前两章的内容完成了驱动移植和重构的准备工作,下面我们就开始处理驱动代码了。 驱动的基础架构我们采用和前面学习的platform框架一样,并且通过GPIO子系统对GPIO实现初始化的配置。 1 /** 2 * @file ads1256_base1.c 3 * @author your nam
阅读全文
摘要:在前面一章我们了解了ADS1256在通讯中的时钟要求和指令,我们这一章结合主机部分完成Linux下的设备树信息,然后完成硬件的连接。 硬件连接 在上一章我们说过,ADS1256作为SPI通讯的从机部分,在完成基础功能的条件下和主机之间有5条接口需要连接,然后有些接口需要保持高电平 这里我们通过软件模
阅读全文
摘要:在前面的操作中我们已经测试了驱动的使用,但是那种方式是不够直观的。下面我们借助一个第三方的应用程序通过UI来测试下我们的驱动是否工作正常,并且将完成的驱动直接添加到内核中以便可以开机自动加载。 tslib Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能(万能的度
阅读全文
摘要:屏幕是一个嵌入式设备中相当重要的外设了。在做裸机驱动开发的时候,闹疫情隔离在家,手里没有触摸屏,所以就没看驱动开发。好在内核已经为我们提供了现成的驱动,我们只需要在设备树里定义好LCD的相关信息,就可以点亮屏幕。至于实际底层是驱动的,我们这里就先不搞了,以后如果有机会再回头看看裸机驱动里的LCD篇。
阅读全文
摘要:前面两章我们通过input子系统构建了一个按键类型的输入设备的驱动,其实Linux的内核还提供了一套基于GPIO的按键驱动程序,和LED设备一样,我们只需要在编译内核的过程中进行配置然后在设备树中定义好设备节点就可以直接使用了。 配置内核 在使用内核提供的input子系统驱动前要将驱动使能,可以按照
阅读全文
摘要:我们上一章完成了input子系统的设备构成,并且在用户空间通过hexdump命令拿到了一堆不知道是什么的信息。今天我们就要借助input_event这个结构体来了解内核怎么通过那个结构体了解输入事件。 可能有心人已经发现了,上一章我们在加载完模块以后在/dev/input路径下生成了一个新的even
阅读全文
摘要:我们在前面通过pin控制学习了LInux内核的GPIO和Pinctrl子系统。GPIO主要用作简单的引脚控制驱动,今天我们来了解一下一组新的子系统:input子系统。input子系统是Linux内核专门提出来处理按键、鼠标、键盘和触摸屏等输入设备的输入事件的。输入设备从本质上来说还是属于字符设备。i
阅读全文
摘要:今天我们来学习platform下单一个杂项驱动——MISC驱动。如果我们的某些外设不好进行分类的时候,就可以把它归纳到这个杂项驱动的分类里。 MISC设备驱动 随着我们使用的设备越来越多,现有的设备号资源变得越来越紧张,特别是主设备号(12位,对应0~4095)。这时候MISC驱动就应运而生了。并且
阅读全文
摘要:回顾一下我们现在先后都做了几种LED的点亮试验: 裸机点亮LED 使用汇编语言读写寄存器点亮LED 使用C语言读写寄存器点亮LED 在系统下直接操作寄存器映射点亮LED 在设备树下完成LED相关设备信息后在系统中调用设备树信息点亮LED 使用gpio和pinctrl子系统点亮LED 使用platfo
阅读全文
摘要:在上一章节我们使用了platform框架在没有设备树的时候是如何使用的,不过现在的大多数半导体厂商都把设备树给我们完善了。区别就是在没有设备树信息的时候需要我们自己想总线注册platform设备,设备里主要包含寄存器地址信息等资源,而在有设备树支持的条件下,就不需要我们使用platform_devi
阅读全文
摘要:在上面一章我们借助Linux驱动分离和分层的概念引出来驱动——总线——设备的概念,然后引出来了platform这种基于设备驱动模型的驱动架构,我们下面通过使用来演示下platform架构是怎么使用的。 前面说过,platform驱动架构的设备端分为支持设备树和不支持设备树两种模式,下面我们先看看如何
阅读全文
摘要:(到目前为止,我们写的驱动都是简单的GPIO接口操作。但是实际环境中,我们会写I2C、SPI等设备的驱动。再回忆一下我们写驱动的流程,除了基础的框架基本上每次都是重复的造轮子。这样复杂的驱动写起来肯定是不能按照这种方法进行的,所以我们需要按照Linux的驱动分离与分层的思路构建我们以后的驱动架构。所
阅读全文
摘要:在前面一章我们实现了通过阻塞操作来访问硬件资源,下面我们要通过非阻塞的模式来尝试一下如何实现这一效果。 用户态APP 我们在上一章引出非阻塞模式的时候已经说明了,非阻塞IO主要是属于异步IO的模式。那么对于用户态APP来说,有几个接口我们需要了解 select epoll 还有poll 其中 sel
阅读全文
摘要:我们在前面通过阻塞和非阻塞的访问方式完成了用户态APP和驱动文件之间进行交互。但是这两种方式都是通过应用程序主动去读取驱动程序,对于非阻塞模式来说是通过poll函数不断的轮询,阻塞模式就是把进程挂起,直到中断或其他事件发生重新启动进程。今天我们讲一种新的方法:让驱动主动向应用程序发出通知,报告自己可
阅读全文
摘要:还记得我们在讲按键生成外部中断时候通过一个APP来调用驱动文件么?因为我们在用户态APP里通过while循环不断调用read函数去获取按键状态,占用了大量的系统资源,这种模式肯定是不行的。所以今天我们重新构造一下这个驱动程序(主要是和用户态APP交互的文件操作集合函数)。 阻塞和非阻塞 应用程序对驱
阅读全文
摘要:在前面讲中断等过程,我们通过request_irq申请中断,然后注册了中断服务函数。事件触发中断以后所有待处理的任务都在中断服务函数中执行。一般来说,中断服务函数会在中断请求关闭的条件的执行,一般简单的事件这样做没问题,满足外部中断讲究一个快进快出的原则,一旦要处理复杂的事物时,中断禁止的时间一长,
阅读全文
摘要:现在我们已经能够使用GPIO外设产生一个外部中断了,下面要做的就是如何在用户APP里获取到中断产生的信息。 用户APP的思路是在while循环里一直调用read函数从内核里读取驱动的信息,内核在文件被read的时候向用户态APP传递数据。驱动程序在每次按键按下后触发中断,中断通过定时器消除按键抖动后
阅读全文
摘要:我们在上一章的已经实现了定时器的基础功能使用,但是对于一个机械按键来说,因为有机械抖动会重复触发中断不能直接使用。所以我们今天要把中断功能加上定时器,来实现按键消抖的效果。 整个驱动的思路也是比较简单的,在设备结构体中定义一个定时器,当中断触发,我们不再中断里执行按键需要触发的程序而是启动定时器,如
阅读全文