system/corennnnn
修订版 | 0469d2c37adddcb30cb0d88772bef33ac26c6500 (tree) |
---|---|
时间 | 2009-05-23 07:28:51 |
作者 | Android (Google) Code Review <android-gerrit@goog...> |
Commiter | Android (Google) Code Review |
Merge change 2282 into donut
* changes:
@@ -919,9 +919,6 @@ int adb_main(int is_daemon) | ||
919 | 919 | fdevent_loop(); |
920 | 920 | |
921 | 921 | usb_cleanup(); |
922 | -#if ADB_HOST | |
923 | - usb_vendors_cleanup(); | |
924 | -#endif | |
925 | 922 | |
926 | 923 | return 0; |
927 | 924 | } |
@@ -357,11 +357,10 @@ typedef enum { | ||
357 | 357 | #define ADB_PORT 5037 |
358 | 358 | #define ADB_LOCAL_TRANSPORT_PORT 5555 |
359 | 359 | |
360 | -// Google's USB Vendor ID | |
361 | -#define VENDOR_ID_GOOGLE 0x18d1 | |
360 | +#define ADB_CLASS 0xff | |
361 | +#define ADB_SUBCLASS 0x42 | |
362 | +#define ADB_PROTOCOL 0x1 | |
362 | 363 | |
363 | -// HTC's USB Vendor ID | |
364 | -#define VENDOR_ID_HTC 0x0bb4 | |
365 | 364 | |
366 | 365 | void local_init(); |
367 | 366 | int local_connect(int port); |
@@ -213,7 +213,7 @@ int adb_connect(const char *service) | ||
213 | 213 | fprintf(stdout,"* daemon started successfully *\n"); |
214 | 214 | } |
215 | 215 | /* give the server some time to start properly and detect devices */ |
216 | - adb_sleep_ms(2000); | |
216 | + adb_sleep_ms(3000); | |
217 | 217 | // fall through to _adb_connect |
218 | 218 | } else { |
219 | 219 | // if server was running, check its version to make sure it is not out of date |
@@ -135,11 +135,9 @@ int is_adb_interface(int vid, int pid, int usb_class, int usb_subclass, int usb_ | ||
135 | 135 | unsigned i; |
136 | 136 | for (i = 0; i < vendorIdCount; i++) { |
137 | 137 | if (vid == vendorIds[i]) { |
138 | - /* class:vendor (0xff) subclass:android (0x42) proto:adb (0x01) */ | |
139 | - if(usb_class == 0xff) { | |
140 | - if((usb_subclass == 0x42) && (usb_protocol == 0x01)) { | |
141 | - return 1; | |
142 | - } | |
138 | + if (usb_class == ADB_CLASS && usb_subclass == ADB_SUBCLASS && | |
139 | + usb_protocol == ADB_PROTOCOL) { | |
140 | + return 1; | |
143 | 141 | } |
144 | 142 | |
145 | 143 | return 0; |
@@ -32,9 +32,6 @@ | ||
32 | 32 | |
33 | 33 | #define DBG D |
34 | 34 | |
35 | -#define ADB_SUBCLASS 0x42 | |
36 | -#define ADB_PROTOCOL 0x1 | |
37 | - | |
38 | 35 | static IONotificationPortRef notificationPort = 0; |
39 | 36 | static io_iterator_t* notificationIterators; |
40 | 37 |
@@ -16,25 +16,119 @@ | ||
16 | 16 | |
17 | 17 | #include "usb_vendors.h" |
18 | 18 | |
19 | -#include "sysdeps.h" | |
20 | 19 | #include <stdio.h> |
20 | + | |
21 | +#ifdef _WIN32 | |
22 | +# define WIN32_LEAN_AND_MEAN | |
23 | +# include "windows.h" | |
24 | +# include "shlobj.h" | |
25 | +#else | |
26 | +# include <unistd.h> | |
27 | +# include <sys/stat.h> | |
28 | +#endif | |
29 | + | |
30 | +#include "sysdeps.h" | |
21 | 31 | #include "adb.h" |
22 | 32 | |
23 | -int* vendorIds = NULL; | |
33 | +#define ANDROID_PATH ".android" | |
34 | +#define ANDROID_ADB_INI "adb_usb.ini" | |
35 | + | |
36 | +#define TRACE_TAG TRACE_USB | |
37 | + | |
38 | +// Google's USB Vendor ID | |
39 | +#define VENDOR_ID_GOOGLE 0x18d1 | |
40 | +// HTC's USB Vendor ID | |
41 | +#define VENDOR_ID_HTC 0x0bb4 | |
42 | + | |
43 | +/** built-in vendor list */ | |
44 | +int builtInVendorIds[] = { | |
45 | + VENDOR_ID_GOOGLE, | |
46 | + VENDOR_ID_HTC, | |
47 | +}; | |
48 | + | |
49 | +#define BUILT_IN_VENDOR_COUNT (sizeof(builtInVendorIds)/sizeof(builtInVendorIds[0])) | |
50 | + | |
51 | +/* max number of supported vendor ids (built-in + 3rd party). increase as needed */ | |
52 | +#define VENDOR_COUNT_MAX 128 | |
53 | + | |
54 | +int vendorIds[VENDOR_COUNT_MAX]; | |
24 | 55 | unsigned vendorIdCount = 0; |
25 | 56 | |
26 | -void usb_vendors_init(void) { | |
27 | - /* for now, only put the built-in VENDOR_ID_* */ | |
28 | - vendorIdCount = 2; | |
29 | - vendorIds = (int*)malloc(vendorIdCount * sizeof(int)); | |
30 | - vendorIds[0] = VENDOR_ID_GOOGLE; | |
31 | - vendorIds[1] = VENDOR_ID_HTC; | |
57 | +int get_adb_usb_ini(char* buff, size_t len); | |
58 | + | |
59 | +void usb_vendors_init(void) | |
60 | +{ | |
61 | + if (VENDOR_COUNT_MAX < BUILT_IN_VENDOR_COUNT) { | |
62 | + fprintf(stderr, "VENDOR_COUNT_MAX not big enough for built-in vendor list.\n"); | |
63 | + exit(2); | |
64 | + } | |
65 | + | |
66 | + /* add the built-in vendors at the beginning of the array */ | |
67 | + memcpy(vendorIds, builtInVendorIds, sizeof(builtInVendorIds)); | |
68 | + | |
69 | + /* default array size is the number of built-in vendors */ | |
70 | + vendorIdCount = BUILT_IN_VENDOR_COUNT; | |
71 | + | |
72 | + if (VENDOR_COUNT_MAX == BUILT_IN_VENDOR_COUNT) | |
73 | + return; | |
74 | + | |
75 | + char temp[PATH_MAX]; | |
76 | + if (get_adb_usb_ini(temp, sizeof(temp)) == 0) { | |
77 | + FILE * f = fopen(temp, "rt"); | |
78 | + | |
79 | + if (f != NULL) { | |
80 | + /* The vendor id file is pretty basic. 1 vendor id per line. | |
81 | + Lines starting with # are comments */ | |
82 | + while (fgets(temp, sizeof(temp), f) != NULL) { | |
83 | + if (temp[0] == '#') | |
84 | + continue; | |
85 | + | |
86 | + long value = strtol(temp, NULL, 0); | |
87 | + if (errno == EINVAL || errno == ERANGE || value > INT_MAX || value < 0) { | |
88 | + fprintf(stderr, "Invalid content in %s. Quitting.\n", ANDROID_ADB_INI); | |
89 | + exit(2); | |
90 | + } | |
91 | + | |
92 | + vendorIds[vendorIdCount++] = (int)value; | |
93 | + | |
94 | + /* make sure we don't go beyond the array */ | |
95 | + if (vendorIdCount == VENDOR_COUNT_MAX) { | |
96 | + break; | |
97 | + } | |
98 | + } | |
99 | + } | |
100 | + } | |
32 | 101 | } |
33 | 102 | |
34 | -void usb_vendors_cleanup(void) { | |
35 | - if (vendorIds != NULL) { | |
36 | - free(vendorIds); | |
37 | - vendorIds = NULL; | |
38 | - vendorIdCount = 0; | |
103 | +/* Utils methods */ | |
104 | + | |
105 | +/* builds the path to the adb vendor id file. returns 0 if success */ | |
106 | +int build_path(char* buff, size_t len, const char* format, const char* home) | |
107 | +{ | |
108 | + if (snprintf(buff, len, format, home, ANDROID_PATH, ANDROID_ADB_INI) >= len) { | |
109 | + return 1; | |
110 | + } | |
111 | + | |
112 | + return 0; | |
113 | +} | |
114 | + | |
115 | +/* fills buff with the path to the adb vendor id file. returns 0 if success */ | |
116 | +int get_adb_usb_ini(char* buff, size_t len) | |
117 | +{ | |
118 | +#ifdef _WIN32 | |
119 | + const char* home = getenv("ANDROID_SDK_HOME"); | |
120 | + if (home != NULL) { | |
121 | + return build_path(buff, len, "%s\\%s\\%s", home); | |
122 | + } else { | |
123 | + char path[MAX_PATH]; | |
124 | + SHGetFolderPath( NULL, CSIDL_PROFILE, NULL, 0, path); | |
125 | + return build_path(buff, len, "%s\\%s\\%s", path); | |
39 | 126 | } |
127 | +#else | |
128 | + const char* home = getenv("HOME"); | |
129 | + if (home == NULL) | |
130 | + home = "/tmp"; | |
131 | + | |
132 | + return build_path(buff, len, "%s/%s/%s", home); | |
133 | +#endif | |
40 | 134 | } |
@@ -17,10 +17,9 @@ | ||
17 | 17 | #ifndef __USB_VENDORS_H |
18 | 18 | #define __USB_VENDORS_H |
19 | 19 | |
20 | -extern int* vendorIds; | |
20 | +extern int vendorIds[]; | |
21 | 21 | extern unsigned vendorIdCount; |
22 | 22 | |
23 | 23 | void usb_vendors_init(void); |
24 | -void usb_vendors_cleanup(void); | |
25 | 24 | |
26 | 25 | #endif |
\ No newline at end of file |