学习驱动必知:
学习驱动的目的不是为了开发驱动,而是能看懂并移植驱动,使硬件能正常工作。
现在很少有机会自己从零开始实现一个复杂的驱动。
现在驱动的需求很少了,不可能单独作为一个岗位的,都是搞 Linux 应用开发的顺带的工作,想找驱动的工作就是在做梦。
新人基本上是搞不了驱动的,投简历也是没人搭理的,因为公司需要搞驱动的是Linux老手,一般内部Linux应用开发工程师顺带完成的,就算有这个岗位,也是优先从内部应用开发转过去的。
常见的驱动全都有,就算一个设备没提供驱动,但它有类似的设备有驱动,移植过来就行了。
驱动是协助操作系统完成应用程序与对应硬件设备之间数据传送的程序。
Linux 驱动是为 Linux 应用程序提供的硬件操作的函数接口。
驱动是在 Linux 的各种驱动框架下进行开发的,最终表现为/dev/xxx文件,可以像普通文件一样进行打开、关闭、读写等操作。
Linux 驱动总体框图:

驱动的分类
Linux 驱动分为三大类:
1、字符设备驱动:字符设备以字节为单位进行输入和输出,数量最多,比如鼠标、键盘、I2C、SPI、音频等
2、块设备驱动,比字符设备驱动复杂,就是因为其复杂所以芯片厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如 EMMC、NAND、SD 卡和 U 盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备。
3、网络设备驱动,即网络驱动,包括有线和无线。一个设备可以 属于多种设备驱动类型,比如 USB WIFI,其使用 USB 接口,所以属于字符设备,但是其又能 上网,所以也属于网络设备驱动。
一个设备不说是一定只属于某一个类型。比如USB WIFI,SDIO WIFI,属于网络设备驱动,因为他又有USB和SDIO,因此也属于字符设备驱动。
Linux内核按驱动程序实现模型框架的不同,将设备分为三类:
字符设备:按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存
块设备:按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节(4k),随机访问,设缓存以提高效率
网络设备:针对网络数据收发的设备,有线网卡、无线网卡、蓝牙,并不属于linux中的文件
从网络设备中可以看出,对于Linux中一切皆文件的说法不太严谨,网络设备不属于Linux中的文件类型。
块设备面向的是文件系统,应用程序不会直接操作块设备,而是通过文件系统。
学习资料:
华清远见:嵌入式人工智能课
《嵌入式 Linux驱动开发教程》
B站:搞Linux的旺仔,平地铲开发板教程
正点原子文档
韦东山文档
0voice/linux_kernel_wiki: linux内核学习资料:200+经典内核文章,100+内核论文,50+内核项目,500+内核面试题,80+内核视频
Linux 查看系统调用和库函数:linux系统查看系统和库函数_no manual entry for read in section 2-CSDN博客