USB_STATUS usb_class_cdc_set_acm_ctrl_state ( /* [IN] The communication device data instance structure */ CLASS_CALL_STRUCT_PTR ccs_ptr, /* [IN] DTR state to set */ uint_8 dtr, /* [IN] RTS state to set */ uint_8 rts ) { /* Body */ USB_DATA_CLASS_INTF_STRUCT_PTR if_data_ptr; USB_ACM_CLASS_INTF_STRUCT_PTR if_acm_ptr; CLASS_CALL_STRUCT_PTR acm_instance; USB_STATUS status = USBERR_NO_INTERFACE; USB_EVENT_STRUCT_PTR event; CDC_COMMAND cmd; USB_lock(); /* Validity checking: for data interface */ if (usb_host_class_intf_validate(ccs_ptr)) { if_data_ptr = (USB_DATA_CLASS_INTF_STRUCT_PTR)ccs_ptr->class_intf_handle; acm_instance = if_data_ptr->BOUND_CONTROL_INTERFACE; if (usb_host_class_intf_validate(acm_instance)) { if_acm_ptr = (USB_ACM_CLASS_INTF_STRUCT_PTR) if_data_ptr->BOUND_CONTROL_INTERFACE->class_intf_handle; if (if_acm_ptr->acm_desc->bmCapabilities & USB_ACM_CAP_LINE_CODING) { event = &if_acm_ptr->acm_event; USB_unlock(); /* we must wait until ctrl pipe is used */ #if !HIGH_SPEED_DEVICE while(USB_EVENT_NOT_SET == _usb_event_wait_ticks(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0)){ _usb_khci_task(); } #endif _usb_event_clear(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH); USB_lock(); if (usb_host_class_intf_validate(acm_instance)) { cmd.CLASS_PTR = ccs_ptr; cmd.CALLBACK_FN = (tr_callback)usb_class_cdc_ctrl_acm_callback; cmd.CALLBACK_PARAM = acm_instance; if_acm_ptr->ctrl_state.bmStates[0] = (uint_8)(dtr ? USB_ACM_LINE_STATE_DTR : 0); if_acm_ptr->ctrl_state.bmStates[0] |= rts ? USB_ACM_LINE_STATE_RTS : 0; status = usb_class_cdc_cntrl_common(&cmd, if_acm_ptr, REQ_TYPE_OUT | REQ_TYPE_CLASS | REQ_TYPE_INTERFACE, USB_CDC_SET_CTRL_LINE_STATE, * ((uint_16 *) &if_acm_ptr->ctrl_state), 0, NULL); } } else status = USBERR_INVALID_BMREQ_TYPE; } /* Endif */ } /* Endif */ USB_unlock(); #if !HIGH_SPEED_DEVICE while(USB_EVENT_NOT_SET == _usb_event_wait_ticks(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0)){ _usb_khci_task(); } #endif _usb_event_clear(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH); _usb_event_set(event, USB_ACM_CTRL_PIPE_FREE); return status; } /* Endbody */
usb_status usb_class_cdc_set_acm_ctrl_state ( /* [IN] The communication device data instance structure */ cdc_class_call_struct_t * ccs_ptr, /* [IN] DTR state to set */ uint8_t dtr, /* [IN] RTS state to set */ uint8_t rts ) { /* Body */ usb_data_class_intf_struct_t * if_data_ptr; usb_acm_class_intf_struct_t * if_acm_ptr; cdc_class_call_struct_t * acm_instance; usb_status status = USBERR_NO_INTERFACE; os_event_handle event = NULL; cdc_command_t cmd; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_cdc_set_acm_ctrl_state"); #endif /* Validity checking: for data interface */ if (usb_class_cdc_intf_validate(ccs_ptr)) { if_data_ptr = (usb_data_class_intf_struct_t *)ccs_ptr->class_intf_handle; acm_instance = if_data_ptr->BOUND_CONTROL_INTERFACE; if (usb_class_cdc_intf_validate(acm_instance)) { if_acm_ptr = (usb_acm_class_intf_struct_t *) if_data_ptr->BOUND_CONTROL_INTERFACE->class_intf_handle; USB_CDC_ACM_lock(); if (if_acm_ptr->acm_desc->bmCapabilities & USB_ACM_CAP_LINE_CODING) { event = if_acm_ptr->acm_event; if (event != NULL) { usb_class_cdc_os_event_wait(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0); if (OS_Event_check_bit(event, USB_ACM_CTRL_PIPE_FREE)) OS_Event_clear(event, USB_ACM_CTRL_PIPE_FREE); if (OS_Event_check_bit(event, USB_ACM_DETACH)) OS_Event_clear(event, USB_ACM_DETACH); } if (usb_class_cdc_intf_validate(acm_instance)) { cmd.CLASS_PTR = ccs_ptr; cmd.CALLBACK_FN = (tr_callback) usb_class_cdc_ctrl_acm_callback; cmd.CALLBACK_PARAM = acm_instance; if_acm_ptr->ctrl_state.state = dtr ? USB_ACM_LINE_STATE_DTR : 0; if_acm_ptr->ctrl_state.state |= rts ? USB_ACM_LINE_STATE_RTS : 0; status = usb_class_cdc_cntrl_common(&cmd, if_acm_ptr, REQ_TYPE_OUT | REQ_TYPE_CLASS | REQ_TYPE_INTERFACE, USB_CDC_SET_CTRL_LINE_STATE, if_acm_ptr->ctrl_state.state, 0, NULL); } } else{ status = USBERR_INVALID_BMREQ_TYPE; } USB_CDC_ACM_unlock(); } /* Endif */ } /* Endif */ /* This piece of code cannot be executed if it is running in USB interrupt context */ if (!status && event != NULL) { /* wait for command completion */ usb_class_cdc_os_event_wait(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0); if (OS_Event_check_bit(event, USB_ACM_CTRL_PIPE_FREE)) OS_Event_clear(event, USB_ACM_CTRL_PIPE_FREE); if (OS_Event_check_bit(event, USB_ACM_DETACH)) OS_Event_clear(event, USB_ACM_DETACH); /* and unlock control pipe as it is automatic event */ OS_Event_set(event, USB_ACM_CTRL_PIPE_FREE); } #ifdef _HOST_DEBUG_ if (!status) { DEBUG_LOG_TRACE("usb_class_cdc_set_acm_ctrl_state, SUCCESSFUL"); } else { DEBUG_LOG_TRACE("usb_class_cdc_set_acm_ctrl_state, FAILED"); } #endif return status; } /* Endbody */
USB_STATUS usb_class_cdc_get_acm_line_coding ( /* [IN] The communication device data instance structure */ CLASS_CALL_STRUCT_PTR ccs_ptr, /* [IN] Where to store coding */ USB_CDC_UART_CODING_PTR uart_coding_ptr ) { /* Body */ USB_DATA_CLASS_INTF_STRUCT_PTR if_data_ptr; USB_ACM_CLASS_INTF_STRUCT_PTR if_acm_ptr; CLASS_CALL_STRUCT_PTR acm_instance; USB_STATUS status = USBERR_NO_INTERFACE; USB_EVENT_STRUCT_PTR event; CDC_COMMAND cmd; USB_lock(); /* Validity checking: for data interface */ if (usb_host_class_intf_validate(ccs_ptr)) { if_data_ptr = (USB_DATA_CLASS_INTF_STRUCT_PTR)ccs_ptr->class_intf_handle; acm_instance = if_data_ptr->BOUND_CONTROL_INTERFACE; if (usb_host_class_intf_validate(if_data_ptr->BOUND_CONTROL_INTERFACE)) { if_acm_ptr = (USB_ACM_CLASS_INTF_STRUCT_PTR) if_data_ptr->BOUND_CONTROL_INTERFACE->class_intf_handle; if (if_acm_ptr->acm_desc->bmCapabilities & USB_ACM_CAP_LINE_CODING) { event = &if_acm_ptr->acm_event; USB_unlock(); /* we must wait until ctrl pipe is used */ #if !HIGH_SPEED_DEVICE while(USB_EVENT_NOT_SET == _usb_event_wait_ticks(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0)){ _usb_khci_task(); } #endif _usb_event_clear(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH); USB_lock(); if (usb_host_class_intf_validate(acm_instance)) { cmd.CLASS_PTR = ccs_ptr; cmd.CALLBACK_FN = (tr_callback)usb_class_cdc_ctrl_acm_callback; cmd.CALLBACK_PARAM = acm_instance; status = usb_class_cdc_cntrl_common(&cmd, if_acm_ptr, REQ_TYPE_IN | REQ_TYPE_CLASS | REQ_TYPE_INTERFACE, USB_CDC_GET_LINE_CODING, 0, 7 /* sizeof(USB_CDC_UART_CODING)*/, (uchar_ptr)uart_coding_ptr); } } else status = USBERR_INVALID_BMREQ_TYPE; } /* Endif */ } /* Endif */ USB_unlock(); #if !HIGH_SPEED_DEVICE while(USB_EVENT_NOT_SET == _usb_event_wait_ticks(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH, FALSE, 0)){ _usb_khci_task(); } #endif _usb_event_clear(event, USB_ACM_CTRL_PIPE_FREE | USB_ACM_DETACH); _usb_event_set(event, USB_ACM_CTRL_PIPE_FREE); return status; } /* Endbody */