USB_STATUS usb_class_mass_storage_device_command ( /* Handle to class struct with the key */ CLASS_CALL_STRUCT_PTR ccs_ptr, /*Command */ COMMAND_OBJECT_PTR cmd_ptr ) { /* Body */ USB_MASS_CLASS_INTF_STRUCT_PTR intf_ptr; int temp; USB_STATUS error = USBERR_NO_INTERFACE; CBW_STRUCT_PTR pCbw = (CBW_STRUCT_PTR) cmd_ptr->CBW_PTR; boolean empty; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_storage_device_command"); #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; error = usb_hostdev_validate (intf_ptr->G.dev_handle); } /* Endif */ if ((error == USB_OK) || (error == USB_STATUS_TRANSFER_QUEUED)) { /* Fill in the remaining CBW fields as per the USB Mass Storage specs */ *(uint_32_ptr)pCbw->DCBWSIGNATURE = HOST_TO_LE_LONG_CONST(CBW_SIGNATURE); /* CBW is ready so queue it and update status */ empty = USB_CLASS_MASS_IS_Q_EMPTY(intf_ptr); temp = usb_class_mass_q_insert(intf_ptr, cmd_ptr); if (temp >= 0) { cmd_ptr->STATUS = STATUS_QUEUED_IN_DRIVER; /* The tag for the command packet is its queue number. */ *(uint_32_ptr)pCbw->DCBWTAG = HOST_TO_LE_LONG(temp); /* ** If queue was empty send CBW to USB immediately, otherwise it will be ** taken from queue later by a callback function */ if (empty) { error = usb_class_mass_pass_on_usb(intf_ptr); } /* Endif */ } else { error = (USB_STATUS)USB_MASS_QUEUE_FULL; } /* Endif */ } /* Endif */ USB_unlock(); #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_class_mass_storage_device_command, SUCCESSFUL"); #endif return USB_log_error(__FILE__,__LINE__,error); } /* Endbody */
USB_STATUS usb_mass_ufi_generic ( /* [IN] command object allocated by application*/ COMMAND_OBJECT_PTR cmd_ptr, uint_8 opcode, uint_8 lun, uint_32 lbaddr, uint_32 blen, uint_8 cbwflags, uchar_ptr buf, uint_32 buf_len ) { /* Body */ USB_STATUS status = USB_OK; UFI_CBWCB_EXTENDED_STRUCT_PTR ufi_ptr = NULL; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_mass_ufi_generic"); #endif ufi_ptr = (pointer) &(cmd_ptr->CBW_PTR->CMD_BLOCK); /* Construct UFI command buffer */ ufi_ptr->BUFIOPCODE = opcode; ufi_ptr->BUFILUN = lun; *(uint_32*)ufi_ptr->BUFILOGICALBLOCKADDRESS = HOST_TO_BE_LONG(lbaddr); *(uint_32*)ufi_ptr->BLENGTH = HOST_TO_BE_LONG(blen); /* Construct CBW fields (sig and tag will be filled up by class driver)*/ *(uint_32_ptr)cmd_ptr->CBW_PTR->DCBWDATATRANSFERLENGTH = HOST_TO_LE_LONG(buf_len); cmd_ptr->CBW_PTR->BMCBWFLAGS = cbwflags; TRANSFER_LOW_NIBBLE(cmd_ptr->LUN, cmd_ptr->CBW_PTR->BCBWLUN); TRANSFER_LOW_NIBBLE(sizeof(UFI_CBWCB_STRUCT), cmd_ptr->CBW_PTR->BCBWCBLENGTH); /* Construct Command object */ cmd_ptr->DATA_BUFFER = buf; cmd_ptr->BUFFER_LEN = buf_len; #ifdef _HOST_DEBUG_ DEBUG_LOG_TRACE("usb_mass_ufi_generic, SUCCESSFUL"); #endif /* Pass this request to class driver */ return usb_class_mass_storage_device_command(cmd_ptr->CALL_PTR, cmd_ptr); } /* Endbody */
void SoftwareI2CPort::fillAddressBuffer(uint8_t address, uint32_t subaddress, uint32_t subaddressLength) { // First clear the address buffer. m_addressBuffer[0] = HOST_TO_LE_LONG((address << 1) | kI2CWrite); m_addressBuffer[1] = 0; // Set the target address and r/w flag. uint8_t * addressBytes = reinterpret_cast<uint8_t *>(&m_addressBuffer[1]); // Now fill in the subaddress if we have one. if (subaddressLength) { for (int i = subaddressLength; i > 0; --i) { addressBytes[i - 1] = subaddress & 0xff; subaddress >>= 8; } } }