裸机驱动开发回顾
- 底层,跟寄存器打交道,有些MCU提供了库
Linux驱动开发思维
- Linux下驱动开发直接操作寄存器不现实。
- 根据Linux下的各种驱动框架进行开发。一定要满足框架,也就是Linux下各种驱动框架的掌握。
- 在Linux下驱动最终表现就是 /dev/xxx 文件。打开、关闭、读写…
- 现在新的内核支持设备树,这个一个.dts 文件,此文件描述了板子的设备信息。
Linux驱动开发分类
字符设备驱动
最多的
字符设备驱动是以不定长度的字元来传送资料,字符设备是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流;
块设备驱动
存储相关
块设备驱动是以固定大小长度来传送和转移资料的,块设备能够随机,不需要按照顺序地访问固定大小的数据片。
网络设备驱动
网络设备是一个比较特殊的设备,它负责接收和发送帧数据,可能是物理帧,也可能是ip数据包,这些特性都有网络驱动决定。它并不存在于/dev下面,所以与一般的设备不同。网络设备是一个net_device结构,并通过register_netdev注册到系统里,最后通过IFconfig -a的命令就能看到。
一个设备不是说只属于某一个类型,比如USB WiFi、SDIO WiFi,属于网络设备驱动,
因为他又有USB和SDIO,因此也属于字符设备驱动。
应用程序和驱动的交互原理
-
驱动就是获取外设,或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编译既要编写一个驱动,还要我们编写一个简单的测试应用程序,APP。
单片机下驱动和应用都是放到一个文件里面,也就是杂糅到一起。
Linux下驱动和应用是完全分开的。
用户空间(用户态)和内核空间(内核态):
Linux操作系统内核和驱动程序运行在内核空间、应用程序运行在用户空间。应用层想要访问内核资源,怎么办,有三种方法:系统调用、异常(中断)和陷入