USB_STATUS usb_audio_send_data ( /* [IN] audio control class interface pointer */ CLASS_CALL_STRUCT_PTR control_ptr, /* [IN] audio stream class interface pointer */ CLASS_CALL_STRUCT_PTR stream_ptr, /* [IN] callback upon completion */ tr_callback callback, /* [IN] user parameter returned by callback */ void *call_parm, /* [IN] data length */ uint32_t buf_size, /* [IN] buffer pointer */ unsigned char *buffer ) { /* Body */ AUDIO_STREAM_INTERFACE_STRUCT_PTR stream_if_ptr; AUDIO_CONTROL_INTERFACE_STRUCT_PTR control_if_ptr; TR_INIT_PARAM_STRUCT tr; USB_STATUS status = USBERR_NO_INTERFACE; USB_lock(); /* Validity checking, always needed when passing data to lower API */ if (!usb_host_class_intf_validate(control_ptr)) { USB_unlock(); return USBERR_NO_INTERFACE; } stream_if_ptr = (AUDIO_STREAM_INTERFACE_STRUCT_PTR) stream_ptr->class_intf_handle; control_if_ptr = (AUDIO_CONTROL_INTERFACE_STRUCT_PTR) control_ptr->class_intf_handle; /* Do the device use OUT pipe? */ if (stream_if_ptr->iso_out_pipe == NULL) { USB_unlock(); return USBERR_OPEN_PIPE_FAILED; } /* Validity checking, always needed when passing data to lower API */ if (!usb_host_class_intf_validate(control_ptr)) { USB_unlock(); return USBERR_NO_INTERFACE; } usb_hostdev_tr_init(&tr, (tr_callback) callback, (void *) call_parm); tr.G.TX_BUFFER = (unsigned char *) buffer; tr.G.TX_LENGTH = buf_size; status = _usb_host_send_data(control_if_ptr->AUDIO_G.G.host_handle, stream_if_ptr->iso_out_pipe, &tr); USB_unlock(); return status; } /* Endbody */
USB_STATUS usb_printer_bulk_inout ( /* [IN] class-interface data pointer + key */ CLASS_CALL_STRUCT_PTR cc_ptr, /* [IN] TR containing setup packet to be sent */ TR_INIT_PARAM_STRUCT_PTR tr_ptr, /* [IN] send_flag = TRUE means send, = FALSE means receive */ boolean send_flag ) { /* Body */ PRINTER_INTERFACE_STRUCT_PTR pis_ptr; USB_STATUS error = USBERR_NO_INTERFACE; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_printer_bulk_inout"); #endif USB_lock (); if (usb_host_class_intf_validate(cc_ptr)) { pis_ptr = (PRINTER_INTERFACE_STRUCT_PTR) cc_ptr->class_intf_handle; if (send_flag) { error = _usb_host_send_data (pis_ptr->host_handle, pis_ptr->bulk_out_pipe, tr_ptr); } else { error = _usb_host_recv_data (pis_ptr->host_handle, pis_ptr->control_pipe, tr_ptr); } /* EndIf */ } /* Endif */ USB_unlock (); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_printer_bulk_inout, SUCCESSFUL"); #endif return error; } /* Endbody */
USB_STATUS usb_class_mass_pass_on_usb ( /* [IN] Interface handle */ USB_MASS_CLASS_INTF_STRUCT_PTR intf_ptr ) { /* Body */ COMMAND_OBJECT_PTR cmd_ptr = NULL; TR_INIT_PARAM_STRUCT tr_init; USB_STATUS status = USB_OK; uint_8 tmp; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_pass_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) { USB_unlock(); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_pass_on_usb, no matching request"); #endif return (USB_STATUS)USB_MASS_NO_MATCHING_REQUEST; } /* Endif */ /* Determine the appropriate action based on the phase */ switch (cmd_ptr->STATUS) { case STATUS_QUEUED_IN_DRIVER: /* means that CBW needs to be sent.*/ usb_hostdev_tr_init(&tr_init, usb_class_mass_call_back_cbw, (pointer2)intf_ptr); tr_init.TX_BUFFER = (uchar_ptr)cmd_ptr->CBW_PTR; tr_init.TX_LENGTH = sizeof(CBW_STRUCT); status = _usb_host_send_data(intf_ptr->G.host_handle, intf_ptr->BULK_OUT_PIPE, &tr_init); break; case STATUS_FINISHED_CBW_ON_USB: /* Determine next phase (DATA or STATUS), length and direction */ if (utoh32(cmd_ptr->CBW_PTR->DCBWDATATRANSFERLENGTH) > 0) { /* Commen TR setup for IN or OUT direction */ usb_hostdev_tr_init(&tr_init,usb_class_mass_call_back_dphase, (pointer2)intf_ptr); tmp = (uint_8)((cmd_ptr->CBW_PTR->BMCBWFLAGS) & MASK_NON_DIRECTION_BITS); switch(tmp) { case DIRECTION_OUT: /* Make a TR with DATA Phase call back.*/ tr_init.TX_BUFFER = (uchar_ptr)cmd_ptr->DATA_BUFFER; tr_init.TX_LENGTH = cmd_ptr->BUFFER_LEN; status = _usb_host_send_data(intf_ptr->G.host_handle, intf_ptr->BULK_OUT_PIPE, &tr_init); break; case DIRECTION_IN: /* Make a TR with DATA call back.*/ tr_init.RX_BUFFER = (uchar_ptr)cmd_ptr->DATA_BUFFER; tr_init.RX_LENGTH = cmd_ptr->BUFFER_LEN; status = _usb_host_recv_data(intf_ptr->G.host_handle, intf_ptr->BULK_IN_PIPE, &tr_init); break; default: break; } /* Endswitch */ break; } /* Endif */ /* ** else case: ** No data transfer is expected of the request. Fall through to ** STATUS phase */ case STATUS_FINISHED_DPHASE_ON_USB: /* Make a TR and send it with STATUS call back */ usb_hostdev_tr_init(&tr_init,usb_class_mass_call_back_csw, (pointer2)intf_ptr); tr_init.RX_BUFFER = (uchar_ptr)cmd_ptr->CSW_PTR; tr_init.RX_LENGTH = sizeof(CSW_STRUCT); status = _usb_host_recv_data(intf_ptr->G.host_handle, intf_ptr->BULK_IN_PIPE, &tr_init); break; case STATUS_FINISHED_CSW_ON_USB: /* No action */ case STATUS_FAILED_IN_CSW: /* Should never happen */ default: break; } /* Endswitch */ #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_pass_on_usb, SUCCESSFUL"); #endif return status; } /* Endbody */