第七章LED将为我闪烁:控制发光二级管 ——学习笔记
1、LED驱动的实现原理
Linux驱动与硬件交互的原理:Linux驱动与I/O内存通过ioread30和iowrite32函数交互;I/O内存与硬件,内存管理模块负责同步I/O内存与硬件中德数据。
解释:尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据 而是与 本机的 I/0 内存(νO Memory ,位于内核空间〉进行交互。所谓 1/0 内存是通过各种接口(PCI 、 USB 、蓝牙、以太网口等〉连接到主机( PC 、手机〉的硬件〈网卡、声卡、摄像头等〉在主机内 存中的映射。例如,在 Ubuntu Linux 运行的驱动只需要访问运行 Ubuntu Linux 的主机中的I/O内存即可,然后 Linux 内核会利用I/O内存中的数据硬件交互。Linux 内核提供了多个与 1/0 内存交互的函数,如 ioread16 ioread32 iowrite16 iowrite32 等。 Linux 核的内存管理模块负责同步 I/0 存与硬件中的数据。每一个连接 Linux 的硬件在I/O内存中都会有映射首地址。在使用 ioread32 等函数读 I/O 内存时需要指定这些首地址。 开发板上的 LED 也有其 映射首地址。
2、编写LED驱动
1.创建LED驱动的设备文件
使用cdev_init函数初始化cdev;指定设备号 ;Linux设备文件的设备号分为主设备号和次设备号,前12位主设备号,后20位表示次设备号。设备号指定方法:直接在代码中指定(硬编码),动态分配,多个Linux设备文件可以拥有同一个主设备号。但两个设备的主设备号和次设备号不都能一样。使用cdev_add函数将字符设备添加到内核中德字符设备数组中。使用class_create宏创建struct class。使用device_create函数创建设备文件
2.卸载Led驱动的设备文件
依次调用三个方法:
Void device_destroy(struct class *class,dev_t devt)
Void class_destroy(struct class *cls)
Void unregister_chrdev_region(dev_t from,unsigned count)
3.设置寄存器与初始化LED驱动
4.控制LED
通过字符串控制LED;通过I/O命令控制LED
5.LED驱动的模块参数
如果Linux驱动中有多个模块参数,需要将这些参数用单引号或双引号括起来
LED 驱动可以使用如下两种方式控制:LED通过字符串控制;通过命令控制LED。在将LED灯代码编写完成后,然后进行LED灯的测试。也可以使用JAVA测试LED灯驱动。测试完成后可以将LED灯移植。