/* * 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 SDIO * @{ * * @brief Declares standard APIs of basic secure digital input and output (SDIO) capabilities. * * You can use this module to access the SDIO and enable the driver to operate an SDIO-compliant device. * These capabilities include reading and writing data based on SDIO, setting the block size, * applying for and releasing interrupts, enabling and disabling devices, and occupying and releasing the bus. * * @since 1.0 */ /** * @file sdio_if.h * * @brief Declares the standard SDIO APIs. * * @since 1.0 */ #ifndef SDIO_IF_H #define SDIO_IF_H #include "mmc_if.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ /** * @brief Enumerates SDIO common information types. * * When obtaining SDIO common information by calling {@link SdioGetCommonInfo} or setting the information * by calling {@link SdioSetCommonInfo}, you need to pass the information type. * * @since 1.0 */ typedef enum { SDIO_FUNC_INFO = 0, /**< Functionality information */ SDIO_OTHER_INFO, /**< Other information */ } SdioCommonInfoType; /** * @brief Defines the SDIO capabilities. * * You can obtain and set the SDIO capabilities by calling {@link SdioGetCommonInfo} and {@link SdioSetCommonInfo} * with {@link SdioCommonInfo} and {@link SdioCommonInfoType} passed. * * @since 1.0 */ typedef struct { uint32_t maxBlockNum; /**< Maximum number of blocks in a request */ uint32_t maxBlockSize; /**< Maximum number of bytes in a block. * The value ranges from 1 to 2048. */ uint32_t maxRequestSize; /**< Maximum number of bytes in a request. * The value ranges from 1 to 2048. */ uint32_t enTimeout; /**< Maximum timeout duration, in milliseconds. * The value cannot exceed 1 second. */ uint32_t funcNum; /**< Functionality number, ranging from 1 to 7. */ uint32_t irqCap; /**< IRQ capabilities */ void *data; /**< Private data */ } SdioFuncInfo; /** * @brief Defines SDIO common information. * * You can obtain and set common SDIO information by calling {@link SdioGetCommonInfo} and {@link SdioSetCommonInfo} * with {@link SdioCommonInfo} and {@link SdioCommonInfoType} passed. * * @since 1.0 */ typedef union { SdioFuncInfo funcInfo; /**< Functionality information */ } SdioCommonInfo; /** * @brief Defines SDIO function config. * * When enabling an SDIO controller, you must specify its SDIO functionality configurations for * selecting the required functionality. For details, see {@link SdioOpen}. * * @since 1.0 */ struct SdioFunctionConfig { uint32_t funcNr; /**< Functionality number, ranging from 1 to 7. */ uint16_t vendorId; /**< Vendor ID */ uint16_t deviceId; /**< Device ID */ }; /** * @brief Defines the function type of an SDIO IRQ. * * This function is registered when you call {@link SdioClaimIrq} to request the SDIO IRQ. * * @param data Indicates the private data passed to this IRQ (The data is specified when the IRQ is registered). * * @since 1.0 */ typedef void SdioIrqHandler(void *); /** * @brief Opens an SDIO controller with a specified bus number. * * Before using the SDIO interface, you can obtain the device handle of the SDIO controller * by calling {@link SdioOpen}. This function is used in pair with {@link SdioClose}. * * @param mmcBusNum Indicates the bus number. * @param config Indicates the pointer to SDIO functionality configurations. * * @return Returns the device handle {@link DevHandle} of the SDIO controller if the operation is successful; * returns NULL otherwise. * * @since 1.0 */ DevHandle SdioOpen(int16_t mmcBusNum, struct SdioFunctionConfig *config); /** * @brief Closes an SDIO controller. * * After the SDIO interface is used, you can close the SDIO controller by calling {@link SdioClose}. * This function is used in pair with {@link SdioOpen}. * * @param handle Indicates the pointer to the device handle of the SDIO controller. * * @since 1.0 */ void SdioClose(DevHandle handle); /** * @brief Incrementally reads a given length of data from the specified SDIO address. * * If the length of the data to read is greater than the size of a block, the data is read by block, * and the remaining data that is smaller than one block is read by byte. Otherwise, data is read by byte. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to read. * @param addr Indicates the start address of the data to read. * @param size Indicates the length of the data to read. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioReadBytes(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size); /** * @brief Incrementally writes a given length of data into the specified SDIO address. * * If the length of the data to write is greater than the size of a block, the data is written by block first, * and the remaining data that is smaller than one block is written by byte. Otherwise, data is written by byte. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to write. * @param addr Indicates the start address of the data to write. * @param size Indicates the length of the data to write. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioWriteBytes(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size); /** * @brief Reads a given length of data from the fixed SDIO address. * * If the length of the data to read is greater than the size of a block, the data is read by block, * and the remaining data that is smaller than one block is read by byte. Otherwise, data is read by byte. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to read. * @param addr Indicates the fixed address of the data to read. * @param size Indicates the length of the data to read. * @param scatterLen Indicates the length of the scatter list. If this value is not 0, the data is of the * scatter list type. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioReadBytesFromFixedAddr(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); /** * @brief Writes a given length of data into the fixed SDIO address. * * If the length of the data to write is greater than the size of a block, the data is written by block first, * and the remaining data that is smaller than one block is written by byte. Otherwise, data is written by byte. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to write. * @param addr Indicates the fixed address of the data to write. * @param size Indicates the length of the data to write. * @param scatterLen Indicates the length of the scatter list. If this value is not 0, the data is of the * scatter list type. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioWriteBytesToFixedAddr(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); /** * @brief Reads a given length of data from the address space of SDIO function 0. * * Currently, only one byte of data can be read. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to read. * @param addr Indicates the start address of the data to read. * @param size Indicates the length of the data to read. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioReadBytesFromFunc0(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size); /** * @brief Writes a given length of data into the address space of SDIO function 0. * * Currently, only one byte of data can be written. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param data Indicates the pointer to the data to write. * @param addr Indicates the start address of the data to write. * @param size Indicates the length of the data to write. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioWriteBytesToFunc0(DevHandle handle, uint8_t *data, uint32_t addr, uint32_t size); /** * @brief Sets the block size. * * If data to read or write is performed, use this function to set the block size. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param blockSize Indicates the block size to be set. If the value is 0, the default value is used. * The value ranges from 1 to 2048 bytes. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioSetBlockSize(DevHandle handle, uint32_t blockSize); /** * @brief Obtains common information. * * You can call this function to obtain the capabilities and private data of the I/O function. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param info Indicates the pointer to the common information to be obtained. * For details, see {@link SdioCommonInfo}. * @param infoType Indicates the type of the common information to be obtained. * For details, see {@link SdioCommonInfoType}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioGetCommonInfo(DevHandle handle, SdioCommonInfo *info, SdioCommonInfoType infoType); /** * @brief Sets common information. * * You can call this function to set the maximum timeout duration and private data. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param info Indicates the pointer to the common information to be set. * For details, see {@link SdioCommonInfo}. * @param infoType Indicates the type of the common information to be set. * For details, see {@link SdioCommonInfoType}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioSetCommonInfo(DevHandle handle, SdioCommonInfo *info, SdioCommonInfoType infoType); /** * @brief Flushes data. * * You can call this function when an SDIO needs to be reinitialized or an unexpected error occurs. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioFlushData(DevHandle handle); /** * @brief Claims a host exclusively. * * You can call this function to enable the SDIO module to exclusively claim a host * and then perform operations on the devices connected to the host. After performing required operations, * release the host by calling {@link SdioReleaseHost}. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @since 1.0 */ void SdioClaimHost(DevHandle handle); /** * @brief Releases the exclusively claimed host. * * This function is used in pair with {@link SdioClaimHost}. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @since 1.0 */ void SdioReleaseHost(DevHandle handle); /** * @brief Enables the SDIO device so that its register can be accessed. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioEnableFunc(DevHandle handle); /** * @brief Disables the SDIO device. * * This function is used in pair with {@link SdioEnableFunc}. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioDisableFunc(DevHandle handle); /** * @brief Claims an SDIO IRQ. * * When there is data, commands, or events, the IRQ function is executed. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * @param irqHandler Indicates the pointer to the SDIO IRQ function. For details, see {@link SdioIrqHandler}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioClaimIrq(DevHandle handle, SdioIrqHandler *irqHandler); /** * @brief Releases an SDIO IRQ. * * This function is used in pair with {@link SdioClaimIrq}. * * @param handle Indicates the pointer to the device handle of the SDIO controller obtained by {@link SdioOpen}. * * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. * * @since 1.0 */ int32_t SdioReleaseIrq(DevHandle handle); #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* SDIO_IF_H */ /** @} */