spi_flash_chip_driver.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #pragma once
  15. #include "esp_flash.h"
  16. struct esp_flash_t;
  17. typedef struct esp_flash_t esp_flash_t;
  18. typedef struct spi_flash_chip_t spi_flash_chip_t;
  19. /** Timeout configurations for flash operations, all in us */
  20. typedef struct {
  21. uint32_t chip_erase_timeout; ///< Timeout for chip erase operation
  22. uint32_t block_erase_timeout; ///< Timeout for block erase operation
  23. uint32_t sector_erase_timeout; ///< Timeout for sector erase operation
  24. uint32_t idle_timeout; ///< Default timeout for other commands to be sent by host and get done by flash
  25. uint32_t page_program_timeout; ///< Timeout for page program operation
  26. } flash_chip_op_timeout_t;
  27. typedef enum {
  28. SPI_FLASH_REG_STATUS = 1,
  29. } spi_flash_register_t;
  30. /** @brief SPI flash chip driver definition structure.
  31. *
  32. * The chip driver structure contains chip-specific pointers to functions to perform SPI flash operations, and some
  33. * chip-specific numeric values.
  34. *
  35. * @note This is not a public API. These functions are called from the public API (declared in
  36. * esp_flash.h). They assume the caller has already validated arguments and enabled relevant protections
  37. * (disabling flash cache, prevent concurrent SPI access, etc.)
  38. *
  39. * Do not call chip driver functions directly in other contexts.
  40. *
  41. * A generic driver for generic chips and its related operations are defined in
  42. * spi_flash_chip_generic.h which can be used as building blocks for written
  43. * new/specific SPI flash chip drivers.
  44. *
  45. * @note All of these functions may be called with SPI flash cache disabled, so must only ever access IRAM/DRAM/ROM.
  46. */
  47. struct spi_flash_chip_t {
  48. const char *name; ///< Name of the chip driver
  49. const flash_chip_op_timeout_t *timeout; ///< Timeout configuration for this chip
  50. /* Probe to detect if a supported SPI flash chip is found.
  51. *
  52. * Attempts to configure 'chip' with these operations and probes for a matching SPI flash chip.
  53. *
  54. * Auto-detection of a SPI flash chip calls this function in turn on each registered driver (see esp_flash_registered_flash_drivers).
  55. *
  56. * ID - as read by spi_flash_generic_read_id() - is supplied so each probe
  57. * function doesn't need to unnecessarily read ID, but probe is permitted
  58. * to interrogate flash in any non-destructive way.
  59. *
  60. * It is permissible for the driver to modify the 'chip' structure if probing succeeds (specifically, to assign something to the
  61. * driver_data pointer if that is useful for the driver.)
  62. *
  63. * @return ESP_OK if probing was successful, an error otherwise. Driver may
  64. * assume that returning ESP_OK means it has claimed this chip.
  65. */
  66. esp_err_t (*probe)(esp_flash_t *chip, uint32_t flash_id);
  67. esp_err_t (*reset)(esp_flash_t *chip);
  68. /* Detect SPI flash size
  69. *
  70. * Interrogate the chip to detect its size.
  71. */
  72. esp_err_t (*detect_size)(esp_flash_t *chip, uint32_t *size);
  73. /* Erase the entire chip
  74. Caller has verified the chip is not write protected.
  75. */
  76. esp_err_t (*erase_chip)(esp_flash_t *chip);
  77. /* Erase a sector of the chip. Sector size is specified in the 'sector_size' field.
  78. sector_address is an offset in bytes.
  79. Caller has verified that this sector should be non-write-protected.
  80. */
  81. esp_err_t (*erase_sector)(esp_flash_t *chip, uint32_t sector_address);
  82. /* Erase a multi-sector block of the chip. Block size is specified in the 'block_erase_size' field.
  83. sector_address is an offset in bytes.
  84. Caller has verified that this block should be non-write-protected.
  85. */
  86. esp_err_t (*erase_block)(esp_flash_t *chip, uint32_t block_address);
  87. uint32_t sector_size; /* Sector is minimum erase size */
  88. uint32_t block_erase_size; /* Optimal (fastest) block size for multi-sector erases on this chip */
  89. /* Read the write protect status of the entire chip. */
  90. esp_err_t (*get_chip_write_protect)(esp_flash_t *chip, bool *out_write_protected);
  91. /* Set the write protect status of the entire chip. */
  92. esp_err_t (*set_chip_write_protect)(esp_flash_t *chip, bool chip_write_protect);
  93. /* Number of individually write protectable regions on this chip. Range 0-63. */
  94. uint8_t num_protectable_regions;
  95. /* Pointer to an array describing each protectable region. Should have num_protectable_regions elements. */
  96. const esp_flash_region_t *protectable_regions;
  97. /* Get a bitmask describing all protectable regions on the chip. Each bit represents one entry in the
  98. protectable_regions array, ie bit (1<<N) is set then the region at array entry N is write protected. */
  99. esp_err_t (*get_protected_regions)(esp_flash_t *chip, uint64_t *regions);
  100. /* Set protectable regions on the chip. Each bit represents on entry in the protectable regions array. */
  101. esp_err_t (*set_protected_regions)(esp_flash_t *chip, uint64_t regions);
  102. /* Read data from the chip.
  103. *
  104. * Before calling this function, the caller will have called chip->drv->set_read_mode(chip) in order to configure the chip's read mode correctly.
  105. */
  106. esp_err_t (*read)(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length);
  107. /* Write any amount of data to the chip.
  108. */
  109. esp_err_t (*write)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
  110. /* Use the page program command to write data to the chip.
  111. *
  112. * This function is expected to be called by chip->drv->write (if the
  113. * chip->drv->write implementation doesn't call it then it can be left as NULL.)
  114. *
  115. * - The length argument supplied to this function is at most 'page_size' bytes.
  116. *
  117. * - The region between 'address' and 'address + length' will not cross a page_size aligned boundary (the write
  118. * implementation is expected to split such a write into two before calling page_program.)
  119. */
  120. esp_err_t (*program_page)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
  121. /* Page size as written by the page_program function. Usually 256 bytes. */
  122. uint32_t page_size;
  123. /* Perform an encrypted write to the chip, using internal flash encryption hardware. */
  124. esp_err_t (*write_encrypted)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
  125. /* Wait for the SPI flash chip to be idle (any write operation to be complete.) This function is both called from the higher-level API functions, and from other functions in this structure.
  126. timeout_ms should be a timeout (in milliseconds) before the function returns ESP_ERR_TIMEOUT. This is useful to avoid hanging
  127. if the chip is otherwise unresponsive (ie returns all 0xFF or similar.)
  128. */
  129. esp_err_t (*wait_idle)(esp_flash_t *chip, uint32_t timeout_us);
  130. /* Configure both the SPI host and the chip for the read mode specified in chip->read_mode.
  131. *
  132. * This function is called by the higher-level API before the 'read' function is called.
  133. *
  134. * Can return ESP_ERR_FLASH_UNSUPPORTED_HOST or ESP_ERR_FLASH_UNSUPPORTED_CHIP if the specified mode is unsupported.
  135. */
  136. esp_err_t (*set_io_mode)(esp_flash_t *chip);
  137. /*
  138. * Get whether the Quad Enable (QE) is set. (*out_io_mode)=SPI_FLASH_QOUT if
  139. * enabled, otherwise disabled
  140. */
  141. esp_err_t (*get_io_mode)(esp_flash_t *chip, esp_flash_io_mode_t* out_io_mode);
  142. /*
  143. * Read the chip ID. Called when chip driver is set, but we want to know the exact chip id (to
  144. * get the size, etc.).
  145. */
  146. esp_err_t (*read_id)(esp_flash_t *chip, uint32_t* out_chip_id);
  147. /*
  148. * Read the requested register (status, etc.).
  149. */
  150. esp_err_t (*read_reg)(esp_flash_t *chip, spi_flash_register_t reg_id, uint32_t* out_reg);
  151. };
  152. /* Pointer to an array of pointers to all known drivers for flash chips. This array is used
  153. by esp_flash_init() to detect the flash chip driver, if none is supplied by the caller.
  154. Array is terminated with a NULL pointer.
  155. This pointer can be overwritten with a pointer to a new array, to update the list of known flash chips.
  156. */
  157. extern const spi_flash_chip_t **esp_flash_registered_chips;