1*4882a593SmuzhiyunFrom b4c068e8e4077b2d4082e3f7e58e63ecd980db8b Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Wed, 29 Apr 2020 11:48:28 +0800
4*4882a593SmuzhiyunSubject: [PATCH 15/20] adbd: usb_linux_client: Compat with old kernel
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunPort related logic from upstream(without os desc):
7*4882a593Smuzhiyungit log --oneline adb/daemon/usb_ffs.cpp
8*4882a593Smuzhiyun9026a44bb Revert "Reland "adb: daemon: Assign valid fd to usb_handle ep0 file descriptor""
9*4882a593Smuzhiyun0871824de Move adbd's legacy USB implementation to fastboot.
10*4882a593Smuzhiyunbfe3dac36 Reland "adb: daemon: Assign valid fd to usb_handle ep0 file descriptor"
11*4882a593Smuzhiyunb310da608 adbd: Update DeviceInterfaceGUID for WinUSB
12*4882a593Smuzhiyun134c98814 Revert "adb: daemon: Assign valid fd to usb_handle ep0 file descriptor" am: ba4684c2b2
13*4882a593Smuzhiyun
14*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
15*4882a593Smuzhiyun---
16*4882a593Smuzhiyun core/adbd/usb_linux_client.c | 252 ++++++++++++++++++++---------------
17*4882a593Smuzhiyun 1 file changed, 144 insertions(+), 108 deletions(-)
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundiff --git a/core/adbd/usb_linux_client.c b/core/adbd/usb_linux_client.c
20*4882a593Smuzhiyunindex a437ad1..e17e07d 100644
21*4882a593Smuzhiyun--- a/core/adbd/usb_linux_client.c
22*4882a593Smuzhiyun+++ b/core/adbd/usb_linux_client.c
23*4882a593Smuzhiyun@@ -63,119 +63,130 @@ struct usb_handle
24*4882a593Smuzhiyun     int bulk_in;  /* "in" from the host's perspective => sink for adbd */
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun-static const struct {
28*4882a593Smuzhiyun+// clang-format off
29*4882a593Smuzhiyun+struct func_desc {
30*4882a593Smuzhiyun+    struct usb_interface_descriptor intf;
31*4882a593Smuzhiyun+    struct usb_endpoint_descriptor_no_audio source;
32*4882a593Smuzhiyun+    struct usb_endpoint_descriptor_no_audio sink;
33*4882a593Smuzhiyun+} __attribute__((packed));
34*4882a593Smuzhiyun+
35*4882a593Smuzhiyun+struct ss_func_desc {
36*4882a593Smuzhiyun+    struct usb_interface_descriptor intf;
37*4882a593Smuzhiyun+    struct usb_endpoint_descriptor_no_audio source;
38*4882a593Smuzhiyun+    struct usb_ss_ep_comp_descriptor source_comp;
39*4882a593Smuzhiyun+    struct usb_endpoint_descriptor_no_audio sink;
40*4882a593Smuzhiyun+    struct usb_ss_ep_comp_descriptor sink_comp;
41*4882a593Smuzhiyun+} __attribute__((packed));
42*4882a593Smuzhiyun+
43*4882a593Smuzhiyun+struct desc_v1 {
44*4882a593Smuzhiyun+    struct usb_functionfs_descs_head_v1 {
45*4882a593Smuzhiyun+        __le32 magic;
46*4882a593Smuzhiyun+        __le32 length;
47*4882a593Smuzhiyun+        __le32 fs_count;
48*4882a593Smuzhiyun+        __le32 hs_count;
49*4882a593Smuzhiyun+    } __attribute__((packed)) header;
50*4882a593Smuzhiyun+    struct func_desc fs_descs, hs_descs;
51*4882a593Smuzhiyun+} __attribute__((packed));
52*4882a593Smuzhiyun+
53*4882a593Smuzhiyun+struct desc_v2 {
54*4882a593Smuzhiyun     __le32 magic;
55*4882a593Smuzhiyun     __le32 length;
56*4882a593Smuzhiyun     __le32 flags;
57*4882a593Smuzhiyun     __le32 fs_count;
58*4882a593Smuzhiyun     __le32 hs_count;
59*4882a593Smuzhiyun     __le32 ss_count;
60*4882a593Smuzhiyun-    struct {
61*4882a593Smuzhiyun-        struct usb_interface_descriptor intf;
62*4882a593Smuzhiyun-        struct usb_endpoint_descriptor_no_audio source;
63*4882a593Smuzhiyun-        struct usb_endpoint_descriptor_no_audio sink;
64*4882a593Smuzhiyun-    } __attribute__((packed)) fs_descs, hs_descs;
65*4882a593Smuzhiyun-    struct {
66*4882a593Smuzhiyun-        struct usb_interface_descriptor intf;
67*4882a593Smuzhiyun-	struct usb_endpoint_descriptor_no_audio source;
68*4882a593Smuzhiyun-	struct usb_ss_ep_comp_descriptor source_comp;
69*4882a593Smuzhiyun-	struct usb_endpoint_descriptor_no_audio sink;
70*4882a593Smuzhiyun-	struct usb_ss_ep_comp_descriptor sink_comp;
71*4882a593Smuzhiyun-    } __attribute__((packed)) ss_descs;
72*4882a593Smuzhiyun-} __attribute__((packed)) descriptors = {
73*4882a593Smuzhiyun-    .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
74*4882a593Smuzhiyun-    .length = cpu_to_le32(sizeof(descriptors)),
75*4882a593Smuzhiyun-    .flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
76*4882a593Smuzhiyun-                         FUNCTIONFS_HAS_HS_DESC |
77*4882a593Smuzhiyun-                         FUNCTIONFS_HAS_SS_DESC),
78*4882a593Smuzhiyun-    .fs_count = 3,
79*4882a593Smuzhiyun-    .hs_count = 3,
80*4882a593Smuzhiyun-    .ss_count = 5,
81*4882a593Smuzhiyun-    .fs_descs = {
82*4882a593Smuzhiyun-        .intf = {
83*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.fs_descs.intf),
84*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_INTERFACE,
85*4882a593Smuzhiyun-            .bInterfaceNumber = 0,
86*4882a593Smuzhiyun-            .bNumEndpoints = 2,
87*4882a593Smuzhiyun-            .bInterfaceClass = ADB_CLASS,
88*4882a593Smuzhiyun-            .bInterfaceSubClass = ADB_SUBCLASS,
89*4882a593Smuzhiyun-            .bInterfaceProtocol = ADB_PROTOCOL,
90*4882a593Smuzhiyun-            .iInterface = 1, /* first string from the provided table */
91*4882a593Smuzhiyun-        },
92*4882a593Smuzhiyun-        .source = {
93*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.fs_descs.source),
94*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
95*4882a593Smuzhiyun-            .bEndpointAddress = 1 | USB_DIR_OUT,
96*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
97*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_FS,
98*4882a593Smuzhiyun-        },
99*4882a593Smuzhiyun-        .sink = {
100*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.fs_descs.sink),
101*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
102*4882a593Smuzhiyun-            .bEndpointAddress = 2 | USB_DIR_IN,
103*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
104*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_FS,
105*4882a593Smuzhiyun-        },
106*4882a593Smuzhiyun+    struct func_desc fs_descs, hs_descs;
107*4882a593Smuzhiyun+    struct ss_func_desc ss_descs;
108*4882a593Smuzhiyun+} __attribute__((packed));
109*4882a593Smuzhiyun+
110*4882a593Smuzhiyun+static struct func_desc fs_descriptors = {
111*4882a593Smuzhiyun+    .intf = {
112*4882a593Smuzhiyun+        .bLength = sizeof(fs_descriptors.intf),
113*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_INTERFACE,
114*4882a593Smuzhiyun+        .bInterfaceNumber = 0,
115*4882a593Smuzhiyun+        .bNumEndpoints = 2,
116*4882a593Smuzhiyun+        .bInterfaceClass = ADB_CLASS,
117*4882a593Smuzhiyun+        .bInterfaceSubClass = ADB_SUBCLASS,
118*4882a593Smuzhiyun+        .bInterfaceProtocol = ADB_PROTOCOL,
119*4882a593Smuzhiyun+        .iInterface = 1, /* first string from the provided table */
120*4882a593Smuzhiyun+    },
121*4882a593Smuzhiyun+    .source = {
122*4882a593Smuzhiyun+        .bLength = sizeof(fs_descriptors.source),
123*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
124*4882a593Smuzhiyun+        .bEndpointAddress = 1 | USB_DIR_OUT,
125*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
126*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_FS,
127*4882a593Smuzhiyun+    },
128*4882a593Smuzhiyun+    .sink = {
129*4882a593Smuzhiyun+        .bLength = sizeof(fs_descriptors.sink),
130*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
131*4882a593Smuzhiyun+        .bEndpointAddress = 2 | USB_DIR_IN,
132*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
133*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_FS,
134*4882a593Smuzhiyun     },
135*4882a593Smuzhiyun-    .hs_descs = {
136*4882a593Smuzhiyun-        .intf = {
137*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.hs_descs.intf),
138*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_INTERFACE,
139*4882a593Smuzhiyun-            .bInterfaceNumber = 0,
140*4882a593Smuzhiyun-            .bNumEndpoints = 2,
141*4882a593Smuzhiyun-            .bInterfaceClass = ADB_CLASS,
142*4882a593Smuzhiyun-            .bInterfaceSubClass = ADB_SUBCLASS,
143*4882a593Smuzhiyun-            .bInterfaceProtocol = ADB_PROTOCOL,
144*4882a593Smuzhiyun-            .iInterface = 1, /* first string from the provided table */
145*4882a593Smuzhiyun-        },
146*4882a593Smuzhiyun-        .source = {
147*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.hs_descs.source),
148*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
149*4882a593Smuzhiyun-            .bEndpointAddress = 1 | USB_DIR_OUT,
150*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
151*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_HS,
152*4882a593Smuzhiyun-        },
153*4882a593Smuzhiyun-        .sink = {
154*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.hs_descs.sink),
155*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
156*4882a593Smuzhiyun-            .bEndpointAddress = 2 | USB_DIR_IN,
157*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
158*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_HS,
159*4882a593Smuzhiyun-        },
160*4882a593Smuzhiyun+};
161*4882a593Smuzhiyun+
162*4882a593Smuzhiyun+static struct func_desc hs_descriptors = {
163*4882a593Smuzhiyun+    .intf = {
164*4882a593Smuzhiyun+        .bLength = sizeof(hs_descriptors.intf),
165*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_INTERFACE,
166*4882a593Smuzhiyun+        .bInterfaceNumber = 0,
167*4882a593Smuzhiyun+        .bNumEndpoints = 2,
168*4882a593Smuzhiyun+        .bInterfaceClass = ADB_CLASS,
169*4882a593Smuzhiyun+        .bInterfaceSubClass = ADB_SUBCLASS,
170*4882a593Smuzhiyun+        .bInterfaceProtocol = ADB_PROTOCOL,
171*4882a593Smuzhiyun+        .iInterface = 1, /* first string from the provided table */
172*4882a593Smuzhiyun+    },
173*4882a593Smuzhiyun+    .source = {
174*4882a593Smuzhiyun+        .bLength = sizeof(hs_descriptors.source),
175*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
176*4882a593Smuzhiyun+        .bEndpointAddress = 1 | USB_DIR_OUT,
177*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
178*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_HS,
179*4882a593Smuzhiyun     },
180*4882a593Smuzhiyun-    .ss_descs = {
181*4882a593Smuzhiyun-        .intf = {
182*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.ss_descs.intf),
183*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_INTERFACE,
184*4882a593Smuzhiyun-            .bInterfaceNumber = 0,
185*4882a593Smuzhiyun-            .bNumEndpoints = 2,
186*4882a593Smuzhiyun-            .bInterfaceClass = ADB_CLASS,
187*4882a593Smuzhiyun-            .bInterfaceSubClass = ADB_SUBCLASS,
188*4882a593Smuzhiyun-            .bInterfaceProtocol = ADB_PROTOCOL,
189*4882a593Smuzhiyun-            .iInterface = 1, /* first string from the provided table */
190*4882a593Smuzhiyun-        },
191*4882a593Smuzhiyun-        .source = {
192*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.ss_descs.source),
193*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
194*4882a593Smuzhiyun-            .bEndpointAddress = 1 | USB_DIR_OUT,
195*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
196*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_SS,
197*4882a593Smuzhiyun-        },
198*4882a593Smuzhiyun-        .source_comp = {
199*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.ss_descs.source_comp),
200*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
201*4882a593Smuzhiyun-        },
202*4882a593Smuzhiyun-        .sink = {
203*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.ss_descs.sink),
204*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_ENDPOINT,
205*4882a593Smuzhiyun-            .bEndpointAddress = 2 | USB_DIR_IN,
206*4882a593Smuzhiyun-            .bmAttributes = USB_ENDPOINT_XFER_BULK,
207*4882a593Smuzhiyun-            .wMaxPacketSize = MAX_PACKET_SIZE_SS,
208*4882a593Smuzhiyun-        },
209*4882a593Smuzhiyun-        .sink_comp = {
210*4882a593Smuzhiyun-            .bLength = sizeof(descriptors.ss_descs.sink_comp),
211*4882a593Smuzhiyun-            .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
212*4882a593Smuzhiyun-        },
213*4882a593Smuzhiyun+    .sink = {
214*4882a593Smuzhiyun+        .bLength = sizeof(hs_descriptors.sink),
215*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
216*4882a593Smuzhiyun+        .bEndpointAddress = 2 | USB_DIR_IN,
217*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
218*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_HS,
219*4882a593Smuzhiyun+    },
220*4882a593Smuzhiyun+};
221*4882a593Smuzhiyun+
222*4882a593Smuzhiyun+static struct ss_func_desc ss_descriptors = {
223*4882a593Smuzhiyun+    .intf = {
224*4882a593Smuzhiyun+        .bLength = sizeof(ss_descriptors.intf),
225*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_INTERFACE,
226*4882a593Smuzhiyun+        .bInterfaceNumber = 0,
227*4882a593Smuzhiyun+        .bNumEndpoints = 2,
228*4882a593Smuzhiyun+        .bInterfaceClass = ADB_CLASS,
229*4882a593Smuzhiyun+        .bInterfaceSubClass = ADB_SUBCLASS,
230*4882a593Smuzhiyun+        .bInterfaceProtocol = ADB_PROTOCOL,
231*4882a593Smuzhiyun+        .iInterface = 1, /* first string from the provided table */
232*4882a593Smuzhiyun+    },
233*4882a593Smuzhiyun+    .source = {
234*4882a593Smuzhiyun+        .bLength = sizeof(ss_descriptors.source),
235*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
236*4882a593Smuzhiyun+        .bEndpointAddress = 1 | USB_DIR_OUT,
237*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
238*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_SS,
239*4882a593Smuzhiyun+    },
240*4882a593Smuzhiyun+    .source_comp = {
241*4882a593Smuzhiyun+        .bLength = sizeof(ss_descriptors.source_comp),
242*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
243*4882a593Smuzhiyun+        .bMaxBurst = 4,
244*4882a593Smuzhiyun+    },
245*4882a593Smuzhiyun+    .sink = {
246*4882a593Smuzhiyun+        .bLength = sizeof(ss_descriptors.sink),
247*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_ENDPOINT,
248*4882a593Smuzhiyun+        .bEndpointAddress = 2 | USB_DIR_IN,
249*4882a593Smuzhiyun+        .bmAttributes = USB_ENDPOINT_XFER_BULK,
250*4882a593Smuzhiyun+        .wMaxPacketSize = MAX_PACKET_SIZE_SS,
251*4882a593Smuzhiyun+    },
252*4882a593Smuzhiyun+    .sink_comp = {
253*4882a593Smuzhiyun+        .bLength = sizeof(ss_descriptors.sink_comp),
254*4882a593Smuzhiyun+        .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
255*4882a593Smuzhiyun+        .bMaxBurst = 4,
256*4882a593Smuzhiyun     },
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun@@ -318,8 +329,21 @@ static void usb_adb_init()
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun static void init_functionfs(struct usb_handle *h)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun+    struct desc_v1 v1_descriptor = {};
264*4882a593Smuzhiyun+    struct desc_v2 v2_descriptor = {};
265*4882a593Smuzhiyun     ssize_t ret;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun+    v2_descriptor.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2);
268*4882a593Smuzhiyun+    v2_descriptor.length = cpu_to_le32(sizeof(v2_descriptor));
269*4882a593Smuzhiyun+    v2_descriptor.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC |
270*4882a593Smuzhiyun+                          FUNCTIONFS_HAS_SS_DESC;
271*4882a593Smuzhiyun+    v2_descriptor.fs_count = 3;
272*4882a593Smuzhiyun+    v2_descriptor.hs_count = 3;
273*4882a593Smuzhiyun+    v2_descriptor.ss_count = 5;
274*4882a593Smuzhiyun+    v2_descriptor.fs_descs = fs_descriptors;
275*4882a593Smuzhiyun+    v2_descriptor.hs_descs = hs_descriptors;
276*4882a593Smuzhiyun+    v2_descriptor.ss_descs = ss_descriptors;
277*4882a593Smuzhiyun+
278*4882a593Smuzhiyun     D("OPENING %s\n", USB_FFS_ADB_EP0);
279*4882a593Smuzhiyun     h->control = adb_open(USB_FFS_ADB_EP0, O_RDWR);
280*4882a593Smuzhiyun     if (h->control < 0) {
281*4882a593Smuzhiyun@@ -327,10 +351,22 @@ static void init_functionfs(struct usb_handle *h)
282*4882a593Smuzhiyun         goto err;
283*4882a593Smuzhiyun     }
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun-    ret = adb_write(h->control, &descriptors, sizeof(descriptors));
286*4882a593Smuzhiyun+    ret = adb_write(h->control, &v2_descriptor, sizeof(v2_descriptor));
287*4882a593Smuzhiyun     if (ret < 0) {
288*4882a593Smuzhiyun-        D("[ %s: write descriptors failed: errno=%d ]\n", USB_FFS_ADB_EP0, errno);
289*4882a593Smuzhiyun-        goto err;
290*4882a593Smuzhiyun+        D("[ %s: Switching to V1_descriptor format errno=%s ]", USB_FFS_ADB_EP0,
291*4882a593Smuzhiyun+          strerror(errno));
292*4882a593Smuzhiyun+        v1_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC);
293*4882a593Smuzhiyun+        v1_descriptor.header.length = cpu_to_le32(sizeof(v1_descriptor));
294*4882a593Smuzhiyun+        v1_descriptor.header.fs_count = 3;
295*4882a593Smuzhiyun+        v1_descriptor.header.hs_count = 3;
296*4882a593Smuzhiyun+        v1_descriptor.fs_descs = fs_descriptors;
297*4882a593Smuzhiyun+        v1_descriptor.hs_descs = hs_descriptors;
298*4882a593Smuzhiyun+        ret = adb_write(h->control, &v1_descriptor, sizeof(v1_descriptor));
299*4882a593Smuzhiyun+        if (ret < 0) {
300*4882a593Smuzhiyun+            D("[ %s: write descriptors failed: errno=%s ]\n", USB_FFS_ADB_EP0,
301*4882a593Smuzhiyun+              strerror(errno));
302*4882a593Smuzhiyun+            goto err;
303*4882a593Smuzhiyun+        }
304*4882a593Smuzhiyun     }
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun     ret = adb_write(h->control, &strings, sizeof(strings));
307*4882a593Smuzhiyun--
308*4882a593Smuzhiyun2.20.1
309*4882a593Smuzhiyun
310