summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2023-11-29 21:03:19 +0800
committersakumisu <[email protected]>2023-11-29 21:03:19 +0800
commit22d60b430052404f5f86fbf1a6f30075dc235c50 (patch)
tree2205c69f7ee85535a73157744441436265eb6a4b
parent85e73197f95cd07df691c4187debd322f93e037a (diff)
add align check for rtt disk port
-rw-r--r--third_party/rt-thread-5.0/dfs_usbh_msc.c58
1 files changed, 51 insertions, 7 deletions
diff --git a/third_party/rt-thread-5.0/dfs_usbh_msc.c b/third_party/rt-thread-5.0/dfs_usbh_msc.c
index ae78d0fc..9a858798 100644
--- a/third_party/rt-thread-5.0/dfs_usbh_msc.c
+++ b/third_party/rt-thread-5.0/dfs_usbh_msc.c
@@ -4,9 +4,18 @@
#include <dfs_fs.h>
-#define DEV_FORMAT "sd%c"
+#define DEV_FORMAT "/sd%c"
-#define CONFIG_DFS_MOUNT_POINT "/"
+#ifndef CONFIG_USB_DFS_MOUNT_POINT
+#define CONFIG_USB_DFS_MOUNT_POINT "/"
+#endif
+
+#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || \
+ defined(SOC_HPM6000) || defined(BSP_USING_BL61X)
+#ifndef RT_USING_CACHE
+#error usbh msc must enable RT_USING_CACHE in this chip
+#endif
+#endif
static rt_err_t rt_udisk_init(rt_device_t dev)
{
@@ -19,12 +28,29 @@ static rt_ssize_t rt_udisk_read(rt_device_t dev, rt_off_t pos, void *buffer,
struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data;
int ret;
+#ifdef RT_USING_CACHE
+ rt_uint32_t *align_buf;
+
+ align_buf = rt_malloc_align(size, 32);
+ if (!align_buf) {
+ rt_kprintf("msc get align buf failed\n");
+ return 0;
+ }
+ ret = usbh_msc_scsi_read10(msc_class, pos, align_buf, size);
+ if (ret < 0) {
+ rt_kprintf("usb mass_storage read failed\n");
+ return 0;
+ }
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, align_buf, RT_ALIGN(size, 32));
+ rt_memcpy(buffer, align_buf, size);
+ rt_free_align(align_buf);
+#else
ret = usbh_msc_scsi_read10(msc_class, pos, buffer, size);
if (ret < 0) {
rt_kprintf("usb mass_storage read failed\n");
return 0;
}
-
+#endif
return size;
}
@@ -34,11 +60,29 @@ static rt_ssize_t rt_udisk_write(rt_device_t dev, rt_off_t pos, const void *buff
struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data;
int ret;
+#ifdef RT_USING_CACHE
+ rt_uint32_t *align_buf;
+
+ align_buf = rt_malloc_align(size, 32);
+ if (!align_buf) {
+ rt_kprintf("msc get align buf failed\n");
+ return 0;
+ }
+ rt_memcpy(align_buf, buffer, size);
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, align_buf, RT_ALIGN(size, 32));
+ ret = usbh_msc_scsi_write10(msc_class, pos, align_buf, size);
+ if (ret < 0) {
+ rt_kprintf("usb mass_storage write failed\n");
+ return 0;
+ }
+ rt_free_align(align_buf);
+#else
ret = usbh_msc_scsi_write10(msc_class, pos, buffer, size);
if (ret < 0) {
rt_kprintf("usb mass_storage write failed\n");
return 0;
}
+#endif
return size;
}
@@ -126,7 +170,7 @@ int udisk_init(struct usbh_msc *msc_class)
rt_device_register(dev, name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);
- ret = dfs_mount(name, CONFIG_DFS_MOUNT_POINT, "elm", 0, 0);
+ ret = dfs_mount(name, CONFIG_USB_DFS_MOUNT_POINT, "elm", 0, 0);
if (ret == 0) {
rt_kprintf("udisk: %s mount successfully\n", name);
} else {
@@ -139,16 +183,16 @@ free_res:
return ret;
}
-void rt_udisk_run(struct usbh_msc *msc_class)
+void usbh_msc_run(struct usbh_msc *msc_class)
{
udisk_init(msc_class);
}
-void rt_udisk_stop(struct usbh_msc *msc_class)
+void usbh_msc_stop(struct usbh_msc *msc_class)
{
char name[CONFIG_USBHOST_DEV_NAMELEN];
snprintf(name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar);
- dfs_unmount(CONFIG_DFS_MOUNT_POINT);
+ dfs_unmount(CONFIG_USB_DFS_MOUNT_POINT);
rt_device_unregister(rt_device_find(name));
} \ No newline at end of file