/*
* Copyright (c) 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.
*/
#ifndef HDF_CHIP_H
#define HDF_CHIP_H
#include "hdf_chip_config.h"
#include "osal/osal_time.h"
struct HdfReset;
struct HdfPower;
struct HdfPowerOps {
/**
* @brief Powers on the device using a specified power manage interface.
*
* @param powerMgr Indicates the pointer to the power manage interface.
* @return Returns 0 if the device is powered on; returns a negative value otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t (*On)(struct HdfPower *powerMgr);
/**
* @brief Powers off the device using a specified power manage interface.
*
* @param powerMgr Indicates the pointer to the power manage interface.
* @return Returns 0 if the device is powered off; returns a negative value otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t (*Off)(struct HdfPower *powerMgr);
/**
* @brief Releases power using a specified power manage interface.
*
* @param powerMgr Indicates the pointer to the power manage interface.
*
* @since 1.0
* @version 1.0
*/
void (*Release)(struct HdfPower *powerMgr);
};
/**
* @brief Provides functions for powering on and off the device, releasing power, and creating a power manage interface.
*
* @since 1.0
* @version 1.0
*/
struct HdfPower {
const struct HdfPowerOps *ops;
};
struct HdfResetOps {
/**
* @brief Resets the WLAN module using a specified reset manage interface.
*
* @param resetManager Indicates the pointer to the reset manage interface.
* @return Returns 0 if the WLAN module is reset; returns a negative value otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t (*Reset)(struct HdfReset *resetManager);
/**
* @brief Releases a specified reset manage interface.
*
* @param resetMgr Indicates the pointer to the reset manage interface.
*
* @since 1.0
* @version 1.0
*/
void (*Release)(struct HdfReset *resetMgr);
};
/**
* @brief Describes the reset manage interface, including its configuration and functions.
*
* @since 1.0
* @version 1.0
*/
struct HdfReset {
const struct HdfResetOps *ops;
};
struct HdfUartBus {
const char *name;
};
struct HdfBus {
uint8_t type;
union {
struct HdfUartBus uart;
};
};
enum FunctionType { FUNC_TYPE_WLAN = 0, FUNC_TYPE_BT };
struct HdfVirtualDevice {
const char *name;
struct HdfCompositeDevice *parent;
struct HdfPower *power;
struct HdfReset *reset;
struct HdfBus *bus;
uint8_t bootUpTimeOut;
uint8_t functionType;
};
struct HdfVirtualDevice *CreateVirtualDevice(struct HdfChipConfig *config);
void ReleaseVirtualDevice(struct HdfVirtualDevice *device);
inline static int32_t HdfPowerOnVirtualDevice(struct HdfVirtualDevice *device) {
if (device == NULL) {
return HDF_FAILURE;
}
if (device->power == NULL || device->power->ops == NULL || device->power->ops->On == NULL) {
return HDF_FAILURE;
}
return device->power->ops->On(device->power);
}
inline static int32_t HdfPowerOffVirtualDevice(struct HdfVirtualDevice *device) {
if (device == NULL) {
return HDF_FAILURE;
}
if (device->power == NULL || device->power->ops == NULL || device->power->ops->Off == NULL) {
return HDF_FAILURE;
}
return device->power->ops->Off(device->power);
}
inline static int32_t HdfResetVirtualDevice(struct HdfVirtualDevice *device) {
int32_t ret;
if (device == NULL) {
return HDF_FAILURE;
}
if (device->reset == NULL || device->reset->ops == NULL || device->reset->ops->Reset == NULL) {
return HDF_FAILURE;
}
ret = device->reset->ops->Reset(device->reset);
if (ret != HDF_SUCCESS) {
return ret;
}
OsalMSleep(device->bootUpTimeOut);
return HDF_SUCCESS;
}
#endif