




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诗词的艺术表现形式试题及答案
- 疑难解析2024年思政理论试题及答案
- (高清版)DB12∕T 540-2014 规模化猪场粪污处理与利用技术规范
- 快递收件区域承包合同(2025年版)
- 还款协议书有保证人(2025年版)
- 行业经济分析与证券投资试题及答案
- 2025年度高空作业安全协议承诺书与高空作业现场安全评估合同
- 2025年度私人摩托车转让协议书-含品牌授权及售后服务
- 2025年红薯种植基地收购合同农作物资料保密处理协议
- 二零二五婚前财产放弃婚后共同财产管理及婚姻法律援助协议
- 国开《小学数学教学研究》形考任务三
- 人工挖孔桩规范要求《JGJ94-2008 建筑桩基技术规范》删减版
- 专题六 如何理解价值形式的发展与货币的产生
- 污水处理厂安装工程质量通病及预防措施
- 高中高考补写句子公开课一等奖课件省赛课获奖课件
- 文献检索教学大纲
- 针刺伤的防范应急预案
- 2016年初级护师考试《相关专业知识》真题及答案
- 中医基础理论教学讲稿
- 硫磺安全技术说明书MSDS
- 重症专科护士考试题库(含答案)
评论
0/150
提交评论