update(cherryusb): fix dfs mem leak, add check for lwip stack size, select elmfat when use msc

This commit is contained in:
sakumisu 2024-09-01 00:24:37 +08:00 committed by Meco Man
parent b462daf57e
commit 9511e4bd19
6 changed files with 54 additions and 322 deletions

View File

@ -209,6 +209,7 @@ if RT_USING_CHERRYUSB
prompt "Enable usb msc driver" prompt "Enable usb msc driver"
default n default n
select RT_USING_DFS select RT_USING_DFS
select RT_USING_DFS_ELMFAT
config RT_CHERRYUSB_HOST_CDC_ECM config RT_CHERRYUSB_HOST_CDC_ECM
bool bool
@ -300,6 +301,11 @@ if RT_USING_CHERRYUSB
config CONFIG_USBHOST_PLATFORM_RTL8152 config CONFIG_USBHOST_PLATFORM_RTL8152
bool bool
config RT_LWIP_PBUF_POOL_BUFSIZE
int "The size of each pbuf in the pbuf pool"
range 1500 2000
default 1600
config RT_CHERRYUSB_HOST_TEMPLATE config RT_CHERRYUSB_HOST_TEMPLATE
bool bool
prompt "Use usb host template" prompt "Use usb host template"

View File

@ -1,312 +0,0 @@
# Kconfig file for CherryUSB
menuconfig CHERRYUSB
bool "Using CherryUSB"
default n
if CHERRYUSB
menuconfig CHERRYUSB_DEVICE
bool "Enable usb device mode"
default n
if CHERRYUSB_DEVICE
choice
prompt "Select usb device speed"
default CHERRYUSB_DEVICE_SPEED_FS
config CHERRYUSB_DEVICE_SPEED_FS
bool "FS"
config CHERRYUSB_DEVICE_SPEED_HS
bool "HS"
config CHERRYUSB_DEVICE_SPEED_AUTO
bool "AUTO"
endchoice
choice
prompt "Select usb device ip, and some ip need config in usb_config.h, please check"
default CHERRYUSB_DEVICE_CUSTOM
config CHERRYUSB_DEVICE_CUSTOM
bool "CUSTOM (Implement it yourself)"
config CHERRYUSB_DEVICE_FSDEV
bool "fsdev"
config CHERRYUSB_DEVICE_DWC2_ST
bool "dwc2_st"
config CHERRYUSB_DEVICE_DWC2_ESP
bool "dwc2_esp"
config CHERRYUSB_DEVICE_DWC2_AT
bool "dwc2_at"
config CHERRYUSB_DEVICE_DWC2_GD
bool "dwc2_gd"
config CHERRYUSB_DEVICE_DWC2_HC
bool "dwc2_hc"
config CHERRYUSB_DEVICE_DWC2_CUSTOM
bool "dwc2_custom"
config CHERRYUSB_DEVICE_MUSB_ES
bool "musb_es"
config CHERRYUSB_DEVICE_MUSB_SUNXI
bool "musb_sunxi"
config CHERRYUSB_DEVICE_MUSB_BK
bool "musb_bk"
config CHERRYUSB_DEVICE_MUSB_CUSTOM
bool "musb_custom"
config CHERRYUSB_DEVICE_BL
bool "bouffalo"
config CHERRYUSB_DEVICE_HPM
bool "hpm"
config CHERRYUSB_DEVICE_AIC
bool "aic"
config CHERRYUSB_DEVICE_CH32
bool "ch32"
config CHERRYUSB_DEVICE_PUSB2
bool "pusb2"
endchoice
config CHERRYUSB_DEVICE_CDC_ACM
bool
prompt "Enable usb cdc acm device"
default n
config CHERRYUSB_DEVICE_HID
bool
prompt "Enable usb hid device"
default n
config CHERRYUSB_DEVICE_MSC
bool
prompt "Enable usb msc device"
default n
config CHERRYUSB_DEVICE_AUDIO
bool
prompt "Enable usb audio device"
default n
config CHERRYUSB_DEVICE_VIDEO
bool
prompt "Enable usb video device"
default n
config CHERRYUSB_DEVICE_CDC_RNDIS
bool
prompt "Enable usb cdc rndis device"
default n
config CHERRYUSB_DEVICE_CDC_ECM
bool
prompt "Enable usb cdc ecm device"
default n
config CHERRYUSB_DEVICE_CDC_NCM
bool
prompt "Enable usb cdc ncm device"
default n
config CHERRYUSB_DEVICE_DFU
bool
prompt "Enable usb dfu device"
default n
choice
prompt "Select usb device template"
default CHERRYUSB_DEVICE_TEMPLATE_NONE
config CHERRYUSB_DEVICE_TEMPLATE_NONE
bool "none (Implement it yourself)"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM
bool "cdc_acm"
config CHERRYUSB_DEVICE_TEMPLATE_MSC
bool "msc"
config CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD
bool "hid_keyboard"
config CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE
bool "hid_mouse"
config CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM
bool "hid_custom"
config CHERRYUSB_DEVICE_TEMPLATE_VIDEO
bool "video"
config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER
bool "audio_v1_mic_speaker_multichan"
config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER
bool "audio_v2_mic_speaker_multichan"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS
bool "cdc_rndis"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM
bool "cdc_ecm"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM
bool "cdc_ncm"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC
bool "cdc_acm_msc"
config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID
bool "cdc_acm_msc_hid"
config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1
bool "winusbv1"
config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC
bool "winusbv2_cdc"
config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_HID
bool "winusbv2_hid"
endchoice
endif
menuconfig CHERRYUSB_HOST
bool "Enable usb host mode"
default n
if CHERRYUSB_HOST
choice
prompt "Select usb host ip, and some ip need config in usb_config.h, please check"
default CHERRYUSB_HOST_CUSTOM
config CHERRYUSB_HOST_CUSTOM
bool "CUSTOM (Implement it yourself)"
config CHERRYUSB_HOST_EHCI_BL
bool "ehci_bouffalo"
config CHERRYUSB_HOST_EHCI_HPM
bool "ehci_hpm"
config CHERRYUSB_HOST_EHCI_AIC
bool "ehci_aic"
config CHERRYUSB_HOST_EHCI_NUVOTON_NUC980
bool "ehci_nuvoton_nuc980"
config CHERRYUSB_HOST_EHCI_NUVOTON_MA35D0
bool "ehci_nuvoton_ma35d0"
config CHERRYUSB_HOST_EHCI_CUSTOM
bool "ehci_custom"
config CHERRYUSB_HOST_DWC2_ST
bool "dwc2_st"
config CHERRYUSB_HOST_DWC2_ESP
bool "dwc2_esp"
config CHERRYUSB_HOST_DWC2_HC
bool "dwc2_hc"
config CHERRYUSB_HOST_DWC2_CUSTOM
bool "dwc2_custom"
config CHERRYUSB_HOST_MUSB_ES
bool "musb_es"
config CHERRYUSB_HOST_MUSB_SUNXI
bool "musb_sunxi"
config CHERRYUSB_HOST_MUSB_BK
bool "musb_bk"
config CHERRYUSB_HOST_MUSB_CUSTOM
bool "musb_custom"
config CHERRYUSB_HOST_PUSB2
bool "pusb2"
config CHERRYUSB_HOST_XHCI
bool "xhci"
endchoice
config CHERRYUSB_HOST_CDC_ACM
bool
prompt "Enable usb cdc acm driver"
default n
config CHERRYUSB_HOST_HID
bool
prompt "Enable usb hid driver"
default n
config CHERRYUSB_HOST_MSC
bool
prompt "Enable usb msc driver"
default n
config CHERRYUSB_HOST_CDC_ECM
bool
prompt "Enable usb cdc ecm driver"
select USBHOST_PLATFORM_CDC_ECM
default n
config CHERRYUSB_HOST_CDC_RNDIS
bool
prompt "Enable usb rndis driver"
select USBHOST_PLATFORM_CDC_RNDIS
default n
config CHERRYUSB_HOST_CDC_NCM
bool
prompt "Enable usb cdc ncm driver"
select USBHOST_PLATFORM_CDC_NCM
default n
config CHERRYUSB_HOST_VIDEO
bool
prompt "Enable usb video driver, it is commercial charge"
default n
config CHERRYUSB_HOST_AUDIO
bool
prompt "Enable usb audio driver, it is commercial charge"
default n
config CHERRYUSB_HOST_BLUETOOTH
bool
prompt "Enable usb bluetooth driver"
default n
config CHERRYUSB_HOST_ASIX
bool
prompt "Enable usb asix driver"
select USBHOST_PLATFORM_ASIX
default n
config CHERRYUSB_HOST_RTL8152
bool
prompt "Enable usb rtl8152 driver"
select USBHOST_PLATFORM_RTL8152
default n
config CHERRYUSB_HOST_FTDI
bool
prompt "Enable usb ftdi driver"
default n
config CHERRYUSB_HOST_CH34X
bool
prompt "Enable usb ch34x driver"
default n
config CHERRYUSB_HOST_CP210X
bool
prompt "Enable usb cp210x driver"
default n
config CHERRYUSB_HOST_PL2303
bool
prompt "Enable usb pl2303 driver"
default n
config USBHOST_PLATFORM_CDC_ECM
bool
config USBHOST_PLATFORM_CDC_RNDIS
bool
config USBHOST_PLATFORM_CDC_NCM
bool
config USBHOST_PLATFORM_ASIX
bool
config USBHOST_PLATFORM_RTL8152
bool
config CHERRYUSB_HOST_TEMPLATE
bool
prompt "Use usb host template"
default n
if CHERRYUSB_HOST_TEMPLATE
config TEST_USBH_CDC_ACM
int
prompt "demo for test cdc acm"
default 0
depends on CHERRYUSB_HOST_CDC_ACM
config TEST_USBH_HID
int
prompt "demo for test hid"
default 0
depends on CHERRYUSB_HOST_HID
config TEST_USBH_MSC
int
prompt "demo for test msc"
default 0
depends on CHERRYUSB_HOST_MSC
endif
endif
endif

