• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <string.h>
21 
22 #include <linux/usb/ch9.h>
23 #include <linux/usb/functionfs.h>
24 #include <sys/ioctl.h>
25 #include <sys/types.h>
26 #include <dirent.h>
27 #include <errno.h>
28 
29 #include "sysdeps.h"
30 
31 #define   TRACE_TAG  TRACE_USB
32 #include "adb.h"
33 
34 #define MAX_PACKET_SIZE_FS	64
35 #define MAX_PACKET_SIZE_HS	512
36 
37 #define cpu_to_le16(x)  htole16(x)
38 #define cpu_to_le32(x)  htole32(x)
39 
40 struct usb_handle
41 {
42     adb_cond_t notify;
43     adb_mutex_t lock;
44 
45     int (*write)(usb_handle *h, const void *data, int len);
46     int (*read)(usb_handle *h, void *data, int len);
47     void (*kick)(usb_handle *h);
48 
49     // Legacy f_adb
50     int fd;
51 
52     // FunctionFS
53     int control;
54     int bulk_out; /* "out" from the host's perspective => source for adbd */
55     int bulk_in;  /* "in" from the host's perspective => sink for adbd */
56 };
57 
58 static const struct {
59     struct usb_functionfs_descs_head header;
60     struct {
61         struct usb_interface_descriptor intf;
62         struct usb_endpoint_descriptor_no_audio source;
63         struct usb_endpoint_descriptor_no_audio sink;
64     } __attribute__((packed)) fs_descs, hs_descs;
65 } __attribute__((packed)) descriptors = {
66     .header = {
67         .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
68         .length = cpu_to_le32(sizeof(descriptors)),
69         .fs_count = 3,
70         .hs_count = 3,
71     },
72     .fs_descs = {
73         .intf = {
74             .bLength = sizeof(descriptors.fs_descs.intf),
75             .bDescriptorType = USB_DT_INTERFACE,
76             .bInterfaceNumber = 0,
77             .bNumEndpoints = 2,
78             .bInterfaceClass = ADB_CLASS,
79             .bInterfaceSubClass = ADB_SUBCLASS,
80             .bInterfaceProtocol = ADB_PROTOCOL,
81             .iInterface = 1, /* first string from the provided table */
82         },
83         .source = {
84             .bLength = sizeof(descriptors.fs_descs.source),
85             .bDescriptorType = USB_DT_ENDPOINT,
86             .bEndpointAddress = 1 | USB_DIR_OUT,
87             .bmAttributes = USB_ENDPOINT_XFER_BULK,
88             .wMaxPacketSize = MAX_PACKET_SIZE_FS,
89         },
90         .sink = {
91             .bLength = sizeof(descriptors.fs_descs.sink),
92             .bDescriptorType = USB_DT_ENDPOINT,
93             .bEndpointAddress = 2 | USB_DIR_IN,
94             .bmAttributes = USB_ENDPOINT_XFER_BULK,
95             .wMaxPacketSize = MAX_PACKET_SIZE_FS,
96         },
97     },
98     .hs_descs = {
99         .intf = {
100             .bLength = sizeof(descriptors.hs_descs.intf),
101             .bDescriptorType = USB_DT_INTERFACE,
102             .bInterfaceNumber = 0,
103             .bNumEndpoints = 2,
104             .bInterfaceClass = ADB_CLASS,
105             .bInterfaceSubClass = ADB_SUBCLASS,
106             .bInterfaceProtocol = ADB_PROTOCOL,
107             .iInterface = 1, /* first string from the provided table */
108         },
109         .source = {
110             .bLength = sizeof(descriptors.hs_descs.source),
111             .bDescriptorType = USB_DT_ENDPOINT,
112             .bEndpointAddress = 1 | USB_DIR_OUT,
113             .bmAttributes = USB_ENDPOINT_XFER_BULK,
114             .wMaxPacketSize = MAX_PACKET_SIZE_HS,
115         },
116         .sink = {
117             .bLength = sizeof(descriptors.hs_descs.sink),
118             .bDescriptorType = USB_DT_ENDPOINT,
119             .bEndpointAddress = 2 | USB_DIR_IN,
120             .bmAttributes = USB_ENDPOINT_XFER_BULK,
121             .wMaxPacketSize = MAX_PACKET_SIZE_HS,
122         },
123     },
124 };
125 
126 #define STR_INTERFACE_ "ADB Interface"
127 
128 static const struct {
129     struct usb_functionfs_strings_head header;
130     struct {
131         __le16 code;
132         const char str1[sizeof(STR_INTERFACE_)];
133     } __attribute__((packed)) lang0;
134 } __attribute__((packed)) strings = {
135     .header = {
136         .magic = cpu_to_le32(FUNCTIONFS_STRINGS_MAGIC),
137         .length = cpu_to_le32(sizeof(strings)),
138         .str_count = cpu_to_le32(1),
139         .lang_count = cpu_to_le32(1),
140     },
141     .lang0 = {
142         cpu_to_le16(0x0409), /* en-us */
143         STR_INTERFACE_,
144     },
145 };
146 
147 
148 
usb_adb_open_thread(void * x)149 static void *usb_adb_open_thread(void *x)
150 {
151     struct usb_handle *usb = (struct usb_handle *)x;
152     int fd;
153 
154     while (1) {
155         // wait until the USB device needs opening
156         adb_mutex_lock(&usb->lock);
157         while (usb->fd != -1)
158             adb_cond_wait(&usb->notify, &usb->lock);
159         adb_mutex_unlock(&usb->lock);
160 
161         D("[ usb_thread - opening device ]\n");
162         do {
163             /* XXX use inotify? */
164             fd = unix_open("/dev/android_adb", O_RDWR);
165             if (fd < 0) {
166                 // to support older kernels
167                 fd = unix_open("/dev/android", O_RDWR);
168             }
169             if (fd < 0) {
170                 adb_sleep_ms(1000);
171             }
172         } while (fd < 0);
173         D("[ opening device succeeded ]\n");
174 
175         close_on_exec(fd);
176         usb->fd = fd;
177 
178         D("[ usb_thread - registering device ]\n");
179         register_usb_transport(usb, 0, 0, 1);
180     }
181 
182     // never gets here
183     return 0;
184 }
185 
usb_adb_write(usb_handle * h,const void * data,int len)186 static int usb_adb_write(usb_handle *h, const void *data, int len)
187 {
188     int n;
189 
190     D("about to write (fd=%d, len=%d)\n", h->fd, len);
191     n = adb_write(h->fd, data, len);
192     if(n != len) {
193         D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
194             h->fd, n, errno, strerror(errno));
195         return -1;
196     }
197     D("[ done fd=%d ]\n", h->fd);
198     return 0;
199 }
200 
usb_adb_read(usb_handle * h,void * data,int len)201 static int usb_adb_read(usb_handle *h, void *data, int len)
202 {
203     int n;
204 
205     D("about to read (fd=%d, len=%d)\n", h->fd, len);
206     n = adb_read(h->fd, data, len);
207     if(n != len) {
208         D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
209             h->fd, n, errno, strerror(errno));
210         return -1;
211     }
212     D("[ done fd=%d ]\n", h->fd);
213     return 0;
214 }
215 
usb_adb_kick(usb_handle * h)216 static void usb_adb_kick(usb_handle *h)
217 {
218     D("usb_kick\n");
219     adb_mutex_lock(&h->lock);
220     adb_close(h->fd);
221     h->fd = -1;
222 
223     // notify usb_adb_open_thread that we are disconnected
224     adb_cond_signal(&h->notify);
225     adb_mutex_unlock(&h->lock);
226 }
227 
usb_adb_init()228 static void usb_adb_init()
229 {
230     usb_handle *h;
231     adb_thread_t tid;
232     int fd;
233 
234     h = calloc(1, sizeof(usb_handle));
235 
236     h->write = usb_adb_write;
237     h->read = usb_adb_read;
238     h->kick = usb_adb_kick;
239     h->fd = -1;
240 
241     adb_cond_init(&h->notify, 0);
242     adb_mutex_init(&h->lock, 0);
243 
244     // Open the file /dev/android_adb_enable to trigger
245     // the enabling of the adb USB function in the kernel.
246     // We never touch this file again - just leave it open
247     // indefinitely so the kernel will know when we are running
248     // and when we are not.
249     fd = unix_open("/dev/android_adb_enable", O_RDWR);
250     if (fd < 0) {
251        D("failed to open /dev/android_adb_enable\n");
252     } else {
253         close_on_exec(fd);
254     }
255 
256     D("[ usb_init - starting thread ]\n");
257     if(adb_thread_create(&tid, usb_adb_open_thread, h)){
258         fatal_errno("cannot create usb thread");
259     }
260 }
261 
262 
init_functionfs(struct usb_handle * h)263 static void init_functionfs(struct usb_handle *h)
264 {
265     ssize_t ret;
266 
267     if (h->control < 0) { // might have already done this before
268         D("OPENING %s\n", USB_FFS_ADB_EP0);
269         h->control = adb_open(USB_FFS_ADB_EP0, O_RDWR);
270         if (h->control < 0) {
271             D("[ %s: cannot open control endpoint: errno=%d]\n", USB_FFS_ADB_EP0, errno);
272             goto err;
273         }
274 
275         ret = adb_write(h->control, &descriptors, sizeof(descriptors));
276         if (ret < 0) {
277             D("[ %s: write descriptors failed: errno=%d ]\n", USB_FFS_ADB_EP0, errno);
278             goto err;
279         }
280 
281         ret = adb_write(h->control, &strings, sizeof(strings));
282         if (ret < 0) {
283             D("[ %s: writing strings failed: errno=%d]\n", USB_FFS_ADB_EP0, errno);
284             goto err;
285         }
286     }
287 
288     h->bulk_out = adb_open(USB_FFS_ADB_OUT, O_RDWR);
289     if (h->bulk_out < 0) {
290         D("[ %s: cannot open bulk-out ep: errno=%d ]\n", USB_FFS_ADB_OUT, errno);
291         goto err;
292     }
293 
294     h->bulk_in = adb_open(USB_FFS_ADB_IN, O_RDWR);
295     if (h->bulk_in < 0) {
296         D("[ %s: cannot open bulk-in ep: errno=%d ]\n", USB_FFS_ADB_IN, errno);
297         goto err;
298     }
299 
300     return;
301 
302 err:
303     if (h->bulk_in > 0) {
304         adb_close(h->bulk_in);
305         h->bulk_in = -1;
306     }
307     if (h->bulk_out > 0) {
308         adb_close(h->bulk_out);
309         h->bulk_out = -1;
310     }
311     if (h->control > 0) {
312         adb_close(h->control);
313         h->control = -1;
314     }
315     return;
316 }
317 
usb_ffs_open_thread(void * x)318 static void *usb_ffs_open_thread(void *x)
319 {
320     struct usb_handle *usb = (struct usb_handle *)x;
321 
322     while (1) {
323         // wait until the USB device needs opening
324         adb_mutex_lock(&usb->lock);
325         while (usb->control != -1 && usb->bulk_in != -1 && usb->bulk_out != -1)
326             adb_cond_wait(&usb->notify, &usb->lock);
327         adb_mutex_unlock(&usb->lock);
328 
329         while (1) {
330             init_functionfs(usb);
331 
332             if (usb->control >= 0 && usb->bulk_in >= 0 && usb->bulk_out >= 0)
333                 break;
334 
335             adb_sleep_ms(1000);
336         }
337 
338         D("[ usb_thread - registering device ]\n");
339         register_usb_transport(usb, 0, 0, 1);
340     }
341 
342     // never gets here
343     return 0;
344 }
345 
bulk_write(int bulk_in,const char * buf,size_t length)346 static int bulk_write(int bulk_in, const char *buf, size_t length)
347 {
348     size_t count = 0;
349     int ret;
350 
351     do {
352         ret = adb_write(bulk_in, buf + count, length - count);
353         if (ret < 0) {
354             if (errno != EINTR)
355                 return ret;
356         } else {
357             count += ret;
358         }
359     } while (count < length);
360 
361     D("[ bulk_write done fd=%d ]\n", bulk_in);
362     return count;
363 }
364 
usb_ffs_write(usb_handle * h,const void * data,int len)365 static int usb_ffs_write(usb_handle *h, const void *data, int len)
366 {
367     int n;
368 
369     D("about to write (fd=%d, len=%d)\n", h->bulk_in, len);
370     n = bulk_write(h->bulk_in, data, len);
371     if (n != len) {
372         D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
373             h->bulk_in, n, errno, strerror(errno));
374         return -1;
375     }
376     D("[ done fd=%d ]\n", h->bulk_in);
377     return 0;
378 }
379 
bulk_read(int bulk_out,char * buf,size_t length)380 static int bulk_read(int bulk_out, char *buf, size_t length)
381 {
382     size_t count = 0;
383     int ret;
384 
385     do {
386         ret = adb_read(bulk_out, buf + count, length - count);
387         if (ret < 0) {
388             if (errno != EINTR) {
389                 D("[ bulk_read failed fd=%d length=%zu count=%zu ]\n",
390                                            bulk_out, length, count);
391                 return ret;
392             }
393         } else {
394             count += ret;
395         }
396     } while (count < length);
397 
398     return count;
399 }
400 
usb_ffs_read(usb_handle * h,void * data,int len)401 static int usb_ffs_read(usb_handle *h, void *data, int len)
402 {
403     int n;
404 
405     D("about to read (fd=%d, len=%d)\n", h->bulk_out, len);
406     n = bulk_read(h->bulk_out, data, len);
407     if (n != len) {
408         D("ERROR: fd = %d, n = %d, errno = %d (%s)\n",
409             h->bulk_out, n, errno, strerror(errno));
410         return -1;
411     }
412     D("[ done fd=%d ]\n", h->bulk_out);
413     return 0;
414 }
415 
usb_ffs_kick(usb_handle * h)416 static void usb_ffs_kick(usb_handle *h)
417 {
418     int err;
419 
420     err = ioctl(h->bulk_in, FUNCTIONFS_CLEAR_HALT);
421     if (err < 0)
422         D("[ kick: source (fd=%d) clear halt failed (%d) ]", h->bulk_in, errno);
423 
424     err = ioctl(h->bulk_out, FUNCTIONFS_CLEAR_HALT);
425     if (err < 0)
426         D("[ kick: sink (fd=%d) clear halt failed (%d) ]", h->bulk_out, errno);
427 
428     adb_mutex_lock(&h->lock);
429 
430     // don't close ep0 here, since we may not need to reinitialize it with
431     // the same descriptors again. if however ep1/ep2 fail to re-open in
432     // init_functionfs, only then would we close and open ep0 again.
433     adb_close(h->bulk_out);
434     adb_close(h->bulk_in);
435     h->bulk_out = h->bulk_in = -1;
436 
437     // notify usb_ffs_open_thread that we are disconnected
438     adb_cond_signal(&h->notify);
439     adb_mutex_unlock(&h->lock);
440 }
441 
usb_ffs_init()442 static void usb_ffs_init()
443 {
444     usb_handle *h;
445     adb_thread_t tid;
446 
447     D("[ usb_init - using FunctionFS ]\n");
448 
449     h = calloc(1, sizeof(usb_handle));
450 
451     h->write = usb_ffs_write;
452     h->read = usb_ffs_read;
453     h->kick = usb_ffs_kick;
454 
455     h->control  = -1;
456     h->bulk_out = -1;
457     h->bulk_out = -1;
458 
459     adb_cond_init(&h->notify, 0);
460     adb_mutex_init(&h->lock, 0);
461 
462     D("[ usb_init - starting thread ]\n");
463     if (adb_thread_create(&tid, usb_ffs_open_thread, h)){
464         fatal_errno("[ cannot create usb thread ]\n");
465     }
466 }
467 
usb_init()468 void usb_init()
469 {
470     if (access(USB_FFS_ADB_EP0, F_OK) == 0)
471         usb_ffs_init();
472     else
473         usb_adb_init();
474 }
475 
usb_cleanup()476 void usb_cleanup()
477 {
478 }
479 
usb_write(usb_handle * h,const void * data,int len)480 int usb_write(usb_handle *h, const void *data, int len)
481 {
482     return h->write(h, data, len);
483 }
484 
usb_read(usb_handle * h,void * data,int len)485 int usb_read(usb_handle *h, void *data, int len)
486 {
487     return h->read(h, data, len);
488 }
usb_close(usb_handle * h)489 int usb_close(usb_handle *h)
490 {
491     return 0;
492 }
493 
usb_kick(usb_handle * h)494 void usb_kick(usb_handle *h)
495 {
496     h->kick(h);
497 }
498