day6androidhal硬件抽象层开发-实现_第1页
day6androidhal硬件抽象层开发-实现_第2页
day6androidhal硬件抽象层开发-实现_第3页
day6androidhal硬件抽象层开发-实现_第4页
day6androidhal硬件抽象层开发-实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hal Stub目前没有严格的标准Interface由各厂商决定实现细节自己决定以products tree方式进行易于管理便于以后升级实现Led

HAL

Stub1.开发LedServiceAPI2.设计LEDStub与LedService整合3.开发设计测试程序4.后续优化(Refinement)ApplicationFrameworkRuntimeHALLinuxDriver1LedServiceLedRuntime2LedStub34LedAppAPI

&

HAL

stub开发流程HAL

Stub移植步骤/mt/LedDemo.java/mt/LedService.javaLedDriverLedHardware_mt_LedService.cpphal/led_stub.cpp,hal/led_stub.hAppRunntimeHALKernelLed案例Led案例继承hw_module_t与hw_device_t定义并实现操作Interface(StubOperations)module到系统中初始化led_module_t实现device

open函数HAL

Stub实现步骤定义ledmodulestruct led_module_t

{struct

hw_module_tcommon;/*

support

API

for

LEDServices

constructor

*/};定义led设备操作接口struct led_control_device_t

{struct

hw_device_tcommon;/*

supporting

control

APIs

go

here

*/int

(*getcount_led)(struct

led_control_device_t

*dev);int

(*set_on)(struct

led_control_device_t

*dev);int

(*set_off)(struct

led_control_device_t

*dev);};HAL

Stub实现步骤实现设备操作接口static

int

led_set_on(struct

led_control_device_t

*dev){ioctl(fd,GPG3DAT2_ON,NULL); //GPF0

0return

0;}int

led_set_off(struct

led_control_device_t

*dev){ioctl(fd,GPG3DAT2_OFF,NULL);

//GPF0

1return

0;}HAL

Stub实现步骤led

module为HAL_MODULE_INFO_SYMconst

struct

led_module_t

HAL_MODULE_INFO_SYM

=

{common:

{tag:

HARDWARE_MODULE_TAG,version_major:1,version_minor:

0,id:

LED_HARDWARE_MODULE_ID,name:

"led

HAL

module",author:

"farsight",methods:

&led_module_methods,},/*

supporting

APIs

go

here

*/};HAL

Stub实现步骤struct

hw_module_methods_t led_module_methods={open:led_device_open};HAL

Stub实现步骤各模块调用关系Native

code通过hw_get_module调用获取HAL

stub:hw_get_module

(LED_HARDWARE_MODULE_ID,

(const

hw_module_t**)&module)通过继承hw_module_methods_t的callback来open设备:

module->methods->open(module,LED_HARDWARE_MODULE_ID,(structhw_device_t**)device);通过继承hw_device_t的callback来控制设备:sLedDevice->set_on(sLedDevice,

led);sLedDevice->set_off(sLedDevice,

led);HAL使用方法CallbackOpeninterfaceCallback

Open

interfacehardware.cint

hw_get_module(const

char

*id,

const

struct

hw_module_t**module)1.查找module

pachif

(i

<

HAL_VARIANT_KEYS_COUNT)

{if

(property_get(variant_keys[i],

prop,

NULL)

==

0)

{continue;}snprintf(path,

sizeof(path),

"%s/%s.%s.so“,

HAL_LIBRARY_PATH,

id,prop);}else

{snprintf(path,

sizeof(path),

"%s/%s.default.so“,HAL_LIBRARY_PATH,

id);}HAL

Module

获取2.载入

soif(i<HAL_VARIANT_KEYS_COUNT+1){/*loadthemodule,ifthisfails,we'redoomed,andweshouldnottry*toloadadifferentvariant.*/status=load(id,path,module);}3.

Open

sohandle=dlopen(path,RTLD_NOW);if

(handle

==

NULL)