View File

@ -5,6 +5,8 @@
*/ */
#include "usb_osal.h" #include "usb_osal.h"
#include "usb_errno.h" #include "usb_errno.h"
#include "usb_config.h"
#include "usb_log.h"
#include <rtthread.h> #include <rtthread.h>
#include <rthw.h> #include <rthw.h>
@ -12,6 +14,11 @@ usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size,
{ {
rt_thread_t htask; rt_thread_t htask;
htask = rt_thread_create(name, entry, args, stack_size, prio, 10); htask = rt_thread_create(name, entry, args, stack_size, prio, 10);
if (htask == NULL) {
USB_LOG_ERR("Create thread %s failed\r\n", name);
while (1) {
}
}
rt_thread_startup(htask); rt_thread_startup(htask);
return (usb_osal_thread_t)htask; return (usb_osal_thread_t)htask;
} }
@ -27,7 +34,13 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{ {
return (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO); usb_osal_sem_t sem = (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO);
if (sem == NULL) {
USB_LOG_ERR("Create semaphore failed\r\n");
while (1) {
}
}
return sem;
} }
void usb_osal_sem_delete(usb_osal_sem_t sem) void usb_osal_sem_delete(usb_osal_sem_t sem)
@ -68,7 +81,13 @@ void usb_osal_sem_reset(usb_osal_sem_t sem)
usb_osal_mutex_t usb_osal_mutex_create(void) usb_osal_mutex_t usb_osal_mutex_create(void)
{ {
return (usb_osal_mutex_t)rt_mutex_create("usbh_mutex", RT_IPC_FLAG_FIFO); usb_osal_mutex_t mutex = (usb_osal_mutex_t)rt_mutex_create("usbh_mutex", RT_IPC_FLAG_FIFO);
if (mutex == NULL) {
USB_LOG_ERR("Create mutex failed\r\n");
while (1) {
}
}
return mutex;
} }
void usb_osal_mutex_delete(usb_osal_mutex_t mutex) void usb_osal_mutex_delete(usb_osal_mutex_t mutex)
@ -127,11 +146,18 @@ struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_
struct usb_osal_timer *timer; struct usb_osal_timer *timer;
timer = rt_malloc(sizeof(struct usb_osal_timer)); timer = rt_malloc(sizeof(struct usb_osal_timer));
if (timer == NULL) {
USB_LOG_ERR("Create usb_osal_timer failed\r\n");
while (1) {
}
}
memset(timer, 0, sizeof(struct usb_osal_timer)); memset(timer, 0, sizeof(struct usb_osal_timer));
timer->timer = (void *)rt_timer_create(name, handler, argument, timeout_ms, is_period ? (RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER) : (RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER)); timer->timer = (void *)rt_timer_create(name, handler, argument, timeout_ms, is_period ? (RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER) : (RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER));
if (timer->timer == NULL) { if (timer->timer == NULL) {
return NULL; USB_LOG_ERR("Create timer failed\r\n");
while (1) {
}
} }
return timer; return timer;
} }

