第7章 LED将为我闪烁:控制发光二极管
本章会完成一个真正意义上的Linux驱动。该linux驱动用来控制开发板上的4个LED灯。也就是说通过向linux驱动发送数据可以控制LED小灯的开关。
一、LED驱动的实现与原理
尽管Linux 驱动直接与硬件打交道, 但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的 I/O 内存(I/O Memory, 位于内核空间)进行交互。 所谓 I/O 内存是通过各种接口(PCI、USB、蓝牙、以太网等)连接到主机(PC、手机)的硬件(网卡、声卡、摄像头等)在主机内存的映射。
二、编写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驱动的模块参数
三、测试LED驱动本章介绍了一些更复杂的测试方法,这些方法不仅可以向LED设备文件发送字符串,还可以发送I/O控制命令。这些测试方法包括可执行程序测试、NDK测试和JAVA测试。
1.编写测试I/O控制命令的通用程序
2.可以使用NDK测试LED驱动
3.使用Java测试LED驱动
四、LED驱动的移植
Linux驱动必须要在当前使用的Liunx内核编译下才可以安装在当前的linux或者android系统中。因此,LED驱动最简单的移植就是将其在不同linux内核版本下进行编译。
LED 驱动是本书第一个真正和硬件打交道的 Linux 驱动。虽然 LED 驱动并不复杂, 只是控制了4个 LED,但 LED 驱动已经包括了 Linux 驱动所有必要的部分。 一个完整的 Linux 驱动主要由内部处理和与硬件交互降部分组成。其中内部处理主要是指 Linux 驱动的装载、卸载、与设备文件相关的动作处理(读写设备文件、向设备文件发送 I/O 命令等动作)以及业务逻辑等。与硬件交互主要是指通过 iowrite32、 .ioread32 等函数与硬件中的寄存器进行数据交互。Linux 驱动在不同平台的移植也是处理这两部分。