移植案例与原理 - HDF驱动框架-驱动配置接口 原创 精华

zhushangyuan_
发布于 2022-2-17 23:51
浏览
1收藏

移植案例与原理 - 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);

参考站点

小结

本文介绍定义了HCS设备配置树的结构体和常用接口,后续会介绍更多的HDF驱动框架知识。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。感谢阅读,有什么问题,请留言。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
4
收藏 1
回复
举报
回复
    相关推荐