/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_set_interface * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_set_interface ( /* usb device */ _usb_device_instance_handle dev_handle, /* alternate setting */ uint_8 alternate, /* interface */ uint_8 intf ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_INTERFACE | REQ_TYPE_OUT; request.BREQUEST = REQ_SET_INTERFACE; htou16(request.WVALUE, alternate); htou16(request.WINDEX, intf); error = usb_host_ch9_dev_req(dev_handle, &request, NULL); USB_unlock(); return error; } /* EndBody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_synch_frame * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_synch_frame ( /* usb device */ _usb_device_instance_handle dev_handle, /* interface index */ uint_8 intf, /* configuration buffer */ uchar_ptr buffer ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_ENDPOINT | REQ_TYPE_IN; request.BREQUEST = REQ_SYNCH_FRAME; htou16(request.WINDEX, intf); htou16(request.WLENGTH, 2); error = usb_host_ch9_dev_req(dev_handle, &request, buffer); USB_unlock(); return error; } /* EndBody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_get_interface * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_get_interface ( /* usb device */ _usb_device_instance_handle dev_handle, /* interface index */ uint_8 interface, /* alternate setting buffer */ uchar_ptr buffer ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_INTERFACE | REQ_TYPE_IN; request.BREQUEST = REQ_GET_INTERFACE; htou16(request.WINDEX, interface); htou16(request.WLENGTH, 1); error = usb_host_ch9_dev_req(dev_handle, &request, buffer); USB_unlock(); return error; } /* EndBody */
static USB_STATUS usb_class_hid_cntrl_common ( /* [IN] The communication device common command structure */ HID_COMMAND_PTR com_ptr, /* [IN] Bitmask of the request type */ uint_8 bmrequesttype, /* [IN] Request code */ uint_8 brequest, /* [IN] Value to copy into WVALUE field of the REQUEST */ uint_16 wvalue, /* [IN] Length of the data associated with REQUEST */ uint_16 wlength, /* [IN] Pointer to data buffer used to send/recv */ uchar_ptr data ) { /* Body */ USB_HID_CLASS_INTF_STRUCT_PTR if_ptr; USB_SETUP req; USB_STATUS status = USBERR_NO_INTERFACE; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_hid_cntrl_common"); #endif USB_lock(); /* Validity checking */ if (usb_host_class_intf_validate(com_ptr->CLASS_PTR)) { if_ptr = (USB_HID_CLASS_INTF_STRUCT_PTR)com_ptr->CLASS_PTR->class_intf_handle; status = usb_hostdev_validate(if_ptr->G.dev_handle); } /* Endif */ if (!status && if_ptr->IN_SETUP) { status = USBERR_TRANSFER_IN_PROGRESS; } /* Endif */ if (!status) { /* Save the higher level callback and ID */ if_ptr->USER_CALLBACK = com_ptr->CALLBACK_FN; if_ptr->USER_PARAM = com_ptr->CALLBACK_PARAM; /* Setup the request */ req.BMREQUESTTYPE = bmrequesttype; req.BREQUEST = brequest; htou16(req.WVALUE, wvalue); htou16(req.WINDEX, if_ptr->IFNUM); htou16(req.WLENGTH, wlength); status = _usb_hostdev_cntrl_request(if_ptr->G.dev_handle, &req, data, usb_class_hid_cntrl_callback, if_ptr); if (status == USB_STATUS_TRANSFER_QUEUED) { if_ptr->IN_SETUP = TRUE; } /* Endif */ } /* Endif */ USB_unlock(); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_hid_cntrl_common, SUCCESSFUL"); #endif return status; } /* Endbody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_get_descriptor * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_get_descriptor ( /* usb device */ _usb_device_instance_handle dev_handle, /* descriptor type & index */ uint_16 type_index, /* Language ID or 0 */ uint_16 lang_id, /* buffer length */ uint_16 buflen, /* descriptor buffer */ uchar_ptr buffer ) { /* Body */ USB_SETUP request; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_DEVICE | REQ_TYPE_IN; request.BREQUEST = REQ_GET_DESCRIPTOR; htou16(request.WVALUE, type_index); htou16(request.WINDEX, lang_id); htou16(request.WLENGTH, buflen); error = usb_host_ch9_dev_req(dev_handle, &request, buffer); USB_unlock(); return error; } /* EndBody */
USB_STATUS usb_class_mass_getmaxlun_bulkonly ( CLASS_CALL_STRUCT_PTR ccs_ptr, uint_8_ptr pLUN, tr_callback callback ) { /* Body */ USB_STATUS status = USBERR_NO_INTERFACE; USB_SETUP request; USB_MASS_CLASS_INTF_STRUCT_PTR intf_ptr; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_getmaxlun_bulkonly"); #endif /* Pointer validity-checking, clear memory, init header */ USB_lock(); if (usb_host_class_intf_validate(ccs_ptr)) { intf_ptr = (USB_MASS_CLASS_INTF_STRUCT_PTR) ccs_ptr->class_intf_handle; status = usb_hostdev_validate(intf_ptr->G.dev_handle); } /* Endif */ if (status) { USB_unlock(); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_getmaxlun_bulkonly, error status"); #endif return status; } /* Endif */ /* Get the number of logical units on the device */ request.BMREQUESTTYPE = REQ_TYPE_CLASS | REQ_TYPE_INTERFACE | REQ_TYPE_IN; request.BREQUEST = GET_MAX_LUN; htou16(request.WVALUE, 0); htou16(request.WINDEX, ((INTERFACE_DESCRIPTOR_PTR)intf_ptr->G.intf_handle)->bInterfaceNumber); htou16(request.WLENGTH, 1); /* Send request */ status = _usb_hostdev_cntrl_request (intf_ptr->G.dev_handle, &request, (uchar_ptr)pLUN, callback, NULL); USB_unlock(); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_getmaxlun_bulkonly, SUCCESSFUL"); #endif return status; } /* Endbody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_set_configuration * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_set_configuration ( /* usb device */ _usb_device_instance_handle dev_handle, /* configuration value */ uint_16 config ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_DEVICE | REQ_TYPE_OUT; request.BREQUEST = REQ_SET_CONFIGURATION; htou16(request.WVALUE, config); error = usb_host_ch9_dev_req(dev_handle, &request, NULL); USB_unlock(); return error; } /* EndBody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_get_configuration * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_get_configuration ( /* [IN] usb device */ _usb_device_instance_handle dev_handle, /* [OUT] configuration value */ uchar_ptr buffer ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_DEVICE | REQ_TYPE_IN; request.BREQUEST = REQ_GET_CONFIGURATION; htou16(request.WLENGTH, 1); error = usb_host_ch9_dev_req(dev_handle, &request, buffer); USB_unlock(); return error; } /* EndBody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_clear_feature * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_clear_feature ( /* usb device */ _usb_device_instance_handle dev_handle, /* request type device/interface/endpoint */ uint_8 req_type, /* device = 0, or interface/endpoint */ uint_8 intf_endpt, /* feature selection */ uint_16 feature ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); switch (req_type) { case REQ_TYPE_DEVICE: break; case REQ_TYPE_INTERFACE: case REQ_TYPE_ENDPOINT: htou16(request.WINDEX, intf_endpt); break; default: USB_unlock(); return USBERR_INVALID_BMREQ_TYPE; } /* EndSwitch */ request.BMREQUESTTYPE = (uchar)(req_type | REQ_TYPE_OUT); request.BREQUEST = REQ_CLEAR_FEATURE; htou16(request.WVALUE, feature); error = usb_host_ch9_dev_req(dev_handle, &request, NULL); USB_unlock(); return error; } /* EndBody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_get_status * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_get_status ( /* usb device */ _usb_device_instance_handle dev_handle, /* request type device/interface/endpoint */ uint_8 req_type, /* device = 0, or interface/endpoint */ uint_8 intf_endpt, /* returned status */ uchar_ptr buffer ) { /* Body */ USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); switch (req_type) { case REQ_TYPE_DEVICE: case REQ_TYPE_INTERFACE: case REQ_TYPE_ENDPOINT: break; default: USB_unlock(); return USBERR_INVALID_BMREQ_TYPE; } /* EndSwitch */ request.BMREQUESTTYPE = (uchar)(req_type | REQ_TYPE_IN); request.BREQUEST = REQ_GET_STATUS; htou16(request.WINDEX, intf_endpt); htou16(request.WLENGTH, 2); error = usb_host_ch9_dev_req(dev_handle, &request, buffer); USB_unlock(); return error; } /* EndBody */
USB_STATUS usb_class_mass_reset_recovery_on_usb ( USB_MASS_CLASS_INTF_STRUCT_PTR intf_ptr ) { /* Body */ PIPE_INIT_PARAM_STRUCT_PTR pPipe = NULL; COMMAND_OBJECT_PTR cmd_ptr = NULL; DEV_INSTANCE_PTR dev_ptr = (DEV_INSTANCE_PTR)intf_ptr->G.dev_handle; USB_STATUS status = USB_OK; USB_SETUP request; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_reset_recovery_on_usb"); #endif /* Nothing can be done if there is nothing pending*/ usb_class_mass_get_pending_request(intf_ptr,&cmd_ptr); if(cmd_ptr == NULL) { #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_reset_recovery_on_usb,no matching request"); #endif return (USB_STATUS) USB_MASS_NO_MATCHING_REQUEST; } /* Endif */ /* BULK device mass storage reset */ request.BMREQUESTTYPE = REQ_TYPE_CLASS | REQ_TYPE_INTERFACE | REQ_TYPE_OUT; request.BREQUEST = MASS_STORAGE_RESET; htou16(request.WVALUE, 0); htou16(request.WINDEX, ((INTERFACE_DESCRIPTOR_PTR)intf_ptr->G.intf_handle)->bInterfaceNumber); htou16(request.WLENGTH, 0); cmd_ptr->STATUS = STATUS_RESET_DEVICE; status = _usb_hostdev_cntrl_request (intf_ptr->G.dev_handle, &request, NULL, usb_class_mass_reset_callback, (pointer2)intf_ptr); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_reset_recovery_on_usb,SUCCESSFUL"); #endif return status; } /* Endbody */
/*FUNCTION*---------------------------------------------------------------- * * Function Name : _usb_host_ch9_set_address * Returned Value : USB_OK, or error status * Comments : * Function to process standard device request in Chapter 9. * See Table 9-3 p. 250 of USB 2.0 specification. * *END*--------------------------------------------------------------------*/ USB_STATUS _usb_host_ch9_set_address ( /* usb device */ _usb_device_instance_handle dev_handle ) { /* Body */ DEV_INSTANCE_PTR dev_ptr = (DEV_INSTANCE_PTR)dev_handle; USB_SETUP request = req_prototype; USB_STATUS error = USB_OK; USB_lock(); request.BMREQUESTTYPE = REQ_TYPE_DEVICE | REQ_TYPE_OUT; request.BREQUEST = REQ_SET_ADDRESS; htou16(request.WVALUE, dev_ptr->address); error = usb_host_ch9_dev_req(dev_handle, &request, NULL); USB_unlock(); return error; } /* EndBody */
static USB_STATUS usb_class_cdc_cntrl_common ( /* [IN] The communication device common command structure */ CDC_COMMAND_PTR com_ptr, /* [IN] The communication device control interface */ USB_ACM_CLASS_INTF_STRUCT_PTR if_ctrl_ptr, /* [IN] Bitmask of the request type */ uint_8 bmrequesttype, /* [IN] Request code */ uint_8 brequest, /* [IN] Value to copy into WVALUE field of the REQUEST */ uint_16 wvalue, /* [IN] Length of the data associated with REQUEST */ uint_16 wlength, /* [IN] Pointer to data buffer used to send/recv */ uchar_ptr data ) { /* Body */ USB_CDC_GENERAL_CLASS_PTR if_ptr; USB_SETUP req; USB_STATUS status = USBERR_NO_INTERFACE; if_ptr = (USB_CDC_GENERAL_CLASS_PTR) com_ptr->CLASS_PTR->class_intf_handle; /* Save the higher level callback and ID */ if_ptr->USER_CALLBACK = com_ptr->CALLBACK_FN; if_ptr->USER_PARAM = com_ptr->CALLBACK_PARAM; /* Setup the request */ req.BMREQUESTTYPE = bmrequesttype; req.BREQUEST = brequest; htou16(req.WINDEX, if_ctrl_ptr->CDC_G.IFNUM); /* number of control interface */ htou16(req.WVALUE, wvalue); htou16(req.WLENGTH, wlength); /* Since this function is general, we must distinguish here interface class to perform ** appropriate action. ** Only ACM devices are supported now. */ switch (((INTERFACE_DESCRIPTOR_PTR) if_ctrl_ptr->CDC_G.G.intf_handle)->bInterfaceSubClass) { case USB_SUBCLASS_COM_DIRECT: break; case USB_SUBCLASS_COM_ABSTRACT: if (USB_STATUS_TRANSFER_QUEUED == (status = _usb_hostdev_cntrl_request(if_ptr->G.dev_handle, &req, data, usb_class_cdc_cntrl_callback, if_ptr))) status = USB_OK; break; case USB_SUBCLASS_COM_TELEPHONE: break; case USB_SUBCLASS_COM_MULTICHAN: break; case USB_SUBCLASS_COM_CAPI: break; case USB_SUBCLASS_COM_ETHERNET: break; case USB_SUBCLASS_COM_ATM_NET: break; } return status; } /* Endbody */