From d86f67decd876b53e323bba0847512cfb82e9ece Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 7 May 2026 16:20:45 +0300 Subject: [PATCH] Init --- SerialPort_USB.c | 165 +++++++++++++++++++++++++++++++++++++++++------ SerialPort_USB.h | 17 +++-- usb_conf.h | 4 +- 3 files changed, 158 insertions(+), 28 deletions(-) diff --git a/SerialPort_USB.c b/SerialPort_USB.c index 19b169d..9e56a84 100644 --- a/SerialPort_USB.c +++ b/SerialPort_USB.c @@ -8,13 +8,16 @@ #if (OTG1_USB_ID == 1) otg_core_type otg1_core_struct; tSerialPortUsbArtery *SerialPortUsbArteryOtg1 = NULL; +uint32_t otg1_timeout = 0; #endif #if (OTG2_USB_ID == 1) otg_core_type otg2_core_struct; tSerialPortUsbArtery *SerialPortUsbArteryOtg2 = NULL; +uint32_t otg2_timeout = 0; #endif +int StartUSBThread = 0; void usb_delay_ms(uint32_t ms) { SystemDelayMs(ms); @@ -26,6 +29,7 @@ void OTG1_IRQ_HANDLER(void) { usbd_irq_handler(&otg1_core_struct); if (SerialPortUsbArteryOtg1 != NULL) { + uint16_t data_len = usb_vcp_get_rxdata(&otg1_core_struct.dev, SerialPortUsbArteryOtg1->usb_buffer); if (data_len > 0) { @@ -40,7 +44,9 @@ void OTG1_IRQ_HANDLER(void) { } } - + if (usbd_connect_state_get(&otg1_core_struct.dev) == USB_CONN_STATE_CONFIGURED) { + otg1_timeout = SystemGetMs() + USB_IRQ_TIMEOUT; + } } } @@ -53,6 +59,7 @@ void OTG2_IRQ_HANDLER(void) { usbd_irq_handler(&otg2_core_struct); if (SerialPortUsbArteryOtg2 != NULL) { + uint16_t data_len = usb_vcp_get_rxdata(&otg2_core_struct.dev, SerialPortUsbArteryOtg2->usb_buffer); if (data_len > 0) { @@ -67,6 +74,9 @@ void OTG2_IRQ_HANDLER(void) { } } + if (usbd_connect_state_get(&otg2_core_struct.dev) == USB_CONN_STATE_CONFIGURED) { + otg2_timeout = SystemGetMs() + USB_IRQ_TIMEOUT; + } } @@ -324,23 +334,125 @@ vSerialPortUsbSnifferReceive(tSerialPortUsbArtery *env, uint8_t *data, uint16_t : 0; } -/* -static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { - for (;;) { - uint16_t data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, env->usb_buffer); - if (data_len > 0) { - for (uint16_t i = 0; i < data_len; ++i) { - osMessageQueuePut(env->rxDataQueue, &env->usb_buffer[i], 0x0, 0U); +usb_sts_type SerialPortUsb_ReInit(uint8_t USB_ID) +{ + usb_sts_type status = USB_OK; - if (env->rxDataSnifferQueue) { - osMessageQueuePut(env->rxDataSnifferQueue, &env->usb_buffer[i], 0x0, 0U); - } - - } + if (USB_ID == 1) { +#if (OTG1_USB_ID == 1) + if (SerialPortUsbArteryOtg1 == NULL) { + return USB_ERROR; } -// SystemDelayMs(1); + // Disable USB interrupt + NVIC_DisableIRQ(OTG1_IRQ); + NVIC_ClearPendingIRQ(OTG1_IRQ); + + // Physically disconnect from USB bus + usbd_disconnect(&otg1_core_struct.dev); + usb_delay_ms(20); + + // Reset USB module + crm_periph_clock_enable(OTG1_CLOCK, FALSE); + usb_delay_ms(5); + crm_periph_reset(CRM_OTGFS1_PERIPH_RESET, TRUE); + usb_delay_ms(10); + crm_periph_reset(CRM_OTGFS1_PERIPH_RESET, FALSE); + usb_delay_ms(5); + crm_periph_clock_enable(OTG1_CLOCK, TRUE); + + // Reset message queues (optional) + if (SerialPortUsbArteryOtg1->rxDataQueue) { + osMessageQueueReset(SerialPortUsbArteryOtg1->rxDataQueue); + } + if (SerialPortUsbArteryOtg1->rxDataSnifferQueue) { + osMessageQueueReset(SerialPortUsbArteryOtg1->rxDataSnifferQueue); + } + + otg1_timeout = 0; + + NVIC_EnableIRQ(OTG1_IRQ); + NVIC_SetPriority(OTG1_IRQ, 0xFF); + + // init usb + usbd_init(&otg1_core_struct, + USB_FULL_SPEED_CORE_ID, + USB1_ID, + &cdc_class_handler, + &cdc_desc_handler); + +#endif + } + else if (USB_ID == 2) { +#if (OTG2_USB_ID == 1) + if (SerialPortUsbArteryOtg2 == NULL) { + return USB_ERROR; + } + + // Disable USB interrupt + NVIC_DisableIRQ(OTG2_IRQ); + NVIC_ClearPendingIRQ(OTG2_IRQ); + + // Physically disconnect from USB bus + usbd_disconnect(&otg2_core_struct.dev); + usb_delay_ms(20); + + // Reset USB module + crm_periph_clock_enable(OTG2_CLOCK, FALSE); + usb_delay_ms(5); + crm_periph_reset(CRM_OTGFS2_PERIPH_RESET, TRUE); + usb_delay_ms(10); + crm_periph_reset(CRM_OTGFS2_PERIPH_RESET, FALSE); + usb_delay_ms(5); + crm_periph_clock_enable(OTG2_CLOCK, TRUE); + + // Reset message queues (optional) + if (SerialPortUsbArteryOtg2->rxDataQueue) { + osMessageQueueReset(SerialPortUsbArteryOtg2->rxDataQueue); + } + if (SerialPortUsbArteryOtg2->rxDataSnifferQueue) { + osMessageQueueReset(SerialPortUsbArteryOtg2->rxDataSnifferQueue); + } + + otg2_timeout = 0; + + NVIC_EnableIRQ(OTG2_IRQ); + NVIC_SetPriority(OTG2_IRQ, 0xFF); + + // init usb + usbd_init(&otg2_core_struct, + USB_FULL_SPEED_CORE_ID, + USB2_ID, + &cdc_class_handler, + &cdc_desc_handler); + +#endif + } + else { + return USB_ERROR; + } + + return status; +} + + +static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { + for (;;) { + +#if (OTG1_USB_ID == 1) + if ((otg1_timeout != 0) && (otg1_timeout < SystemGetMs())) { + SerialPortUsb_ReInit(1); + } +#endif + +#if (OTG2_USB_ID == 1) + if ((otg2_timeout != 0) && (otg2_timeout < SystemGetMs())) { + SerialPortUsb_ReInit(2); + } +#endif + + SystemDelayMs(100); } } @@ -351,7 +463,10 @@ void UsbDriver_StartThread(tSerialPortUsbArtery *env) { osThreadResume(env->thread.id); } } -*/ + + + + void SerialPortUsb_Init( tSerialPortUsbArtery *env, uint8_t USB_ID, @@ -372,6 +487,8 @@ void SerialPortUsb_Init( if (env->USB_ID == 1) { #if (OTG1_USB_ID == 1) + env->isInit = true; + SerialPortUsbArteryOtg1 = env; // usb gpio config usb1_gpio_config(); @@ -400,13 +517,14 @@ void SerialPortUsb_Init( &cdc_class_handler, &cdc_desc_handler); -// InitThreadAtrStatic(&env->thread.attr, "UsbDriver", env->thread.controlBlock, env->thread.stack, osPriorityNormal); -// env->thread.id = 0; #endif } if (env->USB_ID == 2) { + #if (OTG2_USB_ID == 1) + env->isInit = true; + SerialPortUsbArteryOtg2 = env; // usb gpio config usb2_gpio_config(); @@ -435,11 +553,18 @@ void SerialPortUsb_Init( &cdc_class_handler, &cdc_desc_handler); -// InitThreadAtrStatic(&env->thread.attr, "UsbDriver", env->thread.controlBlock, env->thread.stack, osPriorityNormal); -// env->thread.id = 0; #endif } - //UsbDriver_StartThread(env); +/* + if (!StartUSBThread) { + StartUSBThread = 1; + InitThreadAtrStatic(&env->thread.attr, "UsbDriver", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); + env->thread.id = 0; + + UsbDriver_StartThread(env); + } + */ } tSerialPortIO SerialPortUsb_GetIo(tSerialPortUsbArtery *env) { diff --git a/SerialPort_USB.h b/SerialPort_USB.h index f66ff53..66bafa4 100644 --- a/SerialPort_USB.h +++ b/SerialPort_USB.h @@ -12,6 +12,9 @@ #include "usbd_int.h" #include "cdc_class.h" #include "cdc_desc.h" +#include "stdbool.h" + +#define USB_IRQ_TIMEOUT 1000 typedef struct { osMessageQueueId_t rxDataQueue; @@ -19,12 +22,14 @@ typedef struct { uint8_t USB_ID; -// struct { -// osThreadId_t id; -// uint32_t stack[1024]; -// StaticTask_t controlBlock; -// osThreadAttr_t attr; -// } thread; + bool isInit; + + struct { + osThreadId_t id; + uint32_t stack[384]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; ALIGNED_HEAD uint8_t usb_buffer[256] ALIGNED_TAIL; diff --git a/usb_conf.h b/usb_conf.h index 3501f77..cf2c4a7 100644 --- a/usb_conf.h +++ b/usb_conf.h @@ -58,10 +58,10 @@ extern "C" { /* use otgfs1 */ #define OTG1_USB_ID 1 -#define OTG2_USB_ID 0 +#define OTG2_USB_ID 1 /* use otgfs2 */ -#define OTG_USB_ID 2 +//#define OTG_USB_ID 2 #if (OTG1_USB_ID == 1) #define USB1_ID 0