一、Linux 驱动开发思维
Linux 驱动开发和裸机开发区别:主要是思维差异。
1、Linux 驱动开发直接操作寄存器不现实(一般比较复杂,自己研究寄存器会很困难)。
2、根据 Linux 下的各种驱动框架进行开发。核心:熟悉、掌握、使用 Linux 各种驱动框架。
3、驱动最终表现就是 /dev/xxx 文件(基本操作:打开、关闭、读写、……)。
4、新的内核支持设备树,这是一个 .dts 文件,此文件描述开发板的设备信息。
二、Linux 驱动分类
1、字符设备
只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。
注:字符设备是最常见、最多的。
2、块设备
指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。
3、网络设备
网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备驱动程序。在/dev目录下也没有文件来表示网络设备。
三、应用程序和驱动的交互原理
1、驱动的本质
控制设备。包括从设备中获取数据、控制设备状态等。获取到数据会提交给应用程序,应用程序使用这些数据进行相应处理。
2、用户空间和内核空间
1、Linux 下用户态和内核态切换方式
- 系统调用
- 中断
- 异常
2、操作系统主要功能
- 进程管理
- 内存管理
- 设备管理(包括IO、网络)
- 文件管理
3、应用程序调用