This commit is contained in:
cfif 2026-06-03 13:58:27 +03:00
parent e7d9c94e93
commit 1028634f56
2 changed files with 101 additions and 37 deletions

View File

@ -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) {

View File

@ -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;