chiark / gitweb /
libudev: allow to store negative values in the udev database
[elogind.git] / extras / modem-modeswitch / ma8280p_us.c
1 /* http://www.natox.be/ma8280p/
2  * http://www.leopold.dk/~martin/ma-8230p.html
3  * http://figvam.blogspot.com/2007/01/mobile-action-8730p-usb-cable-and-linux.html
4  */
5
6 /*
7  *
8  * Code by davy hollevoet. This is simply an adaptation of code
9  * generated by usbsnoop2libusb. (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
10  *
11  * This code is released under both the GPL version 2 and BSD licenses.
12  * Either license may be used.
13  *
14  * GPLv2
15  * ********
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * In addition:
27  *
28  * Redistribution and use in source and binary forms, with or without
29  * modification, are permitted provided that the following conditions
30  * are met:
31  *
32  * 1. Redistributions of source code must retain the above copyright
33  * notice, this list of conditions and the following disclaimer.
34  * 2. Redistributions in binary form must reproduce the above copyright
35  * notice, this list of conditions and the following disclaimer in the
36  * documentation and/or other materials provided with the distribution.
37  * 3. The name of the author may not be used to endorse or promote
38  * products derived from this software without specific prior written
39  * permission.
40  *
41  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
42  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
43  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
45  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
46  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
47  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
50  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
51  * POSSIBILITY OF SUCH DAMAGE.
52  *
53  * BSD
54  * ******
55  * Copyright (c) 1998, Regents of the University of California
56  * All rights reserved.
57  * Redistribution and use in source and binary forms, with or without
58  * modification, are permitted provided that the following conditions are met:
59  *
60  *     * Redistributions of source code must retain the above copyright
61  *       notice, this list of conditions and the following disclaimer.
62  *     * Redistributions in binary form must reproduce the above copyright
63  *       notice, this list of conditions and the following disclaimer in the
64  *       documentation and/or other materials provided with the distribution.
65  *     * Neither the name of the University of California, Berkeley nor the
66  *       names of its contributors may be used to endorse or promote products
67  *       derived from this software without specific prior written permission.
68  *
69  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
70  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
71  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
72  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
73  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
74  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
75  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
76  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
77  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
78  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
79  *
80  */
81
82 /* This file is (mostly) generated with usbsnoop2libusb.pl from a usbsnoop log file. */
83 /* Latest version of the script should be in http://iki.fi/lindi/usb/usbsnoop2libusb.pl */
84 #include <stdio.h>
85 #include <stdlib.h>
86 #include <string.h>
87 #include <assert.h>
88 #include <signal.h>
89 #include <ctype.h>
90 #include <time.h>
91 #include <usb.h>
92
93 #include "utils.h"
94 #include "ma8280p_us.h"
95
96 static void msleep(long msec)
97 {
98         struct timespec duration = { 0, msec * 1000 * 1000 };
99
100         nanosleep(&duration, NULL);
101 }
102
103 int ma8280p_switch (struct usb_dev_handle *devh, struct usb_device *dev)
104 {
105         int ret = 1;
106         char *buf = NULL;
107
108         buf = malloc (65535);
109         if (!buf) {
110                 error ("%s: not enough memory", dev->filename, ret);
111                 return -1;
112         }
113
114         usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
115         msleep(6);
116         usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
117         msleep(6);
118         usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000400);
119         msleep(10);
120         ret = usb_release_interface(devh, 0);
121         if (ret != 0) 
122                 debug ("%s: failed to release interface before set_configuration: %d", dev->filename, ret);
123         usb_set_configuration(devh, 0x0000001);
124         ret = usb_claim_interface(devh, 0);
125         if (ret != 0) 
126                 debug ("%s: claim after set_configuration failed with error %d", dev->filename, ret);
127         //usb_set_altinterface(devh, 0);
128         //msleep(33);
129         usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE + USB_ENDPOINT_IN, 0x0000001, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
130         msleep(5);
131         memcpy(buf, "\xb0\x04\x00\x00\x02\x90\x26\x86", 0x0000008);
132         usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x0000009, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
133         msleep(4);
134         memcpy(buf, "\xb0\x04\x00\x00\x02\x90\x26\x86", 0x0000008);
135         usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x0000009, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
136         msleep(4);
137
138         msleep(4);
139         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
140         msleep(6);
141         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
142         msleep(1);
143         //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
144         msleep(4);
145         memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
146         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
147         msleep(3);
148         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
149         msleep(1);
150         memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
151         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
152         msleep(7);
153         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
154         msleep(1);
155         memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
156         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
157         msleep(7);
158         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
159         msleep(8);
160         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
161         msleep(8);
162         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
163         msleep(8);
164         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
165         msleep(8);
166         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
167         msleep(8);
168         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
169         msleep(8);
170         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
171         msleep(8);
172         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
173         msleep(8);
174         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
175         msleep(8);
176         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
177         msleep(8);
178         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
179         msleep(8);
180         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
181         msleep(8);
182         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
183         msleep(8);
184         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
185         msleep(8);
186         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
187         msleep(8);
188         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
189         msleep(8);
190         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
191         msleep(8);
192         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
193         msleep(8);
194         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
195         msleep(8);
196         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
197         msleep(8);
198         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
199         msleep(8);
200         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
201         msleep(8);
202         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
203         msleep(8);
204         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
205         msleep(8);
206         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
207         msleep(8);
208         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
209         msleep(8);
210         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
211         msleep(8);
212         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
213         msleep(8);
214         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
215         msleep(8);
216         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
217         msleep(8);
218         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
219         msleep(8);
220         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
221         msleep(8);
222         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
223         msleep(8);
224         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
225         msleep(8);
226         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
227         msleep(8);
228         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
229         msleep(8);
230         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
231         msleep(8);
232         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
233         msleep(8);
234         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
235         msleep(8);
236         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
237         msleep(8);
238         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
239         msleep(8);
240         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
241         msleep(8);
242         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
243         msleep(8);
244         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
245         msleep(8);
246         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
247         msleep(8);
248         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
249         msleep(8);
250         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
251         msleep(8);
252         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
253         msleep(8);
254         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
255         msleep(8);
256         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
257         msleep(8);
258         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
259         msleep(8);
260         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
261         msleep(8);
262         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
263         msleep(8);
264         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
265         msleep(8);
266         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
267         msleep(8);
268         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
269         msleep(8);
270         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
271         msleep(8);
272         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
273         msleep(8);
274         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
275         msleep(8);
276         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
277         msleep(8);
278         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
279         msleep(8);
280         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
281         msleep(8);
282         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
283         msleep(2);
284         //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
285         msleep(4);
286         memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
287         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
288         msleep(2);
289         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
290         msleep(1);
291         memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
292         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
293         msleep(7);
294         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
295         msleep(1);
296         memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
297         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
298         msleep(7);
299         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
300         msleep(8);
301         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
302         msleep(8);
303         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
304         msleep(8);
305         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
306         msleep(8);
307         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
308         msleep(8);
309         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
310         msleep(8);
311         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
312         msleep(8);
313         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
314         msleep(8);
315         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
316         msleep(8);
317         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
318         msleep(8);
319         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
320         msleep(8);
321         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
322         msleep(8);
323         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
324         msleep(8);
325         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
326         msleep(8);
327         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
328         msleep(8);
329         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
330         msleep(8);
331         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
332         msleep(8);
333         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
334         msleep(8);
335         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
336         msleep(8);
337         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
338         msleep(8);
339         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
340         msleep(8);
341         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
342         msleep(8);
343         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
344         msleep(8);
345         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
346         msleep(8);
347         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
348         msleep(8);
349         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
350         msleep(8);
351         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
352         msleep(8);
353         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
354         msleep(8);
355         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
356         msleep(8);
357         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
358         msleep(8);
359         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
360         msleep(8);
361         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
362         msleep(8);
363         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
364         msleep(8);
365         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
366         msleep(8);
367         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
368         msleep(8);
369         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
370         msleep(8);
371         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
372         msleep(8);
373         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
374         msleep(8);
375         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
376         msleep(8);
377         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
378         msleep(8);
379         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
380         msleep(8);
381         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
382         msleep(8);
383         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
384         msleep(8);
385         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
386         msleep(8);
387         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
388         msleep(8);
389         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
390         msleep(8);
391         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
392         msleep(8);
393         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
394         msleep(8);
395         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
396         msleep(8);
397         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
398         msleep(8);
399         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
400         msleep(8);
401         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
402         msleep(8);
403         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
404         msleep(8);
405         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
406         msleep(8);
407         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
408         msleep(8);
409         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
410         msleep(8);
411         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
412         msleep(8);
413         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
414         msleep(8);
415         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
416         msleep(8);
417         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
418         msleep(8);
419         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
420         msleep(8);
421         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
422         msleep(8);
423         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
424         msleep(8);
425         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
426         msleep(8);
427         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
428         msleep(8);
429         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
430         msleep(8);
431         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
432         msleep(8);
433         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
434         msleep(8);
435         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
436         msleep(8);
437         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
438         msleep(8);
439         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
440         msleep(8);
441         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
442         msleep(8);
443         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
444         msleep(1);
445         //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
446         msleep(4);
447         memcpy(buf, "\x33\x04\xfe\x00\xf4\x6c\x1f\xf0", 0x0000008);
448         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
449         msleep(3);
450         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
451         msleep(1);
452         //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
453         msleep(4);
454         memcpy(buf, "\x32\x07\xfe\xf0\x29\xb9\x3a\xf0", 0x0000008);
455         usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
456         msleep(3);
457         usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
458
459         if (buf)
460                 free (buf);
461         return 0;
462 }