wm_fls.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. /**
  2. * @file wm_fls.c
  3. *
  4. * @brief flash Driver Module
  5. *
  6. * @author dave
  7. *
  8. * Copyright (c) 2015 Winner Microelectronics Co., Ltd.
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include "list.h"
  14. #include "wm_hostspi.h"
  15. #include "wm_flash.h"
  16. #include "wm_dbg.h"
  17. #include "wm_mem.h"
  18. #include "wm_fls_gd25qxx.h"
  19. static struct tls_fls *spi_fls = NULL;
  20. static int tls_spifls_read_id(u32 * id)
  21. {
  22. u32 cmd;
  23. int err;
  24. cmd = FLS_CMD_READ_DEV_ID;
  25. *id = 0;
  26. err = tls_spi_read_with_cmd((const u8 *) &cmd, 4, (u8 *) id, 3);
  27. if (err != TLS_SPI_STATUS_OK)
  28. {
  29. TLS_DBGPRT_ERR("flash read ID fail(%d)!\n", err);
  30. return TLS_FLS_STATUS_EIO;
  31. }
  32. TLS_DBGPRT_FLASH_INFO("flash ID - 0x%x.\n", *id);
  33. return TLS_FLS_STATUS_OK;
  34. }
  35. /**
  36. * @brief This function is used to read data from the flash.
  37. *
  38. * @param[in] addr is byte offset addr for read from the flash.
  39. * @param[in] buf is user for data buffer of flash read
  40. * @param[in] len is byte length for read.
  41. *
  42. * @retval TLS_FLS_STATUS_OK if read sucsess
  43. * @retval TLS_FLS_STATUS_EIO if read fail
  44. *
  45. * @note None
  46. */
  47. int tls_spifls_read(u32 addr, u8 * buf, u32 len)
  48. {
  49. int err;
  50. u32 read_bytes;
  51. struct tls_fls_drv *drv;
  52. if (spi_fls == NULL)
  53. {
  54. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  55. return TLS_FLS_STATUS_EPERM;
  56. }
  57. if (spi_fls->current_drv == NULL)
  58. {
  59. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  60. return TLS_FLS_STATUS_ENODRV;
  61. }
  62. if ((addr >= spi_fls->current_drv->total_size) || (len == 0)
  63. || (buf == NULL))
  64. {
  65. return TLS_FLS_STATUS_EINVAL;
  66. }
  67. tls_os_sem_acquire(spi_fls->fls_lock, 0);
  68. drv = spi_fls->current_drv;
  69. read_bytes =
  70. ((addr + len) > drv->total_size) ? (drv->total_size - addr) : len;
  71. err = TLS_FLS_STATUS_OK;
  72. err = drv->read(addr, buf, read_bytes);
  73. tls_os_sem_release(spi_fls->fls_lock);
  74. return err;
  75. }
  76. int tls_spifls_fast_read(u32 addr, u8 * buf, u32 len)
  77. {
  78. int err;
  79. u32 read_bytes;
  80. struct tls_fls_drv *drv;
  81. if (spi_fls == NULL)
  82. {
  83. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  84. return TLS_FLS_STATUS_EPERM;
  85. }
  86. if (spi_fls->current_drv == NULL)
  87. {
  88. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  89. return TLS_FLS_STATUS_ENODRV;
  90. }
  91. if ((addr >= spi_fls->current_drv->total_size) || (len == 0)
  92. || (buf == NULL))
  93. {
  94. return TLS_FLS_STATUS_EINVAL;
  95. }
  96. if ((spi_fls->current_drv->flags & TLS_FLS_FLAG_FAST_READ) !=
  97. TLS_FLS_FLAG_FAST_READ)
  98. {
  99. return TLS_FLS_STATUS_ENOSUPPORT;
  100. }
  101. drv = spi_fls->current_drv;
  102. read_bytes =
  103. ((addr + len) > drv->total_size) ? (drv->total_size - addr) : len;
  104. err = TLS_FLS_STATUS_OK;
  105. err = drv->fast_read(addr, buf, read_bytes);
  106. return err;
  107. }
  108. int tls_spifls_page_write(u32 page, u8 * buf, u32 page_cnt)
  109. {
  110. int err;
  111. u32 write_pages;
  112. u32 i;
  113. struct tls_fls_drv *drv;
  114. if (spi_fls == NULL)
  115. {
  116. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  117. return TLS_FLS_STATUS_EPERM;
  118. }
  119. if (spi_fls->current_drv == NULL)
  120. {
  121. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  122. return TLS_FLS_STATUS_ENODRV;
  123. }
  124. if ((page >= (spi_fls->current_drv->total_size / spi_fls->current_drv->page_size))
  125. || (page_cnt == 0) || (buf == NULL))
  126. {
  127. return TLS_FLS_STATUS_EINVAL;
  128. }
  129. drv = spi_fls->current_drv;
  130. write_pages = ((page + page_cnt) > (drv->total_size / drv->page_size)) ?
  131. ((drv->total_size / drv->page_size) -page) : page_cnt;
  132. err = TLS_FLS_STATUS_OK;
  133. for (i = 0; i < write_pages; i++)
  134. {
  135. err = drv->page_write(page + i, buf + i * drv->page_size);
  136. if (err != TLS_FLS_STATUS_OK)
  137. {
  138. TLS_DBGPRT_ERR("flash page write fail(page %d)!\n", (page + i));
  139. break;
  140. }
  141. }
  142. return err;
  143. }
  144. /**
  145. * @brief This function is used to write data to the flash.
  146. *
  147. * @param[in] addr is byte offset addr for write to the flash
  148. * @param[in] buf is the data buffer want to write to flash
  149. * @param[in] len is the byte length want to write
  150. *
  151. * @retval TLS_FLS_STATUS_OK if write flash success
  152. * @retval TLS_FLS_STATUS_EPERM if flash struct point is null
  153. * @retval TLS_FLS_STATUS_ENODRV if flash driver is not installed
  154. * @retval TLS_FLS_STATUS_EINVAL if argument is invalid
  155. * @retval TLS_FLS_STATUS_EIO if io error
  156. *
  157. * @note None
  158. */
  159. int tls_spifls_write(u32 addr, u8 * buf, u32 len)
  160. {
  161. u8 *cache;
  162. int err;
  163. u32 sector_addr;
  164. u32 sector_num;
  165. u32 write_bytes;
  166. u32 i;
  167. struct tls_fls_drv *drv;
  168. if (spi_fls == NULL)
  169. {
  170. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  171. return TLS_FLS_STATUS_EPERM;
  172. }
  173. if (spi_fls->current_drv == NULL)
  174. {
  175. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  176. return TLS_FLS_STATUS_ENODRV;
  177. }
  178. if ((addr >= spi_fls->current_drv->total_size) || (len == 0)
  179. || (buf == NULL))
  180. {
  181. return TLS_FLS_STATUS_EINVAL;
  182. }
  183. tls_os_sem_acquire(spi_fls->fls_lock, 0);
  184. drv = spi_fls->current_drv;
  185. write_bytes =
  186. ((addr + len) > drv->total_size) ? (drv->total_size - addr) : len;
  187. sector_addr = addr / drv->sector_size;
  188. sector_num = (addr + write_bytes - 1) / drv->sector_size - sector_addr + 1;
  189. TLS_DBGPRT_FLASH_INFO
  190. ("write to flash: sector address - %d, sectors - %d.\n", sector_addr,
  191. sector_num);
  192. err = TLS_FLS_STATUS_OK;
  193. cache = tls_mem_alloc(drv->sector_size);
  194. if (cache == NULL)
  195. {
  196. tls_os_sem_release(spi_fls->fls_lock);
  197. TLS_DBGPRT_ERR("allocate sector cache memory(%dB) fail!\n",
  198. drv->sector_size);
  199. return TLS_FLS_STATUS_ENOMEM;
  200. }
  201. for (i = 0; i < sector_num; i++)
  202. {
  203. TLS_DBGPRT_FLASH_INFO("firstly, read the sector - %d to cache.\n",
  204. sector_addr + i);
  205. err = drv->read((sector_addr + i) * drv->sector_size, cache, drv->sector_size);
  206. if (err != TLS_FLS_STATUS_OK)
  207. {
  208. tls_os_sem_release(spi_fls->fls_lock);
  209. TLS_DBGPRT_ERR("flash read fail(sector %d)!\n", (sector_addr + i));
  210. break;
  211. }
  212. if (1 == sector_num){/*flash write only in one sector*/
  213. MEMCPY(cache + (addr%drv->sector_size), buf, write_bytes);
  214. buf += write_bytes;
  215. write_bytes = 0;
  216. }else{/*flash write through some sectors*/
  217. if (0 == i) {
  218. MEMCPY(cache+(addr%drv->sector_size), buf, drv->sector_size - (addr%drv->sector_size));
  219. buf += drv->sector_size - (addr%drv->sector_size);
  220. write_bytes -= drv->sector_size - (addr%drv->sector_size);
  221. } else if (i == (sector_num - 1)) {
  222. MEMCPY(cache, buf, write_bytes);
  223. buf += write_bytes;
  224. write_bytes = 0;
  225. } else {
  226. MEMCPY(cache, buf, drv->sector_size);
  227. buf += drv->sector_size;
  228. write_bytes -= drv->sector_size;
  229. }
  230. }
  231. TLS_DBGPRT_FLASH_INFO("second, erase the sector - %d.\n",
  232. sector_addr + i);
  233. err = drv->erase(sector_addr + i);
  234. if (err != TLS_FLS_STATUS_OK)
  235. {
  236. tls_os_sem_release(spi_fls->fls_lock);
  237. TLS_DBGPRT_ERR("flash erase fail(sector %d)!\n", (sector_addr + i));
  238. break;
  239. }
  240. TLS_DBGPRT_FLASH_INFO
  241. ("finnaly, write the data in cache to the sector - %d.\n",
  242. sector_addr + i);
  243. err = tls_spifls_page_write((sector_addr +i) * (drv->sector_size / drv->page_size),
  244. cache, drv->sector_size / drv->page_size);
  245. if (err != TLS_FLS_STATUS_OK)
  246. {
  247. tls_os_sem_release(spi_fls->fls_lock);
  248. TLS_DBGPRT_ERR("flash write fail(sector %d)!\n", (sector_addr + i));
  249. break;
  250. }
  251. }
  252. tls_mem_free(cache);
  253. tls_os_sem_release(spi_fls->fls_lock);
  254. return err;
  255. }
  256. int tls_spifls_erase(u32 sector)
  257. {
  258. int err;
  259. struct tls_fls_drv *drv;
  260. if (spi_fls == NULL)
  261. {
  262. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  263. return TLS_FLS_STATUS_EPERM;
  264. }
  265. if (spi_fls->current_drv == NULL)
  266. {
  267. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  268. return TLS_FLS_STATUS_ENODRV;
  269. }
  270. if (sector >= (spi_fls->current_drv->total_size / spi_fls->current_drv->sector_size))
  271. {
  272. TLS_DBGPRT_ERR("the sector to be erase overflow!\n");
  273. return TLS_FLS_STATUS_EINVAL;
  274. }
  275. tls_os_sem_acquire(spi_fls->fls_lock, 0);
  276. drv = spi_fls->current_drv;
  277. err = TLS_FLS_STATUS_OK;
  278. err = drv->erase(sector);
  279. tls_os_sem_release(spi_fls->fls_lock);
  280. return err;
  281. }
  282. int tls_spifls_chip_erase(void)
  283. {
  284. int err;
  285. struct tls_fls_drv *drv;
  286. if (spi_fls == NULL)
  287. {
  288. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  289. return TLS_FLS_STATUS_EPERM;
  290. }
  291. if (spi_fls->current_drv == NULL)
  292. {
  293. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  294. return TLS_FLS_STATUS_ENODRV;
  295. }
  296. drv = spi_fls->current_drv;
  297. err = TLS_FLS_STATUS_OK;
  298. err = drv->chip_erase();
  299. return err;
  300. }
  301. int tls_spifls_get_param(u8 type, void *param)
  302. {
  303. int err;
  304. struct tls_fls_drv *drv;
  305. if (spi_fls == NULL)
  306. {
  307. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  308. return TLS_FLS_STATUS_EPERM;
  309. }
  310. if (spi_fls->current_drv == NULL)
  311. {
  312. TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");
  313. return TLS_FLS_STATUS_ENODRV;
  314. }
  315. if (param == NULL)
  316. {
  317. return TLS_FLS_STATUS_EINVAL;
  318. }
  319. tls_os_sem_acquire(spi_fls->fls_lock, 0);
  320. drv = spi_fls->current_drv;
  321. err = TLS_FLS_STATUS_OK;
  322. switch (type)
  323. {
  324. case TLS_FLS_PARAM_TYPE_ID:
  325. *((u32 *) param) = drv->id;
  326. break;
  327. case TLS_FLS_PARAM_TYPE_SIZE:
  328. *((u32 *) param) = drv->total_size;
  329. break;
  330. case TLS_FLS_PARAM_TYPE_PAGE_SIZE:
  331. *((u32 *) param) = drv->page_size;
  332. break;
  333. case TLS_FLS_PARAM_TYPE_PROG_SIZE:
  334. *((u32 *) param) = drv->program_size;
  335. break;
  336. case TLS_FLS_PARAM_TYPE_SECTOR_SIZE:
  337. *((u32 *) param) = drv->sector_size;
  338. break;
  339. default:
  340. TLS_DBGPRT_WARNING("invalid parameter ID!\n");
  341. err = TLS_FLS_STATUS_EINVAL;
  342. break;
  343. }
  344. tls_os_sem_release(spi_fls->fls_lock);
  345. return err;
  346. }
  347. int tls_spifls_drv_register(struct tls_fls_drv *fls_drv)
  348. {
  349. u32 cpu_sr;
  350. struct tls_fls_drv *drv;
  351. if (fls_drv == NULL)
  352. {
  353. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  354. return TLS_FLS_STATUS_EINVAL;
  355. }
  356. dl_list_for_each(drv, &spi_fls->fls_drvs, struct tls_fls_drv, drv_list)
  357. {
  358. if (drv->id == fls_drv->id)
  359. {
  360. TLS_DBGPRT_WARNING
  361. ("corresponding spi flash driver has registered!\n");
  362. return TLS_FLS_STATUS_EEXIST;
  363. }
  364. }
  365. cpu_sr = tls_os_set_critical();
  366. dl_list_add_tail((struct dl_list *) &spi_fls->fls_drvs,
  367. (struct dl_list *) &fls_drv->drv_list);
  368. tls_os_release_critical(cpu_sr);
  369. TLS_DBGPRT_FLASH_INFO("the spi flash driver is registered successfully!\n");
  370. return TLS_FLS_STATUS_OK;
  371. }
  372. int tls_spifls_drv_unregister(struct tls_fls_drv *fls_drv)
  373. {
  374. TLS_DBGPRT_WARNING
  375. ("unregister spi flash driver operation is not supported!\n");
  376. return TLS_FLS_STATUS_EPERM;
  377. }
  378. int tls_spifls_probe(void)
  379. {
  380. int err;
  381. u32 id;
  382. struct tls_fls_drv *drv;
  383. if (spi_fls == NULL)
  384. {
  385. TLS_DBGPRT_ERR("flash driver module not beed installed!\n");
  386. return TLS_FLS_STATUS_EPERM;
  387. }
  388. if (spi_fls->current_drv != NULL)
  389. {
  390. TLS_DBGPRT_ERR("the current spi flash has fount the matched driver!\n");
  391. return TLS_FLS_STATUS_EBUSY;
  392. }
  393. TLS_DBGPRT_FLASH_INFO("try to read the current spi flash ID.\n");
  394. err = tls_spifls_read_id(&id);
  395. if (err != TLS_FLS_STATUS_OK)
  396. {
  397. return err;
  398. }
  399. TLS_DBGPRT_FLASH_INFO("current spi flash ID - 0x%x.\n", id);
  400. dl_list_for_each(drv, &spi_fls->fls_drvs, struct tls_fls_drv, drv_list)
  401. {
  402. err = drv->probe(id);
  403. if (err != TLS_FLS_STATUS_OK)
  404. {
  405. return err;
  406. }
  407. tls_spi_setup(drv->mode, drv->cs_active, drv->clock);
  408. TLS_DBGPRT_FLASH_INFO("matched the spi flash driver.\n");
  409. spi_fls->current_drv = drv;
  410. break;
  411. }
  412. if (spi_fls->current_drv == NULL)
  413. {
  414. TLS_DBGPRT_WARNING("not found the matched spi flash driver!\n");
  415. return TLS_FLS_STATUS_ENODRV;
  416. }
  417. return TLS_FLS_STATUS_OK;
  418. }
  419. int tls_spifls_init(void)
  420. {
  421. struct tls_fls *fls;
  422. int err;
  423. if (spi_fls != NULL)
  424. {
  425. TLS_DBGPRT_ERR("flash driver module has been installed!\n");
  426. return TLS_FLS_STATUS_EBUSY;
  427. }
  428. fls = (struct tls_fls *) tls_mem_alloc(sizeof(struct tls_fls));
  429. if (fls == NULL)
  430. {
  431. TLS_DBGPRT_ERR("allocate @spi_fls fail!\n");
  432. return TLS_FLS_STATUS_ENOMEM;
  433. }
  434. memset(fls, 0, sizeof(*fls));
  435. dl_list_init((struct dl_list *) &fls->fls_drvs);
  436. err = tls_os_sem_create(&fls->fls_lock, 1);
  437. if (err != TLS_OS_SUCCESS)
  438. {
  439. tls_mem_free(fls);
  440. TLS_DBGPRT_ERR("create semaphore @fls_lock fail!\n");
  441. return TLS_FLS_STATUS_ENOMEM;
  442. }
  443. spi_fls = fls;
  444. tls_spifls_drv_install();
  445. return TLS_FLS_STATUS_OK;
  446. }
  447. int tls_spifls_exit(void)
  448. {
  449. TLS_DBGPRT_FLASH_INFO("Not support flash driver module uninstalled!\n");
  450. return TLS_FLS_STATUS_EPERM;
  451. }