/* * Copyright 2023 NXP * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Public API for SDIO subsystem */ #ifndef ZEPHYR_INCLUDE_SD_SDIO_H_ #define ZEPHYR_INCLUDE_SD_SDIO_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief Initialize SDIO function. * * Initializes SDIO card function. The card function will not be enabled, * but after this call returns the SDIO function structure can be used to read * and write data from the card. * @param func: function structure to initialize * @param card: SD card to enable function on * @param num: function number to initialize * @retval 0 function was initialized successfully * @retval -EIO: I/O error */ int sdio_init_func(struct sd_card *card, struct sdio_func *func, enum sdio_func_num num); /** * @brief Enable SDIO function * * Enables SDIO card function. @ref sdio_init_func must be called to * initialized the function structure before enabling it in the card. * @param func: function to enable * @retval 0 function was enabled successfully * @retval -ETIMEDOUT: card I/O timed out * @retval -EIO: I/O error */ int sdio_enable_func(struct sdio_func *func); /** * @brief Set block size of SDIO function * * Set desired block size for SDIO function, used by block transfers * to SDIO registers. * @param func: function to set block size for * @param bsize: block size * @retval 0 block size was set * @retval -EINVAL: unsupported/invalid block size * @retval -EIO: I/O error */ int sdio_set_block_size(struct sdio_func *func, uint16_t bsize); /** * @brief Read byte from SDIO register * * Reads byte from SDIO register * @param func: function to read from * @param reg: register address to read from * @param val: filled with byte value read from register * @retval 0 read succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card read timed out * @retval -EIO: I/O error */ int sdio_read_byte(struct sdio_func *func, uint32_t reg, uint8_t *val); /** * @brief Write byte to SDIO register * * Writes byte to SDIO register * @param func: function to write to * @param reg: register address to write to * @param write_val: value to write to register * @retval 0 write succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card write timed out * @retval -EIO: I/O error */ int sdio_write_byte(struct sdio_func *func, uint32_t reg, uint8_t write_val); /** * @brief Write byte to SDIO register, and read result * * Writes byte to SDIO register, and reads the register after write * @param func: function to write to * @param reg: register address to write to * @param write_val: value to write to register * @param read_val: filled with value read from register * @retval 0 write succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card write timed out * @retval -EIO: I/O error */ int sdio_rw_byte(struct sdio_func *func, uint32_t reg, uint8_t write_val, uint8_t *read_val); /** * @brief Read bytes from SDIO fifo * * Reads bytes from SDIO register, treating it as a fifo. Reads will * all be done from same address. * @param func: function to read from * @param reg: register address of fifo * @param data: filled with data read from fifo * @param len: length of data to read from card * @retval 0 read succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card read timed out * @retval -EIO: I/O error */ int sdio_read_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t len); /** * @brief Write bytes to SDIO fifo * * Writes bytes to SDIO register, treating it as a fifo. Writes will * all be done to same address. * @param func: function to write to * @param reg: register address of fifo * @param data: data to write to fifo * @param len: length of data to write to card * @retval 0 write succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card write timed out * @retval -EIO: I/O error */ int sdio_write_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t len); /** * @brief Read blocks from SDIO fifo * * Reads blocks from SDIO register, treating it as a fifo. Reads will * all be done from same address. * @param func: function to read from * @param reg: register address of fifo * @param data: filled with data read from fifo * @param blocks: number of blocks to read from fifo * @retval 0 read succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card read timed out * @retval -EIO: I/O error */ int sdio_read_blocks_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t blocks); /** * @brief Write blocks to SDIO fifo * * Writes blocks from SDIO register, treating it as a fifo. Writes will * all be done to same address. * @param func: function to write to * @param reg: register address of fifo * @param data: data to write to fifo * @param blocks: number of blocks to write to fifo * @retval 0 write succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card write timed out * @retval -EIO: I/O error */ int sdio_write_blocks_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t blocks); /** * @brief Copy bytes from an SDIO card * * Copies bytes from an SDIO card, starting from provided address. * @param func: function to read from * @param reg: register address to start copy at * @param data: buffer to copy data into * @param len: length of data to read * @retval 0 read succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card read timed out * @retval -EIO: I/O error */ int sdio_read_addr(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t len); /** * @brief Copy bytes to an SDIO card * * Copies bytes to an SDIO card, starting from provided address. * * @param func: function to write to * @param reg: register address to start copy at * @param data: buffer to copy data from * @param len: length of data to write * @retval 0 write succeeded * @retval -EBUSY: card is busy with another request * @retval -ETIMEDOUT: card write timed out * @retval -EIO: I/O error */ int sdio_write_addr(struct sdio_func *func, uint32_t reg, uint8_t *data, uint32_t len); #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_SD_SDMMC_H_ */