From 1028634f56f898620d3a83b501102a0f492ad7b0 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 3 Jun 2026 13:58:27 +0300 Subject: [PATCH] Init --- SerialPort_USB.c | 124 ++++++++++++++++++++++++++++++++++------------- SerialPort_USB.h | 14 +++++- 2 files changed, 101 insertions(+), 37 deletions(-) diff --git a/SerialPort_USB.c b/SerialPort_USB.c index 418551c..61e0231 100644 --- a/SerialPort_USB.c +++ b/SerialPort_USB.c @@ -8,17 +8,20 @@ #if (OTG1_USB_ID == 1) otg_core_type otg1_core_struct; tSerialPortUsbArtery *SerialPortUsbArteryOtg1 = NULL; -uint32_t otg1_timeout = 0; +uint32_t otg1_timeout = 10; +usbd_conn_state stateOtg1 = USB_CONN_STATE_DEFAULT; #endif #if (OTG2_USB_ID == 1) otg_core_type otg2_core_struct; tSerialPortUsbArtery *SerialPortUsbArteryOtg2 = NULL; -uint32_t otg2_timeout = 0; +uint32_t otg2_timeout = 10; +usbd_conn_state stateOtg2 = USB_CONN_STATE_DEFAULT; #endif int StartUSBThread = 0; + void usb_delay_ms(uint32_t ms) { SystemDelayMs(ms); } @@ -44,7 +47,10 @@ void OTG1_IRQ_HANDLER(void) { } } - if (usbd_connect_state_get(&otg1_core_struct.dev) == USB_CONN_STATE_CONFIGURED) { + + stateOtg1 = usbd_connect_state_get(&otg2_core_struct.dev); + + if ((stateOtg1 == USB_CONN_STATE_CONFIGURED) || (stateOtg1 == USB_CONN_STATE_DEFAULT)) { otg1_timeout = SystemGetMs() + USB_IRQ_TIMEOUT; } } @@ -74,7 +80,10 @@ void OTG2_IRQ_HANDLER(void) { } } - if (usbd_connect_state_get(&otg2_core_struct.dev) == USB_CONN_STATE_CONFIGURED) { + + stateOtg2 = usbd_connect_state_get(&otg2_core_struct.dev); + + if ((stateOtg2 == USB_CONN_STATE_CONFIGURED) || (stateOtg2 == USB_CONN_STATE_DEFAULT)) { otg2_timeout = SystemGetMs() + USB_IRQ_TIMEOUT; } @@ -306,19 +315,19 @@ static uint16_t vSerialPortReceiveQueue( static uint16_t vSerialPortUsbTransmit(tSerialPortUsbArtery *env, uint8_t *data, uint16_t size, uint32_t timeout) { if (env->USB_ID == 1) { - if ((otg1_timeout != 0) && (otg1_timeout < SystemGetMs())) { - if (usb_vcp_send_data(&otg1_core_struct.dev, data, size) == SUCCESS) { - return size; - } +// if ((otg1_timeout != 0) && (otg1_timeout < SystemGetMs())) { + if (usb_vcp_send_data(&otg1_core_struct.dev, data, size) == SUCCESS) { + return size; +// } } } if (env->USB_ID == 2) { #if (OTG2_USB_ID == 1) - if ((otg2_timeout != 0) && (otg2_timeout < SystemGetMs())) { - if (usb_vcp_send_data(&otg2_core_struct.dev, data, size) == SUCCESS) { - return size; - } +// if ((otg2_timeout != 0) && (otg2_timeout < SystemGetMs())) { + if (usb_vcp_send_data(&otg2_core_struct.dev, data, size) == SUCCESS) { + return size; +// } } #endif } @@ -348,21 +357,31 @@ usb_sts_type SerialPortUsb_ReInit(uint8_t USB_ID) { return USB_ERROR; } + stateOtg1 = USB_CONN_STATE_DEFAULT; + + for (;;) { + if (stateOtg1 == USB_CONN_STATE_SUSPENDED) { + break; + } + SystemDelayMs(10); + } + + // 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); + usb_delay_ms(200); // Reset USB module crm_periph_clock_enable(OTG1_CLOCK, FALSE); - usb_delay_ms(5); + usb_delay_ms(50); crm_periph_reset(CRM_OTGFS1_PERIPH_RESET, TRUE); - usb_delay_ms(10); + usb_delay_ms(100); crm_periph_reset(CRM_OTGFS1_PERIPH_RESET, FALSE); - usb_delay_ms(5); + usb_delay_ms(50); crm_periph_clock_enable(OTG1_CLOCK, TRUE); // Reset message queues (optional) @@ -392,21 +411,32 @@ usb_sts_type SerialPortUsb_ReInit(uint8_t USB_ID) { return USB_ERROR; } + + stateOtg2 = USB_CONN_STATE_DEFAULT; + + for (;;) { + if (stateOtg2 == USB_CONN_STATE_SUSPENDED) { + break; + } + SystemDelayMs(10); + } + // 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); + usb_delay_ms(200); // Reset USB module + crm_periph_clock_enable(OTG2_CLOCK, FALSE); - usb_delay_ms(5); + usb_delay_ms(50); crm_periph_reset(CRM_OTGFS2_PERIPH_RESET, TRUE); - usb_delay_ms(10); + usb_delay_ms(100); crm_periph_reset(CRM_OTGFS2_PERIPH_RESET, FALSE); - usb_delay_ms(5); + usb_delay_ms(50); crm_periph_clock_enable(OTG2_CLOCK, TRUE); // Reset message queues (optional) @@ -426,8 +456,8 @@ usb_sts_type SerialPortUsb_ReInit(uint8_t USB_ID) { usbd_init(&otg2_core_struct, USB_FULL_SPEED_CORE_ID, USB2_ID, - &cdc_class_handler, - &cdc_desc_handler); + &cdc_class_handler2, + &cdc_desc_handler2); #endif } else { @@ -438,15 +468,33 @@ usb_sts_type SerialPortUsb_ReInit(uint8_t USB_ID) { } -static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { +static _Noreturn void UsbDriverOtg1_Thread(tSerialPortUsbArtery *env) { for (;;) { #if (OTG1_USB_ID == 1) if ((otg1_timeout != 0) && (otg1_timeout < SystemGetMs())) { - SerialPortUsb_ReInit(1); +// SerialPortUsb_ReInit(1); } #endif + SystemDelayMs(100); + } + + +} + +void UsbDriver_StartThreadOtg1(tSerialPortUsbArtery *env) { + if (!env->threadOtg1.id) { + env->threadOtg1.id = osThreadNew((osThreadFunc_t) (UsbDriverOtg1_Thread), (void *) (env), &env->threadOtg1.attr); + } else { + osThreadResume(env->threadOtg1.id); + } +} + + +static _Noreturn void UsbDriverOtg2_Thread(tSerialPortUsbArtery *env) { + for (;;) { + #if (OTG2_USB_ID == 1) if ((otg2_timeout != 0) && (otg2_timeout < SystemGetMs())) { SerialPortUsb_ReInit(2); @@ -455,17 +503,18 @@ static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { SystemDelayMs(100); } + + } -void UsbDriver_StartThread(tSerialPortUsbArtery *env) { - if (!env->thread.id) { - env->thread.id = osThreadNew((osThreadFunc_t) (UsbDriver_Thread), (void *) (env), &env->thread.attr); +void UsbDriver_StartThreadOtg2(tSerialPortUsbArtery *env) { + if (!env->threadOtg2.id) { + env->threadOtg2.id = osThreadNew((osThreadFunc_t) (UsbDriverOtg2_Thread), (void *) (env), &env->threadOtg2.attr); } else { - osThreadResume(env->thread.id); + osThreadResume(env->threadOtg2.id); } } - void SerialPortUsb_Init( tSerialPortUsbArtery *env, uint8_t USB_ID, @@ -554,16 +603,21 @@ void SerialPortUsb_Init( #endif } -/* + + if (!StartUSBThread) { StartUSBThread = 1; - InitThreadAtrStatic(&env->thread.attr, "UsbDriver", env->thread.controlBlock, env->thread.stack, - osPriorityNormal); - env->thread.id = 0; + InitThreadAtrStatic(&env->threadOtg1.attr, "UsbDriverOtg1", env->threadOtg1.controlBlock, env->threadOtg1.stack, + osPriorityNormal); + env->threadOtg1.id = 0; + UsbDriver_StartThreadOtg1(env); - UsbDriver_StartThread(env); + InitThreadAtrStatic(&env->threadOtg2.attr, "UsbDriverOtg1", env->threadOtg2.controlBlock, env->threadOtg2.stack, + osPriorityNormal); + env->threadOtg2.id = 0; + UsbDriver_StartThreadOtg2(env); } -*/ + } tSerialPortIO SerialPortUsb_GetIo(tSerialPortUsbArtery *env) { diff --git a/SerialPort_USB.h b/SerialPort_USB.h index 66bafa4..5c1cd4b 100644 --- a/SerialPort_USB.h +++ b/SerialPort_USB.h @@ -24,12 +24,22 @@ typedef struct { bool isInit; + uint32_t otg1_timeout; + uint32_t otg2_timeout; + struct { osThreadId_t id; - uint32_t stack[384]; + uint32_t stack[512]; StaticTask_t controlBlock; osThreadAttr_t attr; - } thread; + } threadOtg1; + + struct { + osThreadId_t id; + uint32_t stack[512]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } threadOtg2; ALIGNED_HEAD uint8_t usb_buffer[256] ALIGNED_TAIL;