2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <sys/ioctl.h>
23 #include <sys/types.h>
29 //#define TRACE_TAG TRACE_USB
30 #define LOG_TAG "SDBD_TRACE_USB"
43 static void *usb_open_thread(void *x)
45 struct usb_handle *usb = (struct usb_handle *)x;
49 // wait until the USB device needs opening
50 sdb_mutex_lock(&usb->lock);
52 sdb_cond_wait(&usb->notify, &usb->lock);
53 sdb_mutex_unlock(&usb->lock);
55 D("[ usb_thread - opening device ]\n");
57 /* XXX use inotify? */
58 fd = unix_open(USB_NODE_FILE, O_RDWR); /* tizen-specific */
60 // to support older kernels
61 //fd = unix_open("/dev/android", O_RDWR);
62 E("[ opening %s device failed ]\n", USB_NODE_FILE);
68 //D("[ opening device succeeded ]\n");
70 if (close_on_exec(fd) < 0) {
71 E("[closing fd exec failed ]\n");
75 //D("[ usb_thread - registering device ]\n");
76 register_usb_transport(usb, 0, 1);
83 // Public host/client interface
85 int linux_usb_write(usb_handle *h, const void *data, int len)
89 //D("about to write (fd=%d, len=%d)\n", h->fd, len);
90 n = sdb_write(h->fd, data, len);
92 E("ERROR: fd = %d, n = %d, errno = %d\n",
96 //D("[ done fd=%d ]\n", h->fd);
100 int linux_usb_read(usb_handle *h, void *data, size_t len)
102 //D("about to read (fd=%d, len=%zu)\n", h->fd, len);
105 /* The sdb_read does not support read larger than 4096 bytes at once.
106 Read 4096 byte block repeatedly when reading data is larger than 4096 bytes. */
107 int bytes_to_read = l < 4096 ? l : 4096;
108 int n = sdb_read(h->fd, data, bytes_to_read);
110 if (errno == EINTR) {
113 E("ERROR: fd = %d, n = %d, errno = %d\n", h->fd, n, errno);
117 l = (l >= n) ? l - n : 0;
118 data = ((char*)data) + n;
120 //D("[ done fd=%d ]\n", h->fd);
124 void linux_usb_init()
130 h = calloc(1, sizeof(usb_handle));
132 E("failed to allocate memory of usb_handle\n");
137 sdb_cond_init(&h->notify, 0);
138 sdb_mutex_init(&h->lock, 0);
140 // Open the file /dev/android_sdb_enable to trigger
141 // the enabling of the sdb USB function in the kernel.
142 // We never touch this file again - just leave it open
143 // indefinitely so the kernel will know when we are running
144 // and when we are not.
145 #if 0 /* tizen specific */
146 fd = unix_open("/dev/android_sdb_enable", O_RDWR);
148 E("failed to open /dev/android_sdb_enable\n");
153 I("[ usb_init - starting thread ]\n");
154 if(sdb_thread_create(&tid, usb_open_thread, h)){
155 fatal_errno("cannot create usb thread");
159 void linux_usb_kick(usb_handle *h)
162 sdb_mutex_lock(&h->lock);
166 // notify usb_open_thread that we are disconnected
167 sdb_cond_signal(&h->notify);
168 sdb_mutex_unlock(&h->lock);
171 int linux_usb_close(usb_handle *h)
173 // nothing to do here
177 void linux_usb_cleanup()
179 // nothing to do here