LED将为我闪烁:控制发光二极管
一个完整的linux驱动主要由内部处理和与硬件交互两部分组成。其中内部处理主要是指linux驱动的装载、卸载、与设备文件相关的动作处理以及业务逻辑等;与硬件交互主要是指通过iowrite32、ioread32等函数与硬件中的寄存器进行数据交互。
我们想要实现控制led,就应该先了解它的实验原理。Linux驱动并不是直接向硬件中的内存写数据,而是与本机的I/O内存进行交互。Linux内核提供了多个与I/O内存交互的函数,每一个连接Linux的硬件在I/O内存中都会有映射首地址,开发板上的LED也有其映射首地址。
接下来是开始编写LED驱动:
1.测试开发板,打开电源开关
2.创建LED驱动设备文件:由于misc_register函数只能建立主设备号为10的设备文件,如果想建立其他主设备号的设备文件,就需要使用cdev_init、register_chrdev_region、cdev_add等函数:初始化cdev。cdev的大多数成员变量并不需我们自己去初始化,只要调用cdev_init函数即可;指定设备号;使用cdev_add函数将字符设备添加到内核中的字符设备数组中;使用class_create宏创建struct class;使用device_create函数创建设备文件.
3.卸载led驱动的设备文件:依次调用device_destroy、class_destroy和unregister_chrdev_region方法。
4.设置寄存器与初始化led驱动。
5.控制led:字符串控制led,使用file_operations.write函数;I/O命令控制led,使用file_operations.ioctl函数。
6.设置led驱动的模块参数
7.测试led驱动:编写测试I/O控制命令的通用程序、使用NDK测试LED驱动、使用Java测试LED驱动
此外还有LED驱动的移植,最简单的移植是将其在不同Linux内核版本下进行编译,移植驱动时要注意再修改驱动的源代码时,尽量不修改驱动的接口。
虽然LED驱动并不复杂,我们还是要注意在不同Linux内核版本和不太硬件平台驱动移植的不同,有助于我们深入理解Linux技术。
09:14:39
2016-06-05