第7章:LED驱动的实现原理
本章完成了一个真正意义上的 Linux 驱动。该 Linux 驱动用来控 制开发版上的 4个 LED 小灯。也就是说通过向 Linux 驱动发送数据可以控制 LED 小灯的开关。为 了方便称呼这个驱动,本书及后面的章节都将其称为 LED 驱动。
虽然 LED 驱动并不复杂,只是控制 了 4个 LED,"但 LED 驱动已经包括了 Linux 驱动所有必要的部分 一个完整的 Linux 驱动主要由 内部处理和与硬件交互降部分组成。其中内部处理主要是指 Linux 驱动的装载、卸载、与设备文件 相关的动作处理(读写设备文件、向设备文件发送 νo命令等动作〉以及业务逻辑等。与硬件交互 主要是指通过iowrite32、 . ioread32 等函数与硬件中的寄存器进行数据交互。 -Linux 驱动在不同平台 的移植也是处理这两部分。如果在不同 Lin肌 肉核版本之间的移植,主要是移植第 1 部分( Linux 驱动的内部处理,一般 Linux 内核版本相差较大时, Linu叉’内核的 APl 会有很大差别〉,如果在不同硬件平台的移植,主要是移植第 2部分。
编写LED驱动:
测试LED驱动之前需要用USB数据线连接开发板,然后打开电源,成功启动之后,执行build.sh脚本文件编译和安装LED驱动,顺利则会自动连接
如果有多个设备文件将会在后来使用,则要通过指针变量cdev.list.prev和cdev.list.next指针变量连接,从而形成双向链接。
在创建设备文件时要注意:
Device_count表示建立设备文件的个数
Alloc_chrdv_region函数的第2个参数表示分配的起始设备号。
卸载Linux驱动的设备文件,需要依次调用device_destory、class_destory和unregister_chrdev_region方法
ARM控制LED的有三个寄存器,三个寄存器在内存中都有虚拟地址,向这些地址写入数据后,处理器会使用算法将虚拟地址映射为物理地址,并根据物理地址将数据写入相应的硬件端口。
驱动的设备文件。
控制LED有两种方式:
通过字符串控制LED—>file_operation.write
通过I/O命令控制LED—>file_operation.ioctl
LED驱动的模块参数
Moule_param_array(name,type,nump,perm)宏定义为LINUX驱动指定数组形式的模块参数。Name表示参数名,type表示数组元素的数据类型,nump表示存储数组长度的变量的指针,perm表示参数文件的访问权限。
编写测试I/O控制命令的通用程序,与设备文件交互的方式:直接写入字符串数据和I/O控制命令。直接向设备文件写入数据可以使用命令行方式来完成,也可以通过write函数来完成,但I/O命令只能通过ioctl发出。
一个完整的Linux驱动主要是由内部处理和硬件交互两部分组成,其中内部处理主要是指Linux驱动的装载、卸载、与设备文件相关的动作处理以及业务逻辑、与硬件交互主要是指通过函数与硬件中的寄存器进行数据交互