drv_chipflash.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-07-26 Ltbonewstart the first version
  9. *
  10. */
  11. #include "fsl_romapi.h"
  12. #include <rtdevice.h>
  13. //#define DRV_DEBUG
  14. #define LOG_TAG "drv.flash"
  15. #include <drv_log.h>
  16. #define SECTOR_INDEX_FROM_END 2U /* start from the last 2 Sector */
  17. struct mcx_mtd_chipflash
  18. {
  19. struct rt_mtd_nor_device mtd_device;
  20. struct rt_mutex flash_lock;
  21. flash_config_t s_flashDriver; /* flash driver */
  22. uint32_t destAdrss; /* Address of the target location */
  23. uint32_t pflashBlockBase; /* 块基地址 */
  24. uint32_t pflashBlockSize; /* 块大小 */
  25. uint32_t pflashBlockCount; /* 块数量 */
  26. uint32_t pflashTotalSize; /* 总大小 */
  27. uint32_t pflashSectorSize; /* 扇区大小 */
  28. uint32_t PflashPageSize; /* 页大小 */
  29. };
  30. struct mcx_mtd_chipflash mtd;
  31. /**
  32. * device MTD nor 设备句柄
  33. * offset 偏移量
  34. * data 读取的数据
  35. * length 读取的数据长度
  36. */
  37. rt_ssize_t nxp_chipflash_read(struct rt_mtd_nor_device *device, rt_off_t offset, rt_uint8_t *data, rt_size_t length)
  38. {
  39. rt_mutex_take(&mtd.flash_lock, RT_WAITING_FOREVER);
  40. memcpy(data, ((const void *)(mtd.destAdrss + offset)), length);
  41. rt_mutex_release(&mtd.flash_lock);
  42. return length;
  43. }
  44. /**
  45. * device MTD nor 设备句柄
  46. * offset 偏移量
  47. * data 读取的数据
  48. * length 读取的数据长度
  49. */
  50. rt_ssize_t nxp_chipflash_write(struct rt_mtd_nor_device *device, rt_off_t offset, const rt_uint8_t *data, rt_size_t length)
  51. {
  52. rt_mutex_take(&mtd.flash_lock, RT_WAITING_FOREVER);
  53. int32_t status = FLASH_ProgramPhrase(&mtd.s_flashDriver, mtd.destAdrss + offset, (uint8_t *)data, length);
  54. if (status != kStatus_Success)
  55. {
  56. length = 0;
  57. }
  58. rt_mutex_release(&mtd.flash_lock);
  59. return length;
  60. }
  61. /**
  62. * device MTD nor 设备句柄
  63. * offset 偏移量
  64. * length 长度
  65. */
  66. rt_err_t nxp_chipflash_erase_block(struct rt_mtd_nor_device *device, rt_off_t offset, rt_size_t length)
  67. {
  68. rt_mutex_take(&mtd.flash_lock, RT_WAITING_FOREVER);
  69. FLASH_EraseSector(&mtd.s_flashDriver, mtd.destAdrss + offset, mtd.pflashSectorSize, kFLASH_ApiEraseKey);
  70. rt_mutex_release(&mtd.flash_lock);
  71. return RT_EOK;
  72. }
  73. struct rt_mtd_nor_driver_ops mcx_mtd_chipflashops =
  74. {
  75. RT_NULL,
  76. nxp_chipflash_read,
  77. nxp_chipflash_write,
  78. nxp_chipflash_erase_block,
  79. };
  80. int rt_onchip_flash_init(void)
  81. {
  82. rt_err_t result = RT_EOK;
  83. memset(&mtd.s_flashDriver, 0, sizeof(flash_config_t));
  84. if (FLASH_Init(&mtd.s_flashDriver) != kStatus_Success)
  85. {
  86. result = -RT_ERROR;
  87. }
  88. /* 获取参数 */
  89. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashBlockBaseAddr, &mtd.pflashBlockBase);
  90. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashSectorSize, &mtd.pflashSectorSize);
  91. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashTotalSize, &mtd.pflashTotalSize);
  92. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashPageSize, &mtd.PflashPageSize);
  93. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashBlockSize, &mtd.pflashBlockSize);
  94. FLASH_GetProperty(&mtd.s_flashDriver, kFLASH_PropertyPflashBlockCount, &mtd.pflashBlockCount);
  95. LOG_D("flash_BlockBase: %d", mtd.pflashBlockBase);
  96. LOG_D("flash_BlockCount: %d", mtd.pflashBlockCount);
  97. LOG_D("flash_BlockSize: %d", mtd.pflashBlockSize);
  98. LOG_D("flash_SectorSize: %d", mtd.pflashSectorSize);
  99. LOG_D("flash_TotalSize: %d", mtd.pflashTotalSize);
  100. LOG_D("flash_PageSize: %d", mtd.PflashPageSize);
  101. /* 设置要测试flash的基地址 */
  102. /* flash基地址+ flash总大小 - 数量*扇区大小 */
  103. mtd.destAdrss = mtd.pflashBlockBase + (mtd.pflashTotalSize - (SECTOR_INDEX_FROM_END) * mtd.pflashSectorSize);
  104. LOG_D("flash_destAdrss: %#x", mtd.destAdrss);
  105. /* initialize mutex */
  106. if (rt_mutex_init(&mtd.flash_lock, "m_flash", RT_IPC_FLAG_PRIO) != RT_EOK)
  107. {
  108. rt_kprintf("init mflash lock mutex failed\n");
  109. return -RT_ERROR;
  110. }
  111. mtd.mtd_device.block_start = 0;
  112. mtd.mtd_device.block_end = (mtd.pflashTotalSize - mtd.destAdrss) / mtd.pflashSectorSize;
  113. mtd.mtd_device.block_size = mtd.pflashSectorSize;
  114. /* set ops */
  115. mtd.mtd_device.ops = &mcx_mtd_chipflashops;
  116. rt_mtd_nor_register_device("mflash", &(mtd.mtd_device));
  117. return result;
  118. }
  119. INIT_DEVICE_EXPORT(rt_onchip_flash_init);