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__ */