驱动简介
- 设备驱动是最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口,设备驱动是内核空间的一部分,其运行在内核态下。
按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。- 在BSP工程将驱动静态的和内核编译在一起(生成.elf / .bin等文件),为了减小编译出的镜像大小,可以将驱动以内核模块的方式编译,在需要的时候动态的载入(.ko文件)。
驱动分类:
-
字符设备驱动:字符设备是能够像字节流一样被访问的设备。字符设备驱动程序通常至少要实现 open、close、read、write 等系统调用。字符设备可以通过文件系统节点进行访问,这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个 只能顺序访问的数据通道,如触摸屏、鼠标等都是字符设备。
-
块设备驱动: 块设备能够容纳文件系统,其也是通过设备节点来访问。在 SylixOS系统中,进行 I/O 操作时块设备 每次只能传输一个或多个完整的块 ,而每块包含 512字节(或 2 的幂字节倍数的数据),如 SD、 硬盘等都是块设备。
-
网络设备驱动:网络设备不同于字符设备和块设备,它是面向报文的而不是面向流的,它不支持随机访问,也没有请求缓冲区。内核和网络设备驱动程序间的通讯,完全不同于内核和字符以及块驱动程序之间的通讯, 内核调用一套和数据包传输相关的函数以实现对网络设备的控制。
-
总线子系统: 总线子系统主要包括 I2C 总线和 SPI 总线, SylixOS 中为 I2C 总线和SPI 总线各自实现了 总线管理适配器 、 总线传输接口 ,这样诸如 EEPROM 和 SPIFlash 这样的 I2C 总线设备与 SPI 总线设备就可以调用统一的系统接口,以实现其功能。
操作系统与驱动的关系
- 设备驱动是操作系统内核与硬件的接口,它把用户进程对于硬件设备的控制抽象为系统调用。
- 应用程序就可以像操作普通文件一样,通过驱动程序提供的文件操作接口实现对实际硬件的特定操作。
![](https://i-blog.csdnimg.cn/blog_migrate/0fc75ef038516c413d36b1259ab2c914.png)
驱动开发流程
- 工程建立
- 设备驱动开发需要使用到的工程有BSP工程和内核模块工程;
- BSP工程是将驱动静态地和内核进行编译,生成系统镜像,bsp实现了操作系统的初始化,实现运行操作系统最小系统的环境;
- 内核模块工程是将驱动单独编译为模块,在需要使用的时候可以动态载入,以减小镜像文件的大小提高系统镜像的灵活性;
- 最小系统实现
- bsp工程内定义好各初始化流程执行的接口,开发过程需要做的是完成各个初始化接口的具体实现;
- 最小系统的驱动开发过程首先需要完成对于硬件平台MMU与Cache的配置,并且实现中断控制器、串口驱动、系统Tick定时器驱动。
- 存储设备&网络设备实现
- 存储设备驱动实现后才能完成文件系统的挂载使用,文件读写操作才能实现落盘存储;
- 网络驱动实现后可以极大简化系统下的开发流程,提升使用体验。
- 其他设备驱动实现
- 当最小系统、存储设备与网络设备都已经实现之后,开发者就可以根据具体的项目需求开发所需的各类设备驱动。