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
8 * Code by davy hollevoet. This is simply an adaptation of code
9 * generated by usbsnoop2libusb. (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
11 * This code is released under both the GPL version 2 and BSD licenses.
12 * Either license may be used.
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.
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.
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
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
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.
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:
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.
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.
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 */
94 #include "ma8280p_us.h"
96 static void msleep(long msec)
98 struct timespec duration = { 0, msec * 1000 * 1000 };
100 nanosleep(&duration, NULL);
103 int ma8280p_switch (struct usb_dev_handle *devh, struct usb_device *dev)
108 buf = malloc (65535);
110 error ("%s: not enough memory", dev->filename, ret);
114 usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
116 usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
118 usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000400);
120 ret = usb_release_interface(devh, 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);
126 debug ("%s: claim after set_configuration failed with error %d", dev->filename, ret);
127 //usb_set_altinterface(devh, 0);
129 usb_control_msg(devh, USB_TYPE_CLASS + USB_RECIP_INTERFACE + USB_ENDPOINT_IN, 0x0000001, 0x0000300, 0x0000000, buf, 0x0000008, 1000);
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);
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);
139 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
141 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
143 //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
145 memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
146 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
148 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
150 memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
151 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
153 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
155 memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
156 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
158 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
160 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
162 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
164 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
166 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
168 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
170 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
172 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
174 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
176 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
178 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
180 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
182 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
184 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
186 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
188 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
190 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
192 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
194 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
196 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
198 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
200 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
202 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
204 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
206 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
208 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
210 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
212 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
214 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
216 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
218 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
220 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
222 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
224 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
226 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
228 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
230 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
232 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
234 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
236 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
238 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
240 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
242 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
244 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
246 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
248 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
250 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
252 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
254 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
256 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
258 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
260 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
262 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
264 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
266 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
268 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
270 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
272 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
274 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
276 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
278 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
280 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
282 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
284 //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
286 memcpy(buf, "\x37\x01\xfe\xdb\xc1\x33\x1f\x83", 0x0000008);
287 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
289 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
291 memcpy(buf, "\x37\x0e\xb5\x9d\x3b\x8a\x91\x51", 0x0000008);
292 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
294 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
296 memcpy(buf, "\x34\x87\xba\x0d\xfc\x8a\x91\x51", 0x0000008);
297 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
299 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
301 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
303 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
305 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
307 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
309 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
311 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
313 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
315 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
317 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
319 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
321 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
323 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
325 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
327 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
329 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
331 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
333 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
335 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
337 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
339 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
341 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
343 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
345 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
347 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
349 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
351 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
353 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
355 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
357 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
359 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
361 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
363 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
365 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
367 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
369 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
371 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
373 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
375 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
377 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
379 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
381 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
383 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
385 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
387 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
389 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
391 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
393 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
395 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
397 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
399 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
401 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
403 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
405 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
407 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
409 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
411 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
413 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
415 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
417 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
419 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
421 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
423 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
425 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
427 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
429 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
431 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
433 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
435 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
437 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
439 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
441 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
443 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
445 //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
447 memcpy(buf, "\x33\x04\xfe\x00\xf4\x6c\x1f\xf0", 0x0000008);
448 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
450 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);
452 //URB_FUNCTION_GET_STATUS_FROM_ENDPOINT skipped
454 memcpy(buf, "\x32\x07\xfe\xf0\x29\xb9\x3a\xf0", 0x0000008);
455 usb_interrupt_write(devh, 0x00000002, buf, 0x0000008, 1000);
457 usb_interrupt_read(devh, 0x00000081, buf, 0x0000008, 1000);