Init
This commit is contained in:
parent
e7d9c94e93
commit
1028634f56
124
SerialPort_USB.c
124
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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue