往期鸿蒙全套实战精彩文章必看内容:(文中附带鸿蒙全栈学习资料)
功能简介
Light驱动模型为上层Light硬件服务层提供稳定的灯控制能力接口,包括获取灯类型、配置点灯模式、配置灯闪烁效果、点灯、熄灯等。基于HDF(Hardware Driver Foundation)驱动框架开发的Light驱动模型,实现跨操作系统迁移,器件差异配置等功能。实现Light驱动“一次开发,多系统部署”的目标。Light驱动模型如图1所示:
图 1 Light驱动模型图

运作机制
通过介绍Light驱动模型的加载以及运行流程,对模型内部关键组件以及关联组件之间的关系进行了划分,整体加载流程如图2所示:
图 2 Light驱动运行图

以标准系统RK3568为例,介绍Light模块驱动加载及运行流程:
- Device Manager从device_info.hcs配置文件中读取Light设备管理配置信息。
- Device Manager从light_config.hcs配置文件中读取Light数据配置信息。
- HCS Parser解析Light设备管理配置信息,加载对应的Light Host,并控制Host完成驱动的加载。
- Light Proxy获取到Light HDI接口服务实例后,通过IPC(Inter-Process Communication)调用到Light Stub。
- Light Stub主要处理与IPC相关的业务逻辑,完成参数反序列化后调用Light Controller。
- Light Controller中是HDI接口的真正实现,通过IPC调用Light抽象驱动接口,进一步操作Light硬件设备。
开发指导
场景介绍
灯设备的控制,在实际生活中比比皆是,例如短信通知时闪灯、终端电量不足时预警、充电时根据充电进度变换灯的颜色等等。这些动作的实现,都需要使用Light驱动模型提供的接口,动态配置点灯模式、配置灯闪烁效果、点灯、熄灯等。
接口说明
Light驱动模型支持获取系统中所有灯的信息、动态配置闪烁模式和闪烁时间的能力。Light硬件服务调用GetLightInfo获取Light设备的基本信息,调用TurnOnLight接口启动配置的闪烁效果,调用TurnOffLight接口关闭Light设备。Light驱动模型对外开放的API接口能力,参考表1。
表1 Light驱动模型对外API接口能力介绍
注:以下接口列举的为C接口,接口声明见文件/drivers/peripheral/light/interfaces/include。
| 接口名 | 功能描述 |
|---|---|
| int32_t (*GetLightInfo)(struct LightInfo **lightInfo, uint32_t *count) | 获取当前系统中所有类型的灯信息,lightInfo表示指向灯信息的二级指针,count表示指向灯数量的指针。 |
| int32_t (*TurnOnLight)(uint32_t lightId, struct LightEffect *effect) | 根据指定的灯类型ID打开列表中的可用灯,lightId表示灯类型ID,effect表示指向灯效果的指针。 |
| int32_t (*TurnOffLight)(uint32_t lightId) | 根据指定的灯类型ID关闭列表中的可用灯。 |
| int32_t (*TurnOnMultiLights)(uint32_t lightId, const struct LightColor *colors, const uint32_t count); | 根据指定的灯类型ID打开相应灯光中包含的多个子灯光。 |
开发步骤
基于HDF驱动框架,按照驱动Driver Entry程序,完成Light驱动开发,资源配置及HCS配置文件解析。
-
灯驱动在Light Host中的配置信息。
-
Light HCS文件代码路径:vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs。
-
具体代码实现如下:
/* Light设备HCS配置 */ light :: host { hostName = "light_host"; device_light :: device { device0 :: deviceNode { policy = 2; // 驱动服务发布的策略(0:不提供服务,1:对内核态发布服务;2:对内核态和用户态都发布服务) priority = 100; // Light驱动启动优先级(0-200),值越大优先级越低,建议配置为100,优先级相同则不保证device的加载顺序 preload = 0; // 驱动按需加载字段,0:加载;2:不加载 permission = 0664; // 驱动创建设备节点权限 moduleName = "HDF_LIGHT"; // Light驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 serviceName = "hdf_light"; // Light驱动对外发布服务的名称,必须唯一 deviceMatchAttr = "hdf_light_driver"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 } } }
-
-
灯驱动私有HCS配置:
-
代码实现路径:vendor\hihope\rk3568\hdf_config\khdf\light\light_config.hcs。
-
具体代码实现如下:
root { lightConfig { boardConfig { match_attr = "hdf_light_driver"; lightAttr { light01 { lightId = [1]; // Lightid可以包含多个逻辑灯光ID,例如:1表示电源指示灯。 lightName
-

1321

被折叠的 条评论
为什么被折叠?



