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 12 #ifndef __BLK_H__ 13 #define __BLK_H__ 14 15 #include <rthw.h> 16 #include <rtthread.h> 17 #include <drivers/classes/block.h> 18 19 /** 20 * @defgroup group_blk blk 21 * @brief blk driver api 22 * @ingroup group_device_driver 23 * @addtogroup group_blk 24 * @{ 25 */ 26 27 struct rt_dm_ida; 28 struct rt_blk_device; 29 struct rt_blk_disk_ops; 30 31 /** 32 * @brief Physical blk device 33 */ 34 struct rt_blk_disk 35 { 36 struct rt_device parent; 37 38 const struct rt_blk_disk_ops *ops; 39 #ifdef RT_USING_DM 40 struct rt_dm_ida *ida; 41 #endif 42 43 rt_uint32_t read_only:1; 44 rt_uint32_t parallel_io:1; 45 rt_uint32_t removable:1; 46 #define RT_BLK_DISK_MAGIC 0xbdaabdaa 47 rt_uint32_t __magic; 48 49 rt_uint32_t partitions; 50 #define RT_BLK_PARTITION_NONE (-1) 51 #define RT_BLK_PARTITION_MAX (RT_UINT32_MAX >> 1) 52 rt_int32_t max_partitions; 53 rt_list_t part_nodes; 54 55 struct rt_spinlock lock; 56 struct rt_semaphore usr_lock; 57 }; 58 59 /** 60 * @brief Configure the blk device. 61 */ 62 struct rt_blk_disk_ops 63 { 64 rt_ssize_t (*read)(struct rt_blk_disk *disk, rt_off_t sector, void *buffer, 65 rt_size_t sector_count); 66 rt_ssize_t (*write)(struct rt_blk_disk *disk, rt_off_t sector, const void *buffer, 67 rt_size_t sector_count); 68 rt_err_t (*getgeome)(struct rt_blk_disk *disk, struct rt_device_blk_geometry *geometry); 69 rt_err_t (*sync)(struct rt_blk_disk *disk); 70 rt_err_t (*erase)(struct rt_blk_disk *disk); 71 rt_err_t (*autorefresh)(struct rt_blk_disk *disk, rt_bool_t is_auto); 72 rt_err_t (*control)(struct rt_blk_disk *disk, struct rt_blk_device *blk, int cmd, void *args); 73 }; 74 75 #ifndef __DFS_H__ 76 #include <dfs_fs.h> 77 78 /** 79 * @brief Logical blk device, if you don't used DFS it will be defined by default. 80 */ 81 struct rt_blk_device 82 { 83 struct rt_device parent; 84 85 int partno; 86 struct dfs_partition partition; 87 88 rt_list_t list; 89 struct rt_blk_disk *disk; 90 91 rt_size_t sector_start; 92 rt_size_t sector_count; 93 }; 94 #else 95 struct rt_blk_device; 96 #endif /* __DFS_H__ */ 97 98 /** 99 * @brief Register the blk disk device 100 * @param disk Point to blk disk 101 * @return rt_err_t error code 102 */ 103 rt_err_t rt_hw_blk_disk_register(struct rt_blk_disk *disk); 104 105 /** 106 * @brief Unregister the blk disk device 107 * @param disk Point to blk disk 108 * @return rt_err_t error code 109 */ 110 rt_err_t rt_hw_blk_disk_unregister(struct rt_blk_disk *disk); 111 112 /** 113 * @brief Probe and register the blk disk partition 114 * @param disk Point to blk disk 115 * @return rt_err_t error code 116 */ 117 rt_err_t rt_blk_disk_probe_partition(struct rt_blk_disk *disk); 118 119 /** 120 * @brief Get the blk disk capacity 121 * @param disk Point to blk disk 122 * @return rt_ssize_t sector count or error code 123 */ 124 rt_ssize_t rt_blk_disk_get_capacity(struct rt_blk_disk *disk); 125 126 /** 127 * @brief Get the sector size 128 * @param disk Point to blk disk 129 * @return rt_ssize_t bytes per sector or error code 130 */ 131 rt_ssize_t rt_blk_disk_get_logical_block_size(struct rt_blk_disk *disk); 132 133 /*! @}*/ 134 135 #endif /* __BLK_H__ */