diskio_ramdisk.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "luat_base.h"
  2. #include "luat_spi.h"
  3. #include "luat_malloc.h"
  4. #define LUAT_LOG_TAG "ramdisk"
  5. #include "luat_log.h"
  6. #include "ff.h"
  7. #include "diskio.h"
  8. extern BYTE FATFS_DEBUG; // debug log, 0 -- disable , 1 -- enable
  9. typedef struct luat_ramdisk {
  10. BYTE debug;
  11. size_t len;
  12. void* ptr;
  13. }luat_ramdisk_t;
  14. DSTATUS ramdisk_initialize (void* userdata);
  15. DSTATUS ramdisk_status (void* userdata);
  16. DRESULT ramdisk_read (void* userdata, BYTE* buff, LBA_t sector, UINT count);
  17. DRESULT ramdisk_write (void* userdata, const BYTE* buff, LBA_t sector, UINT count);
  18. DRESULT ramdisk_ioctl (void* userdata, BYTE cmd, void* buff);
  19. const block_disk_opts_t ramdisk_disk_opts = {
  20. .initialize = ramdisk_initialize,
  21. .status = ramdisk_status,
  22. .read = ramdisk_read,
  23. .write = ramdisk_write,
  24. .ioctl = ramdisk_ioctl,
  25. };
  26. // TODO 补齐实现
  27. DSTATUS ramdisk_initialize (void* userdata) {
  28. luat_ramdisk_t* disk = (luat_ramdisk_t*)userdata;
  29. if (disk->ptr == NULL || disk->len < FF_MIN_SS) {
  30. if (FATFS_DEBUG)
  31. LLOGD("ramdisk initialize check error");
  32. return RES_ERROR;
  33. }
  34. if (FATFS_DEBUG)
  35. LLOGD("ramdisk initialize ok");
  36. return RES_OK;
  37. };
  38. DSTATUS ramdisk_status (void* userdata) {
  39. luat_ramdisk_t* disk = (luat_ramdisk_t*)userdata;
  40. if (disk->ptr == NULL || disk->len < FF_MIN_SS){
  41. if (FATFS_DEBUG)
  42. LLOGD("ramdisk status check error");
  43. return RES_ERROR;
  44. }
  45. return RES_OK;
  46. };
  47. DRESULT ramdisk_read (void* userdata, BYTE* buff, LBA_t sector, UINT count) {
  48. luat_ramdisk_t* disk = (luat_ramdisk_t*)userdata;
  49. if (disk->ptr == NULL || disk->len < FF_MIN_SS){
  50. if (FATFS_DEBUG)
  51. LLOGD("ramdisk read check error");
  52. return RES_ERROR;
  53. }
  54. memcpy(buff, (char*)disk->ptr + (sector) * FF_MIN_SS, FF_MIN_SS*count);
  55. return RES_OK;
  56. };
  57. DRESULT ramdisk_write (void* userdata, const BYTE* buff, LBA_t sector, UINT count) {
  58. luat_ramdisk_t* disk = (luat_ramdisk_t*)userdata;
  59. if (disk->ptr == NULL || disk->len < FF_MIN_SS){
  60. if (FATFS_DEBUG)
  61. LLOGD("ramdisk write check error");
  62. return RES_ERROR;
  63. }
  64. //LLOGD("write(disk->ptr == %p) at %p , len = 0x%08X", disk->ptr, disk->ptr + (sector) * FF_MIN_SS, FF_MIN_SS*count);
  65. memcpy((char*)disk->ptr + (sector) * FF_MIN_SS, (void*)buff, FF_MIN_SS*count);
  66. return RES_OK;
  67. };
  68. DRESULT ramdisk_ioctl (void* userdata, BYTE cmd, void* buff) {
  69. luat_ramdisk_t* disk = (luat_ramdisk_t*)userdata;
  70. if (disk->ptr == NULL || disk->len < FF_MIN_SS){
  71. if (FATFS_DEBUG)
  72. LLOGD("ramdisk ioctl check error");
  73. return RES_ERROR;
  74. }
  75. if (FATFS_DEBUG)
  76. LLOGD("ramdisk ioctl cmd %d", cmd);
  77. switch (cmd) {
  78. case CTRL_SYNC :
  79. //*(DWORD*)buff = 0;
  80. break;
  81. case GET_SECTOR_COUNT:
  82. *(DWORD*)buff = disk->len / FF_MIN_SS;
  83. LLOGD("ramdisk GET_SECTOR_COUNT %d", disk->len / FF_MIN_SS);
  84. break;
  85. case GET_SECTOR_SIZE:
  86. *(DWORD*)buff = FF_MIN_SS;
  87. LLOGD("ramdisk GET_SECTOR_SIZE %d", FF_MIN_SS);
  88. break;
  89. case GET_BLOCK_SIZE:
  90. *(DWORD*)buff = 1;
  91. break;
  92. default :
  93. if (FATFS_DEBUG)
  94. LLOGD("ramdisk unkown cmd %d", cmd);
  95. return RES_ERROR;
  96. }
  97. return RES_OK;
  98. };
  99. DRESULT diskio_open_ramdisk(BYTE pdrv, size_t len) {
  100. void* ptr = luat_heap_malloc(len + sizeof(luat_ramdisk_t));
  101. if (ptr == NULL) {
  102. LLOGW("luat_heap_malloc return NULL");
  103. return RES_ERROR;
  104. }
  105. memset(ptr, 0, len + sizeof(luat_ramdisk_t));
  106. luat_ramdisk_t* ramdisk = ptr;
  107. ramdisk->ptr = ramdisk + sizeof(luat_ramdisk_t);
  108. ramdisk->len = len;
  109. ramdisk->debug = 0;
  110. block_disk_t disk = {
  111. .opts = &ramdisk_disk_opts,
  112. .userdata = ramdisk,
  113. };
  114. DRESULT ret = diskio_open(pdrv, &disk);
  115. if (ret != RES_OK) {
  116. luat_heap_free(ptr);
  117. }
  118. return ret;
  119. }