/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ /** * @addtogroup DriverConfig * @{ * * @brief Defines APIs for HDF driver developers to read driver configuration information. * * During version compilation of the device resource source file defined by developers, the compilation tool * (for example, the compilation tool of the HCS file is hc-gen) generates bytecodes. When the HDF starts, * it transfers the bytecode memory to the DriverConfig module. The DriverConfig module converts * the bytecodes into a configuration tree and provides APIs for developers to query the tree. * * @since 1.0 * @version 1.0 */ /** * @file device_resource_if.h * * @brief Declares the APIs for querying the configuration tree. * * @since 1.0 * @version 1.0 */ #ifndef DEVICE_RESOURCE_IF_H #define DEVICE_RESOURCE_IF_H #include "hdf_base.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ /** * @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 */ }; /** * @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 unit attribute data, and the String attribute data. * * @since 1.0 * @version 1.0 */ struct DeviceResourceIface { /** * @brief Obtains the root node of the configuration tree. * * When the driver framework is started, a configuration tree is created. You can use this function to obtain * the root node of the configuration tree. * * @return Returns the root node of the configuration tree if the operation is successful; * returns NULL otherwise. * @since 1.0 * @version 1.0 */ const struct DeviceResourceNode *(*GetRootNode)(void); /** * @brief Obtains the value of a BOOL attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * * @return Returns true if the operation is successful and the value of the BOOL attribute is * true; returns false otherwise. * @since 1.0 * @version 1.0 */ bool (*GetBool)(const struct DeviceResourceNode *node, const char *attrName); /** * @brief Obtains the value of a Uint8 attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the attribute value is obtained successfully; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint8)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint8_t def); /** * @brief Obtains the value of a Unit8 array attribute numbered index of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param index Indicates the number of the index (counting from 0) where the value is to obtain. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the array attribute value is obtained successfully; returns a negative value * otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint8ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint8_t *value, uint8_t def); /** * @brief Obtains the value of a Uint8 array attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param value Indicates the pointer to the array that stores the obtained data. The memory of the array is applied * by the user. * @param len Indicates the length of the array. * @param def Indicates the value to fill into value if the operation fails. If the obtained attribute value * contains 16-bit, 32-bit, or 64-bit data, the element corresponding to the 16-bit, 32-bit, or 64-bit data in the * array is filled using the value of def, and the other elements are filled with the actual value obtained. * If the failure is caused by other exceptions, the first element in the array is filled using the value of * def. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint8Array)(const struct DeviceResourceNode *node, const char *attrName, uint8_t *value, uint32_t len, uint8_t def); /** * @brief Obtains the value of a Uint16 attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint16)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value, uint16_t def); /** * @brief Obtains the value of a Uint16 array attribute numbered index of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param index Indicates the number of the index (counting from 0) where the value is to obtain. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint16ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint16_t *value, uint16_t def); /** * @brief Obtains the values of a Uint16 array attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param value Indicates the pointer to the array that stores the obtained data. The memory of the array is applied * by the user. * @param len Indicates the length of the array. * @param def Indicates the value to fill into value if the operation fails. If the obtained attribute value * contains 32-bit or 64-bit data, the element corresponding to the 32-bit or 64-bit data in the array is filled * using the value of def, and the other elements are filled with the actual value obtained. If the failure * is caused by other exceptions, the first element in the array is filled using the value of def. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint16Array)(const struct DeviceResourceNode *node, const char *attrName, uint16_t *value, uint32_t len, uint16_t def); /** * @brief Obtains the value of a Uint32 attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint32)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value, uint32_t def); /** * @brief Obtains the value of a Uint32 array attribute numbered index of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param index Indicates the number of the index (counting from 0) where the value is to obtain. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint32ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint32_t *value, uint32_t def); /** * @brief Obtains the values of a Uint32 array attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param value Indicates the pointer to an array that stores the obtained data. * @param len Indicates the pointer to the array that stores the obtained data. The memory of the array is applied * by the user. * @param def Indicates the value to fill into value if the operation fails. If the obtained attribute value * contains 64-bit data, the element corresponding to the 64-bit data in the array is filled using the value of * def, and the other elements are filled with the actual value obtained. If the failure is caused by other * exceptions, the first element in the array is filled using the value of def. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint32Array)(const struct DeviceResourceNode *node, const char *attrName, uint32_t *value, uint32_t len, uint32_t def); /** * @brief Obtains the value of a Uint64 attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint64)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value, uint64_t def); /** * @brief Obtains the value of a Uint64 array attribute numbered index of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param index Indicates the number of the index (counting from 0) where the value is to obtain. * @param value Indicates the pointer to the memory that stores the obtained data. The memory is applied * by the user. * @param def Indicates the value to fill into the memory pointed by value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint64ArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, uint64_t *value, uint64_t def); /** * @brief Obtains the values of a Uint64 array attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param value Indicates the pointer to the array that stores the obtained data. The memory of the array is applied * by the user. * @param len Indicates the length of the array. * @param def Indicates the value to fill into the first element in the value array if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetUint64Array)(const struct DeviceResourceNode *node, const char *attrName, uint64_t *value, uint32_t len, uint64_t def); /** * @brief Obtains the value of a String attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the attribute. * @param value Indicates the double pointer to the memory where the obtained data is stored. The string memory is * provided by the function implementer. Users only need to transfer the double pointer. The memory cannot be * released after being used. * @param def Indicates the value to be passed to value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetString)(const struct DeviceResourceNode *node, const char *attrName, const char **value, const char *def); /** * @brief Obtains the value of a String array attribute numbered index of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * @param index Indicates the number of the index (counting from 0) where the value is to obtain. * @param value Indicates the double pointer to the memory where the obtained data is stored. The string memory is * provided by the function implementer. Users only need to transfer the double pointer. The memory cannot be * released after being used. * @param def def Indicates the value to be passed to value if the operation fails. * * @return Returns 0 if the operation is successful; returns a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetStringArrayElem)(const struct DeviceResourceNode *node, const char *attrName, uint32_t index, const char **value, const char *def); /** * @brief Obtains the number of values for an array attribute of a configuration tree node. * * @param node Indicates the pointer to the configuration tree node. * @param attrName Indicates the pointer to the name of the array attribute. * * @return Returns the number of values for an array attribute if the operation is successful; * return a negative value otherwise. * @since 1.0 * @version 1.0 */ int32_t (*GetElemNum)(const struct DeviceResourceNode *node, const char *attrName); /** * @brief Obtains a specified child node of the current tree node based on the value of a specific reserved * attribute (for example, the reserved attribute of the HCS is match_attr). * * There is a specific reserved attribute in the syntax of the device resource configuration source file. * If this attribute is set for a tree node, you can obtain the node based on the attribute value. * Users can set the attribute value based on the usage of their own nodes, but they must ensure that the attribute * values are unique. * * @param node Indicates the pointer to the node for whom a child node is to be obtained. The node can be the child * node's parent node or grandparent node. * @param attrValue Indicates the pointer to the value of the reserved attribute configured for the child node. * * @return Returns the target node if the operation is successful; returns NULL otherwise. * @since 1.0 * @version 1.0 */ const struct DeviceResourceNode *(*GetNodeByMatchAttr)(const struct DeviceResourceNode *node, const char *attrValue); /** * @brief Obtains the child node with a specified node name from a parent node. * * @param node Indicates the pointer to the parent node. * @param nodeName Indicates the pointer to the name of the child node to obtain. * * @return Returns the child nodes if the operation is successful; returns NULL otherwise. * @since 1.0 * @version 1.0 */ const struct DeviceResourceNode *(*GetChildNode)(const struct DeviceResourceNode *node, const char *nodeName); /** * @brief Obtains the node that is specified by a node-type attribute of a configuration tree node. * * If the attribute value is a configuration tree node, the path of the node is converted to a globally unique * hashValue when the device resource source file is compiled (for example, the compilation tool of the HCS * source file is hc-gen). For details about the hashValue, see {@link struct DeviceResourceNode}. * When you obtain a tree node using the node-type attribute, you obtain the hashValue through the node-type * attribute first, and then traverse the tree to obtain the tree node corresponding to the hashValue. * * @param node Indicates the pointer to the tree node whose attribute is to obtain. * @param attrName Indicates the pointer to the name of attribute whose value is a node path. * @return Returns the target node if the operation is successful; returns NULL otherwise. * @since 1.0 * @version 1.0 */ const struct DeviceResourceNode *(*GetNodeByRefAttr)(const struct DeviceResourceNode *node, const char *attrName); }; /** * @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 NULL otherwise. * @since 1.0 * @version 1.0 */ struct DeviceResourceIface *DeviceResourceGetIfaceInstance(DeviceResourceType type); /** * @brief Traverses the attributes of the current configuration tree node. * * This operation is a for loop in essence. * * @param node Indicates the configuration tree node to traverse. * @param attr Indicates the traversed attributes. * @since 1.0 * @version 1.0 */ #define DEV_RES_NODE_FOR_EACH_ATTR(node, attr) \ for ((attr) = (node)->attrData; (attr) != NULL; (attr) = (attr)->next) /** * @brief Traverses the child nodes of the current configuration tree node. * * This operation is a for loop in essence. * * @param node Indicates the configuration tree node to traverse. * @param childNode Indicates the traversed child nodes. * @since 1.0 * @version 1.0 */ #define DEV_RES_NODE_FOR_EACH_CHILD_NODE(node, childNode) \ for ((childNode) = (node)->child; (childNode) != NULL; (childNode) = (childNode)->sibling) #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* DEVICE_RESOURCE_IF_H */ /** @} */