{charconst*err_str=dlerror();LOGE("load:module=%s\n%s",path,err_str?err_str:"unknown");status=-EINVAL;gotodone;}HAL

Module

获取(cont.)4.获取symbol/*

Get

the

address

of

the

struct

hal_module_info.

*/const

char

*sym

=HAL_MODULE_INFO_SYM_AS_STR;hmi

=

(struct

hw_module_t

*)dlsym(handle,

sym);if

(hmi

==

NULL)

{LOGE("load:

couldn't

find

symbol

%s",

sym);status

=

-EINVAL;goto

done;}HAL

Module

获取(cont.)hardware.h#define

HAL_MODULE_INFO_SYM/**HMI*

Name

of

the

hal_module_info

as

astring*/#define

HAL_MODULE_INFO_SYM_AS_STR

"HMI"HAL

Module

获取(cont.)(1)定义自己的HAL结构体,编写头文件led.h,

hardware/hardware.hstruct led_module_t

{struct

hw_module_t

common;};structled_control_device_t

{struct

hw_device_t

common;int

fd; /*

file

descriptor

of

LED

device

*//*

supporting

control

APIs

go

here

*/int

(*set_on)(struct

led_control_device_t

*dev,

int32_t

led);int

(*set_off)(struct

led_control_device_t

*dev,

int32_t

led);};HAL

stub

定义相关结构体控制的supportingAPI在HALstub的opencallback里提供HALstub的openoperation必需提供supportingAPI给runtimeHAL

Stub

supporting

APIled_module_methods继承hw_module_methods_t,实现open的callbackstruct

hw_module_methods_t

led_module_methods

={open:

led_device_open};2.用HAL_MODULE_INFO_SYM实例led_module_t,这个名称不可修改tag:需要制定为

HARDWARE_MODULE_TAGid:指定为

HAL

Stub的module

IDmethods:struct

hw_module_methods_t,为

HAL所定义的「method」const

struct

led_module_t

HAL_MODULE_INFO_SYM

=

{common:

{tag:HARDWARE_MODULE_TAG,version_major:1,version_minor:0,id:LED_HARDWARE_MODULE_ID,name:

"Sample

LEDStub",author:

"TheMokoid

OpenSourceProject",methods:

&led_module_methods,}/*

supporting

APIs

gohere.

*/};完成功能实现和HALstubled_module_methods继承hw_module_methods_t,实现open的callbackstruct

hw_module_methods_t

led_module_methods

=

{open:

led_device_open};用HAL_MODULE_INFO_SYM实例led_module_t,这个名称不可修改tag:需要制定为

HARDWARE_MODULE_TAGid:指定为

HAL

Stub的module

IDmethods:struct

hw_module_methods_t,为HAL所定义的「method」const

struct

led_module_t

HAL_MODULE_INFO_SYM

=

{common:

{tag:

HARDWARE_MODULE_TAG,version_major:

1,version_minor:

0,id:

LED_HARDWARE_MODULE_ID,name:

"Sample

LED

Stub",author:

"The

Mokoid

Open

SourceProject",methods:

&led_module_methods,}/*

supporting

APIs

go

here.

*/};3.

open是一个必须实现的callback

API,负责申请结构体空间,填充信息,具体操作API接口,打开Linux驱动。由于存在多重继承关系,只需对子结构体hw_device_t对象申请空间即可。int

led_device_open(const

struct

hw_module_t*

module,

const

char*

name,struct

hw_device_t**

device){struct

led_control_device_t

*dev;dev

=

(struct

led_control_device_t

*)malloc(sizeof(*dev));memset(dev,

0,

sizeof(*dev));dev->common.tag

=

HARDWARE_DEVICE_TAG;dev->common.version

=

0;dev->common.module

=

module;dev->common.close

=

led_device_close;dev->set_on

=

led_on;dev->set_off

=

led_off;*device

=

&dev->common;/**

Initialize

Led

hardware

here.*/dev->fd

=

open(LED_DEVICE,

O_RDONLY);if(dev->fd

<

0)return

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论