凯时k8官网下载:Android的系统移植与平台开发HAL Stub框架分析

框架阐发HALstub的框架对照简单,三个布局体、两个常量、一个函数,简称321架构,它的定义在:@hardware/libhardware/include/hardware/hardware.h@hardware/libhardware/hard


当前位置: 主页 >凯时k8官网下载


框架阐发

HAL stub的框架对照简单,三个布局体、两个常量、一个函数,简称321架构,它的定义在:

@hardware/libhardware/include/hardware/hardware.h

@hardware/libhardware/hardware.c

/*

每一个硬件凯时k8官网下载都经由过程hw_module_t来描述,我们称之为一个硬件工具。你可以去“承袭”这个hw_module_t,然后扩展自己的属性,硬件工具必须定义为一个固定的名字:HMI,即:Hardware Module Information的简写,每一个硬件工具里都封装了一个函数指针open用于打开该硬件,我们理解为硬件工具的open措施,open调用后返回这个硬件对应的Operation interface。*/

struct hw_module_t{uint32_t tag;// 该值必须声明为HARDWARE_MODULE_TAG

uint16_t version_major; // 主版本号uint16_t version_minor;// 次版本号

const char *id;//硬件id名,独一标识moduleconst char *name;// 硬件module名字

const char * author;// 作者struct hw_module_methods_t* methods凯时k8官网下载;//指向封装有open函数指针的布局体

void* dso;// module’s dsouint32_t reserved[32-7];// 128字节补齐

};

/*硬件工具的open措施描述布局体,它里面只有一个元素:open函数指针

*/ struct hw_module_methods_t{

// 只封装了open函数指针int (*open)(const struct hw_module_t* module, const char * id,

struct hw_device_t** device);};

/*

硬件工具hw_module_t的open措施返回该硬件的Operation interface,它由hw_device_t布局体来描述,我们称之为:该硬件的操作接口*/

struct hw_device_t{uint32_t tag;// 必须赋值为HARDWARE_DEVICE_TAG

uint32_t version;// 版本号struct hw_module_t* module; // 该设备操作属于哪个硬件工具,可以当作硬件操作接口与硬件工具的联系

uint32_t reserved[12];// 字节补齐int (*close)(struct hw_device_t* device);// 该设备凯时k8官网下载的关闭函数指针,可以看做硬件的close措施

};

上述三个布局之间关系慎密,每个硬件工具由一个hw_module_t来描述,只要我们拿到了这个硬件工具,就可以调用它的open措施,返回这个硬件工具的硬件操作接口,然后就可以经由过程这些硬件操作接口来间接操作硬件了。只不过,open措施被struct hw_module_methods_t布局封装了一次,硬件操作接口被hw_device_t封装了一次而已。

那用户法度榜样若何才能拿到硬件工具呢?

谜底是经由过程硬件id名来拿。

我们来看下321架构里的:两个符号常量和一个函数:

// 这个便是HAL Stub工具固定的名字

#define HAL_MODULE_INFO_SYMHMI// 这是字符串形式的名字

#define HAL_MODULE_INFO_SYM_AS_STR"HMI"//这个函数是经由过程硬件名来得到硬件凯时k8官网下载HAL Stub工具

int hw_get_module(const char *id, const struct hw_module_t *凯时k8官网下载*module);

当用户调用hw_get_module函数时,第一个参数传硬件id名,那么这个函数会从当前系统注册的硬件工具里查找通报过来的id名对应的硬件工具,然后返回之。

从调用者的角度,我们基础上没有什么障碍了,那若何注册一个硬件工具呢?

很简单,只必要声明一个布局体即可,看下面这个Led Stub注册的例子:

const struct led_module_t HAL_MODULE_INFO_SYM = {

common: {// 初始化父布局hw_module_t成员tag: HARDWARE_MODULE_TAG,

version_major: 1,version_minor: 0,

id: LED_HARDWARE_MODULE_ID,name: "led HAL Stub",

author: "farsight",methods: &led_module_methods,

},// 扩展属性放在这儿

};

发表评论
加载中...

相关文章