sdfs_data_nor.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <zephyr/types.h>
  2. #include <strings.h>
  3. #include <stddef.h>
  4. #include <sys/types.h>
  5. #include <device.h>
  6. #include <sdfs.h>
  7. #include <partition/partition.h>
  8. #include <drivers/flash.h>
  9. #include <board_cfg.h>
  10. #if IS_ENABLED(CONFIG_SPI_FLASH_2)
  11. static const struct device *g_data_nor_dev;
  12. K_MUTEX_DEFINE(sdfs_mutex);
  13. static const struct device *data_nor_sd_dev(u8_t stor_id)
  14. {
  15. if (STORAGE_ID_DATA_NOR == stor_id)
  16. return g_data_nor_dev;
  17. printk("sdfs dev err:%d\n", stor_id);
  18. return NULL;
  19. }
  20. static struct sd_dir *data_nor_sd_find_dir_by_addr(const struct device *dev, const char *filename, void *buf_size_32, uint32_t adfs_addr)
  21. {
  22. int num, total, offset;
  23. struct sd_dir *sd_dir = buf_size_32;
  24. printk("read off=0x%x, file=%s\n", adfs_addr, filename);
  25. if (flash_read(dev, adfs_addr, buf_size_32, sizeof(*sd_dir))) {
  26. printk("dev=%s, read fail\n", dev->name);
  27. return NULL;
  28. }
  29. if (memcmp(sd_dir->fname, "sdfs.bin", 8) != 0) {
  30. printk("sdfs.bin invalid, offset=0x%x\n", adfs_addr);
  31. return NULL;
  32. }
  33. total = sd_dir->offset;
  34. for (offset = adfs_addr + sizeof(*sd_dir), num = 0; num < total; offset += 32) {
  35. flash_read(dev, offset, buf_size_32, 32);
  36. //printk("%d,file=%s, size=0x%x\n", num, sd_dir->fname, sd_dir->size);
  37. if (strncasecmp(filename, sd_dir->fname, 12) == 0) {
  38. return sd_dir;
  39. }
  40. num++;
  41. }
  42. return NULL;
  43. }
  44. struct sd_dir *data_nor_sd_find_dir(u8_t stor_id, u8_t part, const char *filename, void *buf_size_32)
  45. {
  46. struct sd_dir *sd_d;
  47. const struct device *dev;
  48. const struct partition_entry *parti;
  49. dev = data_nor_sd_dev(stor_id);
  50. if (dev == NULL)
  51. return NULL;
  52. parti = partition_get_stf_part(stor_id, part+PARTITION_FILE_ID_SDFS_PART_BASE);
  53. if (parti == NULL)
  54. return NULL;
  55. k_mutex_lock(&sdfs_mutex, K_FOREVER);
  56. sd_d = data_nor_sd_find_dir_by_addr(dev, filename, buf_size_32, parti->offset);
  57. k_mutex_unlock(&sdfs_mutex);
  58. if (sd_d) {
  59. sd_d->offset += parti->offset;
  60. return sd_d;
  61. }
  62. return NULL;
  63. }
  64. int data_nor_sd_fread(u8_t stor_id, struct sd_file *sd_file, void *buffer, int len)
  65. {
  66. const struct device *dev;
  67. dev = data_nor_sd_dev(stor_id);
  68. if(dev == NULL)
  69. return -1;
  70. k_mutex_lock(&sdfs_mutex, K_FOREVER);
  71. flash_read(dev, sd_file->readptr, buffer, len);
  72. k_mutex_unlock(&sdfs_mutex);
  73. sd_file->readptr += len;
  74. return len;
  75. }
  76. static int data_nor_sd_fs_init(const struct device *dev)
  77. {
  78. g_data_nor_dev = device_get_binding(CONFIG_SPI_FLASH_2_NAME);
  79. //printk("data nor sdfs init\n");
  80. return 0;
  81. }
  82. SYS_INIT(data_nor_sd_fs_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
  83. #endif