blk.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright (c) 2006-2025 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-02-25 GuEe-GUI first version
  9. * 2025-01-24 wumingzi add doxygen comment
  10. */
  11. #ifndef __BLK_H__
  12. #define __BLK_H__
  13. #include <rthw.h>
  14. #include <rtthread.h>
  15. #include <drivers/classes/block.h>
  16. /**
  17. * @defgroup group_blk blk
  18. * @brief blk driver api
  19. * @ingroup group_device_driver
  20. * @addtogroup group_blk
  21. * @{
  22. */
  23. struct rt_dm_ida;
  24. struct rt_blk_device;
  25. struct rt_blk_disk_ops;
  26. /**
  27. * @brief Physical blk device
  28. */
  29. struct rt_blk_disk
  30. {
  31. struct rt_device parent;
  32. const struct rt_blk_disk_ops *ops;
  33. #ifdef RT_USING_DM
  34. struct rt_dm_ida *ida;
  35. #endif
  36. rt_uint32_t read_only:1;
  37. rt_uint32_t parallel_io:1;
  38. rt_uint32_t removable:1;
  39. #define RT_BLK_DISK_MAGIC 0xbdaabdaa
  40. rt_uint32_t __magic;
  41. rt_uint32_t partitions;
  42. #define RT_BLK_PARTITION_NONE (-1)
  43. #define RT_BLK_PARTITION_MAX (RT_UINT32_MAX >> 1)
  44. rt_int32_t max_partitions;
  45. rt_list_t part_nodes;
  46. struct rt_spinlock lock;
  47. struct rt_semaphore usr_lock;
  48. };
  49. /**
  50. * @brief Configure the blk device.
  51. */
  52. struct rt_blk_disk_ops
  53. {
  54. rt_ssize_t (*read)(struct rt_blk_disk *disk, rt_off_t sector, void *buffer,
  55. rt_size_t sector_count);
  56. rt_ssize_t (*write)(struct rt_blk_disk *disk, rt_off_t sector, const void *buffer,
  57. rt_size_t sector_count);
  58. rt_err_t (*getgeome)(struct rt_blk_disk *disk, struct rt_device_blk_geometry *geometry);
  59. rt_err_t (*sync)(struct rt_blk_disk *disk);
  60. rt_err_t (*erase)(struct rt_blk_disk *disk);
  61. rt_err_t (*autorefresh)(struct rt_blk_disk *disk, rt_bool_t is_auto);
  62. rt_err_t (*control)(struct rt_blk_disk *disk, struct rt_blk_device *blk, int cmd, void *args);
  63. };
  64. #ifndef __DFS_H__
  65. #include <dfs_fs.h>
  66. /**
  67. * @brief Logical blk device, if you don't used DFS it will be defined by default.
  68. */
  69. struct rt_blk_device
  70. {
  71. struct rt_device parent;
  72. int partno;
  73. struct dfs_partition partition;
  74. rt_list_t list;
  75. struct rt_blk_disk *disk;
  76. rt_size_t sector_start;
  77. rt_size_t sector_count;
  78. };
  79. #else
  80. struct rt_blk_device;
  81. #endif /* __DFS_H__ */
  82. /**
  83. * @brief Register the blk disk device
  84. * @param disk Point to blk disk
  85. * @return rt_err_t error code
  86. */
  87. rt_err_t rt_hw_blk_disk_register(struct rt_blk_disk *disk);
  88. /**
  89. * @brief Unregister the blk disk device
  90. * @param disk Point to blk disk
  91. * @return rt_err_t error code
  92. */
  93. rt_err_t rt_hw_blk_disk_unregister(struct rt_blk_disk *disk);
  94. /**
  95. * @brief Probe and register the blk disk partition
  96. * @param disk Point to blk disk
  97. * @return rt_err_t error code
  98. */
  99. rt_err_t rt_blk_disk_probe_partition(struct rt_blk_disk *disk);
  100. /**
  101. * @brief Get the blk disk capacity
  102. * @param disk Point to blk disk
  103. * @return rt_ssize_t sector count or error code
  104. */
  105. rt_ssize_t rt_blk_disk_get_capacity(struct rt_blk_disk *disk);
  106. /**
  107. * @brief Get the sector size
  108. * @param disk Point to blk disk
  109. * @return rt_ssize_t bytes per sector or error code
  110. */
  111. rt_ssize_t rt_blk_disk_get_logical_block_size(struct rt_blk_disk *disk);
  112. /*! @}*/
  113. #endif /* __BLK_H__ */