View File

@ -7,11 +7,11 @@
#endif #endif
#if IDLE_THREAD_STACK_SIZE < 2048 #if IDLE_THREAD_STACK_SIZE < 2048
#error "IDLE_THREAD_STACK_SIZE must be greater than or equal to 2048" #error "IDLE_THREAD_STACK_SIZE must be >= 2048"
#endif #endif
#if RT_TIMER_THREAD_STACK_SIZE < 2048 #if RT_TIMER_THREAD_STACK_SIZE < 2048
#error "RT_TIMER_THREAD_STACK_SIZE must be greater than or equal to 2048" #error "RT_TIMER_THREAD_STACK_SIZE must be >= 2048"
#endif #endif
#endif #endif

View File

@ -9,7 +9,7 @@
#include "rtthread.h" #include "rtthread.h"
#include <dfs_fs.h> #include <dfs_fs.h>
#define DEV_FORMAT "/sd%c" #define DEV_FORMAT "/dev/sd%c"
#ifndef CONFIG_USB_DFS_MOUNT_POINT #ifndef CONFIG_USB_DFS_MOUNT_POINT
#define CONFIG_USB_DFS_MOUNT_POINT "/" #define CONFIG_USB_DFS_MOUNT_POINT "/"
@ -175,15 +175,17 @@ int udisk_init(struct usbh_msc *msc_class)
ret = usbh_msc_scsi_read10(msc_class, 0, msc_sector, 1); ret = usbh_msc_scsi_read10(msc_class, 0, msc_sector, 1);
if (ret != RT_EOK) { if (ret != RT_EOK) {
rt_kprintf("usb mass_storage read failed\n"); rt_kprintf("usb mass_storage read failed\n");
rt_free(dev);
return ret; return ret;
} }
for (i = 0; i < 16; i++) { for (i = 0; i < 4; i++) {
/* Get the first partition */ /* Get the first partition */
ret = dfs_filesystem_get_partition(&part0, msc_sector, i); ret = dfs_filesystem_get_partition(&part0, msc_sector, i);
if (ret == RT_EOK) { if (ret == RT_EOK) {
rt_kprintf("Found partition %d: type = %d, offet=0x%x, size=0x%x\n", rt_kprintf("Found partition %d: type = %d, offet=0x%x, size=0x%x\n",
i, part0.type, part0.offset, part0.size); i, part0.type, part0.offset, part0.size);
break;
} else { } else {
break; break;
} }
@ -219,6 +221,8 @@ void usbh_msc_run(struct usbh_msc *msc_class)
void usbh_msc_stop(struct usbh_msc *msc_class) void usbh_msc_stop(struct usbh_msc *msc_class)
{ {
struct rt_device *dev;
char name[CONFIG_USBHOST_DEV_NAMELEN]; char name[CONFIG_USBHOST_DEV_NAMELEN];
char mount_point[CONFIG_USBHOST_DEV_NAMELEN]; char mount_point[CONFIG_USBHOST_DEV_NAMELEN];
@ -226,5 +230,9 @@ void usbh_msc_stop(struct usbh_msc *msc_class)
snprintf(mount_point, CONFIG_USBHOST_DEV_NAMELEN, CONFIG_USB_DFS_MOUNT_POINT, msc_class->sdchar); snprintf(mount_point, CONFIG_USBHOST_DEV_NAMELEN, CONFIG_USB_DFS_MOUNT_POINT, msc_class->sdchar);
dfs_unmount(mount_point); dfs_unmount(mount_point);
rt_device_unregister(rt_device_find(name)); dev = rt_device_find(name);
if (dev) {
rt_device_unregister(dev);
rt_free(dev);
}
} }

View File

@ -44,6 +44,10 @@
#error PBUF_POOL_BUFSIZE must be larger than 1600 #error PBUF_POOL_BUFSIZE must be larger than 1600
#endif #endif
#if RT_LWIP_TCPTHREAD_STACKSIZE < 2048
#error RT_LWIP_TCPTHREAD_STACKSIZE must be larger than 2048
#endif
// #define CONFIG_USBHOST_PLATFORM_CDC_ECM // #define CONFIG_USBHOST_PLATFORM_CDC_ECM
// #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS // #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS
// #define CONFIG_USBHOST_PLATFORM_CDC_NCM // #define CONFIG_USBHOST_PLATFORM_CDC_NCM