Ubuntu Phone说支持Android的驱动,那估计就是和Android 的Hal类似吧,这些都是早时研究android时的一些相关记录
Android 硬件抽象层(HAL)的目的是为把Android framework 与 Linux kernel完整隔开。让Android不至过度依赖Linux kernel,让Android framework的开发能在不考虑驱动程序的前提下进行。现在HAL还没有做到完全隔离,还在不断完善中。有些较复杂、关联较多的HAL(如Camera的HAL)结构上还比较“凌乱”。在移植时还要对上层相关的地方进行改动。
HAL现存有两种方式:
1.通过链接库模块实现(老式的方法)
将HAL实现为一个*.so的共享库,然后在Runtime(JNI部分)通过函数直接调用HAL Module来操作驱动程序。也可以使用C++语言直接加载指定的*.so库。这种方法会被映射到多个进程空间中,造成资源浪费和线程安全问题。
这种方式是Android上一种老式的做法,现在一些较复杂设备的HAL都已经用另一种新的方式实现,一些诸如控制震动之类,非常简单的设备还是用这种方式。
2.通过 HAL stub 方式实现(现行的方法)
引入了stub的概念,stub也是以*.so库的形式存在,但应用程序不会直接装载该库。Stub向HAL提供操作函数,Runtime则向HAL取得特定stub的操作函数,再回调这些函数,是一种间接函数调用。上层只需要通过HAL module提供的统一接口获取并操作stub即可,*.so库只会映射到一个进程中,解决了老式方法存在的问题。
使用这种结构就可以统一访问硬件的接口,面对不同的硬件只需按规则实现这些接口即可。Android定义了各种设备的接口,如:sensors.h、gps.h、copybit.h等。必须遵守并实现这些已提供的接口。