移植案例与原理 - HDF驱动框架-驱动配置接口 原创 精华
移植案例与原理 - HDF驱动框架-驱动配置接口
【本文正在参与优质创作者激励】
我们之前的系列中,已经了解如何使用HCS来定义设备资源配置中树(device resource configuration tree)。那么,这些配置信息是怎么在驱动开发中获取的呢?本文专门分析查询和读取HCS配置树的常用接口。
在文件include\utils\device_resource_if.h中,定义了设备配置树的结构体和常用接口。
1、HCS结构体
⑴处定义了枚设备资源文件类型,当前HDF只支持HCS配置文件。属性和节点是HCS的基本结构,⑵处是设备资源配置树的属性结构体,而每一个节点中的属性组成了单向链表,把节点中的各个属性依次连接。⑶是设备资源配置树的节点结构体,包含节点名称、节点hash值、节点属性结构体指针、节点的父节点、子节点和兄弟节点。
/**
* @brief Enumerates configuration file types.
*/
⑴ typedef enum {
HDF_CONFIG_SOURCE = 0, /**< HDF configuration file */
INVALID, /**< Invalid configuration file type */
} DeviceResourceType;
/**
* @brief Defines the attributes of a tree node in the configuration tree.
*
* The tree node attributes are saved in a linked list. The information about each node in the linked list contains
* the attribute name, attribute value, and pointer that points to the next attribute.
*/
⑵ struct DeviceResourceAttr {
const char *name; /**< Pointer to the attribute name */
const char *value; /**< Pointer to the attribute value */
struct DeviceResourceAttr *next; /**< Pointer to the next attribute of the node in the configuration tree. */
};
/**
* @brief Defines a tree node in the configuration tree.
*
* The tree node information includes the node name, unique node ID, node attributes, parent node, child nodes,
* and sibling nodes.
*/
⑶ struct DeviceResourceNode {
const char *name; /**< Pointer to the node name */
uint32_t hashValue; /**< Unique ID of a node */
struct DeviceResourceAttr *attrData; /**< Pointer to the node attributes */
struct DeviceResourceNode *parent; /**< Pointer to the parent node */
struct DeviceResourceNode *child; /**< Pointer to a child node */
struct DeviceResourceNode *sibling; /**< Pointer to a sibling node */
};
2、HCS常用接口
2.1 结构体struct DeviceResourceIface
在结构体struct DeviceResourceIface中定义了获得设备资源配置数信息的接口函数,如下,对每个接口的详细介绍,可以参考文件include\utils\device_resource_if.h中的注释,或者API文档。下文会使用一个表格简单说明下这些常用接口。
/**
* @brief Provides functions for obtaining information about the device resource configuration tree.
*
* This structure provides functions for obtaining information about the device resource configuration tree,
* including the root node, the <b>unit</b> attribute data, and the <b>String</b> attribute data.
*
* @since 1.0
* @version 1.0
*/
struct DeviceResourceIface {
const struct DeviceResourceNode *(*GetRootNode)(void);
bool (*GetBool)(const struct DeviceResourceNode *node, const char *attrName);
int32_t (*GetUint8)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint8_t def);
int32_t (*GetUint8ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,
uint8_t *value, uint8_t def);
int32_t (*GetUint8Array)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint32_t len,
uint8_t def);
int32_t (*GetUint16)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value, uint16_t def);
int32_t (*GetUint16ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,
uint16_t *value, uint16_t def);
int32_t (*GetUint16Array)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value,
uint32_t len, uint16_t def);
int32_t (*GetUint32)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value, uint32_t def);
int32_t (*GetUint32ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,
uint32_t *value, uint32_t def);
int32_t (*GetUint32Array)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value,
uint32_t len, uint32_t def);
int32_t (*GetUint64)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value, uint64_t def);
int32_t (*GetUint64ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,
uint64_t *value, uint64_t def);
int32_t (*GetUint64Array)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value,
uint32_t len, uint64_t def);
int32_t (*GetString)(const struct DeviceResourceNode *node, const char *attrName, const char **value,
const char *def);
int32_t (*GetStringArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,
const char **value, const char *def);
int32_t (*GetElemNum)(const struct DeviceResourceNode *node, const char *attrName);
const struct DeviceResourceNode *(*GetNodeByMatchAttr)(const struct DeviceResourceNode *node,
const char *attrValue);
const struct DeviceResourceNode *(*GetChildNode)(const struct DeviceResourceNode *node, const char *nodeName);
const struct DeviceResourceNode *(*GetNodeByRefAttr)(const struct DeviceResourceNode *node, const char *attrName);
};
HCS配置中查询读取常用接口如下:
接口名称 | 接口描述 |
---|---|
const struct DeviceResourceNode *(*GetRootNode)(void) | 获取配置树的根节点。驱动框架启动时会创建配置树,驱动开发者可以通过此接口获取配置树的根节点。 |
bool (*GetBool)(const struct DeviceResourceNode *node, const char *attrName) | 获取树节点下Bool型属性的值 |
int32_t (*GetUint8)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint8_t def) | 获取树节点下Uint8类型属性值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint8ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint8_t *value, uint8_t def) | 获取树节点下Uint8数组型属性的第index个值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint8Array)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint32_t len, uint8_t def) | 获取树节点下Uint8数组型属性的值,保存在value,获取失败则使用def默认值填充数组。 |
int32_t (*GetUint16)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value, uint16_t def) | 获取树节点下Uint16型属性的值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint16ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,uint16_t *value, uint16_t def) | 获取树节点下Uint16数组型属性的第index个值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint16Array)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value,uint32_t len, uint16_t def) | 获取节点下Uint16数组型属性的值,保存在value,获取失败则使用def默认值填充数组 |
int32_t (*GetUint32)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value, uint32_t def) | 获取树节点下Uint32型属性的值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint32ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint32_t *value, uint32_t def) | 获取树节点下Uint32数组型属性的第index个值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint32Array)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value,uint32_t len, uint32_t def) | 获取节点下Uint32数组型属性的值,保存在value,获取失败则使用def默认值填充数组。 |
int32_t (*GetUint64)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value, uint64_t def) | 获取树节点下Uint64型属性的值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint64ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,uint64_t *value, uint64_t def) | 获取树节点下Uint64数组型属性的第index个值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetUint64Array)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value,uint32_t len, uint64_t def) | 获取树节点下Uint64数组型属性的值,保存在value,获取失败则使用def默认值填充数组。 |
int32_t (*GetString)(const struct DeviceResourceNode *node, const char *attrName, const char **value,const char *def) | 获取节点下String型属性的值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetStringArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index,const char **value, const char *def) | 获取树节点下String数组型属性的第index个值,保存在value,获取失败则使用def默认值。 |
int32_t (*GetElemNum)(const struct DeviceResourceNode *node, const char *attrName) | 获取树节点下数组型属性中属性数量 |
const struct DeviceResourceNode *(*GetNodeByMatchAttr)(const struct DeviceResourceNode *node,const char *attrValue) | 通过HCS的保留属性"match_attr"的属性值获取当前树节点下的某一个特定节点。 |
const struct DeviceResourceNode *(*GetChildNode)(const struct DeviceResourceNode *node, const char *nodeName) | 通过节点名称获取当前树节点的子节点。 |
const struct DeviceResourceNode *(*GetNodeByRefAttr)(const struct DeviceResourceNode *node, const char *attrName) | 获取树节点下节点型属性指向的树节点。 |
2.2 接口DeviceResourceGetIfaceInstance()
接口struct DeviceResourceIface *DeviceResourceGetIfaceInstance(DeviceResourceType type)用于获取设备资源接口句柄。通过该接口获取DeviceResourceIface结构体指针,就可以使用上文列表的资源配置树常用接口。
/**
* @brief Obtains the device resource interface handle of the corresponding configuration tree type.
*
* You can use the obtained handle to use the device resource interface.
*
* @param type Indicates the type of the device resource interface handle to obtain.
*
* @return Returns the device resource interface handle if the operation is successful; returns <b>NULL</b> otherwise.
* @since 1.0
* @version 1.0
*/
struct DeviceResourceIface *DeviceResourceGetIfaceInstance(DeviceResourceType type);
参考站点
- OpenHarmony / drivers_adapter
- HarmonyOS Device > 文档 > 指南 > 基础能力 > HDF驱动开发框架
- HarmonyOS Device > 文档 > 指南 > 基础能力 > HDF配置管理
- HDF驱动框架
- 轻量带屏解决方案之恒玄芯片移植案例
小结
本文介绍定义了HCS设备配置树的结构体和常用接口,后续会介绍更多的HDF驱动框架知识。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。感谢阅读,有什么问题,请留言。