19270a20a801403c9f60d6a701b39eae70d380403Doug Zongker/* 29270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Copyright (C) 2007 The Android Open Source Project 39270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 49270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Licensed under the Apache License, Version 2.0 (the "License"); 59270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * you may not use this file except in compliance with the License. 69270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * You may obtain a copy of the License at 79270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 89270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * http://www.apache.org/licenses/LICENSE-2.0 99270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * 109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * Unless required by applicable law or agreed to in writing, software 119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * distributed under the License is distributed on an "AS IS" BASIS, 129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * See the License for the specific language governing permissions and 149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker * limitations under the License. 159270a20a801403c9f60d6a701b39eae70d380403Doug Zongker */ 169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 179270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <stdio.h> 189270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <stdlib.h> 199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <string.h> 209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include <sysdeps.h> 229270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 239270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define TRACE_TAG TRACE_TRANSPORT 249270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#include "adb.h" 259270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 269270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#ifdef HAVE_BIG_ENDIAN 279270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define H4(x) (((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24) 289270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic inline void fix_endians(apacket *p) 299270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 309270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.command = H4(p->msg.command); 319270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.arg0 = H4(p->msg.arg0); 329270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.arg1 = H4(p->msg.arg1); 339270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.data_length = H4(p->msg.data_length); 349270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.data_check = H4(p->msg.data_check); 359270a20a801403c9f60d6a701b39eae70d380403Doug Zongker p->msg.magic = H4(p->msg.magic); 369270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 379270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerunsigned host_to_le32(unsigned n) 389270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 399270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return H4(n); 409270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 419270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#else 429270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#define fix_endians(p) do {} while (0) 439270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerunsigned host_to_le32(unsigned n) 449270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 459270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return n; 469270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 479270a20a801403c9f60d6a701b39eae70d380403Doug Zongker#endif 489270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 499270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic int remote_read(apacket *p, atransport *t) 509270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 519270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(usb_read(t->usb, &p->msg, sizeof(amessage))){ 529270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: read terminated (message)\n"); 539270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 549270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 559270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 569270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fix_endians(p); 579270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 589270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(check_header(p)) { 599270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: check_header failed\n"); 609270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 619270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 629270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 639270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(p->msg.data_length) { 649270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(usb_read(t->usb, p->data, p->msg.data_length)){ 659270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: terminated (data)\n"); 669270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 679270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 689270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 699270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 709270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(check_data(p)) { 719270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: check_data failed\n"); 729270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 739270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 749270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 759270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return 0; 769270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 779270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 789270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic int remote_write(apacket *p, atransport *t) 799270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 809270a20a801403c9f60d6a701b39eae70d380403Doug Zongker unsigned size = p->msg.data_length; 819270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 829270a20a801403c9f60d6a701b39eae70d380403Doug Zongker fix_endians(p); 839270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 849270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(usb_write(t->usb, &p->msg, sizeof(amessage))) { 859270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: 1 - write terminated\n"); 869270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 879270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 889270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(p->msg.data_length == 0) return 0; 899270a20a801403c9f60d6a701b39eae70d380403Doug Zongker if(usb_write(t->usb, &p->data, size)) { 909270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("remote usb: 2 - write terminated\n"); 919270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return -1; 929270a20a801403c9f60d6a701b39eae70d380403Doug Zongker } 939270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 949270a20a801403c9f60d6a701b39eae70d380403Doug Zongker return 0; 959270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 969270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 979270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic void remote_close(atransport *t) 989270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 999270a20a801403c9f60d6a701b39eae70d380403Doug Zongker usb_close(t->usb); 1009270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->usb = 0; 1019270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1029270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1039270a20a801403c9f60d6a701b39eae70d380403Doug Zongkerstatic void remote_kick(atransport *t) 1049270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1059270a20a801403c9f60d6a701b39eae70d380403Doug Zongker usb_kick(t->usb); 1069270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 1079270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1089270a20a801403c9f60d6a701b39eae70d380403Doug Zongkervoid init_usb_transport(atransport *t, usb_handle *h, int state) 1099270a20a801403c9f60d6a701b39eae70d380403Doug Zongker{ 1109270a20a801403c9f60d6a701b39eae70d380403Doug Zongker D("transport: usb\n"); 1119270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->close = remote_close; 1129270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->kick = remote_kick; 1139270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->read_from_remote = remote_read; 1149270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->write_to_remote = remote_write; 1159270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->sync_token = 1; 1169270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->connection_state = state; 1179270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->type = kTransportUsb; 1189270a20a801403c9f60d6a701b39eae70d380403Doug Zongker t->usb = h; 1199270a20a801403c9f60d6a701b39eae70d380403Doug Zongker 1209270a20a801403c9f60d6a701b39eae70d380403Doug Zongker HOST = 0; 1219270a20a801403c9f60d6a701b39eae70d380403Doug Zongker} 122