在这一章中主要介绍了一个Linux驱动程序,以实战的方式向我们介绍了一个Linux驱动程序的例子。
Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评。 Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中。这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易。当然,也比访问LinuxAPI 更容易。 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交换数据。
编写Linux驱动程序的步骤:1.建立 Linu x 驱动骨架 (装载和卸载 Linu x 驱动)。2.:注册和注销设备文件。3. 指定与驱动相关的信息。4.指定回调函数。5.编写业务逻辑。6.编写 Makefile文件。7.编译 Linux 驱动程序。8. 安装和卸载 Linux 驱动。
这一章中还介绍了如何使用不同的方法测试 Linux 驱动。这些方法主 要以平台来区分。例如,可以直接使用 Ubuntu Linux 测试 Linux 驱动。有很多驱动只要再利用相 应的 Linux 内核编译一边,就可以直接安装在 Android、 Linux 等嵌入式系统中。 当然,也可以直 接在 Android模拟器、 开发板甚至手机上测试 Linux 驱动。 为了更快地开发 Linux 驱动,也可以 考虑采用 6.5 节介绍的 Eclipse 集成开发环境。
Linux驱动的工作方式就是交互。例如向Linux打印机驱动发送一个打印命令,可以直接使用C语言函数open打开设备文件,在使用C语言函数ioctl向该驱动的设备文件发送打印命令。编写Linux驱动最重要的是编写回调函数,否则与设备文件交互的数据无法得到处理。
建立Linux驱动骨架中使用到两个函数:module_init,module_exit。要进行宏定义。
创建和移除设备文件用misc_register,misc_deregister。
回调函数是由自身生成的,一个驱动程序并不一定要指定所有的回调函数。
具体的业务逻辑与驱动的功能有关,可能有多个函数、多个文件甚至多个Linux驱动模块组成。
程序可以直接编译进内核,也可以作为模块单独使用。
使用输出时用的是printk,可定有疑问为什么不用printf,因为Linux系统中分为用户空间和内核空间,而printf只能运行在用户空间。再者,他们之间进行交互使用的设备文件。
要对开源文件、GPL协议、LGPL协议、BSD协议、MIT协议和Apache License2.0协议理解。
在编写和销毁设备文件时,要注意misc_register只能设置此设备号。
使用cat /proc/devices可以获得显示当前系统中有哪些是主设备以及主设备号
通过file_operation.read和file_operation.write成员变量可以分别指定读写设备要调用的回调函数的指针。
驱动程序编写完成,多次编译该驱动程序,读写目录的驱动程序一样,有build.sh和相关脚本文件。
Cat 命令不会将4个字节还原成int类型的值显示
用于Android模拟器的goldfish内核默认不允许动态加载Linux驱动模块,因此需要cd ~/kernel/goldfish,make menuconfig,要在配置框中选择正确的进入子菜单,否则可能加载内核失败。