《Android深度探索》(卷1)HAL与驱动开发读后感

第7章 LED将为我闪烁:控制发光二极管

  在上一章我们已经了解了开发Linux驱动程序的步骤,并给了一个实例来演示如何开发完一个完整的Linux驱动。而对大多数Linux驱动来说,需要直接与硬件交互。在这章中,需要自己动手编写控制LED的驱动程序,注重实践操作。本章将完成一个真正意义上的Linux驱动。

1.LED驱动的实现与原理

尽管Linux 驱动直接与硬件打交道, 但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的 I/O 内存(I/O Memory, 位于内核空间)进行交互。 所谓 I/O 内存是通过各种接口(PCI、USB、蓝牙、以太网等)连接到主机(PC、手机)的硬件(网卡、声卡、摄像头等)在主机内存的映射。

  2.编写LED驱动

     1.创建LED驱动的设备文件

          第一步:使用cdev_init函数初始化

          第二步:指定设备号

          第三步:使用cdev_add函数将字符设备添加到内核中的字符设备数组中

          第四步:使用class_create宏创建struct class

          第五步:使用device_create函数创建设备文件

     2.卸载LED驱动的设备文件

          其中使用到的函数 device_destory、class_destory和unregister_chrdev_region方法

     3.设置寄存器与初始化LED驱动

     4.控制LED

          通过字符串控制LED

          通过I/O命令控制LED

     5.LED驱动的模块参数

          为Linux驱动指定一个模块参数需要使用module_param (name, type, perm)宏。 其中name表示参数名,type表示参数类型,perm表示读/写权限。

module _param支持的参数类型包括byte、short、ushort (无符号short〕、int、uint (无符号int〕、 long、ulong (无符号long)、charp (字符指针)、boo和invbool (布尔的反。

3.测试LED驱动

  1.编写测试I/O控制命令的通用程序

  2.可以使用NDK测试LED驱动

  3.可以使用Java测试驱动

LED 驱动是本书第一个真正和硬件打交道的 Linux 驱动。虽然 LED 驱动并不复杂, 只是控制了4个 LED,但 LED 驱动已经包括了 Linux 驱动所有必要的部分。 一个完整的 Linux 驱动主要由内部处理和与硬件交互降部分组成。其中内部处理主要是指 Linux 驱动的装载、卸载、与设备文件相关的动作处理(读写设备文件、向设备文件发送 I/O 命令等动作)以及业务逻辑等。与硬件交互主要是指通过 iowrite32、 .ioread32 等函数与硬件中的寄存器进行数据交互。Linux 驱动在不同平台的移植也是处理这两部分。

http://www.cnblogs.com/Mr-zsj/

原文地址:https://www.cnblogs.com/Mr-zsj/p/5555414.html