Android深度探索笔记-第七章

尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的 I/O内存(位于内核空间〉进行交互。每一个连接 Linux 的硬件在 I/O内存中都会有映射首地址。

测试已有的led驱动时使用的adb shell命令或test leds.sh脚本文件,这里出现了base和dase两种脚本解析器,我之前接触过使用base的软件,在这里才知道是一种脚本解析器。

这里使用了cdev函数族来创建设备文件,步骤如下:

1:使用 cdev_init 函数初始化 cdev

2:指定设备号,我们优先使用动态分配,使用alloc_ chrdev_region函数自动分配一个未使用的主设备号。如果直接指定设备号,需要使用registe_chrdey_region-函数注册字符设备区域。

3:使用 cdev_add 函数将字符设备添加到内核中的字符设备数组中,在 cdev_add 函数中调用了kobj_map负责将设备文件的相关信息添加到保存已建立的设备文件的dprobes 数组中。

4:使用class_create宏创建struct class,实际上使甩了class_create函数创建。

5:使用 device create 函数创建设备文件device create(leds class, NULL, dev number, NULL, DEVICE NAME)。

卸载 Linux 驱动的设备文件需要依次调用device_destroy,class_destroy,unreg ister_chrdev_region 方法。

通过设置寄存器的值,我们可以控制led的状态和控制led的亮灭。控制led需要通过 3个寄存器来完成: GPMCON (端口配置寄存器),GPMDAT (端口数据寄存器)和 GPMPUD(端口上拉电路寄存器),每一个寄存器可以使用 4 个字节。上述3个寄存器在内存中都有一个虚拟地址,向这些地址写入数据后,arm处理器会使用一套算法将虚拟地址映射成物理地址,并根据物理地址将数据写入相应的硬件端口。

使用前需要先完成寄存器的初始化,只要在leds_init函数中调用Jeds_init_gpm函数就可。

驱动用2种方法控制led,通过字符串控制需要使用file_operations.write函数。如果通过I/0命令控制需要使用file_operations.iocd函数。

使用module_param宏指定模块参数,通过module_param 宏可以指定参数文件的访问权限。

通我们是过设置GPMDAT寄存器来控制led的亮灭的,所以如果要把说编写的代码在其他开发板上运行,就有根据具体的实际情况修改代码,直接编译很可能不能运行。

posted @ 2016-07-08 16:01  焦岚  阅读(139)  评论(0编辑  收藏  举报