文档内容拷贝自:
codebase_host/yunhal/opendoc/zh/yunhal_doc/sensors.md
联系人:@黄啸
本文档介绍了YunOS Sensor Framework的整体软件框架设计,并详细介绍了YunOS Sensor Hardware Abstract Layer,后文称Sensor Yunhal,为芯片厂商如何进行实现工作提供了指导。此外,本文档提供了对Sensor YunHal接口基本功能的测试程序及其使用方法,以便厂商快速调试Sensor基本功能是否OK。
YunOS Sensor Framework整体软件架构如图2.1所示:
Client端为APP提供C++和JavaScript两套Sensor API;Server端则是一个后台服务Daemon,通过Socket来处理Client端命令并最终转换成Sensor YunHal接口,同时也将Hal产生的数据分发到各个Sensor Client。
芯片厂商需要针对自身Sensor hardware的能力提供YunHal的实现,函数接口定义在yunhal/Sensor.h头文件中,下面将具体介绍。
Sensor YunHal分别通过 sens_module_t 和 sens_op_t 来描述Hal模块和具体执行的接口,同时,为了能够使用YunHal提供的统一接口,
sens_module_t 和 sens_op_t 分别”继承“了 VendorModule 和 VendorDevice 。Sensor YunHal的实现即具体来实现上述接口,可以分成两步:
1. 实现 sens_module_t 接口, 声明模块入口;
2. 实现 sens_op_t 接口;
sens_module_t 各字段说明如下表:
域 | 类型 | 说明 |
---|---|---|
common | VendorModule | 模块入口 |
reserved | function | 保留字段,扩展使用 |
声明模块入口,是为了Sensor YunHal的实现模块,能被libhal所装载,示例代码如下:
sens_module_t sens_module = { .common = { .version = SENSOR_YUNHAL_API_VERSION_0_0, .id = "sensor", .name = "YunOS Sensor Module", .author = "YunOS", .CreateDevice = create_device, }, .reserved = {NULL}, }; VENDOR_MODULE_ENTRY(sens_module)
其中,version字段描述Sensor YunHal接口的版本,会随着接口的演进来更新,目前为 SENSOR_YUNHAL_API_VERSION_0_0 ;CreateDevice则是一个工厂方法,用来生产 sens_op_t 。
域 | 类型 | 说明 |
---|---|---|
__common__ | VendorDevice | 设备入口 |
__init()__ | void *(* init)() | Sensor操作初始化函数 |
__exit()__ | void (* exit)() | Sensor操作结束函数 |
__get_all_sensors()__ | int (* get_all_sensors)(void *ctx, sens_info_t const** list) | 获取全部Sensor设备 |
__enable()__ | int (* enable)(void *ctx, int id, int enabled) | 打开关闭Sensor |
__config()__ | int (* config)(void *ctx, int id, int64_t period_ns, int64_t max_latency_ns, int options) | 设置batch参数 |
__flush()__ | int (* flush)(void *ctx, int id) | 刷新Sensor FIFO |
__poll_event()__ | int (* poll_event)(void *ctx, sens_event_t* data, int max_num) | 获取Sensor数据 |
__resvd__ | void * | 保留字段,扩展使用 |
示例代码如下:
sens_op_t sens_op = { .common = { .version = SENSOR_YUNHAL_API_VERSION_0_0, .id = NULL, .module = NULL, .Destroy = NULL, }, .init = init, .exit = exit, .get_all_sensors = get_all_sensors, .enable = enable, .config = config, .flush = flush, .poll_event = poll_event, .resvd = {NULL}, };
Sensor HAL 实现中,确保对 YunOS 主镜像具有最小的依赖,即除了 glibc、libstdc++ 以及 liblog 以外,不依赖其他 libraries。
一个示例的 yunos.mk 如下:
LOCAL_PATH=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my_sensor LOCAL_MODULE_PATH := usr/lib/yunhal LOCAL_SRC_FILES := my_sensor.c LOCAL_C_INCLUDES := \ $(yunhal-includes) \ $(base-includes) LOCAL_SHARED_LIBRARIES := libhal liblog LOCAL_COMPILE_SHELL_CMD := \ mkdir -p $(XMAKE_ROOTFS)/usr/lib/yunhal/ && \ ln -sf my_sensor.so $(XMAKE_ROOTFS)/usr/lib/yunhal/libyunhal_Sensor.so # May be changed to include $(BUILD_HAL) ? include $(BUILD_SHARED_LIBRARY)
Sensor Yunhal Gtest是基于gtest开发的,通过Sensor.h定义的Sensor Yunhal APIs,对vendor实现的Yunhal进行自动化测试;也可以通过Yunhal对Android Hal的Wrapper,对vendor提供的Android Hal进行测试。本Test测试了Yunhal定义的全部API,并验证获取数据的合法性,以最小的effect测试厂商实现的Yunhal,便于厂商快速进行Sensor Framework 适配。
模块 | 测试用例 | 说明 | 备注 |
---|---|---|---|
Sensor Yunhal | SensorYunHalTest | 1. 测试Sensor Yunhal加载是否正常。 2.测试Sensor Yunhal相关数据结构设置是否正确。 3. 依次调用Sensor Yunhal API。 4. 验证Yunhal上报数据。 |
N/A |
执行: yunhal_tests –gtest_filter=SensorYunHalTest.*
成功的情况:
poll_event无数据导致失败的情况(9832N会遇到):