首先声明,这并不是原创,内容均来自与题目中的书本,但是文章分类并无笔记或者读书手札的选项。
为什么要读书?
答:非科班出身,看韦东山教程快速入门,但是自身了解的知识面实在是太少了,看书可能会从文字中体会到更多作者想表达的思想——并不是说韦东山教程不好,但是教程毕竟不能面面俱到,而且即使这样,看和听的过程中仍会有疏漏,自己的注意力不可能一直保持很集中。
为什么要读这本书?
答:这本书多么好吗?不确定;只不过宋宝华还是挺有名气的,而且也是比较新的面向4.0的书,所以就它了。
华丽的分割线
—————————————————————————————————————————————————————————
第一章 linux设备驱动程序概述及环境搭建
1.1设备驱动的作用:
驱使硬件工作。建立软件和硬件的联系。
1.2无操作系统时的设备驱动
应用软件-->设备驱动-->硬件
错误的示例:应用直接访问硬件、或者驱动中包含应用的处理逻辑。
即应体现“高内聚,低耦合”的思想。
1.3有操作系统时的设备驱动
仍应包含操作硬件的部分,但是同时应融入内核。为了实现这种融合,必须在说有的设备驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,但又使得其具体的设备间互相独立。
相对于无操作系统,之前是给应用提供接口,现在则是与系统进行交互,为系统提供接口。
这样,应用程序可以使用统一的系统调用接口来访问各种硬件设备。如可以使用read(),write()等函数读写文件就可以访问各种字符设备和块设备。
1.4linux设备驱动
1.4.1设备的分类及特点
字符设备:必须以串行顺序依次进行访问。如触摸屏、磁带驱动器、鼠标等。
块设备:可以按任意顺序进行访问,以块为单位进行操作。如硬盘、eMMC等。
网络设备:面向数据包的发送和接收而设计,并不倾向与对应文件系统的节点。
字符设备和块设备,都使用文件系统的操作接口open(),read(),close(),write()等进行访问。
网络设备则主要使用套接字接口。
1.4.2linux设备驱动与整个软硬件系统的关系
应用程序可以直接调用linux系统调用的接口,也可以通过c库来调用。而c库再调用系统调用。
C 库函数本身也通过系统调用接口而实现,如C 库函数 fopen()、fwrite()、fread()、fclose() 分别会调用操作系统的API open()、write()、read()、close()。
1.4.3linux设备驱动的重点、难点
Linux 设备驱动的学习是一项浩繁的工程,包含如下重点、难点。
● 编写Linux 设备驱动要求工程师有非常好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口以及轮询、中断、DMA 的原理,PCI 总线的工作方式以及CPU 的内存管理单元(MMU)等。
● 编写Linux 设备驱动要求工程师有非常好的C 语言基础,能灵活地运用C 语言的结构体、指针、函数指针及内存动态申请和释放等。
● 编写Linux 设备驱动要求工程师有一定的Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、Flash 设备、串口设备等复杂设备,内核定义的驱动体系结构本身就非常复杂。
● 编写Linux 设备驱动要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。
1.5配套开发环境的搭建(略)
1.6设备驱动Hello World:LED驱动
对比了无系统的led驱动和有系统的led驱动,提供感性认识。
其中,内核中的leds-gpio.c确实自己应该看看。