标签:
第九章
编写一款支持 HAL 的 Linux 驱动程序的步骤
编写一款支持 HAL 的 Linux 驱i.9J.程序要比编写普通的 Linux 驱动程序复杂一些,但这些付出 是值得的。 因为加入 HAL 会使组成 Linux驱动的一整套 Library 的各部分更独立,更容易维护。下 面看一下具体的实现步骤。在后面的内容会逐渐对每一步进行讨论。
第 1步g 编写 Linux驱动?“编写 Linux 驱动”,从表明上看是废话,但如果要为 Linux 驱动添加 HAL,而且想尽量保护敏感数据。 Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到 HALLibrary 中。
?第 2 步:编写 HAL Library?HAL Library 就是普通的 Linux Library 仆 .so)文件。但这类库文件有 一 个接口。通过HAL_MODULE_INFO_SYM 变量实现 。 ServiceLibrary就是通过在这个接 口中定义的 ID 定位 HAL Library 的。
第 3 步:编写 Service Library
尽管这步并不是必需的,但新的 HAL架构要求我们这样做。 ServiceLibrary也是 LinuxLibrary。 这一步比较灵活。 ServiceLibrary可以是一般的 LinuxLibrary,也可 以是 别ILibrary。在本章的 LED 驱动例子中将 ServiceLibratγ和刑ILibrary合到了一起。也就是说, ServiceLibrary就是 JNILibrary. 实际上这一步除了用 CIC件实现的*.so 库文件外,还应该包含一个用 Java 编写的服务管理类 (ServiceManager)。 ServiceManager会调用ServiceLibrary。而APK程序会调用ServiceManager类米 访问 ServiceLibrary。
?编写 HAL模块的步骤和原理如下。
第 l.步:定义结构体和宏
编写 HAL 模块需要使用到 3 个非常重要的结构体 (hw_module_t、 hw_device_t 手卧 bw_ module_ method气t), 在 第 l 步需要定义两个新的结构体 , 这两个结构体的第 l 个变量的数据类 型必须是 hw.,.module_t和 bw_device_t。 除此之外, 还需要为 E讪L模块定义一个ID. 实际上在这 l 步就是编写 !eds hal.h头文性的代码。
第 2步L编写 HAL模块的 open函数open函数是 HAL模块的入口点。在本例中是 led_device_open函数@该函数主要做如下 3项工作,
口 韧始化 hw device t 的子结构体 。 除了设置一些必妥的变量外,还需要设置操作硬件的配 数指针〈本例是 close、 set_on和 set_off)。某中 set_on和 set_off在调用 HAL模块的代码中要使用 到。 close 函数由系统自动调用。在这一步由 close、 set on和 set off指定的函数还没有定义, 可以 先把函数名写上,或在定义了相关函数后再设置这些函数指针 。
第 3 步:定义 hw_module_methods_t结构体变量HAL 模块需要 hw_module_methods_t 纣构体的 open 函数指针交量指定 open 入 口函数。 第4步: 定义HAL_MODULE_INFO_SYM变量所有的 HAL 模块都必须有一个 HAL MODULE INFO SYM 变量。该变量的类型)般为
hw_module_t或其子结构体。在定义 HAL_MODULE_INFO_SYM变莹的代码中一般会初始化一些 hw module t 结构体及其子结构体的成员变量,其中 id 和 methods 最重要。 id 表示 HAL 模块中 Android系统 中的标识。使用 HAL 模块的程序并不是直接装载 so 文件,而是迦过这个 id 找到并装 载 HAL棋块。methods变量需要指向在第 3步定义的 hw module methods t结构体的地址。当调用 者通过id找到并装载HAL模块后,就会通过methods变量找到hwmodulemethodst结构体, 并 调用 hw_m.odule_methods_t.open 函数。
第 5步:编写 HAL模块的 close 函数
当HAL模块被卸载后会调用close函数。在本例中是led device close商数。 i在涵茹(讯r~=t[;第 2步编写 的 led_device_open 函数中通过 bw_device_t.close变量指定才会被调用 。
第6步z 编写控制LED的函数
根据设备类型和功能的不同,这一步编写的函数也有所不同 。在本例中编 写 了两个控制函数 Oed_on 和 led_o的,分别用来控制 LED 的开、 关。 led_on 和 led_off原l数需妥在第 2 步编写的 Jed_device_open 函数中通过 led_con位ol_device_t.set_on和 led_control_device_t.set_off变量指定。
由于 HAL 模块属于 Android 系统的一部分,因此不能像独立运行在 ARM 处理器上的程序一样直接使用交叉编译器来编译。因为 HA-L需要很多 Android-中的头文件和共享库。最简单的方法
就是使用下面的缸令在 Android源代码目录的-b:ardware子目录建立一个 leds_hal符号链接。然后进入 hardware/leds. ha! 目录使用 mm $.:令编涛 feds. har.
标签:
原文地址:http://www.cnblogs.com/nhdmmdxq/p/5653160.html