wm_fls_gd25qxx.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /**
  2. * @file wm_fls_gd25qxx.c
  3. *
  4. * @brief gd25qxx flash Driver Module
  5. *
  6. * @author dave
  7. *
  8. * Copyright (c) 2015 Winner Microelectronics Co., Ltd.
  9. */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "wm_type_def.h"
  13. #include "wm_flash.h"
  14. #include "wm_hostspi.h"
  15. #include "wm_fls_gd25qxx.h"
  16. #include "wm_debug.h"
  17. #include "wm_gpio.h"
  18. static int tls_spifls_drv_read(u32 addr, u8 * buf, u32 len);
  19. static int tls_spifls_drv_fast_read(u32 addr, u8 * buf, u32 len);
  20. static int tls_spifls_drv_page_write(u32 page, u8 * buf);
  21. static int tls_spifls_drv_erase(u32 sector);
  22. static int tls_spifls_drv_chip_erase(void);
  23. static int tls_spifls_drv_probe(u32 id);
  24. static void tls_spifls_drv_remove(void);
  25. static struct tls_fls_drv exspi_fls = {
  26. .drv_list = {NULL, NULL},
  27. .clock = SPI_SCLK,
  28. .mode = TLS_SPI_MODE_0,
  29. .cs_active = TLS_SPI_CS_LOW,
  30. .flags = 0,
  31. .read = tls_spifls_drv_read,
  32. .fast_read = tls_spifls_drv_fast_read,
  33. .page_write = tls_spifls_drv_page_write,
  34. .erase = tls_spifls_drv_erase,
  35. .chip_erase = tls_spifls_drv_chip_erase,
  36. .probe = tls_spifls_drv_probe,
  37. .remove = tls_spifls_drv_remove
  38. };
  39. static struct tls_fls_drv *exspifls_drv = NULL;
  40. static unsigned int swap32(unsigned int v)
  41. {
  42. return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
  43. ((v & 0xff0000) >> 8) | (v >> 24);
  44. }
  45. static int tls_spifls_drv_write_enable(void)
  46. {
  47. u8 cmd;
  48. int err;
  49. cmd = EXSPIFLASH_WRITE_ENABLE;
  50. err = tls_spi_write((const u8 *) &cmd, 1);
  51. if (err != TLS_SPI_STATUS_OK)
  52. {
  53. return TLS_FLS_STATUS_EIO;
  54. }
  55. return TLS_FLS_STATUS_OK;
  56. }
  57. static int tls_spifls_drv_wait_write_enable(void)
  58. {
  59. u8 cmd;
  60. u8 sr;
  61. int err;
  62. cmd = EXSPIFLASH_READ_SR1;
  63. sr = 0;
  64. do
  65. {
  66. err = tls_spi_read_with_cmd((const u8 *) &cmd, 1, &sr, 1);
  67. if (err != TLS_SPI_STATUS_OK)
  68. {
  69. return TLS_FLS_STATUS_EIO;
  70. }
  71. if (sr & FLASH_STATUS_WEL)
  72. {
  73. break;
  74. }
  75. }
  76. while (1);
  77. return TLS_FLS_STATUS_OK;
  78. }
  79. static int tls_spifls_drv_wait_flash_ready(void)
  80. {
  81. u8 cmd;
  82. u8 sr;
  83. int err;
  84. cmd = EXSPIFLASH_READ_SR1;
  85. sr = 0;
  86. do
  87. {
  88. err = tls_spi_read_with_cmd((const u8 *) &cmd, 1, &sr, 1);
  89. if (err != TLS_SPI_STATUS_OK)
  90. {
  91. return TLS_FLS_STATUS_EIO;
  92. }
  93. if ((sr & FLASH_STATUS_BUSY) == 0x00)
  94. {
  95. break;
  96. }
  97. }
  98. while (1);
  99. return TLS_FLS_STATUS_OK;
  100. }
  101. static int tls_spifls_drv_read(u32 addr, u8 * buf, u32 len)
  102. {
  103. u32 cmd;
  104. int err;
  105. cmd = 0;
  106. cmd |= EXSPIFLASH_DATA_READ;
  107. cmd |= swap32(addr) & 0xffffff00;
  108. err = tls_spi_read_with_cmd((const u8 *) &cmd, 4, buf, len);
  109. if (err != TLS_SPI_STATUS_OK)
  110. {
  111. return TLS_FLS_STATUS_EIO;
  112. }
  113. return TLS_FLS_STATUS_OK;
  114. }
  115. static int tls_spifls_drv_fast_read(u32 addr, u8 * buf, u32 len)
  116. {
  117. return TLS_FLS_STATUS_ENOSUPPORT;
  118. }
  119. static int tls_spifls_drv_page_write(u32 page, u8 * buf)
  120. {
  121. u32 cmd;
  122. int err;
  123. err = tls_spifls_drv_write_enable();
  124. if (err != TLS_SPI_STATUS_OK)
  125. {
  126. return TLS_FLS_STATUS_EIO;
  127. }
  128. err = tls_spifls_drv_wait_write_enable();
  129. if (err != TLS_SPI_STATUS_OK)
  130. {
  131. return TLS_FLS_STATUS_EIO;
  132. }
  133. cmd = 0;
  134. cmd |= EXSPIFLASH_PAGE_PROGRAM;
  135. cmd |= swap32(page * exspifls_drv->page_size) & 0xffffff00;
  136. err = tls_spi_write_with_cmd((const u8 *) &cmd, 4, (const u8 *) buf,
  137. exspifls_drv->page_size);
  138. if (err != TLS_SPI_STATUS_OK)
  139. {
  140. return TLS_FLS_STATUS_EIO;
  141. }
  142. err = tls_spifls_drv_wait_flash_ready();
  143. if (err != TLS_SPI_STATUS_OK)
  144. {
  145. return TLS_FLS_STATUS_EIO;
  146. }
  147. return TLS_FLS_STATUS_OK;
  148. }
  149. static int tls_spifls_drv_erase(u32 sector)
  150. {
  151. u32 cmd;
  152. int err;
  153. err = tls_spifls_drv_write_enable();
  154. if (err != TLS_SPI_STATUS_OK)
  155. {
  156. return TLS_FLS_STATUS_EIO;
  157. }
  158. err = tls_spifls_drv_wait_write_enable();
  159. if (err != TLS_SPI_STATUS_OK)
  160. {
  161. return TLS_FLS_STATUS_EIO;
  162. }
  163. cmd = 0;
  164. cmd |= EXSPIFLASH_SECTOR_ERASE;
  165. cmd |= swap32(sector * exspifls_drv->sector_size) & 0xffffff00;
  166. err = tls_spi_write((const u8 *) &cmd, 4);
  167. if (err != TLS_SPI_STATUS_OK)
  168. {
  169. return TLS_FLS_STATUS_EIO;
  170. }
  171. tls_os_time_delay(6);
  172. err = tls_spifls_drv_wait_flash_ready();
  173. if (err != TLS_SPI_STATUS_OK)
  174. {
  175. return TLS_FLS_STATUS_EIO;
  176. }
  177. return TLS_FLS_STATUS_OK;
  178. }
  179. static int tls_spifls_drv_chip_erase(void)
  180. {
  181. u8 cmd;
  182. int err;
  183. err = tls_spifls_drv_write_enable();
  184. if (err != TLS_SPI_STATUS_OK)
  185. {
  186. return TLS_FLS_STATUS_EIO;
  187. }
  188. err = tls_spifls_drv_wait_write_enable();
  189. if (err != TLS_SPI_STATUS_OK)
  190. {
  191. return TLS_FLS_STATUS_EIO;
  192. }
  193. cmd = EXSPIFLASH_CHIP_ERASE;
  194. err = tls_spi_write((const u8 *) &cmd, 1);
  195. if (err != TLS_SPI_STATUS_OK)
  196. {
  197. return TLS_FLS_STATUS_EIO;
  198. }
  199. err = tls_spifls_drv_wait_flash_ready();
  200. if (err != TLS_SPI_STATUS_OK)
  201. {
  202. return TLS_FLS_STATUS_EIO;
  203. }
  204. return TLS_FLS_STATUS_OK;
  205. }
  206. static int tls_spifls_drv_probe(u32 id)
  207. {
  208. // int i = 0;
  209. if (!id)
  210. {
  211. return TLS_FLS_STATUS_EINVAL;
  212. }
  213. exspi_fls.id = id;
  214. if ((id>>16)&0xFF)
  215. {
  216. exspi_fls.total_size = 1 << (id>>16);
  217. }else{
  218. exspi_fls.total_size = FLASH_TOTAL_SIZE; /*1MByte*/
  219. }
  220. exspi_fls.page_size = PAGE_SIZE;
  221. exspi_fls.program_size = PROGRAM_SIZE;
  222. exspi_fls.sector_size = SECTOR_SIZE;
  223. exspifls_drv = &exspi_fls;
  224. return TLS_FLS_STATUS_OK;
  225. }
  226. static void tls_spifls_drv_remove(void)
  227. {
  228. exspifls_drv = NULL;
  229. }
  230. /**
  231. * @brief This function is used to install gd25qxx driver.
  232. *
  233. * @param[in] None
  234. *
  235. * @retval TLS_FLS_STATUS_OK if write flash success
  236. * @retval TLS_FLS_STATUS_EPERM if flash struct point is null
  237. * @retval TLS_FLS_STATUS_ENODRV if flash driver is not installed
  238. * @retval TLS_FLS_STATUS_EINVAL if argument is invalid
  239. * @retval TLS_FLS_STATUS_EIO if io error
  240. * @retval TLS_FLS_STATUS_EEXIST if driver is already existed
  241. *
  242. * @note None
  243. */
  244. int tls_spifls_drv_install(void)
  245. {
  246. int err;
  247. extern int tls_spifls_probe(void);
  248. extern int tls_spifls_drv_register(struct tls_fls_drv *fls_drv);
  249. err = tls_spifls_drv_register((struct tls_fls_drv *) &exspi_fls);
  250. if (err == TLS_FLS_STATUS_EEXIST)
  251. {
  252. return err;
  253. }
  254. TLS_DBGPRT_INFO("register the spi flash driver - %d.\n", err);
  255. err = tls_spifls_probe();
  256. TLS_DBGPRT_INFO("probe spi flash - %d.\n", err);
  257. return err;
  258. }