第七章 控制发光二极管读后感
本章学的是通过向Linux驱动发送数据可以控制LED小灯的开关。
LED的原理就是:Linux驱动与本机的I/O内存进行交互。所谓I/O内存是通过各种接口连接到主机的硬件在主机内存中的映射。Linux内核提供了多个与I/O交互的函数,每一个连接Linux的硬件在I/O内存中都会有映射首地址。
接下来创建LED驱动的设备文件
第一步:使用cdev_init函数初始化cdev
第二步:指定设备号:Linux设备文件的设备号分为主设备号和次设备号。用一个int类型(dev_t)表示。其中前12位表示主设备号,后20位表示次设备号
第三步:使用cdev_add函数将字符设备添加到内核中的字符设备数组中
第四步:使用class_create宏创建struct class
第五步:使用device_create函数创建设备文件
然后设置寄存器,初始化LED驱动
LED有俩个引脚:GPB0和GPB1,由这俩个引脚控制电源的连,断来控制LED的亮灭。控制LED需要通过3个寄存器来完成,这三个寄存器分别是GPMCON(端口配置寄存器),GPMDAT(端口数据寄存器).GPMPUD(端口上拉电路寄存器)
LED驱动可以使用如下俩种方式控制LED
1.通过字符串控制LED
2.通过I/O命令控制LED(需要使用file_operations.ioctl函数控制)
在编写代码的时候需要了解如下几点。
1.四个LED的状态用一个长度为4的char数组存储。1表示亮,0表示灭
2.如果写入的字符串长度小于等于4,直接写入这些字符串。如果字符串长度大于4,则只会写入前四个字符串
3.由于实现mem数组已被清零,因此,如果写入的字符串长度小于4,则相当于后面的字符都是0
一个完整的驱动主要由内部处理和硬件交互俩部分组成。Linux驱动在不同平台的移植也是处理这俩部分。如果在不同Linux内核版本之间的移植,主要是移植第一部分,如果在不同硬件平台的移植,主要是移植第二部分。