This commit is contained in:
cfif 2026-05-07 16:20:45 +03:00
parent 3ec485c320
commit d86f67decd
3 changed files with 158 additions and 28 deletions

View File

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

View File

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

View File

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