1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17aed3c61c4437ebb05eadfb3bf85d6962c30b9935Yabin Cui#define TRACE_TAG TRANSPORT 183313426fad9eaaf53017cdbde889ebcec91358ecDan Albert 193313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "sysdeps.h" 203313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "transport.h" 213313426fad9eaaf53017cdbde889ebcec91358ecDan Albert 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "adb.h" 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int remote_read(apacket *p, atransport *t) 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_read(t->usb, &p->msg, sizeof(amessage))){ 317a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: read terminated (message)"); 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 353d2904cdf2371e26c0465184436bd063979a5d97Tamas Berghammer if(check_header(p, t)) { 367a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: check_header failed"); 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p->msg.data_length) { 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_read(t->usb, p->data, p->msg.data_length)){ 427a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: terminated (data)"); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(check_data(p)) { 487a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: check_data failed"); 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int remote_write(apacket *p, atransport *t) 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned size = p->msg.data_length; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_write(t->usb, &p->msg, sizeof(amessage))) { 607a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: 1 - write terminated"); 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p->msg.data_length == 0) return 0; 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_write(t->usb, &p->data, size)) { 657a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("remote usb: 2 - write terminated"); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void remote_close(atransport *t) 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_close(t->usb); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->usb = 0; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void remote_kick(atransport *t) 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_kick(t->usb); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dcd78a15d0be143d48fc93af6a9fa5748dbf9790Dan Albertvoid init_usb_transport(atransport *t, usb_handle *h, ConnectionState state) 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 857a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui D("transport: usb"); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->close = remote_close; 877f27490e7f386401dc38287a67dcb8826e2260c5Yabin Cui t->SetKickFunction(remote_kick); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->read_from_remote = remote_read; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->write_to_remote = remote_write; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->sync_token = 1; 910927bf9690127bc45cf8837a1467759e9720399aMike Lockwood t->connection_state = state; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->type = kTransportUsb; 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t->usb = h; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 9630186df0f05ca2df10af7a64604eb93a1e1a27dcJosh Gaoint is_adb_interface(int usb_class, int usb_subclass, int usb_protocol) 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 9855664906a89058ae8d7521e20b24273508f6bf9bElliott Hughes return (usb_class == ADB_CLASS && usb_subclass == ADB_SUBCLASS && usb_protocol == ADB_PROTOCOL); 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1005d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao 1015d1756ceb58246a721e10464f788e81cdcdc455aJosh Gaobool should_use_libusb() { 1025d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao#if defined(_WIN32) || !ADB_HOST 1035d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao return false; 1045d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao#else 105f2f0b318508fec66fc07044b34f602960f399e5bJosh Gao static bool disable = getenv("ADB_LIBUSB") && strcmp(getenv("ADB_LIBUSB"), "0") == 0; 106f2f0b318508fec66fc07044b34f602960f399e5bJosh Gao return !disable; 1075d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao#endif 1085d1756ceb58246a721e10464f788e81cdcdc455aJosh Gao} 109