drv_flash.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright (c) 2019 Winner Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-04-04 tyx 1st version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include "wm_flash_map.h"
  13. #include "wm_internal_flash.h"
  14. #include "drv_flash.h"
  15. #define FLASH_SECTOR (4096)
  16. #ifdef RT_USING_SPI
  17. static void *_spi0;
  18. #endif
  19. extern unsigned int flashtotalsize;
  20. rt_uint32_t wm_flash_total(void)
  21. {
  22. rt_uint32_t total = 0x100000;
  23. if (flashtotalsize == 0x200000)
  24. {
  25. total = 0x200000;
  26. }
  27. return total;
  28. }
  29. rt_uint32_t wm_flash_addr(void)
  30. {
  31. return FLASH_BASE_ADDR;
  32. }
  33. rt_uint32_t wm_flash_blksize(void)
  34. {
  35. return FLASH_SECTOR;
  36. }
  37. int wm_flash_read(long offset, void *data, int size)
  38. {
  39. offset += FLASH_BASE_ADDR;
  40. #ifdef RT_USING_SPI
  41. if (_spi0)
  42. {
  43. rt_spi_take_bus(_spi0);
  44. }
  45. #endif
  46. if (tls_fls_read(offset, data, size) != TLS_FLS_STATUS_OK)
  47. {
  48. size = -1;
  49. }
  50. #ifdef RT_USING_SPI
  51. if (_spi0)
  52. {
  53. rt_spi_release_bus(_spi0);
  54. }
  55. #endif
  56. return size;
  57. }
  58. int wm_flash_write(long offset, void *data, int size)
  59. {
  60. offset += FLASH_BASE_ADDR;
  61. #ifdef RT_USING_SPI
  62. if (_spi0)
  63. {
  64. rt_spi_take_bus(_spi0);
  65. }
  66. #endif
  67. if (tls_fls_write(offset, data, size) != TLS_FLS_STATUS_OK)
  68. {
  69. size = -1;
  70. }
  71. #ifdef RT_USING_SPI
  72. if (_spi0)
  73. {
  74. rt_spi_release_bus(_spi0);
  75. }
  76. #endif
  77. return size;
  78. }
  79. int wm_flash_erase(long offset, int size)
  80. {
  81. int count, sector;
  82. offset += FLASH_BASE_ADDR;
  83. count = size / FLASH_SECTOR;
  84. sector = offset / FLASH_SECTOR;
  85. #ifdef RT_USING_SPI
  86. if (_spi0)
  87. {
  88. rt_spi_take_bus(_spi0);
  89. }
  90. #endif
  91. while (count)
  92. {
  93. if (tls_fls_erase(sector) != TLS_FLS_STATUS_OK)
  94. {
  95. size = -1;
  96. break;
  97. }
  98. count--;
  99. sector++;
  100. }
  101. #ifdef RT_USING_SPI
  102. if (_spi0)
  103. {
  104. rt_spi_release_bus(_spi0);
  105. }
  106. #endif
  107. return size;
  108. }
  109. int wm_flash_init(void)
  110. {
  111. #ifdef RT_USING_SPI
  112. rt_err_t ret;
  113. if (_spi0 != RT_NULL)
  114. {
  115. return 0;
  116. }
  117. _spi0 = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
  118. RT_ASSERT(_spi0 != RT_NULL);
  119. #ifdef WM_SPI_BUS_NAME
  120. ret = rt_spi_bus_attach_device(_spi0, "flash", WM_SPI_BUS_NAME, RT_NULL);
  121. #else
  122. ret = rt_spi_bus_attach_device(_spi0, "flash", "spi0", RT_NULL);
  123. #endif
  124. if (ret != RT_EOK)
  125. {
  126. rt_free(_spi0);
  127. _spi0 = RT_NULL;
  128. }
  129. if (_spi0)
  130. {
  131. ((struct rt_spi_device *)_spi0)->config.mode = RT_SPI_MODE_0;
  132. ((struct rt_spi_device *)_spi0)->config.data_width = 8;
  133. ((struct rt_spi_device *)_spi0)->config.max_hz = 20 * 1000 * 1000;
  134. }
  135. #endif
  136. return 0;
  137. }