前言
上一节介绍了 linux 驱动开发中 module 的导出模块,在这一节中首先 linux 设备驱动开发中相关的概念,设备驱动的分类和学习过程中的重点和难点。
正文
计算机系统的硬件主要由 CPU 、存储器和外设组成,目前 CPU 内部往往集成了存储器和外设适配器,比如 ARM 芯片中继承的 UART 、I2C控制器、USB控制器、SDRAM 控制器以及片内的 RAM 和Flash。
驱动针对的对象是存储器和外设(包括 CPU 内部集成的存储器和外设) 而不是针对 CPU 核的。
Linux 将存储器和外设分为三大类:
- 字符设备
- 块设备、
- 网络设备
字符设备是指那些必须以 串行 顺序依次进行访问的设备。比如:* 触摸屏、鼠标*等
块设备可以任意顺序进行访问,以块为单位进行操作,比如硬盘等。
字符设备和块设备之前并没有明显的界限,Flash设备,符合块设备的特点,但是我们仍然可以把它作为一个字符设备。
另外一个设备分来方法中所称的 I2C驱动、USB驱动、PCI 驱动、LCD驱动等本身可纳入3个基础大类,但是对于这些复杂的设备,linux也定义了独特的驱动体系结构。
linux设备驱动和整个软硬件系统的关系
除网络设备外,字符设备和块设备都被映射到 linux 系统的文件和目录中,通过文件目录接口 open() 、read()、write()、close() 等可以访问字符设备和块设备。
应用程序可以使用 Linux 的系统调用接口变成,也可以使用 C 库函数进行编程。
linux设备驱动的重点和难点
编写 Linux 设备驱动程序需要很好的硬件基础,懂得 SRAM、FLASH、SDRAM、磁盘的读写方式、UART、 I2C、USB 等设备的接口以及轮询、中断、DMA 的原理、PCI 总线的工作方式、以及CPU的内存管理单元 (MMU)等。
编写 Linux 设备驱动程序需要良好的 C 语言基础,能灵活的利用 C 语言的结构体、指针、函数指针、以及内存的动态申请和释放等。
编写 Linux 设备驱动程序需要有一定的 linux 内核基础,至少明白驱动和内核的接口。
编写 Linux 设备驱动程序需要工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发和同步机制。
总结
linux 字符设备驱动是最常见的驱动,学习字符设备驱动,要在字符设备驱动的基础上,加深对 I2C 、USB 等驱动框架的理解;同时重点理解和学习 Linux设备驱动的重点和难点部分的内容,提供自己的能力。