fal_flash_sfud_nor.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-04-28 CDT first version
  9. */
  10. #include <fal.h>
  11. #include <sfud.h>
  12. #ifdef RT_USING_SFUD
  13. #include <dev_spi_flash_sfud.h>
  14. #endif
  15. #ifndef FAL_USING_NOR_FLASH_DEV_NAME
  16. #define FAL_USING_NOR_FLASH_DEV_NAME "w25q64"
  17. #endif
  18. #define EXT_NOR_FLASH_START_ADDR 0
  19. #define EXT_NOR_FLASH_CHIP_SIZE 8 * 1024 * 1024
  20. #define EXT_NOR_FLASH_BLOCK_SIZE 4096
  21. #define EXT_NOR_FLASH_WR_MIN_GRAN 1
  22. static int init(void);
  23. static int read(long offset, rt_uint8_t *buf, rt_size_t size);
  24. static int write(long offset, const rt_uint8_t *buf, rt_size_t size);
  25. static int erase(long offset, rt_size_t size);
  26. static sfud_flash_t sfud_dev = NULL;
  27. struct fal_flash_dev ext_nor_flash0 =
  28. {
  29. .name = FAL_USING_NOR_FLASH_DEV_NAME,
  30. .addr = EXT_NOR_FLASH_START_ADDR,
  31. .len = EXT_NOR_FLASH_CHIP_SIZE,
  32. .blk_size = EXT_NOR_FLASH_BLOCK_SIZE,
  33. .ops = {init, read, write, erase},
  34. .write_gran = EXT_NOR_FLASH_WR_MIN_GRAN,
  35. };
  36. static int init(void)
  37. {
  38. /* RT-Thread RTOS platform */
  39. sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
  40. if (NULL == sfud_dev)
  41. {
  42. return -1;
  43. }
  44. /* update the flash chip information */
  45. ext_nor_flash0.blk_size = sfud_dev->chip.erase_gran;
  46. ext_nor_flash0.len = sfud_dev->chip.capacity;
  47. return 0;
  48. }
  49. static int read(long offset, rt_uint8_t *buf, rt_size_t size)
  50. {
  51. RT_ASSERT(sfud_dev);
  52. RT_ASSERT(sfud_dev->init_ok);
  53. sfud_read(sfud_dev, ext_nor_flash0.addr + offset, size, buf);
  54. return size;
  55. }
  56. static int write(long offset, const rt_uint8_t *buf, rt_size_t size)
  57. {
  58. RT_ASSERT(sfud_dev);
  59. RT_ASSERT(sfud_dev->init_ok);
  60. if (sfud_write(sfud_dev, ext_nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
  61. {
  62. return -1;
  63. }
  64. return size;
  65. }
  66. static int erase(long offset, rt_size_t size)
  67. {
  68. RT_ASSERT(sfud_dev);
  69. RT_ASSERT(sfud_dev->init_ok);
  70. if (sfud_erase(sfud_dev, ext_nor_flash0.addr + offset, size) != SFUD_SUCCESS)
  71. {
  72. return -1;
  73. }
  74. return size;
  75. }