fal_flash_sfud_port.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-01-26 armink the first version
  9. */
  10. #include <fal.h>
  11. #include <sfud.h>
  12. #ifdef FAL_USING_SFUD_PORT
  13. #ifdef RT_USING_SFUD
  14. #include <spi_flash_sfud.h>
  15. #endif
  16. #ifndef FAL_USING_NOR_FLASH_DEV_NAME
  17. #define FAL_USING_NOR_FLASH_DEV_NAME "norflash0"
  18. #endif
  19. static int init(void);
  20. static int read(long offset, uint8_t *buf, size_t size);
  21. static int write(long offset, const uint8_t *buf, size_t size);
  22. static int erase(long offset, size_t size);
  23. static sfud_flash_t sfud_dev = NULL;
  24. struct fal_flash_dev nor_flash0 =
  25. {
  26. .name = FAL_USING_NOR_FLASH_DEV_NAME,
  27. .addr = 0,
  28. .len = 8 * 1024 * 1024,
  29. .blk_size = 4096,
  30. .ops = {init, read, write, erase},
  31. .write_gran = 1
  32. };
  33. static int init(void)
  34. {
  35. #ifdef RT_USING_SFUD
  36. /* RT-Thread RTOS platform */
  37. sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
  38. #else
  39. /* bare metal platform */
  40. extern sfud_flash sfud_norflash0;
  41. sfud_dev = &sfud_norflash0;
  42. #endif
  43. if (NULL == sfud_dev)
  44. {
  45. return -1;
  46. }
  47. /* update the flash chip information */
  48. nor_flash0.blk_size = sfud_dev->chip.erase_gran;
  49. nor_flash0.len = sfud_dev->chip.capacity;
  50. return 0;
  51. }
  52. static int read(long offset, uint8_t *buf, size_t size)
  53. {
  54. assert(sfud_dev);
  55. assert(sfud_dev->init_ok);
  56. sfud_read(sfud_dev, nor_flash0.addr + offset, size, buf);
  57. return size;
  58. }
  59. static int write(long offset, const uint8_t *buf, size_t size)
  60. {
  61. assert(sfud_dev);
  62. assert(sfud_dev->init_ok);
  63. if (sfud_write(sfud_dev, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
  64. {
  65. return -1;
  66. }
  67. return size;
  68. }
  69. static int erase(long offset, size_t size)
  70. {
  71. assert(sfud_dev);
  72. assert(sfud_dev->init_ok);
  73. if (sfud_erase(sfud_dev, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
  74. {
  75. return -1;
  76. }
  77. return size;
  78. }
  79. #endif /* FAL_USING_SFUD_PORT */