summaryrefslogtreecommitdiff
path: root/components/drivers/include
diff options
context:
space:
mode:
authorGuEe-GUI <[email protected]>2024-10-30 10:44:16 +0800
committerRbb666 <[email protected]>2024-11-20 16:11:10 +0800
commitc424cb8186950dcc0176ef9c584562cad674a636 (patch)
treef00ce2f4b16270af8dd2dc9c264b5a9fe1a4cddb /components/drivers/include
parent10cac76d3bfc86fda251013c5573c146836762e7 (diff)
[DM/FEATURE] Support simple block layer
1. Disk and blk device management. 2. Support partitions probe auto. 3. Support DFS and user mode fops, ioctl. 4. Add a cmd for blk info. Signed-off-by: GuEe-GUI <[email protected]>
Diffstat (limited to 'components/drivers/include')
-rw-r--r--components/drivers/include/drivers/blk.h87
-rw-r--r--components/drivers/include/rtdevice.h4
2 files changed, 91 insertions, 0 deletions
diff --git a/components/drivers/include/drivers/blk.h b/components/drivers/include/drivers/blk.h
new file mode 100644
index 0000000000..42159c4688
--- /dev/null
+++ b/components/drivers/include/drivers/blk.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-02-25 GuEe-GUI first version
+ */
+
+#ifndef __BLK_H__
+#define __BLK_H__
+
+#include <rthw.h>
+#include <rtthread.h>
+#include <drivers/classes/block.h>
+
+struct rt_dm_ida;
+struct rt_blk_device;
+struct rt_blk_disk_ops;
+
+struct rt_blk_disk
+{
+ struct rt_device parent;
+
+ const struct rt_blk_disk_ops *ops;
+#ifdef RT_USING_DM
+ struct rt_dm_ida *ida;
+#endif
+
+ rt_uint32_t read_only:1;
+ rt_uint32_t parallel_io:1;
+ rt_uint32_t removable:1;
+#define RT_BLK_DISK_MAGIC 0xbdaabdaa
+ rt_uint32_t __magic;
+
+ rt_uint32_t partitions;
+#define RT_BLK_PARTITION_NONE (-1)
+#define RT_BLK_PARTITION_MAX (RT_UINT32_MAX >> 1)
+ rt_int32_t max_partitions;
+ rt_list_t part_nodes;
+
+ struct rt_spinlock lock;
+ struct rt_semaphore usr_lock;
+};
+
+struct rt_blk_disk_ops
+{
+ rt_ssize_t (*read)(struct rt_blk_disk *disk, rt_off_t sector, void *buffer,
+ rt_size_t sector_count);
+ rt_ssize_t (*write)(struct rt_blk_disk *disk, rt_off_t sector, const void *buffer,
+ rt_size_t sector_count);
+ rt_err_t (*getgeome)(struct rt_blk_disk *disk, struct rt_device_blk_geometry *geometry);
+ rt_err_t (*sync)(struct rt_blk_disk *disk);
+ rt_err_t (*erase)(struct rt_blk_disk *disk);
+ rt_err_t (*autorefresh)(struct rt_blk_disk *disk, rt_bool_t is_auto);
+ rt_err_t (*control)(struct rt_blk_disk *disk, struct rt_blk_device *blk, int cmd, void *args);
+};
+
+#ifndef __DFS_H__
+#include <dfs_fs.h>
+
+struct rt_blk_device
+{
+ struct rt_device parent;
+
+ int partno;
+ struct dfs_partition partition;
+
+ rt_list_t list;
+ struct rt_blk_disk *disk;
+
+ rt_size_t sector_start;
+ rt_size_t sector_count;
+};
+#else
+struct rt_blk_device;
+#endif /* __DFS_H__ */
+
+rt_err_t rt_hw_blk_disk_register(struct rt_blk_disk *disk);
+rt_err_t rt_hw_blk_disk_unregister(struct rt_blk_disk *disk);
+
+rt_err_t rt_blk_disk_probe_partition(struct rt_blk_disk *disk);
+rt_ssize_t rt_blk_disk_get_capacity(struct rt_blk_disk *disk);
+rt_ssize_t rt_blk_disk_get_logical_block_size(struct rt_blk_disk *disk);
+
+#endif /* __BLK_H__ */
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index 2a30d8f0d5..21ad8cb2a6 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -45,6 +45,10 @@ extern "C" {
#include "drivers/core/power_domain.h"
#include "drivers/platform.h"
+#ifdef RT_USING_BLK
+#include "drivers/blk.h"
+#endif
+
#ifdef RT_USING_OFW
#include "drivers/ofw.h"
#include "drivers/ofw_fdt.h"