Preparation work for adb to support USB vendor Ids provided by SDK add-ons.
Added usb_vendors.* which handles creating (and deleting) a list of vendor ids. This list is meant to be used everywhere the built-in lists (usb_osx), or the built-in vendor IDs (transport_usb) were used. For now the list is only built with the built-in VENDOR_ID_*. Next step is to read a small file created from all the SDK add-on. Other misc changes: made is_adb_interface present only if ADB_HOST is true to prevent accessing a list that doesn't exist (usb_vendors is only compiled for the host version of adb).
This commit is contained in:
parent
463de48fb0
commit
a09fbd164d
7 changed files with 103 additions and 21 deletions
|
|
@ -53,6 +53,7 @@ LOCAL_SRC_FILES := \
|
||||||
$(USB_SRCS) \
|
$(USB_SRCS) \
|
||||||
shlist.c \
|
shlist.c \
|
||||||
utils.c \
|
utils.c \
|
||||||
|
usb_vendors.c \
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(USE_SYSDEPS_WIN32),)
|
ifneq ($(USE_SYSDEPS_WIN32),)
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@
|
||||||
|
|
||||||
#if !ADB_HOST
|
#if !ADB_HOST
|
||||||
#include <private/android_filesystem_config.h>
|
#include <private/android_filesystem_config.h>
|
||||||
|
#else
|
||||||
|
#include "usb_vendors.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -833,6 +835,7 @@ int adb_main(int is_daemon)
|
||||||
|
|
||||||
#if ADB_HOST
|
#if ADB_HOST
|
||||||
HOST = 1;
|
HOST = 1;
|
||||||
|
usb_vendors_init();
|
||||||
usb_init();
|
usb_init();
|
||||||
local_init();
|
local_init();
|
||||||
|
|
||||||
|
|
@ -916,6 +919,9 @@ int adb_main(int is_daemon)
|
||||||
fdevent_loop();
|
fdevent_loop();
|
||||||
|
|
||||||
usb_cleanup();
|
usb_cleanup();
|
||||||
|
#if ADB_HOST
|
||||||
|
usb_vendors_cleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -375,7 +375,9 @@ int usb_close(usb_handle *h);
|
||||||
void usb_kick(usb_handle *h);
|
void usb_kick(usb_handle *h);
|
||||||
|
|
||||||
/* used for USB device detection */
|
/* used for USB device detection */
|
||||||
|
#if ADB_HOST
|
||||||
int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
|
int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol);
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned host_to_le32(unsigned n);
|
unsigned host_to_le32(unsigned n);
|
||||||
int adb_commandline(int argc, char **argv);
|
int adb_commandline(int argc, char **argv);
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,10 @@
|
||||||
#define TRACE_TAG TRACE_TRANSPORT
|
#define TRACE_TAG TRACE_TRANSPORT
|
||||||
#include "adb.h"
|
#include "adb.h"
|
||||||
|
|
||||||
|
#if ADB_HOST
|
||||||
|
#include "usb_vendors.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* XXX better define? */
|
/* XXX better define? */
|
||||||
#ifdef __ppc__
|
#ifdef __ppc__
|
||||||
#define H4(x) (((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24)
|
#define H4(x) (((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24)
|
||||||
|
|
@ -125,23 +129,23 @@ void init_usb_transport(atransport *t, usb_handle *h)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ADB_HOST
|
||||||
int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol)
|
int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_protocol)
|
||||||
{
|
{
|
||||||
if (vid == VENDOR_ID_GOOGLE) {
|
unsigned i;
|
||||||
/* might support adb */
|
for (i = 0; i < vendorIdCount; i++) {
|
||||||
} else if (vid == VENDOR_ID_HTC) {
|
if (vid == vendorIds[i]) {
|
||||||
/* might support adb */
|
/* class:vendor (0xff) subclass:android (0x42) proto:adb (0x01) */
|
||||||
} else {
|
if(usb_class == 0xff) {
|
||||||
/* not supported */
|
if((usb_subclass == 0x42) && (usb_protocol == 0x01)) {
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* class:vendor (0xff) subclass:android (0x42) proto:adb (0x01) */
|
return 0;
|
||||||
if(usb_class == 0xff) {
|
|
||||||
if((usb_subclass == 0x42) && (usb_protocol == 0x01)) {
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -28,20 +28,15 @@
|
||||||
|
|
||||||
#define TRACE_TAG TRACE_USB
|
#define TRACE_TAG TRACE_USB
|
||||||
#include "adb.h"
|
#include "adb.h"
|
||||||
|
#include "usb_vendors.h"
|
||||||
|
|
||||||
#define DBG D
|
#define DBG D
|
||||||
|
|
||||||
#define ADB_SUBCLASS 0x42
|
#define ADB_SUBCLASS 0x42
|
||||||
#define ADB_PROTOCOL 0x1
|
#define ADB_PROTOCOL 0x1
|
||||||
|
|
||||||
int vendorIds[] = {
|
|
||||||
VENDOR_ID_GOOGLE,
|
|
||||||
VENDOR_ID_HTC,
|
|
||||||
};
|
|
||||||
#define NUM_VENDORS (sizeof(vendorIds)/sizeof(vendorIds[0]))
|
|
||||||
|
|
||||||
static IONotificationPortRef notificationPort = 0;
|
static IONotificationPortRef notificationPort = 0;
|
||||||
static io_iterator_t notificationIterators[NUM_VENDORS];
|
static io_iterator_t* notificationIterators;
|
||||||
|
|
||||||
struct usb_handle
|
struct usb_handle
|
||||||
{
|
{
|
||||||
|
|
@ -81,7 +76,7 @@ InitUSB()
|
||||||
memset(notificationIterators, 0, sizeof(notificationIterators));
|
memset(notificationIterators, 0, sizeof(notificationIterators));
|
||||||
|
|
||||||
//* loop through all supported vendors
|
//* loop through all supported vendors
|
||||||
for (i = 0; i < NUM_VENDORS; i++) {
|
for (i = 0; i < vendorIdCount; i++) {
|
||||||
//* Create our matching dictionary to find the Android device's
|
//* Create our matching dictionary to find the Android device's
|
||||||
//* adb interface
|
//* adb interface
|
||||||
//* IOServiceAddMatchingNotification consumes the reference, so we do
|
//* IOServiceAddMatchingNotification consumes the reference, so we do
|
||||||
|
|
@ -374,7 +369,7 @@ void* RunLoopThread(void* unused)
|
||||||
CFRunLoopRun();
|
CFRunLoopRun();
|
||||||
currentRunLoop = 0;
|
currentRunLoop = 0;
|
||||||
|
|
||||||
for (i = 0; i < NUM_VENDORS; i++) {
|
for (i = 0; i < vendorIdCount; i++) {
|
||||||
IOObjectRelease(notificationIterators[i]);
|
IOObjectRelease(notificationIterators[i]);
|
||||||
}
|
}
|
||||||
IONotificationPortDestroy(notificationPort);
|
IONotificationPortDestroy(notificationPort);
|
||||||
|
|
@ -391,6 +386,9 @@ void usb_init()
|
||||||
{
|
{
|
||||||
adb_thread_t tid;
|
adb_thread_t tid;
|
||||||
|
|
||||||
|
notificationIterators = (io_iterator_t*)malloc(
|
||||||
|
vendorIdCount * sizeof(io_iterator_t));
|
||||||
|
|
||||||
adb_mutex_init(&start_lock, NULL);
|
adb_mutex_init(&start_lock, NULL);
|
||||||
adb_cond_init(&start_cond, NULL);
|
adb_cond_init(&start_cond, NULL);
|
||||||
|
|
||||||
|
|
@ -415,6 +413,11 @@ void usb_cleanup()
|
||||||
close_usb_devices();
|
close_usb_devices();
|
||||||
if (currentRunLoop)
|
if (currentRunLoop)
|
||||||
CFRunLoopStop(currentRunLoop);
|
CFRunLoopStop(currentRunLoop);
|
||||||
|
|
||||||
|
if (notificationIterators != NULL) {
|
||||||
|
free(notificationIterators);
|
||||||
|
notificationIterators = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_write(usb_handle *handle, const void *buf, int len)
|
int usb_write(usb_handle *handle, const void *buf, int len)
|
||||||
|
|
|
||||||
40
adb/usb_vendors.c
Normal file
40
adb/usb_vendors.c
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "usb_vendors.h"
|
||||||
|
|
||||||
|
#include "sysdeps.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "adb.h"
|
||||||
|
|
||||||
|
int* vendorIds = NULL;
|
||||||
|
unsigned vendorIdCount = 0;
|
||||||
|
|
||||||
|
void usb_vendors_init(void) {
|
||||||
|
/* for now, only put the built-in VENDOR_ID_* */
|
||||||
|
vendorIdCount = 2;
|
||||||
|
vendorIds = (int*)malloc(vendorIdCount * sizeof(int));
|
||||||
|
vendorIds[0] = VENDOR_ID_GOOGLE;
|
||||||
|
vendorIds[1] = VENDOR_ID_HTC;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usb_vendors_cleanup(void) {
|
||||||
|
if (vendorIds != NULL) {
|
||||||
|
free(vendorIds);
|
||||||
|
vendorIds = NULL;
|
||||||
|
vendorIdCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
adb/usb_vendors.h
Normal file
26
adb/usb_vendors.h
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __USB_VENDORS_H
|
||||||
|
#define __USB_VENDORS_H
|
||||||
|
|
||||||
|
extern int* vendorIds;
|
||||||
|
extern unsigned vendorIdCount;
|
||||||
|
|
||||||
|
void usb_vendors_init(void);
|
||||||
|
void usb_vendors_cleanup(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Add table
Reference in a new issue