第7章主要写了控制发光二级管
7.1 主要介绍了LED驱动的实现原理
Linux 内核提供了多个与1/0 内存交互的函数,如ioread16 、ioread32 、iowrite16 、iowrite32 等。Linux 内核的内存管理模块负责同步I/0 内存与硬件中的数据。
每一个连接Linux 的硬件在ν0 内存中都会有映射首地址。在使用ioread32 、ioread32 等函数读写I/0内存时需要指定这些首地址。开发板上的LED 也有其映射首地址。
7.2 主要介绍了编写LED驱动
1.创建LED驱动的设备文件步骤如下:
第1 步:使用cdev_init 函数初始化cdev
第2 步:指定设备号
第3 步:使用cdev_add 函数将字符设备添加到内核中的字符设备数组中
第4 步:使用class_create 宏创建struct class
第5 步:使用device_create 函数创建设备文件
2.卸载LED驱动的设备文件
卸载 Linux 驱动的设备文件稍微简单-些,需要依次调用 device_destroy 、 class_destroy 和unreg ister_chrdev_region 方法
3 设置寄存器与初始化LED驱动
在控制LED 亮、灭之前必须要了解如何设置寄存器。 ARM 处理器有多个寄存器,通过设置不同寄存器的值。可以设置LED 引脚的状态、打开或禁止上拉(pull-up)电路以及控制LED 的亮和灭。
4 控制LED
LED 驱动可以使用如下两种方式控制LED
1.通过字符串控制LED
2.通过l/0 命令控制LED
5 LED驱动的模块参数
为Linux 驱动指定一个模块参数需要使用module_param Cname, type, perm)宏。其中name 表示参数名, type 表示参数类型, perm 表示读/写权限。module_param 支持的参数类型包括byte 、short、ushort C无符号short〕、int、uint (无符号int〕、long 、ulong C 无符号long )、charp (字符指针〉、boo) 和invbool (布尔的反)。
6 LED驱动的完整代码(这就不往出写了)
7.3 主要介绍了测试LED驱动
1 编写测试I/O控制命令的通用程序
LED 驱动有两种与设备文件交互的方式: 直接写入字符串数据和νo 控制命令.直接向设备文件写入数据可以使用命令行方式来完成,也吁以通过write 函数来完成。但I/O控制命令只能通过iocll 函数发出。为了以后测试方便,本节编写了一个通用的发送I/O 命令的程序。
2 使用NDK测试LED驱动
3 使用Java测试LED驱动
7.4 LED驱动的移植
以LED驱动为例
LED 驱动是通过设置GPMDAT 寄存器来控制LED 的亮灭的。GPMDAT寄存器的低4 位分别控制4 个LED . 0 表示打开LED, 1 表示关闭LED. 这是在OK64 1 0 开发板上的设置。如果要将LED 驱动移植到另外基于S3C6410 的开发版上,而这个目标开发板上恰好与OK6410开发板的GPMDA1、寄存器的低4 位表示的含义相反,也就是说, 1 表示打开LED ,。表示关闭LED,那么LED 驱动的代码就要做相应的改变。首先要改变的就是leds_init 函数。在LED 驱动装载后,会用OxE 设置4 个LED 的默认状态. 而在新的开发板上,就要将OxE 变成Oxl。