Hi Juraj,
There is my flow:
====================================================
int vcom_test() // virtual com test func
{
...
while (1) {
ch = keypad_getchar();
if (ch == '1')
open_com(1, 0);
if (ch == '2')
close_com(1);
if (ch == '3')
write_com(1, buf);
if (ch == '9')
break;
if (read_com(1, &c))
printf("read %02x\n", c);
_time_delay(1);
}
return 0;
}
====================================================
static int init_vcom()
{
CDC_CONFIG_STRUCT cdc_config;
if (vcom_initd == TRUE)
return 1;
if (g_curr_recv_buf == NULL)
g_curr_recv_buf = _mem_alloc_uncached(DATA_BUFF_SIZE);
if (endPoint_ptr == NULL)
endPoint_ptr = USB_mem_alloc_zero(sizeof(USB_CLASS_CDC_ENDPOINT) * CDC_DESC_ENDPOINT_COUNT);
cdc_config.comm_feature_data_size = COMM_FEATURE_DATA_SIZE;
cdc_config.usb_ep_data = &usb_desc_ep;
cdc_config.desc_endpoint_cnt = CDC_DESC_ENDPOINT_COUNT;
cdc_config.cdc_class_cb.callback = usb_cdc_callback;
cdc_config.cdc_class_cb.arg = &g_app_handle;
cdc_config.vendor_req_callback.callback = NULL;
cdc_config.vendor_req_callback.arg = NULL;
cdc_config.param_callback.callback = usb_para_callback;
cdc_config.param_callback.arg = &g_app_handle;
cdc_config.desc_callback_ptr = &desc_callback;
cdc_config.ep = endPoint_ptr;
cdc_config.cic_send_endpoint = CIC_NOTIF_ENDPOINT;
/* Always happend in control endpoint hence hard coded in Class layer*/
cdc_config.dic_send_endpoint = DIC_BULK_IN_ENDPOINT;
cdc_config.dic_recv_endpoint = DIC_BULK_OUT_ENDPOINT;
if (MQX_OK != _usb_device_driver_install(USBCFG_DEFAULT_DEVICE_CONTROLLER)) {
return 1;
}
/* Initialize the USB interface */
g_app_handle = USB_Class_CDC_Init(&cdc_config);
flag_vcom_status = 1;
vcom_initd = TRUE;
...
return 0;
}
====================================================
int open_vcom()
{
if (vcom_initd == FALSE) {
return init_vcom();
}
if (flag_vcom_status == 0) {
...
flag_vcom_status = 1;
return 0;
}
return 1;
}
====================================================
int close_vcom()
{
USB_Class_CDC_Deinit(g_app_handle);
...
return 1;
}
====================================================
int read_vcom(char *c)
{
if (g_recv_size > 0) {
*c = get_ring_buf();
return 1;
} else {
// printf("Buffer is empty\n");
return 0;
}
}
====================================================
int write_vcom(const char *s)
{
int size = strlen(s);
if ((start_app == TRUE) && (start_transactions == TRUE)) { // non block write
uint_8 error;
error = USB_Class_CDC_Send_Data(g_app_handle, DIC_BULK_IN_ENDPOINT, (uint_8_ptr)s, (uint_32)size);
if (error == USB_OK) {
return size;
} else { /* Failure to send Data Handling code here */
}
} else { // USB not ready
return 0;
}
}