flash.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "board.h"
  2. #include "sfud.h"
  3. #include "snfud.h"
  4. #include "mmcsd_core.h"
  5. /**
  6. * read flash data
  7. *
  8. * @param flash flash device
  9. * @param addr start address
  10. * @param size read size
  11. * @param data read data pointer
  12. *
  13. * @return result
  14. */
  15. int flash_read(uint32_t addr, size_t size, uint8_t *data)
  16. {
  17. #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH
  18. static sfud_flash *sflash = NULL;
  19. if (!sflash) {
  20. sflash = sfud_get_device(0);
  21. }
  22. return sfud_read(sflash, addr, size, data);
  23. #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH
  24. static sfud_flash *snflash = NULL;
  25. if (!snflash) {
  26. snflash = snfud_get_device(0);
  27. }
  28. return snfud_read(snflash, addr, size, data);
  29. #else
  30. return emmc_read(addr, size, data);
  31. #endif
  32. }
  33. /**
  34. * write flash data (no erase operate)
  35. *
  36. * @param flash flash device
  37. * @param addr start address
  38. * @param data write data
  39. * @param size write size
  40. *
  41. * @return result
  42. */
  43. int flash_write(uint32_t addr, size_t size, const uint8_t *data)
  44. {
  45. #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH
  46. static sfud_flash *sflash = NULL;
  47. if (!sflash) {
  48. sflash = sfud_get_device(0);
  49. }
  50. return sfud_write(sflash, addr, size, data);
  51. #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH
  52. static sfud_flash *snflash = NULL;
  53. if (!snflash) {
  54. snflash = snfud_get_device(0);
  55. }
  56. return snfud_write(snflash, addr, size, data);
  57. #else
  58. return emmc_write(addr, size, (uint8_t *)data);
  59. #endif
  60. }
  61. /**
  62. * erase and write flash data
  63. *
  64. * @param flash flash device
  65. * @param addr start address
  66. * @param size write size
  67. * @param data write data
  68. *
  69. * @return result
  70. */
  71. int flash_erase_write(uint32_t addr, size_t size, const uint8_t *data)
  72. {
  73. #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH
  74. static sfud_flash *sflash = NULL;
  75. if (!sflash) {
  76. sflash = sfud_get_device(0);
  77. }
  78. return sfud_erase_write(sflash, addr, size, data);
  79. #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH
  80. static sfud_flash *snflash = NULL;
  81. if (!snflash) {
  82. snflash = snfud_get_device(0);
  83. }
  84. return snfud_erase_write(snflash, addr, size, data);
  85. #else
  86. return emmc_write(addr, size, (uint8_t *)data);
  87. #endif
  88. }
  89. /**
  90. * erase flash data
  91. *
  92. * @note It will erase align by erase granularity.
  93. *
  94. * @param flash flash device
  95. * @param addr start address
  96. * @param size erase size
  97. *
  98. * @return result
  99. */
  100. int flash_erase(uint32_t addr, size_t size)
  101. {
  102. #if DEVICE_TYPE_SELECT == SPI_NOR_FLASH
  103. static sfud_flash *sflash = NULL;
  104. if (!sflash) {
  105. sflash = sfud_get_device(0);
  106. }
  107. return sfud_erase(sflash, addr, size);
  108. #elif DEVICE_TYPE_SELECT == SPI_NAND_FLASH
  109. static sfud_flash *snflash = NULL;
  110. if (!snflash) {
  111. snflash = snfud_get_device(0);
  112. }
  113. return snfud_erase(snflash, addr, size);
  114. #else
  115. return 0;
  116. #endif
  117. }