1 /* 2 * Copyright 2023 NXP 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** 8 * @file 9 * @brief Public API for SDIO subsystem 10 */ 11 12 #ifndef ZEPHYR_INCLUDE_SD_SDIO_H_ 13 #define ZEPHYR_INCLUDE_SD_SDIO_H_ 14 15 #include <zephyr/device.h> 16 #include <zephyr/drivers/sdhc.h> 17 #include <zephyr/sd/sd.h> 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 /** 24 * @brief Initialize SDIO function. 25 * 26 * Initializes SDIO card function. The card function will not be enabled, 27 * but after this call returns the SDIO function structure can be used to read 28 * and write data from the card. 29 * @param func: function structure to initialize 30 * @param card: SD card to enable function on 31 * @param num: function number to initialize 32 * @retval 0 function was initialized successfully 33 * @retval -EIO: I/O error 34 */ 35 int sdio_init_func(struct sd_card *card, struct sdio_func *func, 36 enum sdio_func_num num); 37 38 /** 39 * @brief Enable SDIO function 40 * 41 * Enables SDIO card function. @ref sdio_init_func must be called to 42 * initialized the function structure before enabling it in the card. 43 * @param func: function to enable 44 * @retval 0 function was enabled successfully 45 * @retval -ETIMEDOUT: card I/O timed out 46 * @retval -EIO: I/O error 47 */ 48 int sdio_enable_func(struct sdio_func *func); 49 50 /** 51 * @brief Set block size of SDIO function 52 * 53 * Set desired block size for SDIO function, used by block transfers 54 * to SDIO registers. 55 * @param func: function to set block size for 56 * @param bsize: block size 57 * @retval 0 block size was set 58 * @retval -EINVAL: unsupported/invalid block size 59 * @retval -EIO: I/O error 60 */ 61 int sdio_set_block_size(struct sdio_func *func, uint16_t bsize); 62 63 /** 64 * @brief Read byte from SDIO register 65 * 66 * Reads byte from SDIO register 67 * @param func: function to read from 68 * @param reg: register address to read from 69 * @param val: filled with byte value read from register 70 * @retval 0 read succeeded 71 * @retval -EBUSY: card is busy with another request 72 * @retval -ETIMEDOUT: card read timed out 73 * @retval -EIO: I/O error 74 */ 75 int sdio_read_byte(struct sdio_func *func, uint32_t reg, uint8_t *val); 76 77 /** 78 * @brief Write byte to SDIO register 79 * 80 * Writes byte to SDIO register 81 * @param func: function to write to 82 * @param reg: register address to write to 83 * @param write_val: value to write to register 84 * @retval 0 write succeeded 85 * @retval -EBUSY: card is busy with another request 86 * @retval -ETIMEDOUT: card write timed out 87 * @retval -EIO: I/O error 88 */ 89 int sdio_write_byte(struct sdio_func *func, uint32_t reg, uint8_t write_val); 90 91 /** 92 * @brief Write byte to SDIO register, and read result 93 * 94 * Writes byte to SDIO register, and reads the register after write 95 * @param func: function to write to 96 * @param reg: register address to write to 97 * @param write_val: value to write to register 98 * @param read_val: filled with value read from register 99 * @retval 0 write succeeded 100 * @retval -EBUSY: card is busy with another request 101 * @retval -ETIMEDOUT: card write timed out 102 * @retval -EIO: I/O error 103 */ 104 int sdio_rw_byte(struct sdio_func *func, uint32_t reg, uint8_t write_val, 105 uint8_t *read_val); 106 107 /** 108 * @brief Read bytes from SDIO fifo 109 * 110 * Reads bytes from SDIO register, treating it as a fifo. Reads will 111 * all be done from same address. 112 * @param func: function to read from 113 * @param reg: register address of fifo 114 * @param data: filled with data read from fifo 115 * @param len: length of data to read from card 116 * @retval 0 read succeeded 117 * @retval -EBUSY: card is busy with another request 118 * @retval -ETIMEDOUT: card read timed out 119 * @retval -EIO: I/O error 120 */ 121 int sdio_read_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, 122 uint32_t len); 123 124 /** 125 * @brief Write bytes to SDIO fifo 126 * 127 * Writes bytes to SDIO register, treating it as a fifo. Writes will 128 * all be done to same address. 129 * @param func: function to write to 130 * @param reg: register address of fifo 131 * @param data: data to write to fifo 132 * @param len: length of data to write to card 133 * @retval 0 write succeeded 134 * @retval -EBUSY: card is busy with another request 135 * @retval -ETIMEDOUT: card write timed out 136 * @retval -EIO: I/O error 137 */ 138 int sdio_write_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, 139 uint32_t len); 140 141 /** 142 * @brief Read blocks from SDIO fifo 143 * 144 * Reads blocks from SDIO register, treating it as a fifo. Reads will 145 * all be done from same address. 146 * @param func: function to read from 147 * @param reg: register address of fifo 148 * @param data: filled with data read from fifo 149 * @param blocks: number of blocks to read from fifo 150 * @retval 0 read succeeded 151 * @retval -EBUSY: card is busy with another request 152 * @retval -ETIMEDOUT: card read timed out 153 * @retval -EIO: I/O error 154 */ 155 int sdio_read_blocks_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, 156 uint32_t blocks); 157 158 /** 159 * @brief Write blocks to SDIO fifo 160 * 161 * Writes blocks from SDIO register, treating it as a fifo. Writes will 162 * all be done to same address. 163 * @param func: function to write to 164 * @param reg: register address of fifo 165 * @param data: data to write to fifo 166 * @param blocks: number of blocks to write to fifo 167 * @retval 0 write succeeded 168 * @retval -EBUSY: card is busy with another request 169 * @retval -ETIMEDOUT: card write timed out 170 * @retval -EIO: I/O error 171 */ 172 int sdio_write_blocks_fifo(struct sdio_func *func, uint32_t reg, uint8_t *data, 173 uint32_t blocks); 174 175 /** 176 * @brief Copy bytes from an SDIO card 177 * 178 * Copies bytes from an SDIO card, starting from provided address. 179 * @param func: function to read from 180 * @param reg: register address to start copy at 181 * @param data: buffer to copy data into 182 * @param len: length of data to read 183 * @retval 0 read succeeded 184 * @retval -EBUSY: card is busy with another request 185 * @retval -ETIMEDOUT: card read timed out 186 * @retval -EIO: I/O error 187 */ 188 int sdio_read_addr(struct sdio_func *func, uint32_t reg, uint8_t *data, 189 uint32_t len); 190 191 /** 192 * @brief Copy bytes to an SDIO card 193 * 194 * Copies bytes to an SDIO card, starting from provided address. 195 * 196 * @param func: function to write to 197 * @param reg: register address to start copy at 198 * @param data: buffer to copy data from 199 * @param len: length of data to write 200 * @retval 0 write succeeded 201 * @retval -EBUSY: card is busy with another request 202 * @retval -ETIMEDOUT: card write timed out 203 * @retval -EIO: I/O error 204 */ 205 int sdio_write_addr(struct sdio_func *func, uint32_t reg, uint8_t *data, 206 uint32_t len); 207 208 #ifdef __cplusplus 209 } 210 #endif 211 212 #endif /* ZEPHYR_INCLUDE_SD_SDMMC_H_ */ 213