18f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/* 28f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Copyright (C) 2013 The Android Open Source Project 38f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * 48f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 58f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * you may not use this file except in compliance with the License. 68f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * You may obtain a copy of the License at 78f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * 88f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 98f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * 108f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Unless required by applicable law or agreed to in writing, software 118f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 128f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * See the License for the specific language governing permissions and 148f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * limitations under the License. 158f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */ 168f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 178f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpackage com.android.accessorydisplay.sink; 188f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 198f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Logger; 208f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport com.android.accessorydisplay.common.Transport; 218f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 228f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbDevice; 238f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbDeviceConnection; 248f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport android.hardware.usb.UsbEndpoint; 258f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 268f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownimport java.io.IOException; 278f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 288f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown/** 298f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * Sends or receives messages using bulk endpoints associated with a {@link UsbDevice} 308f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown * that represents a USB accessory. 318f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown */ 328f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brownpublic class UsbAccessoryBulkTransport extends Transport { 338f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown private static final int TIMEOUT_MILLIS = 1000; 348f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 358f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown private UsbDeviceConnection mConnection; 368f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown private UsbEndpoint mBulkInEndpoint; 378f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown private UsbEndpoint mBulkOutEndpoint; 388f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 398f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown public UsbAccessoryBulkTransport(Logger logger, UsbDeviceConnection connection, 408f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown UsbEndpoint bulkInEndpoint, UsbEndpoint bulkOutEndpoint) { 418f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown super(logger, 16384); 428f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mConnection = connection; 438f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mBulkInEndpoint = bulkInEndpoint; 448f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mBulkOutEndpoint = bulkOutEndpoint; 458f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 468f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 478f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown @Override 488f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown protected void ioClose() { 498f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mConnection = null; 508f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mBulkInEndpoint = null; 518f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown mBulkOutEndpoint = null; 528f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 538f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 548f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown @Override 558f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown protected int ioRead(byte[] buffer, int offset, int count) throws IOException { 568f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown if (mConnection == null) { 578f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown throw new IOException("Connection was closed."); 588f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 598f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown return mConnection.bulkTransfer(mBulkInEndpoint, buffer, offset, count, -1); 608f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 618f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown 628f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown @Override 638f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown protected void ioWrite(byte[] buffer, int offset, int count) throws IOException { 648f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown if (mConnection == null) { 658f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown throw new IOException("Connection was closed."); 668f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 678f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown int result = mConnection.bulkTransfer(mBulkOutEndpoint, 688f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown buffer, offset, count, TIMEOUT_MILLIS); 698f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown if (result < 0) { 708f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown throw new IOException("Bulk transfer failed."); 718f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 728f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown } 738f3b1307678fcd1896c7fb8ba4cc20553dc032e8Jeff Brown} 74