sfud_def.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/
  27. /**
  28. * @file sfud_def.h
  29. * @author Nations
  30. * @version v1.0.0
  31. *
  32. * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  33. */
  34. #ifndef _SFUD_DEF_H_
  35. #define _SFUD_DEF_H_
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <stdint.h>
  39. #include <stdbool.h>
  40. #include <sfud_cfg.h>
  41. #include "sfud_flash_def.h"
  42. #include "rt_config.h"
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46. /* debug print function. Must be implement by user. */
  47. #ifdef SFUD_DEBUG_MODE
  48. #ifndef SFUD_DEBUG
  49. #define SFUD_DEBUG(...) sfud_log_debug(__FILE__, __LINE__, __VA_ARGS__)
  50. #endif /* SFUD_DEBUG */
  51. #else
  52. #define SFUD_DEBUG(...)
  53. #endif /* SFUD_DEBUG_MODE */
  54. #ifndef SFUD_INFO
  55. #define SFUD_INFO(...) sfud_log_info(__VA_ARGS__)
  56. #endif
  57. /* assert for developer. */
  58. #ifdef SFUD_DEBUG_MODE
  59. #define SFUD_ASSERT(EXPR) \
  60. if (!(EXPR)) \
  61. { \
  62. SFUD_DEBUG("(%s) has assert failed at %s.", #EXPR, __FUNCTION__); \
  63. while (1); \
  64. }
  65. #else
  66. #define SFUD_ASSERT(EXPR)
  67. #endif
  68. /**
  69. * retry process
  70. *
  71. * @param delay delay function for every retry. NULL will not delay for every retry.
  72. * @param retry retry counts
  73. * @param result SFUD_ERR_TIMEOUT: retry timeout
  74. */
  75. #define SFUD_RETRY_PROCESS(delay, retry, result) \
  76. void (*__delay_temp)(void) = (void (*)(void))delay; \
  77. if (retry == 0) {result = SFUD_ERR_TIMEOUT;break;} \
  78. else {if (__delay_temp) {__delay_temp();} retry --;}
  79. /* software version number */
  80. #define SFUD_SW_VERSION "1.1.0"
  81. /*
  82. * all defined supported command
  83. */
  84. #ifndef SFUD_CMD_WRITE_ENABLE
  85. #define SFUD_CMD_WRITE_ENABLE 0x06
  86. #endif
  87. #ifndef SFUD_CMD_WRITE_DISABLE
  88. #define SFUD_CMD_WRITE_DISABLE 0x04
  89. #endif
  90. #ifndef SFUD_CMD_READ_STATUS_REGISTER
  91. #define SFUD_CMD_READ_STATUS_REGISTER 0x05
  92. #endif
  93. #ifndef SFUD_VOLATILE_SR_WRITE_ENABLE
  94. #define SFUD_VOLATILE_SR_WRITE_ENABLE 0x50
  95. #endif
  96. #ifndef SFUD_CMD_WRITE_STATUS_REGISTER
  97. #define SFUD_CMD_WRITE_STATUS_REGISTER 0x01
  98. #endif
  99. #ifndef SFUD_CMD_PAGE_PROGRAM
  100. #define SFUD_CMD_PAGE_PROGRAM 0x02
  101. #endif
  102. #ifndef SFUD_CMD_AAI_WORD_PROGRAM
  103. #define SFUD_CMD_AAI_WORD_PROGRAM 0xAD
  104. #endif
  105. #ifndef SFUD_CMD_ERASE_CHIP
  106. #define SFUD_CMD_ERASE_CHIP 0xC7
  107. #endif
  108. #ifndef SFUD_CMD_READ_DATA
  109. #define SFUD_CMD_READ_DATA 0x03
  110. #endif
  111. #ifndef SFUD_CMD_DUAL_OUTPUT_READ_DATA
  112. #define SFUD_CMD_DUAL_OUTPUT_READ_DATA 0x3B
  113. #endif
  114. #ifndef SFUD_CMD_DUAL_IO_READ_DATA
  115. #define SFUD_CMD_DUAL_IO_READ_DATA 0xBB
  116. #endif
  117. #ifndef SFUD_CMD_QUAD_IO_READ_DATA
  118. #define SFUD_CMD_QUAD_IO_READ_DATA 0xEB
  119. #endif
  120. #ifndef SFUD_CMD_QUAD_OUTPUT_READ_DATA
  121. #define SFUD_CMD_QUAD_OUTPUT_READ_DATA 0x6B
  122. #endif
  123. #ifndef SFUD_CMD_MANUFACTURER_DEVICE_ID
  124. #define SFUD_CMD_MANUFACTURER_DEVICE_ID 0x90
  125. #endif
  126. #ifndef SFUD_CMD_JEDEC_ID
  127. #define SFUD_CMD_JEDEC_ID 0x9F
  128. #endif
  129. #ifndef SFUD_CMD_READ_UNIQUE_ID
  130. #define SFUD_CMD_READ_UNIQUE_ID 0x4B
  131. #endif
  132. #ifndef SFUD_CMD_READ_SFDP_REGISTER
  133. #define SFUD_CMD_READ_SFDP_REGISTER 0x5A
  134. #endif
  135. #ifndef SFUD_CMD_ENABLE_RESET
  136. #define SFUD_CMD_ENABLE_RESET 0x66
  137. #endif
  138. #ifndef SFUD_CMD_RESET
  139. #define SFUD_CMD_RESET 0x99
  140. #endif
  141. #ifndef SFUD_CMD_ENTER_4B_ADDRESS_MODE
  142. #define SFUD_CMD_ENTER_4B_ADDRESS_MODE 0xB7
  143. #endif
  144. #ifndef SFUD_CMD_EXIT_4B_ADDRESS_MODE
  145. #define SFUD_CMD_EXIT_4B_ADDRESS_MODE 0xE9
  146. #endif
  147. #ifndef SFUD_WRITE_MAX_PAGE_SIZE
  148. #define SFUD_WRITE_MAX_PAGE_SIZE 256
  149. #endif
  150. /* send dummy data for read data */
  151. #ifndef SFUD_DUMMY_DATA
  152. #define SFUD_DUMMY_DATA 0xFF
  153. #endif
  154. /* maximum number of erase type support on JESD216 (V1.0) */
  155. #define SFUD_SFDP_ERASE_TYPE_MAX_NUM 4
  156. /**
  157. * status register bits
  158. */
  159. enum {
  160. SFUD_STATUS_REGISTER_BUSY = (1 << 0), /**< busing */
  161. SFUD_STATUS_REGISTER_WEL = (1 << 1), /**< write enable latch */
  162. SFUD_STATUS_REGISTER_SRP = (1 << 7), /**< status register protect */
  163. };
  164. /**
  165. * error code
  166. */
  167. typedef enum {
  168. SFUD_SUCCESS = 0, /**< success */
  169. SFUD_ERR_NOT_FOUND = 1, /**< not found or not supported */
  170. SFUD_ERR_WRITE = 2, /**< write error */
  171. SFUD_ERR_READ = 3, /**< read error */
  172. SFUD_ERR_TIMEOUT = 4, /**< timeout error */
  173. SFUD_ERR_ADDR_OUT_OF_BOUND = 5, /**< address is out of flash bound */
  174. } sfud_err;
  175. #ifdef SFUD_USING_QSPI
  176. /**
  177. * QSPI flash read cmd format
  178. */
  179. typedef struct {
  180. uint8_t instruction;
  181. uint8_t instruction_lines;
  182. uint8_t address_size;
  183. uint8_t address_lines;
  184. uint8_t alternate_bytes_lines;
  185. uint8_t dummy_cycles;
  186. uint8_t data_lines;
  187. } sfud_qspi_read_cmd_format;
  188. #endif /* SFUD_USING_QSPI */
  189. /* SPI bus write read data function type */
  190. typedef sfud_err (*spi_write_read_func)(const uint8_t *write_buf, size_t write_size, uint8_t *read_buf, size_t read_size);
  191. #ifdef SFUD_USING_SFDP
  192. /**
  193. * the SFDP (Serial Flash Discoverable Parameters) parameter info which used on this library
  194. */
  195. typedef struct {
  196. bool available; /**< available when read SFDP OK */
  197. uint8_t major_rev; /**< SFDP Major Revision */
  198. uint8_t minor_rev; /**< SFDP Minor Revision */
  199. uint16_t write_gran; /**< write granularity (bytes) */
  200. uint8_t erase_4k; /**< 4 kilobyte erase is supported throughout the device */
  201. uint8_t erase_4k_cmd; /**< 4 Kilobyte erase command */
  202. bool sr_is_non_vola; /**< status register is supports non-volatile */
  203. uint8_t vola_sr_we_cmd; /**< volatile status register write enable command */
  204. bool addr_3_byte; /**< supports 3-Byte addressing */
  205. bool addr_4_byte; /**< supports 4-Byte addressing */
  206. uint32_t capacity; /**< flash capacity (bytes) */
  207. struct {
  208. uint32_t size; /**< erase sector size (bytes). 0x00: not available */
  209. uint8_t cmd; /**< erase command */
  210. } eraser[SFUD_SFDP_ERASE_TYPE_MAX_NUM]; /**< supported eraser types table */
  211. //TODO lots of fast read-related stuff (like modes supported and number of wait states/dummy cycles needed in each)
  212. } sfud_sfdp, *sfud_sfdp_t;
  213. #endif
  214. /**
  215. * SPI device
  216. */
  217. typedef struct __sfud_spi {
  218. /* SPI device name */
  219. char *name;
  220. /* SPI bus write read data function */
  221. sfud_err (*wr)(const struct __sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf,
  222. size_t read_size);
  223. #ifdef SFUD_USING_QSPI
  224. /* QSPI fast read function */
  225. sfud_err (*qspi_read)(const struct __sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd_format *qspi_read_cmd_format,
  226. uint8_t *read_buf, size_t read_size);
  227. #endif
  228. /* lock SPI bus */
  229. void (*lock)(const struct __sfud_spi *spi);
  230. /* unlock SPI bus */
  231. void (*unlock)(const struct __sfud_spi *spi);
  232. /* some user data */
  233. void *user_data;
  234. } sfud_spi, *sfud_spi_t;
  235. /**
  236. * serial flash device
  237. */
  238. typedef struct {
  239. char *name; /**< serial flash name */
  240. size_t index; /**< index of flash device information table @see flash_table */
  241. sfud_flash_chip chip; /**< flash chip information */
  242. sfud_spi spi; /**< SPI device */
  243. bool init_ok; /**< initialize OK flag */
  244. bool addr_in_4_byte; /**< flash is in 4-Byte addressing */
  245. struct {
  246. void (*delay)(void); /**< every retry's delay */
  247. size_t times; /**< default times for error retry */
  248. } retry;
  249. void *user_data; /**< some user data */
  250. #ifdef SFUD_USING_QSPI
  251. sfud_qspi_read_cmd_format read_cmd_format; /**< fast read cmd format */
  252. #endif
  253. #ifdef SFUD_USING_SFDP
  254. sfud_sfdp sfdp; /**< serial flash discoverable parameters by JEDEC standard */
  255. #endif
  256. } sfud_flash, *sfud_flash_t;
  257. #ifdef __cplusplus
  258. }
  259. #endif
  260. #endif /* _SFUD_DEF_H_ */