Init
This commit is contained in:
parent
3ec485c320
commit
d86f67decd
165
SerialPort_USB.c
165
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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue