aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/usb/serial
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'drivers/usb/serial')
-rw-r--r--drivers/usb/serial/Kconfig455
-rw-r--r--drivers/usb/serial/Makefile39
-rw-r--r--drivers/usb/serial/Makefile-keyspan_pda_fw16
-rw-r--r--drivers/usb/serial/belkin_sa.c614
-rw-r--r--drivers/usb/serial/belkin_sa.h123
-rw-r--r--drivers/usb/serial/bus.c134
-rw-r--r--drivers/usb/serial/console.c264
-rw-r--r--drivers/usb/serial/cp2101.c591
-rw-r--r--drivers/usb/serial/cyberjack.c514
-rw-r--r--drivers/usb/serial/cypress_m8.c1538
-rw-r--r--drivers/usb/serial/cypress_m8.h55
-rw-r--r--drivers/usb/serial/digi_acceleport.c2049
-rw-r--r--drivers/usb/serial/empeg.c596
-rw-r--r--drivers/usb/serial/ezusb.c60
-rw-r--r--drivers/usb/serial/ezusb_convert.pl50
-rw-r--r--drivers/usb/serial/ftdi_sio.c2496
-rw-r--r--drivers/usb/serial/ftdi_sio.h777
-rw-r--r--drivers/usb/serial/garmin_gps.c1541
-rw-r--r--drivers/usb/serial/generic.c315
-rw-r--r--drivers/usb/serial/io_16654.h195
-rw-r--r--drivers/usb/serial/io_edgeport.c3113
-rw-r--r--drivers/usb/serial/io_edgeport.h141
-rw-r--r--drivers/usb/serial/io_fw_boot.h556
-rw-r--r--drivers/usb/serial/io_fw_boot2.h546
-rw-r--r--drivers/usb/serial/io_fw_down.h1229
-rw-r--r--drivers/usb/serial/io_fw_down2.h1133
-rw-r--r--drivers/usb/serial/io_fw_down3.h835
-rw-r--r--drivers/usb/serial/io_ionsp.h454
-rw-r--r--drivers/usb/serial/io_tables.h163
-rw-r--r--drivers/usb/serial/io_ti.c3091
-rw-r--r--drivers/usb/serial/io_ti.h180
-rw-r--r--drivers/usb/serial/io_usbvend.h687
-rw-r--r--drivers/usb/serial/ipaq.c973
-rw-r--r--drivers/usb/serial/ipaq.h54
-rw-r--r--drivers/usb/serial/ipw.c491
-rw-r--r--drivers/usb/serial/ir-usb.c619
-rw-r--r--drivers/usb/serial/keyspan.c2354
-rw-r--r--drivers/usb/serial/keyspan.h660
-rw-r--r--drivers/usb/serial/keyspan_mpr_fw.h286
-rw-r--r--drivers/usb/serial/keyspan_pda.S1124
-rw-r--r--drivers/usb/serial/keyspan_pda.c894
-rw-r--r--drivers/usb/serial/keyspan_pda_fw.h99
-rw-r--r--drivers/usb/serial/keyspan_usa18x_fw.h447
-rw-r--r--drivers/usb/serial/keyspan_usa19_fw.h285
-rw-r--r--drivers/usb/serial/keyspan_usa19qi_fw.h284
-rw-r--r--drivers/usb/serial/keyspan_usa19qw_fw.h448
-rw-r--r--drivers/usb/serial/keyspan_usa19w_fw.h446
-rw-r--r--drivers/usb/serial/keyspan_usa26msg.h260
-rw-r--r--drivers/usb/serial/keyspan_usa28_fw.h466
-rw-r--r--drivers/usb/serial/keyspan_usa28msg.h201
-rw-r--r--drivers/usb/serial/keyspan_usa28x_fw.h447
-rw-r--r--drivers/usb/serial/keyspan_usa28xa_fw.h449
-rw-r--r--drivers/usb/serial/keyspan_usa28xb_fw.h448
-rw-r--r--drivers/usb/serial/keyspan_usa49msg.h282
-rw-r--r--drivers/usb/serial/keyspan_usa49w_fw.h464
-rw-r--r--drivers/usb/serial/keyspan_usa49wlc_fw.h476
-rw-r--r--drivers/usb/serial/keyspan_usa90msg.h198
-rw-r--r--drivers/usb/serial/kl5kusb105.c1034
-rw-r--r--drivers/usb/serial/kl5kusb105.h69
-rw-r--r--drivers/usb/serial/kobil_sct.c774
-rw-r--r--drivers/usb/serial/kobil_sct.h60
-rw-r--r--drivers/usb/serial/mct_u232.c781
-rw-r--r--drivers/usb/serial/mct_u232.h453
-rw-r--r--drivers/usb/serial/omninet.c362
-rw-r--r--drivers/usb/serial/pl2303.c1200
-rw-r--r--drivers/usb/serial/pl2303.h57
-rw-r--r--drivers/usb/serial/safe_serial.c451
-rw-r--r--drivers/usb/serial/ti_fw_3410.h885
-rw-r--r--drivers/usb/serial/ti_fw_5052.h885
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c1842
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.h224
-rw-r--r--drivers/usb/serial/usb-serial.c1435
-rw-r--r--drivers/usb/serial/usb-serial.h332
-rw-r--r--drivers/usb/serial/visor.c1161
-rw-r--r--drivers/usb/serial/visor.h151
-rw-r--r--drivers/usb/serial/whiteheat.c1512
-rw-r--r--drivers/usb/serial/whiteheat.h282
-rw-r--r--drivers/usb/serial/whiteheat_fw.h1669
-rw-r--r--drivers/usb/serial/xircom_pgs.S1192
-rw-r--r--drivers/usb/serial/xircom_pgs_fw.h103
80 files changed, 54619 insertions, 0 deletions
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
new file mode 100644
index 000000000000..b869076d9c7c
--- /dev/null
+++ b/drivers/usb/serial/Kconfig
@@ -0,0 +1,455 @@
1#
2# USB Serial device configuration
3#
4
5menu "USB Serial Converter support"
6 depends on USB!=n
7
8config USB_SERIAL
9 tristate "USB Serial Converter support"
10 depends on USB
11 ---help---
12 Say Y here if you have a USB device that provides normal serial
13 ports, or acts like a serial device, and you want to connect it to
14 your USB bus.
15
16 Please read <file:Documentation/usb/usb-serial.txt> for more
17 information on the specifics of the different devices that are
18 supported, and on how to use them.
19
20 To compile this driver as a module, choose M here: the
21 module will be called usbserial.
22
23config USB_SERIAL_CONSOLE
24 bool "USB Serial Console device support (EXPERIMENTAL)"
25 depends on USB_SERIAL=y && EXPERIMENTAL
26 ---help---
27 If you say Y here, it will be possible to use a USB to serial
28 converter port as the system console (the system console is the
29 device which receives all kernel messages and warnings and which
30 allows logins in single user mode). This could be useful if some
31 terminal or printer is connected to that serial port.
32
33 Even if you say Y here, the currently visible virtual console
34 (/dev/tty0) will still be used as the system console by default, but
35 you can alter that using a kernel command line option such as
36 "console=ttyUSB0". (Try "man bootparam" or see the documentation of
37 your boot loader (lilo or loadlin) about how to pass options to the
38 kernel at boot time.)
39
40 If you don't have a VGA card installed and you say Y here, the
41 kernel will automatically use the first USB to serial converter
42 port, /dev/ttyUSB0, as system console.
43
44 If unsure, say N.
45
46config USB_SERIAL_GENERIC
47 bool "USB Generic Serial Driver"
48 depends on USB_SERIAL
49 help
50 Say Y here if you want to use the generic USB serial driver. Please
51 read <file:Documentation/usb/usb-serial.txt> for more information on
52 using this driver. It is recommended that the "USB Serial converter
53 support" be compiled as a module for this driver to be used
54 properly.
55
56config USB_SERIAL_BELKIN
57 tristate "USB Belkin and Peracom Single Port Serial Driver"
58 depends on USB_SERIAL
59 help
60 Say Y here if you want to use a Belkin USB Serial single port
61 adaptor (F5U103 is one of the model numbers) or the Peracom single
62 port USB to serial adapter.
63
64 To compile this driver as a module, choose M here: the
65 module will be called belkin_sa.
66
67config USB_SERIAL_WHITEHEAT
68 tristate "USB ConnectTech WhiteHEAT Serial Driver"
69 depends on USB_SERIAL && BROKEN_ON_SMP
70 help
71 Say Y here if you want to use a ConnectTech WhiteHEAT 4 port
72 USB to serial converter device.
73
74 To compile this driver as a module, choose M here: the
75 module will be called whiteheat.
76
77config USB_SERIAL_DIGI_ACCELEPORT
78 tristate "USB Digi International AccelePort USB Serial Driver"
79 depends on USB_SERIAL
80 ---help---
81 Say Y here if you want to use Digi AccelePort USB 2 or 4 devices,
82 2 port (plus parallel port) and 4 port USB serial converters. The
83 parallel port on the USB 2 appears as a third serial port on Linux.
84 The Digi Acceleport USB 8 is not yet supported by this driver.
85
86 This driver works under SMP with the usb-uhci driver. It does not
87 work under SMP with the uhci driver.
88
89 To compile this driver as a module, choose M here: the
90 module will be called digi_acceleport.
91
92config USB_SERIAL_CP2101
93 tristate "USB CP2101 UART Bridge Controller"
94 depends on USB_SERIAL && EXPERIMENTAL
95 help
96 Say Y here if you want to use a CP2101/CP2102 based USB to RS232
97 converter.
98
99 To compile this driver as a module, choose M here: the
100 module will be called cp2101.
101
102config USB_SERIAL_CYPRESS_M8
103 tristate "USB Cypress M8 USB Serial Driver"
104 depends on USB_SERIAL && EXPERIMENTAL
105 help
106 Say Y here if you want to use a device that contains the Cypress
107 USB to Serial microcontroller, such as the DeLorme Earthmate GPS.
108
109 Attempted SMP support... send bug reports!
110
111 Supported microcontrollers in the CY4601 family are:
112 CY7C63741 CY7C63742 CY7C63743 CY7C64013
113
114 To compile this driver as a module, choose M here: the
115 module will be called cypress_m8.
116
117config USB_SERIAL_EMPEG
118 tristate "USB Empeg empeg-car Mark I/II Driver"
119 depends on USB_SERIAL
120 help
121 Say Y here if you want to connect to your Empeg empeg-car Mark I/II
122 mp3 player via USB. The driver uses a single ttyUSB{0,1,2,...}
123 device node. See <file:Documentation/usb/usb-serial.txt> for more
124 tidbits of information.
125
126 To compile this driver as a module, choose M here: the
127 module will be called empeg.
128
129config USB_SERIAL_FTDI_SIO
130 tristate "USB FTDI Single Port Serial Driver (EXPERIMENTAL)"
131 depends on USB_SERIAL && EXPERIMENTAL
132 ---help---
133 Say Y here if you want to use a FTDI SIO single port USB to serial
134 converter device. The implementation I have is called the USC-1000.
135 This driver has also be tested with the 245 and 232 devices.
136
137 See <http://ftdi-usb-sio.sourceforge.net/> for more
138 information on this driver and the device.
139
140 To compile this driver as a module, choose M here: the
141 module will be called ftdi_sio.
142
143config USB_SERIAL_VISOR
144 tristate "USB Handspring Visor / Palm m50x / Sony Clie Driver"
145 depends on USB_SERIAL
146 help
147 Say Y here if you want to connect to your HandSpring Visor, Palm
148 m500 or m505 through its USB docking station. See
149 <http://usbvisor.sourceforge.net/> for more information on using this
150 driver.
151
152 To compile this driver as a module, choose M here: the
153 module will be called visor.
154
155config USB_SERIAL_IPAQ
156 tristate "USB PocketPC PDA Driver"
157 depends on USB_SERIAL
158 help
159 Say Y here if you want to connect to your Compaq iPAQ, HP Jornada
160 or any other PDA running Windows CE 3.0 or PocketPC 2002
161 using a USB cradle/cable. For information on using the driver,
162 read <file:Documentation/usb/usb-serial.txt>.
163
164 To compile this driver as a module, choose M here: the
165 module will be called ipaq.
166
167config USB_SERIAL_IR
168 tristate "USB IR Dongle Serial Driver (EXPERIMENTAL)"
169 depends on USB_SERIAL && EXPERIMENTAL
170 help
171 Say Y here if you want to enable simple serial support for USB IrDA
172 devices. This is useful if you do not want to use the full IrDA
173 stack.
174
175 To compile this driver as a module, choose M here: the
176 module will be called ir-usb.
177
178config USB_SERIAL_EDGEPORT
179 tristate "USB Inside Out Edgeport Serial Driver"
180 depends on USB_SERIAL
181 ---help---
182 Say Y here if you want to use any of the following devices from
183 Inside Out Networks (Digi):
184 Edgeport/4
185 Rapidport/4
186 Edgeport/4t
187 Edgeport/2
188 Edgeport/4i
189 Edgeport/2i
190 Edgeport/421
191 Edgeport/21
192 Edgeport/8
193 Edgeport/8 Dual
194 Edgeport/2D8
195 Edgeport/4D8
196 Edgeport/8i
197 Edgeport/2 DIN
198 Edgeport/4 DIN
199 Edgeport/16 Dual
200
201 To compile this driver as a module, choose M here: the
202 module will be called io_edgeport.
203
204config USB_SERIAL_EDGEPORT_TI
205 tristate "USB Inside Out Edgeport Serial Driver (TI devices)"
206 depends on USB_SERIAL
207 help
208 Say Y here if you want to use any of the devices from Inside Out
209 Networks (Digi) that are not supported by the io_edgeport driver.
210 This includes the Edgeport/1 device.
211
212 To compile this driver as a module, choose M here: the
213 module will be called io_ti.
214
215config USB_SERIAL_GARMIN
216 tristate "USB Garmin GPS driver"
217 depends on USB_SERIAL
218 help
219 Say Y here if you want to connect to your Garmin GPS.
220 Should work with most Garmin GPS devices which have a native USB port.
221
222 See <http://sourceforge.net/projects/garmin-gps> for the latest
223 version of the driver.
224
225 To compile this driver as a module, choose M here: the
226 module will be called garmin_gps.
227
228config USB_SERIAL_IPW
229 tristate "USB IPWireless (3G UMTS TDD) Driver (EXPERIMENTAL)"
230 depends on USB_SERIAL && EXPERIMENTAL
231 help
232 Say Y here if you want to use a IPWireless USB modem such as
233 the ones supplied by Axity3G/Sentech South Africa.
234
235 To compile this driver as a module, choose M here: the
236 module will be called ipw.
237
238config USB_SERIAL_KEYSPAN_PDA
239 tristate "USB Keyspan PDA Single Port Serial Driver"
240 depends on USB_SERIAL
241 help
242 Say Y here if you want to use a Keyspan PDA single port USB to
243 serial converter device. This driver makes use of firmware
244 developed from scratch by Brian Warner.
245
246 To compile this driver as a module, choose M here: the
247 module will be called keyspan_pda.
248
249config USB_SERIAL_KEYSPAN
250 tristate "USB Keyspan USA-xxx Serial Driver"
251 depends on USB_SERIAL
252 ---help---
253 Say Y here if you want to use Keyspan USB to serial converter
254 devices. This driver makes use of Keyspan's official firmware
255 and was developed with their support. You must also include
256 firmware to support your particular device(s).
257
258 See <http://misc.nu/hugh/keyspan.html> for more information.
259
260 To compile this driver as a module, choose M here: the
261 module will be called keyspan.
262
263config USB_SERIAL_KEYSPAN_MPR
264 bool "USB Keyspan MPR Firmware"
265 depends on USB_SERIAL_KEYSPAN
266 help
267 Say Y here to include firmware for the Keyspan MPR converter.
268
269config USB_SERIAL_KEYSPAN_USA28
270 bool "USB Keyspan USA-28 Firmware"
271 depends on USB_SERIAL_KEYSPAN
272 help
273 Say Y here to include firmware for the USA-28 converter.
274
275config USB_SERIAL_KEYSPAN_USA28X
276 bool "USB Keyspan USA-28X Firmware"
277 depends on USB_SERIAL_KEYSPAN
278 help
279 Say Y here to include firmware for the USA-28X converter.
280 Be sure you have a USA-28X, there are also 28XA and 28XB
281 models, the label underneath has the actual part number.
282
283config USB_SERIAL_KEYSPAN_USA28XA
284 bool "USB Keyspan USA-28XA Firmware"
285 depends on USB_SERIAL_KEYSPAN
286 help
287 Say Y here to include firmware for the USA-28XA converter.
288 Be sure you have a USA-28XA, there are also 28X and 28XB
289 models, the label underneath has the actual part number.
290
291config USB_SERIAL_KEYSPAN_USA28XB
292 bool "USB Keyspan USA-28XB Firmware"
293 depends on USB_SERIAL_KEYSPAN
294 help
295 Say Y here to include firmware for the USA-28XB converter.
296 Be sure you have a USA-28XB, there are also 28X and 28XA
297 models, the label underneath has the actual part number.
298
299config USB_SERIAL_KEYSPAN_USA19
300 bool "USB Keyspan USA-19 Firmware"
301 depends on USB_SERIAL_KEYSPAN
302 help
303 Say Y here to include firmware for the USA-19 converter.
304
305config USB_SERIAL_KEYSPAN_USA18X
306 bool "USB Keyspan USA-18X Firmware"
307 depends on USB_SERIAL_KEYSPAN
308 help
309 Say Y here to include firmware for the USA-18X converter.
310
311config USB_SERIAL_KEYSPAN_USA19W
312 bool "USB Keyspan USA-19W Firmware"
313 depends on USB_SERIAL_KEYSPAN
314 help
315 Say Y here to include firmware for the USA-19W converter.
316
317config USB_SERIAL_KEYSPAN_USA19QW
318 bool "USB Keyspan USA-19QW Firmware"
319 depends on USB_SERIAL_KEYSPAN
320 help
321 Say Y here to include firmware for the USA-19QW converter.
322
323config USB_SERIAL_KEYSPAN_USA19QI
324 bool "USB Keyspan USA-19QI Firmware"
325 depends on USB_SERIAL_KEYSPAN
326 help
327 Say Y here to include firmware for the USA-19QI converter.
328
329config USB_SERIAL_KEYSPAN_USA49W
330 bool "USB Keyspan USA-49W Firmware"
331 depends on USB_SERIAL_KEYSPAN
332 help
333 Say Y here to include firmware for the USA-49W converter.
334
335config USB_SERIAL_KEYSPAN_USA49WLC
336 bool "USB Keyspan USA-49WLC Firmware"
337 depends on USB_SERIAL_KEYSPAN
338 help
339 Say Y here to include firmware for the USA-49WLC converter.
340
341config USB_SERIAL_KLSI
342 tristate "USB KL5KUSB105 (Palmconnect) Driver (EXPERIMENTAL)"
343 depends on USB_SERIAL && EXPERIMENTAL
344 ---help---
345 Say Y here if you want to use a KL5KUSB105 - based single port
346 serial adapter. The most widely known -- and currently the only
347 tested -- device in this category is the PalmConnect USB Serial
348 adapter sold by Palm Inc. for use with their Palm III and Palm V
349 series PDAs.
350
351 Please read <file:Documentation/usb/usb-serial.txt> for more
352 information.
353
354 To compile this driver as a module, choose M here: the
355 module will be called kl5kusb105.
356
357config USB_SERIAL_KOBIL_SCT
358 tristate "USB KOBIL chipcard reader"
359 depends on USB_SERIAL
360 ---help---
361 Say Y here if you want to use one of the following KOBIL USB chipcard
362 readers:
363
364 - USB TWIN
365 - KAAN Standard Plus
366 - KAAN SIM
367 - SecOVID Reader Plus
368 - B1 Professional
369 - KAAN Professional
370
371 Note that you need a current CT-API.
372 To compile this driver as a module, choose M here: the
373 module will be called kobil_sct.
374
375config USB_SERIAL_MCT_U232
376 tristate "USB MCT Single Port Serial Driver"
377 depends on USB_SERIAL
378 ---help---
379 Say Y here if you want to use a USB Serial single port adapter from
380 Magic Control Technology Corp. (U232 is one of the model numbers).
381
382 This driver also works with Sitecom U232-P25 and D-Link DU-H3SP USB
383 BAY devices.
384
385 To compile this driver as a module, choose M here: the
386 module will be called mct_u232.
387
388config USB_SERIAL_PL2303
389 tristate "USB Prolific 2303 Single Port Serial Driver"
390 depends on USB_SERIAL
391 help
392 Say Y here if you want to use the PL2303 USB Serial single port
393 adapter from Prolific.
394
395 To compile this driver as a module, choose M here: the
396 module will be called pl2303.
397
398config USB_SERIAL_SAFE
399 tristate "USB Safe Serial (Encapsulated) Driver (EXPERIMENTAL)"
400 depends on USB_SERIAL && EXPERIMENTAL
401
402config USB_SERIAL_SAFE_PADDED
403 bool "USB Secure Encapsulated Driver - Padded"
404 depends on USB_SERIAL_SAFE
405
406config USB_SERIAL_TI
407 tristate "USB TI 3410/5052 Serial Driver"
408 depends on USB_SERIAL
409 help
410 Say Y here if you want to use the TI USB 3410 or 5052
411 serial devices.
412
413 To compile this driver as a module, choose M here: the
414 module will be called ti_usb_3410_5052.
415
416config USB_SERIAL_CYBERJACK
417 tristate "USB REINER SCT cyberJack pinpad/e-com chipcard reader (EXPERIMENTAL)"
418 depends on USB_SERIAL && EXPERIMENTAL
419 ---help---
420 Say Y here if you want to use a cyberJack pinpad/e-com USB chipcard
421 reader. This is an interface to ISO 7816 compatible contactbased
422 chipcards, e.g. GSM SIMs.
423
424 To compile this driver as a module, choose M here: the
425 module will be called cyberjack.
426
427 If unsure, say N.
428
429config USB_SERIAL_XIRCOM
430 tristate "USB Xircom / Entregra Single Port Serial Driver"
431 depends on USB_SERIAL
432 help
433 Say Y here if you want to use a Xircom or Entregra single port USB to
434 serial converter device. This driver makes use of firmware
435 developed from scratch by Brian Warner.
436
437 To compile this driver as a module, choose M here: the
438 module will be called keyspan_pda.
439
440config USB_SERIAL_OMNINET
441 tristate "USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL)"
442 depends on USB_SERIAL && EXPERIMENTAL
443 help
444 Say Y here if you want to use a ZyXEL omni.net LCD ISDN TA.
445
446 To compile this driver as a module, choose M here: the
447 module will be called omninet.
448
449config USB_EZUSB
450 bool
451 depends on USB_SERIAL_KEYSPAN_PDA || USB_SERIAL_XIRCOM || USB_SERIAL_KEYSPAN || USB_SERIAL_WHITEHEAT
452 default y
453
454endmenu
455
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile
new file mode 100644
index 000000000000..351b81855b18
--- /dev/null
+++ b/drivers/usb/serial/Makefile
@@ -0,0 +1,39 @@
1#
2# Makefile for the USB serial device drivers.
3#
4
5# Object file lists.
6
7obj-$(CONFIG_USB_SERIAL) += usbserial.o
8
9usbserial-obj-$(CONFIG_USB_SERIAL_CONSOLE) += console.o
10usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o
11
12usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
13
14obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
15obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o
16obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o
17obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o
18obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o
19obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o
20obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o
21obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o
22obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o
23obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o
24obj-$(CONFIG_USB_SERIAL_IPAQ) += ipaq.o
25obj-$(CONFIG_USB_SERIAL_IPW) += ipw.o
26obj-$(CONFIG_USB_SERIAL_IR) += ir-usb.o
27obj-$(CONFIG_USB_SERIAL_KEYSPAN) += keyspan.o
28obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda.o
29obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o
30obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o
31obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o
32obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o
33obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
34obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o
35obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o
36obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o
37obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o
38obj-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda.o
39
diff --git a/drivers/usb/serial/Makefile-keyspan_pda_fw b/drivers/usb/serial/Makefile-keyspan_pda_fw
new file mode 100644
index 000000000000..c20baf728011
--- /dev/null
+++ b/drivers/usb/serial/Makefile-keyspan_pda_fw
@@ -0,0 +1,16 @@
1
2# some rules to handle the quirks of the 'as31' assembler, like
3# insisting upon fixed suffixes for the input and output files,
4# and its lack of preprocessor support
5
6all: keyspan_pda_fw.h
7
8%.asm: %.S
9 gcc -x assembler-with-cpp -P -E -o $@ $<
10
11%.hex: %.asm
12 as31 -l $<
13 mv $*.obj $@
14
15%_fw.h: %.hex ezusb_convert.pl
16 perl ezusb_convert.pl $* < $< > $@
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
new file mode 100644
index 000000000000..86994d117c44
--- /dev/null
+++ b/drivers/usb/serial/belkin_sa.c
@@ -0,0 +1,614 @@
1/*
2 * Belkin USB Serial Adapter Driver
3 *
4 * Copyright (C) 2000 William Greathouse (wgreathouse@smva.com)
5 * Copyright (C) 2000-2001 Greg Kroah-Hartman (greg@kroah.com)
6 *
7 * This program is largely derived from work by the linux-usb group
8 * and associated source files. Please see the usb/serial files for
9 * individual credits and copyrights.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * See Documentation/usb/usb-serial.txt for more information on using this driver
17 *
18 * TODO:
19 * -- Add true modem contol line query capability. Currently we track the
20 * states reported by the interrupt and the states we request.
21 * -- Add error reporting back to application for UART error conditions.
22 * Just point me at how to implement this and I'll do it. I've put the
23 * framework in, but haven't analyzed the "tty_flip" interface yet.
24 * -- Add support for flush commands
25 * -- Add everything that is missing :)
26 *
27 * 27-Nov-2001 gkh
28 * compressed all the differnent device entries into 1.
29 *
30 * 30-May-2001 gkh
31 * switched from using spinlock to a semaphore, which fixes lots of problems.
32 *
33 * 08-Apr-2001 gb
34 * - Identify version on module load.
35 *
36 * 12-Mar-2001 gkh
37 * - Added support for the GoHubs GO-COM232 device which is the same as the
38 * Peracom device.
39 *
40 * 06-Nov-2000 gkh
41 * - Added support for the old Belkin and Peracom devices.
42 * - Made the port able to be opened multiple times.
43 * - Added some defaults incase the line settings are things these devices
44 * can't support.
45 *
46 * 18-Oct-2000 William Greathouse
47 * Released into the wild (linux-usb-devel)
48 *
49 * 17-Oct-2000 William Greathouse
50 * Add code to recognize firmware version and set hardware flow control
51 * appropriately. Belkin states that firmware prior to 3.05 does not
52 * operate correctly in hardware handshake mode. I have verified this
53 * on firmware 2.05 -- for both RTS and DTR input flow control, the control
54 * line is not reset. The test performed by the Belkin Win* driver is
55 * to enable hardware flow control for firmware 2.06 or greater and
56 * for 1.00 or prior. I am only enabling for 2.06 or greater.
57 *
58 * 12-Oct-2000 William Greathouse
59 * First cut at supporting Belkin USB Serial Adapter F5U103
60 * I did not have a copy of the original work to support this
61 * adapter, so pardon any stupid mistakes. All of the information
62 * I am using to write this driver was acquired by using a modified
63 * UsbSnoop on Windows2000 and from examining the other USB drivers.
64 */
65
66#include <linux/config.h>
67#include <linux/kernel.h>
68#include <linux/errno.h>
69#include <linux/init.h>
70#include <linux/slab.h>
71#include <linux/tty.h>
72#include <linux/tty_driver.h>
73#include <linux/tty_flip.h>
74#include <linux/module.h>
75#include <linux/spinlock.h>
76#include <asm/uaccess.h>
77#include <linux/usb.h>
78#include "usb-serial.h"
79#include "belkin_sa.h"
80
81static int debug;
82
83/*
84 * Version Information
85 */
86#define DRIVER_VERSION "v1.2"
87#define DRIVER_AUTHOR "William Greathouse <wgreathouse@smva.com>"
88#define DRIVER_DESC "USB Belkin Serial converter driver"
89
90/* function prototypes for a Belkin USB Serial Adapter F5U103 */
91static int belkin_sa_startup (struct usb_serial *serial);
92static void belkin_sa_shutdown (struct usb_serial *serial);
93static int belkin_sa_open (struct usb_serial_port *port, struct file *filp);
94static void belkin_sa_close (struct usb_serial_port *port, struct file *filp);
95static void belkin_sa_read_int_callback (struct urb *urb, struct pt_regs *regs);
96static void belkin_sa_set_termios (struct usb_serial_port *port, struct termios * old);
97static int belkin_sa_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
98static void belkin_sa_break_ctl (struct usb_serial_port *port, int break_state );
99static int belkin_sa_tiocmget (struct usb_serial_port *port, struct file *file);
100static int belkin_sa_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear);
101
102
103static struct usb_device_id id_table_combined [] = {
104 { USB_DEVICE(BELKIN_SA_VID, BELKIN_SA_PID) },
105 { USB_DEVICE(BELKIN_OLD_VID, BELKIN_OLD_PID) },
106 { USB_DEVICE(PERACOM_VID, PERACOM_PID) },
107 { USB_DEVICE(GOHUBS_VID, GOHUBS_PID) },
108 { USB_DEVICE(GOHUBS_VID, HANDYLINK_PID) },
109 { USB_DEVICE(BELKIN_DOCKSTATION_VID, BELKIN_DOCKSTATION_PID) },
110 { } /* Terminating entry */
111};
112
113MODULE_DEVICE_TABLE (usb, id_table_combined);
114
115static struct usb_driver belkin_driver = {
116 .owner = THIS_MODULE,
117 .name = "belkin",
118 .probe = usb_serial_probe,
119 .disconnect = usb_serial_disconnect,
120 .id_table = id_table_combined,
121};
122
123/* All of the device info needed for the serial converters */
124static struct usb_serial_device_type belkin_device = {
125 .owner = THIS_MODULE,
126 .name = "Belkin / Peracom / GoHubs USB Serial Adapter",
127 .short_name = "belkin",
128 .id_table = id_table_combined,
129 .num_interrupt_in = 1,
130 .num_bulk_in = 1,
131 .num_bulk_out = 1,
132 .num_ports = 1,
133 .open = belkin_sa_open,
134 .close = belkin_sa_close,
135 .read_int_callback = belkin_sa_read_int_callback, /* How we get the status info */
136 .ioctl = belkin_sa_ioctl,
137 .set_termios = belkin_sa_set_termios,
138 .break_ctl = belkin_sa_break_ctl,
139 .tiocmget = belkin_sa_tiocmget,
140 .tiocmset = belkin_sa_tiocmset,
141 .attach = belkin_sa_startup,
142 .shutdown = belkin_sa_shutdown,
143};
144
145
146struct belkin_sa_private {
147 spinlock_t lock;
148 unsigned long control_state;
149 unsigned char last_lsr;
150 unsigned char last_msr;
151 int bad_flow_control;
152};
153
154
155/*
156 * ***************************************************************************
157 * Belkin USB Serial Adapter F5U103 specific driver functions
158 * ***************************************************************************
159 */
160
161#define WDR_TIMEOUT 5000 /* default urb timeout */
162
163/* assumes that struct usb_serial *serial is available */
164#define BSA_USB_CMD(c,v) usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), \
165 (c), BELKIN_SA_SET_REQUEST_TYPE, \
166 (v), 0, NULL, 0, WDR_TIMEOUT)
167
168/* do some startup allocations not currently performed by usb_serial_probe() */
169static int belkin_sa_startup (struct usb_serial *serial)
170{
171 struct usb_device *dev = serial->dev;
172 struct belkin_sa_private *priv;
173
174 /* allocate the private data structure */
175 priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL);
176 if (!priv)
177 return (-1); /* error */
178 /* set initial values for control structures */
179 spin_lock_init(&priv->lock);
180 priv->control_state = 0;
181 priv->last_lsr = 0;
182 priv->last_msr = 0;
183 /* see comments at top of file */
184 priv->bad_flow_control = (le16_to_cpu(dev->descriptor.bcdDevice) <= 0x0206) ? 1 : 0;
185 info("bcdDevice: %04x, bfc: %d", le16_to_cpu(dev->descriptor.bcdDevice), priv->bad_flow_control);
186
187 init_waitqueue_head(&serial->port[0]->write_wait);
188 usb_set_serial_port_data(serial->port[0], priv);
189
190 return (0);
191}
192
193
194static void belkin_sa_shutdown (struct usb_serial *serial)
195{
196 struct belkin_sa_private *priv;
197 int i;
198
199 dbg ("%s", __FUNCTION__);
200
201 /* stop reads and writes on all ports */
202 for (i=0; i < serial->num_ports; ++i) {
203 /* My special items, the standard routines free my urbs */
204 priv = usb_get_serial_port_data(serial->port[i]);
205 if (priv)
206 kfree(priv);
207 }
208}
209
210
211static int belkin_sa_open (struct usb_serial_port *port, struct file *filp)
212{
213 int retval = 0;
214
215 dbg("%s port %d", __FUNCTION__, port->number);
216
217 /*Start reading from the device*/
218 /* TODO: Look at possibility of submitting multiple URBs to device to
219 * enhance buffering. Win trace shows 16 initial read URBs.
220 */
221 port->read_urb->dev = port->serial->dev;
222 retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
223 if (retval) {
224 err("usb_submit_urb(read bulk) failed");
225 goto exit;
226 }
227
228 port->interrupt_in_urb->dev = port->serial->dev;
229 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
230 if (retval) {
231 usb_kill_urb(port->read_urb);
232 err(" usb_submit_urb(read int) failed");
233 }
234
235exit:
236 return retval;
237} /* belkin_sa_open */
238
239
240static void belkin_sa_close (struct usb_serial_port *port, struct file *filp)
241{
242 dbg("%s port %d", __FUNCTION__, port->number);
243
244 /* shutdown our bulk reads and writes */
245 usb_kill_urb(port->write_urb);
246 usb_kill_urb(port->read_urb);
247 usb_kill_urb(port->interrupt_in_urb);
248} /* belkin_sa_close */
249
250
251static void belkin_sa_read_int_callback (struct urb *urb, struct pt_regs *regs)
252{
253 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
254 struct belkin_sa_private *priv;
255 unsigned char *data = urb->transfer_buffer;
256 int retval;
257 unsigned long flags;
258
259 switch (urb->status) {
260 case 0:
261 /* success */
262 break;
263 case -ECONNRESET:
264 case -ENOENT:
265 case -ESHUTDOWN:
266 /* this urb is terminated, clean up */
267 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
268 return;
269 default:
270 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
271 goto exit;
272 }
273
274 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
275
276 /* Handle known interrupt data */
277 /* ignore data[0] and data[1] */
278
279 priv = usb_get_serial_port_data(port);
280 spin_lock_irqsave(&priv->lock, flags);
281 priv->last_msr = data[BELKIN_SA_MSR_INDEX];
282
283 /* Record Control Line states */
284 if (priv->last_msr & BELKIN_SA_MSR_DSR)
285 priv->control_state |= TIOCM_DSR;
286 else
287 priv->control_state &= ~TIOCM_DSR;
288
289 if (priv->last_msr & BELKIN_SA_MSR_CTS)
290 priv->control_state |= TIOCM_CTS;
291 else
292 priv->control_state &= ~TIOCM_CTS;
293
294 if (priv->last_msr & BELKIN_SA_MSR_RI)
295 priv->control_state |= TIOCM_RI;
296 else
297 priv->control_state &= ~TIOCM_RI;
298
299 if (priv->last_msr & BELKIN_SA_MSR_CD)
300 priv->control_state |= TIOCM_CD;
301 else
302 priv->control_state &= ~TIOCM_CD;
303
304 /* Now to report any errors */
305 priv->last_lsr = data[BELKIN_SA_LSR_INDEX];
306#if 0
307 /*
308 * fill in the flip buffer here, but I do not know the relation
309 * to the current/next receive buffer or characters. I need
310 * to look in to this before committing any code.
311 */
312 if (priv->last_lsr & BELKIN_SA_LSR_ERR) {
313 tty = port->tty;
314 /* Overrun Error */
315 if (priv->last_lsr & BELKIN_SA_LSR_OE) {
316 }
317 /* Parity Error */
318 if (priv->last_lsr & BELKIN_SA_LSR_PE) {
319 }
320 /* Framing Error */
321 if (priv->last_lsr & BELKIN_SA_LSR_FE) {
322 }
323 /* Break Indicator */
324 if (priv->last_lsr & BELKIN_SA_LSR_BI) {
325 }
326 }
327#endif
328 spin_unlock_irqrestore(&priv->lock, flags);
329exit:
330 retval = usb_submit_urb (urb, GFP_ATOMIC);
331 if (retval)
332 err ("%s - usb_submit_urb failed with result %d",
333 __FUNCTION__, retval);
334}
335
336static void belkin_sa_set_termios (struct usb_serial_port *port, struct termios *old_termios)
337{
338 struct usb_serial *serial = port->serial;
339 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
340 unsigned int iflag;
341 unsigned int cflag;
342 unsigned int old_iflag = 0;
343 unsigned int old_cflag = 0;
344 __u16 urb_value = 0; /* Will hold the new flags */
345 unsigned long flags;
346 unsigned long control_state;
347 int bad_flow_control;
348
349 if ((!port->tty) || (!port->tty->termios)) {
350 dbg ("%s - no tty or termios structure", __FUNCTION__);
351 return;
352 }
353
354 iflag = port->tty->termios->c_iflag;
355 cflag = port->tty->termios->c_cflag;
356
357 /* get a local copy of the current port settings */
358 spin_lock_irqsave(&priv->lock, flags);
359 control_state = priv->control_state;
360 bad_flow_control = priv->bad_flow_control;
361 spin_unlock_irqrestore(&priv->lock, flags);
362
363 /* check that they really want us to change something */
364 if (old_termios) {
365 if ((cflag == old_termios->c_cflag) &&
366 (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
367 dbg("%s - nothing to change...", __FUNCTION__);
368 return;
369 }
370 old_iflag = old_termios->c_iflag;
371 old_cflag = old_termios->c_cflag;
372 }
373
374 /* Set the baud rate */
375 if( (cflag&CBAUD) != (old_cflag&CBAUD) ) {
376 /* reassert DTR and (maybe) RTS on transition from B0 */
377 if( (old_cflag&CBAUD) == B0 ) {
378 control_state |= (TIOCM_DTR|TIOCM_RTS);
379 if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 1) < 0)
380 err("Set DTR error");
381 /* don't set RTS if using hardware flow control */
382 if (!(old_cflag&CRTSCTS) )
383 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, 1) < 0)
384 err("Set RTS error");
385 }
386
387 switch(cflag & CBAUD) {
388 case B0: /* handled below */ break;
389 case B300: urb_value = BELKIN_SA_BAUD(300); break;
390 case B600: urb_value = BELKIN_SA_BAUD(600); break;
391 case B1200: urb_value = BELKIN_SA_BAUD(1200); break;
392 case B2400: urb_value = BELKIN_SA_BAUD(2400); break;
393 case B4800: urb_value = BELKIN_SA_BAUD(4800); break;
394 case B9600: urb_value = BELKIN_SA_BAUD(9600); break;
395 case B19200: urb_value = BELKIN_SA_BAUD(19200); break;
396 case B38400: urb_value = BELKIN_SA_BAUD(38400); break;
397 case B57600: urb_value = BELKIN_SA_BAUD(57600); break;
398 case B115200: urb_value = BELKIN_SA_BAUD(115200); break;
399 case B230400: urb_value = BELKIN_SA_BAUD(230400); break;
400 default: err("BELKIN USB Serial Adapter: unsupported baudrate request, using default of 9600");
401 urb_value = BELKIN_SA_BAUD(9600); break;
402 }
403 if ((cflag & CBAUD) != B0 ) {
404 if (BSA_USB_CMD(BELKIN_SA_SET_BAUDRATE_REQUEST, urb_value) < 0)
405 err("Set baudrate error");
406 } else {
407 /* Disable flow control */
408 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST, BELKIN_SA_FLOW_NONE) < 0)
409 err("Disable flowcontrol error");
410
411 /* Drop RTS and DTR */
412 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
413 if (BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, 0) < 0)
414 err("DTR LOW error");
415 if (BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, 0) < 0)
416 err("RTS LOW error");
417 }
418 }
419
420 /* set the parity */
421 if( (cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD)) ) {
422 if (cflag & PARENB)
423 urb_value = (cflag & PARODD) ? BELKIN_SA_PARITY_ODD : BELKIN_SA_PARITY_EVEN;
424 else
425 urb_value = BELKIN_SA_PARITY_NONE;
426 if (BSA_USB_CMD(BELKIN_SA_SET_PARITY_REQUEST, urb_value) < 0)
427 err("Set parity error");
428 }
429
430 /* set the number of data bits */
431 if( (cflag&CSIZE) != (old_cflag&CSIZE) ) {
432 switch (cflag & CSIZE) {
433 case CS5: urb_value = BELKIN_SA_DATA_BITS(5); break;
434 case CS6: urb_value = BELKIN_SA_DATA_BITS(6); break;
435 case CS7: urb_value = BELKIN_SA_DATA_BITS(7); break;
436 case CS8: urb_value = BELKIN_SA_DATA_BITS(8); break;
437 default: err("CSIZE was not CS5-CS8, using default of 8");
438 urb_value = BELKIN_SA_DATA_BITS(8);
439 break;
440 }
441 if (BSA_USB_CMD(BELKIN_SA_SET_DATA_BITS_REQUEST, urb_value) < 0)
442 err("Set data bits error");
443 }
444
445 /* set the number of stop bits */
446 if( (cflag&CSTOPB) != (old_cflag&CSTOPB) ) {
447 urb_value = (cflag & CSTOPB) ? BELKIN_SA_STOP_BITS(2) : BELKIN_SA_STOP_BITS(1);
448 if (BSA_USB_CMD(BELKIN_SA_SET_STOP_BITS_REQUEST, urb_value) < 0)
449 err("Set stop bits error");
450 }
451
452 /* Set flow control */
453 if( (iflag&IXOFF) != (old_iflag&IXOFF)
454 || (iflag&IXON) != (old_iflag&IXON)
455 || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
456 urb_value = 0;
457 if ((iflag & IXOFF) || (iflag & IXON))
458 urb_value |= (BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON);
459 else
460 urb_value &= ~(BELKIN_SA_FLOW_OXON | BELKIN_SA_FLOW_IXON);
461
462 if (cflag & CRTSCTS)
463 urb_value |= (BELKIN_SA_FLOW_OCTS | BELKIN_SA_FLOW_IRTS);
464 else
465 urb_value &= ~(BELKIN_SA_FLOW_OCTS | BELKIN_SA_FLOW_IRTS);
466
467 if (bad_flow_control)
468 urb_value &= ~(BELKIN_SA_FLOW_IRTS);
469
470 if (BSA_USB_CMD(BELKIN_SA_SET_FLOW_CTRL_REQUEST, urb_value) < 0)
471 err("Set flow control error");
472 }
473
474 /* save off the modified port settings */
475 spin_lock_irqsave(&priv->lock, flags);
476 priv->control_state = control_state;
477 spin_unlock_irqrestore(&priv->lock, flags);
478} /* belkin_sa_set_termios */
479
480
481static void belkin_sa_break_ctl( struct usb_serial_port *port, int break_state )
482{
483 struct usb_serial *serial = port->serial;
484
485 if (BSA_USB_CMD(BELKIN_SA_SET_BREAK_REQUEST, break_state ? 1 : 0) < 0)
486 err("Set break_ctl %d", break_state);
487}
488
489
490static int belkin_sa_tiocmget (struct usb_serial_port *port, struct file *file)
491{
492 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
493 unsigned long control_state;
494 unsigned long flags;
495
496 dbg("%s", __FUNCTION__);
497
498 spin_lock_irqsave(&priv->lock, flags);
499 control_state = priv->control_state;
500 spin_unlock_irqrestore(&priv->lock, flags);
501
502 return control_state;
503}
504
505
506static int belkin_sa_tiocmset (struct usb_serial_port *port, struct file *file,
507 unsigned int set, unsigned int clear)
508{
509 struct usb_serial *serial = port->serial;
510 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
511 unsigned long control_state;
512 unsigned long flags;
513 int retval;
514 int rts = 0;
515 int dtr = 0;
516
517 dbg("%s", __FUNCTION__);
518
519 spin_lock_irqsave(&priv->lock, flags);
520 control_state = priv->control_state;
521
522 if (set & TIOCM_RTS) {
523 control_state |= TIOCM_RTS;
524 rts = 1;
525 }
526 if (set & TIOCM_DTR) {
527 control_state |= TIOCM_DTR;
528 dtr = 1;
529 }
530 if (clear & TIOCM_RTS) {
531 control_state &= ~TIOCM_RTS;
532 rts = 0;
533 }
534 if (clear & TIOCM_DTR) {
535 control_state &= ~TIOCM_DTR;
536 dtr = 0;
537 }
538
539 priv->control_state = control_state;
540 spin_unlock_irqrestore(&priv->lock, flags);
541
542 retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, rts);
543 if (retval < 0) {
544 err("Set RTS error %d", retval);
545 goto exit;
546 }
547
548 retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, dtr);
549 if (retval < 0) {
550 err("Set DTR error %d", retval);
551 goto exit;
552 }
553exit:
554 return retval;
555}
556
557
558static int belkin_sa_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
559{
560 switch (cmd) {
561 case TIOCMIWAIT:
562 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
563 /* TODO */
564 return( 0 );
565
566 case TIOCGICOUNT:
567 /* return count of modemline transitions */
568 /* TODO */
569 return 0;
570
571 default:
572 dbg("belkin_sa_ioctl arg not supported - 0x%04x",cmd);
573 return(-ENOIOCTLCMD);
574 break;
575 }
576 return 0;
577} /* belkin_sa_ioctl */
578
579
580static int __init belkin_sa_init (void)
581{
582 int retval;
583 retval = usb_serial_register(&belkin_device);
584 if (retval)
585 goto failed_usb_serial_register;
586 retval = usb_register(&belkin_driver);
587 if (retval)
588 goto failed_usb_register;
589 info(DRIVER_DESC " " DRIVER_VERSION);
590 return 0;
591failed_usb_register:
592 usb_serial_deregister(&belkin_device);
593failed_usb_serial_register:
594 return retval;
595}
596
597
598static void __exit belkin_sa_exit (void)
599{
600 usb_deregister (&belkin_driver);
601 usb_serial_deregister (&belkin_device);
602}
603
604
605module_init (belkin_sa_init);
606module_exit (belkin_sa_exit);
607
608MODULE_AUTHOR( DRIVER_AUTHOR );
609MODULE_DESCRIPTION( DRIVER_DESC );
610MODULE_VERSION( DRIVER_VERSION );
611MODULE_LICENSE("GPL");
612
613module_param(debug, bool, S_IRUGO | S_IWUSR);
614MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/belkin_sa.h b/drivers/usb/serial/belkin_sa.h
new file mode 100644
index 000000000000..9116b92f4622
--- /dev/null
+++ b/drivers/usb/serial/belkin_sa.h
@@ -0,0 +1,123 @@
1/*
2 * Definitions for Belkin USB Serial Adapter Driver
3 *
4 * Copyright (C) 2000
5 * William Greathouse (wgreathouse@smva.com)
6 *
7 * This program is largely derived from work by the linux-usb group
8 * and associated source files. Please see the usb/serial files for
9 * individual credits and copyrights.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * See Documentation/usb/usb-serial.txt for more information on using this driver
17 *
18 * 12-Mar-2001 gkh
19 * Added GoHubs GO-COM232 device id.
20 *
21 * 06-Nov-2000 gkh
22 * Added old Belkin and Peracom device ids, which this driver supports
23 *
24 * 12-Oct-2000 William Greathouse
25 * First cut at supporting Belkin USB Serial Adapter F5U103
26 * I did not have a copy of the original work to support this
27 * adapter, so pardon any stupid mistakes. All of the information
28 * I am using to write this driver was acquired by using a modified
29 * UsbSnoop on Windows2000.
30 *
31 */
32
33#ifndef __LINUX_USB_SERIAL_BSA_H
34#define __LINUX_USB_SERIAL_BSA_H
35
36#define BELKIN_DOCKSTATION_VID 0x050d /* Vendor Id */
37#define BELKIN_DOCKSTATION_PID 0x1203 /* Product Id */
38
39#define BELKIN_SA_VID 0x050d /* Vendor Id */
40#define BELKIN_SA_PID 0x0103 /* Product Id */
41
42#define BELKIN_OLD_VID 0x056c /* Belkin's "old" vendor id */
43#define BELKIN_OLD_PID 0x8007 /* Belkin's "old" single port serial converter's id */
44
45#define PERACOM_VID 0x0565 /* Peracom's vendor id */
46#define PERACOM_PID 0x0001 /* Peracom's single port serial converter's id */
47
48#define GOHUBS_VID 0x0921 /* GoHubs vendor id */
49#define GOHUBS_PID 0x1000 /* GoHubs single port serial converter's id (identical to the Peracom device) */
50#define HANDYLINK_PID 0x1200 /* HandyLink USB's id (identical to the Peracom device) */
51
52/* Vendor Request Interface */
53#define BELKIN_SA_SET_BAUDRATE_REQUEST 0 /* Set baud rate */
54#define BELKIN_SA_SET_STOP_BITS_REQUEST 1 /* Set stop bits (1,2) */
55#define BELKIN_SA_SET_DATA_BITS_REQUEST 2 /* Set data bits (5,6,7,8) */
56#define BELKIN_SA_SET_PARITY_REQUEST 3 /* Set parity (None, Even, Odd) */
57
58#define BELKIN_SA_SET_DTR_REQUEST 10 /* Set DTR state */
59#define BELKIN_SA_SET_RTS_REQUEST 11 /* Set RTS state */
60#define BELKIN_SA_SET_BREAK_REQUEST 12 /* Set BREAK state */
61
62#define BELKIN_SA_SET_FLOW_CTRL_REQUEST 16 /* Set flow control mode */
63
64
65#ifdef WHEN_I_LEARN_THIS
66#define BELKIN_SA_SET_MAGIC_REQUEST 17 /* I don't know, possibly flush */
67 /* (always in Wininit sequence before flow control) */
68#define BELKIN_SA_RESET xx /* Reset the port */
69#define BELKIN_SA_GET_MODEM_STATUS xx /* Force return of modem status register */
70#endif
71
72#define BELKIN_SA_SET_REQUEST_TYPE 0x40
73
74#define BELKIN_SA_BAUD(b) (230400/b)
75
76#define BELKIN_SA_STOP_BITS(b) (b-1)
77
78#define BELKIN_SA_DATA_BITS(b) (b-5)
79
80#define BELKIN_SA_PARITY_NONE 0
81#define BELKIN_SA_PARITY_EVEN 1
82#define BELKIN_SA_PARITY_ODD 2
83#define BELKIN_SA_PARITY_MARK 3
84#define BELKIN_SA_PARITY_SPACE 4
85
86#define BELKIN_SA_FLOW_NONE 0x0000 /* No flow control */
87#define BELKIN_SA_FLOW_OCTS 0x0001 /* use CTS input to throttle output */
88#define BELKIN_SA_FLOW_ODSR 0x0002 /* use DSR input to throttle output */
89#define BELKIN_SA_FLOW_IDSR 0x0004 /* use DSR input to enable receive */
90#define BELKIN_SA_FLOW_IDTR 0x0008 /* use DTR output for input flow control */
91#define BELKIN_SA_FLOW_IRTS 0x0010 /* use RTS output for input flow control */
92#define BELKIN_SA_FLOW_ORTS 0x0020 /* use RTS to indicate data available to send */
93#define BELKIN_SA_FLOW_ERRSUB 0x0040 /* ???? guess ???? substitute inline errors */
94#define BELKIN_SA_FLOW_OXON 0x0080 /* use XON/XOFF for output flow control */
95#define BELKIN_SA_FLOW_IXON 0x0100 /* use XON/XOFF for input flow control */
96
97/*
98 * It seems that the interrupt pipe is closely modelled after the
99 * 16550 register layout. This is probably because the adapter can
100 * be used in a "DOS" environment to simulate a standard hardware port.
101 */
102#define BELKIN_SA_LSR_INDEX 2 /* Line Status Register */
103#define BELKIN_SA_LSR_RDR 0x01 /* receive data ready */
104#define BELKIN_SA_LSR_OE 0x02 /* overrun error */
105#define BELKIN_SA_LSR_PE 0x04 /* parity error */
106#define BELKIN_SA_LSR_FE 0x08 /* framing error */
107#define BELKIN_SA_LSR_BI 0x10 /* break indicator */
108#define BELKIN_SA_LSR_THE 0x20 /* transmit holding register empty */
109#define BELKIN_SA_LSR_TE 0x40 /* transmit register empty */
110#define BELKIN_SA_LSR_ERR 0x80 /* OE | PE | FE | BI */
111
112#define BELKIN_SA_MSR_INDEX 3 /* Modem Status Register */
113#define BELKIN_SA_MSR_DCTS 0x01 /* Delta CTS */
114#define BELKIN_SA_MSR_DDSR 0x02 /* Delta DSR */
115#define BELKIN_SA_MSR_DRI 0x04 /* Delta RI */
116#define BELKIN_SA_MSR_DCD 0x08 /* Delta CD */
117#define BELKIN_SA_MSR_CTS 0x10 /* Current CTS */
118#define BELKIN_SA_MSR_DSR 0x20 /* Current DSR */
119#define BELKIN_SA_MSR_RI 0x40 /* Current RI */
120#define BELKIN_SA_MSR_CD 0x80 /* Current CD */
121
122#endif /* __LINUX_USB_SERIAL_BSA_H */
123
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c
new file mode 100644
index 000000000000..2f612c2d894b
--- /dev/null
+++ b/drivers/usb/serial/bus.c
@@ -0,0 +1,134 @@
1/*
2 * USB Serial Converter Bus specific functions
3 *
4 * Copyright (C) 2002 Greg Kroah-Hartman (greg@kroah.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 */
10
11#include <linux/config.h>
12#include <linux/kernel.h>
13#include <linux/errno.h>
14#include <linux/tty.h>
15#include <linux/module.h>
16#include <linux/usb.h>
17#include "usb-serial.h"
18
19static int usb_serial_device_match (struct device *dev, struct device_driver *drv)
20{
21 struct usb_serial_device_type *driver;
22 const struct usb_serial_port *port;
23
24 /*
25 * drivers are already assigned to ports in serial_probe so it's
26 * a simple check here.
27 */
28 port = to_usb_serial_port(dev);
29 if (!port)
30 return 0;
31
32 driver = to_usb_serial_driver(drv);
33
34 if (driver == port->serial->type)
35 return 1;
36
37 return 0;
38}
39
40struct bus_type usb_serial_bus_type = {
41 .name = "usb-serial",
42 .match = usb_serial_device_match,
43};
44
45static int usb_serial_device_probe (struct device *dev)
46{
47 struct usb_serial_device_type *driver;
48 struct usb_serial_port *port;
49 int retval = 0;
50 int minor;
51
52 port = to_usb_serial_port(dev);
53 if (!port) {
54 retval = -ENODEV;
55 goto exit;
56 }
57
58 driver = port->serial->type;
59 if (driver->port_probe) {
60 if (!try_module_get(driver->owner)) {
61 dev_err(dev, "module get failed, exiting\n");
62 retval = -EIO;
63 goto exit;
64 }
65 retval = driver->port_probe (port);
66 module_put(driver->owner);
67 if (retval)
68 goto exit;
69 }
70
71 minor = port->number;
72 tty_register_device (usb_serial_tty_driver, minor, dev);
73 dev_info(&port->serial->dev->dev,
74 "%s converter now attached to ttyUSB%d\n",
75 driver->name, minor);
76
77exit:
78 return retval;
79}
80
81static int usb_serial_device_remove (struct device *dev)
82{
83 struct usb_serial_device_type *driver;
84 struct usb_serial_port *port;
85 int retval = 0;
86 int minor;
87
88 port = to_usb_serial_port(dev);
89 if (!port) {
90 return -ENODEV;
91 }
92
93 driver = port->serial->type;
94 if (driver->port_remove) {
95 if (!try_module_get(driver->owner)) {
96 dev_err(dev, "module get failed, exiting\n");
97 retval = -EIO;
98 goto exit;
99 }
100 retval = driver->port_remove (port);
101 module_put(driver->owner);
102 }
103exit:
104 minor = port->number;
105 tty_unregister_device (usb_serial_tty_driver, minor);
106 dev_info(dev, "%s converter now disconnected from ttyUSB%d\n",
107 driver->name, minor);
108
109 return retval;
110}
111
112int usb_serial_bus_register(struct usb_serial_device_type *device)
113{
114 int retval;
115
116 if (device->short_name)
117 device->driver.name = (char *)device->short_name;
118 else
119 device->driver.name = (char *)device->name;
120 device->driver.bus = &usb_serial_bus_type;
121 device->driver.probe = usb_serial_device_probe;
122 device->driver.remove = usb_serial_device_remove;
123 device->driver.owner = device->owner;
124
125 retval = driver_register(&device->driver);
126
127 return retval;
128}
129
130void usb_serial_bus_deregister(struct usb_serial_device_type *device)
131{
132 driver_unregister (&device->driver);
133}
134
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
new file mode 100644
index 000000000000..167f8ec56131
--- /dev/null
+++ b/drivers/usb/serial/console.c
@@ -0,0 +1,264 @@
1/*
2 * USB Serial Console driver
3 *
4 * Copyright (C) 2001 - 2002 Greg Kroah-Hartman (greg@kroah.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 *
10 * Thanks to Randy Dunlap for the original version of this code.
11 *
12 */
13
14#include <linux/config.h>
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/slab.h>
18#include <linux/tty.h>
19#include <linux/console.h>
20#include <linux/usb.h>
21
22static int debug;
23
24#include "usb-serial.h"
25
26struct usbcons_info {
27 int magic;
28 int break_flag;
29 struct usb_serial_port *port;
30};
31
32static struct usbcons_info usbcons_info;
33static struct console usbcons;
34
35/*
36 * ------------------------------------------------------------
37 * USB Serial console driver
38 *
39 * Much of the code here is copied from drivers/char/serial.c
40 * and implements a phony serial console in the same way that
41 * serial.c does so that in case some software queries it,
42 * it will get the same results.
43 *
44 * Things that are different from the way the serial port code
45 * does things, is that we call the lower level usb-serial
46 * driver code to initialize the device, and we set the initial
47 * console speeds based on the command line arguments.
48 * ------------------------------------------------------------
49 */
50
51
52/*
53 * The parsing of the command line works exactly like the
54 * serial.c code, except that the specifier is "ttyUSB" instead
55 * of "ttyS".
56 */
57static int __init usb_console_setup(struct console *co, char *options)
58{
59 struct usbcons_info *info = &usbcons_info;
60 int baud = 9600;
61 int bits = 8;
62 int parity = 'n';
63 int doflow = 0;
64 int cflag = CREAD | HUPCL | CLOCAL;
65 char *s;
66 struct usb_serial *serial;
67 struct usb_serial_port *port;
68 int retval = 0;
69 struct tty_struct *tty;
70 struct termios *termios;
71
72 dbg ("%s", __FUNCTION__);
73
74 if (options) {
75 baud = simple_strtoul(options, NULL, 10);
76 s = options;
77 while (*s >= '0' && *s <= '9')
78 s++;
79 if (*s)
80 parity = *s++;
81 if (*s)
82 bits = *s++ - '0';
83 if (*s)
84 doflow = (*s++ == 'r');
85 }
86
87 /* build a cflag setting */
88 switch (baud) {
89 case 1200:
90 cflag |= B1200;
91 break;
92 case 2400:
93 cflag |= B2400;
94 break;
95 case 4800:
96 cflag |= B4800;
97 break;
98 case 19200:
99 cflag |= B19200;
100 break;
101 case 38400:
102 cflag |= B38400;
103 break;
104 case 57600:
105 cflag |= B57600;
106 break;
107 case 115200:
108 cflag |= B115200;
109 break;
110 case 9600:
111 default:
112 cflag |= B9600;
113 /*
114 * Set this to a sane value to prevent a divide error
115 */
116 baud = 9600;
117 break;
118 }
119 switch (bits) {
120 case 7:
121 cflag |= CS7;
122 break;
123 default:
124 case 8:
125 cflag |= CS8;
126 break;
127 }
128 switch (parity) {
129 case 'o': case 'O':
130 cflag |= PARODD;
131 break;
132 case 'e': case 'E':
133 cflag |= PARENB;
134 break;
135 }
136 co->cflag = cflag;
137
138 /* grab the first serial port that happens to be connected */
139 serial = usb_serial_get_by_index(0);
140 if (serial == NULL) {
141 /* no device is connected yet, sorry :( */
142 err ("No USB device connected to ttyUSB0");
143 return -ENODEV;
144 }
145
146 port = serial->port[0];
147 port->tty = NULL;
148
149 info->port = port;
150
151 ++port->open_count;
152 if (port->open_count == 1) {
153 /* only call the device specific open if this
154 * is the first time the port is opened */
155 if (serial->type->open)
156 retval = serial->type->open(port, NULL);
157 else
158 retval = usb_serial_generic_open(port, NULL);
159 if (retval)
160 port->open_count = 0;
161 }
162
163 if (retval) {
164 err ("could not open USB console port");
165 return retval;
166 }
167
168 if (serial->type->set_termios) {
169 /* build up a fake tty structure so that the open call has something
170 * to look at to get the cflag value */
171 tty = kmalloc (sizeof (*tty), GFP_KERNEL);
172 if (!tty) {
173 err ("no more memory");
174 return -ENOMEM;
175 }
176 termios = kmalloc (sizeof (*termios), GFP_KERNEL);
177 if (!termios) {
178 err ("no more memory");
179 kfree (tty);
180 return -ENOMEM;
181 }
182 memset (tty, 0x00, sizeof(*tty));
183 memset (termios, 0x00, sizeof(*termios));
184 termios->c_cflag = cflag;
185 tty->termios = termios;
186 port->tty = tty;
187
188 /* set up the initial termios settings */
189 serial->type->set_termios(port, NULL);
190 port->tty = NULL;
191 kfree (termios);
192 kfree (tty);
193 }
194
195 return retval;
196}
197
198static void usb_console_write(struct console *co, const char *buf, unsigned count)
199{
200 static struct usbcons_info *info = &usbcons_info;
201 struct usb_serial_port *port = info->port;
202 struct usb_serial *serial;
203 int retval = -ENODEV;
204
205 if (!port)
206 return;
207 serial = port->serial;
208
209 if (count == 0)
210 return;
211
212 dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
213
214 if (!port->open_count) {
215 dbg ("%s - port not opened", __FUNCTION__);
216 goto exit;
217 }
218
219 /* pass on to the driver specific version of this function if it is available */
220 if (serial->type->write)
221 retval = serial->type->write(port, buf, count);
222 else
223 retval = usb_serial_generic_write(port, buf, count);
224
225exit:
226 dbg("%s - return value (if we had one): %d", __FUNCTION__, retval);
227}
228
229static struct console usbcons = {
230 .name = "ttyUSB",
231 .write = usb_console_write,
232 .setup = usb_console_setup,
233 .flags = CON_PRINTBUFFER,
234 .index = -1,
235};
236
237void usb_serial_console_init (int serial_debug, int minor)
238{
239 debug = serial_debug;
240
241 if (minor == 0) {
242 /*
243 * Call register_console() if this is the first device plugged
244 * in. If we call it earlier, then the callback to
245 * console_setup() will fail, as there is not a device seen by
246 * the USB subsystem yet.
247 */
248 /*
249 * Register console.
250 * NOTES:
251 * console_setup() is called (back) immediately (from register_console).
252 * console_write() is called immediately from register_console iff
253 * CON_PRINTBUFFER is set in flags.
254 */
255 dbg ("registering the USB serial console.");
256 register_console(&usbcons);
257 }
258}
259
260void usb_serial_console_exit (void)
261{
262 unregister_console(&usbcons);
263}
264
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
new file mode 100644
index 000000000000..7e9bb63eb466
--- /dev/null
+++ b/drivers/usb/serial/cp2101.c
@@ -0,0 +1,591 @@
1/*
2 * Silicon Laboratories CP2101/CP2102 USB to RS232 serial adaptor driver
3 *
4 * Copyright (C) 2005 Craig Shelley (craig@microtron.org.uk)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 *
10 */
11
12#include <linux/config.h>
13#include <linux/kernel.h>
14#include <linux/errno.h>
15#include <linux/slab.h>
16#include <linux/tty.h>
17#include <linux/tty_flip.h>
18#include <linux/module.h>
19#include <linux/moduleparam.h>
20#include <linux/usb.h>
21#include <asm/uaccess.h>
22#include "usb-serial.h"
23
24/*
25 * Version Information
26 */
27#define DRIVER_VERSION "v0.03"
28#define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver"
29
30/*
31 * Function Prototypes
32 */
33static int cp2101_open(struct usb_serial_port*, struct file*);
34static void cp2101_cleanup(struct usb_serial_port*);
35static void cp2101_close(struct usb_serial_port*, struct file*);
36static void cp2101_get_termios(struct usb_serial_port*);
37static void cp2101_set_termios(struct usb_serial_port*, struct termios*);
38static void cp2101_break_ctl(struct usb_serial_port*, int);
39static int cp2101_startup (struct usb_serial *);
40static void cp2101_shutdown(struct usb_serial*);
41
42
43static int debug;
44
45static struct usb_device_id id_table [] = {
46 {USB_DEVICE(0x10c4, 0xea60) }, /*Silicon labs factory default*/
47 {USB_DEVICE(0x10ab, 0x10c5) }, /*Siemens MC60 Cable*/
48 { } /* Terminating Entry*/
49};
50
51MODULE_DEVICE_TABLE (usb, id_table);
52
53static struct usb_driver cp2101_driver = {
54 .owner = THIS_MODULE,
55 .name = "CP2101",
56 .probe = usb_serial_probe,
57 .disconnect = usb_serial_disconnect,
58 .id_table = id_table,
59};
60
61static struct usb_serial_device_type cp2101_device = {
62 .owner = THIS_MODULE,
63 .name = "CP2101",
64 .id_table = id_table,
65 .num_interrupt_in = 0,
66 .num_bulk_in = 0,
67 .num_bulk_out = 0,
68 .num_ports = 1,
69 .open = cp2101_open,
70 .close = cp2101_close,
71 .break_ctl = cp2101_break_ctl,
72 .set_termios = cp2101_set_termios,
73 .attach = cp2101_startup,
74 .shutdown = cp2101_shutdown,
75};
76
77/*Config request types*/
78#define REQTYPE_HOST_TO_DEVICE 0x41
79#define REQTYPE_DEVICE_TO_HOST 0xc1
80
81/*Config SET requests. To GET, add 1 to the request number*/
82#define CP2101_UART 0x00 /*Enable / Disable*/
83#define CP2101_BAUDRATE 0x01 /*(BAUD_RATE_GEN_FREQ / baudrate)*/
84#define CP2101_BITS 0x03 /*0x(0)(data bits)(parity)(stop bits)*/
85#define CP2101_BREAK 0x05 /*On / Off*/
86#define CP2101_DTRRTS 0x07 /*101 / 202 ???*/
87#define CP2101_CONFIG_16 0x13 /*16 bytes of config data ???*/
88#define CP2101_CONFIG_6 0x19 /*6 bytes of config data ???*/
89
90/*CP2101_UART*/
91#define UART_ENABLE 0x0001
92#define UART_DISABLE 0x0000
93
94/*CP2101_BAUDRATE*/
95#define BAUD_RATE_GEN_FREQ 0x384000
96
97/*CP2101_BITS*/
98#define BITS_DATA_MASK 0X0f00
99#define BITS_DATA_6 0X0600
100#define BITS_DATA_7 0X0700
101#define BITS_DATA_8 0X0800
102#define BITS_DATA_9 0X0900
103
104#define BITS_PARITY_MASK 0x00f0
105#define BITS_PARITY_NONE 0x0000
106#define BITS_PARITY_ODD 0x0010
107#define BITS_PARITY_EVEN 0x0020
108#define BITS_PARITY_MARK 0x0030
109#define BITS_PARITY_SPACE 0x0040
110
111#define BITS_STOP_MASK 0x000f
112#define BITS_STOP_1 0x0000
113#define BITS_STOP_1_5 0x0001
114#define BITS_STOP_2 0x0002
115#define BREAK_ON 0x0000
116#define BREAK_OFF 0x0001
117
118
119static int cp2101_get_config(struct usb_serial_port* port, u8 request)
120{
121 struct usb_serial *serial = port->serial;
122 unsigned char buf[4];
123 unsigned int value;
124 int result, i;
125
126 /*For get requests, the request number must be incremented*/
127 request++;
128
129 /*Issue the request, attempting to read 4 bytes*/
130 result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0),
131 request, REQTYPE_DEVICE_TO_HOST, 0x0000,
132 0, buf, 4, 300);
133
134 if (result < 0) {
135 dev_err(&port->dev, "%s - Unable to send config request, "
136 "request=0x%x result=%d\n",
137 __FUNCTION__, request, result);
138 return result;
139 }
140
141 /*Assemble each byte read into an integer value*/
142 value = 0;
143 for (i=0; i<4 && i<result; i++)
144 value |= (buf[i] << (i * 8));
145
146 dbg( " %s - request=0x%x result=%d value=0x%x",
147 __FUNCTION__, request, result, value);
148
149 return value;
150}
151
152static int cp2101_set_config(struct usb_serial_port* port, u8 request, u16 value)
153{
154 struct usb_serial *serial = port->serial;
155 int result;
156 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0),
157 request, REQTYPE_HOST_TO_DEVICE, value,
158 0, NULL, 0, 300);
159
160 if (result <0) {
161 dev_err(&port->dev, "%s - Unable to send config request, "
162 "request=0x%x value=0x%x result=%d\n",
163 __FUNCTION__, request, value, result);
164 return result;
165 }
166
167 dbg(" %s - request=0x%x value=0x%x result=%d",
168 __FUNCTION__, request, value, result);
169
170 return 0;
171}
172
173static int cp2101_open (struct usb_serial_port *port, struct file *filp)
174{
175 struct usb_serial *serial = port->serial;
176 int result;
177
178 dbg("%s - port %d", __FUNCTION__, port->number);
179
180 if (cp2101_set_config(port, CP2101_UART, UART_ENABLE)) {
181 dev_err(&port->dev, "%s - Unable to enable UART\n",
182 __FUNCTION__);
183 return -EPROTO;
184 }
185
186 /* Start reading from the device */
187 usb_fill_bulk_urb (port->read_urb, serial->dev,
188 usb_rcvbulkpipe(serial->dev,
189 port->bulk_in_endpointAddress),
190 port->read_urb->transfer_buffer,
191 port->read_urb->transfer_buffer_length,
192 serial->type->read_bulk_callback,
193 port);
194 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
195 if (result) {
196 dev_err(&port->dev, "%s - failed resubmitting read urb, "
197 "error %d\n", __FUNCTION__, result);
198 return result;
199 }
200
201 /*Configure the termios structure*/
202 cp2101_get_termios(port);
203
204 return 0;
205}
206
207static void cp2101_cleanup (struct usb_serial_port *port)
208{
209 struct usb_serial *serial = port->serial;
210
211 dbg("%s - port %d", __FUNCTION__, port->number);
212
213 if (serial->dev) {
214 /* shutdown any bulk reads that might be going on */
215 if (serial->num_bulk_out)
216 usb_kill_urb(port->write_urb);
217 if (serial->num_bulk_in)
218 usb_kill_urb(port->read_urb);
219 }
220}
221
222static void cp2101_close (struct usb_serial_port *port, struct file * filp)
223{
224 dbg("%s - port %d", __FUNCTION__, port->number);
225
226 /* shutdown our urbs */
227 dbg("%s - shutting down urbs", __FUNCTION__);
228 usb_kill_urb(port->write_urb);
229 usb_kill_urb(port->read_urb);
230
231 cp2101_set_config(port, CP2101_UART, UART_DISABLE);
232}
233
234/* cp2101_get_termios*/
235/* Reads the baud rate, data bits, parity and stop bits from the device*/
236/* Corrects any unsupported values*/
237/* Configures the termios structure to reflect the state of the device*/
238static void cp2101_get_termios (struct usb_serial_port *port)
239{
240 unsigned int cflag;
241 int baud;
242 int bits;
243
244 dbg("%s - port %d", __FUNCTION__, port->number);
245
246 if ((!port->tty) || (!port->tty->termios)) {
247 dbg("%s - no tty structures", __FUNCTION__);
248 return;
249 }
250 cflag = port->tty->termios->c_cflag;
251
252 baud = cp2101_get_config(port, CP2101_BAUDRATE);
253 /*Convert to baudrate*/
254 if (baud)
255 baud = BAUD_RATE_GEN_FREQ / baud;
256
257 dbg("%s - baud rate = %d", __FUNCTION__, baud);
258 cflag &= ~CBAUD;
259 switch (baud) {
260 /* The baud rates which are commented out below
261 * appear to be supported by the device
262 * but are non-standard
263 */
264 case 600: cflag |= B600; break;
265 case 1200: cflag |= B1200; break;
266 case 1800: cflag |= B1800; break;
267 case 2400: cflag |= B2400; break;
268 case 4800: cflag |= B4800; break;
269 /*case 7200: cflag |= B7200; break;*/
270 case 9600: cflag |= B9600; break;
271 /*case 14400: cflag |= B14400; break;*/
272 case 19200: cflag |= B19200; break;
273 /*case 28800: cflag |= B28800; break;*/
274 case 38400: cflag |= B38400; break;
275 /*case 55854: cflag |= B55054; break;*/
276 case 57600: cflag |= B57600; break;
277 case 115200: cflag |= B115200; break;
278 /*case 127117: cflag |= B127117; break;*/
279 case 230400: cflag |= B230400; break;
280 case 460800: cflag |= B460800; break;
281 case 921600: cflag |= B921600; break;
282 /*case 3686400: cflag |= B3686400; break;*/
283 default:
284 dbg("%s - Baud rate is not supported, "
285 "using 9600 baud", __FUNCTION__);
286 cflag |= B9600;
287 cp2101_set_config(port, CP2101_BAUDRATE,
288 (BAUD_RATE_GEN_FREQ/9600));
289 break;
290 }
291
292 bits = cp2101_get_config(port, CP2101_BITS);
293 cflag &= ~CSIZE;
294 switch(bits & BITS_DATA_MASK) {
295 case BITS_DATA_6:
296 dbg("%s - data bits = 6", __FUNCTION__);
297 cflag |= CS6;
298 break;
299 case BITS_DATA_7:
300 dbg("%s - data bits = 7", __FUNCTION__);
301 cflag |= CS7;
302 break;
303 case BITS_DATA_8:
304 dbg("%s - data bits = 8", __FUNCTION__);
305 cflag |= CS8;
306 break;
307 case BITS_DATA_9:
308 dbg("%s - data bits = 9 (not supported, "
309 "using 8 data bits)", __FUNCTION__);
310 cflag |= CS8;
311 bits &= ~BITS_DATA_MASK;
312 bits |= BITS_DATA_8;
313 cp2101_set_config(port, CP2101_BITS, bits);
314 break;
315 default:
316 dbg("%s - Unknown number of data bits, "
317 "using 8", __FUNCTION__);
318 cflag |= CS8;
319 bits &= ~BITS_DATA_MASK;
320 bits |= BITS_DATA_8;
321 cp2101_set_config(port, CP2101_BITS, bits);
322 break;
323 }
324
325 switch(bits & BITS_PARITY_MASK) {
326 case BITS_PARITY_NONE:
327 dbg("%s - parity = NONE", __FUNCTION__);
328 cflag &= ~PARENB;
329 break;
330 case BITS_PARITY_ODD:
331 dbg("%s - parity = ODD", __FUNCTION__);
332 cflag |= (PARENB|PARODD);
333 break;
334 case BITS_PARITY_EVEN:
335 dbg("%s - parity = EVEN", __FUNCTION__);
336 cflag &= ~PARODD;
337 cflag |= PARENB;
338 break;
339 case BITS_PARITY_MARK:
340 dbg("%s - parity = MARK (not supported, "
341 "disabling parity)", __FUNCTION__);
342 cflag &= ~PARENB;
343 bits &= ~BITS_PARITY_MASK;
344 cp2101_set_config(port, CP2101_BITS, bits);
345 break;
346 case BITS_PARITY_SPACE:
347 dbg("%s - parity = SPACE (not supported, "
348 "disabling parity)", __FUNCTION__);
349 cflag &= ~PARENB;
350 bits &= ~BITS_PARITY_MASK;
351 cp2101_set_config(port, CP2101_BITS, bits);
352 break;
353 default:
354 dbg("%s - Unknown parity mode, "
355 "disabling parity", __FUNCTION__);
356 cflag &= ~PARENB;
357 bits &= ~BITS_PARITY_MASK;
358 cp2101_set_config(port, CP2101_BITS, bits);
359 break;
360 }
361
362 cflag &= ~CSTOPB;
363 switch(bits & BITS_STOP_MASK) {
364 case BITS_STOP_1:
365 dbg("%s - stop bits = 1", __FUNCTION__);
366 break;
367 case BITS_STOP_1_5:
368 dbg("%s - stop bits = 1.5 (not supported, "
369 "using 1 stop bit", __FUNCTION__);
370 bits &= ~BITS_STOP_MASK;
371 cp2101_set_config(port, CP2101_BITS, bits);
372 break;
373 case BITS_STOP_2:
374 dbg("%s - stop bits = 2", __FUNCTION__);
375 cflag |= CSTOPB;
376 break;
377 default:
378 dbg("%s - Unknown number of stop bits, "
379 "using 1 stop bit", __FUNCTION__);
380 bits &= ~BITS_STOP_MASK;
381 cp2101_set_config(port, CP2101_BITS, bits);
382 break;
383 }
384
385 port->tty->termios->c_cflag = cflag;
386}
387
388static void cp2101_set_termios (struct usb_serial_port *port,
389 struct termios *old_termios)
390{
391 unsigned int cflag, old_cflag=0;
392 int baud=0;
393 int bits;
394
395 dbg("%s - port %d", __FUNCTION__, port->number);
396
397 if ((!port->tty) || (!port->tty->termios)) {
398 dbg("%s - no tty structures", __FUNCTION__);
399 return;
400 }
401 cflag = port->tty->termios->c_cflag;
402
403 /* check that they really want us to change something */
404 if (old_termios) {
405 if ((cflag == old_termios->c_cflag) &&
406 (RELEVANT_IFLAG(port->tty->termios->c_iflag)
407 == RELEVANT_IFLAG(old_termios->c_iflag))) {
408 dbg("%s - nothing to change...", __FUNCTION__);
409 return;
410 }
411
412 old_cflag = old_termios->c_cflag;
413 }
414
415 /* If the baud rate is to be updated*/
416 if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
417 switch (cflag & CBAUD) {
418 /* The baud rates which are commented out below
419 * appear to be supported by the device
420 * but are non-standard
421 */
422 case B0: baud = 0; break;
423 case B600: baud = 600; break;
424 case B1200: baud = 1200; break;
425 case B1800: baud = 1800; break;
426 case B2400: baud = 2400; break;
427 case B4800: baud = 4800; break;
428 /*case B7200: baud = 7200; break;*/
429 case B9600: baud = 9600; break;
430 /*ase B14400: baud = 14400; break;*/
431 case B19200: baud = 19200; break;
432 /*case B28800: baud = 28800; break;*/
433 case B38400: baud = 38400; break;
434 /*case B55854: baud = 55054; break;*/
435 case B57600: baud = 57600; break;
436 case B115200: baud = 115200; break;
437 /*case B127117: baud = 127117; break;*/
438 case B230400: baud = 230400; break;
439 case B460800: baud = 460800; break;
440 case B921600: baud = 921600; break;
441 /*case B3686400: baud = 3686400; break;*/
442 default:
443 dev_err(&port->dev, "cp2101 driver does not "
444 "support the baudrate requested\n");
445 break;
446 }
447
448 if (baud) {
449 dbg("%s - Setting baud rate to %d baud", __FUNCTION__,
450 baud);
451 if (cp2101_set_config(port, CP2101_BAUDRATE,
452 (BAUD_RATE_GEN_FREQ / baud)))
453 dev_err(&port->dev, "Baud rate requested not "
454 "supported by device\n");
455 }
456 }
457
458 /*If the number of data bits is to be updated*/
459 if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
460 bits = cp2101_get_config(port, CP2101_BITS);
461 bits &= ~BITS_DATA_MASK;
462 switch (cflag & CSIZE) {
463 case CS6:
464 bits |= BITS_DATA_6;
465 dbg("%s - data bits = 6", __FUNCTION__);
466 break;
467 case CS7:
468 bits |= BITS_DATA_7;
469 dbg("%s - data bits = 7", __FUNCTION__);
470 break;
471 case CS8:
472 bits |= BITS_DATA_8;
473 dbg("%s - data bits = 8", __FUNCTION__);
474 break;
475 /*case CS9:
476 bits |= BITS_DATA_9;
477 dbg("%s - data bits = 9", __FUNCTION__);
478 break;*/
479 default:
480 dev_err(&port->dev, "cp2101 driver does not "
481 "support the number of bits requested,"
482 " using 8 bit mode\n");
483 bits |= BITS_DATA_8;
484 break;
485 }
486 if (cp2101_set_config(port, CP2101_BITS, bits))
487 dev_err(&port->dev, "Number of data bits requested "
488 "not supported by device\n");
489 }
490
491 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) {
492 bits = cp2101_get_config(port, CP2101_BITS);
493 bits &= ~BITS_PARITY_MASK;
494 if (cflag & PARENB) {
495 if (cflag & PARODD) {
496 bits |= BITS_PARITY_ODD;
497 dbg("%s - parity = ODD", __FUNCTION__);
498 } else {
499 bits |= BITS_PARITY_EVEN;
500 dbg("%s - parity = EVEN", __FUNCTION__);
501 }
502 }
503 if (cp2101_set_config(port, CP2101_BITS, bits))
504 dev_err(&port->dev, "Parity mode not supported "
505 "by device\n");
506 }
507
508 if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
509 bits = cp2101_get_config(port, CP2101_BITS);
510 bits &= ~BITS_STOP_MASK;
511 if (cflag & CSTOPB) {
512 bits |= BITS_STOP_2;
513 dbg("%s - stop bits = 2", __FUNCTION__);
514 } else {
515 bits |= BITS_STOP_1;
516 dbg("%s - stop bits = 1", __FUNCTION__);
517 }
518 if (cp2101_set_config(port, CP2101_BITS, bits))
519 dev_err(&port->dev, "Number of stop bits requested "
520 "not supported by device\n");
521 }
522}
523
524static void cp2101_break_ctl (struct usb_serial_port *port, int break_state)
525{
526 u16 state;
527
528 dbg("%s - port %d", __FUNCTION__, port->number);
529 if (break_state == 0)
530 state = BREAK_OFF;
531 else
532 state = BREAK_ON;
533 dbg("%s - turning break %s", __FUNCTION__,
534 state==BREAK_OFF ? "off" : "on");
535 cp2101_set_config(port, CP2101_BREAK, state);
536}
537
538static int cp2101_startup (struct usb_serial *serial)
539{
540 /*CP2101 buffers behave strangely unless device is reset*/
541 usb_reset_device(serial->dev);
542 return 0;
543}
544
545static void cp2101_shutdown (struct usb_serial *serial)
546{
547 int i;
548
549 dbg("%s", __FUNCTION__);
550
551 /* stop reads and writes on all ports */
552 for (i=0; i < serial->num_ports; ++i) {
553 cp2101_cleanup(serial->port[i]);
554 }
555}
556
557static int __init cp2101_init (void)
558{
559 int retval;
560
561 retval = usb_serial_register(&cp2101_device);
562 if (retval)
563 return retval; /*Failed to register*/
564
565 retval = usb_register(&cp2101_driver);
566 if (retval) {
567 /*Failed to register*/
568 usb_serial_deregister(&cp2101_device);
569 return retval;
570 }
571
572 /*Success*/
573 info(DRIVER_DESC " " DRIVER_VERSION);
574 return 0;
575}
576
577static void __exit cp2101_exit (void)
578{
579 usb_deregister (&cp2101_driver);
580 usb_serial_deregister (&cp2101_device);
581}
582
583module_init(cp2101_init);
584module_exit(cp2101_exit);
585
586MODULE_DESCRIPTION(DRIVER_DESC);
587MODULE_VERSION(DRIVER_VERSION);
588MODULE_LICENSE("GPL");
589
590module_param(debug, bool, S_IRUGO | S_IWUSR);
591MODULE_PARM_DESC(debug, "Enable verbose debugging messages");
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
new file mode 100644
index 000000000000..46a204cd40e1
--- /dev/null
+++ b/drivers/usb/serial/cyberjack.c
@@ -0,0 +1,514 @@
1/*
2 * REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver
3 *
4 * Copyright (C) 2001 REINER SCT
5 * Author: Matthias Bruestle
6 *
7 * Contact: support@reiner-sct.com (see MAINTAINERS)
8 *
9 * This program is largely derived from work by the linux-usb group
10 * and associated source files. Please see the usb/serial files for
11 * individual credits and copyrights.
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * Thanks to Greg Kroah-Hartman (greg@kroah.com) for his help and
19 * patience.
20 *
21 * In case of problems, please write to the contact e-mail address
22 * mentioned above.
23 *
24 * Please note that later models of the cyberjack reader family are
25 * supported by a libusb-based userspace device driver.
26 *
27 * Homepage: http://www.reiner-sct.de/support/treiber_cyberjack.php#linux
28 */
29
30
31#include <linux/config.h>
32#include <linux/kernel.h>
33#include <linux/errno.h>
34#include <linux/init.h>
35#include <linux/slab.h>
36#include <linux/tty.h>
37#include <linux/tty_driver.h>
38#include <linux/tty_flip.h>
39#include <linux/module.h>
40#include <linux/spinlock.h>
41#include <asm/uaccess.h>
42#include <linux/usb.h>
43#include "usb-serial.h"
44
45#define CYBERJACK_LOCAL_BUF_SIZE 32
46
47static int debug;
48
49/*
50 * Version Information
51 */
52#define DRIVER_VERSION "v1.01"
53#define DRIVER_AUTHOR "Matthias Bruestle"
54#define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver"
55
56
57#define CYBERJACK_VENDOR_ID 0x0C4B
58#define CYBERJACK_PRODUCT_ID 0x0100
59
60/* Function prototypes */
61static int cyberjack_startup (struct usb_serial *serial);
62static void cyberjack_shutdown (struct usb_serial *serial);
63static int cyberjack_open (struct usb_serial_port *port, struct file *filp);
64static void cyberjack_close (struct usb_serial_port *port, struct file *filp);
65static int cyberjack_write (struct usb_serial_port *port, const unsigned char *buf, int count);
66static int cyberjack_write_room( struct usb_serial_port *port );
67static void cyberjack_read_int_callback (struct urb *urb, struct pt_regs *regs);
68static void cyberjack_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
69static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
70
71static struct usb_device_id id_table [] = {
72 { USB_DEVICE(CYBERJACK_VENDOR_ID, CYBERJACK_PRODUCT_ID) },
73 { } /* Terminating entry */
74};
75
76MODULE_DEVICE_TABLE (usb, id_table);
77
78static struct usb_driver cyberjack_driver = {
79 .owner = THIS_MODULE,
80 .name = "cyberjack",
81 .probe = usb_serial_probe,
82 .disconnect = usb_serial_disconnect,
83 .id_table = id_table,
84};
85
86static struct usb_serial_device_type cyberjack_device = {
87 .owner = THIS_MODULE,
88 .name = "Reiner SCT Cyberjack USB card reader",
89 .short_name = "cyberjack",
90 .id_table = id_table,
91 .num_interrupt_in = 1,
92 .num_bulk_in = 1,
93 .num_bulk_out = 1,
94 .num_ports = 1,
95 .attach = cyberjack_startup,
96 .shutdown = cyberjack_shutdown,
97 .open = cyberjack_open,
98 .close = cyberjack_close,
99 .write = cyberjack_write,
100 .write_room = cyberjack_write_room,
101 .read_int_callback = cyberjack_read_int_callback,
102 .read_bulk_callback = cyberjack_read_bulk_callback,
103 .write_bulk_callback = cyberjack_write_bulk_callback,
104};
105
106struct cyberjack_private {
107 spinlock_t lock; /* Lock for SMP */
108 short rdtodo; /* Bytes still to read */
109 unsigned char wrbuf[5*64]; /* Buffer for collecting data to write */
110 short wrfilled; /* Overall data size we already got */
111 short wrsent; /* Data already sent */
112};
113
114/* do some startup allocations not currently performed by usb_serial_probe() */
115static int cyberjack_startup (struct usb_serial *serial)
116{
117 struct cyberjack_private *priv;
118 int i;
119
120 dbg("%s", __FUNCTION__);
121
122 /* allocate the private data structure */
123 priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);
124 if (!priv)
125 return -ENOMEM;
126
127 /* set initial values */
128 spin_lock_init(&priv->lock);
129 priv->rdtodo = 0;
130 priv->wrfilled = 0;
131 priv->wrsent = 0;
132 usb_set_serial_port_data(serial->port[0], priv);
133
134 init_waitqueue_head(&serial->port[0]->write_wait);
135
136 for (i = 0; i < serial->num_ports; ++i) {
137 int result;
138 serial->port[i]->interrupt_in_urb->dev = serial->dev;
139 result = usb_submit_urb(serial->port[i]->interrupt_in_urb,
140 GFP_KERNEL);
141 if (result)
142 err(" usb_submit_urb(read int) failed");
143 dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);
144 }
145
146 return( 0 );
147}
148
149static void cyberjack_shutdown (struct usb_serial *serial)
150{
151 int i;
152
153 dbg("%s", __FUNCTION__);
154
155 for (i=0; i < serial->num_ports; ++i) {
156 usb_kill_urb(serial->port[i]->interrupt_in_urb);
157 /* My special items, the standard routines free my urbs */
158 kfree(usb_get_serial_port_data(serial->port[i]));
159 usb_set_serial_port_data(serial->port[i], NULL);
160 }
161}
162
163static int cyberjack_open (struct usb_serial_port *port, struct file *filp)
164{
165 struct cyberjack_private *priv;
166 unsigned long flags;
167 int result = 0;
168
169 dbg("%s - port %d", __FUNCTION__, port->number);
170
171 dbg("%s - usb_clear_halt", __FUNCTION__ );
172 usb_clear_halt(port->serial->dev, port->write_urb->pipe);
173
174 /* force low_latency on so that our tty_push actually forces
175 * the data through, otherwise it is scheduled, and with high
176 * data rates (like with OHCI) data can get lost.
177 */
178 port->tty->low_latency = 1;
179
180 priv = usb_get_serial_port_data(port);
181 spin_lock_irqsave(&priv->lock, flags);
182 priv->rdtodo = 0;
183 priv->wrfilled = 0;
184 priv->wrsent = 0;
185 spin_unlock_irqrestore(&priv->lock, flags);
186
187 return result;
188}
189
190static void cyberjack_close (struct usb_serial_port *port, struct file *filp)
191{
192 dbg("%s - port %d", __FUNCTION__, port->number);
193
194 if (port->serial->dev) {
195 /* shutdown any bulk reads that might be going on */
196 usb_kill_urb(port->write_urb);
197 usb_kill_urb(port->read_urb);
198 }
199}
200
201static int cyberjack_write (struct usb_serial_port *port, const unsigned char *buf, int count)
202{
203 struct usb_serial *serial = port->serial;
204 struct cyberjack_private *priv = usb_get_serial_port_data(port);
205 unsigned long flags;
206 int result;
207 int wrexpected;
208
209 dbg("%s - port %d", __FUNCTION__, port->number);
210
211 if (count == 0) {
212 dbg("%s - write request of 0 bytes", __FUNCTION__);
213 return (0);
214 }
215
216 if (port->write_urb->status == -EINPROGRESS) {
217 dbg("%s - already writing", __FUNCTION__);
218 return (0);
219 }
220
221 spin_lock_irqsave(&priv->lock, flags);
222
223 if( (count+priv->wrfilled)>sizeof(priv->wrbuf) ) {
224 /* To much data for buffer. Reset buffer. */
225 priv->wrfilled=0;
226 spin_unlock_irqrestore(&priv->lock, flags);
227 return (0);
228 }
229
230 /* Copy data */
231 memcpy (priv->wrbuf+priv->wrfilled, buf, count);
232
233 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count,
234 priv->wrbuf+priv->wrfilled);
235 priv->wrfilled += count;
236
237 if( priv->wrfilled >= 3 ) {
238 wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
239 dbg("%s - expected data: %d", __FUNCTION__, wrexpected);
240 } else {
241 wrexpected = sizeof(priv->wrbuf);
242 }
243
244 if( priv->wrfilled >= wrexpected ) {
245 /* We have enough data to begin transmission */
246 int length;
247
248 dbg("%s - transmitting data (frame 1)", __FUNCTION__);
249 length = (wrexpected > port->bulk_out_size) ? port->bulk_out_size : wrexpected;
250
251 memcpy (port->write_urb->transfer_buffer, priv->wrbuf, length );
252 priv->wrsent=length;
253
254 /* set up our urb */
255 usb_fill_bulk_urb(port->write_urb, serial->dev,
256 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
257 port->write_urb->transfer_buffer, length,
258 ((serial->type->write_bulk_callback) ?
259 serial->type->write_bulk_callback :
260 cyberjack_write_bulk_callback),
261 port);
262
263 /* send the data out the bulk port */
264 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
265 if (result) {
266 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
267 /* Throw away data. No better idea what to do with it. */
268 priv->wrfilled=0;
269 priv->wrsent=0;
270 spin_unlock_irqrestore(&priv->lock, flags);
271 return 0;
272 }
273
274 dbg("%s - priv->wrsent=%d", __FUNCTION__,priv->wrsent);
275 dbg("%s - priv->wrfilled=%d", __FUNCTION__,priv->wrfilled);
276
277 if( priv->wrsent>=priv->wrfilled ) {
278 dbg("%s - buffer cleaned", __FUNCTION__);
279 memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );
280 priv->wrfilled=0;
281 priv->wrsent=0;
282 }
283 }
284
285 spin_unlock_irqrestore(&priv->lock, flags);
286
287 return (count);
288}
289
290static int cyberjack_write_room( struct usb_serial_port *port )
291{
292 return CYBERJACK_LOCAL_BUF_SIZE;
293}
294
295static void cyberjack_read_int_callback( struct urb *urb, struct pt_regs *regs )
296{
297 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
298 struct cyberjack_private *priv = usb_get_serial_port_data(port);
299 unsigned char *data = urb->transfer_buffer;
300 int result;
301
302 dbg("%s - port %d", __FUNCTION__, port->number);
303
304 /* the urb might have been killed. */
305 if (urb->status)
306 return;
307
308 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
309
310 /* React only to interrupts signaling a bulk_in transfer */
311 if( (urb->actual_length==4) && (data[0]==0x01) ) {
312 short old_rdtodo;
313 int result;
314
315 /* This is a announcement of coming bulk_ins. */
316 unsigned short size = ((unsigned short)data[3]<<8)+data[2]+3;
317
318 spin_lock(&priv->lock);
319
320 old_rdtodo = priv->rdtodo;
321
322 if( (old_rdtodo+size)<(old_rdtodo) ) {
323 dbg( "To many bulk_in urbs to do." );
324 spin_unlock(&priv->lock);
325 goto resubmit;
326 }
327
328 /* "+=" is probably more fault tollerant than "=" */
329 priv->rdtodo += size;
330
331 dbg("%s - rdtodo: %d", __FUNCTION__, priv->rdtodo);
332
333 spin_unlock(&priv->lock);
334
335 if( !old_rdtodo ) {
336 port->read_urb->dev = port->serial->dev;
337 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
338 if( result )
339 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
340 dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);
341 }
342 }
343
344resubmit:
345 port->interrupt_in_urb->dev = port->serial->dev;
346 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
347 if (result)
348 err(" usb_submit_urb(read int) failed");
349 dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);
350}
351
352static void cyberjack_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
353{
354 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
355 struct cyberjack_private *priv = usb_get_serial_port_data(port);
356 struct tty_struct *tty;
357 unsigned char *data = urb->transfer_buffer;
358 short todo;
359 int i;
360 int result;
361
362 dbg("%s - port %d", __FUNCTION__, port->number);
363
364 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
365 if (urb->status) {
366 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
367 return;
368 }
369
370 tty = port->tty;
371 if (!tty) {
372 dbg("%s - ignoring since device not open\n", __FUNCTION__);
373 return;
374 }
375 if (urb->actual_length) {
376 for (i = 0; i < urb->actual_length ; ++i) {
377 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
378 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
379 tty_flip_buffer_push(tty);
380 }
381 /* this doesn't actually push the data through unless tty->low_latency is set */
382 tty_insert_flip_char(tty, data[i], 0);
383 }
384 tty_flip_buffer_push(tty);
385 }
386
387 spin_lock(&priv->lock);
388
389 /* Reduce urbs to do by one. */
390 priv->rdtodo-=urb->actual_length;
391 /* Just to be sure */
392 if ( priv->rdtodo<0 ) priv->rdtodo = 0;
393 todo = priv->rdtodo;
394
395 spin_unlock(&priv->lock);
396
397 dbg("%s - rdtodo: %d", __FUNCTION__, todo);
398
399 /* Continue to read if we have still urbs to do. */
400 if( todo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) {
401 port->read_urb->dev = port->serial->dev;
402 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
403 if (result)
404 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
405 dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);
406 }
407}
408
409static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
410{
411 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
412 struct cyberjack_private *priv = usb_get_serial_port_data(port);
413
414 dbg("%s - port %d", __FUNCTION__, port->number);
415
416 if (urb->status) {
417 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
418 return;
419 }
420
421 spin_lock(&priv->lock);
422
423 /* only do something if we have more data to send */
424 if( priv->wrfilled ) {
425 int length, blksize, result;
426
427 if (port->write_urb->status == -EINPROGRESS) {
428 dbg("%s - already writing", __FUNCTION__);
429 spin_unlock(&priv->lock);
430 return;
431 }
432
433 dbg("%s - transmitting data (frame n)", __FUNCTION__);
434
435 length = ((priv->wrfilled - priv->wrsent) > port->bulk_out_size) ?
436 port->bulk_out_size : (priv->wrfilled - priv->wrsent);
437
438 memcpy (port->write_urb->transfer_buffer, priv->wrbuf + priv->wrsent,
439 length );
440 priv->wrsent+=length;
441
442 /* set up our urb */
443 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
444 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress),
445 port->write_urb->transfer_buffer, length,
446 ((port->serial->type->write_bulk_callback) ?
447 port->serial->type->write_bulk_callback :
448 cyberjack_write_bulk_callback),
449 port);
450
451 /* send the data out the bulk port */
452 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
453 if (result) {
454 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
455 /* Throw away data. No better idea what to do with it. */
456 priv->wrfilled=0;
457 priv->wrsent=0;
458 goto exit;
459 }
460
461 dbg("%s - priv->wrsent=%d", __FUNCTION__,priv->wrsent);
462 dbg("%s - priv->wrfilled=%d", __FUNCTION__,priv->wrfilled);
463
464 blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
465
466 if( (priv->wrsent>=priv->wrfilled) || (priv->wrsent>=blksize) ) {
467 dbg("%s - buffer cleaned", __FUNCTION__);
468 memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );
469 priv->wrfilled=0;
470 priv->wrsent=0;
471 }
472 }
473
474exit:
475 spin_unlock(&priv->lock);
476 schedule_work(&port->work);
477}
478
479static int __init cyberjack_init (void)
480{
481 int retval;
482 retval = usb_serial_register(&cyberjack_device);
483 if (retval)
484 goto failed_usb_serial_register;
485 retval = usb_register(&cyberjack_driver);
486 if (retval)
487 goto failed_usb_register;
488
489 info(DRIVER_VERSION " " DRIVER_AUTHOR);
490 info(DRIVER_DESC);
491
492 return 0;
493failed_usb_register:
494 usb_serial_deregister(&cyberjack_device);
495failed_usb_serial_register:
496 return retval;
497}
498
499static void __exit cyberjack_exit (void)
500{
501 usb_deregister (&cyberjack_driver);
502 usb_serial_deregister (&cyberjack_device);
503}
504
505module_init(cyberjack_init);
506module_exit(cyberjack_exit);
507
508MODULE_AUTHOR( DRIVER_AUTHOR );
509MODULE_DESCRIPTION( DRIVER_DESC );
510MODULE_VERSION( DRIVER_VERSION );
511MODULE_LICENSE("GPL");
512
513module_param(debug, bool, S_IRUGO | S_IWUSR);
514MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
new file mode 100644
index 000000000000..db8f472d9e3f
--- /dev/null
+++ b/drivers/usb/serial/cypress_m8.c
@@ -0,0 +1,1538 @@
1/*
2 * USB Cypress M8 driver
3 *
4 * Copyright (C) 2004
5 * Lonnie Mendez (dignome@gmail.com)
6 * Copyright (C) 2003,2004
7 * Neil Whelchel (koyama@firstlight.net)
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver
15 *
16 * See http://geocities.com/i0xox0i for information on this driver and the
17 * earthmate usb device.
18 *
19 *
20 * Lonnie Mendez <dignome@gmail.com>
21 * 12-15-2004
22 * Incorporated write buffering from pl2303 driver. Fixed bug with line
23 * handling so both lines are raised in cypress_open. (was dropping rts)
24 * Various code cleanups made as well along with other misc bug fixes.
25 *
26 * Lonnie Mendez <dignome@gmail.com>
27 * 04-10-2004
28 * Driver modified to support dynamic line settings. Various improvments
29 * and features.
30 *
31 * Neil Whelchel
32 * 10-2003
33 * Driver first released.
34 *
35 *
36 * Long Term TODO:
37 * Improve transfer speeds - both read/write are somewhat slow
38 * at this point.
39 * Improve debugging. Show modem line status with debug output and
40 * implement filtering for certain data as a module parameter.
41 */
42
43/* Thanks to Neil Whelchel for writing the first cypress m8 implementation for linux. */
44/* Thanks to cypress for providing references for the hid reports. */
45/* Thanks to Jiang Zhang for providing links and for general help. */
46/* Code originates and was built up from ftdi_sio, belkin, pl2303 and others. */
47
48
49#include <linux/config.h>
50#include <linux/kernel.h>
51#include <linux/errno.h>
52#include <linux/init.h>
53#include <linux/slab.h>
54#include <linux/tty.h>
55#include <linux/tty_driver.h>
56#include <linux/tty_flip.h>
57#include <linux/module.h>
58#include <linux/moduleparam.h>
59#include <linux/spinlock.h>
60#include <linux/usb.h>
61#include <linux/serial.h>
62#include <linux/delay.h>
63#include <asm/uaccess.h>
64
65#include "usb-serial.h"
66#include "cypress_m8.h"
67
68
69#ifdef CONFIG_USB_SERIAL_DEBUG
70 static int debug = 1;
71#else
72 static int debug;
73#endif
74static int stats;
75
76/*
77 * Version Information
78 */
79#define DRIVER_VERSION "v1.08"
80#define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>"
81#define DRIVER_DESC "Cypress USB to Serial Driver"
82
83/* write buffer size defines */
84#define CYPRESS_BUF_SIZE 1024
85#define CYPRESS_CLOSING_WAIT (30*HZ)
86
87static struct usb_device_id id_table_earthmate [] = {
88 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) },
89 { } /* Terminating entry */
90};
91
92static struct usb_device_id id_table_cyphidcomrs232 [] = {
93 { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
94 { } /* Terminating entry */
95};
96
97static struct usb_device_id id_table_combined [] = {
98 { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) },
99 { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
100 { } /* Terminating entry */
101};
102
103MODULE_DEVICE_TABLE (usb, id_table_combined);
104
105static struct usb_driver cypress_driver = {
106 .name = "cypress",
107 .probe = usb_serial_probe,
108 .disconnect = usb_serial_disconnect,
109 .id_table = id_table_combined,
110};
111
112struct cypress_private {
113 spinlock_t lock; /* private lock */
114 int chiptype; /* identifier of device, for quirks/etc */
115 int bytes_in; /* used for statistics */
116 int bytes_out; /* used for statistics */
117 int cmd_count; /* used for statistics */
118 int cmd_ctrl; /* always set this to 1 before issuing a command */
119 struct cypress_buf *buf; /* write buffer */
120 int write_urb_in_use; /* write urb in use indicator */
121 int termios_initialized;
122 __u8 line_control; /* holds dtr / rts value */
123 __u8 current_status; /* received from last read - info on dsr,cts,cd,ri,etc */
124 __u8 current_config; /* stores the current configuration byte */
125 __u8 rx_flags; /* throttling - used from whiteheat/ftdi_sio */
126 int baud_rate; /* stores current baud rate in integer form */
127 int cbr_mask; /* stores current baud rate in masked form */
128 int isthrottled; /* if throttled, discard reads */
129 wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */
130 char prev_status, diff_status; /* used for TIOCMIWAIT */
131 /* we pass a pointer to this as the arguement sent to cypress_set_termios old_termios */
132 struct termios tmp_termios; /* stores the old termios settings */
133 char calledfromopen; /* used when issuing lines on open - fixes rts drop bug */
134};
135
136/* write buffer structure */
137struct cypress_buf {
138 unsigned int buf_size;
139 char *buf_buf;
140 char *buf_get;
141 char *buf_put;
142};
143
144/* function prototypes for the Cypress USB to serial device */
145static int cypress_earthmate_startup (struct usb_serial *serial);
146static int cypress_hidcom_startup (struct usb_serial *serial);
147static void cypress_shutdown (struct usb_serial *serial);
148static int cypress_open (struct usb_serial_port *port, struct file *filp);
149static void cypress_close (struct usb_serial_port *port, struct file *filp);
150static int cypress_write (struct usb_serial_port *port, const unsigned char *buf, int count);
151static void cypress_send (struct usb_serial_port *port);
152static int cypress_write_room (struct usb_serial_port *port);
153static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
154static void cypress_set_termios (struct usb_serial_port *port, struct termios * old);
155static int cypress_tiocmget (struct usb_serial_port *port, struct file *file);
156static int cypress_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear);
157static int cypress_chars_in_buffer (struct usb_serial_port *port);
158static void cypress_throttle (struct usb_serial_port *port);
159static void cypress_unthrottle (struct usb_serial_port *port);
160static void cypress_read_int_callback (struct urb *urb, struct pt_regs *regs);
161static void cypress_write_int_callback (struct urb *urb, struct pt_regs *regs);
162/* baud helper functions */
163static int mask_to_rate (unsigned mask);
164static unsigned rate_to_mask (int rate);
165/* write buffer functions */
166static struct cypress_buf *cypress_buf_alloc(unsigned int size);
167static void cypress_buf_free(struct cypress_buf *cb);
168static void cypress_buf_clear(struct cypress_buf *cb);
169static unsigned int cypress_buf_data_avail(struct cypress_buf *cb);
170static unsigned int cypress_buf_space_avail(struct cypress_buf *cb);
171static unsigned int cypress_buf_put(struct cypress_buf *cb, const char *buf,
172 unsigned int count);
173static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf,
174 unsigned int count);
175
176
177static struct usb_serial_device_type cypress_earthmate_device = {
178 .owner = THIS_MODULE,
179 .name = "DeLorme Earthmate USB",
180 .short_name = "earthmate",
181 .id_table = id_table_earthmate,
182 .num_interrupt_in = 1,
183 .num_interrupt_out = 1,
184 .num_bulk_in = NUM_DONT_CARE,
185 .num_bulk_out = NUM_DONT_CARE,
186 .num_ports = 1,
187 .attach = cypress_earthmate_startup,
188 .shutdown = cypress_shutdown,
189 .open = cypress_open,
190 .close = cypress_close,
191 .write = cypress_write,
192 .write_room = cypress_write_room,
193 .ioctl = cypress_ioctl,
194 .set_termios = cypress_set_termios,
195 .tiocmget = cypress_tiocmget,
196 .tiocmset = cypress_tiocmset,
197 .chars_in_buffer = cypress_chars_in_buffer,
198 .throttle = cypress_throttle,
199 .unthrottle = cypress_unthrottle,
200 .read_int_callback = cypress_read_int_callback,
201 .write_int_callback = cypress_write_int_callback,
202};
203
204static struct usb_serial_device_type cypress_hidcom_device = {
205 .owner = THIS_MODULE,
206 .name = "HID->COM RS232 Adapter",
207 .short_name = "cyphidcom",
208 .id_table = id_table_cyphidcomrs232,
209 .num_interrupt_in = 1,
210 .num_interrupt_out = 1,
211 .num_bulk_in = NUM_DONT_CARE,
212 .num_bulk_out = NUM_DONT_CARE,
213 .num_ports = 1,
214 .attach = cypress_hidcom_startup,
215 .shutdown = cypress_shutdown,
216 .open = cypress_open,
217 .close = cypress_close,
218 .write = cypress_write,
219 .write_room = cypress_write_room,
220 .ioctl = cypress_ioctl,
221 .set_termios = cypress_set_termios,
222 .tiocmget = cypress_tiocmget,
223 .tiocmset = cypress_tiocmset,
224 .chars_in_buffer = cypress_chars_in_buffer,
225 .throttle = cypress_throttle,
226 .unthrottle = cypress_unthrottle,
227 .read_int_callback = cypress_read_int_callback,
228 .write_int_callback = cypress_write_int_callback,
229};
230
231
232/*****************************************************************************
233 * Cypress serial helper functions
234 *****************************************************************************/
235
236
237/* This function can either set or retreive the current serial line settings */
238static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_mask, int data_bits, int stop_bits,
239 int parity_enable, int parity_type, int reset, int cypress_request_type)
240{
241 int i, n_baud_rate = 0, retval = 0;
242 struct cypress_private *priv;
243 __u8 feature_buffer[5];
244 __u8 config;
245 unsigned long flags;
246
247 dbg("%s", __FUNCTION__);
248
249 priv = usb_get_serial_port_data(port);
250
251 switch(cypress_request_type) {
252 case CYPRESS_SET_CONFIG:
253
254 /*
255 * The general purpose firmware for the Cypress M8 allows for a maximum speed
256 * of 57600bps (I have no idea whether DeLorme chose to use the general purpose
257 * firmware or not), if you need to modify this speed setting for your own
258 * project please add your own chiptype and modify the code likewise. The
259 * Cypress HID->COM device will work successfully up to 115200bps.
260 */
261 if (baud_mask != priv->cbr_mask) {
262 dbg("%s - baud rate is changing", __FUNCTION__);
263 if ( priv->chiptype == CT_EARTHMATE ) {
264 /* 300 and 600 baud rates are supported under the generic firmware,
265 * but are not used with NMEA and SiRF protocols */
266
267 if ( (baud_mask == B300) || (baud_mask == B600) ) {
268 err("%s - failed setting baud rate, unsupported speed (default to 4800)",
269 __FUNCTION__);
270 n_baud_rate = 4800;
271 } else if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
272 err("%s - failed setting baud rate, unsupported speed (default to 4800)",
273 __FUNCTION__);
274 n_baud_rate = 4800;
275 }
276 } else if (priv->chiptype == CT_CYPHIDCOM) {
277 if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
278 err("%s - failed setting baud rate, unsupported speed (default to 4800)",
279 __FUNCTION__);
280 n_baud_rate = 4800;
281 }
282 } else if (priv->chiptype == CT_GENERIC) {
283 if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
284 err("%s - failed setting baud rate, unsupported speed (default to 4800)",
285 __FUNCTION__);
286 n_baud_rate = 4800;
287 }
288 } else {
289 info("%s - please define your chiptype, using 4800bps default", __FUNCTION__);
290 n_baud_rate = 4800;
291 }
292 } else { /* baud rate not changing, keep the old */
293 n_baud_rate = priv->baud_rate;
294 }
295 dbg("%s - baud rate is being sent as %d", __FUNCTION__, n_baud_rate);
296
297
298 /*
299 * This algorithm accredited to Jiang Jay Zhang... thanks for all the help!
300 */
301 for (i = 0; i < 4; ++i) {
302 feature_buffer[i] = ( n_baud_rate >> (i*8) & 0xFF );
303 }
304
305 config = 0; // reset config byte
306 config |= data_bits; // assign data bits in 2 bit space ( max 3 )
307 /* 1 bit gap */
308 config |= (stop_bits << 3); // assign stop bits in 1 bit space
309 config |= (parity_enable << 4); // assign parity flag in 1 bit space
310 config |= (parity_type << 5); // assign parity type in 1 bit space
311 /* 1 bit gap */
312 config |= (reset << 7); // assign reset at end of byte, 1 bit space
313
314 feature_buffer[4] = config;
315
316 dbg("%s - device is being sent this feature report:", __FUNCTION__);
317 dbg("%s - %02X - %02X - %02X - %02X - %02X", __FUNCTION__, feature_buffer[0], feature_buffer[1],
318 feature_buffer[2], feature_buffer[3], feature_buffer[4]);
319
320 retval = usb_control_msg (port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
321 HID_REQ_SET_REPORT, USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
322 0x0300, 0, feature_buffer, 5, 500);
323
324 if (retval != 5)
325 err("%s - failed sending serial line settings - %d", __FUNCTION__, retval);
326 else {
327 spin_lock_irqsave(&priv->lock, flags);
328 priv->baud_rate = n_baud_rate;
329 priv->cbr_mask = baud_mask;
330 priv->current_config = config;
331 ++priv->cmd_count;
332 spin_unlock_irqrestore(&priv->lock, flags);
333 }
334 break;
335 case CYPRESS_GET_CONFIG:
336 dbg("%s - retreiving serial line settings", __FUNCTION__);
337 /* reset values in feature buffer */
338 memset(feature_buffer, 0, 5);
339
340 retval = usb_control_msg (port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0),
341 HID_REQ_GET_REPORT, USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
342 0x0300, 0, feature_buffer, 5, 500);
343 if (retval != 5) {
344 err("%s - failed to retreive serial line settings - %d", __FUNCTION__, retval);
345 return retval;
346 } else {
347 spin_lock_irqsave(&priv->lock, flags);
348 /* store the config in one byte, and later use bit masks to check values */
349 priv->current_config = feature_buffer[4];
350 /* reverse the process above to get the baud_mask value */
351 n_baud_rate = 0; // reset bits
352 for (i = 0; i < 4; ++i) {
353 n_baud_rate |= ( feature_buffer[i] << (i*8) );
354 }
355
356 priv->baud_rate = n_baud_rate;
357 if ( (priv->cbr_mask = rate_to_mask(n_baud_rate)) == 0x40)
358 dbg("%s - failed setting the baud mask (not defined)", __FUNCTION__);
359 ++priv->cmd_count;
360 spin_unlock_irqrestore(&priv->lock, flags);
361 }
362 break;
363 default:
364 err("%s - unsupported serial control command issued", __FUNCTION__);
365 }
366 return retval;
367} /* cypress_serial_control */
368
369
370/* given a baud mask, it will return speed on success */
371static int mask_to_rate (unsigned mask)
372{
373 int rate;
374
375 switch (mask) {
376 case B0: rate = 0; break;
377 case B300: rate = 300; break;
378 case B600: rate = 600; break;
379 case B1200: rate = 1200; break;
380 case B2400: rate = 2400; break;
381 case B4800: rate = 4800; break;
382 case B9600: rate = 9600; break;
383 case B19200: rate = 19200; break;
384 case B38400: rate = 38400; break;
385 case B57600: rate = 57600; break;
386 case B115200: rate = 115200; break;
387 default: rate = -1;
388 }
389
390 return rate;
391}
392
393
394static unsigned rate_to_mask (int rate)
395{
396 unsigned mask;
397
398 switch (rate) {
399 case 0: mask = B0; break;
400 case 300: mask = B300; break;
401 case 600: mask = B600; break;
402 case 1200: mask = B1200; break;
403 case 2400: mask = B2400; break;
404 case 4800: mask = B4800; break;
405 case 9600: mask = B9600; break;
406 case 19200: mask = B19200; break;
407 case 38400: mask = B38400; break;
408 case 57600: mask = B57600; break;
409 case 115200: mask = B115200; break;
410 default: mask = 0x40;
411 }
412
413 return mask;
414}
415/*****************************************************************************
416 * Cypress serial driver functions
417 *****************************************************************************/
418
419
420static int generic_startup (struct usb_serial *serial)
421{
422 struct cypress_private *priv;
423
424 dbg("%s - port %d", __FUNCTION__, serial->port[0]->number);
425
426 priv = kmalloc(sizeof (struct cypress_private), GFP_KERNEL);
427 if (!priv)
428 return -ENOMEM;
429
430 memset(priv, 0x00, sizeof (struct cypress_private));
431 spin_lock_init(&priv->lock);
432 priv->buf = cypress_buf_alloc(CYPRESS_BUF_SIZE);
433 if (priv->buf == NULL) {
434 kfree(priv);
435 return -ENOMEM;
436 }
437 init_waitqueue_head(&priv->delta_msr_wait);
438
439 usb_reset_configuration (serial->dev);
440
441 priv->cmd_ctrl = 0;
442 priv->line_control = 0;
443 priv->termios_initialized = 0;
444 priv->calledfromopen = 0;
445 priv->rx_flags = 0;
446 usb_set_serial_port_data(serial->port[0], priv);
447
448 return (0);
449}
450
451
452static int cypress_earthmate_startup (struct usb_serial *serial)
453{
454 struct cypress_private *priv;
455
456 dbg("%s", __FUNCTION__);
457
458 if (generic_startup(serial)) {
459 dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number);
460 return 1;
461 }
462
463 priv = usb_get_serial_port_data(serial->port[0]);
464 priv->chiptype = CT_EARTHMATE;
465
466 return (0);
467} /* cypress_earthmate_startup */
468
469
470static int cypress_hidcom_startup (struct usb_serial *serial)
471{
472 struct cypress_private *priv;
473
474 dbg("%s", __FUNCTION__);
475
476 if (generic_startup(serial)) {
477 dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number);
478 return 1;
479 }
480
481 priv = usb_get_serial_port_data(serial->port[0]);
482 priv->chiptype = CT_CYPHIDCOM;
483
484 return (0);
485} /* cypress_hidcom_startup */
486
487
488static void cypress_shutdown (struct usb_serial *serial)
489{
490 struct cypress_private *priv;
491
492 dbg ("%s - port %d", __FUNCTION__, serial->port[0]->number);
493
494 /* all open ports are closed at this point */
495
496 priv = usb_get_serial_port_data(serial->port[0]);
497
498 if (priv) {
499 cypress_buf_free(priv->buf);
500 kfree(priv);
501 usb_set_serial_port_data(serial->port[0], NULL);
502 }
503}
504
505
506static int cypress_open (struct usb_serial_port *port, struct file *filp)
507{
508 struct cypress_private *priv = usb_get_serial_port_data(port);
509 struct usb_serial *serial = port->serial;
510 unsigned long flags;
511 int result = 0;
512
513 dbg("%s - port %d", __FUNCTION__, port->number);
514
515 /* clear halts before open */
516 usb_clear_halt(serial->dev, 0x00);
517 usb_clear_halt(serial->dev, 0x81);
518 usb_clear_halt(serial->dev, 0x02);
519
520 spin_lock_irqsave(&priv->lock, flags);
521 /* reset read/write statistics */
522 priv->bytes_in = 0;
523 priv->bytes_out = 0;
524 priv->cmd_count = 0;
525 priv->rx_flags = 0;
526 spin_unlock_irqrestore(&priv->lock, flags);
527
528 /* setting to zero could cause data loss */
529 port->tty->low_latency = 1;
530
531 /* raise both lines and set termios */
532 spin_lock_irqsave(&priv->lock, flags);
533 priv->line_control = CONTROL_DTR | CONTROL_RTS;
534 priv->calledfromopen = 1;
535 priv->cmd_ctrl = 1;
536 spin_unlock_irqrestore(&priv->lock, flags);
537 result = cypress_write(port, NULL, 0);
538
539 if (result) {
540 dev_err(&port->dev, "%s - failed setting the control lines - error %d\n", __FUNCTION__, result);
541 return result;
542 } else
543 dbg("%s - success setting the control lines", __FUNCTION__);
544
545 cypress_set_termios(port, &priv->tmp_termios);
546
547 /* setup the port and start reading from the device */
548 if(!port->interrupt_in_urb){
549 err("%s - interrupt_in_urb is empty!", __FUNCTION__);
550 return(-1);
551 }
552
553 usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
554 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
555 port->interrupt_in_urb->transfer_buffer, port->interrupt_in_urb->transfer_buffer_length,
556 cypress_read_int_callback, port, port->interrupt_in_urb->interval);
557 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
558
559 if (result){
560 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
561 }
562
563 return result;
564} /* cypress_open */
565
566
567static void cypress_close(struct usb_serial_port *port, struct file * filp)
568{
569 struct cypress_private *priv = usb_get_serial_port_data(port);
570 unsigned int c_cflag;
571 unsigned long flags;
572 int bps;
573 long timeout;
574 wait_queue_t wait;
575
576 dbg("%s - port %d", __FUNCTION__, port->number);
577
578 /* wait for data to drain from buffer */
579 spin_lock_irqsave(&priv->lock, flags);
580 timeout = CYPRESS_CLOSING_WAIT;
581 init_waitqueue_entry(&wait, current);
582 add_wait_queue(&port->tty->write_wait, &wait);
583 for (;;) {
584 set_current_state(TASK_INTERRUPTIBLE);
585 if (cypress_buf_data_avail(priv->buf) == 0
586 || timeout == 0 || signal_pending(current)
587 || !usb_get_intfdata(port->serial->interface))
588 break;
589 spin_unlock_irqrestore(&priv->lock, flags);
590 timeout = schedule_timeout(timeout);
591 spin_lock_irqsave(&priv->lock, flags);
592 }
593 set_current_state(TASK_RUNNING);
594 remove_wait_queue(&port->tty->write_wait, &wait);
595 /* clear out any remaining data in the buffer */
596 cypress_buf_clear(priv->buf);
597 spin_unlock_irqrestore(&priv->lock, flags);
598
599 /* wait for characters to drain from device */
600 bps = tty_get_baud_rate(port->tty);
601 if (bps > 1200)
602 timeout = max((HZ*2560)/bps,HZ/10);
603 else
604 timeout = 2*HZ;
605 set_current_state(TASK_INTERRUPTIBLE);
606 schedule_timeout(timeout);
607
608 dbg("%s - stopping urbs", __FUNCTION__);
609 usb_kill_urb (port->interrupt_in_urb);
610 usb_kill_urb (port->interrupt_out_urb);
611
612 if (port->tty) {
613 c_cflag = port->tty->termios->c_cflag;
614 if (c_cflag & HUPCL) {
615 /* drop dtr and rts */
616 priv = usb_get_serial_port_data(port);
617 spin_lock_irqsave(&priv->lock, flags);
618 priv->line_control = 0;
619 priv->cmd_ctrl = 1;
620 spin_unlock_irqrestore(&priv->lock, flags);
621 cypress_write(port, NULL, 0);
622 }
623 }
624
625 if (stats)
626 dev_info (&port->dev, "Statistics: %d Bytes In | %d Bytes Out | %d Commands Issued\n",
627 priv->bytes_in, priv->bytes_out, priv->cmd_count);
628} /* cypress_close */
629
630
631static int cypress_write(struct usb_serial_port *port, const unsigned char *buf, int count)
632{
633 struct cypress_private *priv = usb_get_serial_port_data(port);
634 unsigned long flags;
635
636 dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
637
638 /* line control commands, which need to be executed immediately,
639 are not put into the buffer for obvious reasons.
640 */
641 if (priv->cmd_ctrl) {
642 count = 0;
643 goto finish;
644 }
645
646 if (!count)
647 return count;
648
649 spin_lock_irqsave(&priv->lock, flags);
650 count = cypress_buf_put(priv->buf, buf, count);
651 spin_unlock_irqrestore(&priv->lock, flags);
652
653finish:
654 cypress_send(port);
655
656 return count;
657} /* cypress_write */
658
659
660static void cypress_send(struct usb_serial_port *port)
661{
662 int count = 0, result, offset, actual_size;
663 struct cypress_private *priv = usb_get_serial_port_data(port);
664 unsigned long flags;
665
666 dbg("%s - port %d", __FUNCTION__, port->number);
667 dbg("%s - interrupt out size is %d", __FUNCTION__, port->interrupt_out_size);
668
669 spin_lock_irqsave(&priv->lock, flags);
670 if (priv->write_urb_in_use) {
671 dbg("%s - can't write, urb in use", __FUNCTION__);
672 spin_unlock_irqrestore(&priv->lock, flags);
673 return;
674 }
675 spin_unlock_irqrestore(&priv->lock, flags);
676
677 /* clear buffer */
678 memset(port->interrupt_out_urb->transfer_buffer, 0, port->interrupt_out_size);
679
680 spin_lock_irqsave(&priv->lock, flags);
681 switch (port->interrupt_out_size) {
682 case 32:
683 // this is for the CY7C64013...
684 offset = 2;
685 port->interrupt_out_buffer[0] = priv->line_control;
686 break;
687 case 8:
688 // this is for the CY7C63743...
689 offset = 1;
690 port->interrupt_out_buffer[0] = priv->line_control;
691 break;
692 default:
693 dbg("%s - wrong packet size", __FUNCTION__);
694 spin_unlock_irqrestore(&priv->lock, flags);
695 return;
696 }
697
698 if (priv->line_control & CONTROL_RESET)
699 priv->line_control &= ~CONTROL_RESET;
700
701 if (priv->cmd_ctrl) {
702 priv->cmd_count++;
703 dbg("%s - line control command being issued", __FUNCTION__);
704 spin_unlock_irqrestore(&priv->lock, flags);
705 goto send;
706 } else
707 spin_unlock_irqrestore(&priv->lock, flags);
708
709 count = cypress_buf_get(priv->buf, &port->interrupt_out_buffer[offset],
710 port->interrupt_out_size-offset);
711
712 if (count == 0) {
713 return;
714 }
715
716 switch (port->interrupt_out_size) {
717 case 32:
718 port->interrupt_out_buffer[1] = count;
719 break;
720 case 8:
721 port->interrupt_out_buffer[0] |= count;
722 }
723
724 dbg("%s - count is %d", __FUNCTION__, count);
725
726send:
727 spin_lock_irqsave(&priv->lock, flags);
728 priv->write_urb_in_use = 1;
729 spin_unlock_irqrestore(&priv->lock, flags);
730
731 if (priv->cmd_ctrl)
732 actual_size = 1;
733 else
734 actual_size = count + (port->interrupt_out_size == 32 ? 2 : 1);
735
736 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, port->interrupt_out_size,
737 port->interrupt_out_urb->transfer_buffer);
738
739 port->interrupt_out_urb->transfer_buffer_length = actual_size;
740 port->interrupt_out_urb->dev = port->serial->dev;
741 result = usb_submit_urb (port->interrupt_out_urb, GFP_ATOMIC);
742 if (result) {
743 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__,
744 result);
745 priv->write_urb_in_use = 0;
746 }
747
748 spin_lock_irqsave(&priv->lock, flags);
749 if (priv->cmd_ctrl) {
750 priv->cmd_ctrl = 0;
751 }
752 priv->bytes_out += count; /* do not count the line control and size bytes */
753 spin_unlock_irqrestore(&priv->lock, flags);
754
755 schedule_work(&port->work);
756} /* cypress_send */
757
758
759/* returns how much space is available in the soft buffer */
760static int cypress_write_room(struct usb_serial_port *port)
761{
762 struct cypress_private *priv = usb_get_serial_port_data(port);
763 int room = 0;
764 unsigned long flags;
765
766 dbg("%s - port %d", __FUNCTION__, port->number);
767
768 spin_lock_irqsave(&priv->lock, flags);
769 room = cypress_buf_space_avail(priv->buf);
770 spin_unlock_irqrestore(&priv->lock, flags);
771
772 dbg("%s - returns %d", __FUNCTION__, room);
773 return room;
774}
775
776
777static int cypress_tiocmget (struct usb_serial_port *port, struct file *file)
778{
779 struct cypress_private *priv = usb_get_serial_port_data(port);
780 __u8 status, control;
781 unsigned int result = 0;
782 unsigned long flags;
783
784 dbg("%s - port %d", __FUNCTION__, port->number);
785
786 spin_lock_irqsave(&priv->lock, flags);
787 control = priv->line_control;
788 status = priv->current_status;
789 spin_unlock_irqrestore(&priv->lock, flags);
790
791 result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0)
792 | ((control & CONTROL_RTS) ? TIOCM_RTS : 0)
793 | ((status & UART_CTS) ? TIOCM_CTS : 0)
794 | ((status & UART_DSR) ? TIOCM_DSR : 0)
795 | ((status & UART_RI) ? TIOCM_RI : 0)
796 | ((status & UART_CD) ? TIOCM_CD : 0);
797
798 dbg("%s - result = %x", __FUNCTION__, result);
799
800 return result;
801}
802
803
804static int cypress_tiocmset (struct usb_serial_port *port, struct file *file,
805 unsigned int set, unsigned int clear)
806{
807 struct cypress_private *priv = usb_get_serial_port_data(port);
808 unsigned long flags;
809
810 dbg("%s - port %d", __FUNCTION__, port->number);
811
812 spin_lock_irqsave(&priv->lock, flags);
813 if (set & TIOCM_RTS)
814 priv->line_control |= CONTROL_RTS;
815 if (set & TIOCM_DTR)
816 priv->line_control |= CONTROL_DTR;
817 if (clear & TIOCM_RTS)
818 priv->line_control &= ~CONTROL_RTS;
819 if (clear & TIOCM_DTR)
820 priv->line_control &= ~CONTROL_DTR;
821 spin_unlock_irqrestore(&priv->lock, flags);
822
823 priv->cmd_ctrl = 1;
824 return cypress_write(port, NULL, 0);
825}
826
827
828static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
829{
830 struct cypress_private *priv = usb_get_serial_port_data(port);
831
832 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
833
834 switch (cmd) {
835 case TIOCGSERIAL:
836 if (copy_to_user((void __user *)arg, port->tty->termios, sizeof(struct termios))) {
837 return -EFAULT;
838 }
839 return (0);
840 break;
841 case TIOCSSERIAL:
842 if (copy_from_user(port->tty->termios, (void __user *)arg, sizeof(struct termios))) {
843 return -EFAULT;
844 }
845 /* here we need to call cypress_set_termios to invoke the new settings */
846 cypress_set_termios(port, &priv->tmp_termios);
847 return (0);
848 break;
849 /* these are called when setting baud rate from gpsd */
850 case TCGETS:
851 if (copy_to_user((void __user *)arg, port->tty->termios, sizeof(struct termios))) {
852 return -EFAULT;
853 }
854 return (0);
855 break;
856 case TCSETS:
857 if (copy_from_user(port->tty->termios, (void __user *)arg, sizeof(struct termios))) {
858 return -EFAULT;
859 }
860 /* here we need to call cypress_set_termios to invoke the new settings */
861 cypress_set_termios(port, &priv->tmp_termios);
862 return (0);
863 break;
864 /* This code comes from drivers/char/serial.c and ftdi_sio.c */
865 case TIOCMIWAIT:
866 while (priv != NULL) {
867 interruptible_sleep_on(&priv->delta_msr_wait);
868 /* see if a signal did it */
869 if (signal_pending(current))
870 return -ERESTARTSYS;
871 else {
872 char diff = priv->diff_status;
873
874 if (diff == 0) {
875 return -EIO; /* no change => error */
876 }
877
878 /* consume all events */
879 priv->diff_status = 0;
880
881 /* return 0 if caller wanted to know about these bits */
882 if ( ((arg & TIOCM_RNG) && (diff & UART_RI)) ||
883 ((arg & TIOCM_DSR) && (diff & UART_DSR)) ||
884 ((arg & TIOCM_CD) && (diff & UART_CD)) ||
885 ((arg & TIOCM_CTS) && (diff & UART_CTS)) ) {
886 return 0;
887 }
888 /* otherwise caller can't care less about what happened,
889 * and so we continue to wait for more events.
890 */
891 }
892 }
893 return 0;
894 break;
895 default:
896 break;
897 }
898
899 dbg("%s - arg not supported - it was 0x%04x - check include/asm/ioctls.h", __FUNCTION__, cmd);
900
901 return -ENOIOCTLCMD;
902} /* cypress_ioctl */
903
904
905static void cypress_set_termios (struct usb_serial_port *port, struct termios *old_termios)
906{
907 struct cypress_private *priv = usb_get_serial_port_data(port);
908 struct tty_struct *tty;
909 int data_bits, stop_bits, parity_type, parity_enable;
910 unsigned cflag, iflag, baud_mask;
911 unsigned long flags;
912 __u8 oldlines;
913 int linechange;
914
915 dbg("%s - port %d", __FUNCTION__, port->number);
916
917 tty = port->tty;
918 if ((!tty) || (!tty->termios)) {
919 dbg("%s - no tty structures", __FUNCTION__);
920 return;
921 }
922
923 spin_lock_irqsave(&priv->lock, flags);
924 if (!priv->termios_initialized) {
925 if (priv->chiptype == CT_EARTHMATE) {
926 *(tty->termios) = tty_std_termios;
927 tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | CLOCAL;
928 } else if (priv->chiptype == CT_CYPHIDCOM) {
929 *(tty->termios) = tty_std_termios;
930 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
931 }
932 priv->termios_initialized = 1;
933 }
934 spin_unlock_irqrestore(&priv->lock, flags);
935
936 cflag = tty->termios->c_cflag;
937 iflag = tty->termios->c_iflag;
938
939 /* check if there are new settings */
940 if (old_termios) {
941 if ((cflag != old_termios->c_cflag) ||
942 (RELEVANT_IFLAG(iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) {
943 dbg("%s - attempting to set new termios settings", __FUNCTION__);
944 /* should make a copy of this in case something goes wrong in the function, we can restore it */
945 spin_lock_irqsave(&priv->lock, flags);
946 priv->tmp_termios = *(tty->termios);
947 spin_unlock_irqrestore(&priv->lock, flags);
948 } else {
949 dbg("%s - nothing to do, exiting", __FUNCTION__);
950 return;
951 }
952 } else
953 return;
954
955 /* set number of data bits, parity, stop bits */
956 /* when parity is disabled the parity type bit is ignored */
957
958 stop_bits = cflag & CSTOPB ? 1 : 0; /* 1 means 2 stop bits, 0 means 1 stop bit */
959
960 if (cflag & PARENB) {
961 parity_enable = 1;
962 parity_type = cflag & PARODD ? 1 : 0; /* 1 means odd parity, 0 means even parity */
963 } else
964 parity_enable = parity_type = 0;
965
966 if (cflag & CSIZE) {
967 switch (cflag & CSIZE) {
968 case CS5: data_bits = 0; break;
969 case CS6: data_bits = 1; break;
970 case CS7: data_bits = 2; break;
971 case CS8: data_bits = 3; break;
972 default: err("%s - CSIZE was set, but not CS5-CS8", __FUNCTION__); data_bits = 3;
973 }
974 } else
975 data_bits = 3;
976
977 spin_lock_irqsave(&priv->lock, flags);
978 oldlines = priv->line_control;
979 if ((cflag & CBAUD) == B0) {
980 /* drop dtr and rts */
981 dbg("%s - dropping the lines, baud rate 0bps", __FUNCTION__);
982 baud_mask = B0;
983 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
984 } else {
985 baud_mask = (cflag & CBAUD);
986 switch(baud_mask) {
987 case B300: dbg("%s - setting baud 300bps", __FUNCTION__); break;
988 case B600: dbg("%s - setting baud 600bps", __FUNCTION__); break;
989 case B1200: dbg("%s - setting baud 1200bps", __FUNCTION__); break;
990 case B2400: dbg("%s - setting baud 2400bps", __FUNCTION__); break;
991 case B4800: dbg("%s - setting baud 4800bps", __FUNCTION__); break;
992 case B9600: dbg("%s - setting baud 9600bps", __FUNCTION__); break;
993 case B19200: dbg("%s - setting baud 19200bps", __FUNCTION__); break;
994 case B38400: dbg("%s - setting baud 38400bps", __FUNCTION__); break;
995 case B57600: dbg("%s - setting baud 57600bps", __FUNCTION__); break;
996 case B115200: dbg("%s - setting baud 115200bps", __FUNCTION__); break;
997 default: dbg("%s - unknown masked baud rate", __FUNCTION__);
998 }
999 priv->line_control |= CONTROL_DTR;
1000
1001 /* toggle CRTSCTS? - don't do this if being called from cypress_open */
1002 if (!priv->calledfromopen) {
1003 if (cflag & CRTSCTS)
1004 priv->line_control |= CONTROL_RTS;
1005 else
1006 priv->line_control &= ~CONTROL_RTS;
1007 }
1008 }
1009 spin_unlock_irqrestore(&priv->lock, flags);
1010
1011 dbg("%s - sending %d stop_bits, %d parity_enable, %d parity_type, %d data_bits (+5)", __FUNCTION__,
1012 stop_bits, parity_enable, parity_type, data_bits);
1013
1014 cypress_serial_control(port, baud_mask, data_bits, stop_bits, parity_enable,
1015 parity_type, 0, CYPRESS_SET_CONFIG);
1016
1017 msleep(50); /* give some time between change and read (50ms) */
1018
1019 /* we perform a CYPRESS_GET_CONFIG so that the current settings are filled into the private structure
1020 * this should confirm that all is working if it returns what we just set */
1021 cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG);
1022
1023 /* Here we can define custom tty settings for devices
1024 *
1025 * the main tty termios flag base comes from empeg.c
1026 */
1027
1028 spin_lock_irqsave(&priv->lock, flags);
1029 if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) {
1030
1031 dbg("Using custom termios settings for a baud rate of 4800bps.");
1032 /* define custom termios settings for NMEA protocol */
1033
1034
1035 tty->termios->c_iflag /* input modes - */
1036 &= ~(IGNBRK /* disable ignore break */
1037 | BRKINT /* disable break causes interrupt */
1038 | PARMRK /* disable mark parity errors */
1039 | ISTRIP /* disable clear high bit of input characters */
1040 | INLCR /* disable translate NL to CR */
1041 | IGNCR /* disable ignore CR */
1042 | ICRNL /* disable translate CR to NL */
1043 | IXON); /* disable enable XON/XOFF flow control */
1044
1045 tty->termios->c_oflag /* output modes */
1046 &= ~OPOST; /* disable postprocess output characters */
1047
1048 tty->termios->c_lflag /* line discipline modes */
1049 &= ~(ECHO /* disable echo input characters */
1050 | ECHONL /* disable echo new line */
1051 | ICANON /* disable erase, kill, werase, and rprnt special characters */
1052 | ISIG /* disable interrupt, quit, and suspend special characters */
1053 | IEXTEN); /* disable non-POSIX special characters */
1054
1055 } else if (priv->chiptype == CT_CYPHIDCOM) {
1056
1057 // Software app handling it for device...
1058
1059 }
1060 linechange = (priv->line_control != oldlines);
1061 spin_unlock_irqrestore(&priv->lock, flags);
1062
1063 /* if necessary, set lines */
1064 if (!priv->calledfromopen && linechange) {
1065 priv->cmd_ctrl = 1;
1066 cypress_write(port, NULL, 0);
1067 }
1068
1069 if (priv->calledfromopen)
1070 priv->calledfromopen = 0;
1071
1072} /* cypress_set_termios */
1073
1074
1075/* returns amount of data still left in soft buffer */
1076static int cypress_chars_in_buffer(struct usb_serial_port *port)
1077{
1078 struct cypress_private *priv = usb_get_serial_port_data(port);
1079 int chars = 0;
1080 unsigned long flags;
1081
1082 dbg("%s - port %d", __FUNCTION__, port->number);
1083
1084 spin_lock_irqsave(&priv->lock, flags);
1085 chars = cypress_buf_data_avail(priv->buf);
1086 spin_unlock_irqrestore(&priv->lock, flags);
1087
1088 dbg("%s - returns %d", __FUNCTION__, chars);
1089 return chars;
1090}
1091
1092
1093static void cypress_throttle (struct usb_serial_port *port)
1094{
1095 struct cypress_private *priv = usb_get_serial_port_data(port);
1096 unsigned long flags;
1097
1098 dbg("%s - port %d", __FUNCTION__, port->number);
1099
1100 spin_lock_irqsave(&priv->lock, flags);
1101 priv->rx_flags = THROTTLED;
1102 spin_unlock_irqrestore(&priv->lock, flags);
1103}
1104
1105
1106static void cypress_unthrottle (struct usb_serial_port *port)
1107{
1108 struct cypress_private *priv = usb_get_serial_port_data(port);
1109 int actually_throttled, result;
1110 unsigned long flags;
1111
1112 dbg("%s - port %d", __FUNCTION__, port->number);
1113
1114 spin_lock_irqsave(&priv->lock, flags);
1115 actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
1116 priv->rx_flags = 0;
1117 spin_unlock_irqrestore(&priv->lock, flags);
1118
1119 if (actually_throttled) {
1120 port->interrupt_in_urb->dev = port->serial->dev;
1121
1122 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1123 if (result)
1124 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
1125 }
1126}
1127
1128
1129static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1130{
1131 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1132 struct cypress_private *priv = usb_get_serial_port_data(port);
1133 struct tty_struct *tty;
1134 unsigned char *data = urb->transfer_buffer;
1135 unsigned long flags;
1136 char tty_flag = TTY_NORMAL;
1137 int havedata = 0;
1138 int bytes = 0;
1139 int result;
1140 int i = 0;
1141
1142 dbg("%s - port %d", __FUNCTION__, port->number);
1143
1144 if (urb->status) {
1145 dbg("%s - nonzero read status received: %d", __FUNCTION__, urb->status);
1146 return;
1147 }
1148
1149 spin_lock_irqsave(&priv->lock, flags);
1150 if (priv->rx_flags & THROTTLED) {
1151 dbg("%s - now throttling", __FUNCTION__);
1152 priv->rx_flags |= ACTUALLY_THROTTLED;
1153 spin_unlock_irqrestore(&priv->lock, flags);
1154 return;
1155 }
1156 spin_unlock_irqrestore(&priv->lock, flags);
1157
1158 tty = port->tty;
1159 if (!tty) {
1160 dbg("%s - bad tty pointer - exiting", __FUNCTION__);
1161 return;
1162 }
1163
1164 spin_lock_irqsave(&priv->lock, flags);
1165 switch(urb->actual_length) {
1166 case 32:
1167 // This is for the CY7C64013...
1168 priv->current_status = data[0] & 0xF8;
1169 bytes = data[1]+2;
1170 i=2;
1171 if (bytes > 2)
1172 havedata = 1;
1173 break;
1174 case 8:
1175 // This is for the CY7C63743...
1176 priv->current_status = data[0] & 0xF8;
1177 bytes = (data[0] & 0x07)+1;
1178 i=1;
1179 if (bytes > 1)
1180 havedata = 1;
1181 break;
1182 default:
1183 dbg("%s - wrong packet size - received %d bytes", __FUNCTION__, urb->actual_length);
1184 spin_unlock_irqrestore(&priv->lock, flags);
1185 goto continue_read;
1186 }
1187 spin_unlock_irqrestore(&priv->lock, flags);
1188
1189 usb_serial_debug_data (debug, &port->dev, __FUNCTION__, urb->actual_length, data);
1190
1191 spin_lock_irqsave(&priv->lock, flags);
1192 /* check to see if status has changed */
1193 if (priv != NULL) {
1194 if (priv->current_status != priv->prev_status) {
1195 priv->diff_status |= priv->current_status ^ priv->prev_status;
1196 wake_up_interruptible(&priv->delta_msr_wait);
1197 priv->prev_status = priv->current_status;
1198 }
1199 }
1200 spin_unlock_irqrestore(&priv->lock, flags);
1201
1202 /* hangup, as defined in acm.c... this might be a bad place for it though */
1203 if (tty && !(tty->termios->c_cflag & CLOCAL) && !(priv->current_status & UART_CD)) {
1204 dbg("%s - calling hangup", __FUNCTION__);
1205 tty_hangup(tty);
1206 goto continue_read;
1207 }
1208
1209 /* There is one error bit... I'm assuming it is a parity error indicator
1210 * as the generic firmware will set this bit to 1 if a parity error occurs.
1211 * I can not find reference to any other error events.
1212 *
1213 */
1214 spin_lock_irqsave(&priv->lock, flags);
1215 if (priv->current_status & CYP_ERROR) {
1216 spin_unlock_irqrestore(&priv->lock, flags);
1217 tty_flag = TTY_PARITY;
1218 dbg("%s - Parity Error detected", __FUNCTION__);
1219 } else
1220 spin_unlock_irqrestore(&priv->lock, flags);
1221
1222 /* process read if there is data other than line status */
1223 if (tty && (bytes > i)) {
1224 for (; i < bytes ; ++i) {
1225 dbg("pushing byte number %d - %d - %c",i,data[i],data[i]);
1226 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1227 tty_flip_buffer_push(tty);
1228 }
1229 tty_insert_flip_char(tty, data[i], tty_flag);
1230 }
1231 tty_flip_buffer_push(port->tty);
1232 }
1233
1234 spin_lock_irqsave(&priv->lock, flags);
1235 priv->bytes_in += bytes; /* control and status byte(s) are also counted */
1236 spin_unlock_irqrestore(&priv->lock, flags);
1237
1238continue_read:
1239
1240 /* Continue trying to always read... unless the port has closed. */
1241
1242 if (port->open_count > 0) {
1243 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
1244 usb_rcvintpipe(port->serial->dev, port->interrupt_in_endpointAddress),
1245 port->interrupt_in_urb->transfer_buffer,
1246 port->interrupt_in_urb->transfer_buffer_length,
1247 cypress_read_int_callback, port,
1248 port->interrupt_in_urb->interval);
1249 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1250 if (result)
1251 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
1252 }
1253
1254 return;
1255} /* cypress_read_int_callback */
1256
1257
1258static void cypress_write_int_callback(struct urb *urb, struct pt_regs *regs)
1259{
1260 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1261 struct cypress_private *priv = usb_get_serial_port_data(port);
1262 int result;
1263
1264 dbg("%s - port %d", __FUNCTION__, port->number);
1265
1266 switch (urb->status) {
1267 case 0:
1268 /* success */
1269 break;
1270 case -ECONNRESET:
1271 case -ENOENT:
1272 case -ESHUTDOWN:
1273 /* this urb is terminated, clean up */
1274 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1275 priv->write_urb_in_use = 0;
1276 return;
1277 default:
1278 /* error in the urb, so we have to resubmit it */
1279 dbg("%s - Overflow in write", __FUNCTION__);
1280 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
1281 port->interrupt_out_urb->transfer_buffer_length = 1;
1282 port->interrupt_out_urb->dev = port->serial->dev;
1283 result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC);
1284 if (result)
1285 dev_err(&urb->dev->dev, "%s - failed resubmitting write urb, error %d\n",
1286 __FUNCTION__, result);
1287 else
1288 return;
1289 }
1290
1291 priv->write_urb_in_use = 0;
1292
1293 /* send any buffered data */
1294 cypress_send(port);
1295}
1296
1297
1298/*****************************************************************************
1299 * Write buffer functions - buffering code from pl2303 used
1300 *****************************************************************************/
1301
1302/*
1303 * cypress_buf_alloc
1304 *
1305 * Allocate a circular buffer and all associated memory.
1306 */
1307
1308static struct cypress_buf *cypress_buf_alloc(unsigned int size)
1309{
1310
1311 struct cypress_buf *cb;
1312
1313
1314 if (size == 0)
1315 return NULL;
1316
1317 cb = (struct cypress_buf *)kmalloc(sizeof(struct cypress_buf), GFP_KERNEL);
1318 if (cb == NULL)
1319 return NULL;
1320
1321 cb->buf_buf = kmalloc(size, GFP_KERNEL);
1322 if (cb->buf_buf == NULL) {
1323 kfree(cb);
1324 return NULL;
1325 }
1326
1327 cb->buf_size = size;
1328 cb->buf_get = cb->buf_put = cb->buf_buf;
1329
1330 return cb;
1331
1332}
1333
1334
1335/*
1336 * cypress_buf_free
1337 *
1338 * Free the buffer and all associated memory.
1339 */
1340
1341static void cypress_buf_free(struct cypress_buf *cb)
1342{
1343 if (cb != NULL) {
1344 if (cb->buf_buf != NULL)
1345 kfree(cb->buf_buf);
1346 kfree(cb);
1347 }
1348}
1349
1350
1351/*
1352 * cypress_buf_clear
1353 *
1354 * Clear out all data in the circular buffer.
1355 */
1356
1357static void cypress_buf_clear(struct cypress_buf *cb)
1358{
1359 if (cb != NULL)
1360 cb->buf_get = cb->buf_put;
1361 /* equivalent to a get of all data available */
1362}
1363
1364
1365/*
1366 * cypress_buf_data_avail
1367 *
1368 * Return the number of bytes of data available in the circular
1369 * buffer.
1370 */
1371
1372static unsigned int cypress_buf_data_avail(struct cypress_buf *cb)
1373{
1374 if (cb != NULL)
1375 return ((cb->buf_size + cb->buf_put - cb->buf_get) % cb->buf_size);
1376 else
1377 return 0;
1378}
1379
1380
1381/*
1382 * cypress_buf_space_avail
1383 *
1384 * Return the number of bytes of space available in the circular
1385 * buffer.
1386 */
1387
1388static unsigned int cypress_buf_space_avail(struct cypress_buf *cb)
1389{
1390 if (cb != NULL)
1391 return ((cb->buf_size + cb->buf_get - cb->buf_put - 1) % cb->buf_size);
1392 else
1393 return 0;
1394}
1395
1396
1397/*
1398 * cypress_buf_put
1399 *
1400 * Copy data data from a user buffer and put it into the circular buffer.
1401 * Restrict to the amount of space available.
1402 *
1403 * Return the number of bytes copied.
1404 */
1405
1406static unsigned int cypress_buf_put(struct cypress_buf *cb, const char *buf,
1407 unsigned int count)
1408{
1409
1410 unsigned int len;
1411
1412
1413 if (cb == NULL)
1414 return 0;
1415
1416 len = cypress_buf_space_avail(cb);
1417 if (count > len)
1418 count = len;
1419
1420 if (count == 0)
1421 return 0;
1422
1423 len = cb->buf_buf + cb->buf_size - cb->buf_put;
1424 if (count > len) {
1425 memcpy(cb->buf_put, buf, len);
1426 memcpy(cb->buf_buf, buf+len, count - len);
1427 cb->buf_put = cb->buf_buf + count - len;
1428 } else {
1429 memcpy(cb->buf_put, buf, count);
1430 if (count < len)
1431 cb->buf_put += count;
1432 else /* count == len */
1433 cb->buf_put = cb->buf_buf;
1434 }
1435
1436 return count;
1437
1438}
1439
1440
1441/*
1442 * cypress_buf_get
1443 *
1444 * Get data from the circular buffer and copy to the given buffer.
1445 * Restrict to the amount of data available.
1446 *
1447 * Return the number of bytes copied.
1448 */
1449
1450static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf,
1451 unsigned int count)
1452{
1453
1454 unsigned int len;
1455
1456
1457 if (cb == NULL)
1458 return 0;
1459
1460 len = cypress_buf_data_avail(cb);
1461 if (count > len)
1462 count = len;
1463
1464 if (count == 0)
1465 return 0;
1466
1467 len = cb->buf_buf + cb->buf_size - cb->buf_get;
1468 if (count > len) {
1469 memcpy(buf, cb->buf_get, len);
1470 memcpy(buf+len, cb->buf_buf, count - len);
1471 cb->buf_get = cb->buf_buf + count - len;
1472 } else {
1473 memcpy(buf, cb->buf_get, count);
1474 if (count < len)
1475 cb->buf_get += count;
1476 else /* count == len */
1477 cb->buf_get = cb->buf_buf;
1478 }
1479
1480 return count;
1481
1482}
1483
1484/*****************************************************************************
1485 * Module functions
1486 *****************************************************************************/
1487
1488static int __init cypress_init(void)
1489{
1490 int retval;
1491
1492 dbg("%s", __FUNCTION__);
1493
1494 retval = usb_serial_register(&cypress_earthmate_device);
1495 if (retval)
1496 goto failed_em_register;
1497 retval = usb_serial_register(&cypress_hidcom_device);
1498 if (retval)
1499 goto failed_hidcom_register;
1500 retval = usb_register(&cypress_driver);
1501 if (retval)
1502 goto failed_usb_register;
1503
1504 info(DRIVER_DESC " " DRIVER_VERSION);
1505 return 0;
1506failed_usb_register:
1507 usb_deregister(&cypress_driver);
1508failed_hidcom_register:
1509 usb_serial_deregister(&cypress_hidcom_device);
1510failed_em_register:
1511 usb_serial_deregister(&cypress_earthmate_device);
1512
1513 return retval;
1514}
1515
1516
1517static void __exit cypress_exit (void)
1518{
1519 dbg("%s", __FUNCTION__);
1520
1521 usb_deregister (&cypress_driver);
1522 usb_serial_deregister (&cypress_earthmate_device);
1523 usb_serial_deregister (&cypress_hidcom_device);
1524}
1525
1526
1527module_init(cypress_init);
1528module_exit(cypress_exit);
1529
1530MODULE_AUTHOR( DRIVER_AUTHOR );
1531MODULE_DESCRIPTION( DRIVER_DESC );
1532MODULE_VERSION( DRIVER_VERSION );
1533MODULE_LICENSE("GPL");
1534
1535module_param(debug, bool, S_IRUGO | S_IWUSR);
1536MODULE_PARM_DESC(debug, "Debug enabled or not");
1537module_param(stats, bool, S_IRUGO | S_IWUSR);
1538MODULE_PARM_DESC(stats, "Enable statistics or not");
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h
new file mode 100644
index 000000000000..1012ee6b19ce
--- /dev/null
+++ b/drivers/usb/serial/cypress_m8.h
@@ -0,0 +1,55 @@
1#ifndef CYPRESS_M8_H
2#define CYPRESS_M8_H
3
4/* definitions and function prototypes used for the cypress USB to Serial controller */
5
6/* For sending our feature buffer - controlling serial communication states */
7/* Linux HID has no support for serial devices so we do this through the driver */
8#define HID_REQ_GET_REPORT 0x01
9#define HID_REQ_SET_REPORT 0x09
10
11/* List other cypress USB to Serial devices here, and add them to the id_table */
12
13/* DeLorme Earthmate USB - a GPS device */
14#define VENDOR_ID_DELORME 0x1163
15#define PRODUCT_ID_EARTHMATEUSB 0x0100
16
17/* Cypress HID->COM RS232 Adapter */
18#define VENDOR_ID_CYPRESS 0x04b4
19#define PRODUCT_ID_CYPHIDCOM 0x5500
20/* End of device listing */
21
22/* Used for setting / requesting serial line settings */
23#define CYPRESS_SET_CONFIG 0x01
24#define CYPRESS_GET_CONFIG 0x02
25
26/* Used for throttle control */
27#define THROTTLED 0x1
28#define ACTUALLY_THROTTLED 0x2
29
30/* chiptypes - used in case firmware differs from the generic form ... offering
31 * different baud speeds/etc.
32 */
33
34#define CT_EARTHMATE 0x01
35#define CT_CYPHIDCOM 0x02
36#define CT_GENERIC 0x0F
37/* End of chiptype definitions */
38
39/* RS-232 serial data communication protocol definitions */
40/* these are sent / read at byte 0 of the input/output hid reports */
41/* You can find these values defined in the CY4601 USB to Serial design notes */
42
43#define CONTROL_DTR 0x20 /* data terminal ready - flow control - host to device */
44#define UART_DSR 0x20 /* data set ready - flow control - device to host */
45#define CONTROL_RTS 0x10 /* request to send - flow control - host to device */
46#define UART_CTS 0x10 /* clear to send - flow control - device to host */
47#define UART_RI 0x10 /* ring indicator - modem - device to host */
48#define UART_CD 0x40 /* carrier detect - modem - device to host */
49#define CYP_ERROR 0x08 /* received from input report - device to host */
50/* Note - the below has nothing to to with the "feature report" reset */
51#define CONTROL_RESET 0x08 /* sent with output report - host to device */
52
53/* End of RS-232 protocol definitions */
54
55#endif /* CYPRESS_M8_H */
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
new file mode 100644
index 000000000000..25f92788a6d4
--- /dev/null
+++ b/drivers/usb/serial/digi_acceleport.c
@@ -0,0 +1,2049 @@
1/*
2* Digi AccelePort USB-4 and USB-2 Serial Converters
3*
4* Copyright 2000 by Digi International
5*
6* This program is free software; you can redistribute it and/or modify
7* it under the terms of the GNU General Public License as published by
8* the Free Software Foundation; either version 2 of the License, or
9* (at your option) any later version.
10*
11* Shamelessly based on Brian Warner's keyspan_pda.c and Greg Kroah-Hartman's
12* usb-serial driver.
13*
14* Peter Berger (pberger@brimson.com)
15* Al Borchers (borchers@steinerpoint.com)
16*
17* (12/03/2001) gkh
18* switched to using port->open_count instead of private version.
19* Removed port->active
20*
21* (04/08/2001) gb
22* Identify version on module load.
23*
24* (11/01/2000) Adam J. Richter
25* usb_device_id table support
26*
27* (11/01/2000) pberger and borchers
28* -- Turned off the USB_DISABLE_SPD flag for write bulk urbs--it caused
29* USB 4 ports to hang on startup.
30* -- Serialized access to write urbs by adding the dp_write_urb_in_use
31* flag; otherwise, the driver caused SMP system hangs. Watching the
32* urb status is not sufficient.
33*
34* (10/05/2000) gkh
35* -- Fixed bug with urb->dev not being set properly, now that the usb
36* core needs it.
37*
38* (8/8/2000) pberger and borchers
39* -- Fixed close so that
40* - it can timeout while waiting for transmit idle, if needed;
41* - it ignores interrupts when flushing the port, turning
42* of modem signalling, and so on;
43* - it waits for the flush to really complete before returning.
44* -- Read_bulk_callback and write_bulk_callback check for a closed
45* port before using the tty struct or writing to the port.
46* -- The two changes above fix the oops caused by interrupted closes.
47* -- Added interruptible args to write_oob_command and set_modem_signals
48* and added a timeout arg to transmit_idle; needed for fixes to
49* close.
50* -- Added code for rx_throttle and rx_unthrottle so that input flow
51* control works.
52* -- Added code to set overrun, parity, framing, and break errors
53* (untested).
54* -- Set USB_DISABLE_SPD flag for write bulk urbs, so no 0 length
55* bulk writes are done. These hung the Digi USB device. The
56* 0 length bulk writes were a new feature of usb-uhci added in
57* the 2.4.0-test6 kernels.
58* -- Fixed mod inc race in open; do mod inc before sleeping to wait
59* for a close to finish.
60*
61* (7/31/2000) pberger
62* -- Fixed bugs with hardware handshaking:
63* - Added code to set/clear tty->hw_stopped in digi_read_oob_callback()
64* and digi_set_termios()
65* -- Added code in digi_set_termios() to
66* - add conditional in code handling transition from B0 to only
67* set RTS if RTS/CTS flow control is either not in use or if
68* the port is not currently throttled.
69* - handle turning off CRTSCTS.
70*
71* (7/30/2000) borchers
72* -- Added support for more than one Digi USB device by moving
73* globals to a private structure in the pointed to from the
74* usb_serial structure.
75* -- Moved the modem change and transmit idle wait queues into
76* the port private structure, so each port has its own queue
77* rather than sharing global queues.
78* -- Added support for break signals.
79*
80* (7/25/2000) pberger
81* -- Added USB-2 support. Note: the USB-2 supports 3 devices: two
82* serial and a parallel port. The parallel port is implemented
83* as a serial-to-parallel converter. That is, the driver actually
84* presents all three USB-2 interfaces as serial ports, but the third
85* one physically connects to a parallel device. Thus, for example,
86* one could plug a parallel printer into the USB-2's third port,
87* but from the kernel's (and userland's) point of view what's
88* actually out there is a serial device.
89*
90* (7/15/2000) borchers
91* -- Fixed race in open when a close is in progress.
92* -- Keep count of opens and dec the module use count for each
93* outstanding open when shutdown is called (on disconnect).
94* -- Fixed sanity checks in read_bulk_callback and write_bulk_callback
95* so pointers are checked before use.
96* -- Split read bulk callback into in band and out of band
97* callbacks, and no longer restart read chains if there is
98* a status error or a sanity error. This fixed the seg
99* faults and other errors we used to get on disconnect.
100* -- Port->active is once again a flag as usb-serial intended it
101* to be, not a count. Since it was only a char it would
102* have been limited to 256 simultaneous opens. Now the open
103* count is kept in the port private structure in dp_open_count.
104* -- Added code for modularization of the digi_acceleport driver.
105*
106* (6/27/2000) pberger and borchers
107* -- Zeroed out sync field in the wakeup_task before first use;
108* otherwise the uninitialized value might prevent the task from
109* being scheduled.
110* -- Initialized ret value to 0 in write_bulk_callback, otherwise
111* the uninitialized value could cause a spurious debugging message.
112*
113* (6/22/2000) pberger and borchers
114* -- Made cond_wait_... inline--apparently on SPARC the flags arg
115* to spin_lock_irqsave cannot be passed to another function
116* to call spin_unlock_irqrestore. Thanks to Pauline Middelink.
117* -- In digi_set_modem_signals the inner nested spin locks use just
118* spin_lock() rather than spin_lock_irqsave(). The old code
119* mistakenly left interrupts off. Thanks to Pauline Middelink.
120* -- copy_from_user (which can sleep) is no longer called while a
121* spinlock is held. We copy to a local buffer before getting
122* the spinlock--don't like the extra copy but the code is simpler.
123* -- Printk and dbg are no longer called while a spin lock is held.
124*
125* (6/4/2000) pberger and borchers
126* -- Replaced separate calls to spin_unlock_irqrestore and
127* interruptible_sleep_on_timeout with a new function
128* cond_wait_interruptible_timeout_irqrestore. This eliminates
129* the race condition where the wake up could happen after
130* the unlock and before the sleep.
131* -- Close now waits for output to drain.
132* -- Open waits until any close in progress is finished.
133* -- All out of band responses are now processed, not just the
134* first in a USB packet.
135* -- Fixed a bug that prevented the driver from working when the
136* first Digi port was not the first USB serial port--the driver
137* was mistakenly using the external USB serial port number to
138* try to index into its internal ports.
139* -- Fixed an SMP bug -- write_bulk_callback is called directly from
140* an interrupt, so spin_lock_irqsave/spin_unlock_irqrestore are
141* needed for locks outside write_bulk_callback that are also
142* acquired by write_bulk_callback to prevent deadlocks.
143* -- Fixed support for select() by making digi_chars_in_buffer()
144* return 256 when -EINPROGRESS is set, as the line discipline
145* code in n_tty.c expects.
146* -- Fixed an include file ordering problem that prevented debugging
147* messages from working.
148* -- Fixed an intermittent timeout problem that caused writes to
149* sometimes get stuck on some machines on some kernels. It turns
150* out in these circumstances write_chan() (in n_tty.c) was
151* asleep waiting for our wakeup call. Even though we call
152* wake_up_interruptible() in digi_write_bulk_callback(), there is
153* a race condition that could cause the wakeup to fail: if our
154* wake_up_interruptible() call occurs between the time that our
155* driver write routine finishes and write_chan() sets current->state
156* to TASK_INTERRUPTIBLE, the effect of our wakeup setting the state
157* to TASK_RUNNING will be lost and write_chan's subsequent call to
158* schedule() will never return (unless it catches a signal).
159* This race condition occurs because write_bulk_callback() (and thus
160* the wakeup) are called asynchonously from an interrupt, rather than
161* from the scheduler. We can avoid the race by calling the wakeup
162* from the scheduler queue and that's our fix: Now, at the end of
163* write_bulk_callback() we queue up a wakeup call on the scheduler
164* task queue. We still also invoke the wakeup directly since that
165* squeezes a bit more performance out of the driver, and any lost
166* race conditions will get cleaned up at the next scheduler run.
167*
168* NOTE: The problem also goes away if you comment out
169* the two code lines in write_chan() where current->state
170* is set to TASK_RUNNING just before calling driver.write() and to
171* TASK_INTERRUPTIBLE immediately afterwards. This is why the
172* problem did not show up with the 2.2 kernels -- they do not
173* include that code.
174*
175* (5/16/2000) pberger and borchers
176* -- Added timeouts to sleeps, to defend against lost wake ups.
177* -- Handle transition to/from B0 baud rate in digi_set_termios.
178*
179* (5/13/2000) pberger and borchers
180* -- All commands now sent on out of band port, using
181* digi_write_oob_command.
182* -- Get modem control signals whenever they change, support TIOCMGET/
183* SET/BIS/BIC ioctls.
184* -- digi_set_termios now supports parity, word size, stop bits, and
185* receive enable.
186* -- Cleaned up open and close, use digi_set_termios and
187* digi_write_oob_command to set port parameters.
188* -- Added digi_startup_device to start read chains on all ports.
189* -- Write buffer is only used when count==1, to be sure put_char can
190* write a char (unless the buffer is full).
191*
192* (5/10/2000) pberger and borchers
193* -- Added MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT calls on open/close.
194* -- Fixed problem where the first incoming character is lost on
195* port opens after the first close on that port. Now we keep
196* the read_urb chain open until shutdown.
197* -- Added more port conditioning calls in digi_open and digi_close.
198* -- Convert port->active to a use count so that we can deal with multiple
199* opens and closes properly.
200* -- Fixed some problems with the locking code.
201*
202* (5/3/2000) pberger and borchers
203* -- First alpha version of the driver--many known limitations and bugs.
204*
205*
206* Locking and SMP
207*
208* - Each port, including the out-of-band port, has a lock used to
209* serialize all access to the port's private structure.
210* - The port lock is also used to serialize all writes and access to
211* the port's URB.
212* - The port lock is also used for the port write_wait condition
213* variable. Holding the port lock will prevent a wake up on the
214* port's write_wait; this can be used with cond_wait_... to be sure
215* the wake up is not lost in a race when dropping the lock and
216* sleeping waiting for the wakeup.
217* - digi_write() does not sleep, since it is sometimes called on
218* interrupt time.
219* - digi_write_bulk_callback() and digi_read_bulk_callback() are
220* called directly from interrupts. Hence spin_lock_irqsave()
221* and spin_unlock_irqrestore() are used in the rest of the code
222* for any locks they acquire.
223* - digi_write_bulk_callback() gets the port lock before waking up
224* processes sleeping on the port write_wait. It also schedules
225* wake ups so they happen from the scheduler, because the tty
226* system can miss wake ups from interrupts.
227* - All sleeps use a timeout of DIGI_RETRY_TIMEOUT before looping to
228* recheck the condition they are sleeping on. This is defensive,
229* in case a wake up is lost.
230* - Following Documentation/DocBook/kernel-locking.pdf no spin locks
231* are held when calling copy_to/from_user or printk.
232*
233* $Id: digi_acceleport.c,v 1.80.1.2 2000/11/02 05:45:08 root Exp $
234*/
235
236#include <linux/config.h>
237#include <linux/kernel.h>
238#include <linux/errno.h>
239#include <linux/init.h>
240#include <linux/slab.h>
241#include <linux/tty.h>
242#include <linux/tty_driver.h>
243#include <linux/tty_flip.h>
244#include <linux/module.h>
245#include <linux/spinlock.h>
246#include <linux/workqueue.h>
247#include <asm/uaccess.h>
248#include <linux/usb.h>
249#include <linux/wait.h>
250#include "usb-serial.h"
251
252/* Defines */
253
254/*
255 * Version Information
256 */
257#define DRIVER_VERSION "v1.80.1.2"
258#define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>"
259#define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver"
260
261/* port output buffer length -- must be <= transfer buffer length - 2 */
262/* so we can be sure to send the full buffer in one urb */
263#define DIGI_OUT_BUF_SIZE 8
264
265/* port input buffer length -- must be >= transfer buffer length - 3 */
266/* so we can be sure to hold at least one full buffer from one urb */
267#define DIGI_IN_BUF_SIZE 64
268
269/* retry timeout while sleeping */
270#define DIGI_RETRY_TIMEOUT (HZ/10)
271
272/* timeout while waiting for tty output to drain in close */
273/* this delay is used twice in close, so the total delay could */
274/* be twice this value */
275#define DIGI_CLOSE_TIMEOUT (5*HZ)
276
277
278/* AccelePort USB Defines */
279
280/* ids */
281#define DIGI_VENDOR_ID 0x05c5
282#define DIGI_2_ID 0x0002 /* USB-2 */
283#define DIGI_4_ID 0x0004 /* USB-4 */
284
285/* commands
286 * "INB": can be used on the in-band endpoint
287 * "OOB": can be used on the out-of-band endpoint
288 */
289#define DIGI_CMD_SET_BAUD_RATE 0 /* INB, OOB */
290#define DIGI_CMD_SET_WORD_SIZE 1 /* INB, OOB */
291#define DIGI_CMD_SET_PARITY 2 /* INB, OOB */
292#define DIGI_CMD_SET_STOP_BITS 3 /* INB, OOB */
293#define DIGI_CMD_SET_INPUT_FLOW_CONTROL 4 /* INB, OOB */
294#define DIGI_CMD_SET_OUTPUT_FLOW_CONTROL 5 /* INB, OOB */
295#define DIGI_CMD_SET_DTR_SIGNAL 6 /* INB, OOB */
296#define DIGI_CMD_SET_RTS_SIGNAL 7 /* INB, OOB */
297#define DIGI_CMD_READ_INPUT_SIGNALS 8 /* OOB */
298#define DIGI_CMD_IFLUSH_FIFO 9 /* OOB */
299#define DIGI_CMD_RECEIVE_ENABLE 10 /* INB, OOB */
300#define DIGI_CMD_BREAK_CONTROL 11 /* INB, OOB */
301#define DIGI_CMD_LOCAL_LOOPBACK 12 /* INB, OOB */
302#define DIGI_CMD_TRANSMIT_IDLE 13 /* INB, OOB */
303#define DIGI_CMD_READ_UART_REGISTER 14 /* OOB */
304#define DIGI_CMD_WRITE_UART_REGISTER 15 /* INB, OOB */
305#define DIGI_CMD_AND_UART_REGISTER 16 /* INB, OOB */
306#define DIGI_CMD_OR_UART_REGISTER 17 /* INB, OOB */
307#define DIGI_CMD_SEND_DATA 18 /* INB */
308#define DIGI_CMD_RECEIVE_DATA 19 /* INB */
309#define DIGI_CMD_RECEIVE_DISABLE 20 /* INB */
310#define DIGI_CMD_GET_PORT_TYPE 21 /* OOB */
311
312/* baud rates */
313#define DIGI_BAUD_50 0
314#define DIGI_BAUD_75 1
315#define DIGI_BAUD_110 2
316#define DIGI_BAUD_150 3
317#define DIGI_BAUD_200 4
318#define DIGI_BAUD_300 5
319#define DIGI_BAUD_600 6
320#define DIGI_BAUD_1200 7
321#define DIGI_BAUD_1800 8
322#define DIGI_BAUD_2400 9
323#define DIGI_BAUD_4800 10
324#define DIGI_BAUD_7200 11
325#define DIGI_BAUD_9600 12
326#define DIGI_BAUD_14400 13
327#define DIGI_BAUD_19200 14
328#define DIGI_BAUD_28800 15
329#define DIGI_BAUD_38400 16
330#define DIGI_BAUD_57600 17
331#define DIGI_BAUD_76800 18
332#define DIGI_BAUD_115200 19
333#define DIGI_BAUD_153600 20
334#define DIGI_BAUD_230400 21
335#define DIGI_BAUD_460800 22
336
337/* arguments */
338#define DIGI_WORD_SIZE_5 0
339#define DIGI_WORD_SIZE_6 1
340#define DIGI_WORD_SIZE_7 2
341#define DIGI_WORD_SIZE_8 3
342
343#define DIGI_PARITY_NONE 0
344#define DIGI_PARITY_ODD 1
345#define DIGI_PARITY_EVEN 2
346#define DIGI_PARITY_MARK 3
347#define DIGI_PARITY_SPACE 4
348
349#define DIGI_STOP_BITS_1 0
350#define DIGI_STOP_BITS_2 1
351
352#define DIGI_INPUT_FLOW_CONTROL_XON_XOFF 1
353#define DIGI_INPUT_FLOW_CONTROL_RTS 2
354#define DIGI_INPUT_FLOW_CONTROL_DTR 4
355
356#define DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF 1
357#define DIGI_OUTPUT_FLOW_CONTROL_CTS 2
358#define DIGI_OUTPUT_FLOW_CONTROL_DSR 4
359
360#define DIGI_DTR_INACTIVE 0
361#define DIGI_DTR_ACTIVE 1
362#define DIGI_DTR_INPUT_FLOW_CONTROL 2
363
364#define DIGI_RTS_INACTIVE 0
365#define DIGI_RTS_ACTIVE 1
366#define DIGI_RTS_INPUT_FLOW_CONTROL 2
367#define DIGI_RTS_TOGGLE 3
368
369#define DIGI_FLUSH_TX 1
370#define DIGI_FLUSH_RX 2
371#define DIGI_RESUME_TX 4 /* clears xoff condition */
372
373#define DIGI_TRANSMIT_NOT_IDLE 0
374#define DIGI_TRANSMIT_IDLE 1
375
376#define DIGI_DISABLE 0
377#define DIGI_ENABLE 1
378
379#define DIGI_DEASSERT 0
380#define DIGI_ASSERT 1
381
382/* in band status codes */
383#define DIGI_OVERRUN_ERROR 4
384#define DIGI_PARITY_ERROR 8
385#define DIGI_FRAMING_ERROR 16
386#define DIGI_BREAK_ERROR 32
387
388/* out of band status */
389#define DIGI_NO_ERROR 0
390#define DIGI_BAD_FIRST_PARAMETER 1
391#define DIGI_BAD_SECOND_PARAMETER 2
392#define DIGI_INVALID_LINE 3
393#define DIGI_INVALID_OPCODE 4
394
395/* input signals */
396#define DIGI_READ_INPUT_SIGNALS_SLOT 1
397#define DIGI_READ_INPUT_SIGNALS_ERR 2
398#define DIGI_READ_INPUT_SIGNALS_BUSY 4
399#define DIGI_READ_INPUT_SIGNALS_PE 8
400#define DIGI_READ_INPUT_SIGNALS_CTS 16
401#define DIGI_READ_INPUT_SIGNALS_DSR 32
402#define DIGI_READ_INPUT_SIGNALS_RI 64
403#define DIGI_READ_INPUT_SIGNALS_DCD 128
404
405
406/* Structures */
407
408struct digi_serial {
409 spinlock_t ds_serial_lock;
410 struct usb_serial_port *ds_oob_port; /* out-of-band port */
411 int ds_oob_port_num; /* index of out-of-band port */
412 int ds_device_started;
413};
414
415struct digi_port {
416 spinlock_t dp_port_lock;
417 int dp_port_num;
418 int dp_out_buf_len;
419 unsigned char dp_out_buf[DIGI_OUT_BUF_SIZE];
420 int dp_in_buf_len;
421 unsigned char dp_in_buf[DIGI_IN_BUF_SIZE];
422 unsigned char dp_in_flag_buf[DIGI_IN_BUF_SIZE];
423 int dp_write_urb_in_use;
424 unsigned int dp_modem_signals;
425 wait_queue_head_t dp_modem_change_wait;
426 int dp_transmit_idle;
427 wait_queue_head_t dp_transmit_idle_wait;
428 int dp_throttled;
429 int dp_throttle_restart;
430 wait_queue_head_t dp_flush_wait;
431 int dp_in_close; /* close in progress */
432 wait_queue_head_t dp_close_wait; /* wait queue for close */
433 struct work_struct dp_wakeup_work;
434};
435
436
437/* Local Function Declarations */
438
439static void digi_wakeup_write( struct usb_serial_port *port );
440static void digi_wakeup_write_lock(void *);
441static int digi_write_oob_command( struct usb_serial_port *port,
442 unsigned char *buf, int count, int interruptible );
443static int digi_write_inb_command( struct usb_serial_port *port,
444 unsigned char *buf, int count, unsigned long timeout );
445static int digi_set_modem_signals( struct usb_serial_port *port,
446 unsigned int modem_signals, int interruptible );
447static int digi_transmit_idle( struct usb_serial_port *port,
448 unsigned long timeout );
449static void digi_rx_throttle (struct usb_serial_port *port);
450static void digi_rx_unthrottle (struct usb_serial_port *port);
451static void digi_set_termios( struct usb_serial_port *port,
452 struct termios *old_termios );
453static void digi_break_ctl( struct usb_serial_port *port, int break_state );
454static int digi_ioctl( struct usb_serial_port *port, struct file *file,
455 unsigned int cmd, unsigned long arg );
456static int digi_tiocmget( struct usb_serial_port *port, struct file *file );
457static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
458 unsigned int set, unsigned int clear );
459static int digi_write( struct usb_serial_port *port, const unsigned char *buf, int count );
460static void digi_write_bulk_callback( struct urb *urb, struct pt_regs *regs );
461static int digi_write_room( struct usb_serial_port *port );
462static int digi_chars_in_buffer( struct usb_serial_port *port );
463static int digi_open( struct usb_serial_port *port, struct file *filp );
464static void digi_close( struct usb_serial_port *port, struct file *filp );
465static int digi_startup_device( struct usb_serial *serial );
466static int digi_startup( struct usb_serial *serial );
467static void digi_shutdown( struct usb_serial *serial );
468static void digi_read_bulk_callback( struct urb *urb, struct pt_regs *regs );
469static int digi_read_inb_callback( struct urb *urb );
470static int digi_read_oob_callback( struct urb *urb );
471
472
473/* Statics */
474
475static int debug;
476
477static struct usb_device_id id_table_combined [] = {
478 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
479 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
480 { } /* Terminating entry */
481};
482
483static struct usb_device_id id_table_2 [] = {
484 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) },
485 { } /* Terminating entry */
486};
487
488static struct usb_device_id id_table_4 [] = {
489 { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) },
490 { } /* Terminating entry */
491};
492
493MODULE_DEVICE_TABLE (usb, id_table_combined);
494
495static struct usb_driver digi_driver = {
496 .owner = THIS_MODULE,
497 .name = "digi_acceleport",
498 .probe = usb_serial_probe,
499 .disconnect = usb_serial_disconnect,
500 .id_table = id_table_combined,
501};
502
503
504/* device info needed for the Digi serial converter */
505
506static struct usb_serial_device_type digi_acceleport_2_device = {
507 .owner = THIS_MODULE,
508 .name = "Digi 2 port USB adapter",
509 .short_name = "digi_2",
510 .id_table = id_table_2,
511 .num_interrupt_in = 0,
512 .num_bulk_in = 4,
513 .num_bulk_out = 4,
514 .num_ports = 3,
515 .open = digi_open,
516 .close = digi_close,
517 .write = digi_write,
518 .write_room = digi_write_room,
519 .write_bulk_callback = digi_write_bulk_callback,
520 .read_bulk_callback = digi_read_bulk_callback,
521 .chars_in_buffer = digi_chars_in_buffer,
522 .throttle = digi_rx_throttle,
523 .unthrottle = digi_rx_unthrottle,
524 .ioctl = digi_ioctl,
525 .set_termios = digi_set_termios,
526 .break_ctl = digi_break_ctl,
527 .tiocmget = digi_tiocmget,
528 .tiocmset = digi_tiocmset,
529 .attach = digi_startup,
530 .shutdown = digi_shutdown,
531};
532
533static struct usb_serial_device_type digi_acceleport_4_device = {
534 .owner = THIS_MODULE,
535 .name = "Digi 4 port USB adapter",
536 .short_name = "digi_4",
537 .id_table = id_table_4,
538 .num_interrupt_in = 0,
539 .num_bulk_in = 5,
540 .num_bulk_out = 5,
541 .num_ports = 4,
542 .open = digi_open,
543 .close = digi_close,
544 .write = digi_write,
545 .write_room = digi_write_room,
546 .write_bulk_callback = digi_write_bulk_callback,
547 .read_bulk_callback = digi_read_bulk_callback,
548 .chars_in_buffer = digi_chars_in_buffer,
549 .throttle = digi_rx_throttle,
550 .unthrottle = digi_rx_unthrottle,
551 .ioctl = digi_ioctl,
552 .set_termios = digi_set_termios,
553 .break_ctl = digi_break_ctl,
554 .tiocmget = digi_tiocmget,
555 .tiocmset = digi_tiocmset,
556 .attach = digi_startup,
557 .shutdown = digi_shutdown,
558};
559
560
561/* Functions */
562
563/*
564* Cond Wait Interruptible Timeout Irqrestore
565*
566* Do spin_unlock_irqrestore and interruptible_sleep_on_timeout
567* so that wake ups are not lost if they occur between the unlock
568* and the sleep. In other words, spin_unlock_irqrestore and
569* interruptible_sleep_on_timeout are "atomic" with respect to
570* wake ups. This is used to implement condition variables.
571*/
572
573static inline long cond_wait_interruptible_timeout_irqrestore(
574 wait_queue_head_t *q, long timeout,
575 spinlock_t *lock, unsigned long flags )
576{
577 DEFINE_WAIT(wait);
578
579 prepare_to_wait(q, &wait, TASK_UNINTERRUPTIBLE);
580 spin_unlock_irqrestore(lock, flags);
581 timeout = schedule_timeout(timeout);
582 finish_wait(q, &wait);
583
584 return timeout;
585
586}
587
588
589/*
590* Digi Wakeup Write
591*
592* Wake up port, line discipline, and tty processes sleeping
593* on writes.
594*/
595
596static void digi_wakeup_write_lock(void *arg)
597{
598 struct usb_serial_port *port = arg;
599 unsigned long flags;
600 struct digi_port *priv = usb_get_serial_port_data(port);
601
602
603 spin_lock_irqsave( &priv->dp_port_lock, flags );
604 digi_wakeup_write( port );
605 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
606}
607
608static void digi_wakeup_write( struct usb_serial_port *port )
609{
610
611 struct tty_struct *tty = port->tty;
612
613
614 /* wake up port processes */
615 wake_up_interruptible( &port->write_wait );
616
617 /* wake up line discipline */
618 tty_wakeup(tty);
619}
620
621
622/*
623* Digi Write OOB Command
624*
625* Write commands on the out of band port. Commands are 4
626* bytes each, multiple commands can be sent at once, and
627* no command will be split across USB packets. Returns 0
628* if successful, -EINTR if interrupted while sleeping and
629* the interruptible flag is true, or a negative error
630* returned by usb_submit_urb.
631*/
632
633static int digi_write_oob_command( struct usb_serial_port *port,
634 unsigned char *buf, int count, int interruptible )
635{
636
637 int ret = 0;
638 int len;
639 struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
640 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
641 unsigned long flags = 0;
642
643
644dbg( "digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count );
645
646 spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
647
648 while( count > 0 ) {
649
650 while( oob_port->write_urb->status == -EINPROGRESS
651 || oob_priv->dp_write_urb_in_use ) {
652 cond_wait_interruptible_timeout_irqrestore(
653 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
654 &oob_priv->dp_port_lock, flags );
655 if( interruptible && signal_pending(current) ) {
656 return( -EINTR );
657 }
658 spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
659 }
660
661 /* len must be a multiple of 4, so commands are not split */
662 len = min(count, oob_port->bulk_out_size );
663 if( len > 4 )
664 len &= ~3;
665
666 memcpy( oob_port->write_urb->transfer_buffer, buf, len );
667 oob_port->write_urb->transfer_buffer_length = len;
668 oob_port->write_urb->dev = port->serial->dev;
669
670 if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
671 oob_priv->dp_write_urb_in_use = 1;
672 count -= len;
673 buf += len;
674 }
675
676 }
677
678 spin_unlock_irqrestore( &oob_priv->dp_port_lock, flags );
679
680 if( ret ) {
681 err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__,
682 ret );
683 }
684
685 return( ret );
686
687}
688
689
690/*
691* Digi Write In Band Command
692*
693* Write commands on the given port. Commands are 4
694* bytes each, multiple commands can be sent at once, and
695* no command will be split across USB packets. If timeout
696* is non-zero, write in band command will return after
697* waiting unsuccessfully for the URB status to clear for
698* timeout ticks. Returns 0 if successful, or a negative
699* error returned by digi_write.
700*/
701
702static int digi_write_inb_command( struct usb_serial_port *port,
703 unsigned char *buf, int count, unsigned long timeout )
704{
705
706 int ret = 0;
707 int len;
708 struct digi_port *priv = usb_get_serial_port_data(port);
709 unsigned char *data = port->write_urb->transfer_buffer;
710 unsigned long flags = 0;
711
712
713dbg( "digi_write_inb_command: TOP: port=%d, count=%d", priv->dp_port_num,
714count );
715
716 if( timeout )
717 timeout += jiffies;
718 else
719 timeout = ULONG_MAX;
720
721 spin_lock_irqsave( &priv->dp_port_lock, flags );
722
723 while( count > 0 && ret == 0 ) {
724
725 while( (port->write_urb->status == -EINPROGRESS
726 || priv->dp_write_urb_in_use) && time_before(jiffies, timeout)) {
727 cond_wait_interruptible_timeout_irqrestore(
728 &port->write_wait, DIGI_RETRY_TIMEOUT,
729 &priv->dp_port_lock, flags );
730 if( signal_pending(current) ) {
731 return( -EINTR );
732 }
733 spin_lock_irqsave( &priv->dp_port_lock, flags );
734 }
735
736 /* len must be a multiple of 4 and small enough to */
737 /* guarantee the write will send buffered data first, */
738 /* so commands are in order with data and not split */
739 len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len );
740 if( len > 4 )
741 len &= ~3;
742
743 /* write any buffered data first */
744 if( priv->dp_out_buf_len > 0 ) {
745 data[0] = DIGI_CMD_SEND_DATA;
746 data[1] = priv->dp_out_buf_len;
747 memcpy( data+2, priv->dp_out_buf,
748 priv->dp_out_buf_len );
749 memcpy( data+2+priv->dp_out_buf_len, buf, len );
750 port->write_urb->transfer_buffer_length
751 = priv->dp_out_buf_len+2+len;
752 } else {
753 memcpy( data, buf, len );
754 port->write_urb->transfer_buffer_length = len;
755 }
756 port->write_urb->dev = port->serial->dev;
757
758 if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
759 priv->dp_write_urb_in_use = 1;
760 priv->dp_out_buf_len = 0;
761 count -= len;
762 buf += len;
763 }
764
765 }
766
767 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
768
769 if( ret ) {
770 err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
771 ret, priv->dp_port_num );
772 }
773
774 return( ret );
775
776}
777
778
779/*
780* Digi Set Modem Signals
781*
782* Sets or clears DTR and RTS on the port, according to the
783* modem_signals argument. Use TIOCM_DTR and TIOCM_RTS flags
784* for the modem_signals argument. Returns 0 if successful,
785* -EINTR if interrupted while sleeping, or a non-zero error
786* returned by usb_submit_urb.
787*/
788
789static int digi_set_modem_signals( struct usb_serial_port *port,
790 unsigned int modem_signals, int interruptible )
791{
792
793 int ret;
794 struct digi_port *port_priv = usb_get_serial_port_data(port);
795 struct usb_serial_port *oob_port = (struct usb_serial_port *)((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port;
796 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
797 unsigned char *data = oob_port->write_urb->transfer_buffer;
798 unsigned long flags = 0;
799
800
801dbg( "digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x",
802port_priv->dp_port_num, modem_signals );
803
804 spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
805 spin_lock( &port_priv->dp_port_lock );
806
807 while( oob_port->write_urb->status == -EINPROGRESS
808 || oob_priv->dp_write_urb_in_use ) {
809 spin_unlock( &port_priv->dp_port_lock );
810 cond_wait_interruptible_timeout_irqrestore(
811 &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
812 &oob_priv->dp_port_lock, flags );
813 if( interruptible && signal_pending(current) ) {
814 return( -EINTR );
815 }
816 spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
817 spin_lock( &port_priv->dp_port_lock );
818 }
819
820 data[0] = DIGI_CMD_SET_DTR_SIGNAL;
821 data[1] = port_priv->dp_port_num;
822 data[2] = (modem_signals&TIOCM_DTR) ?
823 DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
824 data[3] = 0;
825
826 data[4] = DIGI_CMD_SET_RTS_SIGNAL;
827 data[5] = port_priv->dp_port_num;
828 data[6] = (modem_signals&TIOCM_RTS) ?
829 DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
830 data[7] = 0;
831
832 oob_port->write_urb->transfer_buffer_length = 8;
833 oob_port->write_urb->dev = port->serial->dev;
834
835 if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
836 oob_priv->dp_write_urb_in_use = 1;
837 port_priv->dp_modem_signals =
838 (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS))
839 | (modem_signals&(TIOCM_DTR|TIOCM_RTS));
840 }
841
842 spin_unlock( &port_priv->dp_port_lock );
843 spin_unlock_irqrestore( &oob_priv->dp_port_lock, flags );
844
845 if( ret ) {
846 err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__,
847 ret );
848 }
849
850 return( ret );
851
852}
853
854
855/*
856* Digi Transmit Idle
857*
858* Digi transmit idle waits, up to timeout ticks, for the transmitter
859* to go idle. It returns 0 if successful or a negative error.
860*
861* There are race conditions here if more than one process is calling
862* digi_transmit_idle on the same port at the same time. However, this
863* is only called from close, and only one process can be in close on a
864* port at a time, so its ok.
865*/
866
867static int digi_transmit_idle( struct usb_serial_port *port,
868 unsigned long timeout )
869{
870
871 int ret;
872 unsigned char buf[2];
873 struct digi_port *priv = usb_get_serial_port_data(port);
874 unsigned long flags = 0;
875
876
877 spin_lock_irqsave( &priv->dp_port_lock, flags );
878 priv->dp_transmit_idle = 0;
879 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
880
881 buf[0] = DIGI_CMD_TRANSMIT_IDLE;
882 buf[1] = 0;
883
884 timeout += jiffies;
885
886 if( (ret=digi_write_inb_command( port, buf, 2, timeout-jiffies )) != 0 )
887 return( ret );
888
889 spin_lock_irqsave( &priv->dp_port_lock, flags );
890
891 while( time_before(jiffies, timeout) && !priv->dp_transmit_idle ) {
892 cond_wait_interruptible_timeout_irqrestore(
893 &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT,
894 &priv->dp_port_lock, flags );
895 if( signal_pending(current) ) {
896 return( -EINTR );
897 }
898 spin_lock_irqsave( &priv->dp_port_lock, flags );
899 }
900
901 priv->dp_transmit_idle = 0;
902 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
903
904 return( 0 );
905
906}
907
908
909static void digi_rx_throttle( struct usb_serial_port *port )
910{
911
912 unsigned long flags;
913 struct digi_port *priv = usb_get_serial_port_data(port);
914
915
916dbg( "digi_rx_throttle: TOP: port=%d", priv->dp_port_num );
917
918 /* stop receiving characters by not resubmitting the read urb */
919 spin_lock_irqsave( &priv->dp_port_lock, flags );
920 priv->dp_throttled = 1;
921 priv->dp_throttle_restart = 0;
922 priv->dp_in_buf_len = 0;
923 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
924
925}
926
927
928static void digi_rx_unthrottle( struct usb_serial_port *port )
929{
930
931 int ret = 0;
932 int len;
933 unsigned long flags;
934 struct digi_port *priv = usb_get_serial_port_data(port);
935 struct tty_struct *tty = port->tty;
936
937
938dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num );
939
940 spin_lock_irqsave( &priv->dp_port_lock, flags );
941
942 /* send any buffered chars from throttle time on to tty subsystem */
943 len = min(priv->dp_in_buf_len, TTY_FLIPBUF_SIZE - tty->flip.count );
944 if( len > 0 ) {
945 memcpy( tty->flip.char_buf_ptr, priv->dp_in_buf, len );
946 memcpy( tty->flip.flag_buf_ptr, priv->dp_in_flag_buf, len );
947 tty->flip.char_buf_ptr += len;
948 tty->flip.flag_buf_ptr += len;
949 tty->flip.count += len;
950 tty_flip_buffer_push( tty );
951 }
952
953 /* restart read chain */
954 if( priv->dp_throttle_restart ) {
955 port->read_urb->dev = port->serial->dev;
956 ret = usb_submit_urb( port->read_urb, GFP_ATOMIC );
957 }
958
959 /* turn throttle off */
960 priv->dp_throttled = 0;
961 priv->dp_in_buf_len = 0;
962 priv->dp_throttle_restart = 0;
963
964 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
965
966 if( ret ) {
967 err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
968 ret, priv->dp_port_num );
969 }
970
971}
972
973
974static void digi_set_termios( struct usb_serial_port *port,
975 struct termios *old_termios )
976{
977
978 struct digi_port *priv = usb_get_serial_port_data(port);
979 unsigned int iflag = port->tty->termios->c_iflag;
980 unsigned int cflag = port->tty->termios->c_cflag;
981 unsigned int old_iflag = old_termios->c_iflag;
982 unsigned int old_cflag = old_termios->c_cflag;
983 unsigned char buf[32];
984 unsigned int modem_signals;
985 int arg,ret;
986 int i = 0;
987
988
989dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag );
990
991 /* set baud rate */
992 if( (cflag&CBAUD) != (old_cflag&CBAUD) ) {
993
994 arg = -1;
995
996 /* reassert DTR and (maybe) RTS on transition from B0 */
997 if( (old_cflag&CBAUD) == B0 ) {
998 /* don't set RTS if using hardware flow control */
999 /* and throttling input */
1000 modem_signals = TIOCM_DTR;
1001 if( !(port->tty->termios->c_cflag & CRTSCTS) ||
1002 !test_bit(TTY_THROTTLED, &port->tty->flags) ) {
1003 modem_signals |= TIOCM_RTS;
1004 }
1005 digi_set_modem_signals( port, modem_signals, 1 );
1006 }
1007
1008 switch( (cflag&CBAUD) ) {
1009 /* drop DTR and RTS on transition to B0 */
1010 case B0: digi_set_modem_signals( port, 0, 1 ); break;
1011 case B50: arg = DIGI_BAUD_50; break;
1012 case B75: arg = DIGI_BAUD_75; break;
1013 case B110: arg = DIGI_BAUD_110; break;
1014 case B150: arg = DIGI_BAUD_150; break;
1015 case B200: arg = DIGI_BAUD_200; break;
1016 case B300: arg = DIGI_BAUD_300; break;
1017 case B600: arg = DIGI_BAUD_600; break;
1018 case B1200: arg = DIGI_BAUD_1200; break;
1019 case B1800: arg = DIGI_BAUD_1800; break;
1020 case B2400: arg = DIGI_BAUD_2400; break;
1021 case B4800: arg = DIGI_BAUD_4800; break;
1022 case B9600: arg = DIGI_BAUD_9600; break;
1023 case B19200: arg = DIGI_BAUD_19200; break;
1024 case B38400: arg = DIGI_BAUD_38400; break;
1025 case B57600: arg = DIGI_BAUD_57600; break;
1026 case B115200: arg = DIGI_BAUD_115200; break;
1027 case B230400: arg = DIGI_BAUD_230400; break;
1028 case B460800: arg = DIGI_BAUD_460800; break;
1029 default:
1030 dbg( "digi_set_termios: can't handle baud rate 0x%x",
1031 (cflag&CBAUD) );
1032 break;
1033 }
1034
1035 if( arg != -1 ) {
1036 buf[i++] = DIGI_CMD_SET_BAUD_RATE;
1037 buf[i++] = priv->dp_port_num;
1038 buf[i++] = arg;
1039 buf[i++] = 0;
1040 }
1041
1042 }
1043
1044 /* set parity */
1045 if( (cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD)) ) {
1046
1047 if( (cflag&PARENB) ) {
1048 if( (cflag&PARODD) )
1049 arg = DIGI_PARITY_ODD;
1050 else
1051 arg = DIGI_PARITY_EVEN;
1052 } else {
1053 arg = DIGI_PARITY_NONE;
1054 }
1055
1056 buf[i++] = DIGI_CMD_SET_PARITY;
1057 buf[i++] = priv->dp_port_num;
1058 buf[i++] = arg;
1059 buf[i++] = 0;
1060
1061 }
1062
1063 /* set word size */
1064 if( (cflag&CSIZE) != (old_cflag&CSIZE) ) {
1065
1066 arg = -1;
1067
1068 switch( (cflag&CSIZE) ) {
1069 case CS5: arg = DIGI_WORD_SIZE_5; break;
1070 case CS6: arg = DIGI_WORD_SIZE_6; break;
1071 case CS7: arg = DIGI_WORD_SIZE_7; break;
1072 case CS8: arg = DIGI_WORD_SIZE_8; break;
1073 default:
1074 dbg( "digi_set_termios: can't handle word size %d",
1075 (cflag&CSIZE) );
1076 break;
1077 }
1078
1079 if( arg != -1 ) {
1080 buf[i++] = DIGI_CMD_SET_WORD_SIZE;
1081 buf[i++] = priv->dp_port_num;
1082 buf[i++] = arg;
1083 buf[i++] = 0;
1084 }
1085
1086 }
1087
1088 /* set stop bits */
1089 if( (cflag&CSTOPB) != (old_cflag&CSTOPB) ) {
1090
1091 if( (cflag&CSTOPB) )
1092 arg = DIGI_STOP_BITS_2;
1093 else
1094 arg = DIGI_STOP_BITS_1;
1095
1096 buf[i++] = DIGI_CMD_SET_STOP_BITS;
1097 buf[i++] = priv->dp_port_num;
1098 buf[i++] = arg;
1099 buf[i++] = 0;
1100
1101 }
1102
1103 /* set input flow control */
1104 if( (iflag&IXOFF) != (old_iflag&IXOFF)
1105 || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
1106
1107 arg = 0;
1108
1109 if( (iflag&IXOFF) )
1110 arg |= DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
1111 else
1112 arg &= ~DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
1113
1114 if( (cflag&CRTSCTS) ) {
1115
1116 arg |= DIGI_INPUT_FLOW_CONTROL_RTS;
1117
1118 /* On USB-4 it is necessary to assert RTS prior */
1119 /* to selecting RTS input flow control. */
1120 buf[i++] = DIGI_CMD_SET_RTS_SIGNAL;
1121 buf[i++] = priv->dp_port_num;
1122 buf[i++] = DIGI_RTS_ACTIVE;
1123 buf[i++] = 0;
1124
1125 } else {
1126 arg &= ~DIGI_INPUT_FLOW_CONTROL_RTS;
1127 }
1128
1129 buf[i++] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
1130 buf[i++] = priv->dp_port_num;
1131 buf[i++] = arg;
1132 buf[i++] = 0;
1133
1134 }
1135
1136 /* set output flow control */
1137 if( (iflag&IXON) != (old_iflag&IXON)
1138 || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
1139
1140 arg = 0;
1141
1142 if( (iflag&IXON) )
1143 arg |= DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
1144 else
1145 arg &= ~DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
1146
1147 if( (cflag&CRTSCTS) ) {
1148 arg |= DIGI_OUTPUT_FLOW_CONTROL_CTS;
1149 } else {
1150 arg &= ~DIGI_OUTPUT_FLOW_CONTROL_CTS;
1151 port->tty->hw_stopped = 0;
1152 }
1153
1154 buf[i++] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
1155 buf[i++] = priv->dp_port_num;
1156 buf[i++] = arg;
1157 buf[i++] = 0;
1158
1159 }
1160
1161 /* set receive enable/disable */
1162 if( (cflag&CREAD) != (old_cflag&CREAD) ) {
1163
1164 if( (cflag&CREAD) )
1165 arg = DIGI_ENABLE;
1166 else
1167 arg = DIGI_DISABLE;
1168
1169 buf[i++] = DIGI_CMD_RECEIVE_ENABLE;
1170 buf[i++] = priv->dp_port_num;
1171 buf[i++] = arg;
1172 buf[i++] = 0;
1173
1174 }
1175
1176 if( (ret=digi_write_oob_command( port, buf, i, 1 )) != 0 )
1177 dbg( "digi_set_termios: write oob failed, ret=%d", ret );
1178
1179}
1180
1181
1182static void digi_break_ctl( struct usb_serial_port *port, int break_state )
1183{
1184
1185 unsigned char buf[4];
1186
1187
1188 buf[0] = DIGI_CMD_BREAK_CONTROL;
1189 buf[1] = 2; /* length */
1190 buf[2] = break_state ? 1 : 0;
1191 buf[3] = 0; /* pad */
1192
1193 digi_write_inb_command( port, buf, 4, 0 );
1194
1195}
1196
1197
1198static int digi_tiocmget( struct usb_serial_port *port, struct file *file )
1199{
1200 struct digi_port *priv = usb_get_serial_port_data(port);
1201 unsigned int val;
1202 unsigned long flags;
1203
1204 dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
1205
1206 spin_lock_irqsave( &priv->dp_port_lock, flags );
1207 val = priv->dp_modem_signals;
1208 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1209 return val;
1210}
1211
1212
1213static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
1214 unsigned int set, unsigned int clear )
1215{
1216 struct digi_port *priv = usb_get_serial_port_data(port);
1217 unsigned int val;
1218 unsigned long flags;
1219
1220 dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
1221
1222 spin_lock_irqsave( &priv->dp_port_lock, flags );
1223 val = (priv->dp_modem_signals & ~clear) | set;
1224 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1225 return digi_set_modem_signals( port, val, 1 );
1226}
1227
1228
1229static int digi_ioctl( struct usb_serial_port *port, struct file *file,
1230 unsigned int cmd, unsigned long arg )
1231{
1232
1233 struct digi_port *priv = usb_get_serial_port_data(port);
1234
1235dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd );
1236
1237 switch (cmd) {
1238
1239 case TIOCMIWAIT:
1240 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
1241 /* TODO */
1242 return( 0 );
1243
1244 case TIOCGICOUNT:
1245 /* return count of modemline transitions */
1246 /* TODO */
1247 return 0;
1248
1249 }
1250
1251 return( -ENOIOCTLCMD );
1252
1253}
1254
1255
1256static int digi_write( struct usb_serial_port *port, const unsigned char *buf, int count )
1257{
1258
1259 int ret,data_len,new_len;
1260 struct digi_port *priv = usb_get_serial_port_data(port);
1261 unsigned char *data = port->write_urb->transfer_buffer;
1262 unsigned long flags = 0;
1263
1264
1265dbg( "digi_write: TOP: port=%d, count=%d, in_interrupt=%ld",
1266priv->dp_port_num, count, in_interrupt() );
1267
1268 /* copy user data (which can sleep) before getting spin lock */
1269 count = min( count, port->bulk_out_size-2 );
1270 count = min( 64, count);
1271
1272 /* be sure only one write proceeds at a time */
1273 /* there are races on the port private buffer */
1274 /* and races to check write_urb->status */
1275 spin_lock_irqsave( &priv->dp_port_lock, flags );
1276
1277 /* wait for urb status clear to submit another urb */
1278 if( port->write_urb->status == -EINPROGRESS
1279 || priv->dp_write_urb_in_use ) {
1280
1281 /* buffer data if count is 1 (probably put_char) if possible */
1282 if( count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE ) {
1283 priv->dp_out_buf[priv->dp_out_buf_len++] = *buf;
1284 new_len = 1;
1285 } else {
1286 new_len = 0;
1287 }
1288
1289 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1290
1291 return( new_len );
1292
1293 }
1294
1295 /* allow space for any buffered data and for new data, up to */
1296 /* transfer buffer size - 2 (for command and length bytes) */
1297 new_len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
1298 data_len = new_len + priv->dp_out_buf_len;
1299
1300 if( data_len == 0 ) {
1301 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1302 return( 0 );
1303 }
1304
1305 port->write_urb->transfer_buffer_length = data_len+2;
1306 port->write_urb->dev = port->serial->dev;
1307
1308 *data++ = DIGI_CMD_SEND_DATA;
1309 *data++ = data_len;
1310
1311 /* copy in buffered data first */
1312 memcpy( data, priv->dp_out_buf, priv->dp_out_buf_len );
1313 data += priv->dp_out_buf_len;
1314
1315 /* copy in new data */
1316 memcpy( data, buf, new_len );
1317
1318 if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
1319 priv->dp_write_urb_in_use = 1;
1320 ret = new_len;
1321 priv->dp_out_buf_len = 0;
1322 }
1323
1324 /* return length of new data written, or error */
1325 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1326 if( ret < 0 ) {
1327 err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
1328 ret, priv->dp_port_num );
1329 }
1330
1331dbg( "digi_write: returning %d", ret );
1332 return( ret );
1333
1334}
1335
1336
1337static void digi_write_bulk_callback( struct urb *urb, struct pt_regs *regs )
1338{
1339
1340 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1341 struct usb_serial *serial;
1342 struct digi_port *priv;
1343 struct digi_serial *serial_priv;
1344 int ret = 0;
1345
1346
1347dbg( "digi_write_bulk_callback: TOP, urb->status=%d", urb->status );
1348
1349 /* port and serial sanity check */
1350 if( port == NULL || (priv=usb_get_serial_port_data(port)) == NULL ) {
1351 err("%s: port or port->private is NULL, status=%d", __FUNCTION__,
1352 urb->status );
1353 return;
1354 }
1355 serial = port->serial;
1356 if( serial == NULL || (serial_priv=usb_get_serial_data(serial)) == NULL ) {
1357 err("%s: serial or serial->private is NULL, status=%d", __FUNCTION__, urb->status );
1358 return;
1359 }
1360
1361 /* handle oob callback */
1362 if( priv->dp_port_num == serial_priv->ds_oob_port_num ) {
1363 dbg( "digi_write_bulk_callback: oob callback" );
1364 spin_lock( &priv->dp_port_lock );
1365 priv->dp_write_urb_in_use = 0;
1366 wake_up_interruptible( &port->write_wait );
1367 spin_unlock( &priv->dp_port_lock );
1368 return;
1369 }
1370
1371 /* try to send any buffered data on this port, if it is open */
1372 spin_lock( &priv->dp_port_lock );
1373 priv->dp_write_urb_in_use = 0;
1374 if( port->open_count && port->write_urb->status != -EINPROGRESS
1375 && priv->dp_out_buf_len > 0 ) {
1376
1377 *((unsigned char *)(port->write_urb->transfer_buffer))
1378 = (unsigned char)DIGI_CMD_SEND_DATA;
1379 *((unsigned char *)(port->write_urb->transfer_buffer)+1)
1380 = (unsigned char)priv->dp_out_buf_len;
1381
1382 port->write_urb->transfer_buffer_length
1383 = priv->dp_out_buf_len+2;
1384 port->write_urb->dev = serial->dev;
1385
1386 memcpy( port->write_urb->transfer_buffer+2, priv->dp_out_buf,
1387 priv->dp_out_buf_len );
1388
1389 if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
1390 priv->dp_write_urb_in_use = 1;
1391 priv->dp_out_buf_len = 0;
1392 }
1393
1394 }
1395
1396 /* wake up processes sleeping on writes immediately */
1397 digi_wakeup_write( port );
1398
1399 /* also queue up a wakeup at scheduler time, in case we */
1400 /* lost the race in write_chan(). */
1401 schedule_work(&priv->dp_wakeup_work);
1402
1403 spin_unlock( &priv->dp_port_lock );
1404
1405 if( ret ) {
1406 err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
1407 ret, priv->dp_port_num );
1408 }
1409
1410}
1411
1412
1413static int digi_write_room( struct usb_serial_port *port )
1414{
1415
1416 int room;
1417 struct digi_port *priv = usb_get_serial_port_data(port);
1418 unsigned long flags = 0;
1419
1420
1421 spin_lock_irqsave( &priv->dp_port_lock, flags );
1422
1423 if( port->write_urb->status == -EINPROGRESS
1424 || priv->dp_write_urb_in_use )
1425 room = 0;
1426 else
1427 room = port->bulk_out_size - 2 - priv->dp_out_buf_len;
1428
1429 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1430
1431dbg( "digi_write_room: port=%d, room=%d", priv->dp_port_num, room );
1432 return( room );
1433
1434}
1435
1436
1437static int digi_chars_in_buffer( struct usb_serial_port *port )
1438{
1439
1440 struct digi_port *priv = usb_get_serial_port_data(port);
1441
1442
1443 if( port->write_urb->status == -EINPROGRESS
1444 || priv->dp_write_urb_in_use ) {
1445dbg( "digi_chars_in_buffer: port=%d, chars=%d", priv->dp_port_num, port->bulk_out_size - 2 );
1446 /* return( port->bulk_out_size - 2 ); */
1447 return( 256 );
1448 } else {
1449dbg( "digi_chars_in_buffer: port=%d, chars=%d", priv->dp_port_num, priv->dp_out_buf_len );
1450 return( priv->dp_out_buf_len );
1451 }
1452
1453}
1454
1455
1456static int digi_open( struct usb_serial_port *port, struct file *filp )
1457{
1458
1459 int ret;
1460 unsigned char buf[32];
1461 struct digi_port *priv = usb_get_serial_port_data(port);
1462 struct termios not_termios;
1463 unsigned long flags = 0;
1464
1465
1466dbg( "digi_open: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count );
1467
1468 /* be sure the device is started up */
1469 if( digi_startup_device( port->serial ) != 0 )
1470 return( -ENXIO );
1471
1472 spin_lock_irqsave( &priv->dp_port_lock, flags );
1473
1474 /* don't wait on a close in progress for non-blocking opens */
1475 if( priv->dp_in_close && (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
1476 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1477 return( -EAGAIN );
1478 }
1479
1480 /* wait for a close in progress to finish */
1481 while( priv->dp_in_close ) {
1482 cond_wait_interruptible_timeout_irqrestore(
1483 &priv->dp_close_wait, DIGI_RETRY_TIMEOUT,
1484 &priv->dp_port_lock, flags );
1485 if( signal_pending(current) ) {
1486 return( -EINTR );
1487 }
1488 spin_lock_irqsave( &priv->dp_port_lock, flags );
1489 }
1490
1491 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1492
1493 /* read modem signals automatically whenever they change */
1494 buf[0] = DIGI_CMD_READ_INPUT_SIGNALS;
1495 buf[1] = priv->dp_port_num;
1496 buf[2] = DIGI_ENABLE;
1497 buf[3] = 0;
1498
1499 /* flush fifos */
1500 buf[4] = DIGI_CMD_IFLUSH_FIFO;
1501 buf[5] = priv->dp_port_num;
1502 buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1503 buf[7] = 0;
1504
1505 if( (ret=digi_write_oob_command( port, buf, 8, 1 )) != 0 )
1506 dbg( "digi_open: write oob failed, ret=%d", ret );
1507
1508 /* set termios settings */
1509 not_termios.c_cflag = ~port->tty->termios->c_cflag;
1510 not_termios.c_iflag = ~port->tty->termios->c_iflag;
1511 digi_set_termios( port, &not_termios );
1512
1513 /* set DTR and RTS */
1514 digi_set_modem_signals( port, TIOCM_DTR|TIOCM_RTS, 1 );
1515
1516 return( 0 );
1517
1518}
1519
1520
1521static void digi_close( struct usb_serial_port *port, struct file *filp )
1522{
1523 DEFINE_WAIT(wait);
1524 int ret;
1525 unsigned char buf[32];
1526 struct tty_struct *tty = port->tty;
1527 struct digi_port *priv = usb_get_serial_port_data(port);
1528 unsigned long flags = 0;
1529
1530
1531dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count );
1532
1533
1534 /* if disconnected, just clear flags */
1535 if (!usb_get_intfdata(port->serial->interface))
1536 goto exit;
1537
1538 /* do cleanup only after final close on this port */
1539 spin_lock_irqsave( &priv->dp_port_lock, flags );
1540 priv->dp_in_close = 1;
1541 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1542
1543 /* tell line discipline to process only XON/XOFF */
1544 tty->closing = 1;
1545
1546 /* wait for output to drain */
1547 if( (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
1548 tty_wait_until_sent( tty, DIGI_CLOSE_TIMEOUT );
1549 }
1550
1551 /* flush driver and line discipline buffers */
1552 if( tty->driver->flush_buffer )
1553 tty->driver->flush_buffer( tty );
1554 tty_ldisc_flush(tty);
1555
1556 if (port->serial->dev) {
1557 /* wait for transmit idle */
1558 if( (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
1559 digi_transmit_idle( port, DIGI_CLOSE_TIMEOUT );
1560 }
1561
1562 /* drop DTR and RTS */
1563 digi_set_modem_signals( port, 0, 0 );
1564
1565 /* disable input flow control */
1566 buf[0] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
1567 buf[1] = priv->dp_port_num;
1568 buf[2] = DIGI_DISABLE;
1569 buf[3] = 0;
1570
1571 /* disable output flow control */
1572 buf[4] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
1573 buf[5] = priv->dp_port_num;
1574 buf[6] = DIGI_DISABLE;
1575 buf[7] = 0;
1576
1577 /* disable reading modem signals automatically */
1578 buf[8] = DIGI_CMD_READ_INPUT_SIGNALS;
1579 buf[9] = priv->dp_port_num;
1580 buf[10] = DIGI_DISABLE;
1581 buf[11] = 0;
1582
1583 /* disable receive */
1584 buf[12] = DIGI_CMD_RECEIVE_ENABLE;
1585 buf[13] = priv->dp_port_num;
1586 buf[14] = DIGI_DISABLE;
1587 buf[15] = 0;
1588
1589 /* flush fifos */
1590 buf[16] = DIGI_CMD_IFLUSH_FIFO;
1591 buf[17] = priv->dp_port_num;
1592 buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
1593 buf[19] = 0;
1594
1595 if( (ret=digi_write_oob_command( port, buf, 20, 0 )) != 0 )
1596 dbg( "digi_close: write oob failed, ret=%d", ret );
1597
1598 /* wait for final commands on oob port to complete */
1599 prepare_to_wait(&priv->dp_flush_wait, &wait, TASK_UNINTERRUPTIBLE);
1600 schedule_timeout(DIGI_CLOSE_TIMEOUT);
1601 finish_wait(&priv->dp_flush_wait, &wait);
1602
1603 /* shutdown any outstanding bulk writes */
1604 usb_kill_urb(port->write_urb);
1605 }
1606
1607 tty->closing = 0;
1608
1609exit:
1610 spin_lock_irqsave( &priv->dp_port_lock, flags );
1611 priv->dp_write_urb_in_use = 0;
1612 priv->dp_in_close = 0;
1613 wake_up_interruptible( &priv->dp_close_wait );
1614 spin_unlock_irqrestore( &priv->dp_port_lock, flags );
1615
1616dbg( "digi_close: done" );
1617}
1618
1619
1620/*
1621* Digi Startup Device
1622*
1623* Starts reads on all ports. Must be called AFTER startup, with
1624* urbs initialized. Returns 0 if successful, non-zero error otherwise.
1625*/
1626
1627static int digi_startup_device( struct usb_serial *serial )
1628{
1629
1630 int i,ret = 0;
1631 struct digi_serial *serial_priv = usb_get_serial_data(serial);
1632 struct usb_serial_port *port;
1633
1634
1635 /* be sure this happens exactly once */
1636 spin_lock( &serial_priv->ds_serial_lock );
1637 if( serial_priv->ds_device_started ) {
1638 spin_unlock( &serial_priv->ds_serial_lock );
1639 return( 0 );
1640 }
1641 serial_priv->ds_device_started = 1;
1642 spin_unlock( &serial_priv->ds_serial_lock );
1643
1644 /* start reading from each bulk in endpoint for the device */
1645 /* set USB_DISABLE_SPD flag for write bulk urbs */
1646 for( i=0; i<serial->type->num_ports+1; i++ ) {
1647
1648 port = serial->port[i];
1649
1650 port->write_urb->dev = port->serial->dev;
1651
1652 if( (ret=usb_submit_urb(port->read_urb, GFP_KERNEL)) != 0 ) {
1653 err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
1654 ret, i );
1655 break;
1656 }
1657
1658 }
1659
1660 return( ret );
1661
1662}
1663
1664
1665static int digi_startup( struct usb_serial *serial )
1666{
1667
1668 int i;
1669 struct digi_port *priv;
1670 struct digi_serial *serial_priv;
1671
1672
1673dbg( "digi_startup: TOP" );
1674
1675 /* allocate the private data structures for all ports */
1676 /* number of regular ports + 1 for the out-of-band port */
1677 for( i=0; i<serial->type->num_ports+1; i++ ) {
1678
1679 /* allocate port private structure */
1680 priv = (struct digi_port *)kmalloc( sizeof(struct digi_port),
1681 GFP_KERNEL );
1682 if( priv == (struct digi_port *)0 ) {
1683 while( --i >= 0 )
1684 kfree( usb_get_serial_port_data(serial->port[i]) );
1685 return( 1 ); /* error */
1686 }
1687
1688 /* initialize port private structure */
1689 spin_lock_init( &priv->dp_port_lock );
1690 priv->dp_port_num = i;
1691 priv->dp_out_buf_len = 0;
1692 priv->dp_in_buf_len = 0;
1693 priv->dp_write_urb_in_use = 0;
1694 priv->dp_modem_signals = 0;
1695 init_waitqueue_head( &priv->dp_modem_change_wait );
1696 priv->dp_transmit_idle = 0;
1697 init_waitqueue_head( &priv->dp_transmit_idle_wait );
1698 priv->dp_throttled = 0;
1699 priv->dp_throttle_restart = 0;
1700 init_waitqueue_head( &priv->dp_flush_wait );
1701 priv->dp_in_close = 0;
1702 init_waitqueue_head( &priv->dp_close_wait );
1703 INIT_WORK(&priv->dp_wakeup_work,
1704 digi_wakeup_write_lock, serial->port[i]);
1705
1706 /* initialize write wait queue for this port */
1707 init_waitqueue_head( &serial->port[i]->write_wait );
1708
1709 usb_set_serial_port_data(serial->port[i], priv);
1710 }
1711
1712 /* allocate serial private structure */
1713 serial_priv = (struct digi_serial *)kmalloc( sizeof(struct digi_serial),
1714 GFP_KERNEL );
1715 if( serial_priv == (struct digi_serial *)0 ) {
1716 for( i=0; i<serial->type->num_ports+1; i++ )
1717 kfree( usb_get_serial_port_data(serial->port[i]) );
1718 return( 1 ); /* error */
1719 }
1720
1721 /* initialize serial private structure */
1722 spin_lock_init( &serial_priv->ds_serial_lock );
1723 serial_priv->ds_oob_port_num = serial->type->num_ports;
1724 serial_priv->ds_oob_port = serial->port[serial_priv->ds_oob_port_num];
1725 serial_priv->ds_device_started = 0;
1726 usb_set_serial_data(serial, serial_priv);
1727
1728 return( 0 );
1729
1730}
1731
1732
1733static void digi_shutdown( struct usb_serial *serial )
1734{
1735
1736 int i;
1737
1738
1739dbg( "digi_shutdown: TOP, in_interrupt()=%ld", in_interrupt() );
1740
1741 /* stop reads and writes on all ports */
1742 for( i=0; i<serial->type->num_ports+1; i++ ) {
1743 usb_kill_urb(serial->port[i]->read_urb);
1744 usb_kill_urb(serial->port[i]->write_urb);
1745 }
1746
1747 /* free the private data structures for all ports */
1748 /* number of regular ports + 1 for the out-of-band port */
1749 for( i=0; i<serial->type->num_ports+1; i++ )
1750 kfree( usb_get_serial_port_data(serial->port[i]) );
1751 kfree( usb_get_serial_data(serial) );
1752}
1753
1754
1755static void digi_read_bulk_callback( struct urb *urb, struct pt_regs *regs )
1756{
1757
1758 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1759 struct digi_port *priv;
1760 struct digi_serial *serial_priv;
1761 int ret;
1762
1763
1764dbg( "digi_read_bulk_callback: TOP" );
1765
1766 /* port sanity check, do not resubmit if port is not valid */
1767 if( port == NULL || (priv=usb_get_serial_port_data(port)) == NULL ) {
1768 err("%s: port or port->private is NULL, status=%d", __FUNCTION__,
1769 urb->status );
1770 return;
1771 }
1772 if( port->serial == NULL
1773 || (serial_priv=usb_get_serial_data(port->serial)) == NULL ) {
1774 err("%s: serial is bad or serial->private is NULL, status=%d", __FUNCTION__, urb->status );
1775 return;
1776 }
1777
1778 /* do not resubmit urb if it has any status error */
1779 if( urb->status ) {
1780 err("%s: nonzero read bulk status: status=%d, port=%d", __FUNCTION__, urb->status, priv->dp_port_num );
1781 return;
1782 }
1783
1784 /* handle oob or inb callback, do not resubmit if error */
1785 if( priv->dp_port_num == serial_priv->ds_oob_port_num ) {
1786 if( digi_read_oob_callback( urb ) != 0 )
1787 return;
1788 } else {
1789 if( digi_read_inb_callback( urb ) != 0 )
1790 return;
1791 }
1792
1793 /* continue read */
1794 urb->dev = port->serial->dev;
1795 if( (ret=usb_submit_urb(urb, GFP_ATOMIC)) != 0 ) {
1796 err("%s: failed resubmitting urb, ret=%d, port=%d", __FUNCTION__,
1797 ret, priv->dp_port_num );
1798 }
1799
1800}
1801
1802
1803/*
1804* Digi Read INB Callback
1805*
1806* Digi Read INB Callback handles reads on the in band ports, sending
1807* the data on to the tty subsystem. When called we know port and
1808* port->private are not NULL and port->serial has been validated.
1809* It returns 0 if successful, 1 if successful but the port is
1810* throttled, and -1 if the sanity checks failed.
1811*/
1812
1813static int digi_read_inb_callback( struct urb *urb )
1814{
1815
1816 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1817 struct tty_struct *tty = port->tty;
1818 struct digi_port *priv = usb_get_serial_port_data(port);
1819 int opcode = ((unsigned char *)urb->transfer_buffer)[0];
1820 int len = ((unsigned char *)urb->transfer_buffer)[1];
1821 int status = ((unsigned char *)urb->transfer_buffer)[2];
1822 unsigned char *data = ((unsigned char *)urb->transfer_buffer)+3;
1823 int flag,throttled;
1824
1825 /* do not process callbacks on closed ports */
1826 /* but do continue the read chain */
1827 if( port->open_count == 0 )
1828 return( 0 );
1829
1830 /* short/multiple packet check */
1831 if( urb->actual_length != len + 2 ) {
1832 err("%s: INCOMPLETE OR MULTIPLE PACKET, urb->status=%d, port=%d, opcode=%d, len=%d, actual_length=%d, status=%d", __FUNCTION__, urb->status, priv->dp_port_num, opcode, len, urb->actual_length, status );
1833 return( -1 );
1834 }
1835
1836 spin_lock( &priv->dp_port_lock );
1837
1838 /* check for throttle; if set, do not resubmit read urb */
1839 /* indicate the read chain needs to be restarted on unthrottle */
1840 throttled = priv->dp_throttled;
1841 if( throttled )
1842 priv->dp_throttle_restart = 1;
1843
1844 /* receive data */
1845 if( opcode == DIGI_CMD_RECEIVE_DATA ) {
1846
1847 /* get flag from status */
1848 flag = 0;
1849
1850 /* overrun is special, not associated with a char */
1851 if( status & DIGI_OVERRUN_ERROR ) {
1852 tty_insert_flip_char( tty, 0, TTY_OVERRUN );
1853 }
1854
1855 /* break takes precedence over parity, */
1856 /* which takes precedence over framing errors */
1857 if( status & DIGI_BREAK_ERROR ) {
1858 flag = TTY_BREAK;
1859 } else if( status & DIGI_PARITY_ERROR ) {
1860 flag = TTY_PARITY;
1861 } else if( status & DIGI_FRAMING_ERROR ) {
1862 flag = TTY_FRAME;
1863 }
1864
1865 /* data length is len-1 (one byte of len is status) */
1866 --len;
1867
1868 if( throttled ) {
1869
1870 len = min( len,
1871 DIGI_IN_BUF_SIZE - priv->dp_in_buf_len );
1872
1873 if( len > 0 ) {
1874 memcpy( priv->dp_in_buf + priv->dp_in_buf_len,
1875 data, len );
1876 memset( priv->dp_in_flag_buf
1877 + priv->dp_in_buf_len, flag, len );
1878 priv->dp_in_buf_len += len;
1879 }
1880
1881 } else {
1882
1883 len = min( len, TTY_FLIPBUF_SIZE - tty->flip.count );
1884
1885 if( len > 0 ) {
1886 memcpy( tty->flip.char_buf_ptr, data, len );
1887 memset( tty->flip.flag_buf_ptr, flag, len );
1888 tty->flip.char_buf_ptr += len;
1889 tty->flip.flag_buf_ptr += len;
1890 tty->flip.count += len;
1891 tty_flip_buffer_push( tty );
1892 }
1893
1894 }
1895
1896 }
1897
1898 spin_unlock( &priv->dp_port_lock );
1899
1900 if( opcode == DIGI_CMD_RECEIVE_DISABLE ) {
1901 dbg("%s: got RECEIVE_DISABLE", __FUNCTION__ );
1902 } else if( opcode != DIGI_CMD_RECEIVE_DATA ) {
1903 dbg("%s: unknown opcode: %d", __FUNCTION__, opcode );
1904 }
1905
1906 return( throttled ? 1 : 0 );
1907
1908}
1909
1910
1911/*
1912* Digi Read OOB Callback
1913*
1914* Digi Read OOB Callback handles reads on the out of band port.
1915* When called we know port and port->private are not NULL and
1916* the port->serial is valid. It returns 0 if successful, and
1917* -1 if the sanity checks failed.
1918*/
1919
1920static int digi_read_oob_callback( struct urb *urb )
1921{
1922
1923 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1924 struct usb_serial *serial = port->serial;
1925 struct digi_port *priv = usb_get_serial_port_data(port);
1926 int opcode, line, status, val;
1927 int i;
1928
1929
1930dbg( "digi_read_oob_callback: port=%d, len=%d", priv->dp_port_num,
1931urb->actual_length );
1932
1933 /* handle each oob command */
1934 for( i=0; i<urb->actual_length-3; ) {
1935
1936 opcode = ((unsigned char *)urb->transfer_buffer)[i++];
1937 line = ((unsigned char *)urb->transfer_buffer)[i++];
1938 status = ((unsigned char *)urb->transfer_buffer)[i++];
1939 val = ((unsigned char *)urb->transfer_buffer)[i++];
1940
1941dbg( "digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d",
1942opcode, line, status, val );
1943
1944 if( status != 0 || line >= serial->type->num_ports )
1945 continue;
1946
1947 port = serial->port[line];
1948
1949 if ((priv=usb_get_serial_port_data(port)) == NULL )
1950 return -1;
1951
1952 if( opcode == DIGI_CMD_READ_INPUT_SIGNALS ) {
1953
1954 spin_lock( &priv->dp_port_lock );
1955
1956 /* convert from digi flags to termiox flags */
1957 if( val & DIGI_READ_INPUT_SIGNALS_CTS ) {
1958 priv->dp_modem_signals |= TIOCM_CTS;
1959 /* port must be open to use tty struct */
1960 if( port->open_count
1961 && port->tty->termios->c_cflag & CRTSCTS ) {
1962 port->tty->hw_stopped = 0;
1963 digi_wakeup_write( port );
1964 }
1965 } else {
1966 priv->dp_modem_signals &= ~TIOCM_CTS;
1967 /* port must be open to use tty struct */
1968 if( port->open_count
1969 && port->tty->termios->c_cflag & CRTSCTS ) {
1970 port->tty->hw_stopped = 1;
1971 }
1972 }
1973 if( val & DIGI_READ_INPUT_SIGNALS_DSR )
1974 priv->dp_modem_signals |= TIOCM_DSR;
1975 else
1976 priv->dp_modem_signals &= ~TIOCM_DSR;
1977 if( val & DIGI_READ_INPUT_SIGNALS_RI )
1978 priv->dp_modem_signals |= TIOCM_RI;
1979 else
1980 priv->dp_modem_signals &= ~TIOCM_RI;
1981 if( val & DIGI_READ_INPUT_SIGNALS_DCD )
1982 priv->dp_modem_signals |= TIOCM_CD;
1983 else
1984 priv->dp_modem_signals &= ~TIOCM_CD;
1985
1986 wake_up_interruptible( &priv->dp_modem_change_wait );
1987 spin_unlock( &priv->dp_port_lock );
1988
1989 } else if( opcode == DIGI_CMD_TRANSMIT_IDLE ) {
1990
1991 spin_lock( &priv->dp_port_lock );
1992 priv->dp_transmit_idle = 1;
1993 wake_up_interruptible( &priv->dp_transmit_idle_wait );
1994 spin_unlock( &priv->dp_port_lock );
1995
1996 } else if( opcode == DIGI_CMD_IFLUSH_FIFO ) {
1997
1998 wake_up( &priv->dp_flush_wait );
1999
2000 }
2001
2002 }
2003
2004 return( 0 );
2005
2006}
2007
2008
2009static int __init digi_init (void)
2010{
2011 int retval;
2012 retval = usb_serial_register(&digi_acceleport_2_device);
2013 if (retval)
2014 goto failed_acceleport_2_device;
2015 retval = usb_serial_register(&digi_acceleport_4_device);
2016 if (retval)
2017 goto failed_acceleport_4_device;
2018 retval = usb_register(&digi_driver);
2019 if (retval)
2020 goto failed_usb_register;
2021 info(DRIVER_VERSION ":" DRIVER_DESC);
2022 return 0;
2023failed_usb_register:
2024 usb_serial_deregister(&digi_acceleport_4_device);
2025failed_acceleport_4_device:
2026 usb_serial_deregister(&digi_acceleport_2_device);
2027failed_acceleport_2_device:
2028 return retval;
2029}
2030
2031
2032static void __exit digi_exit (void)
2033{
2034 usb_deregister (&digi_driver);
2035 usb_serial_deregister (&digi_acceleport_2_device);
2036 usb_serial_deregister (&digi_acceleport_4_device);
2037}
2038
2039
2040module_init(digi_init);
2041module_exit(digi_exit);
2042
2043
2044MODULE_AUTHOR( DRIVER_AUTHOR );
2045MODULE_DESCRIPTION( DRIVER_DESC );
2046MODULE_LICENSE("GPL");
2047
2048module_param(debug, bool, S_IRUGO | S_IWUSR);
2049MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
new file mode 100644
index 000000000000..4d46394f351b
--- /dev/null
+++ b/drivers/usb/serial/empeg.c
@@ -0,0 +1,596 @@
1/*
2 * USB Empeg empeg-car player driver
3 *
4 * Copyright (C) 2000, 2001
5 * Gary Brubaker (xavyer@ix.netcom.com)
6 *
7 * Copyright (C) 1999 - 2001
8 * Greg Kroah-Hartman (greg@kroah.com)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License, as published by
12 * the Free Software Foundation, version 2.
13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver
15 *
16 * (07/16/2001) gb
17 * remove unused code in empeg_close() (thanks to Oliver Neukum for pointing this
18 * out) and rewrote empeg_set_termios().
19 *
20 * (05/30/2001) gkh
21 * switched from using spinlock to a semaphore, which fixes lots of problems.
22 *
23 * (04/08/2001) gb
24 * Identify version on module load.
25 *
26 * (01/22/2001) gb
27 * Added write_room() and chars_in_buffer() support.
28 *
29 * (12/21/2000) gb
30 * Moved termio stuff inside the port->active check.
31 * Moved MOD_DEC_USE_COUNT to end of empeg_close().
32 *
33 * (12/03/2000) gb
34 * Added port->tty->ldisc.set_termios(port->tty, NULL) to empeg_open()
35 * This notifies the tty driver that the termios have changed.
36 *
37 * (11/13/2000) gb
38 * Moved tty->low_latency = 1 from empeg_read_bulk_callback() to empeg_open()
39 * (It only needs to be set once - Doh!)
40 *
41 * (11/11/2000) gb
42 * Updated to work with id_table structure.
43 *
44 * (11/04/2000) gb
45 * Forked this from visor.c, and hacked it up to work with an
46 * Empeg ltd. empeg-car player. Constructive criticism welcomed.
47 * I would like to say, 'Thank You' to Greg Kroah-Hartman for the
48 * use of his code, and for his guidance, advice and patience. :)
49 * A 'Thank You' is in order for John Ripley of Empeg ltd for his
50 * advice, and patience too.
51 *
52 */
53
54#include <linux/config.h>
55#include <linux/kernel.h>
56#include <linux/errno.h>
57#include <linux/init.h>
58#include <linux/slab.h>
59#include <linux/tty.h>
60#include <linux/tty_driver.h>
61#include <linux/tty_flip.h>
62#include <linux/module.h>
63#include <linux/spinlock.h>
64#include <asm/uaccess.h>
65#include <linux/usb.h>
66#include "usb-serial.h"
67
68static int debug;
69
70/*
71 * Version Information
72 */
73#define DRIVER_VERSION "v1.2"
74#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Gary Brubaker <xavyer@ix.netcom.com>"
75#define DRIVER_DESC "USB Empeg Mark I/II Driver"
76
77#define EMPEG_VENDOR_ID 0x084f
78#define EMPEG_PRODUCT_ID 0x0001
79
80/* function prototypes for an empeg-car player */
81static int empeg_open (struct usb_serial_port *port, struct file *filp);
82static void empeg_close (struct usb_serial_port *port, struct file *filp);
83static int empeg_write (struct usb_serial_port *port,
84 const unsigned char *buf,
85 int count);
86static int empeg_write_room (struct usb_serial_port *port);
87static int empeg_chars_in_buffer (struct usb_serial_port *port);
88static void empeg_throttle (struct usb_serial_port *port);
89static void empeg_unthrottle (struct usb_serial_port *port);
90static int empeg_startup (struct usb_serial *serial);
91static void empeg_shutdown (struct usb_serial *serial);
92static int empeg_ioctl (struct usb_serial_port *port,
93 struct file * file,
94 unsigned int cmd,
95 unsigned long arg);
96static void empeg_set_termios (struct usb_serial_port *port, struct termios *old_termios);
97static void empeg_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
98static void empeg_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
99
100static struct usb_device_id id_table [] = {
101 { USB_DEVICE(EMPEG_VENDOR_ID, EMPEG_PRODUCT_ID) },
102 { } /* Terminating entry */
103};
104
105MODULE_DEVICE_TABLE (usb, id_table);
106
107static struct usb_driver empeg_driver = {
108 .owner = THIS_MODULE,
109 .name = "empeg",
110 .probe = usb_serial_probe,
111 .disconnect = usb_serial_disconnect,
112 .id_table = id_table,
113};
114
115static struct usb_serial_device_type empeg_device = {
116 .owner = THIS_MODULE,
117 .name = "Empeg",
118 .id_table = id_table,
119 .num_interrupt_in = 0,
120 .num_bulk_in = 1,
121 .num_bulk_out = 1,
122 .num_ports = 1,
123 .open = empeg_open,
124 .close = empeg_close,
125 .throttle = empeg_throttle,
126 .unthrottle = empeg_unthrottle,
127 .attach = empeg_startup,
128 .shutdown = empeg_shutdown,
129 .ioctl = empeg_ioctl,
130 .set_termios = empeg_set_termios,
131 .write = empeg_write,
132 .write_room = empeg_write_room,
133 .chars_in_buffer = empeg_chars_in_buffer,
134 .write_bulk_callback = empeg_write_bulk_callback,
135 .read_bulk_callback = empeg_read_bulk_callback,
136};
137
138#define NUM_URBS 16
139#define URB_TRANSFER_BUFFER_SIZE 4096
140
141static struct urb *write_urb_pool[NUM_URBS];
142static spinlock_t write_urb_pool_lock;
143static int bytes_in;
144static int bytes_out;
145
146/******************************************************************************
147 * Empeg specific driver functions
148 ******************************************************************************/
149static int empeg_open (struct usb_serial_port *port, struct file *filp)
150{
151 struct usb_serial *serial = port->serial;
152 int result = 0;
153
154 dbg("%s - port %d", __FUNCTION__, port->number);
155
156 /* Force default termio settings */
157 empeg_set_termios (port, NULL) ;
158
159 bytes_in = 0;
160 bytes_out = 0;
161
162 /* Start reading from the device */
163 usb_fill_bulk_urb(
164 port->read_urb,
165 serial->dev,
166 usb_rcvbulkpipe(serial->dev,
167 port->bulk_in_endpointAddress),
168 port->read_urb->transfer_buffer,
169 port->read_urb->transfer_buffer_length,
170 empeg_read_bulk_callback,
171 port);
172
173 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
174
175 if (result)
176 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
177
178 return result;
179}
180
181
182static void empeg_close (struct usb_serial_port *port, struct file * filp)
183{
184 dbg("%s - port %d", __FUNCTION__, port->number);
185
186 /* shutdown our bulk read */
187 usb_kill_urb(port->read_urb);
188 /* Uncomment the following line if you want to see some statistics in your syslog */
189 /* dev_info (&port->dev, "Bytes In = %d Bytes Out = %d\n", bytes_in, bytes_out); */
190}
191
192
193static int empeg_write (struct usb_serial_port *port, const unsigned char *buf, int count)
194{
195 struct usb_serial *serial = port->serial;
196 struct urb *urb;
197 const unsigned char *current_position = buf;
198 unsigned long flags;
199 int status;
200 int i;
201 int bytes_sent = 0;
202 int transfer_size;
203
204 dbg("%s - port %d", __FUNCTION__, port->number);
205
206 while (count > 0) {
207
208 /* try to find a free urb in our list of them */
209 urb = NULL;
210
211 spin_lock_irqsave (&write_urb_pool_lock, flags);
212
213 for (i = 0; i < NUM_URBS; ++i) {
214 if (write_urb_pool[i]->status != -EINPROGRESS) {
215 urb = write_urb_pool[i];
216 break;
217 }
218 }
219
220 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
221
222 if (urb == NULL) {
223 dbg("%s - no more free urbs", __FUNCTION__);
224 goto exit;
225 }
226
227 if (urb->transfer_buffer == NULL) {
228 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
229 if (urb->transfer_buffer == NULL) {
230 dev_err(&port->dev, "%s no more kernel memory...\n", __FUNCTION__);
231 goto exit;
232 }
233 }
234
235 transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE);
236
237 memcpy (urb->transfer_buffer, current_position, transfer_size);
238
239 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, transfer_size, urb->transfer_buffer);
240
241 /* build up our urb */
242 usb_fill_bulk_urb (
243 urb,
244 serial->dev,
245 usb_sndbulkpipe(serial->dev,
246 port->bulk_out_endpointAddress),
247 urb->transfer_buffer,
248 transfer_size,
249 empeg_write_bulk_callback,
250 port);
251
252 /* send it down the pipe */
253 status = usb_submit_urb(urb, GFP_ATOMIC);
254 if (status) {
255 dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed with status = %d\n", __FUNCTION__, status);
256 bytes_sent = status;
257 break;
258 }
259
260 current_position += transfer_size;
261 bytes_sent += transfer_size;
262 count -= transfer_size;
263 bytes_out += transfer_size;
264
265 }
266
267exit:
268 return bytes_sent;
269
270}
271
272
273static int empeg_write_room (struct usb_serial_port *port)
274{
275 unsigned long flags;
276 int i;
277 int room = 0;
278
279 dbg("%s - port %d", __FUNCTION__, port->number);
280
281 spin_lock_irqsave (&write_urb_pool_lock, flags);
282
283 /* tally up the number of bytes available */
284 for (i = 0; i < NUM_URBS; ++i) {
285 if (write_urb_pool[i]->status != -EINPROGRESS) {
286 room += URB_TRANSFER_BUFFER_SIZE;
287 }
288 }
289
290 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
291
292 dbg("%s - returns %d", __FUNCTION__, room);
293
294 return (room);
295
296}
297
298
299static int empeg_chars_in_buffer (struct usb_serial_port *port)
300{
301 unsigned long flags;
302 int i;
303 int chars = 0;
304
305 dbg("%s - port %d", __FUNCTION__, port->number);
306
307 spin_lock_irqsave (&write_urb_pool_lock, flags);
308
309 /* tally up the number of bytes waiting */
310 for (i = 0; i < NUM_URBS; ++i) {
311 if (write_urb_pool[i]->status == -EINPROGRESS) {
312 chars += URB_TRANSFER_BUFFER_SIZE;
313 }
314 }
315
316 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
317
318 dbg("%s - returns %d", __FUNCTION__, chars);
319
320 return (chars);
321
322}
323
324
325static void empeg_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
326{
327 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
328
329 dbg("%s - port %d", __FUNCTION__, port->number);
330
331 if (urb->status) {
332 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
333 return;
334 }
335
336 schedule_work(&port->work);
337}
338
339
340static void empeg_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
341{
342 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
343 struct tty_struct *tty;
344 unsigned char *data = urb->transfer_buffer;
345 int i;
346 int result;
347
348 dbg("%s - port %d", __FUNCTION__, port->number);
349
350 if (urb->status) {
351 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
352 return;
353 }
354
355 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
356
357 tty = port->tty;
358
359 if (urb->actual_length) {
360 for (i = 0; i < urb->actual_length ; ++i) {
361 /* gb - 2000/11/13
362 * If we insert too many characters we'll overflow the buffer.
363 * This means we'll lose bytes - Decidedly bad.
364 */
365 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
366 tty_flip_buffer_push(tty);
367 }
368 tty_insert_flip_char(tty, data[i], 0);
369 }
370 /* gb - 2000/11/13
371 * Goes straight through instead of scheduling - if tty->low_latency is set.
372 */
373 tty_flip_buffer_push(tty);
374 bytes_in += urb->actual_length;
375 }
376
377 /* Continue trying to always read */
378 usb_fill_bulk_urb(
379 port->read_urb,
380 port->serial->dev,
381 usb_rcvbulkpipe(port->serial->dev,
382 port->bulk_in_endpointAddress),
383 port->read_urb->transfer_buffer,
384 port->read_urb->transfer_buffer_length,
385 empeg_read_bulk_callback,
386 port);
387
388 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
389
390 if (result)
391 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
392
393 return;
394
395}
396
397
398static void empeg_throttle (struct usb_serial_port *port)
399{
400 dbg("%s - port %d", __FUNCTION__, port->number);
401 usb_kill_urb(port->read_urb);
402}
403
404
405static void empeg_unthrottle (struct usb_serial_port *port)
406{
407 int result;
408
409 dbg("%s - port %d", __FUNCTION__, port->number);
410
411 port->read_urb->dev = port->serial->dev;
412
413 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
414
415 if (result)
416 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
417
418 return;
419}
420
421
422static int empeg_startup (struct usb_serial *serial)
423{
424 int r;
425
426 dbg("%s", __FUNCTION__);
427
428 if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
429 err("active config #%d != 1 ??",
430 serial->dev->actconfig->desc.bConfigurationValue);
431 return -ENODEV;
432 }
433 dbg("%s - reset config", __FUNCTION__);
434 r = usb_reset_configuration (serial->dev);
435
436 /* continue on with initialization */
437 return r;
438
439}
440
441
442static void empeg_shutdown (struct usb_serial *serial)
443{
444 dbg ("%s", __FUNCTION__);
445}
446
447
448static int empeg_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
449{
450 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
451
452 return -ENOIOCTLCMD;
453}
454
455
456static void empeg_set_termios (struct usb_serial_port *port, struct termios *old_termios)
457{
458
459 dbg("%s - port %d", __FUNCTION__, port->number);
460
461 if ((!port->tty) || (!port->tty->termios)) {
462 dbg("%s - no tty structures", __FUNCTION__);
463 return;
464 }
465
466 /*
467 * The empeg-car player wants these particular tty settings.
468 * You could, for example, change the baud rate, however the
469 * player only supports 115200 (currently), so there is really
470 * no point in support for changes to the tty settings.
471 * (at least for now)
472 *
473 * The default requirements for this device are:
474 */
475 port->tty->termios->c_iflag
476 &= ~(IGNBRK /* disable ignore break */
477 | BRKINT /* disable break causes interrupt */
478 | PARMRK /* disable mark parity errors */
479 | ISTRIP /* disable clear high bit of input characters */
480 | INLCR /* disable translate NL to CR */
481 | IGNCR /* disable ignore CR */
482 | ICRNL /* disable translate CR to NL */
483 | IXON); /* disable enable XON/XOFF flow control */
484
485 port->tty->termios->c_oflag
486 &= ~OPOST; /* disable postprocess output characters */
487
488 port->tty->termios->c_lflag
489 &= ~(ECHO /* disable echo input characters */
490 | ECHONL /* disable echo new line */
491 | ICANON /* disable erase, kill, werase, and rprnt special characters */
492 | ISIG /* disable interrupt, quit, and suspend special characters */
493 | IEXTEN); /* disable non-POSIX special characters */
494
495 port->tty->termios->c_cflag
496 &= ~(CSIZE /* no size */
497 | PARENB /* disable parity bit */
498 | CBAUD); /* clear current baud rate */
499
500 port->tty->termios->c_cflag
501 |= (CS8 /* character size 8 bits */
502 | B115200); /* baud rate 115200 */
503
504 /*
505 * Force low_latency on; otherwise the pushes are scheduled;
506 * this is bad as it opens up the possibility of dropping bytes
507 * on the floor. We don't want to drop bytes on the floor. :)
508 */
509 port->tty->low_latency = 1;
510
511 return;
512}
513
514
515static int __init empeg_init (void)
516{
517 struct urb *urb;
518 int i, retval;
519
520 /* create our write urb pool and transfer buffers */
521 spin_lock_init (&write_urb_pool_lock);
522 for (i = 0; i < NUM_URBS; ++i) {
523 urb = usb_alloc_urb(0, GFP_KERNEL);
524 write_urb_pool[i] = urb;
525 if (urb == NULL) {
526 err("No more urbs???");
527 continue;
528 }
529
530 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
531 if (!urb->transfer_buffer) {
532 err("%s - out of memory for urb buffers.",
533 __FUNCTION__);
534 continue;
535 }
536 }
537
538 retval = usb_serial_register(&empeg_device);
539 if (retval)
540 goto failed_usb_serial_register;
541 retval = usb_register(&empeg_driver);
542 if (retval)
543 goto failed_usb_register;
544
545 info(DRIVER_VERSION ":" DRIVER_DESC);
546
547 return 0;
548failed_usb_register:
549 usb_serial_deregister(&empeg_device);
550failed_usb_serial_register:
551 for (i = 0; i < NUM_URBS; ++i) {
552 if (write_urb_pool[i]) {
553 if (write_urb_pool[i]->transfer_buffer)
554 kfree(write_urb_pool[i]->transfer_buffer);
555 usb_free_urb(write_urb_pool[i]);
556 }
557 }
558 return retval;
559}
560
561
562static void __exit empeg_exit (void)
563{
564 int i;
565 unsigned long flags;
566
567 usb_deregister(&empeg_driver);
568 usb_serial_deregister (&empeg_device);
569
570 spin_lock_irqsave (&write_urb_pool_lock, flags);
571
572 for (i = 0; i < NUM_URBS; ++i) {
573 if (write_urb_pool[i]) {
574 /* FIXME - uncomment the following usb_kill_urb call when
575 * the host controllers get fixed to set urb->dev = NULL after
576 * the urb is finished. Otherwise this call oopses. */
577 /* usb_kill_urb(write_urb_pool[i]); */
578 if (write_urb_pool[i]->transfer_buffer)
579 kfree(write_urb_pool[i]->transfer_buffer);
580 usb_free_urb (write_urb_pool[i]);
581 }
582 }
583
584 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
585}
586
587
588module_init(empeg_init);
589module_exit(empeg_exit);
590
591MODULE_AUTHOR( DRIVER_AUTHOR );
592MODULE_DESCRIPTION( DRIVER_DESC );
593MODULE_LICENSE("GPL");
594
595module_param(debug, bool, S_IRUGO | S_IWUSR);
596MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c
new file mode 100644
index 000000000000..1e419c8d7392
--- /dev/null
+++ b/drivers/usb/serial/ezusb.c
@@ -0,0 +1,60 @@
1/*
2 * EZ-USB specific functions used by some of the USB to Serial drivers.
3 *
4 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 */
10
11#include <linux/config.h>
12#include <linux/kernel.h>
13#include <linux/errno.h>
14#include <linux/init.h>
15#include <linux/slab.h>
16#include <linux/tty.h>
17#include <linux/module.h>
18#include <linux/usb.h>
19#include "usb-serial.h"
20
21/* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
22#define CPUCS_REG 0x7F92
23
24int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest)
25{
26 int result;
27 unsigned char *transfer_buffer;
28
29 /* dbg("ezusb_writememory %x, %d", address, length); */
30 if (!serial->dev) {
31 err("%s - no physical device present, failing.", __FUNCTION__);
32 return -ENODEV;
33 }
34
35 transfer_buffer = kmalloc (length, GFP_KERNEL);
36 if (!transfer_buffer) {
37 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, length);
38 return -ENOMEM;
39 }
40 memcpy (transfer_buffer, data, length);
41 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000);
42 kfree (transfer_buffer);
43 return result;
44}
45
46int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit)
47{
48 int response;
49
50 /* dbg("%s - %d", __FUNCTION__, reset_bit); */
51 response = ezusb_writememory (serial, CPUCS_REG, &reset_bit, 1, 0xa0);
52 if (response < 0)
53 dev_err(&serial->dev->dev, "%s- %d failed\n", __FUNCTION__, reset_bit);
54 return response;
55}
56
57
58EXPORT_SYMBOL(ezusb_writememory);
59EXPORT_SYMBOL(ezusb_set_reset);
60
diff --git a/drivers/usb/serial/ezusb_convert.pl b/drivers/usb/serial/ezusb_convert.pl
new file mode 100644
index 000000000000..13f11469116e
--- /dev/null
+++ b/drivers/usb/serial/ezusb_convert.pl
@@ -0,0 +1,50 @@
1#! /usr/bin/perl -w
2
3
4# convert an Intel HEX file into a set of C records usable by the firmware
5# loading code in usb-serial.c (or others)
6
7# accepts the .hex file(s) on stdin, a basename (to name the initialized
8# array) as an argument, and prints the .h file to stdout. Typical usage:
9# perl ezusb_convert.pl foo <foo.hex >fw_foo.h
10
11
12my $basename = $ARGV[0];
13die "no base name specified" unless $basename;
14
15while (<STDIN>) {
16 # ':' <len> <addr> <type> <len-data> <crc> '\r'
17 # len, type, crc are 2-char hex, addr is 4-char hex. type is 00 for
18 # normal records, 01 for EOF
19 my($lenstring, $addrstring, $typestring, $reststring, $doscrap) =
20 /^:(\w\w)(\w\w\w\w)(\w\w)(\w+)(\r?)$/;
21 die "malformed line: $_" unless $reststring;
22 last if $typestring eq '01';
23 my($len) = hex($lenstring);
24 my($addr) = hex($addrstring);
25 my(@bytes) = unpack("C*", pack("H".(2*$len), $reststring));
26 #pop(@bytes); # last byte is a CRC
27 push(@records, [$addr, \@bytes]);
28}
29
30@sorted_records = sort { $a->[0] <=> $b->[0] } @records;
31
32print <<"EOF";
33/*
34 * ${basename}_fw.h
35 *
36 * Generated from ${basename}.s by ezusb_convert.pl
37 * This file is presumed to be under the same copyright as the source file
38 * from which it was derived.
39 */
40
41EOF
42
43print "static const struct ezusb_hex_record ${basename}_firmware[] = {\n";
44foreach $r (@sorted_records) {
45 printf("{ 0x%04x,\t%d,\t{", $r->[0], scalar(@{$r->[1]}));
46 print join(", ", map {sprintf('0x%02x', $_);} @{$r->[1]});
47 print "} },\n";
48}
49print "{ 0xffff,\t0,\t{0x00} }\n";
50print "};\n";
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
new file mode 100644
index 000000000000..4afd905fe2fe
--- /dev/null
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -0,0 +1,2496 @@
1/*
2 * USB FTDI SIO driver
3 *
4 * Copyright (C) 1999 - 2001
5 * Greg Kroah-Hartman (greg@kroah.com)
6 * Bill Ryder (bryder@sgi.com)
7 * Copyright (C) 2002
8 * Kuba Ober (kuba@mareimbrium.org)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver
16 *
17 * See http://ftdi-usb-sio.sourceforge.net for upto date testing info
18 * and extra documentation
19 *
20 * (21/Jul/2004) Ian Abbott
21 * Incorporated Steven Turner's code to add support for the FT2232C chip.
22 * The prelimilary port to the 2.6 kernel was by Rus V. Brushkoff. I have
23 * fixed a couple of things.
24 *
25 * (27/May/2004) Ian Abbott
26 * Improved throttling code, mostly stolen from the WhiteHEAT driver.
27 *
28 * (26/Mar/2004) Jan Capek
29 * Added PID's for ICD-U20/ICD-U40 - incircuit PIC debuggers from CCS Inc.
30 *
31 * (09/Feb/2004) Ian Abbott
32 * Changed full name of USB-UIRT device to avoid "/" character.
33 * Added FTDI's alternate PID (0x6006) for FT232/245 devices.
34 * Added PID for "ELV USB Module UO100" from Stefan Frings.
35 *
36 * (21/Oct/2003) Ian Abbott
37 * Renamed some VID/PID macros for Matrix Orbital and Perle Systems
38 * devices. Removed Matrix Orbital and Perle Systems devices from the
39 * 8U232AM device table, but left them in the FT232BM table, as they are
40 * known to use only FT232BM.
41 *
42 * (17/Oct/2003) Scott Allen
43 * Added vid/pid for Perle Systems UltraPort USB serial converters
44 *
45 * (21/Sep/2003) Ian Abbott
46 * Added VID/PID for Omnidirectional Control Technology US101 USB to
47 * RS-232 adapter (also rebadged as Dick Smith Electronics XH6381).
48 * VID/PID supplied by Donald Gordon.
49 *
50 * (19/Aug/2003) Ian Abbott
51 * Freed urb's transfer buffer in write bulk callback.
52 * Omitted some paranoid checks in write bulk callback that don't matter.
53 * Scheduled work in write bulk callback regardless of port's open count.
54 *
55 * (05/Aug/2003) Ian Abbott
56 * Added VID/PID for ID TECH IDT1221U USB to RS-232 adapter.
57 * VID/PID provided by Steve Briggs.
58 *
59 * (23/Jul/2003) Ian Abbott
60 * Added PIDs for CrystalFontz 547, 633, 631, 635, 640 and 640 from
61 * Wayne Wylupski.
62 *
63 * (10/Jul/2003) David Glance
64 * Added PID for DSS-20 SyncStation cradle for Sony-Ericsson P800.
65 *
66 * (27/Jun/2003) Ian Abbott
67 * Reworked the urb handling logic. We have no more pool, but dynamically
68 * allocate the urb and the transfer buffer on the fly. In testing this
69 * does not incure any measurable overhead. This also relies on the fact
70 * that we have proper reference counting logic for urbs. I nicked this
71 * from Greg KH's Visor driver.
72 *
73 * (23/Jun/2003) Ian Abbott
74 * Reduced flip buffer pushes and corrected a data length test in
75 * ftdi_read_bulk_callback.
76 * Defererence pointers after any paranoid checks, not before.
77 *
78 * (21/Jun/2003) Erik Nygren
79 * Added support for Home Electronics Tira-1 IR tranceiver using FT232BM chip.
80 * See <http://www.home-electro.com/tira1.htm>. Only operates properly
81 * at 100000 and RTS-CTS, so set custom divisor mode on startup.
82 * Also force the Tira-1 and USB-UIRT to only use their custom baud rates.
83 *
84 * (18/Jun/2003) Ian Abbott
85 * Added Device ID of the USB relais from Rudolf Gugler (backported from
86 * Philipp Gühring's patch for 2.5.x kernel).
87 * Moved read transfer buffer reallocation into startup function.
88 * Free existing write urb and transfer buffer in startup function.
89 * Only use urbs in write urb pool that were successfully allocated.
90 * Moved some constant macros out of functions.
91 * Minor whitespace and comment changes.
92 *
93 * (12/Jun/2003) David Norwood
94 * Added support for USB-UIRT IR tranceiver using 8U232AM chip.
95 * See <http://home.earthlink.net/~jrhees/USBUIRT/index.htm>. Only
96 * operates properly at 312500, so set custom divisor mode on startup.
97 *
98 * (12/Jun/2003) Ian Abbott
99 * Added Sealevel SeaLINK+ 210x, 220x, 240x, 280x vid/pids from Tuan Hoang
100 * - I've eliminated some that don't seem to exist!
101 * Added Home Electronics Tira-1 IR transceiver pid from Chris Horn
102 * Some whitespace/coding-style cleanups
103 *
104 * (11/Jun/2003) Ian Abbott
105 * Fixed unsafe spinlock usage in ftdi_write
106 *
107 * (24/Feb/2003) Richard Shooter
108 * Increase read buffer size to improve read speeds at higher baud rates
109 * (specifically tested with up to 1Mb/sec at 1.5M baud)
110 *
111 * (23/Feb/2003) John Wilkins
112 * Added Xon/xoff flow control (activating support in the ftdi device)
113 * Added vid/pid for Videonetworks/Homechoice (UK ISP)
114 *
115 * (23/Feb/2003) Bill Ryder
116 * Added matrix orb device vid/pids from Wayne Wylupski
117 *
118 * (19/Feb/2003) Ian Abbott
119 * For TIOCSSERIAL, set alt_speed to 0 when ASYNC_SPD_MASK value has
120 * changed to something other than ASYNC_SPD_HI, ASYNC_SPD_VHI,
121 * ASYNC_SPD_SHI or ASYNC_SPD_WARP. Also, unless ASYNC_SPD_CUST is in
122 * force, don't bother changing baud rate when custom_divisor has changed.
123 *
124 * (18/Feb/2003) Ian Abbott
125 * Fixed TIOCMGET handling to include state of DTR and RTS, the state
126 * of which are now saved by set_dtr() and set_rts().
127 * Fixed improper storage class for buf in set_dtr() and set_rts().
128 * Added FT232BM chip type and support for its extra baud rates (compared
129 * to FT8U232AM).
130 * Took account of special case divisor values for highest baud rates of
131 * FT8U232AM and FT232BM.
132 * For TIOCSSERIAL, forced alt_speed to 0 when ASYNC_SPD_CUST kludge used,
133 * as previous alt_speed setting is now stale.
134 * Moved startup code common between the startup routines for the
135 * different chip types into a common subroutine.
136 *
137 * (17/Feb/2003) Bill Ryder
138 * Added write urb buffer pool on a per device basis
139 * Added more checking for open file on callbacks (fixed OOPS)
140 * Added CrystalFontz 632 and 634 PIDs
141 * (thanx to CrystalFontz for the sample devices - they flushed out
142 * some driver bugs)
143 * Minor debugging message changes
144 * Added throttle, unthrottle and chars_in_buffer functions
145 * Fixed FTDI_SIO (the original device) bug
146 * Fixed some shutdown handling
147 *
148 *
149 *
150 *
151 * (07/Jun/2002) Kuba Ober
152 * Changed FTDI_SIO_BASE_BAUD_TO_DIVISOR macro into ftdi_baud_to_divisor
153 * function. It was getting too complex.
154 * Fix the divisor calculation logic which was setting divisor of 0.125
155 * instead of 0.5 for fractional parts of divisor equal to 5/8, 6/8, 7/8.
156 * Also make it bump up the divisor to next integer in case of 7/8 - it's
157 * a better approximation.
158 *
159 * (25/Jul/2002) Bill Ryder inserted Dmitri's TIOCMIWAIT patch
160 * Not tested by me but it doesn't break anything I use.
161 *
162 * (04/Jan/2002) Kuba Ober
163 * Implemented 38400 baudrate kludge, where it can be substituted with other
164 * values. That's the only way to set custom baudrates.
165 * Implemented TIOCSSERIAL, TIOCGSERIAL ioctl's so that setserial is happy.
166 * FIXME: both baudrate things should eventually go to usbserial.c as other
167 * devices may need that functionality too. Actually, it can probably be
168 * merged in serial.c somehow - too many drivers repeat this code over
169 * and over.
170 * Fixed baudrate forgetfulness - open() used to reset baudrate to 9600 every time.
171 * Divisors for baudrates are calculated by a macro.
172 * Small code cleanups. Ugly whitespace changes for Plato's sake only ;-].
173 *
174 * (04/Nov/2001) Bill Ryder
175 * Fixed bug in read_bulk_callback where incorrect urb buffer was used.
176 * Cleaned up write offset calculation
177 * Added write_room since default values can be incorrect for sio
178 * Changed write_bulk_callback to use same queue_task as other drivers
179 * (the previous version caused panics)
180 * Removed port iteration code since the device only has one I/O port and it
181 * was wrong anyway.
182 *
183 * (31/May/2001) gkh
184 * Switched from using spinlock to a semaphore, which fixes lots of problems.
185 *
186 * (23/May/2001) Bill Ryder
187 * Added runtime debug patch (thanx Tyson D Sawyer).
188 * Cleaned up comments for 8U232
189 * Added parity, framing and overrun error handling
190 * Added receive break handling.
191 *
192 * (04/08/2001) gb
193 * Identify version on module load.
194 *
195 * (18/March/2001) Bill Ryder
196 * (Not released)
197 * Added send break handling. (requires kernel patch too)
198 * Fixed 8U232AM hardware RTS/CTS etc status reporting.
199 * Added flipbuf fix copied from generic device
200 *
201 * (12/3/2000) Bill Ryder
202 * Added support for 8U232AM device.
203 * Moved PID and VIDs into header file only.
204 * Turned on low-latency for the tty (device will do high baudrates)
205 * Added shutdown routine to close files when device removed.
206 * More debug and error message cleanups.
207 *
208 * (11/13/2000) Bill Ryder
209 * Added spinlock protected open code and close code.
210 * Multiple opens work (sort of - see webpage mentioned above).
211 * Cleaned up comments. Removed multiple PID/VID definitions.
212 * Factorised cts/dtr code
213 * Made use of __FUNCTION__ in dbg's
214 *
215 * (11/01/2000) Adam J. Richter
216 * usb_device_id table support
217 *
218 * (10/05/2000) gkh
219 * Fixed bug with urb->dev not being set properly, now that the usb
220 * core needs it.
221 *
222 * (09/11/2000) gkh
223 * Removed DEBUG #ifdefs with call to usb_serial_debug_data
224 *
225 * (07/19/2000) gkh
226 * Added module_init and module_exit functions to handle the fact that this
227 * driver is a loadable module now.
228 *
229 * (04/04/2000) Bill Ryder
230 * Fixed bugs in TCGET/TCSET ioctls (by removing them - they are
231 * handled elsewhere in the tty io driver chain).
232 *
233 * (03/30/2000) Bill Ryder
234 * Implemented lots of ioctls
235 * Fixed a race condition in write
236 * Changed some dbg's to errs
237 *
238 * (03/26/2000) gkh
239 * Split driver up into device specific pieces.
240 *
241 */
242
243/* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
244/* Thanx to FTDI for so kindly providing details of the protocol required */
245/* to talk to the device */
246/* Thanx to gkh and the rest of the usb dev group for all code I have assimilated :-) */
247
248#include <linux/config.h>
249#include <linux/kernel.h>
250#include <linux/errno.h>
251#include <linux/init.h>
252#include <linux/slab.h>
253#include <linux/tty.h>
254#include <linux/tty_driver.h>
255#include <linux/tty_flip.h>
256#include <linux/module.h>
257#include <linux/spinlock.h>
258#include <asm/uaccess.h>
259#include <linux/usb.h>
260#include <linux/serial.h>
261#include "usb-serial.h"
262#include "ftdi_sio.h"
263
264/*
265 * Version Information
266 */
267#define DRIVER_VERSION "v1.4.1"
268#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>"
269#define DRIVER_DESC "USB FTDI Serial Converters Driver"
270
271static int debug;
272
273static struct usb_device_id id_table_sio [] = {
274 { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
275 { } /* Terminating entry */
276};
277
278/*
279 * The 8U232AM has the same API as the sio except for:
280 * - it can support MUCH higher baudrates; up to:
281 * o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
282 * o 230400 at 12MHz
283 * so .. 8U232AM's baudrate setting codes are different
284 * - it has a two byte status code.
285 * - it returns characters every 16ms (the FTDI does it every 40ms)
286 *
287 * the bcdDevice value is used to differentiate FT232BM and FT245BM from
288 * the earlier FT8U232AM and FT8U232BM. For now, include all known VID/PID
289 * combinations in both tables.
290 * FIXME: perhaps bcdDevice can also identify 12MHz devices, but I don't know
291 * if those ever went into mass production. [Ian Abbott]
292 */
293
294
295static struct usb_device_id id_table_8U232AM [] = {
296 { USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0, 0x3ff) },
297 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0, 0x3ff) },
298 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0, 0x3ff) },
299 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID, 0, 0x3ff) },
300 { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0, 0x3ff) },
301 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
302 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
303 { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0, 0x3ff) },
304 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0, 0x3ff) },
305 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) },
306 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0, 0x3ff) },
307 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0, 0x3ff) },
308 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0, 0x3ff) },
309 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0, 0x3ff) },
310 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0, 0x3ff) },
311 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0, 0x3ff) },
312 { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0, 0x3ff) },
313 { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0, 0x3ff) },
314 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2101_PID, 0, 0x3ff) },
315 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2102_PID, 0, 0x3ff) },
316 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2103_PID, 0, 0x3ff) },
317 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2104_PID, 0, 0x3ff) },
318 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_1_PID, 0, 0x3ff) },
319 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_2_PID, 0, 0x3ff) },
320 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_1_PID, 0, 0x3ff) },
321 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_2_PID, 0, 0x3ff) },
322 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_1_PID, 0, 0x3ff) },
323 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_2_PID, 0, 0x3ff) },
324 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_1_PID, 0, 0x3ff) },
325 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_2_PID, 0, 0x3ff) },
326 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_3_PID, 0, 0x3ff) },
327 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_4_PID, 0, 0x3ff) },
328 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_1_PID, 0, 0x3ff) },
329 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_2_PID, 0, 0x3ff) },
330 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_3_PID, 0, 0x3ff) },
331 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_4_PID, 0, 0x3ff) },
332 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_1_PID, 0, 0x3ff) },
333 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_2_PID, 0, 0x3ff) },
334 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_3_PID, 0, 0x3ff) },
335 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_4_PID, 0, 0x3ff) },
336 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_1_PID, 0, 0x3ff) },
337 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_2_PID, 0, 0x3ff) },
338 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_3_PID, 0, 0x3ff) },
339 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_4_PID, 0, 0x3ff) },
340 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_5_PID, 0, 0x3ff) },
341 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_6_PID, 0, 0x3ff) },
342 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_7_PID, 0, 0x3ff) },
343 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_8_PID, 0, 0x3ff) },
344 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_1_PID, 0, 0x3ff) },
345 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_2_PID, 0, 0x3ff) },
346 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_3_PID, 0, 0x3ff) },
347 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_4_PID, 0, 0x3ff) },
348 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_5_PID, 0, 0x3ff) },
349 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_6_PID, 0, 0x3ff) },
350 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_7_PID, 0, 0x3ff) },
351 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_8_PID, 0, 0x3ff) },
352 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_1_PID, 0, 0x3ff) },
353 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_2_PID, 0, 0x3ff) },
354 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_3_PID, 0, 0x3ff) },
355 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_4_PID, 0, 0x3ff) },
356 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_5_PID, 0, 0x3ff) },
357 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0, 0x3ff) },
358 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0, 0x3ff) },
359 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0, 0x3ff) },
360 { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0, 0x3ff) },
361 { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0, 0x3ff) },
362 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0, 0x3ff) },
363 { USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0, 0x3ff) },
364 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) },
365 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) },
366 { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) },
367 { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) },
368 { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0, 0x3ff) },
369 { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) },
370 { USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0, 0x3ff) },
371 { USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0, 0x3ff) },
372 { USB_DEVICE_VER(FTDI_RM_VID, FTDI_RMCANVIEW_PID, 0, 0x3ff) },
373 { USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0, 0x3ff) },
374 { USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0, 0x3ff) },
375 { USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0, 0x3ff) },
376 { USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0, 0x3ff) },
377 { } /* Terminating entry */
378};
379
380
381static struct usb_device_id id_table_FT232BM [] = {
382 { USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0x400, 0xffff) },
383 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0x400, 0xffff) },
384 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0x400, 0xffff) },
385 { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID, 0x400, 0xffff) },
386 { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0x400, 0xffff) },
387 { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0x400, 0xffff) },
388 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) },
389 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) },
390 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0x400, 0xffff) },
391 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0x400, 0xffff) },
392 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0x400, 0xffff) },
393 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0x400, 0xffff) },
394 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0x400, 0xffff) },
395 { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0x400, 0xffff) },
396 { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0x400, 0xffff) },
397 { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0x400, 0xffff) },
398 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) },
399 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) },
400 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) },
401 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_3_PID, 0x400, 0xffff) },
402 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_4_PID, 0x400, 0xffff) },
403 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_5_PID, 0x400, 0xffff) },
404 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_6_PID, 0x400, 0xffff) },
405 { USB_DEVICE_VER(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID, 0x400, 0xffff) },
406 { USB_DEVICE_VER(FTDI_VID, FTDI_PIEGROUP_PID, 0x400, 0xffff) },
407 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2101_PID, 0x400, 0xffff) },
408 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2102_PID, 0x400, 0xffff) },
409 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2103_PID, 0x400, 0xffff) },
410 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2104_PID, 0x400, 0xffff) },
411 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_1_PID, 0x400, 0xffff) },
412 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2201_2_PID, 0x400, 0xffff) },
413 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_1_PID, 0x400, 0xffff) },
414 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2202_2_PID, 0x400, 0xffff) },
415 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_1_PID, 0x400, 0xffff) },
416 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2203_2_PID, 0x400, 0xffff) },
417 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_1_PID, 0x400, 0xffff) },
418 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_2_PID, 0x400, 0xffff) },
419 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_3_PID, 0x400, 0xffff) },
420 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2401_4_PID, 0x400, 0xffff) },
421 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_1_PID, 0x400, 0xffff) },
422 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_2_PID, 0x400, 0xffff) },
423 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_3_PID, 0x400, 0xffff) },
424 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2402_4_PID, 0x400, 0xffff) },
425 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_1_PID, 0x400, 0xffff) },
426 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_2_PID, 0x400, 0xffff) },
427 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_3_PID, 0x400, 0xffff) },
428 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2403_4_PID, 0x400, 0xffff) },
429 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_1_PID, 0x400, 0xffff) },
430 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_2_PID, 0x400, 0xffff) },
431 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_3_PID, 0x400, 0xffff) },
432 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_4_PID, 0x400, 0xffff) },
433 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_5_PID, 0x400, 0xffff) },
434 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_6_PID, 0x400, 0xffff) },
435 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_7_PID, 0x400, 0xffff) },
436 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2801_8_PID, 0x400, 0xffff) },
437 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_1_PID, 0x400, 0xffff) },
438 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_2_PID, 0x400, 0xffff) },
439 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_3_PID, 0x400, 0xffff) },
440 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_4_PID, 0x400, 0xffff) },
441 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_5_PID, 0x400, 0xffff) },
442 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_6_PID, 0x400, 0xffff) },
443 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_7_PID, 0x400, 0xffff) },
444 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2802_8_PID, 0x400, 0xffff) },
445 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_1_PID, 0x400, 0xffff) },
446 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_2_PID, 0x400, 0xffff) },
447 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_3_PID, 0x400, 0xffff) },
448 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_4_PID, 0x400, 0xffff) },
449 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_5_PID, 0x400, 0xffff) },
450 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0x400, 0xffff) },
451 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0x400, 0xffff) },
452 { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0x400, 0xffff) },
453 { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0x400, 0xffff) },
454 { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0x400, 0xffff) },
455 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_1, 0x400, 0xffff) },
456 { USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0x400, 0xffff) },
457 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0x400, 0xffff) },
458 { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0x400, 0xffff) },
459 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E808_PID, 0x400, 0xffff) },
460 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E809_PID, 0x400, 0xffff) },
461 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80A_PID, 0x400, 0xffff) },
462 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80B_PID, 0x400, 0xffff) },
463 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80C_PID, 0x400, 0xffff) },
464 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80D_PID, 0x400, 0xffff) },
465 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80E_PID, 0x400, 0xffff) },
466 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80F_PID, 0x400, 0xffff) },
467 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E888_PID, 0x400, 0xffff) },
468 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E889_PID, 0x400, 0xffff) },
469 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88A_PID, 0x400, 0xffff) },
470 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88B_PID, 0x400, 0xffff) },
471 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88C_PID, 0x400, 0xffff) },
472 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88D_PID, 0x400, 0xffff) },
473 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) },
474 { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) },
475 { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) },
476 { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
477 { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
478 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
479 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) },
480 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) },
481 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
482 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
483 { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0x400, 0xffff) },
484 { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0x400, 0xffff) },
485 { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0x400, 0xffff) },
486 { USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0x400, 0xffff) },
487 { USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0x400, 0xffff) },
488 { USB_DEVICE_VER(FTDI_RM_VID, FTDI_RMCANVIEW_PID, 0x400, 0xffff) },
489 { USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0x400, 0xffff) },
490 { USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0x400, 0xffff) },
491 { USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0x400, 0xffff) },
492 { USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0x400, 0xffff) },
493 { } /* Terminating entry */
494};
495
496
497static struct usb_device_id id_table_USB_UIRT [] = {
498 { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) },
499 { } /* Terminating entry */
500};
501
502
503static struct usb_device_id id_table_HE_TIRA1 [] = {
504 { USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) },
505 { } /* Terminating entry */
506};
507
508
509static struct usb_device_id id_table_FT2232C[] = {
510 { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
511 { } /* Terminating entry */
512};
513
514
515static struct usb_device_id id_table_combined [] = {
516 { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
517 { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
518 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
519 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
520 { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID) },
521 { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
522 { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
523 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
524 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
525 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
526 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
527 { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
528 { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
529 { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
530 { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
531 { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
532 { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
533 { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
534 { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
535 { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
536 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) },
537 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) },
538 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) },
539 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_3_PID, 0x400, 0xffff) },
540 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_4_PID, 0x400, 0xffff) },
541 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_5_PID, 0x400, 0xffff) },
542 { USB_DEVICE_VER(FTDI_VID, FTDI_MTXORB_6_PID, 0x400, 0xffff) },
543 { USB_DEVICE_VER(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID, 0x400, 0xffff) },
544 { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
545 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
546 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
547 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
548 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
549 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
550 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
551 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
552 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
553 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
554 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
555 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
556 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
557 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
558 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
559 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
560 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
561 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
562 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
563 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
564 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
565 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
566 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
567 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
568 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
569 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
570 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
571 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
572 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
573 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
574 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
575 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
576 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
577 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
578 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
579 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
580 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
581 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
582 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
583 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
584 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
585 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
586 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
587 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
588 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
589 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
590 { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
591 { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
592 { USB_DEVICE(OCT_VID, OCT_US101_PID) },
593 { USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) },
594 { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) },
595 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
596 { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
597 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
598 { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
599 { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
600 { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
601 { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
602 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
603 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) },
604 { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) },
605 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
606 { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
607 { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
608 { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
609 { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
610 { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
611 { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
612 { USB_DEVICE(FTDI_RM_VID, FTDI_RMCANVIEW_PID) },
613 { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
614 { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
615 { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
616 { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
617 { } /* Terminating entry */
618};
619
620MODULE_DEVICE_TABLE (usb, id_table_combined);
621
622static struct usb_driver ftdi_driver = {
623 .name = "ftdi_sio",
624 .probe = usb_serial_probe,
625 .disconnect = usb_serial_disconnect,
626 .id_table = id_table_combined,
627};
628
629static char *ftdi_chip_name[] = {
630 [SIO] = "SIO", /* the serial part of FT8U100AX */
631 [FT8U232AM] = "FT8U232AM",
632 [FT232BM] = "FT232BM",
633 [FT2232C] = "FT2232C",
634};
635
636
637/* Constants for read urb and write urb */
638#define BUFSZ 512
639#define PKTSZ 64
640
641/* rx_flags */
642#define THROTTLED 0x01
643#define ACTUALLY_THROTTLED 0x02
644
645struct ftdi_private {
646 ftdi_chip_type_t chip_type;
647 /* type of the device, either SIO or FT8U232AM */
648 int baud_base; /* baud base clock for divisor setting */
649 int custom_divisor; /* custom_divisor kludge, this is for baud_base (different from what goes to the chip!) */
650 __u16 last_set_data_urb_value ;
651 /* the last data state set - needed for doing a break */
652 int write_offset; /* This is the offset in the usb data block to write the serial data -
653 * it is different between devices
654 */
655 int flags; /* some ASYNC_xxxx flags are supported */
656 unsigned long last_dtr_rts; /* saved modem control outputs */
657 wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
658 char prev_status, diff_status; /* Used for TIOCMIWAIT */
659 __u8 rx_flags; /* receive state flags (throttling) */
660 spinlock_t rx_lock; /* spinlock for receive state */
661
662 __u16 interface; /* FT2232C port interface (0 for FT232/245) */
663
664 int force_baud; /* if non-zero, force the baud rate to this value */
665 int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */
666};
667
668/* Used for TIOCMIWAIT */
669#define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
670#define FTDI_STATUS_B1_MASK (FTDI_RS_BI)
671/* End TIOCMIWAIT */
672
673#define FTDI_IMPL_ASYNC_FLAGS = ( ASYNC_SPD_HI | ASYNC_SPD_VHI \
674 ASYNC_SPD_CUST | ASYNC_SPD_SHI | ASYNC_SPD_WARP )
675
676/* function prototypes for a FTDI serial converter */
677static int ftdi_SIO_startup (struct usb_serial *serial);
678static int ftdi_8U232AM_startup (struct usb_serial *serial);
679static int ftdi_FT232BM_startup (struct usb_serial *serial);
680static int ftdi_FT2232C_startup (struct usb_serial *serial);
681static int ftdi_USB_UIRT_startup (struct usb_serial *serial);
682static int ftdi_HE_TIRA1_startup (struct usb_serial *serial);
683static void ftdi_shutdown (struct usb_serial *serial);
684static int ftdi_open (struct usb_serial_port *port, struct file *filp);
685static void ftdi_close (struct usb_serial_port *port, struct file *filp);
686static int ftdi_write (struct usb_serial_port *port, const unsigned char *buf, int count);
687static int ftdi_write_room (struct usb_serial_port *port);
688static int ftdi_chars_in_buffer (struct usb_serial_port *port);
689static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
690static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
691static void ftdi_process_read (struct usb_serial_port *port);
692static void ftdi_set_termios (struct usb_serial_port *port, struct termios * old);
693static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file);
694static int ftdi_tiocmset (struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear);
695static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
696static void ftdi_break_ctl (struct usb_serial_port *port, int break_state );
697static void ftdi_throttle (struct usb_serial_port *port);
698static void ftdi_unthrottle (struct usb_serial_port *port);
699
700static unsigned short int ftdi_232am_baud_base_to_divisor (int baud, int base);
701static unsigned short int ftdi_232am_baud_to_divisor (int baud);
702static __u32 ftdi_232bm_baud_base_to_divisor (int baud, int base);
703static __u32 ftdi_232bm_baud_to_divisor (int baud);
704
705static struct usb_serial_device_type ftdi_SIO_device = {
706 .owner = THIS_MODULE,
707 .name = "FTDI SIO",
708 .id_table = id_table_sio,
709 .num_interrupt_in = 0,
710 .num_bulk_in = 1,
711 .num_bulk_out = 1,
712 .num_ports = 1,
713 .open = ftdi_open,
714 .close = ftdi_close,
715 .throttle = ftdi_throttle,
716 .unthrottle = ftdi_unthrottle,
717 .write = ftdi_write,
718 .write_room = ftdi_write_room,
719 .chars_in_buffer = ftdi_chars_in_buffer,
720 .read_bulk_callback = ftdi_read_bulk_callback,
721 .write_bulk_callback = ftdi_write_bulk_callback,
722 .tiocmget = ftdi_tiocmget,
723 .tiocmset = ftdi_tiocmset,
724 .ioctl = ftdi_ioctl,
725 .set_termios = ftdi_set_termios,
726 .break_ctl = ftdi_break_ctl,
727 .attach = ftdi_SIO_startup,
728 .shutdown = ftdi_shutdown,
729};
730
731static struct usb_serial_device_type ftdi_8U232AM_device = {
732 .owner = THIS_MODULE,
733 .name = "FTDI 8U232AM Compatible",
734 .id_table = id_table_8U232AM,
735 .num_interrupt_in = 0,
736 .num_bulk_in = 1,
737 .num_bulk_out = 1,
738 .num_ports = 1,
739 .open = ftdi_open,
740 .close = ftdi_close,
741 .throttle = ftdi_throttle,
742 .unthrottle = ftdi_unthrottle,
743 .write = ftdi_write,
744 .write_room = ftdi_write_room,
745 .chars_in_buffer = ftdi_chars_in_buffer,
746 .read_bulk_callback = ftdi_read_bulk_callback,
747 .write_bulk_callback = ftdi_write_bulk_callback,
748 .tiocmget = ftdi_tiocmget,
749 .tiocmset = ftdi_tiocmset,
750 .ioctl = ftdi_ioctl,
751 .set_termios = ftdi_set_termios,
752 .break_ctl = ftdi_break_ctl,
753 .attach = ftdi_8U232AM_startup,
754 .shutdown = ftdi_shutdown,
755};
756
757static struct usb_serial_device_type ftdi_FT232BM_device = {
758 .owner = THIS_MODULE,
759 .name = "FTDI FT232BM Compatible",
760 .id_table = id_table_FT232BM,
761 .num_interrupt_in = 0,
762 .num_bulk_in = 1,
763 .num_bulk_out = 1,
764 .num_ports = 1,
765 .open = ftdi_open,
766 .close = ftdi_close,
767 .throttle = ftdi_throttle,
768 .unthrottle = ftdi_unthrottle,
769 .write = ftdi_write,
770 .write_room = ftdi_write_room,
771 .chars_in_buffer = ftdi_chars_in_buffer,
772 .read_bulk_callback = ftdi_read_bulk_callback,
773 .write_bulk_callback = ftdi_write_bulk_callback,
774 .tiocmget = ftdi_tiocmget,
775 .tiocmset = ftdi_tiocmset,
776 .ioctl = ftdi_ioctl,
777 .set_termios = ftdi_set_termios,
778 .break_ctl = ftdi_break_ctl,
779 .attach = ftdi_FT232BM_startup,
780 .shutdown = ftdi_shutdown,
781};
782
783static struct usb_serial_device_type ftdi_FT2232C_device = {
784 .owner = THIS_MODULE,
785 .name = "FTDI FT2232C Compatible",
786 .id_table = id_table_FT2232C,
787 .num_interrupt_in = 0,
788 .num_bulk_in = 1,
789 .num_bulk_out = 1,
790 .num_ports = 1,
791 .open = ftdi_open,
792 .close = ftdi_close,
793 .throttle = ftdi_throttle,
794 .unthrottle = ftdi_unthrottle,
795 .write = ftdi_write,
796 .write_room = ftdi_write_room,
797 .chars_in_buffer = ftdi_chars_in_buffer,
798 .read_bulk_callback = ftdi_read_bulk_callback,
799 .write_bulk_callback = ftdi_write_bulk_callback,
800 .tiocmget = ftdi_tiocmget,
801 .tiocmset = ftdi_tiocmset,
802 .ioctl = ftdi_ioctl,
803 .set_termios = ftdi_set_termios,
804 .break_ctl = ftdi_break_ctl,
805 .attach = ftdi_FT2232C_startup,
806 .shutdown = ftdi_shutdown,
807};
808
809static struct usb_serial_device_type ftdi_USB_UIRT_device = {
810 .owner = THIS_MODULE,
811 .name = "USB-UIRT Infrared Tranceiver",
812 .id_table = id_table_USB_UIRT,
813 .num_interrupt_in = 0,
814 .num_bulk_in = 1,
815 .num_bulk_out = 1,
816 .num_ports = 1,
817 .open = ftdi_open,
818 .close = ftdi_close,
819 .throttle = ftdi_throttle,
820 .unthrottle = ftdi_unthrottle,
821 .write = ftdi_write,
822 .write_room = ftdi_write_room,
823 .chars_in_buffer = ftdi_chars_in_buffer,
824 .read_bulk_callback = ftdi_read_bulk_callback,
825 .write_bulk_callback = ftdi_write_bulk_callback,
826 .tiocmget = ftdi_tiocmget,
827 .tiocmset = ftdi_tiocmset,
828 .ioctl = ftdi_ioctl,
829 .set_termios = ftdi_set_termios,
830 .break_ctl = ftdi_break_ctl,
831 .attach = ftdi_USB_UIRT_startup,
832 .shutdown = ftdi_shutdown,
833};
834
835/* The TIRA1 is based on a FT232BM which requires a fixed baud rate of 100000
836 * and which requires RTS-CTS to be enabled. */
837static struct usb_serial_device_type ftdi_HE_TIRA1_device = {
838 .owner = THIS_MODULE,
839 .name = "Home-Electronics TIRA-1 IR Transceiver",
840 .id_table = id_table_HE_TIRA1,
841 .num_interrupt_in = 0,
842 .num_bulk_in = 1,
843 .num_bulk_out = 1,
844 .num_ports = 1,
845 .open = ftdi_open,
846 .close = ftdi_close,
847 .throttle = ftdi_throttle,
848 .unthrottle = ftdi_unthrottle,
849 .write = ftdi_write,
850 .write_room = ftdi_write_room,
851 .chars_in_buffer = ftdi_chars_in_buffer,
852 .read_bulk_callback = ftdi_read_bulk_callback,
853 .write_bulk_callback = ftdi_write_bulk_callback,
854 .tiocmget = ftdi_tiocmget,
855 .tiocmset = ftdi_tiocmset,
856 .ioctl = ftdi_ioctl,
857 .set_termios = ftdi_set_termios,
858 .break_ctl = ftdi_break_ctl,
859 .attach = ftdi_HE_TIRA1_startup,
860 .shutdown = ftdi_shutdown,
861};
862
863
864
865#define WDR_TIMEOUT 5000 /* default urb timeout */
866
867/* High and low are for DTR, RTS etc etc */
868#define HIGH 1
869#define LOW 0
870
871/*
872 * ***************************************************************************
873 * Utlity functions
874 * ***************************************************************************
875 */
876
877static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
878{
879 unsigned short int divisor;
880 int divisor3 = base / 2 / baud; // divisor shifted 3 bits to the left
881 if ((divisor3 & 0x7) == 7) divisor3 ++; // round x.7/8 up to x+1
882 divisor = divisor3 >> 3;
883 divisor3 &= 0x7;
884 if (divisor3 == 1) divisor |= 0xc000; else // 0.125
885 if (divisor3 >= 4) divisor |= 0x4000; else // 0.5
886 if (divisor3 != 0) divisor |= 0x8000; // 0.25
887 if (divisor == 1) divisor = 0; /* special case for maximum baud rate */
888 return divisor;
889}
890
891static unsigned short int ftdi_232am_baud_to_divisor(int baud)
892{
893 return(ftdi_232am_baud_base_to_divisor(baud, 48000000));
894}
895
896static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
897{
898 static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
899 __u32 divisor;
900 int divisor3 = base / 2 / baud; // divisor shifted 3 bits to the left
901 divisor = divisor3 >> 3;
902 divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
903 /* Deal with special cases for highest baud rates. */
904 if (divisor == 1) divisor = 0; else // 1.0
905 if (divisor == 0x4001) divisor = 1; // 1.5
906 return divisor;
907}
908
909static __u32 ftdi_232bm_baud_to_divisor(int baud)
910{
911 return(ftdi_232bm_baud_base_to_divisor(baud, 48000000));
912}
913
914static int set_rts(struct usb_serial_port *port, int high_or_low)
915{
916 struct ftdi_private *priv = usb_get_serial_port_data(port);
917 char *buf;
918 unsigned ftdi_high_or_low;
919 int rv;
920
921 buf = kmalloc(1, GFP_NOIO);
922 if (!buf)
923 return -ENOMEM;
924
925 if (high_or_low) {
926 ftdi_high_or_low = FTDI_SIO_SET_RTS_HIGH;
927 priv->last_dtr_rts |= TIOCM_RTS;
928 } else {
929 ftdi_high_or_low = FTDI_SIO_SET_RTS_LOW;
930 priv->last_dtr_rts &= ~TIOCM_RTS;
931 }
932 rv = usb_control_msg(port->serial->dev,
933 usb_sndctrlpipe(port->serial->dev, 0),
934 FTDI_SIO_SET_MODEM_CTRL_REQUEST,
935 FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
936 ftdi_high_or_low, priv->interface,
937 buf, 0, WDR_TIMEOUT);
938
939 kfree(buf);
940 return rv;
941}
942
943
944static int set_dtr(struct usb_serial_port *port, int high_or_low)
945{
946 struct ftdi_private *priv = usb_get_serial_port_data(port);
947 char *buf;
948 unsigned ftdi_high_or_low;
949 int rv;
950
951 buf = kmalloc(1, GFP_NOIO);
952 if (!buf)
953 return -ENOMEM;
954
955 if (high_or_low) {
956 ftdi_high_or_low = FTDI_SIO_SET_DTR_HIGH;
957 priv->last_dtr_rts |= TIOCM_DTR;
958 } else {
959 ftdi_high_or_low = FTDI_SIO_SET_DTR_LOW;
960 priv->last_dtr_rts &= ~TIOCM_DTR;
961 }
962 rv = usb_control_msg(port->serial->dev,
963 usb_sndctrlpipe(port->serial->dev, 0),
964 FTDI_SIO_SET_MODEM_CTRL_REQUEST,
965 FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
966 ftdi_high_or_low, priv->interface,
967 buf, 0, WDR_TIMEOUT);
968
969 kfree(buf);
970 return rv;
971}
972
973
974static __u32 get_ftdi_divisor(struct usb_serial_port * port);
975
976
977static int change_speed(struct usb_serial_port *port)
978{
979 struct ftdi_private *priv = usb_get_serial_port_data(port);
980 char *buf;
981 __u16 urb_value;
982 __u16 urb_index;
983 __u32 urb_index_value;
984 int rv;
985
986 buf = kmalloc(1, GFP_NOIO);
987 if (!buf)
988 return -ENOMEM;
989
990 urb_index_value = get_ftdi_divisor(port);
991 urb_value = (__u16)urb_index_value;
992 urb_index = (__u16)(urb_index_value >> 16);
993 if (priv->interface) { /* FT2232C */
994 urb_index = (__u16)((urb_index << 8) | priv->interface);
995 }
996
997 rv = usb_control_msg(port->serial->dev,
998 usb_sndctrlpipe(port->serial->dev, 0),
999 FTDI_SIO_SET_BAUDRATE_REQUEST,
1000 FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
1001 urb_value, urb_index,
1002 buf, 0, 100);
1003
1004 kfree(buf);
1005 return rv;
1006}
1007
1008
1009static __u32 get_ftdi_divisor(struct usb_serial_port * port)
1010{ /* get_ftdi_divisor */
1011 struct ftdi_private *priv = usb_get_serial_port_data(port);
1012 __u32 div_value = 0;
1013 int div_okay = 1;
1014 int baud;
1015
1016 /*
1017 * The logic involved in setting the baudrate can be cleanly split in 3 steps.
1018 * Obtaining the actual baud rate is a little tricky since unix traditionally
1019 * somehow ignored the possibility to set non-standard baud rates.
1020 * 1. Standard baud rates are set in tty->termios->c_cflag
1021 * 2. If these are not enough, you can set any speed using alt_speed as follows:
1022 * - set tty->termios->c_cflag speed to B38400
1023 * - set your real speed in tty->alt_speed; it gets ignored when
1024 * alt_speed==0, (or)
1025 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows:
1026 * flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP], this just
1027 * sets alt_speed to (HI: 57600, VHI: 115200, SHI: 230400, WARP: 460800)
1028 * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
1029 * 3. You can also set baud rate by setting custom divisor as follows
1030 * - set tty->termios->c_cflag speed to B38400
1031 * - call TIOCSSERIAL ioctl with (struct serial_struct) set as follows:
1032 * o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
1033 * o custom_divisor set to baud_base / your_new_baudrate
1034 * ** Step 3 is done courtesy of code borrowed from serial.c - I should really
1035 * spend some time and separate+move this common code to serial.c, it is
1036 * replicated in nearly every serial driver you see.
1037 */
1038
1039 /* 1. Get the baud rate from the tty settings, this observes alt_speed hack */
1040
1041 baud = tty_get_baud_rate(port->tty);
1042 dbg("%s - tty_get_baud_rate reports speed %d", __FUNCTION__, baud);
1043
1044 /* 2. Observe async-compatible custom_divisor hack, update baudrate if needed */
1045
1046 if (baud == 38400 &&
1047 ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1048 (priv->custom_divisor)) {
1049 baud = priv->baud_base / priv->custom_divisor;
1050 dbg("%s - custom divisor %d sets baud rate to %d", __FUNCTION__, priv->custom_divisor, baud);
1051 }
1052
1053 /* 3. Convert baudrate to device-specific divisor */
1054
1055 if (!baud) baud = 9600;
1056 switch(priv->chip_type) {
1057 case SIO: /* SIO chip */
1058 switch(baud) {
1059 case 300: div_value = ftdi_sio_b300; break;
1060 case 600: div_value = ftdi_sio_b600; break;
1061 case 1200: div_value = ftdi_sio_b1200; break;
1062 case 2400: div_value = ftdi_sio_b2400; break;
1063 case 4800: div_value = ftdi_sio_b4800; break;
1064 case 9600: div_value = ftdi_sio_b9600; break;
1065 case 19200: div_value = ftdi_sio_b19200; break;
1066 case 38400: div_value = ftdi_sio_b38400; break;
1067 case 57600: div_value = ftdi_sio_b57600; break;
1068 case 115200: div_value = ftdi_sio_b115200; break;
1069 } /* baud */
1070 if (div_value == 0) {
1071 dbg("%s - Baudrate (%d) requested is not supported", __FUNCTION__, baud);
1072 div_value = ftdi_sio_b9600;
1073 div_okay = 0;
1074 }
1075 break;
1076 case FT8U232AM: /* 8U232AM chip */
1077 if (baud <= 3000000) {
1078 div_value = ftdi_232am_baud_to_divisor(baud);
1079 } else {
1080 dbg("%s - Baud rate too high!", __FUNCTION__);
1081 div_value = ftdi_232am_baud_to_divisor(9600);
1082 div_okay = 0;
1083 }
1084 break;
1085 case FT232BM: /* FT232BM chip */
1086 case FT2232C: /* FT2232C chip */
1087 if (baud <= 3000000) {
1088 div_value = ftdi_232bm_baud_to_divisor(baud);
1089 } else {
1090 dbg("%s - Baud rate too high!", __FUNCTION__);
1091 div_value = ftdi_232bm_baud_to_divisor(9600);
1092 div_okay = 0;
1093 }
1094 break;
1095 } /* priv->chip_type */
1096
1097 if (div_okay) {
1098 dbg("%s - Baud rate set to %d (divisor 0x%lX) on chip %s",
1099 __FUNCTION__, baud, (unsigned long)div_value,
1100 ftdi_chip_name[priv->chip_type]);
1101 }
1102
1103 return(div_value);
1104}
1105
1106
1107static int get_serial_info(struct usb_serial_port * port, struct serial_struct __user * retinfo)
1108{
1109 struct ftdi_private *priv = usb_get_serial_port_data(port);
1110 struct serial_struct tmp;
1111
1112 if (!retinfo)
1113 return -EFAULT;
1114 memset(&tmp, 0, sizeof(tmp));
1115 tmp.flags = priv->flags;
1116 tmp.baud_base = priv->baud_base;
1117 tmp.custom_divisor = priv->custom_divisor;
1118 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1119 return -EFAULT;
1120 return 0;
1121} /* get_serial_info */
1122
1123
1124static int set_serial_info(struct usb_serial_port * port, struct serial_struct __user * newinfo)
1125{ /* set_serial_info */
1126 struct ftdi_private *priv = usb_get_serial_port_data(port);
1127 struct serial_struct new_serial;
1128 struct ftdi_private old_priv;
1129
1130 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1131 return -EFAULT;
1132 old_priv = * priv;
1133
1134 /* Do error checking and permission checking */
1135
1136 if (!capable(CAP_SYS_ADMIN)) {
1137 if (((new_serial.flags & ~ASYNC_USR_MASK) !=
1138 (priv->flags & ~ASYNC_USR_MASK)))
1139 return -EPERM;
1140 priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
1141 (new_serial.flags & ASYNC_USR_MASK));
1142 priv->custom_divisor = new_serial.custom_divisor;
1143 goto check_and_exit;
1144 }
1145
1146 if ((new_serial.baud_base != priv->baud_base) &&
1147 (new_serial.baud_base < 9600))
1148 return -EINVAL;
1149
1150 /* Make the changes - these are privileged changes! */
1151
1152 priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
1153 (new_serial.flags & ASYNC_FLAGS));
1154 priv->custom_divisor = new_serial.custom_divisor;
1155
1156 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1157
1158check_and_exit:
1159 if ((old_priv.flags & ASYNC_SPD_MASK) !=
1160 (priv->flags & ASYNC_SPD_MASK)) {
1161 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1162 port->tty->alt_speed = 57600;
1163 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1164 port->tty->alt_speed = 115200;
1165 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1166 port->tty->alt_speed = 230400;
1167 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1168 port->tty->alt_speed = 460800;
1169 else
1170 port->tty->alt_speed = 0;
1171 }
1172 if (((old_priv.flags & ASYNC_SPD_MASK) !=
1173 (priv->flags & ASYNC_SPD_MASK)) ||
1174 (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
1175 (old_priv.custom_divisor != priv->custom_divisor))) {
1176 change_speed(port);
1177 }
1178
1179 return (0);
1180
1181} /* set_serial_info */
1182
1183
1184/*
1185 * ***************************************************************************
1186 * Sysfs Attribute
1187 * ***************************************************************************
1188 */
1189
1190static ssize_t show_latency_timer(struct device *dev, char *buf)
1191{
1192 struct usb_serial_port *port = to_usb_serial_port(dev);
1193 struct ftdi_private *priv = usb_get_serial_port_data(port);
1194 struct usb_device *udev;
1195 unsigned short latency = 0;
1196 int rv = 0;
1197
1198 udev = to_usb_device(dev);
1199
1200 dbg("%s",__FUNCTION__);
1201
1202 rv = usb_control_msg(udev,
1203 usb_rcvctrlpipe(udev, 0),
1204 FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
1205 FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
1206 0, priv->interface,
1207 (char*) &latency, 1, WDR_TIMEOUT);
1208
1209 if (rv < 0) {
1210 dev_err(dev, "Unable to read latency timer: %i", rv);
1211 return -EIO;
1212 }
1213 return sprintf(buf, "%i\n", latency);
1214}
1215
1216/* Write a new value of the latency timer, in units of milliseconds. */
1217static ssize_t store_latency_timer(struct device *dev, const char *valbuf,
1218 size_t count)
1219{
1220 struct usb_serial_port *port = to_usb_serial_port(dev);
1221 struct ftdi_private *priv = usb_get_serial_port_data(port);
1222 struct usb_device *udev;
1223 char buf[1];
1224 int v = simple_strtoul(valbuf, NULL, 10);
1225 int rv = 0;
1226
1227 udev = to_usb_device(dev);
1228
1229 dbg("%s: setting latency timer = %i", __FUNCTION__, v);
1230
1231 rv = usb_control_msg(udev,
1232 usb_sndctrlpipe(udev, 0),
1233 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1234 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1235 v, priv->interface,
1236 buf, 0, WDR_TIMEOUT);
1237
1238 if (rv < 0) {
1239 dev_err(dev, "Unable to write latency timer: %i", rv);
1240 return -EIO;
1241 }
1242
1243 return count;
1244}
1245
1246/* Write an event character directly to the FTDI register. The ASCII
1247 value is in the low 8 bits, with the enable bit in the 9th bit. */
1248static ssize_t store_event_char(struct device *dev, const char *valbuf,
1249 size_t count)
1250{
1251 struct usb_serial_port *port = to_usb_serial_port(dev);
1252 struct ftdi_private *priv = usb_get_serial_port_data(port);
1253 struct usb_device *udev;
1254 char buf[1];
1255 int v = simple_strtoul(valbuf, NULL, 10);
1256 int rv = 0;
1257
1258 udev = to_usb_device(dev);
1259
1260 dbg("%s: setting event char = %i", __FUNCTION__, v);
1261
1262 rv = usb_control_msg(udev,
1263 usb_sndctrlpipe(udev, 0),
1264 FTDI_SIO_SET_EVENT_CHAR_REQUEST,
1265 FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
1266 v, priv->interface,
1267 buf, 0, WDR_TIMEOUT);
1268
1269 if (rv < 0) {
1270 dbg("Unable to write event character: %i", rv);
1271 return -EIO;
1272 }
1273
1274 return count;
1275}
1276
1277static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer, store_latency_timer);
1278static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
1279
1280static void create_sysfs_attrs(struct usb_serial *serial)
1281{
1282 struct ftdi_private *priv;
1283 struct usb_device *udev;
1284
1285 dbg("%s",__FUNCTION__);
1286
1287 priv = usb_get_serial_port_data(serial->port[0]);
1288 udev = serial->dev;
1289
1290 /* XXX I've no idea if the original SIO supports the event_char
1291 * sysfs parameter, so I'm playing it safe. */
1292 if (priv->chip_type != SIO) {
1293 dbg("sysfs attributes for %s", ftdi_chip_name[priv->chip_type]);
1294 device_create_file(&udev->dev, &dev_attr_event_char);
1295 if (priv->chip_type == FT232BM || priv->chip_type == FT2232C) {
1296 device_create_file(&udev->dev, &dev_attr_latency_timer);
1297 }
1298 }
1299}
1300
1301static void remove_sysfs_attrs(struct usb_serial *serial)
1302{
1303 struct ftdi_private *priv;
1304 struct usb_device *udev;
1305
1306 dbg("%s",__FUNCTION__);
1307
1308 priv = usb_get_serial_port_data(serial->port[0]);
1309 udev = serial->dev;
1310
1311 /* XXX see create_sysfs_attrs */
1312 if (priv->chip_type != SIO) {
1313 device_remove_file(&udev->dev, &dev_attr_event_char);
1314 if (priv->chip_type == FT232BM || priv->chip_type == FT2232C) {
1315 device_remove_file(&udev->dev, &dev_attr_latency_timer);
1316 }
1317 }
1318
1319}
1320
1321/*
1322 * ***************************************************************************
1323 * FTDI driver specific functions
1324 * ***************************************************************************
1325 */
1326
1327/* Common startup subroutine */
1328/* Called from ftdi_SIO_startup, etc. */
1329static int ftdi_common_startup (struct usb_serial *serial)
1330{
1331 struct usb_serial_port *port = serial->port[0];
1332 struct ftdi_private *priv;
1333
1334 dbg("%s",__FUNCTION__);
1335
1336 priv = kmalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1337 if (!priv){
1338 err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct ftdi_private));
1339 return -ENOMEM;
1340 }
1341 memset(priv, 0, sizeof(*priv));
1342
1343 spin_lock_init(&priv->rx_lock);
1344 init_waitqueue_head(&priv->delta_msr_wait);
1345 /* This will push the characters through immediately rather
1346 than queue a task to deliver them */
1347 priv->flags = ASYNC_LOW_LATENCY;
1348
1349 /* Increase the size of read buffers */
1350 if (port->bulk_in_buffer) {
1351 kfree (port->bulk_in_buffer);
1352 }
1353 port->bulk_in_buffer = kmalloc (BUFSZ, GFP_KERNEL);
1354 if (!port->bulk_in_buffer) {
1355 kfree (priv);
1356 return -ENOMEM;
1357 }
1358 if (port->read_urb) {
1359 port->read_urb->transfer_buffer = port->bulk_in_buffer;
1360 port->read_urb->transfer_buffer_length = BUFSZ;
1361 }
1362
1363 /* Free port's existing write urb and transfer buffer. */
1364 if (port->write_urb) {
1365 usb_free_urb (port->write_urb);
1366 port->write_urb = NULL;
1367 }
1368 if (port->bulk_out_buffer) {
1369 kfree (port->bulk_out_buffer);
1370 port->bulk_out_buffer = NULL;
1371 }
1372
1373 usb_set_serial_port_data(serial->port[0], priv);
1374
1375 return (0);
1376}
1377
1378
1379/* Startup for the SIO chip */
1380/* Called from usbserial:serial_probe */
1381static int ftdi_SIO_startup (struct usb_serial *serial)
1382{
1383 struct ftdi_private *priv;
1384 int err;
1385
1386 dbg("%s",__FUNCTION__);
1387
1388 err = ftdi_common_startup(serial);
1389 if (err){
1390 return (err);
1391 }
1392
1393 priv = usb_get_serial_port_data(serial->port[0]);
1394 priv->chip_type = SIO;
1395 priv->baud_base = 12000000 / 16;
1396 priv->write_offset = 1;
1397
1398 return (0);
1399}
1400
1401/* Startup for the 8U232AM chip */
1402/* Called from usbserial:serial_probe */
1403static int ftdi_8U232AM_startup (struct usb_serial *serial)
1404{ /* ftdi_8U232AM_startup */
1405 struct ftdi_private *priv;
1406 int err;
1407
1408 dbg("%s",__FUNCTION__);
1409 err = ftdi_common_startup(serial);
1410 if (err){
1411 return (err);
1412 }
1413
1414 priv = usb_get_serial_port_data(serial->port[0]);
1415 priv->chip_type = FT8U232AM;
1416 priv->baud_base = 48000000 / 2; /* Would be / 16, but FTDI supports 0.125, 0.25 and 0.5 divisor fractions! */
1417
1418 create_sysfs_attrs(serial);
1419
1420 return (0);
1421} /* ftdi_8U232AM_startup */
1422
1423/* Startup for the FT232BM chip */
1424/* Called from usbserial:serial_probe */
1425static int ftdi_FT232BM_startup (struct usb_serial *serial)
1426{ /* ftdi_FT232BM_startup */
1427 struct ftdi_private *priv;
1428 int err;
1429
1430 dbg("%s",__FUNCTION__);
1431 err = ftdi_common_startup(serial);
1432 if (err){
1433 return (err);
1434 }
1435
1436 priv = usb_get_serial_port_data(serial->port[0]);
1437 priv->chip_type = FT232BM;
1438 priv->baud_base = 48000000 / 2; /* Would be / 16, but FT232BM supports multiple of 0.125 divisor fractions! */
1439
1440 create_sysfs_attrs(serial);
1441
1442 return (0);
1443} /* ftdi_FT232BM_startup */
1444
1445/* Startup for the FT2232C chip */
1446/* Called from usbserial:serial_probe */
1447static int ftdi_FT2232C_startup (struct usb_serial *serial)
1448{ /* ftdi_FT2232C_startup */
1449 struct ftdi_private *priv;
1450 int err;
1451 int inter;
1452
1453 dbg("%s",__FUNCTION__);
1454 err = ftdi_common_startup(serial);
1455 if (err){
1456 return (err);
1457 }
1458
1459 priv = usb_get_serial_port_data(serial->port[0]);
1460 priv->chip_type = FT2232C;
1461 inter = serial->interface->altsetting->desc.bInterfaceNumber;
1462
1463 if (inter) {
1464 priv->interface = INTERFACE_B;
1465 }
1466 else {
1467 priv->interface = INTERFACE_A;
1468 }
1469 priv->baud_base = 48000000 / 2; /* Would be / 16, but FT2232C supports multiple of 0.125 divisor fractions! */
1470
1471 create_sysfs_attrs(serial);
1472
1473 return (0);
1474} /* ftdi_FT2232C_startup */
1475
1476/* Startup for the USB-UIRT device, which requires hardwired baudrate (38400 gets mapped to 312500) */
1477/* Called from usbserial:serial_probe */
1478static int ftdi_USB_UIRT_startup (struct usb_serial *serial)
1479{ /* ftdi_USB_UIRT_startup */
1480 struct ftdi_private *priv;
1481 int err;
1482
1483 dbg("%s",__FUNCTION__);
1484 err = ftdi_8U232AM_startup(serial);
1485 if (err){
1486 return (err);
1487 }
1488
1489 priv = usb_get_serial_port_data(serial->port[0]);
1490 priv->flags |= ASYNC_SPD_CUST;
1491 priv->custom_divisor = 77;
1492 priv->force_baud = B38400;
1493
1494 return (0);
1495} /* ftdi_USB_UIRT_startup */
1496
1497/* Startup for the HE-TIRA1 device, which requires hardwired
1498 * baudrate (38400 gets mapped to 100000) */
1499static int ftdi_HE_TIRA1_startup (struct usb_serial *serial)
1500{ /* ftdi_HE_TIRA1_startup */
1501 struct ftdi_private *priv;
1502 int err;
1503
1504 dbg("%s",__FUNCTION__);
1505 err = ftdi_FT232BM_startup(serial);
1506 if (err){
1507 return (err);
1508 }
1509
1510 priv = usb_get_serial_port_data(serial->port[0]);
1511 priv->flags |= ASYNC_SPD_CUST;
1512 priv->custom_divisor = 240;
1513 priv->force_baud = B38400;
1514 priv->force_rtscts = 1;
1515
1516 return (0);
1517} /* ftdi_HE_TIRA1_startup */
1518
1519
1520/* ftdi_shutdown is called from usbserial:usb_serial_disconnect
1521 * it is called when the usb device is disconnected
1522 *
1523 * usbserial:usb_serial_disconnect
1524 * calls __serial_close for each open of the port
1525 * shutdown is called then (ie ftdi_shutdown)
1526 */
1527
1528
1529static void ftdi_shutdown (struct usb_serial *serial)
1530{ /* ftdi_shutdown */
1531
1532 struct usb_serial_port *port = serial->port[0];
1533 struct ftdi_private *priv = usb_get_serial_port_data(port);
1534
1535 dbg("%s", __FUNCTION__);
1536
1537 remove_sysfs_attrs(serial);
1538
1539 /* all open ports are closed at this point
1540 * (by usbserial.c:__serial_close, which calls ftdi_close)
1541 */
1542
1543 if (priv) {
1544 usb_set_serial_port_data(port, NULL);
1545 kfree(priv);
1546 }
1547} /* ftdi_shutdown */
1548
1549
1550static int ftdi_open (struct usb_serial_port *port, struct file *filp)
1551{ /* ftdi_open */
1552 struct termios tmp_termios;
1553 struct usb_device *dev = port->serial->dev;
1554 struct ftdi_private *priv = usb_get_serial_port_data(port);
1555 unsigned long flags;
1556
1557 int result = 0;
1558 char buf[1]; /* Needed for the usb_control_msg I think */
1559
1560 dbg("%s", __FUNCTION__);
1561
1562
1563 port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1564
1565 /* No error checking for this (will get errors later anyway) */
1566 /* See ftdi_sio.h for description of what is reset */
1567 usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
1568 FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
1569 FTDI_SIO_RESET_SIO,
1570 priv->interface, buf, 0, WDR_TIMEOUT);
1571
1572 /* Termios defaults are set by usb_serial_init. We don't change
1573 port->tty->termios - this would loose speed settings, etc.
1574 This is same behaviour as serial.c/rs_open() - Kuba */
1575
1576 /* ftdi_set_termios will send usb control messages */
1577 ftdi_set_termios(port, &tmp_termios);
1578
1579 /* FIXME: Flow control might be enabled, so it should be checked -
1580 we have no control of defaults! */
1581 /* Turn on RTS and DTR since we are not flow controlling by default */
1582 if (set_dtr(port, HIGH) < 0) {
1583 err("%s Error from DTR HIGH urb", __FUNCTION__);
1584 }
1585 if (set_rts(port, HIGH) < 0){
1586 err("%s Error from RTS HIGH urb", __FUNCTION__);
1587 }
1588
1589 /* Not throttled */
1590 spin_lock_irqsave(&priv->rx_lock, flags);
1591 priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
1592 spin_unlock_irqrestore(&priv->rx_lock, flags);
1593
1594 /* Start reading from the device */
1595 usb_fill_bulk_urb(port->read_urb, dev,
1596 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
1597 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
1598 ftdi_read_bulk_callback, port);
1599 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
1600 if (result)
1601 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
1602
1603
1604 return result;
1605} /* ftdi_open */
1606
1607
1608
1609/*
1610 * usbserial:__serial_close only calls ftdi_close if the point is open
1611 *
1612 * This only gets called when it is the last close
1613 *
1614 *
1615 */
1616
1617static void ftdi_close (struct usb_serial_port *port, struct file *filp)
1618{ /* ftdi_close */
1619 unsigned int c_cflag = port->tty->termios->c_cflag;
1620 struct ftdi_private *priv = usb_get_serial_port_data(port);
1621 char buf[1];
1622
1623 dbg("%s", __FUNCTION__);
1624
1625 if (c_cflag & HUPCL){
1626 /* Disable flow control */
1627 if (usb_control_msg(port->serial->dev,
1628 usb_sndctrlpipe(port->serial->dev, 0),
1629 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
1630 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1631 0, priv->interface, buf, 0,
1632 WDR_TIMEOUT) < 0) {
1633 err("error from flowcontrol urb");
1634 }
1635
1636 /* drop DTR */
1637 if (set_dtr(port, LOW) < 0){
1638 err("Error from DTR LOW urb");
1639 }
1640 /* drop RTS */
1641 if (set_rts(port, LOW) < 0) {
1642 err("Error from RTS LOW urb");
1643 }
1644 } /* Note change no line if hupcl is off */
1645
1646 /* shutdown our bulk read */
1647 if (port->read_urb)
1648 usb_kill_urb(port->read_urb);
1649} /* ftdi_close */
1650
1651
1652
1653/* The SIO requires the first byte to have:
1654 * B0 1
1655 * B1 0
1656 * B2..7 length of message excluding byte 0
1657 *
1658 * The new devices do not require this byte
1659 */
1660static int ftdi_write (struct usb_serial_port *port,
1661 const unsigned char *buf, int count)
1662{ /* ftdi_write */
1663 struct ftdi_private *priv = usb_get_serial_port_data(port);
1664 struct urb *urb;
1665 unsigned char *buffer;
1666 int data_offset ; /* will be 1 for the SIO and 0 otherwise */
1667 int status;
1668 int transfer_size;
1669
1670 dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count);
1671
1672 if (count == 0) {
1673 dbg("write request of 0 bytes");
1674 return 0;
1675 }
1676
1677 data_offset = priv->write_offset;
1678 dbg("data_offset set to %d",data_offset);
1679
1680 /* Determine total transfer size */
1681 transfer_size = count;
1682 if (data_offset > 0) {
1683 /* Original sio needs control bytes too... */
1684 transfer_size += (data_offset *
1685 ((count + (PKTSZ - 1 - data_offset)) /
1686 (PKTSZ - data_offset)));
1687 }
1688
1689 buffer = kmalloc (transfer_size, GFP_ATOMIC);
1690 if (!buffer) {
1691 err("%s ran out of kernel memory for urb ...", __FUNCTION__);
1692 return -ENOMEM;
1693 }
1694
1695 urb = usb_alloc_urb(0, GFP_ATOMIC);
1696 if (!urb) {
1697 err("%s - no more free urbs", __FUNCTION__);
1698 kfree (buffer);
1699 return -ENOMEM;
1700 }
1701
1702 /* Copy data */
1703 if (data_offset > 0) {
1704 /* Original sio requires control byte at start of each packet. */
1705 int user_pktsz = PKTSZ - data_offset;
1706 int todo = count;
1707 unsigned char *first_byte = buffer;
1708 const unsigned char *current_position = buf;
1709
1710 while (todo > 0) {
1711 if (user_pktsz > todo) {
1712 user_pktsz = todo;
1713 }
1714 /* Write the control byte at the front of the packet*/
1715 *first_byte = 1 | ((user_pktsz) << 2);
1716 /* Copy data for packet */
1717 memcpy (first_byte + data_offset,
1718 current_position, user_pktsz);
1719 first_byte += user_pktsz + data_offset;
1720 current_position += user_pktsz;
1721 todo -= user_pktsz;
1722 }
1723 } else {
1724 /* No control byte required. */
1725 /* Copy in the data to send */
1726 memcpy (buffer, buf, count);
1727 }
1728
1729 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, transfer_size, buffer);
1730
1731 /* fill the buffer and send it */
1732 usb_fill_bulk_urb(urb, port->serial->dev,
1733 usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress),
1734 buffer, transfer_size,
1735 ftdi_write_bulk_callback, port);
1736
1737 status = usb_submit_urb(urb, GFP_ATOMIC);
1738 if (status) {
1739 err("%s - failed submitting write urb, error %d", __FUNCTION__, status);
1740 count = status;
1741 kfree (buffer);
1742 }
1743
1744 /* we are done with this urb, so let the host driver
1745 * really free it when it is finished with it */
1746 usb_free_urb (urb);
1747
1748 dbg("%s write returning: %d", __FUNCTION__, count);
1749 return count;
1750} /* ftdi_write */
1751
1752
1753/* This function may get called when the device is closed */
1754
1755static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
1756{
1757 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1758
1759 /* free up the transfer buffer, as usb_free_urb() does not do this */
1760 kfree (urb->transfer_buffer);
1761
1762 dbg("%s - port %d", __FUNCTION__, port->number);
1763
1764 if (urb->status) {
1765 dbg("nonzero write bulk status received: %d", urb->status);
1766 return;
1767 }
1768
1769 schedule_work(&port->work);
1770} /* ftdi_write_bulk_callback */
1771
1772
1773static int ftdi_write_room( struct usb_serial_port *port )
1774{
1775 dbg("%s - port %d", __FUNCTION__, port->number);
1776
1777 /*
1778 * We really can take anything the user throws at us
1779 * but let's pick a nice big number to tell the tty
1780 * layer that we have lots of free space
1781 */
1782 return 2048;
1783} /* ftdi_write_room */
1784
1785
1786static int ftdi_chars_in_buffer (struct usb_serial_port *port)
1787{ /* ftdi_chars_in_buffer */
1788 dbg("%s - port %d", __FUNCTION__, port->number);
1789
1790 /*
1791 * We can't really account for how much data we
1792 * have sent out, but hasn't made it through to the
1793 * device, so just tell the tty layer that everything
1794 * is flushed.
1795 */
1796 return 0;
1797} /* ftdi_chars_in_buffer */
1798
1799
1800
1801static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
1802{ /* ftdi_read_bulk_callback */
1803 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1804 struct tty_struct *tty;
1805 struct ftdi_private *priv;
1806
1807 if (urb->number_of_packets > 0) {
1808 err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__,
1809 urb->transfer_buffer_length, urb->actual_length, urb->number_of_packets );
1810 err("%s transfer_flags %x ", __FUNCTION__,urb->transfer_flags );
1811 }
1812
1813 dbg("%s - port %d", __FUNCTION__, port->number);
1814
1815 if (port->open_count <= 0)
1816 return;
1817
1818 tty = port->tty;
1819 if (!tty) {
1820 dbg("%s - bad tty pointer - exiting",__FUNCTION__);
1821 return;
1822 }
1823
1824 priv = usb_get_serial_port_data(port);
1825 if (!priv) {
1826 dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
1827 return;
1828 }
1829
1830 if (urb != port->read_urb) {
1831 err("%s - Not my urb!", __FUNCTION__);
1832 }
1833
1834 if (urb->status) {
1835 /* This will happen at close every time so it is a dbg not an err */
1836 dbg("(this is ok on close) nonzero read bulk status received: %d", urb->status);
1837 return;
1838 }
1839
1840 /* If throttled, delay receive processing until unthrottled. */
1841 spin_lock(&priv->rx_lock);
1842 if (priv->rx_flags & THROTTLED) {
1843 dbg("Deferring read urb processing until unthrottled");
1844 priv->rx_flags |= ACTUALLY_THROTTLED;
1845 spin_unlock(&priv->rx_lock);
1846 return;
1847 }
1848 spin_unlock(&priv->rx_lock);
1849
1850 ftdi_process_read(port);
1851
1852} /* ftdi_read_bulk_callback */
1853
1854
1855static void ftdi_process_read (struct usb_serial_port *port)
1856{ /* ftdi_process_read */
1857 struct urb *urb;
1858 struct tty_struct *tty;
1859 struct ftdi_private *priv;
1860 char error_flag;
1861 unsigned char *data;
1862
1863 int i;
1864 int result;
1865 int need_flip;
1866 int packet_offset;
1867
1868 dbg("%s - port %d", __FUNCTION__, port->number);
1869
1870 if (port->open_count <= 0)
1871 return;
1872
1873 tty = port->tty;
1874 if (!tty) {
1875 dbg("%s - bad tty pointer - exiting",__FUNCTION__);
1876 return;
1877 }
1878
1879 priv = usb_get_serial_port_data(port);
1880 if (!priv) {
1881 dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
1882 return;
1883 }
1884
1885 urb = port->read_urb;
1886 if (!urb) {
1887 dbg("%s - bad read_urb pointer - exiting", __FUNCTION__);
1888 return;
1889 }
1890
1891 data = urb->transfer_buffer;
1892
1893 /* The first two bytes of every read packet are status */
1894 if (urb->actual_length > 2) {
1895 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
1896 } else {
1897 dbg("Status only: %03oo %03oo",data[0],data[1]);
1898 }
1899
1900
1901 /* TO DO -- check for hung up line and handle appropriately: */
1902 /* send hangup */
1903 /* See acm.c - you do a tty_hangup - eg tty_hangup(tty) */
1904 /* if CD is dropped and the line is not CLOCAL then we should hangup */
1905
1906 need_flip = 0;
1907 for (packet_offset=0; packet_offset < urb->actual_length; packet_offset += PKTSZ) {
1908 /* Compare new line status to the old one, signal if different */
1909 if (priv != NULL) {
1910 char new_status = data[packet_offset+0] & FTDI_STATUS_B0_MASK;
1911 if (new_status != priv->prev_status) {
1912 priv->diff_status |= new_status ^ priv->prev_status;
1913 wake_up_interruptible(&priv->delta_msr_wait);
1914 priv->prev_status = new_status;
1915 }
1916 }
1917
1918 /* Handle errors and break */
1919 error_flag = TTY_NORMAL;
1920 /* Although the device uses a bitmask and hence can have multiple */
1921 /* errors on a packet - the order here sets the priority the */
1922 /* error is returned to the tty layer */
1923
1924 if ( data[packet_offset+1] & FTDI_RS_OE ) {
1925 error_flag = TTY_OVERRUN;
1926 dbg("OVERRRUN error");
1927 }
1928 if ( data[packet_offset+1] & FTDI_RS_BI ) {
1929 error_flag = TTY_BREAK;
1930 dbg("BREAK received");
1931 }
1932 if ( data[packet_offset+1] & FTDI_RS_PE ) {
1933 error_flag = TTY_PARITY;
1934 dbg("PARITY error");
1935 }
1936 if ( data[packet_offset+1] & FTDI_RS_FE ) {
1937 error_flag = TTY_FRAME;
1938 dbg("FRAMING error");
1939 }
1940 if (urb->actual_length > packet_offset + 2) {
1941 for (i = 2; (i < PKTSZ) && ((i+packet_offset) < urb->actual_length); ++i) {
1942 /* have to make sure we don't overflow the buffer
1943 with tty_insert_flip_char's */
1944 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1945 tty_flip_buffer_push(tty);
1946 }
1947 /* Note that the error flag is duplicated for
1948 every character received since we don't know
1949 which character it applied to */
1950 tty_insert_flip_char(tty, data[packet_offset+i], error_flag);
1951 }
1952 need_flip = 1;
1953 }
1954
1955#ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW
1956 /* if a parity error is detected you get status packets forever
1957 until a character is sent without a parity error.
1958 This doesn't work well since the application receives a never
1959 ending stream of bad data - even though new data hasn't been sent.
1960 Therefore I (bill) have taken this out.
1961 However - this might make sense for framing errors and so on
1962 so I am leaving the code in for now.
1963 */
1964 else {
1965 if (error_flag != TTY_NORMAL){
1966 dbg("error_flag is not normal");
1967 /* In this case it is just status - if that is an error send a bad character */
1968 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1969 tty_flip_buffer_push(tty);
1970 }
1971 tty_insert_flip_char(tty, 0xff, error_flag);
1972 need_flip = 1;
1973 }
1974 }
1975#endif
1976 } /* "for(packet_offset=0..." */
1977
1978 /* Low latency */
1979 if (need_flip) {
1980 tty_flip_buffer_push(tty);
1981 }
1982
1983 /* if the port is closed stop trying to read */
1984 if (port->open_count > 0){
1985 /* Continue trying to always read */
1986 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
1987 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
1988 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
1989 ftdi_read_bulk_callback, port);
1990
1991 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1992 if (result)
1993 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
1994 }
1995
1996 return;
1997} /* ftdi_process_read */
1998
1999
2000static void ftdi_break_ctl( struct usb_serial_port *port, int break_state )
2001{
2002 struct ftdi_private *priv = usb_get_serial_port_data(port);
2003 __u16 urb_value = 0;
2004 char buf[1];
2005
2006 /* break_state = -1 to turn on break, and 0 to turn off break */
2007 /* see drivers/char/tty_io.c to see it used */
2008 /* last_set_data_urb_value NEVER has the break bit set in it */
2009
2010 if (break_state) {
2011 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
2012 } else {
2013 urb_value = priv->last_set_data_urb_value;
2014 }
2015
2016
2017 if (usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
2018 FTDI_SIO_SET_DATA_REQUEST,
2019 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2020 urb_value , priv->interface,
2021 buf, 0, WDR_TIMEOUT) < 0) {
2022 err("%s FAILED to enable/disable break state (state was %d)", __FUNCTION__,break_state);
2023 }
2024
2025 dbg("%s break state is %d - urb is %d", __FUNCTION__,break_state, urb_value);
2026
2027}
2028
2029
2030/* old_termios contains the original termios settings and tty->termios contains
2031 * the new setting to be used
2032 * WARNING: set_termios calls this with old_termios in kernel space
2033 */
2034
2035static void ftdi_set_termios (struct usb_serial_port *port, struct termios *old_termios)
2036{ /* ftdi_termios */
2037 struct usb_device *dev = port->serial->dev;
2038 unsigned int cflag = port->tty->termios->c_cflag;
2039 struct ftdi_private *priv = usb_get_serial_port_data(port);
2040 __u16 urb_value; /* will hold the new flags */
2041 char buf[1]; /* Perhaps I should dynamically alloc this? */
2042
2043 // Added for xon/xoff support
2044 unsigned int iflag = port->tty->termios->c_iflag;
2045 unsigned char vstop;
2046 unsigned char vstart;
2047
2048 dbg("%s", __FUNCTION__);
2049
2050 /* Force baud rate if this device requires it, unless it is set to B0. */
2051 if (priv->force_baud && ((port->tty->termios->c_cflag & CBAUD) != B0)) {
2052 dbg("%s: forcing baud rate for this device", __FUNCTION__);
2053 port->tty->termios->c_cflag &= ~CBAUD;
2054 port->tty->termios->c_cflag |= priv->force_baud;
2055 }
2056
2057 /* Force RTS-CTS if this device requires it. */
2058 if (priv->force_rtscts) {
2059 dbg("%s: forcing rtscts for this device", __FUNCTION__);
2060 port->tty->termios->c_cflag |= CRTSCTS;
2061 }
2062
2063 cflag = port->tty->termios->c_cflag;
2064
2065 /* FIXME -For this cut I don't care if the line is really changing or
2066 not - so just do the change regardless - should be able to
2067 compare old_termios and tty->termios */
2068 /* NOTE These routines can get interrupted by
2069 ftdi_sio_read_bulk_callback - need to examine what this
2070 means - don't see any problems yet */
2071
2072 /* Set number of data bits, parity, stop bits */
2073
2074 urb_value = 0;
2075 urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
2076 FTDI_SIO_SET_DATA_STOP_BITS_1);
2077 urb_value |= (cflag & PARENB ?
2078 (cflag & PARODD ? FTDI_SIO_SET_DATA_PARITY_ODD :
2079 FTDI_SIO_SET_DATA_PARITY_EVEN) :
2080 FTDI_SIO_SET_DATA_PARITY_NONE);
2081 if (cflag & CSIZE) {
2082 switch (cflag & CSIZE) {
2083 case CS5: urb_value |= 5; dbg("Setting CS5"); break;
2084 case CS6: urb_value |= 6; dbg("Setting CS6"); break;
2085 case CS7: urb_value |= 7; dbg("Setting CS7"); break;
2086 case CS8: urb_value |= 8; dbg("Setting CS8"); break;
2087 default:
2088 err("CSIZE was set but not CS5-CS8");
2089 }
2090 }
2091
2092 /* This is needed by the break command since it uses the same command - but is
2093 * or'ed with this value */
2094 priv->last_set_data_urb_value = urb_value;
2095
2096 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2097 FTDI_SIO_SET_DATA_REQUEST,
2098 FTDI_SIO_SET_DATA_REQUEST_TYPE,
2099 urb_value , priv->interface,
2100 buf, 0, 100) < 0) {
2101 err("%s FAILED to set databits/stopbits/parity", __FUNCTION__);
2102 }
2103
2104 /* Now do the baudrate */
2105 if ((cflag & CBAUD) == B0 ) {
2106 /* Disable flow control */
2107 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
2108 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2109 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2110 0, priv->interface,
2111 buf, 0, WDR_TIMEOUT) < 0) {
2112 err("%s error from disable flowcontrol urb", __FUNCTION__);
2113 }
2114 /* Drop RTS and DTR */
2115 if (set_dtr(port, LOW) < 0){
2116 err("%s Error from DTR LOW urb", __FUNCTION__);
2117 }
2118 if (set_rts(port, LOW) < 0){
2119 err("%s Error from RTS LOW urb", __FUNCTION__);
2120 }
2121
2122 } else {
2123 /* set the baudrate determined before */
2124 if (change_speed(port)) {
2125 err("%s urb failed to set baurdrate", __FUNCTION__);
2126 }
2127 /* Ensure RTS and DTR are raised */
2128 else if (set_dtr(port, HIGH) < 0){
2129 err("%s Error from DTR HIGH urb", __FUNCTION__);
2130 }
2131 else if (set_rts(port, HIGH) < 0){
2132 err("%s Error from RTS HIGH urb", __FUNCTION__);
2133 }
2134 }
2135
2136 /* Set flow control */
2137 /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
2138 if (cflag & CRTSCTS) {
2139 dbg("%s Setting to CRTSCTS flow control", __FUNCTION__);
2140 if (usb_control_msg(dev,
2141 usb_sndctrlpipe(dev, 0),
2142 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2143 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2144 0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
2145 buf, 0, WDR_TIMEOUT) < 0) {
2146 err("urb failed to set to rts/cts flow control");
2147 }
2148
2149 } else {
2150 /*
2151 * Xon/Xoff code
2152 *
2153 * Check the IXOFF status in the iflag component of the termios structure
2154 * if IXOFF is not set, the pre-xon/xoff code is executed.
2155 */
2156 if (iflag & IXOFF) {
2157 dbg("%s request to enable xonxoff iflag=%04x",__FUNCTION__,iflag);
2158 // Try to enable the XON/XOFF on the ftdi_sio
2159 // Set the vstart and vstop -- could have been done up above where
2160 // a lot of other dereferencing is done but that would be very
2161 // inefficient as vstart and vstop are not always needed
2162 vstart=port->tty->termios->c_cc[VSTART];
2163 vstop=port->tty->termios->c_cc[VSTOP];
2164 urb_value=(vstop << 8) | (vstart);
2165
2166 if (usb_control_msg(dev,
2167 usb_sndctrlpipe(dev, 0),
2168 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2169 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2170 urb_value , (FTDI_SIO_XON_XOFF_HS
2171 | priv->interface),
2172 buf, 0, WDR_TIMEOUT) < 0) {
2173 err("urb failed to set to xon/xoff flow control");
2174 }
2175 } else {
2176 /* else clause to only run if cfag ! CRTSCTS and iflag ! XOFF */
2177 /* CHECKME Assuming XON/XOFF handled by tty stack - not by device */
2178 dbg("%s Turning off hardware flow control", __FUNCTION__);
2179 if (usb_control_msg(dev,
2180 usb_sndctrlpipe(dev, 0),
2181 FTDI_SIO_SET_FLOW_CTRL_REQUEST,
2182 FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
2183 0, priv->interface,
2184 buf, 0, WDR_TIMEOUT) < 0) {
2185 err("urb failed to clear flow control");
2186 }
2187 }
2188
2189 }
2190 return;
2191} /* ftdi_termios */
2192
2193
2194static int ftdi_tiocmget (struct usb_serial_port *port, struct file *file)
2195{
2196 struct ftdi_private *priv = usb_get_serial_port_data(port);
2197 unsigned char buf[2];
2198 int ret;
2199
2200 dbg("%s TIOCMGET", __FUNCTION__);
2201 switch (priv->chip_type) {
2202 case SIO:
2203 /* Request the status from the device */
2204 if ((ret = usb_control_msg(port->serial->dev,
2205 usb_rcvctrlpipe(port->serial->dev, 0),
2206 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2207 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2208 0, 0,
2209 buf, 1, WDR_TIMEOUT)) < 0 ) {
2210 err("%s Could not get modem status of device - err: %d", __FUNCTION__,
2211 ret);
2212 return(ret);
2213 }
2214 break;
2215 case FT8U232AM:
2216 case FT232BM:
2217 case FT2232C:
2218 /* the 8U232AM returns a two byte value (the sio is a 1 byte value) - in the same
2219 format as the data returned from the in point */
2220 if ((ret = usb_control_msg(port->serial->dev,
2221 usb_rcvctrlpipe(port->serial->dev, 0),
2222 FTDI_SIO_GET_MODEM_STATUS_REQUEST,
2223 FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
2224 0, priv->interface,
2225 buf, 2, WDR_TIMEOUT)) < 0 ) {
2226 err("%s Could not get modem status of device - err: %d", __FUNCTION__,
2227 ret);
2228 return(ret);
2229 }
2230 break;
2231 default:
2232 return -EFAULT;
2233 break;
2234 }
2235
2236 return (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
2237 (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
2238 (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
2239 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
2240 priv->last_dtr_rts;
2241}
2242
2243static int ftdi_tiocmset(struct usb_serial_port *port, struct file * file, unsigned int set, unsigned int clear)
2244{
2245 int ret;
2246
2247 dbg("%s TIOCMSET", __FUNCTION__);
2248 if (set & TIOCM_DTR){
2249 if ((ret = set_dtr(port, HIGH)) < 0) {
2250 err("Urb to set DTR failed");
2251 return(ret);
2252 }
2253 }
2254 if (set & TIOCM_RTS) {
2255 if ((ret = set_rts(port, HIGH)) < 0){
2256 err("Urb to set RTS failed");
2257 return(ret);
2258 }
2259 }
2260
2261 if (clear & TIOCM_DTR){
2262 if ((ret = set_dtr(port, LOW)) < 0){
2263 err("Urb to unset DTR failed");
2264 return(ret);
2265 }
2266 }
2267 if (clear & TIOCM_RTS) {
2268 if ((ret = set_rts(port, LOW)) < 0){
2269 err("Urb to unset RTS failed");
2270 return(ret);
2271 }
2272 }
2273 return(0);
2274}
2275
2276
2277static int ftdi_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
2278{
2279 struct ftdi_private *priv = usb_get_serial_port_data(port);
2280
2281 int ret, mask;
2282
2283 dbg("%s cmd 0x%04x", __FUNCTION__, cmd);
2284
2285 /* Based on code from acm.c and others */
2286 switch (cmd) {
2287
2288 case TIOCMBIS: /* turns on (Sets) the lines as specified by the mask */
2289 dbg("%s TIOCMBIS", __FUNCTION__);
2290 if (get_user(mask, (unsigned long __user *) arg))
2291 return -EFAULT;
2292 if (mask & TIOCM_DTR){
2293 if ((ret = set_dtr(port, HIGH)) < 0) {
2294 err("Urb to set DTR failed");
2295 return(ret);
2296 }
2297 }
2298 if (mask & TIOCM_RTS) {
2299 if ((ret = set_rts(port, HIGH)) < 0){
2300 err("Urb to set RTS failed");
2301 return(ret);
2302 }
2303 }
2304 return(0);
2305 break;
2306
2307 case TIOCMBIC: /* turns off (Clears) the lines as specified by the mask */
2308 dbg("%s TIOCMBIC", __FUNCTION__);
2309 if (get_user(mask, (unsigned long __user *) arg))
2310 return -EFAULT;
2311 if (mask & TIOCM_DTR){
2312 if ((ret = set_dtr(port, LOW)) < 0){
2313 err("Urb to unset DTR failed");
2314 return(ret);
2315 }
2316 }
2317 if (mask & TIOCM_RTS) {
2318 if ((ret = set_rts(port, LOW)) < 0){
2319 err("Urb to unset RTS failed");
2320 return(ret);
2321 }
2322 }
2323 return(0);
2324 break;
2325
2326 /*
2327 * I had originally implemented TCSET{A,S}{,F,W} and
2328 * TCGET{A,S} here separately, however when testing I
2329 * found that the higher layers actually do the termios
2330 * conversions themselves and pass the call onto
2331 * ftdi_sio_set_termios.
2332 *
2333 */
2334
2335 case TIOCGSERIAL: /* gets serial port data */
2336 return get_serial_info(port, (struct serial_struct __user *) arg);
2337
2338 case TIOCSSERIAL: /* sets serial port data */
2339 return set_serial_info(port, (struct serial_struct __user *) arg);
2340
2341 /*
2342 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
2343 * - mask passed in arg for lines of interest
2344 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
2345 * Caller should use TIOCGICOUNT to see which one it was.
2346 *
2347 * This code is borrowed from linux/drivers/char/serial.c
2348 */
2349 case TIOCMIWAIT:
2350 while (priv != NULL) {
2351 interruptible_sleep_on(&priv->delta_msr_wait);
2352 /* see if a signal did it */
2353 if (signal_pending(current))
2354 return -ERESTARTSYS;
2355 else {
2356 char diff = priv->diff_status;
2357
2358 if (diff == 0) {
2359 return -EIO; /* no change => error */
2360 }
2361
2362 /* Consume all events */
2363 priv->diff_status = 0;
2364
2365 /* Return 0 if caller wanted to know about these bits */
2366 if ( ((arg & TIOCM_RNG) && (diff & FTDI_RS0_RI)) ||
2367 ((arg & TIOCM_DSR) && (diff & FTDI_RS0_DSR)) ||
2368 ((arg & TIOCM_CD) && (diff & FTDI_RS0_RLSD)) ||
2369 ((arg & TIOCM_CTS) && (diff & FTDI_RS0_CTS)) ) {
2370 return 0;
2371 }
2372 /*
2373 * Otherwise caller can't care less about what happened,
2374 * and so we continue to wait for more events.
2375 */
2376 }
2377 }
2378 return(0);
2379 break;
2380 default:
2381 break;
2382
2383 }
2384
2385
2386 /* This is not necessarily an error - turns out the higher layers will do
2387 * some ioctls itself (see comment above)
2388 */
2389 dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __FUNCTION__, cmd);
2390
2391 return(-ENOIOCTLCMD);
2392} /* ftdi_ioctl */
2393
2394
2395static void ftdi_throttle (struct usb_serial_port *port)
2396{
2397 struct ftdi_private *priv = usb_get_serial_port_data(port);
2398 unsigned long flags;
2399
2400 dbg("%s - port %d", __FUNCTION__, port->number);
2401
2402 spin_lock_irqsave(&priv->rx_lock, flags);
2403 priv->rx_flags |= THROTTLED;
2404 spin_unlock_irqrestore(&priv->rx_lock, flags);
2405}
2406
2407
2408static void ftdi_unthrottle (struct usb_serial_port *port)
2409{
2410 struct ftdi_private *priv = usb_get_serial_port_data(port);
2411 int actually_throttled;
2412 unsigned long flags;
2413
2414 dbg("%s - port %d", __FUNCTION__, port->number);
2415
2416 spin_lock_irqsave(&priv->rx_lock, flags);
2417 actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
2418 priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
2419 spin_unlock_irqrestore(&priv->rx_lock, flags);
2420
2421 if (actually_throttled)
2422 ftdi_process_read(port);
2423}
2424
2425static int __init ftdi_init (void)
2426{
2427 int retval;
2428
2429 dbg("%s", __FUNCTION__);
2430 retval = usb_serial_register(&ftdi_SIO_device);
2431 if (retval)
2432 goto failed_SIO_register;
2433 retval = usb_serial_register(&ftdi_8U232AM_device);
2434 if (retval)
2435 goto failed_8U232AM_register;
2436 retval = usb_serial_register(&ftdi_FT232BM_device);
2437 if (retval)
2438 goto failed_FT232BM_register;
2439 retval = usb_serial_register(&ftdi_FT2232C_device);
2440 if (retval)
2441 goto failed_FT2232C_register;
2442 retval = usb_serial_register(&ftdi_USB_UIRT_device);
2443 if (retval)
2444 goto failed_USB_UIRT_register;
2445 retval = usb_serial_register(&ftdi_HE_TIRA1_device);
2446 if (retval)
2447 goto failed_HE_TIRA1_register;
2448 retval = usb_register(&ftdi_driver);
2449 if (retval)
2450 goto failed_usb_register;
2451
2452 info(DRIVER_VERSION ":" DRIVER_DESC);
2453 return 0;
2454failed_usb_register:
2455 usb_serial_deregister(&ftdi_HE_TIRA1_device);
2456failed_HE_TIRA1_register:
2457 usb_serial_deregister(&ftdi_USB_UIRT_device);
2458failed_USB_UIRT_register:
2459 usb_serial_deregister(&ftdi_FT2232C_device);
2460failed_FT2232C_register:
2461 usb_serial_deregister(&ftdi_FT232BM_device);
2462failed_FT232BM_register:
2463 usb_serial_deregister(&ftdi_8U232AM_device);
2464failed_8U232AM_register:
2465 usb_serial_deregister(&ftdi_SIO_device);
2466failed_SIO_register:
2467 return retval;
2468}
2469
2470
2471static void __exit ftdi_exit (void)
2472{
2473
2474 dbg("%s", __FUNCTION__);
2475
2476 usb_deregister (&ftdi_driver);
2477 usb_serial_deregister (&ftdi_HE_TIRA1_device);
2478 usb_serial_deregister (&ftdi_USB_UIRT_device);
2479 usb_serial_deregister (&ftdi_FT2232C_device);
2480 usb_serial_deregister (&ftdi_FT232BM_device);
2481 usb_serial_deregister (&ftdi_8U232AM_device);
2482 usb_serial_deregister (&ftdi_SIO_device);
2483
2484}
2485
2486
2487module_init(ftdi_init);
2488module_exit(ftdi_exit);
2489
2490MODULE_AUTHOR( DRIVER_AUTHOR );
2491MODULE_DESCRIPTION( DRIVER_DESC );
2492MODULE_LICENSE("GPL");
2493
2494module_param(debug, bool, S_IRUGO | S_IWUSR);
2495MODULE_PARM_DESC(debug, "Debug enabled or not");
2496
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
new file mode 100644
index 000000000000..be5d60bf90b9
--- /dev/null
+++ b/drivers/usb/serial/ftdi_sio.h
@@ -0,0 +1,777 @@
1/*
2 * Definitions for the FTDI USB Single Port Serial Converter -
3 * known as FTDI_SIO (Serial Input/Output application of the chipset)
4 *
5 * The example I have is known as the USC-1000 which is available from
6 * http://www.dse.co.nz - cat no XH4214 It looks similar to this:
7 * http://www.dansdata.com/usbser.htm but I can't be sure There are other
8 * USC-1000s which don't look like my device though so beware!
9 *
10 * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,
11 * USB on the other.
12 *
13 * Thanx to FTDI (http://www.ftdi.co.uk) for so kindly providing details
14 * of the protocol required to talk to the device and ongoing assistence
15 * during development.
16 *
17 * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the
18 * FTDI_SIO implementation.
19 *
20 * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais
21 * from Rudolf Gugler
22 *
23 */
24
25#define FTDI_VID 0x0403 /* Vendor Id */
26#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */
27#define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
28#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
29#define FTDI_8U232AM_ALT_ALT_PID 0xf3c0 /* FTDI's second alternate PID for above */
30#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
31#define FTDI_RELAIS_PID 0xFA10 /* Relais device from Rudolf Gugler */
32#define FTDI_NF_RIC_VID 0x0DCD /* Vendor Id */
33#define FTDI_NF_RIC_PID 0x0001 /* Product Id */
34
35/* www.irtrans.de device */
36#define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
37
38/* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */
39/* they use the ftdi chipset for the USB interface and the vendor id is the same */
40#define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */
41#define FTDI_XF_634_PID 0xFC09 /* 634: 20x4 Character Display */
42#define FTDI_XF_547_PID 0xFC0A /* 547: Two line Display */
43#define FTDI_XF_633_PID 0xFC0B /* 633: 16x2 Character Display with Keys */
44#define FTDI_XF_631_PID 0xFC0C /* 631: 20x2 Character Display */
45#define FTDI_XF_635_PID 0xFC0D /* 635: 20x4 Character Display */
46#define FTDI_XF_640_PID 0xFC0E /* 640: Two line Display */
47#define FTDI_XF_642_PID 0xFC0F /* 642: Two line Display */
48
49/* Video Networks Limited / Homechoice in the UK use an ftdi-based device for their 1Mb */
50/* broadband internet service. The following PID is exhibited by the usb device supplied */
51/* (the VID is the standard ftdi vid (FTDI_VID) */
52#define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */
53
54/*
55 * The following are the values for the Matrix Orbital LCD displays,
56 * which are the FT232BM ( similar to the 8U232AM )
57 */
58#define FTDI_MTXORB_0_PID 0xFA00 /* Matrix Orbital Product Id */
59#define FTDI_MTXORB_1_PID 0xFA01 /* Matrix Orbital Product Id */
60#define FTDI_MTXORB_2_PID 0xFA02 /* Matrix Orbital Product Id */
61#define FTDI_MTXORB_3_PID 0xFA03 /* Matrix Orbital Product Id */
62#define FTDI_MTXORB_4_PID 0xFA04 /* Matrix Orbital Product Id */
63#define FTDI_MTXORB_5_PID 0xFA05 /* Matrix Orbital Product Id */
64#define FTDI_MTXORB_6_PID 0xFA06 /* Matrix Orbital Product Id */
65
66/* Interbiometrics USB I/O Board */
67/* Developed for Interbiometrics by Rudolf Gugler */
68#define INTERBIOMETRICS_VID 0x1209
69#define INTERBIOMETRICS_IOBOARD_PID 0x1002
70#define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006
71
72/*
73 * The following are the values for the Perle Systems
74 * UltraPort USB serial converters
75 */
76#define FTDI_PERLE_ULTRAPORT_PID 0xF0C0 /* Perle UltraPort Product Id */
77
78/*
79 * The following are the values for the Sealevel SeaLINK+ adapters.
80 * (Original list sent by Tuan Hoang. Ian Abbott renamed the macros and
81 * removed some PIDs that don't seem to match any existing products.)
82 */
83#define SEALEVEL_VID 0x0c52 /* Sealevel Vendor ID */
84#define SEALEVEL_2101_PID 0x2101 /* SeaLINK+232 (2101/2105) */
85#define SEALEVEL_2102_PID 0x2102 /* SeaLINK+485 (2102) */
86#define SEALEVEL_2103_PID 0x2103 /* SeaLINK+232I (2103) */
87#define SEALEVEL_2104_PID 0x2104 /* SeaLINK+485I (2104) */
88#define SEALEVEL_2201_1_PID 0x2211 /* SeaPORT+2/232 (2201) Port 1 */
89#define SEALEVEL_2201_2_PID 0x2221 /* SeaPORT+2/232 (2201) Port 2 */
90#define SEALEVEL_2202_1_PID 0x2212 /* SeaPORT+2/485 (2202) Port 1 */
91#define SEALEVEL_2202_2_PID 0x2222 /* SeaPORT+2/485 (2202) Port 2 */
92#define SEALEVEL_2203_1_PID 0x2213 /* SeaPORT+2 (2203) Port 1 */
93#define SEALEVEL_2203_2_PID 0x2223 /* SeaPORT+2 (2203) Port 2 */
94#define SEALEVEL_2401_1_PID 0x2411 /* SeaPORT+4/232 (2401) Port 1 */
95#define SEALEVEL_2401_2_PID 0x2421 /* SeaPORT+4/232 (2401) Port 2 */
96#define SEALEVEL_2401_3_PID 0x2431 /* SeaPORT+4/232 (2401) Port 3 */
97#define SEALEVEL_2401_4_PID 0x2441 /* SeaPORT+4/232 (2401) Port 4 */
98#define SEALEVEL_2402_1_PID 0x2412 /* SeaPORT+4/485 (2402) Port 1 */
99#define SEALEVEL_2402_2_PID 0x2422 /* SeaPORT+4/485 (2402) Port 2 */
100#define SEALEVEL_2402_3_PID 0x2432 /* SeaPORT+4/485 (2402) Port 3 */
101#define SEALEVEL_2402_4_PID 0x2442 /* SeaPORT+4/485 (2402) Port 4 */
102#define SEALEVEL_2403_1_PID 0x2413 /* SeaPORT+4 (2403) Port 1 */
103#define SEALEVEL_2403_2_PID 0x2423 /* SeaPORT+4 (2403) Port 2 */
104#define SEALEVEL_2403_3_PID 0x2433 /* SeaPORT+4 (2403) Port 3 */
105#define SEALEVEL_2403_4_PID 0x2443 /* SeaPORT+4 (2403) Port 4 */
106#define SEALEVEL_2801_1_PID 0X2811 /* SeaLINK+8/232 (2801) Port 1 */
107#define SEALEVEL_2801_2_PID 0X2821 /* SeaLINK+8/232 (2801) Port 2 */
108#define SEALEVEL_2801_3_PID 0X2831 /* SeaLINK+8/232 (2801) Port 3 */
109#define SEALEVEL_2801_4_PID 0X2841 /* SeaLINK+8/232 (2801) Port 4 */
110#define SEALEVEL_2801_5_PID 0X2851 /* SeaLINK+8/232 (2801) Port 5 */
111#define SEALEVEL_2801_6_PID 0X2861 /* SeaLINK+8/232 (2801) Port 6 */
112#define SEALEVEL_2801_7_PID 0X2871 /* SeaLINK+8/232 (2801) Port 7 */
113#define SEALEVEL_2801_8_PID 0X2881 /* SeaLINK+8/232 (2801) Port 8 */
114#define SEALEVEL_2802_1_PID 0X2812 /* SeaLINK+8/485 (2802) Port 1 */
115#define SEALEVEL_2802_2_PID 0X2822 /* SeaLINK+8/485 (2802) Port 2 */
116#define SEALEVEL_2802_3_PID 0X2832 /* SeaLINK+8/485 (2802) Port 3 */
117#define SEALEVEL_2802_4_PID 0X2842 /* SeaLINK+8/485 (2802) Port 4 */
118#define SEALEVEL_2802_5_PID 0X2852 /* SeaLINK+8/485 (2802) Port 5 */
119#define SEALEVEL_2802_6_PID 0X2862 /* SeaLINK+8/485 (2802) Port 6 */
120#define SEALEVEL_2802_7_PID 0X2872 /* SeaLINK+8/485 (2802) Port 7 */
121#define SEALEVEL_2802_8_PID 0X2882 /* SeaLINK+8/485 (2802) Port 8 */
122#define SEALEVEL_2803_1_PID 0X2813 /* SeaLINK+8 (2803) Port 1 */
123#define SEALEVEL_2803_2_PID 0X2823 /* SeaLINK+8 (2803) Port 2 */
124#define SEALEVEL_2803_3_PID 0X2833 /* SeaLINK+8 (2803) Port 3 */
125#define SEALEVEL_2803_4_PID 0X2843 /* SeaLINK+8 (2803) Port 4 */
126#define SEALEVEL_2803_5_PID 0X2853 /* SeaLINK+8 (2803) Port 5 */
127#define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */
128#define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */
129#define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */
130
131/*
132 * DSS-20 Sync Station for Sony Ericsson P800
133 */
134
135#define FTDI_DSS20_PID 0xFC82
136
137/*
138 * Home Electronics (www.home-electro.com) USB gadgets
139 */
140#define FTDI_HE_TIRA1_PID 0xFA78 /* Tira-1 IR tranceiver */
141
142/* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
143/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
144#define FTDI_USB_UIRT_PID 0xF850 /* Product Id */
145
146/* ELV USB Module UO100 (PID sent by Stefan Frings) */
147#define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */
148
149/*
150 * Definitions for ID TECH (www.idt-net.com) devices
151 */
152#define IDTECH_VID 0x0ACD /* ID TECH Vendor ID */
153#define IDTECH_IDT1221U_PID 0x0300 /* IDT1221U USB to RS-232 adapter */
154
155/*
156 * Definitions for Omnidirectional Control Technology, Inc. devices
157 */
158#define OCT_VID 0x0B39 /* OCT vendor ID */
159/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
160/* Also rebadged as SIIG Inc. model US2308 */
161#define OCT_US101_PID 0x0421 /* OCT US101 USB to RS-232 */
162
163/* an infrared receiver for user access control with IR tags */
164#define FTDI_PIEGROUP_PID 0xF208 /* Product Id */
165
166/*
167 * Protego product ids
168 */
169#define PROTEGO_SPECIAL_1 0xFC70 /* special/unknown device */
170#define PROTEGO_R2X0 0xFC71 /* R200-USB TRNG unit (R210, R220, and R230) */
171#define PROTEGO_SPECIAL_3 0xFC72 /* special/unknown device */
172#define PROTEGO_SPECIAL_4 0xFC73 /* special/unknown device */
173
174/*
175 * Gude Analog- und Digitalsysteme GmbH
176 */
177#define FTDI_GUDEADS_E808_PID 0xE808
178#define FTDI_GUDEADS_E809_PID 0xE809
179#define FTDI_GUDEADS_E80A_PID 0xE80A
180#define FTDI_GUDEADS_E80B_PID 0xE80B
181#define FTDI_GUDEADS_E80C_PID 0xE80C
182#define FTDI_GUDEADS_E80D_PID 0xE80D
183#define FTDI_GUDEADS_E80E_PID 0xE80E
184#define FTDI_GUDEADS_E80F_PID 0xE80F
185#define FTDI_GUDEADS_E888_PID 0xE888 /* Expert ISDN Control USB */
186#define FTDI_GUDEADS_E889_PID 0xE889 /* USB RS-232 OptoBridge */
187#define FTDI_GUDEADS_E88A_PID 0xE88A
188#define FTDI_GUDEADS_E88B_PID 0xE88B
189#define FTDI_GUDEADS_E88C_PID 0xE88C
190#define FTDI_GUDEADS_E88D_PID 0xE88D
191#define FTDI_GUDEADS_E88E_PID 0xE88E
192#define FTDI_GUDEADS_E88F_PID 0xE88F
193
194/*
195 * Linx Technologies product ids
196 */
197#define LINX_SDMUSBQSS_PID 0xF448 /* Linx SDM-USB-QS-S */
198#define LINX_MASTERDEVEL2_PID 0xF449 /* Linx Master Development 2.0 */
199#define LINX_FUTURE_0_PID 0xF44A /* Linx future device */
200#define LINX_FUTURE_1_PID 0xF44B /* Linx future device */
201#define LINX_FUTURE_2_PID 0xF44C /* Linx future device */
202
203/* CCS Inc. ICDU/ICDU40 product ID - the FT232BM is used in an in-circuit-debugger */
204/* unit for PIC16's/PIC18's */
205#define FTDI_CCSICDU20_0_PID 0xF9D0
206#define FTDI_CCSICDU40_1_PID 0xF9D1
207
208/* Inside Accesso contactless reader (http://www.insidefr.com) */
209#define INSIDE_ACCESSO 0xFAD0
210
211/*
212 * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI
213 */
214#define INTREPID_VID 0x093C
215#define INTREPID_VALUECAN_PID 0x0601
216#define INTREPID_NEOVI_PID 0x0701
217
218/*
219 * Falcom Wireless Communications GmbH
220 */
221#define FALCOM_VID 0x0F94 /* Vendor Id */
222#define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */
223
224/*
225 * SUUNTO product ids
226 */
227#define FTDI_SUUNTO_SPORTS_PID 0xF680 /* Suunto Sports instrument */
228
229/*
230 * Definitions for B&B Electronics products.
231 */
232#define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */
233#define BANDB_USOTL4_PID 0xAC01 /* USOTL4 Isolated RS-485 Converter */
234#define BANDB_USTL4_PID 0xAC02 /* USTL4 RS-485 Converter */
235#define BANDB_USO9ML2_PID 0xAC03 /* USO9ML2 Isolated RS-232 Converter */
236
237/*
238 * RM Michaelides CANview USB (http://www.rmcan.com)
239 * CAN filedbus interface adapter, addad by port GmbH www.port.de)
240 */
241#define FTDI_RM_VID 0x0403 /* Vendor Id */
242#define FTDI_RMCANVIEW_PID 0xfd60 /* Product Id */
243
244/*
245 * EVER Eco Pro UPS (http://www.ever.com.pl/)
246 */
247
248#define EVER_ECO_PRO_CDS 0xe520 /* RS-232 converter */
249
250/* Commands */
251#define FTDI_SIO_RESET 0 /* Reset the port */
252#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
253#define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
254#define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
255#define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
256#define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modern status register */
257#define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
258#define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
259#define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
260#define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */
261
262/* Port interface code for FT2232C */
263#define INTERFACE_A 1
264#define INTERFACE_B 2
265
266
267/*
268 * BmRequestType: 1100 0000b
269 * bRequest: FTDI_E2_READ
270 * wValue: 0
271 * wIndex: Address of word to read
272 * wLength: 2
273 * Data: Will return a word of data from E2Address
274 *
275 */
276
277/* Port Identifier Table */
278#define PIT_DEFAULT 0 /* SIOA */
279#define PIT_SIOA 1 /* SIOA */
280/* The device this driver is tested with one has only one port */
281#define PIT_SIOB 2 /* SIOB */
282#define PIT_PARALLEL 3 /* Parallel */
283
284/* FTDI_SIO_RESET */
285#define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET
286#define FTDI_SIO_RESET_REQUEST_TYPE 0x40
287#define FTDI_SIO_RESET_SIO 0
288#define FTDI_SIO_RESET_PURGE_RX 1
289#define FTDI_SIO_RESET_PURGE_TX 2
290
291/*
292 * BmRequestType: 0100 0000B
293 * bRequest: FTDI_SIO_RESET
294 * wValue: Control Value
295 * 0 = Reset SIO
296 * 1 = Purge RX buffer
297 * 2 = Purge TX buffer
298 * wIndex: Port
299 * wLength: 0
300 * Data: None
301 *
302 * The Reset SIO command has this effect:
303 *
304 * Sets flow control set to 'none'
305 * Event char = $0D
306 * Event trigger = disabled
307 * Purge RX buffer
308 * Purge TX buffer
309 * Clear DTR
310 * Clear RTS
311 * baud and data format not reset
312 *
313 * The Purge RX and TX buffer commands affect nothing except the buffers
314 *
315 */
316
317/* FTDI_SIO_SET_BAUDRATE */
318#define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40
319#define FTDI_SIO_SET_BAUDRATE_REQUEST 3
320
321/*
322 * BmRequestType: 0100 0000B
323 * bRequest: FTDI_SIO_SET_BAUDRATE
324 * wValue: BaudDivisor value - see below
325 * wIndex: Port
326 * wLength: 0
327 * Data: None
328 * The BaudDivisor values are calculated as follows:
329 * - BaseClock is either 12000000 or 48000000 depending on the device. FIXME: I wish
330 * I knew how to detect old chips to select proper base clock!
331 * - BaudDivisor is a fixed point number encoded in a funny way.
332 * (--WRONG WAY OF THINKING--)
333 * BaudDivisor is a fixed point number encoded with following bit weighs:
334 * (-2)(-1)(13..0). It is a radical with a denominator of 4, so values
335 * end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...).
336 * (--THE REALITY--)
337 * The both-bits-set has quite different meaning from 0.75 - the chip designers
338 * have decided it to mean 0.125 instead of 0.75.
339 * This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates
340 * and Flow Control Consideration for USB to RS232".
341 * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should
342 * automagically re-encode the resulting value to take fractions into consideration.
343 * As all values are integers, some bit twiddling is in order:
344 * BaudDivisor = (BaseClock / 16 / BaudRate) |
345 * (((BaseClock / 2 / BaudRate) & 4) ? 0x4000 // 0.5
346 * : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000 // 0.25
347 * : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000 // 0.125
348 * : 0)
349 *
350 * For the FT232BM, a 17th divisor bit was introduced to encode the multiples
351 * of 0.125 missing from the FT8U232AM. Bits 16 to 14 are coded as follows
352 * (the first four codes are the same as for the FT8U232AM, where bit 16 is
353 * always 0):
354 * 000 - add .000 to divisor
355 * 001 - add .500 to divisor
356 * 010 - add .250 to divisor
357 * 011 - add .125 to divisor
358 * 100 - add .375 to divisor
359 * 101 - add .625 to divisor
360 * 110 - add .750 to divisor
361 * 111 - add .875 to divisor
362 * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is
363 * placed in bit 0 of the urb index.
364 *
365 * Note that there are a couple of special cases to support the highest baud
366 * rates. If the calculated divisor value is 1, this needs to be replaced with
367 * 0. Additionally for the FT232BM, if the calculated divisor value is 0x4001
368 * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is
369 * not supported by the FT8U232AM).
370 */
371
372typedef enum {
373 SIO = 1,
374 FT8U232AM = 2,
375 FT232BM = 3,
376 FT2232C = 4,
377} ftdi_chip_type_t;
378
379typedef enum {
380 ftdi_sio_b300 = 0,
381 ftdi_sio_b600 = 1,
382 ftdi_sio_b1200 = 2,
383 ftdi_sio_b2400 = 3,
384 ftdi_sio_b4800 = 4,
385 ftdi_sio_b9600 = 5,
386 ftdi_sio_b19200 = 6,
387 ftdi_sio_b38400 = 7,
388 ftdi_sio_b57600 = 8,
389 ftdi_sio_b115200 = 9
390} FTDI_SIO_baudrate_t ;
391
392/*
393 * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor values
394 * are calculated internally.
395 */
396
397#define FTDI_SIO_SET_DATA_REQUEST FTDI_SIO_SET_DATA
398#define FTDI_SIO_SET_DATA_REQUEST_TYPE 0x40
399#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
400#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
401#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
402#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
403#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
404#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11 )
405#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11 )
406#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11 )
407#define FTDI_SIO_SET_BREAK (0x1 << 14)
408/* FTDI_SIO_SET_DATA */
409
410/*
411 * BmRequestType: 0100 0000B
412 * bRequest: FTDI_SIO_SET_DATA
413 * wValue: Data characteristics (see below)
414 * wIndex: Port
415 * wLength: 0
416 * Data: No
417 *
418 * Data characteristics
419 *
420 * B0..7 Number of data bits
421 * B8..10 Parity
422 * 0 = None
423 * 1 = Odd
424 * 2 = Even
425 * 3 = Mark
426 * 4 = Space
427 * B11..13 Stop Bits
428 * 0 = 1
429 * 1 = 1.5
430 * 2 = 2
431 * B14
432 * 1 = TX ON (break)
433 * 0 = TX OFF (normal state)
434 * B15 Reserved
435 *
436 */
437
438
439
440/* FTDI_SIO_MODEM_CTRL */
441#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
442#define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL
443
444/*
445 * BmRequestType: 0100 0000B
446 * bRequest: FTDI_SIO_MODEM_CTRL
447 * wValue: ControlValue (see below)
448 * wIndex: Port
449 * wLength: 0
450 * Data: None
451 *
452 * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
453 * command will be IGNORED without an error being returned
454 * Also - you can not set DTR and RTS with one control message
455 */
456
457#define FTDI_SIO_SET_DTR_MASK 0x1
458#define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8))
459#define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8))
460#define FTDI_SIO_SET_RTS_MASK 0x2
461#define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
462#define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
463
464/*
465 * ControlValue
466 * B0 DTR state
467 * 0 = reset
468 * 1 = set
469 * B1 RTS state
470 * 0 = reset
471 * 1 = set
472 * B2..7 Reserved
473 * B8 DTR state enable
474 * 0 = ignore
475 * 1 = use DTR state
476 * B9 RTS state enable
477 * 0 = ignore
478 * 1 = use RTS state
479 * B10..15 Reserved
480 */
481
482/* FTDI_SIO_SET_FLOW_CTRL */
483#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
484#define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
485#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
486#define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
487#define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
488#define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
489/*
490 * BmRequestType: 0100 0000b
491 * bRequest: FTDI_SIO_SET_FLOW_CTRL
492 * wValue: Xoff/Xon
493 * wIndex: Protocol/Port - hIndex is protocl / lIndex is port
494 * wLength: 0
495 * Data: None
496 *
497 * hIndex protocol is:
498 * B0 Output handshaking using RTS/CTS
499 * 0 = disabled
500 * 1 = enabled
501 * B1 Output handshaking using DTR/DSR
502 * 0 = disabled
503 * 1 = enabled
504 * B2 Xon/Xoff handshaking
505 * 0 = disabled
506 * 1 = enabled
507 *
508 * A value of zero in the hIndex field disables handshaking
509 *
510 * If Xon/Xoff handshaking is specified, the hValue field should contain the XOFF character
511 * and the lValue field contains the XON character.
512 */
513
514/*
515 * FTDI_SIO_GET_LATENCY_TIMER
516 *
517 * Set the timeout interval. The FTDI collects data from the slave
518 * device, transmitting it to the host when either A) 62 bytes are
519 * received, or B) the timeout interval has elapsed and the buffer
520 * contains at least 1 byte. Setting this value to a small number
521 * can dramatically improve performance for applications which send
522 * small packets, since the default value is 16ms.
523 */
524#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
525#define FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0
526
527/*
528 * BmRequestType: 1100 0000b
529 * bRequest: FTDI_SIO_GET_LATENCY_TIMER
530 * wValue: 0
531 * wIndex: Port
532 * wLength: 0
533 * Data: latency (on return)
534 */
535
536/*
537 * FTDI_SIO_SET_LATENCY_TIMER
538 *
539 * Set the timeout interval. The FTDI collects data from the slave
540 * device, transmitting it to the host when either A) 62 bytes are
541 * received, or B) the timeout interval has elapsed and the buffer
542 * contains at least 1 byte. Setting this value to a small number
543 * can dramatically improve performance for applications which send
544 * small packets, since the default value is 16ms.
545 */
546#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
547#define FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40
548
549/*
550 * BmRequestType: 0100 0000b
551 * bRequest: FTDI_SIO_SET_LATENCY_TIMER
552 * wValue: Latency (milliseconds)
553 * wIndex: Port
554 * wLength: 0
555 * Data: None
556 *
557 * wValue:
558 * B0..7 Latency timer
559 * B8..15 0
560 *
561 */
562
563/*
564 * FTDI_SIO_SET_EVENT_CHAR
565 *
566 * Set the special event character for the specified communications port.
567 * If the device sees this character it will immediately return the
568 * data read so far - rather than wait 40ms or until 62 bytes are read
569 * which is what normally happens.
570 */
571
572
573#define FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR
574#define FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40
575
576
577/*
578 * BmRequestType: 0100 0000b
579 * bRequest: FTDI_SIO_SET_EVENT_CHAR
580 * wValue: EventChar
581 * wIndex: Port
582 * wLength: 0
583 * Data: None
584 *
585 * wValue:
586 * B0..7 Event Character
587 * B8 Event Character Processing
588 * 0 = disabled
589 * 1 = enabled
590 * B9..15 Reserved
591 *
592 */
593
594/* FTDI_SIO_SET_ERROR_CHAR */
595
596/* Set the parity error replacement character for the specified communications port */
597
598/*
599 * BmRequestType: 0100 0000b
600 * bRequest: FTDI_SIO_SET_EVENT_CHAR
601 * wValue: Error Char
602 * wIndex: Port
603 * wLength: 0
604 * Data: None
605 *
606 *Error Char
607 * B0..7 Error Character
608 * B8 Error Character Processing
609 * 0 = disabled
610 * 1 = enabled
611 * B9..15 Reserved
612 *
613 */
614
615/* FTDI_SIO_GET_MODEM_STATUS */
616/* Retreive the current value of the modem status register */
617
618#define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
619#define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
620#define FTDI_SIO_CTS_MASK 0x10
621#define FTDI_SIO_DSR_MASK 0x20
622#define FTDI_SIO_RI_MASK 0x40
623#define FTDI_SIO_RLSD_MASK 0x80
624/*
625 * BmRequestType: 1100 0000b
626 * bRequest: FTDI_SIO_GET_MODEM_STATUS
627 * wValue: zero
628 * wIndex: Port
629 * wLength: 1
630 * Data: Status
631 *
632 * One byte of data is returned
633 * B0..3 0
634 * B4 CTS
635 * 0 = inactive
636 * 1 = active
637 * B5 DSR
638 * 0 = inactive
639 * 1 = active
640 * B6 Ring Indicator (RI)
641 * 0 = inactive
642 * 1 = active
643 * B7 Receive Line Signal Detect (RLSD)
644 * 0 = inactive
645 * 1 = active
646 */
647
648
649
650/* Descriptors returned by the device
651 *
652 * Device Descriptor
653 *
654 * Offset Field Size Value Description
655 * 0 bLength 1 0x12 Size of descriptor in bytes
656 * 1 bDescriptorType 1 0x01 DEVICE Descriptor Type
657 * 2 bcdUSB 2 0x0110 USB Spec Release Number
658 * 4 bDeviceClass 1 0x00 Class Code
659 * 5 bDeviceSubClass 1 0x00 SubClass Code
660 * 6 bDeviceProtocol 1 0x00 Protocol Code
661 * 7 bMaxPacketSize0 1 0x08 Maximum packet size for endpoint 0
662 * 8 idVendor 2 0x0403 Vendor ID
663 * 10 idProduct 2 0x8372 Product ID (FTDI_SIO_PID)
664 * 12 bcdDevice 2 0x0001 Device release number
665 * 14 iManufacturer 1 0x01 Index of man. string desc
666 * 15 iProduct 1 0x02 Index of prod string desc
667 * 16 iSerialNumber 1 0x02 Index of serial nmr string desc
668 * 17 bNumConfigurations 1 0x01 Number of possible configurations
669 *
670 * Configuration Descriptor
671 *
672 * Offset Field Size Value
673 * 0 bLength 1 0x09 Size of descriptor in bytes
674 * 1 bDescriptorType 1 0x02 CONFIGURATION Descriptor Type
675 * 2 wTotalLength 2 0x0020 Total length of data
676 * 4 bNumInterfaces 1 0x01 Number of interfaces supported
677 * 5 bConfigurationValue 1 0x01 Argument for SetCOnfiguration() req
678 * 6 iConfiguration 1 0x02 Index of config string descriptor
679 * 7 bmAttributes 1 0x20 Config characteristics Remote Wakeup
680 * 8 MaxPower 1 0x1E Max power consumption
681 *
682 * Interface Descriptor
683 *
684 * Offset Field Size Value
685 * 0 bLength 1 0x09 Size of descriptor in bytes
686 * 1 bDescriptorType 1 0x04 INTERFACE Descriptor Type
687 * 2 bInterfaceNumber 1 0x00 Number of interface
688 * 3 bAlternateSetting 1 0x00 Value used to select alternate
689 * 4 bNumEndpoints 1 0x02 Number of endpoints
690 * 5 bInterfaceClass 1 0xFF Class Code
691 * 6 bInterfaceSubClass 1 0xFF Subclass Code
692 * 7 bInterfaceProtocol 1 0xFF Protocol Code
693 * 8 iInterface 1 0x02 Index of interface string description
694 *
695 * IN Endpoint Descriptor
696 *
697 * Offset Field Size Value
698 * 0 bLength 1 0x07 Size of descriptor in bytes
699 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
700 * 2 bEndpointAddress 1 0x82 Address of endpoint
701 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
702 * 4 bNumEndpoints 2 0x0040 maximum packet size
703 * 5 bInterval 1 0x00 Interval for polling endpoint
704 *
705 * OUT Endpoint Descriptor
706 *
707 * Offset Field Size Value
708 * 0 bLength 1 0x07 Size of descriptor in bytes
709 * 1 bDescriptorType 1 0x05 ENDPOINT descriptor type
710 * 2 bEndpointAddress 1 0x02 Address of endpoint
711 * 3 bmAttributes 1 0x02 Endpoint attributes - Bulk
712 * 4 bNumEndpoints 2 0x0040 maximum packet size
713 * 5 bInterval 1 0x00 Interval for polling endpoint
714 *
715 * DATA FORMAT
716 *
717 * IN Endpoint
718 *
719 * The device reserves the first two bytes of data on this endpoint to contain the current
720 * values of the modem and line status registers. In the absence of data, the device
721 * generates a message consisting of these two status bytes every 40 ms
722 *
723 * Byte 0: Modem Status
724 *
725 * Offset Description
726 * B0 Reserved - must be 1
727 * B1 Reserved - must be 0
728 * B2 Reserved - must be 0
729 * B3 Reserved - must be 0
730 * B4 Clear to Send (CTS)
731 * B5 Data Set Ready (DSR)
732 * B6 Ring Indicator (RI)
733 * B7 Receive Line Signal Detect (RLSD)
734 *
735 * Byte 1: Line Status
736 *
737 * Offset Description
738 * B0 Data Ready (DR)
739 * B1 Overrun Error (OE)
740 * B2 Parity Error (PE)
741 * B3 Framing Error (FE)
742 * B4 Break Interrupt (BI)
743 * B5 Transmitter Holding Register (THRE)
744 * B6 Transmitter Empty (TEMT)
745 * B7 Error in RCVR FIFO
746 *
747 */
748#define FTDI_RS0_CTS (1 << 4)
749#define FTDI_RS0_DSR (1 << 5)
750#define FTDI_RS0_RI (1 << 6)
751#define FTDI_RS0_RLSD (1 << 7)
752
753#define FTDI_RS_DR 1
754#define FTDI_RS_OE (1<<1)
755#define FTDI_RS_PE (1<<2)
756#define FTDI_RS_FE (1<<3)
757#define FTDI_RS_BI (1<<4)
758#define FTDI_RS_THRE (1<<5)
759#define FTDI_RS_TEMT (1<<6)
760#define FTDI_RS_FIFO (1<<7)
761
762/*
763 * OUT Endpoint
764 *
765 * This device reserves the first bytes of data on this endpoint contain the length
766 * and port identifier of the message. For the FTDI USB Serial converter the port
767 * identifier is always 1.
768 *
769 * Byte 0: Line Status
770 *
771 * Offset Description
772 * B0 Reserved - must be 1
773 * B1 Reserved - must be 0
774 * B2..7 Length of message - (not including Byte 0)
775 *
776 */
777
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
new file mode 100644
index 000000000000..2ef614d5c8f2
--- /dev/null
+++ b/drivers/usb/serial/garmin_gps.c
@@ -0,0 +1,1541 @@
1/*
2 * Garmin GPS driver
3 *
4 * Copyright (C) 2004 Hermann Kneissel herkne@users.sourceforge.net
5 *
6 * The latest version of the driver can be found at
7 * http://sourceforge.net/projects/garmin-gps/
8 *
9 * This driver has been derived from v2.1 of the visor driver.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
24 */
25
26#include <linux/config.h>
27#include <linux/kernel.h>
28#include <linux/errno.h>
29#include <linux/init.h>
30#include <linux/slab.h>
31#include <linux/timer.h>
32#include <linux/tty.h>
33#include <linux/tty_driver.h>
34#include <linux/tty_flip.h>
35#include <linux/module.h>
36#include <linux/spinlock.h>
37#include <asm/uaccess.h>
38#include <linux/usb.h>
39
40/* the mode to be set when the port ist opened */
41static int initial_mode = 1;
42
43/* debug flag */
44static int debug = 0;
45
46#include "usb-serial.h"
47
48#define GARMIN_VENDOR_ID 0x091E
49
50/*
51 * Version Information
52 */
53
54#define VERSION_MAJOR 0
55#define VERSION_MINOR 23
56
57#define _STR(s) #s
58#define _DRIVER_VERSION(a,b) "v" _STR(a) "." _STR(b)
59#define DRIVER_VERSION _DRIVER_VERSION(VERSION_MAJOR, VERSION_MINOR)
60#define DRIVER_AUTHOR "hermann kneissel"
61#define DRIVER_DESC "garmin gps driver"
62
63/* error codes returned by the driver */
64#define EINVPKT 1000 /* invalid packet structure */
65
66
67// size of the header of a packet using the usb protocol
68#define GARMIN_PKTHDR_LENGTH 12
69
70// max. possible size of a packet using the serial protocol
71#define MAX_SERIAL_PKT_SIZ (3+255+3)
72
73// max. possible size of a packet with worst case stuffing
74#define MAX_SERIAL_PKT_SIZ_STUFFED MAX_SERIAL_PKT_SIZ+256
75
76// size of a buffer able to hold a complete (no stuffing) packet
77// (the document protocol does not contain packets with a larger
78// size, but in theory a packet may be 64k+12 bytes - if in
79// later protocol versions larger packet sizes occur, this value
80// should be increased accordingly, so the input buffer is always
81// large enough the store a complete packet inclusive header)
82#define GPS_IN_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ)
83
84// size of a buffer able to hold a complete (incl. stuffing) packet
85#define GPS_OUT_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ_STUFFED)
86
87// where to place the packet id of a serial packet, so we can
88// prepend the usb-packet header without the need to move the
89// packets data
90#define GSP_INITIAL_OFFSET (GARMIN_PKTHDR_LENGTH-2)
91
92// max. size of incoming private packets (header+1 param)
93#define PRIVPKTSIZ (GARMIN_PKTHDR_LENGTH+4)
94
95#define GARMIN_LAYERID_TRANSPORT 0
96#define GARMIN_LAYERID_APPL 20
97// our own layer-id to use for some control mechanisms
98#define GARMIN_LAYERID_PRIVATE 0x01106E4B
99
100#define GARMIN_PKTID_PVT_DATA 51
101#define GARMIN_PKTID_L001_COMMAND_DATA 10
102
103#define CMND_ABORT_TRANSFER 0
104
105// packet ids used in private layer
106#define PRIV_PKTID_SET_DEBUG 1
107#define PRIV_PKTID_SET_MODE 2
108#define PRIV_PKTID_INFO_REQ 3
109#define PRIV_PKTID_INFO_RESP 4
110#define PRIV_PKTID_RESET_REQ 5
111#define PRIV_PKTID_SET_DEF_MODE 6
112
113
114#define ETX 0x03
115#define DLE 0x10
116#define ACK 0x06
117#define NAK 0x15
118
119/* structure used to queue incoming packets */
120struct garmin_packet {
121 struct list_head list;
122 int seq;
123 int size; // the real size of the data array, always > 0
124 __u8 data[1];
125};
126
127/* structure used to keep the current state of the driver */
128struct garmin_data {
129 __u8 state;
130 __u16 flags;
131 __u8 mode;
132 __u8 ignorePkts;
133 __u8 count;
134 __u8 pkt_id;
135 __u32 serial_num;
136 struct timer_list timer;
137 struct usb_serial_port *port;
138 int seq_counter;
139 int insize;
140 int outsize;
141 __u8 inbuffer [GPS_IN_BUFSIZ]; /* tty -> usb */
142 __u8 outbuffer[GPS_OUT_BUFSIZ]; /* usb -> tty */
143 __u8 privpkt[4*6];
144 spinlock_t lock;
145 struct list_head pktlist;
146};
147
148
149#define STATE_NEW 0
150#define STATE_INITIAL_DELAY 1
151#define STATE_TIMEOUT 2
152#define STATE_SESSION_REQ1 3
153#define STATE_SESSION_REQ2 4
154#define STATE_ACTIVE 5
155
156#define STATE_RESET 8
157#define STATE_DISCONNECTED 9
158#define STATE_WAIT_TTY_ACK 10
159#define STATE_GSP_WAIT_DATA 11
160
161#define MODE_NATIVE 0
162#define MODE_GARMIN_SERIAL 1
163
164// Flags used in garmin_data.flags:
165#define FLAGS_SESSION_REPLY_MASK 0x00C0
166#define FLAGS_SESSION_REPLY1_SEEN 0x0080
167#define FLAGS_SESSION_REPLY2_SEEN 0x0040
168#define FLAGS_BULK_IN_ACTIVE 0x0020
169#define FLAGS_THROTTLED 0x0010
170#define CLEAR_HALT_REQUIRED 0x0001
171
172#define FLAGS_QUEUING 0x0100
173#define FLAGS_APP_RESP_SEEN 0x0200
174#define FLAGS_APP_REQ_SEEN 0x0400
175#define FLAGS_DROP_DATA 0x0800
176
177#define FLAGS_GSP_SKIP 0x1000
178#define FLAGS_GSP_DLESEEN 0x2000
179
180
181
182
183
184
185/* function prototypes */
186static void gsp_next_packet(struct garmin_data * garmin_data_p);
187static int garmin_write_bulk(struct usb_serial_port *port,
188 const unsigned char *buf, int count);
189
190/* some special packets to be send or received */
191static unsigned char const GARMIN_START_SESSION_REQ[]
192 = { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 };
193static unsigned char const GARMIN_START_SESSION_REQ2[]
194 = { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
195static unsigned char const GARMIN_START_SESSION_REPLY[]
196 = { 0, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0 };
197static unsigned char const GARMIN_SESSION_ACTIVE_REPLY[]
198 = { 0, 0, 0, 0, 17, 0, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0 };
199static unsigned char const GARMIN_BULK_IN_AVAIL_REPLY[]
200 = { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
201static unsigned char const GARMIN_APP_LAYER_REPLY[]
202 = { 0x14, 0, 0, 0 };
203static unsigned char const GARMIN_START_PVT_REQ[]
204 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 49, 0 };
205static unsigned char const GARMIN_STOP_PVT_REQ[]
206 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 50, 0 };
207static unsigned char const GARMIN_STOP_TRANSFER_REQ[]
208 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, 0 };
209static unsigned char const GARMIN_STOP_TRANSFER_REQ_V2[]
210 = { 20, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0 };
211static unsigned char const PRIVATE_REQ[]
212 = { 0x4B, 0x6E, 0x10, 0x01, 0xFF, 0, 0, 0, 0xFF, 0, 0, 0 };
213
214
215
216static struct usb_device_id id_table [] = {
217 /* the same device id seems to be used by all usb enabled gps devices */
218 { USB_DEVICE(GARMIN_VENDOR_ID, 3 ) },
219 { } /* Terminating entry */
220};
221
222MODULE_DEVICE_TABLE (usb, id_table);
223
224static struct usb_driver garmin_driver = {
225 .owner = THIS_MODULE,
226 .name = "garmin_gps",
227 .probe = usb_serial_probe,
228 .disconnect = usb_serial_disconnect,
229 .id_table = id_table,
230};
231
232
233static inline int noResponseFromAppLayer(struct garmin_data * garmin_data_p)
234{
235 return ((garmin_data_p->flags
236 & (FLAGS_APP_REQ_SEEN|FLAGS_APP_RESP_SEEN))
237 == FLAGS_APP_REQ_SEEN);
238}
239
240
241static inline int getLayerId(const __u8 *usbPacket)
242{
243 return __le32_to_cpup((__le32 *)(usbPacket));
244}
245
246static inline int getPacketId(const __u8 *usbPacket)
247{
248 return __le32_to_cpup((__le32 *)(usbPacket+4));
249}
250
251static inline int getDataLength(const __u8 *usbPacket)
252{
253 return __le32_to_cpup((__le32 *)(usbPacket+8));
254}
255
256
257/*
258 * check if the usb-packet in buf contains an abort-transfer command.
259 * (if yes, all queued data will be dropped)
260 */
261static inline int isAbortTrfCmnd(const unsigned char *buf)
262{
263 if (0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ,
264 sizeof(GARMIN_STOP_TRANSFER_REQ)) ||
265 0 == memcmp(buf, GARMIN_STOP_TRANSFER_REQ_V2,
266 sizeof(GARMIN_STOP_TRANSFER_REQ_V2)))
267 return 1;
268 else
269 return 0;
270}
271
272
273
274static void send_to_tty(struct usb_serial_port *port,
275 char *data, unsigned int actual_length)
276{
277 struct tty_struct *tty = port->tty;
278 int i;
279
280 if (tty && actual_length) {
281
282 usb_serial_debug_data(debug, &port->dev,
283 __FUNCTION__, actual_length, data);
284
285 for (i = 0; i < actual_length ; ++i) {
286 /* if we insert more than TTY_FLIPBUF_SIZE characters,
287 we drop them. */
288 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
289 tty_flip_buffer_push(tty);
290 }
291 /* this doesn't actually push the data through unless
292 tty->low_latency is set */
293 tty_insert_flip_char(tty, data[i], 0);
294 }
295 tty_flip_buffer_push(tty);
296 }
297}
298
299
300/******************************************************************************
301 * packet queue handling
302 ******************************************************************************/
303
304/*
305 * queue a received (usb-)packet for later processing
306 */
307static int pkt_add(struct garmin_data * garmin_data_p,
308 unsigned char *data, unsigned int data_length)
309{
310 int result = 0;
311 unsigned long flags;
312 struct garmin_packet *pkt;
313
314 /* process only packets containg data ... */
315 if (data_length) {
316 garmin_data_p->flags |= FLAGS_QUEUING;
317 pkt = kmalloc(sizeof(struct garmin_packet)+data_length,
318 GFP_ATOMIC);
319 if (pkt == NULL) {
320 dev_err(&garmin_data_p->port->dev, "out of memory\n");
321 return 0;
322 }
323 pkt->size = data_length;
324 memcpy(pkt->data, data, data_length);
325
326 spin_lock_irqsave(&garmin_data_p->lock, flags);
327 result = list_empty(&garmin_data_p->pktlist);
328 pkt->seq = garmin_data_p->seq_counter++;
329 list_add_tail(&pkt->list, &garmin_data_p->pktlist);
330 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
331
332 /* in serial mode, if someone is waiting for data from
333 the device, iconvert and send the next packet to tty. */
334 if (result && (garmin_data_p->state == STATE_GSP_WAIT_DATA)) {
335 gsp_next_packet(garmin_data_p);
336 }
337 }
338 return result;
339}
340
341
342/* get the next pending packet */
343static struct garmin_packet *pkt_pop(struct garmin_data * garmin_data_p)
344{
345 unsigned long flags;
346 struct garmin_packet *result = NULL;
347
348 spin_lock_irqsave(&garmin_data_p->lock, flags);
349 if (!list_empty(&garmin_data_p->pktlist)) {
350 result = (struct garmin_packet *)garmin_data_p->pktlist.next;
351 list_del(&result->list);
352 }
353 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
354 return result;
355}
356
357
358/* free up all queued data */
359static void pkt_clear(struct garmin_data * garmin_data_p)
360{
361 unsigned long flags;
362 struct garmin_packet *result = NULL;
363
364 dbg("%s", __FUNCTION__);
365
366 spin_lock_irqsave(&garmin_data_p->lock, flags);
367 while (!list_empty(&garmin_data_p->pktlist)) {
368 result = (struct garmin_packet *)garmin_data_p->pktlist.next;
369 list_del(&result->list);
370 kfree(result);
371 }
372 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
373}
374
375
376/******************************************************************************
377 * garmin serial protocol handling handling
378 ******************************************************************************/
379
380/* send an ack packet back to the tty */
381static int gsp_send_ack(struct garmin_data * garmin_data_p, __u8 pkt_id)
382{
383 __u8 pkt[10];
384 __u8 cksum = 0;
385 __u8 *ptr = pkt;
386 unsigned l = 0;
387
388 dbg("%s - pkt-id: 0x%X.", __FUNCTION__, 0xFF & pkt_id);
389
390 *ptr++ = DLE;
391 *ptr++ = ACK;
392 cksum += ACK;
393
394 *ptr++ = 2;
395 cksum += 2;
396
397 *ptr++ = pkt_id;
398 cksum += pkt_id;
399
400 if (pkt_id == DLE) {
401 *ptr++ = DLE;
402 }
403
404 *ptr++ = 0;
405 *ptr++ = 0xFF & (-cksum);
406 *ptr++ = DLE;
407 *ptr++ = ETX;
408
409 l = ptr-pkt;
410
411 send_to_tty(garmin_data_p->port, pkt, l);
412 return 0;
413}
414
415
416
417/*
418 * called for a complete packet received from tty layer
419 *
420 * the complete packet (pkzid ... cksum) is in garmin_data_p->inbuf starting
421 * at GSP_INITIAL_OFFSET.
422 *
423 * count - number of bytes in the input buffer including space reserved for
424 * the usb header: GSP_INITIAL_OFFSET + number of bytes in packet
425 * (including pkt-id, data-length a. cksum)
426 */
427static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count)
428{
429 const __u8* recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET;
430 __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer;
431
432 int cksum = 0;
433 int n = 0;
434 int pktid = recpkt[0];
435 int size = recpkt[1];
436
437 usb_serial_debug_data(debug, &garmin_data_p->port->dev,
438 __FUNCTION__, count-GSP_INITIAL_OFFSET, recpkt);
439
440 if (size != (count-GSP_INITIAL_OFFSET-3)) {
441 dbg("%s - invalid size, expected %d bytes, got %d",
442 __FUNCTION__, size, (count-GSP_INITIAL_OFFSET-3));
443 return -EINVPKT;
444 }
445
446 cksum += *recpkt++;
447 cksum += *recpkt++;
448
449 // sanity check, remove after test ...
450 if ((__u8*)&(usbdata[3]) != recpkt) {
451 dbg("%s - ptr mismatch %p - %p",
452 __FUNCTION__, &(usbdata[4]), recpkt);
453 return -EINVPKT;
454 }
455
456 while (n < size) {
457 cksum += *recpkt++;
458 n++;
459 }
460
461 if ((0xff & (cksum + *recpkt)) != 0) {
462 dbg("%s - invalid checksum, expected %02x, got %02x",
463 __FUNCTION__, 0xff & -cksum, 0xff & *recpkt);
464 return -EINVPKT;
465 }
466
467 usbdata[0] = __cpu_to_le32(GARMIN_LAYERID_APPL);
468 usbdata[1] = __cpu_to_le32(pktid);
469 usbdata[2] = __cpu_to_le32(size);
470
471 garmin_write_bulk (garmin_data_p->port, garmin_data_p->inbuffer,
472 GARMIN_PKTHDR_LENGTH+size);
473
474 /* if this was an abort-transfer command, flush all
475 queued data. */
476 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) {
477 garmin_data_p->flags |= FLAGS_DROP_DATA;
478 pkt_clear(garmin_data_p);
479 }
480
481 return count;
482}
483
484
485
486/*
487 * Called for data received from tty
488 *
489 * buf contains the data read, it may span more than one packet or even
490 * incomplete packets
491 *
492 * input record should be a serial-record, but it may not be complete.
493 * Copy it into our local buffer, until an etx is seen (or an error
494 * occurs).
495 * Once the record is complete, convert into a usb packet and send it
496 * to the bulk pipe, send an ack back to the tty.
497 *
498 * If the input is an ack, just send the last queued packet to the
499 * tty layer.
500 *
501 * if the input is an abort command, drop all queued data.
502 */
503
504static int gsp_receive(struct garmin_data * garmin_data_p,
505 const unsigned char *buf, int count)
506{
507 int offs = 0;
508 int ack_or_nak_seen = 0;
509 int i = 0;
510 __u8 *dest = garmin_data_p->inbuffer;
511 int size = garmin_data_p->insize;
512 // dleSeen: set if last byte read was a DLE
513 int dleSeen = garmin_data_p->flags & FLAGS_GSP_DLESEEN;
514 // skip: if set, skip incoming data until possible start of
515 // new packet
516 int skip = garmin_data_p->flags & FLAGS_GSP_SKIP;
517 __u8 data;
518
519 dbg("%s - dle=%d skip=%d size=%d count=%d",
520 __FUNCTION__, dleSeen, skip, size, count);
521
522 if (size == 0) {
523 size = GSP_INITIAL_OFFSET;
524 }
525
526 while (offs < count) {
527
528 data = *(buf+offs);
529 offs ++;
530
531 if (data == DLE) {
532 if (skip) { /* start of a new pkt */
533 skip = 0;
534 size = GSP_INITIAL_OFFSET;
535 dleSeen = 1;
536 } else if (dleSeen) {
537 dest[size++] = data;
538 dleSeen = 0;
539 } else {
540 dleSeen = 1;
541 }
542 } else if (data == ETX) {
543 if (dleSeen) {
544 /* packet complete */
545
546 data = dest[GSP_INITIAL_OFFSET];
547
548 if (data == ACK) {
549 ack_or_nak_seen = ACK;
550 dbg("ACK packet complete.");
551 } else if (data == NAK) {
552 ack_or_nak_seen = NAK;
553 dbg("NAK packet complete.");
554 } else {
555 dbg("packet complete "
556 "- id=0x%X.",
557 0xFF & data);
558 gsp_rec_packet(garmin_data_p, size);
559 }
560
561 skip = 1;
562 size = GSP_INITIAL_OFFSET;
563 dleSeen = 0;
564 } else {
565 dest[size++] = data;
566 }
567 } else if (!skip) {
568
569 if (dleSeen) {
570 dbg("non-masked DLE at %d - restarting", i);
571 size = GSP_INITIAL_OFFSET;
572 dleSeen = 0;
573 }
574
575 dest[size++] = data;
576 }
577
578 if (size >= GPS_IN_BUFSIZ) {
579 dbg("%s - packet too large.", __FUNCTION__);
580 skip = 1;
581 size = GSP_INITIAL_OFFSET;
582 dleSeen = 0;
583 }
584 }
585
586 garmin_data_p->insize = size;
587
588 // copy flags back to structure
589 if (skip)
590 garmin_data_p->flags |= FLAGS_GSP_SKIP;
591 else
592 garmin_data_p->flags &= ~FLAGS_GSP_SKIP;
593
594 if (dleSeen)
595 garmin_data_p->flags |= FLAGS_GSP_DLESEEN;
596 else
597 garmin_data_p->flags &= ~FLAGS_GSP_DLESEEN;
598
599 if (ack_or_nak_seen) {
600 garmin_data_p->state = STATE_GSP_WAIT_DATA;
601 gsp_next_packet(garmin_data_p);
602 }
603
604 return count;
605}
606
607
608
609
610/*
611 * Sends a usb packet to the tty
612 *
613 * Assumes, that all packages and at an usb-packet boundary.
614 *
615 * return <0 on error, 0 if packet is incomplete or > 0 if packet was sent
616 */
617static int gsp_send(struct garmin_data * garmin_data_p,
618 const unsigned char *buf, int count)
619{
620 const unsigned char *src;
621 unsigned char *dst;
622 int pktid = 0;
623 int datalen = 0;
624 int cksum = 0;
625 int i=0;
626 int k;
627
628 dbg("%s - state %d - %d bytes.", __FUNCTION__,
629 garmin_data_p->state, count);
630
631 k = garmin_data_p->outsize;
632 if ((k+count) > GPS_OUT_BUFSIZ) {
633 dbg("packet too large");
634 garmin_data_p->outsize = 0;
635 return -4;
636 }
637
638 memcpy(garmin_data_p->outbuffer+k, buf, count);
639 k += count;
640 garmin_data_p->outsize = k;
641
642 if (k >= GARMIN_PKTHDR_LENGTH) {
643 pktid = getPacketId(garmin_data_p->outbuffer);
644 datalen= getDataLength(garmin_data_p->outbuffer);
645 i = GARMIN_PKTHDR_LENGTH + datalen;
646 if (k < i)
647 return 0;
648 } else {
649 return 0;
650 }
651
652 dbg("%s - %d bytes in buffer, %d bytes in pkt.", __FUNCTION__,
653 k, i);
654
655 /* garmin_data_p->outbuffer now contains a complete packet */
656
657 usb_serial_debug_data(debug, &garmin_data_p->port->dev,
658 __FUNCTION__, k, garmin_data_p->outbuffer);
659
660 garmin_data_p->outsize = 0;
661
662 if (GARMIN_LAYERID_APPL != getLayerId(garmin_data_p->outbuffer)) {
663 dbg("not an application packet (%d)",
664 getLayerId(garmin_data_p->outbuffer));
665 return -1;
666 }
667
668 if (pktid > 255) {
669 dbg("packet-id %d too large", pktid);
670 return -2;
671 }
672
673 if (datalen > 255) {
674 dbg("packet-size %d too large", datalen);
675 return -3;
676 }
677
678 /* the serial protocol should be able to handle this packet */
679
680 k = 0;
681 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
682 for (i=0; i<datalen; i++) {
683 if (*src++ == DLE)
684 k++;
685 }
686
687 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
688 if (k > (GARMIN_PKTHDR_LENGTH-2)) {
689 /* can't add stuffing DLEs in place, move data to end
690 of buffer ... */
691 dst = garmin_data_p->outbuffer+GPS_OUT_BUFSIZ-datalen;
692 memcpy(dst, src, datalen);
693 src = dst;
694 }
695
696 dst = garmin_data_p->outbuffer;
697
698 *dst++ = DLE;
699 *dst++ = pktid;
700 cksum += pktid;
701 *dst++ = datalen;
702 cksum += datalen;
703 if (datalen == DLE)
704 *dst++ = DLE;
705
706 for (i=0; i<datalen; i++) {
707 __u8 c = *src++;
708 *dst++ = c;
709 cksum += c;
710 if (c == DLE)
711 *dst++ = DLE;
712 }
713
714 cksum = 0xFF & -cksum;
715 *dst++ = cksum;
716 if (cksum == DLE)
717 *dst++ = DLE;
718 *dst++ = DLE;
719 *dst++ = ETX;
720
721 i = dst-garmin_data_p->outbuffer;
722
723 send_to_tty(garmin_data_p->port, garmin_data_p->outbuffer, i);
724
725 garmin_data_p->pkt_id = pktid;
726 garmin_data_p->state = STATE_WAIT_TTY_ACK;
727
728 return i;
729}
730
731
732
733
734
735/*
736 * Process the next pending data packet - if there is one
737 */
738static void gsp_next_packet(struct garmin_data * garmin_data_p)
739{
740 struct garmin_packet *pkt = NULL;
741
742 while ((pkt = pkt_pop(garmin_data_p)) != NULL) {
743 dbg("%s - next pkt: %d", __FUNCTION__, pkt->seq);
744 if (gsp_send(garmin_data_p, pkt->data, pkt->size) > 0) {
745 kfree(pkt);
746 return;
747 }
748 kfree(pkt);
749 }
750}
751
752
753
754
755/******************************************************************************
756 * garmin native mode
757 ******************************************************************************/
758
759
760/*
761 * Called for data received from tty
762 *
763 * The input data is expected to be in garmin usb-packet format.
764 *
765 * buf contains the data read, it may span more than one packet
766 * or even incomplete packets
767 */
768static int nat_receive(struct garmin_data * garmin_data_p,
769 const unsigned char *buf, int count)
770{
771 __u8 * dest;
772 int offs = 0;
773 int result = count;
774 int len;
775
776 while (offs < count) {
777 // if buffer contains header, copy rest of data
778 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH)
779 len = GARMIN_PKTHDR_LENGTH
780 +getDataLength(garmin_data_p->inbuffer);
781 else
782 len = GARMIN_PKTHDR_LENGTH;
783
784 if (len >= GPS_IN_BUFSIZ) {
785 /* seem to be an invalid packet, ignore rest of input */
786 dbg("%s - packet size too large: %d",
787 __FUNCTION__, len);
788 garmin_data_p->insize = 0;
789 count = 0;
790 result = -EINVPKT;
791 } else {
792 len -= garmin_data_p->insize;
793 if (len > (count-offs))
794 len = (count-offs);
795 if (len > 0) {
796 dest = garmin_data_p->inbuffer
797 +garmin_data_p->insize;
798 memcpy(dest, buf+offs, len);
799 garmin_data_p->insize += len;
800 offs += len;
801 }
802 }
803
804 /* do we have a complete packet ? */
805 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH) {
806 len = GARMIN_PKTHDR_LENGTH+
807 getDataLength(garmin_data_p->inbuffer);
808 if (garmin_data_p->insize >= len) {
809 garmin_write_bulk (garmin_data_p->port,
810 garmin_data_p->inbuffer,
811 len);
812 garmin_data_p->insize = 0;
813
814 /* if this was an abort-transfer command,
815 flush all queued data. */
816 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) {
817 garmin_data_p->flags |= FLAGS_DROP_DATA;
818 pkt_clear(garmin_data_p);
819 }
820 }
821 }
822 }
823 return result;
824}
825
826
827/******************************************************************************
828 * private packets
829 ******************************************************************************/
830
831static void priv_status_resp(struct usb_serial_port *port)
832{
833 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
834 __le32 *pkt = (__le32 *)garmin_data_p->privpkt;
835
836 pkt[0] = __cpu_to_le32(GARMIN_LAYERID_PRIVATE);
837 pkt[1] = __cpu_to_le32(PRIV_PKTID_INFO_RESP);
838 pkt[2] = __cpu_to_le32(12);
839 pkt[3] = __cpu_to_le32(VERSION_MAJOR << 16 | VERSION_MINOR);
840 pkt[4] = __cpu_to_le32(garmin_data_p->mode);
841 pkt[5] = __cpu_to_le32(garmin_data_p->serial_num);
842
843 send_to_tty(port, (__u8*)pkt, 6*4);
844}
845
846
847/******************************************************************************
848 * Garmin specific driver functions
849 ******************************************************************************/
850
851static int process_resetdev_request(struct usb_serial_port *port)
852{
853 int status;
854 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
855
856 garmin_data_p->flags &= ~(CLEAR_HALT_REQUIRED);
857 garmin_data_p->state = STATE_RESET;
858 garmin_data_p->serial_num = 0;
859
860 usb_kill_urb (port->interrupt_in_urb);
861 dbg("%s - usb_reset_device", __FUNCTION__ );
862 status = usb_reset_device(port->serial->dev);
863 if (status)
864 dbg("%s - usb_reset_device failed: %d",
865 __FUNCTION__, status);
866 return status;
867}
868
869
870
871/*
872 * clear all cached data
873 */
874static int garmin_clear(struct garmin_data * garmin_data_p)
875{
876 int status = 0;
877
878 struct usb_serial_port *port = garmin_data_p->port;
879
880 if (port != NULL && garmin_data_p->flags & FLAGS_APP_RESP_SEEN) {
881 /* send a terminate command */
882 status = garmin_write_bulk(port, GARMIN_STOP_TRANSFER_REQ,
883 sizeof(GARMIN_STOP_TRANSFER_REQ));
884 }
885
886 /* flush all queued data */
887 pkt_clear(garmin_data_p);
888
889 garmin_data_p->insize = 0;
890 garmin_data_p->outsize = 0;
891
892 return status;
893}
894
895
896
897
898
899
900static int garmin_init_session(struct usb_serial_port *port)
901{
902 struct usb_serial *serial = port->serial;
903 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
904 int status = 0;
905
906 if (status == 0) {
907 usb_kill_urb (port->interrupt_in_urb);
908
909 dbg("%s - adding interrupt input", __FUNCTION__);
910 port->interrupt_in_urb->dev = serial->dev;
911 status = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
912 if (status)
913 dev_err(&serial->dev->dev,
914 "%s - failed submitting interrupt urb,"
915 " error %d\n",
916 __FUNCTION__, status);
917 }
918
919 if (status == 0) {
920 dbg("%s - starting session ...", __FUNCTION__);
921 garmin_data_p->state = STATE_ACTIVE;
922 status = garmin_write_bulk(port, GARMIN_START_SESSION_REQ,
923 sizeof(GARMIN_START_SESSION_REQ));
924
925 if (status >= 0) {
926
927 garmin_data_p->ignorePkts++;
928
929 /* not needed, but the win32 driver does it too ... */
930 status = garmin_write_bulk(port,
931 GARMIN_START_SESSION_REQ2,
932 sizeof(GARMIN_START_SESSION_REQ2));
933 if (status >= 0) {
934 status = 0;
935 garmin_data_p->ignorePkts++;
936 }
937 }
938 }
939
940 return status;
941}
942
943
944
945
946
947static int garmin_open (struct usb_serial_port *port, struct file *filp)
948{
949 int status = 0;
950 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
951
952 dbg("%s - port %d", __FUNCTION__, port->number);
953
954 /*
955 * Force low_latency on so that our tty_push actually forces the data
956 * through, otherwise it is scheduled, and with high data rates (like
957 * with OHCI) data can get lost.
958 */
959 if (port->tty)
960 port->tty->low_latency = 1;
961
962 garmin_data_p->mode = initial_mode;
963 garmin_data_p->count = 0;
964 garmin_data_p->flags = 0;
965
966 /* shutdown any bulk reads that might be going on */
967 usb_kill_urb (port->write_urb);
968 usb_kill_urb (port->read_urb);
969
970 if (garmin_data_p->state == STATE_RESET) {
971 status = garmin_init_session(port);
972 }
973
974 garmin_data_p->state = STATE_ACTIVE;
975
976 return status;
977}
978
979
980static void garmin_close (struct usb_serial_port *port, struct file * filp)
981{
982 struct usb_serial *serial = port->serial;
983 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
984
985 dbg("%s - port %d - mode=%d state=%d flags=0x%X", __FUNCTION__,
986 port->number, garmin_data_p->mode,
987 garmin_data_p->state, garmin_data_p->flags);
988
989 if (!serial)
990 return;
991
992 garmin_clear(garmin_data_p);
993
994 /* shutdown our urbs */
995 usb_kill_urb (port->read_urb);
996 usb_kill_urb (port->write_urb);
997
998 if (noResponseFromAppLayer(garmin_data_p) ||
999 ((garmin_data_p->flags & CLEAR_HALT_REQUIRED) != 0)) {
1000 process_resetdev_request(port);
1001 garmin_data_p->state = STATE_RESET;
1002 } else {
1003 garmin_data_p->state = STATE_DISCONNECTED;
1004 }
1005}
1006
1007
1008static void garmin_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
1009{
1010 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1011 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1012
1013 /* free up the transfer buffer, as usb_free_urb() does not do this */
1014 kfree (urb->transfer_buffer);
1015
1016 dbg("%s - port %d", __FUNCTION__, port->number);
1017
1018 if (urb->status) {
1019 dbg("%s - nonzero write bulk status received: %d",
1020 __FUNCTION__, urb->status);
1021 garmin_data_p->flags |= CLEAR_HALT_REQUIRED;
1022 }
1023
1024 schedule_work(&port->work);
1025}
1026
1027
1028static int garmin_write_bulk (struct usb_serial_port *port,
1029 const unsigned char *buf, int count)
1030{
1031 struct usb_serial *serial = port->serial;
1032 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1033 struct urb *urb;
1034 unsigned char *buffer;
1035 int status;
1036
1037 dbg("%s - port %d, state %d", __FUNCTION__, port->number,
1038 garmin_data_p->state);
1039
1040 garmin_data_p->flags &= ~FLAGS_DROP_DATA;
1041
1042 buffer = kmalloc (count, GFP_ATOMIC);
1043 if (!buffer) {
1044 dev_err(&port->dev, "out of memory\n");
1045 return -ENOMEM;
1046 }
1047
1048 urb = usb_alloc_urb(0, GFP_ATOMIC);
1049 if (!urb) {
1050 dev_err(&port->dev, "no more free urbs\n");
1051 kfree (buffer);
1052 return -ENOMEM;
1053 }
1054
1055 memcpy (buffer, buf, count);
1056
1057 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, buffer);
1058
1059 usb_fill_bulk_urb (urb, serial->dev,
1060 usb_sndbulkpipe (serial->dev,
1061 port->bulk_out_endpointAddress),
1062 buffer, count,
1063 garmin_write_bulk_callback, port);
1064 urb->transfer_flags |= URB_ZERO_PACKET;
1065
1066 if (GARMIN_LAYERID_APPL == getLayerId(buffer)) {
1067 garmin_data_p->flags |= FLAGS_APP_REQ_SEEN;
1068 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1069 pkt_clear(garmin_data_p);
1070 garmin_data_p->state = STATE_GSP_WAIT_DATA;
1071 }
1072 }
1073
1074 /* send it down the pipe */
1075 status = usb_submit_urb(urb, GFP_ATOMIC);
1076 if (status) {
1077 dev_err(&port->dev,
1078 "%s - usb_submit_urb(write bulk) "
1079 "failed with status = %d\n",
1080 __FUNCTION__, status);
1081 count = status;
1082 } else {
1083
1084 if (GARMIN_LAYERID_APPL == getLayerId(buffer)
1085 && (garmin_data_p->mode == MODE_GARMIN_SERIAL)) {
1086
1087 gsp_send_ack(garmin_data_p, buffer[4]);
1088 }
1089 }
1090
1091 /* we are done with this urb, so let the host driver
1092 * really free it when it is finished with it */
1093 usb_free_urb (urb);
1094
1095 return count;
1096}
1097
1098
1099
1100static int garmin_write (struct usb_serial_port *port,
1101 const unsigned char *buf, int count)
1102{
1103 int pktid, pktsiz, len;
1104 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1105 __le32 *privpkt = (__le32 *)garmin_data_p->privpkt;
1106
1107 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, buf);
1108
1109 /* check for our private packets */
1110 if (count >= GARMIN_PKTHDR_LENGTH) {
1111
1112 len = PRIVPKTSIZ;
1113 if (count < len)
1114 len = count;
1115
1116 memcpy(garmin_data_p->privpkt, buf, len);
1117
1118 pktsiz = getDataLength(garmin_data_p->privpkt);
1119 pktid = getPacketId(garmin_data_p->privpkt);
1120
1121 if (count == (GARMIN_PKTHDR_LENGTH+pktsiz)
1122 && GARMIN_LAYERID_PRIVATE == getLayerId(garmin_data_p->privpkt)) {
1123
1124 dbg("%s - processing private request %d",
1125 __FUNCTION__, pktid);
1126
1127 // drop all unfinished transfers
1128 garmin_clear(garmin_data_p);
1129
1130 switch(pktid) {
1131
1132 case PRIV_PKTID_SET_DEBUG:
1133 if (pktsiz != 4)
1134 return -EINVPKT;
1135 debug = __le32_to_cpu(privpkt[3]);
1136 dbg("%s - debug level set to 0x%X",
1137 __FUNCTION__, debug);
1138 break;
1139
1140 case PRIV_PKTID_SET_MODE:
1141 if (pktsiz != 4)
1142 return -EINVPKT;
1143 garmin_data_p->mode = __le32_to_cpu(privpkt[3]);
1144 dbg("%s - mode set to %d",
1145 __FUNCTION__, garmin_data_p->mode);
1146 break;
1147
1148 case PRIV_PKTID_INFO_REQ:
1149 priv_status_resp(port);
1150 break;
1151
1152 case PRIV_PKTID_RESET_REQ:
1153 garmin_data_p->flags |= FLAGS_APP_REQ_SEEN;
1154 break;
1155
1156 case PRIV_PKTID_SET_DEF_MODE:
1157 if (pktsiz != 4)
1158 return -EINVPKT;
1159 initial_mode = __le32_to_cpu(privpkt[3]);
1160 dbg("%s - initial_mode set to %d",
1161 __FUNCTION__,
1162 garmin_data_p->mode);
1163 break;
1164 }
1165 return count;
1166 }
1167 }
1168
1169 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1170 return gsp_receive(garmin_data_p, buf, count);
1171 } else { /* MODE_NATIVE */
1172 return nat_receive(garmin_data_p, buf, count);
1173 }
1174}
1175
1176
1177static int garmin_write_room (struct usb_serial_port *port)
1178{
1179 /*
1180 * Report back the bytes currently available in the output buffer.
1181 */
1182 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1183 return GPS_OUT_BUFSIZ-garmin_data_p->outsize;
1184}
1185
1186
1187static int garmin_chars_in_buffer (struct usb_serial_port *port)
1188{
1189 /*
1190 * Report back the number of bytes currently in our input buffer.
1191 * Will this lock up the driver - the buffer contains an incomplete
1192 * package which will not be written to the device until it
1193 * has been completed ?
1194 */
1195 //struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1196 //return garmin_data_p->insize;
1197 return 0;
1198}
1199
1200
1201static void garmin_read_process(struct garmin_data * garmin_data_p,
1202 unsigned char *data, unsigned data_length)
1203{
1204 if (garmin_data_p->flags & FLAGS_DROP_DATA) {
1205 /* abort-transfer cmd is actice */
1206 dbg("%s - pkt dropped", __FUNCTION__);
1207 } else if (garmin_data_p->state != STATE_DISCONNECTED &&
1208 garmin_data_p->state != STATE_RESET ) {
1209
1210 /* remember any appl.layer packets, so we know
1211 if a reset is required or not when closing
1212 the device */
1213 if (0 == memcmp(data, GARMIN_APP_LAYER_REPLY,
1214 sizeof(GARMIN_APP_LAYER_REPLY)))
1215 garmin_data_p->flags |= FLAGS_APP_RESP_SEEN;
1216
1217 /* if throttling is active or postprecessing is required
1218 put the received data in th input queue, otherwise
1219 send it directly to the tty port */
1220 if (garmin_data_p->flags & FLAGS_QUEUING) {
1221 pkt_add(garmin_data_p, data, data_length);
1222 } else if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1223 if (getLayerId(data) == GARMIN_LAYERID_APPL) {
1224 pkt_add(garmin_data_p, data, data_length);
1225 }
1226 } else {
1227 send_to_tty(garmin_data_p->port, data, data_length);
1228 }
1229 }
1230}
1231
1232
1233static void garmin_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
1234{
1235 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1236 struct usb_serial *serial = port->serial;
1237 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1238 unsigned char *data = urb->transfer_buffer;
1239 int status;
1240
1241 dbg("%s - port %d", __FUNCTION__, port->number);
1242
1243 if (!serial) {
1244 dbg("%s - bad serial pointer, exiting", __FUNCTION__);
1245 return;
1246 }
1247
1248 if (urb->status) {
1249 dbg("%s - nonzero read bulk status received: %d",
1250 __FUNCTION__, urb->status);
1251 return;
1252 }
1253
1254 usb_serial_debug_data(debug, &port->dev,
1255 __FUNCTION__, urb->actual_length, data);
1256
1257 garmin_read_process(garmin_data_p, data, urb->actual_length);
1258
1259 /* Continue trying to read until nothing more is received */
1260 if (urb->actual_length > 0) {
1261 usb_fill_bulk_urb (port->read_urb, serial->dev,
1262 usb_rcvbulkpipe (serial->dev,
1263 port->bulk_in_endpointAddress),
1264 port->read_urb->transfer_buffer,
1265 port->read_urb->transfer_buffer_length,
1266 garmin_read_bulk_callback, port);
1267 status = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1268 if (status)
1269 dev_err(&port->dev,
1270 "%s - failed resubmitting read urb, error %d\n",
1271 __FUNCTION__, status);
1272 }
1273 return;
1274}
1275
1276
1277static void garmin_read_int_callback (struct urb *urb, struct pt_regs *regs)
1278{
1279 int status;
1280 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1281 struct usb_serial *serial = port->serial;
1282 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1283 unsigned char *data = urb->transfer_buffer;
1284
1285 switch (urb->status) {
1286 case 0:
1287 /* success */
1288 break;
1289 case -ECONNRESET:
1290 case -ENOENT:
1291 case -ESHUTDOWN:
1292 /* this urb is terminated, clean up */
1293 dbg("%s - urb shutting down with status: %d",
1294 __FUNCTION__, urb->status);
1295 return;
1296 default:
1297 dbg("%s - nonzero urb status received: %d",
1298 __FUNCTION__, urb->status);
1299 return;
1300 }
1301
1302 usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
1303 urb->actual_length, urb->transfer_buffer);
1304
1305 if (urb->actual_length == sizeof(GARMIN_BULK_IN_AVAIL_REPLY) &&
1306 0 == memcmp(data, GARMIN_BULK_IN_AVAIL_REPLY,
1307 sizeof(GARMIN_BULK_IN_AVAIL_REPLY))) {
1308
1309 dbg("%s - bulk data available.", __FUNCTION__);
1310
1311 /* bulk data available */
1312 usb_fill_bulk_urb (port->read_urb, serial->dev,
1313 usb_rcvbulkpipe (serial->dev,
1314 port->bulk_in_endpointAddress),
1315 port->read_urb->transfer_buffer,
1316 port->read_urb->transfer_buffer_length,
1317 garmin_read_bulk_callback, port);
1318 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1319 if (status) {
1320 dev_err(&port->dev,
1321 "%s - failed submitting read urb, error %d\n",
1322 __FUNCTION__, status);
1323 }
1324
1325 } else if (urb->actual_length == (4+sizeof(GARMIN_START_SESSION_REPLY))
1326 && 0 == memcmp(data, GARMIN_START_SESSION_REPLY,
1327 sizeof(GARMIN_START_SESSION_REPLY))) {
1328
1329 garmin_data_p->flags |= FLAGS_SESSION_REPLY1_SEEN;
1330
1331 /* save the serial number */
1332 garmin_data_p->serial_num
1333 = __le32_to_cpup((__le32*)(data+GARMIN_PKTHDR_LENGTH));
1334
1335 dbg("%s - start-of-session reply seen - serial %u.",
1336 __FUNCTION__, garmin_data_p->serial_num);
1337 }
1338
1339 if (garmin_data_p->ignorePkts) {
1340 /* this reply belongs to a request generated by the driver,
1341 ignore it. */
1342 dbg("%s - pkt ignored (%d)",
1343 __FUNCTION__, garmin_data_p->ignorePkts);
1344 garmin_data_p->ignorePkts--;
1345 } else {
1346 garmin_read_process(garmin_data_p, data, urb->actual_length);
1347 }
1348
1349 port->interrupt_in_urb->dev = port->serial->dev;
1350 status = usb_submit_urb (urb, GFP_ATOMIC);
1351 if (status)
1352 dev_err(&urb->dev->dev,
1353 "%s - Error %d submitting interrupt urb\n",
1354 __FUNCTION__, status);
1355}
1356
1357
1358/*
1359 * Sends the next queued packt to the tty port (garmin native mode only)
1360 * and then sets a timer to call itself again until all queued data
1361 * is sent.
1362 */
1363static int garmin_flush_queue(struct garmin_data * garmin_data_p)
1364{
1365 struct garmin_packet *pkt;
1366
1367 if ((garmin_data_p->flags & FLAGS_THROTTLED) == 0) {
1368 pkt = pkt_pop(garmin_data_p);
1369 if (pkt != NULL) {
1370
1371 send_to_tty(garmin_data_p->port, pkt->data, pkt->size);
1372 kfree(pkt);
1373 mod_timer(&garmin_data_p->timer, (1)+jiffies);
1374
1375 } else {
1376 garmin_data_p->flags &= ~FLAGS_QUEUING;
1377 }
1378 }
1379 return 0;
1380}
1381
1382
1383static void garmin_throttle (struct usb_serial_port *port)
1384{
1385 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1386
1387 dbg("%s - port %d", __FUNCTION__, port->number);
1388 /* set flag, data received will be put into a queue
1389 for later processing */
1390 garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED;
1391}
1392
1393
1394static void garmin_unthrottle (struct usb_serial_port *port)
1395{
1396 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1397
1398 dbg("%s - port %d", __FUNCTION__, port->number);
1399 garmin_data_p->flags &= ~FLAGS_THROTTLED;
1400
1401 /* in native mode send queued data to tty, in
1402 serial mode nothing needs to be done here */
1403 if (garmin_data_p->mode == MODE_NATIVE)
1404 garmin_flush_queue(garmin_data_p);
1405}
1406
1407
1408
1409/*
1410 * The timer is currently only used to send queued packets to
1411 * the tty in cases where the protocol provides no own handshaking
1412 * to initiate the transfer.
1413 */
1414static void timeout_handler(unsigned long data)
1415{
1416 struct garmin_data *garmin_data_p = (struct garmin_data *) data;
1417
1418 /* send the next queued packet to the tty port */
1419 if (garmin_data_p->mode == MODE_NATIVE)
1420 if (garmin_data_p->flags & FLAGS_QUEUING)
1421 garmin_flush_queue(garmin_data_p);
1422}
1423
1424
1425
1426static int garmin_attach (struct usb_serial *serial)
1427{
1428 int status = 0;
1429 struct usb_serial_port *port = serial->port[0];
1430 struct garmin_data * garmin_data_p = NULL;
1431
1432 dbg("%s", __FUNCTION__);
1433
1434 garmin_data_p = kmalloc (sizeof(struct garmin_data), GFP_KERNEL);
1435 if (garmin_data_p == NULL) {
1436 dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__);
1437 return -ENOMEM;
1438 }
1439 memset (garmin_data_p, 0, sizeof(struct garmin_data));
1440 init_timer(&garmin_data_p->timer);
1441 spin_lock_init(&garmin_data_p->lock);
1442 INIT_LIST_HEAD(&garmin_data_p->pktlist);
1443 //garmin_data_p->timer.expires = jiffies + session_timeout;
1444 garmin_data_p->timer.data = (unsigned long)garmin_data_p;
1445 garmin_data_p->timer.function = timeout_handler;
1446 garmin_data_p->port = port;
1447 garmin_data_p->state = 0;
1448 garmin_data_p->count = 0;
1449 usb_set_serial_port_data(port, garmin_data_p);
1450
1451 status = garmin_init_session(port);
1452
1453 return status;
1454}
1455
1456
1457static void garmin_shutdown (struct usb_serial *serial)
1458{
1459 struct usb_serial_port *port = serial->port[0];
1460 struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
1461
1462 dbg("%s", __FUNCTION__);
1463
1464 usb_kill_urb (port->interrupt_in_urb);
1465 del_timer_sync(&garmin_data_p->timer);
1466 kfree (garmin_data_p);
1467 usb_set_serial_port_data(port, NULL);
1468}
1469
1470
1471
1472
1473
1474
1475
1476/* All of the device info needed */
1477static struct usb_serial_device_type garmin_device = {
1478 .owner = THIS_MODULE,
1479 .name = "Garmin GPS usb/tty",
1480 .short_name = "garmin_gps",
1481 .id_table = id_table,
1482 .num_interrupt_in = 1,
1483 .num_bulk_in = 1,
1484 .num_bulk_out = 1,
1485 .num_ports = 1,
1486 .open = garmin_open,
1487 .close = garmin_close,
1488 .throttle = garmin_throttle,
1489 .unthrottle = garmin_unthrottle,
1490 .attach = garmin_attach,
1491 .shutdown = garmin_shutdown,
1492 .write = garmin_write,
1493 .write_room = garmin_write_room,
1494 .chars_in_buffer = garmin_chars_in_buffer,
1495 .write_bulk_callback = garmin_write_bulk_callback,
1496 .read_bulk_callback = garmin_read_bulk_callback,
1497 .read_int_callback = garmin_read_int_callback,
1498};
1499
1500
1501static int __init garmin_init (void)
1502{
1503 int retval;
1504
1505 retval = usb_serial_register(&garmin_device);
1506 if (retval)
1507 goto failed_garmin_register;
1508 retval = usb_register(&garmin_driver);
1509 if (retval)
1510 goto failed_usb_register;
1511 info(DRIVER_DESC " " DRIVER_VERSION);
1512
1513 return 0;
1514failed_usb_register:
1515 usb_serial_deregister(&garmin_device);
1516failed_garmin_register:
1517 return retval;
1518}
1519
1520
1521static void __exit garmin_exit (void)
1522{
1523 usb_deregister (&garmin_driver);
1524 usb_serial_deregister (&garmin_device);
1525}
1526
1527
1528
1529
1530module_init(garmin_init);
1531module_exit(garmin_exit);
1532
1533MODULE_AUTHOR( DRIVER_AUTHOR );
1534MODULE_DESCRIPTION( DRIVER_DESC );
1535MODULE_LICENSE("GPL");
1536
1537module_param(debug, bool, S_IWUSR | S_IRUGO);
1538MODULE_PARM_DESC(debug, "Debug enabled or not");
1539module_param(initial_mode, int, S_IRUGO);
1540MODULE_PARM_DESC(initial_mode, "Initial mode");
1541
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
new file mode 100644
index 000000000000..99214aa3cd19
--- /dev/null
+++ b/drivers/usb/serial/generic.c
@@ -0,0 +1,315 @@
1/*
2 * USB Serial Converter Generic functions
3 *
4 * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 *
10 */
11
12#include <linux/config.h>
13#include <linux/kernel.h>
14#include <linux/errno.h>
15#include <linux/slab.h>
16#include <linux/tty.h>
17#include <linux/tty_flip.h>
18#include <linux/module.h>
19#include <linux/moduleparam.h>
20#include <linux/usb.h>
21#include <asm/uaccess.h>
22#include "usb-serial.h"
23
24static int debug;
25
26#ifdef CONFIG_USB_SERIAL_GENERIC
27static __u16 vendor = 0x05f9;
28static __u16 product = 0xffff;
29
30module_param(vendor, ushort, 0);
31MODULE_PARM_DESC(vendor, "User specified USB idVendor");
32
33module_param(product, ushort, 0);
34MODULE_PARM_DESC(product, "User specified USB idProduct");
35
36static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
37
38/* All of the device info needed for the Generic Serial Converter */
39struct usb_serial_device_type usb_serial_generic_device = {
40 .owner = THIS_MODULE,
41 .name = "Generic",
42 .short_name = "generic",
43 .id_table = generic_device_ids,
44 .num_interrupt_in = NUM_DONT_CARE,
45 .num_bulk_in = NUM_DONT_CARE,
46 .num_bulk_out = NUM_DONT_CARE,
47 .num_ports = 1,
48 .shutdown = usb_serial_generic_shutdown,
49};
50
51/* we want to look at all devices, as the vendor/product id can change
52 * depending on the command line argument */
53static struct usb_device_id generic_serial_ids[] = {
54 {.driver_info = 42},
55 {}
56};
57
58static int generic_probe(struct usb_interface *interface,
59 const struct usb_device_id *id)
60{
61 const struct usb_device_id *id_pattern;
62
63 id_pattern = usb_match_id(interface, generic_device_ids);
64 if (id_pattern != NULL)
65 return usb_serial_probe(interface, id);
66 return -ENODEV;
67}
68
69static struct usb_driver generic_driver = {
70 .owner = THIS_MODULE,
71 .name = "usbserial_generic",
72 .probe = generic_probe,
73 .disconnect = usb_serial_disconnect,
74 .id_table = generic_serial_ids,
75};
76#endif
77
78int usb_serial_generic_register (int _debug)
79{
80 int retval = 0;
81
82 debug = _debug;
83#ifdef CONFIG_USB_SERIAL_GENERIC
84 generic_device_ids[0].idVendor = vendor;
85 generic_device_ids[0].idProduct = product;
86 generic_device_ids[0].match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
87
88 /* register our generic driver with ourselves */
89 retval = usb_serial_register (&usb_serial_generic_device);
90 if (retval)
91 goto exit;
92 retval = usb_register(&generic_driver);
93 if (retval)
94 usb_serial_deregister(&usb_serial_generic_device);
95exit:
96#endif
97 return retval;
98}
99
100void usb_serial_generic_deregister (void)
101{
102#ifdef CONFIG_USB_SERIAL_GENERIC
103 /* remove our generic driver */
104 usb_deregister(&generic_driver);
105 usb_serial_deregister (&usb_serial_generic_device);
106#endif
107}
108
109int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp)
110{
111 struct usb_serial *serial = port->serial;
112 int result = 0;
113
114 dbg("%s - port %d", __FUNCTION__, port->number);
115
116 /* force low_latency on so that our tty_push actually forces the data through,
117 otherwise it is scheduled, and with high data rates (like with OHCI) data
118 can get lost. */
119 if (port->tty)
120 port->tty->low_latency = 1;
121
122 /* if we have a bulk interrupt, start reading from it */
123 if (serial->num_bulk_in) {
124 /* Start reading from the device */
125 usb_fill_bulk_urb (port->read_urb, serial->dev,
126 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
127 port->read_urb->transfer_buffer,
128 port->read_urb->transfer_buffer_length,
129 ((serial->type->read_bulk_callback) ?
130 serial->type->read_bulk_callback :
131 usb_serial_generic_read_bulk_callback),
132 port);
133 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
134 if (result)
135 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
136 }
137
138 return result;
139}
140
141static void generic_cleanup (struct usb_serial_port *port)
142{
143 struct usb_serial *serial = port->serial;
144
145 dbg("%s - port %d", __FUNCTION__, port->number);
146
147 if (serial->dev) {
148 /* shutdown any bulk reads that might be going on */
149 if (serial->num_bulk_out)
150 usb_kill_urb(port->write_urb);
151 if (serial->num_bulk_in)
152 usb_kill_urb(port->read_urb);
153 }
154}
155
156void usb_serial_generic_close (struct usb_serial_port *port, struct file * filp)
157{
158 dbg("%s - port %d", __FUNCTION__, port->number);
159 generic_cleanup (port);
160}
161
162int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *buf, int count)
163{
164 struct usb_serial *serial = port->serial;
165 int result;
166 unsigned char *data;
167
168 dbg("%s - port %d", __FUNCTION__, port->number);
169
170 if (count == 0) {
171 dbg("%s - write request of 0 bytes", __FUNCTION__);
172 return (0);
173 }
174
175 /* only do something if we have a bulk out endpoint */
176 if (serial->num_bulk_out) {
177 if (port->write_urb->status == -EINPROGRESS) {
178 dbg("%s - already writing", __FUNCTION__);
179 return (0);
180 }
181
182 count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
183
184 memcpy (port->write_urb->transfer_buffer, buf, count);
185 data = port->write_urb->transfer_buffer;
186 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, data);
187
188 /* set up our urb */
189 usb_fill_bulk_urb (port->write_urb, serial->dev,
190 usb_sndbulkpipe (serial->dev,
191 port->bulk_out_endpointAddress),
192 port->write_urb->transfer_buffer, count,
193 ((serial->type->write_bulk_callback) ?
194 serial->type->write_bulk_callback :
195 usb_serial_generic_write_bulk_callback), port);
196
197 /* send the data out the bulk port */
198 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
199 if (result)
200 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
201 else
202 result = count;
203
204 return result;
205 }
206
207 /* no bulk out, so return 0 bytes written */
208 return (0);
209}
210
211int usb_serial_generic_write_room (struct usb_serial_port *port)
212{
213 struct usb_serial *serial = port->serial;
214 int room = 0;
215
216 dbg("%s - port %d", __FUNCTION__, port->number);
217
218 if (serial->num_bulk_out) {
219 if (port->write_urb->status != -EINPROGRESS)
220 room = port->bulk_out_size;
221 }
222
223 dbg("%s - returns %d", __FUNCTION__, room);
224 return (room);
225}
226
227int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port)
228{
229 struct usb_serial *serial = port->serial;
230 int chars = 0;
231
232 dbg("%s - port %d", __FUNCTION__, port->number);
233
234 if (serial->num_bulk_out) {
235 if (port->write_urb->status == -EINPROGRESS)
236 chars = port->write_urb->transfer_buffer_length;
237 }
238
239 dbg("%s - returns %d", __FUNCTION__, chars);
240 return (chars);
241}
242
243void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
244{
245 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
246 struct usb_serial *serial = port->serial;
247 struct tty_struct *tty;
248 unsigned char *data = urb->transfer_buffer;
249 int i;
250 int result;
251
252 dbg("%s - port %d", __FUNCTION__, port->number);
253
254 if (urb->status) {
255 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
256 return;
257 }
258
259 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
260
261 tty = port->tty;
262 if (tty && urb->actual_length) {
263 for (i = 0; i < urb->actual_length ; ++i) {
264 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
265 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
266 tty_flip_buffer_push(tty);
267 }
268 /* this doesn't actually push the data through unless tty->low_latency is set */
269 tty_insert_flip_char(tty, data[i], 0);
270 }
271 tty_flip_buffer_push(tty);
272 }
273
274 /* Continue trying to always read */
275 usb_fill_bulk_urb (port->read_urb, serial->dev,
276 usb_rcvbulkpipe (serial->dev,
277 port->bulk_in_endpointAddress),
278 port->read_urb->transfer_buffer,
279 port->read_urb->transfer_buffer_length,
280 ((serial->type->read_bulk_callback) ?
281 serial->type->read_bulk_callback :
282 usb_serial_generic_read_bulk_callback), port);
283 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
284 if (result)
285 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
286}
287
288void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
289{
290 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
291
292 dbg("%s - port %d", __FUNCTION__, port->number);
293
294 if (urb->status) {
295 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
296 return;
297 }
298
299 usb_serial_port_softint((void *)port);
300
301 schedule_work(&port->work);
302}
303
304void usb_serial_generic_shutdown (struct usb_serial *serial)
305{
306 int i;
307
308 dbg("%s", __FUNCTION__);
309
310 /* stop reads and writes on all ports */
311 for (i=0; i < serial->num_ports; ++i) {
312 generic_cleanup(serial->port[i]);
313 }
314}
315
diff --git a/drivers/usb/serial/io_16654.h b/drivers/usb/serial/io_16654.h
new file mode 100644
index 000000000000..a53abc9530ff
--- /dev/null
+++ b/drivers/usb/serial/io_16654.h
@@ -0,0 +1,195 @@
1/************************************************************************
2 *
3 * 16654.H Definitions for 16C654 UART used on EdgePorts
4 *
5 * Copyright (C) 1998 Inside Out Networks, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 ************************************************************************/
12
13#if !defined(_16654_H)
14#define _16654_H
15
16/************************************************************************
17 *
18 * D e f i n e s / T y p e d e f s
19 *
20 ************************************************************************/
21
22 //
23 // UART register numbers
24 // Numbers 0-7 are passed to the Edgeport directly. Numbers 8 and
25 // above are used internally to indicate that we must enable access
26 // to them via LCR bit 0x80 or LCR = 0xBF.
27 // The register number sent to the Edgeport is then (x & 0x7).
28 //
29 // Driver must not access registers that affect operation of the
30 // the EdgePort firmware -- that includes THR, RHR, IER, FCR.
31
32
33#define THR 0 // ! Transmit Holding Register (Write)
34#define RDR 0 // ! Receive Holding Register (Read)
35#define IER 1 // ! Interrupt Enable Register
36#define FCR 2 // ! Fifo Control Register (Write)
37#define ISR 2 // Interrupt Status Register (Read)
38#define LCR 3 // Line Control Register
39#define MCR 4 // Modem Control Register
40#define LSR 5 // Line Status Register
41#define MSR 6 // Modem Status Register
42#define SPR 7 // ScratchPad Register
43#define DLL 8 // Bank2[ 0 ] Divisor Latch LSB
44#define DLM 9 // Bank2[ 1 ] Divisor Latch MSB
45#define EFR 10 // Bank2[ 2 ] Extended Function Register
46//efine unused 11 // Bank2[ 3 ]
47#define XON1 12 // Bank2[ 4 ] Xon-1
48#define XON2 13 // Bank2[ 5 ] Xon-2
49#define XOFF1 14 // Bank2[ 6 ] Xoff-1
50#define XOFF2 15 // Bank2[ 7 ] Xoff-2
51
52#define NUM_16654_REGS 16
53
54#define IS_REG_2ND_BANK(x) ((x) >= 8)
55
56 //
57 // Bit definitions for each register
58 //
59
60#define IER_RX 0x01 // Enable receive interrupt
61#define IER_TX 0x02 // Enable transmit interrupt
62#define IER_RXS 0x04 // Enable receive status interrupt
63#define IER_MDM 0x08 // Enable modem status interrupt
64#define IER_SLEEP 0x10 // Enable sleep mode
65#define IER_XOFF 0x20 // Enable s/w flow control (XOFF) interrupt
66#define IER_RTS 0x40 // Enable RTS interrupt
67#define IER_CTS 0x80 // Enable CTS interrupt
68#define IER_ENABLE_ALL 0xFF // Enable all ints
69
70
71#define FCR_FIFO_EN 0x01 // Enable FIFOs
72#define FCR_RXCLR 0x02 // Reset Rx FIFO
73#define FCR_TXCLR 0x04 // Reset Tx FIFO
74#define FCR_DMA_BLK 0x08 // Enable DMA block mode
75#define FCR_TX_LEVEL_MASK 0x30 // Mask for Tx FIFO Level
76#define FCR_TX_LEVEL_8 0x00 // Tx FIFO Level = 8 bytes
77#define FCR_TX_LEVEL_16 0x10 // Tx FIFO Level = 16 bytes
78#define FCR_TX_LEVEL_32 0x20 // Tx FIFO Level = 32 bytes
79#define FCR_TX_LEVEL_56 0x30 // Tx FIFO Level = 56 bytes
80#define FCR_RX_LEVEL_MASK 0xC0 // Mask for Rx FIFO Level
81#define FCR_RX_LEVEL_8 0x00 // Rx FIFO Level = 8 bytes
82#define FCR_RX_LEVEL_16 0x40 // Rx FIFO Level = 16 bytes
83#define FCR_RX_LEVEL_56 0x80 // Rx FIFO Level = 56 bytes
84#define FCR_RX_LEVEL_60 0xC0 // Rx FIFO Level = 60 bytes
85
86
87#define ISR_INT_MDM_STATUS 0x00 // Modem status int pending
88#define ISR_INT_NONE 0x01 // No interrupt pending
89#define ISR_INT_TXRDY 0x02 // Tx ready int pending
90#define ISR_INT_RXRDY 0x04 // Rx ready int pending
91#define ISR_INT_LINE_STATUS 0x06 // Line status int pending
92#define ISR_INT_RX_TIMEOUT 0x0C // Rx timeout int pending
93#define ISR_INT_RX_XOFF 0x10 // Rx Xoff int pending
94#define ISR_INT_RTS_CTS 0x20 // RTS/CTS change int pending
95#define ISR_FIFO_ENABLED 0xC0 // Bits set if FIFOs enabled
96#define ISR_INT_BITS_MASK 0x3E // Mask to isolate valid int causes
97
98
99#define LCR_BITS_5 0x00 // 5 bits/char
100#define LCR_BITS_6 0x01 // 6 bits/char
101#define LCR_BITS_7 0x02 // 7 bits/char
102#define LCR_BITS_8 0x03 // 8 bits/char
103#define LCR_BITS_MASK 0x03 // Mask for bits/char field
104
105#define LCR_STOP_1 0x00 // 1 stop bit
106#define LCR_STOP_1_5 0x04 // 1.5 stop bits (if 5 bits/char)
107#define LCR_STOP_2 0x04 // 2 stop bits (if 6-8 bits/char)
108#define LCR_STOP_MASK 0x04 // Mask for stop bits field
109
110#define LCR_PAR_NONE 0x00 // No parity
111#define LCR_PAR_ODD 0x08 // Odd parity
112#define LCR_PAR_EVEN 0x18 // Even parity
113#define LCR_PAR_MARK 0x28 // Force parity bit to 1
114#define LCR_PAR_SPACE 0x38 // Force parity bit to 0
115#define LCR_PAR_MASK 0x38 // Mask for parity field
116
117#define LCR_SET_BREAK 0x40 // Set Break condition
118#define LCR_DL_ENABLE 0x80 // Enable access to divisor latch
119
120#define LCR_ACCESS_EFR 0xBF // Load this value to access DLL,DLM,
121 // and also the '654-only registers
122 // EFR, XON1, XON2, XOFF1, XOFF2
123
124
125#define MCR_DTR 0x01 // Assert DTR
126#define MCR_RTS 0x02 // Assert RTS
127#define MCR_OUT1 0x04 // Loopback only: Sets state of RI
128#define MCR_MASTER_IE 0x08 // Enable interrupt outputs
129#define MCR_LOOPBACK 0x10 // Set internal (digital) loopback mode
130#define MCR_XON_ANY 0x20 // Enable any char to exit XOFF mode
131#define MCR_IR_ENABLE 0x40 // Enable IrDA functions
132#define MCR_BRG_DIV_4 0x80 // Divide baud rate clk by /4 instead of /1
133
134
135#define LSR_RX_AVAIL 0x01 // Rx data available
136#define LSR_OVER_ERR 0x02 // Rx overrun
137#define LSR_PAR_ERR 0x04 // Rx parity error
138#define LSR_FRM_ERR 0x08 // Rx framing error
139#define LSR_BREAK 0x10 // Rx break condition detected
140#define LSR_TX_EMPTY 0x20 // Tx Fifo empty
141#define LSR_TX_ALL_EMPTY 0x40 // Tx Fifo and shift register empty
142#define LSR_FIFO_ERR 0x80 // Rx Fifo contains at least 1 erred char
143
144
145#define EDGEPORT_MSR_DELTA_CTS 0x01 // CTS changed from last read
146#define EDGEPORT_MSR_DELTA_DSR 0x02 // DSR changed from last read
147#define EDGEPORT_MSR_DELTA_RI 0x04 // RI changed from 0 -> 1
148#define EDGEPORT_MSR_DELTA_CD 0x08 // CD changed from last read
149#define EDGEPORT_MSR_CTS 0x10 // Current state of CTS
150#define EDGEPORT_MSR_DSR 0x20 // Current state of DSR
151#define EDGEPORT_MSR_RI 0x40 // Current state of RI
152#define EDGEPORT_MSR_CD 0x80 // Current state of CD
153
154
155
156 // Tx Rx
157 //-------------------------------
158#define EFR_SWFC_NONE 0x00 // None None
159#define EFR_SWFC_RX1 0x02 // None XOFF1
160#define EFR_SWFC_RX2 0x01 // None XOFF2
161#define EFR_SWFC_RX12 0x03 // None XOFF1 & XOFF2
162#define EFR_SWFC_TX1 0x08 // XOFF1 None
163#define EFR_SWFC_TX1_RX1 0x0a // XOFF1 XOFF1
164#define EFR_SWFC_TX1_RX2 0x09 // XOFF1 XOFF2
165#define EFR_SWFC_TX1_RX12 0x0b // XOFF1 XOFF1 & XOFF2
166#define EFR_SWFC_TX2 0x04 // XOFF2 None
167#define EFR_SWFC_TX2_RX1 0x06 // XOFF2 XOFF1
168#define EFR_SWFC_TX2_RX2 0x05 // XOFF2 XOFF2
169#define EFR_SWFC_TX2_RX12 0x07 // XOFF2 XOFF1 & XOFF2
170#define EFR_SWFC_TX12 0x0c // XOFF1 & XOFF2 None
171#define EFR_SWFC_TX12_RX1 0x0e // XOFF1 & XOFF2 XOFF1
172#define EFR_SWFC_TX12_RX2 0x0d // XOFF1 & XOFF2 XOFF2
173#define EFR_SWFC_TX12_RX12 0x0f // XOFF1 & XOFF2 XOFF1 & XOFF2
174
175#define EFR_TX_FC_MASK 0x0c // Mask to isolate Rx flow control
176#define EFR_TX_FC_NONE 0x00 // No Tx Xon/Xoff flow control
177#define EFR_TX_FC_X1 0x08 // Transmit Xon1/Xoff1
178#define EFR_TX_FC_X2 0x04 // Transmit Xon2/Xoff2
179#define EFR_TX_FC_X1_2 0x0c // Transmit Xon1&2/Xoff1&2
180
181#define EFR_RX_FC_MASK 0x03 // Mask to isolate Rx flow control
182#define EFR_RX_FC_NONE 0x00 // No Rx Xon/Xoff flow control
183#define EFR_RX_FC_X1 0x02 // Receiver compares Xon1/Xoff1
184#define EFR_RX_FC_X2 0x01 // Receiver compares Xon2/Xoff2
185#define EFR_RX_FC_X1_2 0x03 // Receiver compares Xon1&2/Xoff1&2
186
187
188#define EFR_SWFC_MASK 0x0F // Mask for software flow control field
189#define EFR_ENABLE_16654 0x10 // Enable 16C654 features
190#define EFR_SPEC_DETECT 0x20 // Enable special character detect interrupt
191#define EFR_AUTO_RTS 0x40 // Use RTS for Rx flow control
192#define EFR_AUTO_CTS 0x80 // Use CTS for Tx flow control
193
194#endif // if !defined(_16654_H)
195
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
new file mode 100644
index 000000000000..e35b5adcd5fe
--- /dev/null
+++ b/drivers/usb/serial/io_edgeport.c
@@ -0,0 +1,3113 @@
1/*
2 * Edgeport USB Serial Converter driver
3 *
4 * Copyright (C) 2000 Inside Out Networks, All rights reserved.
5 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * Supports the following devices:
13 * Edgeport/4
14 * Edgeport/4t
15 * Edgeport/2
16 * Edgeport/4i
17 * Edgeport/2i
18 * Edgeport/421
19 * Edgeport/21
20 * Rapidport/4
21 * Edgeport/8
22 * Edgeport/2D8
23 * Edgeport/4D8
24 * Edgeport/8i
25 *
26 * For questions or problems with this driver, contact Inside Out
27 * Networks technical support, or Peter Berger <pberger@brimson.com>,
28 * or Al Borchers <alborchers@steinerpoint.com>.
29 *
30 * Version history:
31 *
32 * 2003_04_03 al borchers
33 * - fixed a bug (that shows up with dosemu) where the tty struct is
34 * used in a callback after it has been freed
35 *
36 * 2.3 2002_03_08 greg kroah-hartman
37 * - fixed bug when multiple devices were attached at the same time.
38 *
39 * 2.2 2001_11_14 greg kroah-hartman
40 * - fixed bug in edge_close that kept the port from being used more
41 * than once.
42 * - fixed memory leak on device removal.
43 * - fixed potential double free of memory when command urb submitting
44 * failed.
45 * - other small cleanups when the device is removed
46 *
47 * 2.1 2001_07_09 greg kroah-hartman
48 * - added support for TIOCMBIS and TIOCMBIC.
49 *
50 * (04/08/2001) gb
51 * - Identify version on module load.
52 *
53 * 2.0 2001_03_05 greg kroah-hartman
54 * - reworked entire driver to fit properly in with the other usb-serial
55 * drivers. Occasional oopses still happen, but it's a good start.
56 *
57 * 1.2.3 (02/23/2001) greg kroah-hartman
58 * - changed device table to work properly for 2.4.x final format.
59 * - fixed problem with dropping data at high data rates.
60 *
61 * 1.2.2 (11/27/2000) greg kroah-hartman
62 * - cleaned up more NTisms.
63 * - Added device table for 2.4.0-test11
64 *
65 * 1.2.1 (11/08/2000) greg kroah-hartman
66 * - Started to clean up NTisms.
67 * - Fixed problem with dev field of urb for kernels >= 2.4.0-test9
68 *
69 * 1.2 (10/17/2000) David Iacovelli
70 * Remove all EPIC code and GPL source
71 * Fix RELEVANT_IFLAG macro to include flow control
72 * changes port configuration changes.
73 * Fix redefinition of SERIAL_MAGIC
74 * Change all timeout values to 5 seconds
75 * Tried to fix the UHCI multiple urb submission, but failed miserably.
76 * it seems to work fine with OHCI.
77 * ( Greg take a look at the #if 0 at end of WriteCmdUsb() we must
78 * find a way to work arount this UHCI bug )
79 *
80 * 1.1 (10/11/2000) David Iacovelli
81 * Fix XON/XOFF flow control to support both IXON and IXOFF
82 *
83 * 0.9.27 (06/30/2000) David Iacovelli
84 * Added transmit queue and now allocate urb for command writes.
85 *
86 * 0.9.26 (06/29/2000) David Iacovelli
87 * Add support for 80251 based edgeport
88 *
89 * 0.9.25 (06/27/2000) David Iacovelli
90 * Do not close the port if it has multiple opens.
91 *
92 * 0.9.24 (05/26/2000) David Iacovelli
93 * Add IOCTLs to support RXTX and JAVA POS
94 * and first cut at running BlackBox Demo
95 *
96 * 0.9.23 (05/24/2000) David Iacovelli
97 * Add IOCTLs to support RXTX and JAVA POS
98 *
99 * 0.9.22 (05/23/2000) David Iacovelli
100 * fixed bug in enumeration. If epconfig turns on mapping by
101 * path after a device is already plugged in, we now update
102 * the mapping correctly
103 *
104 * 0.9.21 (05/16/2000) David Iacovelli
105 * Added BlockUntilChaseResp() to also wait for txcredits
106 * Updated the way we allocate and handle write URBs
107 * Add debug code to dump buffers
108 *
109 * 0.9.20 (05/01/2000) David Iacovelli
110 * change driver to use usb/tts/
111 *
112 * 0.9.19 (05/01/2000) David Iacovelli
113 * Update code to compile if DEBUG is off
114 *
115 * 0.9.18 (04/28/2000) David Iacovelli
116 * cleanup and test tty_register with devfs
117 *
118 * 0.9.17 (04/27/2000) greg kroah-hartman
119 * changed tty_register around to be like the way it
120 * was before, but now it works properly with devfs.
121 *
122 * 0.9.16 (04/26/2000) david iacovelli
123 * Fixed bug in GetProductInfo()
124 *
125 * 0.9.15 (04/25/2000) david iacovelli
126 * Updated enumeration
127 *
128 * 0.9.14 (04/24/2000) david iacovelli
129 * Removed all config/status IOCTLS and
130 * converted to using /proc/edgeport
131 * still playing with devfs
132 *
133 * 0.9.13 (04/24/2000) david iacovelli
134 * Removed configuration based on ttyUSB0
135 * Added support for configuration using /prod/edgeport
136 * first attempt at using devfs (not working yet!)
137 * Added IOCTL to GetProductInfo()
138 * Added support for custom baud rates
139 * Add support for random port numbers
140 *
141 * 0.9.12 (04/18/2000) david iacovelli
142 * added additional configuration IOCTLs
143 * use ttyUSB0 for configuration
144 *
145 * 0.9.11 (04/17/2000) greg kroah-hartman
146 * fixed module initialization race conditions.
147 * made all urbs dynamically allocated.
148 * made driver devfs compatible. now it only registers the tty device
149 * when the device is actually plugged in.
150 *
151 * 0.9.10 (04/13/2000) greg kroah-hartman
152 * added proc interface framework.
153 *
154 * 0.9.9 (04/13/2000) david iacovelli
155 * added enumeration code and ioctls to configure the device
156 *
157 * 0.9.8 (04/12/2000) david iacovelli
158 * Change interrupt read start when device is plugged in
159 * and stop when device is removed
160 * process interrupt reads when all ports are closed
161 * (keep value of rxBytesAvail consistent with the edgeport)
162 * set the USB_BULK_QUEUE flag so that we can shove a bunch
163 * of urbs at once down the pipe
164 *
165 * 0.9.7 (04/10/2000) david iacovelli
166 * start to add enumeration code.
167 * generate serial number for epic devices
168 * add support for kdb
169 *
170 * 0.9.6 (03/30/2000) david iacovelli
171 * add IOCTL to get string, manufacture, and boot descriptors
172 *
173 * 0.9.5 (03/14/2000) greg kroah-hartman
174 * more error checking added to SerialOpen to try to fix UHCI open problem
175 *
176 * 0.9.4 (03/09/2000) greg kroah-hartman
177 * added more error checking to handle oops when data is hanging
178 * around and tty is abruptly closed.
179 *
180 * 0.9.3 (03/09/2000) david iacovelli
181 * Add epic support for xon/xoff chars
182 * play with performance
183 *
184 * 0.9.2 (03/08/2000) greg kroah-hartman
185 * changed most "info" calls to "dbg"
186 * implemented flow control properly in the termios call
187 *
188 * 0.9.1 (03/08/2000) david iacovelli
189 * added EPIC support
190 * enabled bootloader update
191 *
192 * 0.9 (03/08/2000) greg kroah-hartman
193 * Release to IO networks.
194 * Integrated changes that David made
195 * made getting urbs for writing SMP safe
196 *
197 * 0.8 (03/07/2000) greg kroah-hartman
198 * Release to IO networks.
199 * Fixed problems that were seen in code by David.
200 * Now both Edgeport/4 and Edgeport/2 works properly.
201 * Changed most of the functions to use port instead of serial.
202 *
203 * 0.7 (02/27/2000) greg kroah-hartman
204 * Milestone 3 release.
205 * Release to IO Networks
206 * ioctl for waiting on line change implemented.
207 * ioctl for getting statistics implemented.
208 * multiport support working.
209 * lsr and msr registers are now handled properly.
210 * change break now hooked up and working.
211 * support for all known Edgeport devices.
212 *
213 * 0.6 (02/22/2000) greg kroah-hartman
214 * Release to IO networks.
215 * CHASE is implemented correctly when port is closed.
216 * SerialOpen now blocks correctly until port is fully opened.
217 *
218 * 0.5 (02/20/2000) greg kroah-hartman
219 * Release to IO networks.
220 * Known problems:
221 * modem status register changes are not sent on to the user
222 * CHASE is not implemented when the port is closed.
223 *
224 * 0.4 (02/16/2000) greg kroah-hartman
225 * Second cut at the CeBit demo.
226 * Doesn't leak memory on every write to the port
227 * Still small leaks on startup.
228 * Added support for Edgeport/2 and Edgeport/8
229 *
230 * 0.3 (02/15/2000) greg kroah-hartman
231 * CeBit demo release.
232 * Force the line settings to 4800, 8, 1, e for the demo.
233 * Warning! This version leaks memory like crazy!
234 *
235 * 0.2 (01/30/2000) greg kroah-hartman
236 * Milestone 1 release.
237 * Device is found by USB subsystem, enumerated, fimware is downloaded
238 * and the descriptors are printed to the debug log, config is set, and
239 * green light starts to blink. Open port works, and data can be sent
240 * and received at the default settings of the UART. Loopback connector
241 * and debug log confirms this.
242 *
243 * 0.1 (01/23/2000) greg kroah-hartman
244 * Initial release to help IO Networks try to set up their test system.
245 * Edgeport4 is recognized, firmware is downloaded, config is set so
246 * device blinks green light every 3 sec. Port is bound, but opening,
247 * closing, and sending data do not work properly.
248 *
249 */
250
251#include <linux/config.h>
252#include <linux/kernel.h>
253#include <linux/jiffies.h>
254#include <linux/errno.h>
255#include <linux/init.h>
256#include <linux/slab.h>
257#include <linux/tty.h>
258#include <linux/tty_driver.h>
259#include <linux/tty_flip.h>
260#include <linux/module.h>
261#include <linux/spinlock.h>
262#include <linux/serial.h>
263#include <linux/ioctl.h>
264#include <linux/wait.h>
265#include <asm/uaccess.h>
266#include <linux/usb.h>
267#include "usb-serial.h"
268#include "io_edgeport.h"
269#include "io_ionsp.h" /* info for the iosp messages */
270#include "io_16654.h" /* 16654 UART defines */
271
272/*
273 * Version Information
274 */
275#define DRIVER_VERSION "v2.7"
276#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
277#define DRIVER_DESC "Edgeport USB Serial Driver"
278
279/* First, the latest boot code - for first generation edgeports */
280#define IMAGE_ARRAY_NAME BootCodeImage_GEN1
281#define IMAGE_VERSION_NAME BootCodeImageVersion_GEN1
282#include "io_fw_boot.h" /* the bootloader firmware to download to a device, if it needs it */
283
284/* for second generation edgeports */
285#define IMAGE_ARRAY_NAME BootCodeImage_GEN2
286#define IMAGE_VERSION_NAME BootCodeImageVersion_GEN2
287#include "io_fw_boot2.h" /* the bootloader firmware to download to a device, if it needs it */
288
289/* Then finally the main run-time operational code - for first generation edgeports */
290#define IMAGE_ARRAY_NAME OperationalCodeImage_GEN1
291#define IMAGE_VERSION_NAME OperationalCodeImageVersion_GEN1
292#include "io_fw_down.h" /* Define array OperationalCodeImage[] */
293
294/* for second generation edgeports */
295#define IMAGE_ARRAY_NAME OperationalCodeImage_GEN2
296#define IMAGE_VERSION_NAME OperationalCodeImageVersion_GEN2
297#include "io_fw_down2.h" /* Define array OperationalCodeImage[] */
298
299#define MAX_NAME_LEN 64
300
301#define CHASE_TIMEOUT (5*HZ) /* 5 seconds */
302#define OPEN_TIMEOUT (5*HZ) /* 5 seconds */
303#define COMMAND_TIMEOUT (5*HZ) /* 5 seconds */
304
305/* receive port state */
306enum RXSTATE {
307 EXPECT_HDR1 = 0, /* Expect header byte 1 */
308 EXPECT_HDR2 = 1, /* Expect header byte 2 */
309 EXPECT_DATA = 2, /* Expect 'RxBytesRemaining' data */
310 EXPECT_HDR3 = 3, /* Expect header byte 3 (for status hdrs only) */
311};
312
313
314/* Transmit Fifo
315 * This Transmit queue is an extension of the edgeport Rx buffer.
316 * The maximum amount of data buffered in both the edgeport
317 * Rx buffer (maxTxCredits) and this buffer will never exceed maxTxCredits.
318 */
319struct TxFifo {
320 unsigned int head; /* index to head pointer (write) */
321 unsigned int tail; /* index to tail pointer (read) */
322 unsigned int count; /* Bytes in queue */
323 unsigned int size; /* Max size of queue (equal to Max number of TxCredits) */
324 unsigned char *fifo; /* allocated Buffer */
325};
326
327/* This structure holds all of the local port information */
328struct edgeport_port {
329 __u16 txCredits; /* our current credits for this port */
330 __u16 maxTxCredits; /* the max size of the port */
331
332 struct TxFifo txfifo; /* transmit fifo -- size will be maxTxCredits */
333 struct urb *write_urb; /* write URB for this port */
334 char write_in_progress; /* TRUE while a write URB is outstanding */
335 spinlock_t ep_lock;
336
337 __u8 shadowLCR; /* last LCR value received */
338 __u8 shadowMCR; /* last MCR value received */
339 __u8 shadowMSR; /* last MSR value received */
340 __u8 shadowLSR; /* last LSR value received */
341 __u8 shadowXonChar; /* last value set as XON char in Edgeport */
342 __u8 shadowXoffChar; /* last value set as XOFF char in Edgeport */
343 __u8 validDataMask;
344 __u32 baudRate;
345
346 char open;
347 char openPending;
348 char commandPending;
349 char closePending;
350 char chaseResponsePending;
351
352 wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */
353 wait_queue_head_t wait_open; /* for handling sleeping while waiting for open to finish */
354 wait_queue_head_t wait_command; /* for handling sleeping while waiting for command to finish */
355 wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */
356
357 struct async_icount icount;
358 struct usb_serial_port *port; /* loop back to the owner of this object */
359};
360
361
362/* This structure holds all of the individual device information */
363struct edgeport_serial {
364 char name[MAX_NAME_LEN+1]; /* string name of this device */
365
366 struct edge_manuf_descriptor manuf_descriptor; /* the manufacturer descriptor */
367 struct edge_boot_descriptor boot_descriptor; /* the boot firmware descriptor */
368 struct edgeport_product_info product_info; /* Product Info */
369
370 __u8 interrupt_in_endpoint; /* the interrupt endpoint handle */
371 unsigned char * interrupt_in_buffer; /* the buffer we use for the interrupt endpoint */
372 struct urb * interrupt_read_urb; /* our interrupt urb */
373
374 __u8 bulk_in_endpoint; /* the bulk in endpoint handle */
375 unsigned char * bulk_in_buffer; /* the buffer we use for the bulk in endpoint */
376 struct urb * read_urb; /* our bulk read urb */
377 int read_in_progress;
378 spinlock_t es_lock;
379
380 __u8 bulk_out_endpoint; /* the bulk out endpoint handle */
381
382 __s16 rxBytesAvail; /* the number of bytes that we need to read from this device */
383
384 enum RXSTATE rxState; /* the current state of the bulk receive processor */
385 __u8 rxHeader1; /* receive header byte 1 */
386 __u8 rxHeader2; /* receive header byte 2 */
387 __u8 rxHeader3; /* receive header byte 3 */
388 __u8 rxPort; /* the port that we are currently receiving data for */
389 __u8 rxStatusCode; /* the receive status code */
390 __u8 rxStatusParam; /* the receive status paramater */
391 __s16 rxBytesRemaining; /* the number of port bytes left to read */
392 struct usb_serial *serial; /* loop back to the owner of this object */
393};
394
395/* baud rate information */
396struct divisor_table_entry {
397 __u32 BaudRate;
398 __u16 Divisor;
399};
400
401//
402// Define table of divisors for Rev A EdgePort/4 hardware
403// These assume a 3.6864MHz crystal, the standard /16, and
404// MCR.7 = 0.
405//
406static struct divisor_table_entry divisor_table[] = {
407 { 50, 4608},
408 { 75, 3072},
409 { 110, 2095}, /* 2094.545455 => 230450 => .0217 % over */
410 { 134, 1713}, /* 1713.011152 => 230398.5 => .00065% under */
411 { 150, 1536},
412 { 300, 768},
413 { 600, 384},
414 { 1200, 192},
415 { 1800, 128},
416 { 2400, 96},
417 { 4800, 48},
418 { 7200, 32},
419 { 9600, 24},
420 { 14400, 16},
421 { 19200, 12},
422 { 38400, 6},
423 { 57600, 4},
424 { 115200, 2},
425 { 230400, 1},
426};
427
428/* local variables */
429static int debug;
430
431static int low_latency = 1; /* tty low latency flag, on by default */
432
433static int CmdUrbs = 0; /* Number of outstanding Command Write Urbs */
434
435
436/* local function prototypes */
437
438/* function prototypes for all URB callbacks */
439static void edge_interrupt_callback (struct urb *urb, struct pt_regs *regs);
440static void edge_bulk_in_callback (struct urb *urb, struct pt_regs *regs);
441static void edge_bulk_out_data_callback (struct urb *urb, struct pt_regs *regs);
442static void edge_bulk_out_cmd_callback (struct urb *urb, struct pt_regs *regs);
443
444/* function prototypes for the usbserial callbacks */
445static int edge_open (struct usb_serial_port *port, struct file *filp);
446static void edge_close (struct usb_serial_port *port, struct file *filp);
447static int edge_write (struct usb_serial_port *port, const unsigned char *buf, int count);
448static int edge_write_room (struct usb_serial_port *port);
449static int edge_chars_in_buffer (struct usb_serial_port *port);
450static void edge_throttle (struct usb_serial_port *port);
451static void edge_unthrottle (struct usb_serial_port *port);
452static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios);
453static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg);
454static void edge_break (struct usb_serial_port *port, int break_state);
455static int edge_tiocmget (struct usb_serial_port *port, struct file *file);
456static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear);
457static int edge_startup (struct usb_serial *serial);
458static void edge_shutdown (struct usb_serial *serial);
459
460
461#include "io_tables.h" /* all of the devices that this driver supports */
462
463static struct usb_driver io_driver = {
464 .owner = THIS_MODULE,
465 .name = "io_edgeport",
466 .probe = usb_serial_probe,
467 .disconnect = usb_serial_disconnect,
468 .id_table = id_table_combined,
469};
470
471/* function prototypes for all of our local functions */
472static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned char *buffer, __u16 bufferLength);
473static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3);
474static void edge_tty_recv (struct device *dev, struct tty_struct *tty, unsigned char *data, int length);
475static void handle_new_msr (struct edgeport_port *edge_port, __u8 newMsr);
476static void handle_new_lsr (struct edgeport_port *edge_port, __u8 lsrData, __u8 lsr, __u8 data);
477static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u8 param);
478static int calc_baud_rate_divisor (int baud_rate, int *divisor);
479static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRate);
480static void change_port_settings (struct edgeport_port *edge_port, struct termios *old_termios);
481static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 regNum, __u8 regValue);
482static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer, int writeLength);
483static void send_more_port_data (struct edgeport_serial *edge_serial, struct edgeport_port *edge_port);
484
485static int sram_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data);
486static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data);
487static int rom_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data);
488static void get_manufacturing_desc (struct edgeport_serial *edge_serial);
489static void get_boot_desc (struct edgeport_serial *edge_serial);
490static void load_application_firmware (struct edgeport_serial *edge_serial);
491
492static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size);
493
494
495// ************************************************************************
496// ************************************************************************
497// ************************************************************************
498// ************************************************************************
499
500/************************************************************************
501 * *
502 * update_edgeport_E2PROM() Compare current versions of *
503 * Boot ROM and Manufacture *
504 * Descriptors with versions *
505 * embedded in this driver *
506 * *
507 ************************************************************************/
508static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial)
509{
510 __u32 BootCurVer;
511 __u32 BootNewVer;
512 __u8 BootMajorVersion;
513 __u8 BootMinorVersion;
514 __le16 BootBuildNumber;
515 __u8 *BootImage;
516 __u32 BootSize;
517 struct edge_firmware_image_record *record;
518 unsigned char *firmware;
519 int response;
520
521
522 switch (edge_serial->product_info.iDownloadFile) {
523 case EDGE_DOWNLOAD_FILE_I930:
524 BootMajorVersion = BootCodeImageVersion_GEN1.MajorVersion;
525 BootMinorVersion = BootCodeImageVersion_GEN1.MinorVersion;
526 BootBuildNumber = cpu_to_le16(BootCodeImageVersion_GEN1.BuildNumber);
527 BootImage = &BootCodeImage_GEN1[0];
528 BootSize = sizeof( BootCodeImage_GEN1 );
529 break;
530
531 case EDGE_DOWNLOAD_FILE_80251:
532 BootMajorVersion = BootCodeImageVersion_GEN2.MajorVersion;
533 BootMinorVersion = BootCodeImageVersion_GEN2.MinorVersion;
534 BootBuildNumber = cpu_to_le16(BootCodeImageVersion_GEN2.BuildNumber);
535 BootImage = &BootCodeImage_GEN2[0];
536 BootSize = sizeof( BootCodeImage_GEN2 );
537 break;
538
539 default:
540 return;
541 }
542
543 // Check Boot Image Version
544 BootCurVer = (edge_serial->boot_descriptor.MajorVersion << 24) +
545 (edge_serial->boot_descriptor.MinorVersion << 16) +
546 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber);
547
548 BootNewVer = (BootMajorVersion << 24) +
549 (BootMinorVersion << 16) +
550 le16_to_cpu(BootBuildNumber);
551
552 dbg("Current Boot Image version %d.%d.%d",
553 edge_serial->boot_descriptor.MajorVersion,
554 edge_serial->boot_descriptor.MinorVersion,
555 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber));
556
557
558 if (BootNewVer > BootCurVer) {
559 dbg("**Update Boot Image from %d.%d.%d to %d.%d.%d",
560 edge_serial->boot_descriptor.MajorVersion,
561 edge_serial->boot_descriptor.MinorVersion,
562 le16_to_cpu(edge_serial->boot_descriptor.BuildNumber),
563 BootMajorVersion,
564 BootMinorVersion,
565 le16_to_cpu(BootBuildNumber));
566
567
568 dbg("Downloading new Boot Image");
569
570 firmware = BootImage;
571
572 for (;;) {
573 record = (struct edge_firmware_image_record *)firmware;
574 response = rom_write (edge_serial->serial, le16_to_cpu(record->ExtAddr), le16_to_cpu(record->Addr), le16_to_cpu(record->Len), &record->Data[0]);
575 if (response < 0) {
576 dev_err(&edge_serial->serial->dev->dev, "rom_write failed (%x, %x, %d)\n", le16_to_cpu(record->ExtAddr), le16_to_cpu(record->Addr), le16_to_cpu(record->Len));
577 break;
578 }
579 firmware += sizeof (struct edge_firmware_image_record) + le16_to_cpu(record->Len);
580 if (firmware >= &BootImage[BootSize]) {
581 break;
582 }
583 }
584 } else {
585 dbg("Boot Image -- already up to date");
586 }
587}
588
589
590/************************************************************************
591 * *
592 * Get string descriptor from device *
593 * *
594 ************************************************************************/
595static int get_string (struct usb_device *dev, int Id, char *string)
596{
597 struct usb_string_descriptor StringDesc;
598 struct usb_string_descriptor *pStringDesc;
599
600 dbg("%s - USB String ID = %d", __FUNCTION__, Id );
601
602 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, &StringDesc, sizeof(StringDesc))) {
603 return 0;
604 }
605
606 pStringDesc = kmalloc (StringDesc.bLength, GFP_KERNEL);
607
608 if (!pStringDesc) {
609 return 0;
610 }
611
612 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, pStringDesc, StringDesc.bLength )) {
613 kfree(pStringDesc);
614 return 0;
615 }
616
617 unicode_to_ascii(string, pStringDesc->wData, pStringDesc->bLength/2-1);
618
619 kfree(pStringDesc);
620 return strlen(string);
621}
622
623
624#if 0
625/************************************************************************
626 *
627 * Get string descriptor from device
628 *
629 ************************************************************************/
630static int get_string_desc (struct usb_device *dev, int Id, struct usb_string_descriptor **pRetDesc)
631{
632 struct usb_string_descriptor StringDesc;
633 struct usb_string_descriptor *pStringDesc;
634
635 dbg("%s - USB String ID = %d", __FUNCTION__, Id );
636
637 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, &StringDesc, sizeof(StringDesc))) {
638 return 0;
639 }
640
641 pStringDesc = kmalloc (StringDesc.bLength, GFP_KERNEL);
642
643 if (!pStringDesc) {
644 return -1;
645 }
646
647 if (!usb_get_descriptor(dev, USB_DT_STRING, Id, pStringDesc, StringDesc.bLength )) {
648 kfree(pStringDesc);
649 return -1;
650 }
651
652 *pRetDesc = pStringDesc;
653 return 0;
654}
655#endif
656
657static void get_product_info(struct edgeport_serial *edge_serial)
658{
659 struct edgeport_product_info *product_info = &edge_serial->product_info;
660
661 memset (product_info, 0, sizeof(struct edgeport_product_info));
662
663 product_info->ProductId = (__u16)(le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct) & ~ION_DEVICE_ID_80251_NETCHIP);
664 product_info->NumPorts = edge_serial->manuf_descriptor.NumPorts;
665 product_info->ProdInfoVer = 0;
666
667 product_info->RomSize = edge_serial->manuf_descriptor.RomSize;
668 product_info->RamSize = edge_serial->manuf_descriptor.RamSize;
669 product_info->CpuRev = edge_serial->manuf_descriptor.CpuRev;
670 product_info->BoardRev = edge_serial->manuf_descriptor.BoardRev;
671
672 product_info->BootMajorVersion = edge_serial->boot_descriptor.MajorVersion;
673 product_info->BootMinorVersion = edge_serial->boot_descriptor.MinorVersion;
674 product_info->BootBuildNumber = edge_serial->boot_descriptor.BuildNumber;
675
676 memcpy(product_info->ManufactureDescDate, edge_serial->manuf_descriptor.DescDate, sizeof(edge_serial->manuf_descriptor.DescDate));
677
678 // check if this is 2nd generation hardware
679 if (le16_to_cpu(edge_serial->serial->dev->descriptor.idProduct) & ION_DEVICE_ID_80251_NETCHIP) {
680 product_info->FirmwareMajorVersion = OperationalCodeImageVersion_GEN2.MajorVersion;
681 product_info->FirmwareMinorVersion = OperationalCodeImageVersion_GEN2.MinorVersion;
682 product_info->FirmwareBuildNumber = cpu_to_le16(OperationalCodeImageVersion_GEN2.BuildNumber);
683 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_80251;
684 } else {
685 product_info->FirmwareMajorVersion = OperationalCodeImageVersion_GEN1.MajorVersion;
686 product_info->FirmwareMinorVersion = OperationalCodeImageVersion_GEN1.MinorVersion;
687 product_info->FirmwareBuildNumber = cpu_to_le16(OperationalCodeImageVersion_GEN1.BuildNumber);
688 product_info->iDownloadFile = EDGE_DOWNLOAD_FILE_I930;
689 }
690
691 // Determine Product type and set appropriate flags
692 switch (DEVICE_ID_FROM_USB_PRODUCT_ID(product_info->ProductId)) {
693 case ION_DEVICE_ID_EDGEPORT_COMPATIBLE:
694 case ION_DEVICE_ID_EDGEPORT_4T:
695 case ION_DEVICE_ID_EDGEPORT_4:
696 case ION_DEVICE_ID_EDGEPORT_2:
697 case ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU:
698 case ION_DEVICE_ID_EDGEPORT_8:
699 case ION_DEVICE_ID_EDGEPORT_421:
700 case ION_DEVICE_ID_EDGEPORT_21:
701 case ION_DEVICE_ID_EDGEPORT_2_DIN:
702 case ION_DEVICE_ID_EDGEPORT_4_DIN:
703 case ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU:
704 product_info->IsRS232 = 1;
705 break;
706
707 case ION_DEVICE_ID_EDGEPORT_2I: // Edgeport/2 RS422/RS485
708 product_info->IsRS422 = 1;
709 product_info->IsRS485 = 1;
710 break;
711
712 case ION_DEVICE_ID_EDGEPORT_8I: // Edgeport/4 RS422
713 case ION_DEVICE_ID_EDGEPORT_4I: // Edgeport/4 RS422
714 product_info->IsRS422 = 1;
715 break;
716 }
717
718 // Dump Product Info structure
719 dbg("**Product Information:");
720 dbg(" ProductId %x", product_info->ProductId );
721 dbg(" NumPorts %d", product_info->NumPorts );
722 dbg(" ProdInfoVer %d", product_info->ProdInfoVer );
723 dbg(" IsServer %d", product_info->IsServer);
724 dbg(" IsRS232 %d", product_info->IsRS232 );
725 dbg(" IsRS422 %d", product_info->IsRS422 );
726 dbg(" IsRS485 %d", product_info->IsRS485 );
727 dbg(" RomSize %d", product_info->RomSize );
728 dbg(" RamSize %d", product_info->RamSize );
729 dbg(" CpuRev %x", product_info->CpuRev );
730 dbg(" BoardRev %x", product_info->BoardRev);
731 dbg(" BootMajorVersion %d.%d.%d", product_info->BootMajorVersion,
732 product_info->BootMinorVersion,
733 le16_to_cpu(product_info->BootBuildNumber));
734 dbg(" FirmwareMajorVersion %d.%d.%d", product_info->FirmwareMajorVersion,
735 product_info->FirmwareMinorVersion,
736 le16_to_cpu(product_info->FirmwareBuildNumber));
737 dbg(" ManufactureDescDate %d/%d/%d", product_info->ManufactureDescDate[0],
738 product_info->ManufactureDescDate[1],
739 product_info->ManufactureDescDate[2]+1900);
740 dbg(" iDownloadFile 0x%x", product_info->iDownloadFile);
741
742}
743
744
745/************************************************************************/
746/************************************************************************/
747/* U S B C A L L B A C K F U N C T I O N S */
748/* U S B C A L L B A C K F U N C T I O N S */
749/************************************************************************/
750/************************************************************************/
751
752/*****************************************************************************
753 * edge_interrupt_callback
754 * this is the callback function for when we have received data on the
755 * interrupt endpoint.
756 *****************************************************************************/
757static void edge_interrupt_callback (struct urb *urb, struct pt_regs *regs)
758{
759 struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context;
760 struct edgeport_port *edge_port;
761 struct usb_serial_port *port;
762 unsigned char *data = urb->transfer_buffer;
763 int length = urb->actual_length;
764 int bytes_avail;
765 int position;
766 int txCredits;
767 int portNumber;
768 int result;
769
770 dbg("%s", __FUNCTION__);
771
772 switch (urb->status) {
773 case 0:
774 /* success */
775 break;
776 case -ECONNRESET:
777 case -ENOENT:
778 case -ESHUTDOWN:
779 /* this urb is terminated, clean up */
780 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
781 return;
782 default:
783 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
784 goto exit;
785 }
786
787 // process this interrupt-read even if there are no ports open
788 if (length) {
789 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data);
790
791 if (length > 1) {
792 bytes_avail = data[0] | (data[1] << 8);
793 if (bytes_avail) {
794 spin_lock(&edge_serial->es_lock);
795 edge_serial->rxBytesAvail += bytes_avail;
796 dbg("%s - bytes_avail=%d, rxBytesAvail=%d, read_in_progress=%d", __FUNCTION__, bytes_avail, edge_serial->rxBytesAvail, edge_serial->read_in_progress);
797
798 if (edge_serial->rxBytesAvail > 0 &&
799 !edge_serial->read_in_progress) {
800 dbg("%s - posting a read", __FUNCTION__);
801 edge_serial->read_in_progress = TRUE;
802
803 /* we have pending bytes on the bulk in pipe, send a request */
804 edge_serial->read_urb->dev = edge_serial->serial->dev;
805 result = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC);
806 if (result) {
807 dev_err(&edge_serial->serial->dev->dev, "%s - usb_submit_urb(read bulk) failed with result = %d\n", __FUNCTION__, result);
808 edge_serial->read_in_progress = FALSE;
809 }
810 }
811 spin_unlock(&edge_serial->es_lock);
812 }
813 }
814 /* grab the txcredits for the ports if available */
815 position = 2;
816 portNumber = 0;
817 while ((position < length) && (portNumber < edge_serial->serial->num_ports)) {
818 txCredits = data[position] | (data[position+1] << 8);
819 if (txCredits) {
820 port = edge_serial->serial->port[portNumber];
821 edge_port = usb_get_serial_port_data(port);
822 if (edge_port->open) {
823 spin_lock(&edge_port->ep_lock);
824 edge_port->txCredits += txCredits;
825 spin_unlock(&edge_port->ep_lock);
826 dbg("%s - txcredits for port%d = %d", __FUNCTION__, portNumber, edge_port->txCredits);
827
828 /* tell the tty driver that something has changed */
829 if (edge_port->port->tty)
830 tty_wakeup(edge_port->port->tty);
831
832 // Since we have more credit, check if more data can be sent
833 send_more_port_data(edge_serial, edge_port);
834 }
835 }
836 position += 2;
837 ++portNumber;
838 }
839 }
840
841exit:
842 result = usb_submit_urb (urb, GFP_ATOMIC);
843 if (result) {
844 dev_err(&urb->dev->dev, "%s - Error %d submitting control urb\n", __FUNCTION__, result);
845 }
846}
847
848
849/*****************************************************************************
850 * edge_bulk_in_callback
851 * this is the callback function for when we have received data on the
852 * bulk in endpoint.
853 *****************************************************************************/
854static void edge_bulk_in_callback (struct urb *urb, struct pt_regs *regs)
855{
856 struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context;
857 unsigned char *data = urb->transfer_buffer;
858 int status;
859 __u16 raw_data_length;
860
861 dbg("%s", __FUNCTION__);
862
863 if (urb->status) {
864 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
865 edge_serial->read_in_progress = FALSE;
866 return;
867 }
868
869 if (urb->actual_length == 0) {
870 dbg("%s - read bulk callback with no data", __FUNCTION__);
871 edge_serial->read_in_progress = FALSE;
872 return;
873 }
874
875 raw_data_length = urb->actual_length;
876
877 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, raw_data_length, data);
878
879 spin_lock(&edge_serial->es_lock);
880
881 /* decrement our rxBytes available by the number that we just got */
882 edge_serial->rxBytesAvail -= raw_data_length;
883
884 dbg("%s - Received = %d, rxBytesAvail %d", __FUNCTION__, raw_data_length, edge_serial->rxBytesAvail);
885
886 process_rcvd_data (edge_serial, data, urb->actual_length);
887
888 /* check to see if there's any more data for us to read */
889 if (edge_serial->rxBytesAvail > 0) {
890 dbg("%s - posting a read", __FUNCTION__);
891 edge_serial->read_urb->dev = edge_serial->serial->dev;
892 status = usb_submit_urb(edge_serial->read_urb, GFP_ATOMIC);
893 if (status) {
894 dev_err(&urb->dev->dev, "%s - usb_submit_urb(read bulk) failed, status = %d\n", __FUNCTION__, status);
895 edge_serial->read_in_progress = FALSE;
896 }
897 } else {
898 edge_serial->read_in_progress = FALSE;
899 }
900
901 spin_unlock(&edge_serial->es_lock);
902}
903
904
905/*****************************************************************************
906 * edge_bulk_out_data_callback
907 * this is the callback function for when we have finished sending serial data
908 * on the bulk out endpoint.
909 *****************************************************************************/
910static void edge_bulk_out_data_callback (struct urb *urb, struct pt_regs *regs)
911{
912 struct edgeport_port *edge_port = (struct edgeport_port *)urb->context;
913 struct tty_struct *tty;
914
915 dbg("%s", __FUNCTION__);
916
917 if (urb->status) {
918 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
919 }
920
921 tty = edge_port->port->tty;
922
923 if (tty && edge_port->open) {
924 /* let the tty driver wakeup if it has a special write_wakeup function */
925 tty_wakeup(tty);
926 }
927
928 // Release the Write URB
929 edge_port->write_in_progress = FALSE;
930
931 // Check if more data needs to be sent
932 send_more_port_data((struct edgeport_serial *)(usb_get_serial_data(edge_port->port->serial)), edge_port);
933}
934
935
936/*****************************************************************************
937 * BulkOutCmdCallback
938 * this is the callback function for when we have finished sending a command
939 * on the bulk out endpoint.
940 *****************************************************************************/
941static void edge_bulk_out_cmd_callback (struct urb *urb, struct pt_regs *regs)
942{
943 struct edgeport_port *edge_port = (struct edgeport_port *)urb->context;
944 struct tty_struct *tty;
945 int status = urb->status;
946
947 dbg("%s", __FUNCTION__);
948
949 CmdUrbs--;
950 dbg("%s - FREE URB %p (outstanding %d)", __FUNCTION__, urb, CmdUrbs);
951
952
953 /* clean up the transfer buffer */
954 if (urb->transfer_buffer != NULL) {
955 kfree(urb->transfer_buffer);
956 }
957
958 /* Free the command urb */
959 usb_free_urb (urb);
960
961 if (status) {
962 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, status);
963 return;
964 }
965
966 /* Get pointer to tty */
967 tty = edge_port->port->tty;
968
969 /* tell the tty driver that something has changed */
970 if (tty && edge_port->open)
971 tty_wakeup(tty);
972
973 /* we have completed the command */
974 edge_port->commandPending = FALSE;
975 wake_up(&edge_port->wait_command);
976}
977
978
979/*****************************************************************************
980 * Driver tty interface functions
981 *****************************************************************************/
982
983/*****************************************************************************
984 * SerialOpen
985 * this function is called by the tty driver when a port is opened
986 * If successful, we return 0
987 * Otherwise we return a negative error number.
988 *****************************************************************************/
989static int edge_open (struct usb_serial_port *port, struct file * filp)
990{
991 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
992 struct usb_serial *serial;
993 struct edgeport_serial *edge_serial;
994 int response;
995
996 dbg("%s - port %d", __FUNCTION__, port->number);
997
998 if (edge_port == NULL)
999 return -ENODEV;
1000
1001 if (port->tty)
1002 port->tty->low_latency = low_latency;
1003
1004 /* see if we've set up our endpoint info yet (can't set it up in edge_startup
1005 as the structures were not set up at that time.) */
1006 serial = port->serial;
1007 edge_serial = usb_get_serial_data(serial);
1008 if (edge_serial == NULL) {
1009 return -ENODEV;
1010 }
1011 if (edge_serial->interrupt_in_buffer == NULL) {
1012 struct usb_serial_port *port0 = serial->port[0];
1013
1014 /* not set up yet, so do it now */
1015 edge_serial->interrupt_in_buffer = port0->interrupt_in_buffer;
1016 edge_serial->interrupt_in_endpoint = port0->interrupt_in_endpointAddress;
1017 edge_serial->interrupt_read_urb = port0->interrupt_in_urb;
1018 edge_serial->bulk_in_buffer = port0->bulk_in_buffer;
1019 edge_serial->bulk_in_endpoint = port0->bulk_in_endpointAddress;
1020 edge_serial->read_urb = port0->read_urb;
1021 edge_serial->bulk_out_endpoint = port0->bulk_out_endpointAddress;
1022
1023 /* set up our interrupt urb */
1024 usb_fill_int_urb(edge_serial->interrupt_read_urb,
1025 serial->dev,
1026 usb_rcvintpipe(serial->dev,
1027 port0->interrupt_in_endpointAddress),
1028 port0->interrupt_in_buffer,
1029 edge_serial->interrupt_read_urb->transfer_buffer_length,
1030 edge_interrupt_callback, edge_serial,
1031 edge_serial->interrupt_read_urb->interval);
1032
1033 /* set up our bulk in urb */
1034 usb_fill_bulk_urb(edge_serial->read_urb, serial->dev,
1035 usb_rcvbulkpipe(serial->dev,
1036 port0->bulk_in_endpointAddress),
1037 port0->bulk_in_buffer,
1038 edge_serial->read_urb->transfer_buffer_length,
1039 edge_bulk_in_callback, edge_serial);
1040 edge_serial->read_in_progress = FALSE;
1041
1042 /* start interrupt read for this edgeport
1043 * this interrupt will continue as long as the edgeport is connected */
1044 response = usb_submit_urb (edge_serial->interrupt_read_urb, GFP_KERNEL);
1045 if (response) {
1046 dev_err(&port->dev, "%s - Error %d submitting control urb\n", __FUNCTION__, response);
1047 }
1048 }
1049
1050 /* initialize our wait queues */
1051 init_waitqueue_head(&edge_port->wait_open);
1052 init_waitqueue_head(&edge_port->wait_chase);
1053 init_waitqueue_head(&edge_port->delta_msr_wait);
1054 init_waitqueue_head(&edge_port->wait_command);
1055
1056 /* initialize our icount structure */
1057 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
1058
1059 /* initialize our port settings */
1060 edge_port->txCredits = 0; /* Can't send any data yet */
1061 edge_port->shadowMCR = MCR_MASTER_IE; /* Must always set this bit to enable ints! */
1062 edge_port->chaseResponsePending = FALSE;
1063
1064 /* send a open port command */
1065 edge_port->openPending = TRUE;
1066 edge_port->open = FALSE;
1067 response = send_iosp_ext_cmd (edge_port, IOSP_CMD_OPEN_PORT, 0);
1068
1069 if (response < 0) {
1070 dev_err(&port->dev, "%s - error sending open port command\n", __FUNCTION__);
1071 edge_port->openPending = FALSE;
1072 return -ENODEV;
1073 }
1074
1075 /* now wait for the port to be completely opened */
1076 wait_event_timeout(edge_port->wait_open, (edge_port->openPending != TRUE), OPEN_TIMEOUT);
1077
1078 if (edge_port->open == FALSE) {
1079 /* open timed out */
1080 dbg("%s - open timedout", __FUNCTION__);
1081 edge_port->openPending = FALSE;
1082 return -ENODEV;
1083 }
1084
1085 /* create the txfifo */
1086 edge_port->txfifo.head = 0;
1087 edge_port->txfifo.tail = 0;
1088 edge_port->txfifo.count = 0;
1089 edge_port->txfifo.size = edge_port->maxTxCredits;
1090 edge_port->txfifo.fifo = kmalloc (edge_port->maxTxCredits, GFP_KERNEL);
1091
1092 if (!edge_port->txfifo.fifo) {
1093 dbg("%s - no memory", __FUNCTION__);
1094 edge_close (port, filp);
1095 return -ENOMEM;
1096 }
1097
1098 /* Allocate a URB for the write */
1099 edge_port->write_urb = usb_alloc_urb (0, GFP_KERNEL);
1100 edge_port->write_in_progress = FALSE;
1101
1102 if (!edge_port->write_urb) {
1103 dbg("%s - no memory", __FUNCTION__);
1104 edge_close (port, filp);
1105 return -ENOMEM;
1106 }
1107
1108 dbg("%s(%d) - Initialize TX fifo to %d bytes", __FUNCTION__, port->number, edge_port->maxTxCredits);
1109
1110 dbg("%s exited", __FUNCTION__);
1111
1112 return 0;
1113}
1114
1115
1116/************************************************************************
1117 *
1118 * block_until_chase_response
1119 *
1120 * This function will block the close until one of the following:
1121 * 1. Response to our Chase comes from Edgeport
1122 * 2. A timout of 10 seconds without activity has expired
1123 * (1K of Edgeport data @ 2400 baud ==> 4 sec to empty)
1124 *
1125 ************************************************************************/
1126static void block_until_chase_response(struct edgeport_port *edge_port)
1127{
1128 DEFINE_WAIT(wait);
1129 __u16 lastCredits;
1130 int timeout = 1*HZ;
1131 int loop = 10;
1132
1133 while (1) {
1134 // Save Last credits
1135 lastCredits = edge_port->txCredits;
1136
1137 // Did we get our Chase response
1138 if (edge_port->chaseResponsePending == FALSE) {
1139 dbg("%s - Got Chase Response", __FUNCTION__);
1140
1141 // did we get all of our credit back?
1142 if (edge_port->txCredits == edge_port->maxTxCredits ) {
1143 dbg("%s - Got all credits", __FUNCTION__);
1144 return;
1145 }
1146 }
1147
1148 // Block the thread for a while
1149 prepare_to_wait(&edge_port->wait_chase, &wait, TASK_UNINTERRUPTIBLE);
1150 schedule_timeout(timeout);
1151 finish_wait(&edge_port->wait_chase, &wait);
1152
1153 if (lastCredits == edge_port->txCredits) {
1154 // No activity.. count down.
1155 loop--;
1156 if (loop == 0) {
1157 edge_port->chaseResponsePending = FALSE;
1158 dbg("%s - Chase TIMEOUT", __FUNCTION__);
1159 return;
1160 }
1161 } else {
1162 // Reset timout value back to 10 seconds
1163 dbg("%s - Last %d, Current %d", __FUNCTION__, lastCredits, edge_port->txCredits);
1164 loop = 10;
1165 }
1166 }
1167}
1168
1169
1170/************************************************************************
1171 *
1172 * block_until_tx_empty
1173 *
1174 * This function will block the close until one of the following:
1175 * 1. TX count are 0
1176 * 2. The edgeport has stopped
1177 * 3. A timout of 3 seconds without activity has expired
1178 *
1179 ************************************************************************/
1180static void block_until_tx_empty (struct edgeport_port *edge_port)
1181{
1182 DEFINE_WAIT(wait);
1183 struct TxFifo *fifo = &edge_port->txfifo;
1184 __u32 lastCount;
1185 int timeout = HZ/10;
1186 int loop = 30;
1187
1188 while (1) {
1189 // Save Last count
1190 lastCount = fifo->count;
1191
1192 // Is the Edgeport Buffer empty?
1193 if (lastCount == 0) {
1194 dbg("%s - TX Buffer Empty", __FUNCTION__);
1195 return;
1196 }
1197
1198 // Block the thread for a while
1199 prepare_to_wait (&edge_port->wait_chase, &wait, TASK_UNINTERRUPTIBLE);
1200 schedule_timeout(timeout);
1201 finish_wait(&edge_port->wait_chase, &wait);
1202
1203 dbg("%s wait", __FUNCTION__);
1204
1205 if (lastCount == fifo->count) {
1206 // No activity.. count down.
1207 loop--;
1208 if (loop == 0) {
1209 dbg("%s - TIMEOUT", __FUNCTION__);
1210 return;
1211 }
1212 } else {
1213 // Reset timout value back to seconds
1214 loop = 30;
1215 }
1216 }
1217}
1218
1219
1220/*****************************************************************************
1221 * edge_close
1222 * this function is called by the tty driver when a port is closed
1223 *****************************************************************************/
1224static void edge_close (struct usb_serial_port *port, struct file * filp)
1225{
1226 struct edgeport_serial *edge_serial;
1227 struct edgeport_port *edge_port;
1228 int status;
1229
1230 dbg("%s - port %d", __FUNCTION__, port->number);
1231
1232 edge_serial = usb_get_serial_data(port->serial);
1233 edge_port = usb_get_serial_port_data(port);
1234 if ((edge_serial == NULL) || (edge_port == NULL))
1235 return;
1236
1237 // block until tx is empty
1238 block_until_tx_empty(edge_port);
1239
1240 edge_port->closePending = TRUE;
1241
1242 /* flush and chase */
1243 edge_port->chaseResponsePending = TRUE;
1244
1245 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __FUNCTION__);
1246 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0);
1247 if (status == 0) {
1248 // block until chase finished
1249 block_until_chase_response(edge_port);
1250 } else {
1251 edge_port->chaseResponsePending = FALSE;
1252 }
1253
1254 /* close the port */
1255 dbg("%s - Sending IOSP_CMD_CLOSE_PORT", __FUNCTION__);
1256 send_iosp_ext_cmd (edge_port, IOSP_CMD_CLOSE_PORT, 0);
1257
1258 //port->close = TRUE;
1259 edge_port->closePending = FALSE;
1260 edge_port->open = FALSE;
1261 edge_port->openPending = FALSE;
1262
1263 if (edge_port->write_urb) {
1264 usb_kill_urb(edge_port->write_urb);
1265 }
1266
1267 if (edge_port->write_urb) {
1268 /* if this urb had a transfer buffer already (old transfer) free it */
1269 if (edge_port->write_urb->transfer_buffer != NULL) {
1270 kfree(edge_port->write_urb->transfer_buffer);
1271 }
1272 usb_free_urb (edge_port->write_urb);
1273 edge_port->write_urb = NULL;
1274 }
1275 if (edge_port->txfifo.fifo) {
1276 kfree(edge_port->txfifo.fifo);
1277 edge_port->txfifo.fifo = NULL;
1278 }
1279
1280 dbg("%s exited", __FUNCTION__);
1281}
1282
1283/*****************************************************************************
1284 * SerialWrite
1285 * this function is called by the tty driver when data should be written to
1286 * the port.
1287 * If successful, we return the number of bytes written, otherwise we return
1288 * a negative error number.
1289 *****************************************************************************/
1290static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count)
1291{
1292 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1293 struct TxFifo *fifo;
1294 int copySize;
1295 int bytesleft;
1296 int firsthalf;
1297 int secondhalf;
1298 unsigned long flags;
1299
1300 dbg("%s - port %d", __FUNCTION__, port->number);
1301
1302 if (edge_port == NULL)
1303 return -ENODEV;
1304
1305 // get a pointer to the Tx fifo
1306 fifo = &edge_port->txfifo;
1307
1308 spin_lock_irqsave(&edge_port->ep_lock, flags);
1309
1310 // calculate number of bytes to put in fifo
1311 copySize = min ((unsigned int)count, (edge_port->txCredits - fifo->count));
1312
1313 dbg("%s(%d) of %d byte(s) Fifo room %d -- will copy %d bytes", __FUNCTION__,
1314 port->number, count, edge_port->txCredits - fifo->count, copySize);
1315
1316 /* catch writes of 0 bytes which the tty driver likes to give us, and when txCredits is empty */
1317 if (copySize == 0) {
1318 dbg("%s - copySize = Zero", __FUNCTION__);
1319 goto finish_write;
1320 }
1321
1322 // queue the data
1323 // since we can never overflow the buffer we do not have to check for full condition
1324
1325 // the copy is done is two parts -- first fill to the end of the buffer
1326 // then copy the reset from the start of the buffer
1327
1328 bytesleft = fifo->size - fifo->head;
1329 firsthalf = min (bytesleft, copySize);
1330 dbg("%s - copy %d bytes of %d into fifo ", __FUNCTION__, firsthalf, bytesleft);
1331
1332 /* now copy our data */
1333 memcpy(&fifo->fifo[fifo->head], data, firsthalf);
1334 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, firsthalf, &fifo->fifo[fifo->head]);
1335
1336 // update the index and size
1337 fifo->head += firsthalf;
1338 fifo->count += firsthalf;
1339
1340 // wrap the index
1341 if (fifo->head == fifo->size) {
1342 fifo->head = 0;
1343 }
1344
1345 secondhalf = copySize-firsthalf;
1346
1347 if (secondhalf) {
1348 dbg("%s - copy rest of data %d", __FUNCTION__, secondhalf);
1349 memcpy(&fifo->fifo[fifo->head], &data[firsthalf], secondhalf);
1350 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, secondhalf, &fifo->fifo[fifo->head]);
1351 // update the index and size
1352 fifo->count += secondhalf;
1353 fifo->head += secondhalf;
1354 // No need to check for wrap since we can not get to end of fifo in this part
1355 }
1356
1357finish_write:
1358 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1359
1360 send_more_port_data((struct edgeport_serial *)usb_get_serial_data(port->serial), edge_port);
1361
1362 dbg("%s wrote %d byte(s) TxCredits %d, Fifo %d", __FUNCTION__, copySize, edge_port->txCredits, fifo->count);
1363
1364 return copySize;
1365}
1366
1367
1368/************************************************************************
1369 *
1370 * send_more_port_data()
1371 *
1372 * This routine attempts to write additional UART transmit data
1373 * to a port over the USB bulk pipe. It is called (1) when new
1374 * data has been written to a port's TxBuffer from higher layers
1375 * (2) when the peripheral sends us additional TxCredits indicating
1376 * that it can accept more Tx data for a given port; and (3) when
1377 * a bulk write completes successfully and we want to see if we
1378 * can transmit more.
1379 *
1380 ************************************************************************/
1381static void send_more_port_data(struct edgeport_serial *edge_serial, struct edgeport_port *edge_port)
1382{
1383 struct TxFifo *fifo = &edge_port->txfifo;
1384 struct urb *urb;
1385 unsigned char *buffer;
1386 int status;
1387 int count;
1388 int bytesleft;
1389 int firsthalf;
1390 int secondhalf;
1391 unsigned long flags;
1392
1393 dbg("%s(%d)", __FUNCTION__, edge_port->port->number);
1394
1395 spin_lock_irqsave(&edge_port->ep_lock, flags);
1396
1397 if (edge_port->write_in_progress ||
1398 !edge_port->open ||
1399 (fifo->count == 0)) {
1400 dbg("%s(%d) EXIT - fifo %d, PendingWrite = %d", __FUNCTION__, edge_port->port->number, fifo->count, edge_port->write_in_progress);
1401 goto exit_send;
1402 }
1403
1404 // since the amount of data in the fifo will always fit into the
1405 // edgeport buffer we do not need to check the write length
1406
1407 // Do we have enough credits for this port to make it worthwhile
1408 // to bother queueing a write. If it's too small, say a few bytes,
1409 // it's better to wait for more credits so we can do a larger
1410 // write.
1411 if (edge_port->txCredits < EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(edge_port->maxTxCredits,EDGE_FW_BULK_MAX_PACKET_SIZE)) {
1412 dbg("%s(%d) Not enough credit - fifo %d TxCredit %d", __FUNCTION__, edge_port->port->number, fifo->count, edge_port->txCredits );
1413 goto exit_send;
1414 }
1415
1416 // lock this write
1417 edge_port->write_in_progress = TRUE;
1418
1419 // get a pointer to the write_urb
1420 urb = edge_port->write_urb;
1421
1422 /* if this urb had a transfer buffer already (old transfer) free it */
1423 if (urb->transfer_buffer != NULL) {
1424 kfree(urb->transfer_buffer);
1425 urb->transfer_buffer = NULL;
1426 }
1427
1428 /* build the data header for the buffer and port that we are about to send out */
1429 count = fifo->count;
1430 buffer = kmalloc (count+2, GFP_ATOMIC);
1431 if (buffer == NULL) {
1432 dev_err(&edge_port->port->dev, "%s - no more kernel memory...\n", __FUNCTION__);
1433 edge_port->write_in_progress = FALSE;
1434 goto exit_send;
1435 }
1436 buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number - edge_port->port->serial->minor, count);
1437 buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number - edge_port->port->serial->minor, count);
1438
1439 /* now copy our data */
1440 bytesleft = fifo->size - fifo->tail;
1441 firsthalf = min (bytesleft, count);
1442 memcpy(&buffer[2], &fifo->fifo[fifo->tail], firsthalf);
1443 fifo->tail += firsthalf;
1444 fifo->count -= firsthalf;
1445 if (fifo->tail == fifo->size) {
1446 fifo->tail = 0;
1447 }
1448
1449 secondhalf = count-firsthalf;
1450 if (secondhalf) {
1451 memcpy(&buffer[2+firsthalf], &fifo->fifo[fifo->tail], secondhalf);
1452 fifo->tail += secondhalf;
1453 fifo->count -= secondhalf;
1454 }
1455
1456 if (count)
1457 usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, count, &buffer[2]);
1458
1459 /* fill up the urb with all of our data and submit it */
1460 usb_fill_bulk_urb (urb, edge_serial->serial->dev,
1461 usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint),
1462 buffer, count+2, edge_bulk_out_data_callback, edge_port);
1463
1464 /* decrement the number of credits we have by the number we just sent */
1465 edge_port->txCredits -= count;
1466 edge_port->icount.tx += count;
1467
1468 urb->dev = edge_serial->serial->dev;
1469 status = usb_submit_urb(urb, GFP_ATOMIC);
1470 if (status) {
1471 /* something went wrong */
1472 dev_err(&edge_port->port->dev, "%s - usb_submit_urb(write bulk) failed, status = %d, data lost\n", __FUNCTION__, status);
1473 edge_port->write_in_progress = FALSE;
1474
1475 /* revert the credits as something bad happened. */
1476 edge_port->txCredits += count;
1477 edge_port->icount.tx -= count;
1478 }
1479 dbg("%s wrote %d byte(s) TxCredit %d, Fifo %d", __FUNCTION__, count, edge_port->txCredits, fifo->count);
1480
1481exit_send:
1482 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1483}
1484
1485
1486/*****************************************************************************
1487 * edge_write_room
1488 * this function is called by the tty driver when it wants to know how many
1489 * bytes of data we can accept for a specific port.
1490 * If successful, we return the amount of room that we have for this port
1491 * (the txCredits),
1492 * Otherwise we return a negative error number.
1493 *****************************************************************************/
1494static int edge_write_room (struct usb_serial_port *port)
1495{
1496 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1497 int room;
1498 unsigned long flags;
1499
1500 dbg("%s", __FUNCTION__);
1501
1502 if (edge_port == NULL)
1503 return -ENODEV;
1504 if (edge_port->closePending == TRUE)
1505 return -ENODEV;
1506
1507 dbg("%s - port %d", __FUNCTION__, port->number);
1508
1509 if (!edge_port->open) {
1510 dbg("%s - port not opened", __FUNCTION__);
1511 return -EINVAL;
1512 }
1513
1514 // total of both buffers is still txCredit
1515 spin_lock_irqsave(&edge_port->ep_lock, flags);
1516 room = edge_port->txCredits - edge_port->txfifo.count;
1517 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1518
1519 dbg("%s - returns %d", __FUNCTION__, room);
1520 return room;
1521}
1522
1523
1524/*****************************************************************************
1525 * edge_chars_in_buffer
1526 * this function is called by the tty driver when it wants to know how many
1527 * bytes of data we currently have outstanding in the port (data that has
1528 * been written, but hasn't made it out the port yet)
1529 * If successful, we return the number of bytes left to be written in the
1530 * system,
1531 * Otherwise we return a negative error number.
1532 *****************************************************************************/
1533static int edge_chars_in_buffer (struct usb_serial_port *port)
1534{
1535 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1536 int num_chars;
1537 unsigned long flags;
1538
1539 dbg("%s", __FUNCTION__);
1540
1541 if (edge_port == NULL)
1542 return -ENODEV;
1543 if (edge_port->closePending == TRUE)
1544 return -ENODEV;
1545
1546 if (!edge_port->open) {
1547 dbg("%s - port not opened", __FUNCTION__);
1548 return -EINVAL;
1549 }
1550
1551 spin_lock_irqsave(&edge_port->ep_lock, flags);
1552 num_chars = edge_port->maxTxCredits - edge_port->txCredits + edge_port->txfifo.count;
1553 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1554 if (num_chars) {
1555 dbg("%s(port %d) - returns %d", __FUNCTION__, port->number, num_chars);
1556 }
1557
1558 return num_chars;
1559}
1560
1561
1562/*****************************************************************************
1563 * SerialThrottle
1564 * this function is called by the tty driver when it wants to stop the data
1565 * being read from the port.
1566 *****************************************************************************/
1567static void edge_throttle (struct usb_serial_port *port)
1568{
1569 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1570 struct tty_struct *tty;
1571 int status;
1572
1573 dbg("%s - port %d", __FUNCTION__, port->number);
1574
1575 if (edge_port == NULL)
1576 return;
1577
1578 if (!edge_port->open) {
1579 dbg("%s - port not opened", __FUNCTION__);
1580 return;
1581 }
1582
1583 tty = port->tty;
1584 if (!tty) {
1585 dbg ("%s - no tty available", __FUNCTION__);
1586 return;
1587 }
1588
1589 /* if we are implementing XON/XOFF, send the stop character */
1590 if (I_IXOFF(tty)) {
1591 unsigned char stop_char = STOP_CHAR(tty);
1592 status = edge_write (port, &stop_char, 1);
1593 if (status <= 0) {
1594 return;
1595 }
1596 }
1597
1598 /* if we are implementing RTS/CTS, toggle that line */
1599 if (tty->termios->c_cflag & CRTSCTS) {
1600 edge_port->shadowMCR &= ~MCR_RTS;
1601 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR);
1602 if (status != 0) {
1603 return;
1604 }
1605 }
1606
1607 return;
1608}
1609
1610
1611/*****************************************************************************
1612 * edge_unthrottle
1613 * this function is called by the tty driver when it wants to resume the data
1614 * being read from the port (called after SerialThrottle is called)
1615 *****************************************************************************/
1616static void edge_unthrottle (struct usb_serial_port *port)
1617{
1618 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1619 struct tty_struct *tty;
1620 int status;
1621
1622 dbg("%s - port %d", __FUNCTION__, port->number);
1623
1624 if (edge_port == NULL)
1625 return;
1626
1627 if (!edge_port->open) {
1628 dbg("%s - port not opened", __FUNCTION__);
1629 return;
1630 }
1631
1632 tty = port->tty;
1633 if (!tty) {
1634 dbg ("%s - no tty available", __FUNCTION__);
1635 return;
1636 }
1637
1638 /* if we are implementing XON/XOFF, send the start character */
1639 if (I_IXOFF(tty)) {
1640 unsigned char start_char = START_CHAR(tty);
1641 status = edge_write (port, &start_char, 1);
1642 if (status <= 0) {
1643 return;
1644 }
1645 }
1646
1647 /* if we are implementing RTS/CTS, toggle that line */
1648 if (tty->termios->c_cflag & CRTSCTS) {
1649 edge_port->shadowMCR |= MCR_RTS;
1650 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR);
1651 if (status != 0) {
1652 return;
1653 }
1654 }
1655
1656 return;
1657}
1658
1659
1660/*****************************************************************************
1661 * SerialSetTermios
1662 * this function is called by the tty driver when it wants to change the termios structure
1663 *****************************************************************************/
1664static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios)
1665{
1666 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1667 struct tty_struct *tty = port->tty;
1668 unsigned int cflag;
1669
1670 if (!port->tty || !port->tty->termios) {
1671 dbg ("%s - no tty or termios", __FUNCTION__);
1672 return;
1673 }
1674
1675 cflag = tty->termios->c_cflag;
1676 /* check that they really want us to change something */
1677 if (old_termios) {
1678 if (cflag == old_termios->c_cflag &&
1679 tty->termios->c_iflag == old_termios->c_iflag) {
1680 dbg("%s - nothing to change", __FUNCTION__);
1681 return;
1682 }
1683 }
1684
1685 dbg("%s - clfag %08x iflag %08x", __FUNCTION__,
1686 tty->termios->c_cflag, tty->termios->c_iflag);
1687 if (old_termios) {
1688 dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__,
1689 old_termios->c_cflag, old_termios->c_iflag);
1690 }
1691
1692 dbg("%s - port %d", __FUNCTION__, port->number);
1693
1694 if (edge_port == NULL)
1695 return;
1696
1697 if (!edge_port->open) {
1698 dbg("%s - port not opened", __FUNCTION__);
1699 return;
1700 }
1701
1702 /* change the port settings to the new ones specified */
1703 change_port_settings (edge_port, old_termios);
1704
1705 return;
1706}
1707
1708
1709/*****************************************************************************
1710 * get_lsr_info - get line status register info
1711 *
1712 * Purpose: Let user call ioctl() to get info when the UART physically
1713 * is emptied. On bus types like RS485, the transmitter must
1714 * release the bus after transmitting. This must be done when
1715 * the transmit shift register is empty, not be done when the
1716 * transmit holding register is empty. This functionality
1717 * allows an RS485 driver to be written in user space.
1718 *****************************************************************************/
1719static int get_lsr_info(struct edgeport_port *edge_port, unsigned int __user *value)
1720{
1721 unsigned int result = 0;
1722 unsigned long flags;
1723
1724 spin_lock_irqsave(&edge_port->ep_lock, flags);
1725 if (edge_port->maxTxCredits == edge_port->txCredits &&
1726 edge_port->txfifo.count == 0) {
1727 dbg("%s -- Empty", __FUNCTION__);
1728 result = TIOCSER_TEMT;
1729 }
1730 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
1731
1732 if (copy_to_user(value, &result, sizeof(int)))
1733 return -EFAULT;
1734 return 0;
1735}
1736
1737static int get_number_bytes_avail(struct edgeport_port *edge_port, unsigned int __user *value)
1738{
1739 unsigned int result = 0;
1740 struct tty_struct *tty = edge_port->port->tty;
1741
1742 if (!tty)
1743 return -ENOIOCTLCMD;
1744
1745 result = tty->read_cnt;
1746
1747 dbg("%s(%d) = %d", __FUNCTION__, edge_port->port->number, result);
1748 if (copy_to_user(value, &result, sizeof(int)))
1749 return -EFAULT;
1750 //return 0;
1751 return -ENOIOCTLCMD;
1752}
1753
1754static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear)
1755{
1756 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1757 unsigned int mcr;
1758
1759 dbg("%s - port %d", __FUNCTION__, port->number);
1760
1761 mcr = edge_port->shadowMCR;
1762 if (set & TIOCM_RTS)
1763 mcr |= MCR_RTS;
1764 if (set & TIOCM_DTR)
1765 mcr |= MCR_DTR;
1766 if (set & TIOCM_LOOP)
1767 mcr |= MCR_LOOPBACK;
1768
1769 if (clear & TIOCM_RTS)
1770 mcr &= ~MCR_RTS;
1771 if (clear & TIOCM_DTR)
1772 mcr &= ~MCR_DTR;
1773 if (clear & TIOCM_LOOP)
1774 mcr &= ~MCR_LOOPBACK;
1775
1776 edge_port->shadowMCR = mcr;
1777
1778 send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR);
1779
1780 return 0;
1781}
1782
1783static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
1784{
1785 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1786 unsigned int result = 0;
1787 unsigned int msr;
1788 unsigned int mcr;
1789
1790 dbg("%s - port %d", __FUNCTION__, port->number);
1791
1792 msr = edge_port->shadowMSR;
1793 mcr = edge_port->shadowMCR;
1794 result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */
1795 | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */
1796 | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */
1797 | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */
1798 | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */
1799 | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */
1800
1801
1802 dbg("%s -- %x", __FUNCTION__, result);
1803
1804 return result;
1805}
1806
1807static int get_serial_info(struct edgeport_port *edge_port, struct serial_struct __user *retinfo)
1808{
1809 struct serial_struct tmp;
1810
1811 if (!retinfo)
1812 return -EFAULT;
1813
1814 memset(&tmp, 0, sizeof(tmp));
1815
1816 tmp.type = PORT_16550A;
1817 tmp.line = edge_port->port->serial->minor;
1818 tmp.port = edge_port->port->number;
1819 tmp.irq = 0;
1820 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
1821 tmp.xmit_fifo_size = edge_port->maxTxCredits;
1822 tmp.baud_base = 9600;
1823 tmp.close_delay = 5*HZ;
1824 tmp.closing_wait = 30*HZ;
1825// tmp.custom_divisor = state->custom_divisor;
1826// tmp.hub6 = state->hub6;
1827// tmp.io_type = state->io_type;
1828
1829 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1830 return -EFAULT;
1831 return 0;
1832}
1833
1834
1835
1836/*****************************************************************************
1837 * SerialIoctl
1838 * this function handles any ioctl calls to the driver
1839 *****************************************************************************/
1840static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
1841{
1842 DEFINE_WAIT(wait);
1843 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1844 struct async_icount cnow;
1845 struct async_icount cprev;
1846 struct serial_icounter_struct icount;
1847
1848 dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd);
1849
1850 switch (cmd) {
1851 // return number of bytes available
1852 case TIOCINQ:
1853 dbg("%s (%d) TIOCINQ", __FUNCTION__, port->number);
1854 return get_number_bytes_avail(edge_port, (unsigned int __user *) arg);
1855 break;
1856
1857 case TIOCSERGETLSR:
1858 dbg("%s (%d) TIOCSERGETLSR", __FUNCTION__, port->number);
1859 return get_lsr_info(edge_port, (unsigned int __user *) arg);
1860 return 0;
1861
1862 case TIOCGSERIAL:
1863 dbg("%s (%d) TIOCGSERIAL", __FUNCTION__, port->number);
1864 return get_serial_info(edge_port, (struct serial_struct __user *) arg);
1865
1866 case TIOCSSERIAL:
1867 dbg("%s (%d) TIOCSSERIAL", __FUNCTION__, port->number);
1868 break;
1869
1870 case TIOCMIWAIT:
1871 dbg("%s (%d) TIOCMIWAIT", __FUNCTION__, port->number);
1872 cprev = edge_port->icount;
1873 while (1) {
1874 prepare_to_wait(&edge_port->delta_msr_wait, &wait, TASK_INTERRUPTIBLE);
1875 schedule();
1876 finish_wait(&edge_port->delta_msr_wait, &wait);
1877 /* see if a signal did it */
1878 if (signal_pending(current))
1879 return -ERESTARTSYS;
1880 cnow = edge_port->icount;
1881 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
1882 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
1883 return -EIO; /* no change => error */
1884 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1885 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1886 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1887 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
1888 return 0;
1889 }
1890 cprev = cnow;
1891 }
1892 /* NOTREACHED */
1893 break;
1894
1895 case TIOCGICOUNT:
1896 cnow = edge_port->icount;
1897 memset(&icount, 0, sizeof(icount));
1898 icount.cts = cnow.cts;
1899 icount.dsr = cnow.dsr;
1900 icount.rng = cnow.rng;
1901 icount.dcd = cnow.dcd;
1902 icount.rx = cnow.rx;
1903 icount.tx = cnow.tx;
1904 icount.frame = cnow.frame;
1905 icount.overrun = cnow.overrun;
1906 icount.parity = cnow.parity;
1907 icount.brk = cnow.brk;
1908 icount.buf_overrun = cnow.buf_overrun;
1909
1910 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, port->number, icount.rx, icount.tx );
1911 if (copy_to_user((void __user *)arg, &icount, sizeof(icount)))
1912 return -EFAULT;
1913 return 0;
1914 }
1915
1916 return -ENOIOCTLCMD;
1917}
1918
1919
1920/*****************************************************************************
1921 * SerialBreak
1922 * this function sends a break to the port
1923 *****************************************************************************/
1924static void edge_break (struct usb_serial_port *port, int break_state)
1925{
1926 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1927 int status;
1928
1929 /* flush and chase */
1930 edge_port->chaseResponsePending = TRUE;
1931
1932 dbg("%s - Sending IOSP_CMD_CHASE_PORT", __FUNCTION__);
1933 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CHASE_PORT, 0);
1934 if (status == 0) {
1935 // block until chase finished
1936 block_until_chase_response(edge_port);
1937 } else {
1938 edge_port->chaseResponsePending = FALSE;
1939 }
1940
1941 if (break_state == -1) {
1942 dbg("%s - Sending IOSP_CMD_SET_BREAK", __FUNCTION__);
1943 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_BREAK, 0);
1944 } else {
1945 dbg("%s - Sending IOSP_CMD_CLEAR_BREAK", __FUNCTION__);
1946 status = send_iosp_ext_cmd (edge_port, IOSP_CMD_CLEAR_BREAK, 0);
1947 }
1948 if (status) {
1949 dbg("%s - error sending break set/clear command.", __FUNCTION__);
1950 }
1951
1952 return;
1953}
1954
1955
1956/*****************************************************************************
1957 * process_rcvd_data
1958 * this function handles the data received on the bulk in pipe.
1959 *****************************************************************************/
1960static void process_rcvd_data (struct edgeport_serial *edge_serial, unsigned char * buffer, __u16 bufferLength)
1961{
1962 struct usb_serial_port *port;
1963 struct edgeport_port *edge_port;
1964 struct tty_struct *tty;
1965 __u16 lastBufferLength;
1966 __u16 rxLen;
1967
1968 dbg("%s", __FUNCTION__);
1969
1970 lastBufferLength = bufferLength + 1;
1971
1972 while (bufferLength > 0) {
1973 /* failsafe incase we get a message that we don't understand */
1974 if (lastBufferLength == bufferLength) {
1975 dbg("%s - stuck in loop, exiting it.", __FUNCTION__);
1976 break;
1977 }
1978 lastBufferLength = bufferLength;
1979
1980 switch (edge_serial->rxState) {
1981 case EXPECT_HDR1:
1982 edge_serial->rxHeader1 = *buffer;
1983 ++buffer;
1984 --bufferLength;
1985
1986 if (bufferLength == 0) {
1987 edge_serial->rxState = EXPECT_HDR2;
1988 break;
1989 }
1990 /* otherwise, drop on through */
1991
1992 case EXPECT_HDR2:
1993 edge_serial->rxHeader2 = *buffer;
1994 ++buffer;
1995 --bufferLength;
1996
1997 dbg("%s - Hdr1=%02X Hdr2=%02X", __FUNCTION__, edge_serial->rxHeader1, edge_serial->rxHeader2);
1998
1999 // Process depending on whether this header is
2000 // data or status
2001
2002 if (IS_CMD_STAT_HDR(edge_serial->rxHeader1)) {
2003 // Decode this status header and goto EXPECT_HDR1 (if we
2004 // can process the status with only 2 bytes), or goto
2005 // EXPECT_HDR3 to get the third byte.
2006
2007 edge_serial->rxPort = IOSP_GET_HDR_PORT(edge_serial->rxHeader1);
2008 edge_serial->rxStatusCode = IOSP_GET_STATUS_CODE(edge_serial->rxHeader1);
2009
2010 if (!IOSP_STATUS_IS_2BYTE(edge_serial->rxStatusCode)) {
2011 // This status needs additional bytes. Save what we have
2012 // and then wait for more data.
2013 edge_serial->rxStatusParam = edge_serial->rxHeader2;
2014
2015 edge_serial->rxState = EXPECT_HDR3;
2016 break;
2017 }
2018
2019 // We have all the header bytes, process the status now
2020 process_rcvd_status (edge_serial, edge_serial->rxHeader2, 0);
2021 edge_serial->rxState = EXPECT_HDR1;
2022 break;
2023 } else {
2024 edge_serial->rxPort = IOSP_GET_HDR_PORT(edge_serial->rxHeader1);
2025 edge_serial->rxBytesRemaining = IOSP_GET_HDR_DATA_LEN(edge_serial->rxHeader1, edge_serial->rxHeader2);
2026
2027 dbg("%s - Data for Port %u Len %u", __FUNCTION__, edge_serial->rxPort, edge_serial->rxBytesRemaining);
2028
2029 //ASSERT( DevExt->RxPort < DevExt->NumPorts );
2030 //ASSERT( DevExt->RxBytesRemaining < IOSP_MAX_DATA_LENGTH );
2031
2032 if (bufferLength == 0 ) {
2033 edge_serial->rxState = EXPECT_DATA;
2034 break;
2035 }
2036 // Else, drop through
2037 }
2038
2039 case EXPECT_DATA: // Expect data
2040
2041 if (bufferLength < edge_serial->rxBytesRemaining) {
2042 rxLen = bufferLength;
2043 edge_serial->rxState = EXPECT_DATA; // Expect data to start next buffer
2044 } else {
2045 // BufLen >= RxBytesRemaining
2046 rxLen = edge_serial->rxBytesRemaining;
2047 edge_serial->rxState = EXPECT_HDR1; // Start another header next time
2048 }
2049
2050 bufferLength -= rxLen;
2051 edge_serial->rxBytesRemaining -= rxLen;
2052
2053 /* spit this data back into the tty driver if this port is open */
2054 if (rxLen) {
2055 port = edge_serial->serial->port[edge_serial->rxPort];
2056 edge_port = usb_get_serial_port_data(port);
2057 if (edge_port->open) {
2058 tty = edge_port->port->tty;
2059 if (tty) {
2060 dbg("%s - Sending %d bytes to TTY for port %d", __FUNCTION__, rxLen, edge_serial->rxPort);
2061 edge_tty_recv(&edge_serial->serial->dev->dev, tty, buffer, rxLen);
2062 }
2063 edge_port->icount.rx += rxLen;
2064 }
2065 buffer += rxLen;
2066 }
2067
2068 break;
2069
2070 case EXPECT_HDR3: // Expect 3rd byte of status header
2071 edge_serial->rxHeader3 = *buffer;
2072 ++buffer;
2073 --bufferLength;
2074
2075 // We have all the header bytes, process the status now
2076 process_rcvd_status (edge_serial, edge_serial->rxStatusParam, edge_serial->rxHeader3);
2077 edge_serial->rxState = EXPECT_HDR1;
2078 break;
2079
2080 }
2081 }
2082}
2083
2084
2085/*****************************************************************************
2086 * process_rcvd_status
2087 * this function handles the any status messages received on the bulk in pipe.
2088 *****************************************************************************/
2089static void process_rcvd_status (struct edgeport_serial *edge_serial, __u8 byte2, __u8 byte3)
2090{
2091 struct usb_serial_port *port;
2092 struct edgeport_port *edge_port;
2093 __u8 code = edge_serial->rxStatusCode;
2094
2095 /* switch the port pointer to the one being currently talked about */
2096 port = edge_serial->serial->port[edge_serial->rxPort];
2097 edge_port = usb_get_serial_port_data(port);
2098 if (edge_port == NULL) {
2099 dev_err(&edge_serial->serial->dev->dev, "%s - edge_port == NULL for port %d\n", __FUNCTION__, edge_serial->rxPort);
2100 return;
2101 }
2102
2103 dbg("%s - port %d", __FUNCTION__, edge_serial->rxPort);
2104
2105 if (code == IOSP_EXT_STATUS) {
2106 switch (byte2) {
2107 case IOSP_EXT_STATUS_CHASE_RSP:
2108 // we want to do EXT status regardless of port open/closed
2109 dbg("%s - Port %u EXT CHASE_RSP Data = %02x", __FUNCTION__, edge_serial->rxPort, byte3 );
2110 // Currently, the only EXT_STATUS is Chase, so process here instead of one more call
2111 // to one more subroutine. If/when more EXT_STATUS, there'll be more work to do.
2112 // Also, we currently clear flag and close the port regardless of content of above's Byte3.
2113 // We could choose to do something else when Byte3 says Timeout on Chase from Edgeport,
2114 // like wait longer in block_until_chase_response, but for now we don't.
2115 edge_port->chaseResponsePending = FALSE;
2116 wake_up (&edge_port->wait_chase);
2117 return;
2118
2119 case IOSP_EXT_STATUS_RX_CHECK_RSP:
2120 dbg("%s ========== Port %u CHECK_RSP Sequence = %02x =============\n", __FUNCTION__, edge_serial->rxPort, byte3 );
2121 //Port->RxCheckRsp = TRUE;
2122 return;
2123 }
2124 }
2125
2126 if (code == IOSP_STATUS_OPEN_RSP) {
2127 edge_port->txCredits = GET_TX_BUFFER_SIZE(byte3);
2128 edge_port->maxTxCredits = edge_port->txCredits;
2129 dbg("%s - Port %u Open Response Inital MSR = %02x TxBufferSize = %d", __FUNCTION__, edge_serial->rxPort, byte2, edge_port->txCredits);
2130 handle_new_msr (edge_port, byte2);
2131
2132 /* send the current line settings to the port so we are in sync with any further termios calls */
2133 if (edge_port->port->tty)
2134 change_port_settings (edge_port, edge_port->port->tty->termios);
2135
2136 /* we have completed the open */
2137 edge_port->openPending = FALSE;
2138 edge_port->open = TRUE;
2139 wake_up(&edge_port->wait_open);
2140 return;
2141 }
2142
2143 // If port is closed, silently discard all rcvd status. We can
2144 // have cases where buffered status is received AFTER the close
2145 // port command is sent to the Edgeport.
2146 if ((!edge_port->open ) || (edge_port->closePending)) {
2147 return;
2148 }
2149
2150 switch (code) {
2151 // Not currently sent by Edgeport
2152 case IOSP_STATUS_LSR:
2153 dbg("%s - Port %u LSR Status = %02x", __FUNCTION__, edge_serial->rxPort, byte2);
2154 handle_new_lsr (edge_port, FALSE, byte2, 0);
2155 break;
2156
2157 case IOSP_STATUS_LSR_DATA:
2158 dbg("%s - Port %u LSR Status = %02x, Data = %02x", __FUNCTION__, edge_serial->rxPort, byte2, byte3);
2159 // byte2 is LSR Register
2160 // byte3 is broken data byte
2161 handle_new_lsr (edge_port, TRUE, byte2, byte3);
2162 break;
2163 //
2164 // case IOSP_EXT_4_STATUS:
2165 // dbg("%s - Port %u LSR Status = %02x Data = %02x", __FUNCTION__, edge_serial->rxPort, byte2, byte3);
2166 // break;
2167 //
2168 case IOSP_STATUS_MSR:
2169 dbg("%s - Port %u MSR Status = %02x", __FUNCTION__, edge_serial->rxPort, byte2);
2170
2171 // Process this new modem status and generate appropriate
2172 // events, etc, based on the new status. This routine
2173 // also saves the MSR in Port->ShadowMsr.
2174 handle_new_msr(edge_port, byte2);
2175 break;
2176
2177 default:
2178 dbg("%s - Unrecognized IOSP status code %u\n", __FUNCTION__, code);
2179 break;
2180 }
2181
2182 return;
2183}
2184
2185
2186/*****************************************************************************
2187 * edge_tty_recv
2188 * this function passes data on to the tty flip buffer
2189 *****************************************************************************/
2190static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length)
2191{
2192 int cnt;
2193
2194 do {
2195 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
2196 tty_flip_buffer_push(tty);
2197 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
2198 dev_err(dev, "%s - dropping data, %d bytes lost\n",
2199 __FUNCTION__, length);
2200 return;
2201 }
2202 }
2203 cnt = min(length, TTY_FLIPBUF_SIZE - tty->flip.count);
2204 memcpy(tty->flip.char_buf_ptr, data, cnt);
2205 memset(tty->flip.flag_buf_ptr, 0, cnt);
2206 tty->flip.char_buf_ptr += cnt;
2207 tty->flip.flag_buf_ptr += cnt;
2208 tty->flip.count += cnt;
2209 data += cnt;
2210 length -= cnt;
2211 } while (length > 0);
2212
2213 tty_flip_buffer_push(tty);
2214}
2215
2216
2217/*****************************************************************************
2218 * handle_new_msr
2219 * this function handles any change to the msr register for a port.
2220 *****************************************************************************/
2221static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr)
2222{
2223 struct async_icount *icount;
2224
2225 dbg("%s %02x", __FUNCTION__, newMsr);
2226
2227 if (newMsr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
2228 icount = &edge_port->icount;
2229
2230 /* update input line counters */
2231 if (newMsr & EDGEPORT_MSR_DELTA_CTS) {
2232 icount->cts++;
2233 }
2234 if (newMsr & EDGEPORT_MSR_DELTA_DSR) {
2235 icount->dsr++;
2236 }
2237 if (newMsr & EDGEPORT_MSR_DELTA_CD) {
2238 icount->dcd++;
2239 }
2240 if (newMsr & EDGEPORT_MSR_DELTA_RI) {
2241 icount->rng++;
2242 }
2243 wake_up_interruptible(&edge_port->delta_msr_wait);
2244 }
2245
2246 /* Save the new modem status */
2247 edge_port->shadowMSR = newMsr & 0xf0;
2248
2249 return;
2250}
2251
2252
2253/*****************************************************************************
2254 * handle_new_lsr
2255 * this function handles any change to the lsr register for a port.
2256 *****************************************************************************/
2257static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData, __u8 lsr, __u8 data)
2258{
2259 __u8 newLsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK));
2260 struct async_icount *icount;
2261
2262 dbg("%s - %02x", __FUNCTION__, newLsr);
2263
2264 edge_port->shadowLSR = lsr;
2265
2266 if (newLsr & LSR_BREAK) {
2267 //
2268 // Parity and Framing errors only count if they
2269 // occur exclusive of a break being
2270 // received.
2271 //
2272 newLsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
2273 }
2274
2275 /* Place LSR data byte into Rx buffer */
2276 if (lsrData && edge_port->port->tty)
2277 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1);
2278
2279 /* update input line counters */
2280 icount = &edge_port->icount;
2281 if (newLsr & LSR_BREAK) {
2282 icount->brk++;
2283 }
2284 if (newLsr & LSR_OVER_ERR) {
2285 icount->overrun++;
2286 }
2287 if (newLsr & LSR_PAR_ERR) {
2288 icount->parity++;
2289 }
2290 if (newLsr & LSR_FRM_ERR) {
2291 icount->frame++;
2292 }
2293
2294 return;
2295}
2296
2297
2298/****************************************************************************
2299 * sram_write
2300 * writes a number of bytes to the Edgeport device's sram starting at the
2301 * given address.
2302 * If successful returns the number of bytes written, otherwise it returns
2303 * a negative error number of the problem.
2304 ****************************************************************************/
2305static int sram_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data)
2306{
2307 int result;
2308 __u16 current_length;
2309 unsigned char *transfer_buffer;
2310
2311 dbg("%s - %x, %x, %d", __FUNCTION__, extAddr, addr, length);
2312
2313 transfer_buffer = kmalloc (64, GFP_KERNEL);
2314 if (!transfer_buffer) {
2315 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 64);
2316 return -ENOMEM;
2317 }
2318
2319 /* need to split these writes up into 64 byte chunks */
2320 result = 0;
2321 while (length > 0) {
2322 if (length > 64) {
2323 current_length = 64;
2324 } else {
2325 current_length = length;
2326 }
2327// dbg("%s - writing %x, %x, %d", __FUNCTION__, extAddr, addr, current_length);
2328 memcpy (transfer_buffer, data, current_length);
2329 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), USB_REQUEST_ION_WRITE_RAM,
2330 0x40, addr, extAddr, transfer_buffer, current_length, 300);
2331 if (result < 0)
2332 break;
2333 length -= current_length;
2334 addr += current_length;
2335 data += current_length;
2336 }
2337
2338 kfree (transfer_buffer);
2339 return result;
2340}
2341
2342
2343/****************************************************************************
2344 * rom_write
2345 * writes a number of bytes to the Edgeport device's ROM starting at the
2346 * given address.
2347 * If successful returns the number of bytes written, otherwise it returns
2348 * a negative error number of the problem.
2349 ****************************************************************************/
2350static int rom_write (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data)
2351{
2352 int result;
2353 __u16 current_length;
2354 unsigned char *transfer_buffer;
2355
2356// dbg("%s - %x, %x, %d", __FUNCTION__, extAddr, addr, length);
2357
2358 transfer_buffer = kmalloc (64, GFP_KERNEL);
2359 if (!transfer_buffer) {
2360 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 64);
2361 return -ENOMEM;
2362 }
2363
2364 /* need to split these writes up into 64 byte chunks */
2365 result = 0;
2366 while (length > 0) {
2367 if (length > 64) {
2368 current_length = 64;
2369 } else {
2370 current_length = length;
2371 }
2372// dbg("%s - writing %x, %x, %d", __FUNCTION__, extAddr, addr, current_length);
2373 memcpy (transfer_buffer, data, current_length);
2374 result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), USB_REQUEST_ION_WRITE_ROM,
2375 0x40, addr, extAddr, transfer_buffer, current_length, 300);
2376 if (result < 0)
2377 break;
2378 length -= current_length;
2379 addr += current_length;
2380 data += current_length;
2381 }
2382
2383 kfree (transfer_buffer);
2384 return result;
2385}
2386
2387
2388/****************************************************************************
2389 * rom_read
2390 * reads a number of bytes from the Edgeport device starting at the given
2391 * address.
2392 * If successful returns the number of bytes read, otherwise it returns
2393 * a negative error number of the problem.
2394 ****************************************************************************/
2395static int rom_read (struct usb_serial *serial, __u16 extAddr, __u16 addr, __u16 length, __u8 *data)
2396{
2397 int result;
2398 __u16 current_length;
2399 unsigned char *transfer_buffer;
2400
2401 dbg("%s - %x, %x, %d", __FUNCTION__, extAddr, addr, length);
2402
2403 transfer_buffer = kmalloc (64, GFP_KERNEL);
2404 if (!transfer_buffer) {
2405 dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 64);
2406 return -ENOMEM;
2407 }
2408
2409 /* need to split these reads up into 64 byte chunks */
2410 result = 0;
2411 while (length > 0) {
2412 if (length > 64) {
2413 current_length = 64;
2414 } else {
2415 current_length = length;
2416 }
2417// dbg("%s - %x, %x, %d", __FUNCTION__, extAddr, addr, current_length);
2418 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), USB_REQUEST_ION_READ_ROM,
2419 0xC0, addr, extAddr, transfer_buffer, current_length, 300);
2420 if (result < 0)
2421 break;
2422 memcpy (data, transfer_buffer, current_length);
2423 length -= current_length;
2424 addr += current_length;
2425 data += current_length;
2426 }
2427
2428 kfree (transfer_buffer);
2429 return result;
2430}
2431
2432
2433/****************************************************************************
2434 * send_iosp_ext_cmd
2435 * Is used to send a IOSP message to the Edgeport device
2436 ****************************************************************************/
2437static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u8 param)
2438{
2439 unsigned char *buffer;
2440 unsigned char *currentCommand;
2441 int length = 0;
2442 int status = 0;
2443
2444 dbg("%s - %d, %d", __FUNCTION__, command, param);
2445
2446 buffer = kmalloc (10, GFP_ATOMIC);
2447 if (!buffer) {
2448 dev_err(&edge_port->port->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 10);
2449 return -ENOMEM;
2450 }
2451
2452 currentCommand = buffer;
2453
2454 MAKE_CMD_EXT_CMD (&currentCommand, &length,
2455 edge_port->port->number - edge_port->port->serial->minor,
2456 command, param);
2457
2458 status = write_cmd_usb (edge_port, buffer, length);
2459 if (status) {
2460 /* something bad happened, let's free up the memory */
2461 kfree(buffer);
2462 }
2463
2464 return status;
2465}
2466
2467
2468/*****************************************************************************
2469 * write_cmd_usb
2470 * this function writes the given buffer out to the bulk write endpoint.
2471 *****************************************************************************/
2472static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer, int length)
2473{
2474 struct edgeport_serial *edge_serial = usb_get_serial_data(edge_port->port->serial);
2475 int status = 0;
2476 struct urb *urb;
2477 int timeout;
2478
2479 usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, length, buffer);
2480
2481 /* Allocate our next urb */
2482 urb = usb_alloc_urb (0, GFP_ATOMIC);
2483 if (!urb)
2484 return -ENOMEM;
2485
2486 CmdUrbs++;
2487 dbg("%s - ALLOCATE URB %p (outstanding %d)", __FUNCTION__, urb, CmdUrbs);
2488
2489 usb_fill_bulk_urb (urb, edge_serial->serial->dev,
2490 usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint),
2491 buffer, length, edge_bulk_out_cmd_callback, edge_port);
2492
2493 edge_port->commandPending = TRUE;
2494 status = usb_submit_urb(urb, GFP_ATOMIC);
2495
2496 if (status) {
2497 /* something went wrong */
2498 dev_err(&edge_port->port->dev, "%s - usb_submit_urb(write command) failed, status = %d\n", __FUNCTION__, status);
2499 usb_kill_urb(urb);
2500 usb_free_urb(urb);
2501 CmdUrbs--;
2502 return status;
2503 }
2504
2505 // wait for command to finish
2506 timeout = COMMAND_TIMEOUT;
2507#if 0
2508 wait_event (&edge_port->wait_command, (edge_port->commandPending == FALSE));
2509
2510 if (edge_port->commandPending == TRUE) {
2511 /* command timed out */
2512 dbg("%s - command timed out", __FUNCTION__);
2513 status = -EINVAL;
2514 }
2515#endif
2516 return status;
2517}
2518
2519
2520/*****************************************************************************
2521 * send_cmd_write_baud_rate
2522 * this function sends the proper command to change the baud rate of the
2523 * specified port.
2524 *****************************************************************************/
2525static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRate)
2526{
2527 unsigned char *cmdBuffer;
2528 unsigned char *currCmd;
2529 int cmdLen = 0;
2530 int divisor;
2531 int status;
2532 unsigned char number = edge_port->port->number - edge_port->port->serial->minor;
2533
2534 dbg("%s - port = %d, baud = %d", __FUNCTION__, edge_port->port->number, baudRate);
2535
2536 status = calc_baud_rate_divisor (baudRate, &divisor);
2537 if (status) {
2538 dev_err(&edge_port->port->dev, "%s - bad baud rate\n", __FUNCTION__);
2539 return status;
2540 }
2541
2542 // Alloc memory for the string of commands.
2543 cmdBuffer = kmalloc (0x100, GFP_ATOMIC);
2544 if (!cmdBuffer) {
2545 dev_err(&edge_port->port->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 0x100);
2546 return -ENOMEM;
2547 }
2548 currCmd = cmdBuffer;
2549
2550 // Enable access to divisor latch
2551 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, LCR, LCR_DL_ENABLE );
2552
2553 // Write the divisor itself
2554 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, DLL, LOW8 (divisor) );
2555 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, DLM, HIGH8(divisor) );
2556
2557 // Restore original value to disable access to divisor latch
2558 MAKE_CMD_WRITE_REG( &currCmd, &cmdLen, number, LCR, edge_port->shadowLCR);
2559
2560 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen );
2561 if (status) {
2562 /* something bad happened, let's free up the memory */
2563 kfree (cmdBuffer);
2564 }
2565
2566 return status;
2567}
2568
2569
2570/*****************************************************************************
2571 * calc_baud_rate_divisor
2572 * this function calculates the proper baud rate divisor for the specified
2573 * baud rate.
2574 *****************************************************************************/
2575static int calc_baud_rate_divisor (int baudrate, int *divisor)
2576{
2577 int i;
2578 __u16 custom;
2579
2580
2581 dbg("%s - %d", __FUNCTION__, baudrate);
2582
2583 for (i = 0; i < NUM_ENTRIES(divisor_table); i++) {
2584 if ( divisor_table[i].BaudRate == baudrate ) {
2585 *divisor = divisor_table[i].Divisor;
2586 return 0;
2587 }
2588 }
2589
2590 // We have tried all of the standard baud rates
2591 // lets try to calculate the divisor for this baud rate
2592 // Make sure the baud rate is reasonable
2593 if (baudrate > 50 && baudrate < 230400) {
2594 // get divisor
2595 custom = (__u16)((230400L + baudrate/2) / baudrate);
2596
2597 *divisor = custom;
2598
2599 dbg("%s - Baud %d = %d\n", __FUNCTION__, baudrate, custom);
2600 return 0;
2601 }
2602
2603 return -1;
2604}
2605
2606
2607/*****************************************************************************
2608 * send_cmd_write_uart_register
2609 * this function builds up a uart register message and sends to to the device.
2610 *****************************************************************************/
2611static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 regNum, __u8 regValue)
2612{
2613 unsigned char *cmdBuffer;
2614 unsigned char *currCmd;
2615 unsigned long cmdLen = 0;
2616 int status;
2617
2618 dbg("%s - write to %s register 0x%02x", (regNum == MCR) ? "MCR" : "LCR", __FUNCTION__, regValue);
2619
2620 // Alloc memory for the string of commands.
2621 cmdBuffer = kmalloc (0x10, GFP_ATOMIC);
2622 if (cmdBuffer == NULL ) {
2623 return -ENOMEM;
2624 }
2625
2626 currCmd = cmdBuffer;
2627
2628 // Build a cmd in the buffer to write the given register
2629 MAKE_CMD_WRITE_REG (&currCmd, &cmdLen,
2630 edge_port->port->number - edge_port->port->serial->minor,
2631 regNum, regValue);
2632
2633 status = write_cmd_usb(edge_port, cmdBuffer, cmdLen);
2634 if (status) {
2635 /* something bad happened, let's free up the memory */
2636 kfree (cmdBuffer);
2637 }
2638
2639 return status;
2640}
2641
2642
2643/*****************************************************************************
2644 * change_port_settings
2645 * This routine is called to set the UART on the device to match the specified
2646 * new settings.
2647 *****************************************************************************/
2648#ifndef CMSPAR
2649#define CMSPAR 0
2650#endif
2651static void change_port_settings (struct edgeport_port *edge_port, struct termios *old_termios)
2652{
2653 struct tty_struct *tty;
2654 int baud;
2655 unsigned cflag;
2656 __u8 mask = 0xff;
2657 __u8 lData;
2658 __u8 lParity;
2659 __u8 lStop;
2660 __u8 rxFlow;
2661 __u8 txFlow;
2662 int status;
2663
2664 dbg("%s - port %d", __FUNCTION__, edge_port->port->number);
2665
2666 if ((!edge_port->open) &&
2667 (!edge_port->openPending)) {
2668 dbg("%s - port not opened", __FUNCTION__);
2669 return;
2670 }
2671
2672 tty = edge_port->port->tty;
2673 if ((!tty) ||
2674 (!tty->termios)) {
2675 dbg("%s - no tty structures", __FUNCTION__);
2676 return;
2677 }
2678
2679 cflag = tty->termios->c_cflag;
2680
2681 switch (cflag & CSIZE) {
2682 case CS5: lData = LCR_BITS_5; mask = 0x1f; dbg("%s - data bits = 5", __FUNCTION__); break;
2683 case CS6: lData = LCR_BITS_6; mask = 0x3f; dbg("%s - data bits = 6", __FUNCTION__); break;
2684 case CS7: lData = LCR_BITS_7; mask = 0x7f; dbg("%s - data bits = 7", __FUNCTION__); break;
2685 default:
2686 case CS8: lData = LCR_BITS_8; dbg("%s - data bits = 8", __FUNCTION__); break;
2687 }
2688
2689 lParity = LCR_PAR_NONE;
2690 if (cflag & PARENB) {
2691 if (cflag & CMSPAR) {
2692 if (cflag & PARODD) {
2693 lParity = LCR_PAR_MARK;
2694 dbg("%s - parity = mark", __FUNCTION__);
2695 } else {
2696 lParity = LCR_PAR_SPACE;
2697 dbg("%s - parity = space", __FUNCTION__);
2698 }
2699 } else if (cflag & PARODD) {
2700 lParity = LCR_PAR_ODD;
2701 dbg("%s - parity = odd", __FUNCTION__);
2702 } else {
2703 lParity = LCR_PAR_EVEN;
2704 dbg("%s - parity = even", __FUNCTION__);
2705 }
2706 } else {
2707 dbg("%s - parity = none", __FUNCTION__);
2708 }
2709
2710 if (cflag & CSTOPB) {
2711 lStop = LCR_STOP_2;
2712 dbg("%s - stop bits = 2", __FUNCTION__);
2713 } else {
2714 lStop = LCR_STOP_1;
2715 dbg("%s - stop bits = 1", __FUNCTION__);
2716 }
2717
2718 /* figure out the flow control settings */
2719 rxFlow = txFlow = 0x00;
2720 if (cflag & CRTSCTS) {
2721 rxFlow |= IOSP_RX_FLOW_RTS;
2722 txFlow |= IOSP_TX_FLOW_CTS;
2723 dbg("%s - RTS/CTS is enabled", __FUNCTION__);
2724 } else {
2725 dbg("%s - RTS/CTS is disabled", __FUNCTION__);
2726 }
2727
2728 /* if we are implementing XON/XOFF, set the start and stop character in the device */
2729 if (I_IXOFF(tty) || I_IXON(tty)) {
2730 unsigned char stop_char = STOP_CHAR(tty);
2731 unsigned char start_char = START_CHAR(tty);
2732
2733 send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_XON_CHAR, start_char);
2734 send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_XOFF_CHAR, stop_char);
2735
2736 /* if we are implementing INBOUND XON/XOFF */
2737 if (I_IXOFF(tty)) {
2738 rxFlow |= IOSP_RX_FLOW_XON_XOFF;
2739 dbg("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", __FUNCTION__, start_char, stop_char);
2740 } else {
2741 dbg("%s - INBOUND XON/XOFF is disabled", __FUNCTION__);
2742 }
2743
2744 /* if we are implementing OUTBOUND XON/XOFF */
2745 if (I_IXON(tty)) {
2746 txFlow |= IOSP_TX_FLOW_XON_XOFF;
2747 dbg("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", __FUNCTION__, start_char, stop_char);
2748 } else {
2749 dbg("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__);
2750 }
2751 }
2752
2753 /* Set flow control to the configured value */
2754 send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_RX_FLOW, rxFlow);
2755 send_iosp_ext_cmd (edge_port, IOSP_CMD_SET_TX_FLOW, txFlow);
2756
2757
2758 edge_port->shadowLCR &= ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
2759 edge_port->shadowLCR |= (lData | lParity | lStop);
2760
2761 edge_port->validDataMask = mask;
2762
2763 /* Send the updated LCR value to the EdgePort */
2764 status = send_cmd_write_uart_register(edge_port, LCR, edge_port->shadowLCR);
2765 if (status != 0) {
2766 return;
2767 }
2768
2769 /* set up the MCR register and send it to the EdgePort */
2770 edge_port->shadowMCR = MCR_MASTER_IE;
2771 if (cflag & CBAUD) {
2772 edge_port->shadowMCR |= (MCR_DTR | MCR_RTS);
2773 }
2774 status = send_cmd_write_uart_register(edge_port, MCR, edge_port->shadowMCR);
2775 if (status != 0) {
2776 return;
2777 }
2778
2779 /* Determine divisor based on baud rate */
2780 baud = tty_get_baud_rate(tty);
2781 if (!baud) {
2782 /* pick a default, any default... */
2783 baud = 9600;
2784 }
2785
2786 dbg("%s - baud rate = %d", __FUNCTION__, baud);
2787 status = send_cmd_write_baud_rate (edge_port, baud);
2788
2789 return;
2790}
2791
2792
2793/****************************************************************************
2794 * unicode_to_ascii
2795 * Turns a string from Unicode into ASCII.
2796 * Doesn't do a good job with any characters that are outside the normal
2797 * ASCII range, but it's only for debugging...
2798 * NOTE: expects the unicode in LE format
2799 ****************************************************************************/
2800static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size)
2801{
2802 int i;
2803
2804 if (unicode_size <= 0)
2805 return;
2806
2807 for (i = 0; i < unicode_size; ++i)
2808 string[i] = (char)(le16_to_cpu(unicode[i]));
2809 string[unicode_size] = 0x00;
2810}
2811
2812
2813/****************************************************************************
2814 * get_manufacturing_desc
2815 * reads in the manufacturing descriptor and stores it into the serial
2816 * structure.
2817 ****************************************************************************/
2818static void get_manufacturing_desc (struct edgeport_serial *edge_serial)
2819{
2820 int response;
2821
2822 dbg("getting manufacturer descriptor");
2823
2824 response = rom_read (edge_serial->serial, (EDGE_MANUF_DESC_ADDR & 0xffff0000) >> 16,
2825 (__u16)(EDGE_MANUF_DESC_ADDR & 0x0000ffff), EDGE_MANUF_DESC_LEN,
2826 (__u8 *)(&edge_serial->manuf_descriptor));
2827
2828 if (response < 1) {
2829 dev_err(&edge_serial->serial->dev->dev, "error in getting manufacturer descriptor\n");
2830 } else {
2831 char string[30];
2832 dbg("**Manufacturer Descriptor");
2833 dbg(" RomSize: %dK", edge_serial->manuf_descriptor.RomSize);
2834 dbg(" RamSize: %dK", edge_serial->manuf_descriptor.RamSize);
2835 dbg(" CpuRev: %d", edge_serial->manuf_descriptor.CpuRev);
2836 dbg(" BoardRev: %d", edge_serial->manuf_descriptor.BoardRev);
2837 dbg(" NumPorts: %d", edge_serial->manuf_descriptor.NumPorts);
2838 dbg(" DescDate: %d/%d/%d", edge_serial->manuf_descriptor.DescDate[0], edge_serial->manuf_descriptor.DescDate[1], edge_serial->manuf_descriptor.DescDate[2]+1900);
2839 unicode_to_ascii (string, edge_serial->manuf_descriptor.SerialNumber, edge_serial->manuf_descriptor.SerNumLength/2-1);
2840 dbg(" SerialNumber: %s", string);
2841 unicode_to_ascii (string, edge_serial->manuf_descriptor.AssemblyNumber, edge_serial->manuf_descriptor.AssemblyNumLength/2-1);
2842 dbg(" AssemblyNumber: %s", string);
2843 unicode_to_ascii (string, edge_serial->manuf_descriptor.OemAssyNumber, edge_serial->manuf_descriptor.OemAssyNumLength/2-1);
2844 dbg(" OemAssyNumber: %s", string);
2845 dbg(" UartType: %d", edge_serial->manuf_descriptor.UartType);
2846 dbg(" IonPid: %d", edge_serial->manuf_descriptor.IonPid);
2847 dbg(" IonConfig: %d", edge_serial->manuf_descriptor.IonConfig);
2848 }
2849}
2850
2851
2852/****************************************************************************
2853 * get_boot_desc
2854 * reads in the bootloader descriptor and stores it into the serial
2855 * structure.
2856 ****************************************************************************/
2857static void get_boot_desc (struct edgeport_serial *edge_serial)
2858{
2859 int response;
2860
2861 dbg("getting boot descriptor");
2862
2863 response = rom_read (edge_serial->serial, (EDGE_BOOT_DESC_ADDR & 0xffff0000) >> 16,
2864 (__u16)(EDGE_BOOT_DESC_ADDR & 0x0000ffff), EDGE_BOOT_DESC_LEN,
2865 (__u8 *)(&edge_serial->boot_descriptor));
2866
2867 if (response < 1) {
2868 dev_err(&edge_serial->serial->dev->dev, "error in getting boot descriptor\n");
2869 } else {
2870 dbg("**Boot Descriptor:");
2871 dbg(" BootCodeLength: %d", le16_to_cpu(edge_serial->boot_descriptor.BootCodeLength));
2872 dbg(" MajorVersion: %d", edge_serial->boot_descriptor.MajorVersion);
2873 dbg(" MinorVersion: %d", edge_serial->boot_descriptor.MinorVersion);
2874 dbg(" BuildNumber: %d", le16_to_cpu(edge_serial->boot_descriptor.BuildNumber));
2875 dbg(" Capabilities: 0x%x", le16_to_cpu(edge_serial->boot_descriptor.Capabilities));
2876 dbg(" UConfig0: %d", edge_serial->boot_descriptor.UConfig0);
2877 dbg(" UConfig1: %d", edge_serial->boot_descriptor.UConfig1);
2878 }
2879}
2880
2881
2882/****************************************************************************
2883 * load_application_firmware
2884 * This is called to load the application firmware to the device
2885 ****************************************************************************/
2886static void load_application_firmware (struct edgeport_serial *edge_serial)
2887{
2888 struct edge_firmware_image_record *record;
2889 unsigned char *firmware;
2890 unsigned char *FirmwareImage;
2891 int ImageSize;
2892 int response;
2893
2894
2895 switch (edge_serial->product_info.iDownloadFile) {
2896 case EDGE_DOWNLOAD_FILE_I930:
2897 dbg("downloading firmware version (930) %d.%d.%d",
2898 OperationalCodeImageVersion_GEN1.MajorVersion,
2899 OperationalCodeImageVersion_GEN1.MinorVersion,
2900 OperationalCodeImageVersion_GEN1.BuildNumber);
2901 firmware = &OperationalCodeImage_GEN1[0];
2902 FirmwareImage = &OperationalCodeImage_GEN1[0];
2903 ImageSize = sizeof(OperationalCodeImage_GEN1);
2904 break;
2905
2906 case EDGE_DOWNLOAD_FILE_80251:
2907 dbg("downloading firmware version (80251) %d.%d.%d",
2908 OperationalCodeImageVersion_GEN2.MajorVersion,
2909 OperationalCodeImageVersion_GEN2.MinorVersion,
2910 OperationalCodeImageVersion_GEN2.BuildNumber);
2911 firmware = &OperationalCodeImage_GEN2[0];
2912 FirmwareImage = &OperationalCodeImage_GEN2[0];
2913 ImageSize = sizeof(OperationalCodeImage_GEN2);
2914 break;
2915
2916 case EDGE_DOWNLOAD_FILE_NONE:
2917 dbg ("No download file specified, skipping download\n");
2918 return;
2919
2920 default:
2921 return;
2922 }
2923
2924
2925 for (;;) {
2926 record = (struct edge_firmware_image_record *)firmware;
2927 response = sram_write (edge_serial->serial, le16_to_cpu(record->ExtAddr), le16_to_cpu(record->Addr), le16_to_cpu(record->Len), &record->Data[0]);
2928 if (response < 0) {
2929 dev_err(&edge_serial->serial->dev->dev, "sram_write failed (%x, %x, %d)\n", le16_to_cpu(record->ExtAddr), le16_to_cpu(record->Addr), le16_to_cpu(record->Len));
2930 break;
2931 }
2932 firmware += sizeof (struct edge_firmware_image_record) + le16_to_cpu(record->Len);
2933 if (firmware >= &FirmwareImage[ImageSize]) {
2934 break;
2935 }
2936 }
2937
2938 dbg("sending exec_dl_code");
2939 response = usb_control_msg (edge_serial->serial->dev,
2940 usb_sndctrlpipe(edge_serial->serial->dev, 0),
2941 USB_REQUEST_ION_EXEC_DL_CODE,
2942 0x40, 0x4000, 0x0001, NULL, 0, 3000);
2943
2944 return;
2945}
2946
2947
2948/****************************************************************************
2949 * edge_startup
2950 ****************************************************************************/
2951static int edge_startup (struct usb_serial *serial)
2952{
2953 struct edgeport_serial *edge_serial;
2954 struct edgeport_port *edge_port;
2955 struct usb_device *dev;
2956 int i;
2957
2958 dev = serial->dev;
2959
2960 /* create our private serial structure */
2961 edge_serial = kmalloc (sizeof(struct edgeport_serial), GFP_KERNEL);
2962 if (edge_serial == NULL) {
2963 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2964 return -ENOMEM;
2965 }
2966 memset (edge_serial, 0, sizeof(struct edgeport_serial));
2967 spin_lock_init(&edge_serial->es_lock);
2968 edge_serial->serial = serial;
2969 usb_set_serial_data(serial, edge_serial);
2970
2971 /* get the name for the device from the device */
2972 if ( (i = get_string(dev, dev->descriptor.iManufacturer, &edge_serial->name[0])) != 0) {
2973 edge_serial->name[i-1] = ' ';
2974 }
2975
2976 get_string(dev, dev->descriptor.iProduct, &edge_serial->name[i]);
2977
2978 dev_info(&serial->dev->dev, "%s detected\n", edge_serial->name);
2979
2980 /* get the manufacturing descriptor for this device */
2981 get_manufacturing_desc (edge_serial);
2982
2983 /* get the boot descriptor */
2984 get_boot_desc (edge_serial);
2985
2986 get_product_info(edge_serial);
2987
2988 /* set the number of ports from the manufacturing description */
2989 /* serial->num_ports = serial->product_info.NumPorts; */
2990 if (edge_serial->product_info.NumPorts != serial->num_ports) {
2991 warn("%s - Device Reported %d serial ports vs core "
2992 "thinking we have %d ports, email greg@kroah.com this info.",
2993 __FUNCTION__, edge_serial->product_info.NumPorts,
2994 serial->num_ports);
2995 }
2996
2997 dbg("%s - time 1 %ld", __FUNCTION__, jiffies);
2998
2999 /* now load the application firmware into this device */
3000 load_application_firmware (edge_serial);
3001
3002 dbg("%s - time 2 %ld", __FUNCTION__, jiffies);
3003
3004 /* Check current Edgeport EEPROM and update if necessary */
3005 update_edgeport_E2PROM (edge_serial);
3006
3007 dbg("%s - time 3 %ld", __FUNCTION__, jiffies);
3008
3009 /* set the configuration to use #1 */
3010// dbg("set_configuration 1");
3011// usb_set_configuration (dev, 1);
3012
3013 /* we set up the pointers to the endpoints in the edge_open function,
3014 * as the structures aren't created yet. */
3015
3016 /* set up our port private structures */
3017 for (i = 0; i < serial->num_ports; ++i) {
3018 edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL);
3019 if (edge_port == NULL) {
3020 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
3021 usb_set_serial_data(serial, NULL);
3022 kfree(edge_serial);
3023 return -ENOMEM;
3024 }
3025 memset (edge_port, 0, sizeof(struct edgeport_port));
3026 spin_lock_init(&edge_port->ep_lock);
3027 edge_port->port = serial->port[i];
3028 usb_set_serial_port_data(serial->port[i], edge_port);
3029 }
3030
3031 return 0;
3032}
3033
3034
3035/****************************************************************************
3036 * edge_shutdown
3037 * This function is called whenever the device is removed from the usb bus.
3038 ****************************************************************************/
3039static void edge_shutdown (struct usb_serial *serial)
3040{
3041 int i;
3042
3043 dbg("%s", __FUNCTION__);
3044
3045 /* stop reads and writes on all ports */
3046 for (i=0; i < serial->num_ports; ++i) {
3047 kfree (usb_get_serial_port_data(serial->port[i]));
3048 usb_set_serial_port_data(serial->port[i], NULL);
3049 }
3050 kfree (usb_get_serial_data(serial));
3051 usb_set_serial_data(serial, NULL);
3052}
3053
3054
3055/****************************************************************************
3056 * edgeport_init
3057 * This is called by the module subsystem, or on startup to initialize us
3058 ****************************************************************************/
3059static int __init edgeport_init(void)
3060{
3061 int retval;
3062
3063 retval = usb_serial_register(&edgeport_2port_device);
3064 if (retval)
3065 goto failed_2port_device_register;
3066 retval = usb_serial_register(&edgeport_4port_device);
3067 if (retval)
3068 goto failed_4port_device_register;
3069 retval = usb_serial_register(&edgeport_8port_device);
3070 if (retval)
3071 goto failed_8port_device_register;
3072 retval = usb_register(&io_driver);
3073 if (retval)
3074 goto failed_usb_register;
3075 info(DRIVER_DESC " " DRIVER_VERSION);
3076 return 0;
3077
3078failed_usb_register:
3079 usb_serial_deregister(&edgeport_8port_device);
3080failed_8port_device_register:
3081 usb_serial_deregister(&edgeport_4port_device);
3082failed_4port_device_register:
3083 usb_serial_deregister(&edgeport_2port_device);
3084failed_2port_device_register:
3085 return retval;
3086}
3087
3088
3089/****************************************************************************
3090 * edgeport_exit
3091 * Called when the driver is about to be unloaded.
3092 ****************************************************************************/
3093static void __exit edgeport_exit (void)
3094{
3095 usb_deregister (&io_driver);
3096 usb_serial_deregister (&edgeport_2port_device);
3097 usb_serial_deregister (&edgeport_4port_device);
3098 usb_serial_deregister (&edgeport_8port_device);
3099}
3100
3101module_init(edgeport_init);
3102module_exit(edgeport_exit);
3103
3104/* Module information */
3105MODULE_AUTHOR( DRIVER_AUTHOR );
3106MODULE_DESCRIPTION( DRIVER_DESC );
3107MODULE_LICENSE("GPL");
3108
3109module_param(debug, bool, S_IRUGO | S_IWUSR);
3110MODULE_PARM_DESC(debug, "Debug enabled or not");
3111
3112module_param(low_latency, bool, S_IRUGO | S_IWUSR);
3113MODULE_PARM_DESC(low_latency, "Low latency enabled or not");
diff --git a/drivers/usb/serial/io_edgeport.h b/drivers/usb/serial/io_edgeport.h
new file mode 100644
index 000000000000..5112d7aac055
--- /dev/null
+++ b/drivers/usb/serial/io_edgeport.h
@@ -0,0 +1,141 @@
1/************************************************************************
2 *
3 * io_edgeport.h Edgeport Linux Interface definitions
4 *
5 * Copyright (C) 2000 Inside Out Networks, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 *
13 ************************************************************************/
14
15#if !defined(_IO_EDGEPORT_H_)
16#define _IO_EDGEPORT_H_
17
18
19#define MAX_RS232_PORTS 8 /* Max # of RS-232 ports per device */
20
21/* typedefs that the insideout headers need */
22#ifndef TRUE
23 #define TRUE (1)
24#endif
25#ifndef FALSE
26 #define FALSE (0)
27#endif
28#ifndef LOW8
29 #define LOW8(a) ((unsigned char)(a & 0xff))
30#endif
31#ifndef HIGH8
32 #define HIGH8(a) ((unsigned char)((a & 0xff00) >> 8))
33#endif
34#ifndef NUM_ENTRIES
35 #define NUM_ENTRIES(x) (sizeof(x)/sizeof((x)[0]))
36#endif
37
38#ifndef __KERNEL__
39#define __KERNEL__
40#endif
41
42#include "io_usbvend.h"
43
44
45
46/* The following table is used to map the USBx port number to
47 * the device serial number (or physical USB path), */
48#define MAX_EDGEPORTS 64
49
50struct comMapper {
51 char SerialNumber[MAX_SERIALNUMBER_LEN+1]; /* Serial number/usb path */
52 int numPorts; /* Number of ports */
53 int Original[MAX_RS232_PORTS]; /* Port numbers set by IOCTL */
54 int Port[MAX_RS232_PORTS]; /* Actual used port numbers */
55};
56
57
58#define EDGEPORT_CONFIG_DEVICE "/proc/edgeport"
59
60/* /proc/edgeport Interface
61 * This interface uses read/write/lseek interface to talk to the edgeport driver
62 * the following read functions are supported: */
63#define PROC_GET_MAPPING_TO_PATH 1
64#define PROC_GET_COM_ENTRY 2
65#define PROC_GET_EDGE_MANUF_DESCRIPTOR 3
66#define PROC_GET_BOOT_DESCRIPTOR 4
67#define PROC_GET_PRODUCT_INFO 5
68#define PROC_GET_STRINGS 6
69#define PROC_GET_CURRENT_COM_MAPPING 7
70
71/* The parameters to the lseek() for the read is: */
72#define PROC_READ_SETUP(Command, Argument) ((Command) + ((Argument)<<8))
73
74
75/* the following write functions are supported: */
76#define PROC_SET_COM_MAPPING 1
77#define PROC_SET_COM_ENTRY 2
78
79
80/* The following sturcture is passed to the write */
81struct procWrite {
82 int Command;
83 union {
84 struct comMapper Entry;
85 int ComMappingBasedOnUSBPort; /* Boolean value */
86 } u;
87};
88
89/*
90 * Product information read from the Edgeport
91 */
92struct edgeport_product_info {
93 __u16 ProductId; /* Product Identifier */
94 __u8 NumPorts; /* Number of ports on edgeport */
95 __u8 ProdInfoVer; /* What version of structure is this? */
96
97 __u32 IsServer :1; /* Set if Server */
98 __u32 IsRS232 :1; /* Set if RS-232 ports exist */
99 __u32 IsRS422 :1; /* Set if RS-422 ports exist */
100 __u32 IsRS485 :1; /* Set if RS-485 ports exist */
101 __u32 IsReserved :28; /* Reserved for later expansion */
102
103 __u8 RomSize; /* Size of ROM/E2PROM in K */
104 __u8 RamSize; /* Size of external RAM in K */
105 __u8 CpuRev; /* CPU revision level (chg only if s/w visible) */
106 __u8 BoardRev; /* PCB revision level (chg only if s/w visible) */
107
108 __u8 BootMajorVersion; /* Boot Firmware version: xx. */
109 __u8 BootMinorVersion; /* yy. */
110 __le16 BootBuildNumber; /* zzzz (LE format) */
111
112 __u8 FirmwareMajorVersion; /* Operational Firmware version:xx. */
113 __u8 FirmwareMinorVersion; /* yy. */
114 __le16 FirmwareBuildNumber; /* zzzz (LE format) */
115
116 __u8 ManufactureDescDate[3]; /* MM/DD/YY when descriptor template was compiled */
117 __u8 Unused1[1]; /* Available */
118
119 __u8 iDownloadFile; /* What to download to EPiC device */
120 __u8 Unused2[2]; /* Available */
121};
122
123/*
124 * Edgeport Stringblock String locations
125 */
126#define EDGESTRING_MANUFNAME 1 /* Manufacture Name */
127#define EDGESTRING_PRODNAME 2 /* Product Name */
128#define EDGESTRING_SERIALNUM 3 /* Serial Number */
129#define EDGESTRING_ASSEMNUM 4 /* Assembly Number */
130#define EDGESTRING_OEMASSEMNUM 5 /* OEM Assembly Number */
131#define EDGESTRING_MANUFDATE 6 /* Manufacture Date */
132#define EDGESTRING_ORIGSERIALNUM 7 /* Serial Number */
133
134struct string_block {
135 __u16 NumStrings; /* Number of strings in block */
136 __u16 Strings[1]; /* Start of string block */
137};
138
139
140
141#endif
diff --git a/drivers/usb/serial/io_fw_boot.h b/drivers/usb/serial/io_fw_boot.h
new file mode 100644
index 000000000000..099fafaf52bb
--- /dev/null
+++ b/drivers/usb/serial/io_fw_boot.h
@@ -0,0 +1,556 @@
1//**************************************************************
2//* Edgeport/4 Binary Image
3//* Generated by HEX2C v1.06
4//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
5//* This program is free software; you can redistribute it and/or modify
6//* it under the terms of the GNU General Public License as published by
7//* the Free Software Foundation; either version 2 of the License, or
8//* (at your option) any later version.
9//**************************************************************
10
11
12//Image structure definition
13#if !defined(DEFINED_EDGE_FIRMWARE_IMAGE_RECORD)
14#define DEFINED_EDGE_FIRMWARE_IMAGE_RECORD
15 struct edge_firmware_image_record {
16 __le16 ExtAddr;
17 __le16 Addr;
18 __le16 Len;
19 unsigned char Data[0];
20 } __attribute__ ((packed));
21
22 struct edge_firmware_version_info {
23 unsigned char MajorVersion;
24 unsigned char MinorVersion;
25 unsigned short BuildNumber;
26 };
27
28#endif
29
30#if !defined(IMAGE_ARRAY_NAME)
31#define IMAGE_ARRAY_NAME FirmwareImage
32#define IMAGE_VERSION_NAME FirmwareImageVersion
33#endif
34
35static unsigned char IMAGE_ARRAY_NAME[] = {
36
37// Segment #1, Start Address 00ff0000, Length 6
380xff,0x00,0x00,0x00,0x06,0x00,
39 0x02, 0x00, 0x80, 0x02, 0x00, 0x03,
40
41// Segment #2, Start Address 00ff000b, Length 3
420xff,0x00,0x0b,0x00,0x03,0x00,
43 0x02, 0x00, 0x0b,
44
45// Segment #3, Start Address 00ff0013, Length 3
460xff,0x00,0x13,0x00,0x03,0x00,
47 0x02, 0x01, 0xb8,
48
49// Segment #4, Start Address 00ff001b, Length 3
500xff,0x00,0x1b,0x00,0x03,0x00,
51 0x02, 0x00, 0x1b,
52
53// Segment #5, Start Address 00ff0023, Length 3
540xff,0x00,0x23,0x00,0x03,0x00,
55 0x02, 0x00, 0x23,
56
57// Segment #6, Start Address 00ff002b, Length 3
580xff,0x00,0x2b,0x00,0x03,0x00,
59 0x02, 0x00, 0x2b,
60
61// Segment #7, Start Address 00ff0033, Length 3
620xff,0x00,0x33,0x00,0x03,0x00,
63 0x02, 0x00, 0x33,
64
65// Segment #8, Start Address 00ff003b, Length 3
660xff,0x00,0x3b,0x00,0x03,0x00,
67 0x02, 0x00, 0x3b,
68
69// Segment #9, Start Address 00ff0043, Length 3
700xff,0x00,0x43,0x00,0x03,0x00,
71 0x02, 0x01, 0xbd,
72
73// Segment #10, Start Address 00ff004b, Length 3
740xff,0x00,0x4b,0x00,0x03,0x00,
75 0x02, 0x01, 0xd0,
76
77// Segment #11, Start Address 00ff0053, Length 3
780xff,0x00,0x53,0x00,0x03,0x00,
79 0x02, 0x01, 0x21,
80
81// Segment #12, Start Address 00ff007b, Length 3
820xff,0x00,0x7b,0x00,0x03,0x00,
83 0x02, 0x00, 0x7b,
84
85// Segment #13, Start Address 00ff0080, Length 358
860xff,0x00,0x80,0x00,0x66,0x01,
87 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x3f, 0xf2, 0x7e, 0xf8, 0x00, 0x23, 0x7e, 0x00, 0x01, 0x7e, 0x10,
88 0x00, 0x12, 0x07, 0x5f, 0x69, 0x20, 0x00, 0x0a, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x05, 0x75, 0x90,
89 0x0d, 0x80, 0x03, 0x75, 0x90, 0x1d, 0xd2, 0xb5, 0x7e, 0x00, 0x00, 0xa5, 0xd8, 0xfd, 0x75, 0xa8,
90 0x00, 0x75, 0xb1, 0x00, 0xa9, 0xd5, 0x87, 0xca, 0x29, 0x12, 0x09, 0xcc, 0x12, 0x09, 0xa0, 0xf5,
91 0x09, 0x7a, 0xa1, 0x20, 0x12, 0x01, 0xe6, 0xda, 0x29, 0xa9, 0xd0, 0xc7, 0x7e, 0x00, 0x05, 0x7a,
92 0x01, 0xf1, 0x75, 0xe1, 0x10, 0xa9, 0xd7, 0xf4, 0xa9, 0xd7, 0xe4, 0xa5, 0xd8, 0xf1, 0x75, 0xf1,
93 0x00, 0x75, 0xe1, 0x3f, 0x75, 0xa2, 0x03, 0x75, 0xa3, 0x00, 0x75, 0xc0, 0x00, 0x75, 0xc1, 0x00,
94 0xa9, 0xd1, 0xb1, 0xa9, 0xd0, 0xb1, 0xa9, 0xd5, 0xd3, 0xd2, 0xaf, 0xe4, 0x7e, 0x04, 0x28, 0x00,
95 0x8d, 0xef, 0x1b, 0x04, 0x78, 0xfa, 0x04, 0xa9, 0x34, 0xd3, 0x03, 0x30, 0xe0, 0xee, 0xbe, 0x24,
96 0x00, 0x00, 0x78, 0x05, 0x63, 0x90, 0x30, 0x80, 0xe3, 0xb2, 0x95, 0x80, 0xdf, 0xbe, 0xb0, 0x02,
97 0x22, 0xc0, 0xd0, 0xa9, 0x20, 0xdf, 0x0f, 0xa9, 0x31, 0xdf, 0x03, 0x02, 0x01, 0xb5, 0x75, 0x08,
98 0x01, 0x12, 0x08, 0x33, 0x80, 0xfe, 0x75, 0x08, 0xfe, 0x12, 0x08, 0x33, 0x75, 0xa8, 0x00, 0x7e,
99 0xb3, 0x3f, 0xf2, 0x30, 0xe0, 0x4b, 0x30, 0x01, 0x46, 0xc2, 0x92, 0x7e, 0x24, 0x80, 0x00, 0x7e,
100 0x11, 0x09, 0x74, 0x08, 0x19, 0xb2, 0x00, 0x10, 0x74, 0x0e, 0x19, 0xb2, 0x00, 0x04, 0x2e, 0x24,
101 0x01, 0x00, 0xa5, 0xd9, 0xed, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0xe4, 0xd5, 0xe0, 0xfd,
102 0x09, 0xb2, 0x00, 0x08, 0x20, 0xe0, 0x0a, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00, 0x18, 0x80,
103 0xeb, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xe4, 0x43, 0x90, 0x30, 0xd2, 0xaa, 0x80, 0x05, 0xd2,
104 0xaa, 0x43, 0x90, 0x34, 0xd2, 0xaf, 0xa9, 0xd1, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x11,
105 0xdf, 0x03, 0xa9, 0xd2, 0xdf, 0x75, 0x08, 0xff, 0x12, 0x08, 0x33, 0xc0, 0xd1, 0xca, 0x02, 0xff,
106 0xca, 0x06, 0x83, 0x00, 0x32, 0xd0, 0xd0, 0x32, 0xc2, 0x8b, 0xc2, 0xaa, 0x32, 0x75, 0x08, 0x08,
107 0x12, 0x08, 0x33, 0xa9, 0xc0, 0xb1, 0xa9, 0xc5, 0xd3, 0xa9, 0xc6, 0xd3, 0xa9, 0xd2, 0xb1, 0x32,
108 0xca, 0xb8, 0x75, 0x08, 0x02, 0x12, 0x08, 0x33, 0xe5, 0xc0, 0x54, 0x03, 0x68, 0x05, 0x12, 0x01,
109 0xee, 0x80, 0xf5, 0xda, 0xb8, 0x32,
110
111// Segment #14, Start Address 00ff1bca, Length 1
1120xff,0x00,0xca,0x1b,0x01,0x00,
113 0x00,
114
115// Segment #15, Start Address 00ff01e6, Length 1613
1160xff,0x00,0xe6,0x01,0x4d,0x06,
117 0xe4, 0x7a, 0xb3, 0x3f, 0xf1, 0x02, 0x02, 0x63, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0xca, 0x3b,
118 0xca, 0x4b, 0xca, 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0xc0, 0xf1, 0x7e, 0xb3, 0x01, 0x2b,
119 0xb4, 0x00, 0x02, 0x80, 0x19, 0xb4, 0x01, 0x16, 0x30, 0xc0, 0x08, 0x75, 0xf1, 0x00, 0x12, 0x02,
120 0x4d, 0x80, 0x1f, 0x30, 0xc1, 0x1c, 0x75, 0xf1, 0x00, 0x12, 0x02, 0xde, 0x80, 0x14, 0x30, 0xc1,
121 0x08, 0x75, 0xf1, 0x00, 0x12, 0x02, 0xde, 0x80, 0x09, 0x30, 0xc0, 0x06, 0x75, 0xf1, 0x00, 0x12,
122 0x02, 0x4d, 0xd0, 0xf1, 0xda, 0xeb, 0xda, 0x7b, 0xda, 0x6b, 0xda, 0x5b, 0xda, 0x4b, 0xda, 0x3b,
123 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0xc2, 0xc0, 0x7e, 0xb3, 0x01, 0x2b, 0xb4, 0x02, 0x07,
124 0x12, 0x02, 0x6f, 0x02, 0x02, 0x63, 0x22, 0xb4, 0x01, 0xfc, 0x02, 0x02, 0xa9, 0x7e, 0x00, 0x00,
125 0x7a, 0x03, 0x01, 0x2b, 0x7a, 0x03, 0x01, 0x2c, 0x22, 0x7e, 0xb3, 0x01, 0x23, 0x54, 0x60, 0x60,
126 0x05, 0xb4, 0x40, 0x15, 0x80, 0x13, 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x05, 0x0c, 0x75, 0x08, 0x71,
127 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x26, 0xf5, 0x8f, 0x22, 0x75, 0xf6, 0x00, 0x22, 0xbe, 0x57,
128 0x01, 0x29, 0x28, 0x04, 0x7e, 0x57, 0x01, 0x29, 0x7a, 0x0f, 0x01, 0x2e, 0x7a, 0x57, 0x01, 0x32,
129 0x02, 0x02, 0xa9, 0x7e, 0xef, 0x01, 0x2e, 0x7e, 0xf7, 0x01, 0x32, 0x7e, 0x07, 0x01, 0x32, 0x4d,
130 0x00, 0x68, 0x21, 0x7e, 0x00, 0x00, 0x7e, 0xeb, 0xb0, 0xf5, 0xf3, 0xa3, 0xa5, 0x08, 0x1b, 0xf4,
131 0x68, 0x04, 0xa5, 0xb8, 0x08, 0xf0, 0x7a, 0xef, 0x01, 0x2e, 0x7a, 0xf7, 0x01, 0x32, 0x75, 0x08,
132 0x06, 0x12, 0x08, 0x33, 0x7a, 0x01, 0xf6, 0x22, 0xc2, 0xc1, 0x75, 0x08, 0x03, 0x12, 0x08, 0x33,
133 0xa9, 0x36, 0xe2, 0x16, 0xe5, 0xf5, 0x54, 0xc0, 0x68, 0x07, 0xa9, 0xd7, 0xf4, 0xa9, 0x27, 0xf4,
134 0xfc, 0x53, 0xe1, 0x3f, 0x43, 0xf2, 0x88, 0x02, 0x03, 0x55, 0x7e, 0xb3, 0x01, 0x2c, 0xb4, 0x02,
135 0x0f, 0xa9, 0xd4, 0xe4, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x01, 0x2c, 0x7a, 0xb3, 0x01, 0x2b, 0x22,
136 0xb4, 0x01, 0x39, 0x7e, 0x21, 0xe6, 0x7c, 0x32, 0x7e, 0x13, 0x01, 0x2d, 0x2c, 0x21, 0x7a, 0x23,
137 0x01, 0x2d, 0x7e, 0x00, 0x00, 0x2e, 0x04, 0x01, 0x34, 0xe5, 0xe3, 0x7a, 0x09, 0xb0, 0x0b, 0x04,
138 0xa5, 0xdb, 0xf6, 0xa9, 0xd4, 0xe4, 0x75, 0x08, 0x70, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x2d,
139 0x7e, 0xa3, 0x01, 0x2a, 0xbc, 0xab, 0x78, 0x03, 0x12, 0x03, 0xec, 0x22, 0x02, 0x07, 0x55, 0xe5,
140 0xe6, 0xb4, 0x08, 0x65, 0xa9, 0xc4, 0xe2, 0x7e, 0x01, 0xe3, 0x7e, 0x11, 0xe3, 0x7e, 0x31, 0xe3,
141 0x7e, 0x21, 0xe3, 0x7e, 0x51, 0xe3, 0x7e, 0x41, 0xe3, 0x7e, 0x71, 0xe3, 0x7e, 0x61, 0xe3, 0x7a,
142 0x0f, 0x01, 0x23, 0x7a, 0x1f, 0x01, 0x27, 0x75, 0x08, 0x04, 0x12, 0x08, 0x33, 0x7a, 0x01, 0x08,
143 0x12, 0x08, 0x33, 0x7a, 0x11, 0x08, 0x12, 0x08, 0x33, 0x7a, 0x21, 0x08, 0x12, 0x08, 0x33, 0x7a,
144 0x31, 0x08, 0x12, 0x08, 0x33, 0x7a, 0x41, 0x08, 0x12, 0x08, 0x33, 0x7a, 0x51, 0x08, 0x12, 0x08,
145 0x33, 0x7a, 0x61, 0x08, 0x12, 0x08, 0x33, 0x7a, 0x71, 0x08, 0x12, 0x08, 0x33, 0xa9, 0xd4, 0xe4,
146 0xa9, 0xd7, 0xf4, 0xa9, 0xc6, 0xe2, 0x12, 0x03, 0xc0, 0x22, 0x6d, 0x00, 0x7e, 0x14, 0x01, 0x02,
147 0x7a, 0x07, 0x01, 0x32, 0x7a, 0x03, 0x01, 0x2d, 0x7e, 0xb3, 0x01, 0x23, 0x20, 0xe7, 0x0f, 0x7a,
148 0x23, 0x01, 0x2c, 0x7a, 0x33, 0x01, 0x2b, 0xbe, 0x07, 0x01, 0x29, 0x68, 0x09, 0x22, 0x7a, 0x33,
149 0x01, 0x2c, 0x7a, 0x23, 0x01, 0x2b, 0x7e, 0xb3, 0x01, 0x23, 0x54, 0xe3, 0x23, 0x23, 0x30, 0xe0,
150 0x02, 0xd2, 0xe5, 0x30, 0xe7, 0x02, 0xd2, 0xe4, 0x30, 0xe5, 0x06, 0x30, 0xe4, 0x03, 0x02, 0x07,
151 0x55, 0x54, 0x3e, 0xf5, 0xf0, 0x03, 0x54, 0x1f, 0xc3, 0x25, 0xf0, 0x90, 0x04, 0x18, 0x75, 0x84,
152 0xff, 0x73, 0x02, 0x05, 0x6c, 0x02, 0x04, 0x60, 0x02, 0x06, 0x09, 0x02, 0x06, 0x24, 0x02, 0x05,
153 0x05, 0x02, 0x04, 0xc6, 0x02, 0x06, 0x3d, 0x02, 0x06, 0x3d, 0x02, 0x06, 0x40, 0x02, 0x06, 0x40,
154 0x02, 0x06, 0x40, 0x02, 0x06, 0x40, 0x02, 0x06, 0x40, 0x02, 0x06, 0x40, 0x02, 0x06, 0x40, 0x02,
155 0x06, 0x40, 0x02, 0x06, 0x46, 0x02, 0x06, 0xfa, 0x02, 0x06, 0x43, 0x02, 0x06, 0x43, 0x02, 0x06,
156 0x43, 0x02, 0x06, 0x43, 0x02, 0x06, 0x43, 0x02, 0x06, 0x43, 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x06,
157 0x2a, 0x7e, 0xb3, 0x01, 0x25, 0x60, 0x56, 0x7c, 0x0b, 0x7e, 0x13, 0x01, 0x26, 0x7e, 0x17, 0x01,
158 0x27, 0x75, 0x08, 0x72, 0x12, 0x08, 0x33, 0x7a, 0x01, 0x08, 0x12, 0x08, 0x33, 0x7a, 0x11, 0x08,
159 0x12, 0x08, 0x33, 0x12, 0x07, 0x5f, 0x40, 0x35, 0x02, 0x02, 0x94, 0xb4, 0x08, 0x10, 0x75, 0x08,
160 0x74, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x3f, 0xf1, 0xf5, 0xf3, 0x75, 0xf6, 0x01, 0x22, 0xb4, 0x00,
161 0x1c, 0x75, 0x08, 0x75, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x3f, 0xf2, 0x30, 0xe0, 0x05, 0x75, 0xf3,
162 0x02, 0x80, 0x03, 0x75, 0xf3, 0x00, 0x75, 0xf3, 0x00, 0x75, 0xf6, 0x02, 0x22, 0x02, 0x07, 0x55,
163 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x00, 0x35, 0x75, 0x08, 0x76, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01,
164 0x28, 0x54, 0x0f, 0xf5, 0xf1, 0x7e, 0xb3, 0x01, 0x28, 0x20, 0xe7, 0x09, 0xe5, 0xe1, 0x30, 0xe7,
165 0x0d, 0x74, 0x01, 0x80, 0x0b, 0xe5, 0xe1, 0x30, 0xe6, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74, 0x00,
166 0x53, 0xf1, 0x80, 0xf5, 0xf3, 0x75, 0xf3, 0x00, 0x75, 0xf6, 0x02, 0x22, 0x02, 0x07, 0x55, 0xc0,
167 0xf1, 0x7e, 0xb3, 0x01, 0x28, 0x54, 0x0f, 0x42, 0xf1, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x00, 0x45,
168 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x01, 0x24, 0x75, 0x08, 0x77, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01,
169 0x28, 0x54, 0x0f, 0x78, 0x05, 0x53, 0xe1, 0x3f, 0x80, 0x37, 0x7e, 0xb3, 0x01, 0x28, 0x20, 0xe7,
170 0x05, 0x53, 0xe1, 0x7f, 0x80, 0x2b, 0x53, 0xe1, 0xbf, 0x80, 0x26, 0xb4, 0x03, 0x17, 0x75, 0x08,
171 0x78, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x28, 0x20, 0xe7, 0x05, 0x43, 0xe1, 0x80, 0x80, 0x11,
172 0x43, 0xe1, 0x40, 0x80, 0x0c, 0x43, 0xe1, 0xc0, 0xd0, 0xf1, 0x75, 0x08, 0x07, 0x12, 0x08, 0x33,
173 0x22, 0xd0, 0xf1, 0x02, 0x02, 0x90, 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x09, 0x23, 0x75, 0x08, 0x79,
174 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x26, 0xbe, 0xb3, 0x3f, 0xf1, 0x68, 0x11, 0xca, 0xb8, 0xc0,
175 0xf1, 0x12, 0x01, 0x1d, 0xd0, 0xf1, 0xda, 0xb8, 0x50, 0x76, 0x7a, 0xb3, 0x3f, 0xf1, 0x80, 0x6d,
176 0xb4, 0x05, 0x08, 0x75, 0x08, 0x7a, 0x12, 0x08, 0x33, 0x80, 0x62, 0xb4, 0x03, 0x19, 0x75, 0x08,
177 0x7b, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x01, 0x55, 0x7e, 0xb3, 0x3f, 0xf2, 0x44,
178 0x01, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x46, 0xb4, 0x01, 0x19, 0x75, 0x08, 0x7c, 0x12, 0x08, 0x33,
179 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x01, 0x39, 0x7e, 0xb3, 0x3f, 0xf2, 0x54, 0xfe, 0x7a, 0xb3, 0x3f,
180 0xf2, 0x80, 0x2a, 0xb4, 0x07, 0x2a, 0x7e, 0xb3, 0x01, 0x25, 0x60, 0x24, 0x7c, 0x0b, 0x7e, 0x13,
181 0x01, 0x26, 0x7e, 0x17, 0x01, 0x27, 0x75, 0x08, 0x73, 0x12, 0x08, 0x33, 0x7a, 0x01, 0x08, 0x12,
182 0x08, 0x33, 0x7a, 0x11, 0x08, 0x12, 0x08, 0x33, 0x12, 0x07, 0x8b, 0x40, 0x03, 0x02, 0x02, 0x90,
183 0x02, 0x07, 0x55, 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x0b, 0xf6, 0x75, 0x08, 0x7d, 0x12, 0x08, 0x33,
184 0x7e, 0xb3, 0x01, 0x26, 0x7e, 0xa3, 0x01, 0x28, 0x4c, 0xab, 0x78, 0xe4, 0x80, 0xdf, 0x7e, 0xb3,
185 0x01, 0x24, 0xb4, 0x0a, 0xdb, 0x75, 0x08, 0x7e, 0x12, 0x08, 0x33, 0x7e, 0xb3, 0x01, 0x26, 0x70,
186 0xcf, 0xf5, 0xf3, 0x75, 0xf6, 0x01, 0x22, 0x02, 0x07, 0x55, 0x02, 0x07, 0x55, 0x02, 0x07, 0x55,
187 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x04, 0x20, 0x75, 0x08, 0xc3, 0x12, 0x08, 0x33, 0x7e, 0x04, 0x00,
188 0x01, 0x7e, 0x17, 0x01, 0x25, 0x7e, 0x18, 0x01, 0x34, 0x7a, 0x1c, 0x00, 0x00, 0x7e, 0x47, 0x01,
189 0x29, 0x12, 0x08, 0x3f, 0x02, 0x06, 0xf4, 0xb4, 0x06, 0x3a, 0x75, 0x08, 0xc1, 0x12, 0x08, 0x33,
190 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7d, 0xca, 0x7e, 0xd7, 0x01, 0x25, 0x7e, 0x78,
191 0x01, 0x34, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x01, 0x29, 0x75, 0x08, 0xc1, 0x12, 0x08, 0x33,
192 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x08, 0xd6, 0xd0, 0x87, 0xd0, 0xa8,
193 0x40, 0x4f, 0x80, 0x4a, 0xb4, 0x00, 0x1c, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x02, 0x90, 0xe4,
194 0x8d, 0xef, 0x8d, 0xef, 0x8d, 0xef, 0xd5, 0xe0, 0xf7, 0xc0, 0xd1, 0xca, 0x02, 0xff, 0xca, 0x06,
195 0x00, 0x00, 0x32, 0xb4, 0x09, 0x12, 0x7e, 0x57, 0x01, 0x25, 0x4d, 0x55, 0x68, 0x05, 0xa9, 0xd2,
196 0xb1, 0x80, 0x03, 0xa9, 0xc2, 0xb1, 0x80, 0x16, 0xb4, 0x07, 0x16, 0xc2, 0xaf, 0x7e, 0x07, 0x01,
197 0x27, 0x7e, 0x17, 0x01, 0x25, 0xc0, 0xd1, 0xca, 0x18, 0xca, 0x38, 0xca, 0x28, 0x32, 0x02, 0x02,
198 0x90, 0x02, 0x07, 0x55, 0x7e, 0xb3, 0x01, 0x24, 0xb4, 0x03, 0x15, 0x75, 0x08, 0xc2, 0x12, 0x08,
199 0x33, 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x17, 0x01, 0x25, 0x7e, 0x57, 0x01, 0x29, 0x02, 0x02, 0x94,
200 0xb4, 0x05, 0x39, 0x75, 0x08, 0xc0, 0x12, 0x08, 0x33, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9,
201 0xd5, 0x87, 0x7e, 0x08, 0x01, 0x34, 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x37,
202 0x01, 0x25, 0x7e, 0x47, 0x01, 0x29, 0x12, 0x08, 0x3f, 0xd0, 0x87, 0xd0, 0xa8, 0x7e, 0x08, 0x01,
203 0x34, 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x57, 0x01, 0x29, 0x02, 0x02, 0x94, 0x02, 0x07, 0x55, 0x75,
204 0x08, 0x07, 0x12, 0x08, 0x33, 0x43, 0xe1, 0xc0, 0x22, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9,
205 0xd5, 0x87, 0x12, 0x07, 0xca, 0x40, 0x19, 0x7e, 0x08, 0x01, 0x34, 0x7a, 0x0c, 0x00, 0x00, 0xca,
206 0x0b, 0xca, 0x49, 0x12, 0x08, 0x3f, 0xda, 0x59, 0xda, 0x0b, 0xd0, 0x87, 0xd0, 0xa8, 0xc3, 0x22,
207 0xd0, 0x87, 0xd0, 0xa8, 0x22, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x07,
208 0xca, 0x40, 0x2b, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7f, 0x61, 0x7e, 0x78, 0x01,
209 0x34, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x01, 0x29, 0xbd, 0x74, 0x78, 0x11, 0x75, 0x08, 0xc1,
210 0x12, 0x08, 0x33, 0x12, 0x08, 0xd6, 0x40, 0x06, 0xd0, 0x87, 0xd0, 0xa8, 0xc3, 0x22, 0xd0, 0x87,
211 0xd0, 0xa8, 0xd3, 0x22, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x34, 0x7f, 0xca, 0x0b, 0x1a, 0x50, 0xc5,
212 0xf0, 0x7d, 0x62, 0x7d, 0x75, 0x7d, 0x87, 0x7e, 0x34, 0x7f, 0x03, 0x7e, 0x1b, 0xb0, 0xbc, 0x0b,
213 0x50, 0x49, 0x3e, 0x00, 0x3e, 0x00, 0x0a, 0x50, 0x2d, 0x75, 0x0b, 0x3a, 0x30, 0x69, 0x53, 0x00,
214 0x02, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbc, 0x1b, 0x50, 0x30, 0x3e, 0x10, 0x3e, 0x10, 0x0a,
215 0x51, 0x2d, 0x35, 0x69, 0x41, 0x00, 0x02, 0x0b, 0x1a, 0x30, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38,
216 0xbe, 0x44, 0xff, 0xff, 0x78, 0x05, 0x7e, 0x1b, 0x90, 0x0a, 0x49, 0x4d, 0x44, 0x68, 0x0c, 0xbe,
217 0x44, 0x00, 0xff, 0x28, 0x04, 0x7e, 0x44, 0x00, 0xff, 0xc3, 0x22, 0xd3, 0x22,
218
219// Segment #16, EXCLUDED Start Address 00ff7c00, Length 199
220
221
222// Segment #17, EXCLUDED Start Address 00ff7f00, Length 192
223
224
225// Segment #17, Start Address 00ff7fc0, Length 64
2260xff,0x00,0xc0,0x7f,0x40,0x00,
227 0x40, 0x01, 0x02, 0x00, 0xca, 0x1b, 0x01, 0x0c, 0x02, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231
232// Segment #18, Start Address 00ff0833, Length 5015
2330xff,0x00,0x33,0x08,0x97,0x13,
234 0xca, 0x08, 0x7e, 0x01, 0x08, 0x7a, 0x03, 0x3f, 0xf0, 0xda, 0x08, 0x22, 0x80, 0x50, 0x0b, 0x1a,
235 0x60, 0x0b, 0x35, 0x0b, 0x1a, 0x70, 0x0b, 0x35, 0x0b, 0x1a, 0x80, 0x0b, 0x35, 0x0b, 0x1a, 0x90,
236 0x0b, 0x35, 0x0b, 0x1a, 0xa0, 0x0b, 0x35, 0x0b, 0x1a, 0xb0, 0x0b, 0x35, 0x0b, 0x1a, 0xc0, 0x0b,
237 0x35, 0x0b, 0x1a, 0xd0, 0x0b, 0x35, 0x1b, 0x0a, 0x60, 0x0b, 0x15, 0x1b, 0x0a, 0x70, 0x0b, 0x15,
238 0x1b, 0x0a, 0x80, 0x0b, 0x15, 0x1b, 0x0a, 0x90, 0x0b, 0x15, 0x1b, 0x0a, 0xa0, 0x0b, 0x15, 0x1b,
239 0x0a, 0xb0, 0x0b, 0x15, 0x1b, 0x0a, 0xc0, 0x0b, 0x15, 0x1b, 0x0a, 0xd0, 0x0b, 0x15, 0x9e, 0x44,
240 0x00, 0x10, 0x50, 0xaa, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x0e, 0x7e, 0x1b, 0xc0, 0x7a, 0x0b, 0xc0,
241 0x0b, 0x14, 0x0b, 0x34, 0x1b, 0x44, 0x78, 0xf2, 0x22, 0x7f, 0x6f, 0x7f, 0xf0, 0x1b, 0xfc, 0x7c,
242 0x54, 0x7d, 0x32, 0x80, 0x08, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0x9e, 0x44, 0x00,
243 0x10, 0x50, 0xf2, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x06, 0xca, 0x48, 0x1b, 0x44, 0x78, 0xfa, 0x7f,
244 0xf6, 0x89, 0xe4, 0xca, 0x6b, 0x5e, 0xd4, 0x00, 0x3f, 0x68, 0x20, 0x7e, 0x84, 0x00, 0x40, 0x9d,
245 0x8d, 0xda, 0x6b, 0xbd, 0x87, 0x38, 0x16, 0xca, 0x79, 0x7d, 0x78, 0x12, 0x09, 0x00, 0xda, 0x79,
246 0x40, 0x08, 0x9d, 0x78, 0x68, 0x02, 0x80, 0x05, 0xc2, 0xd7, 0x22, 0xda, 0x6b, 0x43, 0x90, 0x30,
247 0x74, 0xaa, 0x39, 0xb5, 0x55, 0x55, 0x74, 0x55, 0x39, 0xb5, 0x2a, 0xaa, 0x74, 0xa0, 0x39, 0xb5,
248 0x55, 0x55, 0x7e, 0x04, 0x00, 0x40, 0x9d, 0x70, 0x50, 0x06, 0x2d, 0x70, 0x7d, 0x07, 0x6d, 0x77,
249 0x7c, 0x31, 0x7e, 0x7b, 0x00, 0x7a, 0x6b, 0x00, 0x0b, 0x7c, 0x0b, 0x6c, 0xa5, 0xd9, 0xf3, 0x7f,
250 0x16, 0x1b, 0x1c, 0x7e, 0x54, 0x27, 0x10, 0x7e, 0x1b, 0x10, 0xbc, 0x10, 0x68, 0x06, 0x1b, 0x54,
251 0x78, 0xf5, 0x80, 0x2c, 0x6d, 0x00, 0x7c, 0x20, 0x7f, 0x16, 0x9f, 0x10, 0x7f, 0x27, 0x9f, 0x20,
252 0x7e, 0x2b, 0x00, 0x7e, 0x1b, 0x10, 0xbc, 0x01, 0x78, 0x16, 0x0b, 0x2c, 0x0b, 0x1c, 0xa5, 0xdb,
253 0xef, 0x7c, 0xb6, 0x20, 0xe0, 0x03, 0x63, 0x90, 0x30, 0x4d, 0x77, 0x78, 0x93, 0xc2, 0xd7, 0x22,
254 0xd2, 0xd7, 0x22, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x06, 0x04, 0x02, 0x04, 0x00, 0x02, 0x01,
255 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02,
256 0x04, 0x00, 0x08, 0x10, 0x02, 0x10, 0x04, 0x02, 0x08, 0x00, 0x01, 0x01, 0x08, 0x7e, 0x18, 0x7f,
257 0xbd, 0x7a, 0x1c, 0x00, 0xff, 0x0b, 0x1a, 0x00, 0xbe, 0x10, 0x14, 0x38, 0x1a, 0x0a, 0x51, 0x23,
258 0x7e, 0x18, 0x09, 0x76, 0x7a, 0x1c, 0x00, 0xff, 0x2d, 0x35, 0x0b, 0x1a, 0x50, 0x60, 0x08, 0xa5,
259 0xb8, 0x02, 0x03, 0x4e, 0xa0, 0x08, 0x22, 0x80, 0xfe, 0x7e, 0xe8, 0x7f, 0xbf, 0x7a, 0xec, 0x00,
260 0xff, 0xe0, 0xf5, 0x22, 0x54, 0xc0, 0x68, 0x16, 0x7e, 0xe8, 0x7f, 0xbe, 0x7a, 0xec, 0x00, 0xff,
261 0xe0, 0x60, 0x0c, 0x12, 0x09, 0xa0, 0xf5, 0x09, 0x7a, 0xa1, 0x20, 0x02, 0x0f, 0x0a, 0x22, 0xc2,
262 0x95, 0xd2, 0x94, 0x12, 0x19, 0xfb, 0x53, 0x90, 0xcf, 0x12, 0x19, 0xfb, 0x80, 0xf1, 0x0d, 0x0a,
263 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d,
264 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
265 0x45, 0x64, 0x67, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x34, 0x20, 0x2d, 0x20, 0x48, 0x61, 0x72,
266 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63,
267 0x73, 0x2c, 0x20, 0x52, 0x65, 0x76, 0x20, 0x31, 0x2e, 0x30, 0x30, 0x3b, 0x20, 0x43, 0x6f, 0x70,
268 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x31, 0x39, 0x39, 0x38, 0x20, 0x49, 0x6e, 0x73, 0x69,
269 0x64, 0x65, 0x20, 0x4f, 0x75, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x0d,
270 0x0a, 0x00, 0x50, 0x61, 0x73, 0x73, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x20, 0x21, 0x21, 0x00, 0x50,
271 0x61, 0x73, 0x73, 0x20, 0x20, 0x20, 0x20, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x20, 0x21, 0x21, 0x20,
272 0x00, 0x0d, 0x0a, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x20, 0x52, 0x61, 0x6d, 0x3a, 0x20, 0x20,
273 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
274 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x61, 0x6d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x3a, 0x20, 0x20,
275 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
276 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62,
277 0x69, 0x74, 0x20, 0x30, 0x2d, 0x31, 0x34, 0x20, 0x74, 0x65, 0x73, 0x74, 0x3a, 0x20, 0x20, 0x20,
278 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x57, 0x72, 0x6f, 0x74, 0x65, 0x20, 0x41,
279 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x20, 0x30, 0x30, 0x3a, 0x00, 0x20, 0x20, 0x77, 0x69,
280 0x74, 0x68, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x00, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20,
281 0x72, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x00, 0x0d, 0x0a, 0x4f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20,
282 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c,
283 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x69,
284 0x74, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68,
285 0x6f, 0x72, 0x74, 0x65, 0x64, 0x0d, 0x0a, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68,
286 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x00, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x00, 0x0d, 0x0a, 0x44, 0x65,
287 0x74, 0x65, 0x63, 0x74, 0x20, 0x55, 0x61, 0x72, 0x74, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
288 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a,
289 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x20, 0x50, 0x61, 0x64, 0x2c, 0x46, 0x69, 0x46, 0x6f,
290 0x20, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x26, 0x20, 0x52, 0x53, 0x54, 0x3a, 0x20, 0x00,
291 0x0d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x55, 0x61, 0x72, 0x74, 0x20, 0x54, 0x65, 0x73, 0x74, 0x73,
292 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
293 0x20, 0x20, 0x20, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x31, 0x20, 0x20, 0x20, 0x50, 0x6f, 0x72, 0x74,
294 0x32, 0x20, 0x20, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x33, 0x20, 0x20, 0x20, 0x50, 0x6f, 0x72, 0x74,
295 0x34, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
296 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
297 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
298 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
299 0x2d, 0x00, 0x0d, 0x0a, 0x50, 0x6f, 0x72, 0x74, 0x20, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72,
300 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
301 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20,
302 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
303 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x41, 0x6e, 0x61, 0x6c,
304 0x6f, 0x67, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x20, 0x20, 0x20,
305 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a,
306 0x52, 0x58, 0x44, 0x2c, 0x54, 0x58, 0x44, 0x20, 0x74, 0x6f, 0x20, 0x52, 0x54, 0x53, 0x2c, 0x43,
307 0x54, 0x53, 0x2c, 0x52, 0x49, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x20, 0x20, 0x20,
308 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x58, 0x44, 0x2c, 0x54, 0x58, 0x44, 0x20, 0x74, 0x6f, 0x20, 0x44,
309 0x54, 0x52, 0x2c, 0x44, 0x53, 0x52, 0x2c, 0x43, 0x44, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a,
310 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x54, 0x53, 0x5b, 0x43, 0x54, 0x53, 0x2c,
311 0x52, 0x49, 0x5d, 0x20, 0x74, 0x6f, 0x20, 0x44, 0x54, 0x52, 0x2c, 0x44, 0x53, 0x52, 0x2c, 0x43,
312 0x44, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x54, 0x53, 0x5b,
313 0x43, 0x54, 0x53, 0x2c, 0x43, 0x44, 0x5d, 0x20, 0x74, 0x6f, 0x20, 0x44, 0x53, 0x52, 0x2c, 0x52,
314 0x49, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a,
315 0x44, 0x54, 0x52, 0x5b, 0x44, 0x53, 0x52, 0x2c, 0x43, 0x44, 0x5d, 0x20, 0x74, 0x6f, 0x20, 0x52,
316 0x54, 0x53, 0x2c, 0x43, 0x54, 0x53, 0x2c, 0x52, 0x49, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a,
317 0x20, 0x00, 0x0d, 0x0a, 0x44, 0x54, 0x52, 0x20, 0x74, 0x6f, 0x20, 0x43, 0x54, 0x53, 0x2c, 0x43,
318 0x44, 0x20, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
319 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x54, 0x53, 0x20, 0x74, 0x6f, 0x20, 0x43,
320 0x54, 0x53, 0x2c, 0x52, 0x49, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20,
321 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a, 0x52, 0x54, 0x53, 0x20,
322 0x74, 0x6f, 0x20, 0x43, 0x54, 0x53, 0x2c, 0x43, 0x44, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61,
323 0x63, 0x6b, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0d, 0x0a,
324 0x44, 0x54, 0x52, 0x20, 0x74, 0x6f, 0x20, 0x44, 0x53, 0x52, 0x2c, 0x43, 0x44, 0x20, 0x4c, 0x6f,
325 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
326 0x20, 0x00, 0x0d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x45, 0x20, 0x52, 0x20, 0x52, 0x20, 0x4f, 0x20,
327 0x52, 0x20, 0x21, 0x21, 0x21, 0x2c, 0x20, 0x45, 0x20, 0x52, 0x20, 0x52, 0x20, 0x4f, 0x20, 0x52,
328 0x20, 0x21, 0x21, 0x21, 0x20, 0x2c, 0x20, 0x45, 0x20, 0x52, 0x20, 0x52, 0x20, 0x4f, 0x20, 0x52,
329 0x20, 0x21, 0x21, 0x21, 0x0d, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69,
330 0x63, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x65,
331 0x72, 0x20, 0x61, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x6f,
332 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x64, 0x65, 0x74, 0x65,
333 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x00, 0x0d, 0x0a, 0x0a, 0x4e,
334 0x6f, 0x20, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72,
335 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x0d, 0x0a, 0x00, 0x43, 0x6f,
336 0x70, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
337 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x27,
338 0x73, 0x20, 0x45, 0x45, 0x70, 0x72, 0x6f, 0x6d, 0x20, 0x2e, 0x2e, 0x2e, 0x00, 0x44, 0x6f, 0x6e,
339 0x65, 0x0d, 0x0a, 0x0a, 0x2d, 0x3e, 0x20, 0x54, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x74,
340 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
341 0x20, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x73,
342 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f,
343 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x00, 0xc2, 0xaf, 0xc2, 0x09, 0xc2, 0x0a, 0x75, 0x90, 0x0d,
344 0x20, 0x17, 0x02, 0xd2, 0xb5, 0x43, 0x90, 0x30, 0x6c, 0x00, 0x7e, 0x10, 0x03, 0x12, 0x0f, 0x38,
345 0x7e, 0x68, 0x0a, 0x01, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x0b, 0x00, 0x30, 0xb4, 0x02,
346 0x80, 0x24, 0x02, 0x1b, 0x3c, 0x20, 0x09, 0x1d, 0xc2, 0x94, 0xd2, 0x95, 0x12, 0x19, 0xfb, 0x53,
347 0x90, 0xcf, 0x12, 0x19, 0xfb, 0xc2, 0x95, 0xd2, 0x94, 0x12, 0x19, 0xfb, 0xa5, 0xd9, 0xe6, 0x43,
348 0x90, 0x30, 0x12, 0x19, 0xfb, 0x22, 0x7e, 0x68, 0x0a, 0x94, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a,
349 0x93, 0x7e, 0xe4, 0x10, 0x00, 0x7e, 0x40, 0x55, 0x7a, 0xe9, 0x40, 0x0b, 0xe4, 0x7e, 0x50, 0xaa,
350 0x7a, 0xe9, 0x50, 0x1b, 0xe4, 0xbe, 0xe9, 0x40, 0x68, 0x19, 0x7e, 0x68, 0x0a, 0x7a, 0x7a, 0x6c,
351 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x13, 0x7a, 0xe9, 0x40, 0x7e, 0xe9,
352 0x10, 0x80, 0xf8, 0x7e, 0x68, 0x0a, 0x75, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x0b, 0x00,
353 0x7e, 0x68, 0x0a, 0xd8, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x78, 0x00, 0x00, 0x7e,
354 0x70, 0x0e, 0x7e, 0xa4, 0xff, 0xff, 0x7e, 0xb4, 0xbf, 0xff, 0x7d, 0xcb, 0x0e, 0xc4, 0x7d, 0xdc,
355 0x5d, 0xdb, 0x6c, 0xbb, 0x7d, 0xfa, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x0b, 0xb0, 0x7d,
356 0xfb, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x0b, 0xb0, 0x7d, 0xfc, 0x5e, 0xf4, 0x7f, 0xff,
357 0x7a, 0x7b, 0xb0, 0x0b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x6c, 0xbb,
358 0x7d, 0xfa, 0x5e, 0xf4, 0x7f, 0xff, 0xbe, 0x7b, 0xb0, 0x78, 0x41, 0x0b, 0xb0, 0x7d, 0xfb, 0x5e,
359 0xf4, 0x7f, 0xff, 0xbe, 0x7b, 0xb0, 0x78, 0x34, 0x0b, 0xb0, 0x7d, 0xfc, 0x5e, 0xf4, 0x7f, 0xff,
360 0xbe, 0x7b, 0xb0, 0x78, 0x27, 0x0b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0xbe, 0x7b, 0xb0,
361 0x78, 0x1a, 0x0b, 0xb0, 0xbe, 0xc4, 0xff, 0xfe, 0x78, 0x92, 0x0e, 0xb4, 0xa5, 0xdf, 0x8b, 0x7e,
362 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x77, 0xca, 0x5b, 0xca, 0x6b,
363 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x68, 0x0b, 0x2a, 0x7a,
364 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x0a, 0x47, 0x12, 0x1a, 0xc9, 0x7e, 0x68, 0x0b, 0x79, 0x7a,
365 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x6c, 0x77, 0xda, 0x6b, 0xca, 0x6b, 0x0b, 0x70, 0x0e, 0xc4,
366 0xbe, 0xc4, 0xff, 0xff, 0x78, 0xf6, 0x1b, 0x70, 0x0a, 0x47, 0x12, 0x1a, 0xc9, 0x12, 0x1a, 0x08,
367 0x30, 0x09, 0x30, 0xda, 0x6b, 0xda, 0x5b, 0x6c, 0xbb, 0x7e, 0x78, 0x00, 0x00, 0x7d, 0xfa, 0x5e,
368 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x7d, 0xfb, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x7d,
369 0xfc, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b,
370 0xb0, 0x80, 0xd4, 0x7e, 0x68, 0x0a, 0xb6, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x30, 0x17,
371 0x0e, 0x7e, 0x78, 0x04, 0x20, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x44, 0x7b, 0xe0, 0x80, 0x0c, 0x7e,
372 0x78, 0x00, 0x00, 0x7a, 0x7c, 0x00, 0x01, 0x7e, 0x44, 0x80, 0x00, 0x0b, 0x00, 0x7e, 0x40, 0x3a,
373 0x7c, 0x54, 0x7f, 0x57, 0x7d, 0x84, 0x6c, 0x66, 0x7a, 0x5b, 0x50, 0x0b, 0x5c, 0x0b, 0x50, 0xa5,
374 0xde, 0x02, 0x0b, 0x50, 0x1b, 0x84, 0x78, 0xf0, 0x7c, 0x54, 0x7f, 0x57, 0x7d, 0x84, 0x6c, 0x66,
375 0xbe, 0x5b, 0x50, 0x78, 0x1a, 0x0b, 0x5c, 0x0b, 0x50, 0xa5, 0xde, 0x02, 0x0b, 0x50, 0x1b, 0x84,
376 0x78, 0xee, 0x7e, 0x68, 0x0a, 0x75, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x4b, 0x7f,
377 0x45, 0x7e, 0x68, 0x0a, 0x7a, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x68, 0x0a, 0xfa,
378 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7d, 0x4b, 0x12, 0x1a, 0xc9, 0x7e, 0x68, 0x0b, 0x0f,
379 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x6c, 0x88, 0x7c, 0x95, 0x12, 0x1a, 0xc9, 0x7e, 0x68,
380 0x0b, 0x1d, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x4b, 0x90, 0x12, 0x1a, 0xc9, 0x12,
381 0x1a, 0x08, 0x30, 0x09, 0x05, 0x7e, 0x4b, 0x90, 0x80, 0xfb, 0x7e, 0x68, 0x0b, 0x7f, 0x7a, 0x6c,
382 0x00, 0xff, 0x12, 0x1a, 0x93, 0x0b, 0x00, 0xd2, 0x92, 0x7e, 0x24, 0x80, 0x00, 0x09, 0xb2, 0x00,
383 0x08, 0xbe, 0xb0, 0x01, 0x78, 0x0b, 0x09, 0xb2, 0x00, 0x14, 0xbe, 0xb0, 0x60, 0x78, 0x02, 0x80,
384 0x17, 0x7e, 0x68, 0x0a, 0x7a, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30,
385 0x09, 0x11, 0x09, 0xb2, 0x00, 0x08, 0x80, 0xfa, 0x7e, 0x68, 0x0a, 0x75, 0x7a, 0x6c, 0x00, 0xff,
386 0x12, 0x1a, 0x93, 0x7e, 0x68, 0x0b, 0xa1, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x0b, 0x00,
387 0xc2, 0x92, 0x12, 0x19, 0xee, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x1c,
388 0x7e, 0xb0, 0x01, 0x19, 0xb2, 0x00, 0x08, 0x09, 0xb2, 0x00, 0x1c, 0xbc, 0xab, 0x78, 0x37, 0x09,
389 0xb2, 0x00, 0x08, 0x5e, 0xb0, 0xc0, 0xbe, 0xb0, 0xc0, 0x78, 0x2b, 0x7e, 0xa0, 0xaa, 0x19, 0xa2,
390 0x00, 0x1c, 0x6c, 0xbb, 0x19, 0xb2, 0x00, 0x08, 0x09, 0xb2, 0x00, 0x1c, 0xbc, 0xab, 0x78, 0x16,
391 0x09, 0xb2, 0x00, 0x08, 0x5e, 0xb0, 0xc0, 0x78, 0x0d, 0x7e, 0x68, 0x0a, 0x75, 0x7a, 0x6c, 0x00,
392 0xff, 0x12, 0x1a, 0x93, 0x80, 0x1b, 0x7e, 0x68, 0x0a, 0x7a, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a,
393 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x0a, 0x19, 0xa2, 0x00, 0x1c, 0x09, 0xb2, 0x00, 0x1c, 0x80,
394 0xf6, 0x7e, 0x68, 0x0b, 0xc3, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x68, 0x0c, 0x45,
395 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x7e, 0xb0,
396 0x01, 0x19, 0xb2, 0x00, 0x1c, 0x2e, 0x24, 0x01, 0x00, 0x0b, 0xb0, 0xa5, 0xd9, 0xf3, 0x7e, 0x24,
397 0x80, 0x00, 0x7e, 0x11, 0x09, 0x7e, 0xb0, 0x01, 0x0b, 0x00, 0x09, 0xa2, 0x00, 0x1c, 0xbc, 0xab,
398 0x78, 0x16, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x2e, 0x24, 0x01,
399 0x00, 0x0b, 0xb0, 0xa5, 0xd9, 0xe2, 0x80, 0x25, 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff,
400 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0xe4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09,
401 0x09, 0xa2, 0x00, 0x1c, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xf5, 0x80, 0xec, 0x7e, 0x68, 0x0c,
402 0x69, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x13, 0x8a, 0x7e, 0x24, 0x80, 0x00, 0x7e,
403 0x11, 0x09, 0x0b, 0x00, 0x74, 0x10, 0x19, 0xb2, 0x00, 0x10, 0x12, 0x13, 0x03, 0x2e, 0x24, 0x01,
404 0x00, 0xa5, 0xd9, 0xee, 0x7e, 0x68, 0x0c, 0x8d, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e,
405 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0xe4, 0x19, 0xb2, 0x00, 0x10, 0x12, 0x13, 0x03,
406 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xef, 0x30, 0x00, 0x03, 0x02, 0x18, 0xb7, 0x02, 0x13, 0xbb,
407 0x74, 0x07, 0x19, 0xb2, 0x00, 0x08, 0x12, 0x19, 0xfb, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00,
408 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00, 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00,
409 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xc2, 0x0b, 0x7e, 0xb0, 0x55, 0x12, 0x13,
410 0x64, 0x7e, 0xb0, 0xaa, 0x12, 0x13, 0x64, 0x7e, 0xb0, 0x00, 0x12, 0x13, 0x64, 0x7e, 0xb0, 0xff,
411 0x12, 0x13, 0x64, 0x30, 0x0b, 0x0f, 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a,
412 0x93, 0x12, 0x1a, 0x08, 0x22, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93,
413 0x22, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x09, 0xa2, 0x00, 0x00, 0xbc, 0xab, 0x78, 0x01,
414 0x22, 0x20, 0x09, 0x03, 0xd2, 0x0b, 0x22, 0x12, 0x1a, 0x08, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x19,
415 0xee, 0x09, 0xa2, 0x00, 0x00, 0x80, 0xf3, 0xd2, 0x92, 0x12, 0x19, 0xee, 0xc2, 0x92, 0x12, 0x19,
416 0xee, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x74, 0x80, 0x19, 0xb2, 0x00, 0x0c, 0x7e, 0x54,
417 0x00, 0x02, 0x19, 0xa2, 0x00, 0x04, 0x19, 0xb2, 0x00, 0x00, 0x74, 0x03, 0x19, 0xb2, 0x00, 0x0c,
418 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xe1, 0x22, 0x7e, 0x68, 0x0c, 0xb1, 0x7a, 0x6c, 0x00, 0xff,
419 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x12, 0x19, 0xee, 0x09,
420 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00,
421 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x0d, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a,
422 0x93, 0x80, 0x1a, 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a,
423 0x08, 0x30, 0x09, 0x09, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x80, 0xf7, 0x2e, 0x24, 0x01,
424 0x00, 0xa5, 0xd9, 0xb6, 0x7e, 0x68, 0x0c, 0xd5, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e,
425 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e,
426 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x0a,
427 0x78, 0x0d, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x1a, 0x7e,
428 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x09,
429 0x19, 0xa2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x80, 0xf7, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xb6,
430 0x30, 0x04, 0x03, 0x02, 0x16, 0x8c, 0x7e, 0x68, 0x0c, 0xf9, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a,
431 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10,
432 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa,
433 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x0a, 0x78, 0x3c,
434 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0,
435 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09,
436 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x0a, 0x78, 0x14, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff,
437 0x12, 0x1a, 0x93, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68, 0x0a, 0x8b,
438 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0xe6, 0x7e, 0xa0, 0x02,
439 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68, 0x0d, 0x41,
440 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00,
441 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x01,
442 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00,
443 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x3c, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee,
444 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x02, 0x19, 0xa2,
445 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x14, 0x7e, 0x68,
446 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e,
447 0x80, 0x20, 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08,
448 0x30, 0x09, 0xe6, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10,
449 0x80, 0xf1, 0x7e, 0x68, 0x0d, 0x89, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80,
450 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee,
451 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x50, 0xbe, 0xb0, 0x50, 0x78, 0x1f, 0x6c, 0xaa, 0x19, 0xa2,
452 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x50, 0x78, 0x0d, 0x7e, 0x68,
453 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x20, 0x7e, 0x68, 0x0a, 0x8b, 0x7a,
454 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x0f, 0x7e, 0xa0, 0x02, 0x19,
455 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x2e, 0x24, 0x01, 0x00, 0xa5,
456 0xd9, 0xa2, 0x7e, 0x68, 0x0d, 0xd1, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80,
457 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00,
458 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0xa0, 0xbe, 0xb0, 0xa0, 0x78, 0x1f,
459 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0xa0,
460 0x78, 0x0d, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x20, 0x7e,
461 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x0f,
462 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x2e,
463 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x02, 0x18, 0x2b, 0x7e, 0x68, 0x0d, 0x1d, 0x7a, 0x6c, 0x00,
464 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x6c, 0xaa, 0x19,
465 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00,
466 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0,
467 0x06, 0x78, 0x3c, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00,
468 0x18, 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12,
469 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x06, 0x78, 0x14, 0x7e, 0x68, 0x0a, 0x82, 0x7a,
470 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e,
471 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0xe6,
472 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e,
473 0x68, 0x0d, 0x65, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11,
474 0x09, 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18,
475 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee,
476 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x09, 0x78, 0x3c, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10,
477 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0,
478 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x09, 0x78,
479 0x14, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x2e, 0x24, 0x01, 0x00,
480 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68, 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93,
481 0x12, 0x1a, 0x08, 0x30, 0x09, 0xe6, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19,
482 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68, 0x0d, 0xad, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93,
483 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10,
484 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x90, 0xbe, 0xb0, 0x90, 0x78, 0x1f, 0x6c,
485 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x90, 0x78,
486 0x0d, 0x7e, 0x68, 0x0a, 0x82, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x80, 0x20, 0x7e, 0x68,
487 0x0a, 0x8b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1a, 0x08, 0x30, 0x09, 0x0f, 0x7e,
488 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x2e, 0x24,
489 0x01, 0x00, 0xa5, 0xd9, 0xa2, 0x02, 0x18, 0xb7, 0x30, 0x17, 0x03, 0x02, 0x19, 0x3b, 0xc2, 0x8a,
490 0x12, 0x19, 0x22, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x04,
491 0x12, 0x19, 0xee, 0x0b, 0x00, 0x7e, 0xa0, 0x08, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x20,
492 0x8b, 0x3e, 0x20, 0x89, 0x3b, 0x7e, 0xa0, 0x08, 0x19, 0xa2, 0x00, 0x04, 0x09, 0xa2, 0x00, 0x10,
493 0x4e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x30, 0x8b, 0x23, 0x30, 0x89, 0x20,
494 0x09, 0xa2, 0x00, 0x10, 0x5e, 0xa0, 0xfd, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee, 0x7e, 0xa0,
495 0x00, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x19, 0xee, 0x20, 0x8b, 0x05, 0x20, 0x89, 0x02, 0x80, 0x1a,
496 0x12, 0x1a, 0x08, 0x30, 0x09, 0x14, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x00, 0x00, 0x5e,
497 0xa0, 0xfd, 0x19, 0xa2, 0x00, 0x10, 0x00, 0x00, 0x80, 0xec, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9,
498 0x89, 0x02, 0x19, 0x3b, 0x20, 0x17, 0xfa, 0x12, 0x13, 0x8a, 0x12, 0x19, 0x22, 0x7e, 0x24, 0x80,
499 0x00, 0x7e, 0x11, 0x09, 0x0b, 0x00, 0x20, 0x89, 0x26, 0x7e, 0xa0, 0xff, 0x19, 0xa2, 0x00, 0x04,
500 0x12, 0x19, 0xee, 0x7e, 0xb0, 0x55, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x30, 0x89, 0x0f,
501 0x7e, 0xa0, 0x00, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x19, 0xee, 0x20, 0x89, 0x02, 0x80, 0x26, 0x12,
502 0x1a, 0x08, 0x30, 0x09, 0x20, 0x7e, 0xa0, 0xff, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x19, 0xee, 0x7e,
503 0xb0, 0x55, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x19, 0xee, 0x7e, 0xa0, 0x00, 0x19, 0xa2, 0x00, 0x04,
504 0x12, 0x19, 0xee, 0x80, 0xe0, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xa8, 0x02, 0x19, 0x3b, 0x7e,
505 0x24, 0x80, 0x00, 0x7e, 0x11, 0x09, 0x7e, 0xa0, 0x08, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x19, 0xee,
506 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xef, 0x22, 0x30, 0x0a, 0x19, 0x7e, 0x68, 0x0d, 0xf5, 0x7a,
507 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0xd2, 0x09, 0x12, 0x19, 0xee, 0x12, 0x19, 0xee, 0x12, 0x19,
508 0xee, 0x02, 0x0f, 0x10, 0x30, 0x17, 0x1c, 0x7e, 0x68, 0x0e, 0x6f, 0x7a, 0x6c, 0x00, 0xff, 0x12,
509 0x1a, 0x93, 0x7e, 0x68, 0x0e, 0x91, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x1a, 0x93, 0x12, 0x1b, 0x3c,
510 0x02, 0x19, 0xe6, 0x0b, 0x00, 0x7e, 0x78, 0x19, 0xa0, 0x7a, 0x7c, 0x00, 0xff, 0x7f, 0x67, 0x7a,
511 0x6c, 0x00, 0x00, 0x7e, 0x70, 0x3e, 0x7e, 0x7b, 0xb0, 0x7a, 0x6b, 0xb0, 0x0b, 0x7c, 0x0b, 0x6c,
512 0xa5, 0xdf, 0xf3, 0x7e, 0x78, 0x19, 0xa0, 0x7a, 0x7c, 0x00, 0x00, 0x89, 0x78, 0x7e, 0x78, 0x00,
513 0x00, 0x7a, 0x7c, 0x00, 0xfe, 0x7e, 0x68, 0x7f, 0xbf, 0x7a, 0x6c, 0x00, 0xfe, 0x74, 0xaa, 0x39,
514 0xb7, 0x55, 0x55, 0x74, 0x55, 0x39, 0xb7, 0x2a, 0xaa, 0x74, 0xa0, 0x39, 0xb7, 0x55, 0x55, 0x6c,
515 0x99, 0x7a, 0x6b, 0x90, 0x7e, 0x54, 0x27, 0x10, 0x7e, 0x6b, 0x80, 0xbc, 0x89, 0x68, 0x08, 0x1b,
516 0x54, 0x78, 0xf5, 0x8a, 0xff, 0x19, 0xde, 0x8a, 0xff, 0x19, 0xe6, 0x12, 0x1a, 0x08, 0x7e, 0x6b,
517 0x80, 0x80, 0xfb, 0x7e, 0x10, 0xff, 0x12, 0x1a, 0x85, 0x80, 0xf8, 0xca, 0xf9, 0x7e, 0xf4, 0x00,
518 0xff, 0x1b, 0xf4, 0x78, 0xfc, 0xda, 0xf9, 0x22, 0xca, 0xf9, 0x7e, 0xf4, 0x00, 0x00, 0x1b, 0xf4,
519 0x78, 0xfc, 0xda, 0xf9, 0x22, 0x20, 0x09, 0x19, 0xd2, 0x0a, 0x12, 0x19, 0xfb, 0xc2, 0x95, 0xd2,
520 0x94, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x43, 0x90, 0x30,
521 0x22, 0xca, 0x0b, 0x7e, 0x10, 0x03, 0x7c, 0x30, 0x6c, 0x22, 0x0b, 0x20, 0x9e, 0x30, 0x0a, 0x50,
522 0xf9, 0x2e, 0x30, 0x0b, 0x1b, 0x20, 0x68, 0x18, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x53, 0x90,
523 0xcf, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x43, 0x90, 0x30, 0xa5, 0xda, 0xe8,
524 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x1b, 0x30, 0x68, 0x19, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb,
525 0xc2, 0x95, 0xd2, 0x94, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x12, 0x19, 0xfb, 0x43, 0x90, 0x30,
526 0xa5, 0xdb, 0xe7, 0x7e, 0x20, 0x0a, 0x12, 0x19, 0xfb, 0xa5, 0xda, 0xfa, 0xa5, 0xd9, 0xa7, 0xda,
527 0x0b, 0x22, 0x20, 0x09, 0x0a, 0x12, 0x19, 0xfb, 0xb2, 0x94, 0x12, 0x19, 0xfb, 0xb2, 0x94, 0x22,
528 0x30, 0x17, 0x32, 0x20, 0x09, 0x2f, 0xca, 0x2b, 0xca, 0x7b, 0x7e, 0x78, 0x80, 0x00, 0x7a, 0x7c,
529 0x00, 0xfe, 0x12, 0x1b, 0x1c, 0x7e, 0x6b, 0xa0, 0x5c, 0xaa, 0x68, 0x10, 0x29, 0xb7, 0x00, 0x14,
530 0x54, 0x60, 0x68, 0xf8, 0x39, 0xa7, 0x00, 0x00, 0x0b, 0x6c, 0x80, 0xe9, 0x12, 0x19, 0xee, 0xd2,
531 0xb5, 0xda, 0x7b, 0xda, 0x2b, 0x22, 0x12, 0x1a, 0xd4, 0x7e, 0x68, 0x00, 0x0b, 0x12, 0x1a, 0x93,
532 0x22, 0xca, 0x59, 0xca, 0x5b, 0x7e, 0xb4, 0x00, 0x0b, 0x7c, 0xb8, 0xc4, 0x12, 0x1b, 0x04, 0x7c,
533 0xb8, 0x12, 0x1b, 0x04, 0x7c, 0xb9, 0xc4, 0x12, 0x1b, 0x04, 0x7c, 0xb9, 0x12, 0x1b, 0x04, 0x7e,
534 0xb0, 0x68, 0x7a, 0xb9, 0xb0, 0x0b, 0xb4, 0x6c, 0xbb, 0x7a, 0xb9, 0xb0, 0xda, 0x59, 0xda, 0x5b,
535 0x22, 0x5e, 0xb0, 0x0f, 0x7c, 0xab, 0x9e, 0xa0, 0x0a, 0x40, 0x05, 0x2e, 0xb0, 0x37, 0x80, 0x03,
536 0x2e, 0xb0, 0x30, 0x7a, 0xb9, 0xb0, 0x0b, 0xb4, 0x22, 0xc2, 0xb5, 0xc2, 0x92, 0x12, 0x19, 0xee,
537 0x74, 0x80, 0x39, 0xb7, 0x00, 0x0c, 0x7e, 0x54, 0x00, 0x06, 0x39, 0xa7, 0x00, 0x04, 0x39, 0xb7,
538 0x00, 0x00, 0x74, 0x03, 0x39, 0xb7, 0x00, 0x0c, 0x22, 0x7e, 0x78, 0x00, 0x00, 0x7a, 0x7c, 0x00,
539 0xff, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0x01, 0x7f, 0x65, 0x7e, 0x74, 0x20, 0x00, 0x12,
540 0x08, 0xd6, 0x40, 0x54, 0x7e, 0x78, 0x7c, 0x00, 0x7a, 0x7c, 0x00, 0xff, 0x7e, 0x58, 0x00, 0x00,
541 0x7a, 0x5c, 0x00, 0x01, 0x7e, 0x68, 0x7c, 0x00, 0x7a, 0x6c, 0x00, 0x01, 0x7e, 0x74, 0x04, 0x00,
542 0x12, 0x08, 0xd6, 0x40, 0x33, 0x74, 0x80, 0x12, 0x1b, 0xb1, 0x40, 0x2c, 0x53, 0x90, 0xcf, 0xd2,
543 0x08, 0x7e, 0x04, 0x00, 0x08, 0x7e, 0x14, 0x00, 0x00, 0x84, 0xa5, 0xdb, 0xfc, 0xa5, 0xda, 0xf9,
544 0xa5, 0xd9, 0xf6, 0x74, 0x40, 0x12, 0x1b, 0xb1, 0x40, 0x0e, 0x7e, 0x68, 0x0e, 0xc0, 0x7a, 0x6c,
545 0x00, 0xff, 0x12, 0x1a, 0x93, 0x02, 0x19, 0xe6, 0xc2, 0x95, 0xd2, 0x94, 0x80, 0xfe, 0xf5, 0x0a,
546 0x7e, 0x78, 0x00, 0x0a, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x68, 0x7f, 0xbf, 0x7a, 0x6c, 0x00, 0x01,
547 0x7e, 0x74, 0x00, 0x01, 0x02, 0x08, 0xd6,
548};
549
550static struct edge_firmware_version_info IMAGE_VERSION_NAME = {
551 1, 12, 2 }; // Major, Minor, Build
552
553#undef IMAGE_VERSION_NAME
554
555#undef IMAGE_ARRAY_NAME
556
diff --git a/drivers/usb/serial/io_fw_boot2.h b/drivers/usb/serial/io_fw_boot2.h
new file mode 100644
index 000000000000..c7c3a3c305fe
--- /dev/null
+++ b/drivers/usb/serial/io_fw_boot2.h
@@ -0,0 +1,546 @@
1//**************************************************************
2//* Edgeport/4 Binary Image
3//* Generated by HEX2C v1.06
4//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
5//* This program is free software; you can redistribute it and/or modify
6//* it under the terms of the GNU General Public License as published by
7//* the Free Software Foundation; either version 2 of the License, or
8//* (at your option) any later version.
9//**************************************************************
10
11
12//Image structure definition
13#if !defined(DEFINED_EDGE_FIRMWARE_IMAGE_RECORD)
14#define DEFINED_EDGE_FIRMWARE_IMAGE_RECORD
15 struct edge_firmware_image_record {
16 __le16 ExtAddr;
17 __le16 Addr;
18 __le16 Len;
19 unsigned char Data[0];
20 } __attribute__ ((packed));
21
22 struct edge_firmware_version_info {
23 unsigned char MajorVersion;
24 unsigned char MinorVersion;
25 unsigned short BuildNumber;
26 };
27
28#endif
29
30#if !defined(IMAGE_ARRAY_NAME)
31#define IMAGE_ARRAY_NAME FirmwareImage
32#define IMAGE_VERSION_NAME FirmwareImageVersion
33#endif
34
35static unsigned char IMAGE_ARRAY_NAME[] = {
36
37// Segment #1, Start Address 00ff0000, Length 6
380xff,0x00,0x00,0x00,0x06,0x00,
39 0x02, 0x00, 0x80, 0x02, 0x00, 0x03,
40
41// Segment #2, Start Address 00ff000b, Length 3
420xff,0x00,0x0b,0x00,0x03,0x00,
43 0x02, 0x00, 0x0b,
44
45// Segment #3, Start Address 00ff0013, Length 3
460xff,0x00,0x13,0x00,0x03,0x00,
47 0x02, 0x02, 0x56,
48
49// Segment #4, Start Address 00ff001b, Length 3
500xff,0x00,0x1b,0x00,0x03,0x00,
51 0x02, 0x00, 0x1b,
52
53// Segment #5, Start Address 00ff0023, Length 3
540xff,0x00,0x23,0x00,0x03,0x00,
55 0x02, 0x00, 0x23,
56
57// Segment #6, Start Address 00ff002b, Length 3
580xff,0x00,0x2b,0x00,0x03,0x00,
59 0x02, 0x00, 0x2b,
60
61// Segment #7, Start Address 00ff0033, Length 3
620xff,0x00,0x33,0x00,0x03,0x00,
63 0x02, 0x00, 0x33,
64
65// Segment #8, Start Address 00ff003b, Length 3
660xff,0x00,0x3b,0x00,0x03,0x00,
67 0x02, 0x00, 0x3b,
68
69// Segment #9, Start Address 00ff0043, Length 3
700xff,0x00,0x43,0x00,0x03,0x00,
71 0x02, 0x00, 0x43,
72
73// Segment #10, Start Address 00ff004b, Length 3
740xff,0x00,0x4b,0x00,0x03,0x00,
75 0x02, 0x00, 0x4b,
76
77// Segment #11, Start Address 00ff0053, Length 3
780xff,0x00,0x53,0x00,0x03,0x00,
79 0x02, 0x01, 0xf5,
80
81// Segment #12, Start Address 00ff007b, Length 3
820xff,0x00,0x7b,0x00,0x03,0x00,
83 0x02, 0x00, 0x7b,
84
85// Segment #13, Start Address 00ff0080, Length 534
860xff,0x00,0x80,0x00,0x16,0x02,
87 0x7e, 0xb3, 0x91, 0x01, 0x20, 0xe3, 0x0c, 0x7e, 0xb3, 0x3f, 0xf2, 0x54, 0xfe, 0x7a, 0xb3, 0x3f,
88 0xf2, 0x80, 0x0a, 0x7e, 0xb3, 0x3f, 0xf2, 0x44, 0x01, 0x7a, 0xb3, 0x3f, 0xf2, 0x74, 0x00, 0x7a,
89 0xb3, 0x91, 0x00, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x7e, 0xf8, 0x00, 0x24, 0x7e, 0x00, 0x01,
90 0x7e, 0x10, 0x00, 0x12, 0x09, 0xd0, 0x69, 0x20, 0x00, 0x0a, 0x5e, 0x40, 0x1f, 0xbe, 0x24, 0x00,
91 0x00, 0x78, 0x09, 0x7e, 0x00, 0x03, 0x7a, 0x03, 0x90, 0x00, 0x80, 0x07, 0x7e, 0x00, 0x02, 0x7a,
92 0x03, 0x90, 0x00, 0x75, 0xb0, 0xdf, 0x7e, 0x00, 0x01, 0x7a, 0x03, 0x94, 0x00, 0x7a, 0x03, 0x01,
93 0x24, 0x7e, 0x00, 0x01, 0x7a, 0x03, 0x93, 0x00, 0x7e, 0x00, 0x00, 0xa5, 0xd8, 0xfd, 0x75, 0xa8,
94 0x00, 0x75, 0xb1, 0x00, 0xca, 0x29, 0x12, 0x0c, 0x66, 0x12, 0x0c, 0x37, 0xf5, 0x21, 0x7a, 0xa1,
95 0x20, 0x20, 0x09, 0x08, 0x20, 0x0a, 0x0a, 0x7e, 0xb0, 0x0c, 0x80, 0x08, 0x7e, 0xb0, 0x00, 0x80,
96 0x03, 0x7e, 0xb0, 0x08, 0x7a, 0xb3, 0x92, 0x00, 0x12, 0x02, 0x96, 0xda, 0x29, 0x74, 0x10, 0x7a,
97 0xb3, 0x91, 0x01, 0x7e, 0x20, 0x04, 0x7c, 0xb2, 0xc2, 0xd7, 0x13, 0x13, 0x13, 0x13, 0x7a, 0xb3,
98 0x91, 0x00, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x10, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x74, 0x02,
99 0x7a, 0xb3, 0x91, 0x12, 0xa5, 0xda, 0xdf, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a,
100 0xb3, 0x91, 0x1c, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x07, 0x74,
101 0x34, 0x7a, 0xb3, 0x91, 0x13, 0x74, 0x3f, 0x7a, 0xb3, 0x91, 0x14, 0x74, 0x02, 0x7a, 0xb3, 0x91,
102 0x06, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x07, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x44, 0x7a,
103 0xb3, 0x91, 0x07, 0x74, 0xef, 0x7a, 0xb3, 0x91, 0x04, 0x74, 0x07, 0x7a, 0xb3, 0x91, 0x06, 0x7e,
104 0xb3, 0x91, 0x07, 0x7a, 0xb1, 0x0a, 0x75, 0x09, 0x01, 0xd2, 0xaa, 0xd2, 0xaf, 0xe4, 0x7e, 0x60,
105 0x02, 0x4d, 0x22, 0x78, 0x03, 0x7e, 0x60, 0x03, 0x7c, 0x76, 0x7e, 0x04, 0x28, 0x00, 0x8d, 0xef,
106 0x1b, 0x04, 0x78, 0xfa, 0x04, 0x7e, 0x20, 0x07, 0x7a, 0x23, 0x91, 0x06, 0x7e, 0x23, 0x91, 0x07,
107 0x7e, 0x31, 0x0a, 0xbc, 0x32, 0x68, 0x22, 0x7a, 0x21, 0x0a, 0x7e, 0x21, 0x09, 0x68, 0x17, 0xca,
108 0xb8, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0xb3, 0x91, 0x07, 0x44, 0x02, 0x7a, 0xb3, 0x91,
109 0x07, 0xda, 0xb8, 0x75, 0x09, 0x00, 0x30, 0xe0, 0xc1, 0x6c, 0x67, 0x7a, 0x63, 0x90, 0x00, 0x80,
110 0xb9, 0xbe, 0xb0, 0x02, 0x22, 0xc0, 0xd0, 0x75, 0x08, 0xfe, 0x12, 0x0a, 0xc0, 0x74, 0x02, 0x7a,
111 0xb3, 0x91, 0x06, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x07, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x74,
112 0x00, 0x7a, 0xb3, 0x91, 0x07, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x04, 0x7e, 0xb3, 0x3f, 0xf2, 0x30,
113 0xe0, 0x08, 0x74, 0x18, 0x7a, 0xb3, 0x91, 0x01, 0x80, 0x06, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x01,
114 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x04, 0x02, 0x02, 0x36, 0x75, 0x08, 0xff, 0x12, 0x0a, 0xc0, 0x74,
115 0x01, 0x7a, 0xb3, 0x91, 0x04, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0xb3, 0x91, 0x07, 0x54,
116 0xfc, 0x7a, 0xb3, 0x91, 0x07, 0x32, 0xca, 0xb8, 0x75, 0x08, 0x02, 0x12, 0x0a, 0xc0, 0x7e, 0xb3,
117 0x91, 0x03, 0x20, 0xe5, 0x08, 0x30, 0xe0, 0x2b, 0x12, 0x02, 0x9e, 0x80, 0xf1, 0x7e, 0xb3, 0x91,
118 0x04, 0x30, 0xe0, 0x05, 0xda, 0xb8, 0x02, 0x02, 0x39, 0x30, 0xe1, 0x05, 0xda, 0xb8, 0x02, 0x01,
119 0xf5, 0x30, 0xe6, 0x05, 0x12, 0x04, 0x03, 0x80, 0xd5, 0x30, 0xe2, 0x05, 0xda, 0xb8, 0x02, 0x00,
120 0x80, 0x80, 0xcb, 0xda, 0xb8, 0x32,
121
122// Segment #14, EXCLUDED Start Address 00ff31d7, Length 1
123
124
125// Segment #15, Start Address 00ff0296, Length 2090
1260xff,0x00,0x96,0x02,0x2a,0x08,
127 0xe4, 0x7a, 0xb3, 0x3f, 0xf1, 0x02, 0x03, 0x41, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0xca, 0x3b,
128 0xca, 0x4b, 0xca, 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00,
129 0x7e, 0xb3, 0x01, 0x2e, 0xb4, 0x00, 0x02, 0x80, 0x1c, 0xb4, 0x01, 0x19, 0x7e, 0xb3, 0x91, 0x14,
130 0x54, 0x14, 0x68, 0x05, 0x12, 0x03, 0x05, 0x80, 0x23, 0x7e, 0xb3, 0x91, 0x14, 0x30, 0xe5, 0x1c,
131 0x12, 0x04, 0x43, 0x80, 0x17, 0x7e, 0xb3, 0x91, 0x14, 0x30, 0xe5, 0x05, 0x12, 0x04, 0x43, 0x80,
132 0x0b, 0x7e, 0xb3, 0x91, 0x14, 0x54, 0x14, 0x68, 0x03, 0x12, 0x03, 0x05, 0xda, 0xeb, 0xda, 0x7b,
133 0xda, 0x6b, 0xda, 0x5b, 0xda, 0x4b, 0xda, 0x3b, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x20,
134 0xe4, 0x19, 0x75, 0x08, 0x0a, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01, 0x2d, 0x70, 0x0a, 0x7e, 0xb3,
135 0x01, 0x2e, 0xb4, 0x01, 0x1f, 0x02, 0x03, 0x9d, 0x02, 0x09, 0x8b, 0x75, 0x08, 0x0b, 0x12, 0x0a,
136 0xc0, 0x74, 0x14, 0x7a, 0xb3, 0x91, 0x14, 0x7e, 0xb3, 0x01, 0x2e, 0xb4, 0x02, 0x0c, 0x12, 0x03,
137 0x4d, 0x02, 0x03, 0x41, 0x74, 0x04, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0x7e, 0x00, 0x00, 0x7a, 0x03,
138 0x01, 0x2e, 0x7a, 0x03, 0x01, 0x2f, 0x22, 0x7e, 0xb3, 0x01, 0x25, 0x54, 0x60, 0x60, 0x05, 0xb4,
139 0x40, 0x1e, 0x80, 0x1c, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x05, 0x15, 0x75, 0x08, 0x71, 0x12, 0x0a,
140 0xc0, 0x7e, 0xb3, 0x01, 0x28, 0x7e, 0xa0, 0x01, 0x7a, 0xa3, 0x91, 0x06, 0x7a, 0xb3, 0x91, 0x07,
141 0x22, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x12, 0x22, 0xbe, 0x57,
142 0x01, 0x2b, 0x28, 0x04, 0x7e, 0x57, 0x01, 0x2b, 0x7a, 0x0f, 0x01, 0x31, 0x7a, 0x57, 0x01, 0x35,
143 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x12, 0x22, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91,
144 0x1a, 0x70, 0x53, 0x7e, 0xb3, 0x91, 0x14, 0x20, 0xe4, 0x4c, 0x7e, 0xef, 0x01, 0x31, 0x7e, 0xf7,
145 0x01, 0x35, 0x7e, 0x07, 0x01, 0x35, 0x4d, 0x00, 0x68, 0x21, 0x7e, 0x00, 0x00, 0xe0, 0x7a, 0xb3,
146 0x91, 0x17, 0xa3, 0xa5, 0x08, 0x1b, 0xf4, 0x68, 0x06, 0xa5, 0xb8, 0x10, 0xf0, 0x80, 0x19, 0x7e,
147 0xb0, 0x00, 0x7a, 0xb3, 0x01, 0x2e, 0xbe, 0x00, 0x10, 0x68, 0x0d, 0x7e, 0xb0, 0x00, 0x7a, 0xb3,
148 0x01, 0x2e, 0x74, 0x80, 0x7a, 0xb3, 0x91, 0x1e, 0x7a, 0xef, 0x01, 0x31, 0x7a, 0xf7, 0x01, 0x35,
149 0x75, 0x08, 0x06, 0x12, 0x0a, 0xc0, 0x74, 0x04, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0xca, 0x0b, 0xca,
150 0x1b, 0xca, 0x2b, 0xca, 0x3b, 0xca, 0x4b, 0xca, 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0x75,
151 0x08, 0x03, 0x12, 0x0a, 0xc0, 0x74, 0x00, 0x7a, 0xb3, 0x01, 0x2d, 0x74, 0x00, 0x7a, 0xb3, 0x91,
152 0x00, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x12, 0x04, 0xb2, 0xda, 0xeb, 0xda, 0x7b, 0xda, 0x6b,
153 0xda, 0x5b, 0xda, 0x4b, 0xda, 0x3b, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x75, 0x08, 0x03,
154 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01, 0x2f, 0xb4, 0x02, 0x11, 0x74, 0x00, 0x7a, 0xb3, 0x01, 0x2f,
155 0x7a, 0xb3, 0x01, 0x2e, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0xb4, 0x01, 0x46, 0x7e, 0xb3,
156 0x91, 0x04, 0x20, 0xe6, 0x42, 0x7e, 0x23, 0x91, 0x1a, 0x7c, 0x32, 0x7e, 0x13, 0x01, 0x30, 0x2c,
157 0x21, 0x7a, 0x23, 0x01, 0x30, 0x7e, 0x00, 0x00, 0x2e, 0x04, 0x01, 0x37, 0x7e, 0xb3, 0x91, 0x16,
158 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0xa5, 0xdb, 0xf4, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x14, 0x75, 0x08,
159 0x70, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01, 0x30, 0x7e, 0xa3, 0x01, 0x2c, 0xbc, 0xab, 0x78, 0x03,
160 0x12, 0x05, 0x52, 0x22, 0x02, 0x09, 0x8b, 0xda, 0x59, 0x02, 0x04, 0x15, 0x74, 0xe0, 0x7a, 0xb3,
161 0x91, 0x00, 0x7e, 0x03, 0x91, 0x10, 0x7e, 0x13, 0x91, 0x11, 0x7e, 0x33, 0x91, 0x12, 0x7e, 0x23,
162 0x91, 0x13, 0x7e, 0x53, 0x91, 0x14, 0x7e, 0x43, 0x91, 0x15, 0x7e, 0x73, 0x91, 0x16, 0x7e, 0x63,
163 0x91, 0x17, 0x7a, 0x0f, 0x01, 0x25, 0x7a, 0x1f, 0x01, 0x29, 0x75, 0x08, 0x04, 0x12, 0x0a, 0xc0,
164 0x7a, 0x01, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x11, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x21, 0x08, 0x12,
165 0x0a, 0xc0, 0x7a, 0x31, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x41, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x51,
166 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x61, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x71, 0x08, 0x12, 0x0a, 0xc0,
167 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x04, 0x12, 0x05, 0x26, 0x22,
168 0x6d, 0x00, 0x7e, 0x14, 0x01, 0x02, 0x7a, 0x07, 0x01, 0x35, 0x7a, 0x03, 0x01, 0x30, 0x7e, 0xb3,
169 0x01, 0x25, 0x20, 0xe7, 0x0f, 0x7a, 0x23, 0x01, 0x2f, 0x7a, 0x33, 0x01, 0x2e, 0xbe, 0x07, 0x01,
170 0x2b, 0x68, 0x09, 0x22, 0x7a, 0x33, 0x01, 0x2f, 0x7a, 0x23, 0x01, 0x2e, 0x7e, 0xb3, 0x01, 0x25,
171 0x54, 0xe3, 0x23, 0x23, 0x30, 0xe0, 0x02, 0xd2, 0xe5, 0x30, 0xe7, 0x02, 0xd2, 0xe4, 0x30, 0xe5,
172 0x06, 0x30, 0xe4, 0x03, 0x02, 0x09, 0x8b, 0x54, 0x3e, 0xf5, 0xf0, 0x03, 0x54, 0x1f, 0xc3, 0x25,
173 0xf0, 0x90, 0x05, 0x7e, 0x75, 0x84, 0xff, 0x73, 0x02, 0x07, 0x39, 0x02, 0x05, 0xc6, 0x02, 0x07,
174 0xd2, 0x02, 0x07, 0xed, 0x02, 0x06, 0xd0, 0x02, 0x06, 0x5b, 0x02, 0x08, 0x1e, 0x02, 0x08, 0x1e,
175 0x02, 0x08, 0x21, 0x02, 0x08, 0x21, 0x02, 0x08, 0x21, 0x02, 0x08, 0x21, 0x02, 0x08, 0x21, 0x02,
176 0x08, 0x21, 0x02, 0x08, 0x21, 0x02, 0x08, 0x21, 0x02, 0x08, 0x27, 0x02, 0x08, 0xf9, 0x02, 0x08,
177 0x24, 0x02, 0x08, 0x24, 0x02, 0x08, 0x24, 0x02, 0x08, 0x24, 0x02, 0x08, 0x24, 0x02, 0x08, 0x24,
178 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x7e, 0xb3, 0x01, 0x26,
179 0xb4, 0x06, 0x2a, 0x7e, 0xb3, 0x01, 0x27, 0x60, 0x79, 0x7c, 0x0b, 0x7e, 0x13, 0x01, 0x28, 0x7e,
180 0x17, 0x01, 0x29, 0x75, 0x08, 0x72, 0x12, 0x0a, 0xc0, 0x7a, 0x01, 0x08, 0x12, 0x0a, 0xc0, 0x7a,
181 0x11, 0x08, 0x12, 0x0a, 0xc0, 0x12, 0x09, 0xd0, 0x40, 0x58, 0x02, 0x03, 0x84, 0xb4, 0x08, 0x1c,
182 0x75, 0x08, 0x74, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x3f, 0xf1, 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c,
183 0x00, 0x00, 0x7a, 0x0b, 0xb0, 0x7e, 0x54, 0x00, 0x01, 0x02, 0x03, 0x84, 0xb4, 0x00, 0x33, 0x75,
184 0x08, 0x75, 0x12, 0x0a, 0xc0, 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c, 0x00, 0x00, 0xca, 0x0b, 0x7e,
185 0xb3, 0x3f, 0xf2, 0x30, 0xe0, 0x07, 0x74, 0x02, 0x7a, 0x0b, 0xb0, 0x80, 0x05, 0x74, 0x00, 0x7a,
186 0x0b, 0xb0, 0x0b, 0x14, 0x74, 0x00, 0x7a, 0x0b, 0xb0, 0x7e, 0x54, 0x00, 0x02, 0xda, 0x0b, 0x02,
187 0x03, 0x84, 0x02, 0x09, 0x8b, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91,
188 0x1c, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x00, 0x5f, 0x75, 0x08, 0x76, 0x12, 0x0a, 0xc0, 0x7e, 0xb3,
189 0x01, 0x2a, 0x54, 0x0f, 0xb4, 0x02, 0x05, 0x7e, 0xb0, 0x60, 0x80, 0x17, 0xb4, 0x00, 0x05, 0x7e,
190 0xb0, 0x00, 0x80, 0x0f, 0x7e, 0xb3, 0x01, 0x2a, 0x20, 0xe7, 0x05, 0x7e, 0xb0, 0x40, 0x80, 0x03,
191 0x7e, 0xb0, 0x20, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91, 0x11, 0x30, 0xe0, 0x04, 0x74, 0x01,
192 0x80, 0x02, 0x74, 0x00, 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c, 0x00, 0x00, 0xca, 0x0b, 0x7a, 0x0b,
193 0xb0, 0x0b, 0x14, 0x74, 0x00, 0x7a, 0x0b, 0xb0, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0x54,
194 0x00, 0x02, 0xda, 0x0b, 0x02, 0x03, 0x84, 0x02, 0x09, 0x8b, 0x7e, 0xb3, 0x01, 0x2a, 0x54, 0x0f,
195 0xb4, 0x02, 0x05, 0x7e, 0xb0, 0x60, 0x80, 0x17, 0xb4, 0x00, 0x05, 0x7e, 0xb0, 0x00, 0x80, 0x0f,
196 0x7e, 0xb3, 0x01, 0x2a, 0x20, 0xe7, 0x05, 0x7e, 0xb0, 0x40, 0x80, 0x03, 0x7e, 0xb0, 0x20, 0x7a,
197 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x01, 0x28, 0xb4, 0x00, 0x26, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x01,
198 0x0e, 0x75, 0x08, 0x77, 0x12, 0x0a, 0xc0, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x80, 0x1b, 0xb4,
199 0x03, 0x0e, 0x75, 0x08, 0x78, 0x12, 0x0a, 0xc0, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x11, 0x80, 0x0a,
200 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x12, 0x09, 0x8b, 0x22, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00,
201 0x02, 0x03, 0x77, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x09, 0x1f, 0x75, 0x08, 0x79, 0x12, 0x0a, 0xc0,
202 0x7e, 0xb3, 0x01, 0x28, 0xbe, 0xb3, 0x3f, 0xf1, 0x68, 0x0d, 0xca, 0xb8, 0x12, 0x01, 0xf1, 0xda,
203 0xb8, 0x50, 0x76, 0x7a, 0xb3, 0x3f, 0xf1, 0x80, 0x6d, 0xb4, 0x05, 0x08, 0x75, 0x08, 0x7a, 0x12,
204 0x0a, 0xc0, 0x80, 0x62, 0xb4, 0x03, 0x19, 0x75, 0x08, 0x7b, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01,
205 0x28, 0xb4, 0x01, 0x55, 0x7e, 0xb3, 0x3f, 0xf2, 0x44, 0x01, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x46,
206 0xb4, 0x01, 0x19, 0x75, 0x08, 0x7c, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01, 0x28, 0xb4, 0x01, 0x39,
207 0x7e, 0xb3, 0x3f, 0xf2, 0x54, 0xfe, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x2a, 0xb4, 0x07, 0x2a, 0x7e,
208 0xb3, 0x01, 0x27, 0x60, 0x24, 0x7c, 0x0b, 0x7e, 0x13, 0x01, 0x28, 0x7e, 0x17, 0x01, 0x29, 0x75,
209 0x08, 0x73, 0x12, 0x0a, 0xc0, 0x7a, 0x01, 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x11, 0x08, 0x12, 0x0a,
210 0xc0, 0x12, 0x0a, 0x0a, 0x40, 0x03, 0x02, 0x03, 0x77, 0x02, 0x09, 0x8b, 0x7e, 0xb3, 0x01, 0x26,
211 0xb4, 0x0b, 0xf6, 0x75, 0x08, 0x7d, 0x12, 0x0a, 0xc0, 0x7e, 0xb3, 0x01, 0x28, 0x7e, 0xa3, 0x01,
212 0x2a, 0x4c, 0xab, 0x78, 0xe4, 0x80, 0xdf, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a,
213 0xb3, 0x91, 0x1c, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x0a, 0xcf, 0x75, 0x08, 0x7e, 0x12, 0x0a, 0xc0,
214 0x7e, 0xb3, 0x01, 0x28, 0x70, 0xc3, 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c, 0x00, 0x00, 0x7a, 0x0b,
215 0xb0, 0x7e, 0x54, 0x00, 0x01, 0x02, 0x03, 0x84, 0x02, 0x09, 0x8b, 0x02, 0x09, 0x8b, 0x02, 0x09,
216 0x8b, 0x7e, 0xb3, 0x01, 0x26, 0xb4, 0x04, 0x20, 0x75, 0x08, 0xc3, 0x12, 0x0a, 0xc0, 0x7e, 0x04,
217 0x00, 0x01, 0x7e, 0x17, 0x01, 0x27, 0x7e, 0x18, 0x01, 0x37, 0x7a, 0x1c, 0x00, 0x00, 0x7e, 0x47,
218 0x01, 0x2b, 0x12, 0x0a, 0xcc, 0x02, 0x08, 0xf3, 0xb4, 0x06, 0x42, 0x75, 0x08, 0xc1, 0x12, 0x0a,
219 0xc0, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7d, 0xca, 0x7e, 0xd7, 0x01, 0x27, 0x7e,
220 0x78, 0x01, 0x37, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x01, 0x2b, 0x75, 0x08, 0xc1, 0x12, 0x0a,
221 0xc0, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x12, 0x0b, 0x63, 0x7e,
222 0x43, 0x01, 0x24, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0x40, 0x65, 0x80, 0x60, 0xb4, 0x00, 0x24,
223 0xc2, 0xaf, 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x94, 0x00, 0x7a, 0xb3, 0x01, 0x24, 0x12, 0x03, 0x77,
224 0xe4, 0x8d, 0xef, 0x8d, 0xef, 0x8d, 0xef, 0xd5, 0xe0, 0xf7, 0xc0, 0xd1, 0xca, 0x02, 0xff, 0xca,
225 0x06, 0x00, 0x00, 0x32, 0xb4, 0x09, 0x20, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0x23, 0x91,
226 0x07, 0x7e, 0x57, 0x01, 0x27, 0x4d, 0x55, 0x68, 0x05, 0x4e, 0x20, 0x02, 0x80, 0x03, 0x5e, 0x20,
227 0xfd, 0x7a, 0x23, 0x91, 0x07, 0x80, 0x16, 0xb4, 0x07, 0x16, 0xc2, 0xaf, 0x7e, 0x07, 0x01, 0x29,
228 0x7e, 0x17, 0x01, 0x27, 0xc0, 0xd1, 0xca, 0x18, 0xca, 0x38, 0xca, 0x28, 0x32, 0x02, 0x03, 0x77,
229 0x02, 0x09, 0x8b, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x7e,
230 0xb3, 0x01, 0x26, 0xb4, 0x03, 0x15, 0x75, 0x08, 0xc2, 0x12, 0x0a, 0xc0, 0x7e, 0x04, 0x00, 0x01,
231 0x7e, 0x17, 0x01, 0x27, 0x7e, 0x57, 0x01, 0x2b, 0x02, 0x03, 0x84, 0xb4, 0x05, 0x41, 0x75, 0x08,
232 0xc0, 0x12, 0x0a, 0xc0, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x7e,
233 0x08, 0x01, 0x37, 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x37, 0x01, 0x27, 0x7e,
234 0x47, 0x01, 0x2b, 0x12, 0x0a, 0xcc, 0x7e, 0x43, 0x01, 0x24, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8,
235 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x57, 0x01, 0x2b, 0x02, 0x03, 0x84, 0xb4,
236 0x01, 0x20, 0x7e, 0x00, 0x00, 0x7e, 0x10, 0x01, 0x75, 0x08, 0x72, 0x12, 0x0a, 0xc0, 0x7a, 0x01,
237 0x08, 0x12, 0x0a, 0xc0, 0x7a, 0x11, 0x08, 0x12, 0x0a, 0xc0, 0x12, 0x09, 0xd0, 0x40, 0x03, 0x02,
238 0x03, 0x84, 0x02, 0x09, 0x8b, 0x75, 0x08, 0x07, 0x12, 0x0a, 0xc0, 0x7e, 0xb0, 0x02, 0x7a, 0xb3,
239 0x90, 0x00, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x15, 0x74, 0x01,
240 0x7a, 0xb3, 0x91, 0x11, 0x7e, 0xb3, 0x91, 0x15, 0x54, 0x60, 0xbe, 0xb0, 0x40, 0x68, 0x08, 0x74,
241 0x20, 0x7a, 0xb3, 0x91, 0x15, 0x80, 0xed, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x74, 0x04, 0x7a,
242 0xb3, 0x91, 0x14, 0x74, 0xff, 0x7a, 0xb3, 0x01, 0x2d, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40,
243 0x01, 0x7a, 0x43, 0x94, 0x00, 0x12, 0x0a, 0x57, 0x40, 0x1f, 0x7e, 0x08, 0x01, 0x37, 0x7a, 0x0c,
244 0x00, 0x00, 0xca, 0x0b, 0xca, 0x49, 0x12, 0x0a, 0xcc, 0xda, 0x59, 0xda, 0x0b, 0x7e, 0x43, 0x01,
245 0x24, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0xc3, 0x22, 0x7e, 0x43, 0x01, 0x24, 0x7a, 0x43, 0x94,
246 0x00, 0xd0, 0xa8, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x12,
247 0x0a, 0x57, 0x40, 0x31, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7f, 0x61, 0x7e, 0x78,
248 0x01, 0x37, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x01, 0x2b, 0xbd, 0x74, 0x78, 0x17, 0x75, 0x08,
249 0xc1, 0x12, 0x0a, 0xc0, 0x12, 0x0b, 0x63, 0x40, 0x0c, 0x7e, 0x43, 0x01, 0x24, 0x7a, 0x43, 0x94,
250 0x00, 0xd0, 0xa8, 0xc3, 0x22, 0x7e, 0x43, 0x01, 0x24, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0xd3,
251 0x22, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x34, 0x7f, 0xca, 0x0b, 0x1a, 0x50, 0xc5, 0xf0, 0x7d, 0x62,
252 0x7d, 0x75, 0x7d, 0x87, 0x7e, 0x34, 0x7f, 0x03, 0x7e, 0x1b, 0xb0, 0xbc, 0x0b, 0x50, 0x49, 0x3e,
253 0x00, 0x3e, 0x00, 0x0a, 0x50, 0x2d, 0x75, 0x0b, 0x3a, 0x30, 0x69, 0x53, 0x00, 0x02, 0xbd, 0x38,
254 0x50, 0x02, 0x2d, 0x38, 0xbc, 0x1b, 0x50, 0x30, 0x3e, 0x10, 0x3e, 0x10, 0x0a, 0x51, 0x2d, 0x35,
255 0x69, 0x41, 0x00, 0x02, 0x0b, 0x1a, 0x30, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbe, 0x44, 0xff,
256 0xff, 0x78, 0x05, 0x7e, 0x1b, 0x90, 0x0a, 0x49, 0x4d, 0x44, 0x68, 0x0c, 0xbe, 0x44, 0x00, 0xff,
257 0x28, 0x04, 0x7e, 0x44, 0x00, 0xff, 0xc3, 0x22, 0xd3, 0x22,
258
259// Segment #16, EXCLUDED Start Address 00ff7c00, Length 227
260
261
262// Segment #17, EXCLUDED Start Address 00ff7f00, Length 192
263
264
265// Segment #17, Start Address 00ff7fc0, Length 64
2660xff,0x00,0xc0,0x7f,0x40,0x00,
267 0x40, 0x01, 0x02, 0x00, 0xd7, 0x31, 0x02, 0x00, 0x03, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271
272// Segment #18, Start Address 00ff0ac0, Length 4163
2730xff,0x00,0xc0,0x0a,0x43,0x10,
274 0xca, 0x08, 0x7e, 0x01, 0x08, 0x7a, 0x03, 0x3f, 0xf0, 0xda, 0x08, 0x22, 0x80, 0x50, 0x0b, 0x1a,
275 0x60, 0x0b, 0x35, 0x0b, 0x1a, 0x70, 0x0b, 0x35, 0x0b, 0x1a, 0x80, 0x0b, 0x35, 0x0b, 0x1a, 0x90,
276 0x0b, 0x35, 0x0b, 0x1a, 0xa0, 0x0b, 0x35, 0x0b, 0x1a, 0xb0, 0x0b, 0x35, 0x0b, 0x1a, 0xc0, 0x0b,
277 0x35, 0x0b, 0x1a, 0xd0, 0x0b, 0x35, 0x1b, 0x0a, 0x60, 0x0b, 0x15, 0x1b, 0x0a, 0x70, 0x0b, 0x15,
278 0x1b, 0x0a, 0x80, 0x0b, 0x15, 0x1b, 0x0a, 0x90, 0x0b, 0x15, 0x1b, 0x0a, 0xa0, 0x0b, 0x15, 0x1b,
279 0x0a, 0xb0, 0x0b, 0x15, 0x1b, 0x0a, 0xc0, 0x0b, 0x15, 0x1b, 0x0a, 0xd0, 0x0b, 0x15, 0x9e, 0x44,
280 0x00, 0x10, 0x50, 0xaa, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x0e, 0x7e, 0x1b, 0xc0, 0x7a, 0x0b, 0xc0,
281 0x0b, 0x14, 0x0b, 0x34, 0x1b, 0x44, 0x78, 0xf2, 0x22, 0x7f, 0x6f, 0x7f, 0xf0, 0x1b, 0xfc, 0x7c,
282 0x54, 0x7d, 0x32, 0x80, 0x08, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0x9e, 0x44, 0x00,
283 0x10, 0x50, 0xf2, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x06, 0xca, 0x48, 0x1b, 0x44, 0x78, 0xfa, 0x7f,
284 0xf6, 0x89, 0xe4, 0xca, 0x6b, 0x5e, 0xd4, 0x00, 0x3f, 0x68, 0x20, 0x7e, 0x84, 0x00, 0x40, 0x9d,
285 0x8d, 0xda, 0x6b, 0xbd, 0x87, 0x38, 0x16, 0xca, 0x79, 0x7d, 0x78, 0x12, 0x0b, 0x8d, 0xda, 0x79,
286 0x40, 0x08, 0x9d, 0x78, 0x68, 0x02, 0x80, 0x05, 0xc2, 0xd7, 0x22, 0xda, 0x6b, 0x7e, 0xc0, 0x03,
287 0x7e, 0xd0, 0x00, 0x7a, 0xd3, 0x90, 0x00, 0x74, 0xaa, 0x39, 0xb5, 0x55, 0x55, 0x74, 0x55, 0x39,
288 0xb5, 0x2a, 0xaa, 0x74, 0xa0, 0x39, 0xb5, 0x55, 0x55, 0x7e, 0x04, 0x00, 0x40, 0x9d, 0x70, 0x50,
289 0x06, 0x2d, 0x70, 0x7d, 0x07, 0x6d, 0x77, 0x7c, 0x31, 0x7e, 0x7b, 0x00, 0x7a, 0x6b, 0x00, 0x0b,
290 0x7c, 0x0b, 0x6c, 0xa5, 0xd9, 0xf3, 0x7f, 0x16, 0x1b, 0x1c, 0x7e, 0x54, 0x27, 0x10, 0x7e, 0x1b,
291 0x10, 0xbc, 0x10, 0x68, 0x06, 0x1b, 0x54, 0x78, 0xf5, 0x80, 0x2f, 0x6d, 0x00, 0x7c, 0x20, 0x7f,
292 0x16, 0x9f, 0x10, 0x7f, 0x27, 0x9f, 0x20, 0x7e, 0x2b, 0x00, 0x7e, 0x1b, 0x10, 0xbc, 0x01, 0x78,
293 0x19, 0x0b, 0x2c, 0x0b, 0x1c, 0xa5, 0xdb, 0xef, 0x7c, 0xb6, 0x20, 0xe0, 0x06, 0x6c, 0xdc, 0x7a,
294 0xd3, 0x90, 0x00, 0x4d, 0x77, 0x78, 0x90, 0xc2, 0xd7, 0x22, 0xd2, 0xd7, 0x22, 0x00, 0x04, 0x00,
295 0x04, 0x00, 0x00, 0x06, 0x04, 0x02, 0x04, 0x00, 0x02, 0x01, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x08, 0x10, 0x02, 0x10,
297 0x04, 0x02, 0x08, 0x00, 0x01, 0x01, 0x08, 0x7e, 0x18, 0x7f, 0xbd, 0x7a, 0x1c, 0x00, 0xff, 0x0b,
298 0x1a, 0x00, 0x5e, 0x10, 0x1f, 0xbe, 0x10, 0x14, 0x38, 0x1a, 0x0a, 0x51, 0x23, 0x7e, 0x18, 0x0c,
299 0x0d, 0x7a, 0x1c, 0x00, 0xff, 0x2d, 0x35, 0x0b, 0x1a, 0x50, 0x60, 0x08, 0xa5, 0xb8, 0x02, 0x03,
300 0x4e, 0xa0, 0x08, 0x22, 0x80, 0xfe, 0x7e, 0xe8, 0x7f, 0xbf, 0x7a, 0xec, 0x00, 0xff, 0xe0, 0xf5,
301 0x23, 0x54, 0xc0, 0x68, 0x38, 0x7e, 0xe8, 0x7f, 0xbe, 0x7a, 0xec, 0x00, 0xff, 0xe0, 0x60, 0x2e,
302 0x12, 0x0c, 0x37, 0xf5, 0x21, 0x7a, 0xa1, 0x20, 0x20, 0x09, 0x0c, 0x20, 0x0a, 0x12, 0x7e, 0xb0,
303 0x0e, 0x7a, 0xb3, 0x92, 0x00, 0x80, 0x10, 0x7e, 0xb0, 0x02, 0x7a, 0xb3, 0x92, 0x00, 0x80, 0x07,
304 0x7e, 0xb0, 0x0a, 0x7a, 0xb3, 0x92, 0x00, 0x7a, 0xb1, 0x0d, 0x02, 0x0c, 0xc4, 0x22, 0x7e, 0xb0,
305 0x02, 0x7a, 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x03, 0x7a, 0xb3, 0x90, 0x00, 0x12,
306 0x19, 0x0c, 0x80, 0xea, 0xc2, 0xaf, 0xc2, 0x11, 0xc2, 0x12, 0x75, 0xb0, 0xdf, 0x7e, 0x00, 0x01,
307 0x7a, 0x03, 0x93, 0x00, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x90, 0x00, 0x6c, 0x00, 0x7e, 0x10, 0x03,
308 0x12, 0x0c, 0xf5, 0x7e, 0x68, 0x2c, 0x66, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x0b, 0x00,
309 0x80, 0x32, 0x02, 0x1a, 0x6e, 0x20, 0x11, 0x2b, 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x90, 0x00, 0x12,
310 0x19, 0x0c, 0x7e, 0xb0, 0x03, 0x7a, 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x02, 0x7a,
311 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0xa5, 0xd9, 0xdc, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x90, 0x00,
312 0x12, 0x19, 0x0c, 0x22, 0x7e, 0x68, 0x2c, 0xf9, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e,
313 0xe4, 0x10, 0x00, 0x7e, 0x40, 0x55, 0x7a, 0xe9, 0x40, 0x0b, 0xe4, 0x7e, 0x50, 0xaa, 0x7a, 0xe9,
314 0x50, 0x1b, 0xe4, 0xbe, 0xe9, 0x40, 0x68, 0x19, 0x7e, 0x68, 0x2c, 0xdf, 0x7a, 0x6c, 0x00, 0xff,
315 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0x13, 0x7a, 0xe9, 0x40, 0x7e, 0xe9, 0x10, 0x80,
316 0xf8, 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x0b, 0x00, 0x7e, 0x68,
317 0x2d, 0x3d, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x78, 0x00, 0x00, 0x7e, 0x70, 0x0e,
318 0x7e, 0xa4, 0xff, 0xff, 0x7e, 0xb4, 0xbf, 0xff, 0x7d, 0xcb, 0x0e, 0xc4, 0x7d, 0xdc, 0x5d, 0xdb,
319 0x6c, 0xbb, 0x7d, 0xfa, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x0b, 0xb0, 0x7d, 0xfb, 0x5e,
320 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x0b, 0xb0, 0x7d, 0xfc, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b,
321 0xb0, 0x0b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x6c, 0xbb, 0x7d, 0xfa,
322 0x5e, 0xf4, 0x7f, 0xff, 0xbe, 0x7b, 0xb0, 0x78, 0x41, 0x0b, 0xb0, 0x7d, 0xfb, 0x5e, 0xf4, 0x7f,
323 0xff, 0xbe, 0x7b, 0xb0, 0x78, 0x34, 0x0b, 0xb0, 0x7d, 0xfc, 0x5e, 0xf4, 0x7f, 0xff, 0xbe, 0x7b,
324 0xb0, 0x78, 0x27, 0x0b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0xbe, 0x7b, 0xb0, 0x78, 0x1a,
325 0x0b, 0xb0, 0xbe, 0xc4, 0xff, 0xfe, 0x78, 0x92, 0x0e, 0xb4, 0xa5, 0xdf, 0x8b, 0x7e, 0x68, 0x2c,
326 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80, 0x77, 0xca, 0x5b, 0xca, 0x6b, 0x7e, 0x68,
327 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x68, 0x2d, 0x8f, 0x7a, 0x6c, 0x00,
328 0xff, 0x12, 0x19, 0xc4, 0x0a, 0x47, 0x12, 0x19, 0xfa, 0x7e, 0x68, 0x2d, 0xde, 0x7a, 0x6c, 0x00,
329 0xff, 0x12, 0x19, 0xc4, 0x6c, 0x77, 0xda, 0x6b, 0xca, 0x6b, 0x0b, 0x70, 0x0e, 0xc4, 0xbe, 0xc4,
330 0xff, 0xff, 0x78, 0xf6, 0x1b, 0x70, 0x0a, 0x47, 0x12, 0x19, 0xfa, 0x12, 0x19, 0x19, 0x30, 0x11,
331 0x30, 0xda, 0x6b, 0xda, 0x5b, 0x6c, 0xbb, 0x7e, 0x78, 0x00, 0x00, 0x7d, 0xfa, 0x5e, 0xf4, 0x7f,
332 0xff, 0x7a, 0x7b, 0xb0, 0x7d, 0xfb, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x7d, 0xfc, 0x5e,
333 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x7d, 0xfd, 0x5e, 0xf4, 0x7f, 0xff, 0x7a, 0x7b, 0xb0, 0x80,
334 0xd4, 0x7e, 0x68, 0x2d, 0x1b, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x30, 0x1f, 0x0e, 0x7e,
335 0x78, 0x04, 0x20, 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x44, 0x7b, 0xe0, 0x80, 0x0c, 0x7e, 0x78, 0x00,
336 0x00, 0x7a, 0x7c, 0x00, 0x01, 0x7e, 0x44, 0x80, 0x00, 0x0b, 0x00, 0x7e, 0x40, 0x3a, 0x7c, 0x54,
337 0x7f, 0x57, 0x7d, 0x84, 0x6c, 0x66, 0x7a, 0x5b, 0x50, 0x0b, 0x5c, 0x0b, 0x50, 0xa5, 0xde, 0x02,
338 0x0b, 0x50, 0x1b, 0x84, 0x78, 0xf0, 0x7c, 0x54, 0x7f, 0x57, 0x7d, 0x84, 0x6c, 0x66, 0xbe, 0x5b,
339 0x50, 0x78, 0x1a, 0x0b, 0x5c, 0x0b, 0x50, 0xa5, 0xde, 0x02, 0x0b, 0x50, 0x1b, 0x84, 0x78, 0xee,
340 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80, 0x4b, 0x7f, 0x45, 0x7e,
341 0x68, 0x2c, 0xdf, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x68, 0x2d, 0x5f, 0x7a, 0x6c,
342 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7d, 0x4b, 0x12, 0x19, 0xfa, 0x7e, 0x68, 0x2d, 0x74, 0x7a, 0x6c,
343 0x00, 0xff, 0x12, 0x19, 0xc4, 0x6c, 0x88, 0x7c, 0x95, 0x12, 0x19, 0xfa, 0x7e, 0x68, 0x2d, 0x82,
344 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x4b, 0x90, 0x12, 0x19, 0xfa, 0x12, 0x19, 0x19,
345 0x30, 0x11, 0x05, 0x7e, 0x4b, 0x90, 0x80, 0xfb, 0x7e, 0x68, 0x2e, 0x28, 0x7a, 0x6c, 0x00, 0xff,
346 0x12, 0x19, 0xc4, 0x0b, 0x00, 0x7e, 0xb0, 0x80, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xa0, 0x55, 0x7a,
347 0xa3, 0x91, 0x10, 0x7e, 0xb3, 0x91, 0x07, 0x7e, 0xb3, 0x91, 0x10, 0xbc, 0xab, 0x78, 0x20, 0x7e,
348 0xa0, 0xaa, 0x7a, 0xa3, 0x91, 0x10, 0x7e, 0xb3, 0x91, 0x07, 0x7e, 0xb3, 0x91, 0x10, 0xbc, 0xab,
349 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80, 0x1b, 0x7e,
350 0x68, 0x2c, 0xdf, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0x0a,
351 0x7a, 0xa3, 0x91, 0x10, 0x7e, 0xb3, 0x91, 0x10, 0x80, 0xf6, 0x7e, 0x68, 0x2e, 0x4a, 0x7a, 0x6c,
352 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x12, 0x31, 0x0b, 0x00, 0x7e, 0xe4, 0x10, 0x00, 0x7e, 0xa0,
353 0xa5, 0xca, 0xa8, 0x7a, 0xe9, 0xa0, 0x7e, 0xb0, 0x30, 0x7a, 0xb3, 0x95, 0x00, 0x7e, 0xe9, 0xa0,
354 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x95, 0x00, 0x12, 0x19, 0x0c, 0x0b, 0xe5, 0x7e, 0xb0, 0x20, 0x7a,
355 0xb3, 0x95, 0x00, 0x7e, 0xe9, 0xb0, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x95, 0x00, 0x7e, 0xe9, 0xb0,
356 0xda, 0xa8, 0xbc, 0xab, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19,
357 0xc4, 0x80, 0x1d, 0x7e, 0x68, 0x2c, 0xdf, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19,
358 0x19, 0x30, 0x11, 0x0c, 0x7e, 0xb0, 0x38, 0x7a, 0xb3, 0x95, 0x00, 0x7e, 0xe9, 0xb0, 0x80, 0xfb,
359 0x80, 0x00, 0x7e, 0x68, 0x2d, 0xe4, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x0b, 0x00, 0x75,
360 0xb0, 0xdf, 0x7e, 0x24, 0x80, 0x00, 0x09, 0xb2, 0x00, 0x08, 0xbe, 0xb0, 0x01, 0x78, 0x0b, 0x09,
361 0xb2, 0x00, 0x14, 0xbe, 0xb0, 0x60, 0x78, 0x02, 0x80, 0x17, 0x7e, 0x68, 0x2c, 0xdf, 0x7a, 0x6c,
362 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0x11, 0x09, 0xb2, 0x00, 0x08, 0x80,
363 0xfa, 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x68, 0x2e, 0x06,
364 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x0b, 0x00, 0x75, 0xb0, 0xef, 0x12, 0x18, 0xff, 0x7e,
365 0x24, 0x80, 0x00, 0x7e, 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x1c, 0x7e, 0xb0, 0x01, 0x19, 0xb2, 0x00,
366 0x08, 0x09, 0xb2, 0x00, 0x1c, 0xbc, 0xab, 0x78, 0x37, 0x09, 0xb2, 0x00, 0x08, 0x5e, 0xb0, 0xc0,
367 0xbe, 0xb0, 0xc0, 0x78, 0x2b, 0x7e, 0xa0, 0xaa, 0x19, 0xa2, 0x00, 0x1c, 0x6c, 0xbb, 0x19, 0xb2,
368 0x00, 0x08, 0x09, 0xb2, 0x00, 0x1c, 0xbc, 0xab, 0x78, 0x16, 0x09, 0xb2, 0x00, 0x08, 0x5e, 0xb0,
369 0xc0, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xda, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80, 0x1b,
370 0x7e, 0x68, 0x2c, 0xdf, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11,
371 0x0a, 0x19, 0xa2, 0x00, 0x1c, 0x09, 0xb2, 0x00, 0x1c, 0x80, 0xf6, 0x7e, 0x68, 0x2e, 0x6c, 0x7a,
372 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x68, 0x2e, 0xee, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19,
373 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x7e, 0xb0, 0x01, 0x19, 0xb2, 0x00, 0x1c, 0x2e,
374 0x24, 0x01, 0x00, 0x0b, 0xb0, 0xa5, 0xd9, 0xf3, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x7e,
375 0xb0, 0x01, 0x0b, 0x00, 0x09, 0xa2, 0x00, 0x1c, 0xbc, 0xab, 0x78, 0x16, 0x7e, 0x68, 0x2c, 0xe7,
376 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x2e, 0x24, 0x01, 0x00, 0x0b, 0xb0, 0xa5, 0xd9, 0xe2,
377 0x80, 0x25, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19,
378 0x30, 0x11, 0xe4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x09, 0xa2, 0x00, 0x1c, 0x2e, 0x24,
379 0x01, 0x00, 0xa5, 0xd9, 0xf5, 0x80, 0xec, 0x7e, 0x68, 0x2f, 0x12, 0x7a, 0x6c, 0x00, 0xff, 0x12,
380 0x19, 0xc4, 0x12, 0x12, 0x31, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x74, 0x10,
381 0x19, 0xb2, 0x00, 0x10, 0x12, 0x11, 0xaa, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xee, 0x7e, 0x68,
382 0x2f, 0x36, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21,
383 0x0b, 0x00, 0xe4, 0x19, 0xb2, 0x00, 0x10, 0x12, 0x11, 0xaa, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9,
384 0xef, 0x30, 0x00, 0x03, 0x02, 0x17, 0x3b, 0x02, 0x12, 0x6a, 0x74, 0x07, 0x19, 0xb2, 0x00, 0x08,
385 0x12, 0x19, 0x0c, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00, 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09,
386 0xb2, 0x00, 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09, 0xb2, 0x00, 0x14, 0x09, 0xb2, 0x00, 0x00, 0x09,
387 0xb2, 0x00, 0x14, 0xc2, 0x13, 0x7e, 0xb0, 0x55, 0x12, 0x12, 0x0b, 0x7e, 0xb0, 0xaa, 0x12, 0x12,
388 0x0b, 0x7e, 0xb0, 0x00, 0x12, 0x12, 0x0b, 0x7e, 0xb0, 0xff, 0x12, 0x12, 0x0b, 0x30, 0x13, 0x0f,
389 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x22, 0x7e,
390 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x22, 0x19, 0xb2, 0x00, 0x00, 0x12,
391 0x18, 0xff, 0x09, 0xa2, 0x00, 0x00, 0xbc, 0xab, 0x78, 0x01, 0x22, 0x20, 0x11, 0x03, 0xd2, 0x13,
392 0x22, 0x12, 0x19, 0x19, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x18, 0xff, 0x09, 0xa2, 0x00, 0x00, 0x80,
393 0xf3, 0x75, 0xb0, 0xdf, 0x12, 0x18, 0xff, 0x75, 0xb0, 0xef, 0x12, 0x18, 0xff, 0x7e, 0x24, 0x80,
394 0x00, 0x7e, 0x11, 0x21, 0x74, 0x80, 0x19, 0xb2, 0x00, 0x0c, 0x7e, 0x54, 0x00, 0x02, 0x19, 0xa2,
395 0x00, 0x04, 0x19, 0xb2, 0x00, 0x00, 0x74, 0x03, 0x19, 0xb2, 0x00, 0x0c, 0x74, 0x06, 0x19, 0xb2,
396 0x00, 0x08, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xdb, 0x22, 0x7e, 0x68, 0x2f, 0x5a, 0x7a, 0x6c,
397 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x12, 0x18,
398 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x18, 0xff, 0x09,
399 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff,
400 0x12, 0x19, 0xc4, 0x80, 0x1a, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4,
401 0x12, 0x19, 0x19, 0x30, 0x11, 0x09, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x18, 0xff, 0x80, 0xf7, 0x2e,
402 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xb6, 0x7e, 0x68, 0x2f, 0x7e, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19,
403 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00,
404 0x18, 0x7e, 0xa0, 0x55, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e,
405 0xb0, 0x0a, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80,
406 0x1a, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30,
407 0x11, 0x09, 0x19, 0xa2, 0x00, 0x00, 0x12, 0x18, 0xff, 0x80, 0xf7, 0x2e, 0x24, 0x01, 0x00, 0xa5,
408 0xd9, 0xb6, 0x30, 0x04, 0x03, 0x02, 0x15, 0x9f, 0x7e, 0x68, 0x2f, 0xa2, 0x7a, 0x6c, 0x00, 0xff,
409 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2,
410 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10,
411 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x0a,
412 0x78, 0x3c, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18,
413 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18,
414 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x0a, 0x78, 0x14, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c,
415 0x00, 0xff, 0x12, 0x19, 0xc4, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68,
416 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0xe6, 0x7e,
417 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68,
418 0x2f, 0xea, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21,
419 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e,
420 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09,
421 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x3c, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12,
422 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x02,
423 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x05, 0x78, 0x14,
424 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x2e, 0x24, 0x01, 0x00, 0xa5,
425 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12,
426 0x19, 0x19, 0x30, 0x11, 0xe6, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2,
427 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68, 0x30, 0x32, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e,
428 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12,
429 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x50, 0xbe, 0xb0, 0x50, 0x78, 0x1f, 0x6c, 0xaa,
430 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x50, 0x78, 0x0d,
431 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80, 0x20, 0x7e, 0x68, 0x2c,
432 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0x0f, 0x7e, 0xa0,
433 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x2e, 0x24, 0x01,
434 0x00, 0xa5, 0xd9, 0xa2, 0x7e, 0x68, 0x30, 0x7a, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e,
435 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x01, 0x19,
436 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0xa0, 0xbe, 0xb0, 0xa0,
437 0x78, 0x1f, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e,
438 0xb0, 0xa0, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x80,
439 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30,
440 0x11, 0x0f, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80,
441 0xf1, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x7e, 0x68, 0x30, 0x9e, 0x7a, 0x6c, 0x00, 0xff,
442 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x20, 0xb1, 0x26, 0x7e,
443 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x30, 0xb1, 0x19, 0x6c, 0xaa, 0x19, 0xa2,
444 0x00, 0x10, 0x12, 0x18, 0xff, 0x20, 0xb1, 0x0d, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff,
445 0x12, 0x19, 0xc4, 0x80, 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4,
446 0x12, 0x19, 0x19, 0x30, 0x11, 0x0f, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19,
447 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xae, 0x02, 0x17, 0x3b, 0x7e,
448 0x68, 0x2f, 0xc6, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11,
449 0x21, 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18,
450 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff,
451 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x06, 0x78, 0x3c, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10,
452 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x03, 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0,
453 0x01, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x06, 0x78,
454 0x14, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x2e, 0x24, 0x01, 0x00,
455 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4,
456 0x12, 0x19, 0x19, 0x30, 0x11, 0xe6, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19,
457 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68, 0x30, 0x0e, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4,
458 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12,
459 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x01, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19,
460 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x09, 0x78, 0x3c, 0x7e,
461 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x7e, 0xa0, 0x03,
462 0x19, 0xa2, 0x00, 0x10, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2,
463 0x00, 0x18, 0x5e, 0xb0, 0x09, 0x78, 0x14, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12,
464 0x19, 0xc4, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0x9e, 0x80, 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a,
465 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12, 0x19, 0x19, 0x30, 0x11, 0xe6, 0x7e, 0xa0, 0x01, 0x19,
466 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x80, 0xf1, 0x7e, 0x68, 0x30, 0x56, 0x7a,
467 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x7e,
468 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2, 0x00, 0x18, 0x5e, 0xb0, 0x90,
469 0xbe, 0xb0, 0x90, 0x78, 0x1f, 0x6c, 0xaa, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x09, 0xb2,
470 0x00, 0x18, 0x5e, 0xb0, 0x90, 0x78, 0x0d, 0x7e, 0x68, 0x2c, 0xe7, 0x7a, 0x6c, 0x00, 0xff, 0x12,
471 0x19, 0xc4, 0x80, 0x20, 0x7e, 0x68, 0x2c, 0xf0, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x12,
472 0x19, 0x19, 0x30, 0x11, 0x0f, 0x7e, 0xa0, 0x02, 0x19, 0xa2, 0x00, 0x10, 0x6c, 0xaa, 0x19, 0xa2,
473 0x00, 0x10, 0x80, 0xf1, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xa2, 0x20, 0x1f, 0x68, 0x12, 0x12,
474 0x31, 0x12, 0x17, 0xa9, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21, 0x0b, 0x00, 0x20, 0x89, 0x26,
475 0x7e, 0xa0, 0xff, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x18, 0xff, 0x7e, 0xb0, 0x55, 0x19, 0xb2, 0x00,
476 0x00, 0x12, 0x18, 0xff, 0x30, 0x89, 0x0f, 0x7e, 0xa0, 0x00, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x18,
477 0xff, 0x20, 0x89, 0x02, 0x80, 0x26, 0x12, 0x19, 0x19, 0x30, 0x11, 0x20, 0x7e, 0xa0, 0xff, 0x19,
478 0xa2, 0x00, 0x04, 0x12, 0x18, 0xff, 0x7e, 0xb0, 0x55, 0x19, 0xb2, 0x00, 0x00, 0x12, 0x18, 0xff,
479 0x7e, 0xa0, 0x00, 0x19, 0xa2, 0x00, 0x04, 0x12, 0x18, 0xff, 0x80, 0xe0, 0x2e, 0x24, 0x01, 0x00,
480 0xa5, 0xd9, 0xa8, 0x02, 0x17, 0xc2, 0x02, 0x18, 0x4c, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x21,
481 0x7e, 0xa0, 0x08, 0x19, 0xa2, 0x00, 0x10, 0x12, 0x18, 0xff, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9,
482 0xef, 0x22, 0x30, 0x1f, 0x03, 0x02, 0x18, 0x4c, 0xc2, 0x8a, 0x12, 0x17, 0xa9, 0x0b, 0x00, 0x12,
483 0x18, 0x16, 0x20, 0x8b, 0x24, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x02, 0x7a, 0xb3, 0x91,
484 0x07, 0x74, 0x0c, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x07, 0x12, 0x19, 0x0c,
485 0x30, 0x8b, 0x06, 0x12, 0x18, 0x16, 0x30, 0x8b, 0xad, 0x12, 0x19, 0x19, 0x30, 0x11, 0xa7, 0x12,
486 0x18, 0x16, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x07, 0x12, 0x19,
487 0x0c, 0x12, 0x18, 0x16, 0x80, 0xe9, 0x7e, 0xa0, 0x00, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x06, 0x7a,
488 0xa3, 0x91, 0x07, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7a, 0xa3, 0x91, 0x07, 0x12, 0x18, 0xff,
489 0x74, 0xef, 0x7a, 0xb3, 0x91, 0x04, 0x74, 0x80, 0x7a, 0xb3, 0x91, 0x03, 0x74, 0x0c, 0x7a, 0xb3,
490 0x91, 0x06, 0x74, 0x08, 0x7a, 0xb3, 0x91, 0x07, 0x12, 0x19, 0x0c, 0x22, 0x30, 0x12, 0x19, 0x7e,
491 0x68, 0x30, 0xc2, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0xd2, 0x11, 0x12, 0x18, 0xff, 0x12,
492 0x18, 0xff, 0x12, 0x18, 0xff, 0x02, 0x0c, 0xca, 0x30, 0x1f, 0x1c, 0x7e, 0x68, 0x31, 0x3c, 0x7a,
493 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x7e, 0x68, 0x31, 0x5e, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19,
494 0xc4, 0x12, 0x1a, 0x6e, 0x02, 0x18, 0xf7, 0x0b, 0x00, 0x7e, 0x78, 0x18, 0xb1, 0x7a, 0x7c, 0x00,
495 0xff, 0x7f, 0x67, 0x7a, 0x6c, 0x00, 0x00, 0x7e, 0x70, 0x3e, 0x7e, 0x7b, 0xb0, 0x7a, 0x6b, 0xb0,
496 0x0b, 0x7c, 0x0b, 0x6c, 0xa5, 0xdf, 0xf3, 0x7e, 0x78, 0x18, 0xb1, 0x7a, 0x7c, 0x00, 0x00, 0x89,
497 0x78, 0x7e, 0x78, 0x00, 0x00, 0x7a, 0x7c, 0x00, 0xfe, 0x7e, 0x68, 0x7f, 0xbf, 0x7a, 0x6c, 0x00,
498 0xfe, 0x74, 0xaa, 0x39, 0xb7, 0x55, 0x55, 0x74, 0x55, 0x39, 0xb7, 0x2a, 0xaa, 0x74, 0xa0, 0x39,
499 0xb7, 0x55, 0x55, 0x6c, 0x99, 0x7a, 0x6b, 0x90, 0x7e, 0x54, 0x27, 0x10, 0x7e, 0x6b, 0x80, 0xbc,
500 0x89, 0x68, 0x08, 0x1b, 0x54, 0x78, 0xf5, 0x8a, 0xff, 0x18, 0xef, 0x8a, 0xff, 0x18, 0xf7, 0x12,
501 0x19, 0x19, 0x7e, 0x6b, 0x80, 0x80, 0xfb, 0x7e, 0x10, 0xff, 0x12, 0x19, 0xac, 0x80, 0xf8, 0xca,
502 0xf9, 0x7e, 0xf4, 0x00, 0xff, 0x1b, 0xf4, 0x78, 0xfc, 0xda, 0xf9, 0x22, 0xca, 0xf9, 0x7e, 0xf4,
503 0x00, 0x00, 0x1b, 0xf4, 0x78, 0xfc, 0xda, 0xf9, 0x22, 0x20, 0x11, 0x20, 0xd2, 0x12, 0x12, 0x19,
504 0x0c, 0x7e, 0xb0, 0x02, 0x7a, 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c, 0x12, 0x19,
505 0x0c, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x90, 0x00, 0x22, 0xca, 0x0b, 0x7e, 0x10,
506 0x03, 0x7c, 0x30, 0x6c, 0x22, 0x0b, 0x20, 0x9e, 0x30, 0x0a, 0x50, 0xf9, 0x2e, 0x30, 0x0b, 0x1b,
507 0x20, 0x68, 0x20, 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x03, 0x7a, 0xb3, 0x90, 0x00,
508 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x90, 0x00,
509 0xa5, 0xda, 0xe0, 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c, 0x1b, 0x30, 0x68, 0x20, 0x12, 0x19, 0x0c,
510 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x02, 0x7a, 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0x12, 0x19, 0x0c,
511 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x90, 0x00, 0xa5, 0xdb, 0xe0, 0x7e, 0x20, 0x0a,
512 0x12, 0x19, 0x0c, 0xa5, 0xda, 0xfa, 0xa5, 0xd9, 0x98, 0xda, 0x0b, 0x22, 0x20, 0x11, 0x14, 0x12,
513 0x19, 0x0c, 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x90, 0x00, 0x12, 0x19, 0x0c, 0x7e, 0xb0, 0x00, 0x7a,
514 0xb3, 0x90, 0x00, 0x22, 0x30, 0x1f, 0x32, 0x20, 0x11, 0x2f, 0xca, 0x2b, 0xca, 0x7b, 0x7e, 0x78,
515 0x80, 0x00, 0x7a, 0x7c, 0x00, 0xfe, 0x12, 0x1a, 0x4d, 0x7e, 0x6b, 0xa0, 0x5c, 0xaa, 0x68, 0x10,
516 0x29, 0xb7, 0x00, 0x14, 0x54, 0x60, 0x68, 0xf8, 0x39, 0xa7, 0x00, 0x00, 0x0b, 0x6c, 0x80, 0xe9,
517 0x12, 0x18, 0xff, 0xd2, 0xb5, 0xda, 0x7b, 0xda, 0x2b, 0x22, 0x12, 0x1a, 0x05, 0x7e, 0x68, 0x00,
518 0x0c, 0x12, 0x19, 0xc4, 0x22, 0xca, 0x59, 0xca, 0x5b, 0x7e, 0xb4, 0x00, 0x0c, 0x7c, 0xb8, 0xc4,
519 0x12, 0x1a, 0x35, 0x7c, 0xb8, 0x12, 0x1a, 0x35, 0x7c, 0xb9, 0xc4, 0x12, 0x1a, 0x35, 0x7c, 0xb9,
520 0x12, 0x1a, 0x35, 0x7e, 0xb0, 0x68, 0x7a, 0xb9, 0xb0, 0x0b, 0xb4, 0x6c, 0xbb, 0x7a, 0xb9, 0xb0,
521 0xda, 0x59, 0xda, 0x5b, 0x22, 0x5e, 0xb0, 0x0f, 0x7c, 0xab, 0x9e, 0xa0, 0x0a, 0x40, 0x05, 0x2e,
522 0xb0, 0x37, 0x80, 0x03, 0x2e, 0xb0, 0x30, 0x7a, 0xb9, 0xb0, 0x0b, 0xb4, 0x22, 0xc2, 0xb5, 0x75,
523 0xb0, 0xef, 0x12, 0x18, 0xff, 0x74, 0x80, 0x39, 0xb7, 0x00, 0x0c, 0x7e, 0x54, 0x00, 0x06, 0x39,
524 0xa7, 0x00, 0x04, 0x39, 0xb7, 0x00, 0x00, 0x74, 0x03, 0x39, 0xb7, 0x00, 0x0c, 0x22, 0x7e, 0x78,
525 0x00, 0x00, 0x7a, 0x7c, 0x00, 0xff, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0x01, 0x7f, 0x65,
526 0x7e, 0x74, 0x20, 0x00, 0x12, 0x0b, 0x63, 0x40, 0x58, 0x7e, 0x78, 0x7c, 0x00, 0x7a, 0x7c, 0x00,
527 0xff, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0x01, 0x7e, 0x68, 0x7c, 0x00, 0x7a, 0x6c, 0x00,
528 0x01, 0x7e, 0x74, 0x04, 0x00, 0x12, 0x0b, 0x63, 0x40, 0x37, 0x74, 0x80, 0x12, 0x1a, 0xea, 0x40,
529 0x30, 0x7e, 0x00, 0x03, 0x7a, 0x03, 0x90, 0x00, 0xd2, 0x10, 0x7e, 0x04, 0x00, 0x08, 0x7e, 0x14,
530 0x00, 0x00, 0x84, 0xa5, 0xdb, 0xfc, 0xa5, 0xda, 0xf9, 0xa5, 0xd9, 0xf6, 0x74, 0x40, 0x12, 0x1a,
531 0xea, 0x40, 0x0e, 0x7e, 0x68, 0x31, 0x8d, 0x7a, 0x6c, 0x00, 0xff, 0x12, 0x19, 0xc4, 0x02, 0x18,
532 0xf7, 0x7e, 0xb0, 0x02, 0x7a, 0xb3, 0x90, 0x00, 0x80, 0xfe, 0xf5, 0x0b, 0x7e, 0x78, 0x00, 0x0b,
533 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x68, 0x7f, 0xbf, 0x7a, 0x6c, 0x00, 0x01, 0x7e, 0x74, 0x00, 0x01,
534 0x02, 0x0b, 0x63,
535
536// Segment #19, EXCLUDED Start Address 00ff2c66, Length 1393
537
538};
539
540static struct edge_firmware_version_info IMAGE_VERSION_NAME = {
541 2, 0, 3 }; // Major, Minor, Build
542
543#undef IMAGE_VERSION_NAME
544
545#undef IMAGE_ARRAY_NAME
546
diff --git a/drivers/usb/serial/io_fw_down.h b/drivers/usb/serial/io_fw_down.h
new file mode 100644
index 000000000000..5a61d809a46e
--- /dev/null
+++ b/drivers/usb/serial/io_fw_down.h
@@ -0,0 +1,1229 @@
1//**************************************************************
2//* Edgeport/4 Binary Image
3//* Generated by HEX2C v1.06
4//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
5//* This program is free software; you can redistribute it and/or modify
6//* it under the terms of the GNU General Public License as published by
7//* the Free Software Foundation; either version 2 of the License, or
8//* (at your option) any later version.
9//**************************************************************
10
11
12//Image structure definition
13#if !defined(DEFINED_EDGE_FIRMWARE_IMAGE_RECORD)
14 #define DEFINED_EDGE_FIRMWARE_IMAGE_RECORD
15 struct edge_firmware_image_record {
16 __le16 ExtAddr;
17 __le16 Addr;
18 __le16 Len;
19 unsigned char Data[0];
20 } __attribute__ ((packed));
21
22 struct edge_firmware_version_info {
23 unsigned char MajorVersion;
24 unsigned char MinorVersion;
25 unsigned short BuildNumber;
26 };
27
28#endif
29
30#if !defined(IMAGE_ARRAY_NAME)
31 #define IMAGE_ARRAY_NAME FirmwareImage
32 #define IMAGE_VERSION_NAME FirmwareImageVersion
33#endif
34
35static unsigned char IMAGE_ARRAY_NAME[] = {
36
37// Segment #1, Start Address 00ff0000, Length 6
380xff,0x00,0x00,0x00,0x06,0x00,
39 0x02, 0x00, 0x80, 0x02, 0x44, 0xb0,
40
41// Segment #2, Start Address 00ff000b, Length 3
420xff,0x00,0x0b,0x00,0x03,0x00,
43 0x02, 0x44, 0x72,
44
45// Segment #3, Start Address 00ff0013, Length 3
460xff,0x00,0x13,0x00,0x03,0x00,
47 0x02, 0x00, 0x13,
48
49// Segment #4, Start Address 00ff001b, Length 3
500xff,0x00,0x1b,0x00,0x03,0x00,
51 0x02, 0x00, 0x1b,
52
53// Segment #5, Start Address 00ff0023, Length 3
540xff,0x00,0x23,0x00,0x03,0x00,
55 0x02, 0x00, 0x23,
56
57// Segment #6, Start Address 00ff002b, Length 3
580xff,0x00,0x2b,0x00,0x03,0x00,
59 0x02, 0x00, 0x2b,
60
61// Segment #7, Start Address 00ff0033, Length 3
620xff,0x00,0x33,0x00,0x03,0x00,
63 0x02, 0x00, 0x33,
64
65// Segment #8, Start Address 00ff003b, Length 3
660xff,0x00,0x3b,0x00,0x03,0x00,
67 0x02, 0x00, 0x3b,
68
69// Segment #9, Start Address 00ff0043, Length 3
700xff,0x00,0x43,0x00,0x03,0x00,
71 0x02, 0x00, 0x43,
72
73// Segment #10, Start Address 00ff004b, Length 3
740xff,0x00,0x4b,0x00,0x03,0x00,
75 0x02, 0x6e, 0xc4,
76
77// Segment #11, Start Address 00ff0053, Length 3
780xff,0x00,0x53,0x00,0x03,0x00,
79 0x02, 0x75, 0x8d,
80
81// Segment #12, Start Address 00ff007b, Length 3
820xff,0x00,0x7b,0x00,0x03,0x00,
83 0x02, 0x00, 0x7b,
84
85// Segment #13, Start Address 00ff0080, Length 7
860xff,0x00,0x80,0x00,0x07,0x00,
87 0x7e, 0x14, 0x00, 0x00, 0x02, 0x40, 0x51,
88
89// Segment #14, Start Address 00ff3000, Length 2178
900xff,0x00,0x00,0x30,0x82,0x08,
91 0x12, 0x37, 0x28, 0x12, 0x30, 0x3e, 0x12, 0x30, 0x54, 0x12, 0x30, 0xe5, 0x12, 0x31, 0x68, 0x12,
92 0x35, 0x20, 0x12, 0x38, 0x58, 0x12, 0x31, 0x15, 0x12, 0x31, 0x40, 0x12, 0x30, 0xa0, 0x80, 0xe0,
93 0xe5, 0x23, 0x60, 0x19, 0x7e, 0x14, 0x00, 0x00, 0x09, 0xb1, 0x01, 0xcf, 0xb4, 0x00, 0x02, 0x80,
94 0x05, 0x14, 0x19, 0xb1, 0x01, 0xcf, 0xa5, 0x0b, 0xbe, 0x31, 0x2f, 0x78, 0xeb, 0x22, 0xc2, 0xaf,
95 0x7e, 0xb3, 0x3f, 0xf1, 0xb4, 0x01, 0x0a, 0xc0, 0xf1, 0x75, 0xf1, 0x02, 0x12, 0x70, 0xef, 0xd0,
96 0xf1, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0xe5, 0x22, 0x60, 0x43, 0x7e, 0x07, 0x01, 0xe1, 0xbe, 0x04,
97 0x03, 0x80, 0x38, 0x39, 0x7e, 0x04, 0x80, 0x00, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x21, 0x09, 0xa0,
98 0x00, 0x04, 0x4e, 0xa0, 0x05, 0x19, 0xa0, 0x00, 0x04, 0x0a, 0x32, 0x09, 0x53, 0x67, 0x8e, 0x5e,
99 0x51, 0x27, 0x68, 0x0b, 0x09, 0xa0, 0x00, 0x10, 0x4e, 0xa0, 0x01, 0x19, 0xa0, 0x00, 0x10, 0x2e,
100 0x04, 0x01, 0x00, 0xa5, 0x0a, 0xbe, 0x21, 0x2f, 0x78, 0xd1, 0x75, 0x22, 0x00, 0xd2, 0xaf, 0x22,
101 0xc2, 0xaf, 0x7e, 0x20, 0x00, 0x7e, 0x30, 0x01, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x32, 0x01,
102 0x8f, 0xbe, 0x34, 0x00, 0x00, 0x68, 0x12, 0x7e, 0xb1, 0x21, 0xa5, 0x4b, 0x7a, 0xb1, 0x21, 0xca,
103 0x19, 0x49, 0x22, 0x30, 0xd5, 0x99, 0x24, 0xda, 0x19, 0x3e, 0x30, 0xa5, 0x0a, 0xbe, 0x21, 0x2f,
104 0x78, 0xd6, 0xd2, 0xaf, 0x22, 0x46, 0x0f, 0x49, 0x67, 0x4c, 0xbf, 0x50, 0x17, 0x53, 0x6f, 0x56,
105 0xc7, 0x5a, 0x1f, 0x5d, 0x77, 0xc2, 0xaf, 0xe5, 0x32, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50,
106 0x07, 0xca, 0xb8, 0x12, 0x31, 0x02, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f, 0x78, 0xef, 0xd2,
107 0xaf, 0x22, 0xca, 0x28, 0x12, 0x67, 0xab, 0xda, 0x28, 0x40, 0x09, 0x0a, 0x22, 0x09, 0xb2, 0x67,
108 0x8e, 0xf4, 0x52, 0x32, 0x22, 0xc2, 0xaf, 0xe5, 0x34, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50,
109 0x07, 0xca, 0xb8, 0x12, 0x31, 0x32, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f, 0x78, 0xef, 0xd2,
110 0xaf, 0x22, 0xca, 0x28, 0x0a, 0x22, 0x09, 0x42, 0x00, 0x3e, 0x12, 0x69, 0xc2, 0xda, 0x28, 0x22,
111 0xc2, 0xaf, 0xe5, 0x35, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x31,
112 0x5d, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f, 0x78, 0xef, 0xd2, 0xaf, 0x22, 0xca, 0x28, 0x7e,
113 0x40, 0x00, 0x12, 0x6c, 0x5b, 0xda, 0x28, 0x22, 0xc2, 0xaf, 0xe5, 0x23, 0x60, 0x14, 0x7e, 0x20,
114 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x31, 0x85, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f,
115 0x78, 0xef, 0xd2, 0xaf, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x31, 0x90, 0x89, 0x24,
116 0x31, 0xa0, 0x32, 0x10, 0x32, 0x80, 0x32, 0xf0, 0x33, 0x60, 0x33, 0xd0, 0x34, 0x40, 0x34, 0xb0,
117 0x7e, 0x27, 0x01, 0x8f, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x80, 0x00, 0x09, 0xb2,
118 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
119 0x49, 0x30, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
120 0x01, 0x9f, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x9f, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xcf, 0x80,
121 0x2e, 0x7e, 0x63, 0x01, 0xcf, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
122 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x18, 0x6c,
123 0x00, 0x7a, 0x03, 0x01, 0xcf, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
124 0x7e, 0x27, 0x01, 0x91, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x81, 0x00, 0x09, 0xb2,
125 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
126 0x4c, 0x88, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
127 0x01, 0xa1, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xa1, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd0, 0x80,
128 0x2e, 0x7e, 0x63, 0x01, 0xd0, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
129 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x19, 0x6c,
130 0x00, 0x7a, 0x03, 0x01, 0xd0, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
131 0x7e, 0x27, 0x01, 0x93, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x82, 0x00, 0x09, 0xb2,
132 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
133 0x4f, 0xe0, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
134 0x01, 0xa3, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xa3, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd1, 0x80,
135 0x2e, 0x7e, 0x63, 0x01, 0xd1, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
136 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1a, 0x6c,
137 0x00, 0x7a, 0x03, 0x01, 0xd1, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
138 0x7e, 0x27, 0x01, 0x95, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x83, 0x00, 0x09, 0xb2,
139 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
140 0x53, 0x38, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
141 0x01, 0xa5, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xa5, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd2, 0x80,
142 0x2e, 0x7e, 0x63, 0x01, 0xd2, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
143 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1b, 0x6c,
144 0x00, 0x7a, 0x03, 0x01, 0xd2, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
145 0x7e, 0x27, 0x01, 0x97, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x84, 0x00, 0x09, 0xb2,
146 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
147 0x56, 0x90, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
148 0x01, 0xa7, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xa7, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd3, 0x80,
149 0x2e, 0x7e, 0x63, 0x01, 0xd3, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
150 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1c, 0x6c,
151 0x00, 0x7a, 0x03, 0x01, 0xd3, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
152 0x7e, 0x27, 0x01, 0x99, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x85, 0x00, 0x09, 0xb2,
153 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
154 0x59, 0xe8, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
155 0x01, 0xa9, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xa9, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd4, 0x80,
156 0x2e, 0x7e, 0x63, 0x01, 0xd4, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
157 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1d, 0x6c,
158 0x00, 0x7a, 0x03, 0x01, 0xd4, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
159 0x7e, 0x27, 0x01, 0x9b, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x86, 0x00, 0x09, 0xb2,
160 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
161 0x5d, 0x40, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
162 0x01, 0xab, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xab, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd5, 0x80,
163 0x2e, 0x7e, 0x63, 0x01, 0xd5, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
164 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1e, 0x6c,
165 0x00, 0x7a, 0x03, 0x01, 0xd5, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
166 0x7e, 0x27, 0x01, 0x9d, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x87, 0x00, 0x09, 0xb2,
167 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
168 0x60, 0x98, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
169 0x01, 0xad, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0xad, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xd6, 0x80,
170 0x2e, 0x7e, 0x63, 0x01, 0xd6, 0xa5, 0xbe, 0x00, 0x26, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
171 0xa0, 0xc8, 0x12, 0x62, 0xb6, 0x40, 0x18, 0x75, 0x31, 0xb3, 0x12, 0x7c, 0x15, 0xc2, 0x1f, 0x6c,
172 0x00, 0x7a, 0x03, 0x01, 0xd6, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
173 0xc2, 0xaf, 0xe5, 0x24, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x35,
174 0x3d, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f, 0x78, 0xef, 0xd2, 0xaf, 0x22, 0x7c, 0xb2, 0x23,
175 0x0a, 0x2b, 0x49, 0x22, 0x35, 0x48, 0x89, 0x24, 0x35, 0x58, 0x35, 0x92, 0x35, 0xcc, 0x36, 0x06,
176 0x36, 0x40, 0x36, 0x7a, 0x36, 0xb4, 0x36, 0xee, 0x7e, 0x24, 0x80, 0x00, 0x09, 0xb2, 0x00, 0x14,
177 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x49, 0x30,
178 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40, 0x12, 0x75,
179 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2, 0x20, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0,
180 0xf1, 0x22, 0x7e, 0x24, 0x81, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda,
181 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x4c, 0x88, 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0,
182 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2,
183 0x21, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x82, 0x00,
184 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d,
185 0x12, 0x12, 0x4f, 0xe0, 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62,
186 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2, 0x22, 0xc0, 0xf1, 0x75, 0xf1, 0x01,
187 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x83, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8,
188 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x53, 0x38, 0x7d, 0x21,
189 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8,
190 0x12, 0x7c, 0x15, 0xc2, 0x23, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22,
191 0x7e, 0x24, 0x84, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68,
192 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x56, 0x90, 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e,
193 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2, 0x24, 0xc0,
194 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x85, 0x00, 0x09, 0xb2,
195 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
196 0x59, 0xe8, 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40,
197 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2, 0x25, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f,
198 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x86, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0,
199 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x5d, 0x40, 0x7d, 0x21, 0xda, 0x19,
200 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90, 0x12, 0x62, 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c,
201 0x15, 0xc2, 0x26, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24,
202 0x87, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca,
203 0x19, 0x7d, 0x12, 0x12, 0x60, 0x98, 0x7d, 0x21, 0xda, 0x19, 0x5e, 0xb0, 0x01, 0x7e, 0xa0, 0x90,
204 0x12, 0x62, 0x93, 0x40, 0x12, 0x75, 0x31, 0xb8, 0x12, 0x7c, 0x15, 0xc2, 0x27, 0xc0, 0xf1, 0x75,
205 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0xc2, 0xaf, 0xe5, 0x33, 0x60, 0x14, 0x7e, 0x20,
206 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x37, 0x45, 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2f,
207 0x78, 0xef, 0xd2, 0xaf, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x37, 0x50, 0x89, 0x24,
208 0x37, 0x60, 0x37, 0x7f, 0x37, 0x9e, 0x37, 0xbd, 0x37, 0xdc, 0x37, 0xfb, 0x38, 0x1a, 0x38, 0x39,
209 0x7e, 0x24, 0x80, 0x00, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x48, 0x1b, 0xda, 0x19, 0x10, 0x04, 0x02,
210 0x80, 0x0c, 0xd2, 0x01, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e,
211 0x24, 0x81, 0x00, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x4b, 0x73, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80,
212 0x0c, 0xd2, 0x01, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24,
213 0x82, 0x00, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x4e, 0xcb, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c,
214 0xd2, 0x01, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x83,
215 0x00, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x52, 0x23, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c, 0xd2,
216 0x01, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x84, 0x00,
217 0xca, 0x19, 0x7d, 0x12, 0x12, 0x55, 0x7b, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c, 0xd2, 0x01,
218 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x85, 0x00, 0xca,
219 0x19, 0x7d, 0x12, 0x12, 0x58, 0xd3, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c, 0xd2, 0x01, 0xc0,
220 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x86, 0x00, 0xca, 0x19,
221 0x7d, 0x12, 0x12, 0x5c, 0x2b, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c, 0xd2, 0x01, 0xc0, 0xf1,
222 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x7e, 0x24, 0x87, 0x00, 0xca, 0x19, 0x7d,
223 0x12, 0x12, 0x5f, 0x83, 0xda, 0x19, 0x10, 0x04, 0x02, 0x80, 0x0c, 0xd2, 0x01, 0xc0, 0xf1, 0x75,
224 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0xc2, 0xaf, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0xa9,
225 0x32, 0xf2, 0x1a, 0x7e, 0x07, 0x01, 0xe1, 0xbe, 0x04, 0x00, 0x00, 0x78, 0x10, 0xe5, 0xf5, 0x33,
226 0x82, 0xe7, 0x40, 0x09, 0x85, 0x31, 0x31, 0x12, 0x7c, 0x15, 0x75, 0xf6, 0x00, 0xd0, 0xf1, 0xd2,
227 0xaf, 0x22,
228
229// Segment #15, Start Address 00ff4000, Length 15381
2300xff,0x00,0x00,0x40,0x15,0x3c,
231 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x14, 0x7f, 0xf8, 0x7e, 0x24, 0x00, 0xfe, 0x7d, 0x31, 0x0b, 0x1a,
232 0x50, 0x1b, 0x0a, 0x50, 0x7e, 0x14, 0x40, 0x1b, 0x02, 0x40, 0x6a, 0x7e, 0xf8, 0x00, 0x6f, 0xd2,
233 0x04, 0xc2, 0x94, 0xd2, 0x95, 0x7e, 0xf4, 0x40, 0x2c, 0x02, 0x40, 0x7c, 0x12, 0x7d, 0x30, 0xf5,
234 0x2f, 0x7a, 0xa1, 0x30, 0x7a, 0x11, 0x6e, 0x12, 0x75, 0xca, 0x12, 0x40, 0xdc, 0x7e, 0xb3, 0x3f,
235 0xf1, 0x60, 0x03, 0x12, 0x43, 0xd4, 0x75, 0xf1, 0x00, 0x12, 0x76, 0x6f, 0xd2, 0xaf, 0x02, 0x30,
236 0x00, 0x7e, 0x04, 0x00, 0xff, 0x7e, 0x18, 0x40, 0x5f, 0x7a, 0x1c, 0x00, 0x01, 0x89, 0x18, 0xa9,
237 0x25, 0x87, 0x03, 0xa9, 0xd5, 0x87, 0xd2, 0x93, 0x89, 0x08, 0x7e, 0x04, 0x00, 0xff, 0x7e, 0x18,
238 0x40, 0x78, 0x7a, 0x1c, 0x00, 0x01, 0x89, 0x18, 0xc2, 0x93, 0x89, 0x08, 0x7e, 0x08, 0x00, 0x20,
239 0x7e, 0x44, 0x04, 0x00, 0x7e, 0x40, 0x00, 0x7e, 0xe4, 0x40, 0x8e, 0x02, 0x7c, 0x30, 0x7e, 0x08,
240 0x01, 0x6f, 0x7e, 0x44, 0x28, 0x7c, 0x7e, 0x40, 0x00, 0x7e, 0xe4, 0x40, 0xa0, 0x02, 0x7c, 0x30,
241 0x7e, 0x08, 0x00, 0x6f, 0x7e, 0x44, 0x01, 0x00, 0x7e, 0x40, 0x53, 0x7e, 0xe4, 0x40, 0xb2, 0x02,
242 0x7c, 0x30, 0x75, 0x6d, 0x20, 0x75, 0x6c, 0x30, 0x7e, 0x04, 0x00, 0x08, 0x75, 0x6a, 0x58, 0x75,
243 0x6b, 0x08, 0x75, 0x67, 0x08, 0x75, 0x69, 0x01, 0x75, 0x89, 0x01, 0x75, 0x8a, 0x01, 0x75, 0x8c,
244 0x00, 0xd2, 0x8c, 0x7e, 0x04, 0x00, 0x02, 0x7a, 0x05, 0x58, 0x89, 0xf4, 0x75, 0xb7, 0x7f, 0x75,
245 0xb8, 0x7f, 0x75, 0xb3, 0x07, 0x75, 0xb2, 0x07, 0xd2, 0xa9, 0x22, 0xd2, 0x92, 0xe4, 0xd5, 0xe0,
246 0xfd, 0xc2, 0x92, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x2f, 0x7e, 0xa0, 0x08, 0x19, 0xa2, 0x00,
247 0x10, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xf2, 0x7e, 0x20, 0x00, 0x12, 0x41, 0x7e, 0x0b, 0x20,
248 0xbe, 0x21, 0x2f, 0x78, 0xf6, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x74, 0xbf, 0x19, 0xb0,
249 0x00, 0x0c, 0x74, 0x10, 0x19, 0xb0, 0x00, 0x08, 0x74, 0x80, 0x19, 0xb0, 0x00, 0x0c, 0x7e, 0x54,
250 0x00, 0x02, 0x19, 0xa0, 0x00, 0x04, 0x19, 0xb0, 0x00, 0x00, 0x74, 0x03, 0x19, 0xb0, 0x00, 0x0c,
251 0x74, 0x07, 0xa9, 0x20, 0x30, 0x0b, 0xa9, 0x35, 0x30, 0x05, 0xbe, 0x20, 0x01, 0x28, 0x02, 0x74,
252 0x0f, 0x19, 0xb0, 0x00, 0x04, 0xa9, 0x33, 0x30, 0x18, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x74,
253 0x28, 0xa9, 0x20, 0x30, 0x02, 0x74, 0x20, 0x19, 0xb0, 0x00, 0x04, 0x74, 0x03, 0x19, 0xb0, 0x00,
254 0x0c, 0x74, 0xa7, 0x19, 0xb0, 0x00, 0x08, 0x74, 0x0c, 0x19, 0xb0, 0x00, 0x10, 0x22, 0x7e, 0x04,
255 0x80, 0x00, 0x4c, 0x02, 0xe4, 0x19, 0xb0, 0x00, 0x04, 0x09, 0xb0, 0x00, 0x10, 0x54, 0x08, 0x19,
256 0xb0, 0x00, 0x10, 0x74, 0xa7, 0x19, 0xb0, 0x00, 0x08, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49,
257 0x22, 0x41, 0xa5, 0x89, 0x24, 0x41, 0xb5, 0x41, 0xd4, 0x41, 0xf3, 0x42, 0x12, 0x42, 0x31, 0x42,
258 0x50, 0x42, 0x6f, 0x42, 0x8e, 0xc2, 0x10, 0xc2, 0x18, 0xc2, 0x20, 0xc2, 0x08, 0x7e, 0x04, 0x09,
259 0xe3, 0x7a, 0x07, 0x01, 0x6f, 0x7a, 0x07, 0x01, 0x7f, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x8f, 0x7a,
260 0x07, 0x01, 0x9f, 0x22, 0xc2, 0x11, 0xc2, 0x19, 0xc2, 0x21, 0xc2, 0x09, 0x7e, 0x04, 0x0d, 0xe3,
261 0x7a, 0x07, 0x01, 0x71, 0x7a, 0x07, 0x01, 0x81, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x91, 0x7a, 0x07,
262 0x01, 0xa1, 0x22, 0xc2, 0x12, 0xc2, 0x1a, 0xc2, 0x22, 0xc2, 0x0a, 0x7e, 0x04, 0x11, 0xe3, 0x7a,
263 0x07, 0x01, 0x73, 0x7a, 0x07, 0x01, 0x83, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x93, 0x7a, 0x07, 0x01,
264 0xa3, 0x22, 0xc2, 0x13, 0xc2, 0x1b, 0xc2, 0x23, 0xc2, 0x0b, 0x7e, 0x04, 0x15, 0xe3, 0x7a, 0x07,
265 0x01, 0x75, 0x7a, 0x07, 0x01, 0x85, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x95, 0x7a, 0x07, 0x01, 0xa5,
266 0x22, 0xc2, 0x14, 0xc2, 0x1c, 0xc2, 0x24, 0xc2, 0x0c, 0x7e, 0x04, 0x19, 0xe3, 0x7a, 0x07, 0x01,
267 0x77, 0x7a, 0x07, 0x01, 0x87, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x97, 0x7a, 0x07, 0x01, 0xa7, 0x22,
268 0xc2, 0x15, 0xc2, 0x1d, 0xc2, 0x25, 0xc2, 0x0d, 0x7e, 0x04, 0x1d, 0xe3, 0x7a, 0x07, 0x01, 0x79,
269 0x7a, 0x07, 0x01, 0x89, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x99, 0x7a, 0x07, 0x01, 0xa9, 0x22, 0xc2,
270 0x16, 0xc2, 0x1e, 0xc2, 0x26, 0xc2, 0x0e, 0x7e, 0x04, 0x21, 0xe3, 0x7a, 0x07, 0x01, 0x7b, 0x7a,
271 0x07, 0x01, 0x8b, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x9b, 0x7a, 0x07, 0x01, 0xab, 0x22, 0xc2, 0x17,
272 0xc2, 0x1f, 0xc2, 0x27, 0xc2, 0x0f, 0x7e, 0x04, 0x25, 0xe3, 0x7a, 0x07, 0x01, 0x7d, 0x7a, 0x07,
273 0x01, 0x8d, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x9d, 0x7a, 0x07, 0x01, 0xad, 0x22, 0x7c, 0xb2, 0x23,
274 0x0a, 0x2b, 0x49, 0x22, 0x42, 0xb8, 0x89, 0x24, 0x42, 0xc8, 0x42, 0xe9, 0x43, 0x0a, 0x43, 0x2b,
275 0x43, 0x4c, 0x43, 0x6d, 0x43, 0x8e, 0x43, 0xaf, 0x30, 0x50, 0x07, 0x20, 0x68, 0x04, 0xc2, 0x28,
276 0x80, 0x16, 0x30, 0x40, 0x07, 0x20, 0x60, 0x04, 0xc2, 0x28, 0x80, 0x0c, 0x30, 0x48, 0x07, 0x20,
277 0x58, 0x04, 0xc2, 0x28, 0x80, 0x02, 0xd2, 0x28, 0x22, 0x30, 0x51, 0x07, 0x20, 0x69, 0x04, 0xc2,
278 0x29, 0x80, 0x16, 0x30, 0x41, 0x07, 0x20, 0x61, 0x04, 0xc2, 0x29, 0x80, 0x0c, 0x30, 0x49, 0x07,
279 0x20, 0x59, 0x04, 0xc2, 0x29, 0x80, 0x02, 0xd2, 0x29, 0x22, 0x30, 0x52, 0x07, 0x20, 0x6a, 0x04,
280 0xc2, 0x2a, 0x80, 0x16, 0x30, 0x42, 0x07, 0x20, 0x62, 0x04, 0xc2, 0x2a, 0x80, 0x0c, 0x30, 0x4a,
281 0x07, 0x20, 0x5a, 0x04, 0xc2, 0x2a, 0x80, 0x02, 0xd2, 0x2a, 0x22, 0x30, 0x53, 0x07, 0x20, 0x6b,
282 0x04, 0xc2, 0x2b, 0x80, 0x16, 0x30, 0x43, 0x07, 0x20, 0x63, 0x04, 0xc2, 0x2b, 0x80, 0x0c, 0x30,
283 0x4b, 0x07, 0x20, 0x5b, 0x04, 0xc2, 0x2b, 0x80, 0x02, 0xd2, 0x2b, 0x22, 0x30, 0x54, 0x07, 0x20,
284 0x6c, 0x04, 0xc2, 0x2c, 0x80, 0x16, 0x30, 0x44, 0x07, 0x20, 0x64, 0x04, 0xc2, 0x2c, 0x80, 0x0c,
285 0x30, 0x4c, 0x07, 0x20, 0x5c, 0x04, 0xc2, 0x2c, 0x80, 0x02, 0xd2, 0x2c, 0x22, 0x30, 0x55, 0x07,
286 0x20, 0x6d, 0x04, 0xc2, 0x2d, 0x80, 0x16, 0x30, 0x45, 0x07, 0x20, 0x65, 0x04, 0xc2, 0x2d, 0x80,
287 0x0c, 0x30, 0x4d, 0x07, 0x20, 0x5d, 0x04, 0xc2, 0x2d, 0x80, 0x02, 0xd2, 0x2d, 0x22, 0x30, 0x56,
288 0x07, 0x20, 0x6e, 0x04, 0xc2, 0x2e, 0x80, 0x16, 0x30, 0x46, 0x07, 0x20, 0x66, 0x04, 0xc2, 0x2e,
289 0x80, 0x0c, 0x30, 0x4e, 0x07, 0x20, 0x5e, 0x04, 0xc2, 0x2e, 0x80, 0x02, 0xd2, 0x2e, 0x22, 0x30,
290 0x57, 0x07, 0x20, 0x6f, 0x04, 0xc2, 0x2f, 0x80, 0x16, 0x30, 0x47, 0x07, 0x20, 0x67, 0x04, 0xc2,
291 0x2f, 0x80, 0x0c, 0x30, 0x4f, 0x07, 0x20, 0x5f, 0x04, 0xc2, 0x2f, 0x80, 0x02, 0xd2, 0x2f, 0x22,
292 0x44, 0x38, 0x43, 0xe5, 0xbe, 0xb0, 0x02, 0x40, 0x01, 0x22, 0x23, 0x0a, 0x5b, 0x49, 0x55, 0x43,
293 0xd0, 0x99, 0x54, 0xd3, 0x22, 0xa9, 0xc5, 0x87, 0x12, 0x44, 0x43, 0x7e, 0x04, 0x05, 0xe3, 0x7a,
294 0x07, 0x01, 0xd7, 0x7a, 0x07, 0x01, 0xd9, 0x7e, 0x04, 0x01, 0xe3, 0x7a, 0x07, 0x01, 0xdd, 0x7a,
295 0x07, 0x01, 0xdf, 0x7e, 0x04, 0x74, 0xad, 0x7a, 0x05, 0x61, 0x75, 0xf1, 0x01, 0x75, 0xe1, 0x1f,
296 0x75, 0xe4, 0x04, 0x75, 0xf4, 0x04, 0x75, 0xf1, 0x02, 0x75, 0xe1, 0x03, 0x75, 0xe4, 0x04, 0x75,
297 0xf4, 0x04, 0x43, 0xa2, 0x1c, 0x12, 0x40, 0xeb, 0x7e, 0x20, 0x00, 0x12, 0x41, 0x9a, 0x0b, 0x20,
298 0xbe, 0x21, 0x2f, 0x78, 0xf6, 0xd2, 0xa8, 0x22, 0xa9, 0xd5, 0x87, 0x12, 0x44, 0x43, 0xd2, 0x92,
299 0xc2, 0xa8, 0x22, 0x75, 0xa3, 0x00, 0x53, 0xa2, 0x03, 0x75, 0xc1, 0x00, 0x53, 0xc0, 0x03, 0x7e,
300 0x00, 0x05, 0x7a, 0x01, 0xf1, 0x43, 0xf4, 0x80, 0x43, 0xe4, 0x80, 0xe5, 0xf2, 0x54, 0x7f, 0x44,
301 0x08, 0xf5, 0xf2, 0xe5, 0xe2, 0x54, 0x7f, 0x44, 0x08, 0xf5, 0xe2, 0x75, 0xe1, 0x10, 0xa5, 0xd8,
302 0xe1, 0x22, 0xca, 0x09, 0x12, 0x30, 0x20, 0x10, 0x01, 0x12, 0xd5, 0x67, 0x1e, 0x63, 0x69, 0x01,
303 0x7e, 0x00, 0x6a, 0x2e, 0x01, 0x69, 0xa5, 0xe6, 0xf5, 0x67, 0x80, 0x12, 0x20, 0x02, 0x1e, 0x75,
304 0x69, 0x00, 0x85, 0x6a, 0x67, 0xd2, 0x02, 0x74, 0x00, 0x80, 0x0d, 0x30, 0x02, 0x0f, 0xc2, 0x02,
305 0x7e, 0x00, 0x6c, 0x2e, 0x01, 0x69, 0xa5, 0xe6, 0x53, 0x90, 0xcf, 0x42, 0x90, 0xda, 0x09, 0x32,
306 0xc0, 0xd0, 0xc0, 0xd1, 0xc0, 0xe0, 0xc0, 0xf0, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0xd2, 0x01,
307 0x75, 0x31, 0x89, 0x12, 0x7c, 0x15, 0x7e, 0x14, 0x80, 0x00, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0,
308 0x03, 0x02, 0x45, 0x4f, 0x20, 0x78, 0x5a, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03,
309 0x02, 0x45, 0x67, 0x20, 0x79, 0x4b, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03, 0x02,
310 0x45, 0x7f, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03, 0x02, 0x45, 0x97, 0x20, 0x7a,
311 0x30, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03, 0x02, 0x45, 0xaf, 0xa5, 0x0a, 0x09,
312 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03, 0x02, 0x45, 0xc7, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20,
313 0xe0, 0x03, 0x02, 0x45, 0xdf, 0xa5, 0x0a, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x03, 0x02, 0x45,
314 0xf7, 0x30, 0x04, 0x0c, 0xc2, 0x04, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1,
315 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0xd0, 0xf0, 0xd0, 0xe0, 0xd0, 0xd1, 0xd0, 0xd0, 0x32, 0x75,
316 0x31, 0x80, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63,
317 0x2b, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75, 0x31, 0x81, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a,
318 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63, 0x6b, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75,
319 0x31, 0x82, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63,
320 0xab, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75, 0x31, 0x83, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a,
321 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63, 0xeb, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75,
322 0x31, 0x84, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x64,
323 0x2b, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75, 0x31, 0x85, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a,
324 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x64, 0x6b, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75,
325 0x31, 0x86, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x64,
326 0xab, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x75, 0x31, 0x87, 0x12, 0x7c, 0x15, 0x54, 0x3e, 0x0a,
327 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x64, 0xeb, 0xca, 0x06, 0xc6, 0x44, 0x89, 0x54, 0x10,
328 0x08, 0x01, 0x22, 0x20, 0x28, 0x03, 0xd2, 0x08, 0x22, 0x75, 0x31, 0xa0, 0x12, 0x7c, 0x15, 0x7e,
329 0x14, 0x80, 0x00, 0x80, 0x06, 0x20, 0x28, 0x03, 0xd2, 0x08, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca,
330 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x49, 0x30, 0x20, 0xe6, 0x03, 0xd2, 0x08,
331 0x22, 0x30, 0x30, 0x49, 0xd2, 0x70, 0x7e, 0x37, 0x01, 0x8f, 0x7e, 0x27, 0x01, 0xaf, 0x9d, 0x32,
332 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x48, 0x7a, 0x05, 0x48, 0x7a, 0x37, 0x01, 0x8f, 0x7e, 0x37,
333 0x01, 0x6f, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x0d, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x6f,
334 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10,
335 0x70, 0xc4, 0x22, 0xc2, 0x70, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01,
336 0x8f, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xaf, 0x28, 0x04, 0x7e, 0x27, 0x01,
337 0xaf, 0x7e, 0x37, 0x01, 0x8f, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x48, 0x7a, 0x05, 0x48, 0x7a,
338 0x37, 0x01, 0x8f, 0x7e, 0x37, 0x01, 0x6f, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x0d, 0xe2, 0x38,
339 0x13, 0x7a, 0x47, 0x01, 0x6f, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c,
340 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
341 0x9e, 0x44, 0x0d, 0xe3, 0x9d, 0x24, 0x12, 0x65, 0x2b, 0x7e, 0x34, 0x09, 0xe3, 0x7d, 0x24, 0x2d,
342 0x43, 0x7a, 0x47, 0x01, 0x6f, 0x12, 0x65, 0x2b, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x46, 0x7f,
343 0x22, 0xd2, 0x08, 0x7e, 0x04, 0x09, 0xe3, 0x7a, 0x07, 0x01, 0x6f, 0x7a, 0x07, 0x01, 0x7f, 0x75,
344 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12,
345 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70,
346 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xbf, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34,
347 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05, 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1,
348 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47,
349 0x01, 0xdf, 0x7e, 0x24, 0x00, 0x00, 0x2e, 0x27, 0x01, 0xbf, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a,
350 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38, 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb,
351 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04,
352 0x30, 0x38, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x10, 0x22,
353 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64,
354 0x00, 0x00, 0x2e, 0x67, 0x01, 0xbf, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b,
355 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf,
356 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b,
357 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x00, 0x7a, 0x69,
358 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31, 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12,
359 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07, 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43,
360 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a, 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20,
361 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e,
362 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e, 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d,
363 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e, 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd,
364 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd,
365 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4,
366 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7,
367 0x02, 0x47, 0xe3, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19,
368 0xb1, 0x00, 0x04, 0x30, 0x38, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10,
369 0xd2, 0x10, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x47,
370 0xe3, 0xda, 0xb8, 0x02, 0x49, 0x30, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90,
371 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15, 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09,
372 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0, 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c,
373 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2,
374 0x68, 0x80, 0x02, 0xc2, 0x68, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x60, 0x80, 0x02,
375 0xc2, 0x60, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x58, 0x80, 0x02, 0xc2, 0x58, 0x12,
376 0x42, 0xc8, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a,
377 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93,
378 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c,
379 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1,
380 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x48, 0x35, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22,
381 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10, 0x09, 0x01, 0x22, 0x20, 0x29, 0x03, 0xd2, 0x09,
382 0x22, 0x75, 0x31, 0xa1, 0x12, 0x7c, 0x15, 0x7e, 0x14, 0x81, 0x00, 0x80, 0x06, 0x20, 0x29, 0x03,
383 0xd2, 0x09, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03,
384 0x12, 0x4c, 0x88, 0x20, 0xe6, 0x03, 0xd2, 0x09, 0x22, 0x30, 0x31, 0x49, 0xd2, 0x71, 0x7e, 0x37,
385 0x01, 0x91, 0x7e, 0x27, 0x01, 0xb1, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x4a, 0x7a,
386 0x05, 0x4a, 0x7a, 0x37, 0x01, 0x91, 0x7e, 0x37, 0x01, 0x71, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44,
387 0x11, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x71, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51,
388 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10, 0x71, 0xc4, 0x22, 0xc2, 0x71, 0x2d, 0x23, 0x68,
389 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x91, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe,
390 0x27, 0x01, 0xb1, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xb1, 0x7e, 0x37, 0x01, 0x91, 0x9d, 0x32, 0x7d,
391 0x02, 0x2e, 0x05, 0x4a, 0x7a, 0x05, 0x4a, 0x7a, 0x37, 0x01, 0x91, 0x7e, 0x37, 0x01, 0x71, 0x7d,
392 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x11, 0xe2, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x71, 0x75, 0x31, 0x94,
393 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12,
394 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x11, 0xe3, 0x9d, 0x24, 0x12, 0x65,
395 0x2b, 0x7e, 0x34, 0x0d, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x71, 0x12, 0x65, 0x2b,
396 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x49, 0xd7, 0x22, 0xd2, 0x09, 0x7e, 0x04, 0x0d, 0xe3, 0x7a,
397 0x07, 0x01, 0x71, 0x7a, 0x07, 0x01, 0x81, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00,
398 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12, 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14,
399 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70, 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xc1,
400 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05,
401 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1, 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42,
402 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47, 0x01, 0xdf, 0x7e, 0x24, 0x01, 0x00, 0x2e, 0x27,
403 0x01, 0xc1, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38,
404 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1,
405 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x39, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
406 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x11, 0x22, 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
407 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64, 0x01, 0x00, 0x2e, 0x67, 0x01, 0xc1, 0x9e, 0x24,
408 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3,
409 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf, 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34,
410 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54,
411 0x0f, 0x23, 0x23, 0x23, 0x44, 0x01, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31,
412 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07,
413 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a,
414 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80,
415 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e,
416 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e,
417 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd,
418 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09,
419 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a,
420 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x4b, 0x3b, 0x75, 0x31, 0x99, 0x12, 0x7c,
421 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x39, 0x0a, 0x09, 0xb1,
422 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x11, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8,
423 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x4b, 0x3b, 0xda, 0xb8, 0x02, 0x4c, 0x88, 0x09, 0xb1,
424 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90, 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15,
425 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09, 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0,
426 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c, 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a,
427 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x69, 0x80, 0x02, 0xc2, 0x69, 0xa5, 0xfd, 0x5e,
428 0x50, 0x20, 0x68, 0x04, 0xd2, 0x61, 0x80, 0x02, 0xc2, 0x61, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68,
429 0x04, 0xd2, 0x59, 0x80, 0x02, 0xc2, 0x59, 0x12, 0x42, 0xe9, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91,
430 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08,
431 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80,
432 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09,
433 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x4b,
434 0x8d, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10,
435 0x0a, 0x01, 0x22, 0x20, 0x2a, 0x03, 0xd2, 0x0a, 0x22, 0x75, 0x31, 0xa2, 0x12, 0x7c, 0x15, 0x7e,
436 0x14, 0x82, 0x00, 0x80, 0x06, 0x20, 0x2a, 0x03, 0xd2, 0x0a, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca,
437 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x4f, 0xe0, 0x20, 0xe6, 0x03, 0xd2, 0x0a,
438 0x22, 0x30, 0x32, 0x49, 0xd2, 0x72, 0x7e, 0x37, 0x01, 0x93, 0x7e, 0x27, 0x01, 0xb3, 0x9d, 0x32,
439 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x4c, 0x7a, 0x05, 0x4c, 0x7a, 0x37, 0x01, 0x93, 0x7e, 0x37,
440 0x01, 0x73, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x15, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x73,
441 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10,
442 0x72, 0xc4, 0x22, 0xc2, 0x72, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01,
443 0x93, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xb3, 0x28, 0x04, 0x7e, 0x27, 0x01,
444 0xb3, 0x7e, 0x37, 0x01, 0x93, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x4c, 0x7a, 0x05, 0x4c, 0x7a,
445 0x37, 0x01, 0x93, 0x7e, 0x37, 0x01, 0x73, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x15, 0xe2, 0x38,
446 0x13, 0x7a, 0x47, 0x01, 0x73, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c,
447 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
448 0x9e, 0x44, 0x15, 0xe3, 0x9d, 0x24, 0x12, 0x65, 0x2b, 0x7e, 0x34, 0x11, 0xe3, 0x7d, 0x24, 0x2d,
449 0x43, 0x7a, 0x47, 0x01, 0x73, 0x12, 0x65, 0x2b, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x4d, 0x2f,
450 0x22, 0xd2, 0x0a, 0x7e, 0x04, 0x11, 0xe3, 0x7a, 0x07, 0x01, 0x73, 0x7a, 0x07, 0x01, 0x83, 0x75,
451 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12,
452 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70,
453 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xc3, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34,
454 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05, 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1,
455 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47,
456 0x01, 0xdf, 0x7e, 0x24, 0x02, 0x00, 0x2e, 0x27, 0x01, 0xc3, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a,
457 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38, 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb,
458 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04,
459 0x30, 0x3a, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x12, 0x22,
460 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64,
461 0x02, 0x00, 0x2e, 0x67, 0x01, 0xc3, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b,
462 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf,
463 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b,
464 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x02, 0x7a, 0x69,
465 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31, 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12,
466 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07, 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43,
467 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a, 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20,
468 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e,
469 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e, 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d,
470 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e, 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd,
471 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd,
472 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4,
473 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7,
474 0x02, 0x4e, 0x93, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19,
475 0xb1, 0x00, 0x04, 0x30, 0x3a, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10,
476 0xd2, 0x12, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x4e,
477 0x93, 0xda, 0xb8, 0x02, 0x4f, 0xe0, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90,
478 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15, 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09,
479 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0, 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c,
480 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2,
481 0x6a, 0x80, 0x02, 0xc2, 0x6a, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x62, 0x80, 0x02,
482 0xc2, 0x62, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5a, 0x80, 0x02, 0xc2, 0x5a, 0x12,
483 0x43, 0x0a, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a,
484 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93,
485 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c,
486 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1,
487 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x4e, 0xe5, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22,
488 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10, 0x0b, 0x01, 0x22, 0x20, 0x2b, 0x03, 0xd2, 0x0b,
489 0x22, 0x75, 0x31, 0xa3, 0x12, 0x7c, 0x15, 0x7e, 0x14, 0x83, 0x00, 0x80, 0x06, 0x20, 0x2b, 0x03,
490 0xd2, 0x0b, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03,
491 0x12, 0x53, 0x38, 0x20, 0xe6, 0x03, 0xd2, 0x0b, 0x22, 0x30, 0x33, 0x49, 0xd2, 0x73, 0x7e, 0x37,
492 0x01, 0x95, 0x7e, 0x27, 0x01, 0xb5, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x4e, 0x7a,
493 0x05, 0x4e, 0x7a, 0x37, 0x01, 0x95, 0x7e, 0x37, 0x01, 0x75, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44,
494 0x19, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x75, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51,
495 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10, 0x73, 0xc4, 0x22, 0xc2, 0x73, 0x2d, 0x23, 0x68,
496 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x95, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe,
497 0x27, 0x01, 0xb5, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xb5, 0x7e, 0x37, 0x01, 0x95, 0x9d, 0x32, 0x7d,
498 0x02, 0x2e, 0x05, 0x4e, 0x7a, 0x05, 0x4e, 0x7a, 0x37, 0x01, 0x95, 0x7e, 0x37, 0x01, 0x75, 0x7d,
499 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x19, 0xe2, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x75, 0x75, 0x31, 0x94,
500 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12,
501 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x19, 0xe3, 0x9d, 0x24, 0x12, 0x65,
502 0x2b, 0x7e, 0x34, 0x15, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x75, 0x12, 0x65, 0x2b,
503 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x50, 0x87, 0x22, 0xd2, 0x0b, 0x7e, 0x04, 0x15, 0xe3, 0x7a,
504 0x07, 0x01, 0x75, 0x7a, 0x07, 0x01, 0x85, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00,
505 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12, 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14,
506 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70, 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xc5,
507 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05,
508 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1, 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42,
509 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47, 0x01, 0xdf, 0x7e, 0x24, 0x03, 0x00, 0x2e, 0x27,
510 0x01, 0xc5, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38,
511 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1,
512 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3b, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
513 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x13, 0x22, 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
514 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64, 0x03, 0x00, 0x2e, 0x67, 0x01, 0xc5, 0x9e, 0x24,
515 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3,
516 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf, 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34,
517 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54,
518 0x0f, 0x23, 0x23, 0x23, 0x44, 0x03, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31,
519 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07,
520 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a,
521 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80,
522 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e,
523 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e,
524 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd,
525 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09,
526 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a,
527 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x51, 0xeb, 0x75, 0x31, 0x99, 0x12, 0x7c,
528 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3b, 0x0a, 0x09, 0xb1,
529 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x13, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8,
530 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x51, 0xeb, 0xda, 0xb8, 0x02, 0x53, 0x38, 0x09, 0xb1,
531 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90, 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15,
532 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09, 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0,
533 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c, 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a,
534 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6b, 0x80, 0x02, 0xc2, 0x6b, 0xa5, 0xfd, 0x5e,
535 0x50, 0x20, 0x68, 0x04, 0xd2, 0x63, 0x80, 0x02, 0xc2, 0x63, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68,
536 0x04, 0xd2, 0x5b, 0x80, 0x02, 0xc2, 0x5b, 0x12, 0x43, 0x2b, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91,
537 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08,
538 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80,
539 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09,
540 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x52,
541 0x3d, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10,
542 0x0c, 0x01, 0x22, 0x20, 0x2c, 0x03, 0xd2, 0x0c, 0x22, 0x75, 0x31, 0xa4, 0x12, 0x7c, 0x15, 0x7e,
543 0x14, 0x84, 0x00, 0x80, 0x06, 0x20, 0x2c, 0x03, 0xd2, 0x0c, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca,
544 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x56, 0x90, 0x20, 0xe6, 0x03, 0xd2, 0x0c,
545 0x22, 0x30, 0x34, 0x49, 0xd2, 0x74, 0x7e, 0x37, 0x01, 0x97, 0x7e, 0x27, 0x01, 0xb7, 0x9d, 0x32,
546 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x50, 0x7a, 0x05, 0x50, 0x7a, 0x37, 0x01, 0x97, 0x7e, 0x37,
547 0x01, 0x77, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x1d, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x77,
548 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10,
549 0x74, 0xc4, 0x22, 0xc2, 0x74, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01,
550 0x97, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xb7, 0x28, 0x04, 0x7e, 0x27, 0x01,
551 0xb7, 0x7e, 0x37, 0x01, 0x97, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x50, 0x7a, 0x05, 0x50, 0x7a,
552 0x37, 0x01, 0x97, 0x7e, 0x37, 0x01, 0x77, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x1d, 0xe2, 0x38,
553 0x13, 0x7a, 0x47, 0x01, 0x77, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c,
554 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
555 0x9e, 0x44, 0x1d, 0xe3, 0x9d, 0x24, 0x12, 0x65, 0x2b, 0x7e, 0x34, 0x19, 0xe3, 0x7d, 0x24, 0x2d,
556 0x43, 0x7a, 0x47, 0x01, 0x77, 0x12, 0x65, 0x2b, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x53, 0xdf,
557 0x22, 0xd2, 0x0c, 0x7e, 0x04, 0x19, 0xe3, 0x7a, 0x07, 0x01, 0x77, 0x7a, 0x07, 0x01, 0x87, 0x75,
558 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12,
559 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70,
560 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xc7, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34,
561 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05, 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1,
562 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47,
563 0x01, 0xdf, 0x7e, 0x24, 0x04, 0x00, 0x2e, 0x27, 0x01, 0xc7, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a,
564 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38, 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb,
565 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04,
566 0x30, 0x3c, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x14, 0x22,
567 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64,
568 0x04, 0x00, 0x2e, 0x67, 0x01, 0xc7, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b,
569 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf,
570 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b,
571 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x04, 0x7a, 0x69,
572 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31, 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12,
573 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07, 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43,
574 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a, 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20,
575 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e,
576 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e, 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d,
577 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e, 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd,
578 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd,
579 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4,
580 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7,
581 0x02, 0x55, 0x43, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19,
582 0xb1, 0x00, 0x04, 0x30, 0x3c, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10,
583 0xd2, 0x14, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x55,
584 0x43, 0xda, 0xb8, 0x02, 0x56, 0x90, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90,
585 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15, 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09,
586 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0, 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c,
587 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2,
588 0x6c, 0x80, 0x02, 0xc2, 0x6c, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x64, 0x80, 0x02,
589 0xc2, 0x64, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5c, 0x80, 0x02, 0xc2, 0x5c, 0x12,
590 0x43, 0x4c, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a,
591 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93,
592 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c,
593 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1,
594 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x55, 0x95, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22,
595 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10, 0x0d, 0x01, 0x22, 0x20, 0x2d, 0x03, 0xd2, 0x0d,
596 0x22, 0x75, 0x31, 0xa5, 0x12, 0x7c, 0x15, 0x7e, 0x14, 0x85, 0x00, 0x80, 0x06, 0x20, 0x2d, 0x03,
597 0xd2, 0x0d, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03,
598 0x12, 0x59, 0xe8, 0x20, 0xe6, 0x03, 0xd2, 0x0d, 0x22, 0x30, 0x35, 0x49, 0xd2, 0x75, 0x7e, 0x37,
599 0x01, 0x99, 0x7e, 0x27, 0x01, 0xb9, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x52, 0x7a,
600 0x05, 0x52, 0x7a, 0x37, 0x01, 0x99, 0x7e, 0x37, 0x01, 0x79, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44,
601 0x21, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x79, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51,
602 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10, 0x75, 0xc4, 0x22, 0xc2, 0x75, 0x2d, 0x23, 0x68,
603 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x99, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe,
604 0x27, 0x01, 0xb9, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xb9, 0x7e, 0x37, 0x01, 0x99, 0x9d, 0x32, 0x7d,
605 0x02, 0x2e, 0x05, 0x52, 0x7a, 0x05, 0x52, 0x7a, 0x37, 0x01, 0x99, 0x7e, 0x37, 0x01, 0x79, 0x7d,
606 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x21, 0xe2, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x79, 0x75, 0x31, 0x94,
607 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12,
608 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x21, 0xe3, 0x9d, 0x24, 0x12, 0x65,
609 0x2b, 0x7e, 0x34, 0x1d, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x79, 0x12, 0x65, 0x2b,
610 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x57, 0x37, 0x22, 0xd2, 0x0d, 0x7e, 0x04, 0x1d, 0xe3, 0x7a,
611 0x07, 0x01, 0x79, 0x7a, 0x07, 0x01, 0x89, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00,
612 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12, 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14,
613 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70, 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xc9,
614 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05,
615 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1, 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42,
616 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47, 0x01, 0xdf, 0x7e, 0x24, 0x05, 0x00, 0x2e, 0x27,
617 0x01, 0xc9, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38,
618 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1,
619 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3d, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
620 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x15, 0x22, 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
621 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64, 0x05, 0x00, 0x2e, 0x67, 0x01, 0xc9, 0x9e, 0x24,
622 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3,
623 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf, 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34,
624 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54,
625 0x0f, 0x23, 0x23, 0x23, 0x44, 0x05, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31,
626 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07,
627 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a,
628 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80,
629 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e,
630 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e,
631 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd,
632 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09,
633 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a,
634 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x58, 0x9b, 0x75, 0x31, 0x99, 0x12, 0x7c,
635 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3d, 0x0a, 0x09, 0xb1,
636 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x15, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8,
637 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x58, 0x9b, 0xda, 0xb8, 0x02, 0x59, 0xe8, 0x09, 0xb1,
638 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90, 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15,
639 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09, 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0,
640 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c, 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a,
641 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6d, 0x80, 0x02, 0xc2, 0x6d, 0xa5, 0xfd, 0x5e,
642 0x50, 0x20, 0x68, 0x04, 0xd2, 0x65, 0x80, 0x02, 0xc2, 0x65, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68,
643 0x04, 0xd2, 0x5d, 0x80, 0x02, 0xc2, 0x5d, 0x12, 0x43, 0x6d, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91,
644 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08,
645 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80,
646 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09,
647 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x58,
648 0xed, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10,
649 0x0e, 0x01, 0x22, 0x20, 0x2e, 0x03, 0xd2, 0x0e, 0x22, 0x75, 0x31, 0xa6, 0x12, 0x7c, 0x15, 0x7e,
650 0x14, 0x86, 0x00, 0x80, 0x06, 0x20, 0x2e, 0x03, 0xd2, 0x0e, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca,
651 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x5d, 0x40, 0x20, 0xe6, 0x03, 0xd2, 0x0e,
652 0x22, 0x30, 0x36, 0x49, 0xd2, 0x76, 0x7e, 0x37, 0x01, 0x9b, 0x7e, 0x27, 0x01, 0xbb, 0x9d, 0x32,
653 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x54, 0x7a, 0x05, 0x54, 0x7a, 0x37, 0x01, 0x9b, 0x7e, 0x37,
654 0x01, 0x7b, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x25, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x7b,
655 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10,
656 0x76, 0xc4, 0x22, 0xc2, 0x76, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01,
657 0x9b, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xbb, 0x28, 0x04, 0x7e, 0x27, 0x01,
658 0xbb, 0x7e, 0x37, 0x01, 0x9b, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x54, 0x7a, 0x05, 0x54, 0x7a,
659 0x37, 0x01, 0x9b, 0x7e, 0x37, 0x01, 0x7b, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x25, 0xe2, 0x38,
660 0x13, 0x7a, 0x47, 0x01, 0x7b, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c,
661 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
662 0x9e, 0x44, 0x25, 0xe3, 0x9d, 0x24, 0x12, 0x65, 0x2b, 0x7e, 0x34, 0x21, 0xe3, 0x7d, 0x24, 0x2d,
663 0x43, 0x7a, 0x47, 0x01, 0x7b, 0x12, 0x65, 0x2b, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x5a, 0x8f,
664 0x22, 0xd2, 0x0e, 0x7e, 0x04, 0x21, 0xe3, 0x7a, 0x07, 0x01, 0x7b, 0x7a, 0x07, 0x01, 0x8b, 0x75,
665 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12,
666 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70,
667 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xcb, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34,
668 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05, 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1,
669 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47,
670 0x01, 0xdf, 0x7e, 0x24, 0x06, 0x00, 0x2e, 0x27, 0x01, 0xcb, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a,
671 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38, 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb,
672 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04,
673 0x30, 0x3e, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x16, 0x22,
674 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64,
675 0x06, 0x00, 0x2e, 0x67, 0x01, 0xcb, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b,
676 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf,
677 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b,
678 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x06, 0x7a, 0x69,
679 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31, 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12,
680 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07, 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43,
681 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a, 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20,
682 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e,
683 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e, 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d,
684 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e, 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd,
685 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd,
686 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4,
687 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7,
688 0x02, 0x5b, 0xf3, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19,
689 0xb1, 0x00, 0x04, 0x30, 0x3e, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10,
690 0xd2, 0x16, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x5b,
691 0xf3, 0xda, 0xb8, 0x02, 0x5d, 0x40, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90,
692 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15, 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09,
693 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0, 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c,
694 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2,
695 0x6e, 0x80, 0x02, 0xc2, 0x6e, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x66, 0x80, 0x02,
696 0xc2, 0x66, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5e, 0x80, 0x02, 0xc2, 0x5e, 0x12,
697 0x43, 0x8e, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91, 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a,
698 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93,
699 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c,
700 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1,
701 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x5c, 0x45, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22,
702 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x10, 0x0f, 0x01, 0x22, 0x20, 0x2f, 0x03, 0xd2, 0x0f,
703 0x22, 0x75, 0x31, 0xa7, 0x12, 0x7c, 0x15, 0x7e, 0x14, 0x87, 0x00, 0x80, 0x06, 0x20, 0x2f, 0x03,
704 0xd2, 0x0f, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03,
705 0x12, 0x60, 0x98, 0x20, 0xe6, 0x03, 0xd2, 0x0f, 0x22, 0x30, 0x37, 0x49, 0xd2, 0x77, 0x7e, 0x37,
706 0x01, 0x9d, 0x7e, 0x27, 0x01, 0xbd, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x56, 0x7a,
707 0x05, 0x56, 0x7a, 0x37, 0x01, 0x9d, 0x7e, 0x37, 0x01, 0x7d, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44,
708 0x29, 0xe2, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x7d, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x7a, 0x51,
709 0x31, 0x12, 0x7c, 0x15, 0x12, 0x65, 0x2b, 0x10, 0x77, 0xc4, 0x22, 0xc2, 0x77, 0x2d, 0x23, 0x68,
710 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x9d, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe,
711 0x27, 0x01, 0xbd, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xbd, 0x7e, 0x37, 0x01, 0x9d, 0x9d, 0x32, 0x7d,
712 0x02, 0x2e, 0x05, 0x56, 0x7a, 0x05, 0x56, 0x7a, 0x37, 0x01, 0x9d, 0x7e, 0x37, 0x01, 0x7d, 0x7d,
713 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x29, 0xe2, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x7d, 0x75, 0x31, 0x94,
714 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x02, 0x65, 0x2b, 0x75, 0x31, 0x94, 0x12,
715 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x29, 0xe3, 0x9d, 0x24, 0x12, 0x65,
716 0x2b, 0x7e, 0x34, 0x25, 0xe3, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x7d, 0x12, 0x65, 0x2b,
717 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x5d, 0xe7, 0x22, 0xd2, 0x0f, 0x7e, 0x04, 0x25, 0xe3, 0x7a,
718 0x07, 0x01, 0x7d, 0x7a, 0x07, 0x01, 0x8d, 0x75, 0x31, 0x94, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x00,
719 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x92, 0x12, 0x7c, 0x15, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14,
720 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x70, 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x27, 0x01, 0xcd,
721 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x3c, 0x7d, 0x02, 0x2e, 0x05,
722 0x46, 0x7a, 0x05, 0x46, 0x7a, 0x37, 0x01, 0xe1, 0x7e, 0x37, 0x01, 0xdf, 0x7d, 0x43, 0x2d, 0x42,
723 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x44, 0x7a, 0x47, 0x01, 0xdf, 0x7e, 0x24, 0x07, 0x00, 0x2e, 0x27,
724 0x01, 0xcd, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0xbe, 0x50, 0x38,
725 0x78, 0x03, 0x02, 0x66, 0x16, 0x02, 0x65, 0xfb, 0x75, 0x31, 0x99, 0x12, 0x7c, 0x15, 0x09, 0xb1,
726 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3f, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
727 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x17, 0x22, 0x80, 0x7d, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15,
728 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x24, 0x7e, 0x64, 0x07, 0x00, 0x2e, 0x67, 0x01, 0xcd, 0x9e, 0x24,
729 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x65, 0xfb, 0x7e, 0x34, 0x01, 0xe3,
730 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdf, 0x02, 0x65, 0xfb, 0x7a, 0x39, 0xc0, 0x7e, 0x34,
731 0x01, 0xe3, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54,
732 0x0f, 0x23, 0x23, 0x23, 0x44, 0x07, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x31,
733 0x93, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0xbd, 0x04, 0x68, 0x29, 0x7a, 0x07,
734 0x01, 0xdf, 0x7e, 0x47, 0x01, 0xe1, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xe1, 0x2e, 0x35, 0x46, 0x7a,
735 0x35, 0x46, 0x22, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80,
736 0x2a, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0x2c, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0xd1, 0xd2, 0x04, 0x7e,
737 0x07, 0x01, 0xe1, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xdf, 0x7e,
738 0x44, 0x05, 0xe3, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x70, 0x0b, 0x04, 0xbd,
739 0x04, 0x68, 0xce, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09,
740 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a,
741 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x5f, 0x4b, 0x75, 0x31, 0x99, 0x12, 0x7c,
742 0x15, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3f, 0x0a, 0x09, 0xb1,
743 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x17, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8,
744 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x5f, 0x4b, 0xda, 0xb8, 0x02, 0x60, 0x98, 0x09, 0xb1,
745 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x31, 0x90, 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12, 0x7c, 0x15,
746 0xa5, 0xfc, 0x5e, 0xb0, 0xf0, 0xa5, 0xfd, 0x09, 0xb1, 0x00, 0x18, 0x4c, 0x4b, 0x5e, 0xb0, 0xf0,
747 0xbc, 0xb5, 0x78, 0xf1, 0x5e, 0x40, 0x0f, 0x4c, 0x54, 0x7c, 0xb5, 0x5e, 0x50, 0x0b, 0x68, 0x2a,
748 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6f, 0x80, 0x02, 0xc2, 0x6f, 0xa5, 0xfd, 0x5e,
749 0x50, 0x20, 0x68, 0x04, 0xd2, 0x67, 0x80, 0x02, 0xc2, 0x67, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68,
750 0x04, 0xd2, 0x5f, 0x80, 0x02, 0xc2, 0x5f, 0x12, 0x43, 0xaf, 0x02, 0x62, 0x93, 0x75, 0x31, 0x91,
751 0x12, 0x7c, 0x15, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x20, 0xe0, 0x08,
752 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x62, 0x93, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80,
753 0x12, 0x62, 0x93, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09,
754 0x61, 0x00, 0x00, 0x12, 0x62, 0xb6, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x5f,
755 0x9d, 0x75, 0x31, 0x95, 0x12, 0x7c, 0x15, 0x22, 0x75, 0x31, 0x96, 0x12, 0x7c, 0x15, 0x22, 0x7c,
756 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10,
757 0x68, 0x04, 0xd2, 0x68, 0x80, 0x02, 0xc2, 0x68, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2,
758 0x60, 0x80, 0x02, 0xc2, 0x60, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x58, 0x80, 0x02,
759 0xc2, 0x58, 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00,
760 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x69, 0x80, 0x02, 0xc2, 0x69, 0xa5, 0xfd,
761 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x61, 0x80, 0x02, 0xc2, 0x61, 0xa5, 0xfd, 0x5e, 0x50, 0x80,
762 0x68, 0x04, 0xd2, 0x59, 0x80, 0x02, 0xc2, 0x59, 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80,
763 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6a,
764 0x80, 0x02, 0xc2, 0x6a, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x62, 0x80, 0x02, 0xc2,
765 0x62, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5a, 0x80, 0x02, 0xc2, 0x5a, 0x02, 0x62,
766 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e,
767 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6b, 0x80, 0x02, 0xc2, 0x6b, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68,
768 0x04, 0xd2, 0x63, 0x80, 0x02, 0xc2, 0x63, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5b,
769 0x80, 0x02, 0xc2, 0x5b, 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09,
770 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6c, 0x80, 0x02, 0xc2, 0x6c,
771 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x64, 0x80, 0x02, 0xc2, 0x64, 0xa5, 0xfd, 0x5e,
772 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5c, 0x80, 0x02, 0xc2, 0x5c, 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e,
773 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04,
774 0xd2, 0x6d, 0x80, 0x02, 0xc2, 0x6d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x65, 0x80,
775 0x02, 0xc2, 0x65, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5d, 0x80, 0x02, 0xc2, 0x5d,
776 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5,
777 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6e, 0x80, 0x02, 0xc2, 0x6e, 0xa5, 0xfd, 0x5e, 0x50,
778 0x20, 0x68, 0x04, 0xd2, 0x66, 0x80, 0x02, 0xc2, 0x66, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04,
779 0xd2, 0x5e, 0x80, 0x02, 0xc2, 0x5e, 0x02, 0x62, 0x7f, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c,
780 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x10, 0x68, 0x04, 0xd2, 0x6f, 0x80, 0x02,
781 0xc2, 0x6f, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x67, 0x80, 0x02, 0xc2, 0x67, 0xa5,
782 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x5f, 0x80, 0x02, 0xc2, 0x5f, 0x02, 0x62, 0x7f, 0x54,
783 0xf0, 0xc4, 0xa5, 0xff, 0xc4, 0xa5, 0x4f, 0x75, 0x31, 0x90, 0x12, 0x7c, 0x15, 0xf5, 0x31, 0x12,
784 0x7c, 0x15, 0x22, 0xca, 0x19, 0x5e, 0x20, 0x07, 0x4c, 0xa2, 0x7e, 0x74, 0x29, 0xe3, 0xca, 0x79,
785 0x7a, 0x79, 0xa0, 0x0b, 0x74, 0x7a, 0x79, 0xb0, 0x0b, 0x74, 0xda, 0x79, 0x7e, 0x30, 0x02, 0x7e,
786 0x64, 0x00, 0x02, 0x02, 0x62, 0xde, 0xca, 0x19, 0x5e, 0x20, 0x07, 0x4c, 0xa2, 0x7e, 0x74, 0x29,
787 0xe3, 0xca, 0x79, 0x7a, 0x79, 0xa0, 0x0b, 0x74, 0x7a, 0x79, 0xb0, 0x0b, 0x74, 0x7a, 0x79, 0x60,
788 0x0b, 0x74, 0xda, 0x79, 0x7e, 0x30, 0x03, 0x7e, 0x64, 0x00, 0x03, 0x02, 0x62, 0xde, 0xd2, 0x04,
789 0x7e, 0x27, 0x01, 0xe1, 0x2d, 0x26, 0xbe, 0x24, 0x04, 0x00, 0x38, 0x2e, 0x7e, 0x07, 0x01, 0xdf,
790 0x7e, 0x44, 0x05, 0xe3, 0x7e, 0x79, 0xa0, 0x7a, 0x09, 0xa0, 0x0b, 0x04, 0x0b, 0x74, 0xbd, 0x04,
791 0x68, 0x23, 0xa5, 0xdb, 0xef, 0x7a, 0x27, 0x01, 0xe1, 0x7e, 0x25, 0x46, 0x2d, 0x26, 0x7a, 0x25,
792 0x46, 0x7a, 0x07, 0x01, 0xdf, 0xda, 0x19, 0xc2, 0xd7, 0x22, 0x75, 0x31, 0x9a, 0x12, 0x7c, 0x15,
793 0xda, 0x19, 0xd2, 0xd7, 0x22, 0x7e, 0x04, 0x01, 0xe3, 0x80, 0xd7, 0x48, 0xb6, 0x46, 0x25, 0x47,
794 0x1c, 0x49, 0x15, 0x44, 0xc6, 0x44, 0xc6, 0x48, 0x1b, 0x44, 0xc6, 0x49, 0x59, 0x44, 0xc6, 0x44,
795 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x49, 0x60, 0x44, 0xc6, 0x44,
796 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
797 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x4c, 0x0e, 0x49, 0x7d, 0x4a,
798 0x74, 0x4c, 0x6d, 0x44, 0xc6, 0x44, 0xc6, 0x4b, 0x73, 0x44, 0xc6, 0x4c, 0xb1, 0x44, 0xc6, 0x44,
799 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x4c, 0xb8, 0x44, 0xc6, 0x44,
800 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
801 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x4f, 0x66, 0x4c, 0xd5, 0x4d,
802 0xcc, 0x4f, 0xc5, 0x44, 0xc6, 0x44, 0xc6, 0x4e, 0xcb, 0x44, 0xc6, 0x50, 0x09, 0x44, 0xc6, 0x44,
803 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x50, 0x10, 0x44, 0xc6, 0x44,
804 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
805 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x52, 0xbe, 0x50, 0x2d, 0x51,
806 0x24, 0x53, 0x1d, 0x44, 0xc6, 0x44, 0xc6, 0x52, 0x23, 0x44, 0xc6, 0x53, 0x61, 0x44, 0xc6, 0x44,
807 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x53, 0x68, 0x44, 0xc6, 0x44,
808 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
809 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x56, 0x16, 0x53, 0x85, 0x54,
810 0x7c, 0x56, 0x75, 0x44, 0xc6, 0x44, 0xc6, 0x55, 0x7b, 0x44, 0xc6, 0x56, 0xb9, 0x44, 0xc6, 0x44,
811 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x56, 0xc0, 0x44, 0xc6, 0x44,
812 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
813 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x59, 0x6e, 0x56, 0xdd, 0x57,
814 0xd4, 0x59, 0xcd, 0x44, 0xc6, 0x44, 0xc6, 0x58, 0xd3, 0x44, 0xc6, 0x5a, 0x11, 0x44, 0xc6, 0x44,
815 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x5a, 0x18, 0x44, 0xc6, 0x44,
816 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
817 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x5c, 0xc6, 0x5a, 0x35, 0x5b,
818 0x2c, 0x5d, 0x25, 0x44, 0xc6, 0x44, 0xc6, 0x5c, 0x2b, 0x44, 0xc6, 0x5d, 0x69, 0x44, 0xc6, 0x44,
819 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x5d, 0x70, 0x44, 0xc6, 0x44,
820 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
821 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x60, 0x1e, 0x5d, 0x8d, 0x5e,
822 0x84, 0x60, 0x7d, 0x44, 0xc6, 0x44, 0xc6, 0x5f, 0x83, 0x44, 0xc6, 0x60, 0xc1, 0x44, 0xc6, 0x44,
823 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x60, 0xc8, 0x44, 0xc6, 0x44,
824 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44,
825 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0x44, 0xc6, 0xca, 0x29, 0x1e, 0x50, 0x40,
826 0x0d, 0x7e, 0x54, 0x0b, 0x10, 0x9c, 0xb5, 0xa4, 0x2e, 0x54, 0x65, 0x48, 0x89, 0x54, 0x7e, 0x39,
827 0x00, 0x7a, 0x19, 0x00, 0x0b, 0x34, 0x80, 0xe9, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19,
828 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38,
829 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a,
830 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b,
831 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00,
832 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35,
833 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19,
834 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b,
835 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a,
836 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10,
837 0x0b, 0x35, 0x0b, 0x38, 0x00, 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0x0b, 0x38, 0x00,
838 0x7a, 0x19, 0x00, 0x7a, 0x19, 0x10, 0x0b, 0x35, 0xda, 0x29, 0x22, 0x1e, 0x50, 0x40, 0x0d, 0x7e,
839 0x54, 0x0b, 0x1c, 0x9c, 0xb5, 0xa4, 0x2e, 0x54, 0x66, 0x16, 0x89, 0x54, 0x7e, 0x19, 0x00, 0x7a,
840 0x39, 0x00, 0x0b, 0x34, 0x80, 0xe9, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b,
841 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e,
842 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00,
843 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00,
844 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38,
845 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19,
846 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b,
847 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e,
848 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10,
849 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35,
850 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19,
851 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b,
852 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e,
853 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00,
854 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00,
855 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38,
856 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19,
857 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b,
858 0x38, 0x00, 0x0b, 0x35, 0x7e, 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x7e,
859 0x19, 0x00, 0x7e, 0x19, 0x10, 0x1b, 0x38, 0x00, 0x0b, 0x35, 0x22, 0x67, 0x96, 0x69, 0x63, 0x69,
860 0x7b, 0x6a, 0x49, 0x6a, 0xe4, 0x6b, 0x8e, 0x6b, 0xa9, 0x6c, 0x3b, 0x6b, 0xc4, 0x6c, 0x05, 0x69,
861 0x96, 0x69, 0xaa, 0x7c, 0xb3, 0xbe, 0xb0, 0x0b, 0x28, 0x14, 0x75, 0x31, 0x09, 0x12, 0x7c, 0x15,
862 0x75, 0x6d, 0x10, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x43, 0xe1, 0xc0, 0xd0, 0xf1, 0x22, 0xc0, 0xa8,
863 0xc2, 0xaf, 0x23, 0x6c, 0xaa, 0x2e, 0x54, 0x67, 0x4b, 0x0b, 0x58, 0x50, 0x89, 0x54, 0x01, 0x02,
864 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x75, 0x31, 0xb0, 0x12, 0x7c, 0x15, 0x0a, 0x32, 0x09, 0xb3,
865 0x67, 0x8e, 0x42, 0x32, 0x19, 0x43, 0x00, 0x36, 0xd0, 0xa8, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x3b,
866 0x49, 0x33, 0x67, 0xcb, 0x0a, 0x22, 0x09, 0x32, 0x00, 0x36, 0x09, 0xb2, 0x67, 0x8e, 0xa5, 0xbb,
867 0x00, 0x05, 0xf4, 0x52, 0x33, 0x80, 0x02, 0x42, 0x33, 0x89, 0x34, 0x67, 0xdb, 0x68, 0x09, 0x68,
868 0x37, 0x68, 0x65, 0x68, 0x93, 0x68, 0xc1, 0x68, 0xef, 0x69, 0x1d, 0x12, 0x41, 0xb5, 0xd2, 0x28,
869 0xd2, 0x08, 0xc2, 0x40, 0xc2, 0x48, 0xc2, 0x38, 0xc2, 0x30, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xcf,
870 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xaf, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xbf,
871 0x12, 0x41, 0x16, 0x12, 0x60, 0xcf, 0x02, 0x69, 0x4b, 0x12, 0x41, 0xd4, 0xd2, 0x29, 0xd2, 0x09,
872 0xc2, 0x41, 0xc2, 0x49, 0xc2, 0x39, 0xc2, 0x31, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xd0, 0x7e, 0x04,
873 0x00, 0x20, 0x7a, 0x07, 0x01, 0xb1, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xc1, 0x12, 0x41,
874 0x16, 0x12, 0x61, 0x05, 0x02, 0x69, 0x4b, 0x12, 0x41, 0xf3, 0xd2, 0x2a, 0xd2, 0x0a, 0xc2, 0x42,
875 0xc2, 0x4a, 0xc2, 0x3a, 0xc2, 0x32, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xd1, 0x7e, 0x04, 0x00, 0x20,
876 0x7a, 0x07, 0x01, 0xb3, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xc3, 0x12, 0x41, 0x16, 0x12,
877 0x61, 0x3b, 0x02, 0x69, 0x4b, 0x12, 0x42, 0x12, 0xd2, 0x2b, 0xd2, 0x0b, 0xc2, 0x43, 0xc2, 0x4b,
878 0xc2, 0x3b, 0xc2, 0x33, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xd2, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07,
879 0x01, 0xb5, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xc5, 0x12, 0x41, 0x16, 0x12, 0x61, 0x71,
880 0x02, 0x69, 0x4b, 0x12, 0x42, 0x31, 0xd2, 0x2c, 0xd2, 0x0c, 0xc2, 0x44, 0xc2, 0x4c, 0xc2, 0x3c,
881 0xc2, 0x34, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xd3, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xb7,
882 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xc7, 0x12, 0x41, 0x16, 0x12, 0x61, 0xa7, 0x02, 0x69,
883 0x4b, 0x12, 0x42, 0x50, 0xd2, 0x2d, 0xd2, 0x0d, 0xc2, 0x45, 0xc2, 0x4d, 0xc2, 0x3d, 0xc2, 0x35,
884 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xd4, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xb9, 0x7e, 0x04,
885 0x00, 0x38, 0x7a, 0x07, 0x01, 0xc9, 0x12, 0x41, 0x16, 0x12, 0x61, 0xdd, 0x02, 0x69, 0x4b, 0x12,
886 0x42, 0x6f, 0xd2, 0x2e, 0xd2, 0x0e, 0xc2, 0x46, 0xc2, 0x4e, 0xc2, 0x3e, 0xc2, 0x36, 0x6d, 0x00,
887 0x7a, 0x03, 0x01, 0xd5, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xbb, 0x7e, 0x04, 0x00, 0x38,
888 0x7a, 0x07, 0x01, 0xcb, 0x12, 0x41, 0x16, 0x12, 0x62, 0x13, 0x02, 0x69, 0x4b, 0x12, 0x42, 0x8e,
889 0xd2, 0x2f, 0xd2, 0x0f, 0xc2, 0x47, 0xc2, 0x4f, 0xc2, 0x3f, 0xc2, 0x37, 0x6d, 0x00, 0x7a, 0x03,
890 0x01, 0xd6, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xbd, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07,
891 0x01, 0xcd, 0x12, 0x41, 0x16, 0x12, 0x62, 0x49, 0x02, 0x69, 0x4b, 0x7e, 0xa0, 0xd0, 0x7e, 0x60,
892 0x0f, 0x12, 0x62, 0xb6, 0x40, 0x0c, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1,
893 0xc2, 0xd7, 0x22, 0x75, 0x31, 0xb1, 0x12, 0x7c, 0x15, 0x0a, 0x52, 0x23, 0x6d, 0x00, 0x59, 0x05,
894 0x00, 0x48, 0x12, 0x41, 0x7e, 0x12, 0x41, 0x9a, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb2, 0x12, 0x7c,
895 0x15, 0x0a, 0x22, 0x09, 0xb2, 0x67, 0x8e, 0x42, 0x23, 0x7e, 0xb0, 0x9c, 0x19, 0xb2, 0x01, 0xcf,
896 0x12, 0x31, 0x85, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb7, 0x12, 0x7c, 0x15, 0x0a, 0x22, 0x09, 0xb2,
897 0x67, 0x8e, 0x42, 0x24, 0x12, 0x35, 0x3d, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb9, 0x12, 0x7c, 0x15,
898 0x0a, 0x32, 0x09, 0xb3, 0x67, 0x8e, 0x42, 0x34, 0x19, 0x43, 0x00, 0x3e, 0x12, 0x69, 0xc2, 0xd0,
899 0xa8, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x0b, 0x7c, 0xb4, 0x20, 0xe0, 0x04, 0x6d, 0x33, 0x80, 0x04,
900 0x49, 0x30, 0x01, 0x8f, 0x7e, 0xa0, 0xd8, 0xa5, 0xef, 0xca, 0x0b, 0xca, 0x29, 0x12, 0x62, 0xb6,
901 0xda, 0x29, 0xda, 0x0b, 0x40, 0x62, 0x75, 0x31, 0xba, 0x12, 0x7c, 0x15, 0x7c, 0xb4, 0x30, 0xe0,
902 0x1e, 0x6d, 0x33, 0x59, 0x30, 0x01, 0x8f, 0x7e, 0x34, 0x09, 0xe3, 0x0a, 0x82, 0x7e, 0x94, 0x04,
903 0x00, 0xad, 0x89, 0x2d, 0x39, 0x59, 0x30, 0x01, 0x6f, 0x59, 0x30, 0x01, 0x7f, 0x7c, 0xb4, 0x30,
904 0xe1, 0x10, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x09, 0xb0, 0x00, 0x08, 0x44, 0x04, 0x19, 0xb0,
905 0x00, 0x08, 0x0a, 0x02, 0x09, 0xb0, 0x67, 0x8e, 0x42, 0x21, 0xf4, 0x52, 0x34, 0x7c, 0xb2, 0x23,
906 0x0a, 0x0b, 0xca, 0x19, 0x49, 0x00, 0x30, 0xd5, 0x99, 0x04, 0xda, 0x19, 0xc0, 0xf1, 0x75, 0xf1,
907 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0xc2, 0xd7, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x09,
908 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x08, 0x19, 0x30, 0x00,
909 0x0c, 0x7c, 0x74, 0x5e, 0x70, 0x01, 0x68, 0x12, 0x44, 0x40, 0xca, 0xb8, 0x09, 0xb0, 0x00, 0x10,
910 0x44, 0x02, 0x19, 0xb0, 0x00, 0x10, 0xda, 0xb8, 0x80, 0x02, 0x54, 0xbf, 0x7c, 0x74, 0x5e, 0x70,
911 0x08, 0x68, 0x04, 0x44, 0x08, 0x80, 0x02, 0x54, 0xf7, 0x09, 0x30, 0x00, 0x0c, 0xca, 0xb8, 0x74,
912 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0xda, 0xb8, 0x19, 0xb0, 0x00, 0x08, 0x19, 0x30, 0x00, 0x0c, 0x0a,
913 0x62, 0x09, 0xb6, 0x67, 0x8e, 0x3e, 0x20, 0x0a, 0x62, 0x7c, 0x74, 0x5e, 0x70, 0x02, 0x68, 0x20,
914 0x42, 0x27, 0xca, 0xb8, 0x74, 0x61, 0x19, 0xb0, 0x00, 0x08, 0x7e, 0x44, 0x00, 0x10, 0x59, 0x46,
915 0x01, 0xbf, 0x09, 0xb0, 0x00, 0x10, 0x44, 0x01, 0x19, 0xb0, 0x00, 0x10, 0xda, 0xb8, 0x80, 0x11,
916 0xf4, 0x52, 0x27, 0x74, 0xa1, 0x19, 0xb0, 0x00, 0x08, 0x7e, 0x44, 0x00, 0x38, 0x59, 0x46, 0x01,
917 0xbf, 0xd0, 0xa8, 0x22, 0x7c, 0x74, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x0a, 0x62, 0x09, 0xb6,
918 0x67, 0x8e, 0xa5, 0xfd, 0xf4, 0xa5, 0xfe, 0xca, 0x28, 0x3e, 0x20, 0x0a, 0x62, 0xa5, 0xee, 0x52,
919 0x26, 0x7e, 0x44, 0x00, 0x20, 0x59, 0x46, 0x01, 0xaf, 0xda, 0x28, 0x09, 0x30, 0x00, 0x0c, 0x74,
920 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x08, 0x7c, 0x74, 0x5e, 0x70, 0x01, 0x68, 0x0c,
921 0x44, 0x80, 0xca, 0xb8, 0xa5, 0xed, 0x42, 0x2a, 0xda, 0xb8, 0x80, 0x0a, 0x54, 0x7f, 0xca, 0xb8,
922 0xa5, 0xee, 0x52, 0x2a, 0xda, 0xb8, 0x7c, 0x74, 0x5e, 0x70, 0x08, 0x68, 0x04, 0x44, 0x02, 0x80,
923 0x02, 0x54, 0xfd, 0x19, 0xb0, 0x00, 0x08, 0x19, 0x30, 0x00, 0x0c, 0x7c, 0x74, 0x5e, 0x70, 0x02,
924 0x68, 0x10, 0xa5, 0xed, 0x42, 0x28, 0x42, 0x26, 0x7e, 0x44, 0x00, 0x08, 0x59, 0x46, 0x01, 0xaf,
925 0x80, 0x04, 0xa5, 0xee, 0x52, 0x28, 0x7c, 0x74, 0x5e, 0x70, 0x04, 0x68, 0x10, 0xa5, 0xed, 0x42,
926 0x29, 0x42, 0x26, 0x7e, 0x44, 0x00, 0x08, 0x59, 0x46, 0x01, 0xaf, 0x80, 0x0b, 0xa5, 0xee, 0x52,
927 0x29, 0x7c, 0x74, 0x5e, 0x70, 0x02, 0x78, 0x00, 0x12, 0x42, 0xad, 0xd0, 0xa8, 0x22, 0x7e, 0x04,
928 0x80, 0x00, 0x4c, 0x02, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x19, 0x40,
929 0x00, 0x10, 0x19, 0x30, 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x09,
930 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x19, 0x40, 0x00, 0x18, 0x19, 0x30, 0x00,
931 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb5, 0x12, 0x7c, 0x15, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02,
932 0x09, 0xb0, 0x00, 0x0c, 0x44, 0x40, 0x19, 0xb0, 0x00, 0x0c, 0xe5, 0x6e, 0xb4, 0x07, 0x23, 0x09,
933 0xb0, 0x00, 0x10, 0x4e, 0xb0, 0x02, 0x19, 0xb0, 0x00, 0x10, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf,
934 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x04, 0x54, 0xf7, 0x19, 0xb0, 0x00, 0x04, 0x19, 0x30,
935 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb6, 0x12, 0x7c, 0x15, 0x7e, 0x04, 0x80, 0x00, 0x4c,
936 0x02, 0xe5, 0x6e, 0xb4, 0x07, 0x18, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c,
937 0x09, 0xb0, 0x00, 0x04, 0x44, 0x08, 0x19, 0xb0, 0x00, 0x04, 0x19, 0x30, 0x00, 0x0c, 0x09, 0xb0,
938 0x00, 0x0c, 0x54, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x31, 0xb4, 0x12, 0x7c,
939 0x15, 0x7a, 0x21, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x41, 0x31, 0x12, 0x7c, 0x15, 0x0a, 0x32, 0x09,
940 0xb3, 0x67, 0x8e, 0x42, 0x35, 0x12, 0x6c, 0x5b, 0xd0, 0xa8, 0x22, 0x7e, 0xb0, 0x01, 0x7e, 0xa0,
941 0xc8, 0x7c, 0x64, 0x12, 0x62, 0xb6, 0x40, 0x13, 0x0a, 0x32, 0x09, 0xb3, 0x67, 0x8e, 0xf4, 0x52,
942 0x35, 0xc0, 0xf1, 0x75, 0xf1, 0x01, 0x12, 0x6f, 0xd9, 0xd0, 0xf1, 0x22, 0x6c, 0x8c, 0x6c, 0xd3,
943 0x6d, 0x1a, 0x6d, 0x61, 0x6d, 0xa8, 0x6d, 0xef, 0x6e, 0x36, 0x6e, 0x7d, 0x75, 0x31, 0x55, 0x12,
944 0x7c, 0x15, 0x75, 0x31, 0x00, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x71,
945 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x7f, 0x7e, 0x27, 0x01, 0x8f, 0x2d, 0x23, 0x7e, 0x09,
946 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x0d, 0xe2, 0x38, 0x0f, 0x1b, 0x34,
947 0x78, 0xec, 0x7a, 0x17, 0x01, 0x7f, 0x7a, 0x27, 0x01, 0x8f, 0x02, 0x46, 0x0f, 0x7e, 0x14, 0x09,
948 0xe3, 0x80, 0xeb, 0x75, 0x31, 0x55, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x01, 0x12, 0x7c, 0x15, 0x7a,
949 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x81, 0x7e,
950 0x27, 0x01, 0x91, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe,
951 0x14, 0x11, 0xe2, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x81, 0x7a, 0x27, 0x01,
952 0x91, 0x02, 0x49, 0x67, 0x7e, 0x14, 0x0d, 0xe3, 0x80, 0xeb, 0x75, 0x31, 0x55, 0x12, 0x7c, 0x15,
953 0x75, 0x31, 0x02, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12,
954 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x83, 0x7e, 0x27, 0x01, 0x93, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b,
955 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x15, 0xe2, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec,
956 0x7a, 0x17, 0x01, 0x83, 0x7a, 0x27, 0x01, 0x93, 0x02, 0x4c, 0xbf, 0x7e, 0x14, 0x11, 0xe3, 0x80,
957 0xeb, 0x75, 0x31, 0x55, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x03, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31,
958 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x85, 0x7e, 0x27, 0x01,
959 0x95, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x19,
960 0xe2, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x85, 0x7a, 0x27, 0x01, 0x95, 0x02,
961 0x50, 0x17, 0x7e, 0x14, 0x15, 0xe3, 0x80, 0xeb, 0x75, 0x31, 0x55, 0x12, 0x7c, 0x15, 0x75, 0x31,
962 0x04, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15,
963 0x7e, 0x17, 0x01, 0x87, 0x7e, 0x27, 0x01, 0x97, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a,
964 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x1d, 0xe2, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17,
965 0x01, 0x87, 0x7a, 0x27, 0x01, 0x97, 0x02, 0x53, 0x6f, 0x7e, 0x14, 0x19, 0xe3, 0x80, 0xeb, 0x75,
966 0x31, 0x55, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x05, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c,
967 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x89, 0x7e, 0x27, 0x01, 0x99, 0x2d,
968 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x21, 0xe2, 0x38,
969 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x89, 0x7a, 0x27, 0x01, 0x99, 0x02, 0x56, 0xc7,
970 0x7e, 0x14, 0x1d, 0xe3, 0x80, 0xeb, 0x75, 0x31, 0x55, 0x12, 0x7c, 0x15, 0x75, 0x31, 0x06, 0x12,
971 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17,
972 0x01, 0x8b, 0x7e, 0x27, 0x01, 0x9b, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0,
973 0x0b, 0x14, 0xbe, 0x14, 0x25, 0xe2, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x8b,
974 0x7a, 0x27, 0x01, 0x9b, 0x02, 0x5a, 0x1f, 0x7e, 0x14, 0x21, 0xe3, 0x80, 0xeb, 0x75, 0x31, 0x55,
975 0x12, 0x7c, 0x15, 0x75, 0x31, 0x07, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c, 0x15, 0x7a,
976 0x71, 0x31, 0x12, 0x7c, 0x15, 0x7e, 0x17, 0x01, 0x8d, 0x7e, 0x27, 0x01, 0x9d, 0x2d, 0x23, 0x7e,
977 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x29, 0xe2, 0x38, 0x0f, 0x1b,
978 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x8d, 0x7a, 0x27, 0x01, 0x9d, 0x02, 0x5d, 0x77, 0x7e, 0x14,
979 0x25, 0xe3, 0x80, 0xeb, 0xca, 0xb8, 0xc0, 0xf1, 0x75, 0x31, 0x02, 0x12, 0x7c, 0x15, 0xe5, 0xc0,
980 0x54, 0x03, 0x68, 0x05, 0x12, 0x75, 0xcd, 0x80, 0xf5, 0x30, 0xc2, 0x08, 0x75, 0xf1, 0x01, 0x12,
981 0x6f, 0xd9, 0x80, 0x14, 0x30, 0xc3, 0x08, 0x75, 0xf1, 0x01, 0x12, 0x6e, 0xfd, 0x80, 0x09, 0x30,
982 0xc4, 0x06, 0x75, 0xf1, 0x02, 0x12, 0x70, 0xe9, 0xd0, 0xf1, 0xda, 0xb8, 0x32, 0x75, 0x31, 0x10,
983 0x12, 0x7c, 0x15, 0xca, 0x0b, 0xca, 0x39, 0xca, 0x59, 0xc2, 0xc3, 0xa9, 0x21, 0xe2, 0x5c, 0xe5,
984 0xe5, 0x54, 0xc0, 0x68, 0x4f, 0xe5, 0xe6, 0x6c, 0xaa, 0x7e, 0x37, 0x01, 0xdb, 0x2d, 0x35, 0xbe,
985 0x34, 0x04, 0x00, 0x38, 0x4a, 0x7a, 0x37, 0x01, 0xdb, 0x7e, 0x37, 0x01, 0xd9, 0x7d, 0x43, 0x2d,
986 0x45, 0xbe, 0x44, 0x09, 0xe2, 0x38, 0x40, 0x7a, 0x47, 0x01, 0xd9, 0x75, 0x31, 0x11, 0x12, 0x7c,
987 0x15, 0x7a, 0xb1, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x71, 0xb8, 0xa9, 0x21, 0xe5, 0x1f, 0xa9, 0xd4,
988 0xe4, 0xa9, 0x24, 0xe4, 0xfc, 0xc2, 0xc3, 0xa9, 0x21, 0xe2, 0x3b, 0xe5, 0xe5, 0x54, 0xc0, 0x78,
989 0xb4, 0x12, 0x74, 0x5a, 0xda, 0x59, 0xda, 0x39, 0xda, 0x0b, 0x22, 0x80, 0x29, 0x80, 0x58, 0x75,
990 0x31, 0x16, 0x12, 0x7c, 0x15, 0x80, 0xed, 0x75, 0x31, 0x12, 0x12, 0x7c, 0x15, 0x7a, 0xb1, 0x31,
991 0x12, 0x7c, 0x15, 0x9e, 0x44, 0x09, 0xe3, 0x9d, 0x54, 0x12, 0x71, 0xb8, 0x7e, 0x34, 0x05, 0xe3,
992 0x7d, 0x54, 0x2d, 0x43, 0x80, 0xa1, 0xe5, 0xe5, 0x54, 0x03, 0x78, 0x12, 0x75, 0x31, 0x13, 0x12,
993 0x7c, 0x15, 0x7e, 0x0f, 0x29, 0xff, 0x0b, 0x0c, 0x7a, 0x0f, 0x29, 0xff, 0x80, 0xa7, 0x75, 0x31,
994 0x14, 0x12, 0x7c, 0x15, 0x7e, 0x0f, 0x2a, 0x03, 0x0b, 0x0c, 0x7a, 0x0f, 0x2a, 0x03, 0xa9, 0xd7,
995 0xe4, 0xa9, 0x27, 0xe4, 0xfc, 0x80, 0x9d, 0x75, 0x31, 0x15, 0x12, 0x7c, 0x15, 0x7e, 0x0f, 0x2a,
996 0x07, 0x0b, 0x0c, 0x7a, 0x0f, 0x2a, 0x07, 0x80, 0xe5, 0x75, 0x31, 0x18, 0x12, 0x7c, 0x15, 0xca,
997 0x09, 0xca, 0x39, 0xca, 0x2b, 0xc2, 0xc2, 0xa9, 0x21, 0xf2, 0x52, 0xe5, 0xf5, 0x33, 0x82, 0xe7,
998 0x40, 0x44, 0x7e, 0x37, 0x01, 0xe1, 0x7e, 0x54, 0x00, 0x40, 0x9d, 0x35, 0x40, 0x43, 0x7a, 0x37,
999 0x01, 0xe1, 0x7e, 0x37, 0x01, 0xdd, 0x7d, 0x43, 0x2d, 0x45, 0xbe, 0x44, 0x05, 0xe2, 0x38, 0x52,
1000 0x7a, 0x47, 0x01, 0xdd, 0x7d, 0x45, 0x12, 0x73, 0x16, 0xa9, 0x20, 0xf5, 0x22, 0x75, 0x31, 0x19,
1001 0x12, 0x7c, 0x15, 0x7a, 0x91, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x81, 0xf7, 0x7a, 0x91, 0xf6, 0xe5,
1002 0xf5, 0x33, 0x82, 0xe7, 0x50, 0xbc, 0xda, 0x2b, 0xda, 0x39, 0xda, 0x09, 0x22, 0x80, 0x41, 0x80,
1003 0x64, 0x2d, 0x53, 0x6d, 0x33, 0x70, 0xb7, 0x7e, 0x04, 0x01, 0xe3, 0x7a, 0x07, 0x01, 0xdf, 0x7a,
1004 0x07, 0x01, 0xdd, 0xa9, 0x32, 0xf2, 0xdf, 0x85, 0x30, 0x31, 0x12, 0x7c, 0x15, 0x75, 0xf6, 0x00,
1005 0x80, 0xd4, 0xca, 0x59, 0x9e, 0x44, 0x05, 0xe3, 0x9d, 0x54, 0x12, 0x73, 0x16, 0x7e, 0x34, 0x01,
1006 0xe3, 0x7d, 0x54, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xdd, 0x12, 0x73, 0x16, 0xda, 0x49, 0x80, 0x99,
1007 0xe5, 0xf5, 0x54, 0x03, 0x78, 0x1f, 0x7e, 0x0f, 0x29, 0xef, 0x0b, 0x0c, 0x7a, 0x0f, 0x29, 0xef,
1008 0x80, 0x9d, 0x7e, 0x0f, 0x29, 0xf7, 0x0b, 0x0c, 0x7a, 0x0f, 0x29, 0xf7, 0xa9, 0xd7, 0xf4, 0xa9,
1009 0x27, 0xf4, 0xfc, 0x80, 0x8a, 0x7e, 0x0f, 0x29, 0xf3, 0x0b, 0x0c, 0x7a, 0x0f, 0x29, 0xf3, 0x80,
1010 0xeb, 0xe5, 0xf5, 0x54, 0x03, 0x78, 0x1f, 0x7e, 0x2f, 0x2a, 0x0f, 0x0b, 0x2c, 0x7a, 0x2f, 0x2a,
1011 0x0f, 0x80, 0x34, 0x7e, 0x2f, 0x2a, 0x17, 0x0b, 0x2c, 0x7a, 0x2f, 0x2a, 0x17, 0xa9, 0xd7, 0xf4,
1012 0xa9, 0x27, 0xf4, 0xfc, 0x80, 0x21, 0x7e, 0x2f, 0x2a, 0x13, 0x0b, 0x2c, 0x7a, 0x2f, 0x2a, 0x13,
1013 0x80, 0xeb, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x75, 0x31, 0x28, 0x12, 0x7c, 0x15, 0xca,
1014 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0xc2, 0xc4, 0xa9, 0x21, 0xf2, 0xb6, 0xe5, 0xf5, 0x33, 0x72, 0xe7,
1015 0x40, 0xe0, 0x7e, 0x0d, 0x46, 0x7e, 0x1d, 0x4a, 0x7e, 0x2d, 0x4e, 0x7e, 0x3d, 0x52, 0x7e, 0x85,
1016 0x56, 0x7d, 0x90, 0x4d, 0x91, 0x4d, 0x92, 0x4d, 0x93, 0x4d, 0x94, 0x4d, 0x95, 0x4d, 0x96, 0x4d,
1017 0x97, 0x4d, 0x98, 0x68, 0x72, 0x7a, 0x11, 0xf3, 0x7a, 0x01, 0xf3, 0x7a, 0x31, 0xf3, 0x7a, 0x21,
1018 0xf3, 0x7a, 0x51, 0xf3, 0x7a, 0x41, 0xf3, 0x7a, 0x71, 0xf3, 0x7a, 0x61, 0xf3, 0x7a, 0x91, 0xf3,
1019 0x7a, 0x81, 0xf3, 0x30, 0x7b, 0x1a, 0x7a, 0xb1, 0xf3, 0x7a, 0xa1, 0xf3, 0x7a, 0xd1, 0xf3, 0x7a,
1020 0xc1, 0xf3, 0x7a, 0xf1, 0xf3, 0x7a, 0xe1, 0xf3, 0x7d, 0x78, 0x7a, 0xf1, 0xf3, 0x7a, 0xe1, 0xf3,
1021 0xa9, 0x30, 0xf5, 0x03, 0x02, 0x70, 0xd6, 0x75, 0x31, 0x29, 0x12, 0x7c, 0x15, 0x20, 0x7b, 0x0b,
1022 0x75, 0x31, 0x0a, 0x12, 0x7c, 0x15, 0x75, 0xf6, 0x0a, 0x80, 0x09, 0x75, 0x31, 0x12, 0x12, 0x7c,
1023 0x15, 0x75, 0xf6, 0x12, 0x6d, 0x00, 0x7d, 0x10, 0x7a, 0x0d, 0x46, 0x7a, 0x0d, 0x4a, 0x7a, 0x0d,
1024 0x4e, 0x7a, 0x0d, 0x52, 0x7a, 0x05, 0x56, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x1e, 0xb0,
1025 0x40, 0x0c, 0x7e, 0xa0, 0x0a, 0xa4, 0x7e, 0x04, 0x72, 0xfb, 0x9d, 0x05, 0x89, 0x04, 0x7e, 0xa1,
1026 0xe3, 0x7a, 0x39, 0xa0, 0x0b, 0x34, 0x80, 0xea, 0xb4, 0x40, 0xe3, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3,
1027 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e,
1028 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38,
1029 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3,
1030 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b,
1031 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3,
1032 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e,
1033 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38,
1034 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3,
1035 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b,
1036 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3,
1037 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e,
1038 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38,
1039 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3,
1040 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b,
1041 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3,
1042 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e,
1043 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38,
1044 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3,
1045 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b,
1046 0x35, 0x7e, 0xa1, 0xe3, 0xe5, 0xe3, 0x1b, 0x38, 0x50, 0x0b, 0x35, 0x22, 0x1e, 0xb0, 0x40, 0x0c,
1047 0x7e, 0xa0, 0x0a, 0xa4, 0x7e, 0x04, 0x74, 0x59, 0x9d, 0x05, 0x89, 0x04, 0x7e, 0x39, 0xa0, 0x7a,
1048 0xa1, 0xf3, 0x0b, 0x34, 0x80, 0xea, 0xb4, 0x40, 0xe3, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5,
1049 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50,
1050 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b,
1051 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1,
1052 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b,
1053 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5,
1054 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50,
1055 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b,
1056 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1,
1057 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b,
1058 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5,
1059 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50,
1060 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b,
1061 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1,
1062 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b,
1063 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5,
1064 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50,
1065 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b,
1066 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1,
1067 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b, 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x0b,
1068 0x38, 0x50, 0x7a, 0xa1, 0xf3, 0xf5, 0xf3, 0x0b, 0x35, 0x22, 0xc2, 0xaf, 0x7e, 0x37, 0x01, 0xdb,
1069 0x4d, 0x33, 0x68, 0x3b, 0x7e, 0x07, 0x01, 0xd7, 0x7e, 0x54, 0x09, 0xe3, 0x9d, 0x50, 0xbd, 0x35,
1070 0x40, 0x02, 0x7d, 0x35, 0xca, 0x39, 0x7e, 0x65, 0x61, 0x99, 0x64, 0xda, 0x39, 0x7e, 0x07, 0x01,
1071 0xdb, 0x9d, 0x03, 0x7a, 0x07, 0x01, 0xdb, 0x2e, 0x37, 0x01, 0xd7, 0x7a, 0x37, 0x01, 0xd7, 0xbe,
1072 0x34, 0x09, 0xe2, 0x28, 0xc7, 0x7e, 0x34, 0x05, 0xe3, 0x7a, 0x37, 0x01, 0xd7, 0x80, 0xbd, 0xd2,
1073 0xaf, 0x22, 0x75, 0x31, 0x53, 0x12, 0x7c, 0x15, 0x7e, 0x15, 0x63, 0x80, 0x11, 0x75, 0x31, 0x51,
1074 0x12, 0x7c, 0x15, 0x0b, 0x08, 0x10, 0x0b, 0x05, 0x9e, 0x34, 0x00, 0x02, 0x28, 0x4d, 0x7c, 0xb2,
1075 0x20, 0xe7, 0x27, 0x54, 0x07, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x6c, 0x7c, 0x7c, 0xb2, 0x54, 0x78,
1076 0x03, 0x03, 0x03, 0x7c, 0x2b, 0x9d, 0x13, 0x40, 0x1a, 0x68, 0x12, 0x7a, 0x15, 0x63, 0x7a, 0x25,
1077 0x65, 0x7e, 0x64, 0x75, 0x37, 0x7a, 0x65, 0x61, 0x89, 0x24, 0x02, 0x75, 0x45, 0x7e, 0x64, 0x74,
1078 0xad, 0x80, 0xf2, 0x2d, 0x13, 0x9d, 0x31, 0xca, 0x39, 0x7d, 0x31, 0x2d, 0x10, 0xca, 0x19, 0xca,
1079 0x29, 0x99, 0x24, 0xda, 0x29, 0xda, 0x09, 0xda, 0x39, 0x80, 0xa2, 0x7a, 0x15, 0x63, 0x7e, 0x64,
1080 0x75, 0x23, 0x4d, 0x33, 0x78, 0x09, 0x7c, 0xb2, 0x20, 0xe7, 0x2a, 0x7e, 0x64, 0x74, 0xa2, 0x7a,
1081 0x65, 0x61, 0x22, 0x75, 0x31, 0x52, 0x12, 0x7c, 0x15, 0x7e, 0x21, 0x63, 0x7e, 0x09, 0x30, 0x0b,
1082 0x04, 0x1b, 0x34, 0x78, 0x89, 0x80, 0xd4, 0x75, 0x31, 0x54, 0x12, 0x7c, 0x15, 0x7e, 0x15, 0x63,
1083 0x7e, 0x25, 0x65, 0x80, 0x90, 0x5e, 0x20, 0x07, 0x54, 0x78, 0x7e, 0x44, 0x75, 0xc1, 0x30, 0xe6,
1084 0x16, 0x4d, 0x33, 0x68, 0x26, 0x1b, 0x34, 0x7e, 0x09, 0x40, 0x0b, 0x04, 0x7e, 0x44, 0x67, 0x63,
1085 0x20, 0xe3, 0x04, 0x7e, 0x44, 0x75, 0xc9, 0xca, 0x09, 0xca, 0x39, 0x99, 0x44, 0xda, 0x39, 0xda,
1086 0x09, 0x7e, 0x64, 0x74, 0xad, 0x4d, 0x33, 0x68, 0xa6, 0x89, 0x64, 0x7a, 0x15, 0x63, 0xf5, 0x65,
1087 0x7e, 0x64, 0x75, 0x86, 0x80, 0x99, 0x7e, 0x15, 0x63, 0xe5, 0x65, 0x80, 0xc4, 0xc0, 0xd0, 0xc0,
1088 0xd1, 0xc0, 0xe0, 0xca, 0x19, 0xa9, 0x20, 0xdf, 0x12, 0xa9, 0x21, 0xdf, 0x1b, 0x75, 0x31, 0x01,
1089 0x12, 0x7c, 0x15, 0x53, 0xdf, 0xf7, 0x12, 0x40, 0xdc, 0x80, 0x0d, 0x75, 0x31, 0xfe, 0x12, 0x7c,
1090 0x15, 0x7e, 0x14, 0x00, 0x53, 0x02, 0x40, 0x51, 0xda, 0x19, 0xd0, 0xe0, 0xd0, 0xd1, 0xd0, 0xd0,
1091 0x32, 0x03, 0xa5, 0xcb, 0x19, 0xb1, 0x80, 0x00, 0x22, 0x22, 0x02, 0x76, 0x42, 0xca, 0x0b, 0xca,
1092 0x1b, 0xca, 0x2b, 0xca, 0x3b, 0xca, 0x4b, 0xca, 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0xc0,
1093 0xf1, 0x7e, 0xb3, 0x2a, 0x33, 0xb4, 0x00, 0x02, 0x80, 0x19, 0xb4, 0x01, 0x16, 0x30, 0xc0, 0x08,
1094 0x75, 0xf1, 0x00, 0x12, 0x76, 0x2c, 0x80, 0x1f, 0x30, 0xc1, 0x1c, 0x75, 0xf1, 0x00, 0x12, 0x76,
1095 0xbd, 0x80, 0x14, 0x30, 0xc1, 0x08, 0x75, 0xf1, 0x00, 0x12, 0x76, 0xbd, 0x80, 0x09, 0x30, 0xc0,
1096 0x06, 0x75, 0xf1, 0x00, 0x12, 0x76, 0x2c, 0xd0, 0xf1, 0xda, 0xeb, 0xda, 0x7b, 0xda, 0x6b, 0xda,
1097 0x5b, 0xda, 0x4b, 0xda, 0x3b, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0xc2, 0xc0, 0x7e, 0xb3,
1098 0x2a, 0x33, 0xb4, 0x02, 0x07, 0x12, 0x76, 0x4e, 0x02, 0x76, 0x42, 0x22, 0xb4, 0x01, 0xfc, 0x02,
1099 0x76, 0x88, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x2a, 0x33, 0x7a, 0x03, 0x2a, 0x34, 0x22, 0x7e, 0xb3,
1100 0x2a, 0x2b, 0x54, 0x60, 0x60, 0x05, 0xb4, 0x40, 0x15, 0x80, 0x13, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4,
1101 0x05, 0x0c, 0x75, 0x31, 0x71, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x2e, 0xf5, 0x8f, 0x22, 0x75,
1102 0xf6, 0x00, 0x22, 0xbe, 0x57, 0x2a, 0x31, 0x28, 0x04, 0x7e, 0x57, 0x2a, 0x31, 0x7a, 0x0f, 0x2a,
1103 0x36, 0x7a, 0x57, 0x2a, 0x3a, 0x02, 0x76, 0x88, 0x7e, 0xef, 0x2a, 0x36, 0x7e, 0xf7, 0x2a, 0x3a,
1104 0x7e, 0x07, 0x2a, 0x3a, 0x4d, 0x00, 0x68, 0x21, 0x7e, 0x00, 0x00, 0x7e, 0xeb, 0xb0, 0xf5, 0xf3,
1105 0xa3, 0xa5, 0x08, 0x1b, 0xf4, 0x68, 0x04, 0xa5, 0xb8, 0x08, 0xf0, 0x7a, 0xef, 0x2a, 0x36, 0x7a,
1106 0xf7, 0x2a, 0x3a, 0x75, 0x31, 0x06, 0x12, 0x7c, 0x15, 0x7a, 0x01, 0xf6, 0x22, 0xc2, 0xc1, 0x75,
1107 0x31, 0x03, 0x12, 0x7c, 0x15, 0xa9, 0x36, 0xe2, 0x16, 0xe5, 0xf5, 0x54, 0xc0, 0x68, 0x07, 0xa9,
1108 0xd7, 0xf4, 0xa9, 0x27, 0xf4, 0xfc, 0x53, 0xe1, 0x3f, 0x43, 0xf2, 0x88, 0x02, 0x77, 0x29, 0x7e,
1109 0xb3, 0x2a, 0x34, 0xb4, 0x02, 0x04, 0xa9, 0xd4, 0xe4, 0x22, 0xb4, 0x01, 0x39, 0x7e, 0x21, 0xe6,
1110 0x7c, 0x32, 0x7e, 0x13, 0x2a, 0x35, 0x2c, 0x21, 0x7a, 0x23, 0x2a, 0x35, 0x7e, 0x00, 0x00, 0x2e,
1111 0x04, 0x2a, 0x3c, 0xe5, 0xe3, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0xa5, 0xdb, 0xf6, 0xa9, 0xd4, 0xe4,
1112 0x75, 0x31, 0x70, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x35, 0x7e, 0xa3, 0x2a, 0x32, 0xbc, 0xab,
1113 0x78, 0x03, 0x12, 0x77, 0xc0, 0x22, 0x02, 0x7b, 0x29, 0xe5, 0xe6, 0xb4, 0x08, 0x65, 0xa9, 0xc4,
1114 0xe2, 0x7e, 0x01, 0xe3, 0x7e, 0x11, 0xe3, 0x7e, 0x31, 0xe3, 0x7e, 0x21, 0xe3, 0x7e, 0x51, 0xe3,
1115 0x7e, 0x41, 0xe3, 0x7e, 0x71, 0xe3, 0x7e, 0x61, 0xe3, 0x7a, 0x0f, 0x2a, 0x2b, 0x7a, 0x1f, 0x2a,
1116 0x2f, 0x75, 0x31, 0x04, 0x12, 0x7c, 0x15, 0x7a, 0x01, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x11, 0x31,
1117 0x12, 0x7c, 0x15, 0x7a, 0x21, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x31, 0x31, 0x12, 0x7c, 0x15, 0x7a,
1118 0x41, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x51, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x61, 0x31, 0x12, 0x7c,
1119 0x15, 0x7a, 0x71, 0x31, 0x12, 0x7c, 0x15, 0xa9, 0xd4, 0xe4, 0xa9, 0xd7, 0xf4, 0xa9, 0xc6, 0xe2,
1120 0x12, 0x77, 0x94, 0x22, 0x6d, 0x00, 0x7e, 0x14, 0x01, 0x02, 0x7a, 0x07, 0x2a, 0x3a, 0x7a, 0x03,
1121 0x2a, 0x35, 0x7e, 0xb3, 0x2a, 0x2b, 0x20, 0xe7, 0x0f, 0x7a, 0x23, 0x2a, 0x34, 0x7a, 0x33, 0x2a,
1122 0x33, 0xbe, 0x07, 0x2a, 0x31, 0x68, 0x09, 0x22, 0x7a, 0x33, 0x2a, 0x34, 0x7a, 0x23, 0x2a, 0x33,
1123 0x7e, 0xb3, 0x2a, 0x2b, 0x54, 0xe3, 0x23, 0x23, 0x30, 0xe0, 0x02, 0xd2, 0xe5, 0x30, 0xe7, 0x02,
1124 0xd2, 0xe4, 0x30, 0xe5, 0x06, 0x30, 0xe4, 0x03, 0x02, 0x7b, 0x29, 0x54, 0x3e, 0xf5, 0xf0, 0x03,
1125 0x54, 0x1f, 0xc3, 0x25, 0xf0, 0x90, 0x77, 0xec, 0x75, 0x84, 0xff, 0x73, 0x02, 0x79, 0x40, 0x02,
1126 0x78, 0x34, 0x02, 0x79, 0xdd, 0x02, 0x79, 0xf8, 0x02, 0x78, 0xd9, 0x02, 0x78, 0x9a, 0x02, 0x7a,
1127 0x11, 0x02, 0x7a, 0x11, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14,
1128 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x14, 0x02, 0x7a, 0x1a, 0x02,
1129 0x7a, 0xce, 0x02, 0x7a, 0x17, 0x02, 0x7a, 0x17, 0x02, 0x7a, 0x17, 0x02, 0x7a, 0x17, 0x02, 0x7a,
1130 0x17, 0x02, 0x7a, 0x17, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x06, 0x2a, 0x7e, 0xb3, 0x2a, 0x2d, 0x60,
1131 0x56, 0x7c, 0x0b, 0x7e, 0x13, 0x2a, 0x2e, 0x7e, 0x17, 0x2a, 0x2f, 0x75, 0x31, 0x72, 0x12, 0x7c,
1132 0x15, 0x7a, 0x01, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x11, 0x31, 0x12, 0x7c, 0x15, 0x12, 0x7b, 0x33,
1133 0x40, 0x35, 0x02, 0x76, 0x73, 0xb4, 0x08, 0x10, 0x75, 0x31, 0x74, 0x12, 0x7c, 0x15, 0x7e, 0xb3,
1134 0x3f, 0xf1, 0xf5, 0xf3, 0x75, 0xf6, 0x01, 0x22, 0xb4, 0x00, 0x1c, 0x75, 0x31, 0x75, 0x12, 0x7c,
1135 0x15, 0x7e, 0xb3, 0x3f, 0xf2, 0x30, 0xe0, 0x05, 0x75, 0xf3, 0x02, 0x80, 0x03, 0x75, 0xf3, 0x00,
1136 0x75, 0xf3, 0x00, 0x75, 0xf6, 0x02, 0x22, 0x02, 0x7b, 0x29, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x00,
1137 0x35, 0x75, 0x31, 0x76, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x30, 0x54, 0x0f, 0xf5, 0xf1, 0x7e,
1138 0xb3, 0x2a, 0x30, 0x20, 0xe7, 0x09, 0xe5, 0xe1, 0x30, 0xe7, 0x0d, 0x74, 0x01, 0x80, 0x0b, 0xe5,
1139 0xe1, 0x30, 0xe6, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74, 0x00, 0x53, 0xf1, 0x80, 0xf5, 0xf3, 0x75,
1140 0xf3, 0x00, 0x75, 0xf6, 0x02, 0x22, 0x02, 0x7b, 0x29, 0xc0, 0xf1, 0x7e, 0xb3, 0x2a, 0x30, 0x54,
1141 0x0f, 0x42, 0xf1, 0x7e, 0xb3, 0x2a, 0x2e, 0xb4, 0x00, 0x45, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x01,
1142 0x24, 0x75, 0x31, 0x77, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x30, 0x54, 0x0f, 0x78, 0x05, 0x53,
1143 0xe1, 0x3f, 0x80, 0x37, 0x7e, 0xb3, 0x2a, 0x30, 0x20, 0xe7, 0x05, 0x53, 0xe1, 0x7f, 0x80, 0x2b,
1144 0x53, 0xe1, 0xbf, 0x80, 0x26, 0xb4, 0x03, 0x17, 0x75, 0x31, 0x78, 0x12, 0x7c, 0x15, 0x7e, 0xb3,
1145 0x2a, 0x30, 0x20, 0xe7, 0x05, 0x43, 0xe1, 0x80, 0x80, 0x11, 0x43, 0xe1, 0x40, 0x80, 0x0c, 0x43,
1146 0xe1, 0xc0, 0xd0, 0xf1, 0x75, 0x31, 0x07, 0x12, 0x7c, 0x15, 0x22, 0xd0, 0xf1, 0x02, 0x76, 0x6f,
1147 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x09, 0x23, 0x75, 0x31, 0x79, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a,
1148 0x2e, 0xbe, 0xb3, 0x3f, 0xf1, 0x68, 0x11, 0xca, 0xb8, 0xc0, 0xf1, 0x12, 0x43, 0xd4, 0xd0, 0xf1,
1149 0xda, 0xb8, 0x50, 0x76, 0x7a, 0xb3, 0x3f, 0xf1, 0x80, 0x6d, 0xb4, 0x05, 0x08, 0x75, 0x31, 0x7a,
1150 0x12, 0x7c, 0x15, 0x80, 0x62, 0xb4, 0x03, 0x19, 0x75, 0x31, 0x7b, 0x12, 0x7c, 0x15, 0x7e, 0xb3,
1151 0x2a, 0x2e, 0xb4, 0x01, 0x55, 0x7e, 0xb3, 0x3f, 0xf2, 0x44, 0x01, 0x7a, 0xb3, 0x3f, 0xf2, 0x80,
1152 0x46, 0xb4, 0x01, 0x19, 0x75, 0x31, 0x7c, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x2e, 0xb4, 0x01,
1153 0x39, 0x7e, 0xb3, 0x3f, 0xf2, 0x54, 0xfe, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x2a, 0xb4, 0x07, 0x2a,
1154 0x7e, 0xb3, 0x2a, 0x2d, 0x60, 0x24, 0x7c, 0x0b, 0x7e, 0x13, 0x2a, 0x2e, 0x7e, 0x17, 0x2a, 0x2f,
1155 0x75, 0x31, 0x73, 0x12, 0x7c, 0x15, 0x7a, 0x01, 0x31, 0x12, 0x7c, 0x15, 0x7a, 0x11, 0x31, 0x12,
1156 0x7c, 0x15, 0x12, 0x7b, 0x5f, 0x40, 0x03, 0x02, 0x76, 0x6f, 0x02, 0x7b, 0x29, 0x7e, 0xb3, 0x2a,
1157 0x2c, 0xb4, 0x0b, 0xf6, 0x75, 0x31, 0x7d, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x2e, 0x7e, 0xa3,
1158 0x2a, 0x30, 0x4c, 0xab, 0x78, 0xe4, 0x80, 0xdf, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x0a, 0xdb, 0x75,
1159 0x31, 0x7e, 0x12, 0x7c, 0x15, 0x7e, 0xb3, 0x2a, 0x2e, 0x70, 0xcf, 0xf5, 0xf3, 0x75, 0xf6, 0x01,
1160 0x22, 0x02, 0x7b, 0x29, 0x02, 0x7b, 0x29, 0x02, 0x7b, 0x29, 0x7e, 0xb3, 0x2a, 0x2c, 0xb4, 0x04,
1161 0x20, 0x75, 0x31, 0xc3, 0x12, 0x7c, 0x15, 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x17, 0x2a, 0x2d, 0x7e,
1162 0x18, 0x2a, 0x3c, 0x7a, 0x1c, 0x00, 0x00, 0x7e, 0x47, 0x2a, 0x31, 0x12, 0x7c, 0x21, 0x02, 0x7a,
1163 0xc8, 0xb4, 0x06, 0x3a, 0x75, 0x31, 0xc1, 0x12, 0x7c, 0x15, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c,
1164 0x00, 0xfe, 0x7d, 0xca, 0x7e, 0xd7, 0x2a, 0x2d, 0x7e, 0x78, 0x2a, 0x3c, 0x7a, 0x7c, 0x00, 0x00,
1165 0x7e, 0x77, 0x2a, 0x31, 0x75, 0x31, 0xc1, 0x12, 0x7c, 0x15, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf,
1166 0xa9, 0xd5, 0x87, 0x12, 0x7c, 0x5a, 0xd0, 0x87, 0xd0, 0xa8, 0x40, 0x4f, 0x80, 0x4a, 0xb4, 0x00,
1167 0x1c, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x76, 0x6f, 0xe4, 0x8d, 0xef, 0x8d, 0xef, 0x8d, 0xef,
1168 0xd5, 0xe0, 0xf7, 0xc0, 0xd1, 0xca, 0x02, 0xff, 0xca, 0x06, 0x00, 0x00, 0x32, 0xb4, 0x09, 0x12,
1169 0x7e, 0x57, 0x2a, 0x2d, 0x4d, 0x55, 0x68, 0x05, 0xa9, 0xd2, 0xb1, 0x80, 0x03, 0xa9, 0xc2, 0xb1,
1170 0x80, 0x16, 0xb4, 0x07, 0x16, 0xc2, 0xaf, 0x7e, 0x07, 0x2a, 0x2f, 0x7e, 0x17, 0x2a, 0x2d, 0xc0,
1171 0xd1, 0xca, 0x18, 0xca, 0x38, 0xca, 0x28, 0x32, 0x02, 0x76, 0x6f, 0x02, 0x7b, 0x29, 0x7e, 0xb3,
1172 0x2a, 0x2c, 0xb4, 0x03, 0x15, 0x75, 0x31, 0xc2, 0x12, 0x7c, 0x15, 0x7e, 0x04, 0x00, 0x01, 0x7e,
1173 0x17, 0x2a, 0x2d, 0x7e, 0x57, 0x2a, 0x31, 0x02, 0x76, 0x73, 0xb4, 0x05, 0x39, 0x75, 0x31, 0xc0,
1174 0x12, 0x7c, 0x15, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x7e, 0x08, 0x2a, 0x3c,
1175 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x37, 0x2a, 0x2d, 0x7e, 0x47, 0x2a, 0x31,
1176 0x12, 0x7c, 0x21, 0xd0, 0x87, 0xd0, 0xa8, 0x7e, 0x08, 0x2a, 0x3c, 0x7a, 0x0c, 0x00, 0x00, 0x7e,
1177 0x57, 0x2a, 0x31, 0x02, 0x76, 0x73, 0x02, 0x7b, 0x29, 0x75, 0x31, 0x07, 0x12, 0x7c, 0x15, 0x43,
1178 0xe1, 0xc0, 0x22, 0xc0, 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x7b, 0x9e, 0x40,
1179 0x19, 0x7e, 0x08, 0x2a, 0x3c, 0x7a, 0x0c, 0x00, 0x00, 0xca, 0x0b, 0xca, 0x49, 0x12, 0x7c, 0x21,
1180 0xda, 0x59, 0xda, 0x0b, 0xd0, 0x87, 0xd0, 0xa8, 0xc3, 0x22, 0xd0, 0x87, 0xd0, 0xa8, 0x22, 0xc0,
1181 0xa8, 0xc0, 0x87, 0xc2, 0xaf, 0xa9, 0xd5, 0x87, 0x12, 0x7b, 0x9e, 0x40, 0x2b, 0x7e, 0x58, 0x00,
1182 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7f, 0x61, 0x7e, 0x78, 0x2a, 0x3c, 0x7a, 0x7c, 0x00, 0x00, 0x7e,
1183 0x77, 0x2a, 0x31, 0xbd, 0x74, 0x78, 0x11, 0x75, 0x31, 0xc1, 0x12, 0x7c, 0x15, 0x12, 0x7c, 0x5a,
1184 0x40, 0x06, 0xd0, 0x87, 0xd0, 0xa8, 0xc3, 0x22, 0xd0, 0x87, 0xd0, 0xa8, 0xd3, 0x22, 0x7e, 0x24,
1185 0x00, 0xfe, 0x7e, 0x34, 0x7f, 0xca, 0x0b, 0x1a, 0x50, 0xc5, 0xf0, 0x7d, 0x62, 0x7d, 0x75, 0x7d,
1186 0x87, 0x7e, 0x34, 0x7f, 0xc2, 0x7e, 0x1b, 0xb0, 0x7e, 0x34, 0x7f, 0x03, 0xb4, 0x01, 0x04, 0x7e,
1187 0x34, 0x7f, 0xcc, 0x7e, 0x1b, 0xb0, 0xbc, 0x0b, 0x50, 0x49, 0x3e, 0x00, 0x3e, 0x00, 0x0a, 0x50,
1188 0x2d, 0x75, 0x0b, 0x3a, 0x30, 0x69, 0x53, 0x00, 0x02, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbc,
1189 0x1b, 0x50, 0x30, 0x3e, 0x10, 0x3e, 0x10, 0x0a, 0x51, 0x2d, 0x35, 0x69, 0x41, 0x00, 0x02, 0x0b,
1190 0x1a, 0x30, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbe, 0x44, 0xff, 0xff, 0x78, 0x05, 0x7e, 0x1b,
1191 0x90, 0x0a, 0x49, 0x4d, 0x44, 0x68, 0x0c, 0xbe, 0x44, 0x00, 0xff, 0x28, 0x04, 0x7e, 0x44, 0x00,
1192 0xff, 0xc3, 0x22, 0xd3, 0x22,
1193
1194// Segment #16, Start Address 00ff7fc6, Length 4
11950xff,0x00,0xc6,0x7f,0x04,0x00,
1196 0x01, 0x10, 0x04, 0x00,
1197
1198// Segment #17, Start Address 00ff7c15, Length 330
11990xff,0x00,0x15,0x7c,0x4a,0x01,
1200 0xca, 0x08, 0x7e, 0x01, 0x31, 0x7a, 0x03, 0x3f, 0xf0, 0xda, 0x08, 0x22, 0x7e, 0x1b, 0xc0, 0x7a,
1201 0x0b, 0xc0, 0x0b, 0x14, 0x0b, 0x34, 0x1b, 0x44, 0x78, 0xf2, 0x22, 0x7f, 0x6f, 0x7f, 0xf0, 0x1b,
1202 0xfc, 0x7c, 0x54, 0x7d, 0x32, 0x80, 0x08, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0x9e,
1203 0x44, 0x00, 0x10, 0x50, 0xf2, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x06, 0xca, 0x48, 0x1b, 0x44, 0x78,
1204 0xfa, 0x7f, 0xf6, 0x89, 0xe4, 0xca, 0x6b, 0x5e, 0xd4, 0x00, 0x3f, 0x68, 0x20, 0x7e, 0x84, 0x00,
1205 0x40, 0x9d, 0x8d, 0xda, 0x6b, 0xbd, 0x87, 0x38, 0x16, 0xca, 0x79, 0x7d, 0x78, 0x12, 0x7c, 0x84,
1206 0xda, 0x79, 0x40, 0x08, 0x9d, 0x78, 0x68, 0x02, 0x80, 0x05, 0xc2, 0xd7, 0x22, 0xda, 0x6b, 0x43,
1207 0x90, 0x30, 0x74, 0xaa, 0x39, 0xb5, 0x55, 0x55, 0x74, 0x55, 0x39, 0xb5, 0x2a, 0xaa, 0x74, 0xa0,
1208 0x39, 0xb5, 0x55, 0x55, 0x7e, 0x04, 0x00, 0x40, 0x9d, 0x70, 0x50, 0x06, 0x2d, 0x70, 0x7d, 0x07,
1209 0x6d, 0x77, 0x7c, 0x31, 0x7e, 0x7b, 0x00, 0x7a, 0x6b, 0x00, 0x0b, 0x7c, 0x0b, 0x6c, 0xa5, 0xd9,
1210 0xf3, 0x7f, 0x16, 0x1b, 0x1c, 0x7e, 0x54, 0x27, 0x10, 0x7e, 0x1b, 0x10, 0xbc, 0x10, 0x68, 0x06,
1211 0x1b, 0x54, 0x78, 0xf5, 0x80, 0x2c, 0x6d, 0x00, 0x7c, 0x20, 0x7f, 0x16, 0x9f, 0x10, 0x7f, 0x27,
1212 0x9f, 0x20, 0x7e, 0x2b, 0x00, 0x7e, 0x1b, 0x10, 0xbc, 0x01, 0x78, 0x16, 0x0b, 0x2c, 0x0b, 0x1c,
1213 0xa5, 0xdb, 0xef, 0x7c, 0xb6, 0x20, 0xe0, 0x03, 0x63, 0x90, 0x30, 0x4d, 0x77, 0x78, 0x93, 0xc2,
1214 0xd7, 0x22, 0xd2, 0xd7, 0x22, 0x00, 0x04, 0x00, 0x04, 0x42, 0x08, 0x06, 0x04, 0x02, 0x04, 0x00,
1215 0x02, 0x01, 0x04, 0x01, 0x02, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02,
1216 0x02, 0x02, 0x04, 0x02, 0x08, 0x10, 0x02, 0x10, 0x04, 0x02, 0x08, 0x00, 0x01, 0x01, 0x08, 0x00,
1217 0x01, 0x00, 0x02, 0x00, 0x02, 0x02, 0x08, 0x02, 0x04, 0x20, 0x04, 0x7e, 0x18, 0x7f, 0xbd, 0x7a,
1218 0x1c, 0x00, 0xfe, 0x0b, 0x1a, 0x00, 0x5e, 0x10, 0x1f, 0xbe, 0x10, 0x1a, 0x38, 0x1a, 0x0a, 0x51,
1219 0x23, 0x7e, 0x18, 0x7c, 0xfa, 0x7a, 0x1c, 0x00, 0xff, 0x2d, 0x35, 0x0b, 0x1a, 0x50, 0x60, 0x08,
1220 0xa5, 0xb8, 0x02, 0x03, 0x4e, 0xa0, 0x08, 0x22, 0x80, 0xfe,
1221};
1222
1223static struct edge_firmware_version_info IMAGE_VERSION_NAME = {
1224 1, 16, 4 }; // Major, Minor, Build
1225
1226#undef IMAGE_VERSION_NAME
1227
1228#undef IMAGE_ARRAY_NAME
1229
diff --git a/drivers/usb/serial/io_fw_down2.h b/drivers/usb/serial/io_fw_down2.h
new file mode 100644
index 000000000000..067277efd3b2
--- /dev/null
+++ b/drivers/usb/serial/io_fw_down2.h
@@ -0,0 +1,1133 @@
1//**************************************************************
2//* Edgeport/4 Binary Image
3//* Generated by HEX2C v1.06
4//* Copyright (C) 1998 Inside Out Networks, All rights reserved.
5//* This program is free software; you can redistribute it and/or modify
6//* it under the terms of the GNU General Public License as published by
7//* the Free Software Foundation; either version 2 of the License, or
8//* (at your option) any later version.
9//**************************************************************
10
11
12//Image structure definition
13#if !defined(DEFINED_EDGE_FIRMWARE_IMAGE_RECORD)
14 #define DEFINED_EDGE_FIRMWARE_IMAGE_RECORD
15 struct edge_firmware_image_record {
16 __le16 ExtAddr;
17 __le16 Addr;
18 __le16 Len;
19 unsigned char Data[0];
20 } __attribute__ ((packed));
21
22 struct edge_firmware_version_info {
23 unsigned char MajorVersion;
24 unsigned char MinorVersion;
25 unsigned short BuildNumber;
26 };
27
28#endif
29
30#if !defined(IMAGE_ARRAY_NAME)
31 #define IMAGE_ARRAY_NAME FirmwareImage
32 #define IMAGE_VERSION_NAME FirmwareImageVersion
33#endif
34
35static unsigned char IMAGE_ARRAY_NAME[] = {
36
37// Segment #1, Start Address 00ff0000, Length 6
380xff,0x00,0x00,0x00,0x06,0x00,
39 0x02, 0x00, 0x80, 0x02, 0x45, 0x14,
40
41// Segment #2, Start Address 00ff000b, Length 3
420xff,0x00,0x0b,0x00,0x03,0x00,
43 0x02, 0x44, 0xa5,
44
45// Segment #3, Start Address 00ff0013, Length 3
460xff,0x00,0x13,0x00,0x03,0x00,
47 0x02, 0x63, 0xab,
48
49// Segment #4, Start Address 00ff001b, Length 3
500xff,0x00,0x1b,0x00,0x03,0x00,
51 0x02, 0x00, 0x1b,
52
53// Segment #5, Start Address 00ff0023, Length 3
540xff,0x00,0x23,0x00,0x03,0x00,
55 0x02, 0x00, 0x23,
56
57// Segment #6, Start Address 00ff002b, Length 3
580xff,0x00,0x2b,0x00,0x03,0x00,
59 0x02, 0x00, 0x2b,
60
61// Segment #7, Start Address 00ff0033, Length 3
620xff,0x00,0x33,0x00,0x03,0x00,
63 0x02, 0x00, 0x33,
64
65// Segment #8, Start Address 00ff003b, Length 3
660xff,0x00,0x3b,0x00,0x03,0x00,
67 0x02, 0x00, 0x3b,
68
69// Segment #9, Start Address 00ff0043, Length 3
700xff,0x00,0x43,0x00,0x03,0x00,
71 0x02, 0x00, 0x43,
72
73// Segment #10, Start Address 00ff004b, Length 3
740xff,0x00,0x4b,0x00,0x03,0x00,
75 0x02, 0x00, 0x4b,
76
77// Segment #11, Start Address 00ff0053, Length 3
780xff,0x00,0x53,0x00,0x03,0x00,
79 0x02, 0x67, 0x5f,
80
81// Segment #12, Start Address 00ff007b, Length 3
820xff,0x00,0x7b,0x00,0x03,0x00,
83 0x02, 0x00, 0x7b,
84
85// Segment #13, Start Address 00ff0080, Length 7
860xff,0x00,0x80,0x00,0x07,0x00,
87 0x7e, 0x14, 0x00, 0x00, 0x02, 0x40, 0x52,
88
89// Segment #14, Start Address 00ff3000, Length 2918
900xff,0x00,0x00,0x30,0x66,0x0b,
91 0x12, 0x30, 0x64, 0x12, 0x30, 0xff, 0x12, 0x31, 0x2f, 0x12, 0x30, 0xb0, 0x80, 0xf2, 0xe5, 0x23,
92 0x60, 0x19, 0x7e, 0x14, 0x00, 0x00, 0x09, 0xb1, 0x01, 0xb9, 0xb4, 0x00, 0x02, 0x80, 0x05, 0x14,
93 0x19, 0xb1, 0x01, 0xb9, 0xa5, 0x0a, 0xbe, 0x21, 0x2e, 0x78, 0xeb, 0x22, 0xc2, 0xaf, 0x7e, 0xb3,
94 0x3f, 0xf1, 0xb4, 0x01, 0x03, 0x12, 0x65, 0x67, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x7e, 0xb3, 0x3f,
95 0xf1, 0xb4, 0x01, 0x1d, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91, 0x1a, 0x6c, 0xaa,
96 0x60, 0x0f, 0xca, 0x0b, 0xca, 0x39, 0xca, 0x59, 0x12, 0x64, 0x24, 0xda, 0x59, 0xda, 0x39, 0xda,
97 0x0b, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0xe5, 0x22, 0x60, 0x43, 0x7e, 0x07, 0x01, 0xcb, 0xbe, 0x04,
98 0x03, 0x80, 0x38, 0x39, 0x7e, 0x04, 0x80, 0x00, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x21, 0x09, 0xa0,
99 0x00, 0x04, 0x4e, 0xa0, 0x05, 0x19, 0xa0, 0x00, 0x04, 0x0a, 0x32, 0x09, 0x53, 0x35, 0x33, 0x5e,
100 0x51, 0x27, 0x68, 0x0b, 0x09, 0xa0, 0x00, 0x10, 0x4e, 0xa0, 0x01, 0x19, 0xa0, 0x00, 0x10, 0x2e,
101 0x04, 0x01, 0x00, 0xa5, 0x0a, 0xbe, 0x21, 0x2e, 0x78, 0xd1, 0x75, 0x22, 0x00, 0xd2, 0xaf, 0x22,
102 0xc2, 0xaf, 0xe5, 0x26, 0x60, 0x36, 0x7e, 0x20, 0x00, 0x7e, 0x30, 0x01, 0xe5, 0x26, 0xa5, 0x5b,
103 0x68, 0x21, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x32, 0x01, 0x79, 0xbe, 0x34, 0x00, 0x00, 0x68,
104 0x12, 0x7e, 0xb1, 0x21, 0xa5, 0x4b, 0x7a, 0xb1, 0x21, 0xca, 0x19, 0x49, 0x22, 0x30, 0xef, 0x99,
105 0x24, 0xda, 0x19, 0x3e, 0x30, 0xa5, 0x0a, 0xbe, 0x21, 0x2e, 0x78, 0xd0, 0xd2, 0xaf, 0x22, 0x46,
106 0x4f, 0x49, 0x7c, 0x4c, 0xa9, 0x4f, 0xd6, 0x53, 0x03, 0x56, 0x30, 0x59, 0x5d, 0x5c, 0x8a, 0xc2,
107 0xaf, 0xe5, 0x24, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x31, 0x1c,
108 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2e, 0x78, 0xef, 0xd2, 0xaf, 0x22, 0xca, 0x28, 0x12, 0x35,
109 0x4c, 0xda, 0x28, 0x40, 0x09, 0x0a, 0x22, 0x09, 0xb2, 0x35, 0x33, 0xf4, 0x52, 0x24, 0x22, 0xc2,
110 0xaf, 0xe5, 0x23, 0x60, 0x14, 0x7e, 0x20, 0x00, 0x13, 0x50, 0x07, 0xca, 0xb8, 0x12, 0x31, 0x4c,
111 0xda, 0xb8, 0xa5, 0x0a, 0xbe, 0x21, 0x2e, 0x78, 0xef, 0xd2, 0xaf, 0x22, 0x7c, 0xb2, 0x23, 0x0a,
112 0x2b, 0x49, 0x22, 0x31, 0x57, 0x89, 0x24, 0x31, 0x67, 0x31, 0xd0, 0x32, 0x39, 0x32, 0xa2, 0x33,
113 0x0b, 0x33, 0x74, 0x33, 0xdd, 0x34, 0x46, 0x7e, 0x27, 0x01, 0x79, 0xbe, 0x24, 0x00, 0x00, 0x78,
114 0x24, 0x7e, 0x24, 0x80, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8,
115 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x49, 0x45, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18,
116 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x89, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x89, 0x7e,
117 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xb9, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xb9, 0xa5, 0xbe, 0x00, 0x1f,
118 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f,
119 0xb3, 0x12, 0x73, 0x35, 0xc2, 0x18, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xb9, 0x12, 0x64, 0x86, 0x22,
120 0x7e, 0x27, 0x01, 0x7b, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x81, 0x00, 0x09, 0xb2,
121 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12,
122 0x4c, 0x72, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27,
123 0x01, 0x8b, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x8b, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xba, 0x80,
124 0x27, 0x7e, 0x63, 0x01, 0xba, 0xa5, 0xbe, 0x00, 0x1f, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e,
125 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f, 0xb3, 0x12, 0x73, 0x35, 0xc2, 0x19, 0x6c,
126 0x00, 0x7a, 0x03, 0x01, 0xba, 0x12, 0x64, 0x86, 0x22, 0x7e, 0x27, 0x01, 0x7d, 0xbe, 0x24, 0x00,
127 0x00, 0x78, 0x24, 0x7e, 0x24, 0x82, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e,
128 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x4f, 0x9f, 0x7d, 0x21, 0xda, 0x19, 0x30,
129 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x8d, 0x68, 0x0d, 0x7a, 0x27, 0x01,
130 0x8d, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xbb, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xbb, 0xa5, 0xbe,
131 0x00, 0x1f, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11,
132 0x75, 0x2f, 0xb3, 0x12, 0x73, 0x35, 0xc2, 0x1a, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xbb, 0x12, 0x64,
133 0x86, 0x22, 0x7e, 0x27, 0x01, 0x7f, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x83, 0x00,
134 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d,
135 0x12, 0x12, 0x52, 0xcc, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e,
136 0xbe, 0x27, 0x01, 0x8f, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x8f, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01,
137 0xbc, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xbc, 0xa5, 0xbe, 0x00, 0x1f, 0x7e, 0x60, 0x01, 0x7e, 0xb0,
138 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f, 0xb3, 0x12, 0x73, 0x35, 0xc2,
139 0x1b, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xbc, 0x12, 0x64, 0x86, 0x22, 0x7e, 0x27, 0x01, 0x81, 0xbe,
140 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x84, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e,
141 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x55, 0xf9, 0x7d, 0x21, 0xda,
142 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x91, 0x68, 0x0d, 0x7a,
143 0x27, 0x01, 0x91, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xbd, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xbd,
144 0xa5, 0xbe, 0x00, 0x1f, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36,
145 0x40, 0x11, 0x75, 0x2f, 0xb3, 0x12, 0x73, 0x35, 0xc2, 0x1c, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xbd,
146 0x12, 0x64, 0x86, 0x22, 0x7e, 0x27, 0x01, 0x83, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24,
147 0x85, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca,
148 0x19, 0x7d, 0x12, 0x12, 0x59, 0x26, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00,
149 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x93, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x93, 0x7e, 0x60, 0x9c, 0x7a,
150 0x63, 0x01, 0xbe, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xbe, 0xa5, 0xbe, 0x00, 0x1f, 0x7e, 0x60, 0x01,
151 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f, 0xb3, 0x12, 0x73,
152 0x35, 0xc2, 0x1d, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xbe, 0x12, 0x64, 0x86, 0x22, 0x7e, 0x27, 0x01,
153 0x85, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24, 0x7e, 0x24, 0x86, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca,
154 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x5c, 0x53, 0x7d,
155 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e, 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x95, 0x68,
156 0x0d, 0x7a, 0x27, 0x01, 0x95, 0x7e, 0x60, 0x9c, 0x7a, 0x63, 0x01, 0xbf, 0x80, 0x27, 0x7e, 0x63,
157 0x01, 0xbf, 0xa5, 0xbe, 0x00, 0x1f, 0x7e, 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12,
158 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f, 0xb3, 0x12, 0x73, 0x35, 0xc2, 0x1e, 0x6c, 0x00, 0x7a, 0x03,
159 0x01, 0xbf, 0x12, 0x64, 0x86, 0x22, 0x7e, 0x27, 0x01, 0x87, 0xbe, 0x24, 0x00, 0x00, 0x78, 0x24,
160 0x7e, 0x24, 0x87, 0x00, 0x09, 0xb2, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68,
161 0x0b, 0xca, 0x19, 0x7d, 0x12, 0x12, 0x5f, 0x80, 0x7d, 0x21, 0xda, 0x19, 0x30, 0xe6, 0x18, 0x7e,
162 0x60, 0x00, 0x80, 0x1e, 0xbe, 0x27, 0x01, 0x97, 0x68, 0x0d, 0x7a, 0x27, 0x01, 0x97, 0x7e, 0x60,
163 0x9c, 0x7a, 0x63, 0x01, 0xc0, 0x80, 0x27, 0x7e, 0x63, 0x01, 0xc0, 0xa5, 0xbe, 0x00, 0x1f, 0x7e,
164 0x60, 0x01, 0x7e, 0xb0, 0x00, 0x7e, 0xa0, 0xc8, 0x12, 0x61, 0x36, 0x40, 0x11, 0x75, 0x2f, 0xb3,
165 0x12, 0x73, 0x35, 0xc2, 0x1f, 0x6c, 0x00, 0x7a, 0x03, 0x01, 0xc0, 0x12, 0x64, 0x86, 0x22, 0xc2,
166 0xaf, 0x7e, 0x07, 0x01, 0xcb, 0xbe, 0x04, 0x00, 0x00, 0x78, 0x28, 0x74, 0x20, 0x7a, 0xb3, 0x91,
167 0x00, 0x7e, 0xb3, 0x91, 0x15, 0x30, 0xe5, 0x1b, 0x7e, 0xb3, 0x91, 0x1a, 0xbe, 0xb0, 0x3f, 0x38,
168 0x0c, 0x85, 0x31, 0x2f, 0x12, 0x73, 0x35, 0x74, 0x80, 0x7a, 0xb3, 0x91, 0x1e, 0x74, 0x20, 0x7a,
169 0xb3, 0x91, 0x15, 0xd2, 0xaf, 0x22, 0x35, 0x3b, 0x36, 0xe8, 0x37, 0x00, 0x37, 0x1b, 0x37, 0xb6,
170 0x38, 0x4e, 0x38, 0x69, 0x38, 0xfb, 0x38, 0x84, 0x38, 0xc5, 0x7c, 0xb3, 0xbe, 0xb0, 0x09, 0x28,
171 0x22, 0x75, 0x2f, 0x09, 0x12, 0x73, 0x35, 0x75, 0x57, 0x02, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x00,
172 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x11, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x01, 0x7a, 0xb3,
173 0x91, 0x11, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0x23, 0x6c, 0xaa, 0x2e, 0x54, 0x34, 0xe6, 0x0b, 0x58,
174 0x50, 0x89, 0x54, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x75, 0x2f, 0xb0, 0x12, 0x73,
175 0x35, 0x0a, 0x22, 0x09, 0xb2, 0x35, 0x33, 0x42, 0x24, 0xd0, 0xa8, 0x22, 0x7c, 0xb2, 0x23, 0x0a,
176 0x3b, 0x49, 0x33, 0x35, 0x57, 0x89, 0x34, 0x35, 0x67, 0x35, 0x95, 0x35, 0xc3, 0x35, 0xf1, 0x36,
177 0x1f, 0x36, 0x4d, 0x36, 0x7b, 0x36, 0xa9, 0x12, 0x41, 0xba, 0xd2, 0x28, 0xd2, 0x08, 0xc2, 0x40,
178 0xc2, 0x48, 0xc2, 0x38, 0xc2, 0x30, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xb9, 0x7e, 0x04, 0x00, 0x20,
179 0x7a, 0x07, 0x01, 0x99, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xa9, 0x12, 0x41, 0x27, 0x12,
180 0x5f, 0xb7, 0x02, 0x36, 0xd7, 0x12, 0x41, 0xd7, 0xd2, 0x29, 0xd2, 0x09, 0xc2, 0x41, 0xc2, 0x49,
181 0xc2, 0x39, 0xc2, 0x31, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xba, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07,
182 0x01, 0x9b, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xab, 0x12, 0x41, 0x27, 0x12, 0x5f, 0xe0,
183 0x02, 0x36, 0xd7, 0x12, 0x41, 0xf4, 0xd2, 0x2a, 0xd2, 0x0a, 0xc2, 0x42, 0xc2, 0x4a, 0xc2, 0x3a,
184 0xc2, 0x32, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xbb, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0x9d,
185 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xad, 0x12, 0x41, 0x27, 0x12, 0x60, 0x09, 0x02, 0x36,
186 0xd7, 0x12, 0x42, 0x11, 0xd2, 0x2b, 0xd2, 0x0b, 0xc2, 0x43, 0xc2, 0x4b, 0xc2, 0x3b, 0xc2, 0x33,
187 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xbc, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0x9f, 0x7e, 0x04,
188 0x00, 0x38, 0x7a, 0x07, 0x01, 0xaf, 0x12, 0x41, 0x27, 0x12, 0x60, 0x32, 0x02, 0x36, 0xd7, 0x12,
189 0x42, 0x2e, 0xd2, 0x2c, 0xd2, 0x0c, 0xc2, 0x44, 0xc2, 0x4c, 0xc2, 0x3c, 0xc2, 0x34, 0x6d, 0x00,
190 0x7a, 0x03, 0x01, 0xbd, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xa1, 0x7e, 0x04, 0x00, 0x38,
191 0x7a, 0x07, 0x01, 0xb1, 0x12, 0x41, 0x27, 0x12, 0x60, 0x5b, 0x02, 0x36, 0xd7, 0x12, 0x42, 0x4b,
192 0xd2, 0x2d, 0xd2, 0x0d, 0xc2, 0x45, 0xc2, 0x4d, 0xc2, 0x3d, 0xc2, 0x35, 0x6d, 0x00, 0x7a, 0x03,
193 0x01, 0xbe, 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xa3, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07,
194 0x01, 0xb3, 0x12, 0x41, 0x27, 0x12, 0x60, 0x84, 0x02, 0x36, 0xd7, 0x12, 0x42, 0x68, 0xd2, 0x2e,
195 0xd2, 0x0e, 0xc2, 0x46, 0xc2, 0x4e, 0xc2, 0x3e, 0xc2, 0x36, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xbf,
196 0x7e, 0x04, 0x00, 0x20, 0x7a, 0x07, 0x01, 0xa5, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xb5,
197 0x12, 0x41, 0x27, 0x12, 0x60, 0xad, 0x02, 0x36, 0xd7, 0x12, 0x42, 0x85, 0xd2, 0x2f, 0xd2, 0x0f,
198 0xc2, 0x47, 0xc2, 0x4f, 0xc2, 0x3f, 0xc2, 0x37, 0x6d, 0x00, 0x7a, 0x03, 0x01, 0xc0, 0x7e, 0x04,
199 0x00, 0x20, 0x7a, 0x07, 0x01, 0xa7, 0x7e, 0x04, 0x00, 0x38, 0x7a, 0x07, 0x01, 0xb7, 0x12, 0x41,
200 0x27, 0x12, 0x60, 0xd6, 0x02, 0x36, 0xd7, 0x7e, 0xa0, 0xd0, 0x7e, 0x60, 0x0f, 0x12, 0x61, 0x36,
201 0x40, 0x05, 0x12, 0x64, 0x86, 0xc2, 0xd7, 0x22, 0x75, 0x2f, 0xb1, 0x12, 0x73, 0x35, 0x0a, 0x52,
202 0x23, 0x6d, 0x00, 0x59, 0x05, 0x00, 0x32, 0x12, 0x41, 0x83, 0x12, 0x41, 0x9f, 0xd0, 0xa8, 0x22,
203 0x75, 0x2f, 0xb2, 0x12, 0x73, 0x35, 0x0a, 0x22, 0x09, 0xb2, 0x35, 0x33, 0x42, 0x23, 0x7e, 0xb0,
204 0x9c, 0x19, 0xb2, 0x01, 0xb9, 0x12, 0x31, 0x4c, 0xd0, 0xa8, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c,
205 0x02, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x08, 0x19,
206 0x30, 0x00, 0x0c, 0x7c, 0x74, 0x5e, 0x70, 0x01, 0x68, 0x12, 0x44, 0x40, 0xca, 0xb8, 0x09, 0xb0,
207 0x00, 0x10, 0x44, 0x02, 0x19, 0xb0, 0x00, 0x10, 0xda, 0xb8, 0x80, 0x02, 0x54, 0xbf, 0x7c, 0x74,
208 0x5e, 0x70, 0x08, 0x68, 0x04, 0x44, 0x08, 0x80, 0x02, 0x54, 0xf7, 0x09, 0x30, 0x00, 0x0c, 0xca,
209 0xb8, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0xda, 0xb8, 0x19, 0xb0, 0x00, 0x08, 0x19, 0x30, 0x00,
210 0x0c, 0x0a, 0x62, 0x09, 0xb6, 0x35, 0x33, 0x3e, 0x20, 0x0a, 0x62, 0x7c, 0x74, 0x5e, 0x70, 0x02,
211 0x68, 0x20, 0x42, 0x27, 0xca, 0xb8, 0x74, 0x61, 0x19, 0xb0, 0x00, 0x08, 0x7e, 0x44, 0x00, 0x10,
212 0x59, 0x46, 0x01, 0xa9, 0x09, 0xb0, 0x00, 0x10, 0x44, 0x01, 0x19, 0xb0, 0x00, 0x10, 0xda, 0xb8,
213 0x80, 0x11, 0xf4, 0x52, 0x27, 0x74, 0xa1, 0x19, 0xb0, 0x00, 0x08, 0x7e, 0x44, 0x00, 0x38, 0x59,
214 0x46, 0x01, 0xa9, 0xd0, 0xa8, 0x22, 0x7c, 0x74, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x09, 0x30,
215 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x08, 0x7c, 0x74, 0x5e, 0x70,
216 0x01, 0x68, 0x04, 0x44, 0x80, 0x80, 0x02, 0x54, 0x7f, 0x7c, 0x74, 0x5e, 0x70, 0x08, 0x68, 0x04,
217 0x44, 0x02, 0x80, 0x02, 0x54, 0xfd, 0x19, 0xb0, 0x00, 0x08, 0x19, 0x30, 0x00, 0x0c, 0x0a, 0x62,
218 0x09, 0xb6, 0x35, 0x33, 0xa5, 0xfd, 0xf4, 0xa5, 0xfe, 0xca, 0x28, 0x3e, 0x20, 0x0a, 0x62, 0xda,
219 0x28, 0x7c, 0x74, 0x5e, 0x70, 0x02, 0x68, 0x10, 0xa5, 0xed, 0x42, 0x28, 0x42, 0x26, 0x7e, 0x44,
220 0x00, 0x08, 0x59, 0x46, 0x01, 0x99, 0x80, 0x04, 0xa5, 0xee, 0x52, 0x28, 0x7c, 0x74, 0x5e, 0x70,
221 0x04, 0x68, 0x10, 0xa5, 0xed, 0x42, 0x29, 0x42, 0x26, 0x7e, 0x44, 0x00, 0x08, 0x59, 0x46, 0x01,
222 0x99, 0x80, 0x15, 0xa5, 0xee, 0x52, 0x29, 0x7c, 0x74, 0x5e, 0x70, 0x02, 0x78, 0x0a, 0x52, 0x26,
223 0x7e, 0x44, 0x00, 0x20, 0x59, 0x46, 0x01, 0x99, 0x12, 0x42, 0xa2, 0xd0, 0xa8, 0x22, 0x7e, 0x04,
224 0x80, 0x00, 0x4c, 0x02, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x19, 0x40,
225 0x00, 0x10, 0x19, 0x30, 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x09,
226 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x19, 0x40, 0x00, 0x18, 0x19, 0x30, 0x00,
227 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x2f, 0xb5, 0x12, 0x73, 0x35, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02,
228 0x09, 0xb0, 0x00, 0x0c, 0x44, 0x40, 0x19, 0xb0, 0x00, 0x0c, 0xe5, 0x58, 0xb4, 0x07, 0x23, 0x09,
229 0xb0, 0x00, 0x10, 0x4e, 0xb0, 0x02, 0x19, 0xb0, 0x00, 0x10, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf,
230 0x19, 0xb0, 0x00, 0x0c, 0x09, 0xb0, 0x00, 0x04, 0x54, 0xf7, 0x19, 0xb0, 0x00, 0x04, 0x19, 0x30,
231 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x2f, 0xb6, 0x12, 0x73, 0x35, 0x7e, 0x04, 0x80, 0x00, 0x4c,
232 0x02, 0xe5, 0x58, 0xb4, 0x07, 0x18, 0x09, 0x30, 0x00, 0x0c, 0x74, 0xbf, 0x19, 0xb0, 0x00, 0x0c,
233 0x09, 0xb0, 0x00, 0x04, 0x44, 0x08, 0x19, 0xb0, 0x00, 0x04, 0x19, 0x30, 0x00, 0x0c, 0x09, 0xb0,
234 0x00, 0x0c, 0x54, 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0xd0, 0xa8, 0x22, 0x75, 0x2f, 0xb4, 0x12, 0x73,
235 0x35, 0x7a, 0x21, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x41, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0xb0, 0x01,
236 0x7e, 0xa0, 0xc8, 0x7c, 0x64, 0x12, 0x61, 0x36, 0x12, 0x64, 0x86, 0xd0, 0xa8, 0x22, 0x39, 0x2e,
237 0x39, 0x75, 0x39, 0xbc, 0x3a, 0x03, 0x3a, 0x4a, 0x3a, 0x91, 0x3a, 0xd8, 0x3b, 0x1f, 0x75, 0x2f,
238 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35,
239 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01, 0x69, 0x7e, 0x27, 0x01, 0x79, 0x2d, 0x23,
240 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x08, 0x2c, 0x38, 0x0f,
241 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x69, 0x7a, 0x27, 0x01, 0x79, 0x02, 0x46, 0x4f, 0x7e,
242 0x14, 0x04, 0x2d, 0x80, 0xeb, 0x75, 0x2f, 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x01, 0x12, 0x73,
243 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01,
244 0x6b, 0x7e, 0x27, 0x01, 0x7b, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b,
245 0x14, 0xbe, 0x14, 0x0c, 0x2c, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x6b, 0x7a,
246 0x27, 0x01, 0x7b, 0x02, 0x49, 0x7c, 0x7e, 0x14, 0x08, 0x2d, 0x80, 0xeb, 0x75, 0x2f, 0x55, 0x12,
247 0x73, 0x35, 0x75, 0x2f, 0x02, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71,
248 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01, 0x6d, 0x7e, 0x27, 0x01, 0x7d, 0x2d, 0x23, 0x7e, 0x09,
249 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x10, 0x2c, 0x38, 0x0f, 0x1b, 0x34,
250 0x78, 0xec, 0x7a, 0x17, 0x01, 0x6d, 0x7a, 0x27, 0x01, 0x7d, 0x02, 0x4c, 0xa9, 0x7e, 0x14, 0x0c,
251 0x2d, 0x80, 0xeb, 0x75, 0x2f, 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x03, 0x12, 0x73, 0x35, 0x7a,
252 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01, 0x6f, 0x7e,
253 0x27, 0x01, 0x7f, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe,
254 0x14, 0x14, 0x2c, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x6f, 0x7a, 0x27, 0x01,
255 0x7f, 0x02, 0x4f, 0xd6, 0x7e, 0x14, 0x10, 0x2d, 0x80, 0xeb, 0x75, 0x2f, 0x55, 0x12, 0x73, 0x35,
256 0x75, 0x2f, 0x04, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12,
257 0x73, 0x35, 0x7e, 0x17, 0x01, 0x71, 0x7e, 0x27, 0x01, 0x81, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b,
258 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x18, 0x2c, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec,
259 0x7a, 0x17, 0x01, 0x71, 0x7a, 0x27, 0x01, 0x81, 0x02, 0x53, 0x03, 0x7e, 0x14, 0x14, 0x2d, 0x80,
260 0xeb, 0x75, 0x2f, 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x05, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f,
261 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01, 0x73, 0x7e, 0x27, 0x01,
262 0x83, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x1c,
263 0x2c, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x73, 0x7a, 0x27, 0x01, 0x83, 0x02,
264 0x56, 0x30, 0x7e, 0x14, 0x18, 0x2d, 0x80, 0xeb, 0x75, 0x2f, 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f,
265 0x06, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35,
266 0x7e, 0x17, 0x01, 0x75, 0x7e, 0x27, 0x01, 0x85, 0x2d, 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a,
267 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x20, 0x2c, 0x38, 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17,
268 0x01, 0x75, 0x7a, 0x27, 0x01, 0x85, 0x02, 0x59, 0x5d, 0x7e, 0x14, 0x1c, 0x2d, 0x80, 0xeb, 0x75,
269 0x2f, 0x55, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x07, 0x12, 0x73, 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73,
270 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x7e, 0x17, 0x01, 0x77, 0x7e, 0x27, 0x01, 0x87, 0x2d,
271 0x23, 0x7e, 0x09, 0xb0, 0x0b, 0x04, 0x7a, 0x19, 0xb0, 0x0b, 0x14, 0xbe, 0x14, 0x24, 0x2c, 0x38,
272 0x0f, 0x1b, 0x34, 0x78, 0xec, 0x7a, 0x17, 0x01, 0x77, 0x7a, 0x27, 0x01, 0x87, 0x02, 0x5c, 0x8a,
273 0x7e, 0x14, 0x20, 0x2d, 0x80, 0xeb,
274
275// Segment #15, Start Address 00ff4000, Length 13109
2760xff,0x00,0x00,0x40,0x35,0x33,
277 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x14, 0x7f, 0xf8, 0x7e, 0x24, 0x00, 0xfe, 0x7d, 0x31, 0x0b, 0x1a,
278 0x50, 0x1b, 0x0a, 0x50, 0x7e, 0x14, 0x40, 0x1b, 0x02, 0x40, 0x74, 0x7e, 0xf8, 0x00, 0x59, 0x75,
279 0xb0, 0xdf, 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x90, 0x00, 0x7e, 0xf4, 0x40, 0x30, 0x02, 0x40, 0x8b,
280 0x12, 0x74, 0x4e, 0xf5, 0x2e, 0x7a, 0xa1, 0x2d, 0x7a, 0x11, 0x58, 0x12, 0x6b, 0x02, 0x12, 0x40,
281 0xeb, 0x7e, 0xb3, 0x3f, 0xf1, 0x60, 0x03, 0x12, 0x43, 0x79, 0x12, 0x6b, 0xde, 0xd2, 0xaf, 0x02,
282 0x30, 0x00, 0x7e, 0x04, 0x00, 0xff, 0x7e, 0x18, 0x40, 0x60, 0x7a, 0x1c, 0x00, 0x01, 0x89, 0x18,
283 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x94, 0x00, 0x7a, 0xb3, 0x2c, 0x35, 0x7e, 0xb0, 0x01, 0x7a, 0xb3,
284 0x93, 0x00, 0x89, 0x08, 0x7e, 0x04, 0x00, 0xff, 0x7e, 0x18, 0x40, 0x82, 0x7a, 0x1c, 0x00, 0x01,
285 0x89, 0x18, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x93, 0x00, 0x89, 0x08, 0x7e, 0x08, 0x00, 0x20, 0x7e,
286 0x44, 0x04, 0x00, 0x7e, 0x40, 0x00, 0x7e, 0xe4, 0x40, 0x9d, 0x02, 0x73, 0x50, 0x7e, 0x08, 0x01,
287 0x59, 0x7e, 0x44, 0x2a, 0xdd, 0x7e, 0x40, 0x00, 0x7e, 0xe4, 0x40, 0xaf, 0x02, 0x73, 0x50, 0x7e,
288 0x08, 0x00, 0x59, 0x7e, 0x44, 0x01, 0x00, 0x7e, 0x40, 0x53, 0x7e, 0xe4, 0x40, 0xc1, 0x02, 0x73,
289 0x50, 0x75, 0x57, 0x01, 0x75, 0x56, 0x00, 0x7e, 0x04, 0x00, 0x08, 0x75, 0x54, 0x58, 0x75, 0x55,
290 0x08, 0x75, 0x51, 0x08, 0x75, 0x53, 0x01, 0x75, 0x89, 0x01, 0x75, 0x8a, 0x01, 0x75, 0x8c, 0x00,
291 0xd2, 0x8c, 0x7e, 0x04, 0x00, 0x02, 0x7a, 0x05, 0x42, 0x89, 0xf4, 0x75, 0xb7, 0x7f, 0x75, 0xb8,
292 0x7f, 0x75, 0xb3, 0x01, 0x75, 0xb2, 0x01, 0xd2, 0xa9, 0x22, 0x75, 0xb0, 0xdf, 0xe4, 0xd5, 0xe0,
293 0xfd, 0x75, 0xb0, 0xef, 0x7e, 0x24, 0x80, 0x00, 0x7e, 0x11, 0x2e, 0x7e, 0xa0, 0x08, 0x19, 0xa2,
294 0x00, 0x10, 0x2e, 0x24, 0x01, 0x00, 0xa5, 0xd9, 0xf2, 0x7e, 0x20, 0x00, 0x12, 0x41, 0x83, 0x0b,
295 0x20, 0xbe, 0x21, 0x2e, 0x78, 0xf6, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0x74, 0xbf, 0x19,
296 0xb0, 0x00, 0x0c, 0x74, 0x10, 0x19, 0xb0, 0x00, 0x08, 0x74, 0x80, 0x19, 0xb0, 0x00, 0x0c, 0x7e,
297 0x54, 0x00, 0x02, 0x19, 0xa0, 0x00, 0x04, 0x19, 0xb0, 0x00, 0x00, 0x74, 0x03, 0x19, 0xb0, 0x00,
298 0x0c, 0x74, 0x07, 0x20, 0x68, 0x02, 0x74, 0x0f, 0x19, 0xb0, 0x00, 0x04, 0x30, 0x6b, 0x17, 0x74,
299 0xbf, 0x19, 0xb0, 0x00, 0x0c, 0x74, 0x28, 0x20, 0x68, 0x02, 0x74, 0x20, 0x19, 0xb0, 0x00, 0x04,
300 0x74, 0x03, 0x19, 0xb0, 0x00, 0x0c, 0x74, 0xa7, 0x19, 0xb0, 0x00, 0x08, 0x74, 0x0c, 0x19, 0xb0,
301 0x00, 0x10, 0x22, 0x7e, 0x04, 0x80, 0x00, 0x4c, 0x02, 0xe4, 0x19, 0xb0, 0x00, 0x04, 0x09, 0xb0,
302 0x00, 0x10, 0x54, 0x08, 0x19, 0xb0, 0x00, 0x10, 0x74, 0xa7, 0x19, 0xb0, 0x00, 0x08, 0x22, 0x7c,
303 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x41, 0xaa, 0x89, 0x24, 0x41, 0xba, 0x41, 0xd7, 0x41, 0xf4,
304 0x42, 0x11, 0x42, 0x2e, 0x42, 0x4b, 0x42, 0x68, 0x42, 0x85, 0xc2, 0x10, 0xc2, 0x18, 0xc2, 0x08,
305 0x7e, 0x04, 0x04, 0x2d, 0x7a, 0x07, 0x01, 0x59, 0x7a, 0x07, 0x01, 0x69, 0x6d, 0x00, 0x7a, 0x07,
306 0x01, 0x79, 0x7a, 0x07, 0x01, 0x89, 0x22, 0xc2, 0x11, 0xc2, 0x19, 0xc2, 0x09, 0x7e, 0x04, 0x08,
307 0x2d, 0x7a, 0x07, 0x01, 0x5b, 0x7a, 0x07, 0x01, 0x6b, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x7b, 0x7a,
308 0x07, 0x01, 0x8b, 0x22, 0xc2, 0x12, 0xc2, 0x1a, 0xc2, 0x0a, 0x7e, 0x04, 0x0c, 0x2d, 0x7a, 0x07,
309 0x01, 0x5d, 0x7a, 0x07, 0x01, 0x6d, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x7d, 0x7a, 0x07, 0x01, 0x8d,
310 0x22, 0xc2, 0x13, 0xc2, 0x1b, 0xc2, 0x0b, 0x7e, 0x04, 0x10, 0x2d, 0x7a, 0x07, 0x01, 0x5f, 0x7a,
311 0x07, 0x01, 0x6f, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x7f, 0x7a, 0x07, 0x01, 0x8f, 0x22, 0xc2, 0x14,
312 0xc2, 0x1c, 0xc2, 0x0c, 0x7e, 0x04, 0x14, 0x2d, 0x7a, 0x07, 0x01, 0x61, 0x7a, 0x07, 0x01, 0x71,
313 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x81, 0x7a, 0x07, 0x01, 0x91, 0x22, 0xc2, 0x15, 0xc2, 0x1d, 0xc2,
314 0x0d, 0x7e, 0x04, 0x18, 0x2d, 0x7a, 0x07, 0x01, 0x63, 0x7a, 0x07, 0x01, 0x73, 0x6d, 0x00, 0x7a,
315 0x07, 0x01, 0x83, 0x7a, 0x07, 0x01, 0x93, 0x22, 0xc2, 0x16, 0xc2, 0x1e, 0xc2, 0x0e, 0x7e, 0x04,
316 0x1c, 0x2d, 0x7a, 0x07, 0x01, 0x65, 0x7a, 0x07, 0x01, 0x75, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x85,
317 0x7a, 0x07, 0x01, 0x95, 0x22, 0xc2, 0x17, 0xc2, 0x1f, 0xc2, 0x0f, 0x7e, 0x04, 0x20, 0x2d, 0x7a,
318 0x07, 0x01, 0x67, 0x7a, 0x07, 0x01, 0x77, 0x6d, 0x00, 0x7a, 0x07, 0x01, 0x87, 0x7a, 0x07, 0x01,
319 0x97, 0x22, 0x7c, 0xb2, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x42, 0xad, 0x89, 0x24, 0x42, 0xbd, 0x42,
320 0xd4, 0x42, 0xeb, 0x43, 0x02, 0x43, 0x19, 0x43, 0x30, 0x43, 0x47, 0x43, 0x5e, 0x30, 0x40, 0x07,
321 0x20, 0x58, 0x04, 0xc2, 0x28, 0x80, 0x0c, 0x30, 0x48, 0x07, 0x20, 0x50, 0x04, 0xc2, 0x28, 0x80,
322 0x02, 0xd2, 0x28, 0x22, 0x30, 0x41, 0x07, 0x20, 0x59, 0x04, 0xc2, 0x29, 0x80, 0x0c, 0x30, 0x49,
323 0x07, 0x20, 0x51, 0x04, 0xc2, 0x29, 0x80, 0x02, 0xd2, 0x29, 0x22, 0x30, 0x42, 0x07, 0x20, 0x5a,
324 0x04, 0xc2, 0x2a, 0x80, 0x0c, 0x30, 0x4a, 0x07, 0x20, 0x52, 0x04, 0xc2, 0x2a, 0x80, 0x02, 0xd2,
325 0x2a, 0x22, 0x30, 0x43, 0x07, 0x20, 0x5b, 0x04, 0xc2, 0x2b, 0x80, 0x0c, 0x30, 0x4b, 0x07, 0x20,
326 0x53, 0x04, 0xc2, 0x2b, 0x80, 0x02, 0xd2, 0x2b, 0x22, 0x30, 0x44, 0x07, 0x20, 0x5c, 0x04, 0xc2,
327 0x2c, 0x80, 0x0c, 0x30, 0x4c, 0x07, 0x20, 0x54, 0x04, 0xc2, 0x2c, 0x80, 0x02, 0xd2, 0x2c, 0x22,
328 0x30, 0x45, 0x07, 0x20, 0x5d, 0x04, 0xc2, 0x2d, 0x80, 0x0c, 0x30, 0x4d, 0x07, 0x20, 0x55, 0x04,
329 0xc2, 0x2d, 0x80, 0x02, 0xd2, 0x2d, 0x22, 0x30, 0x46, 0x07, 0x20, 0x5e, 0x04, 0xc2, 0x2e, 0x80,
330 0x0c, 0x30, 0x4e, 0x07, 0x20, 0x56, 0x04, 0xc2, 0x2e, 0x80, 0x02, 0xd2, 0x2e, 0x22, 0x30, 0x47,
331 0x07, 0x20, 0x5f, 0x04, 0xc2, 0x2f, 0x80, 0x0c, 0x30, 0x4f, 0x07, 0x20, 0x57, 0x04, 0xc2, 0x2f,
332 0x80, 0x02, 0xd2, 0x2f, 0x22, 0x44, 0x66, 0x43, 0x8a, 0xbe, 0xb0, 0x02, 0x40, 0x01, 0x22, 0x23,
333 0x0a, 0x5b, 0x49, 0x55, 0x43, 0x75, 0x99, 0x54, 0xd3, 0x22, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x94,
334 0x00, 0x7a, 0xb3, 0x2c, 0x35, 0x12, 0x44, 0x7a, 0x7e, 0x04, 0x28, 0x2d, 0x7a, 0x07, 0x01, 0xc1,
335 0x7a, 0x07, 0x01, 0xc3, 0x7e, 0x04, 0x24, 0x2d, 0x7a, 0x07, 0x01, 0xc7, 0x7a, 0x07, 0x01, 0xc9,
336 0x7e, 0x04, 0x66, 0x7f, 0x7a, 0x05, 0x4b, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a,
337 0xb3, 0x91, 0x1c, 0x74, 0x12, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x07, 0x74,
338 0x1e, 0x7a, 0xb3, 0x91, 0x10, 0x74, 0x48, 0x7a, 0xb3, 0x91, 0x12, 0x74, 0x10, 0x7a, 0xb3, 0x91,
339 0x13, 0x74, 0x3f, 0x7a, 0xb3, 0x91, 0x14, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a,
340 0xb3, 0x91, 0x1c, 0x74, 0x14, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x07, 0x74,
341 0x16, 0x7a, 0xb3, 0x91, 0x10, 0x74, 0x08, 0x7a, 0xb3, 0x91, 0x11, 0x74, 0x20, 0x7a, 0xb3, 0x91,
342 0x13, 0x74, 0x3f, 0x7a, 0xb3, 0x91, 0x14, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a,
343 0xb3, 0x91, 0x1c, 0x74, 0x16, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x07, 0x74,
344 0x2f, 0x7a, 0xb3, 0x91, 0x10, 0x74, 0x48, 0x7a, 0xb3, 0x91, 0x12, 0x74, 0x10, 0x7a, 0xb3, 0x91,
345 0x13, 0x74, 0x3f, 0x7a, 0xb3, 0x91, 0x14, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x06, 0x74, 0x0f, 0x7a,
346 0xb3, 0x91, 0x07, 0x12, 0x40, 0xfa, 0x7e, 0x20, 0x00, 0x12, 0x41, 0x9f, 0x0b, 0x20, 0xbe, 0x21,
347 0x2e, 0x78, 0xf6, 0xd2, 0xa8, 0x22, 0x7e, 0xb0, 0x01, 0x7a, 0xb3, 0x94, 0x00, 0x7a, 0xb3, 0x2c,
348 0x35, 0x12, 0x44, 0x7a, 0x75, 0xb0, 0xdf, 0xc2, 0xa8, 0x22, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x06,
349 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x07, 0x7e, 0x20, 0x04, 0x7c, 0xb2, 0xc2, 0xd7, 0x13, 0x13, 0x13,
350 0x13, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x74, 0x02, 0x7a, 0xb3, 0x91,
351 0x12, 0xa5, 0xda, 0xe5, 0x22, 0xca, 0x09, 0x12, 0x30, 0x0e, 0x10, 0x01, 0x34, 0xd5, 0x51, 0x40,
352 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0xb3, 0x91, 0x07,
353 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0xb3, 0x91, 0x07, 0x7e, 0xb3, 0x91, 0x14, 0x7e, 0xb3,
354 0x91, 0x04, 0x63, 0x53, 0x01, 0x7e, 0x00, 0x54, 0x2e, 0x01, 0x53, 0xa5, 0xe6, 0xf5, 0x51, 0x80,
355 0x12, 0x20, 0x02, 0x1d, 0x75, 0x53, 0x00, 0x85, 0x54, 0x51, 0xd2, 0x02, 0x74, 0x03, 0x80, 0x0d,
356 0x30, 0x02, 0x0e, 0xc2, 0x02, 0x7e, 0x00, 0x56, 0x2e, 0x01, 0x53, 0xa5, 0xe6, 0x7a, 0xb3, 0x90,
357 0x00, 0xda, 0x09, 0x32, 0x45, 0x6f, 0x45, 0x8b, 0x45, 0xa7, 0x45, 0xc3, 0x45, 0xdf, 0x45, 0xfb,
358 0x46, 0x17, 0x46, 0x33, 0xc0, 0xd0, 0xc0, 0xd1, 0xc0, 0xe0, 0xc0, 0xf0, 0xca, 0x0b, 0xca, 0x1b,
359 0xca, 0x2b, 0xd2, 0x01, 0x75, 0x2f, 0x89, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x90, 0x00, 0x60, 0x28,
360 0x7e, 0x14, 0x80, 0x00, 0x7e, 0x00, 0x00, 0x13, 0x50, 0x13, 0xca, 0x0b, 0xca, 0x59, 0x7c, 0xb0,
361 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x45, 0x04, 0x99, 0x24, 0xda, 0x59, 0xda, 0x0b, 0xa5, 0x0a, 0xa5,
362 0x08, 0xbe, 0x01, 0x2e, 0x78, 0xe1, 0x80, 0xd2, 0x30, 0x04, 0x05, 0xc2, 0x04, 0x12, 0x64, 0x86,
363 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0xd0, 0xf0, 0xd0, 0xe0, 0xd0, 0xd1, 0xd0, 0xd0, 0x32, 0x09,
364 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f, 0x80, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b,
365 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x61, 0xab, 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20,
366 0xe0, 0x14, 0x75, 0x2f, 0x81, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff,
367 0x69, 0x52, 0x61, 0xeb, 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f,
368 0x82, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x62, 0x2b,
369 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f, 0x83, 0x12, 0x73, 0x35,
370 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x62, 0x6b, 0x89, 0x54, 0x22, 0x09,
371 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f, 0x84, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b,
372 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x62, 0xab, 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20,
373 0xe0, 0x14, 0x75, 0x2f, 0x85, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff,
374 0x69, 0x52, 0x62, 0xeb, 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f,
375 0x86, 0x12, 0x73, 0x35, 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63, 0x2b,
376 0x89, 0x54, 0x22, 0x09, 0xb1, 0x00, 0x08, 0x20, 0xe0, 0x14, 0x75, 0x2f, 0x87, 0x12, 0x73, 0x35,
377 0x54, 0x3e, 0x0a, 0x5b, 0x7e, 0x44, 0x00, 0xff, 0x69, 0x52, 0x63, 0x6b, 0x89, 0x54, 0x22, 0x10,
378 0x08, 0x01, 0x22, 0x20, 0x28, 0x03, 0xd2, 0x08, 0x22, 0x75, 0x2f, 0xa0, 0x12, 0x73, 0x35, 0x7e,
379 0x14, 0x80, 0x00, 0x80, 0x06, 0x20, 0x28, 0x03, 0xd2, 0x08, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca,
380 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x49, 0x45, 0x30, 0x30, 0x06, 0x20, 0xe6,
381 0x4f, 0xd2, 0x08, 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x60, 0x7e, 0x37, 0x01, 0x79, 0x7e, 0x27, 0x01,
382 0x99, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x32, 0x7a, 0x05, 0x32, 0x7a, 0x37, 0x01,
383 0x79, 0x7e, 0x37, 0x01, 0x59, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x08, 0x2c, 0x38, 0x68, 0x7a,
384 0x47, 0x01, 0x59, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12,
385 0x69, 0xf0, 0x10, 0x60, 0xc4, 0x22, 0xc2, 0x60, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a,
386 0x7e, 0x27, 0x01, 0x79, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0x99, 0x28, 0x04,
387 0x7e, 0x27, 0x01, 0x99, 0x7e, 0x37, 0x01, 0x79, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x32, 0x7a,
388 0x05, 0x32, 0x7a, 0x37, 0x01, 0x79, 0x7e, 0x37, 0x01, 0x59, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44,
389 0x08, 0x2c, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x59, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51,
390 0x2f, 0x12, 0x73, 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f,
391 0x12, 0x73, 0x35, 0x9e, 0x44, 0x08, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x04, 0x2d,
392 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x59, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03,
393 0x02, 0x46, 0xc2, 0x22, 0xd2, 0x08, 0x7e, 0x04, 0x04, 0x2d, 0x7a, 0x07, 0x01, 0x59, 0x7a, 0x07,
394 0x01, 0x69, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75,
395 0x2f, 0x92, 0x12, 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda,
396 0xb8, 0x78, 0x68, 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xa9, 0x2e, 0x24, 0x00, 0x02, 0x2d,
397 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a,
398 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38,
399 0x3c, 0x7a, 0x47, 0x01, 0xc9, 0x7e, 0x24, 0x00, 0x00, 0x2e, 0x27, 0x01, 0xa9, 0x1b, 0x38, 0x20,
400 0x0b, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73,
401 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x38, 0x0a, 0x09, 0xb1,
402 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x10, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f,
403 0x12, 0x73, 0x35, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x00, 0x00, 0x2e, 0x67, 0x01,
404 0xa9, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e,
405 0x34, 0x24, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39,
406 0xc0, 0x7e, 0x34, 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32,
407 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x00, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b,
408 0x35, 0x75, 0x2f, 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68,
409 0x2b, 0x7a, 0x07, 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e,
410 0x35, 0x30, 0x7a, 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22,
411 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d,
412 0x80, 0xcf, 0x7e, 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07,
413 0x01, 0xc9, 0x7e, 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70,
414 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25,
415 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e,
416 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x48, 0x1e, 0x75, 0x2f,
417 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x38,
418 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x10, 0x22, 0xda, 0xb8,
419 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x48, 0x1e, 0xda, 0xb8, 0x02, 0x49,
420 0x45, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f,
421 0x12, 0x73, 0x35, 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68,
422 0x04, 0xd2, 0x58, 0x80, 0x02, 0xc2, 0x58, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x50,
423 0x80, 0x02, 0xc2, 0x50, 0x12, 0x42, 0xbd, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35,
424 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e,
425 0xa0, 0x80, 0x02, 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13,
426 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00,
427 0x12, 0x61, 0x36, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x48, 0x72, 0x75, 0x2f,
428 0x95, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x10, 0x09, 0x01, 0x22,
429 0x20, 0x29, 0x03, 0xd2, 0x09, 0x22, 0x75, 0x2f, 0xa1, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x81, 0x00,
430 0x80, 0x06, 0x20, 0x29, 0x03, 0xd2, 0x09, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0,
431 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x4c, 0x72, 0x30, 0x31, 0x06, 0x20, 0xe6, 0x4f, 0xd2, 0x09,
432 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x61, 0x7e, 0x37, 0x01, 0x7b, 0x7e, 0x27, 0x01, 0x9b, 0x9d, 0x32,
433 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x34, 0x7a, 0x05, 0x34, 0x7a, 0x37, 0x01, 0x7b, 0x7e, 0x37,
434 0x01, 0x5b, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x0c, 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x5b,
435 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0, 0x10,
436 0x61, 0xc4, 0x22, 0xc2, 0x61, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01,
437 0x7b, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0x9b, 0x28, 0x04, 0x7e, 0x27, 0x01,
438 0x9b, 0x7e, 0x37, 0x01, 0x7b, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x34, 0x7a, 0x05, 0x34, 0x7a,
439 0x37, 0x01, 0x7b, 0x7e, 0x37, 0x01, 0x5b, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x0c, 0x2c, 0x38,
440 0x13, 0x7a, 0x47, 0x01, 0x5b, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73,
441 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35,
442 0x9e, 0x44, 0x0c, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x08, 0x2d, 0x7d, 0x24, 0x2d,
443 0x43, 0x7a, 0x47, 0x01, 0x5b, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x49, 0xef,
444 0x22, 0xd2, 0x09, 0x7e, 0x04, 0x08, 0x2d, 0x7a, 0x07, 0x01, 0x5b, 0x7a, 0x07, 0x01, 0x6b, 0x75,
445 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92, 0x12,
446 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x68,
447 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xab, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34,
448 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01, 0xcb,
449 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a, 0x47,
450 0x01, 0xc9, 0x7e, 0x24, 0x01, 0x00, 0x2e, 0x27, 0x01, 0xab, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a,
451 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1,
452 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x39, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
453 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x11, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35,
454 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x01, 0x00, 0x2e, 0x67, 0x01, 0xab, 0x9e, 0x24,
455 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24, 0x2d,
456 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e, 0x34,
457 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54,
458 0x0f, 0x23, 0x23, 0x23, 0x44, 0x01, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x2f,
459 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a, 0x07,
460 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30, 0x7a,
461 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x24,
462 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf, 0x7e,
463 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9, 0x7e,
464 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04, 0xbd,
465 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09,
466 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a,
467 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x4b, 0x4b, 0x75, 0x2f, 0x99, 0x12, 0x73,
468 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x39, 0x0a, 0x09, 0xb1,
469 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x11, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8,
470 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x4b, 0x4b, 0xda, 0xb8, 0x02, 0x4c, 0x72, 0x09, 0xb1,
471 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73, 0x35,
472 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x59,
473 0x80, 0x02, 0xc2, 0x59, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x51, 0x80, 0x02, 0xc2,
474 0x51, 0x12, 0x42, 0xd4, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00,
475 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02,
476 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8, 0x5e,
477 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x61, 0x36,
478 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x4b, 0x9f, 0x75, 0x2f, 0x95, 0x12, 0x73,
479 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x10, 0x0a, 0x01, 0x22, 0x20, 0x2a, 0x03,
480 0xd2, 0x0a, 0x22, 0x75, 0x2f, 0xa2, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x82, 0x00, 0x80, 0x06, 0x20,
481 0x2a, 0x03, 0xd2, 0x0a, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8,
482 0x68, 0x03, 0x12, 0x4f, 0x9f, 0x30, 0x32, 0x06, 0x20, 0xe6, 0x4f, 0xd2, 0x0a, 0x22, 0x30, 0xe6,
483 0x02, 0xd2, 0x62, 0x7e, 0x37, 0x01, 0x7d, 0x7e, 0x27, 0x01, 0x9d, 0x9d, 0x32, 0x40, 0x31, 0x7d,
484 0x02, 0x2e, 0x05, 0x36, 0x7a, 0x05, 0x36, 0x7a, 0x37, 0x01, 0x7d, 0x7e, 0x37, 0x01, 0x5d, 0x7d,
485 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x10, 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x5d, 0x75, 0x2f, 0x94,
486 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0, 0x10, 0x62, 0xc4, 0x22,
487 0xc2, 0x62, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x7d, 0xbe, 0x24,
488 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0x9d, 0x28, 0x04, 0x7e, 0x27, 0x01, 0x9d, 0x7e, 0x37,
489 0x01, 0x7d, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x36, 0x7a, 0x05, 0x36, 0x7a, 0x37, 0x01, 0x7d,
490 0x7e, 0x37, 0x01, 0x5d, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x10, 0x2c, 0x38, 0x13, 0x7a, 0x47,
491 0x01, 0x5d, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x69,
492 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x10,
493 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x0c, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47,
494 0x01, 0x5d, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x4d, 0x1c, 0x22, 0xd2, 0x0a,
495 0x7e, 0x04, 0x0c, 0x2d, 0x7a, 0x07, 0x01, 0x5d, 0x7a, 0x07, 0x01, 0x6d, 0x75, 0x2f, 0x94, 0x12,
496 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92, 0x12, 0x73, 0x35, 0xd2,
497 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x68, 0x7e, 0x37, 0x01,
498 0xcb, 0x7e, 0x27, 0x01, 0xad, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38,
499 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01,
500 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a, 0x47, 0x01, 0xc9, 0x7e,
501 0x24, 0x02, 0x00, 0x2e, 0x27, 0x01, 0xad, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x2f, 0x12,
502 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54,
503 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3a, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1,
504 0x00, 0x10, 0xd2, 0x12, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x28,
505 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x02, 0x00, 0x2e, 0x67, 0x01, 0xad, 0x9e, 0x24, 0x00, 0x02, 0x40,
506 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24, 0x2d, 0x7d, 0x24, 0x2d,
507 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x24, 0x2d, 0x7a,
508 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23,
509 0x23, 0x44, 0x02, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x2f, 0x93, 0x12, 0x73,
510 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a, 0x07, 0x01, 0xc9, 0x7e,
511 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30, 0x7a, 0x35, 0x30, 0x22,
512 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x28,
513 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf, 0x7e, 0x07, 0x01, 0xcb,
514 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9, 0x7e, 0x44, 0x28, 0x2d,
515 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0,
516 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14,
517 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b,
518 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x4e, 0x78, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1,
519 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3a, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54,
520 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x12, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68,
521 0x07, 0xca, 0xb8, 0x12, 0x4e, 0x78, 0xda, 0xb8, 0x02, 0x4f, 0x9f, 0x09, 0xb1, 0x00, 0x18, 0x7e,
522 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73, 0x35, 0xa5, 0xfd, 0x5e,
523 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5a, 0x80, 0x02, 0xc2,
524 0x5a, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x52, 0x80, 0x02, 0xc2, 0x52, 0x12, 0x42,
525 0xeb, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1,
526 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x61, 0x13, 0xd2,
527 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda,
528 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x61, 0x36, 0x09, 0xb1, 0x00,
529 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x4e, 0xcc, 0x75, 0x2f, 0x95, 0x12, 0x73, 0x35, 0x22, 0x75,
530 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x10, 0x0b, 0x01, 0x22, 0x20, 0x2b, 0x03, 0xd2, 0x0b, 0x22,
531 0x75, 0x2f, 0xa3, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x83, 0x00, 0x80, 0x06, 0x20, 0x2b, 0x03, 0xd2,
532 0x0b, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12,
533 0x52, 0xcc, 0x30, 0x33, 0x06, 0x20, 0xe6, 0x4f, 0xd2, 0x0b, 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x63,
534 0x7e, 0x37, 0x01, 0x7f, 0x7e, 0x27, 0x01, 0x9f, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05,
535 0x38, 0x7a, 0x05, 0x38, 0x7a, 0x37, 0x01, 0x7f, 0x7e, 0x37, 0x01, 0x5f, 0x7d, 0x43, 0x2d, 0x42,
536 0xbe, 0x44, 0x14, 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x5f, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35,
537 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0, 0x10, 0x63, 0xc4, 0x22, 0xc2, 0x63, 0x2d,
538 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x7f, 0xbe, 0x24, 0x00, 0x00, 0x68,
539 0x6a, 0xbe, 0x27, 0x01, 0x9f, 0x28, 0x04, 0x7e, 0x27, 0x01, 0x9f, 0x7e, 0x37, 0x01, 0x7f, 0x9d,
540 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x38, 0x7a, 0x05, 0x38, 0x7a, 0x37, 0x01, 0x7f, 0x7e, 0x37, 0x01,
541 0x5f, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x14, 0x2c, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x5f, 0x75,
542 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f,
543 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x14, 0x2d, 0x9d, 0x24,
544 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x10, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x5f, 0x12,
545 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x50, 0x49, 0x22, 0xd2, 0x0b, 0x7e, 0x04, 0x10,
546 0x2d, 0x7a, 0x07, 0x01, 0x5f, 0x7a, 0x07, 0x01, 0x6f, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75,
547 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92, 0x12, 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1,
548 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x68, 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27,
549 0x01, 0xaf, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02,
550 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43,
551 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a, 0x47, 0x01, 0xc9, 0x7e, 0x24, 0x03, 0x00,
552 0x2e, 0x27, 0x01, 0xaf, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02,
553 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1,
554 0x00, 0x04, 0x30, 0x3b, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2,
555 0x13, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24,
556 0x7e, 0x64, 0x03, 0x00, 0x2e, 0x67, 0x01, 0xaf, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38,
557 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47,
558 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b,
559 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x03,
560 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x2f, 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71,
561 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a, 0x07, 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb,
562 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30, 0x7a, 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09,
563 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24,
564 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf, 0x7e, 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03,
565 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9, 0x7e, 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b,
566 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d,
567 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54,
568 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24,
569 0x78, 0xe7, 0x02, 0x51, 0xa5, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54,
570 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3b, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1,
571 0x00, 0x10, 0xd2, 0x13, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8,
572 0x12, 0x51, 0xa5, 0xda, 0xb8, 0x02, 0x52, 0xcc, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75,
573 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73, 0x35, 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68,
574 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5b, 0x80, 0x02, 0xc2, 0x5b, 0xa5, 0xfd,
575 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x53, 0x80, 0x02, 0xc2, 0x53, 0x12, 0x43, 0x02, 0x02, 0x61,
576 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73,
577 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1,
578 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12,
579 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x61, 0x36, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0,
580 0xdb, 0x22, 0x02, 0x51, 0xf9, 0x75, 0x2f, 0x95, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12,
581 0x73, 0x35, 0x22, 0x10, 0x0c, 0x01, 0x22, 0x20, 0x2c, 0x03, 0xd2, 0x0c, 0x22, 0x75, 0x2f, 0xa4,
582 0x12, 0x73, 0x35, 0x7e, 0x14, 0x84, 0x00, 0x80, 0x06, 0x20, 0x2c, 0x03, 0xd2, 0x0c, 0x22, 0x09,
583 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x55, 0xf9, 0x30,
584 0x34, 0x06, 0x20, 0xe6, 0x4f, 0xd2, 0x0c, 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x64, 0x7e, 0x37, 0x01,
585 0x81, 0x7e, 0x27, 0x01, 0xa1, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x3a, 0x7a, 0x05,
586 0x3a, 0x7a, 0x37, 0x01, 0x81, 0x7e, 0x37, 0x01, 0x61, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x18,
587 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x61, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f,
588 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0, 0x10, 0x64, 0xc4, 0x22, 0xc2, 0x64, 0x2d, 0x23, 0x68, 0x78,
589 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x81, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27,
590 0x01, 0xa1, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xa1, 0x7e, 0x37, 0x01, 0x81, 0x9d, 0x32, 0x7d, 0x02,
591 0x2e, 0x05, 0x3a, 0x7a, 0x05, 0x3a, 0x7a, 0x37, 0x01, 0x81, 0x7e, 0x37, 0x01, 0x61, 0x7d, 0x43,
592 0x2d, 0x42, 0xbe, 0x44, 0x18, 0x2c, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x61, 0x75, 0x2f, 0x94, 0x12,
593 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73,
594 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x18, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0,
595 0x7e, 0x34, 0x14, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x61, 0x12, 0x69, 0xf0, 0xbe,
596 0x25, 0x20, 0x78, 0x03, 0x02, 0x53, 0x76, 0x22, 0xd2, 0x0c, 0x7e, 0x04, 0x14, 0x2d, 0x7a, 0x07,
597 0x01, 0x61, 0x7a, 0x07, 0x01, 0x71, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12,
598 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92, 0x12, 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca,
599 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x68, 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xb1, 0x2e,
600 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30,
601 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe,
602 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a, 0x47, 0x01, 0xc9, 0x7e, 0x24, 0x04, 0x00, 0x2e, 0x27, 0x01,
603 0xb1, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75,
604 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30,
605 0x3c, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x14, 0x22, 0x80,
606 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x04,
607 0x00, 0x2e, 0x67, 0x01, 0xb1, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35,
608 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02,
609 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44,
610 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x04, 0x7a, 0x69, 0xb0,
611 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x2f, 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73,
612 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a, 0x07, 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a,
613 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30, 0x7a, 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14,
614 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a,
615 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf, 0x7e, 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20,
616 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9, 0x7e, 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04,
617 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25,
618 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01,
619 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02,
620 0x54, 0xd2, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1,
621 0x00, 0x04, 0x30, 0x3c, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2,
622 0x14, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x54, 0xd2,
623 0xda, 0xb8, 0x02, 0x55, 0xf9, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12,
624 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73, 0x35, 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd,
625 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5c, 0x80, 0x02, 0xc2, 0x5c, 0xa5, 0xfd, 0x5e, 0x50, 0x80,
626 0x68, 0x04, 0xd2, 0x54, 0x80, 0x02, 0xc2, 0x54, 0x12, 0x43, 0x19, 0x02, 0x61, 0x13, 0x75, 0x2f,
627 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0,
628 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0,
629 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0,
630 0x09, 0x61, 0x00, 0x00, 0x12, 0x61, 0x36, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02,
631 0x55, 0x26, 0x75, 0x2f, 0x95, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22,
632 0x10, 0x0d, 0x01, 0x22, 0x20, 0x2d, 0x03, 0xd2, 0x0d, 0x22, 0x75, 0x2f, 0xa5, 0x12, 0x73, 0x35,
633 0x7e, 0x14, 0x85, 0x00, 0x80, 0x06, 0x20, 0x2d, 0x03, 0xd2, 0x0d, 0x22, 0x09, 0xb1, 0x00, 0x14,
634 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x59, 0x26, 0x30, 0x35, 0x06, 0x20,
635 0xe6, 0x4f, 0xd2, 0x0d, 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x65, 0x7e, 0x37, 0x01, 0x83, 0x7e, 0x27,
636 0x01, 0xa3, 0x9d, 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x3c, 0x7a, 0x05, 0x3c, 0x7a, 0x37,
637 0x01, 0x83, 0x7e, 0x37, 0x01, 0x63, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x1c, 0x2c, 0x38, 0x68,
638 0x7a, 0x47, 0x01, 0x63, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35,
639 0x12, 0x69, 0xf0, 0x10, 0x65, 0xc4, 0x22, 0xc2, 0x65, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80,
640 0x1a, 0x7e, 0x27, 0x01, 0x83, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xa3, 0x28,
641 0x04, 0x7e, 0x27, 0x01, 0xa3, 0x7e, 0x37, 0x01, 0x83, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x3c,
642 0x7a, 0x05, 0x3c, 0x7a, 0x37, 0x01, 0x83, 0x7e, 0x37, 0x01, 0x63, 0x7d, 0x43, 0x2d, 0x42, 0xbe,
643 0x44, 0x1c, 0x2c, 0x38, 0x13, 0x7a, 0x47, 0x01, 0x63, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a,
644 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51,
645 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x1c, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x18,
646 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x63, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78,
647 0x03, 0x02, 0x56, 0xa3, 0x22, 0xd2, 0x0d, 0x7e, 0x04, 0x18, 0x2d, 0x7a, 0x07, 0x01, 0x63, 0x7a,
648 0x07, 0x01, 0x73, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22,
649 0x75, 0x2f, 0x92, 0x12, 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82,
650 0xda, 0xb8, 0x78, 0x68, 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xb3, 0x2e, 0x24, 0x00, 0x02,
651 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30,
652 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c,
653 0x38, 0x3c, 0x7a, 0x47, 0x01, 0xc9, 0x7e, 0x24, 0x05, 0x00, 0x2e, 0x27, 0x01, 0xb3, 0x1b, 0x38,
654 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12,
655 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3d, 0x0a, 0x09,
656 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x15, 0x22, 0x80, 0x7f, 0x7a, 0x51,
657 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x05, 0x00, 0x2e, 0x67,
658 0x01, 0xb3, 0x9e, 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63,
659 0x7e, 0x34, 0x24, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a,
660 0x39, 0xc0, 0x7e, 0x34, 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d,
661 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x05, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70,
662 0x0b, 0x35, 0x75, 0x2f, 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04,
663 0x68, 0x2b, 0x7a, 0x07, 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb,
664 0x2e, 0x35, 0x30, 0x7a, 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13,
665 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24,
666 0x2d, 0x80, 0xcf, 0x7e, 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e,
667 0x07, 0x01, 0xc9, 0x7e, 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d,
668 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d,
669 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8,
670 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x57, 0xff, 0x75,
671 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30,
672 0x3d, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x15, 0x22, 0xda,
673 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x57, 0xff, 0xda, 0xb8, 0x02,
674 0x59, 0x26, 0x09, 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5,
675 0x2f, 0x12, 0x73, 0x35, 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20,
676 0x68, 0x04, 0xd2, 0x5d, 0x80, 0x02, 0xc2, 0x5d, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2,
677 0x55, 0x80, 0x02, 0xc2, 0x55, 0x12, 0x43, 0x30, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73,
678 0x35, 0x09, 0xb1, 0x00, 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04,
679 0x7e, 0xa0, 0x80, 0x02, 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61,
680 0x13, 0xca, 0xb8, 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00,
681 0x00, 0x12, 0x61, 0x36, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x58, 0x53, 0x75,
682 0x2f, 0x95, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x10, 0x0e, 0x01,
683 0x22, 0x20, 0x2e, 0x03, 0xd2, 0x0e, 0x22, 0x75, 0x2f, 0xa6, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x86,
684 0x00, 0x80, 0x06, 0x20, 0x2e, 0x03, 0xd2, 0x0e, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e,
685 0xb0, 0x1e, 0xda, 0xb8, 0x68, 0x03, 0x12, 0x5c, 0x53, 0x30, 0x36, 0x06, 0x20, 0xe6, 0x4f, 0xd2,
686 0x0e, 0x22, 0x30, 0xe6, 0x02, 0xd2, 0x66, 0x7e, 0x37, 0x01, 0x85, 0x7e, 0x27, 0x01, 0xa5, 0x9d,
687 0x32, 0x40, 0x31, 0x7d, 0x02, 0x2e, 0x05, 0x3e, 0x7a, 0x05, 0x3e, 0x7a, 0x37, 0x01, 0x85, 0x7e,
688 0x37, 0x01, 0x65, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x20, 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01,
689 0x65, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0,
690 0x10, 0x66, 0xc4, 0x22, 0xc2, 0x66, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27,
691 0x01, 0x85, 0xbe, 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xa5, 0x28, 0x04, 0x7e, 0x27,
692 0x01, 0xa5, 0x7e, 0x37, 0x01, 0x85, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x3e, 0x7a, 0x05, 0x3e,
693 0x7a, 0x37, 0x01, 0x85, 0x7e, 0x37, 0x01, 0x65, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x20, 0x2c,
694 0x38, 0x13, 0x7a, 0x47, 0x01, 0x65, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12,
695 0x73, 0x35, 0x02, 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73,
696 0x35, 0x9e, 0x44, 0x20, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x1c, 0x2d, 0x7d, 0x24,
697 0x2d, 0x43, 0x7a, 0x47, 0x01, 0x65, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x59,
698 0xd0, 0x22, 0xd2, 0x0e, 0x7e, 0x04, 0x1c, 0x2d, 0x7a, 0x07, 0x01, 0x65, 0x7a, 0x07, 0x01, 0x75,
699 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92,
700 0x12, 0x73, 0x35, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78,
701 0x68, 0x7e, 0x37, 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xb5, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe,
702 0x34, 0x04, 0x00, 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01,
703 0xcb, 0x7e, 0x37, 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a,
704 0x47, 0x01, 0xc9, 0x7e, 0x24, 0x06, 0x00, 0x2e, 0x27, 0x01, 0xb5, 0x1b, 0x38, 0x20, 0x0b, 0x35,
705 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09,
706 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3e, 0x0a, 0x09, 0xb1, 0x00, 0x10,
707 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x16, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73,
708 0x35, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x06, 0x00, 0x2e, 0x67, 0x01, 0xb5, 0x9e,
709 0x24, 0x00, 0x02, 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24,
710 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e,
711 0x34, 0x24, 0x2d, 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6,
712 0x54, 0x0f, 0x23, 0x23, 0x23, 0x44, 0x06, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75,
713 0x2f, 0x93, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a,
714 0x07, 0x01, 0xc9, 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30,
715 0x7a, 0x35, 0x30, 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04,
716 0x24, 0x2d, 0x80, 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf,
717 0x7e, 0x07, 0x01, 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9,
718 0x7e, 0x44, 0x28, 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04,
719 0xbd, 0x04, 0x68, 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32,
720 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0,
721 0x7a, 0x09, 0xb0, 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x5b, 0x2c, 0x75, 0x2f, 0x99, 0x12,
722 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3e, 0x0a, 0x09,
723 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x16, 0x22, 0xda, 0xb8, 0x30, 0xe0,
724 0xd8, 0xbd, 0x32, 0x68, 0x07, 0xca, 0xb8, 0x12, 0x5b, 0x2c, 0xda, 0xb8, 0x02, 0x5c, 0x53, 0x09,
725 0xb1, 0x00, 0x18, 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73,
726 0x35, 0xa5, 0xfd, 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2,
727 0x5e, 0x80, 0x02, 0xc2, 0x5e, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x56, 0x80, 0x02,
728 0xc2, 0x56, 0x12, 0x43, 0x47, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1,
729 0x00, 0x14, 0x7a, 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80,
730 0x02, 0x61, 0x13, 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8,
731 0x5e, 0xb0, 0x1c, 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x61,
732 0x36, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x5b, 0x80, 0x75, 0x2f, 0x95, 0x12,
733 0x73, 0x35, 0x22, 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x10, 0x0f, 0x01, 0x22, 0x20, 0x2f,
734 0x03, 0xd2, 0x0f, 0x22, 0x75, 0x2f, 0xa7, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x87, 0x00, 0x80, 0x06,
735 0x20, 0x2f, 0x03, 0xd2, 0x0f, 0x22, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x5e, 0xb0, 0x1e, 0xda,
736 0xb8, 0x68, 0x03, 0x12, 0x5f, 0x80, 0x30, 0x37, 0x06, 0x20, 0xe6, 0x4f, 0xd2, 0x0f, 0x22, 0x30,
737 0xe6, 0x02, 0xd2, 0x67, 0x7e, 0x37, 0x01, 0x87, 0x7e, 0x27, 0x01, 0xa7, 0x9d, 0x32, 0x40, 0x31,
738 0x7d, 0x02, 0x2e, 0x05, 0x40, 0x7a, 0x05, 0x40, 0x7a, 0x37, 0x01, 0x87, 0x7e, 0x37, 0x01, 0x67,
739 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x24, 0x2c, 0x38, 0x68, 0x7a, 0x47, 0x01, 0x67, 0x75, 0x2f,
740 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x69, 0xf0, 0x10, 0x67, 0xc4,
741 0x22, 0xc2, 0x67, 0x2d, 0x23, 0x68, 0x78, 0x6d, 0x33, 0x80, 0x1a, 0x7e, 0x27, 0x01, 0x87, 0xbe,
742 0x24, 0x00, 0x00, 0x68, 0x6a, 0xbe, 0x27, 0x01, 0xa7, 0x28, 0x04, 0x7e, 0x27, 0x01, 0xa7, 0x7e,
743 0x37, 0x01, 0x87, 0x9d, 0x32, 0x7d, 0x02, 0x2e, 0x05, 0x40, 0x7a, 0x05, 0x40, 0x7a, 0x37, 0x01,
744 0x87, 0x7e, 0x37, 0x01, 0x67, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x24, 0x2c, 0x38, 0x13, 0x7a,
745 0x47, 0x01, 0x67, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x02,
746 0x69, 0xf0, 0x75, 0x2f, 0x94, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44,
747 0x24, 0x2d, 0x9d, 0x24, 0x12, 0x69, 0xf0, 0x7e, 0x34, 0x20, 0x2d, 0x7d, 0x24, 0x2d, 0x43, 0x7a,
748 0x47, 0x01, 0x67, 0x12, 0x69, 0xf0, 0xbe, 0x25, 0x20, 0x78, 0x03, 0x02, 0x5c, 0xfd, 0x22, 0xd2,
749 0x0f, 0x7e, 0x04, 0x20, 0x2d, 0x7a, 0x07, 0x01, 0x67, 0x7a, 0x07, 0x01, 0x77, 0x75, 0x2f, 0x94,
750 0x12, 0x73, 0x35, 0x75, 0x2f, 0x00, 0x12, 0x73, 0x35, 0x22, 0x75, 0x2f, 0x92, 0x12, 0x73, 0x35,
751 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0xca, 0xb8, 0x54, 0x82, 0xda, 0xb8, 0x78, 0x68, 0x7e, 0x37,
752 0x01, 0xcb, 0x7e, 0x27, 0x01, 0xb7, 0x2e, 0x24, 0x00, 0x02, 0x2d, 0x32, 0xbe, 0x34, 0x04, 0x00,
753 0x38, 0x34, 0x7d, 0x02, 0x2e, 0x05, 0x30, 0x7a, 0x05, 0x30, 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37,
754 0x01, 0xc9, 0x7d, 0x43, 0x2d, 0x42, 0xbe, 0x44, 0x28, 0x2c, 0x38, 0x3c, 0x7a, 0x47, 0x01, 0xc9,
755 0x7e, 0x24, 0x07, 0x00, 0x2e, 0x27, 0x01, 0xb7, 0x1b, 0x38, 0x20, 0x0b, 0x35, 0x7a, 0x51, 0x2f,
756 0x12, 0x73, 0x35, 0x02, 0x6a, 0x63, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x04,
757 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3f, 0x0a, 0x09, 0xb1, 0x00, 0x10, 0x54, 0xfe, 0x19,
758 0xb1, 0x00, 0x10, 0xd2, 0x17, 0x22, 0x80, 0x7f, 0x7a, 0x51, 0x2f, 0x12, 0x73, 0x35, 0x9e, 0x44,
759 0x28, 0x2d, 0x9d, 0x24, 0x7e, 0x64, 0x07, 0x00, 0x2e, 0x67, 0x01, 0xb7, 0x9e, 0x24, 0x00, 0x02,
760 0x40, 0x17, 0x1b, 0x38, 0x60, 0x0b, 0x35, 0x12, 0x6a, 0x63, 0x7e, 0x34, 0x24, 0x2d, 0x7d, 0x24,
761 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc9, 0x02, 0x6a, 0x63, 0x7a, 0x39, 0xc0, 0x7e, 0x34, 0x24, 0x2d,
762 0x7a, 0x39, 0xd0, 0x0b, 0x34, 0x1b, 0x44, 0x80, 0xe5, 0x9d, 0x32, 0x7c, 0xb6, 0x54, 0x0f, 0x23,
763 0x23, 0x23, 0x44, 0x07, 0x7a, 0x69, 0xb0, 0x7a, 0x79, 0x70, 0x0b, 0x35, 0x75, 0x2f, 0x93, 0x12,
764 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0xbd, 0x04, 0x68, 0x2b, 0x7a, 0x07, 0x01, 0xc9,
765 0x7e, 0x47, 0x01, 0xcb, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xcb, 0x2e, 0x35, 0x30, 0x7a, 0x35, 0x30,
766 0x22, 0xd2, 0x04, 0x09, 0xb1, 0x00, 0x14, 0x20, 0xe0, 0x13, 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80,
767 0x28, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0x2a, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xcf, 0x7e, 0x07, 0x01,
768 0xcb, 0x7e, 0x24, 0x03, 0xfe, 0x9d, 0x20, 0x28, 0x40, 0x7e, 0x07, 0x01, 0xc9, 0x7e, 0x44, 0x28,
769 0x2d, 0x7d, 0x60, 0x0b, 0x04, 0xbd, 0x04, 0x68, 0xd2, 0x7d, 0x70, 0x0b, 0x04, 0xbd, 0x04, 0x68,
770 0xd0, 0x7d, 0x54, 0x9d, 0x50, 0xbd, 0x25, 0x40, 0x02, 0x7d, 0x25, 0x7d, 0x32, 0x09, 0xb1, 0x00,
771 0x14, 0xca, 0xb8, 0x54, 0x1f, 0xb4, 0x01, 0x31, 0xda, 0xb8, 0x7e, 0x19, 0xb0, 0x7a, 0x09, 0xb0,
772 0x0b, 0x04, 0x1b, 0x24, 0x78, 0xe7, 0x02, 0x5e, 0x59, 0x75, 0x2f, 0x99, 0x12, 0x73, 0x35, 0x09,
773 0xb1, 0x00, 0x04, 0x54, 0xfa, 0x19, 0xb1, 0x00, 0x04, 0x30, 0x3f, 0x0a, 0x09, 0xb1, 0x00, 0x10,
774 0x54, 0xfe, 0x19, 0xb1, 0x00, 0x10, 0xd2, 0x17, 0x22, 0xda, 0xb8, 0x30, 0xe0, 0xd8, 0xbd, 0x32,
775 0x68, 0x07, 0xca, 0xb8, 0x12, 0x5e, 0x59, 0xda, 0xb8, 0x02, 0x5f, 0x80, 0x09, 0xb1, 0x00, 0x18,
776 0x7e, 0xa0, 0x88, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12, 0x73, 0x35, 0xa5, 0xfd,
777 0x5e, 0x50, 0x0a, 0x68, 0x1d, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5f, 0x80, 0x02,
778 0xc2, 0x5f, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x57, 0x80, 0x02, 0xc2, 0x57, 0x12,
779 0x43, 0x5e, 0x02, 0x61, 0x13, 0x75, 0x2f, 0x91, 0x12, 0x73, 0x35, 0x09, 0xb1, 0x00, 0x14, 0x7a,
780 0xb1, 0x2f, 0x12, 0x73, 0x35, 0x20, 0xe0, 0x08, 0xd2, 0x04, 0x7e, 0xa0, 0x80, 0x02, 0x61, 0x13,
781 0xd2, 0x04, 0x30, 0xe1, 0x06, 0x7e, 0xa0, 0x80, 0x12, 0x61, 0x13, 0xca, 0xb8, 0x5e, 0xb0, 0x1c,
782 0xda, 0xb8, 0x68, 0x12, 0x7e, 0xa0, 0xc0, 0x09, 0x61, 0x00, 0x00, 0x12, 0x61, 0x36, 0x09, 0xb1,
783 0x00, 0x14, 0x20, 0xe0, 0xdb, 0x22, 0x02, 0x5e, 0xad, 0x75, 0x2f, 0x95, 0x12, 0x73, 0x35, 0x22,
784 0x75, 0x2f, 0x96, 0x12, 0x73, 0x35, 0x22, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09,
785 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x58, 0x80, 0x02, 0xc2, 0x58,
786 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x50, 0x80, 0x02, 0xc2, 0x50, 0x02, 0x60, 0xff,
787 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50,
788 0x20, 0x68, 0x04, 0xd2, 0x59, 0x80, 0x02, 0xc2, 0x59, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04,
789 0xd2, 0x51, 0x80, 0x02, 0xc2, 0x51, 0x02, 0x60, 0xff, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c,
790 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5a, 0x80, 0x02,
791 0xc2, 0x5a, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x52, 0x80, 0x02, 0xc2, 0x52, 0x02,
792 0x60, 0xff, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd,
793 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5b, 0x80, 0x02, 0xc2, 0x5b, 0xa5, 0xfd, 0x5e, 0x50, 0x80,
794 0x68, 0x04, 0xd2, 0x53, 0x80, 0x02, 0xc2, 0x53, 0x02, 0x60, 0xff, 0x7c, 0x02, 0x7e, 0x14, 0x80,
795 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5c,
796 0x80, 0x02, 0xc2, 0x5c, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x54, 0x80, 0x02, 0xc2,
797 0x54, 0x02, 0x60, 0xff, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18,
798 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5d, 0x80, 0x02, 0xc2, 0x5d, 0xa5, 0xfd, 0x5e,
799 0x50, 0x80, 0x68, 0x04, 0xd2, 0x55, 0x80, 0x02, 0xc2, 0x55, 0x02, 0x60, 0xff, 0x7c, 0x02, 0x7e,
800 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1, 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04,
801 0xd2, 0x5e, 0x80, 0x02, 0xc2, 0x5e, 0xa5, 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x56, 0x80,
802 0x02, 0xc2, 0x56, 0x02, 0x60, 0xff, 0x7c, 0x02, 0x7e, 0x14, 0x80, 0x00, 0x4c, 0x20, 0x09, 0xb1,
803 0x00, 0x18, 0xa5, 0xfd, 0x5e, 0x50, 0x20, 0x68, 0x04, 0xd2, 0x5f, 0x80, 0x02, 0xc2, 0x5f, 0xa5,
804 0xfd, 0x5e, 0x50, 0x80, 0x68, 0x04, 0xd2, 0x57, 0x80, 0x02, 0xc2, 0x57, 0x02, 0x60, 0xff, 0x54,
805 0xf0, 0xc4, 0xa5, 0xff, 0xc4, 0xa5, 0x4f, 0x75, 0x2f, 0x90, 0x12, 0x73, 0x35, 0xf5, 0x2f, 0x12,
806 0x73, 0x35, 0x22, 0xca, 0x19, 0x5e, 0x20, 0x07, 0x4c, 0xa2, 0x7e, 0x74, 0x2c, 0x2d, 0xca, 0x79,
807 0x7a, 0x79, 0xa0, 0x0b, 0x74, 0x7a, 0x79, 0xb0, 0x0b, 0x74, 0xda, 0x79, 0x7e, 0x30, 0x02, 0x7e,
808 0x64, 0x00, 0x02, 0x02, 0x61, 0x5e, 0xca, 0x19, 0x5e, 0x20, 0x07, 0x4c, 0xa2, 0x7e, 0x74, 0x2c,
809 0x2d, 0xca, 0x79, 0x7a, 0x79, 0xa0, 0x0b, 0x74, 0x7a, 0x79, 0xb0, 0x0b, 0x74, 0x7a, 0x79, 0x60,
810 0x0b, 0x74, 0xda, 0x79, 0x7e, 0x30, 0x03, 0x7e, 0x64, 0x00, 0x03, 0x02, 0x61, 0x5e, 0xd2, 0x04,
811 0x7e, 0x27, 0x01, 0xcb, 0x2d, 0x26, 0xbe, 0x24, 0x04, 0x00, 0x38, 0x2e, 0x7e, 0x07, 0x01, 0xc9,
812 0x7e, 0x44, 0x28, 0x2d, 0x7e, 0x79, 0xa0, 0x7a, 0x09, 0xa0, 0x0b, 0x04, 0x0b, 0x74, 0xbd, 0x04,
813 0x68, 0x23, 0xa5, 0xdb, 0xef, 0x7a, 0x27, 0x01, 0xcb, 0x7e, 0x25, 0x30, 0x2d, 0x26, 0x7a, 0x25,
814 0x30, 0x7a, 0x07, 0x01, 0xc9, 0xda, 0x19, 0xc2, 0xd7, 0x22, 0x75, 0x2f, 0x9a, 0x12, 0x73, 0x35,
815 0xda, 0x19, 0xd2, 0xd7, 0x22, 0x7e, 0x04, 0x24, 0x2d, 0x80, 0xd7, 0x48, 0xf1, 0x46, 0x65, 0x47,
816 0x5f, 0x49, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x48, 0x56, 0x45, 0x2a, 0x49, 0x6e, 0x45, 0x2a, 0x45,
817 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x49, 0x75, 0x45, 0x2a, 0x45,
818 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
819 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x4c, 0x1e, 0x49, 0x92, 0x4a,
820 0x8c, 0x4c, 0x57, 0x45, 0x2a, 0x45, 0x2a, 0x4b, 0x83, 0x45, 0x2a, 0x4c, 0x9b, 0x45, 0x2a, 0x45,
821 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x4c, 0xa2, 0x45, 0x2a, 0x45,
822 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
823 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x4f, 0x4b, 0x4c, 0xbf, 0x4d,
824 0xb9, 0x4f, 0x84, 0x45, 0x2a, 0x45, 0x2a, 0x4e, 0xb0, 0x45, 0x2a, 0x4f, 0xc8, 0x45, 0x2a, 0x45,
825 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x4f, 0xcf, 0x45, 0x2a, 0x45,
826 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
827 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x52, 0x78, 0x4f, 0xec, 0x50,
828 0xe6, 0x52, 0xb1, 0x45, 0x2a, 0x45, 0x2a, 0x51, 0xdd, 0x45, 0x2a, 0x52, 0xf5, 0x45, 0x2a, 0x45,
829 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x52, 0xfc, 0x45, 0x2a, 0x45,
830 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
831 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x55, 0xa5, 0x53, 0x19, 0x54,
832 0x13, 0x55, 0xde, 0x45, 0x2a, 0x45, 0x2a, 0x55, 0x0a, 0x45, 0x2a, 0x56, 0x22, 0x45, 0x2a, 0x45,
833 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x56, 0x29, 0x45, 0x2a, 0x45,
834 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
835 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x58, 0xd2, 0x56, 0x46, 0x57,
836 0x40, 0x59, 0x0b, 0x45, 0x2a, 0x45, 0x2a, 0x58, 0x37, 0x45, 0x2a, 0x59, 0x4f, 0x45, 0x2a, 0x45,
837 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x59, 0x56, 0x45, 0x2a, 0x45,
838 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
839 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x5b, 0xff, 0x59, 0x73, 0x5a,
840 0x6d, 0x5c, 0x38, 0x45, 0x2a, 0x45, 0x2a, 0x5b, 0x64, 0x45, 0x2a, 0x5c, 0x7c, 0x45, 0x2a, 0x45,
841 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x5c, 0x83, 0x45, 0x2a, 0x45,
842 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
843 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x5f, 0x2c, 0x5c, 0xa0, 0x5d,
844 0x9a, 0x5f, 0x65, 0x45, 0x2a, 0x45, 0x2a, 0x5e, 0x91, 0x45, 0x2a, 0x5f, 0xa9, 0x45, 0x2a, 0x45,
845 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x5f, 0xb0, 0x45, 0x2a, 0x45,
846 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45,
847 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0x45, 0x2a, 0xca, 0xb8, 0x75, 0x2f, 0x02,
848 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x91, 0x03, 0x20, 0xe5, 0x20, 0x30, 0xe0, 0x05, 0x12, 0x6b, 0x05,
849 0x80, 0x30, 0x30, 0xe1, 0x05, 0x12, 0x64, 0x86, 0x80, 0x28, 0x30, 0xe2, 0x05, 0x12, 0x63, 0xf5,
850 0x80, 0x20, 0x30, 0xe3, 0x1d, 0x12, 0x65, 0x61, 0x80, 0x18, 0x7e, 0xb3, 0x91, 0x04, 0x30, 0xe1,
851 0x03, 0x02, 0x67, 0x5f, 0x30, 0xe6, 0x05, 0x12, 0x6c, 0x6a, 0x80, 0x06, 0x20, 0xe2, 0x03, 0x02,
852 0x00, 0x80, 0xda, 0xb8, 0x32, 0x75, 0x2f, 0x10, 0x12, 0x73, 0x35, 0xca, 0x0b, 0xca, 0x39, 0xca,
853 0x59, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91, 0x1a, 0x6c, 0xaa, 0xbe, 0xb0, 0x40,
854 0x28, 0x0a, 0x12, 0x64, 0x24, 0xda, 0x59, 0xda, 0x39, 0xda, 0x0b, 0x22, 0x74, 0x20, 0x7a, 0xb3,
855 0x91, 0x14, 0x80, 0xf1, 0x7e, 0x37, 0x01, 0xc5, 0x2d, 0x35, 0xbe, 0x34, 0x04, 0x00, 0x38, 0x2f,
856 0x7a, 0x37, 0x01, 0xc5, 0x7e, 0x37, 0x01, 0xc3, 0x7d, 0x43, 0x2d, 0x45, 0xbe, 0x44, 0x2c, 0x2c,
857 0x38, 0x25, 0x7a, 0x47, 0x01, 0xc3, 0x75, 0x2f, 0x11, 0x12, 0x73, 0x35, 0x7a, 0xb1, 0x2f, 0x12,
858 0x73, 0x35, 0x12, 0x67, 0x9f, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x14, 0x12, 0x66, 0x30, 0x22, 0x75,
859 0x2f, 0x16, 0x12, 0x73, 0x35, 0x80, 0xf4, 0x75, 0x2f, 0x12, 0x12, 0x73, 0x35, 0x7a, 0xb1, 0x2f,
860 0x12, 0x73, 0x35, 0x9e, 0x44, 0x2c, 0x2d, 0x9d, 0x54, 0x12, 0x67, 0x9f, 0x7e, 0x34, 0x28, 0x2d,
861 0x7d, 0x54, 0x2d, 0x43, 0x80, 0xbc, 0x75, 0x2f, 0x18, 0x12, 0x73, 0x35, 0xca, 0x09, 0xca, 0x39,
862 0xca, 0x2b, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0x63, 0x91, 0x1a, 0x74, 0x10, 0x7a, 0xb3,
863 0x91, 0x14, 0x7e, 0xb0, 0x80, 0x9c, 0xb6, 0x60, 0x38, 0x6c, 0xaa, 0x7e, 0x37, 0x01, 0xcb, 0x9d,
864 0x35, 0x40, 0x37, 0x7a, 0x37, 0x01, 0xcb, 0x7e, 0x37, 0x01, 0xc7, 0x7d, 0x43, 0x2d, 0x45, 0xbe,
865 0x44, 0x28, 0x2c, 0x38, 0x3b, 0x7a, 0x47, 0x01, 0xc7, 0x7d, 0x45, 0x12, 0x68, 0xd4, 0x7e, 0xb3,
866 0x91, 0x1e, 0x20, 0xe5, 0x13, 0x75, 0x2f, 0x19, 0x12, 0x73, 0x35, 0x7a, 0x91, 0x2f, 0x12, 0x73,
867 0x35, 0xda, 0x2b, 0xda, 0x39, 0xda, 0x09, 0x22, 0x80, 0x34, 0x2d, 0x53, 0x6d, 0x33, 0x60, 0x02,
868 0x80, 0xc1, 0x7e, 0x04, 0x24, 0x2d, 0x7a, 0x07, 0x01, 0xc9, 0x7a, 0x07, 0x01, 0xc7, 0x80, 0xe1,
869 0xca, 0x59, 0x9e, 0x44, 0x28, 0x2d, 0x9d, 0x54, 0x12, 0x68, 0xd4, 0x7e, 0x34, 0x24, 0x2d, 0x7d,
870 0x54, 0x2d, 0x43, 0x7a, 0x47, 0x01, 0xc7, 0x12, 0x68, 0xd4, 0xda, 0x49, 0x80, 0xb0, 0x7e, 0x0f,
871 0x2c, 0x3e, 0x0b, 0x0c, 0x7a, 0x0f, 0x2c, 0x3e, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x1e, 0x74, 0x60,
872 0x7a, 0xb3, 0x91, 0x1c, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x12, 0x80, 0xa5, 0x7e, 0x2f, 0x2c, 0x5e,
873 0x0b, 0x2c, 0x7a, 0x2f, 0x2c, 0x5e, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x1e, 0x74, 0x60, 0x7a, 0xb3,
874 0x91, 0x1c, 0x74, 0x02, 0x7a, 0xb3, 0x91, 0x12, 0x80, 0x1f, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b,
875 0x22, 0x75, 0x2f, 0x28, 0x12, 0x73, 0x35, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0x74, 0x60, 0x7a,
876 0xb3, 0x91, 0x00, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x14, 0x7e, 0xb3, 0x91, 0x1a, 0x70, 0xdb, 0x7e,
877 0x0d, 0x30, 0x7e, 0x1d, 0x34, 0x7e, 0x2d, 0x38, 0x7e, 0x3d, 0x3c, 0x7e, 0x85, 0x40, 0x7d, 0x90,
878 0x4d, 0x91, 0x4d, 0x92, 0x4d, 0x93, 0x4d, 0x94, 0x4d, 0x95, 0x4d, 0x96, 0x4d, 0x97, 0x4d, 0x98,
879 0x68, 0xb8, 0x7a, 0x13, 0x91, 0x17, 0x7a, 0x03, 0x91, 0x17, 0x7a, 0x33, 0x91, 0x17, 0x7a, 0x23,
880 0x91, 0x17, 0x7a, 0x53, 0x91, 0x17, 0x7a, 0x43, 0x91, 0x17, 0x7a, 0x73, 0x91, 0x17, 0x7a, 0x63,
881 0x91, 0x17, 0x7a, 0x93, 0x91, 0x17, 0x7a, 0x83, 0x91, 0x17, 0x30, 0x73, 0x22, 0x7a, 0xb3, 0x91,
882 0x17, 0x7a, 0xa3, 0x91, 0x17, 0x7a, 0xd3, 0x91, 0x17, 0x7a, 0xc3, 0x91, 0x17, 0x7a, 0xf3, 0x91,
883 0x17, 0x7a, 0xe3, 0x91, 0x17, 0x7d, 0x78, 0x7a, 0xf3, 0x91, 0x17, 0x7a, 0xe3, 0x91, 0x17, 0x7e,
884 0xb3, 0x91, 0x1e, 0x30, 0xe5, 0x03, 0x02, 0x65, 0x3c, 0x75, 0x2f, 0x29, 0x12, 0x73, 0x35, 0x20,
885 0x73, 0x08, 0x75, 0x2f, 0x0a, 0x12, 0x73, 0x35, 0x80, 0x06, 0x75, 0x2f, 0x12, 0x12, 0x73, 0x35,
886 0x74, 0x80, 0x7a, 0xb3, 0x91, 0x1e, 0x6d, 0x00, 0x7d, 0x10, 0x7a, 0x0d, 0x30, 0x7a, 0x0d, 0x34,
887 0x7a, 0x0d, 0x38, 0x7a, 0x0d, 0x3c, 0x7a, 0x05, 0x40, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22,
888 0x7e, 0x37, 0x01, 0xc5, 0x4d, 0x33, 0x68, 0x3b, 0x7e, 0x07, 0x01, 0xc1, 0x7e, 0x54, 0x2c, 0x2d,
889 0x9d, 0x50, 0xbd, 0x35, 0x40, 0x02, 0x7d, 0x35, 0xca, 0x39, 0x7e, 0x65, 0x4b, 0x99, 0x64, 0xda,
890 0x39, 0x7e, 0x07, 0x01, 0xc5, 0x9d, 0x03, 0x7a, 0x07, 0x01, 0xc5, 0x2e, 0x37, 0x01, 0xc1, 0x7a,
891 0x37, 0x01, 0xc1, 0xbe, 0x34, 0x2c, 0x2c, 0x28, 0xc7, 0x7e, 0x34, 0x28, 0x2d, 0x7a, 0x37, 0x01,
892 0xc1, 0x80, 0xbd, 0x22, 0x75, 0x2f, 0x53, 0x12, 0x73, 0x35, 0x7e, 0x15, 0x4d, 0x80, 0x11, 0x75,
893 0x2f, 0x51, 0x12, 0x73, 0x35, 0x0b, 0x08, 0x10, 0x0b, 0x05, 0x9e, 0x34, 0x00, 0x02, 0x28, 0x4d,
894 0x7c, 0xb2, 0x20, 0xe7, 0x27, 0x54, 0x07, 0x23, 0x0a, 0x2b, 0x49, 0x22, 0x39, 0x1e, 0x7c, 0xb2,
895 0x54, 0x78, 0x03, 0x03, 0x03, 0x7c, 0x2b, 0x9d, 0x13, 0x40, 0x1a, 0x68, 0x12, 0x7a, 0x15, 0x4d,
896 0x7a, 0x25, 0x4f, 0x7e, 0x64, 0x67, 0x09, 0x7a, 0x65, 0x4b, 0x89, 0x24, 0x02, 0x67, 0x17, 0x7e,
897 0x64, 0x66, 0x7f, 0x80, 0xf2, 0x2d, 0x13, 0x9d, 0x31, 0xca, 0x39, 0x7d, 0x31, 0x2d, 0x10, 0xca,
898 0x19, 0xca, 0x29, 0x99, 0x24, 0xda, 0x29, 0xda, 0x09, 0xda, 0x39, 0x80, 0xa2, 0x7a, 0x15, 0x4d,
899 0x7e, 0x64, 0x66, 0xf5, 0x4d, 0x33, 0x78, 0x09, 0x7c, 0xb2, 0x20, 0xe7, 0x2a, 0x7e, 0x64, 0x66,
900 0x74, 0x7a, 0x65, 0x4b, 0x22, 0x75, 0x2f, 0x52, 0x12, 0x73, 0x35, 0x7e, 0x21, 0x4d, 0x7e, 0x09,
901 0x30, 0x0b, 0x04, 0x1b, 0x34, 0x78, 0x89, 0x80, 0xd4, 0x75, 0x2f, 0x54, 0x12, 0x73, 0x35, 0x7e,
902 0x15, 0x4d, 0x7e, 0x25, 0x4f, 0x80, 0x90, 0x5e, 0x20, 0x07, 0x54, 0x78, 0x7e, 0x44, 0x67, 0x7d,
903 0x30, 0xe6, 0x16, 0x4d, 0x33, 0x68, 0x26, 0x1b, 0x34, 0x7e, 0x09, 0x40, 0x0b, 0x04, 0x7e, 0x44,
904 0x34, 0xfa, 0x20, 0xe3, 0x04, 0x7e, 0x44, 0x67, 0x85, 0xca, 0x09, 0xca, 0x39, 0x99, 0x44, 0xda,
905 0x39, 0xda, 0x09, 0x7e, 0x64, 0x66, 0x7f, 0x4d, 0x33, 0x68, 0xa6, 0x89, 0x64, 0x7a, 0x15, 0x4d,
906 0xf5, 0x4f, 0x7e, 0x64, 0x67, 0x58, 0x80, 0x99, 0x7e, 0x15, 0x4d, 0xe5, 0x4f, 0x80, 0xc4, 0xc0,
907 0xd0, 0xc0, 0xd1, 0xc0, 0xe0, 0xca, 0x19, 0x75, 0x2f, 0xfe, 0x12, 0x73, 0x35, 0x7e, 0x14, 0x00,
908 0x53, 0x02, 0x40, 0x52, 0xda, 0x19, 0xd0, 0xe0, 0xd0, 0xd1, 0xd0, 0xd0, 0x32, 0x03, 0xa5, 0xcb,
909 0x19, 0xb1, 0x80, 0x00, 0x22, 0x22, 0x7e, 0x24, 0x00, 0x00, 0x7f, 0xe1, 0x7e, 0xa0, 0x02, 0xa4,
910 0x7e, 0x04, 0x68, 0xb1, 0x9d, 0x05, 0x7e, 0xb0, 0x28, 0x7a, 0xb3, 0x95, 0x00, 0x89, 0x04, 0xca,
911 0x29, 0xb4, 0x80, 0xe2, 0x7e, 0x24, 0x00, 0x00, 0x7f, 0xe1, 0x7e, 0x00, 0x28, 0x7a, 0x03, 0x95,
912 0x00, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
913 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
914 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
915 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
916 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
917 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
918 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
919 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
920 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
921 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
922 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
923 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
924 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
925 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
926 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
927 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
928 0xa3, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x95, 0x00, 0xda, 0x29, 0x22, 0x7e, 0x24, 0x00, 0x00, 0x7f,
929 0xe1, 0x7e, 0xa0, 0x02, 0xa4, 0x7e, 0x04, 0x69, 0xe6, 0x9d, 0x05, 0x7e, 0xb0, 0x38, 0x7a, 0xb3,
930 0x95, 0x00, 0x89, 0x04, 0xca, 0x29, 0xb4, 0x80, 0xe2, 0x7e, 0x24, 0x00, 0x00, 0x7f, 0xe1, 0x7e,
931 0x00, 0x38, 0x7a, 0x03, 0x95, 0x00, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
932 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
933 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
934 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
935 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
936 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
937 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
938 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
939 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
940 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
941 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
942 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
943 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
944 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
945 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
946 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
947 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x95, 0x00, 0xda, 0x29, 0x22,
948 0xca, 0x29, 0xca, 0x19, 0xca, 0x58, 0x7e, 0x24, 0x00, 0x00, 0x7f, 0xe1, 0xda, 0x58, 0x7e, 0x54,
949 0x02, 0x20, 0x9c, 0xb5, 0xa4, 0x7e, 0x50, 0x30, 0x5e, 0x20, 0x07, 0x2c, 0x52, 0x7a, 0x53, 0x95,
950 0x00, 0x2e, 0x54, 0x6a, 0x17, 0x89, 0x54, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
951 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
952 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
953 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0,
954 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x95, 0x00, 0xda, 0x19,
955 0xda, 0x29, 0x22, 0xca, 0x19, 0xca, 0x58, 0x7e, 0x24, 0x00, 0x00, 0x7f, 0xe1, 0xda, 0x58, 0x7e,
956 0x54, 0x02, 0x38, 0x9c, 0xb5, 0xa4, 0x7e, 0x50, 0x20, 0x5e, 0x20, 0x07, 0x2c, 0x52, 0x7a, 0x53,
957 0x95, 0x00, 0x2e, 0x54, 0x6a, 0x88, 0x89, 0x54, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
958 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
959 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
960 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
961 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
962 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
963 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3,
964 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0xe0, 0xa3, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x95, 0x00, 0xda,
965 0x19, 0x22, 0x02, 0x6b, 0xa8, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b, 0xca, 0x3b, 0xca, 0x4b, 0xca,
966 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x2c,
967 0x7f, 0xb4, 0x00, 0x02, 0x80, 0x1c, 0xb4, 0x01, 0x19, 0x7e, 0xb3, 0x91, 0x14, 0x54, 0x14, 0x68,
968 0x05, 0x12, 0x6b, 0x6c, 0x80, 0x23, 0x7e, 0xb3, 0x91, 0x14, 0x30, 0xe5, 0x1c, 0x12, 0x6c, 0xaa,
969 0x80, 0x17, 0x7e, 0xb3, 0x91, 0x14, 0x30, 0xe5, 0x05, 0x12, 0x6c, 0xaa, 0x80, 0x0b, 0x7e, 0xb3,
970 0x91, 0x14, 0x54, 0x14, 0x68, 0x03, 0x12, 0x6b, 0x6c, 0xda, 0xeb, 0xda, 0x7b, 0xda, 0x6b, 0xda,
971 0x5b, 0xda, 0x4b, 0xda, 0x3b, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x20, 0xe4, 0x19, 0x75,
972 0x2f, 0x0a, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c, 0x7e, 0x70, 0x0a, 0x7e, 0xb3, 0x2c, 0x7f, 0xb4,
973 0x01, 0x1f, 0x02, 0x6c, 0x04, 0x02, 0x71, 0xf2, 0x75, 0x2f, 0x0b, 0x12, 0x73, 0x35, 0x74, 0x14,
974 0x7a, 0xb3, 0x91, 0x14, 0x7e, 0xb3, 0x2c, 0x7f, 0xb4, 0x02, 0x0c, 0x12, 0x6b, 0xb4, 0x02, 0x6b,
975 0xa8, 0x74, 0x04, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0x7e, 0x00, 0x00, 0x7a, 0x03, 0x2c, 0x7f, 0x7a,
976 0x03, 0x2c, 0x80, 0x22, 0x7e, 0xb3, 0x2c, 0x76, 0x54, 0x60, 0x60, 0x05, 0xb4, 0x40, 0x1e, 0x80,
977 0x1c, 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x05, 0x15, 0x75, 0x2f, 0x71, 0x12, 0x73, 0x35, 0x7e, 0xb3,
978 0x2c, 0x79, 0x7e, 0xa0, 0x01, 0x7a, 0xa3, 0x91, 0x06, 0x7a, 0xb3, 0x91, 0x07, 0x22, 0x74, 0x00,
979 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x10, 0x7a, 0xb3, 0x91, 0x12, 0x22, 0xbe, 0x57, 0x2c, 0x7c, 0x28,
980 0x04, 0x7e, 0x57, 0x2c, 0x7c, 0x7a, 0x0f, 0x2c, 0x82, 0x7a, 0x57, 0x2c, 0x86, 0x74, 0x10, 0x7a,
981 0xb3, 0x91, 0x12, 0x22, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91, 0x1a, 0x70, 0x53,
982 0x7e, 0xb3, 0x91, 0x14, 0x20, 0xe4, 0x4c, 0x7e, 0xef, 0x2c, 0x82, 0x7e, 0xf7, 0x2c, 0x86, 0x7e,
983 0x07, 0x2c, 0x86, 0x4d, 0x00, 0x68, 0x21, 0x7e, 0x00, 0x00, 0xe0, 0x7a, 0xb3, 0x91, 0x17, 0xa3,
984 0xa5, 0x08, 0x1b, 0xf4, 0x68, 0x06, 0xa5, 0xb8, 0x10, 0xf0, 0x80, 0x19, 0x7e, 0xb0, 0x00, 0x7a,
985 0xb3, 0x2c, 0x7f, 0xbe, 0x00, 0x10, 0x68, 0x0d, 0x7e, 0xb0, 0x00, 0x7a, 0xb3, 0x2c, 0x7f, 0x74,
986 0x80, 0x7a, 0xb3, 0x91, 0x1e, 0x7a, 0xef, 0x2c, 0x82, 0x7a, 0xf7, 0x2c, 0x86, 0x75, 0x2f, 0x06,
987 0x12, 0x73, 0x35, 0x74, 0x04, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0xca, 0x0b, 0xca, 0x1b, 0xca, 0x2b,
988 0xca, 0x3b, 0xca, 0x4b, 0xca, 0x5b, 0xca, 0x6b, 0xca, 0x7b, 0xca, 0xeb, 0x75, 0x2f, 0x03, 0x12,
989 0x73, 0x35, 0x74, 0x00, 0x7a, 0xb3, 0x2c, 0x7e, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x01,
990 0x7a, 0xb3, 0x91, 0x12, 0x12, 0x6d, 0x19, 0xda, 0xeb, 0xda, 0x7b, 0xda, 0x6b, 0xda, 0x5b, 0xda,
991 0x4b, 0xda, 0x3b, 0xda, 0x2b, 0xda, 0x1b, 0xda, 0x0b, 0x22, 0x75, 0x2f, 0x03, 0x12, 0x73, 0x35,
992 0x7e, 0xb3, 0x2c, 0x80, 0xb4, 0x02, 0x11, 0x74, 0x00, 0x7a, 0xb3, 0x2c, 0x80, 0x7a, 0xb3, 0x2c,
993 0x7f, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x14, 0x22, 0xb4, 0x01, 0x46, 0x7e, 0xb3, 0x91, 0x04, 0x20,
994 0xe6, 0x42, 0x7e, 0x23, 0x91, 0x1a, 0x7c, 0x32, 0x7e, 0x13, 0x2c, 0x81, 0x2c, 0x21, 0x7a, 0x23,
995 0x2c, 0x81, 0x7e, 0x00, 0x00, 0x2e, 0x04, 0x2c, 0x88, 0x7e, 0xb3, 0x91, 0x16, 0x7a, 0x09, 0xb0,
996 0x0b, 0x04, 0xa5, 0xdb, 0xf4, 0x74, 0x20, 0x7a, 0xb3, 0x91, 0x14, 0x75, 0x2f, 0x70, 0x12, 0x73,
997 0x35, 0x7e, 0xb3, 0x2c, 0x81, 0x7e, 0xa3, 0x2c, 0x7d, 0xbc, 0xab, 0x78, 0x03, 0x12, 0x6d, 0xb9,
998 0x22, 0x02, 0x71, 0xf2, 0xda, 0x59, 0x02, 0x6c, 0x7c, 0x74, 0xe0, 0x7a, 0xb3, 0x91, 0x00, 0x7e,
999 0x03, 0x91, 0x10, 0x7e, 0x13, 0x91, 0x11, 0x7e, 0x33, 0x91, 0x12, 0x7e, 0x23, 0x91, 0x13, 0x7e,
1000 0x53, 0x91, 0x14, 0x7e, 0x43, 0x91, 0x15, 0x7e, 0x73, 0x91, 0x16, 0x7e, 0x63, 0x91, 0x17, 0x7a,
1001 0x0f, 0x2c, 0x76, 0x7a, 0x1f, 0x2c, 0x7a, 0x75, 0x2f, 0x04, 0x12, 0x73, 0x35, 0x7a, 0x01, 0x2f,
1002 0x12, 0x73, 0x35, 0x7a, 0x11, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x21, 0x2f, 0x12, 0x73, 0x35, 0x7a,
1003 0x31, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x41, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x51, 0x2f, 0x12, 0x73,
1004 0x35, 0x7a, 0x61, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x71, 0x2f, 0x12, 0x73, 0x35, 0x74, 0x00, 0x7a,
1005 0xb3, 0x91, 0x00, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x04, 0x12, 0x6d, 0x8d, 0x22, 0x6d, 0x00, 0x7e,
1006 0x14, 0x01, 0x02, 0x7a, 0x07, 0x2c, 0x86, 0x7a, 0x03, 0x2c, 0x81, 0x7e, 0xb3, 0x2c, 0x76, 0x20,
1007 0xe7, 0x0f, 0x7a, 0x23, 0x2c, 0x80, 0x7a, 0x33, 0x2c, 0x7f, 0xbe, 0x07, 0x2c, 0x7c, 0x68, 0x09,
1008 0x22, 0x7a, 0x33, 0x2c, 0x80, 0x7a, 0x23, 0x2c, 0x7f, 0x7e, 0xb3, 0x2c, 0x76, 0x54, 0xe3, 0x23,
1009 0x23, 0x30, 0xe0, 0x02, 0xd2, 0xe5, 0x30, 0xe7, 0x02, 0xd2, 0xe4, 0x30, 0xe5, 0x06, 0x30, 0xe4,
1010 0x03, 0x02, 0x71, 0xf2, 0x54, 0x3e, 0xf5, 0xf0, 0x03, 0x54, 0x1f, 0xc3, 0x25, 0xf0, 0x90, 0x6d,
1011 0xe5, 0x75, 0x84, 0xff, 0x73, 0x02, 0x6f, 0xa0, 0x02, 0x6e, 0x2d, 0x02, 0x70, 0x39, 0x02, 0x70,
1012 0x54, 0x02, 0x6f, 0x37, 0x02, 0x6e, 0xc2, 0x02, 0x70, 0x85, 0x02, 0x70, 0x85, 0x02, 0x70, 0x88,
1013 0x02, 0x70, 0x88, 0x02, 0x70, 0x88, 0x02, 0x70, 0x88, 0x02, 0x70, 0x88, 0x02, 0x70, 0x88, 0x02,
1014 0x70, 0x88, 0x02, 0x70, 0x88, 0x02, 0x70, 0x8e, 0x02, 0x71, 0x60, 0x02, 0x70, 0x8b, 0x02, 0x70,
1015 0x8b, 0x02, 0x70, 0x8b, 0x02, 0x70, 0x8b, 0x02, 0x70, 0x8b, 0x02, 0x70, 0x8b, 0x74, 0x00, 0x7a,
1016 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x06, 0x2a,
1017 0x7e, 0xb3, 0x2c, 0x78, 0x60, 0x79, 0x7c, 0x0b, 0x7e, 0x13, 0x2c, 0x79, 0x7e, 0x17, 0x2c, 0x7a,
1018 0x75, 0x2f, 0x72, 0x12, 0x73, 0x35, 0x7a, 0x01, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x11, 0x2f, 0x12,
1019 0x73, 0x35, 0x12, 0x72, 0x37, 0x40, 0x58, 0x02, 0x6b, 0xeb, 0xb4, 0x08, 0x1c, 0x75, 0x2f, 0x74,
1020 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x3f, 0xf1, 0x7e, 0x08, 0x2c, 0x88, 0x7a, 0x0c, 0x00, 0x00, 0x7a,
1021 0x0b, 0xb0, 0x7e, 0x54, 0x00, 0x01, 0x02, 0x6b, 0xeb, 0xb4, 0x00, 0x33, 0x75, 0x2f, 0x75, 0x12,
1022 0x73, 0x35, 0x7e, 0x08, 0x2c, 0x88, 0x7a, 0x0c, 0x00, 0x00, 0xca, 0x0b, 0x7e, 0xb3, 0x3f, 0xf2,
1023 0x30, 0xe0, 0x07, 0x74, 0x02, 0x7a, 0x0b, 0xb0, 0x80, 0x05, 0x74, 0x00, 0x7a, 0x0b, 0xb0, 0x0b,
1024 0x14, 0x74, 0x00, 0x7a, 0x0b, 0xb0, 0x7e, 0x54, 0x00, 0x02, 0xda, 0x0b, 0x02, 0x6b, 0xeb, 0x02,
1025 0x71, 0xf2, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x7e, 0xb3,
1026 0x2c, 0x77, 0xb4, 0x00, 0x5f, 0x75, 0x2f, 0x76, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c, 0x7b, 0x54,
1027 0x0f, 0xb4, 0x02, 0x05, 0x7e, 0xb0, 0x60, 0x80, 0x17, 0xb4, 0x00, 0x05, 0x7e, 0xb0, 0x00, 0x80,
1028 0x0f, 0x7e, 0xb3, 0x2c, 0x7b, 0x20, 0xe7, 0x05, 0x7e, 0xb0, 0x40, 0x80, 0x03, 0x7e, 0xb0, 0x20,
1029 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0xb3, 0x91, 0x11, 0x30, 0xe0, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74,
1030 0x00, 0x7e, 0x08, 0x2c, 0x88, 0x7a, 0x0c, 0x00, 0x00, 0xca, 0x0b, 0x7a, 0x0b, 0xb0, 0x0b, 0x14,
1031 0x74, 0x00, 0x7a, 0x0b, 0xb0, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x7e, 0x54, 0x00, 0x02, 0xda,
1032 0x0b, 0x02, 0x6b, 0xeb, 0x02, 0x71, 0xf2, 0x7e, 0xb3, 0x2c, 0x7b, 0x54, 0x0f, 0xb4, 0x02, 0x05,
1033 0x7e, 0xb0, 0x60, 0x80, 0x17, 0xb4, 0x00, 0x05, 0x7e, 0xb0, 0x00, 0x80, 0x0f, 0x7e, 0xb3, 0x2c,
1034 0x7b, 0x20, 0xe7, 0x05, 0x7e, 0xb0, 0x40, 0x80, 0x03, 0x7e, 0xb0, 0x20, 0x7a, 0xb3, 0x91, 0x00,
1035 0x7e, 0xb3, 0x2c, 0x79, 0xb4, 0x00, 0x26, 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x01, 0x0e, 0x75, 0x2f,
1036 0x77, 0x12, 0x73, 0x35, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x80, 0x1b, 0xb4, 0x03, 0x0e, 0x75,
1037 0x2f, 0x78, 0x12, 0x73, 0x35, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x11, 0x80, 0x0a, 0x74, 0x00, 0x7a,
1038 0xb3, 0x91, 0x00, 0x12, 0x71, 0xf2, 0x22, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x02, 0x6b, 0xde,
1039 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x09, 0x1f, 0x75, 0x2f, 0x79, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c,
1040 0x79, 0xbe, 0xb3, 0x3f, 0xf1, 0x68, 0x0d, 0xca, 0xb8, 0x12, 0x43, 0x79, 0xda, 0xb8, 0x50, 0x76,
1041 0x7a, 0xb3, 0x3f, 0xf1, 0x80, 0x6d, 0xb4, 0x05, 0x08, 0x75, 0x2f, 0x7a, 0x12, 0x73, 0x35, 0x80,
1042 0x62, 0xb4, 0x03, 0x19, 0x75, 0x2f, 0x7b, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c, 0x79, 0xb4, 0x01,
1043 0x55, 0x7e, 0xb3, 0x3f, 0xf2, 0x44, 0x01, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x46, 0xb4, 0x01, 0x19,
1044 0x75, 0x2f, 0x7c, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c, 0x79, 0xb4, 0x01, 0x39, 0x7e, 0xb3, 0x3f,
1045 0xf2, 0x54, 0xfe, 0x7a, 0xb3, 0x3f, 0xf2, 0x80, 0x2a, 0xb4, 0x07, 0x2a, 0x7e, 0xb3, 0x2c, 0x78,
1046 0x60, 0x24, 0x7c, 0x0b, 0x7e, 0x13, 0x2c, 0x79, 0x7e, 0x17, 0x2c, 0x7a, 0x75, 0x2f, 0x73, 0x12,
1047 0x73, 0x35, 0x7a, 0x01, 0x2f, 0x12, 0x73, 0x35, 0x7a, 0x11, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x72,
1048 0x71, 0x40, 0x03, 0x02, 0x6b, 0xde, 0x02, 0x71, 0xf2, 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x0b, 0xf6,
1049 0x75, 0x2f, 0x7d, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c, 0x79, 0x7e, 0xa3, 0x2c, 0x7b, 0x4c, 0xab,
1050 0x78, 0xe4, 0x80, 0xdf, 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c,
1051 0x7e, 0xb3, 0x2c, 0x77, 0xb4, 0x0a, 0xcf, 0x75, 0x2f, 0x7e, 0x12, 0x73, 0x35, 0x7e, 0xb3, 0x2c,
1052 0x79, 0x70, 0xc3, 0x7e, 0x08, 0x2c, 0x88, 0x7a, 0x0c, 0x00, 0x00, 0x7a, 0x0b, 0xb0, 0x7e, 0x54,
1053 0x00, 0x01, 0x02, 0x6b, 0xeb, 0x02, 0x71, 0xf2, 0x02, 0x71, 0xf2, 0x02, 0x71, 0xf2, 0x7e, 0xb3,
1054 0x2c, 0x77, 0xb4, 0x04, 0x20, 0x75, 0x2f, 0xc3, 0x12, 0x73, 0x35, 0x7e, 0x04, 0x00, 0x01, 0x7e,
1055 0x17, 0x2c, 0x78, 0x7e, 0x18, 0x2c, 0x88, 0x7a, 0x1c, 0x00, 0x00, 0x7e, 0x47, 0x2c, 0x7c, 0x12,
1056 0x73, 0x41, 0x02, 0x71, 0x5a, 0xb4, 0x06, 0x42, 0x75, 0x2f, 0xc1, 0x12, 0x73, 0x35, 0x7e, 0x58,
1057 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7d, 0xca, 0x7e, 0xd7, 0x2c, 0x78, 0x7e, 0x78, 0x2c, 0x88,
1058 0x7a, 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x2c, 0x7c, 0x75, 0x2f, 0xc1, 0x12, 0x73, 0x35, 0xc0, 0xa8,
1059 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x12, 0x73, 0x7a, 0x7e, 0x43, 0x2c, 0x35,
1060 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0x40, 0x65, 0x80, 0x60, 0xb4, 0x00, 0x24, 0xc2, 0xaf, 0x7e,
1061 0xb0, 0x01, 0x7a, 0xb3, 0x94, 0x00, 0x7a, 0xb3, 0x2c, 0x35, 0x12, 0x6b, 0xde, 0xe4, 0x8d, 0xef,
1062 0x8d, 0xef, 0x8d, 0xef, 0xd5, 0xe0, 0xf7, 0xc0, 0xd1, 0xca, 0x02, 0xff, 0xca, 0x06, 0x00, 0x00,
1063 0x32, 0xb4, 0x09, 0x20, 0x74, 0x03, 0x7a, 0xb3, 0x91, 0x06, 0x7e, 0x23, 0x91, 0x07, 0x7e, 0x57,
1064 0x2c, 0x78, 0x4d, 0x55, 0x68, 0x05, 0x4e, 0x20, 0x02, 0x80, 0x03, 0x5e, 0x20, 0xfd, 0x7a, 0x23,
1065 0x91, 0x07, 0x80, 0x16, 0xb4, 0x07, 0x16, 0xc2, 0xaf, 0x7e, 0x07, 0x2c, 0x7a, 0x7e, 0x17, 0x2c,
1066 0x78, 0xc0, 0xd1, 0xca, 0x18, 0xca, 0x38, 0xca, 0x28, 0x32, 0x02, 0x6b, 0xde, 0x02, 0x71, 0xf2,
1067 0x74, 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x60, 0x7a, 0xb3, 0x91, 0x1c, 0x7e, 0xb3, 0x2c, 0x77,
1068 0xb4, 0x03, 0x15, 0x75, 0x2f, 0xc2, 0x12, 0x73, 0x35, 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x17, 0x2c,
1069 0x78, 0x7e, 0x57, 0x2c, 0x7c, 0x02, 0x6b, 0xeb, 0xb4, 0x05, 0x41, 0x75, 0x2f, 0xc0, 0x12, 0x73,
1070 0x35, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x7e, 0x08, 0x2c, 0x88,
1071 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x24, 0x00, 0xfe, 0x7e, 0x37, 0x2c, 0x78, 0x7e, 0x47, 0x2c, 0x7c,
1072 0x12, 0x73, 0x41, 0x7e, 0x43, 0x2c, 0x35, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0x7e, 0x08, 0x2c,
1073 0x88, 0x7a, 0x0c, 0x00, 0x00, 0x7e, 0x57, 0x2c, 0x7c, 0x02, 0x6b, 0xeb, 0xb4, 0x01, 0x20, 0x7e,
1074 0x00, 0x00, 0x7e, 0x10, 0x01, 0x75, 0x2f, 0x72, 0x12, 0x73, 0x35, 0x7a, 0x01, 0x2f, 0x12, 0x73,
1075 0x35, 0x7a, 0x11, 0x2f, 0x12, 0x73, 0x35, 0x12, 0x72, 0x37, 0x40, 0x03, 0x02, 0x6b, 0xeb, 0x02,
1076 0x71, 0xf2, 0x75, 0x2f, 0x07, 0x12, 0x73, 0x35, 0x7e, 0xb0, 0x02, 0x7a, 0xb3, 0x90, 0x00, 0x74,
1077 0x00, 0x7a, 0xb3, 0x91, 0x00, 0x74, 0x40, 0x7a, 0xb3, 0x91, 0x15, 0x74, 0x01, 0x7a, 0xb3, 0x91,
1078 0x11, 0x7e, 0xb3, 0x91, 0x15, 0x54, 0x60, 0xbe, 0xb0, 0x40, 0x68, 0x08, 0x74, 0x20, 0x7a, 0xb3,
1079 0x91, 0x15, 0x80, 0xed, 0x74, 0x01, 0x7a, 0xb3, 0x91, 0x12, 0x74, 0x04, 0x7a, 0xb3, 0x91, 0x14,
1080 0x74, 0xff, 0x7a, 0xb3, 0x2c, 0x7e, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43,
1081 0x94, 0x00, 0x12, 0x72, 0xbe, 0x40, 0x1f, 0x7e, 0x08, 0x2c, 0x88, 0x7a, 0x0c, 0x00, 0x00, 0xca,
1082 0x0b, 0xca, 0x49, 0x12, 0x73, 0x41, 0xda, 0x59, 0xda, 0x0b, 0x7e, 0x43, 0x2c, 0x35, 0x7a, 0x43,
1083 0x94, 0x00, 0xd0, 0xa8, 0xc3, 0x22, 0x7e, 0x43, 0x2c, 0x35, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8,
1084 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0x7e, 0x40, 0x01, 0x7a, 0x43, 0x94, 0x00, 0x12, 0x72, 0xbe, 0x40,
1085 0x31, 0x7e, 0x58, 0x00, 0x00, 0x7a, 0x5c, 0x00, 0xfe, 0x7f, 0x61, 0x7e, 0x78, 0x2c, 0x88, 0x7a,
1086 0x7c, 0x00, 0x00, 0x7e, 0x77, 0x2c, 0x7c, 0xbd, 0x74, 0x78, 0x17, 0x75, 0x2f, 0xc1, 0x12, 0x73,
1087 0x35, 0x12, 0x73, 0x7a, 0x40, 0x0c, 0x7e, 0x43, 0x2c, 0x35, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8,
1088 0xc3, 0x22, 0x7e, 0x43, 0x2c, 0x35, 0x7a, 0x43, 0x94, 0x00, 0xd0, 0xa8, 0xd3, 0x22, 0x7e, 0x24,
1089 0x00, 0xfe, 0x7e, 0x34, 0x7f, 0xca, 0x0b, 0x1a, 0x50, 0xc5, 0xf0, 0x7d, 0x62, 0x7d, 0x75, 0x7d,
1090 0x87, 0x7e, 0x34, 0x7f, 0xc2, 0x7e, 0x1b, 0xb0, 0x7e, 0x34, 0x7f, 0x03, 0xb4, 0x01, 0x04, 0x7e,
1091 0x34, 0x7f, 0xcc, 0x7e, 0x1b, 0xb0, 0xbc, 0x0b, 0x50, 0x49, 0x3e, 0x00, 0x3e, 0x00, 0x0a, 0x50,
1092 0x2d, 0x75, 0x0b, 0x3a, 0x30, 0x69, 0x53, 0x00, 0x02, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbc,
1093 0x1b, 0x50, 0x30, 0x3e, 0x10, 0x3e, 0x10, 0x0a, 0x51, 0x2d, 0x35, 0x69, 0x41, 0x00, 0x02, 0x0b,
1094 0x1a, 0x30, 0xbd, 0x38, 0x50, 0x02, 0x2d, 0x38, 0xbe, 0x44, 0xff, 0xff, 0x78, 0x05, 0x7e, 0x1b,
1095 0x90, 0x0a, 0x49, 0x4d, 0x44, 0x68, 0x0c, 0xbe, 0x44, 0x00, 0xff, 0x28, 0x04, 0x7e, 0x44, 0x00,
1096 0xff, 0xc3, 0x22, 0xd3, 0x22,
1097
1098// Segment #16, Start Address 00ff7fc6, Length 4
10990xff,0x00,0xc6,0x7f,0x04,0x00,
1100 0x02, 0x00, 0x03, 0x00,
1101
1102// Segment #17, Start Address 00ff7335, Length 328
11030xff,0x00,0x35,0x73,0x48,0x01,
1104 0xca, 0x08, 0x7e, 0x01, 0x2f, 0x7a, 0x03, 0x3f, 0xf0, 0xda, 0x08, 0x22, 0x7e, 0x1b, 0xc0, 0x7a,
1105 0x0b, 0xc0, 0x0b, 0x14, 0x0b, 0x34, 0x1b, 0x44, 0x78, 0xf2, 0x22, 0x7f, 0x6f, 0x7f, 0xf0, 0x1b,
1106 0xfc, 0x7c, 0x54, 0x7d, 0x32, 0x80, 0x08, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0xca, 0x1b, 0x9e,
1107 0x44, 0x00, 0x10, 0x50, 0xf2, 0x2e, 0x44, 0x00, 0x10, 0x68, 0x06, 0xca, 0x48, 0x1b, 0x44, 0x78,
1108 0xfa, 0x7f, 0xf6, 0x89, 0xe4, 0xca, 0x6b, 0x5e, 0xd4, 0x00, 0x3f, 0x68, 0x20, 0x7e, 0x84, 0x00,
1109 0x40, 0x9d, 0x8d, 0xda, 0x6b, 0xbd, 0x87, 0x38, 0x16, 0xca, 0x79, 0x7d, 0x78, 0x12, 0x73, 0xa4,
1110 0xda, 0x79, 0x40, 0x08, 0x9d, 0x78, 0x68, 0x02, 0x80, 0x05, 0xc2, 0xd7, 0x22, 0xda, 0x6b, 0x7e,
1111 0xc0, 0x03, 0x7e, 0xd0, 0x00, 0x7a, 0xd3, 0x90, 0x00, 0x74, 0xaa, 0x39, 0xb5, 0x55, 0x55, 0x74,
1112 0x55, 0x39, 0xb5, 0x2a, 0xaa, 0x74, 0xa0, 0x39, 0xb5, 0x55, 0x55, 0x7e, 0x04, 0x00, 0x40, 0x9d,
1113 0x70, 0x50, 0x06, 0x2d, 0x70, 0x7d, 0x07, 0x6d, 0x77, 0x7c, 0x31, 0x7e, 0x7b, 0x00, 0x7a, 0x6b,
1114 0x00, 0x0b, 0x7c, 0x0b, 0x6c, 0xa5, 0xd9, 0xf3, 0x7f, 0x16, 0x1b, 0x1c, 0x7e, 0x54, 0x27, 0x10,
1115 0x7e, 0x1b, 0x10, 0xbc, 0x10, 0x68, 0x06, 0x1b, 0x54, 0x78, 0xf5, 0x80, 0x2f, 0x6d, 0x00, 0x7c,
1116 0x20, 0x7f, 0x16, 0x9f, 0x10, 0x7f, 0x27, 0x9f, 0x20, 0x7e, 0x2b, 0x00, 0x7e, 0x1b, 0x10, 0xbc,
1117 0x01, 0x78, 0x19, 0x0b, 0x2c, 0x0b, 0x1c, 0xa5, 0xdb, 0xef, 0x7c, 0xb6, 0x20, 0xe0, 0x06, 0x6c,
1118 0xdc, 0x7a, 0xd3, 0x90, 0x00, 0x4d, 0x77, 0x78, 0x90, 0xc2, 0xd7, 0x22, 0xd2, 0xd7, 0x22, 0x00,
1119 0x04, 0x00, 0x04, 0x00, 0x00, 0x06, 0x04, 0x02, 0x04, 0x00, 0x02, 0x01, 0x04, 0x01, 0x02, 0x00,
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x08, 0x10,
1121 0x02, 0x10, 0x04, 0x02, 0x08, 0x00, 0x01, 0x01, 0x08, 0x7e, 0x18, 0x7f, 0xbd, 0x7a, 0x1c, 0x00,
1122 0xfe, 0x0b, 0x1a, 0x00, 0x5e, 0x10, 0x1f, 0xbe, 0x10, 0x14, 0x38, 0x1a, 0x0a, 0x51, 0x23, 0x7e,
1123 0x18, 0x74, 0x24, 0x7a, 0x1c, 0x00, 0xff, 0x2d, 0x35, 0x0b, 0x1a, 0x50, 0x60, 0x08, 0xa5, 0xb8,
1124 0x02, 0x03, 0x4e, 0xa0, 0x08, 0x22, 0x80, 0xfe,
1125};
1126
1127static struct edge_firmware_version_info IMAGE_VERSION_NAME = {
1128 2, 0, 3 }; // Major, Minor, Build
1129
1130#undef IMAGE_VERSION_NAME
1131
1132#undef IMAGE_ARRAY_NAME
1133
diff --git a/drivers/usb/serial/io_fw_down3.h b/drivers/usb/serial/io_fw_down3.h
new file mode 100644
index 000000000000..93b56d68a27b
--- /dev/null
+++ b/drivers/usb/serial/io_fw_down3.h
@@ -0,0 +1,835 @@
1//**************************************************************
2//* Edgeport Binary Image (for TI based products)
3//* Generated by TIBin2C v2.00 (watchport)
4//* Copyright (C) 2001 Inside Out Networks, All rights reserved.
5//**************************************************************
6
7
8static int IMAGE_SIZE = 12749;
9
10struct EDGE_FIRMWARE_VERSION_INFO
11{
12 unsigned char MajorVersion;
13 unsigned char MinorVersion;
14 unsigned short BuildNumber;
15};
16
17static struct EDGE_FIRMWARE_VERSION_INFO IMAGE_VERSION_NAME =
18{
19 4, 10, 0 // Major, Minor, Build
20
21};
22
23static unsigned char IMAGE_ARRAY_NAME[] =
24{
25// struct ImageHdr
26// {
27// WORD Length;
28// BYTE CheckSum;
29// };
300xca, 0x31,
310xa8,
32
330x02, 0x26, 0xfe, 0x02, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00,
340x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1a, 0x85, 0x3f,
350x8c, 0x85, 0x40, 0x8a, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00,
360xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3e,
370x24, 0x08, 0xf8, 0xe6, 0x60, 0x2b, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0xa6, 0x81, 0xe5, 0x3e, 0x75,
380xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0x78, 0x8c, 0xe5, 0x81,
390x04, 0xc3, 0x98, 0xf9, 0x94, 0x22, 0x40, 0x03, 0x02, 0x11, 0x94, 0xe6, 0xf0, 0x08, 0xa3, 0xd9,
400xfa, 0x74, 0x08, 0x25, 0x3e, 0xf8, 0x05, 0x3e, 0x08, 0xe6, 0x54, 0x80, 0x70, 0x0c, 0xe5, 0x3e,
410xb4, 0x07, 0xf3, 0x78, 0x08, 0x75, 0x3e, 0x00, 0x80, 0xef, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0x86,
420x81, 0xe5, 0x3e, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83,
430x78, 0x8c, 0xe5, 0x81, 0x04, 0xc3, 0x98, 0xf9, 0xe0, 0xf6, 0x08, 0xa3, 0xd9, 0xfa, 0xd0, 0x07,
440xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83,
450xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x30, 0x01, 0x4d, 0x30, 0xb4, 0x48, 0x10,
460x00, 0x45, 0x90, 0xff, 0x08, 0xe0, 0x54, 0x20, 0xf8, 0x90, 0xff, 0x48, 0xe0, 0x54, 0x20, 0xf9,
470x90, 0xff, 0x10, 0xe0, 0x54, 0x20, 0xfa, 0x90, 0xff, 0x50, 0xe0, 0x54, 0x20, 0xfb, 0x74, 0x00,
480xf5, 0x82, 0x74, 0xf8, 0xf5, 0x83, 0xe0, 0xc8, 0xf0, 0x68, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0,
490xc9, 0xf0, 0x69, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 0xca, 0xf0, 0x6a, 0x60, 0x02, 0x7e, 0x04,
500xa3, 0xe0, 0xcb, 0xf0, 0x6b, 0x60, 0x02, 0x7e, 0x04, 0x22, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0,
510xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05,
520xc0, 0x06, 0xc0, 0x07, 0x90, 0xff, 0x93, 0x74, 0x01, 0xf0, 0xe5, 0x81, 0x94, 0xfd, 0x40, 0x03,
530x02, 0x11, 0x94, 0x85, 0x41, 0x8d, 0x85, 0x42, 0x8b, 0x74, 0xaf, 0xf5, 0x82, 0x74, 0xfa, 0xf5,
540x83, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x4a, 0xe0, 0x30, 0xe7, 0x2c,
550x90, 0xff, 0x4e, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x20,
560xb4, 0x02, 0x1d, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27,
570x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xd0, 0x83, 0xd0, 0x82,
580xa3, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x52, 0xe0, 0x30, 0xe7, 0x2c,
590x90, 0xff, 0x56, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x25,
600xb4, 0x02, 0x22, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27,
610x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82,
620x80, 0x03, 0x02, 0x02, 0x62, 0x74, 0x15, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x20, 0x04,
630xf1, 0x20, 0x02, 0x03, 0x30, 0x01, 0xeb, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0,
640x14, 0xfc, 0xf0, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0x64, 0x04, 0x70, 0x0f, 0xec, 0x70, 0x62,
650x7e, 0x01, 0x12, 0x00, 0xc9, 0x7c, 0x0a, 0x7d, 0xfa, 0x02, 0x02, 0x33, 0x12, 0x00, 0xc9, 0xee,
660x64, 0x04, 0x60, 0x1d, 0xec, 0x70, 0x4b, 0x7c, 0x0a, 0xed, 0x14, 0xfd, 0x70, 0x15, 0xee, 0x64,
670x02, 0x60, 0x07, 0x7e, 0x02, 0x7d, 0x32, 0x02, 0x02, 0x33, 0x7e, 0x01, 0x7d, 0xfa, 0x02, 0x02,
680x33, 0x7c, 0x0a, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0,
690xa3, 0xee, 0xf0, 0x14, 0x60, 0x18, 0x20, 0xe1, 0x0f, 0x20, 0x01, 0x06, 0xd2, 0xb1, 0xc2, 0xb0,
700x80, 0x10, 0xc2, 0xb1, 0xd2, 0xb0, 0x80, 0x0a, 0xc2, 0xb1, 0xc2, 0xb0, 0x80, 0x04, 0xd2, 0xb0,
710xd2, 0xb1, 0x78, 0x19, 0x79, 0x09, 0x7a, 0x07, 0xe7, 0x70, 0x04, 0xa6, 0x00, 0x80, 0x0b, 0xe6,
720x60, 0x08, 0x16, 0xe6, 0x70, 0x04, 0xe7, 0x44, 0x80, 0xf7, 0x08, 0x09, 0xda, 0xea, 0xe5, 0x3d,
730x60, 0x13, 0x14, 0xf5, 0x3d, 0x70, 0x0e, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11,
740x0f, 0xd2, 0x8c, 0xd2, 0x8d, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0,
750x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32,
760x90, 0xff, 0x04, 0xe0, 0x90, 0xfa, 0xb6, 0xf0, 0x90, 0xff, 0x06, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa,
770xec, 0xff, 0xea, 0xfe, 0xef, 0xc3, 0x94, 0x08, 0xee, 0x94, 0x01, 0x50, 0x02, 0x80, 0x04, 0x7e,
780x01, 0x7f, 0x08, 0x8e, 0x3b, 0x8f, 0x3c, 0x90, 0xff, 0x02, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec,
790xff, 0xea, 0x90, 0xfa, 0xba, 0xf0, 0xef, 0xa3, 0xf0, 0x12, 0x1c, 0x30, 0xe4, 0xf5, 0x4d, 0xe5,
800x4d, 0xc3, 0x94, 0x02, 0x50, 0x0f, 0x12, 0x1c, 0x11, 0xe4, 0x12, 0x1a, 0x38, 0x05, 0x4d, 0x04,
810x12, 0x1c, 0x02, 0x80, 0xea, 0x12, 0x1c, 0x30, 0x90, 0xff, 0x00, 0xe0, 0xff, 0x54, 0x60, 0x24,
820xc0, 0x70, 0x03, 0x02, 0x08, 0xc5, 0x24, 0x40, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6,
830xe0, 0xfe, 0x54, 0x0f, 0xf5, 0x4d, 0xee, 0x30, 0xe7, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0a,
840x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 0x4c, 0x03, 0x56, 0x00, 0x04, 0x29, 0x01, 0x05, 0x3c, 0x03,
850x06, 0x03, 0x05, 0x06, 0x45, 0x06, 0x07, 0xa7, 0x08, 0x07, 0xef, 0x09, 0x08, 0x4b, 0x0a, 0x08,
860x8b, 0x0b, 0x00, 0x00, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa,
870xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x02, 0x45,
880x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xef, 0x54, 0x1f, 0x14, 0x60, 0x2b, 0x14, 0x60, 0x47, 0x24,
890x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xee, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x11, 0x74,
900x01, 0x12, 0x1a, 0x38, 0x78, 0x67, 0xe6, 0x30, 0xe0, 0x08, 0x12, 0x1c, 0x11, 0x74, 0x02, 0x12,
910x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x09, 0x90, 0xfa, 0xb6, 0xe0,
920x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xd3, 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f,
930x26, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x0e, 0x90, 0xfa, 0xb6, 0xe0, 0xff,
940x60, 0x07, 0x64, 0x80, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f,
950x26, 0xe5, 0x4d, 0x70, 0x19, 0x30, 0x0a, 0x0b, 0x90, 0xff, 0x80, 0x12, 0x1c, 0x0e, 0x12, 0x1a,
960x38, 0x80, 0x24, 0x90, 0xff, 0x82, 0x12, 0x1c, 0x0e, 0x12, 0x1a, 0x38, 0x80, 0x19, 0x15, 0x4d,
970x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x80, 0x09, 0x12, 0x1c,
980xb3, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x12, 0x1c, 0x11, 0x12, 0x19, 0xf2, 0x60, 0x05, 0x74,
990x01, 0x12, 0x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f,
1000x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x14, 0x60, 0x2d,
1010x14, 0x60, 0x59, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x04,
1020xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02,
1030x0f, 0x26, 0x78, 0x67, 0xe6, 0x54, 0xfe, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20,
1040xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x09, 0x90, 0xfa, 0xb6,
1050xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0c, 0x90, 0xfa, 0xb6, 0xe0, 0xd3,
1060x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0,
1070x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f,
1080x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0,
1090x07, 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x4d, 0x70, 0x0f, 0x90, 0xff, 0x82, 0xe0,
1100x54, 0xf7, 0xf0, 0x90, 0xff, 0x80, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0xe5, 0x4d, 0x24, 0xfe, 0x60,
1110x20, 0x24, 0xfb, 0x60, 0x34, 0x24, 0x06, 0x70, 0x35, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33,
1120xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80, 0x26, 0xe4, 0xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80,
1130x1d, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x0e,
1140xe4, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x05, 0x7f, 0x87, 0x12, 0x31, 0x32, 0x15, 0x4d,
1150x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x09, 0x12, 0x1c,
1160xb3, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7,
1170x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9,
1180x14, 0x60, 0x2d, 0x14, 0x60, 0x55, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba,
1190xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0,
1200x60, 0x03, 0x02, 0x0f, 0x26, 0x78, 0x67, 0xe6, 0x44, 0x01, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1,
1210xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x07,
1220xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0a, 0xe5, 0x4d, 0xd3, 0x94,
1230x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0, 0x70,
1240x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x12, 0x31, 0x82,
1250x40, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26,
1260xe5, 0x4d, 0x70, 0x09, 0x30, 0x0a, 0x03, 0x02, 0x1d, 0x64, 0x02, 0x1d, 0x2f, 0xe5, 0x35, 0x20,
1270xe1, 0x03, 0x02, 0x0f, 0x26, 0x15, 0x4d, 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0,
1280x44, 0x08, 0xf0, 0x80, 0x09, 0x12, 0x1c, 0xb3, 0xf5, 0x83, 0xe0, 0x44, 0x08, 0xf0, 0xe4, 0xff,
1290x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60,
1300x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9,
1310x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xbb,
1320xe0, 0x90, 0xff, 0xff, 0xf0, 0xe0, 0x60, 0x05, 0x43, 0x35, 0x01, 0x80, 0x03, 0x53, 0x35, 0xfe,
1330xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45,
1340x3b, 0x70, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa,
1350xba, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0x24, 0xfe, 0x60, 0x3a, 0x14, 0x60, 0x75, 0x24, 0x02,
1360x60, 0x03, 0x02, 0x0f, 0x26, 0xed, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x30, 0x12, 0x1d,
1370x5d, 0x7d, 0x03, 0x12, 0x0f, 0x6d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa,
1380xb3, 0xe0, 0xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b,
1390xaf, 0x3c, 0x02, 0x0f, 0xba, 0x12, 0x1c, 0x30, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x0d, 0x12,
1400x1d, 0x5d, 0x7d, 0x14, 0x12, 0x0f, 0x6d, 0x60, 0x10, 0x02, 0x0f, 0x26, 0x12, 0x1d, 0x5d, 0x7d,
1410x04, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa, 0xb3, 0xe0,
1420xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c,
1430x02, 0x0f, 0xba, 0x12, 0x1d, 0x5d, 0x7d, 0x05, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26,
1440x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3, 0x12, 0x1c, 0x78, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa,
1450xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb2, 0xf0,
1460xe4, 0xf5, 0x4c, 0x90, 0xfa, 0xb2, 0xe0, 0xff, 0xe5, 0x4c, 0xc3, 0x9f, 0x50, 0x24, 0x12, 0x1c,
1470x72, 0x12, 0x0f, 0xcc, 0xff, 0xfd, 0x90, 0xfa, 0xb4, 0xe4, 0x8d, 0xf0, 0x12, 0x1a, 0x6c, 0x90,
1480xfa, 0xb3, 0xe0, 0xc3, 0x9f, 0xf0, 0xd3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x0f, 0x26, 0x05, 0x4c,
1490x80, 0xd1, 0x12, 0x1c, 0x72, 0x12, 0x0f, 0xcc, 0x24, 0xfe, 0xff, 0x90, 0xfa, 0xb3, 0xf0, 0xfd,
1500xa3, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0x7a, 0xf9, 0x79, 0x6f, 0x7b, 0x01, 0x8b, 0x36,
1510x8a, 0x37, 0x89, 0x38, 0xe9, 0x24, 0x02, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, 0x1c, 0x78, 0x12, 0x25,
1520xd7, 0x8f, 0x4c, 0x05, 0x4c, 0x05, 0x4c, 0x12, 0x1c, 0x11, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x12,
1530x1c, 0x11, 0x90, 0x00, 0x01, 0x74, 0x03, 0x12, 0x1a, 0x4a, 0xaf, 0x4c, 0x7e, 0x00, 0xc3, 0xef,
1540x95, 0x3c, 0xee, 0x95, 0x3b, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x8e, 0x39, 0x8f,
1550x3a, 0x02, 0x2c, 0x07, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5,
1560x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03,
1570x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26,
1580x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03,
1590x02, 0x0f, 0x26, 0x75, 0x36, 0x00, 0x75, 0x37, 0x00, 0x75, 0x38, 0x32, 0x02, 0x0f, 0xa9, 0xe5,
1600x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26,
1610x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb, 0xe0, 0x94, 0x01,
1620x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03,
1630x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa,
1640xbb, 0xe0, 0xf5, 0x32, 0xe5, 0x32, 0x70, 0x08, 0x43, 0x35, 0x01, 0x53, 0x35, 0xfd, 0x80, 0x06,
1650x53, 0x35, 0xfe, 0x43, 0x35, 0x02, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03,
1660x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa,
1670xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60,
1680x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35,
1690x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x7f, 0x01, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03,
1700x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb,
1710xe0, 0x94, 0x00, 0x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c,
1720xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26,
1730xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xff, 0x01, 0x12, 0x1d, 0x74, 0xef, 0x12, 0x1a, 0x38, 0x90,
1740xfa, 0xb6, 0x12, 0x1d, 0x74, 0x90, 0x00, 0x01, 0xef, 0x12, 0x1a, 0x4a, 0x90, 0x00, 0x02, 0xe4,
1750x12, 0x1a, 0x4a, 0x74, 0x03, 0x12, 0x1c, 0x02, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0xa3, 0xe0, 0x85,
1760x38, 0x82, 0x85, 0x37, 0x83, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b,
1770x4c, 0x09, 0x4a, 0x02, 0x09, 0x6c, 0x04, 0x09, 0x8e, 0x05, 0x09, 0xba, 0x06, 0x09, 0xd8, 0x07,
1780x09, 0xf6, 0x08, 0x0a, 0x14, 0x09, 0x0a, 0x32, 0x0b, 0x0a, 0xe7, 0x80, 0x0d, 0x6f, 0x81, 0x0d,
1790xa0, 0x82, 0x0b, 0x2e, 0x83, 0x0b, 0x77, 0x84, 0x0b, 0x96, 0x85, 0x0b, 0xdb, 0x86, 0x0c, 0x26,
1800x87, 0x0c, 0xb7, 0x88, 0x0d, 0x42, 0x89, 0x0a, 0x50, 0x92, 0x0a, 0x50, 0x93, 0x0e, 0x53, 0xc0,
1810x0e, 0x7f, 0xc1, 0x0e, 0x90, 0xc2, 0x00, 0x00, 0x0f, 0x15, 0xe5, 0x35, 0x20, 0xe7, 0x05, 0x7f,
1820x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00,
1830x7f, 0x07, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35, 0x20, 0xe7,
1840x05, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd,
1850x7c, 0x00, 0x7f, 0x0c, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35,
1860x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1d, 0x92, 0x50, 0x06, 0xe5, 0x3c, 0x45, 0x3b, 0x70,
1870x05, 0x7f, 0x02, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfe, 0x24, 0xfd, 0x50, 0x02,
1880x80, 0x03, 0x02, 0x31, 0x6f, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02,
1890x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x08,
1900x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29,
1910x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x09, 0x02, 0x11,
1920x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c,
1930xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0a, 0x02, 0x11, 0x16, 0x7f,
1940x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60,
1950x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0b, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02,
1960x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04,
1970x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0e, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec,
1980xe5, 0x35, 0x30, 0xe7, 0x56, 0x12, 0x1c, 0xc9, 0x70, 0x4a, 0x90, 0xff, 0x02, 0xe0, 0xf5, 0x4c,
1990xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 0x4c, 0xb4, 0x83, 0x05, 0x75,
2000x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 0x4c, 0x12, 0x1b, 0x72, 0x12,
2010x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c, 0xd9, 0x12, 0x1a, 0x0b, 0x60, 0x05, 0x12, 0x31, 0xbd,
2020x80, 0x06, 0x85, 0x33, 0x39, 0x85, 0x34, 0x3a, 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38,
2030x72, 0x02, 0x2c, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0x18, 0x12, 0x1c, 0xc9, 0x60, 0x05,
2040x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1d, 0x92, 0x40, 0x05, 0x7f, 0x03, 0x02, 0x30, 0xec, 0x90,
2050xff, 0x02, 0xe0, 0xf5, 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5,
2060x4c, 0xb4, 0x83, 0x05, 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5,
2070x4c, 0x12, 0x1b, 0x72, 0x02, 0x31, 0x6f, 0x12, 0x1d, 0x9c, 0x12, 0x2a, 0x06, 0x12, 0x1c, 0x83,
2080xe0, 0x54, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x78, 0x68, 0x12, 0x1b,
2090x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0xf2, 0x90, 0x00, 0x02, 0xe4, 0x12, 0x1a,
2100x4a, 0x90, 0xfa, 0xb7, 0xe0, 0x44, 0x80, 0xff, 0xf0, 0x78, 0x7c, 0xe6, 0xfc, 0x08, 0xe6, 0x8c,
2110x83, 0x12, 0x1c, 0x8b, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa,
2120xb6, 0xe0, 0x64, 0x01, 0x70, 0x1f, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3,
2130xe0, 0xf5, 0x90, 0x80, 0x2d, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0x90, 0x90, 0xfa, 0xbb, 0xe0, 0x42,
2140x90, 0xd2, 0xaf, 0x80, 0x1d, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, 0xe0,
2150xf5, 0xb0, 0x80, 0x0e, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0xb0, 0x90, 0xfa, 0xbb, 0xe0, 0x42, 0xb0,
2160xd2, 0xaf, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0xb4, 0x01,
2170x0a, 0x12, 0x1c, 0x11, 0xe5, 0x90, 0x12, 0x1a, 0x38, 0x80, 0x08, 0x12, 0x1c, 0x11, 0xe5, 0xb0,
2180x12, 0x1a, 0x38, 0x02, 0x0f, 0xa9, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0x12, 0x12, 0x1c, 0x41,
2190x20, 0xe1, 0x33, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x18, 0x04, 0x70, 0x28, 0x90, 0xfa,
2200xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x19, 0x12, 0x1d, 0xa6,
2210xf0, 0x80, 0x13, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0xf0,
2220x80, 0x04, 0x12, 0x1d, 0xad, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0xff,
2230x24, 0x12, 0x12, 0x1c, 0x41, 0x20, 0xe1, 0x39, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x1b,
2240x04, 0x70, 0x2e, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0,
2250x80, 0x1f, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x16, 0x90, 0xfa, 0xb7, 0xe0, 0x60,
2260x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf,
2270xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x12, 0x1c, 0xc1, 0x60, 0x4d, 0x04, 0x60,
2280x03, 0x02, 0x0c, 0xb2, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x0f, 0x90, 0xff, 0xa4, 0x12, 0x1c, 0x3a,
2290x30, 0xe1, 0x6f, 0x12, 0x1d, 0x7c, 0x02, 0x0c, 0xb2, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfb, 0x12,
2300x1c, 0x3d, 0xfe, 0x30, 0xe1, 0x5c, 0x30, 0xe2, 0x11, 0x30, 0xb4, 0x05, 0x12, 0x1d, 0x7c, 0x80,
2310x51, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x48, 0x30, 0x95, 0x05, 0x12, 0x1d, 0x7c,
2320x80, 0x40, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x37, 0x90, 0xfa, 0xb7, 0xe0, 0x60,
2330x12, 0x90, 0xff, 0xb4, 0x12, 0x1c, 0x3a, 0x30, 0xe1, 0x28, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02,
2340xf0, 0x80, 0x1f, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xfb, 0x12, 0x1c, 0x3d, 0x30, 0xe1, 0x13, 0x30,
2350x93, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54,
2360xfd, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc,
2370x60, 0x40, 0x04, 0x70, 0x78, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xa2, 0xe0, 0x44,
2380x40, 0xf0, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x65, 0xd2, 0x03, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90,
2390xff, 0xa3, 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x55, 0x30, 0x03, 0x0e, 0x90, 0xff, 0xa3, 0xe0, 0x44,
2400x80, 0xf0, 0xc2, 0x03, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x54, 0xbf, 0xf0,
2410x80, 0x3b, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xb2, 0xe0, 0x44, 0x40, 0xf0, 0xa3,
2420xe0, 0xff, 0x30, 0xe7, 0x28, 0xd2, 0x04, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 0xff, 0xb3, 0xef,
2430x54, 0x7f, 0xf0, 0x80, 0x18, 0x30, 0x04, 0x0e, 0x90, 0xff, 0xb3, 0xe0, 0x44, 0x80, 0xf0, 0xc2,
2440x04, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x54, 0xbf, 0xf0, 0xe4, 0xff, 0x02,
2450x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc, 0x60, 0x0f, 0x04, 0x70, 0x16,
2460x90, 0xff, 0xa6, 0xe0, 0x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x80, 0x0a, 0x90, 0xff, 0xb6, 0xe0,
2470x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0x07, 0xe4,
2480xff, 0x12, 0x30, 0xec, 0x12, 0x1d, 0x37, 0x7f, 0x03, 0x12, 0x12, 0x19, 0x90, 0xf9, 0x15, 0xe0,
2490x30, 0xe4, 0x08, 0x90, 0xff, 0x93, 0x74, 0x80, 0xf0, 0x80, 0x10, 0x90, 0xff, 0xfc, 0xe0, 0x54,
2500x7f, 0xf0, 0x7f, 0xff, 0x7e, 0x00, 0x12, 0x30, 0x16, 0xc2, 0x90, 0xc2, 0xaf, 0x00, 0x80, 0xfd,
2510xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x90, 0xfa, 0xbc, 0x74, 0x3e, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xfa,
2520xb4, 0xf0, 0xa3, 0x74, 0x15, 0xf0, 0xe0, 0x54, 0x3f, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0xfa,
2530xb9, 0xf0, 0xd3, 0x94, 0x00, 0xe4, 0x94, 0x3e, 0x40, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa,
2540xb9, 0xf0, 0x12, 0x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x73, 0x12, 0x1c, 0x4a, 0x90, 0xfa,
2550xbc, 0x12, 0x1d, 0x56, 0x60, 0x27, 0xd3, 0xef, 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x08, 0x90,
2560xfa, 0xb9, 0x74, 0x40, 0xf0, 0x80, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa, 0xb9, 0xf0, 0x12,
2570x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x46, 0x12, 0x1c, 0x4a, 0x80, 0xd1, 0x75, 0x4c, 0x02,
2580x90, 0xfa, 0xbc, 0xe4, 0xf0, 0xa3, 0x04, 0xf0, 0x90, 0xfa, 0xb4, 0xe4, 0xf0, 0xa3, 0x74, 0x0f,
2590xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0x90, 0xfa, 0xbd, 0xe0, 0xf5, 0x4a, 0x7d, 0x0f, 0x7c,
2600x00, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0xe4,
2610xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xaf, 0x31,
2620x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x30, 0xe7, 0x10, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x64, 0xf0,
2630xd3, 0x94, 0x00, 0x40, 0x15, 0xc2, 0x95, 0x80, 0x11, 0x90, 0xfa, 0xb7, 0xe0, 0x54, 0x0f, 0x90,
2640xf9, 0x63, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x02, 0xc2, 0x94, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12,
2650x1d, 0x9c, 0xbf, 0x01, 0x04, 0xd2, 0x93, 0x80, 0x02, 0xc2, 0x93, 0xe4, 0xff, 0x02, 0x30, 0xec,
2660x12, 0x1c, 0xd0, 0x54, 0x03, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03,
2670x70, 0x2b, 0xd2, 0x91, 0x80, 0x27, 0xc2, 0x91, 0x80, 0x23, 0x12, 0x1d, 0xa6, 0x12, 0x0f, 0x78,
2680x60, 0x04, 0xd2, 0x91, 0x80, 0x17, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0x78, 0xff,
2690xbf, 0xa0, 0x04, 0xc2, 0x91, 0x80, 0x02, 0xd2, 0x91, 0x12, 0x1d, 0xa6, 0xf0, 0x90, 0xfa, 0xb7,
2700xe0, 0x54, 0x0c, 0xff, 0x13, 0x13, 0x54, 0x3f, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60,
2710x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x92, 0x80, 0x27, 0xc2, 0x92, 0x80, 0x23, 0x12, 0x1d, 0xad,
2720x12, 0x0f, 0x98, 0x60, 0x04, 0xd2, 0x92, 0x80, 0x17, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0x12,
2730x0f, 0x98, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x92, 0x80, 0x02, 0xd2, 0x92, 0x12, 0x1d, 0xad, 0xf0,
2740xe4, 0xff, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f,
2750x18, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x31, 0xbd, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3,
2760x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90,
2770xfa, 0xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22,
2780xaa, 0x4e, 0xa9, 0x4f, 0x7b, 0xff, 0x90, 0xfa, 0xb4, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa,
2790xb9, 0xe0, 0xf5, 0x4a, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x22, 0x12, 0x22, 0xa0,
2800x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff,
2810xa6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x12, 0x25, 0xd7, 0x8f, 0x4c, 0x7e, 0x00,
2820xc3, 0xef, 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff,
2830xb6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02,
2840x2c, 0x07, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x02, 0x31, 0x82, 0x8e, 0x39, 0x8f, 0x3a, 0x02, 0x2c,
2850x07, 0x12, 0x22, 0xa0, 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0x7d, 0x01, 0x12, 0x25,
2860xd7, 0x90, 0xfa, 0xb1, 0xe0, 0x22, 0xef, 0x90, 0xf8, 0x04, 0xf0, 0x22, 0xc0, 0xa8, 0xc2, 0xaf,
2870xee, 0x60, 0x0a, 0xc0, 0x05, 0x7d, 0x7f, 0xdd, 0xfe, 0xde, 0xfa, 0xd0, 0x05, 0xef, 0xc3, 0x94,
2880x15, 0x50, 0x03, 0xd0, 0xa8, 0x22, 0x13, 0x70, 0x03, 0xd0, 0xa8, 0x22, 0xff, 0xd5, 0x07, 0xfd,
2890xd0, 0xa8, 0x22, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x05, 0xe5, 0x3e, 0x24,
2900x08, 0xf8, 0x86, 0x05, 0x53, 0x05, 0x7f, 0x7c, 0xff, 0x12, 0x10, 0x78, 0x7f, 0x00, 0x7e, 0x00,
2910xe5, 0x43, 0x60, 0x46, 0xfc, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6d, 0x70, 0x0f, 0xc0, 0x83,
2920xc0, 0x82, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3,
2930xdc, 0xe6, 0x80, 0x26, 0xdc, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0x1e, 0xe0, 0xf8, 0xa3, 0xe0,
2940xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0,
2950xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x12, 0x11, 0x0f, 0xd0, 0x05, 0xd0,
2960x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x85, 0xa8, 0x44, 0x75, 0xa8, 0x88, 0xec, 0x70,
2970x02, 0x7c, 0x3f, 0x8c, 0x3d, 0x22, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0x66,
2980x80, 0xfb, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x06, 0x7c, 0xff, 0x12, 0x10,
2990x78, 0xe5, 0x43, 0x60, 0x42, 0xfe, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6f, 0x70, 0x0b, 0xc0,
3000x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xde, 0xea, 0x80,
3010x26, 0xde, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0xd8, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0,
3020xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83,
3030xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x78, 0x08, 0x08, 0x79, 0x18, 0x09, 0x7c, 0x01, 0xe6,
3040x54, 0x7f, 0x6f, 0x70, 0x06, 0x76, 0x00, 0x77, 0x00, 0x80, 0x06, 0x08, 0x09, 0x0c, 0xbc, 0x08,
3050xee, 0x12, 0x11, 0x0f, 0xd0, 0x06, 0xd0, 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x75,
3060x3d, 0x00, 0x85, 0x44, 0xa8, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc3, 0xe5, 0x43, 0x24,
3070xe8, 0x50, 0x05, 0x12, 0x11, 0x66, 0x80, 0xf4, 0xef, 0x60, 0x31, 0x90, 0x30, 0x54, 0xe4, 0x93,
3080xc3, 0x9f, 0x40, 0x2f, 0xc0, 0x04, 0x7c, 0xff, 0x12, 0x10, 0x78, 0xd0, 0x04, 0x43, 0x07, 0x80,
3090xe5, 0x43, 0x75, 0xf0, 0x03, 0xa4, 0x24, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xef,
3100xf0, 0xec, 0xa3, 0xf0, 0xed, 0xa3, 0xf0, 0x05, 0x43, 0x12, 0x11, 0x0f, 0xd0, 0x83, 0xd0, 0x82,
3110xd0, 0xf0, 0x22, 0x02, 0x11, 0x94, 0xc0, 0x04, 0x7c, 0x20, 0xd2, 0x8c, 0xd2, 0x8d, 0xd5, 0x04,
3120xfd, 0xd0, 0x04, 0x22, 0x75, 0xa8, 0x00, 0x75, 0x88, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xf0, 0x00,
3130x75, 0xd0, 0x00, 0xe4, 0xf8, 0x90, 0xf8, 0x04, 0xf0, 0x90, 0x00, 0x00, 0xf6, 0x08, 0xb8, 0x00,
3140xfb, 0x02, 0x00, 0x00, 0xc2, 0xaf, 0xe4, 0x90, 0xff, 0x48, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90,
3150xff, 0x08, 0xf0, 0x90, 0xff, 0x10, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xa3, 0xa3, 0xf0, 0xd2, 0xb1,
3160xc2, 0xb0, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc,
3170x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0xd2, 0xb0, 0xd2, 0xb1, 0x7e, 0xff, 0x7f, 0xff, 0x12,
3180x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc,
3190x80, 0xcc, 0xc3, 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x03, 0x7f, 0xe8, 0xef, 0xf4, 0xff, 0xee,
3200xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x42, 0x8e, 0x41, 0x22, 0xc3, 0xef, 0x94, 0xbc,
3210xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x07, 0x7f, 0xd0, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f,
3220xbf, 0x00, 0x01, 0x0e, 0x8f, 0x40, 0x8e, 0x3f, 0x22, 0xef, 0x70, 0x01, 0x22, 0xc0, 0x00, 0xc0,
3230xa8, 0xc2, 0xaf, 0xe5, 0x3e, 0x24, 0x18, 0xf8, 0xa6, 0x07, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0xc6,
3240x54, 0x7f, 0xf6, 0xd0, 0xa8, 0xe6, 0x30, 0xe7, 0x03, 0xd0, 0x00, 0x22, 0x12, 0x11, 0x66, 0x80,
3250xf4, 0xc0, 0x00, 0x7f, 0x01, 0xef, 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x09, 0x0f, 0xbf, 0x08, 0xf5,
3260x12, 0x11, 0x66, 0x80, 0xee, 0xd0, 0x00, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00,
3270xc0, 0x06, 0xc0, 0x04, 0xed, 0x24, 0x10, 0xf8, 0x76, 0x9a, 0xed, 0x75, 0xf0, 0x21, 0xa4, 0x24,
3280x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0xc0, 0x82, 0xc0, 0x83, 0xa3, 0xa3, 0xe4, 0x78,
3290x0d, 0xf0, 0xa3, 0xd8, 0xfc, 0xef, 0x54, 0x7f, 0x75, 0xf0, 0x02, 0xa4, 0x24, 0x36, 0xf5, 0x82,
3300xe5, 0xf0, 0x34, 0x30, 0xf5, 0x83, 0xe4, 0x93, 0xfe, 0x74, 0x01, 0x93, 0xfc, 0xd0, 0x83, 0xd0,
3310x82, 0xec, 0xf0, 0xa3, 0xee, 0xf0, 0xed, 0x24, 0x08, 0xf8, 0xef, 0x44, 0x80, 0xf6, 0xd0, 0x04,
3320xd0, 0x06, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0x22, 0x75, 0x3e, 0x00, 0x75, 0x43,
3330x00, 0x7a, 0x08, 0x79, 0x18, 0x78, 0x08, 0x76, 0x00, 0x77, 0x00, 0x08, 0x09, 0xda, 0xf8, 0x90,
3340xf8, 0x04, 0xe0, 0xfc, 0x90, 0x30, 0x54, 0xe4, 0x93, 0xc3, 0x9c, 0x50, 0x05, 0xe4, 0x90, 0xf8,
3350x04, 0xf0, 0x78, 0x08, 0x74, 0x80, 0x44, 0x7f, 0xf6, 0x74, 0x01, 0x44, 0x10, 0xf5, 0x89, 0x75,
3360xb8, 0x00, 0xd2, 0xab, 0xd2, 0xa9, 0x22, 0x75, 0x81, 0x8b, 0xd2, 0x8e, 0xd2, 0x8c, 0xd2, 0xaf,
3370xe5, 0x43, 0x60, 0x36, 0xff, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x80, 0x60, 0x28, 0x78, 0x08, 0x79,
3380x08, 0xe0, 0x54, 0x7f, 0xfa, 0x7b, 0x00, 0xe6, 0x54, 0x7f, 0xb5, 0x02, 0x02, 0x7b, 0xff, 0x08,
3390xd9, 0xf5, 0xeb, 0x70, 0x10, 0xea, 0xf0, 0xc0, 0x07, 0x12, 0x12, 0x41, 0xad, 0x07, 0xaf, 0x02,
3400x12, 0x12, 0x58, 0xd0, 0x07, 0xa3, 0xa3, 0xa3, 0xdf, 0xce, 0x12, 0x11, 0x66, 0x80, 0xc1, 0x8f,
3410x24, 0x12, 0x2a, 0x06, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x08, 0x12,
3420x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xed, 0xf0,
3430x12, 0x22, 0x56, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x12, 0x22, 0x99, 0x24, 0x09, 0x12,
3440x21, 0xf3, 0xef, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x20, 0x08, 0x12, 0x22, 0x09, 0xc0,
3450x83, 0xc0, 0x82, 0xa3, 0xe0, 0x25, 0xe0, 0xff, 0x05, 0x82, 0xd5, 0x82, 0x02, 0x15, 0x83, 0x15,
3460x82, 0xe0, 0x33, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x80, 0x12, 0x22, 0x09,
3470xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0xff, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x08, 0x12, 0x21,
3480xf3, 0xef, 0xf0, 0xed, 0x12, 0x22, 0x99, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xed, 0xf0, 0x12, 0x21,
3490xfb, 0xe0, 0xff, 0x30, 0xe7, 0x19, 0x12, 0x22, 0x6e, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x09, 0x12,
3500x21, 0xfb, 0xef, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x12, 0x21, 0xfb, 0xef, 0x54, 0xfd, 0xf0, 0x78,
3510x7e, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xff, 0x53, 0x07, 0xc7, 0x08, 0xe6, 0xfc, 0x08, 0xe6,
3520xfd, 0x12, 0x22, 0x43, 0xa3, 0xe0, 0x30, 0xe3, 0x12, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24,
3530x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x31, 0x94, 0x93, 0x42, 0x07, 0x53, 0x07, 0xfb, 0x78, 0x80,
3540xe6, 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x06, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x03, 0x43, 0x07,
3550x04, 0x53, 0x07, 0xfc, 0x78, 0x80, 0x12, 0x22, 0x7a, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x42,
3560x07, 0x43, 0x07, 0x80, 0x12, 0x22, 0x8a, 0xf5, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xef, 0xf0, 0x12,
3570x22, 0x99, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xe0,
3580xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe1, 0x05, 0x53, 0x07, 0xdf, 0x80, 0x03, 0x43, 0x07, 0x20, 0xec,
3590x30, 0xe4, 0x05, 0x53, 0x07, 0xef, 0x80, 0x03, 0x43, 0x07, 0x10, 0x12, 0x21, 0xfb, 0xe0, 0xfe,
3600x54, 0x03, 0x60, 0x73, 0x53, 0x07, 0xdf, 0xee, 0x30, 0xe1, 0x69, 0x78, 0x80, 0x12, 0x22, 0x6f,
3610x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x14, 0xa6, 0x00, 0x14, 0xda, 0x01, 0x14, 0xdf, 0x03,
3620x14, 0xda, 0x05, 0x14, 0xdf, 0x07, 0x14, 0xda, 0x09, 0x14, 0xdf, 0x0b, 0x14, 0xda, 0x0d, 0x14,
3630xdf, 0x0f, 0x00, 0x00, 0x14, 0xe7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x21, 0x90, 0xf9, 0x15, 0xe0,
3640x30, 0xe2, 0x0d, 0x30, 0xb4, 0x05, 0x43, 0x07, 0x02, 0x80, 0x2c, 0x53, 0x07, 0xfd, 0x80, 0x27,
3650x30, 0x95, 0x05, 0x43, 0x07, 0x02, 0x80, 0x1f, 0x53, 0x07, 0xfd, 0x80, 0x1a, 0x30, 0x93, 0x05,
3660x43, 0x07, 0x02, 0x80, 0x12, 0x53, 0x07, 0xfd, 0x80, 0x0d, 0x43, 0x07, 0x02, 0x80, 0x08, 0x53,
3670x07, 0xfd, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x12, 0x22, 0x78, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xef,
3680xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xff, 0x12, 0x21, 0xfb, 0xe0, 0xfe, 0x54,
3690x03, 0x70, 0x03, 0x02, 0x15, 0xd7, 0xee, 0x20, 0xe1, 0x03, 0x02, 0x15, 0xd4, 0x12, 0x22, 0x6e,
3700x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x15, 0x36, 0x00, 0x15, 0x6c, 0x01, 0x15, 0x6c, 0x03,
3710x15, 0xa0, 0x05, 0x15, 0xa0, 0x07, 0x15, 0x86, 0x09, 0x15, 0x86, 0x0b, 0x15, 0xba, 0x0d, 0x15,
3720xba, 0x0f, 0x00, 0x00, 0x15, 0xd7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x23, 0x90, 0xf9, 0x15, 0xe0,
3730x30, 0xe2, 0x0f, 0x30, 0xb1, 0x06, 0x53, 0x07, 0x7f, 0x02, 0x15, 0xd7, 0x43, 0x07, 0x80, 0x02,
3740x15, 0xd7, 0x30, 0x94, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x7d, 0x43, 0x07, 0x80, 0x80, 0x78, 0x30,
3750x92, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x70, 0x43, 0x07, 0x80, 0x80, 0x6b, 0xe5, 0x24, 0xb4, 0x03,
3760x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf,
3770xf0, 0x53, 0x07, 0x7f, 0x80, 0x51, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44,
3780x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x37,
3790xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff,
3800x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x43, 0x07, 0x80, 0x80, 0x1d, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90,
3810xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x43,
3820x07, 0x80, 0x80, 0x03, 0x53, 0x07, 0x7f, 0x78, 0x80, 0x12, 0x22, 0x3f, 0xe0, 0xfc, 0xa3, 0xe0,
3830xfd, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x20, 0x80, 0x03, 0x53, 0x07, 0xdf, 0xec, 0x30, 0xe3, 0x05,
3840x43, 0x07, 0x40, 0x80, 0x03, 0x53, 0x07, 0xbf, 0xec, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x10, 0x80,
3850x03, 0x53, 0x07, 0xef, 0xed, 0x30, 0xe4, 0x05, 0x43, 0x07, 0x08, 0x80, 0x03, 0x53, 0x07, 0xf7,
3860xed, 0x30, 0xe5, 0x05, 0x43, 0x07, 0x04, 0x80, 0x03, 0x53, 0x07, 0xfb, 0xed, 0x30, 0xe6, 0x05,
3870x43, 0x07, 0x01, 0x80, 0x03, 0x53, 0x07, 0xfe, 0xed, 0x30, 0xe7, 0x05, 0x43, 0x07, 0x02, 0x80,
3880x03, 0x53, 0x07, 0xfd, 0x78, 0x7e, 0x12, 0x22, 0x3f, 0xa3, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0x7f,
3890x00, 0x22, 0x90, 0xff, 0xfa, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x16, 0xf0, 0x90, 0xff, 0xf9, 0x74,
3900x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc,
3910xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x12, 0x18, 0xe2, 0xe5, 0x23, 0x30, 0xe7, 0x02, 0xd2,
3920x02, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x90, 0xfa, 0xcc, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5,
3930x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x7b,
3940x00, 0x7a, 0x00, 0x79, 0x23, 0x75, 0x2d, 0x00, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe5,
3950x23, 0x24, 0x80, 0x90, 0xff, 0xf8, 0xf0, 0xe5, 0x23, 0x64, 0x07, 0x60, 0x1e, 0xe5, 0x23, 0x64,
3960x06, 0x60, 0x18, 0xe5, 0x23, 0x64, 0x14, 0x60, 0x12, 0xe5, 0x23, 0x64, 0x41, 0x60, 0x0c, 0xe5,
3970x23, 0x64, 0x1a, 0x70, 0x46, 0xe5, 0x24, 0x64, 0x02, 0x70, 0x40, 0xe5, 0x23, 0xb4, 0x07, 0x16,
3980xd2, 0x94, 0xd2, 0x95, 0xd2, 0x92, 0xd2, 0x93, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x02, 0xf0, 0xa3,
3990xe0, 0x44, 0x02, 0xf0, 0x80, 0x1e, 0xe5, 0x23, 0xb4, 0x41, 0x12, 0x90, 0xf9, 0x15, 0xe0, 0x44,
4000x06, 0xf0, 0xa3, 0xe0, 0x44, 0x06, 0xf0, 0xd2, 0xb1, 0xd2, 0xb4, 0x80, 0x07, 0x90, 0xf9, 0x15,
4010xe0, 0x44, 0x01, 0xf0, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x23, 0x64, 0x42, 0x60,
4020x05, 0xe5, 0x23, 0xb4, 0x43, 0x0c, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x80, 0xf0, 0xa3, 0xe0, 0x44,
4030x80, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0x12, 0x18, 0xe2, 0x90, 0xff,
4040xf5, 0xe5, 0x23, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x33, 0xf5, 0x34, 0xf5, 0x32, 0x12, 0x1d, 0x84,
4050x12, 0x1c, 0x30, 0x12, 0x1d, 0x8b, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x43, 0x90, 0xf9, 0x6c, 0x12,
4060x1b, 0x43, 0x90, 0xff, 0xff, 0xe4, 0xf0, 0x90, 0xff, 0x83, 0xe0, 0xe4, 0xf0, 0x90, 0xff, 0x81,
4070x74, 0x80, 0xf0, 0xa3, 0x74, 0x84, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xe4, 0xf5, 0x23, 0xe5, 0x23,
4080x12, 0x1c, 0xa7, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x23, 0x12, 0x1c, 0xb5, 0xf5, 0x83, 0xe4, 0xf0,
4090x05, 0x23, 0xe5, 0x23, 0xb4, 0x07, 0xe7, 0x78, 0x7a, 0x76, 0xfe, 0x08, 0x76, 0xf0, 0x90, 0x31,
4100x4d, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xad, 0x07, 0x90, 0x31, 0x5a, 0xe4, 0x93, 0xff,
4110x08, 0xf6, 0xff, 0xed, 0x54, 0x0f, 0xfd, 0x12, 0x1c, 0x97, 0x74, 0x84, 0xf0, 0xed, 0x75, 0xf0,
4120x08, 0xa4, 0x24, 0x47, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xc3, 0x74, 0xf0,
4130x9f, 0x78, 0x7b, 0xf6, 0x74, 0xfe, 0x94, 0x00, 0x18, 0x12, 0x1c, 0x28, 0xce, 0xc3, 0x13, 0xce,
4140x13, 0xd8, 0xf9, 0xff, 0xed, 0x12, 0x1c, 0xf8, 0xef, 0xf0, 0xed, 0x12, 0x1d, 0x1e, 0xe4, 0xf5,
4150x23, 0xe5, 0x23, 0x90, 0x31, 0x47, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xe5, 0x23, 0x25, 0xe0,
4160x24, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x31, 0xf5, 0x83, 0xe4, 0x93, 0x08, 0xf6, 0xed, 0x30, 0xe7,
4170x53, 0x18, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0x97, 0x12, 0x1d, 0x06, 0x24, 0x47, 0xf5, 0x82,
4180xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe9, 0x12,
4190x1c, 0xf8, 0xef, 0xf0, 0x12, 0x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d,
4200x0b, 0x24, 0x45, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x12, 0x1d, 0x1e,
4210xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x46, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80,
4220xf0, 0x02, 0x18, 0xb7, 0x78, 0x78, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0xea, 0x12, 0x1d, 0x06,
4230x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8,
4240xf9, 0x12, 0x1d, 0x0b, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0x12,
4250x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 0x0b, 0x24, 0x05, 0xf5, 0x82,
4260xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82,
4270xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82,
4280xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0x64, 0x04, 0x60, 0x03, 0x02,
4290x17, 0xe1, 0x90, 0x31, 0x4c, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0x12, 0x1c, 0xe8, 0xe4, 0xf0,
4300x90, 0x31, 0x4b, 0x93, 0xff, 0xf6, 0x12, 0x1c, 0x95, 0xe4, 0xf0, 0x90, 0xff, 0xfd, 0x74, 0x05,
4310xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12,
4320x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0xe7, 0x09, 0xf6, 0x08,
4330xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83,
4340xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78,
4350xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3,
4360xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58,
4370x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa,
4380x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea,
4390x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83,
4400xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8,
4410xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a,
4420x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89,
4430x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0,
4440xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89,
4450x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60,
4460x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5,
4470x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x19,
4480x4c, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb,
4490xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82,
4500x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8,
4510xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82,
4520xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0,
4530x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82,
4540x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82,
4550xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xc5, 0xf0, 0xf8, 0xa3,
4560xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38,
4570xf0, 0x22, 0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02,
4580x15, 0x83, 0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82,
4590xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82,
4600xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0,
4610x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22,
4620xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7,
4630x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8,
4640xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5,
4650xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb,
4660xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xa4, 0x25, 0x82, 0xf5,
4670x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf9,
4680x22, 0xeb, 0xf6, 0x08, 0xea, 0xf6, 0x08, 0xe9, 0xf6, 0x22, 0xe0, 0xfb, 0xa3, 0xe0, 0xfa, 0xa3,
4690xe0, 0xf9, 0x22, 0xeb, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xe9, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82,
4700xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01,
4710x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3,
4720x80, 0xdf, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25,
4730x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0x74, 0x11, 0x12,
4740x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x06,
4750xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38,
4760xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 0x38, 0x04, 0x25,
4770x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a,
4780x38, 0x04, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x04, 0xe0, 0xab,
4790x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35,
4800x37, 0xf5, 0x37, 0x90, 0xff, 0x05, 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38,
4810x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x22, 0xf5, 0x83, 0xe0, 0x54,
4820x08, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xf5, 0x83, 0xef, 0xf0, 0xfd, 0x7c, 0x00, 0xc3,
4830x78, 0x7b, 0xe6, 0x9d, 0xf6, 0x18, 0xe6, 0x9c, 0xf6, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x03, 0x22,
4840x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 0x6f, 0x22, 0xe0, 0x44, 0x04, 0xf0, 0x74, 0x12,
4850x2f, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xe0, 0x22, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x7e,
4860x00, 0xc3, 0x90, 0xfa, 0xbd, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xbc, 0xe0, 0x9e, 0xf0, 0x90, 0xfa,
4870xb4, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5,
4880x4e, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb1, 0x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0,
4890xf5, 0x2e, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x04, 0xf5, 0x82, 0xe4,
4900x35, 0x83, 0xf5, 0x83, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe4,
4910x34, 0xff, 0xf5, 0x83, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x48, 0xf5, 0x82, 0xe4,
4920x34, 0xff, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0xff,
4930x22, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0xfc, 0x22, 0x90, 0xff, 0x00, 0xe0, 0x54, 0x1f, 0x22,
4940x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x75, 0x33, 0x00, 0x8f, 0x34, 0x90, 0xf9,
4950x6c, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x02, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00,
4960xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x41, 0xf5, 0x82,
4970xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x74, 0x80, 0xf0, 0x08, 0xe6, 0xff, 0xe9, 0x75, 0xf0, 0x08,
4980xa4, 0x22, 0x74, 0xaf, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0x22, 0x75, 0xf0,
4990x08, 0xa4, 0x24, 0x42, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x22, 0x90,
5000xff, 0x82, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x03, 0xf0, 0x90, 0xff,
5010xfc, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x78, 0x67, 0xe6, 0x54, 0xfd, 0xf6, 0x90, 0xff, 0xfd, 0x74,
5020x65, 0xf0, 0x22, 0x12, 0x1b, 0x1c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x22, 0x7b, 0x01, 0x7a,
5030xfa, 0x79, 0xb4, 0x22, 0x90, 0xff, 0x80, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0x83, 0xe0,
5040x54, 0x7f, 0xf0, 0x22, 0xe0, 0xff, 0x90, 0xf9, 0x67, 0x02, 0x1b, 0x3a, 0x90, 0xff, 0xa4, 0xe0,
5050x44, 0x02, 0xf0, 0x22, 0x75, 0x39, 0x01, 0x75, 0x3a, 0x09, 0x22, 0x7b, 0x01, 0x7a, 0xf9, 0x79,
5060x6f, 0x22, 0xd3, 0xe5, 0x3c, 0x94, 0x08, 0xe5, 0x3b, 0x94, 0x01, 0x22, 0x90, 0xfa, 0xbb, 0xe0,
5070xff, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xef, 0x22, 0x90, 0xff, 0xb4,
5080xe0, 0x54, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x88, 0xef, 0xf6, 0x12, 0x2a, 0x06, 0x12, 0x22,
5090x4a, 0x8e, 0x83, 0x24, 0x09, 0x12, 0x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x0a,
5100x12, 0x22, 0x52, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x0b, 0x12, 0x1a, 0x4a, 0x12,
5110x22, 0x4a, 0xf5, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x53, 0x12, 0x22, 0x56, 0x24,
5120x04, 0x12, 0x21, 0xf3, 0xe0, 0xf5, 0x54, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x55,
5130xe5, 0x53, 0xc4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x78, 0x88, 0xf6, 0xd3, 0x94, 0x00, 0x40, 0x06,
5140xe5, 0x54, 0x30, 0xe1, 0x01, 0x06, 0x78, 0x88, 0xe6, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x0c, 0xef,
5150x12, 0x1a, 0x4a, 0x78, 0x80, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x53,
5160x07, 0x0c, 0x53, 0x06, 0xe6, 0xe5, 0x53, 0x30, 0xe5, 0x03, 0x43, 0x07, 0x01, 0xe5, 0x54, 0x20,
5170xe5, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, 0x07, 0x02,
5180xe5, 0x53, 0x30, 0xe3, 0x03, 0x43, 0x07, 0x10, 0xe5, 0x53, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x20,
5190xe5, 0x53, 0x54, 0x03, 0x60, 0x03, 0x43, 0x07, 0x40, 0xe5, 0x53, 0x30, 0xe1, 0x03, 0x43, 0x07,
5200x80, 0xe5, 0x53, 0x30, 0xe4, 0x03, 0x43, 0x06, 0x01, 0xe5, 0x53, 0x30, 0xe6, 0x03, 0x43, 0x06,
5210x08, 0xe5, 0x54, 0x20, 0xe4, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7,
5220x03, 0x43, 0x06, 0x10, 0x53, 0x07, 0xfb, 0x53, 0x06, 0x79, 0x90, 0x00, 0x05, 0xee, 0x8f, 0xf0,
5230x12, 0x1a, 0xef, 0xe5, 0x55, 0x30, 0xe3, 0x12, 0x54, 0x30, 0xff, 0xc4, 0x54, 0x0f, 0x12, 0x22,
5240x2c, 0x90, 0x00, 0x08, 0xef, 0x12, 0x1a, 0x4a, 0x80, 0x0a, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x08,
5250xe4, 0x12, 0x1a, 0x4a, 0xe5, 0x55, 0x54, 0x03, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x07, 0xef, 0x12,
5260x1a, 0x4a, 0xe5, 0x55, 0x54, 0x04, 0xff, 0xc3, 0x13, 0x90, 0x00, 0x09, 0x12, 0x1a, 0x4a, 0x90,
5270x00, 0x07, 0x12, 0x1a, 0x0b, 0x70, 0x13, 0x12, 0x22, 0x2d, 0xe9, 0x24, 0x09, 0xf9, 0xe4, 0x3a,
5280xfa, 0x12, 0x19, 0xf2, 0xff, 0xc3, 0x13, 0x12, 0x1a, 0x38, 0x12, 0x22, 0x78, 0x24, 0x08, 0x12,
5290x21, 0xf3, 0xe0, 0xfe, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0,
5300xfd, 0xee, 0xed, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x03, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0xef, 0x12,
5310x31, 0xc7, 0x7d, 0x0a, 0xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0x90, 0xfa, 0xe3, 0xe0,
5320xb4, 0x03, 0x06, 0x7e, 0x00, 0x7f, 0x40, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x08, 0x90, 0xfa, 0xd7,
5330xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xff, 0x7e, 0x00, 0x90, 0xfa,
5340xd3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x70, 0x03, 0x7f, 0x08, 0x22, 0x90, 0x00, 0x08, 0x12, 0x1a,
5350x98, 0xff, 0x90, 0xfa, 0xd5, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xae, 0x02, 0xaf, 0x01, 0x8e,
5360x50, 0x8f, 0x51, 0x74, 0x0a, 0x25, 0x51, 0xf5, 0x51, 0xe4, 0x35, 0x50, 0xf5, 0x50, 0x90, 0xfa,
5370xd8, 0xe0, 0xff, 0x14, 0xfe, 0x90, 0xfa, 0xd6, 0xe0, 0x5e, 0xfe, 0xc3, 0xef, 0x9e, 0xff, 0x90,
5380xfa, 0xda, 0xf0, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0x90, 0xfa, 0xd3, 0xe0, 0x94, 0x00, 0x50,
5390x06, 0xa3, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03, 0xe0, 0xff, 0x22, 0x12,
5400x2d, 0x5a, 0x90, 0xfa, 0xd3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x60, 0x2b, 0x90, 0xfa, 0xd7,
5410xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x07, 0xe0, 0x90, 0xfa, 0xda,
5420xf0, 0x80, 0x08, 0x90, 0xfa, 0xd4, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03,
5430xe0, 0xff, 0x22, 0x12, 0x2d, 0x5a, 0x80, 0xca, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x52, 0xe4, 0xf5,
5440x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7f, 0x00, 0x22, 0xaa, 0x50, 0xa9, 0x51, 0x7b,
5450x01, 0x90, 0xfa, 0xd5, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xda, 0xe0, 0xf5, 0x4a, 0x12,
5460x28, 0x9f, 0x90, 0xfa, 0xd9, 0xef, 0xf0, 0x22, 0xef, 0x24, 0xae, 0x60, 0x52, 0x24, 0xfe, 0x60,
5470x2e, 0x24, 0xfe, 0x70, 0x03, 0x02, 0x20, 0xbb, 0x24, 0x06, 0x60, 0x03, 0x02, 0x21, 0x03, 0x78,
5480x71, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xa5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x33,
5490x90, 0xfa, 0x91, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xaf, 0x74, 0x01, 0xf0, 0x22, 0x78,
5500x72, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xb5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x43,
5510x90, 0xfa, 0x93, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb0, 0x74, 0x01, 0xf0, 0x22, 0x90,
5520xfa, 0x9d, 0xe0, 0xa3, 0x20, 0xe5, 0x03, 0x02, 0x21, 0x03, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa,
5530xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca, 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff,
5540xa6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa,
5550xcb, 0xe0, 0xff, 0x74, 0x34, 0xfe, 0x12, 0x2c, 0xb4, 0xef, 0x70, 0x57, 0x90, 0xfa, 0xcb, 0xe0,
5560xff, 0x74, 0x34, 0x90, 0xfa, 0x95, 0xf0, 0xef, 0xa3, 0xf0, 0x22, 0x90, 0xfa, 0xa7, 0xe0, 0xa3,
5570x30, 0xe5, 0x40, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca,
5580xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xb6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xb6,
5590xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0xfe, 0x12,
5600x2c, 0xb4, 0xef, 0x70, 0x0e, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0x90, 0xfa, 0x97, 0xf0,
5610xef, 0xa3, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0,
5620x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0,
5630x07, 0x90, 0xff, 0x92, 0xe0, 0xff, 0x90, 0xfa, 0xc9, 0xf0, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0xef,
5640x12, 0x1b, 0x4c, 0x21, 0xbb, 0x26, 0x21, 0xbb, 0x2e, 0x21, 0x5e, 0x30, 0x21, 0x5e, 0x32, 0x21,
5650x6c, 0x38, 0x21, 0x7e, 0x3a, 0x21, 0xb0, 0x3e, 0x21, 0x9b, 0x44, 0x21, 0x90, 0x46, 0x21, 0xa6,
5660x50, 0x21, 0xa6, 0x52, 0x21, 0xa6, 0x54, 0x21, 0xa6, 0x56, 0x00, 0x00, 0x21, 0xc0, 0x90, 0xfa,
5670xc9, 0xe0, 0xfd, 0x7c, 0x00, 0x7f, 0x01, 0x12, 0x11, 0x16, 0x80, 0x62, 0x7c, 0x00, 0x7d, 0x01,
5680x7f, 0x03, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x50, 0x7c, 0x00,
5690x7d, 0x01, 0x7f, 0x02, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x3e,
5700x7c, 0x00, 0x7d, 0x01, 0x7f, 0x05, 0x12, 0x11, 0x16, 0x80, 0x33, 0x7c, 0x00, 0x7d, 0x01, 0x7f,
5710x06, 0x12, 0x11, 0x16, 0x80, 0x28, 0x90, 0xfa, 0xc9, 0xe0, 0xff, 0x12, 0x20, 0x18, 0x80, 0x1e,
5720x7c, 0x00, 0x7d, 0x01, 0x7f, 0x04, 0x12, 0x11, 0x16, 0x80, 0x13, 0x12, 0x27, 0x8d, 0x80, 0x0e,
5730x90, 0xfa, 0xc9, 0xe0, 0x24, 0x00, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0x12, 0x2c, 0xb4, 0xd0, 0x07,
5740xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0,
5750xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x24,
5760x04, 0x8e, 0x83, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x74, 0x12, 0x25, 0x24, 0xf5,
5770x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e,
5780x83, 0x22, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0x7b,
5790xff, 0x7a, 0x31, 0x79, 0x99, 0x7e, 0x00, 0x7f, 0x0a, 0x02, 0x19, 0xcc, 0xff, 0x90, 0xf9, 0x6c,
5800x02, 0x1b, 0x3a, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x04, 0x02, 0x1a, 0x0b, 0xe6,
5810xfc, 0x08, 0xe6, 0xf5, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0x22, 0x78, 0x7e, 0xe6, 0xfe, 0x08, 0xe6,
5820xff, 0x22, 0xed, 0x12, 0x1a, 0x4a, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x22, 0xef, 0xf0, 0x90,
5830xfa, 0xcb, 0xe0, 0x54, 0x0f, 0x4e, 0xfe, 0xf0, 0xef, 0x54, 0xf0, 0x4e, 0xf0, 0x22, 0x08, 0xe6,
5840xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x09, 0x22, 0x78, 0x7e, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x8c,
5850x83, 0x22, 0xa6, 0x07, 0xe6, 0x24, 0x6e, 0xf8, 0xe6, 0x22, 0x78, 0x7e, 0xe6, 0xfa, 0x08, 0xe6,
5860xfb, 0x22, 0x26, 0xf6, 0x18, 0xee, 0x36, 0xf6, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe5, 0x82, 0x22,
5870x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0x8d, 0x28, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, 0xa3, 0x74, 0x02,
5880xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5,
5890x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xce, 0xe0, 0x65, 0x28, 0x60, 0x46, 0xa3, 0xe0,
5900xff, 0xa3, 0xe0, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xce, 0xe0,
5910xff, 0x90, 0xfa, 0xd1, 0xe4, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xd1,
5920xe0, 0xff, 0xa3, 0xe0, 0x90, 0xfa, 0xcf, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xfa, 0xce, 0xe0,
5930xa3, 0x75, 0xf0, 0x00, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x04, 0x12, 0x1a,
5940x6c, 0x02, 0x22, 0xb1, 0x90, 0xfa, 0xd0, 0xe0, 0x24, 0x01, 0xff, 0x90, 0xfa, 0xcf, 0xe0, 0x34,
5950x00, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x8f, 0xf0, 0x12, 0x1a, 0xd0, 0x7f, 0x00, 0x22, 0x7b,
5960x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x6c, 0x85,
5970xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0x8f, 0x62, 0x12, 0x2a, 0x06, 0x12, 0x22,
5980x4a, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x02, 0xf0, 0x08,
5990x12, 0x22, 0x3f, 0xe0, 0xa3, 0x30, 0xe5, 0x0c, 0x12, 0x22, 0x56, 0x24, 0x0b, 0x12, 0x21, 0xf3,
6000xe0, 0x44, 0x01, 0xf0, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xf5, 0x82, 0x8e, 0x83, 0xe0,
6010x54, 0xb8, 0xfd, 0xf0, 0xe5, 0x62, 0x24, 0xfe, 0x44, 0x20, 0xfc, 0x4d, 0xf0, 0xe5, 0x82, 0x24,
6020x04, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xb8, 0xf0, 0x4c, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0x74,
6030x03, 0xf0, 0x18, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x05, 0x12, 0x21, 0xf3, 0xc0,
6040x83, 0xc0, 0x82, 0xe0, 0xfd, 0x74, 0x96, 0x25, 0x62, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83,
6050xe0, 0x54, 0xfc, 0x44, 0x03, 0xfc, 0xed, 0x4c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e,
6060x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0,
6070x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x62, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, 0x12,
6080x10, 0x03, 0x7f, 0x02, 0x12, 0x12, 0x19, 0x78, 0x67, 0xe6, 0x44, 0x02, 0xf6, 0xd2, 0xb0, 0xd2,
6090xb1, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe7, 0x07, 0x90, 0xff, 0x9e, 0xe4, 0xf0, 0x80, 0x36, 0xd2,
6100xb3, 0x90, 0xff, 0xa4, 0xe0, 0x90, 0xfa, 0x7b, 0xf0, 0x90, 0xff, 0xb4, 0xe0, 0x90, 0xfa, 0x7c,
6110xf0, 0x90, 0xff, 0xa2, 0xe0, 0x90, 0xfa, 0x79, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x90, 0xfa, 0x7a,
6120xf0, 0x90, 0xff, 0xa4, 0x74, 0x30, 0xf0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xff, 0xa2, 0x74, 0x40,
6130xf0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xfa, 0xe4, 0xe5, 0xa8, 0xf0, 0x75, 0xa8, 0x81, 0x90, 0xff,
6140x92, 0xe0, 0x60, 0x04, 0xe4, 0xf0, 0x80, 0xf6, 0x90, 0xff, 0xfd, 0x74, 0x3a, 0xf0, 0x43, 0x87,
6150x01, 0x00, 0x00, 0x00, 0x90, 0xfa, 0x7b, 0xe0, 0x90, 0xff, 0xa4, 0xf0, 0x90, 0xfa, 0x7c, 0xe0,
6160x90, 0xff, 0xb4, 0xf0, 0x90, 0xfa, 0x79, 0xe0, 0x90, 0xff, 0xa2, 0xf0, 0x90, 0xfa, 0x7a, 0xe0,
6170x90, 0xff, 0xb2, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x60, 0x02, 0xc2, 0xb3, 0x90, 0xfa, 0xe4, 0xe0,
6180xf5, 0xa8, 0x02, 0x10, 0x86, 0x8b, 0x5c, 0x8a, 0x5d, 0x89, 0x5e, 0x12, 0x2d, 0x3c, 0x90, 0xfa,
6190xc0, 0x12, 0x1b, 0x43, 0xaa, 0x5d, 0xa9, 0x5e, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x43, 0x90, 0xfa,
6200xc4, 0xe4, 0x75, 0xf0, 0x0a, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x3a, 0xe9, 0x24,
6210x01, 0xf9, 0xe4, 0x3a, 0xfa, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xab, 0x5c, 0xaa, 0x5d, 0xa9,
6220x5e, 0x12, 0x2d, 0x48, 0xe0, 0xff, 0xc3, 0x13, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0xfa, 0xbe,
6230xe0, 0xff, 0x78, 0x82, 0xe6, 0xc3, 0x9f, 0x50, 0x4a, 0x90, 0xfa, 0xc0, 0x12, 0x2d, 0x1d, 0xff,
6240x78, 0x83, 0xf6, 0x90, 0xfa, 0xc3, 0x12, 0x2d, 0x1d, 0xfe, 0xf4, 0x5f, 0xff, 0x78, 0x83, 0xf6,
6250x12, 0x2d, 0x1a, 0x5e, 0x4f, 0xff, 0x78, 0x83, 0xf6, 0x12, 0x2d, 0x23, 0x75, 0xf0, 0x02, 0x12,
6260x1a, 0x6c, 0x90, 0xfa, 0xc4, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0xab, 0x5c, 0xaa, 0x5d,
6270xa9, 0x5e, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x0b, 0x30, 0xe4, 0x03, 0x12, 0x2d, 0x32, 0x78, 0x82,
6280x06, 0x80, 0xaa, 0xe4, 0x90, 0xfa, 0xbf, 0xf0, 0x22, 0x8b, 0x56, 0x8a, 0x57, 0x89, 0x58, 0x90,
6290xfa, 0xbf, 0x74, 0x06, 0xf0, 0xe4, 0x90, 0xfa, 0xbe, 0xf0, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60,
6300x26, 0x14, 0x70, 0x70, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x12, 0x12, 0x24, 0x95,
6310x80, 0x62, 0x12, 0x2d, 0x53, 0x12, 0x1f, 0x2c, 0x90, 0xfa, 0xbf, 0xef, 0xf0, 0x80, 0x55, 0x90,
6320xfa, 0xbf, 0x74, 0x81, 0xf0, 0x80, 0x4d, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x3e,
6330x12, 0x2c, 0x5f, 0x80, 0x3f, 0xe5, 0x58, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x57, 0xfa, 0x7b, 0x01,
6340xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xfd,
6350x90, 0x00, 0x08, 0x12, 0x1a, 0x98, 0xf5, 0x2e, 0x85, 0xf0, 0x2d, 0xd0, 0x01, 0xd0, 0x02, 0xd0,
6360x03, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xbe, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0x80, 0x06, 0x90, 0xfa,
6370xbf, 0x74, 0x81, 0xf0, 0x90, 0xfa, 0xbf, 0xe0, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x02, 0x12, 0x1a,
6380x4a, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x22, 0x8b, 0x29, 0x8a, 0x2a, 0x89, 0x2b, 0x8d, 0x2c, 0xe5,
6390x2c, 0x70, 0x03, 0xaf, 0x2c, 0x22, 0x12, 0x2d, 0x82, 0x70, 0x16, 0x12, 0x2d, 0xa1, 0xe5, 0x2d,
6400x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x26, 0x64, 0x40, 0x0b, 0x7f, 0x00,
6410x22, 0x12, 0x2d, 0xa1, 0x12, 0x26, 0x64, 0x50, 0xf8, 0x90, 0xff, 0xf3, 0x74, 0xa1, 0xf0, 0xe5,
6420x2c, 0xb4, 0x01, 0x07, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0xf1, 0xe4, 0xf0,
6430xf5, 0x2f, 0xe5, 0x2c, 0x14, 0xff, 0xe5, 0x2f, 0xc3, 0x9f, 0x50, 0x2a, 0x12, 0x31, 0x04, 0x40,
6440x03, 0xaf, 0x2f, 0x22, 0xc3, 0xe5, 0x2c, 0x95, 0x2f, 0xff, 0xbf, 0x02, 0x07, 0x90, 0xff, 0xf0,
6450xe0, 0x44, 0x02, 0xf0, 0x12, 0x2d, 0x94, 0x05, 0x2f, 0x74, 0x01, 0x25, 0x2b, 0xf5, 0x2b, 0xe4,
6460x35, 0x2a, 0xf5, 0x2a, 0x80, 0xcc, 0x12, 0x31, 0x04, 0x40, 0x03, 0x7f, 0x18, 0x22, 0x12, 0x2d,
6470x94, 0xaf, 0x2c, 0x22, 0x90, 0xff, 0xf1, 0xe5, 0x2e, 0xf0, 0x02, 0x31, 0x1b, 0x12, 0x10, 0x03,
6480x78, 0x84, 0x12, 0x22, 0x82, 0x30, 0xe1, 0x08, 0x7f, 0x13, 0x12, 0x30, 0xec, 0x02, 0x26, 0xfb,
6490x78, 0x84, 0xe6, 0xf9, 0x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xff, 0x30, 0xe7, 0x40, 0x54, 0x03,
6500x60, 0x1e, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x44, 0x04,
6510xf0, 0x80, 0x46, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x80, 0x39,
6520xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x80,
6530x28, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1b, 0xef, 0x54,
6540x03, 0x60, 0x14, 0xe9, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x07,
6550x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 0xf0, 0xc2, 0xb3, 0x90, 0xf9, 0x17, 0xe0, 0x04, 0xf0, 0xaf,
6560x01, 0x12, 0x22, 0x33, 0xfd, 0x12, 0x2f, 0x49, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x75, 0xa8,
6570x40, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x8b, 0x02, 0x27, 0x48, 0x02, 0x30, 0xcf,
6580xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4,
6590x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f,
6600x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b,
6610x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x2b, 0x4c, 0xe4, 0x7e, 0x01, 0x93, 0x60,
6620xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01,
6630x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93,
6640xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8,
6650xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xe4, 0xf5, 0x22,
6660x12, 0x1d, 0x12, 0xe0, 0xb4, 0x04, 0x0d, 0xe5, 0x22, 0x24, 0x03, 0xff, 0x12, 0x2f, 0x77, 0x12,
6670x1d, 0x12, 0xe4, 0xf0, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x02, 0x40, 0xe3, 0xe4, 0xf5, 0x22,
6680x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1d, 0x53, 0x60, 0x2c, 0x12, 0x2c, 0xb4,
6690xef, 0x60, 0x52, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1b, 0x1c, 0xe4, 0xf0,
6700xa3, 0xf0, 0x75, 0xf0, 0x0a, 0xe5, 0x22, 0x90, 0xfa, 0x9d, 0x12, 0x1b, 0x1c, 0xe0, 0xa3, 0x30,
6710xe6, 0x33, 0x12, 0x1d, 0x12, 0x74, 0x04, 0xf0, 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa,
6720x95, 0x12, 0x1d, 0x53, 0x60, 0x16, 0x12, 0x2c, 0xb4, 0xef, 0x60, 0x19, 0x75, 0xf0, 0x02, 0xe5,
6730x22, 0x90, 0xfa, 0x95, 0x12, 0x1b, 0x1c, 0xe4, 0xf0, 0xa3, 0xf0, 0x22, 0x05, 0x22, 0xe5, 0x22,
6740xc3, 0x94, 0x02, 0x40, 0x9b, 0x22, 0xe4, 0xff, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xfe, 0xef,
6750xc3, 0x9e, 0x50, 0x17, 0x74, 0xf0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xe0, 0x12,
6760x1c, 0x11, 0x12, 0x1a, 0x38, 0x0f, 0x12, 0x1c, 0x00, 0x80, 0xdd, 0xef, 0xfd, 0xc3, 0xe5, 0x3a,
6770x9d, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 0xd3, 0xe5, 0x3a, 0x94, 0x00, 0xe5, 0x39,
6780x94, 0x00, 0x40, 0x06, 0xe4, 0x90, 0xff, 0x83, 0xf0, 0x22, 0x12, 0x1d, 0x2f, 0x12, 0x1d, 0x84,
6790x12, 0x1d, 0x76, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60, 0x1e, 0x14, 0x60, 0x1b, 0x24, 0x8e, 0x70,
6800x2d, 0x90, 0x00, 0x01, 0x12, 0x1a, 0x0b, 0xff, 0x24, 0xfc, 0x60, 0x03, 0x04, 0x70, 0x1f, 0xef,
6810xfd, 0x7c, 0x00, 0x7f, 0x0d, 0x02, 0x11, 0x16, 0x12, 0x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c,
6820xd9, 0x12, 0x1a, 0x0b, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff, 0x12, 0x31, 0xb1, 0x22, 0x8b,
6830x45, 0x8a, 0x46, 0x89, 0x47, 0x8c, 0x48, 0x8d, 0x49, 0xd2, 0x00, 0x12, 0x2d, 0x82, 0x70, 0x16,
6840x12, 0x2d, 0xa1, 0xe5, 0x48, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x29,
6850x14, 0x40, 0x0b, 0x7f, 0x18, 0x22, 0x12, 0x2d, 0xa1, 0x12, 0x29, 0x14, 0x50, 0xf8, 0xe4, 0xf5,
6860x4b, 0xe5, 0x4a, 0x14, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, 0x17, 0x12, 0x29, 0x04, 0x40, 0x03,
6870x7f, 0x18, 0x22, 0x05, 0x4b, 0x74, 0x01, 0x25, 0x47, 0xf5, 0x47, 0xe4, 0x35, 0x46, 0xf5, 0x46,
6880x80, 0xdf, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x29, 0x04, 0x40, 0x03, 0x7f, 0x18,
6890x22, 0x7f, 0x00, 0x22, 0xab, 0x45, 0xaa, 0x46, 0xa9, 0x47, 0x12, 0x19, 0xf2, 0x90, 0xff, 0xf1,
6900xf0, 0x02, 0x31, 0x1b, 0x90, 0xff, 0xf1, 0xe5, 0x49, 0xf0, 0x02, 0x31, 0x1b, 0x7b, 0x01, 0x7a,
6910xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x09, 0x12,
6920x1a, 0x6c, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12,
6930x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xff, 0xf7, 0xe5,
6940x23, 0x12, 0x29, 0x78, 0x90, 0xff, 0xf6, 0xe5, 0x23, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3,
6950x74, 0x06, 0x12, 0x29, 0x78, 0xe5, 0x23, 0x30, 0xe0, 0x07, 0x90, 0xff, 0xfc, 0x74, 0x94, 0xf0,
6960x22, 0x90, 0xff, 0xfc, 0x74, 0x90, 0xf0, 0x22, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90,
6970xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01,
6980x02, 0x25, 0xd7, 0x90, 0xff, 0x93, 0x74, 0x2a, 0xf0, 0x90, 0xff, 0xff, 0xe0, 0x60, 0x06, 0x90,
6990xff, 0xfc, 0x74, 0x10, 0xf0, 0x90, 0xff, 0x91, 0xe0, 0x44, 0x90, 0xf0, 0xe4, 0x90, 0xf9, 0x15,
7000xf0, 0xa3, 0xf0, 0x12, 0x2a, 0x78, 0x12, 0x16, 0x42, 0x12, 0x2f, 0xcd, 0x7e, 0x07, 0x7f, 0xd0,
7010x12, 0x11, 0xe2, 0x7e, 0x0f, 0x7f, 0xa0, 0x12, 0x11, 0xfc, 0xe4, 0x78, 0x77, 0xf6, 0x78, 0x77,
7020xe6, 0xff, 0xc3, 0x94, 0x06, 0x50, 0x0b, 0x74, 0x6e, 0x2f, 0xf8, 0xe4, 0xf6, 0x78, 0x77, 0x06,
7030x80, 0xec, 0x7f, 0x03, 0x12, 0x2e, 0xb3, 0x90, 0xf9, 0x15, 0xe0, 0x20, 0xe4, 0x05, 0x7f, 0x04,
7040x12, 0x2e, 0xb3, 0x90, 0xff, 0x9b, 0xe4, 0xf0, 0x90, 0xff, 0x9a, 0xf0, 0x90, 0xff, 0xe8, 0xe0,
7050x54, 0x1f, 0xf0, 0xd2, 0xa8, 0x22, 0x15, 0x65, 0xa8, 0x65, 0xa6, 0x07, 0x30, 0x08, 0x05, 0x12,
7060x11, 0x66, 0x80, 0xf8, 0xd2, 0x08, 0xa8, 0x65, 0xe6, 0xff, 0xb4, 0x03, 0x0f, 0x78, 0x7c, 0x76,
7070xff, 0x08, 0x76, 0xe0, 0x08, 0x76, 0xff, 0x08, 0x76, 0xa0, 0x80, 0x0d, 0x78, 0x7c, 0x76, 0xff,
7080x08, 0x76, 0xe2, 0x08, 0x76, 0xff, 0x08, 0x76, 0xb0, 0x78, 0x80, 0x76, 0xfa, 0x08, 0x76, 0x9b,
7090xef, 0x24, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0xae, 0xf0, 0x12, 0x22, 0x92, 0x7b, 0x01, 0x7a, 0xff,
7100x79, 0x48, 0x78, 0x68, 0x12, 0x1b, 0x31, 0xa8, 0x65, 0xe6, 0x24, 0xfd, 0x75, 0xf0, 0x08, 0xa4,
7110xff, 0xae, 0xf0, 0x78, 0x6a, 0x12, 0x22, 0x92, 0x79, 0x08, 0x78, 0x6b, 0x12, 0x1b, 0x31, 0x78,
7120x6d, 0xef, 0x12, 0x22, 0x92, 0x05, 0x65, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xab, 0xf0, 0xe0,
7130x44, 0x20, 0xf0, 0x90, 0xfa, 0xe3, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4,
7140xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7e, 0x00, 0x90, 0xfa, 0xe1, 0xee, 0xf0,
7150xa3, 0xef, 0xf0, 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x52, 0x09, 0x90, 0xf9,
7160x15, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x29, 0x90, 0xfa, 0xe1, 0xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64,
7170x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x10, 0x09, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x10,
7180xf0, 0x80, 0x0d, 0x90, 0xfa, 0xe3, 0x74, 0x03, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x54, 0xef, 0xf0,
7190x90, 0xff, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x22, 0x12, 0x10, 0x03, 0x78, 0x8a, 0xef, 0xf6, 0x12,
7200x2a, 0x06, 0x12, 0x22, 0x33, 0x30, 0xe0, 0x25, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x7f, 0xf0, 0x78,
7210x6b, 0x12, 0x1b, 0x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0x09, 0x90, 0x00, 0x02,
7220xe4, 0x12, 0x1a, 0x4a, 0x80, 0xe9, 0x12, 0x22, 0x07, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x22, 0x33,
7230x30, 0xe1, 0x1e, 0x12, 0x21, 0xe9, 0xe0, 0x54, 0x7f, 0xf0, 0x12, 0x31, 0x5c, 0x78, 0x68, 0x12,
7240x1b, 0x28, 0x90, 0x00, 0x02, 0x74, 0x80, 0x12, 0x1a, 0x4a, 0x12, 0x21, 0xe9, 0xe0, 0x44, 0x80,
7250xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x03, 0x68, 0x01, 0xff,
7260x48, 0x03, 0x6b, 0x01, 0xff, 0x08, 0x02, 0x66, 0x00, 0x00, 0x44, 0xfa, 0x95, 0x00, 0x00, 0x00,
7270x00, 0x44, 0xfa, 0x91, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xaf, 0x00, 0x00, 0x42, 0xfa, 0x7b,
7280x00, 0x00, 0x42, 0xfa, 0x79, 0x00, 0x00, 0x42, 0xf9, 0x6a, 0xff, 0xff, 0x42, 0xfa, 0x77, 0x00,
7290x00, 0x43, 0xf9, 0x18, 0x0a, 0x32, 0x02, 0x41, 0xf9, 0x65, 0x20, 0x41, 0xf9, 0x66, 0x20, 0x41,
7300xf9, 0x63, 0x00, 0x41, 0xf9, 0x64, 0x00, 0x44, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xf9,
7310x15, 0x00, 0x00, 0x41, 0xf9, 0x17, 0x00, 0x01, 0x20, 0x00, 0x41, 0xf8, 0x04, 0x00, 0x00, 0x12,
7320x10, 0x03, 0x78, 0x85, 0xef, 0xf6, 0x12, 0x30, 0x93, 0x12, 0x30, 0xec, 0x78, 0x85, 0xe6, 0xff,
7330x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xfe, 0x30, 0xe7, 0x16, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff,
7340x9e, 0xe0, 0x54, 0xfa, 0xf0, 0x80, 0x22, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf5, 0xf0, 0x80, 0x19,
7350xee, 0x54, 0x03, 0x60, 0x14, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0,
7360x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x14, 0xf0, 0xe0,
7370x70, 0x02, 0xd2, 0xb3, 0x02, 0x10, 0x86, 0x12, 0x1d, 0x6c, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04,
7380xe5, 0x39, 0x64, 0x01, 0x60, 0x48, 0xc3, 0xe5, 0x3a, 0x94, 0x08, 0xe5, 0x39, 0x94, 0x00, 0x40,
7390x11, 0x7f, 0x08, 0xef, 0xe5, 0x3a, 0x94, 0x08, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39,
7400x80, 0x05, 0xaf, 0x3a, 0x12, 0x1d, 0x84, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x19, 0x12, 0x1c,
7410x11, 0x12, 0x19, 0xf2, 0xfd, 0x74, 0xf8, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xed,
7420xf0, 0x0e, 0x12, 0x1c, 0x00, 0x80, 0xe2, 0xef, 0x54, 0x7f, 0x90, 0xff, 0x81, 0xf0, 0x22, 0x8b,
7430x59, 0x8a, 0x5a, 0x89, 0x5b, 0x12, 0x2d, 0x48, 0x70, 0x05, 0xa3, 0x74, 0x08, 0xf0, 0x22, 0xab,
7440x59, 0xaa, 0x5a, 0xa9, 0x5b, 0x12, 0x2d, 0x3c, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xe5, 0x5b,
7450x24, 0x03, 0xf9, 0xe4, 0x35, 0x5a, 0xfa, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x43, 0xe4, 0x90, 0xfa,
7460xbf, 0xf0, 0x78, 0x8b, 0xf6, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x78, 0x8b, 0xe6, 0xc3, 0x9f, 0x50,
7470x12, 0x12, 0x2d, 0x1a, 0xff, 0x12, 0x2d, 0x23, 0x12, 0x2d, 0x36, 0x78, 0x8b, 0x06, 0x12, 0x2d,
7480x32, 0x80, 0xe2, 0x22, 0xad, 0x07, 0xac, 0x06, 0x90, 0x31, 0x4d, 0xe4, 0x93, 0xff, 0x78, 0x74,
7490xf6, 0x54, 0x0f, 0x12, 0x1c, 0xf8, 0xe0, 0x08, 0x76, 0x00, 0x08, 0xf6, 0x18, 0x12, 0x1c, 0x29,
7500xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x78, 0x75, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0xee,
7510x44, 0xf8, 0x18, 0xf6, 0xef, 0x08, 0xf6, 0x90, 0xff, 0x7a, 0xe0, 0x20, 0xe7, 0x03, 0x7f, 0x00,
7520x22, 0x78, 0x75, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0,
7530x90, 0xff, 0x7a, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x90,
7540x00, 0x03, 0x12, 0x1a, 0x0b, 0x54, 0xf0, 0x24, 0xa0, 0x22, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x3a,
7550x02, 0x19, 0xf2, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x3a, 0xef, 0x12, 0x1a, 0x38, 0x90, 0xfa, 0xc7,
7560xe4, 0x22, 0x90, 0xfa, 0xc1, 0xe4, 0x75, 0xf0, 0x01, 0x02, 0x1a, 0x6c, 0x90, 0x00, 0x08, 0x12,
7570x1a, 0x98, 0xaa, 0xf0, 0xf9, 0x7b, 0x01, 0x22, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0x90, 0xfa,
7580xbe, 0xf0, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x22, 0x90, 0xfa, 0xda, 0xe0, 0xff, 0x7e,
7590x00, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xd3, 0xe0, 0x9e, 0xf0, 0x90, 0xfa,
7600xd5, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x51, 0xf5, 0x51, 0xee, 0x35, 0x50, 0xf5,
7610x50, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0xfa, 0xe3,
7620xe0, 0x64, 0x03, 0x22, 0x90, 0xff, 0xf2, 0xe0, 0xab, 0x29, 0xaa, 0x2a, 0xa9, 0x2b, 0x02, 0x1a,
7630x38, 0x90, 0xff, 0xf3, 0x74, 0xa0, 0xf0, 0x22, 0x8f, 0x64, 0xed, 0x70, 0x0f, 0xe5, 0x64, 0xb4,
7640x03, 0x05, 0x7f, 0x01, 0x02, 0x31, 0x32, 0x7f, 0x02, 0x02, 0x31, 0x32, 0xaf, 0x64, 0x12, 0x2a,
7650x06, 0x74, 0x6e, 0x25, 0x64, 0xf8, 0xe6, 0x30, 0xe2, 0x0b, 0xd2, 0x09, 0x12, 0x1c, 0x83, 0xe0,
7660x54, 0x7f, 0xf0, 0x80, 0x02, 0xc2, 0x09, 0xe5, 0x64, 0xb4, 0x03, 0x07, 0x7f, 0x81, 0x12, 0x31,
7670x32, 0x80, 0x05, 0x7f, 0x82, 0x12, 0x31, 0x32, 0x30, 0x09, 0x07, 0x12, 0x1c, 0x83, 0xe0, 0x44,
7680x80, 0xf0, 0x12, 0x31, 0xc7, 0x22, 0x12, 0x10, 0x03, 0x90, 0xff, 0xfd, 0xe0, 0x44, 0x60, 0xf0,
7690xd2, 0x01, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0x00, 0xe0, 0x30, 0xe7, 0x13,
7700x90, 0xff, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x35, 0x80, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x01,
7710xf0, 0x80, 0x0d, 0x12, 0x1d, 0x2f, 0x53, 0x35, 0x7f, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0xfe, 0xf0,
7720x90, 0xff, 0x81, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x02, 0xb0, 0x12, 0x1d, 0x37, 0x02, 0x10, 0x86,
7730x12, 0x10, 0x03, 0x78, 0x89, 0xef, 0xf6, 0xd2, 0x00, 0x12, 0x2a, 0x06, 0x90, 0xf9, 0x67, 0x12,
7740x1b, 0x3a, 0xe9, 0x24, 0x03, 0xf9, 0xe4, 0x3a, 0xfa, 0xc0, 0x02, 0x78, 0x80, 0xe6, 0xfe, 0x08,
7750xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0xd0, 0x02, 0x12, 0x22, 0x25, 0x12, 0x31, 0xc7,
7760x78, 0x89, 0xe6, 0xff, 0x12, 0x13, 0x3f, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x8f, 0x63, 0x12,
7770x2a, 0x06, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x3f, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3,
7780xe0, 0x54, 0x3f, 0xf0, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3,
7790xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x63, 0xf8, 0x74, 0xfb, 0x56, 0xf6,
7800x7f, 0x00, 0x22, 0x8f, 0x23, 0xc2, 0x08, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12, 0x78, 0x7e, 0x12,
7810x21, 0xeb, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x22, 0x4a, 0x12, 0x21, 0xef, 0xe0, 0x20, 0xe0, 0xf6,
7820xef, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7,
7830xaf, 0x23, 0x12, 0x13, 0x3f, 0x22, 0x12, 0x10, 0x03, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x4a, 0x24,
7840x06, 0x12, 0x21, 0xf1, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x03, 0x12, 0x22, 0x52, 0x24,
7850x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x4a, 0x12, 0x31, 0xc7, 0x7d, 0x02,
7860xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0xae, 0x05, 0x12, 0x1c, 0xde, 0xef, 0x12, 0x1a,
7870x4a, 0x0e, 0x0e, 0x0e, 0xee, 0xd3, 0x95, 0x3c, 0xe4, 0x95, 0x3b, 0x40, 0x02, 0xae, 0x3c, 0xee,
7880xd3, 0x94, 0x08, 0x74, 0x80, 0x94, 0x81, 0x40, 0x0a, 0x7e, 0x03, 0x90, 0x00, 0x02, 0x74, 0x02,
7890x12, 0x1a, 0x4a, 0xaf, 0x06, 0x12, 0x31, 0xb1, 0x22, 0xae, 0x07, 0xed, 0x54, 0x03, 0x64, 0x01,
7900x60, 0x03, 0x7f, 0x10, 0x22, 0xed, 0x54, 0x7c, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x7f, 0x0b, 0x22,
7910x74, 0x6e, 0x2e, 0xf8, 0x74, 0x02, 0x46, 0xf6, 0x74, 0x96, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfa,
7920xf5, 0x83, 0xed, 0xf0, 0x7f, 0x00, 0x22, 0xbf, 0x03, 0x06, 0x7c, 0xff, 0x7d, 0xe0, 0x80, 0x04,
7930x7c, 0xff, 0x7d, 0xe2, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04,
7940x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0, 0x74, 0x6e, 0x2f, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f,
7950x00, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60,
7960x16, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xff, 0xc3, 0xe5, 0x3a, 0x9f, 0xe5, 0x39, 0x94, 0x00,
7970x40, 0x05, 0x12, 0x28, 0x16, 0x80, 0x03, 0x12, 0x31, 0xbd, 0x02, 0x10, 0x86, 0x90, 0xff, 0xfc,
7980xe0, 0x20, 0xe7, 0x1f, 0xc2, 0xaf, 0x7d, 0xff, 0xac, 0x05, 0x1d, 0xec, 0x60, 0x15, 0x7e, 0x04,
7990x7f, 0x00, 0xef, 0x1f, 0xaa, 0x06, 0x70, 0x01, 0x1e, 0x4a, 0x60, 0xec, 0x90, 0xff, 0x92, 0xe4,
8000xf0, 0x80, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x66, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x30, 0xe0,
8010x12, 0x30, 0xe1, 0x0f, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x20, 0xf0, 0x7f, 0x04, 0x12, 0x12, 0x19,
8020x12, 0x1d, 0x46, 0x02, 0x10, 0x86, 0x8e, 0x5f, 0x8f, 0x60, 0xe5, 0x60, 0x15, 0x60, 0xae, 0x5f,
8030x70, 0x02, 0x15, 0x5f, 0xd3, 0x94, 0x00, 0xee, 0x94, 0x00, 0x40, 0x09, 0x7e, 0x07, 0x7f, 0xd0,
8040x12, 0x0f, 0xdc, 0x80, 0xe5, 0x22, 0x11, 0x94, 0x2d, 0xf6, 0x23, 0xef, 0x31, 0xa3, 0x2f, 0xf4,
8050x2f, 0xa2, 0x30, 0xb2, 0x2e, 0xe6, 0x26, 0x6d, 0x2b, 0xaf, 0x30, 0x55, 0x30, 0x74, 0x1d, 0xb4,
8060x2e, 0x40, 0x2a, 0xe8, 0x0e, 0x12, 0x10, 0x03, 0x78, 0x86, 0x12, 0x22, 0x82, 0x20, 0xe1, 0x07,
8070x7f, 0x12, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x86, 0xe6, 0xff, 0x12, 0x23, 0x49, 0x12, 0x30,
8080xec, 0x02, 0x10, 0x86, 0x12, 0x10, 0x03, 0x78, 0x87, 0x12, 0x22, 0x82, 0x20, 0xe2, 0x07, 0x7f,
8090x11, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x87, 0xe6, 0xff, 0x12, 0x2e, 0x7d, 0x12, 0x30, 0xec,
8100x02, 0x10, 0x86, 0x8f, 0x61, 0x12, 0x2e, 0x7d, 0xaf, 0x61, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12,
8110x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x61, 0xf8, 0x74, 0xfd, 0x56, 0xf6, 0xaf, 0x61, 0x12, 0x13,
8120x3f, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60,
8130x05, 0x12, 0x2c, 0x07, 0x80, 0x06, 0x12, 0x1d, 0x64, 0x12, 0x1d, 0x6c, 0x02, 0x10, 0x86, 0x12,
8140x29, 0x93, 0x12, 0x12, 0xbb, 0x90, 0xf8, 0x04, 0xe0, 0xff, 0x60, 0x05, 0x7d, 0x01, 0x12, 0x12,
8150x58, 0x12, 0x29, 0x1d, 0x12, 0x12, 0xf7, 0x12, 0x11, 0x74, 0x80, 0xe3, 0x12, 0x1c, 0xde, 0xef,
8160x12, 0x1a, 0x4a, 0xe4, 0xf5, 0x33, 0xf5, 0x34, 0xef, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff,
8170x12, 0x31, 0xb1, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0xa0, 0x60, 0xf7, 0xef, 0x30, 0xe5,
8180x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff,
8190x54, 0x28, 0x60, 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22,
8200xd3, 0x22, 0xef, 0x30, 0xe7, 0x08, 0x12, 0x1c, 0x95, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0xef, 0x12,
8210x1c, 0xe8, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03, 0x87, 0x40, 0x00,
8220x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, 0x78, 0x7e, 0x12, 0x22,
8230x09, 0xa3, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x06, 0x54, 0x7f, 0xf0, 0x44, 0x80, 0xf0, 0x22, 0x85,
8240x3b, 0x39, 0x85, 0x3c, 0x3a, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, 0xf0, 0xa3, 0xe0, 0x54, 0x7f,
8250xf0, 0x22, 0xe4, 0xfe, 0xee, 0x90, 0x31, 0x47, 0x93, 0xb5, 0x07, 0x02, 0xd3, 0x22, 0x0e, 0xbe,
8260x07, 0xf2, 0xc3, 0x22, 0x00, 0x08, 0x18, 0x28, 0x38, 0x01, 0x81, 0x10, 0x0a, 0x02, 0x00, 0x00,
8270x00, 0x00, 0x00, 0x12, 0x10, 0x03, 0x7f, 0x02, 0x12, 0x10, 0x92, 0x12, 0x1d, 0x46, 0x02, 0x10,
8280x86, 0x75, 0x39, 0x00, 0x8f, 0x3a, 0x12, 0x1c, 0x30, 0x12, 0x2c, 0x07, 0x22, 0x12, 0x1d, 0x6c,
8290x12, 0x1d, 0x2f, 0x12, 0x1d, 0x64, 0x22, 0xc2, 0x08, 0x22,
830};
831
832#undef IMAGE_VERSION_NAME
833
834#undef IMAGE_ARRAY_NAME
835
diff --git a/drivers/usb/serial/io_ionsp.h b/drivers/usb/serial/io_ionsp.h
new file mode 100644
index 000000000000..092e03d2dfc4
--- /dev/null
+++ b/drivers/usb/serial/io_ionsp.h
@@ -0,0 +1,454 @@
1/************************************************************************
2 *
3 * IONSP.H Definitions for I/O Networks Serial Protocol
4 *
5 * Copyright (C) 1997-1998 Inside Out Networks, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * These definitions are used by both kernel-mode driver and the
13 * peripheral firmware and MUST be kept in sync.
14 *
15 ************************************************************************/
16
17/************************************************************************
18
19The data to and from all ports on the peripheral is multiplexed
20through a single endpoint pair (EP1 since it supports 64-byte
21MaxPacketSize). Therefore, the data, commands, and status for
22each port must be preceded by a short header identifying the
23destination port. The header also identifies the bytes that follow
24as data or as command/status info.
25
26Header format, first byte:
27
28 CLLLLPPP
29 --------
30 | | |------ Port Number: 0-7
31 | |--------- Length: MSB bits of length
32 |----------- Data/Command: 0 = Data header
33 1 = Cmd / Status (Cmd if OUT, Status if IN)
34
35This gives 2 possible formats:
36
37
38 Data header: 0LLLLPPP LLLLLLLL
39 ============
40
41 Where (LLLL,LLLLLLL) is 12-bit length of data that follows for
42 port number (PPP). The length is 0-based (0-FFF means 0-4095
43 bytes). The ~4K limit allows the host driver (which deals in
44 transfer requests instead of individual packets) to write a
45 large chunk of data in a single request. Note, however, that
46 the length must always be <= the current TxCredits for a given
47 port due to buffering limitations on the peripheral.
48
49
50 Cmd/Status header: 1ccccPPP [ CCCCCCCC, Params ]...
51 ==================
52
53 Where (cccc) or (cccc,CCCCCCCC) is the cmd or status identifier.
54 Frequently-used values are encoded as (cccc), longer ones using
55 (cccc,CCCCCCCC). Subsequent bytes are optional parameters and are
56 specific to the cmd or status code. This may include a length
57 for command and status codes that need variable-length parameters.
58
59
60In addition, we use another interrupt pipe (endpoint) which the host polls
61periodically for flow control information. The peripheral, when there has
62been a change, sends the following 10-byte packet:
63
64 RRRRRRRRRRRRRRRR
65 T0T0T0T0T0T0T0T0
66 T1T1T1T1T1T1T1T1
67 T2T2T2T2T2T2T2T2
68 T3T3T3T3T3T3T3T3
69
70The first field is the 16-bit RxBytesAvail field, which indicates the
71number of bytes which may be read by the host from EP1. This is necessary:
72(a) because OSR2.1 has a bug which causes data loss if the peripheral returns
73fewer bytes than the host expects to read, and (b) because, on Microsoft
74platforms at least, an outstanding read posted on EP1 consumes about 35% of
75the CPU just polling the device for data.
76
77The next 4 fields are the 16-bit TxCredits for each port, which indicate how
78many bytes the host is allowed to send on EP1 for transmit to a given port.
79After an OPEN_PORT command, the Edgeport sends the initial TxCredits for that
80port.
81
82All 16-bit fields are sent in little-endian (Intel) format.
83
84************************************************************************/
85
86//
87// Define format of InterruptStatus packet returned from the
88// Interrupt pipe
89//
90
91struct int_status_pkt {
92 __u16 RxBytesAvail; // Additional bytes available to
93 // be read from Bulk IN pipe
94 __u16 TxCredits[ MAX_RS232_PORTS ]; // Additional space available in
95 // given port's TxBuffer
96};
97
98
99#define GET_INT_STATUS_SIZE(NumPorts) (sizeof(__u16) + (sizeof(__u16) * (NumPorts)))
100
101
102
103//
104// Define cmd/status header values and macros to extract them.
105//
106// Data: 0LLLLPPP LLLLLLLL
107// Cmd/Stat: 1ccccPPP CCCCCCCC
108
109#define IOSP_DATA_HDR_SIZE 2
110#define IOSP_CMD_HDR_SIZE 2
111
112#define IOSP_MAX_DATA_LENGTH 0x0FFF // 12 bits -> 4K
113
114#define IOSP_PORT_MASK 0x07 // Mask to isolate port number
115#define IOSP_CMD_STAT_BIT 0x80 // If set, this is command/status header
116
117#define IS_CMD_STAT_HDR(Byte1) ((Byte1) & IOSP_CMD_STAT_BIT)
118#define IS_DATA_HDR(Byte1) (! IS_CMD_STAT_HDR(Byte1))
119
120#define IOSP_GET_HDR_PORT(Byte1) ((__u8) ((Byte1) & IOSP_PORT_MASK))
121#define IOSP_GET_HDR_DATA_LEN(Byte1, Byte2) ((__u16) ( ((__u16)((Byte1) & 0x78)) << 5) | (Byte2))
122#define IOSP_GET_STATUS_CODE(Byte1) ((__u8) (((Byte1) & 0x78) >> 3))
123
124
125//
126// These macros build the 1st and 2nd bytes for a data header
127//
128#define IOSP_BUILD_DATA_HDR1(Port, Len) ((__u8) (((Port) | ((__u8) (((__u16) (Len)) >> 5) & 0x78 ))))
129#define IOSP_BUILD_DATA_HDR2(Port, Len) ((__u8) (Len))
130
131
132//
133// These macros build the 1st and 2nd bytes for a command header
134//
135#define IOSP_BUILD_CMD_HDR1(Port, Cmd) ((__u8) ( IOSP_CMD_STAT_BIT | (Port) | ((__u8) ((Cmd) << 3)) ))
136
137
138//--------------------------------------------------------------
139//
140// Define values for commands and command parameters
141// (sent from Host to Edgeport)
142//
143// 1ccccPPP P1P1P1P1 [ P2P2P2P2P2 ]...
144//
145// cccc: 00-07 2-byte commands. Write UART register 0-7 with
146// value in P1. See 16650.H for definitions of
147// UART register numbers and contents.
148//
149// 08-0B 3-byte commands: ==== P1 ==== ==== P2 ====
150// 08 available for expansion
151// 09 1-param commands Command Code Param
152// 0A available for expansion
153// 0B available for expansion
154//
155// 0C-0D 4-byte commands. P1 = extended cmd and P2,P3 = params
156// Currently unimplemented.
157//
158// 0E-0F N-byte commands: P1 = num bytes after P1 (ie, TotalLen - 2)
159// P2 = extended cmd, P3..Pn = parameters.
160// Currently unimplemented.
161//
162
163#define IOSP_WRITE_UART_REG(n) ((n) & 0x07) // UartReg[ n ] := P1
164
165// Register numbers and contents
166// defined in 16554.H.
167
168// 0x08 // Available for expansion.
169#define IOSP_EXT_CMD 0x09 // P1 = Command code (defined below)
170
171// P2 = Parameter
172
173//
174// Extended Command values, used with IOSP_EXT_CMD, may
175// or may not use parameter P2.
176//
177
178#define IOSP_CMD_OPEN_PORT 0x00 // Enable ints, init UART. (NO PARAM)
179#define IOSP_CMD_CLOSE_PORT 0x01 // Disable ints, flush buffers. (NO PARAM)
180#define IOSP_CMD_CHASE_PORT 0x02 // Wait for Edgeport TX buffers to empty. (NO PARAM)
181#define IOSP_CMD_SET_RX_FLOW 0x03 // Set Rx Flow Control in Edgeport
182#define IOSP_CMD_SET_TX_FLOW 0x04 // Set Tx Flow Control in Edgeport
183#define IOSP_CMD_SET_XON_CHAR 0x05 // Set XON Character in Edgeport
184#define IOSP_CMD_SET_XOFF_CHAR 0x06 // Set XOFF Character in Edgeport
185#define IOSP_CMD_RX_CHECK_REQ 0x07 // Request Edgeport to insert a Checkpoint into
186
187// the receive data stream (Parameter = 1 byte sequence number)
188
189#define IOSP_CMD_SET_BREAK 0x08 // Turn on the BREAK (LCR bit 6)
190#define IOSP_CMD_CLEAR_BREAK 0x09 // Turn off the BREAK (LCR bit 6)
191
192
193//
194// Define macros to simplify building of IOSP cmds
195//
196
197#define MAKE_CMD_WRITE_REG(ppBuf, pLen, Port, Reg, Val) \
198 do { \
199 (*(ppBuf))[0] = IOSP_BUILD_CMD_HDR1( (Port), IOSP_WRITE_UART_REG(Reg) ); \
200 (*(ppBuf))[1] = (Val); \
201 \
202 *ppBuf += 2; \
203 *pLen += 2; \
204 } while (0)
205
206#define MAKE_CMD_EXT_CMD(ppBuf, pLen, Port, ExtCmd, Param) \
207 do { \
208 (*(ppBuf))[0] = IOSP_BUILD_CMD_HDR1( (Port), IOSP_EXT_CMD ); \
209 (*(ppBuf))[1] = (ExtCmd); \
210 (*(ppBuf))[2] = (Param); \
211 \
212 *ppBuf += 3; \
213 *pLen += 3; \
214 } while (0)
215
216
217
218//--------------------------------------------------------------
219//
220// Define format of flow control commands
221// (sent from Host to Edgeport)
222//
223// 11001PPP FlowCmd FlowTypes
224//
225// Note that the 'FlowTypes' parameter is a bit mask; that is,
226// more than one flow control type can be active at the same time.
227// FlowTypes = 0 means 'no flow control'.
228//
229
230//
231// IOSP_CMD_SET_RX_FLOW
232//
233// Tells Edgeport how it can stop incoming UART data
234//
235// Example for Port 0
236// P0 = 11001000
237// P1 = IOSP_CMD_SET_RX_FLOW
238// P2 = Bit mask as follows:
239
240#define IOSP_RX_FLOW_RTS 0x01 // Edgeport drops RTS to stop incoming data
241#define IOSP_RX_FLOW_DTR 0x02 // Edgeport drops DTR to stop incoming data
242#define IOSP_RX_FLOW_DSR_SENSITIVITY 0x04 // Ignores Rx data unless DSR high
243
244// Not currently implemented by firmware.
245#define IOSP_RX_FLOW_XON_XOFF 0x08 // Edgeport sends XOFF char to stop incoming data.
246
247// Host must have previously programmed the
248// XON/XOFF values with SET_XON/SET_XOFF
249// before enabling this bit.
250
251//
252// IOSP_CMD_SET_TX_FLOW
253//
254// Tells Edgeport what signal(s) will stop it from transmitting UART data
255//
256// Example for Port 0
257// P0 = 11001000
258// P1 = IOSP_CMD_SET_TX_FLOW
259// P2 = Bit mask as follows:
260
261#define IOSP_TX_FLOW_CTS 0x01 // Edgeport stops Tx if CTS low
262#define IOSP_TX_FLOW_DSR 0x02 // Edgeport stops Tx if DSR low
263#define IOSP_TX_FLOW_DCD 0x04 // Edgeport stops Tx if DCD low
264#define IOSP_TX_FLOW_XON_XOFF 0x08 // Edgeport stops Tx upon receiving XOFF char.
265
266// Host must have previously programmed the
267// XON/XOFF values with SET_XON/SET_XOFF
268// before enabling this bit.
269#define IOSP_TX_FLOW_XOFF_CONTINUE 0x10 // If not set, Edgeport stops Tx when
270
271// sending XOFF in order to fix broken
272// systems that interpret the next
273// received char as XON.
274// If set, Edgeport continues Tx
275// normally after transmitting XOFF.
276// Not currently implemented by firmware.
277#define IOSP_TX_TOGGLE_RTS 0x20 // Edgeport drives RTS as a true half-duplex
278
279// Request-to-Send signal: it is raised before
280// beginning transmission and lowered after
281// the last Tx char leaves the UART.
282// Not currently implemented by firmware.
283
284//
285// IOSP_CMD_SET_XON_CHAR
286//
287// Sets the character which Edgeport transmits/interprets as XON.
288// Note: This command MUST be sent before sending a SET_RX_FLOW or
289// SET_TX_FLOW with the XON_XOFF bit set.
290//
291// Example for Port 0
292// P0 = 11001000
293// P1 = IOSP_CMD_SET_XON_CHAR
294// P2 = 0x11
295
296
297//
298// IOSP_CMD_SET_XOFF_CHAR
299//
300// Sets the character which Edgeport transmits/interprets as XOFF.
301// Note: This command must be sent before sending a SET_RX_FLOW or
302// SET_TX_FLOW with the XON_XOFF bit set.
303//
304// Example for Port 0
305// P0 = 11001000
306// P1 = IOSP_CMD_SET_XOFF_CHAR
307// P2 = 0x13
308
309
310//
311// IOSP_CMD_RX_CHECK_REQ
312//
313// This command is used to assist in the implementation of the
314// IOCTL_SERIAL_PURGE Windows IOCTL.
315// This IOSP command tries to place a marker at the end of the RX
316// queue in the Edgeport. If the Edgeport RX queue is full then
317// the Check will be discarded.
318// It is up to the device driver to timeout waiting for the
319// RX_CHECK_RSP. If a RX_CHECK_RSP is received, the driver is
320// sure that all data has been received from the edgeport and
321// may now purge any internal RX buffers.
322// Note tat the sequence numbers may be used to detect lost
323// CHECK_REQs.
324
325// Example for Port 0
326// P0 = 11001000
327// P1 = IOSP_CMD_RX_CHECK_REQ
328// P2 = Sequence number
329
330
331// Response will be:
332// P1 = IOSP_EXT_RX_CHECK_RSP
333// P2 = Request Sequence number
334
335
336
337//--------------------------------------------------------------
338//
339// Define values for status and status parameters
340// (received by Host from Edgeport)
341//
342// 1ssssPPP P1P1P1P1 [ P2P2P2P2P2 ]...
343//
344// ssss: 00-07 2-byte status. ssss identifies which UART register
345// has changed value, and the new value is in P1.
346// Note that the ssss values do not correspond to the
347// 16554 register numbers given in 16554.H. Instead,
348// see below for definitions of the ssss numbers
349// used in this status message.
350//
351// 08-0B 3-byte status: ==== P1 ==== ==== P2 ====
352// 08 LSR_DATA: New LSR Errored byte
353// 09 1-param responses Response Code Param
354// 0A OPEN_RSP: InitialMsr TxBufferSize
355// 0B available for expansion
356//
357// 0C-0D 4-byte status. P1 = extended status code and P2,P3 = params
358// Not currently implemented.
359//
360// 0E-0F N-byte status: P1 = num bytes after P1 (ie, TotalLen - 2)
361// P2 = extended status, P3..Pn = parameters.
362// Not currently implemented.
363//
364
365/****************************************************
366 * SSSS values for 2-byte status messages (0-8)
367 ****************************************************/
368
369#define IOSP_STATUS_LSR 0x00 // P1 is new value of LSR register.
370
371// Bits defined in 16554.H. Edgeport
372// returns this in order to report
373// line status errors (overrun,
374// parity, framing, break). This form
375// is used when a errored receive data
376// character was NOT present in the
377// UART when the LSR error occurred
378// (ie, when LSR bit 0 = 0).
379
380#define IOSP_STATUS_MSR 0x01 // P1 is new value of MSR register.
381
382// Bits defined in 16554.H. Edgeport
383// returns this in order to report
384// changes in modem status lines
385// (CTS, DSR, RI, CD)
386//
387
388// 0x02 // Available for future expansion
389// 0x03 //
390// 0x04 //
391// 0x05 //
392// 0x06 //
393// 0x07 //
394
395
396/****************************************************
397 * SSSS values for 3-byte status messages (8-A)
398 ****************************************************/
399
400#define IOSP_STATUS_LSR_DATA 0x08 // P1 is new value of LSR register (same as STATUS_LSR)
401
402// P2 is errored character read from
403// RxFIFO after LSR reported an error.
404
405#define IOSP_EXT_STATUS 0x09 // P1 is status/response code, param in P2.
406
407
408// Response Codes (P1 values) for 3-byte status messages
409
410#define IOSP_EXT_STATUS_CHASE_RSP 0 // Reply to CHASE_PORT cmd. P2 is outcome:
411#define IOSP_EXT_STATUS_CHASE_PASS 0 // P2 = 0: All Tx data drained successfully
412#define IOSP_EXT_STATUS_CHASE_FAIL 1 // P2 = 1: Timed out (stuck due to flow
413
414// control from remote device).
415
416#define IOSP_EXT_STATUS_RX_CHECK_RSP 1 // Reply to RX_CHECK cmd. P2 is sequence number
417
418
419#define IOSP_STATUS_OPEN_RSP 0x0A // Reply to OPEN_PORT cmd.
420
421// P1 is Initial MSR value
422// P2 is encoded TxBuffer Size:
423// TxBufferSize = (P2 + 1) * 64
424
425// 0x0B // Available for future expansion
426
427#define GET_TX_BUFFER_SIZE(P2) (((P2) + 1) * 64)
428
429
430
431
432/****************************************************
433 * SSSS values for 4-byte status messages
434 ****************************************************/
435
436#define IOSP_EXT4_STATUS 0x0C // Extended status code in P1,
437
438// Params in P2, P3
439// Currently unimplemented.
440
441// 0x0D // Currently unused, available.
442
443
444
445//
446// Macros to parse status messages
447//
448
449#define IOSP_GET_STATUS_LEN(code) ( (code) < 8 ? 2 : ((code) < 0x0A ? 3 : 4) )
450
451#define IOSP_STATUS_IS_2BYTE(code) ( (code) < 0x08 )
452#define IOSP_STATUS_IS_3BYTE(code) ( ((code) >= 0x08) && ((code) <= 0x0B) )
453#define IOSP_STATUS_IS_4BYTE(code) ( ((code) >= 0x0C) && ((code) <= 0x0D) )
454
diff --git a/drivers/usb/serial/io_tables.h b/drivers/usb/serial/io_tables.h
new file mode 100644
index 000000000000..e7ffe02408bd
--- /dev/null
+++ b/drivers/usb/serial/io_tables.h
@@ -0,0 +1,163 @@
1/*
2 * IO Edgeport Driver tables
3 *
4 * Copyright (C) 2001
5 * Greg Kroah-Hartman (greg@kroah.com)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 */
13
14#ifndef IO_TABLES_H
15#define IO_TABLES_H
16
17static struct usb_device_id edgeport_2port_id_table [] = {
18 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
19 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
20 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
21 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
22 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
23 { }
24};
25
26static struct usb_device_id edgeport_4port_id_table [] = {
27 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
28 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
29 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
30 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
31 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
32 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
33 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
34 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
35 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
36 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
37 { }
38};
39
40static struct usb_device_id edgeport_8port_id_table [] = {
41 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
42 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
43 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
44 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
45 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
46 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
47 { }
48};
49
50/* Devices that this driver supports */
51static struct usb_device_id id_table_combined [] = {
52 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4) },
53 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_RAPIDPORT_4) },
54 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4T) },
55 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_MT4X56USB) },
56 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2) },
57 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4I) },
58 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2I) },
59 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_421) },
60 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_21) },
61 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU) },
62 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8) },
63 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_2_DIN) },
64 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_4_DIN) },
65 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU) },
66 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_22I) },
67 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_4) },
68 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_COMPATIBLE) },
69 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8I) },
70 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8R) },
71 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_8RR) },
72 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_EDGEPORT_412_8) },
73 { } /* Terminating entry */
74};
75
76MODULE_DEVICE_TABLE (usb, id_table_combined);
77
78static struct usb_serial_device_type edgeport_2port_device = {
79 .owner = THIS_MODULE,
80 .name = "Edgeport 2 port adapter",
81 .short_name = "edgeport_2",
82 .id_table = edgeport_2port_id_table,
83 .num_interrupt_in = 1,
84 .num_bulk_in = 1,
85 .num_bulk_out = 1,
86 .num_ports = 2,
87 .open = edge_open,
88 .close = edge_close,
89 .throttle = edge_throttle,
90 .unthrottle = edge_unthrottle,
91 .attach = edge_startup,
92 .shutdown = edge_shutdown,
93 .ioctl = edge_ioctl,
94 .set_termios = edge_set_termios,
95 .tiocmget = edge_tiocmget,
96 .tiocmset = edge_tiocmset,
97 .write = edge_write,
98 .write_room = edge_write_room,
99 .chars_in_buffer = edge_chars_in_buffer,
100 .break_ctl = edge_break,
101 .read_int_callback = edge_interrupt_callback,
102 .read_bulk_callback = edge_bulk_in_callback,
103 .write_bulk_callback = edge_bulk_out_data_callback,
104};
105
106static struct usb_serial_device_type edgeport_4port_device = {
107 .owner = THIS_MODULE,
108 .name = "Edgeport 4 port adapter",
109 .short_name = "edgeport_4",
110 .id_table = edgeport_4port_id_table,
111 .num_interrupt_in = 1,
112 .num_bulk_in = 1,
113 .num_bulk_out = 1,
114 .num_ports = 4,
115 .open = edge_open,
116 .close = edge_close,
117 .throttle = edge_throttle,
118 .unthrottle = edge_unthrottle,
119 .attach = edge_startup,
120 .shutdown = edge_shutdown,
121 .ioctl = edge_ioctl,
122 .set_termios = edge_set_termios,
123 .tiocmget = edge_tiocmget,
124 .tiocmset = edge_tiocmset,
125 .write = edge_write,
126 .write_room = edge_write_room,
127 .chars_in_buffer = edge_chars_in_buffer,
128 .break_ctl = edge_break,
129 .read_int_callback = edge_interrupt_callback,
130 .read_bulk_callback = edge_bulk_in_callback,
131 .write_bulk_callback = edge_bulk_out_data_callback,
132};
133
134static struct usb_serial_device_type edgeport_8port_device = {
135 .owner = THIS_MODULE,
136 .name = "Edgeport 8 port adapter",
137 .short_name = "edgeport_8",
138 .id_table = edgeport_8port_id_table,
139 .num_interrupt_in = 1,
140 .num_bulk_in = 1,
141 .num_bulk_out = 1,
142 .num_ports = 8,
143 .open = edge_open,
144 .close = edge_close,
145 .throttle = edge_throttle,
146 .unthrottle = edge_unthrottle,
147 .attach = edge_startup,
148 .shutdown = edge_shutdown,
149 .ioctl = edge_ioctl,
150 .set_termios = edge_set_termios,
151 .tiocmget = edge_tiocmget,
152 .tiocmset = edge_tiocmset,
153 .write = edge_write,
154 .write_room = edge_write_room,
155 .chars_in_buffer = edge_chars_in_buffer,
156 .break_ctl = edge_break,
157 .read_int_callback = edge_interrupt_callback,
158 .read_bulk_callback = edge_bulk_in_callback,
159 .write_bulk_callback = edge_bulk_out_data_callback,
160};
161
162#endif
163
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
new file mode 100644
index 000000000000..6c96fdaec36e
--- /dev/null
+++ b/drivers/usb/serial/io_ti.c
@@ -0,0 +1,3091 @@
1/*
2 * Edgeport USB Serial Converter driver
3 *
4 * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved.
5 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * Supports the following devices:
13 * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT
14 *
15 * For questions or problems with this driver, contact Inside Out
16 * Networks technical support, or Peter Berger <pberger@brimson.com>,
17 * or Al Borchers <alborchers@steinerpoint.com>.
18 *
19 * Version history:
20 *
21 * July 11, 2002 Removed 4 port device structure since all TI UMP
22 * chips have only 2 ports
23 * David Iacovelli (davidi@ionetworks.com)
24 *
25 */
26
27#include <linux/config.h>
28#include <linux/kernel.h>
29#include <linux/jiffies.h>
30#include <linux/errno.h>
31#include <linux/init.h>
32#include <linux/slab.h>
33#include <linux/tty.h>
34#include <linux/tty_driver.h>
35#include <linux/tty_flip.h>
36#include <linux/module.h>
37#include <linux/spinlock.h>
38#include <linux/serial.h>
39#include <linux/ioctl.h>
40#include <asm/uaccess.h>
41#include <asm/semaphore.h>
42#include <linux/usb.h>
43
44#include "usb-serial.h"
45#include "io_16654.h"
46#include "io_usbvend.h"
47#include "io_ti.h"
48
49/*
50 * Version Information
51 */
52#define DRIVER_VERSION "v0.7"
53#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
54#define DRIVER_DESC "Edgeport USB Serial Driver"
55
56
57/* firmware image code */
58#define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion
59#define IMAGE_ARRAY_NAME PagableOperationalCodeImage
60#define IMAGE_SIZE PagableOperationalCodeSize
61#include "io_fw_down3.h" /* Define array OperationalCodeImage[] */
62
63#define EPROM_PAGE_SIZE 64
64
65
66struct edgeport_uart_buf_desc {
67 __u32 count; // Number of bytes currently in buffer
68};
69
70/* different hardware types */
71#define HARDWARE_TYPE_930 0
72#define HARDWARE_TYPE_TIUMP 1
73
74// IOCTL_PRIVATE_TI_GET_MODE Definitions
75#define TI_MODE_CONFIGURING 0 // Device has not entered start device
76#define TI_MODE_BOOT 1 // Staying in boot mode
77#define TI_MODE_DOWNLOAD 2 // Made it to download mode
78#define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode
79
80/* read urb state */
81#define EDGE_READ_URB_RUNNING 0
82#define EDGE_READ_URB_STOPPING 1
83#define EDGE_READ_URB_STOPPED 2
84
85#define EDGE_LOW_LATENCY 1
86#define EDGE_CLOSING_WAIT 4000 /* in .01 sec */
87
88#define EDGE_OUT_BUF_SIZE 1024
89
90
91/* Product information read from the Edgeport */
92struct product_info
93{
94 int TiMode; // Current TI Mode
95 __u8 hardware_type; // Type of hardware
96} __attribute__((packed));
97
98/* circular buffer */
99struct edge_buf {
100 unsigned int buf_size;
101 char *buf_buf;
102 char *buf_get;
103 char *buf_put;
104};
105
106struct edgeport_port {
107 __u16 uart_base;
108 __u16 dma_address;
109 __u8 shadow_msr;
110 __u8 shadow_mcr;
111 __u8 shadow_lsr;
112 __u8 lsr_mask;
113 __u32 ump_read_timeout; /* Number of miliseconds the UMP will
114 wait without data before completing
115 a read short */
116 int baud_rate;
117 int close_pending;
118 int lsr_event;
119 struct edgeport_uart_buf_desc tx;
120 struct async_icount icount;
121 wait_queue_head_t delta_msr_wait; /* for handling sleeping while
122 waiting for msr change to
123 happen */
124 struct edgeport_serial *edge_serial;
125 struct usb_serial_port *port;
126 __u8 bUartMode; /* Port type, 0: RS232, etc. */
127 spinlock_t ep_lock;
128 int ep_read_urb_state;
129 int ep_write_urb_in_use;
130 struct edge_buf *ep_out_buf;
131};
132
133struct edgeport_serial {
134 struct product_info product_info;
135 u8 TI_I2C_Type; // Type of I2C in UMP
136 u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode
137 struct semaphore es_sem;
138 int num_ports_open;
139 struct usb_serial *serial;
140};
141
142
143/* Devices that this driver supports */
144static struct usb_device_id edgeport_1port_id_table [] = {
145 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
146 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
147 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
148 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
149 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
150 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
151 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
152 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
153 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
154 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
155 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
156 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
157 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
158 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
159 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
160 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
161 { }
162};
163
164static struct usb_device_id edgeport_2port_id_table [] = {
165 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
166 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
167 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
168 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
169 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
170 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
171 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
172 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
173 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
174 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
175 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
176 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
177// The 4-port shows up as two 2-port devices
178 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
179 { }
180};
181
182/* Devices that this driver supports */
183static struct usb_device_id id_table_combined [] = {
184 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
185 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
186 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
187 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
188 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
189 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
190 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
191 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
192 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
193 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
194 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
195 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
196 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
197 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
198 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
199 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
200 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
201 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
202 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
203 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
204 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
205 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
206 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
207 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
208 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
209 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
210 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
211 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
212 { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
213 { }
214};
215
216MODULE_DEVICE_TABLE (usb, id_table_combined);
217
218static struct usb_driver io_driver = {
219 .owner = THIS_MODULE,
220 .name = "io_ti",
221 .probe = usb_serial_probe,
222 .disconnect = usb_serial_disconnect,
223 .id_table = id_table_combined,
224};
225
226
227static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion;
228
229static int debug;
230
231static int TIStayInBootMode = 0;
232static int low_latency = EDGE_LOW_LATENCY;
233static int closing_wait = EDGE_CLOSING_WAIT;
234static int ignore_cpu_rev = 0;
235
236
237static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length);
238
239static void stop_read(struct edgeport_port *edge_port);
240static int restart_read(struct edgeport_port *edge_port);
241
242static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios);
243static void edge_send(struct usb_serial_port *port);
244
245/* circular buffer */
246static struct edge_buf *edge_buf_alloc(unsigned int size);
247static void edge_buf_free(struct edge_buf *eb);
248static void edge_buf_clear(struct edge_buf *eb);
249static unsigned int edge_buf_data_avail(struct edge_buf *eb);
250static unsigned int edge_buf_space_avail(struct edge_buf *eb);
251static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf,
252 unsigned int count);
253static unsigned int edge_buf_get(struct edge_buf *eb, char *buf,
254 unsigned int count);
255
256
257static int TIReadVendorRequestSync (struct usb_device *dev,
258 __u8 request,
259 __u16 value,
260 __u16 index,
261 u8 *data,
262 int size)
263{
264 int status;
265
266 status = usb_control_msg (dev,
267 usb_rcvctrlpipe(dev, 0),
268 request,
269 (USB_TYPE_VENDOR |
270 USB_RECIP_DEVICE |
271 USB_DIR_IN),
272 value,
273 index,
274 data,
275 size,
276 1000);
277 if (status < 0)
278 return status;
279 if (status != size) {
280 dbg ("%s - wanted to write %d, but only wrote %d",
281 __FUNCTION__, size, status);
282 return -ECOMM;
283 }
284 return 0;
285}
286
287static int TISendVendorRequestSync (struct usb_device *dev,
288 __u8 request,
289 __u16 value,
290 __u16 index,
291 u8 *data,
292 int size)
293{
294 int status;
295
296 status = usb_control_msg (dev,
297 usb_sndctrlpipe(dev, 0),
298 request,
299 (USB_TYPE_VENDOR |
300 USB_RECIP_DEVICE |
301 USB_DIR_OUT),
302 value,
303 index,
304 data,
305 size,
306 1000);
307 if (status < 0)
308 return status;
309 if (status != size) {
310 dbg ("%s - wanted to write %d, but only wrote %d",
311 __FUNCTION__, size, status);
312 return -ECOMM;
313 }
314 return 0;
315}
316
317static int TIWriteCommandSync (struct usb_device *dev, __u8 command,
318 __u8 moduleid, __u16 value, u8 *data,
319 int size)
320{
321 return TISendVendorRequestSync (dev,
322 command, // Request
323 value, // wValue
324 moduleid, // wIndex
325 data, // TransferBuffer
326 size); // TransferBufferLength
327
328}
329
330/* clear tx/rx buffers and fifo in TI UMP */
331static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask)
332{
333 int port_number = port->number - port->serial->minor;
334
335 dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask);
336
337 return TIWriteCommandSync (port->serial->dev,
338 UMPC_PURGE_PORT,
339 (__u8)(UMPM_UART1_PORT + port_number),
340 mask,
341 NULL,
342 0);
343}
344
345/**
346 * TIReadDownloadMemory - Read edgeport memory from TI chip
347 * @dev: usb device pointer
348 * @start_address: Device CPU address at which to read
349 * @length: Length of above data
350 * @address_type: Can read both XDATA and I2C
351 * @buffer: pointer to input data buffer
352 */
353static int TIReadDownloadMemory(struct usb_device *dev, int start_address,
354 int length, __u8 address_type, __u8 *buffer)
355{
356 int status = 0;
357 __u8 read_length;
358 __be16 be_start_address;
359
360 dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length);
361
362 /* Read in blocks of 64 bytes
363 * (TI firmware can't handle more than 64 byte reads)
364 */
365 while (length) {
366 if (length > 64)
367 read_length= 64;
368 else
369 read_length = (__u8)length;
370
371 if (read_length > 1) {
372 dbg ("%s - @ %x for %d", __FUNCTION__,
373 start_address, read_length);
374 }
375 be_start_address = cpu_to_be16 (start_address);
376 status = TIReadVendorRequestSync (dev,
377 UMPC_MEMORY_READ, // Request
378 (__u16)address_type, // wValue (Address type)
379 (__force __u16)be_start_address, // wIndex (Address to read)
380 buffer, // TransferBuffer
381 read_length); // TransferBufferLength
382
383 if (status) {
384 dbg ("%s - ERROR %x", __FUNCTION__, status);
385 return status;
386 }
387
388 if (read_length > 1) {
389 usb_serial_debug_data(debug, &dev->dev, __FUNCTION__,
390 read_length, buffer);
391 }
392
393 /* Update pointers/length */
394 start_address += read_length;
395 buffer += read_length;
396 length -= read_length;
397 }
398
399 return status;
400}
401
402static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer)
403{
404 return TIReadDownloadMemory (dev,
405 start_address,
406 length,
407 DTK_ADDR_SPACE_XDATA,
408 buffer);
409}
410
411/* Read edgeport memory to a given block */
412static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer)
413{
414 int status = 0;
415 int i;
416
417 for (i=0; i< length; i++) {
418 status = TIReadVendorRequestSync (serial->serial->dev,
419 UMPC_MEMORY_READ, // Request
420 serial->TI_I2C_Type, // wValue (Address type)
421 (__u16)(start_address+i), // wIndex
422 &buffer[i], // TransferBuffer
423 0x01); // TransferBufferLength
424 if (status) {
425 dbg ("%s - ERROR %x", __FUNCTION__, status);
426 return status;
427 }
428 }
429
430 dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length);
431 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer);
432
433 serial->TiReadI2C = 1;
434
435 return status;
436}
437
438/* Write given block to TI EPROM memory */
439static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
440{
441 int status = 0;
442 int i;
443 __u8 temp;
444
445 /* Must do a read before write */
446 if (!serial->TiReadI2C) {
447 status = TIReadBootMemory(serial, 0, 1, &temp);
448 if (status)
449 return status;
450 }
451
452 for (i=0; i < length; ++i) {
453 status = TISendVendorRequestSync (serial->serial->dev,
454 UMPC_MEMORY_WRITE, // Request
455 buffer[i], // wValue
456 (__u16)(i+start_address), // wIndex
457 NULL, // TransferBuffer
458 0); // TransferBufferLength
459 if (status)
460 return status;
461 }
462
463 dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length);
464 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer);
465
466 return status;
467}
468
469
470/* Write edgeport I2C memory to TI chip */
471static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer)
472{
473 int status = 0;
474 int write_length;
475 __be16 be_start_address;
476
477 /* We can only send a maximum of 1 aligned byte page at a time */
478
479 /* calulate the number of bytes left in the first page */
480 write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1));
481
482 if (write_length > length)
483 write_length = length;
484
485 dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
486 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer);
487
488 /* Write first page */
489 be_start_address = cpu_to_be16 (start_address);
490 status = TISendVendorRequestSync (serial->serial->dev,
491 UMPC_MEMORY_WRITE, // Request
492 (__u16)address_type, // wValue
493 (__force __u16)be_start_address, // wIndex
494 buffer, // TransferBuffer
495 write_length);
496 if (status) {
497 dbg ("%s - ERROR %d", __FUNCTION__, status);
498 return status;
499 }
500
501 length -= write_length;
502 start_address += write_length;
503 buffer += write_length;
504
505 /* We should be aligned now -- can write max page size bytes at a time */
506 while (length) {
507 if (length > EPROM_PAGE_SIZE)
508 write_length = EPROM_PAGE_SIZE;
509 else
510 write_length = length;
511
512 dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length);
513 usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer);
514
515 /* Write next page */
516 be_start_address = cpu_to_be16 (start_address);
517 status = TISendVendorRequestSync (serial->serial->dev,
518 UMPC_MEMORY_WRITE, // Request
519 (__u16)address_type, // wValue
520 (__force __u16)be_start_address, // wIndex
521 buffer, // TransferBuffer
522 write_length); // TransferBufferLength
523 if (status) {
524 dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __FUNCTION__, status);
525 return status;
526 }
527
528 length -= write_length;
529 start_address += write_length;
530 buffer += write_length;
531 }
532 return status;
533}
534
535/* Examine the UMP DMA registers and LSR
536 *
537 * Check the MSBit of the X and Y DMA byte count registers.
538 * A zero in this bit indicates that the TX DMA buffers are empty
539 * then check the TX Empty bit in the UART.
540 */
541static int TIIsTxActive (struct edgeport_port *port)
542{
543 int status;
544 struct out_endpoint_desc_block *oedb;
545 __u8 *lsr;
546 int bytes_left = 0;
547
548 oedb = kmalloc (sizeof (* oedb), GFP_KERNEL);
549 if (!oedb) {
550 dev_err (&port->port->dev, "%s - out of memory\n", __FUNCTION__);
551 return -ENOMEM;
552 }
553
554 lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte,
555 as not all platforms can do DMA
556 from stack */
557 if (!lsr) {
558 kfree(oedb);
559 return -ENOMEM;
560 }
561 /* Read the DMA Count Registers */
562 status = TIReadRam (port->port->serial->dev,
563 port->dma_address,
564 sizeof( *oedb),
565 (void *)oedb);
566
567 if (status)
568 goto exit_is_tx_active;
569
570 dbg ("%s - XByteCount 0x%X", __FUNCTION__, oedb->XByteCount);
571
572 /* and the LSR */
573 status = TIReadRam (port->port->serial->dev,
574 port->uart_base + UMPMEM_OFFS_UART_LSR,
575 1,
576 lsr);
577
578 if (status)
579 goto exit_is_tx_active;
580 dbg ("%s - LSR = 0x%X", __FUNCTION__, *lsr);
581
582 /* If either buffer has data or we are transmitting then return TRUE */
583 if ((oedb->XByteCount & 0x80 ) != 0 )
584 bytes_left += 64;
585
586 if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 )
587 bytes_left += 1;
588
589 /* We return Not Active if we get any kind of error */
590exit_is_tx_active:
591 dbg ("%s - return %d", __FUNCTION__, bytes_left );
592
593 kfree(lsr);
594 kfree(oedb);
595 return bytes_left;
596}
597
598static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush)
599{
600 int baud_rate;
601 struct tty_struct *tty = port->port->tty;
602 wait_queue_t wait;
603 unsigned long flags;
604
605 if (!timeout)
606 timeout = (HZ*EDGE_CLOSING_WAIT)/100;
607
608 /* wait for data to drain from the buffer */
609 spin_lock_irqsave(&port->ep_lock, flags);
610 init_waitqueue_entry(&wait, current);
611 add_wait_queue(&tty->write_wait, &wait);
612 for (;;) {
613 set_current_state(TASK_INTERRUPTIBLE);
614 if (edge_buf_data_avail(port->ep_out_buf) == 0
615 || timeout == 0 || signal_pending(current)
616 || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */
617 break;
618 spin_unlock_irqrestore(&port->ep_lock, flags);
619 timeout = schedule_timeout(timeout);
620 spin_lock_irqsave(&port->ep_lock, flags);
621 }
622 set_current_state(TASK_RUNNING);
623 remove_wait_queue(&tty->write_wait, &wait);
624 if (flush)
625 edge_buf_clear(port->ep_out_buf);
626 spin_unlock_irqrestore(&port->ep_lock, flags);
627
628 /* wait for data to drain from the device */
629 timeout += jiffies;
630 while ((long)(jiffies - timeout) < 0 && !signal_pending(current)
631 && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */
632 if (!TIIsTxActive(port))
633 break;
634 msleep(10);
635 }
636
637 /* disconnected */
638 if (!usb_get_intfdata(port->port->serial->interface))
639 return;
640
641 /* wait one more character time, based on baud rate */
642 /* (TIIsTxActive doesn't seem to wait for the last byte) */
643 if ((baud_rate=port->baud_rate) == 0)
644 baud_rate = 50;
645 msleep(max(1,(10000+baud_rate-1)/baud_rate));
646}
647
648static int TIChooseConfiguration (struct usb_device *dev)
649{
650 // There may be multiple configurations on this device, in which case
651 // we would need to read and parse all of them to find out which one
652 // we want. However, we just support one config at this point,
653 // configuration # 1, which is Config Descriptor 0.
654
655 dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->desc.bNumInterfaces);
656 dbg ("%s - MAX Power = %d", __FUNCTION__, dev->config->desc.bMaxPower*2);
657
658 if (dev->config->desc.bNumInterfaces != 1) {
659 dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __FUNCTION__);
660 return -ENODEV;
661 }
662
663 return 0;
664}
665
666static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
667{
668 int status;
669
670 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
671 status = TIReadDownloadMemory (serial->serial->dev,
672 start_address,
673 length,
674 serial->TI_I2C_Type,
675 buffer);
676 } else {
677 status = TIReadBootMemory (serial,
678 start_address,
679 length,
680 buffer);
681 }
682
683 return status;
684}
685
686static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer)
687{
688 if (serial->product_info.TiMode == TI_MODE_BOOT)
689 return TIWriteBootMemory (serial,
690 start_address,
691 length,
692 buffer);
693
694 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
695 return TIWriteDownloadI2C (serial,
696 start_address,
697 length,
698 serial->TI_I2C_Type,
699 buffer);
700
701 return -EINVAL;
702}
703
704
705
706/* Read a descriptor header from I2C based on type */
707static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc)
708{
709 int start_address;
710 int status;
711
712 /* Search for requested descriptor in I2C */
713 start_address = 2;
714 do {
715 status = TIReadRom (serial,
716 start_address,
717 sizeof(struct ti_i2c_desc),
718 (__u8 *)rom_desc );
719 if (status)
720 return 0;
721
722 if (rom_desc->Type == desc_type)
723 return start_address;
724
725 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size;
726
727 } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
728
729 return 0;
730}
731
732/* Validate descriptor checksum */
733static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
734{
735 __u16 i;
736 __u8 cs = 0;
737
738 for (i=0; i < rom_desc->Size; i++) {
739 cs = (__u8)(cs + buffer[i]);
740 }
741 if (cs != rom_desc->CheckSum) {
742 dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs);
743 return -EINVAL;
744 }
745 return 0;
746}
747
748/* Make sure that the I2C image is good */
749static int TiValidateI2cImage (struct edgeport_serial *serial)
750{
751 struct device *dev = &serial->serial->dev->dev;
752 int status = 0;
753 struct ti_i2c_desc *rom_desc;
754 int start_address = 2;
755 __u8 *buffer;
756 __u16 ttype;
757
758 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
759 if (!rom_desc) {
760 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
761 return -ENOMEM;
762 }
763 buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL);
764 if (!buffer) {
765 dev_err (dev, "%s - out of memory when allocating buffer\n", __FUNCTION__);
766 kfree (rom_desc);
767 return -ENOMEM;
768 }
769
770 // Read the first byte (Signature0) must be 0x52 or 0x10
771 status = TIReadRom (serial, 0, 1, buffer);
772 if (status)
773 goto ExitTiValidateI2cImage;
774
775 if (*buffer != UMP5152 && *buffer != UMP3410) {
776 dev_err (dev, "%s - invalid buffer signature\n", __FUNCTION__);
777 status = -ENODEV;
778 goto ExitTiValidateI2cImage;
779 }
780
781 do {
782 // Validate the I2C
783 status = TIReadRom (serial,
784 start_address,
785 sizeof(struct ti_i2c_desc),
786 (__u8 *)rom_desc);
787 if (status)
788 break;
789
790 if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) {
791 status = -ENODEV;
792 dbg ("%s - structure too big, erroring out.", __FUNCTION__);
793 break;
794 }
795
796 dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type);
797
798 // Skip type 2 record
799 ttype = rom_desc->Type & 0x0f;
800 if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC
801 && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) {
802 // Read the descriptor data
803 status = TIReadRom(serial,
804 start_address+sizeof(struct ti_i2c_desc),
805 rom_desc->Size,
806 buffer);
807 if (status)
808 break;
809
810 status = ValidChecksum(rom_desc, buffer);
811 if (status)
812 break;
813 }
814 start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size;
815
816 } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE));
817
818 if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE))
819 status = -ENODEV;
820
821ExitTiValidateI2cImage:
822 kfree (buffer);
823 kfree (rom_desc);
824 return status;
825}
826
827static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer)
828{
829 int status;
830 int start_address;
831 struct ti_i2c_desc *rom_desc;
832 struct edge_ti_manuf_descriptor *desc;
833
834 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
835 if (!rom_desc) {
836 dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __FUNCTION__);
837 return -ENOMEM;
838 }
839 start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc);
840
841 if (!start_address) {
842 dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__);
843 status = -ENODEV;
844 goto exit;
845 }
846
847 // Read the descriptor data
848 status = TIReadRom (serial,
849 start_address+sizeof(struct ti_i2c_desc),
850 rom_desc->Size,
851 buffer);
852 if (status)
853 goto exit;
854
855 status = ValidChecksum(rom_desc, buffer);
856
857 desc = (struct edge_ti_manuf_descriptor *)buffer;
858 dbg ( "%s - IonConfig 0x%x", __FUNCTION__, desc->IonConfig );
859 dbg ( "%s - Version %d", __FUNCTION__, desc->Version );
860 dbg ( "%s - Cpu/Board 0x%x", __FUNCTION__, desc->CpuRev_BoardRev );
861 dbg ( "%s - NumPorts %d", __FUNCTION__, desc->NumPorts );
862 dbg ( "%s - NumVirtualPorts %d", __FUNCTION__, desc->NumVirtualPorts );
863 dbg ( "%s - TotalPorts %d", __FUNCTION__, desc->TotalPorts );
864
865exit:
866 kfree (rom_desc);
867 return status;
868}
869
870/* Build firmware header used for firmware update */
871static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev)
872{
873 __u8 *buffer;
874 int buffer_size;
875 int i;
876 __u8 cs = 0;
877 struct ti_i2c_desc *i2c_header;
878 struct ti_i2c_image_header *img_header;
879 struct ti_i2c_firmware_rec *firmware_rec;
880
881 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
882 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
883 // will download the latest firmware (padded to 15.5k) into the UMP ram.
884 // And finally when the device comes back up in download mode the driver will cause
885 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
886 // the record type from 0xf2 to 0x02.
887
888 // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record)
889 buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec));
890
891 buffer = kmalloc (buffer_size, GFP_KERNEL);
892 if (!buffer) {
893 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
894 return -ENOMEM;
895 }
896
897 // Set entire image of 0xffs
898 memset (buffer, 0xff, buffer_size);
899
900 // Copy version number into firmware record
901 firmware_rec = (struct ti_i2c_firmware_rec *)buffer;
902
903 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
904 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
905
906 // Pointer to fw_down memory image
907 img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0];
908
909 memcpy (buffer + sizeof(struct ti_i2c_firmware_rec),
910 &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)],
911 le16_to_cpu(img_header->Length));
912
913 for (i=0; i < buffer_size; i++) {
914 cs = (__u8)(cs + buffer[i]);
915 }
916
917 kfree (buffer);
918
919 // Build new header
920 i2c_header = (struct ti_i2c_desc *)header;
921 firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data;
922
923 i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK;
924 i2c_header->Size = (__u16)buffer_size;
925 i2c_header->CheckSum = cs;
926 firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion;
927 firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion;
928
929 return 0;
930}
931
932/* Try to figure out what type of I2c we have */
933static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial)
934{
935 int status;
936 __u8 data;
937
938 // Try to read type 2
939 status = TIReadVendorRequestSync (serial->serial->dev,
940 UMPC_MEMORY_READ, // Request
941 DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type)
942 0, // wIndex
943 &data, // TransferBuffer
944 0x01); // TransferBufferLength
945 if (status)
946 dbg ("%s - read 2 status error = %d", __FUNCTION__, status);
947 else
948 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
949 if ((!status) && (data == UMP5152 || data == UMP3410)) {
950 dbg ("%s - ROM_TYPE_II", __FUNCTION__);
951 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
952 return 0;
953 }
954
955 // Try to read type 3
956 status = TIReadVendorRequestSync (serial->serial->dev,
957 UMPC_MEMORY_READ, // Request
958 DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type)
959 0, // wIndex
960 &data, // TransferBuffer
961 0x01); // TransferBufferLength
962 if (status)
963 dbg ("%s - read 3 status error = %d", __FUNCTION__, status);
964 else
965 dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data);
966 if ((!status) && (data == UMP5152 || data == UMP3410)) {
967 dbg ("%s - ROM_TYPE_III", __FUNCTION__);
968 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
969 return 0;
970 }
971
972 dbg ("%s - Unknown", __FUNCTION__);
973 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
974 return -ENODEV;
975}
976
977static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent)
978{
979 int status;
980
981 status = usb_bulk_msg (serial->dev,
982 usb_sndbulkpipe(serial->dev,
983 serial->port[0]->bulk_out_endpointAddress),
984 buffer,
985 length,
986 num_sent,
987 1000);
988 return status;
989}
990
991/* Download given firmware image to the device (IN BOOT MODE) */
992static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length)
993{
994 int status = 0;
995 int pos;
996 int transfer;
997 int done;
998
999 // Transfer firmware image
1000 for (pos = 0; pos < image_length; ) {
1001 // Read the next buffer from file
1002 transfer = image_length - pos;
1003 if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
1004 transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;
1005
1006 // Transfer data
1007 status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done);
1008 if (status)
1009 break;
1010 // Advance buffer pointer
1011 pos += done;
1012 }
1013
1014 return status;
1015}
1016
1017// FIXME!!!
1018static int TIConfigureBootDevice (struct usb_device *dev)
1019{
1020 return 0;
1021}
1022
1023/**
1024 * DownloadTIFirmware - Download run-time operating firmware to the TI5052
1025 *
1026 * This routine downloads the main operating code into the TI5052, using the
1027 * boot code already burned into E2PROM or ROM.
1028 */
1029static int TIDownloadFirmware (struct edgeport_serial *serial)
1030{
1031 struct device *dev = &serial->serial->dev->dev;
1032 int status = 0;
1033 int start_address;
1034 struct edge_ti_manuf_descriptor *ti_manuf_desc;
1035 struct usb_interface_descriptor *interface;
1036 int download_cur_ver;
1037 int download_new_ver;
1038
1039 /* This routine is entered by both the BOOT mode and the Download mode
1040 * We can determine which code is running by the reading the config
1041 * descriptor and if we have only one bulk pipe it is in boot mode
1042 */
1043 serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP;
1044
1045 /* Default to type 2 i2c */
1046 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1047
1048 status = TIChooseConfiguration (serial->serial->dev);
1049 if (status)
1050 return status;
1051
1052 interface = &serial->serial->interface->cur_altsetting->desc;
1053 if (!interface) {
1054 dev_err (dev, "%s - no interface set, error!\n", __FUNCTION__);
1055 return -ENODEV;
1056 }
1057
1058 // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
1059 // if we have more than one endpoint we are definitely in download mode
1060 if (interface->bNumEndpoints > 1)
1061 serial->product_info.TiMode = TI_MODE_DOWNLOAD;
1062 else
1063 // Otherwise we will remain in configuring mode
1064 serial->product_info.TiMode = TI_MODE_CONFIGURING;
1065
1066 // Save Download Version Number
1067 OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion;
1068 OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion;
1069 OperationalCodeImageVersion.BuildNumber = PagableOperationalCodeImageVersion.BuildNumber;
1070
1071 /********************************************************************/
1072 /* Download Mode */
1073 /********************************************************************/
1074 if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
1075 struct ti_i2c_desc *rom_desc;
1076
1077 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__);
1078
1079 status = TiValidateI2cImage (serial);
1080 if (status) {
1081 dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>",
1082 __FUNCTION__);
1083 return status;
1084 }
1085
1086 /* Validate Hardware version number
1087 * Read Manufacturing Descriptor from TI Based Edgeport
1088 */
1089 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
1090 if (!ti_manuf_desc) {
1091 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1092 return -ENOMEM;
1093 }
1094 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
1095 if (status) {
1096 kfree (ti_manuf_desc);
1097 return status;
1098 }
1099
1100 // Check version number of ION descriptor
1101 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
1102 dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__,
1103 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
1104 kfree (ti_manuf_desc);
1105 return -EINVAL;
1106 }
1107
1108 rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL);
1109 if (!rom_desc) {
1110 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1111 kfree (ti_manuf_desc);
1112 return -ENOMEM;
1113 }
1114
1115 // Search for type 2 record (firmware record)
1116 if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) {
1117 struct ti_i2c_firmware_rec *firmware_version;
1118 __u8 record;
1119
1120 dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__);
1121
1122 firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL);
1123 if (!firmware_version) {
1124 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1125 kfree (rom_desc);
1126 kfree (ti_manuf_desc);
1127 return -ENOMEM;
1128 }
1129
1130 // Validate version number
1131 // Read the descriptor data
1132 status = TIReadRom (serial,
1133 start_address+sizeof(struct ti_i2c_desc),
1134 sizeof(struct ti_i2c_firmware_rec),
1135 (__u8 *)firmware_version);
1136 if (status) {
1137 kfree (firmware_version);
1138 kfree (rom_desc);
1139 kfree (ti_manuf_desc);
1140 return status;
1141 }
1142
1143 // Check version number of download with current version in I2c
1144 download_cur_ver = (firmware_version->Ver_Major << 8) +
1145 (firmware_version->Ver_Minor);
1146 download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) +
1147 (OperationalCodeImageVersion.MinorVersion);
1148
1149 dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d",
1150 __FUNCTION__,
1151 firmware_version->Ver_Major,
1152 firmware_version->Ver_Minor,
1153 OperationalCodeImageVersion.MajorVersion,
1154 OperationalCodeImageVersion.MinorVersion);
1155
1156 // Check if we have an old version in the I2C and update if necessary
1157 if (download_cur_ver != download_new_ver) {
1158 dbg ("%s - Update I2C Download from %d.%d to %d.%d",
1159 __FUNCTION__,
1160 firmware_version->Ver_Major,
1161 firmware_version->Ver_Minor,
1162 OperationalCodeImageVersion.MajorVersion,
1163 OperationalCodeImageVersion.MinorVersion);
1164
1165 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1166 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1167 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1168 // And finally when the device comes back up in download mode the driver will cause
1169 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1170 // the record type from 0xf2 to 0x02.
1171
1172 record = I2C_DESC_TYPE_FIRMWARE_BLANK;
1173
1174 // Change the I2C Firmware record type to 0xf2 to trigger an update
1175 status = TIWriteRom (serial,
1176 start_address,
1177 sizeof(record),
1178 &record);
1179 if (status) {
1180 kfree (firmware_version);
1181 kfree (rom_desc);
1182 kfree (ti_manuf_desc);
1183 return status;
1184 }
1185
1186 // verify the write -- must do this in order for write to
1187 // complete before we do the hardware reset
1188 status = TIReadRom (serial,
1189 start_address,
1190 sizeof(record),
1191 &record);
1192
1193 if (status) {
1194 kfree (firmware_version);
1195 kfree (rom_desc);
1196 kfree (ti_manuf_desc);
1197 return status;
1198 }
1199
1200 if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
1201 dev_err (dev, "%s - error resetting device\n", __FUNCTION__);
1202 kfree (firmware_version);
1203 kfree (rom_desc);
1204 kfree (ti_manuf_desc);
1205 return -ENODEV;
1206 }
1207
1208 dbg ("%s - HARDWARE RESET", __FUNCTION__);
1209
1210 // Reset UMP -- Back to BOOT MODE
1211 status = TISendVendorRequestSync (serial->serial->dev,
1212 UMPC_HARDWARE_RESET, // Request
1213 0, // wValue
1214 0, // wIndex
1215 NULL, // TransferBuffer
1216 0); // TransferBufferLength
1217
1218 dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status);
1219
1220 /* return an error on purpose. */
1221 kfree (firmware_version);
1222 kfree (rom_desc);
1223 kfree (ti_manuf_desc);
1224 return -ENODEV;
1225 }
1226 kfree (firmware_version);
1227 }
1228 // Search for type 0xF2 record (firmware blank record)
1229 else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) {
1230 #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec))
1231 __u8 *header;
1232 __u8 *vheader;
1233
1234 header = kmalloc (HEADER_SIZE, GFP_KERNEL);
1235 if (!header) {
1236 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1237 kfree (rom_desc);
1238 kfree (ti_manuf_desc);
1239 return -ENOMEM;
1240 }
1241
1242 vheader = kmalloc (HEADER_SIZE, GFP_KERNEL);
1243 if (!vheader) {
1244 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1245 kfree (header);
1246 kfree (rom_desc);
1247 kfree (ti_manuf_desc);
1248 return -ENOMEM;
1249 }
1250
1251 dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__);
1252
1253 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1254 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1255 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1256 // And finally when the device comes back up in download mode the driver will cause
1257 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1258 // the record type from 0xf2 to 0x02.
1259 status = BuildI2CFirmwareHeader(header, dev);
1260 if (status) {
1261 kfree (vheader);
1262 kfree (header);
1263 kfree (rom_desc);
1264 kfree (ti_manuf_desc);
1265 return status;
1266 }
1267
1268 // Update I2C with type 0xf2 record with correct size and checksum
1269 status = TIWriteRom (serial,
1270 start_address,
1271 HEADER_SIZE,
1272 header);
1273 if (status) {
1274 kfree (vheader);
1275 kfree (header);
1276 kfree (rom_desc);
1277 kfree (ti_manuf_desc);
1278 return status;
1279 }
1280
1281 // verify the write -- must do this in order for write to
1282 // complete before we do the hardware reset
1283 status = TIReadRom (serial,
1284 start_address,
1285 HEADER_SIZE,
1286 vheader);
1287
1288 if (status) {
1289 dbg ("%s - can't read header back", __FUNCTION__);
1290 kfree (vheader);
1291 kfree (header);
1292 kfree (rom_desc);
1293 kfree (ti_manuf_desc);
1294 return status;
1295 }
1296 if (memcmp(vheader, header, HEADER_SIZE)) {
1297 dbg ("%s - write download record failed", __FUNCTION__);
1298 kfree (vheader);
1299 kfree (header);
1300 kfree (rom_desc);
1301 kfree (ti_manuf_desc);
1302 return status;
1303 }
1304
1305 kfree (vheader);
1306 kfree (header);
1307
1308 dbg ("%s - Start firmware update", __FUNCTION__);
1309
1310 // Tell firmware to copy download image into I2C
1311 status = TISendVendorRequestSync (serial->serial->dev,
1312 UMPC_COPY_DNLD_TO_I2C, // Request
1313 0, // wValue
1314 0, // wIndex
1315 NULL, // TransferBuffer
1316 0); // TransferBufferLength
1317
1318 dbg ("%s - Update complete 0x%x", __FUNCTION__, status);
1319 if (status) {
1320 dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __FUNCTION__);
1321 kfree (rom_desc);
1322 kfree (ti_manuf_desc);
1323 return status;
1324 }
1325 }
1326
1327 // The device is running the download code
1328 kfree (rom_desc);
1329 kfree (ti_manuf_desc);
1330 return 0;
1331 }
1332
1333 /********************************************************************/
1334 /* Boot Mode */
1335 /********************************************************************/
1336 dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>",
1337 __FUNCTION__);
1338
1339 // Configure the TI device so we can use the BULK pipes for download
1340 status = TIConfigureBootDevice (serial->serial->dev);
1341 if (status)
1342 return status;
1343
1344 if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) {
1345 dbg ("%s - VID = 0x%x", __FUNCTION__,
1346 le16_to_cpu(serial->serial->dev->descriptor.idVendor));
1347 serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1348 goto StayInBootMode;
1349 }
1350
1351 // We have an ION device (I2c Must be programmed)
1352 // Determine I2C image type
1353 if (TIGetI2cTypeInBootMode(serial)) {
1354 goto StayInBootMode;
1355 }
1356
1357 // Registry variable set?
1358 if (TIStayInBootMode) {
1359 dbg ("%s - TIStayInBootMode", __FUNCTION__);
1360 goto StayInBootMode;
1361 }
1362
1363 // Check for ION Vendor ID and that the I2C is valid
1364 if (!TiValidateI2cImage(serial)) {
1365 struct ti_i2c_image_header *header;
1366 int i;
1367 __u8 cs = 0;
1368 __u8 *buffer;
1369 int buffer_size;
1370
1371 /* Validate Hardware version number
1372 * Read Manufacturing Descriptor from TI Based Edgeport
1373 */
1374 ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL);
1375 if (!ti_manuf_desc) {
1376 dev_err (dev, "%s - out of memory.\n", __FUNCTION__);
1377 return -ENOMEM;
1378 }
1379 status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc);
1380 if (status) {
1381 kfree (ti_manuf_desc);
1382 goto StayInBootMode;
1383 }
1384
1385 // Check for version 2
1386 if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) {
1387 dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__,
1388 TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev));
1389 kfree (ti_manuf_desc);
1390 goto StayInBootMode;
1391 }
1392
1393 kfree (ti_manuf_desc);
1394
1395 // In order to update the I2C firmware we must change the type 2 record to type 0xF2.
1396 // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver
1397 // will download the latest firmware (padded to 15.5k) into the UMP ram.
1398 // And finally when the device comes back up in download mode the driver will cause
1399 // the new firmware to be copied from the UMP Ram to I2C and the firmware will update
1400 // the record type from 0xf2 to 0x02.
1401
1402 /*
1403 * Do we really have to copy the whole firmware image,
1404 * or could we do this in place!
1405 */
1406
1407 // Allocate a 15.5k buffer + 3 byte header
1408 buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header));
1409 buffer = kmalloc (buffer_size, GFP_KERNEL);
1410 if (!buffer) {
1411 dev_err (dev, "%s - out of memory\n", __FUNCTION__);
1412 return -ENOMEM;
1413 }
1414
1415 // Initialize the buffer to 0xff (pad the buffer)
1416 memset (buffer, 0xff, buffer_size);
1417
1418 memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize);
1419
1420 for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) {
1421 cs = (__u8)(cs + buffer[i]);
1422 }
1423
1424 header = (struct ti_i2c_image_header *)buffer;
1425
1426 // update length and checksum after padding
1427 header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header)));
1428 header->CheckSum = cs;
1429
1430 // Download the operational code
1431 dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__);
1432 status = TIDownloadCodeImage (serial, buffer, buffer_size);
1433
1434 kfree (buffer);
1435
1436 if (status) {
1437 dbg ("%s - Error downloading operational code image", __FUNCTION__);
1438 return status;
1439 }
1440
1441 // Device will reboot
1442 serial->product_info.TiMode = TI_MODE_TRANSITIONING;
1443
1444 dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__);
1445
1446 /* return an error on purpose */
1447 return -ENODEV;
1448 }
1449
1450StayInBootMode:
1451 // Eprom is invalid or blank stay in boot mode
1452 dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__);
1453 serial->product_info.TiMode = TI_MODE_BOOT;
1454
1455 return 0;
1456}
1457
1458
1459static int TISetDtr (struct edgeport_port *port)
1460{
1461 int port_number = port->port->number - port->port->serial->minor;
1462
1463 dbg ("%s", __FUNCTION__);
1464 port->shadow_mcr |= MCR_DTR;
1465
1466 return TIWriteCommandSync (port->port->serial->dev,
1467 UMPC_SET_CLR_DTR,
1468 (__u8)(UMPM_UART1_PORT + port_number),
1469 1, /* set */
1470 NULL,
1471 0);
1472}
1473
1474static int TIClearDtr (struct edgeport_port *port)
1475{
1476 int port_number = port->port->number - port->port->serial->minor;
1477
1478 dbg ("%s", __FUNCTION__);
1479 port->shadow_mcr &= ~MCR_DTR;
1480
1481 return TIWriteCommandSync (port->port->serial->dev,
1482 UMPC_SET_CLR_DTR,
1483 (__u8)(UMPM_UART1_PORT + port_number),
1484 0, /* clear */
1485 NULL,
1486 0);
1487}
1488
1489static int TISetRts (struct edgeport_port *port)
1490{
1491 int port_number = port->port->number - port->port->serial->minor;
1492
1493 dbg ("%s", __FUNCTION__);
1494 port->shadow_mcr |= MCR_RTS;
1495
1496 return TIWriteCommandSync (port->port->serial->dev,
1497 UMPC_SET_CLR_RTS,
1498 (__u8)(UMPM_UART1_PORT + port_number),
1499 1, /* set */
1500 NULL,
1501 0);
1502}
1503
1504static int TIClearRts (struct edgeport_port *port)
1505{
1506 int port_number = port->port->number - port->port->serial->minor;
1507
1508 dbg ("%s", __FUNCTION__);
1509 port->shadow_mcr &= ~MCR_RTS;
1510
1511 return TIWriteCommandSync (port->port->serial->dev,
1512 UMPC_SET_CLR_RTS,
1513 (__u8)(UMPM_UART1_PORT + port_number),
1514 0, /* clear */
1515 NULL,
1516 0);
1517}
1518
1519static int TISetLoopBack (struct edgeport_port *port)
1520{
1521 int port_number = port->port->number - port->port->serial->minor;
1522
1523 dbg ("%s", __FUNCTION__);
1524
1525 return TIWriteCommandSync (port->port->serial->dev,
1526 UMPC_SET_CLR_LOOPBACK,
1527 (__u8)(UMPM_UART1_PORT + port_number),
1528 1, /* set */
1529 NULL,
1530 0);
1531}
1532
1533static int TIClearLoopBack (struct edgeport_port *port)
1534{
1535 int port_number = port->port->number - port->port->serial->minor;
1536
1537 dbg ("%s", __FUNCTION__);
1538
1539 return TIWriteCommandSync (port->port->serial->dev,
1540 UMPC_SET_CLR_LOOPBACK,
1541 (__u8)(UMPM_UART1_PORT + port_number),
1542 0, /* clear */
1543 NULL,
1544 0);
1545}
1546
1547static int TISetBreak (struct edgeport_port *port)
1548{
1549 int port_number = port->port->number - port->port->serial->minor;
1550
1551 dbg ("%s", __FUNCTION__);
1552
1553 return TIWriteCommandSync (port->port->serial->dev,
1554 UMPC_SET_CLR_BREAK,
1555 (__u8)(UMPM_UART1_PORT + port_number),
1556 1, /* set */
1557 NULL,
1558 0);
1559}
1560
1561static int TIClearBreak (struct edgeport_port *port)
1562{
1563 int port_number = port->port->number - port->port->serial->minor;
1564
1565 dbg ("%s", __FUNCTION__);
1566
1567 return TIWriteCommandSync (port->port->serial->dev,
1568 UMPC_SET_CLR_BREAK,
1569 (__u8)(UMPM_UART1_PORT + port_number),
1570 0, /* clear */
1571 NULL,
1572 0);
1573}
1574
1575static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr)
1576{
1577 int status = 0;
1578
1579 dbg ("%s - %x", __FUNCTION__, mcr);
1580
1581 if (mcr & MCR_DTR)
1582 status = TISetDtr (port);
1583 else
1584 status = TIClearDtr (port);
1585
1586 if (status)
1587 return status;
1588
1589 if (mcr & MCR_RTS)
1590 status = TISetRts (port);
1591 else
1592 status = TIClearRts (port);
1593
1594 if (status)
1595 return status;
1596
1597 if (mcr & MCR_LOOPBACK)
1598 status = TISetLoopBack (port);
1599 else
1600 status = TIClearLoopBack (port);
1601
1602 return status;
1603}
1604
1605
1606
1607/* Convert TI LSR to standard UART flags */
1608static __u8 MapLineStatus (__u8 ti_lsr)
1609{
1610 __u8 lsr = 0;
1611
1612#define MAP_FLAG(flagUmp, flagUart) \
1613 if (ti_lsr & flagUmp) \
1614 lsr |= flagUart;
1615
1616 MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */
1617 MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */
1618 MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */
1619 MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */
1620 MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */
1621 MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */
1622
1623#undef MAP_FLAG
1624
1625 return lsr;
1626}
1627
1628static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr)
1629{
1630 struct async_icount *icount;
1631 struct tty_struct *tty;
1632
1633 dbg ("%s - %02x", __FUNCTION__, msr);
1634
1635 if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
1636 icount = &edge_port->icount;
1637
1638 /* update input line counters */
1639 if (msr & EDGEPORT_MSR_DELTA_CTS)
1640 icount->cts++;
1641 if (msr & EDGEPORT_MSR_DELTA_DSR)
1642 icount->dsr++;
1643 if (msr & EDGEPORT_MSR_DELTA_CD)
1644 icount->dcd++;
1645 if (msr & EDGEPORT_MSR_DELTA_RI)
1646 icount->rng++;
1647 wake_up_interruptible (&edge_port->delta_msr_wait);
1648 }
1649
1650 /* Save the new modem status */
1651 edge_port->shadow_msr = msr & 0xf0;
1652
1653 tty = edge_port->port->tty;
1654 /* handle CTS flow control */
1655 if (tty && C_CRTSCTS(tty)) {
1656 if (msr & EDGEPORT_MSR_CTS) {
1657 tty->hw_stopped = 0;
1658 tty_wakeup(tty);
1659 } else {
1660 tty->hw_stopped = 1;
1661 }
1662 }
1663
1664 return;
1665}
1666
1667static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data)
1668{
1669 struct async_icount *icount;
1670 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK));
1671
1672 dbg ("%s - %02x", __FUNCTION__, new_lsr);
1673
1674 edge_port->shadow_lsr = lsr;
1675
1676 if (new_lsr & LSR_BREAK) {
1677 /*
1678 * Parity and Framing errors only count if they
1679 * occur exclusive of a break being received.
1680 */
1681 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
1682 }
1683
1684 /* Place LSR data byte into Rx buffer */
1685 if (lsr_data && edge_port->port->tty)
1686 edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1);
1687
1688 /* update input line counters */
1689 icount = &edge_port->icount;
1690 if (new_lsr & LSR_BREAK)
1691 icount->brk++;
1692 if (new_lsr & LSR_OVER_ERR)
1693 icount->overrun++;
1694 if (new_lsr & LSR_PAR_ERR)
1695 icount->parity++;
1696 if (new_lsr & LSR_FRM_ERR)
1697 icount->frame++;
1698}
1699
1700
1701static void edge_interrupt_callback (struct urb *urb, struct pt_regs *regs)
1702{
1703 struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context;
1704 struct usb_serial_port *port;
1705 struct edgeport_port *edge_port;
1706 unsigned char *data = urb->transfer_buffer;
1707 int length = urb->actual_length;
1708 int port_number;
1709 int function;
1710 int status;
1711 __u8 lsr;
1712 __u8 msr;
1713
1714 dbg("%s", __FUNCTION__);
1715
1716 switch (urb->status) {
1717 case 0:
1718 /* success */
1719 break;
1720 case -ECONNRESET:
1721 case -ENOENT:
1722 case -ESHUTDOWN:
1723 /* this urb is terminated, clean up */
1724 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1725 return;
1726 default:
1727 dev_err(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __FUNCTION__, urb->status);
1728 goto exit;
1729 }
1730
1731 if (!length) {
1732 dbg ("%s - no data in urb", __FUNCTION__);
1733 goto exit;
1734 }
1735
1736 usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data);
1737
1738 if (length != 2) {
1739 dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length);
1740 goto exit;
1741 }
1742
1743 port_number = TIUMP_GET_PORT_FROM_CODE (data[0]);
1744 function = TIUMP_GET_FUNC_FROM_CODE (data[0]);
1745 dbg ("%s - port_number %d, function %d, info 0x%x",
1746 __FUNCTION__, port_number, function, data[1]);
1747 port = edge_serial->serial->port[port_number];
1748 edge_port = usb_get_serial_port_data(port);
1749 if (!edge_port) {
1750 dbg ("%s - edge_port not found", __FUNCTION__);
1751 return;
1752 }
1753 switch (function) {
1754 case TIUMP_INTERRUPT_CODE_LSR:
1755 lsr = MapLineStatus(data[1]);
1756 if (lsr & UMP_UART_LSR_DATA_MASK) {
1757 /* Save the LSR event for bulk read completion routine */
1758 dbg ("%s - LSR Event Port %u LSR Status = %02x",
1759 __FUNCTION__, port_number, lsr);
1760 edge_port->lsr_event = 1;
1761 edge_port->lsr_mask = lsr;
1762 } else {
1763 dbg ("%s - ===== Port %d LSR Status = %02x ======",
1764 __FUNCTION__, port_number, lsr);
1765 handle_new_lsr (edge_port, 0, lsr, 0);
1766 }
1767 break;
1768
1769 case TIUMP_INTERRUPT_CODE_MSR: // MSR
1770 /* Copy MSR from UMP */
1771 msr = data[1];
1772 dbg ("%s - ===== Port %u MSR Status = %02x ======\n",
1773 __FUNCTION__, port_number, msr);
1774 handle_new_msr (edge_port, msr);
1775 break;
1776
1777 default:
1778 dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n",
1779 __FUNCTION__, data[1]);
1780 break;
1781
1782 }
1783
1784exit:
1785 status = usb_submit_urb (urb, GFP_ATOMIC);
1786 if (status)
1787 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
1788 __FUNCTION__, status);
1789}
1790
1791static void edge_bulk_in_callback (struct urb *urb, struct pt_regs *regs)
1792{
1793 struct edgeport_port *edge_port = (struct edgeport_port *)urb->context;
1794 unsigned char *data = urb->transfer_buffer;
1795 struct tty_struct *tty;
1796 int status = 0;
1797 int port_number;
1798
1799 dbg("%s", __FUNCTION__);
1800
1801 switch (urb->status) {
1802 case 0:
1803 /* success */
1804 break;
1805 case -ECONNRESET:
1806 case -ENOENT:
1807 case -ESHUTDOWN:
1808 /* this urb is terminated, clean up */
1809 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1810 return;
1811 default:
1812 dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n",
1813 __FUNCTION__, urb->status );
1814 }
1815
1816 if (urb->status == -EPIPE)
1817 goto exit;
1818
1819 if (urb->status) {
1820 dev_err(&urb->dev->dev,"%s - stopping read!\n", __FUNCTION__);
1821 return;
1822 }
1823
1824 port_number = edge_port->port->number - edge_port->port->serial->minor;
1825
1826 if (edge_port->lsr_event) {
1827 edge_port->lsr_event = 0;
1828 dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======",
1829 __FUNCTION__, port_number, edge_port->lsr_mask, *data);
1830 handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data);
1831 /* Adjust buffer length/pointer */
1832 --urb->actual_length;
1833 ++data;
1834 }
1835
1836 tty = edge_port->port->tty;
1837 if (tty && urb->actual_length) {
1838 usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, urb->actual_length, data);
1839
1840 if (edge_port->close_pending) {
1841 dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__);
1842 } else {
1843 edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length);
1844 }
1845 edge_port->icount.rx += urb->actual_length;
1846 }
1847
1848exit:
1849 /* continue read unless stopped */
1850 spin_lock(&edge_port->ep_lock);
1851 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) {
1852 urb->dev = edge_port->port->serial->dev;
1853 status = usb_submit_urb(urb, GFP_ATOMIC);
1854 } else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING) {
1855 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED;
1856 }
1857 spin_unlock(&edge_port->ep_lock);
1858 if (status)
1859 dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
1860 __FUNCTION__, status);
1861}
1862
1863static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length)
1864{
1865 int cnt;
1866
1867 do {
1868 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
1869 tty_flip_buffer_push(tty);
1870 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
1871 dev_err(dev, "%s - dropping data, %d bytes lost\n",
1872 __FUNCTION__, length);
1873 return;
1874 }
1875 }
1876 cnt = min(length, TTY_FLIPBUF_SIZE - tty->flip.count);
1877 memcpy(tty->flip.char_buf_ptr, data, cnt);
1878 memset(tty->flip.flag_buf_ptr, 0, cnt);
1879 tty->flip.char_buf_ptr += cnt;
1880 tty->flip.flag_buf_ptr += cnt;
1881 tty->flip.count += cnt;
1882 data += cnt;
1883 length -= cnt;
1884 } while (length > 0);
1885
1886 tty_flip_buffer_push(tty);
1887}
1888
1889static void edge_bulk_out_callback (struct urb *urb, struct pt_regs *regs)
1890{
1891 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1892 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1893
1894 dbg ("%s - port %d", __FUNCTION__, port->number);
1895
1896 edge_port->ep_write_urb_in_use = 0;
1897
1898 switch (urb->status) {
1899 case 0:
1900 /* success */
1901 break;
1902 case -ECONNRESET:
1903 case -ENOENT:
1904 case -ESHUTDOWN:
1905 /* this urb is terminated, clean up */
1906 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
1907 return;
1908 default:
1909 dev_err (&urb->dev->dev,"%s - nonzero write bulk status received: %d\n",
1910 __FUNCTION__, urb->status);
1911 }
1912
1913 /* send any buffered data */
1914 edge_send(port);
1915}
1916
1917static int edge_open (struct usb_serial_port *port, struct file * filp)
1918{
1919 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1920 struct edgeport_serial *edge_serial;
1921 struct usb_device *dev;
1922 struct urb *urb;
1923 int port_number;
1924 int status;
1925 u16 open_settings;
1926 u8 transaction_timeout;
1927
1928 dbg("%s - port %d", __FUNCTION__, port->number);
1929
1930 if (edge_port == NULL)
1931 return -ENODEV;
1932
1933 if (port->tty)
1934 port->tty->low_latency = low_latency;
1935
1936 port_number = port->number - port->serial->minor;
1937 switch (port_number) {
1938 case 0:
1939 edge_port->uart_base = UMPMEM_BASE_UART1;
1940 edge_port->dma_address = UMPD_OEDB1_ADDRESS;
1941 break;
1942 case 1:
1943 edge_port->uart_base = UMPMEM_BASE_UART2;
1944 edge_port->dma_address = UMPD_OEDB2_ADDRESS;
1945 break;
1946 default:
1947 dev_err (&port->dev, "Unknown port number!!!\n");
1948 return -ENODEV;
1949 }
1950
1951 dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x",
1952 __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address);
1953
1954 dev = port->serial->dev;
1955
1956 memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount));
1957 init_waitqueue_head (&edge_port->delta_msr_wait);
1958
1959 /* turn off loopback */
1960 status = TIClearLoopBack (edge_port);
1961 if (status) {
1962 dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n",
1963 __FUNCTION__, status);
1964 return status;
1965 }
1966
1967 /* set up the port settings */
1968 edge_set_termios (port, NULL);
1969
1970 /* open up the port */
1971
1972 /* milliseconds to timeout for DMA transfer */
1973 transaction_timeout = 2;
1974
1975 edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) );
1976
1977 // milliseconds to timeout for DMA transfer
1978 open_settings = (u8)(UMP_DMA_MODE_CONTINOUS |
1979 UMP_PIPE_TRANS_TIMEOUT_ENA |
1980 (transaction_timeout << 2));
1981
1982 dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__);
1983
1984 /* Tell TI to open and start the port */
1985 status = TIWriteCommandSync (dev,
1986 UMPC_OPEN_PORT,
1987 (u8)(UMPM_UART1_PORT + port_number),
1988 open_settings,
1989 NULL,
1990 0);
1991 if (status) {
1992 dev_err(&port->dev,"%s - cannot send open command, %d\n", __FUNCTION__, status);
1993 return status;
1994 }
1995
1996 /* Start the DMA? */
1997 status = TIWriteCommandSync (dev,
1998 UMPC_START_PORT,
1999 (u8)(UMPM_UART1_PORT + port_number),
2000 0,
2001 NULL,
2002 0);
2003 if (status) {
2004 dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __FUNCTION__, status);
2005 return status;
2006 }
2007
2008 /* Clear TX and RX buffers in UMP */
2009 status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
2010 if (status) {
2011 dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __FUNCTION__, status);
2012 return status;
2013 }
2014
2015 /* Read Initial MSR */
2016 status = TIReadVendorRequestSync (dev,
2017 UMPC_READ_MSR, // Request
2018 0, // wValue
2019 (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address)
2020 &edge_port->shadow_msr, // TransferBuffer
2021 1); // TransferBufferLength
2022 if (status) {
2023 dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __FUNCTION__, status);
2024 return status;
2025 }
2026
2027 dbg ("ShadowMSR 0x%X", edge_port->shadow_msr);
2028
2029 /* Set Initial MCR */
2030 edge_port->shadow_mcr = MCR_RTS | MCR_DTR;
2031 dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr);
2032
2033 edge_serial = edge_port->edge_serial;
2034 if (down_interruptible(&edge_serial->es_sem))
2035 return -ERESTARTSYS;
2036 if (edge_serial->num_ports_open == 0) {
2037 /* we are the first port to be opened, let's post the interrupt urb */
2038 urb = edge_serial->serial->port[0]->interrupt_in_urb;
2039 if (!urb) {
2040 dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __FUNCTION__);
2041 status = -EINVAL;
2042 goto up_es_sem;
2043 }
2044 urb->complete = edge_interrupt_callback;
2045 urb->context = edge_serial;
2046 urb->dev = dev;
2047 status = usb_submit_urb (urb, GFP_KERNEL);
2048 if (status) {
2049 dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2050 goto up_es_sem;
2051 }
2052 }
2053
2054 /*
2055 * reset the data toggle on the bulk endpoints to work around bug in
2056 * host controllers where things get out of sync some times
2057 */
2058 usb_clear_halt (dev, port->write_urb->pipe);
2059 usb_clear_halt (dev, port->read_urb->pipe);
2060
2061 /* start up our bulk read urb */
2062 urb = port->read_urb;
2063 if (!urb) {
2064 dev_err (&port->dev, "%s - no read urb present, exiting\n", __FUNCTION__);
2065 status = -EINVAL;
2066 goto unlink_int_urb;
2067 }
2068 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
2069 urb->complete = edge_bulk_in_callback;
2070 urb->context = edge_port;
2071 urb->dev = dev;
2072 status = usb_submit_urb (urb, GFP_KERNEL);
2073 if (status) {
2074 dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2075 goto unlink_int_urb;
2076 }
2077
2078 ++edge_serial->num_ports_open;
2079
2080 dbg("%s - exited", __FUNCTION__);
2081
2082 goto up_es_sem;
2083
2084unlink_int_urb:
2085 if (edge_port->edge_serial->num_ports_open == 0)
2086 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
2087up_es_sem:
2088 up(&edge_serial->es_sem);
2089 return status;
2090}
2091
2092static void edge_close (struct usb_serial_port *port, struct file *filp)
2093{
2094 struct edgeport_serial *edge_serial;
2095 struct edgeport_port *edge_port;
2096 int port_number;
2097 int status;
2098
2099 dbg("%s - port %d", __FUNCTION__, port->number);
2100
2101 edge_serial = usb_get_serial_data(port->serial);
2102 edge_port = usb_get_serial_port_data(port);
2103 if ((edge_serial == NULL) || (edge_port == NULL))
2104 return;
2105
2106 /* The bulkreadcompletion routine will check
2107 * this flag and dump add read data */
2108 edge_port->close_pending = 1;
2109
2110 /* chase the port close and flush */
2111 TIChasePort (edge_port, (HZ*closing_wait)/100, 1);
2112
2113 usb_kill_urb(port->read_urb);
2114 usb_kill_urb(port->write_urb);
2115 edge_port->ep_write_urb_in_use = 0;
2116
2117 /* assuming we can still talk to the device,
2118 * send a close port command to it */
2119 dbg("%s - send umpc_close_port", __FUNCTION__);
2120 port_number = port->number - port->serial->minor;
2121 status = TIWriteCommandSync (port->serial->dev,
2122 UMPC_CLOSE_PORT,
2123 (__u8)(UMPM_UART1_PORT + port_number),
2124 0,
2125 NULL,
2126 0);
2127 down(&edge_serial->es_sem);
2128 --edge_port->edge_serial->num_ports_open;
2129 if (edge_port->edge_serial->num_ports_open <= 0) {
2130 /* last port is now closed, let's shut down our interrupt urb */
2131 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
2132 edge_port->edge_serial->num_ports_open = 0;
2133 }
2134 up(&edge_serial->es_sem);
2135 edge_port->close_pending = 0;
2136
2137 dbg("%s - exited", __FUNCTION__);
2138}
2139
2140static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count)
2141{
2142 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2143 unsigned long flags;
2144
2145 dbg("%s - port %d", __FUNCTION__, port->number);
2146
2147 if (count == 0) {
2148 dbg("%s - write request of 0 bytes", __FUNCTION__);
2149 return 0;
2150 }
2151
2152 if (edge_port == NULL)
2153 return -ENODEV;
2154 if (edge_port->close_pending == 1)
2155 return -ENODEV;
2156
2157 spin_lock_irqsave(&edge_port->ep_lock, flags);
2158 count = edge_buf_put(edge_port->ep_out_buf, data, count);
2159 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2160
2161 edge_send(port);
2162
2163 return count;
2164}
2165
2166static void edge_send(struct usb_serial_port *port)
2167{
2168 int count, result;
2169 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2170 struct tty_struct *tty = port->tty;
2171 unsigned long flags;
2172
2173
2174 dbg("%s - port %d", __FUNCTION__, port->number);
2175
2176 spin_lock_irqsave(&edge_port->ep_lock, flags);
2177
2178 if (edge_port->ep_write_urb_in_use) {
2179 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2180 return;
2181 }
2182
2183 count = edge_buf_get(edge_port->ep_out_buf,
2184 port->write_urb->transfer_buffer,
2185 port->bulk_out_size);
2186
2187 if (count == 0) {
2188 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2189 return;
2190 }
2191
2192 edge_port->ep_write_urb_in_use = 1;
2193
2194 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2195
2196 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
2197
2198 /* set up our urb */
2199 usb_fill_bulk_urb (port->write_urb, port->serial->dev,
2200 usb_sndbulkpipe (port->serial->dev,
2201 port->bulk_out_endpointAddress),
2202 port->write_urb->transfer_buffer, count,
2203 edge_bulk_out_callback,
2204 port);
2205
2206 /* send the data out the bulk port */
2207 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
2208 if (result) {
2209 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
2210 edge_port->ep_write_urb_in_use = 0;
2211 // TODO: reschedule edge_send
2212 } else {
2213 edge_port->icount.tx += count;
2214 }
2215
2216 /* wakeup any process waiting for writes to complete */
2217 /* there is now more room in the buffer for new writes */
2218 if (tty) {
2219 /* let the tty driver wakeup if it has a special write_wakeup function */
2220 tty_wakeup(tty);
2221 }
2222}
2223
2224static int edge_write_room (struct usb_serial_port *port)
2225{
2226 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2227 int room = 0;
2228 unsigned long flags;
2229
2230 dbg("%s - port %d", __FUNCTION__, port->number);
2231
2232 if (edge_port == NULL)
2233 return -ENODEV;
2234 if (edge_port->close_pending == 1)
2235 return -ENODEV;
2236
2237 spin_lock_irqsave(&edge_port->ep_lock, flags);
2238 room = edge_buf_space_avail(edge_port->ep_out_buf);
2239 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2240
2241 dbg("%s - returns %d", __FUNCTION__, room);
2242 return room;
2243}
2244
2245static int edge_chars_in_buffer (struct usb_serial_port *port)
2246{
2247 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2248 int chars = 0;
2249 unsigned long flags;
2250
2251 dbg("%s - port %d", __FUNCTION__, port->number);
2252
2253 if (edge_port == NULL)
2254 return -ENODEV;
2255 if (edge_port->close_pending == 1)
2256 return -ENODEV;
2257
2258 spin_lock_irqsave(&edge_port->ep_lock, flags);
2259 chars = edge_buf_data_avail(edge_port->ep_out_buf);
2260 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2261
2262 dbg ("%s - returns %d", __FUNCTION__, chars);
2263 return chars;
2264}
2265
2266static void edge_throttle (struct usb_serial_port *port)
2267{
2268 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2269 struct tty_struct *tty;
2270 int status;
2271
2272 dbg("%s - port %d", __FUNCTION__, port->number);
2273
2274 if (edge_port == NULL)
2275 return;
2276
2277 tty = port->tty;
2278 if (!tty) {
2279 dbg ("%s - no tty available", __FUNCTION__);
2280 return;
2281 }
2282
2283 /* if we are implementing XON/XOFF, send the stop character */
2284 if (I_IXOFF(tty)) {
2285 unsigned char stop_char = STOP_CHAR(tty);
2286 status = edge_write (port, &stop_char, 1);
2287 if (status <= 0) {
2288 dev_err(&port->dev, "%s - failed to write stop character, %d\n", __FUNCTION__, status);
2289 }
2290 }
2291
2292 /* if we are implementing RTS/CTS, stop reads */
2293 /* and the Edgeport will clear the RTS line */
2294 if (C_CRTSCTS(tty))
2295 stop_read(edge_port);
2296
2297}
2298
2299static void edge_unthrottle (struct usb_serial_port *port)
2300{
2301 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2302 struct tty_struct *tty;
2303 int status;
2304
2305 dbg("%s - port %d", __FUNCTION__, port->number);
2306
2307 if (edge_port == NULL)
2308 return;
2309
2310 tty = port->tty;
2311 if (!tty) {
2312 dbg ("%s - no tty available", __FUNCTION__);
2313 return;
2314 }
2315
2316 /* if we are implementing XON/XOFF, send the start character */
2317 if (I_IXOFF(tty)) {
2318 unsigned char start_char = START_CHAR(tty);
2319 status = edge_write (port, &start_char, 1);
2320 if (status <= 0) {
2321 dev_err(&port->dev, "%s - failed to write start character, %d\n", __FUNCTION__, status);
2322 }
2323 }
2324
2325 /* if we are implementing RTS/CTS, restart reads */
2326 /* are the Edgeport will assert the RTS line */
2327 if (C_CRTSCTS(tty)) {
2328 status = restart_read(edge_port);
2329 if (status)
2330 dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status);
2331 }
2332
2333}
2334
2335static void stop_read(struct edgeport_port *edge_port)
2336{
2337 unsigned long flags;
2338
2339 spin_lock_irqsave(&edge_port->ep_lock, flags);
2340
2341 if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
2342 edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING;
2343 edge_port->shadow_mcr &= ~MCR_RTS;
2344
2345 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2346}
2347
2348static int restart_read(struct edgeport_port *edge_port)
2349{
2350 struct urb *urb;
2351 int status = 0;
2352 unsigned long flags;
2353
2354 spin_lock_irqsave(&edge_port->ep_lock, flags);
2355
2356 if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) {
2357 urb = edge_port->port->read_urb;
2358 urb->complete = edge_bulk_in_callback;
2359 urb->context = edge_port;
2360 urb->dev = edge_port->port->serial->dev;
2361 status = usb_submit_urb(urb, GFP_KERNEL);
2362 }
2363 edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
2364 edge_port->shadow_mcr |= MCR_RTS;
2365
2366 spin_unlock_irqrestore(&edge_port->ep_lock, flags);
2367
2368 return status;
2369}
2370
2371static void change_port_settings (struct edgeport_port *edge_port, struct termios *old_termios)
2372{
2373 struct ump_uart_config *config;
2374 struct tty_struct *tty;
2375 int baud;
2376 unsigned cflag;
2377 int status;
2378 int port_number = edge_port->port->number - edge_port->port->serial->minor;
2379
2380 dbg("%s - port %d", __FUNCTION__, edge_port->port->number);
2381
2382 tty = edge_port->port->tty;
2383 if ((!tty) ||
2384 (!tty->termios)) {
2385 dbg("%s - no tty structures", __FUNCTION__);
2386 return;
2387 }
2388
2389 config = kmalloc (sizeof (*config), GFP_KERNEL);
2390 if (!config) {
2391 dev_err (&edge_port->port->dev, "%s - out of memory\n", __FUNCTION__);
2392 return;
2393 }
2394
2395 cflag = tty->termios->c_cflag;
2396
2397 config->wFlags = 0;
2398
2399 /* These flags must be set */
2400 config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT;
2401 config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR;
2402 config->bUartMode = (__u8)(edge_port->bUartMode);
2403
2404 switch (cflag & CSIZE) {
2405 case CS5:
2406 config->bDataBits = UMP_UART_CHAR5BITS;
2407 dbg ("%s - data bits = 5", __FUNCTION__);
2408 break;
2409 case CS6:
2410 config->bDataBits = UMP_UART_CHAR6BITS;
2411 dbg ("%s - data bits = 6", __FUNCTION__);
2412 break;
2413 case CS7:
2414 config->bDataBits = UMP_UART_CHAR7BITS;
2415 dbg ("%s - data bits = 7", __FUNCTION__);
2416 break;
2417 default:
2418 case CS8:
2419 config->bDataBits = UMP_UART_CHAR8BITS;
2420 dbg ("%s - data bits = 8", __FUNCTION__);
2421 break;
2422 }
2423
2424 if (cflag & PARENB) {
2425 if (cflag & PARODD) {
2426 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
2427 config->bParity = UMP_UART_ODDPARITY;
2428 dbg("%s - parity = odd", __FUNCTION__);
2429 } else {
2430 config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
2431 config->bParity = UMP_UART_EVENPARITY;
2432 dbg("%s - parity = even", __FUNCTION__);
2433 }
2434 } else {
2435 config->bParity = UMP_UART_NOPARITY;
2436 dbg("%s - parity = none", __FUNCTION__);
2437 }
2438
2439 if (cflag & CSTOPB) {
2440 config->bStopBits = UMP_UART_STOPBIT2;
2441 dbg("%s - stop bits = 2", __FUNCTION__);
2442 } else {
2443 config->bStopBits = UMP_UART_STOPBIT1;
2444 dbg("%s - stop bits = 1", __FUNCTION__);
2445 }
2446
2447 /* figure out the flow control settings */
2448 if (cflag & CRTSCTS) {
2449 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW;
2450 config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW;
2451 dbg("%s - RTS/CTS is enabled", __FUNCTION__);
2452 } else {
2453 dbg("%s - RTS/CTS is disabled", __FUNCTION__);
2454 tty->hw_stopped = 0;
2455 restart_read(edge_port);
2456 }
2457
2458 /* if we are implementing XON/XOFF, set the start and stop character in the device */
2459 if (I_IXOFF(tty) || I_IXON(tty)) {
2460 config->cXon = START_CHAR(tty);
2461 config->cXoff = STOP_CHAR(tty);
2462
2463 /* if we are implementing INBOUND XON/XOFF */
2464 if (I_IXOFF(tty)) {
2465 config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
2466 dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2467 __FUNCTION__, config->cXon, config->cXoff);
2468 } else {
2469 dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__);
2470 }
2471
2472 /* if we are implementing OUTBOUND XON/XOFF */
2473 if (I_IXON(tty)) {
2474 config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
2475 dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x",
2476 __FUNCTION__, config->cXon, config->cXoff);
2477 } else {
2478 dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__);
2479 }
2480 }
2481
2482 /* Round the baud rate */
2483 baud = tty_get_baud_rate(tty);
2484 if (!baud) {
2485 /* pick a default, any default... */
2486 baud = 9600;
2487 }
2488 edge_port->baud_rate = baud;
2489 config->wBaudRate = (__u16)((461550L + baud/2) / baud);
2490
2491 dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate);
2492
2493 dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate));
2494 dbg ("wFlags: 0x%x", config->wFlags);
2495 dbg ("bDataBits: %d", config->bDataBits);
2496 dbg ("bParity: %d", config->bParity);
2497 dbg ("bStopBits: %d", config->bStopBits);
2498 dbg ("cXon: %d", config->cXon);
2499 dbg ("cXoff: %d", config->cXoff);
2500 dbg ("bUartMode: %d", config->bUartMode);
2501
2502 /* move the word values into big endian mode */
2503 cpu_to_be16s (&config->wFlags);
2504 cpu_to_be16s (&config->wBaudRate);
2505
2506 status = TIWriteCommandSync (edge_port->port->serial->dev,
2507 UMPC_SET_CONFIG,
2508 (__u8)(UMPM_UART1_PORT + port_number),
2509 0,
2510 (__u8 *)config,
2511 sizeof(*config));
2512 if (status) {
2513 dbg ("%s - error %d when trying to write config to device",
2514 __FUNCTION__, status);
2515 }
2516
2517 kfree (config);
2518
2519 return;
2520}
2521
2522static void edge_set_termios (struct usb_serial_port *port, struct termios *old_termios)
2523{
2524 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2525 struct tty_struct *tty = port->tty;
2526 unsigned int cflag;
2527
2528 if (!port->tty || !port->tty->termios) {
2529 dbg ("%s - no tty or termios", __FUNCTION__);
2530 return;
2531 }
2532
2533 cflag = tty->termios->c_cflag;
2534 /* check that they really want us to change something */
2535 if (old_termios) {
2536 if (cflag == old_termios->c_cflag &&
2537 tty->termios->c_iflag == old_termios->c_iflag) {
2538 dbg ("%s - nothing to change", __FUNCTION__);
2539 return;
2540 }
2541 }
2542
2543 dbg("%s - clfag %08x iflag %08x", __FUNCTION__,
2544 tty->termios->c_cflag, tty->termios->c_iflag);
2545 if (old_termios) {
2546 dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__,
2547 old_termios->c_cflag, old_termios->c_iflag);
2548 }
2549
2550 dbg("%s - port %d", __FUNCTION__, port->number);
2551
2552 if (edge_port == NULL)
2553 return;
2554
2555 /* change the port settings to the new ones specified */
2556 change_port_settings (edge_port, old_termios);
2557
2558 return;
2559}
2560
2561static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear)
2562{
2563 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2564 unsigned int mcr;
2565
2566 dbg("%s - port %d", __FUNCTION__, port->number);
2567
2568 mcr = edge_port->shadow_mcr;
2569 if (set & TIOCM_RTS)
2570 mcr |= MCR_RTS;
2571 if (set & TIOCM_DTR)
2572 mcr |= MCR_DTR;
2573 if (set & TIOCM_LOOP)
2574 mcr |= MCR_LOOPBACK;
2575
2576 if (clear & TIOCM_RTS)
2577 mcr &= ~MCR_RTS;
2578 if (clear & TIOCM_DTR)
2579 mcr &= ~MCR_DTR;
2580 if (clear & TIOCM_LOOP)
2581 mcr &= ~MCR_LOOPBACK;
2582
2583 edge_port->shadow_mcr = mcr;
2584
2585 TIRestoreMCR (edge_port, mcr);
2586
2587 return 0;
2588}
2589
2590static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
2591{
2592 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2593 unsigned int result = 0;
2594 unsigned int msr;
2595 unsigned int mcr;
2596
2597 dbg("%s - port %d", __FUNCTION__, port->number);
2598
2599 msr = edge_port->shadow_msr;
2600 mcr = edge_port->shadow_mcr;
2601 result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */
2602 | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */
2603 | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */
2604 | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */
2605 | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */
2606 | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */
2607
2608
2609 dbg("%s -- %x", __FUNCTION__, result);
2610
2611 return result;
2612}
2613
2614static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo)
2615{
2616 struct serial_struct tmp;
2617
2618 if (!retinfo)
2619 return -EFAULT;
2620
2621 memset(&tmp, 0, sizeof(tmp));
2622
2623 tmp.type = PORT_16550A;
2624 tmp.line = edge_port->port->serial->minor;
2625 tmp.port = edge_port->port->number;
2626 tmp.irq = 0;
2627 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
2628 tmp.xmit_fifo_size = edge_port->port->bulk_out_size;
2629 tmp.baud_base = 9600;
2630 tmp.close_delay = 5*HZ;
2631 tmp.closing_wait = closing_wait;
2632// tmp.custom_divisor = state->custom_divisor;
2633// tmp.hub6 = state->hub6;
2634// tmp.io_type = state->io_type;
2635
2636
2637 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
2638 return -EFAULT;
2639 return 0;
2640}
2641
2642static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
2643{
2644 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2645 struct async_icount cnow;
2646 struct async_icount cprev;
2647
2648 dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd);
2649
2650 switch (cmd) {
2651 case TIOCINQ:
2652 dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number);
2653// return get_number_bytes_avail(edge_port, (unsigned int *) arg);
2654 break;
2655
2656 case TIOCSERGETLSR:
2657 dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number);
2658// return get_lsr_info(edge_port, (unsigned int *) arg);
2659 break;
2660
2661 case TIOCGSERIAL:
2662 dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number);
2663 return get_serial_info(edge_port, (struct serial_struct __user *) arg);
2664 break;
2665
2666 case TIOCSSERIAL:
2667 dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number);
2668 break;
2669
2670 case TIOCMIWAIT:
2671 dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number);
2672 cprev = edge_port->icount;
2673 while (1) {
2674 interruptible_sleep_on(&edge_port->delta_msr_wait);
2675 /* see if a signal did it */
2676 if (signal_pending(current))
2677 return -ERESTARTSYS;
2678 cnow = edge_port->icount;
2679 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2680 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
2681 return -EIO; /* no change => error */
2682 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2683 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2684 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2685 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
2686 return 0;
2687 }
2688 cprev = cnow;
2689 }
2690 /* not reached */
2691 break;
2692
2693 case TIOCGICOUNT:
2694 dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__,
2695 port->number, edge_port->icount.rx, edge_port->icount.tx);
2696 if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount)))
2697 return -EFAULT;
2698 return 0;
2699 }
2700
2701 return -ENOIOCTLCMD;
2702}
2703
2704static void edge_break (struct usb_serial_port *port, int break_state)
2705{
2706 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2707 int status;
2708
2709 dbg ("%s - state = %d", __FUNCTION__, break_state);
2710
2711 /* chase the port close */
2712 TIChasePort (edge_port, 0, 0);
2713
2714 if (break_state == -1) {
2715 status = TISetBreak (edge_port);
2716 } else {
2717 status = TIClearBreak (edge_port);
2718 }
2719 if (status) {
2720 dbg ("%s - error %d sending break set/clear command.",
2721 __FUNCTION__, status);
2722 }
2723}
2724
2725static int edge_startup (struct usb_serial *serial)
2726{
2727 struct edgeport_serial *edge_serial;
2728 struct edgeport_port *edge_port;
2729 struct usb_device *dev;
2730 int status;
2731 int i;
2732
2733 dev = serial->dev;
2734
2735 /* create our private serial structure */
2736 edge_serial = kmalloc (sizeof(struct edgeport_serial), GFP_KERNEL);
2737 if (edge_serial == NULL) {
2738 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2739 return -ENOMEM;
2740 }
2741 memset (edge_serial, 0, sizeof(struct edgeport_serial));
2742 sema_init(&edge_serial->es_sem, 1);
2743 edge_serial->serial = serial;
2744 usb_set_serial_data(serial, edge_serial);
2745
2746 status = TIDownloadFirmware (edge_serial);
2747 if (status) {
2748 kfree (edge_serial);
2749 return status;
2750 }
2751
2752 /* set up our port private structures */
2753 for (i = 0; i < serial->num_ports; ++i) {
2754 edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL);
2755 if (edge_port == NULL) {
2756 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2757 goto cleanup;
2758 }
2759 memset (edge_port, 0, sizeof(struct edgeport_port));
2760 spin_lock_init(&edge_port->ep_lock);
2761 edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE);
2762 if (edge_port->ep_out_buf == NULL) {
2763 dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__);
2764 kfree(edge_port);
2765 goto cleanup;
2766 }
2767 edge_port->port = serial->port[i];
2768 edge_port->edge_serial = edge_serial;
2769 usb_set_serial_port_data(serial->port[i], edge_port);
2770 edge_port->bUartMode = 0; /* Default is RS232 */
2771 }
2772
2773 return 0;
2774
2775cleanup:
2776 for (--i; i>=0; --i) {
2777 edge_port = usb_get_serial_port_data(serial->port[i]);
2778 edge_buf_free(edge_port->ep_out_buf);
2779 kfree(edge_port);
2780 usb_set_serial_port_data(serial->port[i], NULL);
2781 }
2782 kfree (edge_serial);
2783 usb_set_serial_data(serial, NULL);
2784 return -ENOMEM;
2785}
2786
2787static void edge_shutdown (struct usb_serial *serial)
2788{
2789 int i;
2790 struct edgeport_port *edge_port;
2791
2792 dbg ("%s", __FUNCTION__);
2793
2794 for (i=0; i < serial->num_ports; ++i) {
2795 edge_port = usb_get_serial_port_data(serial->port[i]);
2796 if (edge_port) {
2797 edge_buf_free(edge_port->ep_out_buf);
2798 kfree(edge_port);
2799 }
2800 usb_set_serial_port_data(serial->port[i], NULL);
2801 }
2802 kfree (usb_get_serial_data(serial));
2803 usb_set_serial_data(serial, NULL);
2804}
2805
2806
2807/* Circular Buffer */
2808
2809/*
2810 * edge_buf_alloc
2811 *
2812 * Allocate a circular buffer and all associated memory.
2813 */
2814
2815static struct edge_buf *edge_buf_alloc(unsigned int size)
2816{
2817 struct edge_buf *eb;
2818
2819
2820 if (size == 0)
2821 return NULL;
2822
2823 eb = (struct edge_buf *)kmalloc(sizeof(struct edge_buf), GFP_KERNEL);
2824 if (eb == NULL)
2825 return NULL;
2826
2827 eb->buf_buf = kmalloc(size, GFP_KERNEL);
2828 if (eb->buf_buf == NULL) {
2829 kfree(eb);
2830 return NULL;
2831 }
2832
2833 eb->buf_size = size;
2834 eb->buf_get = eb->buf_put = eb->buf_buf;
2835
2836 return eb;
2837}
2838
2839
2840/*
2841 * edge_buf_free
2842 *
2843 * Free the buffer and all associated memory.
2844 */
2845
2846void edge_buf_free(struct edge_buf *eb)
2847{
2848 if (eb != NULL) {
2849 if (eb->buf_buf != NULL)
2850 kfree(eb->buf_buf);
2851 kfree(eb);
2852 }
2853}
2854
2855
2856/*
2857 * edge_buf_clear
2858 *
2859 * Clear out all data in the circular buffer.
2860 */
2861
2862static void edge_buf_clear(struct edge_buf *eb)
2863{
2864 if (eb != NULL)
2865 eb->buf_get = eb->buf_put;
2866 /* equivalent to a get of all data available */
2867}
2868
2869
2870/*
2871 * edge_buf_data_avail
2872 *
2873 * Return the number of bytes of data available in the circular
2874 * buffer.
2875 */
2876
2877static unsigned int edge_buf_data_avail(struct edge_buf *eb)
2878{
2879 if (eb != NULL)
2880 return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size);
2881 else
2882 return 0;
2883}
2884
2885
2886/*
2887 * edge_buf_space_avail
2888 *
2889 * Return the number of bytes of space available in the circular
2890 * buffer.
2891 */
2892
2893static unsigned int edge_buf_space_avail(struct edge_buf *eb)
2894{
2895 if (eb != NULL)
2896 return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size);
2897 else
2898 return 0;
2899}
2900
2901
2902/*
2903 * edge_buf_put
2904 *
2905 * Copy data data from a user buffer and put it into the circular buffer.
2906 * Restrict to the amount of space available.
2907 *
2908 * Return the number of bytes copied.
2909 */
2910
2911static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf,
2912 unsigned int count)
2913{
2914 unsigned int len;
2915
2916
2917 if (eb == NULL)
2918 return 0;
2919
2920 len = edge_buf_space_avail(eb);
2921 if (count > len)
2922 count = len;
2923
2924 if (count == 0)
2925 return 0;
2926
2927 len = eb->buf_buf + eb->buf_size - eb->buf_put;
2928 if (count > len) {
2929 memcpy(eb->buf_put, buf, len);
2930 memcpy(eb->buf_buf, buf+len, count - len);
2931 eb->buf_put = eb->buf_buf + count - len;
2932 } else {
2933 memcpy(eb->buf_put, buf, count);
2934 if (count < len)
2935 eb->buf_put += count;
2936 else /* count == len */
2937 eb->buf_put = eb->buf_buf;
2938 }
2939
2940 return count;
2941}
2942
2943
2944/*
2945 * edge_buf_get
2946 *
2947 * Get data from the circular buffer and copy to the given buffer.
2948 * Restrict to the amount of data available.
2949 *
2950 * Return the number of bytes copied.
2951 */
2952
2953static unsigned int edge_buf_get(struct edge_buf *eb, char *buf,
2954 unsigned int count)
2955{
2956 unsigned int len;
2957
2958
2959 if (eb == NULL)
2960 return 0;
2961
2962 len = edge_buf_data_avail(eb);
2963 if (count > len)
2964 count = len;
2965
2966 if (count == 0)
2967 return 0;
2968
2969 len = eb->buf_buf + eb->buf_size - eb->buf_get;
2970 if (count > len) {
2971 memcpy(buf, eb->buf_get, len);
2972 memcpy(buf+len, eb->buf_buf, count - len);
2973 eb->buf_get = eb->buf_buf + count - len;
2974 } else {
2975 memcpy(buf, eb->buf_get, count);
2976 if (count < len)
2977 eb->buf_get += count;
2978 else /* count == len */
2979 eb->buf_get = eb->buf_buf;
2980 }
2981
2982 return count;
2983}
2984
2985
2986static struct usb_serial_device_type edgeport_1port_device = {
2987 .owner = THIS_MODULE,
2988 .name = "Edgeport TI 1 port adapter",
2989 .short_name = "edgeport_ti_1",
2990 .id_table = edgeport_1port_id_table,
2991 .num_interrupt_in = 1,
2992 .num_bulk_in = 1,
2993 .num_bulk_out = 1,
2994 .num_ports = 1,
2995 .open = edge_open,
2996 .close = edge_close,
2997 .throttle = edge_throttle,
2998 .unthrottle = edge_unthrottle,
2999 .attach = edge_startup,
3000 .shutdown = edge_shutdown,
3001 .ioctl = edge_ioctl,
3002 .set_termios = edge_set_termios,
3003 .tiocmget = edge_tiocmget,
3004 .tiocmset = edge_tiocmset,
3005 .write = edge_write,
3006 .write_room = edge_write_room,
3007 .chars_in_buffer = edge_chars_in_buffer,
3008 .break_ctl = edge_break,
3009 .read_int_callback = edge_interrupt_callback,
3010 .read_bulk_callback = edge_bulk_in_callback,
3011 .write_bulk_callback = edge_bulk_out_callback,
3012};
3013
3014static struct usb_serial_device_type edgeport_2port_device = {
3015 .owner = THIS_MODULE,
3016 .name = "Edgeport TI 2 port adapter",
3017 .short_name = "edgeport_ti_2",
3018 .id_table = edgeport_2port_id_table,
3019 .num_interrupt_in = 1,
3020 .num_bulk_in = 2,
3021 .num_bulk_out = 2,
3022 .num_ports = 2,
3023 .open = edge_open,
3024 .close = edge_close,
3025 .throttle = edge_throttle,
3026 .unthrottle = edge_unthrottle,
3027 .attach = edge_startup,
3028 .shutdown = edge_shutdown,
3029 .ioctl = edge_ioctl,
3030 .set_termios = edge_set_termios,
3031 .tiocmget = edge_tiocmget,
3032 .tiocmset = edge_tiocmset,
3033 .write = edge_write,
3034 .write_room = edge_write_room,
3035 .chars_in_buffer = edge_chars_in_buffer,
3036 .break_ctl = edge_break,
3037 .read_int_callback = edge_interrupt_callback,
3038 .read_bulk_callback = edge_bulk_in_callback,
3039 .write_bulk_callback = edge_bulk_out_callback,
3040};
3041
3042
3043static int __init edgeport_init(void)
3044{
3045 int retval;
3046 retval = usb_serial_register(&edgeport_1port_device);
3047 if (retval)
3048 goto failed_1port_device_register;
3049 retval = usb_serial_register(&edgeport_2port_device);
3050 if (retval)
3051 goto failed_2port_device_register;
3052 retval = usb_register(&io_driver);
3053 if (retval)
3054 goto failed_usb_register;
3055 info(DRIVER_DESC " " DRIVER_VERSION);
3056 return 0;
3057failed_usb_register:
3058 usb_serial_deregister(&edgeport_2port_device);
3059failed_2port_device_register:
3060 usb_serial_deregister(&edgeport_1port_device);
3061failed_1port_device_register:
3062 return retval;
3063}
3064
3065static void __exit edgeport_exit (void)
3066{
3067 usb_deregister (&io_driver);
3068 usb_serial_deregister (&edgeport_1port_device);
3069 usb_serial_deregister (&edgeport_2port_device);
3070}
3071
3072module_init(edgeport_init);
3073module_exit(edgeport_exit);
3074
3075/* Module information */
3076MODULE_AUTHOR(DRIVER_AUTHOR);
3077MODULE_DESCRIPTION(DRIVER_DESC);
3078MODULE_LICENSE("GPL");
3079
3080module_param(debug, bool, S_IRUGO | S_IWUSR);
3081MODULE_PARM_DESC(debug, "Debug enabled or not");
3082
3083module_param(low_latency, bool, S_IRUGO | S_IWUSR);
3084MODULE_PARM_DESC(low_latency, "Low latency enabled or not");
3085
3086module_param(closing_wait, int, S_IRUGO | S_IWUSR);
3087MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");
3088
3089module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR);
3090MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device");
3091
diff --git a/drivers/usb/serial/io_ti.h b/drivers/usb/serial/io_ti.h
new file mode 100644
index 000000000000..cab84f2256b9
--- /dev/null
+++ b/drivers/usb/serial/io_ti.h
@@ -0,0 +1,180 @@
1/*****************************************************************************
2 *
3 * Copyright (C) 1997-2002 Inside Out Networks, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 *
11 * Feb-16-2001 DMI Added I2C structure definitions
12 * May-29-2002 gkh Ported to Linux
13 *
14 *
15 ******************************************************************************/
16
17#ifndef _IO_TI_H_
18#define _IO_TI_H_
19
20/* Address Space */
21#define DTK_ADDR_SPACE_XDATA 0x03 /* Addr is placed in XDATA space */
22#define DTK_ADDR_SPACE_I2C_TYPE_II 0x82 /* Addr is placed in I2C area */
23#define DTK_ADDR_SPACE_I2C_TYPE_III 0x83 /* Addr is placed in I2C area */
24
25// UART Defines
26#define UMPMEM_BASE_UART1 0xFFA0 /* UMP UART1 base address */
27#define UMPMEM_BASE_UART2 0xFFB0 /* UMP UART2 base address */
28#define UMPMEM_OFFS_UART_LSR 0x05 /* UMP UART LSR register offset */
29
30/* Bits per character */
31#define UMP_UART_CHAR5BITS 0x00
32#define UMP_UART_CHAR6BITS 0x01
33#define UMP_UART_CHAR7BITS 0x02
34#define UMP_UART_CHAR8BITS 0x03
35
36/* Parity */
37#define UMP_UART_NOPARITY 0x00
38#define UMP_UART_ODDPARITY 0x01
39#define UMP_UART_EVENPARITY 0x02
40#define UMP_UART_MARKPARITY 0x03
41#define UMP_UART_SPACEPARITY 0x04
42
43/* Stop bits */
44#define UMP_UART_STOPBIT1 0x00
45#define UMP_UART_STOPBIT15 0x01
46#define UMP_UART_STOPBIT2 0x02
47
48/* Line status register masks */
49#define UMP_UART_LSR_OV_MASK 0x01
50#define UMP_UART_LSR_PE_MASK 0x02
51#define UMP_UART_LSR_FE_MASK 0x04
52#define UMP_UART_LSR_BR_MASK 0x08
53#define UMP_UART_LSR_ER_MASK 0x0F
54#define UMP_UART_LSR_RX_MASK 0x10
55#define UMP_UART_LSR_TX_MASK 0x20
56
57#define UMP_UART_LSR_DATA_MASK ( LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK )
58
59/* Port Settings Constants) */
60#define UMP_MASK_UART_FLAGS_RTS_FLOW 0x0001
61#define UMP_MASK_UART_FLAGS_RTS_DISABLE 0x0002
62#define UMP_MASK_UART_FLAGS_PARITY 0x0008
63#define UMP_MASK_UART_FLAGS_OUT_X_DSR_FLOW 0x0010
64#define UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW 0x0020
65#define UMP_MASK_UART_FLAGS_OUT_X 0x0040
66#define UMP_MASK_UART_FLAGS_OUT_XA 0x0080
67#define UMP_MASK_UART_FLAGS_IN_X 0x0100
68#define UMP_MASK_UART_FLAGS_DTR_FLOW 0x0800
69#define UMP_MASK_UART_FLAGS_DTR_DISABLE 0x1000
70#define UMP_MASK_UART_FLAGS_RECEIVE_MS_INT 0x2000
71#define UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR 0x4000
72
73#define UMP_DMA_MODE_CONTINOUS 0x01
74#define UMP_PIPE_TRANS_TIMEOUT_ENA 0x80
75#define UMP_PIPE_TRANSFER_MODE_MASK 0x03
76#define UMP_PIPE_TRANS_TIMEOUT_MASK 0x7C
77
78/* Purge port Direction Mask Bits */
79#define UMP_PORT_DIR_OUT 0x01
80#define UMP_PORT_DIR_IN 0x02
81
82// Address of Port 0
83#define UMPM_UART1_PORT 0x03
84
85// Commands
86#define UMPC_SET_CONFIG 0x05
87#define UMPC_OPEN_PORT 0x06
88#define UMPC_CLOSE_PORT 0x07
89#define UMPC_START_PORT 0x08
90#define UMPC_STOP_PORT 0x09
91#define UMPC_TEST_PORT 0x0A
92#define UMPC_PURGE_PORT 0x0B
93
94#define UMPC_COMPLETE_READ 0x80 // Force the Firmware to complete the current Read
95#define UMPC_HARDWARE_RESET 0x81 // Force UMP back into BOOT Mode
96#define UMPC_COPY_DNLD_TO_I2C 0x82 // Copy current download image to type 0xf2 record in 16k I2C
97 // firmware will change 0xff record to type 2 record when complete
98
99 // Special function register commands
100 // wIndex is register address
101 // wValue is MSB/LSB mask/data
102#define UMPC_WRITE_SFR 0x83 // Write SFR Register
103
104 // wIndex is register address
105#define UMPC_READ_SFR 0x84 // Read SRF Register
106
107 // Set or Clear DTR (wValue bit 0 Set/Clear) wIndex ModuleID (port)
108#define UMPC_SET_CLR_DTR 0x85
109
110 // Set or Clear RTS (wValue bit 0 Set/Clear) wIndex ModuleID (port)
111#define UMPC_SET_CLR_RTS 0x86
112
113 // Set or Clear LOOPBACK (wValue bit 0 Set/Clear) wIndex ModuleID (port)
114#define UMPC_SET_CLR_LOOPBACK 0x87
115
116 // Set or Clear BREAK (wValue bit 0 Set/Clear) wIndex ModuleID (port)
117#define UMPC_SET_CLR_BREAK 0x88
118
119 // Read MSR wIndex ModuleID (port)
120#define UMPC_READ_MSR 0x89
121
122 /* Toolkit commands */
123 /* Read-write group */
124#define UMPC_MEMORY_READ 0x92
125#define UMPC_MEMORY_WRITE 0x93
126
127/*
128 * UMP DMA Definitions
129 */
130#define UMPD_OEDB1_ADDRESS 0xFF08
131#define UMPD_OEDB2_ADDRESS 0xFF10
132
133struct out_endpoint_desc_block
134{
135 __u8 Configuration;
136 __u8 XBufAddr;
137 __u8 XByteCount;
138 __u8 Unused1;
139 __u8 Unused2;
140 __u8 YBufAddr;
141 __u8 YByteCount;
142 __u8 BufferSize;
143} __attribute__((packed));
144
145
146/*
147 * TYPE DEFINITIONS
148 * Structures for Firmware commands
149 */
150struct ump_uart_config /* UART settings */
151{
152 __u16 wBaudRate; /* Baud rate */
153 __u16 wFlags; /* Bitmap mask of flags */
154 __u8 bDataBits; /* 5..8 - data bits per character */
155 __u8 bParity; /* Parity settings */
156 __u8 bStopBits; /* Stop bits settings */
157 char cXon; /* XON character */
158 char cXoff; /* XOFF character */
159 __u8 bUartMode; /* Will be updated when a user */
160 /* interface is defined */
161} __attribute__((packed));
162
163
164/*
165 * TYPE DEFINITIONS
166 * Structures for USB interrupts
167 */
168struct ump_interrupt /* Interrupt packet structure */
169{
170 __u8 bICode; /* Interrupt code (interrupt num) */
171 __u8 bIInfo; /* Interrupt information */
172} __attribute__((packed));
173
174
175#define TIUMP_GET_PORT_FROM_CODE(c) (((c) >> 4) - 3)
176#define TIUMP_GET_FUNC_FROM_CODE(c) ((c) & 0x0f)
177#define TIUMP_INTERRUPT_CODE_LSR 0x03
178#define TIUMP_INTERRUPT_CODE_MSR 0x04
179
180#endif
diff --git a/drivers/usb/serial/io_usbvend.h b/drivers/usb/serial/io_usbvend.h
new file mode 100644
index 000000000000..8c1fa5e722b1
--- /dev/null
+++ b/drivers/usb/serial/io_usbvend.h
@@ -0,0 +1,687 @@
1/************************************************************************
2 *
3 * USBVEND.H Vendor-specific USB definitions
4 *
5 * NOTE: This must be kept in sync with the Edgeport firmware and
6 * must be kept backward-compatible with older firmware.
7 *
8 ************************************************************************
9 *
10 * Copyright (C) 1998 Inside Out Networks, Inc.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 ************************************************************************/
17
18#if !defined(_USBVEND_H)
19#define _USBVEND_H
20
21/************************************************************************
22 *
23 * D e f i n e s / T y p e d e f s
24 *
25 ************************************************************************/
26
27//
28// Definitions of USB product IDs
29//
30
31#define USB_VENDOR_ID_ION 0x1608 // Our VID
32#define USB_VENDOR_ID_TI 0x0451 // TI VID
33
34//
35// Definitions of USB product IDs (PID)
36// We break the USB-defined PID into an OEM Id field (upper 6 bits)
37// and a Device Id (bottom 10 bits). The Device Id defines what
38// device this actually is regardless of what the OEM wants to
39// call it.
40//
41
42// ION-device OEM IDs
43#define ION_OEM_ID_ION 0 // 00h Inside Out Networks
44#define ION_OEM_ID_NLYNX 1 // 01h NLynx Systems
45#define ION_OEM_ID_GENERIC 2 // 02h Generic OEM
46#define ION_OEM_ID_MAC 3 // 03h Mac Version
47#define ION_OEM_ID_MEGAWOLF 4 // 04h Lupusb OEM Mac version (MegaWolf)
48#define ION_OEM_ID_MULTITECH 5 // 05h Multitech Rapidports
49#define ION_OEM_ID_AGILENT 6 // 06h AGILENT board
50
51
52// ION-device Device IDs
53// Product IDs - assigned to match middle digit of serial number (No longer true)
54
55#define ION_DEVICE_ID_80251_NETCHIP 0x020 // This bit is set in the PID if this edgeport hardware$
56 // is based on the 80251+Netchip.
57
58#define ION_DEVICE_ID_GENERATION_1 0x00 // Value for 930 based edgeports
59#define ION_DEVICE_ID_GENERATION_2 0x01 // Value for 80251+Netchip.
60#define ION_DEVICE_ID_GENERATION_3 0x02 // Value for Texas Instruments TUSB5052 chip
61#define ION_DEVICE_ID_GENERATION_4 0x03 // Watchport Family of products
62#define ION_GENERATION_MASK 0x03
63
64#define ION_DEVICE_ID_HUB_MASK 0x0080 // This bit in the PID designates a HUB device
65 // for example 8C would be a 421 4 port hub
66 // and 8D would be a 2 port embedded hub
67
68#define EDGEPORT_DEVICE_ID_MASK 0x0ff // Not including OEM or GENERATION fields
69
70#define ION_DEVICE_ID_UNCONFIGURED_EDGE_DEVICE 0x000 // In manufacturing only
71#define ION_DEVICE_ID_EDGEPORT_4 0x001 // Edgeport/4 RS232
72#define ION_DEVICE_ID_EDGEPORT_8R 0x002 // Edgeport with RJ45 no Ring
73#define ION_DEVICE_ID_RAPIDPORT_4 0x003 // Rapidport/4
74#define ION_DEVICE_ID_EDGEPORT_4T 0x004 // Edgeport/4 RS232 for Telxon (aka "Fleetport")
75#define ION_DEVICE_ID_EDGEPORT_2 0x005 // Edgeport/2 RS232
76#define ION_DEVICE_ID_EDGEPORT_4I 0x006 // Edgeport/4 RS422
77#define ION_DEVICE_ID_EDGEPORT_2I 0x007 // Edgeport/2 RS422/RS485
78#define ION_DEVICE_ID_EDGEPORT_8RR 0x008 // Edgeport with RJ45 with Data and RTS/CTS only
79// ION_DEVICE_ID_EDGEPORT_8_HANDBUILT 0x009 // Hand-built Edgeport/8 (Placeholder, used in middle digit of serial number only!)
80// ION_DEVICE_ID_MULTIMODEM_4X56 0x00A // MultiTech version of RP/4 (Placeholder, used in middle digit of serial number only!)
81#define ION_DEVICE_ID_EDGEPORT_PARALLEL_PORT 0x00B // Edgeport/(4)21 Parallel port (USS720)
82#define ION_DEVICE_ID_EDGEPORT_421 0x00C // Edgeport/421 Hub+RS232+Parallel
83#define ION_DEVICE_ID_EDGEPORT_21 0x00D // Edgeport/21 RS232+Parallel
84#define ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU 0x00E // Half of an Edgeport/8 (the kind with 2 EP/4s on 1 PCB)
85#define ION_DEVICE_ID_EDGEPORT_8 0x00F // Edgeport/8 (single-CPU)
86#define ION_DEVICE_ID_EDGEPORT_2_DIN 0x010 // Edgeport/2 RS232 with Apple DIN connector
87#define ION_DEVICE_ID_EDGEPORT_4_DIN 0x011 // Edgeport/4 RS232 with Apple DIN connector
88#define ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU 0x012 // Half of an Edgeport/16 (the kind with 2 EP/8s)
89#define ION_DEVICE_ID_EDGEPORT_COMPATIBLE 0x013 // Edgeport Compatible, for NCR, Axiohm etc. testing
90#define ION_DEVICE_ID_EDGEPORT_8I 0x014 // Edgeport/8 RS422 (single-CPU)
91#define ION_DEVICE_ID_EDGEPORT_1 0x015 // Edgeport/1 RS232
92#define ION_DEVICE_ID_EPOS44 0x016 // Half of an EPOS/44 (TIUMP BASED)
93#define ION_DEVICE_ID_EDGEPORT_42 0x017 // Edgeport/42
94#define ION_DEVICE_ID_EDGEPORT_412_8 0x018 // Edgeport/412 8 port part
95#define ION_DEVICE_ID_EDGEPORT_412_4 0x019 // Edgeport/412 4 port part
96#define ION_DEVICE_ID_EDGEPORT_22I 0x01A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232
97
98// Compact Form factor TI based devices 2c, 21c, 22c, 221c
99#define ION_DEVICE_ID_EDGEPORT_2C 0x01B // Edgeport/2c is a TI based Edgeport/2 - Small I2c
100#define ION_DEVICE_ID_EDGEPORT_221C 0x01C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and
101 // 2 external hub ports - Large I2C
102#define ION_DEVICE_ID_EDGEPORT_22C 0x01D // Edgeport/22c is a TI based Edgeport/2 with
103 // 2 external hub ports - Large I2C
104#define ION_DEVICE_ID_EDGEPORT_21C 0x01E // Edgeport/21c is a TI based Edgeport/2 with lucent chip
105 // Small I2C
106
107
108/*
109 * DANGER DANGER The 0x20 bit was used to indicate a 8251/netchip GEN 2 device.
110 * Since the MAC, Linux, and Optimal drivers still used the old code
111 * I suggest that you skip the 0x20 bit when creating new PIDs
112 */
113
114
115// Generation 3 devices -- 3410 based edgport/1 (256 byte I2C)
116#define ION_DEVICE_ID_TI3410_EDGEPORT_1 0x040 // Edgeport/1 RS232
117#define ION_DEVICE_ID_TI3410_EDGEPORT_1I 0x041 // Edgeport/1i- RS422 model
118
119// Ti based software switchable RS232/RS422/RS485 devices
120#define ION_DEVICE_ID_EDGEPORT_4S 0x042 // Edgeport/4s - software switchable model
121#define ION_DEVICE_ID_EDGEPORT_8S 0x043 // Edgeport/8s - software switchable model
122
123// Usb to Ethernet dongle
124#define ION_DEVICE_ID_EDGEPORT_E 0x0E0 // Edgeport/E Usb to Ethernet
125
126// Edgeport TI based devices
127#define ION_DEVICE_ID_TI_EDGEPORT_4 0x0201 // Edgeport/4 RS232
128#define ION_DEVICE_ID_TI_EDGEPORT_2 0x0205 // Edgeport/2 RS232
129#define ION_DEVICE_ID_TI_EDGEPORT_4I 0x0206 // Edgeport/4i RS422
130#define ION_DEVICE_ID_TI_EDGEPORT_2I 0x0207 // Edgeport/2i RS422/RS485
131#define ION_DEVICE_ID_TI_EDGEPORT_421 0x020C // Edgeport/421 4 hub 2 RS232 + Parallel (lucent on a different hub port)
132#define ION_DEVICE_ID_TI_EDGEPORT_21 0x020D // Edgeport/21 2 RS232 + Parallel (lucent on a different hub port)
133#define ION_DEVICE_ID_TI_EDGEPORT_8 0x020F // Edgeport/8 (single-CPU)
134#define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 // Edgeport/1 RS232
135#define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 // Edgeport/42 4 hub 2 RS232
136#define ION_DEVICE_ID_TI_EDGEPORT_22I 0x021A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232
137#define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B // Edgeport/2c RS232
138#define ION_DEVICE_ID_TI_EDGEPORT_221C 0x021C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and
139 // 2 external hub ports - Large I2C
140#define ION_DEVICE_ID_TI_EDGEPORT_22C 0x021D // Edgeport/22c is a TI based Edgeport/2 with
141 // 2 external hub ports - Large I2C
142#define ION_DEVICE_ID_TI_EDGEPORT_21C 0x021E // Edgeport/21c is a TI based Edgeport/2 with lucent chip
143
144// Generation 3 devices -- 3410 based edgport/1 (256 byte I2C)
145#define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1 0x240 // Edgeport/1 RS232
146#define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I 0x241 // Edgeport/1i- RS422 model
147
148// Ti based software switchable RS232/RS422/RS485 devices
149#define ION_DEVICE_ID_TI_EDGEPORT_4S 0x242 // Edgeport/4s - software switchable model
150#define ION_DEVICE_ID_IT_EDGEPORT_8S 0x243 // Edgeport/8s - software switchable model
151
152
153/************************************************************************
154 *
155 * Generation 4 devices
156 *
157 ************************************************************************/
158
159// Watchport based on 3410 both 1-wire and binary products (16K I2C)
160#define ION_DEVICE_ID_WP_UNSERIALIZED 0x300 // Watchport based on 3410 both 1-wire and binary products
161#define ION_DEVICE_ID_WP_PROXIMITY 0x301 // Watchport/P Discontinued
162#define ION_DEVICE_ID_WP_MOTION 0x302 // Watchport/M
163#define ION_DEVICE_ID_WP_MOISTURE 0x303 // Watchport/W
164#define ION_DEVICE_ID_WP_TEMPERATURE 0x304 // Watchport/T
165#define ION_DEVICE_ID_WP_HUMIDITY 0x305 // Watchport/H
166
167#define ION_DEVICE_ID_WP_POWER 0x306 // Watchport
168#define ION_DEVICE_ID_WP_LIGHT 0x307 // Watchport
169#define ION_DEVICE_ID_WP_RADIATION 0x308 // Watchport
170#define ION_DEVICE_ID_WP_ACCELERATION 0x309 // Watchport/A
171#define ION_DEVICE_ID_WP_DISTANCE 0x30A // Watchport/D Discontinued
172#define ION_DEVICE_ID_WP_PROX_DIST 0x30B // Watchport/D uses distance sensor
173 // Default to /P function
174
175#define ION_DEVICE_ID_PLUS_PWR_HP4CD 0x30C // 5052 Plus Power HubPort/4CD+ (for Dell)
176#define ION_DEVICE_ID_PLUS_PWR_HP4C 0x30D // 5052 Plus Power HubPort/4C+
177#define ION_DEVICE_ID_PLUS_PWR_PCI 0x30E // 3410 Plus Power PCI Host Controller 4 port
178
179
180//
181// Definitions for AXIOHM USB product IDs
182//
183#define USB_VENDOR_ID_AXIOHM 0x05D9 // Axiohm VID
184
185#define AXIOHM_DEVICE_ID_MASK 0xffff
186#define AXIOHM_DEVICE_ID_EPIC_A758 0xA758
187#define AXIOHM_DEVICE_ID_EPIC_A794 0xA794
188#define AXIOHM_DEVICE_ID_EPIC_A225 0xA225
189
190
191//
192// Definitions for NCR USB product IDs
193//
194#define USB_VENDOR_ID_NCR 0x0404 // NCR VID
195
196#define NCR_DEVICE_ID_MASK 0xffff
197#define NCR_DEVICE_ID_EPIC_0202 0x0202
198#define NCR_DEVICE_ID_EPIC_0203 0x0203
199#define NCR_DEVICE_ID_EPIC_0310 0x0310
200#define NCR_DEVICE_ID_EPIC_0311 0x0311
201#define NCR_DEVICE_ID_EPIC_0312 0x0312
202
203
204//
205// Definitions for SYMBOL USB product IDs
206//
207#define USB_VENDOR_ID_SYMBOL 0x05E0 // Symbol VID
208#define SYMBOL_DEVICE_ID_MASK 0xffff
209#define SYMBOL_DEVICE_ID_KEYFOB 0x0700
210
211
212//
213// Definitions for other product IDs
214#define ION_DEVICE_ID_MT4X56USB 0x1403 // OEM device
215
216
217#define GENERATION_ID_FROM_USB_PRODUCT_ID( ProductId ) \
218 ( (__u16) ((ProductId >> 8) & (ION_GENERATION_MASK)) )
219
220#define MAKE_USB_PRODUCT_ID( OemId, DeviceId ) \
221 ( (__u16) (((OemId) << 10) || (DeviceId)) )
222
223#define DEVICE_ID_FROM_USB_PRODUCT_ID( ProductId ) \
224 ( (__u16) ((ProductId) & (EDGEPORT_DEVICE_ID_MASK)) )
225
226#define OEM_ID_FROM_USB_PRODUCT_ID( ProductId ) \
227 ( (__u16) (((ProductId) >> 10) & 0x3F) )
228
229//
230// Definitions of parameters for download code. Note that these are
231// specific to a given version of download code and must change if the
232// corresponding download code changes.
233//
234
235// TxCredits value below which driver won't bother sending (to prevent too many small writes).
236// Send only if above 25%
237#define EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(InitialCredit, MaxPacketSize) (max( ((InitialCredit) / 4), (MaxPacketSize) ))
238
239#define EDGE_FW_BULK_MAX_PACKET_SIZE 64 // Max Packet Size for Bulk In Endpoint (EP1)
240#define EDGE_FW_BULK_READ_BUFFER_SIZE 1024 // Size to use for Bulk reads
241
242#define EDGE_FW_INT_MAX_PACKET_SIZE 32 // Max Packet Size for Interrupt In Endpoint
243 // Note that many units were shipped with MPS=16, we
244 // force an upgrade to this value).
245#define EDGE_FW_INT_INTERVAL 2 // 2ms polling on IntPipe
246
247
248//
249// Definitions of I/O Networks vendor-specific requests
250// for default endpoint
251//
252// bmRequestType = 01000000 Set vendor-specific, to device
253// bmRequestType = 11000000 Get vendor-specific, to device
254//
255// These are the definitions for the bRequest field for the
256// above bmRequestTypes.
257//
258// For the read/write Edgeport memory commands, the parameters
259// are as follows:
260// wValue = 16-bit address
261// wIndex = unused (though we could put segment 00: or FF: here)
262// wLength = # bytes to read/write (max 64)
263//
264
265#define USB_REQUEST_ION_RESET_DEVICE 0 // Warm reboot Edgeport, retaining USB address
266#define USB_REQUEST_ION_GET_EPIC_DESC 1 // Get Edgeport Compatibility Descriptor
267// unused 2 // Unused, available
268#define USB_REQUEST_ION_READ_RAM 3 // Read EdgePort RAM at specified addr
269#define USB_REQUEST_ION_WRITE_RAM 4 // Write EdgePort RAM at specified addr
270#define USB_REQUEST_ION_READ_ROM 5 // Read EdgePort ROM at specified addr
271#define USB_REQUEST_ION_WRITE_ROM 6 // Write EdgePort ROM at specified addr
272#define USB_REQUEST_ION_EXEC_DL_CODE 7 // Begin execution of RAM-based download
273 // code by jumping to address in wIndex:wValue
274// 8 // Unused, available
275#define USB_REQUEST_ION_ENABLE_SUSPEND 9 // Enable/Disable suspend feature
276 // (wValue != 0: Enable; wValue = 0: Disable)
277
278#define USB_REQUEST_ION_SEND_IOSP 10 // Send an IOSP command to the edgeport over the control pipe
279#define USB_REQUEST_ION_RECV_IOSP 11 // Receive an IOSP command from the edgeport over the control pipe
280
281
282#define USB_REQUEST_ION_DIS_INT_TIMER 0x80 // Sent to Axiohm to enable/ disable
283 // interrupt token timer
284 // wValue = 1, enable (default)
285 // wValue = 0, disable
286
287//
288// Define parameter values for our vendor-specific commands
289//
290
291//
292// Edgeport Compatiblity Descriptor
293//
294// This descriptor is only returned by Edgeport-compatible devices
295// supporting the EPiC spec. True ION devices do not return this
296// descriptor, but instead return STALL on receipt of the
297// GET_EPIC_DESC command. The driver interprets a STALL to mean that
298// this is a "real" Edgeport.
299//
300
301struct edge_compatibility_bits
302{
303 // This __u32 defines which Vendor-specific commands/functionality
304 // the device supports on the default EP0 pipe.
305
306 __u32 VendEnableSuspend : 1; // 0001 Set if device supports ION_ENABLE_SUSPEND
307 __u32 VendUnused : 31; // Available for future expansion, must be 0
308
309 // This __u32 defines which IOSP commands are supported over the
310 // bulk pipe EP1.
311
312 // xxxx Set if device supports:
313 __u32 IOSPOpen : 1; // 0001 OPEN / OPEN_RSP (Currently must be 1)
314 __u32 IOSPClose : 1; // 0002 CLOSE
315 __u32 IOSPChase : 1; // 0004 CHASE / CHASE_RSP
316 __u32 IOSPSetRxFlow : 1; // 0008 SET_RX_FLOW
317 __u32 IOSPSetTxFlow : 1; // 0010 SET_TX_FLOW
318 __u32 IOSPSetXChar : 1; // 0020 SET_XON_CHAR/SET_XOFF_CHAR
319 __u32 IOSPRxCheck : 1; // 0040 RX_CHECK_REQ/RX_CHECK_RSP
320 __u32 IOSPSetClrBreak : 1; // 0080 SET_BREAK/CLEAR_BREAK
321 __u32 IOSPWriteMCR : 1; // 0100 MCR register writes (set/clr DTR/RTS)
322 __u32 IOSPWriteLCR : 1; // 0200 LCR register writes (wordlen/stop/parity)
323 __u32 IOSPSetBaudRate : 1; // 0400 setting Baud rate (writes to LCR.80h and DLL/DLM register)
324 __u32 IOSPDisableIntPipe : 1; // 0800 Do not use the interrupt pipe for TxCredits or RxButesAvailable
325 __u32 IOSPRxDataAvail : 1; // 1000 Return status of RX Fifo (Data available in Fifo)
326 __u32 IOSPTxPurge : 1; // 2000 Purge TXBuffer and/or Fifo in Edgeport hardware
327 __u32 IOSPUnused : 18; // Available for future expansion, must be 0
328
329 // This __u32 defines which 'general' features are supported
330
331 __u32 TrueEdgeport : 1; // 0001 Set if device is a 'real' Edgeport
332 // (Used only by driver, NEVER set by an EPiC device)
333 __u32 GenUnused : 31; // Available for future expansion, must be 0
334
335};
336
337struct edge_compatibility_descriptor
338{
339 __u8 Length; // Descriptor Length (per USB spec)
340 __u8 DescType; // Descriptor Type (per USB spec, =DEVICE type)
341 __u8 EpicVer; // Version of EPiC spec supported
342 // (Currently must be 1)
343 __u8 NumPorts; // Number of serial ports supported
344 __u8 iDownloadFile; // Index of string containing download code filename
345 // 0=no download, FF=download compiled into driver.
346 __u8 Unused[ 3 ]; // Available for future expansion, must be 0
347 // (Currently must be 0).
348 __u8 MajorVersion; // Firmware version: xx.
349 __u8 MinorVersion; // yy.
350 __le16 BuildNumber; // zzzz (LE format)
351
352 // The following structure contains __u32s, with each bit
353 // specifying whether the EPiC device supports the given
354 // command or functionality.
355
356 struct edge_compatibility_bits Supports;
357
358};
359
360// Values for iDownloadFile
361#define EDGE_DOWNLOAD_FILE_NONE 0 // No download requested
362#define EDGE_DOWNLOAD_FILE_INTERNAL 0xFF // Download the file compiled into driver (930 version)
363#define EDGE_DOWNLOAD_FILE_I930 0xFF // Download the file compiled into driver (930 version)
364#define EDGE_DOWNLOAD_FILE_80251 0xFE // Download the file compiled into driver (80251 version)
365
366
367
368/*
369 * Special addresses for READ/WRITE_RAM/ROM
370 */
371
372// Version 1 (original) format of DeviceParams
373#define EDGE_MANUF_DESC_ADDR_V1 0x00FF7F00
374#define EDGE_MANUF_DESC_LEN_V1 sizeof(EDGE_MANUF_DESCRIPTOR_V1)
375
376// Version 2 format of DeviceParams. This format is longer (3C0h)
377// and starts lower in memory, at the uppermost 1K in ROM.
378#define EDGE_MANUF_DESC_ADDR 0x00FF7C00
379#define EDGE_MANUF_DESC_LEN sizeof(struct edge_manuf_descriptor)
380
381// Boot params descriptor
382#define EDGE_BOOT_DESC_ADDR 0x00FF7FC0
383#define EDGE_BOOT_DESC_LEN sizeof(struct edge_boot_descriptor)
384
385// Define the max block size that may be read or written
386// in a read/write RAM/ROM command.
387#define MAX_SIZE_REQ_ION_READ_MEM ( (__u16) 64 )
388#define MAX_SIZE_REQ_ION_WRITE_MEM ( (__u16) 64 )
389
390
391//
392// Notes for the following two ION vendor-specific param descriptors:
393//
394// 1. These have a standard USB descriptor header so they look like a
395// normal descriptor.
396// 2. Any strings in the structures are in USB-defined string
397// descriptor format, so that they may be separately retrieved,
398// if necessary, with a minimum of work on the 930. This also
399// requires them to be in UNICODE format, which, for English at
400// least, simply means extending each __u8 into a __u16.
401// 3. For all fields, 00 means 'uninitialized'.
402// 4. All unused areas should be set to 00 for future expansion.
403//
404
405// This structure is ver 2 format. It contains ALL USB descriptors as
406// well as the configuration parameters that were in the original V1
407// structure. It is NOT modified when new boot code is downloaded; rather,
408// these values are set or modified by manufacturing. It is located at
409// xC00-xFBF (length 3C0h) in the ROM.
410// This structure is a superset of the v1 structure and is arranged so
411// that all of the v1 fields remain at the same address. We are just
412// adding more room to the front of the structure to hold the descriptors.
413//
414// The actual contents of this structure are defined in a 930 assembly
415// file, converted to a binary image, and then written by the serialization
416// program. The C definition of this structure just defines a dummy
417// area for general USB descriptors and the descriptor tables (the root
418// descriptor starts at xC00). At the bottom of the structure are the
419// fields inherited from the v1 structure.
420
421#define MAX_SERIALNUMBER_LEN 12
422#define MAX_ASSEMBLYNUMBER_LEN 14
423
424struct edge_manuf_descriptor {
425
426 __u16 RootDescTable[0x10]; // C00 Root of descriptor tables (just a placeholder)
427 __u8 DescriptorArea[0x2E0]; // C20 Descriptors go here, up to 2E0h (just a placeholder)
428
429 // Start of v1-compatible section
430 __u8 Length; // F00 Desc length for what follows, per USB (= C0h )
431 __u8 DescType; // F01 Desc type, per USB (=DEVICE type)
432 __u8 DescVer; // F02 Desc version/format (currently 2)
433 __u8 NumRootDescEntries; // F03 # entries in RootDescTable
434
435 __u8 RomSize; // F04 Size of ROM/E2PROM in K
436 __u8 RamSize; // F05 Size of external RAM in K
437 __u8 CpuRev; // F06 CPU revision level (chg only if s/w visible)
438 __u8 BoardRev; // F07 PCB revision level (chg only if s/w visible)
439
440 __u8 NumPorts; // F08 Number of ports
441 __u8 DescDate[3]; // F09 MM/DD/YY when descriptor template was compiler,
442 // so host can track changes to USB-only descriptors.
443
444 __u8 SerNumLength; // F0C USB string descriptor len
445 __u8 SerNumDescType; // F0D USB descriptor type (=STRING type)
446 __le16 SerialNumber[MAX_SERIALNUMBER_LEN]; // F0E "01-01-000100" Unicode Serial Number
447
448 __u8 AssemblyNumLength; // F26 USB string descriptor len
449 __u8 AssemblyNumDescType; // F27 USB descriptor type (=STRING type)
450 __le16 AssemblyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F28 "350-1000-01-A " assembly number
451
452 __u8 OemAssyNumLength; // F44 USB string descriptor len
453 __u8 OemAssyNumDescType; // F45 USB descriptor type (=STRING type)
454 __le16 OemAssyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F46 "xxxxxxxxxxxxxx" OEM assembly number
455
456 __u8 ManufDateLength; // F62 USB string descriptor len
457 __u8 ManufDateDescType; // F63 USB descriptor type (=STRING type)
458 __le16 ManufDate[6]; // F64 "MMDDYY" manufacturing date
459
460 __u8 Reserved3[0x4D]; // F70 -- unused, set to 0 --
461
462 __u8 UartType; // FBD Uart Type
463 __u8 IonPid; // FBE Product ID, == LSB of USB DevDesc.PID
464 // (Note: Edgeport/4s before 11/98 will have
465 // 00 here instead of 01)
466 __u8 IonConfig; // FBF Config byte for ION manufacturing use
467 // FBF end of structure, total len = 3C0h
468
469};
470
471
472#define MANUF_DESC_VER_1 1 // Original definition of MANUF_DESC
473#define MANUF_DESC_VER_2 2 // Ver 2, starts at xC00h len 3C0h
474
475
476// Uart Types
477// Note: Since this field was added only recently, all Edgeport/4 units
478// shipped before 11/98 will have 00 in this field. Therefore,
479// both 00 and 01 values mean '654.
480#define MANUF_UART_EXAR_654_EARLY 0 // Exar 16C654 in Edgeport/4s before 11/98
481#define MANUF_UART_EXAR_654 1 // Exar 16C654
482#define MANUF_UART_EXAR_2852 2 // Exar 16C2852
483
484//
485// Note: The CpuRev and BoardRev values do not conform to manufacturing
486// revisions; they are to be incremented only when the CPU or hardware
487// changes in a software-visible way, such that the 930 software or
488// the host driver needs to handle the hardware differently.
489//
490
491// Values of bottom 5 bits of CpuRev & BoardRev for
492// Implementation 0 (ie, 930-based)
493#define MANUF_CPU_REV_AD4 1 // 930 AD4, with EP1 Rx bug (needs RXSPM)
494#define MANUF_CPU_REV_AD5 2 // 930 AD5, with above bug (supposedly) fixed
495#define MANUF_CPU_80251 0x20 // Intel 80251
496
497
498#define MANUF_BOARD_REV_A 1 // Original version, == Manuf Rev A
499#define MANUF_BOARD_REV_B 2 // Manuf Rev B, wakeup interrupt works
500#define MANUF_BOARD_REV_C 3 // Manuf Rev C, 2/4 ports, rs232/rs422
501#define MANUF_BOARD_REV_GENERATION_2 0x20 // Second generaiton edgeport
502
503
504// Values of bottom 5 bits of CpuRev & BoardRev for
505// Implementation 1 (ie, 251+Netchip-based)
506#define MANUF_CPU_REV_1 1 // C251TB Rev 1 (Need actual Intel rev here)
507
508#define MANUF_BOARD_REV_A 1 // First rev of 251+Netchip design
509
510#define MANUF_SERNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->SerialNumber)
511#define MANUF_ASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->AssemblyNumber)
512#define MANUF_OEMASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->OemAssyNumber)
513#define MANUF_MANUFDATE_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->ManufDate)
514
515#define MANUF_ION_CONFIG_DIAG_NO_LOOP 0x20 // As below but no ext loopback test
516#define MANUF_ION_CONFIG_DIAG 0x40 // 930 based device: 1=Run h/w diags, 0=norm
517 // TIUMP Device : 1=IONSERIAL needs to run Final Test
518#define MANUF_ION_CONFIG_MASTER 0x80 // 930 based device: 1=Master mode, 0=Normal
519 // TIUMP Device : 1=First device on a multi TIUMP Device
520
521//
522// This structure describes parameters for the boot code, and
523// is programmed along with new boot code. These are values
524// which are specific to a given build of the boot code. It
525// is exactly 64 bytes long and is fixed at address FF:xFC0
526// - FF:xFFF. Note that the 930-mandated UCONFIG bytes are
527// included in this structure.
528//
529struct edge_boot_descriptor {
530 __u8 Length; // C0 Desc length, per USB (= 40h)
531 __u8 DescType; // C1 Desc type, per USB (= DEVICE type)
532 __u8 DescVer; // C2 Desc version/format
533 __u8 Reserved1; // C3 -- unused, set to 0 --
534
535 __le16 BootCodeLength; // C4 Boot code goes from FF:0000 to FF:(len-1)
536 // (LE format)
537
538 __u8 MajorVersion; // C6 Firmware version: xx.
539 __u8 MinorVersion; // C7 yy.
540 __le16 BuildNumber; // C8 zzzz (LE format)
541
542 __u16 EnumRootDescTable; // CA Root of ROM-based descriptor table
543 __u8 NumDescTypes; // CC Number of supported descriptor types
544
545 __u8 Reserved4; // CD Fix Compiler Packing
546
547 __le16 Capabilities; // CE-CF Capabilities flags (LE format)
548 __u8 Reserved2[0x28]; // D0 -- unused, set to 0 --
549 __u8 UConfig0; // F8 930-defined CPU configuration byte 0
550 __u8 UConfig1; // F9 930-defined CPU configuration byte 1
551 __u8 Reserved3[6]; // FA -- unused, set to 0 --
552 // FF end of structure, total len = 80
553};
554
555
556#define BOOT_DESC_VER_1 1 // Original definition of BOOT_PARAMS
557#define BOOT_DESC_VER_2 2 // 2nd definition, descriptors not included in boot
558
559
560 // Capabilities flags
561
562#define BOOT_CAP_RESET_CMD 0x0001 // If set, boot correctly supports ION_RESET_DEVICE
563
564
565/************************************************************************
566 T I U M P D E F I N I T I O N S
567 ***********************************************************************/
568
569// Chip definitions in I2C
570#define UMP5152 0x52
571#define UMP3410 0x10
572
573
574//************************************************************************
575// TI I2C Format Definitions
576//************************************************************************
577#define I2C_DESC_TYPE_INFO_BASIC 0x01
578#define I2C_DESC_TYPE_FIRMWARE_BASIC 0x02
579#define I2C_DESC_TYPE_DEVICE 0x03
580#define I2C_DESC_TYPE_CONFIG 0x04
581#define I2C_DESC_TYPE_STRING 0x05
582#define I2C_DESC_TYPE_FIRMWARE_AUTO 0x07 // for 3410 download
583#define I2C_DESC_TYPE_CONFIG_KLUDGE 0x14 // for 3410
584#define I2C_DESC_TYPE_WATCHPORT_VERSION 0x15 // firmware version number for watchport
585#define I2C_DESC_TYPE_WATCHPORT_CALIBRATION_DATA 0x16 // Watchport Calibration Data
586
587#define I2C_DESC_TYPE_FIRMWARE_BLANK 0xf2
588
589// Special section defined by ION
590#define I2C_DESC_TYPE_ION 0 // Not defined by TI
591
592
593struct ti_i2c_desc
594{
595 __u8 Type; // Type of descriptor
596 __u16 Size; // Size of data only not including header
597 __u8 CheckSum; // Checksum (8 bit sum of data only)
598 __u8 Data[0]; // Data starts here
599}__attribute__((packed));
600
601// for 5152 devices only (type 2 record)
602// for 3410 the version is stored in the WATCHPORT_FIRMWARE_VERSION descriptor
603struct ti_i2c_firmware_rec
604{
605 __u8 Ver_Major; // Firmware Major version number
606 __u8 Ver_Minor; // Firmware Minor version number
607 __u8 Data[0]; // Download starts here
608}__attribute__((packed));
609
610
611struct watchport_firmware_version
612{
613// Added 2 bytes for version number
614 __u8 Version_Major; // Download Version (for Watchport)
615 __u8 Version_Minor;
616}__attribute__((packed));
617
618
619// Structure of header of download image in fw_down.h
620struct ti_i2c_image_header
621{
622 __le16 Length;
623 __u8 CheckSum;
624}__attribute__((packed));
625
626struct ti_basic_descriptor
627{
628 __u8 Power; // Self powered
629 // bit 7: 1 - power switching supported
630 // 0 - power switching not supported
631 //
632 // bit 0: 1 - self powered
633 // 0 - bus powered
634 //
635 //
636 __u16 HubVid; // VID HUB
637 __u16 HubPid; // PID HUB
638 __u16 DevPid; // PID Edgeport
639 __u8 HubTime; // Time for power on to power good
640 __u8 HubCurrent; // HUB Current = 100ma
641} __attribute__((packed));
642
643
644// CPU / Board Rev Definitions
645#define TI_CPU_REV_5052 2 // 5052 based edgeports
646#define TI_CPU_REV_3410 3 // 3410 based edgeports
647
648#define TI_BOARD_REV_TI_EP 0 // Basic ti based edgeport
649#define TI_BOARD_REV_COMPACT 1 // Compact board
650#define TI_BOARD_REV_WATCHPORT 2 // Watchport
651
652
653#define TI_GET_CPU_REVISION(x) (__u8)((((x)>>4)&0x0f))
654#define TI_GET_BOARD_REVISION(x) (__u8)(((x)&0x0f))
655
656#define TI_I2C_SIZE_MASK 0x1f // 5 bits
657#define TI_GET_I2C_SIZE(x) ((((x) & TI_I2C_SIZE_MASK)+1)*256)
658
659#define TI_MAX_I2C_SIZE ( 16 * 1024 )
660
661#define TI_MANUF_VERSION_0 0
662
663// IonConig2 flags
664#define TI_CONFIG2_RS232 0x01
665#define TI_CONFIG2_RS422 0x02
666#define TI_CONFIG2_RS485 0x04
667#define TI_CONFIG2_SWITCHABLE 0x08
668
669#define TI_CONFIG2_WATCHPORT 0x10
670
671
672struct edge_ti_manuf_descriptor
673{
674 __u8 IonConfig; // Config byte for ION manufacturing use
675 __u8 IonConfig2; // Expansion
676 __u8 Version; // Version
677 __u8 CpuRev_BoardRev; // CPU revision level (0xF0) and Board Rev Level (0x0F)
678 __u8 NumPorts; // Number of ports for this UMP
679 __u8 NumVirtualPorts; // Number of Virtual ports
680 __u8 HubConfig1; // Used to configure the Hub
681 __u8 HubConfig2; // Used to configure the Hub
682 __u8 TotalPorts; // Total Number of Com Ports for the entire device (All UMPs)
683 __u8 Reserved; // Reserved
684}__attribute__((packed));
685
686
687#endif // if !defined(_USBVEND_H)
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
new file mode 100644
index 000000000000..3bd69c4ef24b
--- /dev/null
+++ b/drivers/usb/serial/ipaq.c
@@ -0,0 +1,973 @@
1/*
2 * USB Compaq iPAQ driver
3 *
4 * Copyright (C) 2001 - 2002
5 * Ganesh Varadarajan <ganesh@veritas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * (12/12/2002) ganesh
13 * Added support for practically all devices supported by ActiveSync
14 * on Windows. Thanks to Wes Cilldhaire <billybobjoehenrybob@hotmail.com>.
15 *
16 * (26/11/2002) ganesh
17 * Added insmod options to specify product and vendor id.
18 * Use modprobe ipaq vendor=0xfoo product=0xbar
19 *
20 * (26/7/2002) ganesh
21 * Fixed up broken error handling in ipaq_open. Retry the "kickstart"
22 * packet much harder - this drastically reduces connection failures.
23 *
24 * (30/4/2002) ganesh
25 * Added support for the Casio EM500. Completely untested. Thanks
26 * to info from Nathan <wfilardo@fuse.net>
27 *
28 * (19/3/2002) ganesh
29 * Don't submit urbs while holding spinlocks. Not strictly necessary
30 * in 2.5.x.
31 *
32 * (8/3/2002) ganesh
33 * The ipaq sometimes emits a '\0' before the CLIENT string. At this
34 * point of time, the ppp ldisc is not yet attached to the tty, so
35 * n_tty echoes "^ " to the ipaq, which messes up the chat. In 2.5.6-pre2
36 * this causes a panic because echo_char() tries to sleep in interrupt
37 * context.
38 * The fix is to tell the upper layers that this is a raw device so that
39 * echoing is suppressed. Thanks to Lyle Lindholm for a detailed bug
40 * report.
41 *
42 * (25/2/2002) ganesh
43 * Added support for the HP Jornada 548 and 568. Completely untested.
44 * Thanks to info from Heath Robinson and Arieh Davidoff.
45 */
46
47#include <linux/config.h>
48#include <linux/kernel.h>
49#include <linux/errno.h>
50#include <linux/init.h>
51#include <linux/slab.h>
52#include <linux/tty.h>
53#include <linux/tty_driver.h>
54#include <linux/tty_flip.h>
55#include <linux/module.h>
56#include <linux/spinlock.h>
57#include <asm/uaccess.h>
58#include <linux/usb.h>
59#include "usb-serial.h"
60#include "ipaq.h"
61
62#define KP_RETRIES 100
63
64/*
65 * Version Information
66 */
67
68#define DRIVER_VERSION "v0.5"
69#define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
70#define DRIVER_DESC "USB PocketPC PDA driver"
71
72static __u16 product, vendor;
73static int debug;
74
75/* Function prototypes for an ipaq */
76static int ipaq_open (struct usb_serial_port *port, struct file *filp);
77static void ipaq_close (struct usb_serial_port *port, struct file *filp);
78static int ipaq_startup (struct usb_serial *serial);
79static void ipaq_shutdown (struct usb_serial *serial);
80static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
81 int count);
82static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
83 int count);
84static void ipaq_write_gather(struct usb_serial_port *port);
85static void ipaq_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
86static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs);
87static int ipaq_write_room(struct usb_serial_port *port);
88static int ipaq_chars_in_buffer(struct usb_serial_port *port);
89static void ipaq_destroy_lists(struct usb_serial_port *port);
90
91
92static struct usb_device_id ipaq_id_table [] = {
93 /* The first entry is a placeholder for the insmod-specified device */
94 { USB_DEVICE(0x049F, 0x0003) },
95 { USB_DEVICE(0x1690, 0x0601) }, /* Askey USB Sync */
96 { USB_DEVICE(0x0960, 0x0065) }, /* BCOM USB Sync 0065 */
97 { USB_DEVICE(0x0960, 0x0066) }, /* BCOM USB Sync 0066 */
98 { USB_DEVICE(0x0960, 0x0067) }, /* BCOM USB Sync 0067 */
99 { USB_DEVICE(0x07CF, 0x2001) }, /* CASIO USB Sync 2001 */
100 { USB_DEVICE(0x07CF, 0x2002) }, /* CASIO USB Sync 2002 */
101 { USB_DEVICE(0x07CF, 0x2003) }, /* CASIO USB Sync 2003 */
102 { USB_DEVICE(0x049F, 0x0003) }, /* Compaq iPAQ USB Sync */
103 { USB_DEVICE(0x049F, 0x0032) }, /* Compaq iPAQ USB Sync */
104 { USB_DEVICE(0x413C, 0x4001) }, /* Dell Axim USB Sync */
105 { USB_DEVICE(0x413C, 0x4002) }, /* Dell Axim USB Sync */
106 { USB_DEVICE(0x413C, 0x4003) }, /* Dell Axim USB Sync */
107 { USB_DEVICE(0x413C, 0x4004) }, /* Dell Axim USB Sync */
108 { USB_DEVICE(0x413C, 0x4005) }, /* Dell Axim USB Sync */
109 { USB_DEVICE(0x413C, 0x4006) }, /* Dell Axim USB Sync */
110 { USB_DEVICE(0x413C, 0x4007) }, /* Dell Axim USB Sync */
111 { USB_DEVICE(0x413C, 0x4008) }, /* Dell Axim USB Sync */
112 { USB_DEVICE(0x413C, 0x4009) }, /* Dell Axim USB Sync */
113 { USB_DEVICE(0x03F0, 0x1016) }, /* HP USB Sync */
114 { USB_DEVICE(0x03F0, 0x1116) }, /* HP USB Sync 1611 */
115 { USB_DEVICE(0x03F0, 0x1216) }, /* HP USB Sync 1612 */
116 { USB_DEVICE(0x03F0, 0x2016) }, /* HP USB Sync 1620 */
117 { USB_DEVICE(0x03F0, 0x2116) }, /* HP USB Sync 1621 */
118 { USB_DEVICE(0x03F0, 0x2216) }, /* HP USB Sync 1622 */
119 { USB_DEVICE(0x03F0, 0x3016) }, /* HP USB Sync 1630 */
120 { USB_DEVICE(0x03F0, 0x3116) }, /* HP USB Sync 1631 */
121 { USB_DEVICE(0x03F0, 0x3216) }, /* HP USB Sync 1632 */
122 { USB_DEVICE(0x03F0, 0x4016) }, /* HP USB Sync 1640 */
123 { USB_DEVICE(0x03F0, 0x4116) }, /* HP USB Sync 1641 */
124 { USB_DEVICE(0x03F0, 0x4216) }, /* HP USB Sync 1642 */
125 { USB_DEVICE(0x03F0, 0x5016) }, /* HP USB Sync 1650 */
126 { USB_DEVICE(0x03F0, 0x5116) }, /* HP USB Sync 1651 */
127 { USB_DEVICE(0x03F0, 0x5216) }, /* HP USB Sync 1652 */
128 { USB_DEVICE(0x094B, 0x0001) }, /* Linkup Systems USB Sync */
129 { USB_DEVICE(0x045E, 0x0400) }, /* Windows Powered Pocket PC 2002 */
130 { USB_DEVICE(0x045E, 0x0401) }, /* Windows Powered Pocket PC 2002 */
131 { USB_DEVICE(0x045E, 0x0402) }, /* Windows Powered Pocket PC 2002 */
132 { USB_DEVICE(0x045E, 0x0403) }, /* Windows Powered Pocket PC 2002 */
133 { USB_DEVICE(0x045E, 0x0404) }, /* Windows Powered Pocket PC 2002 */
134 { USB_DEVICE(0x045E, 0x0405) }, /* Windows Powered Pocket PC 2002 */
135 { USB_DEVICE(0x045E, 0x0406) }, /* Windows Powered Pocket PC 2002 */
136 { USB_DEVICE(0x045E, 0x0407) }, /* Windows Powered Pocket PC 2002 */
137 { USB_DEVICE(0x045E, 0x0408) }, /* Windows Powered Pocket PC 2002 */
138 { USB_DEVICE(0x045E, 0x0409) }, /* Windows Powered Pocket PC 2002 */
139 { USB_DEVICE(0x045E, 0x040A) }, /* Windows Powered Pocket PC 2002 */
140 { USB_DEVICE(0x045E, 0x040B) }, /* Windows Powered Pocket PC 2002 */
141 { USB_DEVICE(0x045E, 0x040C) }, /* Windows Powered Pocket PC 2002 */
142 { USB_DEVICE(0x045E, 0x040D) }, /* Windows Powered Pocket PC 2002 */
143 { USB_DEVICE(0x045E, 0x040E) }, /* Windows Powered Pocket PC 2002 */
144 { USB_DEVICE(0x045E, 0x040F) }, /* Windows Powered Pocket PC 2002 */
145 { USB_DEVICE(0x045E, 0x0410) }, /* Windows Powered Pocket PC 2002 */
146 { USB_DEVICE(0x045E, 0x0411) }, /* Windows Powered Pocket PC 2002 */
147 { USB_DEVICE(0x045E, 0x0412) }, /* Windows Powered Pocket PC 2002 */
148 { USB_DEVICE(0x045E, 0x0413) }, /* Windows Powered Pocket PC 2002 */
149 { USB_DEVICE(0x045E, 0x0414) }, /* Windows Powered Pocket PC 2002 */
150 { USB_DEVICE(0x045E, 0x0415) }, /* Windows Powered Pocket PC 2002 */
151 { USB_DEVICE(0x045E, 0x0416) }, /* Windows Powered Pocket PC 2002 */
152 { USB_DEVICE(0x045E, 0x0417) }, /* Windows Powered Pocket PC 2002 */
153 { USB_DEVICE(0x045E, 0x0432) }, /* Windows Powered Pocket PC 2003 */
154 { USB_DEVICE(0x045E, 0x0433) }, /* Windows Powered Pocket PC 2003 */
155 { USB_DEVICE(0x045E, 0x0434) }, /* Windows Powered Pocket PC 2003 */
156 { USB_DEVICE(0x045E, 0x0435) }, /* Windows Powered Pocket PC 2003 */
157 { USB_DEVICE(0x045E, 0x0436) }, /* Windows Powered Pocket PC 2003 */
158 { USB_DEVICE(0x045E, 0x0437) }, /* Windows Powered Pocket PC 2003 */
159 { USB_DEVICE(0x045E, 0x0438) }, /* Windows Powered Pocket PC 2003 */
160 { USB_DEVICE(0x045E, 0x0439) }, /* Windows Powered Pocket PC 2003 */
161 { USB_DEVICE(0x045E, 0x043A) }, /* Windows Powered Pocket PC 2003 */
162 { USB_DEVICE(0x045E, 0x043B) }, /* Windows Powered Pocket PC 2003 */
163 { USB_DEVICE(0x045E, 0x043C) }, /* Windows Powered Pocket PC 2003 */
164 { USB_DEVICE(0x045E, 0x043D) }, /* Windows Powered Pocket PC 2003 */
165 { USB_DEVICE(0x045E, 0x043E) }, /* Windows Powered Pocket PC 2003 */
166 { USB_DEVICE(0x045E, 0x043F) }, /* Windows Powered Pocket PC 2003 */
167 { USB_DEVICE(0x045E, 0x0440) }, /* Windows Powered Pocket PC 2003 */
168 { USB_DEVICE(0x045E, 0x0441) }, /* Windows Powered Pocket PC 2003 */
169 { USB_DEVICE(0x045E, 0x0442) }, /* Windows Powered Pocket PC 2003 */
170 { USB_DEVICE(0x045E, 0x0443) }, /* Windows Powered Pocket PC 2003 */
171 { USB_DEVICE(0x045E, 0x0444) }, /* Windows Powered Pocket PC 2003 */
172 { USB_DEVICE(0x045E, 0x0445) }, /* Windows Powered Pocket PC 2003 */
173 { USB_DEVICE(0x045E, 0x0446) }, /* Windows Powered Pocket PC 2003 */
174 { USB_DEVICE(0x045E, 0x0447) }, /* Windows Powered Pocket PC 2003 */
175 { USB_DEVICE(0x045E, 0x0448) }, /* Windows Powered Pocket PC 2003 */
176 { USB_DEVICE(0x045E, 0x0449) }, /* Windows Powered Pocket PC 2003 */
177 { USB_DEVICE(0x045E, 0x044A) }, /* Windows Powered Pocket PC 2003 */
178 { USB_DEVICE(0x045E, 0x044B) }, /* Windows Powered Pocket PC 2003 */
179 { USB_DEVICE(0x045E, 0x044C) }, /* Windows Powered Pocket PC 2003 */
180 { USB_DEVICE(0x045E, 0x044D) }, /* Windows Powered Pocket PC 2003 */
181 { USB_DEVICE(0x045E, 0x044E) }, /* Windows Powered Pocket PC 2003 */
182 { USB_DEVICE(0x045E, 0x044F) }, /* Windows Powered Pocket PC 2003 */
183 { USB_DEVICE(0x045E, 0x0450) }, /* Windows Powered Pocket PC 2003 */
184 { USB_DEVICE(0x045E, 0x0451) }, /* Windows Powered Pocket PC 2003 */
185 { USB_DEVICE(0x045E, 0x0452) }, /* Windows Powered Pocket PC 2003 */
186 { USB_DEVICE(0x045E, 0x0453) }, /* Windows Powered Pocket PC 2003 */
187 { USB_DEVICE(0x045E, 0x0454) }, /* Windows Powered Pocket PC 2003 */
188 { USB_DEVICE(0x045E, 0x0455) }, /* Windows Powered Pocket PC 2003 */
189 { USB_DEVICE(0x045E, 0x0456) }, /* Windows Powered Pocket PC 2003 */
190 { USB_DEVICE(0x045E, 0x0457) }, /* Windows Powered Pocket PC 2003 */
191 { USB_DEVICE(0x045E, 0x0458) }, /* Windows Powered Pocket PC 2003 */
192 { USB_DEVICE(0x045E, 0x0459) }, /* Windows Powered Pocket PC 2003 */
193 { USB_DEVICE(0x045E, 0x045A) }, /* Windows Powered Pocket PC 2003 */
194 { USB_DEVICE(0x045E, 0x045B) }, /* Windows Powered Pocket PC 2003 */
195 { USB_DEVICE(0x045E, 0x045C) }, /* Windows Powered Pocket PC 2003 */
196 { USB_DEVICE(0x045E, 0x045D) }, /* Windows Powered Pocket PC 2003 */
197 { USB_DEVICE(0x045E, 0x045E) }, /* Windows Powered Pocket PC 2003 */
198 { USB_DEVICE(0x045E, 0x045F) }, /* Windows Powered Pocket PC 2003 */
199 { USB_DEVICE(0x045E, 0x0460) }, /* Windows Powered Pocket PC 2003 */
200 { USB_DEVICE(0x045E, 0x0461) }, /* Windows Powered Pocket PC 2003 */
201 { USB_DEVICE(0x045E, 0x0462) }, /* Windows Powered Pocket PC 2003 */
202 { USB_DEVICE(0x045E, 0x0463) }, /* Windows Powered Pocket PC 2003 */
203 { USB_DEVICE(0x045E, 0x0464) }, /* Windows Powered Pocket PC 2003 */
204 { USB_DEVICE(0x045E, 0x0465) }, /* Windows Powered Pocket PC 2003 */
205 { USB_DEVICE(0x045E, 0x0466) }, /* Windows Powered Pocket PC 2003 */
206 { USB_DEVICE(0x045E, 0x0467) }, /* Windows Powered Pocket PC 2003 */
207 { USB_DEVICE(0x045E, 0x0468) }, /* Windows Powered Pocket PC 2003 */
208 { USB_DEVICE(0x045E, 0x0469) }, /* Windows Powered Pocket PC 2003 */
209 { USB_DEVICE(0x045E, 0x046A) }, /* Windows Powered Pocket PC 2003 */
210 { USB_DEVICE(0x045E, 0x046B) }, /* Windows Powered Pocket PC 2003 */
211 { USB_DEVICE(0x045E, 0x046C) }, /* Windows Powered Pocket PC 2003 */
212 { USB_DEVICE(0x045E, 0x046D) }, /* Windows Powered Pocket PC 2003 */
213 { USB_DEVICE(0x045E, 0x046E) }, /* Windows Powered Pocket PC 2003 */
214 { USB_DEVICE(0x045E, 0x046F) }, /* Windows Powered Pocket PC 2003 */
215 { USB_DEVICE(0x045E, 0x0470) }, /* Windows Powered Pocket PC 2003 */
216 { USB_DEVICE(0x045E, 0x0471) }, /* Windows Powered Pocket PC 2003 */
217 { USB_DEVICE(0x045E, 0x0472) }, /* Windows Powered Pocket PC 2003 */
218 { USB_DEVICE(0x045E, 0x0473) }, /* Windows Powered Pocket PC 2003 */
219 { USB_DEVICE(0x045E, 0x0474) }, /* Windows Powered Pocket PC 2003 */
220 { USB_DEVICE(0x045E, 0x0475) }, /* Windows Powered Pocket PC 2003 */
221 { USB_DEVICE(0x045E, 0x0476) }, /* Windows Powered Pocket PC 2003 */
222 { USB_DEVICE(0x045E, 0x0477) }, /* Windows Powered Pocket PC 2003 */
223 { USB_DEVICE(0x045E, 0x0478) }, /* Windows Powered Pocket PC 2003 */
224 { USB_DEVICE(0x045E, 0x0479) }, /* Windows Powered Pocket PC 2003 */
225 { USB_DEVICE(0x045E, 0x047A) }, /* Windows Powered Pocket PC 2003 */
226 { USB_DEVICE(0x045E, 0x047B) }, /* Windows Powered Pocket PC 2003 */
227 { USB_DEVICE(0x045E, 0x04C8) }, /* Windows Powered Smartphone 2002 */
228 { USB_DEVICE(0x045E, 0x04C9) }, /* Windows Powered Smartphone 2002 */
229 { USB_DEVICE(0x045E, 0x04CA) }, /* Windows Powered Smartphone 2002 */
230 { USB_DEVICE(0x045E, 0x04CB) }, /* Windows Powered Smartphone 2002 */
231 { USB_DEVICE(0x045E, 0x04CC) }, /* Windows Powered Smartphone 2002 */
232 { USB_DEVICE(0x045E, 0x04CD) }, /* Windows Powered Smartphone 2002 */
233 { USB_DEVICE(0x045E, 0x04CE) }, /* Windows Powered Smartphone 2002 */
234 { USB_DEVICE(0x045E, 0x04D7) }, /* Windows Powered Smartphone 2003 */
235 { USB_DEVICE(0x045E, 0x04D8) }, /* Windows Powered Smartphone 2003 */
236 { USB_DEVICE(0x045E, 0x04D9) }, /* Windows Powered Smartphone 2003 */
237 { USB_DEVICE(0x045E, 0x04DA) }, /* Windows Powered Smartphone 2003 */
238 { USB_DEVICE(0x045E, 0x04DB) }, /* Windows Powered Smartphone 2003 */
239 { USB_DEVICE(0x045E, 0x04DC) }, /* Windows Powered Smartphone 2003 */
240 { USB_DEVICE(0x045E, 0x04DD) }, /* Windows Powered Smartphone 2003 */
241 { USB_DEVICE(0x045E, 0x04DE) }, /* Windows Powered Smartphone 2003 */
242 { USB_DEVICE(0x045E, 0x04DF) }, /* Windows Powered Smartphone 2003 */
243 { USB_DEVICE(0x045E, 0x04E0) }, /* Windows Powered Smartphone 2003 */
244 { USB_DEVICE(0x045E, 0x04E1) }, /* Windows Powered Smartphone 2003 */
245 { USB_DEVICE(0x045E, 0x04E2) }, /* Windows Powered Smartphone 2003 */
246 { USB_DEVICE(0x045E, 0x04E3) }, /* Windows Powered Smartphone 2003 */
247 { USB_DEVICE(0x045E, 0x04E4) }, /* Windows Powered Smartphone 2003 */
248 { USB_DEVICE(0x045E, 0x04E5) }, /* Windows Powered Smartphone 2003 */
249 { USB_DEVICE(0x045E, 0x04E6) }, /* Windows Powered Smartphone 2003 */
250 { USB_DEVICE(0x045E, 0x04E7) }, /* Windows Powered Smartphone 2003 */
251 { USB_DEVICE(0x045E, 0x04E8) }, /* Windows Powered Smartphone 2003 */
252 { USB_DEVICE(0x045E, 0x04E9) }, /* Windows Powered Smartphone 2003 */
253 { USB_DEVICE(0x045E, 0x04EA) }, /* Windows Powered Smartphone 2003 */
254 { USB_DEVICE(0x0961, 0x0010) }, /* Portatec USB Sync */
255 { USB_DEVICE(0x5E04, 0xCE00) }, /* SAGEM Wireless Assistant */
256 { USB_DEVICE(0x0104, 0x00BE) }, /* Socket USB Sync */
257 { USB_DEVICE(0x0930, 0x0700) }, /* TOSHIBA USB Sync 0700 */
258 { USB_DEVICE(0x0930, 0x0705) }, /* TOSHIBA Pocket PC e310 */
259 { USB_DEVICE(0x0930, 0x0707) }, /* TOSHIBA Pocket PC e330 Series */
260 { USB_DEVICE(0x0930, 0x0708) }, /* TOSHIBA Pocket PC e350 Series */
261 { USB_DEVICE(0x0930, 0x0706) }, /* TOSHIBA Pocket PC e740 */
262 { USB_DEVICE(0x0930, 0x0709) }, /* TOSHIBA Pocket PC e750 Series */
263 { USB_DEVICE(0x0930, 0x070A) }, /* TOSHIBA Pocket PC e400 Series */
264 { USB_DEVICE(0x0930, 0x070B) }, /* TOSHIBA Pocket PC e800 Series */
265 { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */
266 { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */
267 { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */
268 { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */
269 { USB_DEVICE(0x0BB4, 0x0A04) }, /* PocketPC USB Sync */
270 { USB_DEVICE(0x0BB4, 0x0A05) }, /* PocketPC USB Sync */
271 { USB_DEVICE(0x0BB4, 0x0A06) }, /* PocketPC USB Sync */
272 { USB_DEVICE(0x0BB4, 0x0A07) }, /* PocketPC USB Sync */
273 { USB_DEVICE(0x0BB4, 0x0A08) }, /* PocketPC USB Sync */
274 { USB_DEVICE(0x0BB4, 0x0A09) }, /* PocketPC USB Sync */
275 { USB_DEVICE(0x0BB4, 0x0A0A) }, /* PocketPC USB Sync */
276 { USB_DEVICE(0x0BB4, 0x0A0B) }, /* PocketPC USB Sync */
277 { USB_DEVICE(0x0BB4, 0x0A0C) }, /* PocketPC USB Sync */
278 { USB_DEVICE(0x0BB4, 0x0A0D) }, /* PocketPC USB Sync */
279 { USB_DEVICE(0x0BB4, 0x0A0E) }, /* PocketPC USB Sync */
280 { USB_DEVICE(0x0BB4, 0x0A0F) }, /* PocketPC USB Sync */
281 { USB_DEVICE(0x0BB4, 0x0A10) }, /* PocketPC USB Sync */
282 { USB_DEVICE(0x0BB4, 0x0A11) }, /* PocketPC USB Sync */
283 { USB_DEVICE(0x0BB4, 0x0A12) }, /* PocketPC USB Sync */
284 { USB_DEVICE(0x0BB4, 0x0A13) }, /* PocketPC USB Sync */
285 { USB_DEVICE(0x0BB4, 0x0A14) }, /* PocketPC USB Sync */
286 { USB_DEVICE(0x0BB4, 0x0A15) }, /* PocketPC USB Sync */
287 { USB_DEVICE(0x0BB4, 0x0A16) }, /* PocketPC USB Sync */
288 { USB_DEVICE(0x0BB4, 0x0A17) }, /* PocketPC USB Sync */
289 { USB_DEVICE(0x0BB4, 0x0A18) }, /* PocketPC USB Sync */
290 { USB_DEVICE(0x0BB4, 0x0A19) }, /* PocketPC USB Sync */
291 { USB_DEVICE(0x0BB4, 0x0A1A) }, /* PocketPC USB Sync */
292 { USB_DEVICE(0x0BB4, 0x0A1B) }, /* PocketPC USB Sync */
293 { USB_DEVICE(0x0BB4, 0x0A1C) }, /* PocketPC USB Sync */
294 { USB_DEVICE(0x0BB4, 0x0A1D) }, /* PocketPC USB Sync */
295 { USB_DEVICE(0x0BB4, 0x0A1E) }, /* PocketPC USB Sync */
296 { USB_DEVICE(0x0BB4, 0x0A1F) }, /* PocketPC USB Sync */
297 { USB_DEVICE(0x0BB4, 0x0A20) }, /* PocketPC USB Sync */
298 { USB_DEVICE(0x0BB4, 0x0A21) }, /* PocketPC USB Sync */
299 { USB_DEVICE(0x0BB4, 0x0A22) }, /* PocketPC USB Sync */
300 { USB_DEVICE(0x0BB4, 0x0A23) }, /* PocketPC USB Sync */
301 { USB_DEVICE(0x0BB4, 0x0A24) }, /* PocketPC USB Sync */
302 { USB_DEVICE(0x0BB4, 0x0A25) }, /* PocketPC USB Sync */
303 { USB_DEVICE(0x0BB4, 0x0A26) }, /* PocketPC USB Sync */
304 { USB_DEVICE(0x0BB4, 0x0A27) }, /* PocketPC USB Sync */
305 { USB_DEVICE(0x0BB4, 0x0A28) }, /* PocketPC USB Sync */
306 { USB_DEVICE(0x0BB4, 0x0A29) }, /* PocketPC USB Sync */
307 { USB_DEVICE(0x0BB4, 0x0A2A) }, /* PocketPC USB Sync */
308 { USB_DEVICE(0x0BB4, 0x0A2B) }, /* PocketPC USB Sync */
309 { USB_DEVICE(0x0BB4, 0x0A2C) }, /* PocketPC USB Sync */
310 { USB_DEVICE(0x0BB4, 0x0A2D) }, /* PocketPC USB Sync */
311 { USB_DEVICE(0x0BB4, 0x0A2E) }, /* PocketPC USB Sync */
312 { USB_DEVICE(0x0BB4, 0x0A2F) }, /* PocketPC USB Sync */
313 { USB_DEVICE(0x0BB4, 0x0A30) }, /* PocketPC USB Sync */
314 { USB_DEVICE(0x0BB4, 0x0A31) }, /* PocketPC USB Sync */
315 { USB_DEVICE(0x0BB4, 0x0A32) }, /* PocketPC USB Sync */
316 { USB_DEVICE(0x0BB4, 0x0A33) }, /* PocketPC USB Sync */
317 { USB_DEVICE(0x0BB4, 0x0A34) }, /* PocketPC USB Sync */
318 { USB_DEVICE(0x0BB4, 0x0A35) }, /* PocketPC USB Sync */
319 { USB_DEVICE(0x0BB4, 0x0A36) }, /* PocketPC USB Sync */
320 { USB_DEVICE(0x0BB4, 0x0A37) }, /* PocketPC USB Sync */
321 { USB_DEVICE(0x0BB4, 0x0A38) }, /* PocketPC USB Sync */
322 { USB_DEVICE(0x0BB4, 0x0A39) }, /* PocketPC USB Sync */
323 { USB_DEVICE(0x0BB4, 0x0A3A) }, /* PocketPC USB Sync */
324 { USB_DEVICE(0x0BB4, 0x0A3B) }, /* PocketPC USB Sync */
325 { USB_DEVICE(0x0BB4, 0x0A3C) }, /* PocketPC USB Sync */
326 { USB_DEVICE(0x0BB4, 0x0A3D) }, /* PocketPC USB Sync */
327 { USB_DEVICE(0x0BB4, 0x0A3E) }, /* PocketPC USB Sync */
328 { USB_DEVICE(0x0BB4, 0x0A3F) }, /* PocketPC USB Sync */
329 { USB_DEVICE(0x0BB4, 0x0A40) }, /* PocketPC USB Sync */
330 { USB_DEVICE(0x0BB4, 0x0A41) }, /* PocketPC USB Sync */
331 { USB_DEVICE(0x0BB4, 0x0A42) }, /* PocketPC USB Sync */
332 { USB_DEVICE(0x0BB4, 0x0A43) }, /* PocketPC USB Sync */
333 { USB_DEVICE(0x0BB4, 0x0A44) }, /* PocketPC USB Sync */
334 { USB_DEVICE(0x0BB4, 0x0A45) }, /* PocketPC USB Sync */
335 { USB_DEVICE(0x0BB4, 0x0A46) }, /* PocketPC USB Sync */
336 { USB_DEVICE(0x0BB4, 0x0A47) }, /* PocketPC USB Sync */
337 { USB_DEVICE(0x0BB4, 0x0A48) }, /* PocketPC USB Sync */
338 { USB_DEVICE(0x0BB4, 0x0A49) }, /* PocketPC USB Sync */
339 { USB_DEVICE(0x0BB4, 0x0A4A) }, /* PocketPC USB Sync */
340 { USB_DEVICE(0x0BB4, 0x0A4B) }, /* PocketPC USB Sync */
341 { USB_DEVICE(0x0BB4, 0x0A4C) }, /* PocketPC USB Sync */
342 { USB_DEVICE(0x0BB4, 0x0A4D) }, /* PocketPC USB Sync */
343 { USB_DEVICE(0x0BB4, 0x0A4E) }, /* PocketPC USB Sync */
344 { USB_DEVICE(0x0BB4, 0x0A4F) }, /* PocketPC USB Sync */
345 { USB_DEVICE(0x0BB4, 0x0A50) }, /* HTC SmartPhone USB Sync */
346 { USB_DEVICE(0x0BB4, 0x0A51) }, /* SmartPhone USB Sync */
347 { USB_DEVICE(0x0BB4, 0x0A52) }, /* SmartPhone USB Sync */
348 { USB_DEVICE(0x0BB4, 0x0A53) }, /* SmartPhone USB Sync */
349 { USB_DEVICE(0x0BB4, 0x0A54) }, /* SmartPhone USB Sync */
350 { USB_DEVICE(0x0BB4, 0x0A55) }, /* SmartPhone USB Sync */
351 { USB_DEVICE(0x0BB4, 0x0A56) }, /* SmartPhone USB Sync */
352 { USB_DEVICE(0x0BB4, 0x0A57) }, /* SmartPhone USB Sync */
353 { USB_DEVICE(0x0BB4, 0x0A58) }, /* SmartPhone USB Sync */
354 { USB_DEVICE(0x0BB4, 0x0A59) }, /* SmartPhone USB Sync */
355 { USB_DEVICE(0x0BB4, 0x0A5A) }, /* SmartPhone USB Sync */
356 { USB_DEVICE(0x0BB4, 0x0A5B) }, /* SmartPhone USB Sync */
357 { USB_DEVICE(0x0BB4, 0x0A5C) }, /* SmartPhone USB Sync */
358 { USB_DEVICE(0x0BB4, 0x0A5D) }, /* SmartPhone USB Sync */
359 { USB_DEVICE(0x0BB4, 0x0A5E) }, /* SmartPhone USB Sync */
360 { USB_DEVICE(0x0BB4, 0x0A5F) }, /* SmartPhone USB Sync */
361 { USB_DEVICE(0x0BB4, 0x0A60) }, /* SmartPhone USB Sync */
362 { USB_DEVICE(0x0BB4, 0x0A61) }, /* SmartPhone USB Sync */
363 { USB_DEVICE(0x0BB4, 0x0A62) }, /* SmartPhone USB Sync */
364 { USB_DEVICE(0x0BB4, 0x0A63) }, /* SmartPhone USB Sync */
365 { USB_DEVICE(0x0BB4, 0x0A64) }, /* SmartPhone USB Sync */
366 { USB_DEVICE(0x0BB4, 0x0A65) }, /* SmartPhone USB Sync */
367 { USB_DEVICE(0x0BB4, 0x0A66) }, /* SmartPhone USB Sync */
368 { USB_DEVICE(0x0BB4, 0x0A67) }, /* SmartPhone USB Sync */
369 { USB_DEVICE(0x0BB4, 0x0A68) }, /* SmartPhone USB Sync */
370 { USB_DEVICE(0x0BB4, 0x0A69) }, /* SmartPhone USB Sync */
371 { USB_DEVICE(0x0BB4, 0x0A6A) }, /* SmartPhone USB Sync */
372 { USB_DEVICE(0x0BB4, 0x0A6B) }, /* SmartPhone USB Sync */
373 { USB_DEVICE(0x0BB4, 0x0A6C) }, /* SmartPhone USB Sync */
374 { USB_DEVICE(0x0BB4, 0x0A6D) }, /* SmartPhone USB Sync */
375 { USB_DEVICE(0x0BB4, 0x0A6E) }, /* SmartPhone USB Sync */
376 { USB_DEVICE(0x0BB4, 0x0A6F) }, /* SmartPhone USB Sync */
377 { USB_DEVICE(0x0BB4, 0x0A70) }, /* SmartPhone USB Sync */
378 { USB_DEVICE(0x0BB4, 0x0A71) }, /* SmartPhone USB Sync */
379 { USB_DEVICE(0x0BB4, 0x0A72) }, /* SmartPhone USB Sync */
380 { USB_DEVICE(0x0BB4, 0x0A73) }, /* SmartPhone USB Sync */
381 { USB_DEVICE(0x0BB4, 0x0A74) }, /* SmartPhone USB Sync */
382 { USB_DEVICE(0x0BB4, 0x0A75) }, /* SmartPhone USB Sync */
383 { USB_DEVICE(0x0BB4, 0x0A76) }, /* SmartPhone USB Sync */
384 { USB_DEVICE(0x0BB4, 0x0A77) }, /* SmartPhone USB Sync */
385 { USB_DEVICE(0x0BB4, 0x0A78) }, /* SmartPhone USB Sync */
386 { USB_DEVICE(0x0BB4, 0x0A79) }, /* SmartPhone USB Sync */
387 { USB_DEVICE(0x0BB4, 0x0A7A) }, /* SmartPhone USB Sync */
388 { USB_DEVICE(0x0BB4, 0x0A7B) }, /* SmartPhone USB Sync */
389 { USB_DEVICE(0x0BB4, 0x0A7C) }, /* SmartPhone USB Sync */
390 { USB_DEVICE(0x0BB4, 0x0A7D) }, /* SmartPhone USB Sync */
391 { USB_DEVICE(0x0BB4, 0x0A7E) }, /* SmartPhone USB Sync */
392 { USB_DEVICE(0x0BB4, 0x0A7F) }, /* SmartPhone USB Sync */
393 { USB_DEVICE(0x0BB4, 0x0A80) }, /* SmartPhone USB Sync */
394 { USB_DEVICE(0x0BB4, 0x0A81) }, /* SmartPhone USB Sync */
395 { USB_DEVICE(0x0BB4, 0x0A82) }, /* SmartPhone USB Sync */
396 { USB_DEVICE(0x0BB4, 0x0A83) }, /* SmartPhone USB Sync */
397 { USB_DEVICE(0x0BB4, 0x0A84) }, /* SmartPhone USB Sync */
398 { USB_DEVICE(0x0BB4, 0x0A85) }, /* SmartPhone USB Sync */
399 { USB_DEVICE(0x0BB4, 0x0A86) }, /* SmartPhone USB Sync */
400 { USB_DEVICE(0x0BB4, 0x0A87) }, /* SmartPhone USB Sync */
401 { USB_DEVICE(0x0BB4, 0x0A88) }, /* SmartPhone USB Sync */
402 { USB_DEVICE(0x0BB4, 0x0A89) }, /* SmartPhone USB Sync */
403 { USB_DEVICE(0x0BB4, 0x0A8A) }, /* SmartPhone USB Sync */
404 { USB_DEVICE(0x0BB4, 0x0A8B) }, /* SmartPhone USB Sync */
405 { USB_DEVICE(0x0BB4, 0x0A8C) }, /* SmartPhone USB Sync */
406 { USB_DEVICE(0x0BB4, 0x0A8D) }, /* SmartPhone USB Sync */
407 { USB_DEVICE(0x0BB4, 0x0A8E) }, /* SmartPhone USB Sync */
408 { USB_DEVICE(0x0BB4, 0x0A8F) }, /* SmartPhone USB Sync */
409 { USB_DEVICE(0x0BB4, 0x0A90) }, /* SmartPhone USB Sync */
410 { USB_DEVICE(0x0BB4, 0x0A91) }, /* SmartPhone USB Sync */
411 { USB_DEVICE(0x0BB4, 0x0A92) }, /* SmartPhone USB Sync */
412 { USB_DEVICE(0x0BB4, 0x0A93) }, /* SmartPhone USB Sync */
413 { USB_DEVICE(0x0BB4, 0x0A94) }, /* SmartPhone USB Sync */
414 { USB_DEVICE(0x0BB4, 0x0A95) }, /* SmartPhone USB Sync */
415 { USB_DEVICE(0x0BB4, 0x0A96) }, /* SmartPhone USB Sync */
416 { USB_DEVICE(0x0BB4, 0x0A97) }, /* SmartPhone USB Sync */
417 { USB_DEVICE(0x0BB4, 0x0A98) }, /* SmartPhone USB Sync */
418 { USB_DEVICE(0x0BB4, 0x0A99) }, /* SmartPhone USB Sync */
419 { USB_DEVICE(0x0BB4, 0x0A9A) }, /* SmartPhone USB Sync */
420 { USB_DEVICE(0x0BB4, 0x0A9B) }, /* SmartPhone USB Sync */
421 { USB_DEVICE(0x0BB4, 0x0A9C) }, /* SmartPhone USB Sync */
422 { USB_DEVICE(0x0BB4, 0x0A9D) }, /* SmartPhone USB Sync */
423 { USB_DEVICE(0x0BB4, 0x0A9E) }, /* SmartPhone USB Sync */
424 { USB_DEVICE(0x0BB4, 0x0A9F) }, /* SmartPhone USB Sync */
425 { USB_DEVICE(0x0409, 0x00D5) }, /* NEC USB Sync */
426 { USB_DEVICE(0x0409, 0x00D6) }, /* NEC USB Sync */
427 { USB_DEVICE(0x0409, 0x00D7) }, /* NEC USB Sync */
428 { USB_DEVICE(0x0409, 0x8024) }, /* NEC USB Sync */
429 { USB_DEVICE(0x0409, 0x8025) }, /* NEC USB Sync */
430 { USB_DEVICE(0x04A4, 0x0014) }, /* Hitachi USB Sync */
431 { USB_DEVICE(0x0BF8, 0x1001) }, /* Fujitsu Siemens Computers USB Sync */
432 { USB_DEVICE(0x0F98, 0x0201) }, /* Cyberbank USB Sync */
433 { USB_DEVICE(0x0502, 0x16E1) }, /* Acer n10 Handheld USB Sync */
434 { USB_DEVICE(0x0502, 0x16E3) }, /* Acer n30 Handheld USB Sync */
435 { USB_DEVICE(0x0502, 0x16E2) }, /* Acer n20 Handheld USB Sync */
436 { USB_DEVICE(0x0502, 0x1631) }, /* c10 Series */
437 { USB_DEVICE(0x0502, 0x1632) }, /* c20 Series */
438 { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */
439 { USB_DEVICE(0x0B05, 0x420F) }, /* ASUS USB Sync */
440 { USB_DEVICE(0x0B05, 0x4200) }, /* ASUS USB Sync */
441 { USB_DEVICE(0x0B05, 0x4201) }, /* ASUS USB Sync */
442 { USB_DEVICE(0x0B05, 0x4202) }, /* ASUS USB Sync */
443 { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */
444 { USB_DEVICE(0x0C8E, 0x6000) }, /* Cesscom Luxian Series */
445 { USB_DEVICE(0x04AD, 0x0301) }, /* USB Sync 0301 */
446 { USB_DEVICE(0x04AD, 0x0302) }, /* USB Sync 0302 */
447 { USB_DEVICE(0x04AD, 0x0303) }, /* USB Sync 0303 */
448 { USB_DEVICE(0x1066, 0x0300) }, /* E-TEN P3XX Pocket PC */
449 { USB_DEVICE(0x1066, 0x0500) }, /* E-TEN P5XX Pocket PC */
450 { USB_DEVICE(0x1066, 0x0600) }, /* E-TEN P6XX Pocket PC */
451 { USB_DEVICE(0x1066, 0x0700) }, /* E-TEN P7XX Pocket PC */
452 { USB_DEVICE(0x1066, 0x00CE) }, /* E-TEN USB Sync */
453 { USB_DEVICE(0x0F4E, 0x0200) }, /* Freedom Scientific USB Sync */
454 { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */
455 { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */
456 { USB_DEVICE(0x067E, 0x1001) }, /* Intermec Mobile Computer */
457 { USB_DEVICE(0x04f1, 0x3011) }, /* JVC USB Sync */
458 { USB_DEVICE(0x04F1, 0x3012) }, /* JVC USB Sync */
459 { USB_DEVICE(0x3708, 0x20CE) }, /* Legend USB Sync */
460 { USB_DEVICE(0x3708, 0x21CE) }, /* Lenovo USB Sync */
461 { USB_DEVICE(0x043E, 0x9C01) }, /* LGE USB Sync */
462 { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */
463 { USB_DEVICE(0x3340, 0x0B1C) }, /* Generic PPC StrongARM */
464 { USB_DEVICE(0x3340, 0x0E3A) }, /* Generic PPC USB Sync */
465 { USB_DEVICE(0x3340, 0x0F3A) }, /* Generic SmartPhone USB Sync */
466 { USB_DEVICE(0x3340, 0x0F1C) }, /* Itautec USB Sync */
467 { USB_DEVICE(0x3340, 0x1326) }, /* Itautec USB Sync */
468 { USB_DEVICE(0x3340, 0x3326) }, /* MEDION Winodws Moble USB Sync */
469 { USB_DEVICE(0x3340, 0x0326) }, /* Mio DigiWalker 338 */
470 { USB_DEVICE(0x3340, 0x0426) }, /* Mio DigiWalker 338 */
471 { USB_DEVICE(0x3340, 0x011C) }, /* Mio DigiWalker PPC StrongARM */
472 { USB_DEVICE(0x3340, 0x053A) }, /* Mio DigiWalker SmartPhone USB Sync */
473 { USB_DEVICE(0x3340, 0x043A) }, /* Mio DigiWalker USB Sync */
474 { USB_DEVICE(0x3340, 0x071C) }, /* MiTAC USB Sync */
475 { USB_DEVICE(0x3340, 0x051C) }, /* MiTAC USB Sync 528 */
476 { USB_DEVICE(0x3340, 0x2326) }, /* Vobis USB Sync */
477 { USB_DEVICE(0x3340, 0x191C) }, /* YAKUMO USB Sync */
478 { USB_DEVICE(0x4113, 0x0210) }, /* Mobile Media Technology USB Sync */
479 { USB_DEVICE(0x4113, 0x0211) }, /* Mobile Media Technology USB Sync */
480 { USB_DEVICE(0x4113, 0x0400) }, /* Mobile Media Technology USB Sync */
481 { USB_DEVICE(0x4113, 0x0410) }, /* Mobile Media Technology USB Sync */
482 { USB_DEVICE(0x0CAD, 0x9001) }, /* Motorola PowerPad Pocket PC Device */
483 { USB_DEVICE(0x0C44, 0x03A2) }, /* Motorola iDEN Smartphone */
484 { USB_DEVICE(0x04E8, 0x6611) }, /* Samsung MITs USB Sync */
485 { USB_DEVICE(0x04E8, 0x6613) }, /* Samsung MITs USB Sync */
486 { USB_DEVICE(0x04E8, 0x6615) }, /* Samsung MITs USB Sync */
487 { USB_DEVICE(0x04E8, 0x6617) }, /* Samsung MITs USB Sync */
488 { USB_DEVICE(0x04E8, 0x6619) }, /* Samsung MITs USB Sync */
489 { USB_DEVICE(0x04E8, 0x661B) }, /* Samsung MITs USB Sync */
490 { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */
491 { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */
492 { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */
493 { USB_DEVICE(0x04E8, 0x5F03) }, /* Samsung NEXiO USB Sync */
494 { USB_DEVICE(0x04E8, 0x5F04) }, /* Samsung NEXiO USB Sync */
495 { USB_DEVICE(0x04E8, 0x662E) }, /* Samsung MITs USB Sync */
496 { USB_DEVICE(0x04E8, 0x6630) }, /* Samsung MITs USB Sync */
497 { USB_DEVICE(0x04E8, 0x6632) }, /* Samsung MITs USB Sync */
498 { USB_DEVICE(0x4505, 0x0010) }, /* Smartphone */
499 { USB_DEVICE(0x05E0, 0x2000) }, /* Symbol USB Sync */
500 { USB_DEVICE(0x05E0, 0x2001) }, /* Symbol USB Sync 0x2001 */
501 { USB_DEVICE(0x05E0, 0x2002) }, /* Symbol USB Sync 0x2002 */
502 { USB_DEVICE(0x05E0, 0x2003) }, /* Symbol USB Sync 0x2003 */
503 { USB_DEVICE(0x05E0, 0x2004) }, /* Symbol USB Sync 0x2004 */
504 { USB_DEVICE(0x05E0, 0x2005) }, /* Symbol USB Sync 0x2005 */
505 { USB_DEVICE(0x05E0, 0x2006) }, /* Symbol USB Sync 0x2006 */
506 { USB_DEVICE(0x05E0, 0x2007) }, /* Symbol USB Sync 0x2007 */
507 { USB_DEVICE(0x05E0, 0x2008) }, /* Symbol USB Sync 0x2008 */
508 { USB_DEVICE(0x05E0, 0x2009) }, /* Symbol USB Sync 0x2009 */
509 { USB_DEVICE(0x05E0, 0x200A) }, /* Symbol USB Sync 0x200A */
510 { USB_DEVICE(0x1182, 0x1388) }, /* VES USB Sync */
511 { USB_DEVICE(0x0543, 0x0ED9) }, /* ViewSonic Color Pocket PC V35 */
512 { USB_DEVICE(0x0543, 0x1527) }, /* ViewSonic Color Pocket PC V36 */
513 { USB_DEVICE(0x0543, 0x1529) }, /* ViewSonic Color Pocket PC V37 */
514 { USB_DEVICE(0x0543, 0x152B) }, /* ViewSonic Color Pocket PC V38 */
515 { USB_DEVICE(0x0543, 0x152E) }, /* ViewSonic Pocket PC */
516 { USB_DEVICE(0x0543, 0x1921) }, /* ViewSonic Communicator Pocket PC */
517 { USB_DEVICE(0x0543, 0x1922) }, /* ViewSonic Smartphone */
518 { USB_DEVICE(0x0543, 0x1923) }, /* ViewSonic Pocket PC V30 */
519 { USB_DEVICE(0x0536, 0x01A0) }, /* HHP PDT */
520 { USB_DEVICE(0x099E, 0x0052) }, /* Trimble GeoExplorer */
521 { USB_DEVICE(0x099E, 0x4000) }, /* TDS Data Collector */
522 { USB_DEVICE(0x0FB8, 0x3001) }, /* Wistron USB Sync */
523 { USB_DEVICE(0x0FB8, 0x3002) }, /* Wistron USB Sync */
524 { USB_DEVICE(0x0FB8, 0x3003) }, /* Wistron USB Sync */
525 { USB_DEVICE(0x0FB8, 0x4001) }, /* Wistron USB Sync */
526 { USB_DEVICE(0x11D9, 0x1003) }, /* Rugged Pocket PC 2003 */
527 { USB_DEVICE(0x11D9, 0x1002) }, /* Rugged Pocket PC 2003 */
528 { USB_DEVICE(0x22B8, 0x4204) }, /* Motorola MPx200 Smartphone */
529 { USB_DEVICE(0x22B8, 0x4214) }, /* Motorola MPc GSM */
530 { USB_DEVICE(0x22B8, 0x4224) }, /* Motorola MPx220 Smartphone */
531 { USB_DEVICE(0x22B8, 0x4234) }, /* Motorola MPc CDMA */
532 { USB_DEVICE(0x22B8, 0x4244) }, /* Motorola MPx100 Smartphone */
533 { USB_DEVICE(0x1231, 0xCE01) }, /* USB Sync 03 */
534 { USB_DEVICE(0x1231, 0xCE02) }, /* USB Sync 03 */
535 { } /* Terminating entry */
536};
537
538MODULE_DEVICE_TABLE (usb, ipaq_id_table);
539
540static struct usb_driver ipaq_driver = {
541 .owner = THIS_MODULE,
542 .name = "ipaq",
543 .probe = usb_serial_probe,
544 .disconnect = usb_serial_disconnect,
545 .id_table = ipaq_id_table,
546};
547
548
549/* All of the device info needed for the Compaq iPAQ */
550static struct usb_serial_device_type ipaq_device = {
551 .owner = THIS_MODULE,
552 .name = "PocketPC PDA",
553 .id_table = ipaq_id_table,
554 .num_interrupt_in = NUM_DONT_CARE,
555 .num_bulk_in = 1,
556 .num_bulk_out = 1,
557 .num_ports = 1,
558 .open = ipaq_open,
559 .close = ipaq_close,
560 .attach = ipaq_startup,
561 .shutdown = ipaq_shutdown,
562 .write = ipaq_write,
563 .write_room = ipaq_write_room,
564 .chars_in_buffer = ipaq_chars_in_buffer,
565 .read_bulk_callback = ipaq_read_bulk_callback,
566 .write_bulk_callback = ipaq_write_bulk_callback,
567};
568
569static spinlock_t write_list_lock;
570static int bytes_in;
571static int bytes_out;
572
573static int ipaq_open(struct usb_serial_port *port, struct file *filp)
574{
575 struct usb_serial *serial = port->serial;
576 struct ipaq_private *priv;
577 struct ipaq_packet *pkt;
578 int i, result = 0;
579 int retries = KP_RETRIES;
580
581 dbg("%s - port %d", __FUNCTION__, port->number);
582
583 bytes_in = 0;
584 bytes_out = 0;
585 priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private), GFP_KERNEL);
586 if (priv == NULL) {
587 err("%s - Out of memory", __FUNCTION__);
588 return -ENOMEM;
589 }
590 usb_set_serial_port_data(port, priv);
591 priv->active = 0;
592 priv->queue_len = 0;
593 priv->free_len = 0;
594 INIT_LIST_HEAD(&priv->queue);
595 INIT_LIST_HEAD(&priv->freelist);
596
597 for (i = 0; i < URBDATA_QUEUE_MAX / PACKET_SIZE; i++) {
598 pkt = kmalloc(sizeof(struct ipaq_packet), GFP_KERNEL);
599 if (pkt == NULL) {
600 goto enomem;
601 }
602 pkt->data = kmalloc(PACKET_SIZE, GFP_KERNEL);
603 if (pkt->data == NULL) {
604 kfree(pkt);
605 goto enomem;
606 }
607 pkt->len = 0;
608 pkt->written = 0;
609 INIT_LIST_HEAD(&pkt->list);
610 list_add(&pkt->list, &priv->freelist);
611 priv->free_len += PACKET_SIZE;
612 }
613
614 /*
615 * Force low latency on. This will immediately push data to the line
616 * discipline instead of queueing.
617 */
618
619 port->tty->low_latency = 1;
620 port->tty->raw = 1;
621 port->tty->real_raw = 1;
622
623 /*
624 * Lose the small buffers usbserial provides. Make larger ones.
625 */
626
627 kfree(port->bulk_in_buffer);
628 kfree(port->bulk_out_buffer);
629 port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
630 if (port->bulk_in_buffer == NULL) {
631 goto enomem;
632 }
633 port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
634 if (port->bulk_out_buffer == NULL) {
635 kfree(port->bulk_in_buffer);
636 goto enomem;
637 }
638 port->read_urb->transfer_buffer = port->bulk_in_buffer;
639 port->write_urb->transfer_buffer = port->bulk_out_buffer;
640 port->read_urb->transfer_buffer_length = URBDATA_SIZE;
641 port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE;
642
643 /* Start reading from the device */
644 usb_fill_bulk_urb(port->read_urb, serial->dev,
645 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
646 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
647 ipaq_read_bulk_callback, port);
648 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
649 if (result) {
650 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
651 goto error;
652 }
653
654 /*
655 * Send out control message observed in win98 sniffs. Not sure what
656 * it does, but from empirical observations, it seems that the device
657 * will start the chat sequence once one of these messages gets
658 * through. Since this has a reasonably high failure rate, we retry
659 * several times.
660 */
661
662 while (retries--) {
663 result = usb_control_msg(serial->dev,
664 usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
665 0x1, 0, NULL, 0, 100);
666 if (result == 0) {
667 return 0;
668 }
669 }
670 err("%s - failed doing control urb, error %d", __FUNCTION__, result);
671 goto error;
672
673enomem:
674 result = -ENOMEM;
675 err("%s - Out of memory", __FUNCTION__);
676error:
677 ipaq_destroy_lists(port);
678 kfree(priv);
679 return result;
680}
681
682
683static void ipaq_close(struct usb_serial_port *port, struct file *filp)
684{
685 struct ipaq_private *priv = usb_get_serial_port_data(port);
686
687 dbg("%s - port %d", __FUNCTION__, port->number);
688
689 /*
690 * shut down bulk read and write
691 */
692 usb_kill_urb(port->write_urb);
693 usb_kill_urb(port->read_urb);
694 ipaq_destroy_lists(port);
695 kfree(priv);
696 usb_set_serial_port_data(port, NULL);
697
698 /* Uncomment the following line if you want to see some statistics in your syslog */
699 /* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
700}
701
702static void ipaq_read_bulk_callback(struct urb *urb, struct pt_regs *regs)
703{
704 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
705 struct tty_struct *tty;
706 unsigned char *data = urb->transfer_buffer;
707 int i, result;
708
709 dbg("%s - port %d", __FUNCTION__, port->number);
710
711 if (urb->status) {
712 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
713 return;
714 }
715
716 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
717
718 tty = port->tty;
719 if (tty && urb->actual_length) {
720 for (i = 0; i < urb->actual_length ; ++i) {
721 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
722 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
723 tty_flip_buffer_push(tty);
724 }
725 /* this doesn't actually push the data through unless tty->low_latency is set */
726 tty_insert_flip_char(tty, data[i], 0);
727 }
728 tty_flip_buffer_push(tty);
729 bytes_in += urb->actual_length;
730 }
731
732 /* Continue trying to always read */
733 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
734 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
735 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
736 ipaq_read_bulk_callback, port);
737 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
738 if (result)
739 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
740 return;
741}
742
743static int ipaq_write(struct usb_serial_port *port, const unsigned char *buf,
744 int count)
745{
746 const unsigned char *current_position = buf;
747 int bytes_sent = 0;
748 int transfer_size;
749
750 dbg("%s - port %d", __FUNCTION__, port->number);
751
752 while (count > 0) {
753 transfer_size = min(count, PACKET_SIZE);
754 if (ipaq_write_bulk(port, current_position, transfer_size)) {
755 break;
756 }
757 current_position += transfer_size;
758 bytes_sent += transfer_size;
759 count -= transfer_size;
760 bytes_out += transfer_size;
761 }
762
763 return bytes_sent;
764}
765
766static int ipaq_write_bulk(struct usb_serial_port *port, const unsigned char *buf,
767 int count)
768{
769 struct ipaq_private *priv = usb_get_serial_port_data(port);
770 struct ipaq_packet *pkt = NULL;
771 int result = 0;
772 unsigned long flags;
773
774 if (priv->free_len <= 0) {
775 dbg("%s - we're stuffed", __FUNCTION__);
776 return -EAGAIN;
777 }
778
779 spin_lock_irqsave(&write_list_lock, flags);
780 if (!list_empty(&priv->freelist)) {
781 pkt = list_entry(priv->freelist.next, struct ipaq_packet, list);
782 list_del(&pkt->list);
783 priv->free_len -= PACKET_SIZE;
784 }
785 spin_unlock_irqrestore(&write_list_lock, flags);
786 if (pkt == NULL) {
787 dbg("%s - we're stuffed", __FUNCTION__);
788 return -EAGAIN;
789 }
790
791 memcpy(pkt->data, buf, count);
792 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, pkt->data);
793
794 pkt->len = count;
795 pkt->written = 0;
796 spin_lock_irqsave(&write_list_lock, flags);
797 list_add_tail(&pkt->list, &priv->queue);
798 priv->queue_len += count;
799 if (priv->active == 0) {
800 priv->active = 1;
801 ipaq_write_gather(port);
802 spin_unlock_irqrestore(&write_list_lock, flags);
803 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
804 if (result) {
805 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
806 }
807 } else {
808 spin_unlock_irqrestore(&write_list_lock, flags);
809 }
810 return result;
811}
812
813static void ipaq_write_gather(struct usb_serial_port *port)
814{
815 struct ipaq_private *priv = usb_get_serial_port_data(port);
816 struct usb_serial *serial = port->serial;
817 int count, room;
818 struct ipaq_packet *pkt, *tmp;
819 struct urb *urb = port->write_urb;
820
821 if (urb->status == -EINPROGRESS) {
822 /* Should never happen */
823 err("%s - flushing while urb is active !", __FUNCTION__);
824 return;
825 }
826 room = URBDATA_SIZE;
827 list_for_each_entry_safe(pkt, tmp, &priv->queue, list) {
828 count = min(room, (int)(pkt->len - pkt->written));
829 memcpy(urb->transfer_buffer + (URBDATA_SIZE - room),
830 pkt->data + pkt->written, count);
831 room -= count;
832 pkt->written += count;
833 priv->queue_len -= count;
834 if (pkt->written == pkt->len) {
835 list_move(&pkt->list, &priv->freelist);
836 priv->free_len += PACKET_SIZE;
837 }
838 if (room == 0) {
839 break;
840 }
841 }
842
843 count = URBDATA_SIZE - room;
844 usb_fill_bulk_urb(port->write_urb, serial->dev,
845 usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
846 port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback,
847 port);
848 return;
849}
850
851static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
852{
853 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
854 struct ipaq_private *priv = usb_get_serial_port_data(port);
855 unsigned long flags;
856 int result;
857
858 dbg("%s - port %d", __FUNCTION__, port->number);
859
860 if (urb->status) {
861 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
862 }
863
864 spin_lock_irqsave(&write_list_lock, flags);
865 if (!list_empty(&priv->queue)) {
866 ipaq_write_gather(port);
867 spin_unlock_irqrestore(&write_list_lock, flags);
868 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
869 if (result) {
870 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
871 }
872 } else {
873 priv->active = 0;
874 spin_unlock_irqrestore(&write_list_lock, flags);
875 }
876
877 schedule_work(&port->work);
878}
879
880static int ipaq_write_room(struct usb_serial_port *port)
881{
882 struct ipaq_private *priv = usb_get_serial_port_data(port);
883
884 dbg("%s - freelen %d", __FUNCTION__, priv->free_len);
885 return priv->free_len;
886}
887
888static int ipaq_chars_in_buffer(struct usb_serial_port *port)
889{
890 struct ipaq_private *priv = usb_get_serial_port_data(port);
891
892 dbg("%s - queuelen %d", __FUNCTION__, priv->queue_len);
893 return priv->queue_len;
894}
895
896static void ipaq_destroy_lists(struct usb_serial_port *port)
897{
898 struct ipaq_private *priv = usb_get_serial_port_data(port);
899 struct ipaq_packet *pkt, *tmp;
900
901 list_for_each_entry_safe(pkt, tmp, &priv->queue, list) {
902 kfree(pkt->data);
903 kfree(pkt);
904 }
905 list_for_each_entry_safe(pkt, tmp, &priv->freelist, list) {
906 kfree(pkt->data);
907 kfree(pkt);
908 }
909}
910
911
912static int ipaq_startup(struct usb_serial *serial)
913{
914 dbg("%s", __FUNCTION__);
915 if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
916 err("active config #%d != 1 ??",
917 serial->dev->actconfig->desc.bConfigurationValue);
918 return -ENODEV;
919 }
920 return usb_reset_configuration (serial->dev);
921}
922
923static void ipaq_shutdown(struct usb_serial *serial)
924{
925 dbg("%s", __FUNCTION__);
926}
927
928static int __init ipaq_init(void)
929{
930 int retval;
931 spin_lock_init(&write_list_lock);
932 retval = usb_serial_register(&ipaq_device);
933 if (retval)
934 goto failed_usb_serial_register;
935 info(DRIVER_DESC " " DRIVER_VERSION);
936 if (vendor) {
937 ipaq_id_table[0].idVendor = vendor;
938 ipaq_id_table[0].idProduct = product;
939 }
940 retval = usb_register(&ipaq_driver);
941 if (retval)
942 goto failed_usb_register;
943
944 return 0;
945failed_usb_register:
946 usb_serial_deregister(&ipaq_device);
947failed_usb_serial_register:
948 return retval;
949}
950
951
952static void __exit ipaq_exit(void)
953{
954 usb_deregister(&ipaq_driver);
955 usb_serial_deregister(&ipaq_device);
956}
957
958
959module_init(ipaq_init);
960module_exit(ipaq_exit);
961
962MODULE_AUTHOR( DRIVER_AUTHOR );
963MODULE_DESCRIPTION( DRIVER_DESC );
964MODULE_LICENSE("GPL");
965
966module_param(debug, bool, S_IRUGO | S_IWUSR);
967MODULE_PARM_DESC(debug, "Debug enabled or not");
968
969module_param(vendor, ushort, 0);
970MODULE_PARM_DESC(vendor, "User specified USB idVendor");
971
972module_param(product, ushort, 0);
973MODULE_PARM_DESC(product, "User specified USB idProduct");
diff --git a/drivers/usb/serial/ipaq.h b/drivers/usb/serial/ipaq.h
new file mode 100644
index 000000000000..2b9035918b85
--- /dev/null
+++ b/drivers/usb/serial/ipaq.h
@@ -0,0 +1,54 @@
1/*
2 * USB Compaq iPAQ driver
3 *
4 * Copyright (C) 2001 - 2002
5 * Ganesh Varadarajan <ganesh@veritas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 */
13
14#ifndef __LINUX_USB_SERIAL_IPAQ_H
15#define __LINUX_USB_SERIAL_IPAQ_H
16
17/*
18 * Since we can't queue our bulk write urbs (don't know why - it just
19 * doesn't work), we can send down only one write urb at a time. The simplistic
20 * approach taken by the generic usbserial driver will work, but it's not good
21 * for performance. Therefore, we buffer upto URBDATA_QUEUE_MAX bytes of write
22 * requests coming from the line discipline. This is done by chaining them
23 * in lists of struct ipaq_packet, each packet holding a maximum of
24 * PACKET_SIZE bytes.
25 *
26 * ipaq_write() can be called from bottom half context; hence we can't
27 * allocate memory for packets there. So we initialize a pool of packets at
28 * the first open and maintain a freelist.
29 *
30 * The value of PACKET_SIZE was empirically determined by
31 * checking the maximum write sizes sent down by the ppp ldisc.
32 * URBDATA_QUEUE_MAX is set to 64K, which is the maximum TCP window size.
33 */
34
35struct ipaq_packet {
36 char *data;
37 size_t len;
38 size_t written;
39 struct list_head list;
40};
41
42struct ipaq_private {
43 int active;
44 int queue_len;
45 int free_len;
46 struct list_head queue;
47 struct list_head freelist;
48};
49
50#define URBDATA_SIZE 4096
51#define URBDATA_QUEUE_MAX (64 * 1024)
52#define PACKET_SIZE 256
53
54#endif
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c
new file mode 100644
index 000000000000..11105d74f461
--- /dev/null
+++ b/drivers/usb/serial/ipw.c
@@ -0,0 +1,491 @@
1/*
2 * IPWireless 3G UMTS TDD Modem driver (USB connected)
3 *
4 * Copyright (C) 2004 Roelf Diedericks <roelfd@inet.co.za>
5 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * All information about the device was acquired using SnoopyPro
13 * on MSFT's O/S, and examing the MSFT drivers' debug output
14 * (insanely left _on_ in the enduser version)
15 *
16 * It was written out of frustration with the IPWireless USB modem
17 * supplied by Axity3G/Sentech South Africa not supporting
18 * Linux whatsoever.
19 *
20 * Nobody provided any proprietary information that was not already
21 * available for this device.
22 *
23 * The modem adheres to the "3GPP TS 27.007 AT command set for 3G
24 * User Equipment (UE)" standard, available from
25 * http://www.3gpp.org/ftp/Specs/html-info/27007.htm
26 *
27 * The code was only tested the IPWireless handheld modem distributed
28 * in South Africa by Sentech.
29 *
30 * It may work for Woosh Inc in .nz too, as it appears they use the
31 * same kit.
32 *
33 * There is still some work to be done in terms of handling
34 * DCD, DTR, RTS, CTS which are currently faked.
35 * It's good enough for PPP at this point. It's based off all kinds of
36 * code found in usb/serial and usb/class
37 *
38 */
39
40#include <linux/kernel.h>
41#include <linux/errno.h>
42#include <linux/init.h>
43#include <linux/slab.h>
44#include <linux/tty.h>
45#include <linux/tty_flip.h>
46#include <linux/module.h>
47#include <linux/spinlock.h>
48#include <linux/usb.h>
49#include <linux/usb.h>
50#include <asm/uaccess.h>
51#include "usb-serial.h"
52
53/*
54 * Version Information
55 */
56#define DRIVER_VERSION "v0.3"
57#define DRIVER_AUTHOR "Roelf Diedericks"
58#define DRIVER_DESC "IPWireless tty driver"
59
60#define IPW_TTY_MAJOR 240 /* real device node major id, experimental range */
61#define IPW_TTY_MINORS 256 /* we support 256 devices, dunno why, it'd be insane :) */
62
63#define USB_IPW_MAGIC 0x6d02 /* magic number for ipw struct */
64
65
66/* Message sizes */
67#define EVENT_BUFFER_SIZE 0xFF
68#define CHAR2INT16(c1,c0) (((u32)((c1) & 0xff) << 8) + (u32)((c0) & 0xff))
69#define NUM_BULK_URBS 24
70#define NUM_CONTROL_URBS 16
71
72/* vendor/product pairs that are known work with this driver*/
73#define IPW_VID 0x0bc3
74#define IPW_PID 0x0001
75
76
77/* Vendor commands: */
78
79/* baud rates */
80enum {
81 ipw_sio_b256000 = 0x000e,
82 ipw_sio_b128000 = 0x001d,
83 ipw_sio_b115200 = 0x0020,
84 ipw_sio_b57600 = 0x0040,
85 ipw_sio_b56000 = 0x0042,
86 ipw_sio_b38400 = 0x0060,
87 ipw_sio_b19200 = 0x00c0,
88 ipw_sio_b14400 = 0x0100,
89 ipw_sio_b9600 = 0x0180,
90 ipw_sio_b4800 = 0x0300,
91 ipw_sio_b2400 = 0x0600,
92 ipw_sio_b1200 = 0x0c00,
93 ipw_sio_b600 = 0x1800
94};
95
96/* data bits */
97#define ipw_dtb_7 0x700
98#define ipw_dtb_8 0x810 // ok so the define is misleading, I know, but forces 8,n,1
99 // I mean, is there a point to any other setting these days? :)
100
101/* usb control request types : */
102#define IPW_SIO_RXCTL 0x00 // control bulk rx channel transmissions, value=1/0 (on/off)
103#define IPW_SIO_SET_BAUD 0x01 // set baud, value=requested ipw_sio_bxxxx
104#define IPW_SIO_SET_LINE 0x03 // set databits, parity. value=ipw_dtb_x
105#define IPW_SIO_SET_PIN 0x03 // set/clear dtr/rts value=ipw_pin_xxx
106#define IPW_SIO_POLL 0x08 // get serial port status byte, call with value=0
107#define IPW_SIO_INIT 0x11 // initializes ? value=0 (appears as first thing todo on open)
108#define IPW_SIO_PURGE 0x12 // purge all transmissions?, call with value=numchar_to_purge
109#define IPW_SIO_HANDFLOW 0x13 // set xon/xoff limits value=0, and a buffer of 0x10 bytes
110#define IPW_SIO_SETCHARS 0x13 // set the flowcontrol special chars, value=0, buf=6 bytes,
111 // last 2 bytes contain flowcontrol chars e.g. 00 00 00 00 11 13
112
113/* values used for request IPW_SIO_SET_PIN */
114#define IPW_PIN_SETDTR 0x101
115#define IPW_PIN_SETRTS 0x202
116#define IPW_PIN_CLRDTR 0x100
117#define IPW_PIN_CLRRTS 0x200 // unconfirmed
118
119/* values used for request IPW_SIO_RXCTL */
120#define IPW_RXBULK_ON 1
121#define IPW_RXBULK_OFF 0
122
123/* various 16 byte hardcoded transferbuffers used by flow control */
124#define IPW_BYTES_FLOWINIT { 0x01, 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
125
126/* Interpretation of modem status lines */
127/* These need sorting out by individually connecting pins and checking
128 * results. FIXME!
129 * When data is being sent we see 0x30 in the lower byte; this must
130 * contain DSR and CTS ...
131 */
132#define IPW_DSR ((1<<4) | (1<<5))
133#define IPW_CTS ((1<<5) | (1<<4))
134
135#define IPW_WANTS_TO_SEND 0x30
136//#define IPW_DTR /* Data Terminal Ready */
137//#define IPW_CTS /* Clear To Send */
138//#define IPW_CD /* Carrier Detect */
139//#define IPW_DSR /* Data Set Ready */
140//#define IPW_RxD /* Receive pin */
141
142//#define IPW_LE
143//#define IPW_RTS
144//#define IPW_ST
145//#define IPW_SR
146//#define IPW_RI /* Ring Indicator */
147
148static struct usb_device_id usb_ipw_ids[] = {
149 { USB_DEVICE(IPW_VID, IPW_PID) },
150 { },
151};
152
153MODULE_DEVICE_TABLE(usb, usb_ipw_ids);
154
155static struct usb_driver usb_ipw_driver = {
156 .owner = THIS_MODULE,
157 .name = "ipwtty",
158 .probe = usb_serial_probe,
159 .disconnect = usb_serial_disconnect,
160 .id_table = usb_ipw_ids,
161};
162
163static int debug;
164
165static void ipw_read_bulk_callback(struct urb *urb, struct pt_regs *regs)
166{
167 struct usb_serial_port *port = urb->context;
168 unsigned char *data = urb->transfer_buffer;
169 struct tty_struct *tty;
170 int i;
171 int result;
172
173 dbg("%s - port %d", __FUNCTION__, port->number);
174
175 if (urb->status) {
176 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
177 return;
178 }
179
180 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
181
182 tty = port->tty;
183 if (tty && urb->actual_length) {
184 for (i = 0; i < urb->actual_length ; ++i) {
185 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
186 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
187 tty_flip_buffer_push(tty);
188 }
189 /* this doesn't actually push the data through unless tty->low_latency is set */
190 tty_insert_flip_char(tty, data[i], 0);
191 }
192 tty_flip_buffer_push(tty);
193 }
194
195 /* Continue trying to always read */
196 usb_fill_bulk_urb (port->read_urb, port->serial->dev,
197 usb_rcvbulkpipe(port->serial->dev,
198 port->bulk_in_endpointAddress),
199 port->read_urb->transfer_buffer,
200 port->read_urb->transfer_buffer_length,
201 ipw_read_bulk_callback, port);
202 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
203 if (result)
204 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
205 return;
206}
207
208static int ipw_open(struct usb_serial_port *port, struct file *filp)
209{
210 struct usb_device *dev = port->serial->dev;
211 u8 buf_flow_static[16] = IPW_BYTES_FLOWINIT;
212 u8 *buf_flow_init;
213 int result;
214
215 dbg("%s", __FUNCTION__);
216
217 buf_flow_init = kmalloc(16, GFP_KERNEL);
218 if (!buf_flow_init)
219 return -ENOMEM;
220 memcpy(buf_flow_init, buf_flow_static, 16);
221
222 if (port->tty)
223 port->tty->low_latency = 1;
224
225 /* --1: Tell the modem to initialize (we think) From sniffs this is always the
226 * first thing that gets sent to the modem during opening of the device */
227 dbg("%s: Sending SIO_INIT (we guess)",__FUNCTION__);
228 result = usb_control_msg(dev, usb_sndctrlpipe(dev,0),
229 IPW_SIO_INIT,
230 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
231 0,
232 0, /* index */
233 NULL,
234 0,
235 100000);
236 if (result < 0)
237 dev_err(&port->dev, "Init of modem failed (error = %d)", result);
238
239 /* reset the bulk pipes */
240 usb_clear_halt(dev, usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress));
241 usb_clear_halt(dev, usb_sndbulkpipe(dev, port->bulk_out_endpointAddress));
242
243 /*--2: Start reading from the device */
244 dbg("%s: setting up bulk read callback",__FUNCTION__);
245 usb_fill_bulk_urb(port->read_urb, dev,
246 usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress),
247 port->bulk_in_buffer,
248 port->bulk_in_size,
249 ipw_read_bulk_callback, port);
250 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
251 if (result < 0)
252 dbg("%s - usb_submit_urb(read bulk) failed with status %d", __FUNCTION__, result);
253
254 /*--3: Tell the modem to open the floodgates on the rx bulk channel */
255 dbg("%s:asking modem for RxRead (RXBULK_ON)",__FUNCTION__);
256 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
257 IPW_SIO_RXCTL,
258 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
259 IPW_RXBULK_ON,
260 0, /* index */
261 NULL,
262 0,
263 100000);
264 if (result < 0)
265 dev_err(&port->dev, "Enabling bulk RxRead failed (error = %d)", result);
266
267 /*--4: setup the initial flowcontrol */
268 dbg("%s:setting init flowcontrol (%s)",__FUNCTION__,buf_flow_init);
269 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
270 IPW_SIO_HANDFLOW,
271 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
272 0,
273 0,
274 buf_flow_init,
275 0x10,
276 200000);
277 if (result < 0)
278 dev_err(&port->dev, "initial flowcontrol failed (error = %d)", result);
279
280
281 /*--5: raise the dtr */
282 dbg("%s:raising dtr",__FUNCTION__);
283 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
284 IPW_SIO_SET_PIN,
285 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
286 IPW_PIN_SETDTR,
287 0,
288 NULL,
289 0,
290 200000);
291 if (result < 0)
292 dev_err(&port->dev, "setting dtr failed (error = %d)", result);
293
294 /*--6: raise the rts */
295 dbg("%s:raising rts",__FUNCTION__);
296 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
297 IPW_SIO_SET_PIN,
298 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
299 IPW_PIN_SETRTS,
300 0,
301 NULL,
302 0,
303 200000);
304 if (result < 0)
305 dev_err(&port->dev, "setting dtr failed (error = %d)", result);
306
307 kfree(buf_flow_init);
308 return 0;
309}
310
311static void ipw_close(struct usb_serial_port *port, struct file * filp)
312{
313 struct usb_device *dev = port->serial->dev;
314 int result;
315
316 if (tty_hung_up_p(filp)) {
317 dbg("%s: tty_hung_up_p ...", __FUNCTION__);
318 return;
319 }
320
321 /*--1: drop the dtr */
322 dbg("%s:dropping dtr",__FUNCTION__);
323 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
324 IPW_SIO_SET_PIN,
325 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
326 IPW_PIN_CLRDTR,
327 0,
328 NULL,
329 0,
330 200000);
331 if (result < 0)
332 dev_err(&port->dev, "dropping dtr failed (error = %d)", result);
333
334 /*--2: drop the rts */
335 dbg("%s:dropping rts",__FUNCTION__);
336 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
337 IPW_SIO_SET_PIN, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
338 IPW_PIN_CLRRTS,
339 0,
340 NULL,
341 0,
342 200000);
343 if (result < 0)
344 dev_err(&port->dev, "dropping rts failed (error = %d)", result);
345
346
347 /*--3: purge */
348 dbg("%s:sending purge",__FUNCTION__);
349 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
350 IPW_SIO_PURGE, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
351 0x03,
352 0,
353 NULL,
354 0,
355 200000);
356 if (result < 0)
357 dev_err(&port->dev, "purge failed (error = %d)", result);
358
359
360 /* send RXBULK_off (tell modem to stop transmitting bulk data on rx chan) */
361 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
362 IPW_SIO_RXCTL,
363 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
364 IPW_RXBULK_OFF,
365 0, /* index */
366 NULL,
367 0,
368 100000);
369
370 if (result < 0)
371 dev_err(&port->dev, "Disabling bulk RxRead failed (error = %d)", result);
372
373 /* shutdown any in-flight urbs that we know about */
374 usb_kill_urb(port->read_urb);
375 usb_kill_urb(port->write_urb);
376}
377
378static void ipw_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
379{
380 struct usb_serial_port *port = urb->context;
381
382 dbg("%s", __FUNCTION__);
383
384 if (urb->status)
385 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
386
387 schedule_work(&port->work);
388}
389
390static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int count)
391{
392 struct usb_device *dev = port->serial->dev;
393 int ret;
394
395 dbg("%s: TOP: count=%d, in_interrupt=%ld", __FUNCTION__,
396 count, in_interrupt() );
397
398 if (count == 0) {
399 dbg("%s - write request of 0 bytes", __FUNCTION__);
400 return 0;
401 }
402
403 /* Racy and broken, FIXME properly! */
404 if (port->write_urb->status == -EINPROGRESS)
405 return 0;
406
407 count = min(count, port->bulk_out_size);
408 memcpy(port->bulk_out_buffer, buf, count);
409
410 dbg("%s count now:%d", __FUNCTION__, count);
411
412 usb_fill_bulk_urb(port->write_urb, dev,
413 usb_sndbulkpipe(dev, port->bulk_out_endpointAddress),
414 port->write_urb->transfer_buffer,
415 count,
416 ipw_write_bulk_callback,
417 port);
418
419 ret = usb_submit_urb(port->write_urb, GFP_ATOMIC);
420 if (ret != 0) {
421 dbg("%s - usb_submit_urb(write bulk) failed with error = %d", __FUNCTION__, ret);
422 return ret;
423 }
424
425 dbg("%s returning %d", __FUNCTION__, count);
426 return count;
427}
428
429static int ipw_probe(struct usb_serial_port *port)
430{
431 return 0;
432}
433
434static int ipw_disconnect(struct usb_serial_port *port)
435{
436 usb_set_serial_port_data(port, NULL);
437 return 0;
438}
439
440static struct usb_serial_device_type ipw_device = {
441 .owner = THIS_MODULE,
442 .name = "IPWireless converter",
443 .short_name = "ipw",
444 .id_table = usb_ipw_ids,
445 .num_interrupt_in = NUM_DONT_CARE,
446 .num_bulk_in = 1,
447 .num_bulk_out = 1,
448 .num_ports = 1,
449 .open = ipw_open,
450 .close = ipw_close,
451 .port_probe = ipw_probe,
452 .port_remove = ipw_disconnect,
453 .write = ipw_write,
454 .write_bulk_callback = ipw_write_bulk_callback,
455 .read_bulk_callback = ipw_read_bulk_callback,
456};
457
458
459
460static int usb_ipw_init(void)
461{
462 int retval;
463
464 retval = usb_serial_register(&ipw_device);
465 if (retval)
466 return retval;
467 retval = usb_register(&usb_ipw_driver);
468 if (retval) {
469 usb_serial_deregister(&ipw_device);
470 return retval;
471 }
472 info(DRIVER_DESC " " DRIVER_VERSION);
473 return 0;
474}
475
476static void usb_ipw_exit(void)
477{
478 usb_deregister(&usb_ipw_driver);
479 usb_serial_deregister(&ipw_device);
480}
481
482module_init(usb_ipw_init);
483module_exit(usb_ipw_exit);
484
485/* Module information */
486MODULE_AUTHOR( DRIVER_AUTHOR );
487MODULE_DESCRIPTION( DRIVER_DESC );
488MODULE_LICENSE("GPL");
489
490module_param(debug, bool, S_IRUGO | S_IWUSR);
491MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
new file mode 100644
index 000000000000..59f234df5f89
--- /dev/null
+++ b/drivers/usb/serial/ir-usb.c
@@ -0,0 +1,619 @@
1/*
2 * USB IR Dongle driver
3 *
4 * Copyright (C) 2001-2002 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2002 Gary Brubaker (xavyer@ix.netcom.com)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This driver allows a USB IrDA device to be used as a "dumb" serial device.
13 * This can be useful if you do not have access to a full IrDA stack on the
14 * other side of the connection. If you do have an IrDA stack on both devices,
15 * please use the usb-irda driver, as it contains the proper error checking and
16 * other goodness of a full IrDA stack.
17 *
18 * Portions of this driver were taken from drivers/net/irda/irda-usb.c, which
19 * was written by Roman Weissgaerber <weissg@vienna.at>, Dag Brattli
20 * <dag@brattli.net>, and Jean Tourrilhes <jt@hpl.hp.com>
21 *
22 * See Documentation/usb/usb-serial.txt for more information on using this driver
23 *
24 * 2002_Mar_07 greg kh
25 * moved some needed structures and #define values from the
26 * net/irda/irda-usb.h file into our file, as we don't want to depend on
27 * that codebase compiling correctly :)
28 *
29 * 2002_Jan_14 gb
30 * Added module parameter to force specific number of XBOFs.
31 * Added ir_xbof_change().
32 * Reorganized read_bulk_callback error handling.
33 * Switched from FILL_BULK_URB() to usb_fill_bulk_urb().
34 *
35 * 2001_Nov_08 greg kh
36 * Changed the irda_usb_find_class_desc() function based on comments and
37 * code from Martin Diehl.
38 *
39 * 2001_Nov_01 greg kh
40 * Added support for more IrDA USB devices.
41 * Added support for zero packet. Added buffer override paramater, so
42 * users can transfer larger packets at once if they wish. Both patches
43 * came from Dag Brattli <dag@obexcode.com>.
44 *
45 * 2001_Oct_07 greg kh
46 * initial version released.
47 */
48
49#include <linux/config.h>
50#include <linux/kernel.h>
51#include <linux/errno.h>
52#include <linux/init.h>
53#include <linux/slab.h>
54#include <linux/tty.h>
55#include <linux/tty_driver.h>
56#include <linux/tty_flip.h>
57#include <linux/module.h>
58#include <linux/spinlock.h>
59#include <asm/uaccess.h>
60#include <linux/usb.h>
61#include "usb-serial.h"
62
63/*
64 * Version Information
65 */
66#define DRIVER_VERSION "v0.4"
67#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
68#define DRIVER_DESC "USB IR Dongle driver"
69
70/* USB IrDA class spec information */
71#define USB_CLASS_IRDA 0x02
72#define USB_DT_IRDA 0x21
73#define IU_REQ_GET_CLASS_DESC 0x06
74#define SPEED_2400 0x01
75#define SPEED_9600 0x02
76#define SPEED_19200 0x03
77#define SPEED_38400 0x04
78#define SPEED_57600 0x05
79#define SPEED_115200 0x06
80#define SPEED_576000 0x07
81#define SPEED_1152000 0x08
82#define SPEED_4000000 0x09
83
84struct irda_class_desc {
85 u8 bLength;
86 u8 bDescriptorType;
87 u16 bcdSpecRevision;
88 u8 bmDataSize;
89 u8 bmWindowSize;
90 u8 bmMinTurnaroundTime;
91 u16 wBaudRate;
92 u8 bmAdditionalBOFs;
93 u8 bIrdaRateSniff;
94 u8 bMaxUnicastList;
95} __attribute__ ((packed));
96
97static int debug;
98
99/* if overridden by the user, then use their value for the size of the read and
100 * write urbs */
101static int buffer_size;
102/* if overridden by the user, then use the specified number of XBOFs */
103static int xbof = -1;
104
105static int ir_startup (struct usb_serial *serial);
106static int ir_open (struct usb_serial_port *port, struct file *filep);
107static void ir_close (struct usb_serial_port *port, struct file *filep);
108static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count);
109static void ir_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
110static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
111static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios);
112
113static u8 ir_baud = 0;
114static u8 ir_xbof = 0;
115static u8 ir_add_bof = 0;
116
117static struct usb_device_id id_table [] = {
118 { USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */
119 { USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */
120 { USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */
121 { USB_INTERFACE_INFO (USB_CLASS_APP_SPEC, USB_CLASS_IRDA, 0) },
122 { } /* Terminating entry */
123};
124
125MODULE_DEVICE_TABLE (usb, id_table);
126
127static struct usb_driver ir_driver = {
128 .owner = THIS_MODULE,
129 .name = "ir-usb",
130 .probe = usb_serial_probe,
131 .disconnect = usb_serial_disconnect,
132 .id_table = id_table,
133};
134
135
136static struct usb_serial_device_type ir_device = {
137 .owner = THIS_MODULE,
138 .name = "IR Dongle",
139 .id_table = id_table,
140 .num_interrupt_in = 1,
141 .num_bulk_in = 1,
142 .num_bulk_out = 1,
143 .num_ports = 1,
144 .set_termios = ir_set_termios,
145 .attach = ir_startup,
146 .open = ir_open,
147 .close = ir_close,
148 .write = ir_write,
149 .write_bulk_callback = ir_write_bulk_callback,
150 .read_bulk_callback = ir_read_bulk_callback,
151};
152
153static inline void irda_usb_dump_class_desc(struct irda_class_desc *desc)
154{
155 dbg("bLength=%x", desc->bLength);
156 dbg("bDescriptorType=%x", desc->bDescriptorType);
157 dbg("bcdSpecRevision=%x", desc->bcdSpecRevision);
158 dbg("bmDataSize=%x", desc->bmDataSize);
159 dbg("bmWindowSize=%x", desc->bmWindowSize);
160 dbg("bmMinTurnaroundTime=%d", desc->bmMinTurnaroundTime);
161 dbg("wBaudRate=%x", desc->wBaudRate);
162 dbg("bmAdditionalBOFs=%x", desc->bmAdditionalBOFs);
163 dbg("bIrdaRateSniff=%x", desc->bIrdaRateSniff);
164 dbg("bMaxUnicastList=%x", desc->bMaxUnicastList);
165}
166
167/*------------------------------------------------------------------*/
168/*
169 * Function irda_usb_find_class_desc(dev, ifnum)
170 *
171 * Returns instance of IrDA class descriptor, or NULL if not found
172 *
173 * The class descriptor is some extra info that IrDA USB devices will
174 * offer to us, describing their IrDA characteristics. We will use that in
175 * irda_usb_init_qos()
176 *
177 * Based on the same function in drivers/net/irda/irda-usb.c
178 */
179static struct irda_class_desc *irda_usb_find_class_desc(struct usb_device *dev, unsigned int ifnum)
180{
181 struct irda_class_desc *desc;
182 int ret;
183
184 desc = kmalloc(sizeof (struct irda_class_desc), GFP_KERNEL);
185 if (desc == NULL)
186 return NULL;
187 memset(desc, 0, sizeof(struct irda_class_desc));
188
189 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev,0),
190 IU_REQ_GET_CLASS_DESC,
191 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
192 0, ifnum, desc, sizeof(*desc), 1000);
193
194 dbg("%s - ret=%d", __FUNCTION__, ret);
195 if (ret < sizeof(*desc)) {
196 dbg("%s - class descriptor read %s (%d)",
197 __FUNCTION__,
198 (ret<0) ? "failed" : "too short",
199 ret);
200 goto error;
201 }
202 if (desc->bDescriptorType != USB_DT_IRDA) {
203 dbg("%s - bad class descriptor type", __FUNCTION__);
204 goto error;
205 }
206
207 irda_usb_dump_class_desc(desc);
208 return desc;
209error:
210 kfree(desc);
211 return NULL;
212}
213
214
215static u8 ir_xbof_change(u8 xbof)
216{
217 u8 result;
218 /* reference irda-usb.c */
219 switch(xbof) {
220 case 48: result = 0x10; break;
221 case 28:
222 case 24: result = 0x20; break;
223 default:
224 case 12: result = 0x30; break;
225 case 5:
226 case 6: result = 0x40; break;
227 case 3: result = 0x50; break;
228 case 2: result = 0x60; break;
229 case 1: result = 0x70; break;
230 case 0: result = 0x80; break;
231 }
232 return(result);
233}
234
235
236static int ir_startup (struct usb_serial *serial)
237{
238 struct irda_class_desc *irda_desc;
239
240 irda_desc = irda_usb_find_class_desc (serial->dev, 0);
241 if (irda_desc == NULL) {
242 dev_err (&serial->dev->dev, "IRDA class descriptor not found, device not bound\n");
243 return -ENODEV;
244 }
245
246 dbg ("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s",
247 __FUNCTION__,
248 (irda_desc->wBaudRate & 0x0001) ? " 2400" : "",
249 (irda_desc->wBaudRate & 0x0002) ? " 9600" : "",
250 (irda_desc->wBaudRate & 0x0004) ? " 19200" : "",
251 (irda_desc->wBaudRate & 0x0008) ? " 38400" : "",
252 (irda_desc->wBaudRate & 0x0010) ? " 57600" : "",
253 (irda_desc->wBaudRate & 0x0020) ? " 115200" : "",
254 (irda_desc->wBaudRate & 0x0040) ? " 576000" : "",
255 (irda_desc->wBaudRate & 0x0080) ? " 1152000" : "",
256 (irda_desc->wBaudRate & 0x0100) ? " 4000000" : "");
257
258 switch( irda_desc->bmAdditionalBOFs ) {
259 case 0x01: ir_add_bof = 48; break;
260 case 0x02: ir_add_bof = 24; break;
261 case 0x04: ir_add_bof = 12; break;
262 case 0x08: ir_add_bof = 6; break;
263 case 0x10: ir_add_bof = 3; break;
264 case 0x20: ir_add_bof = 2; break;
265 case 0x40: ir_add_bof = 1; break;
266 case 0x80: ir_add_bof = 0; break;
267 default:;
268 }
269
270 kfree (irda_desc);
271
272 return 0;
273}
274
275static int ir_open (struct usb_serial_port *port, struct file *filp)
276{
277 char *buffer;
278 int result = 0;
279
280 dbg("%s - port %d", __FUNCTION__, port->number);
281
282 if (buffer_size) {
283 /* override the default buffer sizes */
284 buffer = kmalloc (buffer_size, GFP_KERNEL);
285 if (!buffer) {
286 dev_err (&port->dev, "%s - out of memory.\n", __FUNCTION__);
287 return -ENOMEM;
288 }
289 kfree (port->read_urb->transfer_buffer);
290 port->read_urb->transfer_buffer = buffer;
291 port->read_urb->transfer_buffer_length = buffer_size;
292
293 buffer = kmalloc (buffer_size, GFP_KERNEL);
294 if (!buffer) {
295 dev_err (&port->dev, "%s - out of memory.\n", __FUNCTION__);
296 return -ENOMEM;
297 }
298 kfree (port->write_urb->transfer_buffer);
299 port->write_urb->transfer_buffer = buffer;
300 port->write_urb->transfer_buffer_length = buffer_size;
301 port->bulk_out_size = buffer_size;
302 }
303
304 /* Start reading from the device */
305 usb_fill_bulk_urb (
306 port->read_urb,
307 port->serial->dev,
308 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
309 port->read_urb->transfer_buffer,
310 port->read_urb->transfer_buffer_length,
311 ir_read_bulk_callback,
312 port);
313 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
314 if (result)
315 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
316
317 return result;
318}
319
320static void ir_close (struct usb_serial_port *port, struct file * filp)
321{
322 dbg("%s - port %d", __FUNCTION__, port->number);
323
324 /* shutdown our bulk read */
325 usb_kill_urb(port->read_urb);
326}
327
328static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count)
329{
330 unsigned char *transfer_buffer;
331 int result;
332 int transfer_size;
333
334 dbg("%s - port = %d, count = %d", __FUNCTION__, port->number, count);
335
336 if (!port->tty) {
337 dev_err (&port->dev, "%s - no tty???\n", __FUNCTION__);
338 return 0;
339 }
340
341 if (count == 0)
342 return 0;
343
344 if (port->write_urb->status == -EINPROGRESS) {
345 dbg ("%s - already writing", __FUNCTION__);
346 return 0;
347 }
348
349 transfer_buffer = port->write_urb->transfer_buffer;
350 transfer_size = min(count, port->bulk_out_size - 1);
351
352 /*
353 * The first byte of the packet we send to the device contains an
354 * inband header which indicates an additional number of BOFs and
355 * a baud rate change.
356 *
357 * See section 5.4.2.2 of the USB IrDA spec.
358 */
359 *transfer_buffer = ir_xbof | ir_baud;
360 ++transfer_buffer;
361
362 memcpy (transfer_buffer, buf, transfer_size);
363
364 usb_fill_bulk_urb (
365 port->write_urb,
366 port->serial->dev,
367 usb_sndbulkpipe(port->serial->dev,
368 port->bulk_out_endpointAddress),
369 port->write_urb->transfer_buffer,
370 transfer_size + 1,
371 ir_write_bulk_callback,
372 port);
373
374 port->write_urb->transfer_flags = URB_ZERO_PACKET;
375
376 result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
377 if (result)
378 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
379 else
380 result = transfer_size;
381
382 return result;
383}
384
385static void ir_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
386{
387 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
388
389 dbg("%s - port %d", __FUNCTION__, port->number);
390
391 if (urb->status) {
392 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
393 return;
394 }
395
396 usb_serial_debug_data (
397 debug,
398 &port->dev,
399 __FUNCTION__,
400 urb->actual_length,
401 urb->transfer_buffer);
402
403 schedule_work(&port->work);
404}
405
406static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
407{
408 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
409 struct tty_struct *tty;
410 unsigned char *data = urb->transfer_buffer;
411 int result;
412
413 dbg("%s - port %d", __FUNCTION__, port->number);
414
415 if (!port->open_count) {
416 dbg("%s - port closed.", __FUNCTION__);
417 return;
418 }
419
420 switch (urb->status) {
421
422 case 0: /* Successful */
423
424 /*
425 * The first byte of the packet we get from the device
426 * contains a busy indicator and baud rate change.
427 * See section 5.4.1.2 of the USB IrDA spec.
428 */
429 if ((*data & 0x0f) > 0)
430 ir_baud = *data & 0x0f;
431
432 usb_serial_debug_data (
433 debug,
434 &port->dev,
435 __FUNCTION__,
436 urb->actual_length,
437 data);
438
439 /*
440 * Bypass flip-buffers, and feed the ldisc directly
441 * due to our potentially large buffer size. Since we
442 * used to set low_latency, this is exactly what the
443 * tty layer did anyway :)
444 */
445 tty = port->tty;
446
447 /*
448 * FIXME: must not do this in IRQ context,
449 * must honour TTY_DONT_FLIP
450 */
451 tty->ldisc.receive_buf(
452 tty,
453 data+1,
454 NULL,
455 urb->actual_length-1);
456
457 /*
458 * No break here.
459 * We want to resubmit the urb so we can read
460 * again.
461 */
462
463 case -EPROTO: /* taking inspiration from pl2303.c */
464
465 /* Continue trying to always read */
466 usb_fill_bulk_urb (
467 port->read_urb,
468 port->serial->dev,
469 usb_rcvbulkpipe(port->serial->dev,
470 port->bulk_in_endpointAddress),
471 port->read_urb->transfer_buffer,
472 port->read_urb->transfer_buffer_length,
473 ir_read_bulk_callback,
474 port);
475
476 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
477 if (result)
478 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n",
479 __FUNCTION__, result);
480
481 break ;
482
483 default:
484 dbg("%s - nonzero read bulk status received: %d",
485 __FUNCTION__,
486 urb->status);
487 break ;
488
489 }
490
491 return;
492}
493
494static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios)
495{
496 unsigned char *transfer_buffer;
497 unsigned int cflag;
498 int result;
499
500 dbg("%s - port %d", __FUNCTION__, port->number);
501
502 if ((!port->tty) || (!port->tty->termios)) {
503 dbg("%s - no tty structures", __FUNCTION__);
504 return;
505 }
506
507 cflag = port->tty->termios->c_cflag;
508 /* check that they really want us to change something */
509 if (old_termios) {
510 if ((cflag == old_termios->c_cflag) &&
511 (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
512 dbg("%s - nothing to change...", __FUNCTION__);
513 return;
514 }
515 }
516
517 /* All we can change is the baud rate */
518 if (cflag & CBAUD) {
519
520 dbg ("%s - asking for baud %d",
521 __FUNCTION__,
522 tty_get_baud_rate(port->tty));
523
524 /*
525 * FIXME, we should compare the baud request against the
526 * capability stated in the IR header that we got in the
527 * startup function.
528 */
529 switch (cflag & CBAUD) {
530 case B2400: ir_baud = SPEED_2400; break;
531 default:
532 case B9600: ir_baud = SPEED_9600; break;
533 case B19200: ir_baud = SPEED_19200; break;
534 case B38400: ir_baud = SPEED_38400; break;
535 case B57600: ir_baud = SPEED_57600; break;
536 case B115200: ir_baud = SPEED_115200; break;
537 case B576000: ir_baud = SPEED_576000; break;
538 case B1152000: ir_baud = SPEED_1152000; break;
539#ifdef B4000000
540 case B4000000: ir_baud = SPEED_4000000; break;
541#endif
542 }
543
544 if (xbof == -1) {
545 ir_xbof = ir_xbof_change(ir_add_bof);
546 } else {
547 ir_xbof = ir_xbof_change(xbof) ;
548 }
549
550 /* Notify the tty driver that the termios have changed. */
551 port->tty->ldisc.set_termios(port->tty, NULL);
552
553 /* FIXME need to check to see if our write urb is busy right
554 * now, or use a urb pool.
555 *
556 * send the baud change out on an "empty" data packet
557 */
558 transfer_buffer = port->write_urb->transfer_buffer;
559 *transfer_buffer = ir_xbof | ir_baud;
560
561 usb_fill_bulk_urb (
562 port->write_urb,
563 port->serial->dev,
564 usb_sndbulkpipe(port->serial->dev,
565 port->bulk_out_endpointAddress),
566 port->write_urb->transfer_buffer,
567 1,
568 ir_write_bulk_callback,
569 port);
570
571 port->write_urb->transfer_flags = URB_ZERO_PACKET;
572
573 result = usb_submit_urb (port->write_urb, GFP_KERNEL);
574 if (result)
575 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
576 }
577 return;
578}
579
580
581static int __init ir_init (void)
582{
583 int retval;
584 retval = usb_serial_register(&ir_device);
585 if (retval)
586 goto failed_usb_serial_register;
587 retval = usb_register(&ir_driver);
588 if (retval)
589 goto failed_usb_register;
590 info(DRIVER_DESC " " DRIVER_VERSION);
591 return 0;
592failed_usb_register:
593 usb_serial_deregister(&ir_device);
594failed_usb_serial_register:
595 return retval;
596}
597
598
599static void __exit ir_exit (void)
600{
601 usb_deregister (&ir_driver);
602 usb_serial_deregister (&ir_device);
603}
604
605
606module_init(ir_init);
607module_exit(ir_exit);
608
609MODULE_AUTHOR(DRIVER_AUTHOR);
610MODULE_DESCRIPTION(DRIVER_DESC);
611MODULE_LICENSE("GPL");
612
613module_param(debug, bool, S_IRUGO | S_IWUSR);
614MODULE_PARM_DESC(debug, "Debug enabled or not");
615module_param(xbof, int, 0);
616MODULE_PARM_DESC(xbof, "Force specific number of XBOFs");
617module_param(buffer_size, int, 0);
618MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
619
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
new file mode 100644
index 000000000000..fb0926292228
--- /dev/null
+++ b/drivers/usb/serial/keyspan.c
@@ -0,0 +1,2354 @@
1/*
2 Keyspan USB to Serial Converter driver
3
4 (C) Copyright (C) 2000-2001 Hugh Blemings <hugh@blemings.org>
5 (C) Copyright (C) 2002 Greg Kroah-Hartman <greg@kroah.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 See http://misc.nu/hugh/keyspan.html for more information.
13
14 Code in this driver inspired by and in a number of places taken
15 from Brian Warner's original Keyspan-PDA driver.
16
17 This driver has been put together with the support of Innosys, Inc.
18 and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
19 Thanks Guys :)
20
21 Thanks to Paulus for miscellaneous tidy ups, some largish chunks
22 of much nicer and/or completely new code and (perhaps most uniquely)
23 having the patience to sit down and explain why and where he'd changed
24 stuff.
25
26 Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
27 staff in their work on open source projects.
28
29 Change History
30
31 2003sep04 LPM (Keyspan) add support for new single port product USA19HS.
32 Improve setup message handling for all devices.
33
34 Wed Feb 19 22:00:00 PST 2003 (Jeffrey S. Laing <keyspan@jsl.com>)
35 Merged the current (1/31/03) Keyspan code with the current (2.4.21-pre4)
36 Linux source tree. The Linux tree lacked support for the 49WLC and
37 others. The Keyspan patches didn't work with the current kernel.
38
39 2003jan30 LPM add support for the 49WLC and MPR
40
41 Wed Apr 25 12:00:00 PST 2002 (Keyspan)
42 Started with Hugh Blemings' code dated Jan 17, 2002. All adapters
43 now supported (including QI and QW). Modified port open, port
44 close, and send setup() logic to fix various data and endpoint
45 synchronization bugs and device LED status bugs. Changed keyspan_
46 write_room() to accurately return transmit buffer availability.
47 Changed forwardingLength from 1 to 16 for all adapters.
48
49 Fri Oct 12 16:45:00 EST 2001
50 Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
51
52 Wed Apr 25 12:00:00 PST 2002 (Keyspan)
53 Started with Hugh Blemings' code dated Jan 17, 2002. All adapters
54 now supported (including QI and QW). Modified port open, port
55 close, and send setup() logic to fix various data and endpoint
56 synchronization bugs and device LED status bugs. Changed keyspan_
57 write_room() to accurately return transmit buffer availability.
58 Changed forwardingLength from 1 to 16 for all adapters.
59
60 Fri Oct 12 16:45:00 EST 2001
61 Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
62
63 Mon Oct 8 14:29:00 EST 2001 hugh
64 Fixed bug that prevented mulitport devices operating correctly
65 if they weren't the first unit attached.
66
67 Sat Oct 6 12:31:21 EST 2001 hugh
68 Added support for USA-28XA and -28XB, misc cleanups, break support
69 for usa26 based models thanks to David Gibson.
70
71 Thu May 31 11:56:42 PDT 2001 gkh
72 switched from using spinlock to a semaphore
73
74 (04/08/2001) gb
75 Identify version on module load.
76
77 (11/01/2000) Adam J. Richter
78 usb_device_id table support.
79
80 Tue Oct 10 23:15:33 EST 2000 Hugh
81 Merged Paul's changes with my USA-49W mods. Work in progress
82 still...
83
84 Wed Jul 19 14:00:42 EST 2000 gkh
85 Added module_init and module_exit functions to handle the fact that
86 this driver is a loadable module now.
87
88 Tue Jul 18 16:14:52 EST 2000 Hugh
89 Basic character input/output for USA-19 now mostly works,
90 fixed at 9600 baud for the moment.
91
92 Sat Jul 8 11:11:48 EST 2000 Hugh
93 First public release - nothing works except the firmware upload.
94 Tested on PPC and x86 architectures, seems to behave...
95*/
96
97
98#include <linux/config.h>
99#include <linux/kernel.h>
100#include <linux/jiffies.h>
101#include <linux/errno.h>
102#include <linux/init.h>
103#include <linux/slab.h>
104#include <linux/tty.h>
105#include <linux/tty_driver.h>
106#include <linux/tty_flip.h>
107#include <linux/module.h>
108#include <linux/spinlock.h>
109#include <asm/uaccess.h>
110#include <linux/usb.h>
111#include "usb-serial.h"
112#include "keyspan.h"
113
114static int debug;
115
116/*
117 * Version Information
118 */
119#define DRIVER_VERSION "v1.1.4"
120#define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
121#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
122
123#define INSTAT_BUFLEN 32
124#define GLOCONT_BUFLEN 64
125
126 /* Per device and per port private data */
127struct keyspan_serial_private {
128 const struct keyspan_device_details *device_details;
129
130 struct urb *instat_urb;
131 char instat_buf[INSTAT_BUFLEN];
132
133 /* XXX this one probably will need a lock */
134 struct urb *glocont_urb;
135 char glocont_buf[GLOCONT_BUFLEN];
136};
137
138struct keyspan_port_private {
139 /* Keep track of which input & output endpoints to use */
140 int in_flip;
141 int out_flip;
142
143 /* Keep duplicate of device details in each port
144 structure as well - simplifies some of the
145 callback functions etc. */
146 const struct keyspan_device_details *device_details;
147
148 /* Input endpoints and buffer for this port */
149 struct urb *in_urbs[2];
150 char in_buffer[2][64];
151 /* Output endpoints and buffer for this port */
152 struct urb *out_urbs[2];
153 char out_buffer[2][64];
154
155 /* Input ack endpoint */
156 struct urb *inack_urb;
157 char inack_buffer[1];
158
159 /* Output control endpoint */
160 struct urb *outcont_urb;
161 char outcont_buffer[64];
162
163 /* Settings for the port */
164 int baud;
165 int old_baud;
166 unsigned int cflag;
167 unsigned int old_cflag;
168 enum {flow_none, flow_cts, flow_xon} flow_control;
169 int rts_state; /* Handshaking pins (outputs) */
170 int dtr_state;
171 int cts_state; /* Handshaking pins (inputs) */
172 int dsr_state;
173 int dcd_state;
174 int ri_state;
175 int break_on;
176
177 unsigned long tx_start_time[2];
178 int resend_cont; /* need to resend control packet */
179};
180
181
182/* Include Keyspan message headers. All current Keyspan Adapters
183 make use of one of four message formats which are referred
184 to as USA-26, USA-28 and USA-49, USA-90 by Keyspan and within this driver. */
185#include "keyspan_usa26msg.h"
186#include "keyspan_usa28msg.h"
187#include "keyspan_usa49msg.h"
188#include "keyspan_usa90msg.h"
189
190
191/* Functions used by new usb-serial code. */
192static int __init keyspan_init (void)
193{
194 int retval;
195 retval = usb_serial_register(&keyspan_pre_device);
196 if (retval)
197 goto failed_pre_device_register;
198 retval = usb_serial_register(&keyspan_1port_device);
199 if (retval)
200 goto failed_1port_device_register;
201 retval = usb_serial_register(&keyspan_2port_device);
202 if (retval)
203 goto failed_2port_device_register;
204 retval = usb_serial_register(&keyspan_4port_device);
205 if (retval)
206 goto failed_4port_device_register;
207 retval = usb_register(&keyspan_driver);
208 if (retval)
209 goto failed_usb_register;
210
211 info(DRIVER_VERSION ":" DRIVER_DESC);
212
213 return 0;
214failed_usb_register:
215 usb_serial_deregister(&keyspan_4port_device);
216failed_4port_device_register:
217 usb_serial_deregister(&keyspan_2port_device);
218failed_2port_device_register:
219 usb_serial_deregister(&keyspan_1port_device);
220failed_1port_device_register:
221 usb_serial_deregister(&keyspan_pre_device);
222failed_pre_device_register:
223 return retval;
224}
225
226static void __exit keyspan_exit (void)
227{
228 usb_deregister (&keyspan_driver);
229 usb_serial_deregister (&keyspan_pre_device);
230 usb_serial_deregister (&keyspan_1port_device);
231 usb_serial_deregister (&keyspan_2port_device);
232 usb_serial_deregister (&keyspan_4port_device);
233}
234
235module_init(keyspan_init);
236module_exit(keyspan_exit);
237
238static void keyspan_rx_throttle (struct usb_serial_port *port)
239{
240 dbg("%s - port %d", __FUNCTION__, port->number);
241}
242
243
244static void keyspan_rx_unthrottle (struct usb_serial_port *port)
245{
246 dbg("%s - port %d", __FUNCTION__, port->number);
247}
248
249
250static void keyspan_break_ctl (struct usb_serial_port *port, int break_state)
251{
252 struct keyspan_port_private *p_priv;
253
254 dbg("%s", __FUNCTION__);
255
256 p_priv = usb_get_serial_port_data(port);
257
258 if (break_state == -1)
259 p_priv->break_on = 1;
260 else
261 p_priv->break_on = 0;
262
263 keyspan_send_setup(port, 0);
264}
265
266
267static void keyspan_set_termios (struct usb_serial_port *port,
268 struct termios *old_termios)
269{
270 int baud_rate, device_port;
271 struct keyspan_port_private *p_priv;
272 const struct keyspan_device_details *d_details;
273 unsigned int cflag;
274
275 dbg("%s", __FUNCTION__);
276
277 p_priv = usb_get_serial_port_data(port);
278 d_details = p_priv->device_details;
279 cflag = port->tty->termios->c_cflag;
280 device_port = port->number - port->serial->minor;
281
282 /* Baud rate calculation takes baud rate as an integer
283 so other rates can be generated if desired. */
284 baud_rate = tty_get_baud_rate(port->tty);
285 /* If no match or invalid, don't change */
286 if (baud_rate >= 0
287 && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
288 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
289 /* FIXME - more to do here to ensure rate changes cleanly */
290 p_priv->baud = baud_rate;
291 }
292
293 /* set CTS/RTS handshake etc. */
294 p_priv->cflag = cflag;
295 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
296
297 keyspan_send_setup(port, 0);
298}
299
300static int keyspan_tiocmget(struct usb_serial_port *port, struct file *file)
301{
302 unsigned int value;
303 struct keyspan_port_private *p_priv;
304
305 p_priv = usb_get_serial_port_data(port);
306
307 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
308 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
309 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
310 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
311 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
312 ((p_priv->ri_state) ? TIOCM_RNG : 0);
313
314 return value;
315}
316
317static int keyspan_tiocmset(struct usb_serial_port *port, struct file *file,
318 unsigned int set, unsigned int clear)
319{
320 struct keyspan_port_private *p_priv;
321
322 p_priv = usb_get_serial_port_data(port);
323
324 if (set & TIOCM_RTS)
325 p_priv->rts_state = 1;
326 if (set & TIOCM_DTR)
327 p_priv->dtr_state = 1;
328
329 if (clear & TIOCM_RTS)
330 p_priv->rts_state = 0;
331 if (clear & TIOCM_DTR)
332 p_priv->dtr_state = 0;
333 keyspan_send_setup(port, 0);
334 return 0;
335}
336
337static int keyspan_ioctl(struct usb_serial_port *port, struct file *file,
338 unsigned int cmd, unsigned long arg)
339{
340 return -ENOIOCTLCMD;
341}
342
343 /* Write function is similar for the four protocols used
344 with only a minor change for usa90 (usa19hs) required */
345static int keyspan_write(struct usb_serial_port *port,
346 const unsigned char *buf, int count)
347{
348 struct keyspan_port_private *p_priv;
349 const struct keyspan_device_details *d_details;
350 int flip;
351 int left, todo;
352 struct urb *this_urb;
353 int err, maxDataLen, dataOffset;
354
355 p_priv = usb_get_serial_port_data(port);
356 d_details = p_priv->device_details;
357
358 if (d_details->msg_format == msg_usa90) {
359 maxDataLen = 64;
360 dataOffset = 0;
361 } else {
362 maxDataLen = 63;
363 dataOffset = 1;
364 }
365
366 dbg("%s - for port %d (%d chars), flip=%d",
367 __FUNCTION__, port->number, count, p_priv->out_flip);
368
369 for (left = count; left > 0; left -= todo) {
370 todo = left;
371 if (todo > maxDataLen)
372 todo = maxDataLen;
373
374 flip = p_priv->out_flip;
375
376 /* Check we have a valid urb/endpoint before we use it... */
377 if ((this_urb = p_priv->out_urbs[flip]) == NULL) {
378 /* no bulk out, so return 0 bytes written */
379 dbg("%s - no output urb :(", __FUNCTION__);
380 return count;
381 }
382
383 dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip);
384
385 if (this_urb->status == -EINPROGRESS) {
386 if (this_urb->transfer_flags & URB_ASYNC_UNLINK)
387 break;
388 if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ))
389 break;
390 this_urb->transfer_flags |= URB_ASYNC_UNLINK;
391 usb_unlink_urb(this_urb);
392 break;
393 }
394
395 /* First byte in buffer is "last flag" (except for usa19hx) - unused so
396 for now so set to zero */
397 ((char *)this_urb->transfer_buffer)[0] = 0;
398
399 memcpy (this_urb->transfer_buffer + dataOffset, buf, todo);
400 buf += todo;
401
402 /* send the data out the bulk port */
403 this_urb->transfer_buffer_length = todo + dataOffset;
404
405 this_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
406 this_urb->dev = port->serial->dev;
407 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
408 dbg("usb_submit_urb(write bulk) failed (%d)", err);
409 }
410 p_priv->tx_start_time[flip] = jiffies;
411
412 /* Flip for next time if usa26 or usa28 interface
413 (not used on usa49) */
414 p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
415 }
416
417 return count - left;
418}
419
420static void usa26_indat_callback(struct urb *urb, struct pt_regs *regs)
421{
422 int i, err;
423 int endpoint;
424 struct usb_serial_port *port;
425 struct tty_struct *tty;
426 unsigned char *data = urb->transfer_buffer;
427
428 dbg ("%s", __FUNCTION__);
429
430 endpoint = usb_pipeendpoint(urb->pipe);
431
432 if (urb->status) {
433 dbg("%s - nonzero status: %x on endpoint %d.",
434 __FUNCTION__, urb->status, endpoint);
435 return;
436 }
437
438 port = (struct usb_serial_port *) urb->context;
439 tty = port->tty;
440 if (urb->actual_length) {
441 /* 0x80 bit is error flag */
442 if ((data[0] & 0x80) == 0) {
443 /* no errors on individual bytes, only possible overrun err*/
444 if (data[0] & RXERROR_OVERRUN)
445 err = TTY_OVERRUN;
446 else err = 0;
447 for (i = 1; i < urb->actual_length ; ++i) {
448 tty_insert_flip_char(tty, data[i], err);
449 }
450 } else {
451 /* some bytes had errors, every byte has status */
452 dbg("%s - RX error!!!!", __FUNCTION__);
453 for (i = 0; i + 1 < urb->actual_length; i += 2) {
454 int stat = data[i], flag = 0;
455 if (stat & RXERROR_OVERRUN)
456 flag |= TTY_OVERRUN;
457 if (stat & RXERROR_FRAMING)
458 flag |= TTY_FRAME;
459 if (stat & RXERROR_PARITY)
460 flag |= TTY_PARITY;
461 /* XXX should handle break (0x10) */
462 tty_insert_flip_char(tty, data[i+1], flag);
463 }
464 }
465 tty_flip_buffer_push(tty);
466 }
467
468 /* Resubmit urb so we continue receiving */
469 urb->dev = port->serial->dev;
470 if (port->open_count)
471 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
472 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
473 }
474 return;
475}
476
477 /* Outdat handling is common for all devices */
478static void usa2x_outdat_callback(struct urb *urb, struct pt_regs *regs)
479{
480 struct usb_serial_port *port;
481 struct keyspan_port_private *p_priv;
482
483 port = (struct usb_serial_port *) urb->context;
484 p_priv = usb_get_serial_port_data(port);
485 dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]);
486
487 if (port->open_count)
488 schedule_work(&port->work);
489}
490
491static void usa26_inack_callback(struct urb *urb, struct pt_regs *regs)
492{
493 dbg ("%s", __FUNCTION__);
494
495}
496
497static void usa26_outcont_callback(struct urb *urb, struct pt_regs *regs)
498{
499 struct usb_serial_port *port;
500 struct keyspan_port_private *p_priv;
501
502 port = (struct usb_serial_port *) urb->context;
503 p_priv = usb_get_serial_port_data(port);
504
505 if (p_priv->resend_cont) {
506 dbg ("%s - sending setup", __FUNCTION__);
507 keyspan_usa26_send_setup(port->serial, port, p_priv->resend_cont - 1);
508 }
509}
510
511static void usa26_instat_callback(struct urb *urb, struct pt_regs *regs)
512{
513 unsigned char *data = urb->transfer_buffer;
514 struct keyspan_usa26_portStatusMessage *msg;
515 struct usb_serial *serial;
516 struct usb_serial_port *port;
517 struct keyspan_port_private *p_priv;
518 int old_dcd_state, err;
519
520 serial = (struct usb_serial *) urb->context;
521
522 if (urb->status) {
523 dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
524 return;
525 }
526 if (urb->actual_length != 9) {
527 dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length);
528 goto exit;
529 }
530
531 msg = (struct keyspan_usa26_portStatusMessage *)data;
532
533#if 0
534 dbg("%s - port status: port %d cts %d dcd %d dsr %d ri %d toff %d txoff %d rxen %d cr %d",
535 __FUNCTION__, msg->port, msg->hskia_cts, msg->gpia_dcd, msg->dsr, msg->ri, msg->_txOff,
536 msg->_txXoff, msg->rxEnabled, msg->controlResponse);
537#endif
538
539 /* Now do something useful with the data */
540
541
542 /* Check port number from message and retrieve private data */
543 if (msg->port >= serial->num_ports) {
544 dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->port);
545 goto exit;
546 }
547 port = serial->port[msg->port];
548 p_priv = usb_get_serial_port_data(port);
549
550 /* Update handshaking pin state information */
551 old_dcd_state = p_priv->dcd_state;
552 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
553 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
554 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
555 p_priv->ri_state = ((msg->ri) ? 1 : 0);
556
557 if (port->tty && !C_CLOCAL(port->tty)
558 && old_dcd_state != p_priv->dcd_state) {
559 if (old_dcd_state)
560 tty_hangup(port->tty);
561 /* else */
562 /* wake_up_interruptible(&p_priv->open_wait); */
563 }
564
565 /* Resubmit urb so we continue receiving */
566 urb->dev = serial->dev;
567 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
568 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
569 }
570exit: ;
571}
572
573static void usa26_glocont_callback(struct urb *urb, struct pt_regs *regs)
574{
575 dbg ("%s", __FUNCTION__);
576
577}
578
579
580static void usa28_indat_callback(struct urb *urb, struct pt_regs *regs)
581{
582 int i, err;
583 struct usb_serial_port *port;
584 struct tty_struct *tty;
585 unsigned char *data;
586 struct keyspan_port_private *p_priv;
587
588 dbg ("%s", __FUNCTION__);
589
590 port = (struct usb_serial_port *) urb->context;
591 p_priv = usb_get_serial_port_data(port);
592 data = urb->transfer_buffer;
593
594 if (urb != p_priv->in_urbs[p_priv->in_flip])
595 return;
596
597 do {
598 if (urb->status) {
599 dbg("%s - nonzero status: %x on endpoint %d.",
600 __FUNCTION__, urb->status, usb_pipeendpoint(urb->pipe));
601 return;
602 }
603
604 port = (struct usb_serial_port *) urb->context;
605 p_priv = usb_get_serial_port_data(port);
606 data = urb->transfer_buffer;
607
608 tty = port->tty;
609 if (urb->actual_length) {
610 for (i = 0; i < urb->actual_length ; ++i) {
611 tty_insert_flip_char(tty, data[i], 0);
612 }
613 tty_flip_buffer_push(tty);
614 }
615
616 /* Resubmit urb so we continue receiving */
617 urb->dev = port->serial->dev;
618 if (port->open_count)
619 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
620 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
621 }
622 p_priv->in_flip ^= 1;
623
624 urb = p_priv->in_urbs[p_priv->in_flip];
625 } while (urb->status != -EINPROGRESS);
626}
627
628static void usa28_inack_callback(struct urb *urb, struct pt_regs *regs)
629{
630 dbg ("%s", __FUNCTION__);
631}
632
633static void usa28_outcont_callback(struct urb *urb, struct pt_regs *regs)
634{
635 struct usb_serial_port *port;
636 struct keyspan_port_private *p_priv;
637
638 port = (struct usb_serial_port *) urb->context;
639 p_priv = usb_get_serial_port_data(port);
640
641 if (p_priv->resend_cont) {
642 dbg ("%s - sending setup", __FUNCTION__);
643 keyspan_usa28_send_setup(port->serial, port, p_priv->resend_cont - 1);
644 }
645}
646
647static void usa28_instat_callback(struct urb *urb, struct pt_regs *regs)
648{
649 int err;
650 unsigned char *data = urb->transfer_buffer;
651 struct keyspan_usa28_portStatusMessage *msg;
652 struct usb_serial *serial;
653 struct usb_serial_port *port;
654 struct keyspan_port_private *p_priv;
655 int old_dcd_state;
656
657 serial = (struct usb_serial *) urb->context;
658
659 if (urb->status) {
660 dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
661 return;
662 }
663
664 if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
665 dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);
666 goto exit;
667 }
668
669 /*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__
670 data[0], data[1], data[2], data[3], data[4], data[5],
671 data[6], data[7], data[8], data[9], data[10], data[11]);*/
672
673 /* Now do something useful with the data */
674 msg = (struct keyspan_usa28_portStatusMessage *)data;
675
676
677 /* Check port number from message and retrieve private data */
678 if (msg->port >= serial->num_ports) {
679 dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->port);
680 goto exit;
681 }
682 port = serial->port[msg->port];
683 p_priv = usb_get_serial_port_data(port);
684
685 /* Update handshaking pin state information */
686 old_dcd_state = p_priv->dcd_state;
687 p_priv->cts_state = ((msg->cts) ? 1 : 0);
688 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
689 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
690 p_priv->ri_state = ((msg->ri) ? 1 : 0);
691
692 if (port->tty && !C_CLOCAL(port->tty)
693 && old_dcd_state != p_priv->dcd_state) {
694 if (old_dcd_state)
695 tty_hangup(port->tty);
696 /* else */
697 /* wake_up_interruptible(&p_priv->open_wait); */
698 }
699
700 /* Resubmit urb so we continue receiving */
701 urb->dev = serial->dev;
702 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
703 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
704 }
705exit: ;
706}
707
708static void usa28_glocont_callback(struct urb *urb, struct pt_regs *regs)
709{
710 dbg ("%s", __FUNCTION__);
711}
712
713
714static void usa49_glocont_callback(struct urb *urb, struct pt_regs *regs)
715{
716 struct usb_serial *serial;
717 struct usb_serial_port *port;
718 struct keyspan_port_private *p_priv;
719 int i;
720
721 dbg ("%s", __FUNCTION__);
722
723 serial = (struct usb_serial *) urb->context;
724 for (i = 0; i < serial->num_ports; ++i) {
725 port = serial->port[i];
726 p_priv = usb_get_serial_port_data(port);
727
728 if (p_priv->resend_cont) {
729 dbg ("%s - sending setup", __FUNCTION__);
730 keyspan_usa49_send_setup(serial, port, p_priv->resend_cont - 1);
731 break;
732 }
733 }
734}
735
736 /* This is actually called glostat in the Keyspan
737 doco */
738static void usa49_instat_callback(struct urb *urb, struct pt_regs *regs)
739{
740 int err;
741 unsigned char *data = urb->transfer_buffer;
742 struct keyspan_usa49_portStatusMessage *msg;
743 struct usb_serial *serial;
744 struct usb_serial_port *port;
745 struct keyspan_port_private *p_priv;
746 int old_dcd_state;
747
748 dbg ("%s", __FUNCTION__);
749
750 serial = (struct usb_serial *) urb->context;
751
752 if (urb->status) {
753 dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
754 return;
755 }
756
757 if (urb->actual_length != sizeof(struct keyspan_usa49_portStatusMessage)) {
758 dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);
759 goto exit;
760 }
761
762 /*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__,
763 data[0], data[1], data[2], data[3], data[4], data[5],
764 data[6], data[7], data[8], data[9], data[10]);*/
765
766 /* Now do something useful with the data */
767 msg = (struct keyspan_usa49_portStatusMessage *)data;
768
769 /* Check port number from message and retrieve private data */
770 if (msg->portNumber >= serial->num_ports) {
771 dbg ("%s - Unexpected port number %d", __FUNCTION__, msg->portNumber);
772 goto exit;
773 }
774 port = serial->port[msg->portNumber];
775 p_priv = usb_get_serial_port_data(port);
776
777 /* Update handshaking pin state information */
778 old_dcd_state = p_priv->dcd_state;
779 p_priv->cts_state = ((msg->cts) ? 1 : 0);
780 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
781 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
782 p_priv->ri_state = ((msg->ri) ? 1 : 0);
783
784 if (port->tty && !C_CLOCAL(port->tty)
785 && old_dcd_state != p_priv->dcd_state) {
786 if (old_dcd_state)
787 tty_hangup(port->tty);
788 /* else */
789 /* wake_up_interruptible(&p_priv->open_wait); */
790 }
791
792 /* Resubmit urb so we continue receiving */
793 urb->dev = serial->dev;
794
795 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
796 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
797 }
798exit: ;
799}
800
801static void usa49_inack_callback(struct urb *urb, struct pt_regs *regs)
802{
803 dbg ("%s", __FUNCTION__);
804}
805
806static void usa49_indat_callback(struct urb *urb, struct pt_regs *regs)
807{
808 int i, err;
809 int endpoint;
810 struct usb_serial_port *port;
811 struct tty_struct *tty;
812 unsigned char *data = urb->transfer_buffer;
813
814 dbg ("%s", __FUNCTION__);
815
816 endpoint = usb_pipeendpoint(urb->pipe);
817
818 if (urb->status) {
819 dbg("%s - nonzero status: %x on endpoint %d.", __FUNCTION__,
820 urb->status, endpoint);
821 return;
822 }
823
824 port = (struct usb_serial_port *) urb->context;
825 tty = port->tty;
826 if (urb->actual_length) {
827 /* 0x80 bit is error flag */
828 if ((data[0] & 0x80) == 0) {
829 /* no error on any byte */
830 for (i = 1; i < urb->actual_length ; ++i) {
831 tty_insert_flip_char(tty, data[i], 0);
832 }
833 } else {
834 /* some bytes had errors, every byte has status */
835 for (i = 0; i + 1 < urb->actual_length; i += 2) {
836 int stat = data[i], flag = 0;
837 if (stat & RXERROR_OVERRUN)
838 flag |= TTY_OVERRUN;
839 if (stat & RXERROR_FRAMING)
840 flag |= TTY_FRAME;
841 if (stat & RXERROR_PARITY)
842 flag |= TTY_PARITY;
843 /* XXX should handle break (0x10) */
844 tty_insert_flip_char(tty, data[i+1], flag);
845 }
846 }
847 tty_flip_buffer_push(tty);
848 }
849
850 /* Resubmit urb so we continue receiving */
851 urb->dev = port->serial->dev;
852 if (port->open_count)
853 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
854 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
855 }
856}
857
858/* not used, usa-49 doesn't have per-port control endpoints */
859static void usa49_outcont_callback(struct urb *urb, struct pt_regs *regs)
860{
861 dbg ("%s", __FUNCTION__);
862}
863
864static void usa90_indat_callback(struct urb *urb, struct pt_regs *regs)
865{
866 int i, err;
867 int endpoint;
868 struct usb_serial_port *port;
869 struct keyspan_port_private *p_priv;
870 struct tty_struct *tty;
871 unsigned char *data = urb->transfer_buffer;
872
873 dbg ("%s", __FUNCTION__);
874
875 endpoint = usb_pipeendpoint(urb->pipe);
876
877
878 if (urb->status) {
879 dbg("%s - nonzero status: %x on endpoint %d.",
880 __FUNCTION__, urb->status, endpoint);
881 return;
882 }
883
884 port = (struct usb_serial_port *) urb->context;
885 p_priv = usb_get_serial_port_data(port);
886
887 tty = port->tty;
888 if (urb->actual_length) {
889
890 /* if current mode is DMA, looks like usa28 format
891 otherwise looks like usa26 data format */
892
893 if (p_priv->baud > 57600) {
894 for (i = 0; i < urb->actual_length ; ++i)
895 tty_insert_flip_char(tty, data[i], 0);
896 }
897 else {
898
899 /* 0x80 bit is error flag */
900 if ((data[0] & 0x80) == 0) {
901 /* no errors on individual bytes, only possible overrun err*/
902 if (data[0] & RXERROR_OVERRUN)
903 err = TTY_OVERRUN;
904 else err = 0;
905 for (i = 1; i < urb->actual_length ; ++i)
906 tty_insert_flip_char(tty, data[i], err);
907
908 }
909 else {
910 /* some bytes had errors, every byte has status */
911 dbg("%s - RX error!!!!", __FUNCTION__);
912 for (i = 0; i + 1 < urb->actual_length; i += 2) {
913 int stat = data[i], flag = 0;
914 if (stat & RXERROR_OVERRUN)
915 flag |= TTY_OVERRUN;
916 if (stat & RXERROR_FRAMING)
917 flag |= TTY_FRAME;
918 if (stat & RXERROR_PARITY)
919 flag |= TTY_PARITY;
920 /* XXX should handle break (0x10) */
921 tty_insert_flip_char(tty, data[i+1], flag);
922 }
923 }
924 }
925 tty_flip_buffer_push(tty);
926 }
927
928 /* Resubmit urb so we continue receiving */
929 urb->dev = port->serial->dev;
930 if (port->open_count)
931 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
932 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
933 }
934 return;
935}
936
937
938static void usa90_instat_callback(struct urb *urb, struct pt_regs *regs)
939{
940 unsigned char *data = urb->transfer_buffer;
941 struct keyspan_usa90_portStatusMessage *msg;
942 struct usb_serial *serial;
943 struct usb_serial_port *port;
944 struct keyspan_port_private *p_priv;
945 int old_dcd_state, err;
946
947 serial = (struct usb_serial *) urb->context;
948
949 if (urb->status) {
950 dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);
951 return;
952 }
953 if (urb->actual_length < 14) {
954 dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length);
955 goto exit;
956 }
957
958 msg = (struct keyspan_usa90_portStatusMessage *)data;
959
960 /* Now do something useful with the data */
961
962 port = serial->port[0];
963 p_priv = usb_get_serial_port_data(port);
964
965 /* Update handshaking pin state information */
966 old_dcd_state = p_priv->dcd_state;
967 p_priv->cts_state = ((msg->cts) ? 1 : 0);
968 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
969 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
970 p_priv->ri_state = ((msg->ri) ? 1 : 0);
971
972 if (port->tty && !C_CLOCAL(port->tty)
973 && old_dcd_state != p_priv->dcd_state) {
974 if (old_dcd_state)
975 tty_hangup(port->tty);
976 /* else */
977 /* wake_up_interruptible(&p_priv->open_wait); */
978 }
979
980 /* Resubmit urb so we continue receiving */
981 urb->dev = serial->dev;
982 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
983 dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
984 }
985exit:
986 ;
987}
988
989static void usa90_outcont_callback(struct urb *urb, struct pt_regs *regs)
990{
991 struct usb_serial_port *port;
992 struct keyspan_port_private *p_priv;
993
994 port = (struct usb_serial_port *) urb->context;
995 p_priv = usb_get_serial_port_data(port);
996
997 if (p_priv->resend_cont) {
998 dbg ("%s - sending setup", __FUNCTION__);
999 keyspan_usa90_send_setup(port->serial, port, p_priv->resend_cont - 1);
1000 }
1001}
1002
1003static int keyspan_write_room (struct usb_serial_port *port)
1004{
1005 struct keyspan_port_private *p_priv;
1006 const struct keyspan_device_details *d_details;
1007 int flip;
1008 int data_len;
1009 struct urb *this_urb;
1010
1011 dbg("%s", __FUNCTION__);
1012 p_priv = usb_get_serial_port_data(port);
1013 d_details = p_priv->device_details;
1014
1015 if (d_details->msg_format == msg_usa90)
1016 data_len = 64;
1017 else
1018 data_len = 63;
1019
1020 flip = p_priv->out_flip;
1021
1022 /* Check both endpoints to see if any are available. */
1023 if ((this_urb = p_priv->out_urbs[flip]) != NULL) {
1024 if (this_urb->status != -EINPROGRESS)
1025 return (data_len);
1026 flip = (flip + 1) & d_details->outdat_endp_flip;
1027 if ((this_urb = p_priv->out_urbs[flip]) != NULL)
1028 if (this_urb->status != -EINPROGRESS)
1029 return (data_len);
1030 }
1031 return (0);
1032}
1033
1034
1035static int keyspan_chars_in_buffer (struct usb_serial_port *port)
1036{
1037 return (0);
1038}
1039
1040
1041static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1042{
1043 struct keyspan_port_private *p_priv;
1044 struct keyspan_serial_private *s_priv;
1045 struct usb_serial *serial = port->serial;
1046 const struct keyspan_device_details *d_details;
1047 int i, err;
1048 int baud_rate, device_port;
1049 struct urb *urb;
1050 unsigned int cflag;
1051
1052 s_priv = usb_get_serial_data(serial);
1053 p_priv = usb_get_serial_port_data(port);
1054 d_details = p_priv->device_details;
1055
1056 dbg("%s - port%d.", __FUNCTION__, port->number);
1057
1058 /* Set some sane defaults */
1059 p_priv->rts_state = 1;
1060 p_priv->dtr_state = 1;
1061 p_priv->baud = 9600;
1062
1063 /* force baud and lcr to be set on open */
1064 p_priv->old_baud = 0;
1065 p_priv->old_cflag = 0;
1066
1067 p_priv->out_flip = 0;
1068 p_priv->in_flip = 0;
1069
1070 /* Reset low level data toggle and start reading from endpoints */
1071 for (i = 0; i < 2; i++) {
1072 if ((urb = p_priv->in_urbs[i]) == NULL)
1073 continue;
1074 urb->dev = serial->dev;
1075
1076 /* make sure endpoint data toggle is synchronized with the device */
1077
1078 usb_clear_halt(urb->dev, urb->pipe);
1079
1080 if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) {
1081 dbg("%s - submit urb %d failed (%d)", __FUNCTION__, i, err);
1082 }
1083 }
1084
1085 /* Reset low level data toggle on out endpoints */
1086 for (i = 0; i < 2; i++) {
1087 if ((urb = p_priv->out_urbs[i]) == NULL)
1088 continue;
1089 urb->dev = serial->dev;
1090 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */
1091 }
1092
1093 /* get the terminal config for the setup message now so we don't
1094 * need to send 2 of them */
1095
1096 cflag = port->tty->termios->c_cflag;
1097 device_port = port->number - port->serial->minor;
1098
1099 /* Baud rate calculation takes baud rate as an integer
1100 so other rates can be generated if desired. */
1101 baud_rate = tty_get_baud_rate(port->tty);
1102 /* If no match or invalid, leave as default */
1103 if (baud_rate >= 0
1104 && d_details->calculate_baud_rate(baud_rate, d_details->baudclk,
1105 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1106 p_priv->baud = baud_rate;
1107 }
1108
1109 /* set CTS/RTS handshake etc. */
1110 p_priv->cflag = cflag;
1111 p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none;
1112
1113 keyspan_send_setup(port, 1);
1114 //mdelay(100);
1115 //keyspan_set_termios(port, NULL);
1116
1117 return (0);
1118}
1119
1120static inline void stop_urb(struct urb *urb)
1121{
1122 if (urb && urb->status == -EINPROGRESS) {
1123 urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1124 usb_kill_urb(urb);
1125 }
1126}
1127
1128static void keyspan_close(struct usb_serial_port *port, struct file *filp)
1129{
1130 int i;
1131 struct usb_serial *serial = port->serial;
1132 struct keyspan_serial_private *s_priv;
1133 struct keyspan_port_private *p_priv;
1134
1135 dbg("%s", __FUNCTION__);
1136 s_priv = usb_get_serial_data(serial);
1137 p_priv = usb_get_serial_port_data(port);
1138
1139 p_priv->rts_state = 0;
1140 p_priv->dtr_state = 0;
1141
1142 if (serial->dev) {
1143 keyspan_send_setup(port, 2);
1144 /* pilot-xfer seems to work best with this delay */
1145 mdelay(100);
1146 // keyspan_set_termios(port, NULL);
1147 }
1148
1149 /*while (p_priv->outcont_urb->status == -EINPROGRESS) {
1150 dbg("%s - urb in progress", __FUNCTION__);
1151 }*/
1152
1153 p_priv->out_flip = 0;
1154 p_priv->in_flip = 0;
1155
1156 if (serial->dev) {
1157 /* Stop reading/writing urbs */
1158 stop_urb(p_priv->inack_urb);
1159 /* stop_urb(p_priv->outcont_urb); */
1160 for (i = 0; i < 2; i++) {
1161 stop_urb(p_priv->in_urbs[i]);
1162 stop_urb(p_priv->out_urbs[i]);
1163 }
1164 }
1165 port->tty = NULL;
1166}
1167
1168
1169 /* download the firmware to a pre-renumeration device */
1170static int keyspan_fake_startup (struct usb_serial *serial)
1171{
1172 int response;
1173 const struct ezusb_hex_record *record;
1174 char *fw_name;
1175
1176 dbg("Keyspan startup version %04x product %04x",
1177 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1178 le16_to_cpu(serial->dev->descriptor.idProduct));
1179
1180 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000) != 0x8000) {
1181 dbg("Firmware already loaded. Quitting.");
1182 return(1);
1183 }
1184
1185 /* Select firmware image on the basis of idProduct */
1186 switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1187 case keyspan_usa28_pre_product_id:
1188 record = &keyspan_usa28_firmware[0];
1189 fw_name = "USA28";
1190 break;
1191
1192 case keyspan_usa28x_pre_product_id:
1193 record = &keyspan_usa28x_firmware[0];
1194 fw_name = "USA28X";
1195 break;
1196
1197 case keyspan_usa28xa_pre_product_id:
1198 record = &keyspan_usa28xa_firmware[0];
1199 fw_name = "USA28XA";
1200 break;
1201
1202 case keyspan_usa28xb_pre_product_id:
1203 record = &keyspan_usa28xb_firmware[0];
1204 fw_name = "USA28XB";
1205 break;
1206
1207 case keyspan_usa19_pre_product_id:
1208 record = &keyspan_usa19_firmware[0];
1209 fw_name = "USA19";
1210 break;
1211
1212 case keyspan_usa19qi_pre_product_id:
1213 record = &keyspan_usa19qi_firmware[0];
1214 fw_name = "USA19QI";
1215 break;
1216
1217 case keyspan_mpr_pre_product_id:
1218 record = &keyspan_mpr_firmware[0];
1219 fw_name = "MPR";
1220 break;
1221
1222 case keyspan_usa19qw_pre_product_id:
1223 record = &keyspan_usa19qw_firmware[0];
1224 fw_name = "USA19QI";
1225 break;
1226
1227 case keyspan_usa18x_pre_product_id:
1228 record = &keyspan_usa18x_firmware[0];
1229 fw_name = "USA18X";
1230 break;
1231
1232 case keyspan_usa19w_pre_product_id:
1233 record = &keyspan_usa19w_firmware[0];
1234 fw_name = "USA19W";
1235 break;
1236
1237 case keyspan_usa49w_pre_product_id:
1238 record = &keyspan_usa49w_firmware[0];
1239 fw_name = "USA49W";
1240 break;
1241
1242 case keyspan_usa49wlc_pre_product_id:
1243 record = &keyspan_usa49wlc_firmware[0];
1244 fw_name = "USA49WLC";
1245 break;
1246
1247 default:
1248 record = NULL;
1249 fw_name = "Unknown";
1250 break;
1251 }
1252
1253 if (record == NULL) {
1254 dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name);
1255 return(1);
1256 }
1257
1258 dbg("Uploading Keyspan %s firmware.", fw_name);
1259
1260 /* download the firmware image */
1261 response = ezusb_set_reset(serial, 1);
1262
1263 while(record->address != 0xffff) {
1264 response = ezusb_writememory(serial, record->address,
1265 (unsigned char *)record->data,
1266 record->data_size, 0xa0);
1267 if (response < 0) {
1268 dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan"
1269 "firmware (%d %04X %p %d)\n",
1270 response,
1271 record->address, record->data, record->data_size);
1272 break;
1273 }
1274 record++;
1275 }
1276 /* bring device out of reset. Renumeration will occur in a
1277 moment and the new device will bind to the real driver */
1278 response = ezusb_set_reset(serial, 0);
1279
1280 /* we don't want this device to have a driver assigned to it. */
1281 return (1);
1282}
1283
1284/* Helper functions used by keyspan_setup_urbs */
1285static struct urb *keyspan_setup_urb (struct usb_serial *serial, int endpoint,
1286 int dir, void *ctx, char *buf, int len,
1287 void (*callback)(struct urb *, struct pt_regs *regs))
1288{
1289 struct urb *urb;
1290
1291 if (endpoint == -1)
1292 return NULL; /* endpoint not needed */
1293
1294 dbg ("%s - alloc for endpoint %d.", __FUNCTION__, endpoint);
1295 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
1296 if (urb == NULL) {
1297 dbg ("%s - alloc for endpoint %d failed.", __FUNCTION__, endpoint);
1298 return NULL;
1299 }
1300
1301 /* Fill URB using supplied data. */
1302 usb_fill_bulk_urb(urb, serial->dev,
1303 usb_sndbulkpipe(serial->dev, endpoint) | dir,
1304 buf, len, callback, ctx);
1305
1306 return urb;
1307}
1308
1309static struct callbacks {
1310 void (*instat_callback)(struct urb *, struct pt_regs *regs);
1311 void (*glocont_callback)(struct urb *, struct pt_regs *regs);
1312 void (*indat_callback)(struct urb *, struct pt_regs *regs);
1313 void (*outdat_callback)(struct urb *, struct pt_regs *regs);
1314 void (*inack_callback)(struct urb *, struct pt_regs *regs);
1315 void (*outcont_callback)(struct urb *, struct pt_regs *regs);
1316} keyspan_callbacks[] = {
1317 {
1318 /* msg_usa26 callbacks */
1319 .instat_callback = usa26_instat_callback,
1320 .glocont_callback = usa26_glocont_callback,
1321 .indat_callback = usa26_indat_callback,
1322 .outdat_callback = usa2x_outdat_callback,
1323 .inack_callback = usa26_inack_callback,
1324 .outcont_callback = usa26_outcont_callback,
1325 }, {
1326 /* msg_usa28 callbacks */
1327 .instat_callback = usa28_instat_callback,
1328 .glocont_callback = usa28_glocont_callback,
1329 .indat_callback = usa28_indat_callback,
1330 .outdat_callback = usa2x_outdat_callback,
1331 .inack_callback = usa28_inack_callback,
1332 .outcont_callback = usa28_outcont_callback,
1333 }, {
1334 /* msg_usa49 callbacks */
1335 .instat_callback = usa49_instat_callback,
1336 .glocont_callback = usa49_glocont_callback,
1337 .indat_callback = usa49_indat_callback,
1338 .outdat_callback = usa2x_outdat_callback,
1339 .inack_callback = usa49_inack_callback,
1340 .outcont_callback = usa49_outcont_callback,
1341 }, {
1342 /* msg_usa90 callbacks */
1343 .instat_callback = usa90_instat_callback,
1344 .glocont_callback = usa28_glocont_callback,
1345 .indat_callback = usa90_indat_callback,
1346 .outdat_callback = usa2x_outdat_callback,
1347 .inack_callback = usa28_inack_callback,
1348 .outcont_callback = usa90_outcont_callback,
1349 }
1350};
1351
1352 /* Generic setup urbs function that uses
1353 data in device_details */
1354static void keyspan_setup_urbs(struct usb_serial *serial)
1355{
1356 int i, j;
1357 struct keyspan_serial_private *s_priv;
1358 const struct keyspan_device_details *d_details;
1359 struct usb_serial_port *port;
1360 struct keyspan_port_private *p_priv;
1361 struct callbacks *cback;
1362 int endp;
1363
1364 dbg ("%s", __FUNCTION__);
1365
1366 s_priv = usb_get_serial_data(serial);
1367 d_details = s_priv->device_details;
1368
1369 /* Setup values for the various callback routines */
1370 cback = &keyspan_callbacks[d_details->msg_format];
1371
1372 /* Allocate and set up urbs for each one that is in use,
1373 starting with instat endpoints */
1374 s_priv->instat_urb = keyspan_setup_urb
1375 (serial, d_details->instat_endpoint, USB_DIR_IN,
1376 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1377 cback->instat_callback);
1378
1379 s_priv->glocont_urb = keyspan_setup_urb
1380 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1381 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1382 cback->glocont_callback);
1383
1384 /* Setup endpoints for each port specific thing */
1385 for (i = 0; i < d_details->num_ports; i ++) {
1386 port = serial->port[i];
1387 p_priv = usb_get_serial_port_data(port);
1388
1389 /* Do indat endpoints first, once for each flip */
1390 endp = d_details->indat_endpoints[i];
1391 for (j = 0; j <= d_details->indat_endp_flip; ++j, ++endp) {
1392 p_priv->in_urbs[j] = keyspan_setup_urb
1393 (serial, endp, USB_DIR_IN, port,
1394 p_priv->in_buffer[j], 64,
1395 cback->indat_callback);
1396 }
1397 for (; j < 2; ++j)
1398 p_priv->in_urbs[j] = NULL;
1399
1400 /* outdat endpoints also have flip */
1401 endp = d_details->outdat_endpoints[i];
1402 for (j = 0; j <= d_details->outdat_endp_flip; ++j, ++endp) {
1403 p_priv->out_urbs[j] = keyspan_setup_urb
1404 (serial, endp, USB_DIR_OUT, port,
1405 p_priv->out_buffer[j], 64,
1406 cback->outdat_callback);
1407 }
1408 for (; j < 2; ++j)
1409 p_priv->out_urbs[j] = NULL;
1410
1411 /* inack endpoint */
1412 p_priv->inack_urb = keyspan_setup_urb
1413 (serial, d_details->inack_endpoints[i], USB_DIR_IN,
1414 port, p_priv->inack_buffer, 1, cback->inack_callback);
1415
1416 /* outcont endpoint */
1417 p_priv->outcont_urb = keyspan_setup_urb
1418 (serial, d_details->outcont_endpoints[i], USB_DIR_OUT,
1419 port, p_priv->outcont_buffer, 64,
1420 cback->outcont_callback);
1421 }
1422
1423}
1424
1425/* usa19 function doesn't require prescaler */
1426static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1427 u8 *rate_low, u8 *prescaler, int portnum)
1428{
1429 u32 b16, /* baud rate times 16 (actual rate used internally) */
1430 div, /* divisor */
1431 cnt; /* inverse of divisor (programmed into 8051) */
1432
1433 dbg ("%s - %d.", __FUNCTION__, baud_rate);
1434
1435 /* prevent divide by zero... */
1436 if( (b16 = (baud_rate * 16L)) == 0) {
1437 return (KEYSPAN_INVALID_BAUD_RATE);
1438 }
1439
1440 /* Any "standard" rate over 57k6 is marginal on the USA-19
1441 as we run out of divisor resolution. */
1442 if (baud_rate > 57600) {
1443 return (KEYSPAN_INVALID_BAUD_RATE);
1444 }
1445
1446 /* calculate the divisor and the counter (its inverse) */
1447 if( (div = (baudclk / b16)) == 0) {
1448 return (KEYSPAN_INVALID_BAUD_RATE);
1449 }
1450 else {
1451 cnt = 0 - div;
1452 }
1453
1454 if(div > 0xffff) {
1455 return (KEYSPAN_INVALID_BAUD_RATE);
1456 }
1457
1458 /* return the counter values if non-null */
1459 if (rate_low) {
1460 *rate_low = (u8) (cnt & 0xff);
1461 }
1462 if (rate_hi) {
1463 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1464 }
1465 if (rate_low && rate_hi) {
1466 dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low);
1467 }
1468
1469 return (KEYSPAN_BAUD_RATE_OK);
1470}
1471
1472/* usa19hs function doesn't require prescaler */
1473static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1474 u8 *rate_low, u8 *prescaler, int portnum)
1475{
1476 u32 b16, /* baud rate times 16 (actual rate used internally) */
1477 div; /* divisor */
1478
1479 dbg ("%s - %d.", __FUNCTION__, baud_rate);
1480
1481 /* prevent divide by zero... */
1482 if( (b16 = (baud_rate * 16L)) == 0)
1483 return (KEYSPAN_INVALID_BAUD_RATE);
1484
1485
1486
1487 /* calculate the divisor */
1488 if( (div = (baudclk / b16)) == 0)
1489 return (KEYSPAN_INVALID_BAUD_RATE);
1490
1491 if(div > 0xffff)
1492 return (KEYSPAN_INVALID_BAUD_RATE);
1493
1494 /* return the counter values if non-null */
1495 if (rate_low)
1496 *rate_low = (u8) (div & 0xff);
1497
1498 if (rate_hi)
1499 *rate_hi = (u8) ((div >> 8) & 0xff);
1500
1501 if (rate_low && rate_hi)
1502 dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low);
1503
1504 return (KEYSPAN_BAUD_RATE_OK);
1505}
1506
1507static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1508 u8 *rate_low, u8 *prescaler, int portnum)
1509{
1510 u32 b16, /* baud rate times 16 (actual rate used internally) */
1511 clk, /* clock with 13/8 prescaler */
1512 div, /* divisor using 13/8 prescaler */
1513 res, /* resulting baud rate using 13/8 prescaler */
1514 diff, /* error using 13/8 prescaler */
1515 smallest_diff;
1516 u8 best_prescaler;
1517 int i;
1518
1519 dbg ("%s - %d.", __FUNCTION__, baud_rate);
1520
1521 /* prevent divide by zero */
1522 if( (b16 = baud_rate * 16L) == 0) {
1523 return (KEYSPAN_INVALID_BAUD_RATE);
1524 }
1525
1526 /* Calculate prescaler by trying them all and looking
1527 for best fit */
1528
1529 /* start with largest possible difference */
1530 smallest_diff = 0xffffffff;
1531
1532 /* 0 is an invalid prescaler, used as a flag */
1533 best_prescaler = 0;
1534
1535 for(i = 8; i <= 0xff; ++i) {
1536 clk = (baudclk * 8) / (u32) i;
1537
1538 if( (div = clk / b16) == 0) {
1539 continue;
1540 }
1541
1542 res = clk / div;
1543 diff= (res > b16) ? (res-b16) : (b16-res);
1544
1545 if(diff < smallest_diff) {
1546 best_prescaler = i;
1547 smallest_diff = diff;
1548 }
1549 }
1550
1551 if(best_prescaler == 0) {
1552 return (KEYSPAN_INVALID_BAUD_RATE);
1553 }
1554
1555 clk = (baudclk * 8) / (u32) best_prescaler;
1556 div = clk / b16;
1557
1558 /* return the divisor and prescaler if non-null */
1559 if (rate_low) {
1560 *rate_low = (u8) (div & 0xff);
1561 }
1562 if (rate_hi) {
1563 *rate_hi = (u8) ((div >> 8) & 0xff);
1564 }
1565 if (prescaler) {
1566 *prescaler = best_prescaler;
1567 /* dbg("%s - %d %d", __FUNCTION__, *prescaler, div); */
1568 }
1569 return (KEYSPAN_BAUD_RATE_OK);
1570}
1571
1572 /* USA-28 supports different maximum baud rates on each port */
1573static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,
1574 u8 *rate_low, u8 *prescaler, int portnum)
1575{
1576 u32 b16, /* baud rate times 16 (actual rate used internally) */
1577 div, /* divisor */
1578 cnt; /* inverse of divisor (programmed into 8051) */
1579
1580 dbg ("%s - %d.", __FUNCTION__, baud_rate);
1581
1582 /* prevent divide by zero */
1583 if ((b16 = baud_rate * 16L) == 0)
1584 return (KEYSPAN_INVALID_BAUD_RATE);
1585
1586 /* calculate the divisor and the counter (its inverse) */
1587 if ((div = (KEYSPAN_USA28_BAUDCLK / b16)) == 0) {
1588 return (KEYSPAN_INVALID_BAUD_RATE);
1589 }
1590 else {
1591 cnt = 0 - div;
1592 }
1593
1594 /* check for out of range, based on portnum,
1595 and return result */
1596 if(portnum == 0) {
1597 if(div > 0xffff)
1598 return (KEYSPAN_INVALID_BAUD_RATE);
1599 }
1600 else {
1601 if(portnum == 1) {
1602 if(div > 0xff) {
1603 return (KEYSPAN_INVALID_BAUD_RATE);
1604 }
1605 }
1606 else {
1607 return (KEYSPAN_INVALID_BAUD_RATE);
1608 }
1609 }
1610
1611 /* return the counter values if not NULL
1612 (port 1 will ignore retHi) */
1613 if (rate_low) {
1614 *rate_low = (u8) (cnt & 0xff);
1615 }
1616 if (rate_hi) {
1617 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1618 }
1619 dbg ("%s - %d OK.", __FUNCTION__, baud_rate);
1620 return (KEYSPAN_BAUD_RATE_OK);
1621}
1622
1623static int keyspan_usa26_send_setup(struct usb_serial *serial,
1624 struct usb_serial_port *port,
1625 int reset_port)
1626{
1627 struct keyspan_usa26_portControlMessage msg;
1628 struct keyspan_serial_private *s_priv;
1629 struct keyspan_port_private *p_priv;
1630 const struct keyspan_device_details *d_details;
1631 int outcont_urb;
1632 struct urb *this_urb;
1633 int device_port, err;
1634
1635 dbg ("%s reset=%d", __FUNCTION__, reset_port);
1636
1637 s_priv = usb_get_serial_data(serial);
1638 p_priv = usb_get_serial_port_data(port);
1639 d_details = s_priv->device_details;
1640 device_port = port->number - port->serial->minor;
1641
1642 outcont_urb = d_details->outcont_endpoints[port->number];
1643 this_urb = p_priv->outcont_urb;
1644
1645 dbg("%s - endpoint %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe));
1646
1647 /* Make sure we have an urb then send the message */
1648 if (this_urb == NULL) {
1649 dbg("%s - oops no urb.", __FUNCTION__);
1650 return -1;
1651 }
1652
1653 /* Save reset port val for resend.
1654 Don't overwrite resend for close condition. */
1655 if (p_priv->resend_cont != 3)
1656 p_priv->resend_cont = reset_port + 1;
1657 if (this_urb->status == -EINPROGRESS) {
1658 /* dbg ("%s - already writing", __FUNCTION__); */
1659 mdelay(5);
1660 return(-1);
1661 }
1662
1663 memset(&msg, 0, sizeof (struct keyspan_usa26_portControlMessage));
1664
1665 /* Only set baud rate if it's changed */
1666 if (p_priv->old_baud != p_priv->baud) {
1667 p_priv->old_baud = p_priv->baud;
1668 msg.setClocking = 0xff;
1669 if (d_details->calculate_baud_rate
1670 (p_priv->baud, d_details->baudclk, &msg.baudHi,
1671 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
1672 dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
1673 p_priv->baud);
1674 msg.baudLo = 0;
1675 msg.baudHi = 125; /* Values for 9600 baud */
1676 msg.prescaler = 10;
1677 }
1678 msg.setPrescaler = 0xff;
1679 }
1680
1681 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
1682 switch (p_priv->cflag & CSIZE) {
1683 case CS5:
1684 msg.lcr |= USA_DATABITS_5;
1685 break;
1686 case CS6:
1687 msg.lcr |= USA_DATABITS_6;
1688 break;
1689 case CS7:
1690 msg.lcr |= USA_DATABITS_7;
1691 break;
1692 case CS8:
1693 msg.lcr |= USA_DATABITS_8;
1694 break;
1695 }
1696 if (p_priv->cflag & PARENB) {
1697 /* note USA_PARITY_NONE == 0 */
1698 msg.lcr |= (p_priv->cflag & PARODD)?
1699 USA_PARITY_ODD: USA_PARITY_EVEN;
1700 }
1701 msg.setLcr = 0xff;
1702
1703 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1704 msg.xonFlowControl = 0;
1705 msg.setFlowControl = 0xff;
1706 msg.forwardingLength = 16;
1707 msg.xonChar = 17;
1708 msg.xoffChar = 19;
1709
1710 /* Opening port */
1711 if (reset_port == 1) {
1712 msg._txOn = 1;
1713 msg._txOff = 0;
1714 msg.txFlush = 0;
1715 msg.txBreak = 0;
1716 msg.rxOn = 1;
1717 msg.rxOff = 0;
1718 msg.rxFlush = 1;
1719 msg.rxForward = 0;
1720 msg.returnStatus = 0;
1721 msg.resetDataToggle = 0xff;
1722 }
1723
1724 /* Closing port */
1725 else if (reset_port == 2) {
1726 msg._txOn = 0;
1727 msg._txOff = 1;
1728 msg.txFlush = 0;
1729 msg.txBreak = 0;
1730 msg.rxOn = 0;
1731 msg.rxOff = 1;
1732 msg.rxFlush = 1;
1733 msg.rxForward = 0;
1734 msg.returnStatus = 0;
1735 msg.resetDataToggle = 0;
1736 }
1737
1738 /* Sending intermediate configs */
1739 else {
1740 msg._txOn = (! p_priv->break_on);
1741 msg._txOff = 0;
1742 msg.txFlush = 0;
1743 msg.txBreak = (p_priv->break_on);
1744 msg.rxOn = 0;
1745 msg.rxOff = 0;
1746 msg.rxFlush = 0;
1747 msg.rxForward = 0;
1748 msg.returnStatus = 0;
1749 msg.resetDataToggle = 0x0;
1750 }
1751
1752 /* Do handshaking outputs */
1753 msg.setTxTriState_setRts = 0xff;
1754 msg.txTriState_rts = p_priv->rts_state;
1755
1756 msg.setHskoa_setDtr = 0xff;
1757 msg.hskoa_dtr = p_priv->dtr_state;
1758
1759 p_priv->resend_cont = 0;
1760 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
1761
1762 /* send the data out the device on control endpoint */
1763 this_urb->transfer_buffer_length = sizeof(msg);
1764
1765 this_urb->dev = serial->dev;
1766 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
1767 dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
1768 }
1769#if 0
1770 else {
1771 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__
1772 outcont_urb, this_urb->transfer_buffer_length,
1773 usb_pipeendpoint(this_urb->pipe));
1774 }
1775#endif
1776
1777 return (0);
1778}
1779
1780static int keyspan_usa28_send_setup(struct usb_serial *serial,
1781 struct usb_serial_port *port,
1782 int reset_port)
1783{
1784 struct keyspan_usa28_portControlMessage msg;
1785 struct keyspan_serial_private *s_priv;
1786 struct keyspan_port_private *p_priv;
1787 const struct keyspan_device_details *d_details;
1788 struct urb *this_urb;
1789 int device_port, err;
1790
1791 dbg ("%s", __FUNCTION__);
1792
1793 s_priv = usb_get_serial_data(serial);
1794 p_priv = usb_get_serial_port_data(port);
1795 d_details = s_priv->device_details;
1796 device_port = port->number - port->serial->minor;
1797
1798 /* only do something if we have a bulk out endpoint */
1799 if ((this_urb = p_priv->outcont_urb) == NULL) {
1800 dbg("%s - oops no urb.", __FUNCTION__);
1801 return -1;
1802 }
1803
1804 /* Save reset port val for resend.
1805 Don't overwrite resend for close condition. */
1806 if (p_priv->resend_cont != 3)
1807 p_priv->resend_cont = reset_port + 1;
1808 if (this_urb->status == -EINPROGRESS) {
1809 dbg ("%s already writing", __FUNCTION__);
1810 mdelay(5);
1811 return(-1);
1812 }
1813
1814 memset(&msg, 0, sizeof (struct keyspan_usa28_portControlMessage));
1815
1816 msg.setBaudRate = 1;
1817 if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,
1818 &msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
1819 dbg("%s - Invalid baud rate requested %d.", __FUNCTION__, p_priv->baud);
1820 msg.baudLo = 0xff;
1821 msg.baudHi = 0xb2; /* Values for 9600 baud */
1822 }
1823
1824 /* If parity is enabled, we must calculate it ourselves. */
1825 msg.parity = 0; /* XXX for now */
1826
1827 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1828 msg.xonFlowControl = 0;
1829
1830 /* Do handshaking outputs, DTR is inverted relative to RTS */
1831 msg.rts = p_priv->rts_state;
1832 msg.dtr = p_priv->dtr_state;
1833
1834 msg.forwardingLength = 16;
1835 msg.forwardMs = 10;
1836 msg.breakThreshold = 45;
1837 msg.xonChar = 17;
1838 msg.xoffChar = 19;
1839
1840 /*msg.returnStatus = 1;
1841 msg.resetDataToggle = 0xff;*/
1842 /* Opening port */
1843 if (reset_port == 1) {
1844 msg._txOn = 1;
1845 msg._txOff = 0;
1846 msg.txFlush = 0;
1847 msg.txForceXoff = 0;
1848 msg.txBreak = 0;
1849 msg.rxOn = 1;
1850 msg.rxOff = 0;
1851 msg.rxFlush = 1;
1852 msg.rxForward = 0;
1853 msg.returnStatus = 0;
1854 msg.resetDataToggle = 0xff;
1855 }
1856 /* Closing port */
1857 else if (reset_port == 2) {
1858 msg._txOn = 0;
1859 msg._txOff = 1;
1860 msg.txFlush = 0;
1861 msg.txForceXoff = 0;
1862 msg.txBreak = 0;
1863 msg.rxOn = 0;
1864 msg.rxOff = 1;
1865 msg.rxFlush = 1;
1866 msg.rxForward = 0;
1867 msg.returnStatus = 0;
1868 msg.resetDataToggle = 0;
1869 }
1870 /* Sending intermediate configs */
1871 else {
1872 msg._txOn = (! p_priv->break_on);
1873 msg._txOff = 0;
1874 msg.txFlush = 0;
1875 msg.txForceXoff = 0;
1876 msg.txBreak = (p_priv->break_on);
1877 msg.rxOn = 0;
1878 msg.rxOff = 0;
1879 msg.rxFlush = 0;
1880 msg.rxForward = 0;
1881 msg.returnStatus = 0;
1882 msg.resetDataToggle = 0x0;
1883 }
1884
1885 p_priv->resend_cont = 0;
1886 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
1887
1888 /* send the data out the device on control endpoint */
1889 this_urb->transfer_buffer_length = sizeof(msg);
1890
1891 this_urb->dev = serial->dev;
1892 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
1893 dbg("%s - usb_submit_urb(setup) failed", __FUNCTION__);
1894 }
1895#if 0
1896 else {
1897 dbg("%s - usb_submit_urb(setup) OK %d bytes", __FUNCTION__,
1898 this_urb->transfer_buffer_length);
1899 }
1900#endif
1901
1902 return (0);
1903}
1904
1905static int keyspan_usa49_send_setup(struct usb_serial *serial,
1906 struct usb_serial_port *port,
1907 int reset_port)
1908{
1909 struct keyspan_usa49_portControlMessage msg;
1910 struct keyspan_serial_private *s_priv;
1911 struct keyspan_port_private *p_priv;
1912 const struct keyspan_device_details *d_details;
1913 int glocont_urb;
1914 struct urb *this_urb;
1915 int err, device_port;
1916
1917 dbg ("%s", __FUNCTION__);
1918
1919 s_priv = usb_get_serial_data(serial);
1920 p_priv = usb_get_serial_port_data(port);
1921 d_details = s_priv->device_details;
1922
1923 glocont_urb = d_details->glocont_endpoint;
1924 this_urb = s_priv->glocont_urb;
1925
1926 /* Work out which port within the device is being setup */
1927 device_port = port->number - port->serial->minor;
1928
1929 dbg("%s - endpoint %d port %d (%d)",__FUNCTION__, usb_pipeendpoint(this_urb->pipe), port->number, device_port);
1930
1931 /* Make sure we have an urb then send the message */
1932 if (this_urb == NULL) {
1933 dbg("%s - oops no urb for port %d.", __FUNCTION__, port->number);
1934 return -1;
1935 }
1936
1937 /* Save reset port val for resend.
1938 Don't overwrite resend for close condition. */
1939 if (p_priv->resend_cont != 3)
1940 p_priv->resend_cont = reset_port + 1;
1941 if (this_urb->status == -EINPROGRESS) {
1942 /* dbg ("%s - already writing", __FUNCTION__); */
1943 mdelay(5);
1944 return(-1);
1945 }
1946
1947 memset(&msg, 0, sizeof (struct keyspan_usa49_portControlMessage));
1948
1949 /*msg.portNumber = port->number;*/
1950 msg.portNumber = device_port;
1951
1952 /* Only set baud rate if it's changed */
1953 if (p_priv->old_baud != p_priv->baud) {
1954 p_priv->old_baud = p_priv->baud;
1955 msg.setClocking = 0xff;
1956 if (d_details->calculate_baud_rate
1957 (p_priv->baud, d_details->baudclk, &msg.baudHi,
1958 &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {
1959 dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
1960 p_priv->baud);
1961 msg.baudLo = 0;
1962 msg.baudHi = 125; /* Values for 9600 baud */
1963 msg.prescaler = 10;
1964 }
1965 //msg.setPrescaler = 0xff;
1966 }
1967
1968 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
1969 switch (p_priv->cflag & CSIZE) {
1970 case CS5:
1971 msg.lcr |= USA_DATABITS_5;
1972 break;
1973 case CS6:
1974 msg.lcr |= USA_DATABITS_6;
1975 break;
1976 case CS7:
1977 msg.lcr |= USA_DATABITS_7;
1978 break;
1979 case CS8:
1980 msg.lcr |= USA_DATABITS_8;
1981 break;
1982 }
1983 if (p_priv->cflag & PARENB) {
1984 /* note USA_PARITY_NONE == 0 */
1985 msg.lcr |= (p_priv->cflag & PARODD)?
1986 USA_PARITY_ODD: USA_PARITY_EVEN;
1987 }
1988 msg.setLcr = 0xff;
1989
1990 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
1991 msg.xonFlowControl = 0;
1992 msg.setFlowControl = 0xff;
1993
1994 msg.forwardingLength = 16;
1995 msg.xonChar = 17;
1996 msg.xoffChar = 19;
1997
1998 /* Opening port */
1999 if (reset_port == 1) {
2000 msg._txOn = 1;
2001 msg._txOff = 0;
2002 msg.txFlush = 0;
2003 msg.txBreak = 0;
2004 msg.rxOn = 1;
2005 msg.rxOff = 0;
2006 msg.rxFlush = 1;
2007 msg.rxForward = 0;
2008 msg.returnStatus = 0;
2009 msg.resetDataToggle = 0xff;
2010 msg.enablePort = 1;
2011 msg.disablePort = 0;
2012 }
2013 /* Closing port */
2014 else if (reset_port == 2) {
2015 msg._txOn = 0;
2016 msg._txOff = 1;
2017 msg.txFlush = 0;
2018 msg.txBreak = 0;
2019 msg.rxOn = 0;
2020 msg.rxOff = 1;
2021 msg.rxFlush = 1;
2022 msg.rxForward = 0;
2023 msg.returnStatus = 0;
2024 msg.resetDataToggle = 0;
2025 msg.enablePort = 0;
2026 msg.disablePort = 1;
2027 }
2028 /* Sending intermediate configs */
2029 else {
2030 msg._txOn = (! p_priv->break_on);
2031 msg._txOff = 0;
2032 msg.txFlush = 0;
2033 msg.txBreak = (p_priv->break_on);
2034 msg.rxOn = 0;
2035 msg.rxOff = 0;
2036 msg.rxFlush = 0;
2037 msg.rxForward = 0;
2038 msg.returnStatus = 0;
2039 msg.resetDataToggle = 0x0;
2040 msg.enablePort = 0;
2041 msg.disablePort = 0;
2042 }
2043
2044 /* Do handshaking outputs */
2045 msg.setRts = 0xff;
2046 msg.rts = p_priv->rts_state;
2047
2048 msg.setDtr = 0xff;
2049 msg.dtr = p_priv->dtr_state;
2050
2051 p_priv->resend_cont = 0;
2052 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
2053
2054 /* send the data out the device on control endpoint */
2055 this_urb->transfer_buffer_length = sizeof(msg);
2056
2057 this_urb->dev = serial->dev;
2058 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
2059 dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
2060 }
2061#if 0
2062 else {
2063 dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__,
2064 outcont_urb, this_urb->transfer_buffer_length,
2065 usb_pipeendpoint(this_urb->pipe));
2066 }
2067#endif
2068
2069 return (0);
2070}
2071
2072static int keyspan_usa90_send_setup(struct usb_serial *serial,
2073 struct usb_serial_port *port,
2074 int reset_port)
2075{
2076 struct keyspan_usa90_portControlMessage msg;
2077 struct keyspan_serial_private *s_priv;
2078 struct keyspan_port_private *p_priv;
2079 const struct keyspan_device_details *d_details;
2080 struct urb *this_urb;
2081 int err;
2082 u8 prescaler;
2083
2084 dbg ("%s", __FUNCTION__);
2085
2086 s_priv = usb_get_serial_data(serial);
2087 p_priv = usb_get_serial_port_data(port);
2088 d_details = s_priv->device_details;
2089
2090 /* only do something if we have a bulk out endpoint */
2091 if ((this_urb = p_priv->outcont_urb) == NULL) {
2092 dbg("%s - oops no urb.", __FUNCTION__);
2093 return -1;
2094 }
2095
2096 /* Save reset port val for resend.
2097 Don't overwrite resend for open/close condition. */
2098 if ((reset_port + 1) > p_priv->resend_cont)
2099 p_priv->resend_cont = reset_port + 1;
2100 if (this_urb->status == -EINPROGRESS) {
2101 dbg ("%s already writing", __FUNCTION__);
2102 mdelay(5);
2103 return(-1);
2104 }
2105
2106 memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage));
2107
2108 /* Only set baud rate if it's changed */
2109 if (p_priv->old_baud != p_priv->baud) {
2110 p_priv->old_baud = p_priv->baud;
2111 msg.setClocking = 0x01;
2112 if (d_details->calculate_baud_rate
2113 (p_priv->baud, d_details->baudclk, &msg.baudHi,
2114 &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) {
2115 dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,
2116 p_priv->baud);
2117 p_priv->baud = 9600;
2118 d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk,
2119 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2120 }
2121 msg.setRxMode = 1;
2122 msg.setTxMode = 1;
2123 }
2124
2125 /* modes must always be correctly specified */
2126 if (p_priv->baud > 57600)
2127 {
2128 msg.rxMode = RXMODE_DMA;
2129 msg.txMode = TXMODE_DMA;
2130 }
2131 else
2132 {
2133 msg.rxMode = RXMODE_BYHAND;
2134 msg.txMode = TXMODE_BYHAND;
2135 }
2136
2137 msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;
2138 switch (p_priv->cflag & CSIZE) {
2139 case CS5:
2140 msg.lcr |= USA_DATABITS_5;
2141 break;
2142 case CS6:
2143 msg.lcr |= USA_DATABITS_6;
2144 break;
2145 case CS7:
2146 msg.lcr |= USA_DATABITS_7;
2147 break;
2148 case CS8:
2149 msg.lcr |= USA_DATABITS_8;
2150 break;
2151 }
2152 if (p_priv->cflag & PARENB) {
2153 /* note USA_PARITY_NONE == 0 */
2154 msg.lcr |= (p_priv->cflag & PARODD)?
2155 USA_PARITY_ODD: USA_PARITY_EVEN;
2156 }
2157 if (p_priv->old_cflag != p_priv->cflag) {
2158 p_priv->old_cflag = p_priv->cflag;
2159 msg.setLcr = 0x01;
2160 }
2161
2162 if (p_priv->flow_control == flow_cts)
2163 msg.txFlowControl = TXFLOW_CTS;
2164 msg.setTxFlowControl = 0x01;
2165 msg.setRxFlowControl = 0x01;
2166
2167 msg.rxForwardingLength = 16;
2168 msg.rxForwardingTimeout = 16;
2169 msg.txAckSetting = 0;
2170 msg.xonChar = 17;
2171 msg.xoffChar = 19;
2172
2173 /* Opening port */
2174 if (reset_port == 1) {
2175 msg.portEnabled = 1;
2176 msg.rxFlush = 1;
2177 msg.txBreak = (p_priv->break_on);
2178 }
2179 /* Closing port */
2180 else if (reset_port == 2) {
2181 msg.portEnabled = 0;
2182 }
2183 /* Sending intermediate configs */
2184 else {
2185 if (port->open_count)
2186 msg.portEnabled = 1;
2187 msg.txBreak = (p_priv->break_on);
2188 }
2189
2190 /* Do handshaking outputs */
2191 msg.setRts = 0x01;
2192 msg.rts = p_priv->rts_state;
2193
2194 msg.setDtr = 0x01;
2195 msg.dtr = p_priv->dtr_state;
2196
2197 p_priv->resend_cont = 0;
2198 memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));
2199
2200 /* send the data out the device on control endpoint */
2201 this_urb->transfer_buffer_length = sizeof(msg);
2202
2203 this_urb->dev = serial->dev;
2204 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
2205 dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
2206 }
2207 return (0);
2208}
2209
2210static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2211{
2212 struct usb_serial *serial = port->serial;
2213 struct keyspan_serial_private *s_priv;
2214 const struct keyspan_device_details *d_details;
2215
2216 dbg ("%s", __FUNCTION__);
2217
2218 s_priv = usb_get_serial_data(serial);
2219 d_details = s_priv->device_details;
2220
2221 switch (d_details->msg_format) {
2222 case msg_usa26:
2223 keyspan_usa26_send_setup(serial, port, reset_port);
2224 break;
2225 case msg_usa28:
2226 keyspan_usa28_send_setup(serial, port, reset_port);
2227 break;
2228 case msg_usa49:
2229 keyspan_usa49_send_setup(serial, port, reset_port);
2230 break;
2231 case msg_usa90:
2232 keyspan_usa90_send_setup(serial, port, reset_port);
2233 break;
2234 }
2235}
2236
2237
2238/* Gets called by the "real" driver (ie once firmware is loaded
2239 and renumeration has taken place. */
2240static int keyspan_startup (struct usb_serial *serial)
2241{
2242 int i, err;
2243 struct usb_serial_port *port;
2244 struct keyspan_serial_private *s_priv;
2245 struct keyspan_port_private *p_priv;
2246 const struct keyspan_device_details *d_details;
2247
2248 dbg("%s", __FUNCTION__);
2249
2250 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2251 if (d_details->product_id == le16_to_cpu(serial->dev->descriptor.idProduct))
2252 break;
2253 if (d_details == NULL) {
2254 dev_err(&serial->dev->dev, "%s - unknown product id %x\n", __FUNCTION__, le16_to_cpu(serial->dev->descriptor.idProduct));
2255 return 1;
2256 }
2257
2258 /* Setup private data for serial driver */
2259 s_priv = kmalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2260 if (!s_priv) {
2261 dbg("%s - kmalloc for keyspan_serial_private failed.", __FUNCTION__);
2262 return -ENOMEM;
2263 }
2264 memset(s_priv, 0, sizeof(struct keyspan_serial_private));
2265
2266 s_priv->device_details = d_details;
2267 usb_set_serial_data(serial, s_priv);
2268
2269 /* Now setup per port private data */
2270 for (i = 0; i < serial->num_ports; i++) {
2271 port = serial->port[i];
2272 p_priv = kmalloc(sizeof(struct keyspan_port_private), GFP_KERNEL);
2273 if (!p_priv) {
2274 dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __FUNCTION__, i);
2275 return (1);
2276 }
2277 memset(p_priv, 0, sizeof(struct keyspan_port_private));
2278 p_priv->device_details = d_details;
2279 usb_set_serial_port_data(port, p_priv);
2280 }
2281
2282 keyspan_setup_urbs(serial);
2283
2284 s_priv->instat_urb->dev = serial->dev;
2285 if ((err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL)) != 0) {
2286 dbg("%s - submit instat urb failed %d", __FUNCTION__, err);
2287 }
2288
2289 return (0);
2290}
2291
2292static void keyspan_shutdown (struct usb_serial *serial)
2293{
2294 int i, j;
2295 struct usb_serial_port *port;
2296 struct keyspan_serial_private *s_priv;
2297 struct keyspan_port_private *p_priv;
2298
2299 dbg("%s", __FUNCTION__);
2300
2301 s_priv = usb_get_serial_data(serial);
2302
2303 /* Stop reading/writing urbs */
2304 stop_urb(s_priv->instat_urb);
2305 stop_urb(s_priv->glocont_urb);
2306 for (i = 0; i < serial->num_ports; ++i) {
2307 port = serial->port[i];
2308 p_priv = usb_get_serial_port_data(port);
2309 stop_urb(p_priv->inack_urb);
2310 stop_urb(p_priv->outcont_urb);
2311 for (j = 0; j < 2; j++) {
2312 stop_urb(p_priv->in_urbs[j]);
2313 stop_urb(p_priv->out_urbs[j]);
2314 }
2315 }
2316
2317 /* Now free them */
2318 if (s_priv->instat_urb)
2319 usb_free_urb(s_priv->instat_urb);
2320 if (s_priv->glocont_urb)
2321 usb_free_urb(s_priv->glocont_urb);
2322 for (i = 0; i < serial->num_ports; ++i) {
2323 port = serial->port[i];
2324 p_priv = usb_get_serial_port_data(port);
2325 if (p_priv->inack_urb)
2326 usb_free_urb(p_priv->inack_urb);
2327 if (p_priv->outcont_urb)
2328 usb_free_urb(p_priv->outcont_urb);
2329 for (j = 0; j < 2; j++) {
2330 if (p_priv->in_urbs[j])
2331 usb_free_urb(p_priv->in_urbs[j]);
2332 if (p_priv->out_urbs[j])
2333 usb_free_urb(p_priv->out_urbs[j]);
2334 }
2335 }
2336
2337 /* dbg("Freeing serial->private."); */
2338 kfree(s_priv);
2339
2340 /* dbg("Freeing port->private."); */
2341 /* Now free per port private data */
2342 for (i = 0; i < serial->num_ports; i++) {
2343 port = serial->port[i];
2344 kfree(usb_get_serial_port_data(port));
2345 }
2346}
2347
2348MODULE_AUTHOR( DRIVER_AUTHOR );
2349MODULE_DESCRIPTION( DRIVER_DESC );
2350MODULE_LICENSE("GPL");
2351
2352module_param(debug, bool, S_IRUGO | S_IWUSR);
2353MODULE_PARM_DESC(debug, "Debug enabled or not");
2354
diff --git a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h
new file mode 100644
index 000000000000..e9b45b768aca
--- /dev/null
+++ b/drivers/usb/serial/keyspan.h
@@ -0,0 +1,660 @@
1/*
2 Keyspan USB to Serial Converter driver
3
4 (C) Copyright (C) 2000-2001
5 Hugh Blemings <hugh@blemings.org>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 See http://misc.nu/hugh/keyspan.html for more information.
13
14 Code in this driver inspired by and in a number of places taken
15 from Brian Warner's original Keyspan-PDA driver.
16
17 This driver has been put together with the support of Innosys, Inc.
18 and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
19 Thanks Guys :)
20
21 Thanks to Paulus for miscellaneous tidy ups, some largish chunks
22 of much nicer and/or completely new code and (perhaps most uniquely)
23 having the patience to sit down and explain why and where he'd changed
24 stuff.
25
26 Tip 'o the hat to IBM (and previously Linuxcare :) for supporting
27 staff in their work on open source projects.
28
29 See keyspan.c for update history.
30
31*/
32
33#ifndef __LINUX_USB_SERIAL_KEYSPAN_H
34#define __LINUX_USB_SERIAL_KEYSPAN_H
35
36
37/* Function prototypes for Keyspan serial converter */
38static int keyspan_open (struct usb_serial_port *port,
39 struct file *filp);
40static void keyspan_close (struct usb_serial_port *port,
41 struct file *filp);
42static int keyspan_startup (struct usb_serial *serial);
43static void keyspan_shutdown (struct usb_serial *serial);
44static void keyspan_rx_throttle (struct usb_serial_port *port);
45static void keyspan_rx_unthrottle (struct usb_serial_port *port);
46static int keyspan_write_room (struct usb_serial_port *port);
47
48static int keyspan_write (struct usb_serial_port *port,
49 const unsigned char *buf,
50 int count);
51
52static void keyspan_send_setup (struct usb_serial_port *port,
53 int reset_port);
54
55
56static int keyspan_chars_in_buffer (struct usb_serial_port *port);
57static int keyspan_ioctl (struct usb_serial_port *port,
58 struct file *file,
59 unsigned int cmd,
60 unsigned long arg);
61static void keyspan_set_termios (struct usb_serial_port *port,
62 struct termios *old);
63static void keyspan_break_ctl (struct usb_serial_port *port,
64 int break_state);
65static int keyspan_tiocmget (struct usb_serial_port *port,
66 struct file *file);
67static int keyspan_tiocmset (struct usb_serial_port *port,
68 struct file *file, unsigned int set,
69 unsigned int clear);
70static int keyspan_fake_startup (struct usb_serial *serial);
71
72static int keyspan_usa19_calc_baud (u32 baud_rate, u32 baudclk,
73 u8 *rate_hi, u8 *rate_low,
74 u8 *prescaler, int portnum);
75
76static int keyspan_usa19w_calc_baud (u32 baud_rate, u32 baudclk,
77 u8 *rate_hi, u8 *rate_low,
78 u8 *prescaler, int portnum);
79
80static int keyspan_usa28_calc_baud (u32 baud_rate, u32 baudclk,
81 u8 *rate_hi, u8 *rate_low,
82 u8 *prescaler, int portnum);
83
84static int keyspan_usa19hs_calc_baud (u32 baud_rate, u32 baudclk,
85 u8 *rate_hi, u8 *rate_low,
86 u8 *prescaler, int portnum);
87
88static int keyspan_usa28_send_setup (struct usb_serial *serial,
89 struct usb_serial_port *port,
90 int reset_port);
91static int keyspan_usa26_send_setup (struct usb_serial *serial,
92 struct usb_serial_port *port,
93 int reset_port);
94static int keyspan_usa49_send_setup (struct usb_serial *serial,
95 struct usb_serial_port *port,
96 int reset_port);
97
98static int keyspan_usa90_send_setup (struct usb_serial *serial,
99 struct usb_serial_port *port,
100 int reset_port);
101
102/* Struct used for firmware - increased size of data section
103 to allow Keyspan's 'C' firmware struct to be used unmodified */
104struct ezusb_hex_record {
105 __u16 address;
106 __u8 data_size;
107 __u8 data[64];
108};
109
110/* Conditionally include firmware images, if they aren't
111 included create a null pointer instead. Current
112 firmware images aren't optimised to remove duplicate
113 addresses in the image itself. */
114#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28
115 #include "keyspan_usa28_fw.h"
116#else
117 static const struct ezusb_hex_record *keyspan_usa28_firmware = NULL;
118#endif
119
120#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28X
121 #include "keyspan_usa28x_fw.h"
122#else
123 static const struct ezusb_hex_record *keyspan_usa28x_firmware = NULL;
124#endif
125
126#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28XA
127 #include "keyspan_usa28xa_fw.h"
128#else
129 static const struct ezusb_hex_record *keyspan_usa28xa_firmware = NULL;
130#endif
131
132#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28XB
133 #include "keyspan_usa28xb_fw.h"
134#else
135 static const struct ezusb_hex_record *keyspan_usa28xb_firmware = NULL;
136#endif
137
138#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19
139 #include "keyspan_usa19_fw.h"
140#else
141 static const struct ezusb_hex_record *keyspan_usa19_firmware = NULL;
142#endif
143
144#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19QI
145 #include "keyspan_usa19qi_fw.h"
146#else
147 static const struct ezusb_hex_record *keyspan_usa19qi_firmware = NULL;
148#endif
149
150#ifdef CONFIG_USB_SERIAL_KEYSPAN_MPR
151 #include "keyspan_mpr_fw.h"
152#else
153 static const struct ezusb_hex_record *keyspan_mpr_firmware = NULL;
154#endif
155
156#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19QW
157 #include "keyspan_usa19qw_fw.h"
158#else
159 static const struct ezusb_hex_record *keyspan_usa19qw_firmware = NULL;
160#endif
161
162#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA18X
163 #include "keyspan_usa18x_fw.h"
164#else
165 static const struct ezusb_hex_record *keyspan_usa18x_firmware = NULL;
166#endif
167
168#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19W
169 #include "keyspan_usa19w_fw.h"
170#else
171 static const struct ezusb_hex_record *keyspan_usa19w_firmware = NULL;
172#endif
173
174#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA49W
175 #include "keyspan_usa49w_fw.h"
176#else
177 static const struct ezusb_hex_record *keyspan_usa49w_firmware = NULL;
178#endif
179
180#ifdef CONFIG_USB_SERIAL_KEYSPAN_USA49WLC
181 #include "keyspan_usa49wlc_fw.h"
182#else
183 static const struct ezusb_hex_record *keyspan_usa49wlc_firmware = NULL;
184#endif
185
186/* Values used for baud rate calculation - device specific */
187#define KEYSPAN_INVALID_BAUD_RATE (-1)
188#define KEYSPAN_BAUD_RATE_OK (0)
189#define KEYSPAN_USA18X_BAUDCLK (12000000L) /* a guess */
190#define KEYSPAN_USA19_BAUDCLK (12000000L)
191#define KEYSPAN_USA19W_BAUDCLK (24000000L)
192#define KEYSPAN_USA19HS_BAUDCLK (14769231L)
193#define KEYSPAN_USA28_BAUDCLK (1843200L)
194#define KEYSPAN_USA28X_BAUDCLK (12000000L)
195#define KEYSPAN_USA49W_BAUDCLK (48000000L)
196
197/* Some constants used to characterise each device. */
198#define KEYSPAN_MAX_NUM_PORTS (4)
199#define KEYSPAN_MAX_FLIPS (2)
200
201/* Device info for the Keyspan serial converter, used
202 by the overall usb-serial probe function */
203#define KEYSPAN_VENDOR_ID (0x06cd)
204
205/* Product IDs for the products supported, pre-renumeration */
206#define keyspan_usa18x_pre_product_id 0x0105
207#define keyspan_usa19_pre_product_id 0x0103
208#define keyspan_usa19qi_pre_product_id 0x010b
209#define keyspan_mpr_pre_product_id 0x011b
210#define keyspan_usa19qw_pre_product_id 0x0118
211#define keyspan_usa19w_pre_product_id 0x0106
212#define keyspan_usa28_pre_product_id 0x0101
213#define keyspan_usa28x_pre_product_id 0x0102
214#define keyspan_usa28xa_pre_product_id 0x0114
215#define keyspan_usa28xb_pre_product_id 0x0113
216#define keyspan_usa49w_pre_product_id 0x0109
217#define keyspan_usa49wlc_pre_product_id 0x011a
218
219/* Product IDs post-renumeration. Note that the 28x and 28xb
220 have the same id's post-renumeration but behave identically
221 so it's not an issue. */
222#define keyspan_usa18x_product_id 0x0112
223#define keyspan_usa19_product_id 0x0107
224#define keyspan_usa19qi_product_id 0x010c
225#define keyspan_usa19hs_product_id 0x0121
226#define keyspan_mpr_product_id 0x011c
227#define keyspan_usa19qw_product_id 0x0119
228#define keyspan_usa19w_product_id 0x0108
229#define keyspan_usa28_product_id 0x010f
230#define keyspan_usa28x_product_id 0x0110
231#define keyspan_usa28xa_product_id 0x0115
232#define keyspan_usa28xb_product_id 0x0110
233#define keyspan_usa49w_product_id 0x010a
234#define keyspan_usa49wlc_product_id 0x012a
235
236
237struct keyspan_device_details {
238 /* product ID value */
239 int product_id;
240
241 enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90} msg_format;
242
243 /* Number of physical ports */
244 int num_ports;
245
246 /* 1 if endpoint flipping used on input, 0 if not */
247 int indat_endp_flip;
248
249 /* 1 if endpoint flipping used on output, 0 if not */
250 int outdat_endp_flip;
251
252 /* Table mapping input data endpoint IDs to physical
253 port number and flip if used */
254 int indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
255
256 /* Same for output endpoints */
257 int outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
258
259 /* Input acknowledge endpoints */
260 int inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
261
262 /* Output control endpoints */
263 int outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
264
265 /* Endpoint used for input status */
266 int instat_endpoint;
267
268 /* Endpoint used for global control functions */
269 int glocont_endpoint;
270
271 int (*calculate_baud_rate) (u32 baud_rate, u32 baudclk,
272 u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum);
273 u32 baudclk;
274};
275
276/* Now for each device type we setup the device detail
277 structure with the appropriate information (provided
278 in Keyspan's documentation) */
279
280static const struct keyspan_device_details usa18x_device_details = {
281 .product_id = keyspan_usa18x_product_id,
282 .msg_format = msg_usa26,
283 .num_ports = 1,
284 .indat_endp_flip = 0,
285 .outdat_endp_flip = 1,
286 .indat_endpoints = {0x81},
287 .outdat_endpoints = {0x01},
288 .inack_endpoints = {0x85},
289 .outcont_endpoints = {0x05},
290 .instat_endpoint = 0x87,
291 .glocont_endpoint = 0x07,
292 .calculate_baud_rate = keyspan_usa19w_calc_baud,
293 .baudclk = KEYSPAN_USA18X_BAUDCLK,
294};
295
296static const struct keyspan_device_details usa19_device_details = {
297 .product_id = keyspan_usa19_product_id,
298 .msg_format = msg_usa28,
299 .num_ports = 1,
300 .indat_endp_flip = 1,
301 .outdat_endp_flip = 1,
302 .indat_endpoints = {0x81},
303 .outdat_endpoints = {0x01},
304 .inack_endpoints = {0x83},
305 .outcont_endpoints = {0x03},
306 .instat_endpoint = 0x84,
307 .glocont_endpoint = -1,
308 .calculate_baud_rate = keyspan_usa19_calc_baud,
309 .baudclk = KEYSPAN_USA19_BAUDCLK,
310};
311
312static const struct keyspan_device_details usa19qi_device_details = {
313 .product_id = keyspan_usa19qi_product_id,
314 .msg_format = msg_usa28,
315 .num_ports = 1,
316 .indat_endp_flip = 1,
317 .outdat_endp_flip = 1,
318 .indat_endpoints = {0x81},
319 .outdat_endpoints = {0x01},
320 .inack_endpoints = {0x83},
321 .outcont_endpoints = {0x03},
322 .instat_endpoint = 0x84,
323 .glocont_endpoint = -1,
324 .calculate_baud_rate = keyspan_usa28_calc_baud,
325 .baudclk = KEYSPAN_USA19_BAUDCLK,
326};
327
328static const struct keyspan_device_details mpr_device_details = {
329 .product_id = keyspan_mpr_product_id,
330 .msg_format = msg_usa28,
331 .num_ports = 1,
332 .indat_endp_flip = 1,
333 .outdat_endp_flip = 1,
334 .indat_endpoints = {0x81},
335 .outdat_endpoints = {0x01},
336 .inack_endpoints = {0x83},
337 .outcont_endpoints = {0x03},
338 .instat_endpoint = 0x84,
339 .glocont_endpoint = -1,
340 .calculate_baud_rate = keyspan_usa28_calc_baud,
341 .baudclk = KEYSPAN_USA19_BAUDCLK,
342};
343
344static const struct keyspan_device_details usa19qw_device_details = {
345 .product_id = keyspan_usa19qw_product_id,
346 .msg_format = msg_usa26,
347 .num_ports = 1,
348 .indat_endp_flip = 0,
349 .outdat_endp_flip = 1,
350 .indat_endpoints = {0x81},
351 .outdat_endpoints = {0x01},
352 .inack_endpoints = {0x85},
353 .outcont_endpoints = {0x05},
354 .instat_endpoint = 0x87,
355 .glocont_endpoint = 0x07,
356 .calculate_baud_rate = keyspan_usa19w_calc_baud,
357 .baudclk = KEYSPAN_USA19W_BAUDCLK,
358};
359
360static const struct keyspan_device_details usa19w_device_details = {
361 .product_id = keyspan_usa19w_product_id,
362 .msg_format = msg_usa26,
363 .num_ports = 1,
364 .indat_endp_flip = 0,
365 .outdat_endp_flip = 1,
366 .indat_endpoints = {0x81},
367 .outdat_endpoints = {0x01},
368 .inack_endpoints = {0x85},
369 .outcont_endpoints = {0x05},
370 .instat_endpoint = 0x87,
371 .glocont_endpoint = 0x07,
372 .calculate_baud_rate = keyspan_usa19w_calc_baud,
373 .baudclk = KEYSPAN_USA19W_BAUDCLK,
374};
375
376static const struct keyspan_device_details usa19hs_device_details = {
377 .product_id = keyspan_usa19hs_product_id,
378 .msg_format = msg_usa90,
379 .num_ports = 1,
380 .indat_endp_flip = 0,
381 .outdat_endp_flip = 0,
382 .indat_endpoints = {0x81},
383 .outdat_endpoints = {0x01},
384 .inack_endpoints = {-1},
385 .outcont_endpoints = {0x02},
386 .instat_endpoint = 0x82,
387 .glocont_endpoint = -1,
388 .calculate_baud_rate = keyspan_usa19hs_calc_baud,
389 .baudclk = KEYSPAN_USA19HS_BAUDCLK,
390};
391
392static const struct keyspan_device_details usa28_device_details = {
393 .product_id = keyspan_usa28_product_id,
394 .msg_format = msg_usa28,
395 .num_ports = 2,
396 .indat_endp_flip = 1,
397 .outdat_endp_flip = 1,
398 .indat_endpoints = {0x81, 0x83},
399 .outdat_endpoints = {0x01, 0x03},
400 .inack_endpoints = {0x85, 0x86},
401 .outcont_endpoints = {0x05, 0x06},
402 .instat_endpoint = 0x87,
403 .glocont_endpoint = 0x07,
404 .calculate_baud_rate = keyspan_usa28_calc_baud,
405 .baudclk = KEYSPAN_USA28_BAUDCLK,
406};
407
408static const struct keyspan_device_details usa28x_device_details = {
409 .product_id = keyspan_usa28x_product_id,
410 .msg_format = msg_usa26,
411 .num_ports = 2,
412 .indat_endp_flip = 0,
413 .outdat_endp_flip = 1,
414 .indat_endpoints = {0x81, 0x83},
415 .outdat_endpoints = {0x01, 0x03},
416 .inack_endpoints = {0x85, 0x86},
417 .outcont_endpoints = {0x05, 0x06},
418 .instat_endpoint = 0x87,
419 .glocont_endpoint = 0x07,
420 .calculate_baud_rate = keyspan_usa19w_calc_baud,
421 .baudclk = KEYSPAN_USA28X_BAUDCLK,
422};
423
424static const struct keyspan_device_details usa28xa_device_details = {
425 .product_id = keyspan_usa28xa_product_id,
426 .msg_format = msg_usa26,
427 .num_ports = 2,
428 .indat_endp_flip = 0,
429 .outdat_endp_flip = 1,
430 .indat_endpoints = {0x81, 0x83},
431 .outdat_endpoints = {0x01, 0x03},
432 .inack_endpoints = {0x85, 0x86},
433 .outcont_endpoints = {0x05, 0x06},
434 .instat_endpoint = 0x87,
435 .glocont_endpoint = 0x07,
436 .calculate_baud_rate = keyspan_usa19w_calc_baud,
437 .baudclk = KEYSPAN_USA28X_BAUDCLK,
438};
439
440/* We don't need a separate entry for the usa28xb as it appears as a 28x anyway */
441
442static const struct keyspan_device_details usa49w_device_details = {
443 .product_id = keyspan_usa49w_product_id,
444 .msg_format = msg_usa49,
445 .num_ports = 4,
446 .indat_endp_flip = 0,
447 .outdat_endp_flip = 0,
448 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
449 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
450 .inack_endpoints = {-1, -1, -1, -1},
451 .outcont_endpoints = {-1, -1, -1, -1},
452 .instat_endpoint = 0x87,
453 .glocont_endpoint = 0x07,
454 .calculate_baud_rate = keyspan_usa19w_calc_baud,
455 .baudclk = KEYSPAN_USA49W_BAUDCLK,
456};
457
458static const struct keyspan_device_details usa49wlc_device_details = {
459 .product_id = keyspan_usa49wlc_product_id,
460 .msg_format = msg_usa49,
461 .num_ports = 4,
462 .indat_endp_flip = 0,
463 .outdat_endp_flip = 0,
464 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
465 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
466 .inack_endpoints = {-1, -1, -1, -1},
467 .outcont_endpoints = {-1, -1, -1, -1},
468 .instat_endpoint = 0x87,
469 .glocont_endpoint = 0x07,
470 .calculate_baud_rate = keyspan_usa19w_calc_baud,
471 .baudclk = KEYSPAN_USA19W_BAUDCLK,
472};
473
474static const struct keyspan_device_details *keyspan_devices[] = {
475 &usa18x_device_details,
476 &usa19_device_details,
477 &usa19qi_device_details,
478 &mpr_device_details,
479 &usa19qw_device_details,
480 &usa19w_device_details,
481 &usa19hs_device_details,
482 &usa28_device_details,
483 &usa28x_device_details,
484 &usa28xa_device_details,
485 /* 28xb not required as it renumerates as a 28x */
486 &usa49w_device_details,
487 &usa49wlc_device_details,
488 NULL,
489};
490
491static struct usb_device_id keyspan_ids_combined[] = {
492 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
493 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
494 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
495 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
496 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
497 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
498 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
499 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
500 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
501 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
502 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
503 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
504 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
505 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
506 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
507 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
508 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
509 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
510 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
511 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
512 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
513 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
514 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
515 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
516 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
517 { } /* Terminating entry */
518};
519
520MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
521
522static struct usb_driver keyspan_driver = {
523 .owner = THIS_MODULE,
524 .name = "keyspan",
525 .probe = usb_serial_probe,
526 .disconnect = usb_serial_disconnect,
527 .id_table = keyspan_ids_combined,
528};
529
530/* usb_device_id table for the pre-firmware download keyspan devices */
531static struct usb_device_id keyspan_pre_ids[] = {
532 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
533 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
534 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
535 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
536 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
537 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
538 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
539 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
540 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
541 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
542 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
543 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
544 { } /* Terminating entry */
545};
546
547static struct usb_device_id keyspan_1port_ids[] = {
548 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
549 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
550 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
551 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
552 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
553 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
554 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
555 { } /* Terminating entry */
556};
557
558static struct usb_device_id keyspan_2port_ids[] = {
559 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
560 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
561 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
562 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
563 { } /* Terminating entry */
564};
565
566static struct usb_device_id keyspan_4port_ids[] = {
567 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
568 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
569 { } /* Terminating entry */
570};
571
572/* Structs for the devices, pre and post renumeration. */
573static struct usb_serial_device_type keyspan_pre_device = {
574 .owner = THIS_MODULE,
575 .name = "Keyspan - (without firmware)",
576 .short_name = "keyspan_no_firm",
577 .id_table = keyspan_pre_ids,
578 .num_interrupt_in = NUM_DONT_CARE,
579 .num_bulk_in = NUM_DONT_CARE,
580 .num_bulk_out = NUM_DONT_CARE,
581 .num_ports = 1,
582 .attach = keyspan_fake_startup,
583};
584
585static struct usb_serial_device_type keyspan_1port_device = {
586 .owner = THIS_MODULE,
587 .name = "Keyspan 1 port adapter",
588 .short_name = "keyspan_1",
589 .id_table = keyspan_1port_ids,
590 .num_interrupt_in = NUM_DONT_CARE,
591 .num_bulk_in = NUM_DONT_CARE,
592 .num_bulk_out = NUM_DONT_CARE,
593 .num_ports = 1,
594 .open = keyspan_open,
595 .close = keyspan_close,
596 .write = keyspan_write,
597 .write_room = keyspan_write_room,
598 .chars_in_buffer = keyspan_chars_in_buffer,
599 .throttle = keyspan_rx_throttle,
600 .unthrottle = keyspan_rx_unthrottle,
601 .ioctl = keyspan_ioctl,
602 .set_termios = keyspan_set_termios,
603 .break_ctl = keyspan_break_ctl,
604 .tiocmget = keyspan_tiocmget,
605 .tiocmset = keyspan_tiocmset,
606 .attach = keyspan_startup,
607 .shutdown = keyspan_shutdown,
608};
609
610static struct usb_serial_device_type keyspan_2port_device = {
611 .owner = THIS_MODULE,
612 .name = "Keyspan 2 port adapter",
613 .short_name = "keyspan_2",
614 .id_table = keyspan_2port_ids,
615 .num_interrupt_in = NUM_DONT_CARE,
616 .num_bulk_in = NUM_DONT_CARE,
617 .num_bulk_out = NUM_DONT_CARE,
618 .num_ports = 2,
619 .open = keyspan_open,
620 .close = keyspan_close,
621 .write = keyspan_write,
622 .write_room = keyspan_write_room,
623 .chars_in_buffer = keyspan_chars_in_buffer,
624 .throttle = keyspan_rx_throttle,
625 .unthrottle = keyspan_rx_unthrottle,
626 .ioctl = keyspan_ioctl,
627 .set_termios = keyspan_set_termios,
628 .break_ctl = keyspan_break_ctl,
629 .tiocmget = keyspan_tiocmget,
630 .tiocmset = keyspan_tiocmset,
631 .attach = keyspan_startup,
632 .shutdown = keyspan_shutdown,
633};
634
635static struct usb_serial_device_type keyspan_4port_device = {
636 .owner = THIS_MODULE,
637 .name = "Keyspan 4 port adapter",
638 .short_name = "keyspan_4",
639 .id_table = keyspan_4port_ids,
640 .num_interrupt_in = NUM_DONT_CARE,
641 .num_bulk_in = 5,
642 .num_bulk_out = 5,
643 .num_ports = 4,
644 .open = keyspan_open,
645 .close = keyspan_close,
646 .write = keyspan_write,
647 .write_room = keyspan_write_room,
648 .chars_in_buffer = keyspan_chars_in_buffer,
649 .throttle = keyspan_rx_throttle,
650 .unthrottle = keyspan_rx_unthrottle,
651 .ioctl = keyspan_ioctl,
652 .set_termios = keyspan_set_termios,
653 .break_ctl = keyspan_break_ctl,
654 .tiocmget = keyspan_tiocmget,
655 .tiocmset = keyspan_tiocmset,
656 .attach = keyspan_startup,
657 .shutdown = keyspan_shutdown,
658};
659
660#endif
diff --git a/drivers/usb/serial/keyspan_mpr_fw.h b/drivers/usb/serial/keyspan_mpr_fw.h
new file mode 100644
index 000000000000..238805e91fb2
--- /dev/null
+++ b/drivers/usb/serial/keyspan_mpr_fw.h
@@ -0,0 +1,286 @@
1/* keyspan_mpr_fw.h
2
3 The firmware contained herein as keyspan_mpr_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23static char theFirmwareDate53[] =
24 "04/26/2002 02:47p 11,570 USA53";
25*/
26
27static const struct ezusb_hex_record keyspan_mpr_firmware[] = {
28 {0x0033, 3, { 0x02, 0x00, 0x1a}},
29 {0x001a, 4, { 0x53, 0xd8, 0xef, 0x32}},
30 {0x0003, 16, { 0x8e, 0x56, 0x8f, 0x57, 0xe5, 0x57, 0x15, 0x57, 0xae, 0x56, 0x70, 0x02, 0x15, 0x56, 0x4e, 0x60}},
31 {0x0013, 7, { 0x05, 0x12, 0x0f, 0xa2, 0x80, 0xee, 0x22}},
32 {0x0023, 3, { 0x02, 0x00, 0x46}},
33 {0x0046, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0, 0x08}},
34 {0x0056, 16, { 0x30, 0x99, 0x0e, 0x30, 0x0b, 0x07, 0xa2, 0x0e, 0x92, 0x9b, 0x85, 0x36, 0x99, 0xc2, 0x99, 0xd2}},
35 {0x0066, 16, { 0x12, 0x20, 0x12, 0x03, 0x02, 0x02, 0xf9, 0xc2, 0x12, 0x30, 0x03, 0x19, 0x7e, 0x7e, 0x7f, 0x40}},
36 {0x0076, 16, { 0x75, 0x1a, 0x7e, 0x75, 0x1b, 0x40, 0x75, 0x17, 0x00, 0x7e, 0x7d, 0x7f, 0xc0, 0x75, 0x18, 0x7d}},
37 {0x0086, 16, { 0x75, 0x19, 0xc0, 0x80, 0x17, 0x7e, 0x7d, 0x7f, 0xc0, 0x75, 0x1a, 0x7d, 0x75, 0x1b, 0xc0, 0x75}},
38 {0x0096, 16, { 0x17, 0x01, 0x7e, 0x7e, 0x7f, 0x40, 0x75, 0x18, 0x7e, 0x75, 0x19, 0x40, 0x20, 0x0b, 0x03, 0x02}},
39 {0x00a6, 16, { 0x01, 0x84, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x3c, 0x20, 0x0c, 0x34, 0x20, 0x09, 0x31, 0x90}},
40 {0x00b6, 16, { 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x29, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b}},
41 {0x00c6, 16, { 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a}},
42 {0x00d6, 16, { 0xe5, 0x1b, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0x02, 0x02, 0xf7}},
43 {0x00e6, 16, { 0xc2, 0x0b, 0x02, 0x02, 0xf7, 0x30, 0x03, 0x11, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xa3, 0xe0, 0x54}},
44 {0x00f6, 16, { 0x02, 0xf5, 0x1d, 0xa3, 0xe0, 0xf5, 0x1c, 0x80, 0x11, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0x90, 0x7f}},
45 {0x0043, 3, { 0x02, 0x0f, 0x00}},
46 {0x0000, 3, { 0x02, 0x00, 0x26}},
47 {0x0026, 12, { 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x5a, 0x02, 0x0a, 0x33}},
48 {0x0106, 64, { 0xc6, 0xe0, 0x54, 0x02, 0xf5, 0x1d, 0xa3, 0xe0, 0xf5, 0x1c, 0xe5, 0x17, 0x24, 0xff, 0x92, 0x03, 0x30,
49 0x0d, 0x0d, 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0xc2, 0x0b, 0x02, 0x02, 0xf7, 0xe5,
50 0x1d, 0x60, 0x05, 0xc2, 0x0b, 0x02, 0x02, 0xf7, 0x85, 0x1c, 0x53, 0x85, 0x19, 0x82, 0x85, 0x18,
51 0x83, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x12, 0xff, 0x20, 0x0c, 0x3a, 0x20, 0x09, 0x37, 0x90}},
52 {0x0146, 64, { 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x2f, 0x30, 0x10, 0x1c, 0x85, 0x19, 0x82, 0x85, 0x18, 0x83, 0xa3,
53 0xe0, 0x13, 0x92, 0x0e, 0x85, 0x19, 0x82, 0x85, 0x18, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x36, 0x75,
54 0x3a, 0x03, 0x02, 0x02, 0xf7, 0x75, 0x3a, 0x02, 0x85, 0x19, 0x82, 0x85, 0x18, 0x83, 0xa3, 0xe0,
55 0xf5, 0x36, 0x02, 0x02, 0xf7, 0x75, 0x3a, 0x01, 0xc2, 0x0b, 0x02, 0x02, 0xf7, 0x30, 0x03}},
56 {0x0186, 64, { 0x0e, 0x90, 0x7f, 0xc6, 0xe0, 0x54, 0x02, 0xf5, 0x1d, 0xa3, 0xe0, 0xf5, 0x1c, 0x80, 0x0c, 0x90, 0x7f,
57 0xc8, 0xe0, 0x54, 0x02, 0xf5, 0x1d, 0xa3, 0xe0, 0xf5, 0x1c, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50,
58 0x03, 0x02, 0x02, 0x68, 0xe5, 0x1d, 0x60, 0x07, 0xc2, 0x14, 0xc2, 0x05, 0x02, 0x02, 0xf7, 0x85,
59 0x1c, 0x53, 0x85, 0x1b, 0x82, 0x85, 0x1a, 0x83, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x12, 0xff}},
60 {0x01c6, 64, { 0x30, 0x0c, 0x03, 0x02, 0x02, 0x60, 0x30, 0x09, 0x03, 0x02, 0x02, 0x60, 0x90, 0x7f, 0x9b, 0xe0, 0x55,
61 0x38, 0x60, 0x03, 0x02, 0x02, 0x60, 0x30, 0x10, 0x1b, 0x85, 0x1b, 0x82, 0x85, 0x1a, 0x83, 0xa3,
62 0xe0, 0x13, 0x92, 0x9b, 0x85, 0x1b, 0x82, 0x85, 0x1a, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x99, 0x75,
63 0x3a, 0x03, 0x80, 0x0d, 0x85, 0x1b, 0x82, 0x85, 0x1a, 0x83, 0xa3, 0xe0, 0xf5, 0x99, 0x75}},
64 {0x0206, 64, { 0x3a, 0x02, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x40, 0x26, 0x30, 0x03, 0x07, 0x90, 0x7f, 0xc7, 0xe4, 0xf0,
65 0x80, 0x05, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xe5, 0x17, 0x24, 0xff, 0x92, 0x03, 0x20, 0x0d, 0x03,
66 0x02, 0x02, 0xf7, 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0x02, 0x02, 0xf7, 0x30, 0x10,
67 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83}},
68 {0x0246, 64, { 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5,
69 0x83, 0xe0, 0xf5, 0x36, 0xd2, 0x0b, 0x02, 0x02, 0xf7, 0x75, 0x3a, 0x01, 0xc2, 0x14, 0x02, 0x02,
70 0xf7, 0x30, 0x0c, 0x03, 0x02, 0x02, 0xf5, 0x30, 0x09, 0x03, 0x02, 0x02, 0xf5, 0x90, 0x7f, 0x9b,
71 0xe0, 0x55, 0x38, 0x70, 0x79, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b, 0x2f}},
72 {0x0286, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x9b, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b,
73 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0xf5, 0x99, 0xe5, 0x3a, 0xc3, 0x95, 0x53,
74 0x40, 0x22, 0x30, 0x03, 0x07, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x7f, 0xc9, 0xe4,
75 0xf0, 0xe5, 0x17, 0x24, 0xff, 0x92, 0x03, 0x30, 0x0d, 0x36, 0xc2, 0x0d, 0x90, 0x7f, 0xbb}},
76 {0x02c6, 64, { 0x74, 0x01, 0xf0, 0x80, 0x2c, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b, 0x2f, 0xf5, 0x82,
77 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x1b, 0x2f,
78 0xf5, 0x82, 0xe4, 0x35, 0x1a, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0xd2, 0x0b, 0x80, 0x02, 0xc2, 0x14,
79 0xd2, 0x01, 0x20, 0x98, 0x03, 0x02, 0x04, 0x35, 0xc2, 0x98, 0x20, 0x02, 0x03, 0x02, 0x03}},
80 {0x0306, 64, { 0xa2, 0x20, 0x15, 0x27, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5,
81 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x10, 0x4d, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82,
82 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x3a, 0x85, 0x99, 0x55, 0xe5, 0x55, 0xb5,
83 0x47, 0x04, 0xd2, 0x09, 0x80, 0x2e, 0xe5, 0x55, 0xb5, 0x46, 0x04, 0xc2, 0x09, 0x80, 0x25}},
84 {0x0346, 64, { 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x55, 0xf0,
85 0x30, 0x10, 0x11, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5,
86 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x0f, 0xe5, 0x39, 0xc3, 0x95, 0x43, 0x50, 0x03, 0x02, 0x04, 0x33,
87 0x90, 0x7f, 0xb8, 0xe0, 0x30, 0xe1, 0x16, 0xe5, 0x39, 0xc3, 0x94, 0x40, 0x50, 0x03, 0x02}},
88 {0x0386, 64, { 0x04, 0x33, 0x15, 0x39, 0x15, 0x39, 0x05, 0x2b, 0x43, 0x34, 0x01, 0x02, 0x04, 0x33, 0x90, 0x7f, 0xb7,
89 0xe5, 0x39, 0xf0, 0x75, 0x39, 0x00, 0xc2, 0x02, 0x02, 0x04, 0x33, 0x20, 0x15, 0x27, 0xaf, 0x39,
90 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30,
91 0x10, 0x4d, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5}},
92 {0x03c6, 64, { 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x3a, 0x85, 0x99, 0x55, 0xe5, 0x55, 0xb5, 0x47, 0x04, 0xd2, 0x09, 0x80,
93 0x2e, 0xe5, 0x55, 0xb5, 0x46, 0x04, 0xc2, 0x09, 0x80, 0x25, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00,
94 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x55, 0xf0, 0x30, 0x10, 0x11, 0xaf, 0x39,
95 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0}},
96 {0x0406, 64, { 0xd2, 0x0f, 0xe5, 0x39, 0xc3, 0x95, 0x43, 0x40, 0x24, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x12, 0xe5,
97 0x39, 0xc3, 0x94, 0x40, 0x40, 0x16, 0x15, 0x39, 0x15, 0x39, 0x05, 0x2b, 0x43, 0x34, 0x01, 0x80,
98 0x0b, 0x90, 0x7f, 0xb9, 0xe5, 0x39, 0xf0, 0x75, 0x39, 0x00, 0xd2, 0x02, 0xd2, 0x01, 0x30, 0x01,
99 0x05, 0xc2, 0x01, 0x02, 0x00, 0x56, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x82, 0xd0, 0x83, 0xd0}},
100 {0x0446, 64, { 0xe0, 0x32, 0x90, 0x7f, 0xbc, 0xe0, 0x20, 0xe1, 0x54, 0xe5, 0x34, 0x60, 0x50, 0xe5, 0x31, 0x70, 0x4c,
101 0xe5, 0x34, 0x30, 0xe1, 0x0b, 0xe4, 0xf5, 0x2f, 0x75, 0x34, 0x01, 0x75, 0x31, 0x02, 0x80, 0x0e,
102 0xa2, 0x08, 0xe4, 0x33, 0xf5, 0x2f, 0xc2, 0x08, 0xe4, 0xf5, 0x34, 0x75, 0x31, 0x10, 0xe4, 0xf5,
103 0x56, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x56, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12}},
104 {0x0486, 64, { 0x0c, 0x79, 0xff, 0x74, 0x00, 0x25, 0x56, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xef, 0xf0, 0x05,
105 0x56, 0xe5, 0x56, 0xb4, 0x0c, 0xdb, 0x90, 0x7f, 0xbd, 0x74, 0x0c, 0xf0, 0x90, 0x7f, 0xca, 0xe0,
106 0x30, 0xe1, 0x03, 0x02, 0x05, 0xd1, 0xe4, 0xf5, 0x56, 0x74, 0x40, 0x25, 0x56, 0xf5, 0x82, 0xe4,
107 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x56, 0x7c, 0x00, 0x7b, 0x00, 0x24, 0x3b, 0xf9}},
108 {0x04c6, 64, { 0xec, 0x34, 0x00, 0xfa, 0xef, 0x12, 0x0c, 0x92, 0x05, 0x56, 0xe5, 0x56, 0xb4, 0x18, 0xdb, 0xe5, 0x3b,
109 0x60, 0x11, 0x75, 0xc9, 0x20, 0x75, 0xc8, 0x36, 0x85, 0x3c, 0xca, 0x85, 0x3d, 0xcb, 0xe4, 0x90,
110 0x7f, 0x9f, 0xf0, 0xe5, 0x3e, 0x13, 0x92, 0x10, 0x92, 0x9f, 0x85, 0x3f, 0x38, 0xe5, 0x40, 0x13,
111 0x92, 0x15, 0xe5, 0x41, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x07}},
112 {0x0506, 64, { 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x04, 0xf0, 0xe5, 0x42, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0x7f,
113 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x48, 0x60, 0x0b, 0xc2, 0x0c,
114 0xc2, 0x09, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x49, 0x60, 0x0c, 0xd2, 0x09, 0x43,
115 0x34, 0x01, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x4a, 0x60, 0x0d, 0xc2, 0xaf}},
116 {0x0546, 64, { 0xc2, 0x0b, 0xd2, 0x00, 0xe4, 0xf5, 0x53, 0xf5, 0x3a, 0xd2, 0xaf, 0xe5, 0x4b, 0x60, 0x05, 0x30, 0x15,
117 0x02, 0xd2, 0x09, 0xe5, 0x4c, 0x60, 0x15, 0x90, 0x7f, 0x95, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f,
118 0x9e, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x4d, 0x60, 0x0a,
119 0xd2, 0x9c, 0xc2, 0x98, 0x75, 0x2c, 0x01, 0x75, 0x31, 0x1e, 0xe5, 0x4e, 0x60, 0x07, 0xc2}},
120 {0x0586, 64, { 0x9c, 0xe4, 0xf5, 0x39, 0xf5, 0x2c, 0xe5, 0x4f, 0x60, 0x03, 0xe4, 0xf5, 0x39, 0xe5, 0x50, 0x60, 0x02,
121 0xd2, 0x07, 0xe5, 0x51, 0x60, 0x0a, 0xe5, 0x4d, 0x70, 0x02, 0xf5, 0x31, 0xe5, 0x51, 0x42, 0x34,
122 0xe5, 0x52, 0x60, 0x1f, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x12, 0xf0,
123 0x74, 0x32, 0xf0, 0x74, 0x13, 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x14, 0xf0, 0x74, 0x34, 0xf0}},
124 {0x05c6, 64, { 0xd2, 0x03, 0xd2, 0x02, 0xd2, 0x08, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0xa2, 0x0c, 0xe4, 0x33, 0xff, 0x65,
125 0x29, 0x60, 0x05, 0x8f, 0x29, 0x43, 0x34, 0x01, 0xa2, 0x09, 0xe4, 0x33, 0xff, 0x65, 0x2a, 0x60,
126 0x05, 0x8f, 0x2a, 0x43, 0x34, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0xff, 0x54, 0x08, 0x64, 0x08, 0xf5,
127 0x57, 0x65, 0x25, 0x60, 0x06, 0x85, 0x57, 0x25, 0x43, 0x34, 0x01, 0xef, 0x54, 0x10, 0x64}},
128 {0x0606, 64, { 0x10, 0xf5, 0x57, 0x65, 0x26, 0x60, 0x06, 0x85, 0x57, 0x26, 0x43, 0x34, 0x01, 0xef, 0x54, 0x40, 0x64,
129 0x40, 0xf5, 0x57, 0x65, 0x27, 0x60, 0x06, 0x85, 0x57, 0x27, 0x43, 0x34, 0x01, 0xef, 0x54, 0x20,
130 0x64, 0x20, 0xf5, 0x57, 0x65, 0x28, 0x60, 0x06, 0x85, 0x57, 0x28, 0x43, 0x34, 0x01, 0x90, 0x7f,
131 0x9a, 0xe0, 0x54, 0x40, 0x64, 0x40, 0xf5, 0x57, 0x65, 0x2e, 0x60, 0x06, 0x85, 0x57, 0x2e}},
132 {0x0646, 64, { 0x43, 0x34, 0x01, 0x30, 0x07, 0x35, 0xc2, 0xaf, 0x30, 0x02, 0x18, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1,
133 0x27, 0xe5, 0x39, 0x60, 0x09, 0x90, 0x7f, 0xb7, 0xf0, 0xe4, 0xf5, 0x39, 0xc2, 0x02, 0xc2, 0x07,
134 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0, 0x20, 0xe1, 0x0f, 0xe5, 0x39, 0x60, 0x09, 0x90, 0x7f, 0xb9,
135 0xf0, 0xe4, 0xf5, 0x39, 0xd2, 0x02, 0xc2, 0x07, 0xd2, 0xaf, 0x20, 0x05, 0x3d, 0x30, 0x03}},
136 {0x0686, 64, { 0x1e, 0x90, 0x7f, 0xc6, 0xe0, 0x20, 0xe1, 0x33, 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x3a,
137 0x01, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x53, 0xd2, 0x05, 0x75, 0x12, 0xff, 0x80, 0x1c, 0x90, 0x7f,
138 0xc8, 0xe0, 0x20, 0xe1, 0x15, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x3a, 0x01, 0x90,
139 0x7f, 0xc9, 0xe0, 0xf5, 0x53, 0xd2, 0x05, 0x75, 0x12, 0xff, 0x20, 0x14, 0x33, 0x20, 0x00}},
140 {0x06c6, 64, { 0x06, 0xe5, 0x3a, 0x65, 0x53, 0x70, 0x2a, 0x30, 0x05, 0x1a, 0x30, 0x03, 0x09, 0xe4, 0x90, 0x7f, 0xc7,
141 0xf0, 0xc2, 0x03, 0x80, 0x07, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x03, 0xc2, 0x05, 0xe4, 0xf5,
142 0x53, 0xf5, 0x3a, 0x30, 0x0d, 0x0a, 0xc2, 0x0d, 0xc2, 0x00, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0,
143 0x30, 0x14, 0x03, 0x02, 0x07, 0xbf, 0x20, 0x05, 0x03, 0x02, 0x07, 0xbf, 0x30, 0x0c, 0x03}},
144 {0x0706, 64, { 0x02, 0x07, 0xbf, 0x30, 0x09, 0x03, 0x02, 0x07, 0xbf, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x60, 0x03,
145 0x02, 0x07, 0xbf, 0x30, 0x03, 0x0c, 0x7e, 0x7e, 0x7f, 0x40, 0x75, 0x58, 0x7e, 0x75, 0x59, 0x40,
146 0x80, 0x0a, 0x7e, 0x7d, 0x7f, 0xc0, 0x75, 0x58, 0x7d, 0x75, 0x59, 0xc0, 0x30, 0x10, 0x12, 0xaf,
147 0x3a, 0x05, 0x3a, 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0, 0x13}},
148 {0x0746, 64, { 0x92, 0x1a, 0xaf, 0x3a, 0x05, 0x3a, 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0,
149 0xf5, 0x57, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x2a, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a,
150 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a,
151 0x05, 0x3a, 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0, 0xf5, 0x36}},
152 {0x0786, 64, { 0xd2, 0x0b, 0x80, 0x15, 0xc2, 0x0b, 0x30, 0x03, 0x09, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x03, 0x80,
153 0x07, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x03, 0x30, 0x10, 0x04, 0xa2, 0x1a, 0x92, 0x9b, 0xd2,
154 0x14, 0xc2, 0xaf, 0x85, 0x57, 0x99, 0x20, 0x0b, 0x0d, 0x30, 0x0d, 0x0a, 0xc2, 0x0d, 0xc2, 0x00,
155 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0c}},
156 {0x07c6, 64, { 0xa4, 0x09, 0x1c, 0x00, 0x09, 0x89, 0x01, 0x09, 0xe6, 0x03, 0x07, 0xe3, 0x06, 0x09, 0x0d, 0x08, 0x09,
157 0x01, 0x09, 0x08, 0xe9, 0x0a, 0x08, 0xf8, 0x0b, 0x00, 0x00, 0x0a, 0x24, 0x90, 0x7f, 0xeb, 0xe0,
158 0x24, 0xfe, 0x60, 0x1c, 0x14, 0x70, 0x03, 0x02, 0x08, 0x79, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0a,
159 0x24, 0x74, 0x0d, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x87, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0a}},
160 {0x0806, 64, { 0x2b, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0xd8,
161 0x75, 0x83, 0x0d, 0xef, 0xf0, 0x75, 0x82, 0xd1, 0x75, 0x83, 0x0d, 0xf0, 0x75, 0x82, 0xca, 0x75,
162 0x83, 0x0d, 0xf0, 0x75, 0x82, 0xc3, 0x75, 0x83, 0x0d, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75,
163 0x82, 0x9e, 0x75, 0x83, 0x0d, 0xf0, 0x90, 0x7f, 0xef, 0xe0, 0xfe, 0x90, 0x7f, 0xee, 0xe0}},
164 {0x0846, 64, { 0x7c, 0x00, 0x24, 0x00, 0xf5, 0x5a, 0xec, 0x3e, 0xf5, 0x59, 0x75, 0x15, 0x0d, 0x75, 0x16, 0x99, 0x75,
165 0x82, 0x9b, 0x75, 0x83, 0x0d, 0xe0, 0x75, 0x13, 0x00, 0xf5, 0x14, 0xd3, 0xe5, 0x14, 0x95, 0x5a,
166 0xe5, 0x13, 0x95, 0x59, 0x40, 0x06, 0x85, 0x59, 0x13, 0x85, 0x5a, 0x14, 0x12, 0x0b, 0xba, 0x02,
167 0x0a, 0x2b, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x0b, 0x75, 0x56, 0xff, 0x75, 0x57, 0x0d, 0x75}},
168 {0x0886, 64, { 0x58, 0xdc, 0x80, 0x2d, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x0b, 0x75, 0x56, 0xff, 0x75, 0x57, 0x0d,
169 0x75, 0x58, 0xe0, 0x80, 0x1b, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x02, 0x0b, 0x75, 0x56, 0xff, 0x75,
170 0x57, 0x0d, 0x75, 0x58, 0xf0, 0x80, 0x09, 0x75, 0x56, 0xff, 0x75, 0x57, 0x0e, 0x75, 0x58, 0x1e,
171 0x90, 0x7f, 0xee, 0xe0, 0x75, 0x59, 0x00, 0xf5, 0x5a, 0xae, 0x57, 0xaf, 0x58, 0x8e, 0x15}},
172 {0x08c6, 64, { 0x8f, 0x16, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x13, 0xf5, 0x14, 0xd3, 0x95, 0x5a,
173 0xe5, 0x13, 0x95, 0x59, 0x40, 0x06, 0x85, 0x59, 0x13, 0x85, 0x5a, 0x14, 0x12, 0x0b, 0xba, 0x02,
174 0x0a, 0x2b, 0x90, 0x7f, 0x00, 0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x0a,
175 0x2b, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x11, 0x02, 0x0a, 0x2b, 0x12, 0x0c, 0x24, 0x90, 0x7f}},
176 {0x0906, 64, { 0xea, 0xe0, 0xf5, 0x10, 0x02, 0x0a, 0x2b, 0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
177 0x01, 0xf0, 0x02, 0x0a, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x27, 0x14, 0x60, 0x34,
178 0x24, 0x02, 0x60, 0x03, 0x02, 0x0a, 0x24, 0xa2, 0x16, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2,
179 0x18, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74}},
180 {0x0946, 64, { 0x02, 0xf0, 0x02, 0x0a, 0x2b, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02,
181 0xf0, 0x02, 0x0a, 0x2b, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff,
182 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0,
183 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0}},
184 {0x0986, 64, { 0x02, 0x0a, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x17, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0a,
185 0x2b, 0x90, 0x7f, 0xea, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0a, 0x24, 0xc2, 0x16, 0x02, 0x0a,
186 0x2b, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x76, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4,
187 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34}},
188 {0x09c6, 64, { 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f,
189 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x45, 0x90,
190 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x10, 0x24, 0x02, 0x70, 0x39, 0x90, 0x7f, 0xea, 0xe0, 0x64,
191 0x01, 0x70, 0x2a, 0xd2, 0x16, 0x80, 0x2d, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f}},
192 {0x0a06, 64, { 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24,
193 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4,
194 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22, 0xc2, 0x10, 0xe4, 0xf5,
195 0x10, 0xf5, 0x34, 0xc2, 0x09, 0xc2, 0x0c, 0xc2, 0x0b, 0xc2, 0x14, 0xc2, 0x0d, 0xc2, 0x15}},
196 {0x0a46, 64, { 0xc2, 0x11, 0xc2, 0x07, 0xc2, 0x12, 0xc2, 0x0f, 0xc2, 0x08, 0xf5, 0x35, 0xf5, 0x39, 0xf5, 0x53, 0xf5,
197 0x3a, 0xf5, 0x33, 0xf5, 0x30, 0xf5, 0x2f, 0xf5, 0x2e, 0xf5, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0xf5,
198 0x2a, 0xf5, 0x29, 0xf5, 0x28, 0xf5, 0x27, 0xf5, 0x26, 0xf5, 0x25, 0xf5, 0x24, 0xc2, 0x05, 0xc2,
199 0x17, 0xc2, 0x19, 0xc2, 0x16, 0xc2, 0x18, 0xc2, 0x04, 0xd2, 0x13, 0xc2, 0x06, 0xc2, 0x01}},
200 {0x0a86, 64, { 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01,
201 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90,
202 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae,
203 0xe0, 0x44, 0x0f, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x0e, 0xf0, 0xd2, 0xaf, 0xd2, 0xbc, 0xd2}},
204 {0x0ac6, 64, { 0x1a, 0x12, 0x0f, 0x7d, 0xc2, 0x17, 0x30, 0x04, 0x03, 0x12, 0x04, 0x48, 0x30, 0x04, 0x2a, 0x30, 0x06,
205 0x27, 0xc2, 0x06, 0xe5, 0x12, 0x60, 0x16, 0x15, 0x12, 0x90, 0x7f, 0xd8, 0xe0, 0x30, 0xe6, 0x04,
206 0x7f, 0x00, 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f, 0x96, 0xef, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x96,
207 0x74, 0x20, 0xf0, 0x12, 0x0b, 0x14, 0x80, 0xcd, 0x30, 0x17, 0x07, 0xc2, 0x17, 0x12, 0x07}},
208 {0x0b06, 64, { 0xc0, 0x80, 0xc3, 0x30, 0x19, 0xc0, 0xc2, 0x19, 0x12, 0x0e, 0xdc, 0x80, 0xb9, 0x22, 0xe5, 0x31, 0x60,
209 0x02, 0x15, 0x31, 0xe5, 0x39, 0x60, 0x55, 0x65, 0x35, 0x70, 0x4b, 0xe5, 0x33, 0xf4, 0x60, 0x02,
210 0x05, 0x33, 0xe5, 0x33, 0xc3, 0x95, 0x44, 0x40, 0x43, 0xc2, 0xaf, 0x30, 0x02, 0x1b, 0x90, 0x7f,
211 0xb8, 0xe0, 0x20, 0xe1, 0x2d, 0x90, 0x7f, 0xb7, 0xe5, 0x39, 0xf0, 0xc2, 0x02, 0xe4, 0xf5}},
212 {0x0b46, 64, { 0x39, 0xf5, 0x33, 0xf5, 0x35, 0x75, 0x12, 0xff, 0x80, 0x19, 0x90, 0x7f, 0xb6, 0xe0, 0x20, 0xe1, 0x12,
213 0x90, 0x7f, 0xb9, 0xe5, 0x39, 0xf0, 0xd2, 0x02, 0xe4, 0xf5, 0x39, 0xf5, 0x33, 0xf5, 0x35, 0x75,
214 0x12, 0xff, 0xd2, 0xaf, 0x80, 0x06, 0x85, 0x39, 0x35, 0xe4, 0xf5, 0x33, 0xe5, 0x2c, 0x60, 0x30,
215 0x20, 0x0f, 0x07, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x0f, 0xe5, 0x2d, 0x60, 0x06, 0xe4}},
216 {0x0b86, 64, { 0xf5, 0x2d, 0x43, 0x34, 0x01, 0xe4, 0xf5, 0x30, 0x80, 0x14, 0xe5, 0x30, 0xd3, 0x95, 0x45, 0x50, 0x0d,
217 0xe5, 0x30, 0xb5, 0x45, 0x06, 0x75, 0x2d, 0x01, 0x43, 0x34, 0x01, 0x05, 0x30, 0xc2, 0x0f, 0x22,
218 0x90, 0x7f, 0xd9, 0xe0, 0x30, 0xe2, 0x04, 0x7f, 0x00, 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f, 0x96,
219 0xef, 0xf0, 0x22, 0xe5, 0x14, 0x45, 0x13, 0x60, 0x57, 0xae, 0x13, 0xaf, 0x14, 0xd3, 0xef}},
220 {0x0bc6, 64, { 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x04, 0x7e, 0x00, 0x7f, 0x40, 0xc3, 0xe5, 0x14, 0x9f, 0xf5, 0x14,
221 0xe5, 0x13, 0x9e, 0xf5, 0x13, 0xe4, 0xfd, 0xed, 0xc3, 0x9f, 0xe4, 0x9e, 0x50, 0x1f, 0x85, 0x16,
222 0x82, 0x85, 0x15, 0x83, 0xe0, 0xfc, 0x74, 0x00, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83,
223 0xec, 0xf0, 0x0d, 0x05, 0x16, 0xe5, 0x16, 0x70, 0x02, 0x05, 0x15, 0x80, 0xda, 0x90, 0x7f}},
224 {0x0c06, 64, { 0xa9, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xef, 0xf0, 0x22,
225 0x90, 0x7f, 0xac, 0xe0, 0x54, 0xfe, 0xf0, 0xe4, 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xe4, 0x90, 0x7f,
226 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x20, 0xf0, 0x90, 0x7f,
227 0x94, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0x97, 0x74, 0x86}},
228 {0x0c46, 64, { 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x84, 0xf0, 0x90, 0x7f, 0x98, 0xf0,
229 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xcb, 0xf0, 0x75, 0x98, 0x40,
230 0x43, 0xa8, 0x10, 0x90, 0x7f, 0xde, 0x74, 0x1f, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x0f, 0xf0, 0xd2,
231 0x04, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22}},
232 {0x0c86, 64, { 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82,
233 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0,
234 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74,
235 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3}},
236 {0x0cc6, 64, { 0xa3, 0xa3, 0x80, 0xdf, 0xe4, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x93, 0xf0,
237 0x90, 0x7f, 0x9d, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x97, 0xe0, 0x44, 0x42, 0xf0, 0x90, 0x7f,
238 0x9c, 0x74, 0x10, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xbe, 0xf0, 0x30,
239 0x16, 0x04, 0x7f, 0x80, 0x80, 0x02, 0x7f, 0x00, 0x90, 0x7f, 0x97, 0xef, 0xf0, 0xe4, 0x90}},
240 {0x0d06, 64, { 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0xf0, 0x90, 0x7f, 0x98, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0,
241 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0,
242 0x08, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0x12, 0x0b, 0xba, 0xd0, 0xd0, 0xd0,
243 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0}},
244 {0x0d46, 64, { 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90, 0x7f, 0xc4,
245 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0,
246 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
248 {0x0d86, 64, { 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0xff, 0xff, 0x40, 0xcd, 0x06, 0x1c, 0x01, 0x01, 0x00, 0x01, 0x02,
249 0x00, 0x02, 0x09, 0x02, 0x43, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, 0x00, 0x07,
250 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40,
251 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00}},
252 {0x0dc6, 64, { 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05,
253 0x84, 0x02, 0x40, 0x00, 0x01, 0x04, 0x03, 0x09, 0x04, 0x10, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79,
254 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x2e, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79,
255 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x50, 0x00}},
256 {0x0e06, 64, { 0x53, 0x00, 0x48, 0x00, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2d, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72,
257 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x22, 0x03, 0x55, 0x00, 0x53, 0x00, 0x41, 0x00, 0x2d,
258 0x00, 0x35, 0x00, 0x33, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32, 0x00, 0x61,
259 0x00, 0x70, 0x00, 0x72, 0x00, 0x32, 0x00, 0x36, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xc0, 0x83}},
260 {0x0e46, 64, { 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
261 0x74, 0x02, 0xf0, 0xd2, 0x06, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0,
262 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86,
263 0x00, 0xd2, 0x17, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0}},
264 {0x0e86, 64, { 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0,
265 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x19, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
266 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32,
267 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00}},
268 {0x0ec6, 64, { 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82,
269 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x12, 0x0c, 0xca, 0x12, 0x0f, 0xb3, 0x90, 0x7f, 0xd6, 0xe0, 0x30,
270 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x0d, 0x7e, 0x00, 0x12, 0x00, 0x03, 0x90, 0x7f, 0xd6,
271 0xe0, 0x54, 0xfe, 0xf0, 0x12, 0x0c, 0x24, 0x22, 0x00, 0x02, 0x0e, 0x69, 0x00, 0x02, 0x0e}},
272 {0x0f06, 64, { 0x42, 0x00, 0x02, 0x0d, 0x45, 0x00, 0x02, 0x0e, 0x90, 0x00, 0x02, 0x0f, 0x10, 0x00, 0x02, 0x0f, 0x14,
273 0x00, 0x02, 0x0d, 0x12, 0x00, 0x02, 0x0f, 0x1c, 0x00, 0x02, 0x0e, 0xb7, 0x00, 0x02, 0x0f, 0x24,
274 0x00, 0x02, 0x0f, 0x33, 0x00, 0x02, 0x0f, 0x2c, 0x00, 0x02, 0x0f, 0x58, 0xc0, 0xe0, 0xc0, 0x83,
275 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53, 0x91, 0xef, 0x90}},
276 {0x0f46, 64, { 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0,
277 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00,
278 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0,
279 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44}},
280 {0x0f86, 61, { 0x08, 0xf0, 0x30, 0x1a, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x00, 0x03, 0x90,
281 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90,
282 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0,
283 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22}},
284 {0xffff, 0, {0x00}}
285};
286
diff --git a/drivers/usb/serial/keyspan_pda.S b/drivers/usb/serial/keyspan_pda.S
new file mode 100644
index 000000000000..418fe69aa5e0
--- /dev/null
+++ b/drivers/usb/serial/keyspan_pda.S
@@ -0,0 +1,1124 @@
1/* $Id: loop.s,v 1.23 2000/03/20 09:49:06 warner Exp $
2 *
3 * Firmware for the Keyspan PDA Serial Adapter, a USB serial port based on
4 * the EzUSB microcontroller.
5 *
6 * (C) Copyright 2000 Brian Warner <warner@lothar.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * "Keyspan PDA Serial Adapter" is probably a copyright of Keyspan, the
14 * company.
15 *
16 * This serial adapter is basically an EzUSB chip and an RS-232 line driver
17 * in a little widget that has a DB-9 on one end and a USB plug on the other.
18 * It uses the EzUSB's internal UART0 (using the pins from Port C) and timer2
19 * as a baud-rate generator. The wiring is:
20 * PC0/RxD0 <- rxd (DB9 pin 2) PC4 <- dsr pin 6
21 * PC1/TxD0 -> txd pin 3 PC5 <- ri pin 9
22 * PC2 -> rts pin 7 PC6 <- dcd pin 1
23 * PC3 <- cts pin 8 PC7 -> dtr pin 4
24 * PB1 -> line driver standby
25 *
26 * The EzUSB register constants below come from their excellent documentation
27 * and sample code (which used to be available at www.anchorchips.com, but
28 * that has now been absorbed into Cypress' site and the CD-ROM contents
29 * don't appear to be available online anymore). If we get multiple
30 * EzUSB-based drivers into the kernel, it might be useful to pull them out
31 * into a separate .h file.
32 *
33 * THEORY OF OPERATION:
34 *
35 * There are two 256-byte ring buffers, one for tx, one for rx.
36 *
37 * EP2out is pure tx data. When it appears, the data is copied into the tx
38 * ring and serial transmission is started if it wasn't already running. The
39 * "tx buffer empty" interrupt may kick off another character if the ring
40 * still has data. If the host is tx-blocked because the ring filled up,
41 * it will request a "tx unthrottle" interrupt. If sending a serial character
42 * empties the ring below the desired threshold, we set a bit that will send
43 * up the tx unthrottle message as soon as the rx buffer becomes free.
44 *
45 * EP2in (interrupt) is used to send both rx chars and rx status messages
46 * (only "tx unthrottle" at this time) back up to the host. The first byte
47 * of the rx message indicates data (0) or status msg (1). Status messages
48 * are sent before any data.
49 *
50 * Incoming serial characters are put into the rx ring by the serial
51 * interrupt, and the EP2in buffer sent if it wasn't already in transit.
52 * When the EP2in buffer returns, the interrupt prompts us to send more
53 * rx chars (or status messages) if they are pending.
54 *
55 * Device control happens through "vendor specific" control messages on EP0.
56 * All messages are destined for the "Interface" (with the index always 0,
57 * so that if their two-port device might someday use similar firmware, we
58 * can use index=1 to refer to the second port). The messages defined are:
59 *
60 * bRequest = 0 : set baud/bits/parity
61 * 1 : unused
62 * 2 : reserved for setting HW flow control (CTSRTS)
63 * 3 : get/set "modem info" (pin states: DTR, RTS, DCD, RI, etc)
64 * 4 : set break (on/off)
65 * 5 : reserved for requesting interrupts on pin state change
66 * 6 : query buffer room or chars in tx buffer
67 * 7 : request tx unthrottle interrupt
68 *
69 * The host-side driver is set to recognize the device ID values stashed in
70 * serial EEPROM (0x06cd, 0x0103), program this firmware into place, then
71 * start it running. This firmware will use EzUSB's "renumeration" trick by
72 * simulating a bus disconnect, then reconnect with a different device ID
73 * (encoded in the desc_device descriptor below). The host driver then
74 * recognizes the new device ID and glues it to the real serial driver code.
75 *
76 * USEFUL DOCS:
77 * EzUSB Technical Reference Manual: <http://www.anchorchips.com>
78 * 8051 manuals: everywhere, but try www.dalsemi.com because the EzUSB is
79 * basically the Dallas enhanced 8051 code. Remember that the EzUSB IO ports
80 * use totally different registers!
81 * USB 1.1 spec: www.usb.org
82 *
83 * HOW TO BUILD:
84 * gcc -x assembler-with-cpp -P -E -o keyspan_pda.asm keyspan_pda.s
85 * as31 -l keyspan_pda.asm
86 * mv keyspan_pda.obj keyspan_pda.hex
87 * perl ezusb_convert.pl keyspan_pda < keyspan_pda.hex > keyspan_pda_fw.h
88 * Get as31 from <http://www.pjrc.com/tech/8051/index.html>, and hack on it
89 * a bit to make it build.
90 *
91 * THANKS:
92 * Greg Kroah-Hartman, for coordinating the whole usb-serial thing.
93 * AnchorChips, for making such an incredibly useful little microcontroller.
94 * KeySpan, for making a handy, cheap ($40) widget that was so easy to take
95 * apart and trace with an ohmmeter.
96 *
97 * TODO:
98 * lots. grep for TODO. Interrupt safety needs stress-testing. Better flow
99 * control. Interrupting host upon change in DCD, etc, counting transitions.
100 * Need to find a safe device id to use (the one used by the Keyspan firmware
101 * under Windows would be ideal.. can anyone figure out what it is?). Parity.
102 * More baud rates. Oh, and the string-descriptor-length silicon bug
103 * workaround should be implemented, but I'm lazy, and the consequence is
104 * that the device name strings that show up in your kernel log will have
105 * lots of trailing binary garbage in them (appears as ????). Device strings
106 * should be made more accurate.
107 *
108 * Questions, bugs, patches to Brian.
109 *
110 * -Brian Warner <warner@lothar.com>
111 *
112 */
113
114#define HIGH(x) (((x) & 0xff00) / 256)
115#define LOW(x) ((x) & 0xff)
116
117#define dpl1 0x84
118#define dph1 0x85
119#define dps 0x86
120
121;;; our bit assignments
122#define TX_RUNNING 0
123#define DO_TX_UNTHROTTLE 1
124
125 ;; stack from 0x60 to 0x7f: should really set SP to 0x60-1, not 0x60
126#define STACK #0x60-1
127
128#define EXIF 0x91
129#define EIE 0xe8
130 .flag EUSB, EIE.0
131 .flag ES0, IE.4
132
133#define EP0CS #0x7fb4
134#define EP0STALLbit #0x01
135#define IN0BUF #0x7f00
136#define IN0BC #0x7fb5
137#define OUT0BUF #0x7ec0
138#define OUT0BC #0x7fc5
139#define IN2BUF #0x7e00
140#define IN2BC #0x7fb9
141#define IN2CS #0x7fb8
142#define OUT2BC #0x7fc9
143#define OUT2CS #0x7fc8
144#define OUT2BUF #0x7dc0
145#define IN4BUF #0x7d00
146#define IN4BC #0x7fbd
147#define IN4CS #0x7fbc
148#define OEB #0x7f9d
149#define OUTB #0x7f97
150#define OEC #0x7f9e
151#define OUTC #0x7f98
152#define PINSC #0x7f9b
153#define PORTCCFG #0x7f95
154#define IN07IRQ #0x7fa9
155#define OUT07IRQ #0x7faa
156#define IN07IEN #0x7fac
157#define OUT07IEN #0x7fad
158#define USBIRQ #0x7fab
159#define USBIEN #0x7fae
160#define USBBAV #0x7faf
161#define USBCS #0x7fd6
162#define SUDPTRH #0x7fd4
163#define SUDPTRL #0x7fd5
164#define SETUPDAT #0x7fe8
165
166 ;; usb interrupt : enable is EIE.0 (0xe8), flag is EXIF.4 (0x91)
167
168 .org 0
169 ljmp start
170 ;; interrupt vectors
171 .org 23H
172 ljmp serial_int
173 .byte 0
174
175 .org 43H
176 ljmp USB_Jump_Table
177 .byte 0 ; filled in by the USB core
178
179;;; local variables. These are not initialized properly: do it by hand.
180 .org 30H
181rx_ring_in: .byte 0
182rx_ring_out: .byte 0
183tx_ring_in: .byte 0
184tx_ring_out: .byte 0
185tx_unthrottle_threshold: .byte 0
186
187 .org 0x100H ; wants to be on a page boundary
188USB_Jump_Table:
189 ljmp ISR_Sudav ; Setup Data Available
190 .byte 0
191 ljmp 0 ; Start of Frame
192 .byte 0
193 ljmp 0 ; Setup Data Loading
194 .byte 0
195 ljmp 0 ; Global Suspend
196 .byte 0
197 ljmp 0 ; USB Reset
198 .byte 0
199 ljmp 0 ; Reserved
200 .byte 0
201 ljmp 0 ; End Point 0 In
202 .byte 0
203 ljmp 0 ; End Point 0 Out
204 .byte 0
205 ljmp 0 ; End Point 1 In
206 .byte 0
207 ljmp 0 ; End Point 1 Out
208 .byte 0
209 ljmp ISR_Ep2in
210 .byte 0
211 ljmp ISR_Ep2out
212 .byte 0
213
214
215 .org 0x200
216
217start: mov SP,STACK-1 ; set stack
218 ;; clear local variables
219 clr a
220 mov tx_ring_in, a
221 mov tx_ring_out, a
222 mov rx_ring_in, a
223 mov rx_ring_out, a
224 mov tx_unthrottle_threshold, a
225 clr TX_RUNNING
226 clr DO_TX_UNTHROTTLE
227
228 ;; clear fifo with "fe"
229 mov r1, 0
230 mov a, #0xfe
231 mov dptr, #tx_ring
232clear_tx_ring_loop:
233 movx @dptr, a
234 inc dptr
235 djnz r1, clear_tx_ring_loop
236
237 mov a, #0xfd
238 mov dptr, #rx_ring
239clear_rx_ring_loop:
240 movx @dptr, a
241 inc dptr
242 djnz r1, clear_rx_ring_loop
243
244;;; turn on the RS-232 driver chip (bring the STANDBY pin low)
245 ;; set OEB.1
246 mov a, #02H
247 mov dptr,OEB
248 movx @dptr,a
249 ;; clear PB1
250 mov a, #00H
251 mov dptr,OUTB
252 movx @dptr,a
253 ;; set OEC.[127]
254 mov a, #0x86
255 mov dptr,OEC
256 movx @dptr,a
257 ;; set PORTCCFG.[01] to route TxD0,RxD0 to serial port
258 mov dptr, PORTCCFG
259 mov a, #0x03
260 movx @dptr, a
261
262 ;; set up interrupts, autovectoring
263 mov dptr, USBBAV
264 movx a,@dptr
265 setb acc.0 ; AVEN bit to 0
266 movx @dptr, a
267
268 mov a,#0x01 ; enable SUDAV: setup data available (for ep0)
269 mov dptr, USBIRQ
270 movx @dptr, a ; clear SUDAVI
271 mov dptr, USBIEN
272 movx @dptr, a
273
274 mov dptr, IN07IEN
275 mov a,#0x04 ; enable IN2 int
276 movx @dptr, a
277
278 mov dptr, OUT07IEN
279 mov a,#0x04 ; enable OUT2 int
280 movx @dptr, a
281 mov dptr, OUT2BC
282 movx @dptr, a ; arm OUT2
283
284 mov a, #0x84 ; turn on RTS, DTR
285 mov dptr,OUTC
286 movx @dptr, a
287 ;; setup the serial port. 9600 8N1.
288 mov a,#01010011 ; mode 1, enable rx, clear int
289 mov SCON, a
290 ;; using timer2, in 16-bit baud-rate-generator mode
291 ;; (xtal 12MHz, internal fosc 24MHz)
292 ;; RCAP2H,RCAP2L = 65536 - fosc/(32*baud)
293 ;; 57600: 0xFFF2.F, say 0xFFF3
294 ;; 9600: 0xFFB1.E, say 0xFFB2
295 ;; 300: 0xF63C
296#define BAUD 9600
297#define BAUD_TIMEOUT(rate) (65536 - (24 * 1000 * 1000) / (32 * rate))
298#define BAUD_HIGH(rate) HIGH(BAUD_TIMEOUT(rate))
299#define BAUD_LOW(rate) LOW(BAUD_TIMEOUT(rate))
300
301 mov T2CON, #030h ; rclk=1,tclk=1,cp=0,tr2=0(enable later)
302 mov r3, #5
303 acall set_baud
304 setb TR2
305 mov SCON, #050h
306
307#if 0
308 mov r1, #0x40
309 mov a, #0x41
310send:
311 mov SBUF, a
312 inc a
313 anl a, #0x3F
314 orl a, #0x40
315; xrl a, #0x02
316wait1:
317 jnb TI, wait1
318 clr TI
319 djnz r1, send
320;done: sjmp done
321
322#endif
323
324 setb EUSB
325 setb EA
326 setb ES0
327 ;acall dump_stat
328
329 ;; hey, what say we RENUMERATE! (TRM p.62)
330 mov a, #0
331 mov dps, a
332 mov dptr, USBCS
333 mov a, #0x02 ; DISCON=0, DISCOE=0, RENUM=1
334 movx @dptr, a
335 ;; now presence pin is floating, simulating disconnect. wait 0.5s
336 mov r1, #46
337renum_wait1:
338 mov r2, #0
339renum_wait2:
340 mov r3, #0
341renum_wait3:
342 djnz r3, renum_wait3
343 djnz r2, renum_wait2
344 djnz r1, renum_wait1 ; wait about n*(256^2) 6MHz clocks
345 mov a, #0x06 ; DISCON=0, DISCOE=1, RENUM=1
346 movx @dptr, a
347 ;; we are back online. the host device will now re-query us
348
349
350main: sjmp main
351
352
353
354ISR_Sudav:
355 push dps
356 push dpl
357 push dph
358 push dpl1
359 push dph1
360 push acc
361 mov a,EXIF
362 clr acc.4
363 mov EXIF,a ; clear INT2 first
364 mov dptr, USBIRQ ; clear USB int
365 mov a,#01h
366 movx @dptr,a
367
368 ;; get request type
369 mov dptr, SETUPDAT
370 movx a, @dptr
371 mov r1, a ; r1 = bmRequestType
372 inc dptr
373 movx a, @dptr
374 mov r2, a ; r2 = bRequest
375 inc dptr
376 movx a, @dptr
377 mov r3, a ; r3 = wValueL
378 inc dptr
379 movx a, @dptr
380 mov r4, a ; r4 = wValueH
381
382 ;; main switch on bmRequest.type: standard or vendor
383 mov a, r1
384 anl a, #0x60
385 cjne a, #0x00, setup_bmreq_type_not_standard
386 ;; standard request: now main switch is on bRequest
387 ljmp setup_bmreq_is_standard
388
389setup_bmreq_type_not_standard:
390 ;; a still has bmreq&0x60
391 cjne a, #0x40, setup_bmreq_type_not_vendor
392 ;; Anchor reserves bRequest 0xa0-0xaf, we use small ones
393 ;; switch on bRequest. bmRequest will always be 0x41 or 0xc1
394 cjne r2, #0x00, setup_ctrl_not_00
395 ;; 00 is set baud, wValue[0] has baud rate index
396 lcall set_baud ; index in r3, carry set if error
397 jc setup_bmreq_type_not_standard__do_stall
398 ljmp setup_done_ack
399setup_bmreq_type_not_standard__do_stall:
400 ljmp setup_stall
401setup_ctrl_not_00:
402 cjne r2, #0x01, setup_ctrl_not_01
403 ;; 01 is reserved for set bits (parity). TODO
404 ljmp setup_stall
405setup_ctrl_not_01:
406 cjne r2, #0x02, setup_ctrl_not_02
407 ;; 02 is set HW flow control. TODO
408 ljmp setup_stall
409setup_ctrl_not_02:
410 cjne r2, #0x03, setup_ctrl_not_03
411 ;; 03 is control pins (RTS, DTR).
412 ljmp control_pins ; will jump to setup_done_ack,
413 ; or setup_return_one_byte
414setup_ctrl_not_03:
415 cjne r2, #0x04, setup_ctrl_not_04
416 ;; 04 is send break (really "turn break on/off"). TODO
417 cjne r3, #0x00, setup_ctrl_do_break_on
418 ;; do break off: restore PORTCCFG.1 to reconnect TxD0 to serial port
419 mov dptr, PORTCCFG
420 movx a, @dptr
421 orl a, #0x02
422 movx @dptr, a
423 ljmp setup_done_ack
424setup_ctrl_do_break_on:
425 ;; do break on: clear PORTCCFG.0, set TxD high(?) (b1 low)
426 mov dptr, OUTC
427 movx a, @dptr
428 anl a, #0xfd ; ~0x02
429 movx @dptr, a
430 mov dptr, PORTCCFG
431 movx a, @dptr
432 anl a, #0xfd ; ~0x02
433 movx @dptr, a
434 ljmp setup_done_ack
435setup_ctrl_not_04:
436 cjne r2, #0x05, setup_ctrl_not_05
437 ;; 05 is set desired interrupt bitmap. TODO
438 ljmp setup_stall
439setup_ctrl_not_05:
440 cjne r2, #0x06, setup_ctrl_not_06
441 ;; 06 is query room
442 cjne r3, #0x00, setup_ctrl_06_not_00
443 ;; 06, wValue[0]=0 is query write_room
444 mov a, tx_ring_out
445 setb c
446 subb a, tx_ring_in ; out-1-in = 255 - (in-out)
447 ljmp setup_return_one_byte
448setup_ctrl_06_not_00:
449 cjne r3, #0x01, setup_ctrl_06_not_01
450 ;; 06, wValue[0]=1 is query chars_in_buffer
451 mov a, tx_ring_in
452 clr c
453 subb a, tx_ring_out ; in-out
454 ljmp setup_return_one_byte
455setup_ctrl_06_not_01:
456 ljmp setup_stall
457setup_ctrl_not_06:
458 cjne r2, #0x07, setup_ctrl_not_07
459 ;; 07 is request tx unthrottle interrupt
460 mov tx_unthrottle_threshold, r3; wValue[0] is threshold value
461 ljmp setup_done_ack
462setup_ctrl_not_07:
463 ljmp setup_stall
464
465setup_bmreq_type_not_vendor:
466 ljmp setup_stall
467
468
469setup_bmreq_is_standard:
470 cjne r2, #0x00, setup_breq_not_00
471 ;; 00: Get_Status (sub-switch on bmRequestType: device, ep, int)
472 cjne r1, #0x80, setup_Get_Status_not_device
473 ;; Get_Status(device)
474 ;; are we self-powered? no. can we do remote wakeup? no
475 ;; so return two zero bytes. This is reusable
476setup_return_two_zero_bytes:
477 mov dptr, IN0BUF
478 clr a
479 movx @dptr, a
480 inc dptr
481 movx @dptr, a
482 mov dptr, IN0BC
483 mov a, #2
484 movx @dptr, a
485 ljmp setup_done_ack
486setup_Get_Status_not_device:
487 cjne r1, #0x82, setup_Get_Status_not_endpoint
488 ;; Get_Status(endpoint)
489 ;; must get stall bit for ep[wIndexL], return two bytes, bit in lsb 0
490 ;; for now: cheat. TODO
491 sjmp setup_return_two_zero_bytes
492setup_Get_Status_not_endpoint:
493 cjne r1, #0x81, setup_Get_Status_not_interface
494 ;; Get_Status(interface): return two zeros
495 sjmp setup_return_two_zero_bytes
496setup_Get_Status_not_interface:
497 ljmp setup_stall
498
499setup_breq_not_00:
500 cjne r2, #0x01, setup_breq_not_01
501 ;; 01: Clear_Feature (sub-switch on wValueL: stall, remote wakeup)
502 cjne r3, #0x00, setup_Clear_Feature_not_stall
503 ;; Clear_Feature(stall). should clear a stall bit. TODO
504 ljmp setup_stall
505setup_Clear_Feature_not_stall:
506 cjne r3, #0x01, setup_Clear_Feature_not_rwake
507 ;; Clear_Feature(remote wakeup). ignored.
508 ljmp setup_done_ack
509setup_Clear_Feature_not_rwake:
510 ljmp setup_stall
511
512setup_breq_not_01:
513 cjne r2, #0x03, setup_breq_not_03
514 ;; 03: Set_Feature (sub-switch on wValueL: stall, remote wakeup)
515 cjne r3, #0x00, setup_Set_Feature_not_stall
516 ;; Set_Feature(stall). Should set a stall bit. TODO
517 ljmp setup_stall
518setup_Set_Feature_not_stall:
519 cjne r3, #0x01, setup_Set_Feature_not_rwake
520 ;; Set_Feature(remote wakeup). ignored.
521 ljmp setup_done_ack
522setup_Set_Feature_not_rwake:
523 ljmp setup_stall
524
525setup_breq_not_03:
526 cjne r2, #0x06, setup_breq_not_06
527 ;; 06: Get_Descriptor (s-switch on wValueH: dev, config[n], string[n])
528 cjne r4, #0x01, setup_Get_Descriptor_not_device
529 ;; Get_Descriptor(device)
530 mov dptr, SUDPTRH
531 mov a, #HIGH(desc_device)
532 movx @dptr, a
533 mov dptr, SUDPTRL
534 mov a, #LOW(desc_device)
535 movx @dptr, a
536 ljmp setup_done_ack
537setup_Get_Descriptor_not_device:
538 cjne r4, #0x02, setup_Get_Descriptor_not_config
539 ;; Get_Descriptor(config[n])
540 cjne r3, #0x00, setup_stall; only handle n==0
541 ;; Get_Descriptor(config[0])
542 mov dptr, SUDPTRH
543 mov a, #HIGH(desc_config1)
544 movx @dptr, a
545 mov dptr, SUDPTRL
546 mov a, #LOW(desc_config1)
547 movx @dptr, a
548 ljmp setup_done_ack
549setup_Get_Descriptor_not_config:
550 cjne r4, #0x03, setup_Get_Descriptor_not_string
551 ;; Get_Descriptor(string[wValueL])
552 ;; if (wValueL >= maxstrings) stall
553 mov a, #((desc_strings_end-desc_strings)/2)
554 clr c
555 subb a,r3 ; a=4, r3 = 0..3 . if a<=0 then stall
556 jc setup_stall
557 jz setup_stall
558 mov a, r3
559 add a, r3 ; a = 2*wValueL
560 mov dptr, #desc_strings
561 add a, dpl
562 mov dpl, a
563 mov a, #0
564 addc a, dph
565 mov dph, a ; dph = desc_strings[a]. big endian! (handy)
566 ;; it looks like my adapter uses a revision of the EZUSB that
567 ;; contains "rev D errata number 8", as hinted in the EzUSB example
568 ;; code. I cannot find an actual errata description on the Cypress
569 ;; web site, but from the example code it looks like this bug causes
570 ;; the length of string descriptors to be read incorrectly, possibly
571 ;; sending back more characters than the descriptor has. The workaround
572 ;; is to manually send out all of the data. The consequence of not
573 ;; using the workaround is that the strings gathered by the kernel
574 ;; driver are too long and are filled with trailing garbage (including
575 ;; leftover strings). Writing this out by hand is a nuisance, so for
576 ;; now I will just live with the bug.
577 movx a, @dptr
578 mov r1, a
579 inc dptr
580 movx a, @dptr
581 mov r2, a
582 mov dptr, SUDPTRH
583 mov a, r1
584 movx @dptr, a
585 mov dptr, SUDPTRL
586 mov a, r2
587 movx @dptr, a
588 ;; done
589 ljmp setup_done_ack
590
591setup_Get_Descriptor_not_string:
592 ljmp setup_stall
593
594setup_breq_not_06:
595 cjne r2, #0x08, setup_breq_not_08
596 ;; Get_Configuration. always 1. return one byte.
597 ;; this is reusable
598 mov a, #1
599setup_return_one_byte:
600 mov dptr, IN0BUF
601 movx @dptr, a
602 mov a, #1
603 mov dptr, IN0BC
604 movx @dptr, a
605 ljmp setup_done_ack
606setup_breq_not_08:
607 cjne r2, #0x09, setup_breq_not_09
608 ;; 09: Set_Configuration. ignored.
609 ljmp setup_done_ack
610setup_breq_not_09:
611 cjne r2, #0x0a, setup_breq_not_0a
612 ;; 0a: Get_Interface. get the current altsetting for int[wIndexL]
613 ;; since we only have one interface, ignore wIndexL, return a 0
614 mov a, #0
615 ljmp setup_return_one_byte
616setup_breq_not_0a:
617 cjne r2, #0x0b, setup_breq_not_0b
618 ;; 0b: Set_Interface. set altsetting for interface[wIndexL]. ignored
619 ljmp setup_done_ack
620setup_breq_not_0b:
621 ljmp setup_stall
622
623
624setup_done_ack:
625 ;; now clear HSNAK
626 mov dptr, EP0CS
627 mov a, #0x02
628 movx @dptr, a
629 sjmp setup_done
630setup_stall:
631 ;; unhandled. STALL
632 ;EP0CS |= bmEPSTALL
633 mov dptr, EP0CS
634 movx a, @dptr
635 orl a, EP0STALLbit
636 movx @dptr, a
637 sjmp setup_done
638
639setup_done:
640 pop acc
641 pop dph1
642 pop dpl1
643 pop dph
644 pop dpl
645 pop dps
646 reti
647
648;;; ==============================================================
649
650set_baud: ; baud index in r3
651 ;; verify a < 10
652 mov a, r3
653 jb ACC.7, set_baud__badbaud
654 clr c
655 subb a, #10
656 jnc set_baud__badbaud
657 mov a, r3
658 rl a ; a = index*2
659 add a, #LOW(baud_table)
660 mov dpl, a
661 mov a, #HIGH(baud_table)
662 addc a, #0
663 mov dph, a
664 ;; TODO: shut down xmit/receive
665 ;; TODO: wait for current xmit char to leave
666 ;; TODO: shut down timer to avoid partial-char glitch
667 movx a,@dptr ; BAUD_HIGH
668 mov RCAP2H, a
669 mov TH2, a
670 inc dptr
671 movx a,@dptr ; BAUD_LOW
672 mov RCAP2L, a
673 mov TL2, a
674 ;; TODO: restart xmit/receive
675 ;; TODO: reenable interrupts, resume tx if pending
676 clr c ; c=0: success
677 ret
678set_baud__badbaud:
679 setb c ; c=1: failure
680 ret
681
682;;; ==================================================
683control_pins:
684 cjne r1, #0x41, control_pins_in
685control_pins_out:
686 mov a, r3 ; wValue[0] holds new bits: b7 is new DTR, b2 is new RTS
687 xrl a, #0xff ; 1 means active, 0V, +12V ?
688 anl a, #0x84
689 mov r3, a
690 mov dptr, OUTC
691 movx a, @dptr ; only change bits 7 and 2
692 anl a, #0x7b ; ~0x84
693 orl a, r3
694 movx @dptr, a ; other pins are inputs, bits ignored
695 ljmp setup_done_ack
696control_pins_in:
697 mov dptr, PINSC
698 movx a, @dptr
699 xrl a, #0xff
700 ljmp setup_return_one_byte
701
702;;; ========================================
703
704ISR_Ep2in:
705 push dps
706 push dpl
707 push dph
708 push dpl1
709 push dph1
710 push acc
711 mov a,EXIF
712 clr acc.4
713 mov EXIF,a ; clear INT2 first
714 mov dptr, IN07IRQ ; clear USB int
715 mov a,#04h
716 movx @dptr,a
717
718 ;; do stuff
719 lcall start_in
720
721 pop acc
722 pop dph1
723 pop dpl1
724 pop dph
725 pop dpl
726 pop dps
727 reti
728
729ISR_Ep2out:
730 push dps
731 push dpl
732 push dph
733 push dpl1
734 push dph1
735 push acc
736 mov a,EXIF
737 clr acc.4
738 mov EXIF,a ; clear INT2 first
739 mov dptr, OUT07IRQ ; clear USB int
740 mov a,#04h
741 movx @dptr,a
742
743 ;; do stuff
744
745 ;; copy data into buffer. for now, assume we will have enough space
746 mov dptr, OUT2BC ; get byte count
747 movx a,@dptr
748 mov r1, a
749 clr a
750 mov dps, a
751 mov dptr, OUT2BUF ; load DPTR0 with source
752 mov dph1, #HIGH(tx_ring) ; load DPTR1 with target
753 mov dpl1, tx_ring_in
754OUT_loop:
755 movx a,@dptr ; read
756 inc dps ; switch to DPTR1: target
757 inc dpl1 ; target = tx_ring_in+1
758 movx @dptr,a ; store
759 mov a,dpl1
760 cjne a, tx_ring_out, OUT_no_overflow
761 sjmp OUT_overflow
762OUT_no_overflow:
763 inc tx_ring_in ; tx_ring_in++
764 inc dps ; switch to DPTR0: source
765 inc dptr
766 djnz r1, OUT_loop
767 sjmp OUT_done
768OUT_overflow:
769 ;; signal overflow
770 ;; fall through
771OUT_done:
772 ;; ack
773 mov dptr,OUT2BC
774 movx @dptr,a
775
776 ;; start tx
777 acall maybe_start_tx
778 ;acall dump_stat
779
780 pop acc
781 pop dph1
782 pop dpl1
783 pop dph
784 pop dpl
785 pop dps
786 reti
787
788dump_stat:
789 ;; fill in EP4in with a debugging message:
790 ;; tx_ring_in, tx_ring_out, rx_ring_in, rx_ring_out
791 ;; tx_active
792 ;; tx_ring[0..15]
793 ;; 0xfc
794 ;; rx_ring[0..15]
795 clr a
796 mov dps, a
797
798 mov dptr, IN4CS
799 movx a, @dptr
800 jb acc.1, dump_stat__done; busy: cannot dump, old one still pending
801 mov dptr, IN4BUF
802
803 mov a, tx_ring_in
804 movx @dptr, a
805 inc dptr
806 mov a, tx_ring_out
807 movx @dptr, a
808 inc dptr
809
810 mov a, rx_ring_in
811 movx @dptr, a
812 inc dptr
813 mov a, rx_ring_out
814 movx @dptr, a
815 inc dptr
816
817 clr a
818 jnb TX_RUNNING, dump_stat__no_tx_running
819 inc a
820dump_stat__no_tx_running:
821 movx @dptr, a
822 inc dptr
823 ;; tx_ring[0..15]
824 inc dps
825 mov dptr, #tx_ring ; DPTR1: source
826 mov r1, #16
827dump_stat__tx_ring_loop:
828 movx a, @dptr
829 inc dptr
830 inc dps
831 movx @dptr, a
832 inc dptr
833 inc dps
834 djnz r1, dump_stat__tx_ring_loop
835 inc dps
836
837 mov a, #0xfc
838 movx @dptr, a
839 inc dptr
840
841 ;; rx_ring[0..15]
842 inc dps
843 mov dptr, #rx_ring ; DPTR1: source
844 mov r1, #16
845dump_stat__rx_ring_loop:
846 movx a, @dptr
847 inc dptr
848 inc dps
849 movx @dptr, a
850 inc dptr
851 inc dps
852 djnz r1, dump_stat__rx_ring_loop
853
854 ;; now send it
855 clr a
856 mov dps, a
857 mov dptr, IN4BC
858 mov a, #38
859 movx @dptr, a
860dump_stat__done:
861 ret
862
863;;; ============================================================
864
865maybe_start_tx:
866 ;; make sure the tx process is running.
867 jb TX_RUNNING, start_tx_done
868start_tx:
869 ;; is there work to be done?
870 mov a, tx_ring_in
871 cjne a,tx_ring_out, start_tx__work
872 ret ; no work
873start_tx__work:
874 ;; tx was not running. send the first character, setup the TI int
875 inc tx_ring_out ; [++tx_ring_out]
876 mov dph, #HIGH(tx_ring)
877 mov dpl, tx_ring_out
878 movx a, @dptr
879 mov sbuf, a
880 setb TX_RUNNING
881start_tx_done:
882 ;; can we unthrottle the host tx process?
883 ;; step 1: do we care?
884 mov a, #0
885 cjne a, tx_unthrottle_threshold, start_tx__maybe_unthrottle_tx
886 ;; nope
887start_tx_really_done:
888 ret
889start_tx__maybe_unthrottle_tx:
890 ;; step 2: is there now room?
891 mov a, tx_ring_out
892 setb c
893 subb a, tx_ring_in
894 ;; a is now write_room. If thresh >= a, we can unthrottle
895 clr c
896 subb a, tx_unthrottle_threshold
897 jc start_tx_really_done ; nope
898 ;; yes, we can unthrottle. remove the threshold and mark a request
899 mov tx_unthrottle_threshold, #0
900 setb DO_TX_UNTHROTTLE
901 ;; prod rx, which will actually send the message when in2 becomes free
902 ljmp start_in
903
904
905serial_int:
906 push dps
907 push dpl
908 push dph
909 push dpl1
910 push dph1
911 push acc
912 jnb TI, serial_int__not_tx
913 ;; tx finished. send another character if we have one
914 clr TI ; clear int
915 clr TX_RUNNING
916 lcall start_tx
917serial_int__not_tx:
918 jnb RI, serial_int__not_rx
919 lcall get_rx_char
920 clr RI ; clear int
921serial_int__not_rx:
922 ;; return
923 pop acc
924 pop dph1
925 pop dpl1
926 pop dph
927 pop dpl
928 pop dps
929 reti
930
931get_rx_char:
932 mov dph, #HIGH(rx_ring)
933 mov dpl, rx_ring_in
934 inc dpl ; target = rx_ring_in+1
935 mov a, sbuf
936 movx @dptr, a
937 ;; check for overflow before incrementing rx_ring_in
938 mov a, dpl
939 cjne a, rx_ring_out, get_rx_char__no_overflow
940 ;; signal overflow
941 ret
942get_rx_char__no_overflow:
943 inc rx_ring_in
944 ;; kick off USB INpipe
945 acall start_in
946 ret
947
948start_in:
949 ;; check if the inpipe is already running.
950 mov dptr, IN2CS
951 movx a, @dptr
952 jb acc.1, start_in__done; int will handle it
953 jb DO_TX_UNTHROTTLE, start_in__do_tx_unthrottle
954 ;; see if there is any work to do. a serial interrupt might occur
955 ;; during this sequence?
956 mov a, rx_ring_in
957 cjne a, rx_ring_out, start_in__have_work
958 ret ; nope
959start_in__have_work:
960 ;; now copy as much data as possible into the pipe. 63 bytes max.
961 clr a
962 mov dps, a
963 mov dph, #HIGH(rx_ring) ; load DPTR0 with source
964 inc dps
965 mov dptr, IN2BUF ; load DPTR1 with target
966 movx @dptr, a ; in[0] signals that rest of IN is rx data
967 inc dptr
968 inc dps
969 ;; loop until we run out of data, or we have copied 64 bytes
970 mov r1, #1 ; INbuf size counter
971start_in__loop:
972 mov a, rx_ring_in
973 cjne a, rx_ring_out, start_inlocal_irq_enablell_copying
974 sjmp start_in__kick
975start_inlocal_irq_enablell_copying:
976 inc rx_ring_out
977 mov dpl, rx_ring_out
978 movx a, @dptr
979 inc dps
980 movx @dptr, a ; write into IN buffer
981 inc dptr
982 inc dps
983 inc r1
984 cjne r1, #64, start_in__loop; loop
985start_in__kick:
986 ;; either we ran out of data, or we copied 64 bytes. r1 has byte count
987 ;; kick off IN
988 mov dptr, IN2BC
989 mov a, r1
990 jz start_in__done
991 movx @dptr, a
992 ;; done
993start_in__done:
994 ;acall dump_stat
995 ret
996start_in__do_tx_unthrottle:
997 ;; special sequence: send a tx unthrottle message
998 clr DO_TX_UNTHROTTLE
999 clr a
1000 mov dps, a
1001 mov dptr, IN2BUF
1002 mov a, #1
1003 movx @dptr, a
1004 inc dptr
1005 mov a, #2
1006 movx @dptr, a
1007 mov dptr, IN2BC
1008 movx @dptr, a
1009 ret
1010
1011putchar:
1012 clr TI
1013 mov SBUF, a
1014putchar_wait:
1015 jnb TI, putchar_wait
1016 clr TI
1017 ret
1018
1019
1020baud_table: ; baud_high, then baud_low
1021 ;; baud[0]: 110
1022 .byte BAUD_HIGH(110)
1023 .byte BAUD_LOW(110)
1024 ;; baud[1]: 300
1025 .byte BAUD_HIGH(300)
1026 .byte BAUD_LOW(300)
1027 ;; baud[2]: 1200
1028 .byte BAUD_HIGH(1200)
1029 .byte BAUD_LOW(1200)
1030 ;; baud[3]: 2400
1031 .byte BAUD_HIGH(2400)
1032 .byte BAUD_LOW(2400)
1033 ;; baud[4]: 4800
1034 .byte BAUD_HIGH(4800)
1035 .byte BAUD_LOW(4800)
1036 ;; baud[5]: 9600
1037 .byte BAUD_HIGH(9600)
1038 .byte BAUD_LOW(9600)
1039 ;; baud[6]: 19200
1040 .byte BAUD_HIGH(19200)
1041 .byte BAUD_LOW(19200)
1042 ;; baud[7]: 38400
1043 .byte BAUD_HIGH(38400)
1044 .byte BAUD_LOW(38400)
1045 ;; baud[8]: 57600
1046 .byte BAUD_HIGH(57600)
1047 .byte BAUD_LOW(57600)
1048 ;; baud[9]: 115200
1049 .byte BAUD_HIGH(115200)
1050 .byte BAUD_LOW(115200)
1051
1052desc_device:
1053 .byte 0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40
1054 .byte 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab, 1, 2, 3, 0x01
1055;;; The "real" device id, which must match the host driver, is that
1056;;; "0xcd 0x06 0x04 0x01" sequence, which is 0x06cd, 0x0104
1057
1058desc_config1:
1059 .byte 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32
1060 .byte 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00
1061 .byte 0x07, 0x05, 0x82, 0x03, 0x40, 0x00, 0x01
1062 .byte 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00
1063
1064desc_strings:
1065 .word string_langids, string_mfg, string_product, string_serial
1066desc_strings_end:
1067
1068string_langids: .byte string_langids_end-string_langids
1069 .byte 3
1070 .word 0
1071string_langids_end:
1072
1073 ;; sigh. These strings are Unicode, meaning UTF16? 2 bytes each. Now
1074 ;; *that* is a pain in the ass to encode. And they are little-endian
1075 ;; too. Use this perl snippet to get the bytecodes:
1076 /* while (<>) {
1077 @c = split(//);
1078 foreach $c (@c) {
1079 printf("0x%02x, 0x00, ", ord($c));
1080 }
1081 }
1082 */
1083
1084string_mfg: .byte string_mfg_end-string_mfg
1085 .byte 3
1086; .byte "ACME usb widgets"
1087 .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x73, 0x00
1088string_mfg_end:
1089
1090string_product: .byte string_product_end-string_product
1091 .byte 3
1092; .byte "ACME USB serial widget"
1093 .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00
1094string_product_end:
1095
1096string_serial: .byte string_serial_end-string_serial
1097 .byte 3
1098; .byte "47"
1099 .byte 0x34, 0x00, 0x37, 0x00
1100string_serial_end:
1101
1102;;; ring buffer memory
1103 ;; tx_ring_in+1 is where the next input byte will go
1104 ;; [tx_ring_out] has been sent
1105 ;; if tx_ring_in == tx_ring_out, theres no work to do
1106 ;; there are (tx_ring_in - tx_ring_out) chars to be written
1107 ;; dont let _in lap _out
1108 ;; cannot inc if tx_ring_in+1 == tx_ring_out
1109 ;; write [tx_ring_in+1] then tx_ring_in++
1110 ;; if (tx_ring_in+1 == tx_ring_out), overflow
1111 ;; else tx_ring_in++
1112 ;; read/send [tx_ring_out+1], then tx_ring_out++
1113
1114 ;; rx_ring_in works the same way
1115
1116 .org 0x1000
1117tx_ring:
1118 .skip 0x100 ; 256 bytes
1119rx_ring:
1120 .skip 0x100 ; 256 bytes
1121
1122
1123 .END
1124
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
new file mode 100644
index 000000000000..7fd0aa9eccf6
--- /dev/null
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -0,0 +1,894 @@
1/*
2 * USB Keyspan PDA / Xircom / Entregra Converter driver
3 *
4 * Copyright (C) 1999 - 2001 Greg Kroah-Hartman <greg@kroah.com>
5 * Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com>
6 * Copyright (C) 2000 Al Borchers <borchers@steinerpoint.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
14 *
15 * (09/07/2001) gkh
16 * cleaned up the Xircom support. Added ids for Entregra device which is
17 * the same as the Xircom device. Enabled the code to be compiled for
18 * either Xircom or Keyspan devices.
19 *
20 * (08/11/2001) Cristian M. Craciunescu
21 * support for Xircom PGSDB9
22 *
23 * (05/31/2001) gkh
24 * switched from using spinlock to a semaphore, which fixes lots of problems.
25 *
26 * (04/08/2001) gb
27 * Identify version on module load.
28 *
29 * (11/01/2000) Adam J. Richter
30 * usb_device_id table support
31 *
32 * (10/05/2000) gkh
33 * Fixed bug with urb->dev not being set properly, now that the usb
34 * core needs it.
35 *
36 * (08/28/2000) gkh
37 * Added locks for SMP safeness.
38 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
39 * than once.
40 *
41 * (07/20/2000) borchers
42 * - keyspan_pda_write no longer sleeps if it is called on interrupt time;
43 * PPP and the line discipline with stty echo on can call write on
44 * interrupt time and this would cause an oops if write slept
45 * - if keyspan_pda_write is in an interrupt, it will not call
46 * usb_control_msg (which sleeps) to query the room in the device
47 * buffer, it simply uses the current room value it has
48 * - if the urb is busy or if it is throttled keyspan_pda_write just
49 * returns 0, rather than sleeping to wait for this to change; the
50 * write_chan code in n_tty.c will sleep if needed before calling
51 * keyspan_pda_write again
52 * - if the device needs to be unthrottled, write now queues up the
53 * call to usb_control_msg (which sleeps) to unthrottle the device
54 * - the wakeups from keyspan_pda_write_bulk_callback are queued rather
55 * than done directly from the callback to avoid the race in write_chan
56 * - keyspan_pda_chars_in_buffer also indicates its buffer is full if the
57 * urb status is -EINPROGRESS, meaning it cannot write at the moment
58 *
59 * (07/19/2000) gkh
60 * Added module_init and module_exit functions to handle the fact that this
61 * driver is a loadable module now.
62 *
63 * (03/26/2000) gkh
64 * Split driver up into device specific pieces.
65 *
66 */
67
68
69#include <linux/config.h>
70#include <linux/kernel.h>
71#include <linux/errno.h>
72#include <linux/init.h>
73#include <linux/slab.h>
74#include <linux/tty.h>
75#include <linux/tty_driver.h>
76#include <linux/tty_flip.h>
77#include <linux/module.h>
78#include <linux/spinlock.h>
79#include <linux/workqueue.h>
80#include <asm/uaccess.h>
81#include <linux/usb.h>
82
83static int debug;
84
85struct ezusb_hex_record {
86 __u16 address;
87 __u8 data_size;
88 __u8 data[16];
89};
90
91/* make a simple define to handle if we are compiling keyspan_pda or xircom support */
92#if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)
93 #define KEYSPAN
94#else
95 #undef KEYSPAN
96#endif
97#if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)
98 #define XIRCOM
99#else
100 #undef XIRCOM
101#endif
102
103#ifdef KEYSPAN
104#include "keyspan_pda_fw.h"
105#endif
106
107#ifdef XIRCOM
108#include "xircom_pgs_fw.h"
109#endif
110
111#include "usb-serial.h"
112
113/*
114 * Version Information
115 */
116#define DRIVER_VERSION "v1.1"
117#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"
118#define DRIVER_DESC "USB Keyspan PDA Converter driver"
119
120struct keyspan_pda_private {
121 int tx_room;
122 int tx_throttled;
123 struct work_struct wakeup_work;
124 struct work_struct unthrottle_work;
125};
126
127
128#define KEYSPAN_VENDOR_ID 0x06cd
129#define KEYSPAN_PDA_FAKE_ID 0x0103
130#define KEYSPAN_PDA_ID 0x0104 /* no clue */
131
132/* For Xircom PGSDB9 and older Entregra version of the same device */
133#define XIRCOM_VENDOR_ID 0x085a
134#define XIRCOM_FAKE_ID 0x8027
135#define ENTREGRA_VENDOR_ID 0x1645
136#define ENTREGRA_FAKE_ID 0x8093
137
138static struct usb_device_id id_table_combined [] = {
139#ifdef KEYSPAN
140 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
141#endif
142#ifdef XIRCOM
143 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
144 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
145#endif
146 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
147 { } /* Terminating entry */
148};
149
150MODULE_DEVICE_TABLE (usb, id_table_combined);
151
152static struct usb_driver keyspan_pda_driver = {
153 .owner = THIS_MODULE,
154 .name = "keyspan_pda",
155 .probe = usb_serial_probe,
156 .disconnect = usb_serial_disconnect,
157 .id_table = id_table_combined,
158};
159
160static struct usb_device_id id_table_std [] = {
161 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
162 { } /* Terminating entry */
163};
164
165#ifdef KEYSPAN
166static struct usb_device_id id_table_fake [] = {
167 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
168 { } /* Terminating entry */
169};
170#endif
171
172#ifdef XIRCOM
173static struct usb_device_id id_table_fake_xircom [] = {
174 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
175 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
176 { }
177};
178#endif
179
180static void keyspan_pda_wakeup_write( struct usb_serial_port *port )
181{
182
183 struct tty_struct *tty = port->tty;
184
185 /* wake up port processes */
186 wake_up_interruptible( &port->write_wait );
187
188 /* wake up line discipline */
189 tty_wakeup(tty);
190}
191
192static void keyspan_pda_request_unthrottle( struct usb_serial *serial )
193{
194 int result;
195
196 dbg(" request_unthrottle");
197 /* ask the device to tell us when the tx buffer becomes
198 sufficiently empty */
199 result = usb_control_msg(serial->dev,
200 usb_sndctrlpipe(serial->dev, 0),
201 7, /* request_unthrottle */
202 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
203 | USB_DIR_OUT,
204 16, /* value: threshold */
205 0, /* index */
206 NULL,
207 0,
208 2000);
209 if (result < 0)
210 dbg("%s - error %d from usb_control_msg",
211 __FUNCTION__, result);
212}
213
214
215static void keyspan_pda_rx_interrupt (struct urb *urb, struct pt_regs *regs)
216{
217 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
218 struct tty_struct *tty = port->tty;
219 unsigned char *data = urb->transfer_buffer;
220 int i;
221 int status;
222 struct keyspan_pda_private *priv;
223 priv = usb_get_serial_port_data(port);
224
225 switch (urb->status) {
226 case 0:
227 /* success */
228 break;
229 case -ECONNRESET:
230 case -ENOENT:
231 case -ESHUTDOWN:
232 /* this urb is terminated, clean up */
233 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
234 return;
235 default:
236 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
237 goto exit;
238 }
239
240 /* see if the message is data or a status interrupt */
241 switch (data[0]) {
242 case 0:
243 /* rest of message is rx data */
244 if (urb->actual_length) {
245 for (i = 1; i < urb->actual_length ; ++i) {
246 tty_insert_flip_char(tty, data[i], 0);
247 }
248 tty_flip_buffer_push(tty);
249 }
250 break;
251 case 1:
252 /* status interrupt */
253 dbg(" rx int, d1=%d, d2=%d", data[1], data[2]);
254 switch (data[1]) {
255 case 1: /* modemline change */
256 break;
257 case 2: /* tx unthrottle interrupt */
258 priv->tx_throttled = 0;
259 /* queue up a wakeup at scheduler time */
260 schedule_work(&priv->wakeup_work);
261 break;
262 default:
263 break;
264 }
265 break;
266 default:
267 break;
268 }
269
270exit:
271 status = usb_submit_urb (urb, GFP_ATOMIC);
272 if (status)
273 err ("%s - usb_submit_urb failed with result %d",
274 __FUNCTION__, status);
275}
276
277
278static void keyspan_pda_rx_throttle (struct usb_serial_port *port)
279{
280 /* stop receiving characters. We just turn off the URB request, and
281 let chars pile up in the device. If we're doing hardware
282 flowcontrol, the device will signal the other end when its buffer
283 fills up. If we're doing XON/XOFF, this would be a good time to
284 send an XOFF, although it might make sense to foist that off
285 upon the device too. */
286
287 dbg("keyspan_pda_rx_throttle port %d", port->number);
288 usb_kill_urb(port->interrupt_in_urb);
289}
290
291
292static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port)
293{
294 /* just restart the receive interrupt URB */
295 dbg("keyspan_pda_rx_unthrottle port %d", port->number);
296 port->interrupt_in_urb->dev = port->serial->dev;
297 if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
298 dbg(" usb_submit_urb(read urb) failed");
299 return;
300}
301
302
303static int keyspan_pda_setbaud (struct usb_serial *serial, int baud)
304{
305 int rc;
306 int bindex;
307
308 switch(baud) {
309 case 110: bindex = 0; break;
310 case 300: bindex = 1; break;
311 case 1200: bindex = 2; break;
312 case 2400: bindex = 3; break;
313 case 4800: bindex = 4; break;
314 case 9600: bindex = 5; break;
315 case 19200: bindex = 6; break;
316 case 38400: bindex = 7; break;
317 case 57600: bindex = 8; break;
318 case 115200: bindex = 9; break;
319 default: return -EINVAL;
320 }
321
322 /* rather than figure out how to sleep while waiting for this
323 to complete, I just use the "legacy" API. */
324 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
325 0, /* set baud */
326 USB_TYPE_VENDOR
327 | USB_RECIP_INTERFACE
328 | USB_DIR_OUT, /* type */
329 bindex, /* value */
330 0, /* index */
331 NULL, /* &data */
332 0, /* size */
333 2000); /* timeout */
334 return(rc);
335}
336
337
338static void keyspan_pda_break_ctl (struct usb_serial_port *port, int break_state)
339{
340 struct usb_serial *serial = port->serial;
341 int value;
342 int result;
343
344 if (break_state == -1)
345 value = 1; /* start break */
346 else
347 value = 0; /* clear break */
348 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
349 4, /* set break */
350 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
351 value, 0, NULL, 0, 2000);
352 if (result < 0)
353 dbg("%s - error %d from usb_control_msg",
354 __FUNCTION__, result);
355 /* there is something funky about this.. the TCSBRK that 'cu' performs
356 ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4
357 seconds apart, but it feels like the break sent isn't as long as it
358 is on /dev/ttyS0 */
359}
360
361
362static void keyspan_pda_set_termios (struct usb_serial_port *port,
363 struct termios *old_termios)
364{
365 struct usb_serial *serial = port->serial;
366 unsigned int cflag = port->tty->termios->c_cflag;
367
368 /* cflag specifies lots of stuff: number of stop bits, parity, number
369 of data bits, baud. What can the device actually handle?:
370 CSTOPB (1 stop bit or 2)
371 PARENB (parity)
372 CSIZE (5bit .. 8bit)
373 There is minimal hw support for parity (a PSW bit seems to hold the
374 parity of whatever is in the accumulator). The UART either deals
375 with 10 bits (start, 8 data, stop) or 11 bits (start, 8 data,
376 1 special, stop). So, with firmware changes, we could do:
377 8N1: 10 bit
378 8N2: 11 bit, extra bit always (mark?)
379 8[EOMS]1: 11 bit, extra bit is parity
380 7[EOMS]1: 10 bit, b0/b7 is parity
381 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
382
383 HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS
384 bit.
385
386 For now, just do baud. */
387
388 switch (cflag & CBAUD) {
389 /* we could support more values here, just need to calculate
390 the necessary divisors in the firmware. <asm/termbits.h>
391 has the Bnnn constants. */
392 case B110: keyspan_pda_setbaud(serial, 110); break;
393 case B300: keyspan_pda_setbaud(serial, 300); break;
394 case B1200: keyspan_pda_setbaud(serial, 1200); break;
395 case B2400: keyspan_pda_setbaud(serial, 2400); break;
396 case B4800: keyspan_pda_setbaud(serial, 4800); break;
397 case B9600: keyspan_pda_setbaud(serial, 9600); break;
398 case B19200: keyspan_pda_setbaud(serial, 19200); break;
399 case B38400: keyspan_pda_setbaud(serial, 38400); break;
400 case B57600: keyspan_pda_setbaud(serial, 57600); break;
401 case B115200: keyspan_pda_setbaud(serial, 115200); break;
402 default: dbg("can't handle requested baud rate"); break;
403 }
404}
405
406
407/* modem control pins: DTR and RTS are outputs and can be controlled.
408 DCD, RI, DSR, CTS are inputs and can be read. All outputs can also be
409 read. The byte passed is: DTR(b7) DCD RI DSR CTS RTS(b2) unused unused */
410
411static int keyspan_pda_get_modem_info(struct usb_serial *serial,
412 unsigned char *value)
413{
414 int rc;
415 unsigned char data;
416 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
417 3, /* get pins */
418 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
419 0, 0, &data, 1, 2000);
420 if (rc > 0)
421 *value = data;
422 return rc;
423}
424
425
426static int keyspan_pda_set_modem_info(struct usb_serial *serial,
427 unsigned char value)
428{
429 int rc;
430 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
431 3, /* set pins */
432 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,
433 value, 0, NULL, 0, 2000);
434 return rc;
435}
436
437static int keyspan_pda_tiocmget(struct usb_serial_port *port, struct file *file)
438{
439 struct usb_serial *serial = port->serial;
440 int rc;
441 unsigned char status;
442 int value;
443
444 rc = keyspan_pda_get_modem_info(serial, &status);
445 if (rc < 0)
446 return rc;
447 value =
448 ((status & (1<<7)) ? TIOCM_DTR : 0) |
449 ((status & (1<<6)) ? TIOCM_CAR : 0) |
450 ((status & (1<<5)) ? TIOCM_RNG : 0) |
451 ((status & (1<<4)) ? TIOCM_DSR : 0) |
452 ((status & (1<<3)) ? TIOCM_CTS : 0) |
453 ((status & (1<<2)) ? TIOCM_RTS : 0);
454 return value;
455}
456
457static int keyspan_pda_tiocmset(struct usb_serial_port *port, struct file *file,
458 unsigned int set, unsigned int clear)
459{
460 struct usb_serial *serial = port->serial;
461 int rc;
462 unsigned char status;
463
464 rc = keyspan_pda_get_modem_info(serial, &status);
465 if (rc < 0)
466 return rc;
467
468 if (set & TIOCM_RTS)
469 status |= (1<<2);
470 if (set & TIOCM_DTR)
471 status |= (1<<7);
472
473 if (clear & TIOCM_RTS)
474 status &= ~(1<<2);
475 if (clear & TIOCM_DTR)
476 status &= ~(1<<7);
477 rc = keyspan_pda_set_modem_info(serial, status);
478 return rc;
479}
480
481static int keyspan_pda_ioctl(struct usb_serial_port *port, struct file *file,
482 unsigned int cmd, unsigned long arg)
483{
484 switch (cmd) {
485 case TIOCMIWAIT:
486 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
487 /* TODO */
488 case TIOCGICOUNT:
489 /* return count of modemline transitions */
490 return 0; /* TODO */
491 }
492
493 return -ENOIOCTLCMD;
494}
495
496static int keyspan_pda_write(struct usb_serial_port *port,
497 const unsigned char *buf, int count)
498{
499 struct usb_serial *serial = port->serial;
500 int request_unthrottle = 0;
501 int rc = 0;
502 struct keyspan_pda_private *priv;
503
504 priv = usb_get_serial_port_data(port);
505 /* guess how much room is left in the device's ring buffer, and if we
506 want to send more than that, check first, updating our notion of
507 what is left. If our write will result in no room left, ask the
508 device to give us an interrupt when the room available rises above
509 a threshold, and hold off all writers (eventually, those using
510 select() or poll() too) until we receive that unthrottle interrupt.
511 Block if we can't write anything at all, otherwise write as much as
512 we can. */
513 dbg("keyspan_pda_write(%d)",count);
514 if (count == 0) {
515 dbg(" write request of 0 bytes");
516 return (0);
517 }
518
519 /* we might block because of:
520 the TX urb is in-flight (wait until it completes)
521 the device is full (wait until it says there is room)
522 */
523 if (port->write_urb->status == -EINPROGRESS || priv->tx_throttled ) {
524 return( 0 );
525 }
526
527 /* At this point the URB is in our control, nobody else can submit it
528 again (the only sudden transition was the one from EINPROGRESS to
529 finished). Also, the tx process is not throttled. So we are
530 ready to write. */
531
532 count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
533
534 /* Check if we might overrun the Tx buffer. If so, ask the
535 device how much room it really has. This is done only on
536 scheduler time, since usb_control_msg() sleeps. */
537 if (count > priv->tx_room && !in_interrupt()) {
538 unsigned char room;
539 rc = usb_control_msg(serial->dev,
540 usb_rcvctrlpipe(serial->dev, 0),
541 6, /* write_room */
542 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
543 | USB_DIR_IN,
544 0, /* value: 0 means "remaining room" */
545 0, /* index */
546 &room,
547 1,
548 2000);
549 if (rc < 0) {
550 dbg(" roomquery failed");
551 goto exit;
552 }
553 if (rc == 0) {
554 dbg(" roomquery returned 0 bytes");
555 rc = -EIO; /* device didn't return any data */
556 goto exit;
557 }
558 dbg(" roomquery says %d", room);
559 priv->tx_room = room;
560 }
561 if (count > priv->tx_room) {
562 /* we're about to completely fill the Tx buffer, so
563 we'll be throttled afterwards. */
564 count = priv->tx_room;
565 request_unthrottle = 1;
566 }
567
568 if (count) {
569 /* now transfer data */
570 memcpy (port->write_urb->transfer_buffer, buf, count);
571 /* send the data out the bulk port */
572 port->write_urb->transfer_buffer_length = count;
573
574 priv->tx_room -= count;
575
576 port->write_urb->dev = port->serial->dev;
577 rc = usb_submit_urb(port->write_urb, GFP_ATOMIC);
578 if (rc) {
579 dbg(" usb_submit_urb(write bulk) failed");
580 goto exit;
581 }
582 }
583 else {
584 /* There wasn't any room left, so we are throttled until
585 the buffer empties a bit */
586 request_unthrottle = 1;
587 }
588
589 if (request_unthrottle) {
590 priv->tx_throttled = 1; /* block writers */
591 schedule_work(&priv->unthrottle_work);
592 }
593
594 rc = count;
595exit:
596 return rc;
597}
598
599
600static void keyspan_pda_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
601{
602 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
603 struct keyspan_pda_private *priv;
604
605 priv = usb_get_serial_port_data(port);
606
607 /* queue up a wakeup at scheduler time */
608 schedule_work(&priv->wakeup_work);
609}
610
611
612static int keyspan_pda_write_room (struct usb_serial_port *port)
613{
614 struct keyspan_pda_private *priv;
615
616 priv = usb_get_serial_port_data(port);
617
618 /* used by n_tty.c for processing of tabs and such. Giving it our
619 conservative guess is probably good enough, but needs testing by
620 running a console through the device. */
621
622 return (priv->tx_room);
623}
624
625
626static int keyspan_pda_chars_in_buffer (struct usb_serial_port *port)
627{
628 struct keyspan_pda_private *priv;
629
630 priv = usb_get_serial_port_data(port);
631
632 /* when throttled, return at least WAKEUP_CHARS to tell select() (via
633 n_tty.c:normal_poll() ) that we're not writeable. */
634 if( port->write_urb->status == -EINPROGRESS || priv->tx_throttled )
635 return 256;
636 return 0;
637}
638
639
640static int keyspan_pda_open (struct usb_serial_port *port, struct file *filp)
641{
642 struct usb_serial *serial = port->serial;
643 unsigned char room;
644 int rc = 0;
645 struct keyspan_pda_private *priv;
646
647 /* find out how much room is in the Tx ring */
648 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
649 6, /* write_room */
650 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
651 | USB_DIR_IN,
652 0, /* value */
653 0, /* index */
654 &room,
655 1,
656 2000);
657 if (rc < 0) {
658 dbg("%s - roomquery failed", __FUNCTION__);
659 goto error;
660 }
661 if (rc == 0) {
662 dbg("%s - roomquery returned 0 bytes", __FUNCTION__);
663 rc = -EIO;
664 goto error;
665 }
666 priv = usb_get_serial_port_data(port);
667 priv->tx_room = room;
668 priv->tx_throttled = room ? 0 : 1;
669
670 /* the normal serial device seems to always turn on DTR and RTS here,
671 so do the same */
672 if (port->tty->termios->c_cflag & CBAUD)
673 keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2) );
674 else
675 keyspan_pda_set_modem_info(serial, 0);
676
677 /*Start reading from the device*/
678 port->interrupt_in_urb->dev = serial->dev;
679 rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
680 if (rc) {
681 dbg("%s - usb_submit_urb(read int) failed", __FUNCTION__);
682 goto error;
683 }
684
685error:
686 return rc;
687}
688
689
690static void keyspan_pda_close(struct usb_serial_port *port, struct file *filp)
691{
692 struct usb_serial *serial = port->serial;
693
694 if (serial->dev) {
695 /* the normal serial device seems to always shut off DTR and RTS now */
696 if (port->tty->termios->c_cflag & HUPCL)
697 keyspan_pda_set_modem_info(serial, 0);
698
699 /* shutdown our bulk reads and writes */
700 usb_kill_urb(port->write_urb);
701 usb_kill_urb(port->interrupt_in_urb);
702 }
703}
704
705
706/* download the firmware to a "fake" device (pre-renumeration) */
707static int keyspan_pda_fake_startup (struct usb_serial *serial)
708{
709 int response;
710 const struct ezusb_hex_record *record = NULL;
711
712 /* download the firmware here ... */
713 response = ezusb_set_reset(serial, 1);
714
715#ifdef KEYSPAN
716 if (le16_to_cpu(serial->dev->descriptor.idVendor) == KEYSPAN_VENDOR_ID)
717 record = &keyspan_pda_firmware[0];
718#endif
719#ifdef XIRCOM
720 if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) ||
721 (le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGRA_VENDOR_ID))
722 record = &xircom_pgs_firmware[0];
723#endif
724 if (record == NULL) {
725 err("%s: unknown vendor, aborting.", __FUNCTION__);
726 return -ENODEV;
727 }
728
729 while(record->address != 0xffff) {
730 response = ezusb_writememory(serial, record->address,
731 (unsigned char *)record->data,
732 record->data_size, 0xa0);
733 if (response < 0) {
734 err("ezusb_writememory failed for Keyspan PDA "
735 "firmware (%d %04X %p %d)",
736 response,
737 record->address, record->data, record->data_size);
738 break;
739 }
740 record++;
741 }
742 /* bring device out of reset. Renumeration will occur in a moment
743 and the new device will bind to the real driver */
744 response = ezusb_set_reset(serial, 0);
745
746 /* we want this device to fail to have a driver assigned to it. */
747 return (1);
748}
749
750static int keyspan_pda_startup (struct usb_serial *serial)
751{
752
753 struct keyspan_pda_private *priv;
754
755 /* allocate the private data structures for all ports. Well, for all
756 one ports. */
757
758 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
759 if (!priv)
760 return (1); /* error */
761 usb_set_serial_port_data(serial->port[0], priv);
762 init_waitqueue_head(&serial->port[0]->write_wait);
763 INIT_WORK(&priv->wakeup_work, (void *)keyspan_pda_wakeup_write,
764 (void *)(serial->port[0]));
765 INIT_WORK(&priv->unthrottle_work,
766 (void *)keyspan_pda_request_unthrottle,
767 (void *)(serial));
768 return (0);
769}
770
771static void keyspan_pda_shutdown (struct usb_serial *serial)
772{
773 dbg("%s", __FUNCTION__);
774
775 kfree(usb_get_serial_port_data(serial->port[0]));
776}
777
778#ifdef KEYSPAN
779static struct usb_serial_device_type keyspan_pda_fake_device = {
780 .owner = THIS_MODULE,
781 .name = "Keyspan PDA - (prerenumeration)",
782 .short_name = "keyspan_pda_pre",
783 .id_table = id_table_fake,
784 .num_interrupt_in = NUM_DONT_CARE,
785 .num_bulk_in = NUM_DONT_CARE,
786 .num_bulk_out = NUM_DONT_CARE,
787 .num_ports = 1,
788 .attach = keyspan_pda_fake_startup,
789};
790#endif
791
792#ifdef XIRCOM
793static struct usb_serial_device_type xircom_pgs_fake_device = {
794 .owner = THIS_MODULE,
795 .name = "Xircom / Entregra PGS - (prerenumeration)",
796 .short_name = "xircom_no_firm",
797 .id_table = id_table_fake_xircom,
798 .num_interrupt_in = NUM_DONT_CARE,
799 .num_bulk_in = NUM_DONT_CARE,
800 .num_bulk_out = NUM_DONT_CARE,
801 .num_ports = 1,
802 .attach = keyspan_pda_fake_startup,
803};
804#endif
805
806static struct usb_serial_device_type keyspan_pda_device = {
807 .owner = THIS_MODULE,
808 .name = "Keyspan PDA",
809 .short_name = "keyspan_pda",
810 .id_table = id_table_std,
811 .num_interrupt_in = 1,
812 .num_bulk_in = 0,
813 .num_bulk_out = 1,
814 .num_ports = 1,
815 .open = keyspan_pda_open,
816 .close = keyspan_pda_close,
817 .write = keyspan_pda_write,
818 .write_room = keyspan_pda_write_room,
819 .write_bulk_callback = keyspan_pda_write_bulk_callback,
820 .read_int_callback = keyspan_pda_rx_interrupt,
821 .chars_in_buffer = keyspan_pda_chars_in_buffer,
822 .throttle = keyspan_pda_rx_throttle,
823 .unthrottle = keyspan_pda_rx_unthrottle,
824 .ioctl = keyspan_pda_ioctl,
825 .set_termios = keyspan_pda_set_termios,
826 .break_ctl = keyspan_pda_break_ctl,
827 .tiocmget = keyspan_pda_tiocmget,
828 .tiocmset = keyspan_pda_tiocmset,
829 .attach = keyspan_pda_startup,
830 .shutdown = keyspan_pda_shutdown,
831};
832
833
834static int __init keyspan_pda_init (void)
835{
836 int retval;
837 retval = usb_serial_register(&keyspan_pda_device);
838 if (retval)
839 goto failed_pda_register;
840#ifdef KEYSPAN
841 retval = usb_serial_register(&keyspan_pda_fake_device);
842 if (retval)
843 goto failed_pda_fake_register;
844#endif
845#ifdef XIRCOM
846 retval = usb_serial_register(&xircom_pgs_fake_device);
847 if (retval)
848 goto failed_xircom_register;
849#endif
850 retval = usb_register(&keyspan_pda_driver);
851 if (retval)
852 goto failed_usb_register;
853 info(DRIVER_DESC " " DRIVER_VERSION);
854 return 0;
855failed_usb_register:
856#ifdef XIRCOM
857 usb_serial_deregister(&xircom_pgs_fake_device);
858failed_xircom_register:
859#endif /* XIRCOM */
860#ifdef KEYSPAN
861 usb_serial_deregister(&keyspan_pda_fake_device);
862#endif
863#ifdef KEYSPAN
864failed_pda_fake_register:
865#endif
866 usb_serial_deregister(&keyspan_pda_device);
867failed_pda_register:
868 return retval;
869}
870
871
872static void __exit keyspan_pda_exit (void)
873{
874 usb_deregister (&keyspan_pda_driver);
875 usb_serial_deregister (&keyspan_pda_device);
876#ifdef KEYSPAN
877 usb_serial_deregister (&keyspan_pda_fake_device);
878#endif
879#ifdef XIRCOM
880 usb_serial_deregister (&xircom_pgs_fake_device);
881#endif
882}
883
884
885module_init(keyspan_pda_init);
886module_exit(keyspan_pda_exit);
887
888MODULE_AUTHOR( DRIVER_AUTHOR );
889MODULE_DESCRIPTION( DRIVER_DESC );
890MODULE_LICENSE("GPL");
891
892module_param(debug, bool, S_IRUGO | S_IWUSR);
893MODULE_PARM_DESC(debug, "Debug enabled or not");
894
diff --git a/drivers/usb/serial/keyspan_pda_fw.h b/drivers/usb/serial/keyspan_pda_fw.h
new file mode 100644
index 000000000000..f253accd231c
--- /dev/null
+++ b/drivers/usb/serial/keyspan_pda_fw.h
@@ -0,0 +1,99 @@
1/*
2 * USB Keyspan PDA Firmware
3 *
4 * Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * Generated from keyspan_pda.s by ezusb_convert.pl
12 *
13 */
14
15static const struct ezusb_hex_record keyspan_pda_firmware[] = {
16{ 0x0000, 3, {0x02, 0x02, 0x00} },
17{ 0x0023, 4, {0x02, 0x05, 0x5f, 0x00} },
18{ 0x0043, 4, {0x02, 0x01, 0x00, 0x00} },
19{ 0x0030, 5, {0x00, 0x00, 0x00, 0x00, 0x00} },
20{ 0x0100, 16, {0x02, 0x02, 0x96, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00} },
21{ 0x0110, 16, {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00} },
22{ 0x0120, 16, {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x04, 0x61, 0x00, 0x02, 0x04, 0x89, 0x00} },
23{ 0x0200, 16, {0x75, 0x81, 0x5e, 0xe4, 0xf5, 0x32, 0xf5, 0x33, 0xf5, 0x30, 0xf5, 0x31, 0xf5, 0x34, 0xc2, 0x00} },
24{ 0x0210, 16, {0xc2, 0x01, 0xa9, 0x00, 0x74, 0xfe, 0x90, 0x10, 0x00, 0xf0, 0xa3, 0xd9, 0xfc, 0x74, 0xfd, 0x90} },
25{ 0x0220, 16, {0x11, 0x00, 0xf0, 0xa3, 0xd9, 0xfc, 0x74, 0x02, 0x90, 0x7f, 0x9d, 0xf0, 0x74, 0x00, 0x90, 0x7f} },
26{ 0x0230, 16, {0x97, 0xf0, 0x74, 0x86, 0x90, 0x7f, 0x9e, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x03, 0xf0, 0x90, 0x7f} },
27{ 0x0240, 16, {0xaf, 0xe0, 0xd2, 0xe0, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xab, 0xf0, 0x90, 0x7f, 0xae, 0xf0, 0x90} },
28{ 0x0250, 16, {0x7f, 0xac, 0x74, 0x04, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x04, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x74} },
29{ 0x0260, 16, {0x84, 0x90, 0x7f, 0x98, 0xf0, 0x74, 0x00, 0xf5, 0x98, 0x75, 0xc8, 0x30, 0x7b, 0x05, 0x91, 0x20} },
30{ 0x0270, 16, {0xd2, 0xca, 0x75, 0x98, 0x50, 0xd2, 0xe8, 0xd2, 0xaf, 0xd2, 0xac, 0x74, 0x00, 0xf5, 0x86, 0x90} },
31{ 0x0280, 16, {0x7f, 0xd6, 0x74, 0x02, 0xf0, 0x79, 0x2e, 0x7a, 0x00, 0x7b, 0x00, 0xdb, 0xfe, 0xda, 0xfa, 0xd9} },
32{ 0x0290, 16, {0xf6, 0x74, 0x06, 0xf0, 0x80, 0xfe, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85} },
33{ 0x02a0, 16, {0xc0, 0xe0, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x90, 0x7f} },
34{ 0x02b0, 16, {0xe8, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb, 0xa3, 0xe0, 0xfc, 0xe9, 0x54, 0x60, 0xb4} },
35{ 0x02c0, 16, {0x00, 0x03, 0x02, 0x03, 0x39, 0xb4, 0x40, 0x6e, 0xba, 0x00, 0x0b, 0x12, 0x04, 0x20, 0x40, 0x03} },
36{ 0x02d0, 16, {0x02, 0x04, 0x02, 0x02, 0x04, 0x0a, 0xba, 0x01, 0x03, 0x02, 0x04, 0x0a, 0xba, 0x02, 0x03, 0x02} },
37{ 0x02e0, 16, {0x04, 0x0a, 0xba, 0x03, 0x03, 0x02, 0x04, 0x44, 0xba, 0x04, 0x1e, 0xbb, 0x00, 0x0a, 0x90, 0x7f} },
38{ 0x02f0, 16, {0x95, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x04, 0x02, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfd, 0xf0, 0x90} },
39{ 0x0300, 16, {0x7f, 0x95, 0xe0, 0x54, 0xfd, 0xf0, 0x02, 0x04, 0x02, 0xba, 0x05, 0x03, 0x02, 0x04, 0x0a, 0xba} },
40{ 0x0310, 16, {0x06, 0x19, 0xbb, 0x00, 0x08, 0xe5, 0x33, 0xd3, 0x95, 0x32, 0x02, 0x03, 0xde, 0xbb, 0x01, 0x08} },
41{ 0x0320, 16, {0xe5, 0x32, 0xc3, 0x95, 0x33, 0x02, 0x03, 0xde, 0x02, 0x04, 0x0a, 0xba, 0x07, 0x05, 0x8b, 0x34} },
42{ 0x0330, 16, {0x02, 0x04, 0x02, 0x02, 0x04, 0x0a, 0x02, 0x04, 0x0a, 0xba, 0x00, 0x20, 0xb9, 0x80, 0x10, 0x90} },
43{ 0x0340, 16, {0x7f, 0x00, 0xe4, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x04, 0x02, 0xb9} },
44{ 0x0350, 16, {0x82, 0x02, 0x80, 0xeb, 0xb9, 0x81, 0x02, 0x80, 0xe6, 0x02, 0x04, 0x0a, 0xba, 0x01, 0x0f, 0xbb} },
45{ 0x0360, 16, {0x00, 0x03, 0x02, 0x04, 0x0a, 0xbb, 0x01, 0x03, 0x02, 0x04, 0x02, 0x02, 0x04, 0x0a, 0xba, 0x03} },
46{ 0x0370, 16, {0x0f, 0xbb, 0x00, 0x03, 0x02, 0x04, 0x0a, 0xbb, 0x01, 0x03, 0x02, 0x04, 0x02, 0x02, 0x04, 0x0a} },
47{ 0x0380, 16, {0xba, 0x06, 0x56, 0xbc, 0x01, 0x0f, 0x90, 0x7f, 0xd4, 0x74, 0x06, 0xf0, 0x90, 0x7f, 0xd5, 0x74} },
48{ 0x0390, 16, {0x12, 0xf0, 0x02, 0x04, 0x02, 0xbc, 0x02, 0x12, 0xbb, 0x00, 0x6f, 0x90, 0x7f, 0xd4, 0x74, 0x06} },
49{ 0x03a0, 16, {0xf0, 0x90, 0x7f, 0xd5, 0x74, 0x24, 0xf0, 0x02, 0x04, 0x02, 0xbc, 0x03, 0x29, 0x74, 0x04, 0xc3} },
50{ 0x03b0, 16, {0x9b, 0x40, 0x57, 0x60, 0x55, 0xeb, 0x2b, 0x90, 0x06, 0x44, 0x25, 0x82, 0xf5, 0x82, 0x74, 0x00} },
51{ 0x03c0, 16, {0x35, 0x83, 0xf5, 0x83, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0x90, 0x7f, 0xd4, 0xe9, 0xf0, 0x90, 0x7f} },
52{ 0x03d0, 16, {0xd5, 0xea, 0xf0, 0x02, 0x04, 0x02, 0x02, 0x04, 0x0a, 0xba, 0x08, 0x0f, 0x74, 0x01, 0x90, 0x7f} },
53{ 0x03e0, 16, {0x00, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x04, 0x02, 0xba, 0x09, 0x03, 0x02, 0x04} },
54{ 0x03f0, 16, {0x02, 0xba, 0x0a, 0x05, 0x74, 0x00, 0x02, 0x03, 0xde, 0xba, 0x0b, 0x03, 0x02, 0x04, 0x02, 0x02} },
55{ 0x0400, 16, {0x04, 0x0a, 0x90, 0x7f, 0xb4, 0x74, 0x02, 0xf0, 0x80, 0x09, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
56{ 0x0410, 16, {0xf0, 0x80, 0x00, 0xd0, 0xe0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32} },
57{ 0x0420, 16, {0xeb, 0x20, 0xe7, 0x1e, 0xc3, 0x94, 0x0a, 0x50, 0x19, 0xeb, 0x23, 0x24, 0xfe, 0xf5, 0x82, 0x74} },
58{ 0x0430, 16, {0x05, 0x34, 0x00, 0xf5, 0x83, 0xe0, 0xf5, 0xcb, 0xf5, 0xcd, 0xa3, 0xe0, 0xf5, 0xca, 0xf5, 0xcc} },
59{ 0x0440, 16, {0xc3, 0x22, 0xd3, 0x22, 0xb9, 0x41, 0x11, 0xeb, 0x64, 0xff, 0x54, 0x84, 0xfb, 0x90, 0x7f, 0x98} },
60{ 0x0450, 16, {0xe0, 0x54, 0x7b, 0x4b, 0xf0, 0x02, 0x04, 0x02, 0x90, 0x7f, 0x9b, 0xe0, 0x64, 0xff, 0x02, 0x03} },
61{ 0x0460, 16, {0xde, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xe0, 0xe5, 0x91, 0xc2} },
62{ 0x0470, 16, {0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0x12, 0x05, 0xa0, 0xd0, 0xe0, 0xd0, 0x85} },
63{ 0x0480, 16, {0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0} },
64{ 0x0490, 16, {0x84, 0xc0, 0x85, 0xc0, 0xe0, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04} },
65{ 0x04a0, 16, {0xf0, 0x90, 0x7f, 0xc9, 0xe0, 0xf9, 0xe4, 0xf5, 0x86, 0x90, 0x7d, 0xc0, 0x75, 0x85, 0x10, 0x85} },
66{ 0x04b0, 16, {0x32, 0x84, 0xe0, 0x05, 0x86, 0x05, 0x84, 0xf0, 0xe5, 0x84, 0xb5, 0x33, 0x02, 0x80, 0x09, 0x05} },
67{ 0x04c0, 16, {0x32, 0x05, 0x86, 0xa3, 0xd9, 0xec, 0x80, 0x00, 0x90, 0x7f, 0xc9, 0xf0, 0xb1, 0x31, 0xd0, 0xe0} },
68{ 0x04d0, 16, {0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0xe4, 0xf5, 0x86, 0x90, 0x7f} },
69{ 0x04e0, 16, {0xbc, 0xe0, 0x20, 0xe1, 0x4b, 0x90, 0x7d, 0x00, 0xe5, 0x32, 0xf0, 0xa3, 0xe5, 0x33, 0xf0, 0xa3} },
70{ 0x04f0, 16, {0xe5, 0x30, 0xf0, 0xa3, 0xe5, 0x31, 0xf0, 0xa3, 0xe4, 0x30, 0x00, 0x01, 0x04, 0xf0, 0xa3, 0x05} },
71{ 0x0500, 16, {0x86, 0x90, 0x10, 0x00, 0x79, 0x10, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xd9, 0xf6} },
72{ 0x0510, 16, {0x05, 0x86, 0x74, 0xfc, 0xf0, 0xa3, 0x05, 0x86, 0x90, 0x11, 0x00, 0x79, 0x10, 0xe0, 0xa3, 0x05} },
73{ 0x0520, 16, {0x86, 0xf0, 0xa3, 0x05, 0x86, 0xd9, 0xf6, 0xe4, 0xf5, 0x86, 0x90, 0x7f, 0xbd, 0x74, 0x26, 0xf0} },
74{ 0x0530, 16, {0x22, 0x20, 0x00, 0x13, 0xe5, 0x32, 0xb5, 0x33, 0x01, 0x22, 0x05, 0x33, 0x75, 0x83, 0x10, 0x85} },
75{ 0x0540, 16, {0x33, 0x82, 0xe0, 0xf5, 0x99, 0xd2, 0x00, 0x74, 0x00, 0xb5, 0x34, 0x01, 0x22, 0xe5, 0x33, 0xd3} },
76{ 0x0550, 16, {0x95, 0x32, 0xc3, 0x95, 0x34, 0x40, 0xf5, 0x75, 0x34, 0x00, 0xd2, 0x01, 0x02, 0x05, 0xa0, 0xc0} },
77{ 0x0560, 16, {0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xe0, 0x30, 0x99, 0x07, 0xc2, 0x99} },
78{ 0x0570, 16, {0xc2, 0x00, 0x12, 0x05, 0x34, 0x30, 0x98, 0x05, 0x12, 0x05, 0x8a, 0xc2, 0x98, 0xd0, 0xe0, 0xd0} },
79{ 0x0580, 16, {0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0x75, 0x83, 0x11, 0x85, 0x30, 0x82} },
80{ 0x0590, 16, {0x05, 0x82, 0xe5, 0x99, 0xf0, 0xe5, 0x82, 0xb5, 0x31, 0x01, 0x22, 0x05, 0x30, 0xb1, 0xa0, 0x22} },
81{ 0x05a0, 16, {0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x38, 0x20, 0x01, 0x36, 0xe5, 0x30, 0xb5, 0x31, 0x01, 0x22} },
82{ 0x05b0, 16, {0xe4, 0xf5, 0x86, 0x75, 0x83, 0x11, 0x05, 0x86, 0x90, 0x7e, 0x00, 0xf0, 0xa3, 0x05, 0x86, 0x79} },
83{ 0x05c0, 16, {0x01, 0xe5, 0x30, 0xb5, 0x31, 0x02, 0x80, 0x10, 0x05, 0x31, 0x85, 0x31, 0x82, 0xe0, 0x05, 0x86} },
84{ 0x05d0, 16, {0xf0, 0xa3, 0x05, 0x86, 0x09, 0xb9, 0x40, 0xe9, 0x90, 0x7f, 0xb9, 0xe9, 0x60, 0x01, 0xf0, 0x22} },
85{ 0x05e0, 16, {0xc2, 0x01, 0xe4, 0xf5, 0x86, 0x90, 0x7e, 0x00, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x02, 0xf0, 0x90} },
86{ 0x05f0, 16, {0x7f, 0xb9, 0xf0, 0x22, 0xc2, 0x99, 0xf5, 0x99, 0x30, 0x99, 0xfd, 0xc2, 0x99, 0x22, 0xe5, 0x5e} },
87{ 0x0600, 16, {0xf6, 0x3c, 0xfd, 0x8f, 0xfe, 0xc8, 0xff, 0x64, 0xff, 0xb2, 0xff, 0xd9, 0xff, 0xed, 0xff, 0xf3} },
88{ 0x0610, 16, {0xff, 0xfa, 0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40, 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab} },
89{ 0x0620, 16, {0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00} },
90{ 0x0630, 16, {0x00, 0x02, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05, 0x82, 0x03, 0x40, 0x00, 0x01, 0x07, 0x05, 0x02} },
91{ 0x0640, 16, {0x02, 0x40, 0x00, 0x00, 0x06, 0x4c, 0x06, 0x50, 0x06, 0x72, 0x06, 0xa0, 0x04, 0x03, 0x00, 0x00} },
92{ 0x0650, 16, {0x22, 0x03, 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00} },
93{ 0x0660, 16, {0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00} },
94{ 0x0670, 16, {0x73, 0x00, 0x2e, 0x03, 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00} },
95{ 0x0680, 16, {0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00} },
96{ 0x0690, 16, {0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00} },
97{ 0x06a0, 6, {0x06, 0x03, 0x34, 0x00, 0x37, 0x00} },
98{ 0xffff, 0, {0x00} }
99};
diff --git a/drivers/usb/serial/keyspan_usa18x_fw.h b/drivers/usb/serial/keyspan_usa18x_fw.h
new file mode 100644
index 000000000000..e7b3bc00ce54
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa18x_fw.h
@@ -0,0 +1,447 @@
1/* keyspan_usa18x_fw.h
2
3 The firmware contained herein as keyspan_usa18x_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22*/
23
24static const struct ezusb_hex_record keyspan_usa18x_firmware[] = {
25 {0x0033, 3, { 0x02, 0x12, 0xf7}},
26 {0x0003, 16, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0}},
27 {0x0013, 16, { 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90}},
28 {0x0023, 15, { 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x07, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x22}},
29 {0x0046, 16, { 0x30, 0x09, 0x18, 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x95, 0x3c, 0x40, 0x03, 0x02, 0x00, 0xd8, 0x90}},
30 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x09, 0xc2, 0x00, 0x80, 0x77, 0x30, 0x03, 0x3b, 0x90, 0x7f}},
31 {0x0066, 16, { 0xc6, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7e}},
32 {0x0076, 16, { 0x40, 0xe0, 0x13, 0x92, 0x09, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60}},
33 {0x0086, 16, { 0x0f, 0xf5, 0x08, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x41, 0x12, 0x0c, 0xba}},
34 {0x0096, 16, { 0xc2, 0x03, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x39, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x32}},
35 {0x00a6, 16, { 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x09}},
36 {0x00b6, 16, { 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d}},
37 {0x00c6, 16, { 0x7f, 0xc1, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0xc1, 0x12, 0x0c, 0xba, 0xd2, 0x03, 0xe4, 0x90, 0x7f}},
38 {0x00d6, 16, { 0xc9, 0xf0, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x01, 0x60, 0x12, 0x11, 0xd6, 0x8f}},
39 {0x00e6, 16, { 0x19, 0x12, 0x13, 0x27, 0x8f, 0x36, 0xe5, 0x19, 0xc3, 0x95, 0x3a, 0x50, 0x0f, 0x12, 0x12, 0xeb}},
40 {0x00f6, 16, { 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x36, 0x20, 0xe7, 0x03, 0x30, 0x0b, 0x5e, 0xc2, 0x0b, 0xe5, 0x19}},
41 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
42 {0x0043, 3, { 0x02, 0x13, 0x00}},
43 {0x0000, 3, { 0x02, 0x0e, 0x00}},
44 {0x0106, 64, { 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x36, 0x02, 0xe5, 0x36, 0x30, 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94,
45 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x0c, 0x7e,
46 0x75, 0x0d, 0x80, 0xaf, 0x36, 0x12, 0x0f, 0x4b, 0xe5, 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xb7, 0xf0,
47 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x19, 0x3f, 0x85, 0x19, 0x08}},
48 {0x0146, 64, { 0x90, 0x7e, 0x80, 0xe5, 0x36, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x81, 0x12,
49 0x0c, 0xdf, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06,
50 0x20, 0x05, 0x03, 0x02, 0x03, 0xc1, 0xc2, 0x05, 0xe4, 0xf5, 0x18, 0x74, 0x40, 0x25, 0x18, 0xf5,
51 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x7c, 0x00, 0x7b, 0x01, 0x7a}},
52 {0x0186, 64, { 0x7e, 0x79, 0x00, 0x24, 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5,
53 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x68, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x24,
54 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x03, 0x7d, 0xcd, 0x12, 0x11, 0xb1, 0x43, 0x46,
55 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0xe4, 0x90}},
56 {0x01c6, 64, { 0x7e, 0x13, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12, 0x10, 0x35, 0x90, 0x7e, 0x02, 0xe0,
57 0xff, 0x12, 0x10, 0x5b, 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x03,
58 0x7d, 0x07, 0x12, 0x11, 0xb1, 0x43, 0x46, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0,
59 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x06, 0x90}},
60 {0x0206, 64, { 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x03, 0xe0, 0x70, 0x06, 0x90, 0x7e, 0x13, 0xe0, 0x70, 0x08, 0xe4, 0x90,
61 0x7e, 0x13, 0xf0, 0x75, 0x25, 0xff, 0x90, 0x7e, 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f,
62 0xf5, 0x44, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x44, 0xf0, 0x90, 0x7e,
63 0x07, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x42, 0x80, 0x80, 0x03, 0x53, 0x42}},
64 {0x0246, 64, { 0x7f, 0x53, 0x42, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x42, 0x02, 0xa3, 0xe0, 0xff, 0x12,
65 0x10, 0xa7, 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x10, 0xcd, 0xaf, 0x42, 0x12, 0x10, 0x81, 0x90,
66 0x7e, 0x03, 0xe0, 0x60, 0x08, 0x53, 0x42, 0x7f, 0xaf, 0x42, 0x12, 0x10, 0x81, 0x90, 0x7e, 0x0c,
67 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x02, 0x80, 0x03, 0x53, 0x46, 0xfd}},
68 {0x0286, 64, { 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x0e, 0xe0, 0x60,
69 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x01, 0x80, 0x03, 0x53, 0x46, 0xfe, 0x90, 0x7f, 0x98,
70 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x3a, 0xa3,
71 0xe0, 0x13, 0x92, 0x0d, 0xa3, 0xe0, 0xf5, 0x3c, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x10}},
72 {0x02c6, 64, { 0x80, 0x03, 0x53, 0x46, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0,
73 0x90, 0x7e, 0x16, 0xe0, 0x60, 0x32, 0x53, 0x44, 0xbf, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5,
74 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x12, 0x12, 0xdf,
75 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3e, 0xfd, 0xe4, 0xff, 0xad, 0x3e, 0x12}},
76 {0x0306, 64, { 0x11, 0xb1, 0xe4, 0xf5, 0x2a, 0xf5, 0x29, 0xd2, 0x07, 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43, 0x3e,
77 0x02, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0x75, 0x29, 0x01, 0xd2, 0x07, 0x90, 0x7e, 0x18,
78 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x04, 0x90, 0xc0, 0x00,
79 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11, 0x43, 0x44, 0x40, 0x90, 0x7f, 0x98}},
80 {0x0346, 64, { 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60, 0x0f,
81 0x53, 0x3e, 0xfe, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0x75, 0x2b, 0x01, 0xd2, 0x07, 0x90,
82 0x7e, 0x1b, 0xe0, 0x60, 0x0f, 0x43, 0x3e, 0x01, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0xe4,
83 0xf5, 0x2b, 0xd2, 0x07, 0x90, 0x7e, 0x1c, 0xe0, 0x60, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x12}},
84 {0x0386, 64, { 0xf0, 0xe5, 0x40, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2, 0x0b,
85 0x90, 0x7e, 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x2c, 0x01, 0xe4, 0xf5, 0x38, 0xd2, 0x07, 0x90, 0x7e,
86 0x1f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15, 0xf0,
87 0x74, 0x35, 0xf0, 0xd2, 0x03, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0x30, 0x1a, 0x52, 0xe5, 0x38}},
88 {0x03c6, 64, { 0x60, 0x02, 0x15, 0x38, 0x20, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x13, 0x80,
89 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xd2, 0x13, 0x12, 0x12, 0xdf, 0xef, 0x54, 0x01, 0xf5,
90 0x19, 0x65, 0x2a, 0x60, 0x05, 0x85, 0x19, 0x2a, 0xd2, 0x07, 0x12, 0x13, 0x33, 0xef, 0x54, 0x80,
91 0xf5, 0x19, 0x65, 0x26, 0x60, 0x05, 0x85, 0x19, 0x26, 0xd2, 0x07, 0x30, 0x0d, 0x11, 0x12}},
92 {0x0406, 64, { 0x13, 0x33, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x25, 0x60, 0x05, 0x85, 0x19, 0x25, 0xd2, 0x07, 0x20,
93 0x1b, 0x03, 0x02, 0x07, 0xec, 0x30, 0x0a, 0x18, 0x12, 0x13, 0x6f, 0xef, 0xc3, 0x95, 0x3d, 0x40,
94 0x03, 0x02, 0x04, 0xae, 0x90, 0x7f, 0xc1, 0x74, 0x01, 0xf0, 0xc2, 0x0a, 0xc2, 0x00, 0x80, 0x77,
95 0x30, 0x04, 0x3b, 0x90, 0x7f, 0xca, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x6f, 0xef, 0xc3}},
96 {0x0446, 64, { 0x94, 0x40, 0x50, 0x64, 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0x14, 0xf5,
97 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d, 0x7f, 0x41, 0x75, 0x0c, 0x7d, 0x75,
98 0x0d, 0x41, 0x12, 0x0d, 0x04, 0xc2, 0x04, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x39, 0x90, 0x7f,
99 0xcc, 0xe0, 0x20, 0xe1, 0x32, 0x12, 0x13, 0x6f, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90}},
100 {0x0486, 64, { 0x7c, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60,
101 0x0f, 0xf5, 0x08, 0x7e, 0x7c, 0x7f, 0xc1, 0x75, 0x0c, 0x7c, 0x75, 0x0d, 0xc1, 0x12, 0x0d, 0x04,
102 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0x90, 0x7f, 0xba, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x05,
103 0x36, 0x12, 0x12, 0x20, 0x8f, 0x19, 0x12, 0x13, 0x7b, 0x8f, 0x37, 0xe5, 0x19, 0xc3, 0x95}},
104 {0x04c6, 64, { 0x3b, 0x50, 0x0f, 0x12, 0x13, 0x57, 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x37, 0x20, 0xe7, 0x03, 0x30, 0x0c,
105 0x5e, 0xc2, 0x0c, 0xe5, 0x19, 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x37, 0x02, 0xe5, 0x37, 0x30,
106 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e,
107 0x7d, 0x7f, 0x80, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0x80, 0xaf, 0x37, 0x12, 0x0f, 0x84, 0xe5}},
108 {0x0506, 64, { 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xbb, 0xf0, 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75,
109 0x19, 0x3f, 0x85, 0x19, 0x08, 0x90, 0x7d, 0x80, 0xe5, 0x37, 0xf0, 0x7e, 0x7d, 0x7f, 0x81, 0x75,
110 0x0c, 0x7d, 0x75, 0x0d, 0x81, 0x12, 0x0d, 0x29, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xbb, 0xf0, 0x90,
111 0x7f, 0xd0, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x06, 0x03, 0x02, 0x07, 0x97, 0xc2, 0x06, 0xe4}},
112 {0x0546, 64, { 0xf5, 0x18, 0x74, 0xc0, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18,
113 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x20, 0x24, 0x20, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef,
114 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x20, 0xe0, 0x60, 0x68,
115 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x24, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x03}},
116 {0x0586, 64, { 0x7d, 0xcd, 0x12, 0x11, 0xfb, 0x43, 0x47, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00,
117 0xe5, 0x47, 0xf0, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x21, 0xe0, 0xff, 0x12,
118 0x11, 0x19, 0x90, 0x7e, 0x22, 0xe0, 0xff, 0x12, 0x11, 0x3f, 0x7f, 0x01, 0x90, 0x7e, 0x31, 0xe0,
119 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xfb, 0x43, 0x47, 0x80, 0x90}},
120 {0x05c6, 64, { 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0,
121 0xe5, 0x41, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x23, 0xe0, 0x70, 0x06, 0x90, 0x7e,
122 0x33, 0xe0, 0x70, 0x08, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x75, 0x2e, 0xff, 0x90, 0x7e, 0x25, 0xe0,
123 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x45, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
124 {0x0606, 64, { 0xc0, 0x00, 0xe5, 0x45, 0xf0, 0x90, 0x7e, 0x27, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x43,
125 0x80, 0x80, 0x03, 0x53, 0x43, 0x7f, 0x53, 0x43, 0xfc, 0x90, 0x7e, 0x29, 0xe0, 0x60, 0x11, 0x43,
126 0x43, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x11, 0x65, 0x90, 0x7e, 0x2b, 0xe0, 0xff, 0x12, 0x11, 0x8b,
127 0xaf, 0x43, 0x12, 0x10, 0xf3, 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x08, 0x53, 0x43, 0x7f, 0xaf}},
128 {0x0646, 64, { 0x43, 0x12, 0x10, 0xf3, 0x90, 0x7e, 0x2c, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x02,
129 0x80, 0x03, 0x53, 0x47, 0xfd, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47,
130 0xf0, 0x90, 0x7e, 0x2e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x01, 0x80, 0x03,
131 0x53, 0x47, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0}},
132 {0x0686, 64, { 0x90, 0x7e, 0x32, 0xe0, 0xf5, 0x3b, 0xa3, 0xe0, 0x13, 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0,
133 0x60, 0x05, 0x43, 0x47, 0x10, 0x80, 0x03, 0x53, 0x47, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
134 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7e, 0x36, 0xe0, 0x60, 0x32, 0x53, 0x45, 0xbf, 0x90,
135 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f}},
136 {0x06c6, 64, { 0x98, 0x74, 0x09, 0xf0, 0x12, 0x13, 0x4b, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3f, 0xfd,
137 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0xe4, 0xf5, 0x33, 0xf5, 0x32, 0xd2, 0x08, 0x90, 0x7e,
138 0x37, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x02, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0x75, 0x32,
139 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x38, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0}},
140 {0x0706, 64, { 0xe5, 0x41, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x39, 0xe0, 0x60, 0x11, 0x43,
141 0x45, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
142 0x90, 0x7e, 0x3a, 0xe0, 0x60, 0x0f, 0x53, 0x3f, 0xfe, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb,
143 0x75, 0x34, 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x3b, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x01, 0xe4}},
144 {0x0746, 64, { 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0xe4, 0xf5, 0x34, 0xd2, 0x08, 0x90, 0x7e, 0x3c, 0xe0, 0x60, 0x0e,
145 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0xe5, 0x41, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e,
146 0x3d, 0xe0, 0x60, 0x02, 0xd2, 0x0c, 0x90, 0x7e, 0x3e, 0xe0, 0x60, 0x08, 0x75, 0x35, 0x01, 0xe4,
147 0xf5, 0x39, 0xd2, 0x08, 0x90, 0x7e, 0x3f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x13}},
148 {0x0786, 64, { 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x16, 0xf0, 0x74, 0x36, 0xf0, 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xd1, 0xf0,
149 0x30, 0x1a, 0x52, 0xe5, 0x39, 0x60, 0x02, 0x15, 0x39, 0x30, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94,
150 0x00, 0x40, 0x04, 0x15, 0x13, 0x80, 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xc2, 0x13, 0x12,
151 0x13, 0x4b, 0xef, 0x54, 0x01, 0xf5, 0x19, 0x65, 0x33, 0x60, 0x05, 0x85, 0x19, 0x33, 0xd2}},
152 {0x07c6, 64, { 0x08, 0x12, 0x13, 0x87, 0xef, 0x54, 0x80, 0xf5, 0x19, 0x65, 0x2f, 0x60, 0x05, 0x85, 0x19, 0x2f, 0xd2,
153 0x08, 0x30, 0x0e, 0x11, 0x12, 0x13, 0x87, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x2e, 0x60, 0x05,
154 0x85, 0x19, 0x2e, 0xd2, 0x08, 0x30, 0x1a, 0x2a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1, 0x23, 0x90,
155 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5, 0x15, 0x90, 0x7b, 0x42, 0xe0, 0xf5, 0x16, 0x90}},
156 {0x0806, 64, { 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4, 0x90, 0x7f,
157 0xd3, 0xf0, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x09, 0x20, 0xe5, 0x0a, 0x70, 0x40,
158 0x30, 0x07, 0x39, 0xe5, 0x38, 0x70, 0x35, 0xc2, 0x07, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
159 0x24, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25}},
160 {0x0846, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb,
161 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x38, 0x10, 0xe4, 0xf5, 0x2c, 0x75, 0x0a, 0x01, 0x22,
162 0xe5, 0x0a, 0x64, 0x01, 0x70, 0x40, 0x30, 0x08, 0x39, 0xe5, 0x39, 0x70, 0x35, 0xc2, 0x08, 0xf5,
163 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12}},
164 {0x0886, 64, { 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05,
165 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x39, 0x10, 0xe4,
166 0xf5, 0x35, 0x75, 0x0a, 0x02, 0x22, 0xe5, 0x0a, 0x64, 0x02, 0x70, 0x36, 0x30, 0x14, 0x2f, 0xc2,
167 0x14, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x0e, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00}},
168 {0x08c6, 64, { 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef,
169 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x05, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x05, 0xf0, 0x75, 0x0a,
170 0x03, 0x22, 0xe5, 0x15, 0x60, 0x30, 0x15, 0x15, 0xe4, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
171 0x14, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25}},
172 {0x0906, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x03, 0xdb,
173 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x0a, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0e,
174 0xe4, 0x0a, 0x08, 0x00, 0x0a, 0x7c, 0x01, 0x0a, 0xe8, 0x03, 0x09, 0x44, 0x06, 0x09, 0xfb, 0x08,
175 0x09, 0xf5, 0x09, 0x09, 0xdd, 0x0a, 0x09, 0xec, 0x0b, 0x00, 0x00, 0x0b, 0x37, 0x90, 0x7f}},
176 {0x0946, 64, { 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x14, 0x60, 0x61, 0x24, 0x02, 0x60, 0x03, 0x02, 0x09, 0xd3, 0x74,
177 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f,
178 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19,
179 0xef, 0xf0, 0x75, 0x82, 0x7b, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x74, 0x75, 0x83, 0x19}},
180 {0x0986, 64, { 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f,
181 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0,
182 0x74, 0x12, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0f,
183 0x0a, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0}},
184 {0x09c6, 64, { 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0,
185 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0xe5, 0x09, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
186 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x09, 0x02, 0x0b, 0x3e, 0x12, 0x0b,
187 0x46, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xf0, 0x02}},
188 {0x0a06, 64, { 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b,
189 0xa2, 0x10, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x16, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00,
190 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0xe4, 0x90, 0x7f,
191 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f}},
192 {0x0a46, 64, { 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24,
193 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4,
194 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
195 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02}},
196 {0x0a86, 64, { 0x60, 0x03, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x10, 0x02, 0x0b, 0x3e,
197 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38,
198 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f,
199 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f}},
200 {0x0ac6, 64, { 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f,
201 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80,
202 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea,
203 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x10, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0}},
204 {0x0b06, 64, { 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4,
205 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f,
206 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07,
207 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22}},
208 {0x0b46, 64, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90,
209 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x18,
210 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0xe4, 0xf5,
211 0x24, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x18, 0xf9, 0xe4, 0x34, 0x00, 0xfa}},
212 {0x0b86, 64, { 0xe4, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3a, 0x01, 0xe4, 0xf5, 0x38,
213 0xf5, 0x13, 0xf5, 0x36, 0xc2, 0x07, 0xc2, 0x0b, 0xc2, 0x05, 0xc2, 0x00, 0xc2, 0x09, 0xc2, 0x13,
214 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x75, 0x44, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f,
215 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x10, 0x8f, 0x42, 0x12, 0x10, 0x81, 0x90, 0x7f}},
216 {0x0bc6, 64, { 0x98, 0x74, 0x12, 0xf0, 0x7f, 0x01, 0x8f, 0x40, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f,
217 0x98, 0x74, 0x14, 0xf0, 0x75, 0x46, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0x0f, 0xe4, 0xfd,
218 0x12, 0x11, 0xb1, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3e, 0x12, 0x11, 0xb1, 0x90, 0x7f,
219 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x11}},
220 {0x0c06, 64, { 0xb1, 0x7f, 0x01, 0x12, 0x12, 0x6a, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xb1, 0x20, 0x1b, 0x03, 0x02,
221 0x0c, 0xb7, 0x75, 0x2d, 0x01, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xe4,
222 0x34, 0x00, 0xfa, 0xe4, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3b,
223 0x01, 0xe4, 0xf5, 0x39, 0xf5, 0x13, 0xf5, 0x37, 0xc2, 0x08, 0xc2, 0x0c, 0xc2, 0x06, 0xc2}},
224 {0x0c46, 64, { 0x00, 0xc2, 0x0a, 0xc2, 0x13, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x75, 0x45, 0x03, 0x90, 0xc0, 0x00,
225 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x10, 0x8f, 0x43, 0x12, 0x10,
226 0xf3, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x7f, 0x01, 0x8f, 0x41, 0xef, 0x44, 0x06, 0x90, 0xc0,
227 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x75, 0x47, 0x80, 0x90, 0xc0, 0x00, 0x74}},
228 {0x0c86, 64, { 0x80, 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3f, 0x12,
229 0x11, 0xfb, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d,
230 0x7f, 0x12, 0x11, 0xfb, 0x7f, 0x01, 0x12, 0x12, 0x8b, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xfb,
231 0xd2, 0x12, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82}},
232 {0x0cc6, 64, { 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86,
233 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08,
234 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0,
235 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x90, 0x7f}},
236 {0x0d06, 64, { 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05,
237 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2,
238 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c,
239 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05}},
240 {0x0d46, 64, { 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05,
241 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43,
242 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd2, 0x19, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02,
243 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x10, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0}},
244 {0x0d86, 64, { 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f,
245 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90,
246 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2,
247 0x1a, 0x12, 0x12, 0x45, 0xc2, 0x11, 0xe4, 0xf5, 0x0b, 0xf5, 0x13, 0xc2, 0x17, 0xc2, 0x12}},
248 {0x0dc6, 64, { 0x90, 0x7f, 0xa1, 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x17, 0x60, 0x10, 0x30, 0x12, 0x05, 0xd2,
249 0x1a, 0x12, 0x00, 0x46, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x17, 0x80, 0x08, 0x30, 0x12, 0x05, 0xc2,
250 0x1a, 0x12, 0x00, 0x46, 0x30, 0x11, 0x07, 0xc2, 0x11, 0x12, 0x09, 0x21, 0x80, 0xd6, 0x30, 0x18,
251 0xd3, 0xc2, 0x18, 0x12, 0x13, 0x93, 0x80, 0xcc, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd}},
252 {0x0e06, 64, { 0x75, 0x81, 0x47, 0x02, 0x0e, 0x47, 0x02, 0x0d, 0x6f, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40,
253 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07,
254 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56,
255 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40}},
256 {0x0e46, 64, { 0x80, 0x90, 0x12, 0xac, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09,
257 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8,
258 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82,
259 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca}},
260 {0x0e86, 64, { 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02,
261 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01,
262 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9,
263 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5}},
264 {0x0ec6, 64, { 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82,
265 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0,
266 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74,
267 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3}},
268 {0x0f06, 64, { 0xa3, 0xa3, 0x80, 0xdf, 0x8f, 0x18, 0xe4, 0xf5, 0x19, 0x75, 0x1a, 0xff, 0x75, 0x1b, 0x19, 0x75, 0x1c,
269 0x86, 0xab, 0x1a, 0xaa, 0x1b, 0xa9, 0x1c, 0x90, 0x00, 0x01, 0x12, 0x0e, 0xa5, 0xb4, 0x03, 0x1d,
270 0xaf, 0x19, 0x05, 0x19, 0xef, 0xb5, 0x18, 0x01, 0x22, 0x12, 0x0e, 0x8c, 0x7e, 0x00, 0x29, 0xff,
271 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x1a, 0xff, 0xf5, 0x1b, 0x89, 0x1c, 0x80, 0xd4, 0x7b, 0x00}},
272 {0x0f46, 64, { 0x7a, 0x00, 0x79, 0x00, 0x22, 0x8f, 0x1a, 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c,
273 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12, 0x00, 0x36, 0x05, 0x0d, 0xe5, 0x0d, 0xac,
274 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08,
275 0x60, 0x0a, 0x12, 0x13, 0x27, 0x8f, 0x1a, 0xef, 0x42, 0x36, 0x80, 0xca, 0x22, 0x8f, 0x1a}},
276 {0x0f86, 64, { 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a,
277 0xf0, 0x12, 0x13, 0x3f, 0x05, 0x0d, 0xe5, 0x0d, 0xac, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5,
278 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08, 0x60, 0x0a, 0x12, 0x13, 0x7b, 0x8f, 0x1a,
279 0xef, 0x42, 0x37, 0x80, 0xca, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0}},
280 {0x0fc6, 64, { 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
281 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32,
282 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2,
283 0x11, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0}},
284 {0x1006, 64, { 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0,
285 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08,
286 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f,
287 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10}},
288 {0x1046, 64, { 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90,
289 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
290 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13,
291 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13}},
292 {0x1086, 64, { 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef,
293 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22,
294 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74,
295 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44}},
296 {0x10c6, 64, { 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74,
297 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98,
298 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74,
299 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90}},
300 {0x1106, 64, { 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00,
301 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f,
302 0x98, 0x74, 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5,
303 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
304 {0x1146, 64, { 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90,
305 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f,
306 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
307 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f}},
308 {0x1186, 64, { 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
309 0x90, 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b,
310 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0,
311 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90}},
312 {0x11c6, 64, { 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12,
313 0x13, 0x0f, 0x8f, 0x1a, 0x12, 0x13, 0x0f, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12,
314 0x13, 0x0f, 0x8f, 0x1a, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x0f, 0x8f, 0x1b, 0x80,
315 0xe8, 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90}},
316 {0x1206, 64, { 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0f, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98,
317 0x74, 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13, 0x63, 0x8f, 0x1a, 0x12, 0x13,
318 0x63, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12, 0x13, 0x63, 0x8f, 0x1a, 0xe5, 0x1a,
319 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x63, 0x8f, 0x1b, 0x80, 0xe8, 0xaf, 0x1a, 0x22, 0x90}},
320 {0x1246, 64, { 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x1a, 0x04, 0xe0, 0x44, 0x02, 0xf0,
321 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x12, 0xc8, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44,
322 0x04, 0xf0, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3e, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xb1, 0x90,
323 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3e, 0x44, 0x80}},
324 {0x1286, 64, { 0xfd, 0x12, 0x11, 0xb1, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3f, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xfb,
325 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3f, 0x44, 0x80,
326 0xfd, 0x12, 0x11, 0xfb, 0x22, 0x05, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x03, 0x00,
327 0x00, 0xc1, 0x11, 0xc1, 0x18, 0xc1, 0x95, 0xc1, 0x10, 0xc1, 0x16, 0x01, 0x0a, 0x00, 0xc1}},
328 {0x12c6, 64, { 0x1b, 0x00, 0x8e, 0x18, 0x8f, 0x19, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e,
329 0x60, 0x05, 0x12, 0x0d, 0x4e, 0x80, 0xee, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0,
330 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
331 0x53, 0xd8, 0xef, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0xe7, 0x00, 0x02, 0x13}},
332 {0x1306, 64, { 0x04, 0x00, 0x02, 0x0f, 0xbd, 0x00, 0x02, 0x10, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0,
333 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
334 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
335 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0x90}},
336 {0x1346, 64, { 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
337 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
338 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0,
339 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff}},
340 {0x1386, 64, { 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x12, 0x00, 0x03, 0x12,
341 0x0d, 0x5f, 0x12, 0x0b, 0x46, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
344 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
348 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
352 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
356 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
360 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
364 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
368 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
372 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
376 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
380 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
384 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
388 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
392 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
396 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
400 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
404 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
408 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
412 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
416 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
420 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
424 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
428 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x12, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
429 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
430 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
431 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
432 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
433 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
434 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
435 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
436 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
437 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
438 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
439 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
440 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
441 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
442 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
443 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
444 {0x1a06, 20, { 0x72, 0x00, 0x10, 0x03, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30,
445 0x00, 0x00, 0x00}},
446 {0xffff, 0, {0x00} }
447};
diff --git a/drivers/usb/serial/keyspan_usa19_fw.h b/drivers/usb/serial/keyspan_usa19_fw.h
new file mode 100644
index 000000000000..b023c523e12a
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa19_fw.h
@@ -0,0 +1,285 @@
1/* keyspan_usa19_fw.h
2
3 The firmware contained herein as keyspan_usa19_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22*/
23
24
25static const struct ezusb_hex_record keyspan_usa19_firmware[] = {
26 {0x0026, 10, { 0x12, 0x0d, 0xbf, 0x12, 0x0f, 0x47, 0x12, 0x0d, 0x6b, 0x22}},
27 {0x0033, 3, { 0x02, 0x00, 0x1a}},
28 {0x001a, 4, { 0x53, 0xd8, 0xef, 0x32}},
29 {0x0003, 16, { 0x8e, 0x13, 0x8f, 0x14, 0xe5, 0x14, 0x15, 0x14, 0xae, 0x13, 0x70, 0x02, 0x15, 0x13, 0x4e, 0x60}},
30 {0x0013, 7, { 0x05, 0x12, 0x0f, 0x36, 0x80, 0xee, 0x22}},
31 {0x0023, 3, { 0x02, 0x00, 0x46}},
32 {0x0046, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0, 0x08}},
33 {0x0056, 16, { 0x30, 0x99, 0x0e, 0x30, 0x08, 0x07, 0xa2, 0x0b, 0x92, 0x9b, 0x85, 0x35, 0x99, 0xc2, 0x99, 0xd2}},
34 {0x0066, 16, { 0x0f, 0x20, 0x0f, 0x03, 0x02, 0x04, 0x31, 0xc2, 0x0f, 0x20, 0x02, 0x03, 0x02, 0x02, 0x56, 0x20}},
35 {0x0076, 16, { 0x08, 0x03, 0x02, 0x01, 0x27, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x3e, 0x20, 0x09, 0x36, 0x20}},
36 {0x0086, 16, { 0x06, 0x33, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x29, 0x30, 0x0d, 0x12, 0xaf}},
37 {0x0096, 16, { 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92}},
38 {0x00a6, 16, { 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0}},
39 {0x00b6, 16, { 0xf5, 0x35, 0x02, 0x04, 0x2f, 0xc2, 0x08, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2}},
40 {0x00c6, 16, { 0x02, 0x30, 0x0a, 0x0c, 0xc2, 0x0a, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0xc2, 0x08, 0x02, 0x04, 0x2f}},
41 {0x00d6, 16, { 0x90, 0x7f, 0xc8, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x08, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc9, 0xe0}},
42 {0x00e6, 16, { 0xf5, 0x50, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x20, 0x09, 0x2d, 0x20, 0x06, 0x2a, 0x90}},
43 {0x00f6, 16, { 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x20, 0x30, 0x0d, 0x11, 0x90, 0x7d, 0xc1, 0xe0}},
44 {0x0043, 3, { 0x02, 0x0f, 0x00}},
45 {0x0000, 3, { 0x02, 0x0c, 0x61}},
46 {0x0106, 64, { 0x13, 0x92, 0x0b, 0xa3, 0xe0, 0xf5, 0x35, 0x75, 0x37, 0x03, 0x02, 0x04, 0x2f, 0x75, 0x37, 0x02, 0x90,
47 0x7d, 0xc1, 0xe0, 0xf5, 0x35, 0x02, 0x04, 0x2f, 0x75, 0x37, 0x01, 0xc2, 0x08, 0x02, 0x04, 0x2f,
48 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x03, 0x02, 0x01, 0xcf, 0x90, 0x7f, 0xc6, 0xe0, 0x30, 0xe1,
49 0x07, 0xc2, 0x10, 0xc2, 0x03, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x50, 0x90}},
50 {0x0146, 64, { 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x30, 0x09, 0x03, 0x02, 0x01, 0xc7, 0x20, 0x06, 0x72, 0x20, 0x00,
51 0x6f, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x65, 0x30, 0x0d, 0x10, 0x90, 0x7e,
52 0x41, 0xe0, 0x13, 0x92, 0x9b, 0xa3, 0xe0, 0xf5, 0x99, 0x75, 0x37, 0x03, 0x80, 0x09, 0x90, 0x7e,
53 0x41, 0xe0, 0xf5, 0x99, 0x75, 0x37, 0x02, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x40, 0x17, 0x90}},
54 {0x0186, 64, { 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x02, 0x20, 0x0a, 0x03, 0x02, 0x04, 0x2f, 0xc2, 0x0a, 0x90, 0x7f, 0xbb,
55 0x04, 0xf0, 0x02, 0x04, 0x2f, 0x30, 0x0d, 0x12, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5,
56 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40,
57 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x35, 0xd2, 0x08, 0x02, 0x04}},
58 {0x01c6, 64, { 0x2f, 0x75, 0x37, 0x01, 0xc2, 0x10, 0x02, 0x04, 0x2f, 0x30, 0x09, 0x03, 0x02, 0x02, 0x51, 0x20, 0x06,
59 0x79, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x6f, 0x30, 0x0d, 0x12, 0xaf, 0x37,
60 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x9b,
61 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0}},
62 {0x0206, 64, { 0xf5, 0x99, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x40, 0x17, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x02, 0x20,
63 0x0a, 0x03, 0x02, 0x04, 0x2f, 0xc2, 0x0a, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0x02, 0x04, 0x2f, 0x30,
64 0x0d, 0x12, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83,
65 0xe0, 0x13, 0x92, 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34}},
66 {0x0246, 64, { 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x35, 0xd2, 0x08, 0x02, 0x04, 0x2f, 0xc2, 0x10, 0x02, 0x04, 0x2f, 0x20,
67 0x08, 0x03, 0x02, 0x03, 0x08, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x3e, 0x20, 0x09, 0x36, 0x20,
68 0x06, 0x33, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x29, 0x30, 0x0d, 0x12, 0xaf,
69 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13}},
70 {0x0286, 64, { 0x92, 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0,
71 0xf5, 0x35, 0x02, 0x04, 0x2f, 0xc2, 0x08, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2,
72 0x02, 0x30, 0x0a, 0x0c, 0xc2, 0x0a, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0xc2, 0x08, 0x02, 0x04, 0x2f,
73 0x90, 0x7f, 0xc6, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x08, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc7}},
74 {0x02c6, 64, { 0xe0, 0xf5, 0x50, 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x20, 0x09, 0x2d, 0x20, 0x06, 0x2a, 0x90,
75 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x20, 0x30, 0x0d, 0x11, 0x90, 0x7e, 0x41, 0xe0,
76 0x13, 0x92, 0x0b, 0xa3, 0xe0, 0xf5, 0x35, 0x75, 0x37, 0x03, 0x02, 0x04, 0x2f, 0x75, 0x37, 0x02,
77 0x90, 0x7e, 0x41, 0xe0, 0xf5, 0x35, 0x02, 0x04, 0x2f, 0x75, 0x37, 0x01, 0xc2, 0x08, 0x02}},
78 {0x0306, 64, { 0x04, 0x2f, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x03, 0x02, 0x03, 0xb0, 0x90, 0x7f, 0xc8, 0xe0, 0x30,
79 0xe1, 0x07, 0xc2, 0x10, 0xc2, 0x03, 0x02, 0x04, 0x2f, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x50, 0x90,
80 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x30, 0x09, 0x03, 0x02, 0x03, 0xa8, 0x20, 0x06, 0x72, 0x20,
81 0x00, 0x6f, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x65, 0x30, 0x0d, 0x10}},
82 {0x0346, 64, { 0x90, 0x7d, 0xc1, 0xe0, 0x13, 0x92, 0x9b, 0xa3, 0xe0, 0xf5, 0x99, 0x75, 0x37, 0x03, 0x80, 0x09, 0x90,
83 0x7d, 0xc1, 0xe0, 0xf5, 0x99, 0x75, 0x37, 0x02, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x40, 0x17, 0x90,
84 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x02, 0x20, 0x0a, 0x03, 0x02, 0x04, 0x2f, 0xc2, 0x0a, 0x90, 0x7f,
85 0xbb, 0x04, 0xf0, 0x02, 0x04, 0x2f, 0x30, 0x0d, 0x12, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0}},
86 {0x0386, 64, { 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74,
87 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x35, 0xd2, 0x08, 0x02, 0x04,
88 0x2f, 0x75, 0x37, 0x01, 0xc2, 0x10, 0x02, 0x04, 0x2f, 0x30, 0x09, 0x03, 0x02, 0x04, 0x2d, 0x20,
89 0x06, 0x74, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x20, 0x0e, 0x6a, 0x30, 0x0d, 0x12}},
90 {0x03c6, 64, { 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92,
91 0x9b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0,
92 0xf5, 0x99, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x40, 0x13, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x02,
93 0x30, 0x0a, 0x35, 0xc2, 0x0a, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0x80, 0x2c, 0x30, 0x0d, 0x12}},
94 {0x0406, 64, { 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92,
95 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0,
96 0xf5, 0x35, 0xd2, 0x08, 0x80, 0x02, 0xc2, 0x10, 0xd2, 0x12, 0x20, 0x98, 0x03, 0x02, 0x05, 0x6d,
97 0xc2, 0x98, 0x20, 0x01, 0x03, 0x02, 0x04, 0xda, 0x20, 0x11, 0x27, 0xaf, 0x36, 0x05, 0x36}},
98 {0x0446, 64, { 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x0d, 0x4d, 0xaf,
99 0x36, 0x05, 0x36, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0,
100 0x80, 0x3a, 0x85, 0x99, 0x10, 0xe5, 0x10, 0xb5, 0x44, 0x04, 0xd2, 0x06, 0x80, 0x2e, 0xe5, 0x10,
101 0xb5, 0x43, 0x04, 0xc2, 0x06, 0x80, 0x25, 0xaf, 0x36, 0x05, 0x36, 0x74, 0x80, 0x2f, 0xf5}},
102 {0x0486, 64, { 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x10, 0xf0, 0x30, 0x0d, 0x11, 0xaf, 0x36, 0x05, 0x36, 0x74,
103 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x0c, 0xe5, 0x36,
104 0xc3, 0x95, 0x40, 0x50, 0x03, 0x02, 0x05, 0x6b, 0x90, 0x7f, 0xb8, 0xe0, 0x30, 0xe1, 0x16, 0xe5,
105 0x36, 0xc3, 0x94, 0x40, 0x50, 0x03, 0x02, 0x05, 0x6b, 0x15, 0x36, 0x15, 0x36, 0x05, 0x2b}},
106 {0x04c6, 64, { 0x43, 0x33, 0x01, 0x02, 0x05, 0x6b, 0x90, 0x7f, 0xb7, 0xe5, 0x36, 0xf0, 0x75, 0x36, 0x00, 0xc2, 0x01,
107 0x02, 0x05, 0x6b, 0x20, 0x11, 0x27, 0xaf, 0x36, 0x05, 0x36, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4,
108 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x0d, 0x4d, 0xaf, 0x36, 0x05, 0x36, 0x74, 0x00,
109 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x3a, 0x85, 0x99}},
110 {0x0506, 64, { 0x10, 0xe5, 0x10, 0xb5, 0x44, 0x04, 0xd2, 0x06, 0x80, 0x2e, 0xe5, 0x10, 0xb5, 0x43, 0x04, 0xc2, 0x06,
111 0x80, 0x25, 0xaf, 0x36, 0x05, 0x36, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83,
112 0xe5, 0x10, 0xf0, 0x30, 0x0d, 0x11, 0xaf, 0x36, 0x05, 0x36, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4,
113 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x0c, 0xe5, 0x36, 0xc3, 0x95, 0x40, 0x40}},
114 {0x0546, 64, { 0x24, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x12, 0xe5, 0x36, 0xc3, 0x94, 0x40, 0x40, 0x16, 0x15, 0x36,
115 0x15, 0x36, 0x05, 0x2b, 0x43, 0x33, 0x01, 0x80, 0x0b, 0x90, 0x7f, 0xb9, 0xe5, 0x36, 0xf0, 0x75,
116 0x36, 0x00, 0xd2, 0x01, 0xd2, 0x12, 0x30, 0x12, 0x05, 0xc2, 0x12, 0x02, 0x00, 0x56, 0xd0, 0xd0,
117 0xd0, 0x86, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xca, 0xe0, 0x30, 0xe1}},
118 {0x0586, 64, { 0x03, 0x02, 0x06, 0xab, 0xe4, 0xf5, 0x13, 0x74, 0x40, 0x25, 0x13, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5,
119 0x83, 0xe0, 0xff, 0xe5, 0x13, 0x7c, 0x00, 0x7b, 0x00, 0x24, 0x38, 0xf9, 0xec, 0x34, 0x00, 0xfa,
120 0xef, 0x12, 0x0d, 0x33, 0x05, 0x13, 0xe5, 0x13, 0xb4, 0x18, 0xdb, 0xe5, 0x38, 0x60, 0x0c, 0x75,
121 0xc9, 0x20, 0x75, 0xc8, 0x34, 0x85, 0x39, 0xca, 0x85, 0x3a, 0xcb, 0xe5, 0x3b, 0x13, 0x92}},
122 {0x05c6, 64, { 0x0d, 0x92, 0x9f, 0xe5, 0x3c, 0x13, 0x92, 0x0e, 0xe5, 0x3d, 0x13, 0x92, 0x11, 0xe5, 0x3e, 0x60, 0x09,
123 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x04, 0xf0,
124 0xe5, 0x3f, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0x7f, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x98,
125 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x45, 0x60, 0x0b, 0xc2, 0x09, 0xc2, 0x06, 0x90, 0x7f, 0x95}},
126 {0x0606, 64, { 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x46, 0x60, 0x0c, 0xd2, 0x06, 0x43, 0x33, 0x01, 0x90, 0x7f, 0x95, 0xe0,
127 0x44, 0x02, 0xf0, 0xe5, 0x47, 0x60, 0x0d, 0xc2, 0xaf, 0xc2, 0x08, 0xd2, 0x00, 0xe4, 0xf5, 0x50,
128 0xf5, 0x37, 0xd2, 0xaf, 0xe5, 0x48, 0x60, 0x05, 0x30, 0x11, 0x02, 0xd2, 0x06, 0xe5, 0x49, 0x60,
129 0x15, 0x90, 0x7f, 0x95, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0x9e, 0xe0, 0x44, 0x02, 0xf0}},
130 {0x0646, 64, { 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x4a, 0x60, 0x0a, 0xd2, 0x9c, 0xc2, 0x98, 0x75, 0x2c,
131 0x01, 0x75, 0x31, 0x1e, 0xe5, 0x4b, 0x60, 0x07, 0xc2, 0x9c, 0xe4, 0xf5, 0x36, 0xf5, 0x2c, 0xe5,
132 0x4c, 0x60, 0x03, 0xe4, 0xf5, 0x36, 0xe5, 0x4d, 0x60, 0x02, 0xd2, 0x04, 0xe5, 0x4e, 0x60, 0x0a,
133 0xe5, 0x4a, 0x70, 0x02, 0xf5, 0x31, 0xe5, 0x4e, 0x42, 0x33, 0xe5, 0x4f, 0x60, 0x1f, 0x90}},
134 {0x0686, 64, { 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x13, 0xf0,
135 0x74, 0x33, 0xf0, 0x74, 0x14, 0xf0, 0x74, 0x34, 0xf0, 0xd2, 0x02, 0xd2, 0x01, 0xd2, 0x05, 0xe4,
136 0x90, 0x7f, 0xcb, 0xf0, 0xa2, 0x09, 0xe4, 0x33, 0xff, 0x65, 0x29, 0x60, 0x05, 0x8f, 0x29, 0x43,
137 0x33, 0x01, 0xa2, 0x06, 0xe4, 0x33, 0xff, 0x65, 0x2a, 0x60, 0x05, 0x8f, 0x2a, 0x43, 0x33}},
138 {0x06c6, 64, { 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x08, 0xb5, 0x25, 0x0a, 0xe0, 0x54, 0x08, 0x64, 0x08, 0xf5, 0x25,
139 0x43, 0x33, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x10, 0xb5, 0x26, 0x0a, 0xe0, 0x54, 0x10, 0x64,
140 0x10, 0xf5, 0x26, 0x43, 0x33, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x40, 0xb5, 0x27, 0x0a, 0xe0,
141 0x54, 0x40, 0x64, 0x40, 0xf5, 0x27, 0x43, 0x33, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x20}},
142 {0x0706, 64, { 0xb5, 0x28, 0x0a, 0xe0, 0x54, 0x20, 0x64, 0x20, 0xf5, 0x28, 0x43, 0x33, 0x01, 0x30, 0x04, 0x35, 0xc2,
143 0xaf, 0x30, 0x01, 0x18, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x27, 0xe5, 0x36, 0x60, 0x09, 0x90,
144 0x7f, 0xb7, 0xf0, 0xe4, 0xf5, 0x36, 0xc2, 0x01, 0xc2, 0x04, 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0,
145 0x20, 0xe1, 0x0f, 0xe5, 0x36, 0x60, 0x09, 0x90, 0x7f, 0xb9, 0xf0, 0xe4, 0xf5, 0x36, 0xd2}},
146 {0x0746, 64, { 0x01, 0xc2, 0x04, 0xd2, 0xaf, 0x20, 0x03, 0x37, 0x30, 0x02, 0x1b, 0x90, 0x7f, 0xc6, 0xe0, 0x20, 0xe1,
147 0x2d, 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x75, 0x37, 0x01, 0x90, 0x7f, 0xc7, 0xe0, 0xf5,
148 0x50, 0xd2, 0x03, 0x80, 0x19, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x12, 0x90, 0x7d, 0xc0, 0xe0,
149 0x13, 0x92, 0x0a, 0x75, 0x37, 0x01, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x50, 0xd2, 0x03, 0x20}},
150 {0x0786, 64, { 0x10, 0x33, 0x20, 0x00, 0x06, 0xe5, 0x37, 0x65, 0x50, 0x70, 0x2a, 0x30, 0x03, 0x1a, 0x30, 0x02, 0x09,
151 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x02, 0x80, 0x07, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x02,
152 0xc2, 0x03, 0xe4, 0xf5, 0x50, 0xf5, 0x37, 0x30, 0x0a, 0x0a, 0xc2, 0x0a, 0xc2, 0x00, 0x90, 0x7f,
153 0xbb, 0x74, 0x01, 0xf0, 0x30, 0x10, 0x03, 0x02, 0x08, 0xc5, 0x20, 0x03, 0x03, 0x02, 0x08}},
154 {0x07c6, 64, { 0xc5, 0x30, 0x0e, 0x0a, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe3, 0x03, 0x02, 0x08, 0xc5, 0x30, 0x06, 0x03,
155 0x02, 0x08, 0xc5, 0x30, 0x09, 0x03, 0x02, 0x08, 0xc5, 0x30, 0x02, 0x62, 0x30, 0x0d, 0x12, 0xaf,
156 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92,
157 0x19, 0xaf, 0x37, 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83}},
158 {0x0806, 64, { 0xe0, 0xf5, 0x14, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x2a, 0x30, 0x0d, 0x12, 0xaf, 0x37, 0x05, 0x37,
159 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0b, 0xaf, 0x37,
160 0x05, 0x37, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x35, 0xd2,
161 0x08, 0x80, 0x6b, 0xc2, 0x08, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x02, 0x80, 0x60, 0x30}},
162 {0x0846, 64, { 0x0d, 0x12, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0,
163 0x13, 0x92, 0x19, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5,
164 0x83, 0xe0, 0xf5, 0x14, 0xe5, 0x37, 0xc3, 0x95, 0x50, 0x50, 0x2a, 0x30, 0x0d, 0x12, 0xaf, 0x37,
165 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92}},
166 {0x0886, 64, { 0x0b, 0xaf, 0x37, 0x05, 0x37, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5,
167 0x35, 0xd2, 0x08, 0x80, 0x09, 0xc2, 0x08, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x02, 0x30, 0x0d,
168 0x04, 0xa2, 0x19, 0x92, 0x9b, 0xd2, 0x10, 0xc2, 0xaf, 0x85, 0x14, 0x99, 0x20, 0x08, 0x0d, 0x30,
169 0x0a, 0x0a, 0xc2, 0x0a, 0xc2, 0x00, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0xd2, 0xaf, 0x90}},
170 {0x08c6, 64, { 0x7f, 0xbc, 0xe0, 0x20, 0xe1, 0x51, 0xe5, 0x33, 0x60, 0x4d, 0xe5, 0x31, 0x70, 0x49, 0xe5, 0x33, 0x30,
171 0xe1, 0x08, 0xe4, 0xf5, 0x2f, 0x75, 0x33, 0x01, 0x80, 0x0b, 0xa2, 0x05, 0xe4, 0x33, 0xf5, 0x2f,
172 0xc2, 0x05, 0xe4, 0xf5, 0x33, 0xe4, 0xf5, 0x13, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x13,
173 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0c, 0xed, 0xff, 0x74, 0x00, 0x25, 0x13, 0xf5, 0x82}},
174 {0x0906, 64, { 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x13, 0xe5, 0x13, 0xb4, 0x0c, 0xdb, 0x90, 0x7f, 0xbd,
175 0x74, 0x0c, 0xf0, 0x75, 0x31, 0x10, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0d, 0x45, 0x0a, 0x03,
176 0x00, 0x0a, 0x77, 0x01, 0x0a, 0xe3, 0x03, 0x09, 0x41, 0x06, 0x09, 0xf4, 0x08, 0x09, 0xe8, 0x09,
177 0x09, 0xd0, 0x0a, 0x09, 0xdf, 0x0b, 0x00, 0x00, 0x0b, 0x32, 0x90, 0x7f, 0xeb, 0xe0, 0x24}},
178 {0x0946, 64, { 0xfe, 0x60, 0x16, 0x14, 0x60, 0x57, 0x24, 0x02, 0x70, 0x76, 0x74, 0x0f, 0x90, 0x7f, 0xd4, 0xf0, 0x74,
179 0x64, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02,
180 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0xb5, 0x75, 0x83, 0x0f, 0xef, 0xf0, 0x75, 0x82, 0xae, 0x75,
181 0x83, 0x0f, 0xf0, 0x75, 0x82, 0xa7, 0x75, 0x83, 0x0f, 0xf0, 0x75, 0x82, 0xa0, 0x75, 0x83}},
182 {0x0986, 64, { 0x0f, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75, 0x82, 0x7b, 0x75, 0x83, 0x0f, 0xf0, 0x74, 0x0f, 0x90,
183 0x7f, 0xd4, 0xf0, 0x74, 0x76, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xea, 0xe0,
184 0xff, 0x12, 0x0e, 0x48, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f,
185 0xd5, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x39}},
186 {0x09c6, 64, { 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0x00, 0xe5, 0x19, 0xf0, 0x90,
187 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x19, 0x02, 0x0b,
188 0x39, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x18, 0x12, 0x0d, 0x6b, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0x00,
189 0xe5, 0x18, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xe8}},
190 {0x0a06, 64, { 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2, 0x13, 0xe4, 0x33, 0xff,
191 0x25, 0xe0, 0xff, 0xa2, 0x17, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90,
192 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x39, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90,
193 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80}},
194 {0x0a46, 64, { 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34,
195 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5,
196 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x39,
197 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0b, 0x39}},
198 {0x0a86, 64, { 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x13, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
199 0x01, 0xf0, 0x02, 0x0b, 0x39, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4,
200 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5,
201 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff}},
202 {0x0ac6, 64, { 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20,
203 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0,
204 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2,
205 0x13, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea}},
206 {0x0b06, 64, { 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54,
207 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0,
208 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
209 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22, 0x20, 0x15, 0x03, 0x02, 0x0b}},
210 {0x0b46, 64, { 0xd3, 0xe5, 0x31, 0x60, 0x02, 0x15, 0x31, 0xe5, 0x36, 0x60, 0x4f, 0x65, 0x34, 0x70, 0x45, 0xe5, 0x32,
211 0xf4, 0x60, 0x02, 0x05, 0x32, 0xe5, 0x32, 0xc3, 0x95, 0x41, 0x40, 0x3d, 0xc2, 0xaf, 0x30, 0x01,
212 0x18, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x27, 0x90, 0x7f, 0xb7, 0xe5, 0x36, 0xf0, 0xc2, 0x01,
213 0xe4, 0xf5, 0x36, 0xf5, 0x32, 0xf5, 0x34, 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0, 0x20, 0xe1}},
214 {0x0b86, 64, { 0x0f, 0x90, 0x7f, 0xb9, 0xe5, 0x36, 0xf0, 0xd2, 0x01, 0xe4, 0xf5, 0x36, 0xf5, 0x32, 0xf5, 0x34, 0xd2,
215 0xaf, 0x80, 0x06, 0x85, 0x36, 0x34, 0xe4, 0xf5, 0x32, 0xe5, 0x2c, 0x60, 0x2f, 0x20, 0x0c, 0x07,
216 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x0f, 0xe5, 0x2d, 0x60, 0x06, 0xe4, 0xf5, 0x2d, 0x43, 0x33,
217 0x01, 0xe4, 0xf5, 0x30, 0x80, 0x14, 0xe5, 0x30, 0xd3, 0x95, 0x42, 0x50, 0x0d, 0xe5, 0x30}},
218 {0x0bc6, 64, { 0xb5, 0x42, 0x06, 0x75, 0x2d, 0x01, 0x43, 0x33, 0x01, 0x05, 0x30, 0xc2, 0x0c, 0x22, 0x75, 0x12, 0x01,
219 0xc2, 0x14, 0xc2, 0x18, 0xc2, 0x13, 0xc2, 0x17, 0xc2, 0x15, 0xc2, 0x12, 0xd2, 0x16, 0xe4, 0xf5,
220 0x18, 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x13,
221 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74}},
222 {0x0c06, 64, { 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90,
223 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae,
224 0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0xbc, 0xd2, 0x19, 0x12, 0x0e, 0xda, 0xc2, 0x14, 0x30,
225 0x15, 0x03, 0x12, 0x05, 0x80, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x11, 0x60, 0x08, 0xe0, 0xf5}},
226 {0x0c46, 64, { 0x11, 0x12, 0x0b, 0x41, 0x80, 0xea, 0x30, 0x14, 0x07, 0xc2, 0x14, 0x12, 0x09, 0x1e, 0x80, 0xe0, 0x30,
227 0x18, 0xdd, 0xc2, 0x18, 0x12, 0x00, 0x26, 0x80, 0xd6, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd,
228 0x75, 0x81, 0x50, 0x02, 0x0c, 0xa8, 0x02, 0x0b, 0xd4, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3,
229 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8}},
230 {0x0c86, 64, { 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4,
231 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
232 0x80, 0x90, 0x0e, 0x04, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5,
233 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0}},
234 {0x0cc6, 64, { 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5,
235 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca,
236 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50,
237 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22}},
238 {0x0d06, 64, { 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06,
239 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5,
240 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89,
241 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0}},
242 {0x0d46, 64, { 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8,
243 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3,
244 0xa3, 0xa3, 0x80, 0xdf, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0x90,
245 0x7f, 0x96, 0x74, 0x10, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0x9d, 0x04}},
246 {0x0d86, 64, { 0xf0, 0x90, 0x7f, 0x97, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0x9e, 0x74,
247 0x84, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x90, 0x7f, 0xc7, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90,
248 0x7f, 0xcb, 0xf0, 0x75, 0x98, 0x40, 0x43, 0xa8, 0x10, 0x90, 0x7f, 0xde, 0x74, 0x1f, 0xf0, 0x90,
249 0x7f, 0xdf, 0x74, 0x0f, 0xf0, 0xd2, 0x15, 0x22, 0xe4, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f}},
250 {0x0dc6, 64, { 0x94, 0xf0, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9d, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x97, 0xe0,
251 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x9d, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x20, 0xf0,
252 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9d, 0xe0, 0x44, 0xfd, 0xf0, 0xe4, 0x90, 0x7f, 0x97,
253 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x22, 0x0c, 0x24}},
254 {0x0e06, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x01, 0x33,
255 0x01, 0x01, 0x32, 0x00, 0x01, 0x37, 0x00, 0x01, 0x50, 0x00, 0x01, 0x36, 0x00, 0x01, 0x34, 0x00,
256 0xc1, 0x05, 0xc1, 0x0c, 0xc1, 0x03, 0xc1, 0x0f, 0xc1, 0x04, 0xc1, 0x0e, 0xc1, 0x11, 0xc1, 0x0a,
257 0xc1, 0x10, 0xc1, 0x08, 0xc1, 0x09, 0xc1, 0x06, 0xc1, 0x00, 0xc1, 0x0d, 0xc1, 0x81, 0xc1}},
258 {0x0e46, 64, { 0x82, 0x00, 0x8f, 0x13, 0xe4, 0xf5, 0x14, 0x75, 0x15, 0xff, 0x75, 0x16, 0x0f, 0x75, 0x17, 0xb9, 0xab,
259 0x15, 0xaa, 0x16, 0xa9, 0x17, 0x90, 0x00, 0x01, 0x12, 0x0d, 0x06, 0xb4, 0x03, 0x1d, 0xaf, 0x14,
260 0x05, 0x14, 0xef, 0xb5, 0x13, 0x01, 0x22, 0x12, 0x0c, 0xed, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a,
261 0xa9, 0x07, 0x75, 0x15, 0xff, 0xf5, 0x16, 0x89, 0x17, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00}},
262 {0x0e86, 64, { 0x79, 0x00, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86,
263 0x00, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0,
264 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83,
265 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x14, 0x53, 0x91}},
266 {0x0ec6, 64, { 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83,
267 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x19,
268 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x00, 0x03, 0x90, 0x7f, 0xd6, 0xe0,
269 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x00, 0x02, 0x0e, 0xb3, 0x00, 0x02, 0x0f}},
270 {0x0f06, 64, { 0x04, 0x00, 0x02, 0x0e, 0x89, 0x00, 0x02, 0x0f, 0x0f, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85,
271 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74,
272 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x74,
273 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9}},
274 {0x0f46, 64, { 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10,
276 0x01, 0xff, 0x00, 0x00, 0x40, 0xcd, 0x06, 0x07, 0x01, 0x01, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09,
277 0x02, 0x43, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, 0x00, 0x07, 0xff, 0x00}},
278 {0x0f86, 64, { 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07,
279 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82,
280 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40,
281 0x00, 0x01, 0x04, 0x03, 0x09, 0x04, 0x10, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73}},
282 {0x0fc6, 23, { 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x0e, 0x03, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00,
283 0x61, 0x00, 0x6c, 0x00, 0x00, 0x00}},
284 {0xffff, 0, {0x00} }
285};
diff --git a/drivers/usb/serial/keyspan_usa19qi_fw.h b/drivers/usb/serial/keyspan_usa19qi_fw.h
new file mode 100644
index 000000000000..1a2647226091
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa19qi_fw.h
@@ -0,0 +1,284 @@
1/* keyspan_usa19qi_fw.h
2
3 The firmware contained herein as keyspn_usa19qi_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa19qi_firmware[] = {
26 {0x0033, 3, { 0x02, 0x00, 0x1a}},
27 {0x001a, 4, { 0x53, 0xd8, 0xef, 0x32}},
28 {0x0003, 16, { 0x8e, 0x11, 0x8f, 0x12, 0xe5, 0x12, 0x15, 0x12, 0xae, 0x11, 0x70, 0x02, 0x15, 0x11, 0x4e, 0x60}},
29 {0x0013, 7, { 0x05, 0x12, 0x0f, 0x84, 0x80, 0xee, 0x22}},
30 {0x0023, 3, { 0x02, 0x00, 0x46}},
31 {0x0046, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0, 0x08}},
32 {0x0056, 16, { 0x30, 0x99, 0x0e, 0x30, 0x0b, 0x07, 0xa2, 0x0e, 0x92, 0x9b, 0x85, 0x36, 0x99, 0xc2, 0x99, 0xd2}},
33 {0x0066, 16, { 0x12, 0x20, 0x12, 0x03, 0x02, 0x04, 0x1e, 0xc2, 0x12, 0x20, 0x03, 0x03, 0x02, 0x02, 0x4e, 0x20}},
34 {0x0076, 16, { 0x0b, 0x03, 0x02, 0x01, 0x26, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x3c, 0x20, 0x0c, 0x34, 0x20}},
35 {0x0086, 16, { 0x09, 0x31, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x29, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05}},
36 {0x0096, 16, { 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf}},
37 {0x00a6, 16, { 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x36}},
38 {0x00b6, 16, { 0x02, 0x04, 0x1c, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x03, 0x30}},
39 {0x00c6, 16, { 0x0d, 0x0c, 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0x90, 0x7f}},
40 {0x00d6, 16, { 0xc8, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x53}},
41 {0x00e6, 16, { 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x16, 0xff, 0x20, 0x0c, 0x2b, 0x20, 0x09, 0x28}},
42 {0x00f6, 16, { 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x20, 0x30, 0x10, 0x11, 0x90, 0x7d, 0xc1, 0xe0, 0x13}},
43 {0x0043, 3, { 0x02, 0x0e, 0x00}},
44 {0x0000, 3, { 0x02, 0x00, 0x26}},
45 {0x0026, 12, { 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x54, 0x02, 0x0b, 0x28}},
46 {0x0106, 64, { 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x36, 0x75, 0x3a, 0x03, 0x02, 0x04, 0x1c, 0x75, 0x3a, 0x02, 0x90, 0x7d,
47 0xc1, 0xe0, 0xf5, 0x36, 0x02, 0x04, 0x1c, 0x75, 0x3a, 0x01, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0xe5,
48 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x03, 0x02, 0x01, 0xc9, 0x90, 0x7f, 0xc6, 0xe0, 0x30, 0xe1, 0x07,
49 0xc2, 0x14, 0xc2, 0x05, 0x02, 0x04, 0x1c, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x53, 0x90, 0x7e}},
50 {0x0146, 64, { 0x40, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x16, 0xff, 0x20, 0x0c, 0x70, 0x20, 0x09, 0x6d, 0x90, 0x7f, 0x9b,
51 0xe0, 0x55, 0x38, 0x70, 0x65, 0x30, 0x10, 0x10, 0x90, 0x7e, 0x41, 0xe0, 0x13, 0x92, 0x9b, 0xa3,
52 0xe0, 0xf5, 0x99, 0x75, 0x3a, 0x03, 0x80, 0x09, 0x90, 0x7e, 0x41, 0xe0, 0xf5, 0x99, 0x75, 0x3a,
53 0x02, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x40, 0x17, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x03}},
54 {0x0186, 64, { 0x20, 0x0d, 0x03, 0x02, 0x04, 0x1c, 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0x02, 0x04, 0x1c, 0x30,
55 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83,
56 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e,
57 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0xd2, 0x0b, 0x02, 0x04, 0x1c, 0x75, 0x3a, 0x01, 0xc2, 0x14}},
58 {0x01c6, 64, { 0x02, 0x04, 0x1c, 0x30, 0x0c, 0x03, 0x02, 0x02, 0x49, 0x20, 0x09, 0x77, 0x90, 0x7f, 0x9b, 0xe0, 0x55,
59 0x38, 0x70, 0x6f, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4,
60 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x9b, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5,
61 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x99, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x40}},
62 {0x0206, 64, { 0x17, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x03, 0x20, 0x0d, 0x03, 0x02, 0x04, 0x1c, 0xc2, 0x0d, 0x90,
63 0x7f, 0xbb, 0x04, 0xf0, 0x02, 0x04, 0x1c, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40,
64 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a,
65 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0xd2, 0x0b}},
66 {0x0246, 64, { 0x02, 0x04, 0x1c, 0xc2, 0x14, 0x02, 0x04, 0x1c, 0x20, 0x0b, 0x03, 0x02, 0x02, 0xff, 0xe5, 0x3a, 0xc3,
67 0x95, 0x53, 0x50, 0x3c, 0x20, 0x0c, 0x34, 0x20, 0x09, 0x31, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38,
68 0x70, 0x29, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34,
69 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5}},
70 {0x0286, 64, { 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0x02, 0x04, 0x1c, 0xc2, 0x0b, 0x02, 0x04, 0x1c,
71 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x03, 0x30, 0x0d, 0x0c, 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x04,
72 0xf0, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0x90, 0x7f, 0xc6, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x0b, 0x02,
73 0x04, 0x1c, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x53, 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0d}},
74 {0x02c6, 64, { 0x75, 0x16, 0xff, 0x20, 0x0c, 0x2b, 0x20, 0x09, 0x28, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x20,
75 0x30, 0x10, 0x11, 0x90, 0x7e, 0x41, 0xe0, 0x13, 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x36, 0x75, 0x3a,
76 0x03, 0x02, 0x04, 0x1c, 0x75, 0x3a, 0x02, 0x90, 0x7e, 0x41, 0xe0, 0xf5, 0x36, 0x02, 0x04, 0x1c,
77 0x75, 0x3a, 0x01, 0xc2, 0x0b, 0x02, 0x04, 0x1c, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x03}},
78 {0x0306, 64, { 0x02, 0x03, 0xa2, 0x90, 0x7f, 0xc8, 0xe0, 0x30, 0xe1, 0x07, 0xc2, 0x14, 0xc2, 0x05, 0x02, 0x04, 0x1c,
79 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x53, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x16, 0xff,
80 0x20, 0x0c, 0x70, 0x20, 0x09, 0x6d, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x65, 0x30, 0x10,
81 0x10, 0x90, 0x7d, 0xc1, 0xe0, 0x13, 0x92, 0x9b, 0xa3, 0xe0, 0xf5, 0x99, 0x75, 0x3a, 0x03}},
82 {0x0346, 64, { 0x80, 0x09, 0x90, 0x7d, 0xc1, 0xe0, 0xf5, 0x99, 0x75, 0x3a, 0x02, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x40,
83 0x17, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x03, 0x20, 0x0d, 0x03, 0x02, 0x04, 0x1c, 0xc2, 0x0d,
84 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0x02, 0x04, 0x1c, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74,
85 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf, 0x3a}},
86 {0x0386, 64, { 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0xd2, 0x0b,
87 0x02, 0x04, 0x1c, 0x75, 0x3a, 0x01, 0xc2, 0x14, 0x02, 0x04, 0x1c, 0x20, 0x0c, 0x75, 0x20, 0x09,
88 0x72, 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x70, 0x6a, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a,
89 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x9b, 0xaf}},
90 {0x03c6, 64, { 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x99, 0xe5,
91 0x3a, 0xc3, 0x95, 0x53, 0x40, 0x13, 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x03, 0x30, 0x0d, 0x35,
92 0xc2, 0x0d, 0x90, 0x7f, 0xbb, 0x04, 0xf0, 0x80, 0x2c, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a,
93 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf}},
94 {0x0406, 64, { 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x36, 0xd2,
95 0x0b, 0x80, 0x02, 0xc2, 0x14, 0xd2, 0x01, 0x20, 0x98, 0x03, 0x02, 0x05, 0x5a, 0xc2, 0x98, 0x20,
96 0x02, 0x03, 0x02, 0x04, 0xc7, 0x20, 0x16, 0x27, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5,
97 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x10, 0x4d, 0xaf, 0x39, 0x05}},
98 {0x0446, 64, { 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x3a, 0x85,
99 0x99, 0x10, 0xe5, 0x10, 0xb5, 0x47, 0x04, 0xd2, 0x09, 0x80, 0x2e, 0xe5, 0x10, 0xb5, 0x46, 0x04,
100 0xc2, 0x09, 0x80, 0x25, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e,
101 0xf5, 0x83, 0xe5, 0x10, 0xf0, 0x30, 0x10, 0x11, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x80, 0x2f}},
102 {0x0486, 64, { 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x0f, 0xe5, 0x39, 0xc3, 0x95, 0x43,
103 0x50, 0x03, 0x02, 0x05, 0x58, 0x90, 0x7f, 0xb8, 0xe0, 0x30, 0xe1, 0x16, 0xe5, 0x39, 0xc3, 0x94,
104 0x40, 0x50, 0x03, 0x02, 0x05, 0x58, 0x15, 0x39, 0x15, 0x39, 0x05, 0x2b, 0x43, 0x34, 0x01, 0x02,
105 0x05, 0x58, 0x90, 0x7f, 0xb7, 0xe5, 0x39, 0xf0, 0x75, 0x39, 0x00, 0xc2, 0x02, 0x02, 0x05}},
106 {0x04c6, 64, { 0x58, 0x20, 0x16, 0x27, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5,
107 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x10, 0x4d, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82,
108 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x3a, 0x85, 0x99, 0x10, 0xe5, 0x10, 0xb5,
109 0x47, 0x04, 0xd2, 0x09, 0x80, 0x2e, 0xe5, 0x10, 0xb5, 0x46, 0x04, 0xc2, 0x09, 0x80, 0x25}},
110 {0x0506, 64, { 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x10, 0xf0,
111 0x30, 0x10, 0x11, 0xaf, 0x39, 0x05, 0x39, 0x74, 0x00, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5,
112 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x0f, 0xe5, 0x39, 0xc3, 0x95, 0x43, 0x40, 0x24, 0x90, 0x7f, 0xb6,
113 0xe0, 0x30, 0xe1, 0x12, 0xe5, 0x39, 0xc3, 0x94, 0x40, 0x40, 0x16, 0x15, 0x39, 0x15, 0x39}},
114 {0x0546, 64, { 0x05, 0x2b, 0x43, 0x34, 0x01, 0x80, 0x0b, 0x90, 0x7f, 0xb9, 0xe5, 0x39, 0xf0, 0x75, 0x39, 0x00, 0xd2,
115 0x02, 0xd2, 0x01, 0x30, 0x01, 0x05, 0xc2, 0x01, 0x02, 0x00, 0x56, 0xd0, 0xd0, 0xd0, 0x86, 0xd0,
116 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xbc, 0xe0, 0x20, 0xe1, 0x51, 0xe5, 0x34, 0x60,
117 0x4d, 0xe5, 0x31, 0x70, 0x49, 0xe5, 0x34, 0x30, 0xe1, 0x08, 0xe4, 0xf5, 0x2f, 0x75, 0x34}},
118 {0x0586, 64, { 0x01, 0x80, 0x0b, 0xa2, 0x08, 0xe4, 0x33, 0xf5, 0x2f, 0xc2, 0x08, 0xe4, 0xf5, 0x34, 0xe4, 0xf5, 0x11,
119 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x11, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0d, 0x06,
120 0xff, 0x74, 0x00, 0x25, 0x11, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x11,
121 0xe5, 0x11, 0xb4, 0x0c, 0xdb, 0x90, 0x7f, 0xbd, 0x74, 0x0c, 0xf0, 0x75, 0x31, 0x10, 0x90}},
122 {0x05c6, 64, { 0x7f, 0xca, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x06, 0xf3, 0xe4, 0xf5, 0x11, 0x74, 0x40, 0x25, 0x11, 0xf5,
123 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x11, 0x7c, 0x00, 0x7b, 0x00, 0x24, 0x3b,
124 0xf9, 0xec, 0x34, 0x00, 0xfa, 0xef, 0x12, 0x0d, 0x1f, 0x05, 0x11, 0xe5, 0x11, 0xb4, 0x18, 0xdb,
125 0xe5, 0x3b, 0x60, 0x11, 0x75, 0xc9, 0x20, 0x75, 0xc8, 0x36, 0x85, 0x3c, 0xca, 0x85, 0x3d}},
126 {0x0606, 64, { 0xcb, 0xe4, 0x90, 0x7f, 0x9f, 0xf0, 0xe5, 0x3e, 0x13, 0x92, 0x10, 0x92, 0x9f, 0x85, 0x3f, 0x38, 0xe5,
127 0x40, 0x13, 0x92, 0x16, 0xe5, 0x41, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfb, 0xf0, 0x80,
128 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x04, 0xf0, 0xe5, 0x42, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0,
129 0x54, 0x7f, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x48, 0x60}},
130 {0x0646, 64, { 0x0b, 0xc2, 0x0c, 0xc2, 0x09, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x49, 0x60, 0x0c, 0xd2,
131 0x09, 0x43, 0x34, 0x01, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x4a, 0x60, 0x0d, 0xc2,
132 0xaf, 0xc2, 0x0b, 0xd2, 0x00, 0xe4, 0xf5, 0x53, 0xf5, 0x3a, 0xd2, 0xaf, 0xe5, 0x4b, 0x60, 0x05,
133 0x30, 0x16, 0x02, 0xd2, 0x09, 0xe5, 0x4c, 0x60, 0x15, 0x90, 0x7f, 0x95, 0xe0, 0x54, 0xfd}},
134 {0x0686, 64, { 0xf0, 0x90, 0x7f, 0x9e, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x4d,
135 0x60, 0x0a, 0xd2, 0x9c, 0xc2, 0x98, 0x75, 0x2c, 0x01, 0x75, 0x31, 0x1e, 0xe5, 0x4e, 0x60, 0x07,
136 0xc2, 0x9c, 0xe4, 0xf5, 0x39, 0xf5, 0x2c, 0xe5, 0x4f, 0x60, 0x03, 0xe4, 0xf5, 0x39, 0xe5, 0x50,
137 0x60, 0x02, 0xd2, 0x07, 0xe5, 0x51, 0x60, 0x0a, 0xe5, 0x4d, 0x70, 0x02, 0xf5, 0x31, 0xe5}},
138 {0x06c6, 64, { 0x51, 0x42, 0x34, 0xe5, 0x52, 0x60, 0x1f, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74,
139 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x13, 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x14, 0xf0, 0x74, 0x34,
140 0xf0, 0xd2, 0x03, 0xd2, 0x02, 0xd2, 0x08, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0xa2, 0x0c, 0xe4, 0x33,
141 0xff, 0x65, 0x29, 0x60, 0x05, 0x8f, 0x29, 0x43, 0x34, 0x01, 0xa2, 0x09, 0xe4, 0x33, 0xff}},
142 {0x0706, 64, { 0x65, 0x2a, 0x60, 0x05, 0x8f, 0x2a, 0x43, 0x34, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0xff, 0x54, 0x08, 0x64,
143 0x08, 0xfe, 0x65, 0x25, 0x60, 0x05, 0x8e, 0x25, 0x43, 0x34, 0x01, 0xef, 0x54, 0x10, 0x64, 0x10,
144 0xfe, 0x65, 0x26, 0x60, 0x05, 0x8e, 0x26, 0x43, 0x34, 0x01, 0xef, 0x54, 0x40, 0x64, 0x40, 0xfe,
145 0x65, 0x27, 0x60, 0x05, 0x8e, 0x27, 0x43, 0x34, 0x01, 0xef, 0x54, 0x20, 0x64, 0x20, 0xfe}},
146 {0x0746, 64, { 0x65, 0x28, 0x60, 0x05, 0x8e, 0x28, 0x43, 0x34, 0x01, 0x90, 0x7f, 0x9a, 0xe0, 0x54, 0x40, 0x64, 0x40,
147 0xfe, 0x65, 0x2e, 0x60, 0x05, 0x8e, 0x2e, 0x43, 0x34, 0x01, 0x30, 0x07, 0x35, 0xc2, 0xaf, 0x30,
148 0x02, 0x18, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x27, 0xe5, 0x39, 0x60, 0x09, 0x90, 0x7f, 0xb7,
149 0xf0, 0xe4, 0xf5, 0x39, 0xc2, 0x02, 0xc2, 0x07, 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0, 0x20}},
150 {0x0786, 64, { 0xe1, 0x0f, 0xe5, 0x39, 0x60, 0x09, 0x90, 0x7f, 0xb9, 0xf0, 0xe4, 0xf5, 0x39, 0xd2, 0x02, 0xc2, 0x07,
151 0xd2, 0xaf, 0x20, 0x05, 0x3d, 0x30, 0x03, 0x1e, 0x90, 0x7f, 0xc6, 0xe0, 0x20, 0xe1, 0x33, 0x90,
152 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x3a, 0x01, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x53, 0xd2,
153 0x05, 0x75, 0x16, 0xff, 0x80, 0x1c, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x15, 0x90, 0x7d}},
154 {0x07c6, 64, { 0xc0, 0xe0, 0x13, 0x92, 0x0d, 0x75, 0x3a, 0x01, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x53, 0xd2, 0x05, 0x75,
155 0x16, 0xff, 0x20, 0x14, 0x33, 0x20, 0x00, 0x06, 0xe5, 0x3a, 0x65, 0x53, 0x70, 0x2a, 0x30, 0x05,
156 0x1a, 0x30, 0x03, 0x09, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x03, 0x80, 0x07, 0xe4, 0x90, 0x7f,
157 0xc9, 0xf0, 0xd2, 0x03, 0xc2, 0x05, 0xe4, 0xf5, 0x53, 0xf5, 0x3a, 0x30, 0x0d, 0x0a, 0xc2}},
158 {0x0806, 64, { 0x0d, 0xc2, 0x00, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0x30, 0x14, 0x03, 0x02, 0x09, 0x14, 0x20, 0x05,
159 0x03, 0x02, 0x09, 0x14, 0x30, 0x0c, 0x03, 0x02, 0x09, 0x14, 0x30, 0x09, 0x03, 0x02, 0x09, 0x14,
160 0x90, 0x7f, 0x9b, 0xe0, 0x55, 0x38, 0x60, 0x03, 0x02, 0x09, 0x14, 0x30, 0x03, 0x61, 0x30, 0x10,
161 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83}},
162 {0x0846, 64, { 0xe0, 0x13, 0x92, 0x1b, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5,
163 0x83, 0xe0, 0xfe, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x2a, 0x30, 0x10, 0x12, 0xaf, 0x3a, 0x05,
164 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e, 0xaf,
165 0x3a, 0x05, 0x3a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5}},
166 {0x0886, 64, { 0x36, 0xd2, 0x0b, 0x80, 0x6a, 0xc2, 0x0b, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x03, 0x80, 0x5f, 0x30,
167 0x10, 0x12, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83,
168 0xe0, 0x13, 0x92, 0x1b, 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d,
169 0xf5, 0x83, 0xe0, 0xfe, 0xe5, 0x3a, 0xc3, 0x95, 0x53, 0x50, 0x2a, 0x30, 0x10, 0x12, 0xaf}},
170 {0x08c6, 64, { 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x0e,
171 0xaf, 0x3a, 0x05, 0x3a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5,
172 0x36, 0xd2, 0x0b, 0x80, 0x09, 0xc2, 0x0b, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x03, 0x30, 0x10,
173 0x04, 0xa2, 0x1b, 0x92, 0x9b, 0xd2, 0x14, 0xc2, 0xaf, 0x8e, 0x99, 0x20, 0x0b, 0x0d, 0x30}},
174 {0x0906, 64, { 0x0d, 0x0a, 0xc2, 0x0d, 0xc2, 0x00, 0x90, 0x7f, 0xbb, 0x74, 0x01, 0xf0, 0xd2, 0xaf, 0x22, 0x90, 0x7f,
175 0xe9, 0xe0, 0x12, 0x0d, 0x31, 0x0a, 0x11, 0x00, 0x0a, 0x7e, 0x01, 0x0a, 0xdb, 0x03, 0x09, 0x38,
176 0x06, 0x0a, 0x02, 0x08, 0x09, 0xf6, 0x09, 0x09, 0xde, 0x0a, 0x09, 0xed, 0x0b, 0x00, 0x00, 0x0b,
177 0x19, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x14, 0x60, 0x5a, 0x24, 0x02, 0x60}},
178 {0x0946, 64, { 0x03, 0x02, 0x0b, 0x19, 0x74, 0x0d, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x87, 0x90, 0x7f, 0xd5, 0xf0, 0x02,
179 0x0b, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82,
180 0xd8, 0x75, 0x83, 0x0d, 0xef, 0xf0, 0x75, 0x82, 0xd1, 0x75, 0x83, 0x0d, 0xf0, 0x75, 0x82, 0xca,
181 0x75, 0x83, 0x0d, 0xf0, 0x75, 0x82, 0xc3, 0x75, 0x83, 0x0d, 0xf0, 0x90, 0x7f, 0xea, 0xe0}},
182 {0x0986, 64, { 0x04, 0x75, 0x82, 0x9e, 0x75, 0x83, 0x0d, 0xf0, 0x74, 0x0d, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x99, 0x90,
183 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x0b, 0x75, 0x11, 0xff, 0x75,
184 0x12, 0x0d, 0x75, 0x13, 0xdc, 0x80, 0x1b, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x0b, 0x75, 0x11,
185 0xff, 0x75, 0x12, 0x0d, 0x75, 0x13, 0xe0, 0x80, 0x09, 0x75, 0x11, 0xff, 0x75, 0x12, 0x0d}},
186 {0x09c6, 64, { 0x75, 0x13, 0xf0, 0xaa, 0x12, 0xa9, 0x13, 0xae, 0x02, 0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef,
187 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0x00, 0xe5, 0x15, 0xf0, 0x90, 0x7f, 0xb5,
188 0x74, 0x01, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x15, 0x02, 0x0b, 0x20, 0x12,
189 0x0c, 0xb1, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x14, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0x00, 0xe5}},
190 {0x0a06, 64, { 0x14, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f,
191 0x60, 0x27, 0x14, 0x60, 0x34, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0b, 0x19, 0xa2, 0x17, 0xe4, 0x33,
192 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x19, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0,
193 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x20, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3}},
194 {0x0a46, 64, { 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80,
195 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4,
196 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f,
197 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x17}},
198 {0x0a86, 64, { 0x24, 0x02, 0x60, 0x03, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0b,
199 0x19, 0xc2, 0x17, 0x02, 0x0b, 0x20, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x76, 0x90, 0x7f, 0xec, 0xe0,
200 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4,
201 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80}},
202 {0x0ac6, 64, { 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44,
203 0x20, 0xf0, 0x80, 0x45, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x10, 0x24, 0x02, 0x70, 0x39,
204 0x90, 0x7f, 0xea, 0xe0, 0x64, 0x01, 0x70, 0x2a, 0xd2, 0x17, 0x80, 0x2d, 0x90, 0x7f, 0xea, 0xe0,
205 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0}},
206 {0x0b06, 64, { 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0,
207 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0,
208 0x22, 0xc2, 0x10, 0xe4, 0xf5, 0x14, 0xf5, 0x34, 0xc2, 0x09, 0xc2, 0x0c, 0xc2, 0x0b, 0xc2, 0x14,
209 0xc2, 0x0d, 0xc2, 0x16, 0xc2, 0x11, 0xc2, 0x07, 0xc2, 0x12, 0xc2, 0x0f, 0xc2, 0x08, 0xf5}},
210 {0x0b46, 64, { 0x35, 0xf5, 0x39, 0xf5, 0x53, 0xf5, 0x3a, 0xf5, 0x33, 0xf5, 0x30, 0xf5, 0x2f, 0xf5, 0x2e, 0xf5, 0x2d,
211 0xf5, 0x2c, 0xf5, 0x2b, 0xf5, 0x2a, 0xf5, 0x29, 0xf5, 0x28, 0xf5, 0x27, 0xf5, 0x26, 0xf5, 0x25,
212 0xf5, 0x24, 0xc2, 0x05, 0xc2, 0x18, 0xc2, 0x1a, 0xc2, 0x17, 0xc2, 0x19, 0xc2, 0x15, 0xc2, 0x04,
213 0xd2, 0x13, 0xc2, 0x06, 0xc2, 0x01, 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0xd2, 0xe8}},
214 {0x0b86, 64, { 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74,
215 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf,
216 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0f, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x0e,
217 0xf0, 0xd2, 0xaf, 0xd2, 0xbc, 0xd2, 0x1b, 0x12, 0x0f, 0x5f, 0xc2, 0x18, 0x30, 0x04, 0x03}},
218 {0x0bc6, 64, { 0x12, 0x05, 0x6d, 0x30, 0x04, 0x2a, 0x30, 0x06, 0x27, 0xc2, 0x06, 0xe5, 0x16, 0x60, 0x16, 0x15, 0x16,
219 0x90, 0x7f, 0xd8, 0xe0, 0x30, 0xe6, 0x04, 0x7f, 0x00, 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f, 0x96,
220 0xef, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x96, 0x74, 0x20, 0xf0, 0x12, 0x0c, 0x0b, 0x80, 0xcd, 0x30,
221 0x18, 0x07, 0xc2, 0x18, 0x12, 0x09, 0x15, 0x80, 0xc3, 0x30, 0x1a, 0xc0, 0xc2, 0x1a, 0x12}},
222 {0x0c06, 64, { 0x0f, 0xbb, 0x80, 0xb9, 0x22, 0xe5, 0x31, 0x60, 0x02, 0x15, 0x31, 0xe5, 0x39, 0x60, 0x55, 0x65, 0x35,
223 0x70, 0x4b, 0xe5, 0x33, 0xf4, 0x60, 0x02, 0x05, 0x33, 0xe5, 0x33, 0xc3, 0x95, 0x44, 0x40, 0x43,
224 0xc2, 0xaf, 0x30, 0x02, 0x1b, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x2d, 0x90, 0x7f, 0xb7, 0xe5,
225 0x39, 0xf0, 0xc2, 0x02, 0xe4, 0xf5, 0x39, 0xf5, 0x33, 0xf5, 0x35, 0x75, 0x16, 0xff, 0x80}},
226 {0x0c46, 64, { 0x19, 0x90, 0x7f, 0xb6, 0xe0, 0x20, 0xe1, 0x12, 0x90, 0x7f, 0xb9, 0xe5, 0x39, 0xf0, 0xd2, 0x02, 0xe4,
227 0xf5, 0x39, 0xf5, 0x33, 0xf5, 0x35, 0x75, 0x16, 0xff, 0xd2, 0xaf, 0x80, 0x06, 0x85, 0x39, 0x35,
228 0xe4, 0xf5, 0x33, 0xe5, 0x2c, 0x60, 0x30, 0x20, 0x0f, 0x07, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0,
229 0x0f, 0xe5, 0x2d, 0x60, 0x06, 0xe4, 0xf5, 0x2d, 0x43, 0x34, 0x01, 0xe4, 0xf5, 0x30, 0x80}},
230 {0x0c86, 64, { 0x14, 0xe5, 0x30, 0xd3, 0x95, 0x45, 0x50, 0x0d, 0xe5, 0x30, 0xb5, 0x45, 0x06, 0x75, 0x2d, 0x01, 0x43,
231 0x34, 0x01, 0x05, 0x30, 0xc2, 0x0f, 0x22, 0x90, 0x7f, 0xd9, 0xe0, 0x30, 0xe2, 0x04, 0x7f, 0x00,
232 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f, 0x96, 0xef, 0xf0, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90,
233 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x94, 0x74}},
234 {0x0cc6, 64, { 0x01, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x97, 0x74, 0x86, 0xf0, 0x90, 0x7f, 0x95,
235 0x74, 0x03, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x84, 0xf0, 0x90, 0x7f, 0x98, 0xf0, 0xe4, 0x90, 0x7f,
236 0xc7, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xcb, 0xf0, 0x75, 0x98, 0x40, 0x43, 0xa8, 0x10,
237 0x90, 0x7f, 0xde, 0x74, 0x1f, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x0f, 0xf0, 0xd2, 0x04, 0x22}},
238 {0x0d06, 64, { 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3,
239 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0,
240 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4,
241 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93}},
242 {0x0d46, 64, { 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf,
243 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90,
244 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0,
245 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00}},
246 {0x0d86, 64, { 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00, 0x00, 0x40, 0xcd, 0x06, 0x0c, 0x01, 0x01, 0x00, 0x01, 0x02,
247 0x00, 0x02, 0x09, 0x02, 0x43, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, 0x00, 0x07,
248 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40,
249 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00}},
250 {0x0dc6, 64, { 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05,
251 0x84, 0x02, 0x40, 0x00, 0x01, 0x04, 0x03, 0x09, 0x04, 0x10, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79,
252 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x0e, 0x03, 0x53, 0x00, 0x65, 0x00, 0x72,
253 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x02, 0x0e, 0xa2, 0x00, 0x02, 0x0e}},
254 {0x0e06, 64, { 0x7b, 0x00, 0x02, 0x0d, 0x57, 0x00, 0x02, 0x0e, 0xc9, 0x00, 0x02, 0x0e, 0x10, 0x00, 0x02, 0x0e, 0x14,
255 0x00, 0x02, 0x0e, 0x18, 0x00, 0x02, 0x0e, 0x1c, 0x00, 0x02, 0x0e, 0xf0, 0x00, 0x02, 0x0e, 0x24,
256 0x00, 0x02, 0x0f, 0x15, 0x00, 0x02, 0x0e, 0x2c, 0x00, 0x02, 0x0f, 0x3a, 0xe4, 0x90, 0x7f, 0x95,
257 0xf0, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9d, 0xe0, 0x44, 0x02}},
258 {0x0e46, 64, { 0xf0, 0x90, 0x7f, 0x97, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x10, 0xf0, 0xe4, 0x90, 0x7f,
259 0x96, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xfe, 0xf0, 0x30, 0x17, 0x04, 0x7f, 0x80, 0x80, 0x02, 0x7f,
260 0x00, 0x90, 0x7f, 0x97, 0xef, 0xf0, 0xe4, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0xf0, 0x90,
261 0x7f, 0x98, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0}},
262 {0x0e86, 64, { 0x86, 0x75, 0x86, 0x00, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd2, 0x06, 0xd0, 0x86,
263 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0,
264 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90,
265 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83}},
266 {0x0ec6, 64, { 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86,
267 0x00, 0xd2, 0x1a, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84,
268 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0,
269 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74}},
270 {0x0f06, 64, { 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0,
271 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x53, 0x91, 0xef,
272 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83,
273 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86}},
274 {0x0f46, 64, { 0x75, 0x86, 0x00, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0,
275 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0,
276 0x44, 0x08, 0xf0, 0x30, 0x1b, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x00,
277 0x03, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x74, 0x00}},
278 {0x0f86, 64, { 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f,
279 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x90, 0x7f,
280 0xd6, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x0d, 0x7e, 0x00, 0x12, 0x00, 0x03, 0x90, 0x7f, 0xd6, 0xe0,
281 0x54, 0xfe, 0xf0, 0x22, 0x12, 0x0e, 0x33, 0x12, 0x0f, 0x95, 0x90, 0x7f, 0xd6, 0xe0, 0x30}},
282 {0x0fc6, 9, { 0xe7, 0x03, 0x12, 0x0f, 0xa5, 0x12, 0x0c, 0xb1, 0x22}},
283 {0xffff, 0, {0x00}}
284};
diff --git a/drivers/usb/serial/keyspan_usa19qw_fw.h b/drivers/usb/serial/keyspan_usa19qw_fw.h
new file mode 100644
index 000000000000..0803f8b0bc34
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa19qw_fw.h
@@ -0,0 +1,448 @@
1/* keyspan_usa19qw_fw.h
2
3 The firmware contained herein as keyspan_usa19wq_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa19qw_firmware[] = {
26 {0x0033, 3, { 0x02, 0x00, 0x2d}},
27 {0x002d, 4, { 0x53, 0xd8, 0xef, 0x32}},
28 {0x0046, 16, { 0x30, 0x10, 0x19, 0x12, 0x0e, 0x0f, 0xef, 0xc3, 0x95, 0x14, 0x40, 0x03, 0x02, 0x00, 0xdf, 0x90}},
29 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x10, 0xc2, 0x0b, 0x02, 0x00, 0xdf, 0x30, 0x0d, 0x3e, 0x90}},
30 {0x0066, 16, { 0x7f, 0xc6, 0xe0, 0x20, 0xe1, 0x73, 0x12, 0x0e, 0x0f, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x6a, 0x90}},
31 {0x0076, 16, { 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x10, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x36, 0x20, 0x0b, 0x11}},
32 {0x0086, 16, { 0x60, 0x0f, 0xf5, 0x24, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x29, 0x7e, 0x75, 0x2a, 0x41, 0x12, 0x09}},
33 {0x0096, 16, { 0x10, 0xc2, 0x0d, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x75, 0x26, 0xff, 0x80, 0x3c, 0x90, 0x7f, 0xc8}},
34 {0x00a6, 16, { 0xe0, 0x20, 0xe1, 0x35, 0x12, 0x0e, 0x0f, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x2c, 0x90, 0x7d, 0xc0}},
35 {0x00b6, 16, { 0xe0, 0x13, 0x92, 0x10, 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x36, 0x20, 0x0b, 0x11, 0x60, 0x0f}},
36 {0x00c6, 16, { 0xf5, 0x24, 0x7e, 0x7d, 0x7f, 0xc1, 0x75, 0x29, 0x7d, 0x75, 0x2a, 0xc1, 0x12, 0x09, 0x10, 0xd2}},
37 {0x00d6, 16, { 0x0d, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0x75, 0x26, 0xff, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03}},
38 {0x00e6, 16, { 0x02, 0x01, 0x68, 0x12, 0x0c, 0xff, 0x8f, 0x36, 0x12, 0x0e, 0x1b, 0x8f, 0x11, 0xe5, 0x36, 0xc3}},
39 {0x00f6, 16, { 0x95, 0x13, 0x50, 0x0f, 0x12, 0x0d, 0xde, 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x11, 0x20, 0xe7, 0x03}},
40 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
41 {0x0043, 3, { 0x02, 0x0e, 0x00}},
42 {0x0003, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90}},
43 {0x0013, 16, { 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0}},
44 {0x0023, 10, { 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32}},
45 {0x0000, 3, { 0x02, 0x09, 0xc5}},
46 {0x0106, 64, { 0x30, 0x13, 0x5f, 0xc2, 0x13, 0xe5, 0x36, 0x60, 0x59, 0xb4, 0x80, 0x03, 0x43, 0x11, 0x02, 0xe5, 0x11,
47 0x30, 0xe7, 0x24, 0xe5, 0x36, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x36, 0x20, 0x85, 0x36, 0x24,
48 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x29, 0x7e, 0x75, 0x2a, 0x80, 0x12, 0x0b, 0x9a, 0xe5, 0x36, 0x25,
49 0xe0, 0x90, 0x7f, 0xb7, 0xf0, 0x80, 0x2a, 0xe5, 0x36, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75}},
50 {0x0146, 64, { 0x36, 0x3f, 0x85, 0x36, 0x24, 0x90, 0x7e, 0x80, 0xe5, 0x11, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x29,
51 0x7e, 0x75, 0x2a, 0x81, 0x12, 0x09, 0x35, 0xe5, 0x36, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x75, 0x26,
52 0xff, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x0e, 0x03, 0x02, 0x03, 0xc4, 0xe4, 0xf5,
53 0x35, 0x74, 0x40, 0x25, 0x35, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5}},
54 {0x0186, 64, { 0x35, 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x00, 0x24, 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef,
55 0x12, 0x0a, 0x97, 0x05, 0x35, 0xe5, 0x35, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x6e,
56 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x0c, 0xda, 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12,
57 0x0c, 0x1c, 0x90, 0x7e, 0x02, 0xe0, 0xff, 0x12, 0x0c, 0x42, 0xd2, 0x11, 0xd2, 0x12, 0x75}},
58 {0x01c6, 64, { 0x36, 0x04, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x05, 0xc2, 0x12, 0x43, 0x36, 0xc0, 0x90, 0x7e, 0x04, 0xe0,
59 0xb4, 0x01, 0x07, 0xc2, 0x12, 0x43, 0x36, 0x0b, 0x80, 0x10, 0x90, 0x7e, 0x04, 0xe0, 0x60, 0x07,
60 0xc2, 0x11, 0x43, 0x36, 0x09, 0x80, 0x03, 0x43, 0x36, 0x02, 0x7f, 0x03, 0xad, 0x36, 0x12, 0x0c,
61 0xda, 0x43, 0x1a, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x1a}},
62 {0x0206, 64, { 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x17, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e,
63 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x19, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0,
64 0x90, 0xc0, 0x00, 0xe5, 0x19, 0xf0, 0x90, 0x7e, 0x07, 0xe0, 0x60, 0x42, 0x90, 0x7e, 0x13, 0xe0,
65 0x60, 0x05, 0x43, 0x16, 0x04, 0x80, 0x03, 0x53, 0x16, 0xfb, 0xe4, 0xff, 0xad, 0x16, 0x12}},
66 {0x0246, 64, { 0x0c, 0xda, 0x90, 0x7e, 0x08, 0xe0, 0x60, 0x05, 0x43, 0x18, 0x80, 0x80, 0x03, 0x53, 0x18, 0x7f, 0x53,
67 0x18, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x18, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x0c,
68 0x8e, 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x0c, 0xb4, 0xaf, 0x18, 0x12, 0x0c, 0x68, 0x90, 0x7e,
69 0x0e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x1a, 0x01, 0x80, 0x03, 0x53, 0x1a}},
70 {0x0286, 64, { 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x1a, 0xf0, 0x90, 0x7e, 0x0c, 0xe0,
71 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x1a, 0x02, 0x80, 0x03, 0x53, 0x1a, 0xfd, 0x90, 0x7f,
72 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x1a, 0xf0, 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x13,
73 0xa3, 0xe0, 0x13, 0x92, 0x14, 0xa3, 0xe0, 0xf5, 0x14, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x1a}},
74 {0x02c6, 64, { 0x10, 0x80, 0x03, 0x53, 0x1a, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x1a,
75 0xf0, 0x90, 0x7e, 0x16, 0xe0, 0x60, 0x32, 0x53, 0x19, 0xbf, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0,
76 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x12, 0x0d,
77 0xd2, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x16, 0xfd, 0xe4, 0xff, 0xad, 0x16}},
78 {0x0306, 64, { 0x12, 0x0c, 0xda, 0xe4, 0xf5, 0x0e, 0xf5, 0x0d, 0xd2, 0x0f, 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43,
79 0x16, 0x02, 0xe4, 0xff, 0xad, 0x16, 0x12, 0x0c, 0xda, 0x75, 0x0d, 0x01, 0xd2, 0x0f, 0x90, 0x7e,
80 0x18, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x17, 0x44, 0x04, 0x90, 0xc0,
81 0x00, 0xf0, 0xd2, 0x0b, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11, 0x43, 0x19, 0x40, 0x90, 0x7f}},
82 {0x0346, 64, { 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60,
83 0x0f, 0x53, 0x16, 0xfe, 0xe4, 0xff, 0xad, 0x16, 0x12, 0x0c, 0xda, 0x75, 0x0f, 0x01, 0xd2, 0x0f,
84 0x90, 0x7e, 0x1b, 0xe0, 0x60, 0x0f, 0x43, 0x16, 0x01, 0xe4, 0xff, 0xad, 0x16, 0x12, 0x0c, 0xda,
85 0xe4, 0xf5, 0x0f, 0xd2, 0x0f, 0x90, 0x7e, 0x1c, 0xe0, 0x60, 0x0e, 0x90, 0x7f, 0x98, 0x74}},
86 {0x0386, 64, { 0x12, 0xf0, 0xe5, 0x17, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2,
87 0x13, 0x90, 0x7e, 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x10, 0x01, 0xe4, 0xf5, 0x12, 0xd2, 0x0f, 0x90,
88 0x7e, 0x1f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15,
89 0xf0, 0x74, 0x35, 0xf0, 0xd2, 0x0d, 0xc2, 0x0e, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0x30, 0x16}},
90 {0x03c6, 64, { 0x71, 0xe5, 0x12, 0x60, 0x02, 0x15, 0x12, 0xe5, 0x30, 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x30, 0x80,
91 0x60, 0x75, 0x30, 0x0a, 0x12, 0x0d, 0xd2, 0xef, 0x54, 0x01, 0xf5, 0x36, 0x65, 0x0e, 0x60, 0x07,
92 0x85, 0x36, 0x0e, 0xd2, 0x0f, 0x80, 0x11, 0x12, 0x0e, 0x27, 0xef, 0x54, 0x10, 0xf5, 0x36, 0x65,
93 0x09, 0x60, 0x05, 0x85, 0x36, 0x09, 0xd2, 0x0f, 0x12, 0x0e, 0x27, 0xef, 0x54, 0x80, 0xf5}},
94 {0x0406, 64, { 0x36, 0x65, 0x0a, 0x60, 0x05, 0x85, 0x36, 0x0a, 0xd2, 0x0f, 0x12, 0x0e, 0x27, 0xef, 0x54, 0x20, 0xf5,
95 0x36, 0x65, 0x0b, 0x60, 0x08, 0x85, 0x36, 0x0b, 0x30, 0x11, 0x02, 0xd2, 0x0f, 0x12, 0x0e, 0x27,
96 0xef, 0x54, 0x40, 0xf5, 0x36, 0x65, 0x0c, 0x60, 0x08, 0x85, 0x36, 0x0c, 0x30, 0x12, 0x02, 0xd2,
97 0x0f, 0x30, 0x16, 0x2a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1, 0x23, 0x90, 0x7b, 0x40, 0xe0}},
98 {0x0446, 64, { 0x60, 0x09, 0xe0, 0xf5, 0x32, 0x90, 0x7b, 0x42, 0xe0, 0xf5, 0x33, 0x90, 0x7b, 0x41, 0xe0, 0x60, 0x09,
99 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4, 0x90, 0x7f, 0xd3, 0xf0, 0x90, 0x7f,
100 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x05, 0x29, 0xe5, 0x27, 0x70, 0x40, 0x30, 0x0f, 0x39, 0xe5,
101 0x12, 0x70, 0x35, 0xc2, 0x0f, 0xf5, 0x35, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x08, 0x25, 0x35}},
102 {0x0486, 64, { 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0a, 0x51, 0xff, 0x74, 0x80, 0x25, 0x35, 0xf5, 0x82, 0xe4, 0x34,
103 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x35, 0xe5, 0x35, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74,
104 0x09, 0xf0, 0x75, 0x12, 0x10, 0xe4, 0xf5, 0x10, 0x75, 0x27, 0x02, 0x22, 0xe5, 0x27, 0x64, 0x02,
105 0x70, 0x36, 0x30, 0x05, 0x2f, 0xc2, 0x05, 0xf5, 0x35, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2b}},
106 {0x04c6, 64, { 0x25, 0x35, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0a, 0x51, 0xff, 0x74, 0x80, 0x25, 0x35, 0xf5, 0x82,
107 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x35, 0xe5, 0x35, 0xb4, 0x05, 0xdb, 0x90, 0x7f,
108 0xc3, 0x74, 0x05, 0xf0, 0x75, 0x27, 0x03, 0x22, 0xe5, 0x32, 0x60, 0x33, 0x75, 0x31, 0x03, 0x15,
109 0x32, 0xe4, 0xf5, 0x35, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x31, 0x25, 0x35, 0xf9, 0xee, 0x34}},
110 {0x0506, 64, { 0x00, 0xfa, 0x12, 0x0a, 0x51, 0xff, 0x74, 0x80, 0x25, 0x35, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83,
111 0xef, 0xf0, 0x05, 0x35, 0xe5, 0x35, 0xb4, 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4,
112 0xf5, 0x27, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0a, 0xa9, 0x06, 0x08, 0x00, 0x06, 0x7c, 0x01,
113 0x06, 0xe9, 0x03, 0x05, 0x4d, 0x06, 0x05, 0xf9, 0x08, 0x05, 0xed, 0x09, 0x05, 0xd5, 0x0a}},
114 {0x0546, 64, { 0x05, 0xe4, 0x0b, 0x00, 0x00, 0x07, 0x39, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60,
115 0x50, 0x24, 0x02, 0x70, 0x6f, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5,
116 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03,
117 0x75, 0x82, 0x82, 0x75, 0x83, 0x19, 0xef, 0xf0, 0x75, 0x82, 0x74, 0x75, 0x83, 0x19, 0xf0}},
118 {0x0586, 64, { 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83,
119 0x19, 0xf0, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x12, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x07,
120 0x40, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0b, 0x1c, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f,
121 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xb4, 0xe0, 0x44}},
122 {0x05c6, 64, { 0x01, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f,
123 0x00, 0xe5, 0x25, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xea,
124 0xe0, 0xf5, 0x25, 0x02, 0x07, 0x40, 0x12, 0x07, 0x48, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x23, 0x02,
125 0x07, 0x40, 0x90, 0x7f, 0x00, 0xe5, 0x23, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02}},
126 {0x0606, 64, { 0x07, 0x40, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b,
127 0xa2, 0x01, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x07, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00,
128 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x40, 0xe4, 0x90, 0x7f,
129 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f}},
130 {0x0646, 64, { 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24,
131 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4,
132 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
133 0x01, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1e, 0x24, 0x02}},
134 {0x0686, 64, { 0x60, 0x03, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x06, 0x12, 0x0d, 0xf9, 0x02, 0x07,
135 0x40, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x07, 0x40, 0x90, 0x7f, 0xea, 0xe0, 0x70,
136 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07,
137 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90}},
138 {0x06c6, 64, { 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90,
139 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x60, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0,
140 0x80, 0x57, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x24, 0x02, 0x70, 0x4b, 0x90, 0x7f,
141 0xea, 0xe0, 0xb4, 0x01, 0x05, 0x12, 0x0d, 0xf6, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44}},
142 {0x0706, 64, { 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80,
143 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4,
144 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0,
145 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02}},
146 {0x0746, 64, { 0xf0, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x96, 0x74,
147 0x20, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f,
148 0x98, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde,
149 0xf0, 0xe4, 0xf5, 0x08, 0x7f, 0x01, 0x7b, 0x00, 0x74, 0x08, 0x2f, 0xf9, 0xe4, 0x34, 0x00}},
150 {0x0786, 64, { 0xfa, 0xe4, 0x12, 0x0a, 0x97, 0x0f, 0xbf, 0x09, 0xee, 0x75, 0x13, 0x01, 0xe4, 0xf5, 0x12, 0xf5, 0x30,
151 0xf5, 0x11, 0xc2, 0x0f, 0xc2, 0x13, 0xc2, 0x0e, 0xc2, 0x0b, 0xc2, 0x10, 0xc2, 0x04, 0x90, 0x7f,
152 0x98, 0x74, 0x13, 0xf0, 0x75, 0x19, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4,
153 0xfd, 0x12, 0x0c, 0xda, 0x7f, 0x10, 0x8f, 0x18, 0x12, 0x0c, 0x68, 0x90, 0x7f, 0x98, 0x74}},
154 {0x07c6, 64, { 0x12, 0xf0, 0x7f, 0x01, 0x8f, 0x17, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x0f, 0xe4, 0xfd, 0x12,
155 0x0c, 0xda, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x16, 0x12, 0x0c, 0xda, 0x90, 0x7f, 0x98,
156 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x0c, 0xda, 0x7f,
157 0x01, 0x12, 0x0d, 0x6a, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x0c, 0xda, 0xe4, 0xff, 0xe5, 0x16}},
158 {0x0806, 64, { 0x54, 0x7f, 0xfd, 0x12, 0x0c, 0xda, 0x12, 0x0e, 0x0f, 0x8f, 0x15, 0xe4, 0xff, 0xe5, 0x16, 0x44, 0x80,
159 0xfd, 0x12, 0x0c, 0xda, 0xe5, 0x15, 0x30, 0xe7, 0x04, 0xc2, 0x08, 0x80, 0x02, 0xd2, 0x08, 0x90,
160 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x75, 0x1a, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0xd2, 0x03,
161 0x22, 0xd2, 0x15, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x0d, 0xf9, 0xd2, 0xe8}},
162 {0x0846, 64, { 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74,
163 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf,
164 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0x74, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0x16, 0x12, 0x0d,
165 0x24, 0xc2, 0x02, 0xe4, 0xf5, 0x28, 0xf5, 0x30, 0xc2, 0x09, 0xf5, 0x23, 0xc2, 0x03, 0x90}},
166 {0x0886, 64, { 0x7f, 0xa1, 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x34, 0x60, 0x48, 0x30, 0x03, 0x05, 0xd2, 0x16,
167 0x12, 0x00, 0x46, 0xe5, 0x0f, 0x60, 0x22, 0xe5, 0x26, 0x60, 0x16, 0x15, 0x26, 0x90, 0x7f, 0xd8,
168 0xe0, 0x30, 0xe6, 0x04, 0x7f, 0x20, 0x80, 0x02, 0x7f, 0x30, 0x90, 0x7f, 0x96, 0xef, 0xf0, 0x80,
169 0x1a, 0x90, 0x7f, 0x96, 0x74, 0x30, 0xf0, 0x80, 0x12, 0x90, 0x7f, 0xd9, 0xe0, 0x30, 0xe2}},
170 {0x08c6, 64, { 0x04, 0x7f, 0x30, 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f, 0x96, 0xef, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0xf5,
171 0x34, 0x80, 0x20, 0x30, 0x03, 0x07, 0xc2, 0x16, 0x12, 0x00, 0x46, 0x80, 0x16, 0xe5, 0x0f, 0x70,
172 0x12, 0x90, 0x7f, 0xd9, 0xe0, 0x30, 0xe2, 0x04, 0x7f, 0x30, 0x80, 0x02, 0x7f, 0x20, 0x90, 0x7f,
173 0x96, 0xef, 0xf0, 0x30, 0x02, 0x07, 0xc2, 0x02, 0x12, 0x05, 0x2a, 0x80, 0x86, 0x30, 0x0a}},
174 {0x0906, 64, { 0x83, 0xc2, 0x0a, 0x12, 0x0b, 0x5d, 0x02, 0x08, 0x8a, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf,
175 0x24, 0xe5, 0x2a, 0xf5, 0x82, 0xe5, 0x29, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00,
176 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f,
177 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x24, 0xe5, 0x2a, 0xf5, 0x82, 0xe5, 0x29, 0xf5, 0x83, 0xc2}},
178 {0x0946, 64, { 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86,
179 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x24, 0xe5, 0x2a, 0xf5, 0x82, 0xe5,
180 0x29, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86,
181 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf}},
182 {0x0986, 64, { 0x24, 0xe5, 0x2a, 0xf5, 0x82, 0xe5, 0x29, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0,
183 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00, 0xf5,
184 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f,
185 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x78}},
186 {0x09c6, 64, { 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x39, 0x02, 0x0a, 0x0c, 0x02, 0x08, 0x38, 0xe4, 0x93, 0xa3,
187 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4,
188 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8,
189 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02}},
190 {0x0a06, 64, { 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0d, 0x8b, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff,
191 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54,
192 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4,
193 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82}},
194 {0x0a46, 64, { 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a,
195 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83,
196 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83,
197 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25}},
198 {0x0a86, 64, { 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22,
199 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01,
200 0xf3, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d,
201 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02}},
202 {0x0ac6, 64, { 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c,
203 0x74, 0x20, 0xf0, 0x30, 0x01, 0x03, 0xff, 0x80, 0x02, 0x7f, 0x00, 0x90, 0x7f, 0x96, 0xef, 0xf0,
204 0xe4, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0,
205 0x30, 0x08, 0x11, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0xff, 0xf0, 0x90, 0x7f}},
206 {0x0b06, 64, { 0x98, 0x74, 0x20, 0xf0, 0x22, 0xe4, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0xdf, 0xf0, 0xe4,
207 0x90, 0x7f, 0x98, 0xf0, 0x22, 0x8f, 0x35, 0xe4, 0xf5, 0x36, 0x75, 0x37, 0xff, 0x75, 0x38, 0x19,
208 0x75, 0x39, 0x86, 0xab, 0x37, 0xaa, 0x38, 0xa9, 0x39, 0x90, 0x00, 0x01, 0x12, 0x0a, 0x6a, 0xb4,
209 0x03, 0x1d, 0xaf, 0x36, 0x05, 0x36, 0xef, 0xb5, 0x35, 0x01, 0x22, 0x12, 0x0a, 0x51, 0x7e}},
210 {0x0b46, 64, { 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x37, 0xff, 0xf5, 0x38, 0x89, 0x39, 0x80, 0xd4, 0x7b,
211 0x00, 0x7a, 0x00, 0x79, 0x00, 0x22, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x35, 0x12, 0x0a, 0xcf, 0x20,
212 0x08, 0x07, 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0,
213 0x12, 0x09, 0xb5, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x0e, 0x30, 0x01, 0x05, 0x12, 0x0d}},
214 {0x0b86, 64, { 0xbc, 0x80, 0x06, 0x12, 0x0d, 0x49, 0xef, 0x60, 0xe1, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02, 0xf0, 0x12,
215 0x07, 0x48, 0x22, 0x05, 0x2a, 0xe5, 0x2a, 0xae, 0x29, 0x70, 0x02, 0x05, 0x29, 0x14, 0xf5, 0x82,
216 0x8e, 0x83, 0xe5, 0x11, 0xf0, 0x12, 0x00, 0x36, 0x05, 0x2a, 0xe5, 0x2a, 0xac, 0x29, 0x70, 0x02,
217 0x05, 0x29, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x24, 0xe5, 0x24, 0x60, 0x07}},
218 {0x0bc6, 64, { 0x12, 0x0e, 0x1b, 0x8f, 0x11, 0x80, 0xcd, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0,
219 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x02, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01,
220 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0,
221 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x0a}},
222 {0x0c06, 64, { 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82,
223 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf,
224 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74,
225 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74}},
226 {0x0c46, 64, { 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00,
227 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
228 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98,
229 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5}},
230 {0x0c86, 64, { 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00,
231 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f,
232 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98,
233 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0}},
234 {0x0cc6, 64, { 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0,
235 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x19, 0x54, 0x7f, 0x90, 0xc0, 0x00,
236 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74,
237 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x0d, 0xea, 0x8f, 0x37, 0x12, 0x0d}},
238 {0x0d06, 64, { 0xea, 0x8f, 0x38, 0xe5, 0x37, 0x65, 0x38, 0x60, 0x12, 0x12, 0x0d, 0xea, 0x8f, 0x37, 0xe5, 0x37, 0x65,
239 0x38, 0x60, 0x07, 0x12, 0x0d, 0xea, 0x8f, 0x38, 0x80, 0xe8, 0xaf, 0x37, 0x22, 0x90, 0x7f, 0xd6,
240 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x16, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f,
241 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0xa5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44}},
242 {0x0d46, 64, { 0x04, 0xf0, 0x22, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x36, 0x12, 0x07, 0x48, 0x12, 0x0e, 0x27, 0xef, 0x30,
243 0xe6, 0x0b, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x36, 0x60, 0xf1, 0x7f, 0x01, 0x22, 0x12, 0x0a, 0xcf,
244 0x7f, 0x00, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x16, 0x54, 0x7f, 0xfd, 0x12, 0x0c, 0xda, 0x90,
245 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x16, 0x44, 0x80}},
246 {0x0d86, 64, { 0xfd, 0x12, 0x0c, 0xda, 0x22, 0x05, 0x2b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x31, 0x03, 0x00, 0x00,
247 0xc1, 0x86, 0xc1, 0x02, 0xc1, 0x0a, 0xc1, 0x01, 0xc1, 0x07, 0x01, 0x27, 0x00, 0x00, 0x8e, 0x36,
248 0x8f, 0x37, 0xe5, 0x37, 0x15, 0x37, 0xae, 0x36, 0x70, 0x02, 0x15, 0x36, 0x4e, 0x60, 0x05, 0x12,
249 0x09, 0xa4, 0x80, 0xee, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x0d, 0x7e}},
250 {0x0dc6, 64, { 0x00, 0x12, 0x0d, 0xa5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x11,
251 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00,
252 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0xd2,
253 0x01, 0x22, 0xc2, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0b, 0xce, 0x00, 0x02, 0x0e}},
254 {0x0e06, 64, { 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x0b, 0xf5, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0,
255 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
256 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
258 {0x0e46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
262 {0x0e86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
266 {0x0ec6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
270 {0x0f06, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
274 {0x0f46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
278 {0x0f86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
282 {0x0fc6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
286 {0x1006, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
290 {0x1046, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
294 {0x1086, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
298 {0x10c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
302 {0x1106, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
306 {0x1146, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
310 {0x1186, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
314 {0x11c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
318 {0x1206, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
322 {0x1246, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
326 {0x1286, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
330 {0x12c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
334 {0x1306, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
338 {0x1346, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
342 {0x1386, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
346 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
350 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
354 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
358 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
362 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
366 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
370 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
374 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
378 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
382 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
386 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
390 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
394 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
398 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
402 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
406 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
410 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
414 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
418 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
422 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
426 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
430 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x19, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
431 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
432 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
433 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
434 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
435 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
436 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
437 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
438 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
439 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
440 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
441 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
442 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
443 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
444 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
445 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
446 {0x1a06, 4, { 0x72, 0x00, 0x00, 0x00}},
447 {0xffff, 0, {0x00}}
448};
diff --git a/drivers/usb/serial/keyspan_usa19w_fw.h b/drivers/usb/serial/keyspan_usa19w_fw.h
new file mode 100644
index 000000000000..75d6191245c6
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa19w_fw.h
@@ -0,0 +1,446 @@
1/* keyspan_usa19w_fw.h
2
3 The firmware contained herein as keyspan_usa19w_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22*/
23
24static const struct ezusb_hex_record keyspan_usa19w_firmware[] = {
25 {0x0033, 3, { 0x02, 0x0d, 0x5c}},
26 {0x0003, 16, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0}},
27 {0x0013, 16, { 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90}},
28 {0x0023, 15, { 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x17, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x22}},
29 {0x0046, 16, { 0x30, 0x0f, 0x18, 0x12, 0x0d, 0x38, 0xef, 0xc3, 0x95, 0x14, 0x40, 0x03, 0x02, 0x00, 0xd8, 0x90}},
30 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x0f, 0xc2, 0x0a, 0x80, 0x77, 0x30, 0x0c, 0x3b, 0x90, 0x7f}},
31 {0x0066, 16, { 0xc6, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x0d, 0x38, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7e}},
32 {0x0076, 16, { 0x40, 0xe0, 0x13, 0x92, 0x0f, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x1c, 0x20, 0x0a, 0x11, 0x60}},
33 {0x0086, 16, { 0x0f, 0xf5, 0x23, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x27, 0x7e, 0x75, 0x28, 0x41, 0x12, 0x08, 0x01}},
34 {0x0096, 16, { 0xc2, 0x0c, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x39, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x32}},
35 {0x00a6, 16, { 0x12, 0x0d, 0x38, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x0f}},
36 {0x00b6, 16, { 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x1c, 0x20, 0x0a, 0x11, 0x60, 0x0f, 0xf5, 0x23, 0x7e, 0x7d}},
37 {0x00c6, 16, { 0x7f, 0xc1, 0x75, 0x27, 0x7d, 0x75, 0x28, 0xc1, 0x12, 0x08, 0x01, 0xd2, 0x0c, 0xe4, 0x90, 0x7f}},
38 {0x00d6, 16, { 0xc9, 0xf0, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x01, 0x5e, 0x12, 0x0c, 0x41, 0x8f}},
39 {0x00e6, 16, { 0x1c, 0x12, 0x0d, 0x44, 0x8f, 0x11, 0xe5, 0x1c, 0xc3, 0x95, 0x13, 0x50, 0x0f, 0x12, 0x0d, 0x20}},
40 {0x00f6, 16, { 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x11, 0x20, 0xe7, 0x03, 0x30, 0x12, 0x5c, 0xc2, 0x12, 0xe5, 0x1c}},
41 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
42 {0x0043, 3, { 0x02, 0x0e, 0x00}},
43 {0x0000, 3, { 0x02, 0x08, 0xb6}},
44 {0x0106, 64, { 0x60, 0x56, 0xb4, 0x80, 0x03, 0x43, 0x11, 0x02, 0xe5, 0x11, 0x30, 0xe7, 0x24, 0xe5, 0x1c, 0xd3, 0x94,
45 0x20, 0x40, 0x03, 0x75, 0x1c, 0x20, 0x85, 0x1c, 0x23, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x27, 0x7e,
46 0x75, 0x28, 0x80, 0x12, 0x0a, 0x86, 0xe5, 0x1c, 0x25, 0x1c, 0x90, 0x7f, 0xb7, 0xf0, 0x80, 0x27,
47 0xe5, 0x1c, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x1c, 0x3f, 0x85, 0x1c, 0x23, 0x90, 0x7e}},
48 {0x0146, 64, { 0x80, 0xe5, 0x11, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x27, 0x7e, 0x75, 0x28, 0x81, 0x12, 0x08, 0x26,
49 0xe5, 0x1c, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x0d,
50 0x03, 0x02, 0x03, 0xba, 0xe4, 0xf5, 0x1b, 0x74, 0x40, 0x25, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0x7c,
51 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x1b, 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x00, 0x24}},
52 {0x0186, 64, { 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef, 0x12, 0x0a, 0x0d, 0x05, 0x1b, 0xe5, 0x1b, 0xb4, 0x20, 0xd7,
53 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x6e, 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x0c, 0x1c,
54 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12, 0x0b, 0x5e, 0x90, 0x7e, 0x02, 0xe0, 0xff, 0x12, 0x0b, 0x84,
55 0xd2, 0x10, 0xd2, 0x11, 0x75, 0x1c, 0x04, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x05, 0xc2, 0x11}},
56 {0x01c6, 64, { 0x43, 0x1c, 0xc0, 0x90, 0x7e, 0x04, 0xe0, 0xb4, 0x01, 0x07, 0xc2, 0x11, 0x43, 0x1c, 0x0b, 0x80, 0x10,
57 0x90, 0x7e, 0x04, 0xe0, 0x60, 0x07, 0xc2, 0x10, 0x43, 0x1c, 0x09, 0x80, 0x03, 0x43, 0x1c, 0x02,
58 0x7f, 0x03, 0xad, 0x1c, 0x12, 0x0c, 0x1c, 0x43, 0x19, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0,
59 0x90, 0xc0, 0x00, 0xe5, 0x19, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x16, 0x44}},
60 {0x0206, 64, { 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x18,
61 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x18, 0xf0, 0x90, 0x7e, 0x07, 0xe0,
62 0x60, 0x42, 0x90, 0x7e, 0x13, 0xe0, 0x60, 0x05, 0x43, 0x15, 0x04, 0x80, 0x03, 0x53, 0x15, 0xfb,
63 0xe4, 0xff, 0xad, 0x15, 0x12, 0x0c, 0x1c, 0x90, 0x7e, 0x08, 0xe0, 0x60, 0x05, 0x43, 0x17}},
64 {0x0246, 64, { 0x80, 0x80, 0x03, 0x53, 0x17, 0x7f, 0x53, 0x17, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x17,
65 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x0b, 0xd0, 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x0b, 0xf6, 0xaf,
66 0x17, 0x12, 0x0b, 0xaa, 0x90, 0x7e, 0x0e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x19,
67 0x01, 0x80, 0x03, 0x53, 0x19, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00}},
68 {0x0286, 64, { 0xe5, 0x19, 0xf0, 0x90, 0x7e, 0x0c, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x19, 0x02, 0x80,
69 0x03, 0x53, 0x19, 0xfd, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x19, 0xf0,
70 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x13, 0xa3, 0xe0, 0x13, 0x92, 0x13, 0xa3, 0xe0, 0xf5, 0x14, 0xa3,
71 0xe0, 0x60, 0x05, 0x43, 0x19, 0x10, 0x80, 0x03, 0x53, 0x19, 0xef, 0x90, 0x7f, 0x98, 0x74}},
72 {0x02c6, 64, { 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x19, 0xf0, 0x90, 0x7e, 0x16, 0xe0, 0x60, 0x32, 0x53, 0x18, 0xbf,
73 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f,
74 0x98, 0x74, 0x11, 0xf0, 0x12, 0x0d, 0x14, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x15,
75 0xfd, 0xe4, 0xff, 0xad, 0x15, 0x12, 0x0c, 0x1c, 0xe4, 0xf5, 0x0e, 0xf5, 0x0d, 0xd2, 0x0e}},
76 {0x0306, 64, { 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43, 0x15, 0x02, 0xe4, 0xff, 0xad, 0x15, 0x12, 0x0c, 0x1c, 0x75,
77 0x0d, 0x01, 0xd2, 0x0e, 0x90, 0x7e, 0x18, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0,
78 0xe5, 0x16, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2, 0x0a, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11,
79 0x43, 0x18, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0}},
80 {0x0346, 64, { 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60, 0x0f, 0x53, 0x15, 0xfe, 0xe4, 0xff, 0xad, 0x15, 0x12, 0x0c,
81 0x1c, 0x75, 0x0f, 0x01, 0xd2, 0x0e, 0x90, 0x7e, 0x1b, 0xe0, 0x60, 0x0f, 0x43, 0x15, 0x01, 0xe4,
82 0xff, 0xad, 0x15, 0x12, 0x0c, 0x1c, 0xe4, 0xf5, 0x0f, 0xd2, 0x0e, 0x90, 0x7e, 0x1c, 0xe0, 0x60,
83 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x16, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0}},
84 {0x0386, 64, { 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2, 0x12, 0x90, 0x7e, 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x10, 0x01,
85 0xe4, 0xf5, 0x12, 0xd2, 0x0e, 0x90, 0x7e, 0x1f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11,
86 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15, 0xf0, 0x74, 0x35, 0xf0, 0xd2, 0x0c, 0xc2, 0x0d, 0xe4, 0x90,
87 0x7f, 0xcf, 0xf0, 0x30, 0x15, 0x71, 0xe5, 0x12, 0x60, 0x02, 0x15, 0x12, 0xe5, 0x2e, 0xd3}},
88 {0x03c6, 64, { 0x94, 0x00, 0x40, 0x04, 0x15, 0x2e, 0x80, 0x60, 0x75, 0x2e, 0x0a, 0x12, 0x0d, 0x14, 0xef, 0x54, 0x01,
89 0xf5, 0x1c, 0x65, 0x0e, 0x60, 0x07, 0x85, 0x1c, 0x0e, 0xd2, 0x0e, 0x80, 0x11, 0x12, 0x0d, 0x50,
90 0xef, 0x54, 0x10, 0xf5, 0x1c, 0x65, 0x09, 0x60, 0x05, 0x85, 0x1c, 0x09, 0xd2, 0x0e, 0x12, 0x0d,
91 0x50, 0xef, 0x54, 0x80, 0xf5, 0x1c, 0x65, 0x0a, 0x60, 0x05, 0x85, 0x1c, 0x0a, 0xd2, 0x0e}},
92 {0x0406, 64, { 0x12, 0x0d, 0x50, 0xef, 0x54, 0x20, 0xf5, 0x1c, 0x65, 0x0b, 0x60, 0x08, 0x85, 0x1c, 0x0b, 0x30, 0x10,
93 0x02, 0xd2, 0x0e, 0x12, 0x0d, 0x50, 0xef, 0x54, 0x40, 0xf5, 0x1c, 0x65, 0x0c, 0x60, 0x08, 0x85,
94 0x1c, 0x0c, 0x30, 0x11, 0x02, 0xd2, 0x0e, 0x30, 0x15, 0x2a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1,
95 0x23, 0x90, 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5, 0x30, 0x90, 0x7b, 0x42, 0xe0, 0xf5}},
96 {0x0446, 64, { 0x31, 0x90, 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4,
97 0x90, 0x7f, 0xd3, 0xf0, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x05, 0x1f, 0xe5, 0x25,
98 0x70, 0x40, 0x30, 0x0e, 0x39, 0xe5, 0x12, 0x70, 0x35, 0xc2, 0x0e, 0xf5, 0x1b, 0x7e, 0x00, 0x7b,
99 0x00, 0x74, 0x08, 0x25, 0x1b, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x09, 0xc7, 0xff, 0x74}},
100 {0x0486, 64, { 0x80, 0x25, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x1b, 0xe5, 0x1b, 0xb4,
101 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x12, 0x10, 0xe4, 0xf5, 0x10, 0x75, 0x25,
102 0x02, 0x22, 0xe5, 0x25, 0x64, 0x02, 0x70, 0x36, 0x30, 0x05, 0x2f, 0xc2, 0x05, 0xf5, 0x1b, 0x7e,
103 0x00, 0x7b, 0x00, 0x74, 0x29, 0x25, 0x1b, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x09, 0xc7}},
104 {0x04c6, 64, { 0xff, 0x74, 0x80, 0x25, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x1b, 0xe5,
105 0x1b, 0xb4, 0x05, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x05, 0xf0, 0x75, 0x25, 0x03, 0x22, 0xe5, 0x30,
106 0x60, 0x33, 0x75, 0x2f, 0x03, 0x15, 0x30, 0xe4, 0xf5, 0x1b, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2f,
107 0x25, 0x1b, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x09, 0xc7, 0xff, 0x74, 0x80, 0x25, 0x1b}},
108 {0x0506, 64, { 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x1b, 0xe5, 0x1b, 0xb4, 0x03, 0xdb, 0x90,
109 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x25, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0a, 0x1f,
110 0x05, 0xf6, 0x00, 0x06, 0x6a, 0x01, 0x06, 0xd7, 0x03, 0x05, 0x43, 0x06, 0x05, 0xe9, 0x08, 0x05,
111 0xe3, 0x09, 0x05, 0xcb, 0x0a, 0x05, 0xda, 0x0b, 0x00, 0x00, 0x07, 0x27, 0x90, 0x7f, 0xeb}},
112 {0x0546, 64, { 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x50, 0x24, 0x02, 0x70, 0x6f, 0x74, 0x19, 0x90, 0x7f, 0xd4,
113 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x04,
114 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19, 0xef, 0xf0, 0x75, 0x82,
115 0x74, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea}},
116 {0x0586, 64, { 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x12,
117 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0a, 0x45, 0xea,
118 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x07, 0x2e,
119 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xb4, 0xe0, 0x44}},
120 {0x05c6, 64, { 0x01, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0x00, 0xe5, 0x24, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0,
121 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x24, 0x02, 0x07, 0x2e, 0x12, 0x07, 0x36, 0x02,
122 0x07, 0x2e, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0x2e, 0x90,
123 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2}},
124 {0x0606, 64, { 0x01, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x07, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4,
125 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x2e, 0xe4, 0x90, 0x7f, 0x00, 0xf0,
126 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xec, 0xe0, 0xf4,
127 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4}},
128 {0x0646, 64, { 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0,
129 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0,
130 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1e, 0x24, 0x02, 0x60, 0x03, 0x02,
131 0x07, 0x2e, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x06, 0x12, 0x0d, 0x63, 0x02, 0x07, 0x2e}},
132 {0x0686, 64, { 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x07, 0x2e, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90,
133 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25,
134 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0,
135 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f}},
136 {0x06c6, 64, { 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x60, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x57,
137 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x24, 0x02, 0x70, 0x4b, 0x90, 0x7f, 0xea, 0xe0,
138 0xb4, 0x01, 0x05, 0x12, 0x0d, 0x60, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80,
139 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff}},
140 {0x0706, 64, { 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f,
141 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07,
142 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22, 0xe4,
143 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0}},
144 {0x0746, 64, { 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x18,
145 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0xe4, 0xf5,
146 0x08, 0x7f, 0x01, 0x7b, 0x00, 0x74, 0x08, 0x2f, 0xf9, 0xe4, 0x34, 0x00, 0xfa, 0xe4, 0x12, 0x0a,
147 0x0d, 0x0f, 0xbf, 0x09, 0xee, 0x75, 0x13, 0x01, 0xe4, 0xf5, 0x12, 0xf5, 0x2e, 0xf5, 0x11}},
148 {0x0786, 64, { 0xc2, 0x0e, 0xc2, 0x12, 0xc2, 0x0d, 0xc2, 0x0a, 0xc2, 0x0f, 0xc2, 0x04, 0x90, 0x7f, 0x98, 0x74, 0x13,
149 0xf0, 0x75, 0x18, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x0c,
150 0x1c, 0x7f, 0x10, 0x8f, 0x17, 0x12, 0x0b, 0xaa, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x7f, 0x01,
151 0x8f, 0x16, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x0c, 0x1c}},
152 {0x07c6, 64, { 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x15, 0x12, 0x0c, 0x1c, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0,
153 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x0c, 0x1c, 0x7f, 0x01, 0x12, 0x0c,
154 0xac, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x0c, 0x1c, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x75, 0x19,
155 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0xd2, 0x03, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10}},
156 {0x0806, 64, { 0xf0, 0xaf, 0x23, 0xe5, 0x28, 0xf5, 0x82, 0xe5, 0x27, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0,
157 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90,
158 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x23, 0xe5, 0x28, 0xf5, 0x82, 0xe5, 0x27, 0xf5, 0x83, 0xc2,
159 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7}},
160 {0x0846, 64, { 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x23, 0xe5, 0x28, 0xf5, 0x82,
161 0xe5, 0x27, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05,
162 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf,
163 0x23, 0xe5, 0x28, 0xf5, 0x82, 0xe5, 0x27, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0}},
164 {0x0886, 64, { 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00,
165 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90,
166 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x78,
167 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x31, 0x02, 0x08, 0xfd, 0x02, 0x09, 0x42, 0xe4}},
168 {0x08c6, 64, { 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29,
169 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20,
170 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02,
171 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0c, 0xcd, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc}},
172 {0x0906, 64, { 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf,
173 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8,
174 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82,
175 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xd2, 0x14, 0x90, 0x7f}},
176 {0x0946, 64, { 0x92, 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x0d, 0x63, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74,
177 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0,
178 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f,
179 0xae, 0x74, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0x15, 0x12, 0x0c, 0x66, 0xc2, 0x02, 0xe4, 0xf5}},
180 {0x0986, 64, { 0x26, 0xf5, 0x2e, 0xc2, 0x08, 0xc2, 0x03, 0x90, 0x7f, 0xa1, 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65,
181 0x1a, 0x60, 0x10, 0x30, 0x03, 0x05, 0xd2, 0x15, 0x12, 0x00, 0x46, 0x90, 0x7f, 0xd8, 0xe0, 0xf5,
182 0x1a, 0x80, 0x08, 0x30, 0x03, 0x05, 0xc2, 0x15, 0x12, 0x00, 0x46, 0x30, 0x02, 0x07, 0xc2, 0x02,
183 0x12, 0x05, 0x20, 0x80, 0xd6, 0x30, 0x09, 0xd3, 0xc2, 0x09, 0x12, 0x0a, 0xba, 0x80, 0xcc}},
184 {0x09c6, 64, { 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02,
185 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5,
186 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22,
187 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5}},
188 {0x0a06, 64, { 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50,
189 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70,
190 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88,
191 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x8f}},
192 {0x0a46, 64, { 0x1b, 0xe4, 0xf5, 0x1c, 0x75, 0x1d, 0xff, 0x75, 0x1e, 0x19, 0x75, 0x1f, 0x86, 0xab, 0x1d, 0xaa, 0x1e,
193 0xa9, 0x1f, 0x90, 0x00, 0x01, 0x12, 0x09, 0xe0, 0xb4, 0x03, 0x1d, 0xaf, 0x1c, 0x05, 0x1c, 0xef,
194 0xb5, 0x1b, 0x01, 0x22, 0x12, 0x09, 0xc7, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75,
195 0x1d, 0xff, 0xf5, 0x1e, 0x89, 0x1f, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x22}},
196 {0x0a86, 64, { 0x05, 0x28, 0xe5, 0x28, 0xae, 0x27, 0x70, 0x02, 0x05, 0x27, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x11,
197 0xf0, 0x12, 0x00, 0x36, 0x05, 0x28, 0xe5, 0x28, 0xac, 0x27, 0x70, 0x02, 0x05, 0x27, 0x14, 0xf5,
198 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x23, 0xe5, 0x23, 0x60, 0x07, 0x12, 0x0d, 0x44, 0x8f, 0x11,
199 0x80, 0xcd, 0x22, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x1b, 0x12, 0x00, 0x03, 0x90, 0x7f, 0xd6}},
200 {0x0ac6, 64, { 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x08, 0xa6, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x0e, 0x30, 0x01, 0x05,
201 0x12, 0x0c, 0xfe, 0x80, 0x06, 0x12, 0x0c, 0x8b, 0xef, 0x60, 0xe1, 0x12, 0x07, 0x36, 0x22, 0xc0,
202 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90, 0x7f,
203 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0}},
204 {0x0b06, 64, { 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0,
205 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x02, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
206 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32,
207 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00}},
208 {0x0b46, 64, { 0xd2, 0x09, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85,
209 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00,
210 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f,
211 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f}},
212 {0x0b86, 64, { 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90,
213 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0,
214 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90,
215 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13}},
216 {0x0bc6, 64, { 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90,
217 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0,
218 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90,
219 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74}},
220 {0x0c06, 64, { 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f,
221 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x18, 0x54, 0x7f, 0x90,
222 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f,
223 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x0d, 0x2c, 0x8f, 0x1d}},
224 {0x0c46, 64, { 0x12, 0x0d, 0x2c, 0x8f, 0x1e, 0xe5, 0x1d, 0x65, 0x1e, 0x60, 0x12, 0x12, 0x0d, 0x2c, 0x8f, 0x1d, 0xe5,
225 0x1d, 0x65, 0x1e, 0x60, 0x07, 0x12, 0x0d, 0x2c, 0x8f, 0x1e, 0x80, 0xe8, 0xaf, 0x1d, 0x22, 0x90,
226 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x15, 0x04, 0xe0, 0x44, 0x02,
227 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0c, 0xe7, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0}},
228 {0x0c86, 64, { 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x1c, 0x12, 0x07, 0x36, 0x12, 0x0d, 0x50,
229 0xef, 0x30, 0xe6, 0x0b, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x1c, 0x60, 0xf1, 0x7f, 0x01, 0x22, 0x12,
230 0x00, 0x03, 0x7f, 0x00, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x15, 0x54, 0x7f, 0xfd, 0x12, 0x0c,
231 0x1c, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x15}},
232 {0x0cc6, 64, { 0x44, 0x80, 0xfd, 0x12, 0x0c, 0x1c, 0x22, 0x05, 0x29, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x2f, 0x03,
233 0x00, 0x00, 0xc1, 0x86, 0xc1, 0x02, 0xc1, 0x09, 0xc1, 0x01, 0xc1, 0x07, 0x01, 0x25, 0x00, 0x00,
234 0x8e, 0x1c, 0x8f, 0x1d, 0xe5, 0x1d, 0x15, 0x1d, 0xae, 0x1c, 0x70, 0x02, 0x15, 0x1c, 0x4e, 0x60,
235 0x05, 0x12, 0x08, 0x95, 0x80, 0xee, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x01, 0xf0, 0x7f}},
236 {0x0d06, 64, { 0x0d, 0x7e, 0x00, 0x12, 0x0c, 0xe7, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22, 0x90, 0x7f, 0x98,
237 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90,
238 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff,
239 0x22, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f}},
240 {0x0d46, 64, { 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90,
241 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x53, 0xd8, 0xef, 0x32, 0xd2, 0x01, 0x22, 0xc2, 0x01, 0x22, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
244 {0x0d86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
248 {0x0dc6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0b, 0x10, 0x00, 0x02, 0x0e}},
252 {0x0e06, 64, { 0x04, 0x00, 0x02, 0x0a, 0xe6, 0x00, 0x02, 0x0b, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
256 {0x0e46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
260 {0x0e86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
264 {0x0ec6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
268 {0x0f06, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
272 {0x0f46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
276 {0x0f86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
280 {0x0fc6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
284 {0x1006, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
288 {0x1046, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
292 {0x1086, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
296 {0x10c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
300 {0x1106, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
304 {0x1146, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
308 {0x1186, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
312 {0x11c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
316 {0x1206, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
320 {0x1246, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
324 {0x1286, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
328 {0x12c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
332 {0x1306, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
336 {0x1346, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
340 {0x1386, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
344 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
348 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
352 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
356 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
360 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
364 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
368 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
372 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
376 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
380 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
384 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
388 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
392 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
396 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
400 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
404 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
408 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
412 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
416 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
420 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
424 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
428 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x08, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
429 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
430 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
431 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
432 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
433 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
434 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
435 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
436 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
437 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
438 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
439 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
440 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
441 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
442 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
443 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
444 {0x1a06, 4, { 0x72, 0x00, 0x00, 0x00}},
445 {0xffff, 0, {0x00} }
446};
diff --git a/drivers/usb/serial/keyspan_usa26msg.h b/drivers/usb/serial/keyspan_usa26msg.h
new file mode 100644
index 000000000000..3808727db65a
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa26msg.h
@@ -0,0 +1,260 @@
1/*
2 usa26msg.h
3
4 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
5 This file is available under a BSD-style copyright
6
7 Keyspan USB Async Message Formats for the USA28X
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are
11 met:
12
13 1. Redistributions of source code must retain this licence text
14 without modification, this list of conditions, and the following
15 disclaimer. The following copyright notice must appear immediately at
16 the beginning of all source files:
17
18 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
19
20 This file is available under a BSD-style copyright
21
22 2. The name of InnoSys Incorporated may not be used to endorse or promote
23 products derived from this software without specific prior written
24 permission.
25
26 THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR
27 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
29 NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
30 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 SUCH DAMAGE.
37
38 Third revision: USA28X version (aka USA26)
39
40 Buffer formats for RX/TX data messages are not defined by
41 a structure, but are described here:
42
43 USB OUT (host -> USAxx, transmit) messages contain a
44 REQUEST_ACK indicator (set to 0xff to request an ACK at the
45 completion of transmit; 0x00 otherwise), followed by data:
46
47 RQSTACK DAT DAT DAT ...
48
49 with a total data length of 63.
50
51 USB IN (USAxx -> host, receive) messages begin with a status
52 byte in which the 0x80 bit is either:
53
54 (a) 0x80 bit clear
55 indicates that the bytes following it are all data
56 bytes:
57
58 STAT DATA DATA DATA DATA DATA ...
59
60 for a total of up to 63 DATA bytes,
61
62 or:
63
64 (b) 0x80 bit set
65 indiates that the bytes following alternate data and
66 status bytes:
67
68 STAT DATA STAT DATA STAT DATA STAT DATA ...
69
70 for a total of up to 32 DATA bytes.
71
72 The valid bits in the STAT bytes are:
73
74 OVERRUN 0x02
75 PARITY 0x04
76 FRAMING 0x08
77 BREAK 0x10
78
79 Notes:
80
81 (1) The OVERRUN bit can appear in either (a) or (b) format
82 messages, but the but the PARITY/FRAMING/BREAK bits
83 only appear in (b) format messages.
84 (2) For the host to determine the exact point at which the
85 overrun occurred (to identify the point in the data
86 stream at which the data was lost), it needs to count
87 128 characters, starting at the first character of the
88 message in which OVERRUN was reported; the lost character(s)
89 would have been received between the 128th and 129th
90 characters.
91 (3) An RX data message in which the first byte has 0x80 clear
92 serves as a "break off" indicator.
93
94 revision history:
95
96 1999feb10 add reportHskiaChanges to allow us to ignore them
97 1999feb10 add txAckThreshold for fast+loose throughput enhancement
98 1999mar30 beef up support for RX error reporting
99 1999apr14 add resetDataToggle to control message
100 2000jan04 merge with usa17msg.h
101 2000jun01 add extended BSD-style copyright text
102 2001jul05 change message format to improve OVERRUN case
103
104 Note on shared names:
105
106 In the case of fields which have been merged between the USA17
107 and USA26 definitions, the USA26 definition is the first part
108 of the name and the USA17 definition is the second part of the
109 name; both meanings are described below.
110*/
111
112#ifndef __USA26MSG__
113#define __USA26MSG__
114
115
116struct keyspan_usa26_portControlMessage
117{
118 /*
119 there are three types of "commands" sent in the control message:
120
121 1. configuration changes which must be requested by setting
122 the corresponding "set" flag (and should only be requested
123 when necessary, to reduce overhead on the USA26):
124 */
125 u8 setClocking, // BOTH: host requests baud rate be set
126 baudLo, // BOTH: host does baud divisor calculation
127 baudHi, // BOTH: baudHi is only used for first port (gives lower rates)
128 externalClock_txClocking,
129 // USA26: 0=internal, other=external
130 // USA17: 0=internal, other=external/RI
131 rxClocking, // USA17: 0=internal, 1=external/RI, other=external/DSR
132
133
134 setLcr, // BOTH: host requests lcr be set
135 lcr, // BOTH: use PARITY, STOPBITS, DATABITS below
136
137 setFlowControl, // BOTH: host requests flow control be set
138 ctsFlowControl, // BOTH: 1=use CTS flow control, 0=don't
139 xonFlowControl, // BOTH: 1=use XON/XOFF flow control, 0=don't
140 xonChar, // BOTH: specified in current character format
141 xoffChar, // BOTH: specified in current character format
142
143 setTxTriState_setRts,
144 // USA26: host requests TX tri-state be set
145 // USA17: host requests RTS output be set
146 txTriState_rts, // BOTH: 1=active (normal), 0=tristate (off)
147
148 setHskoa_setDtr,
149 // USA26: host requests HSKOA output be set
150 // USA17: host requests DTR output be set
151 hskoa_dtr, // BOTH: 1=on, 0=off
152
153 setPrescaler, // USA26: host requests prescalar be set (default: 13)
154 prescaler; // BOTH: specified as N/8; values 8-ff are valid
155 // must be set any time internal baud rate is set;
156 // must not be set when external clocking is used
157 // note: in USA17, prescaler is applied whenever
158 // setClocking is requested
159
160 /*
161 3. configuration data which is simply used as is (no overhead,
162 but must be specified correctly in every host message).
163 */
164 u8 forwardingLength, // BOTH: forward when this number of chars available
165 reportHskiaChanges_dsrFlowControl,
166 // USA26: 1=normal; 0=ignore external clock
167 // USA17: 1=use DSR flow control, 0=don't
168 txAckThreshold, // BOTH: 0=not allowed, 1=normal, 2-255 deliver ACK faster
169 loopbackMode; // BOTH: 0=no loopback, 1=loopback enabled
170
171 /*
172 4. commands which are flags only; these are processed in order
173 (so that, e.g., if both _txOn and _txOff flags are set, the
174 port ends in a TX_OFF state); any non-zero value is respected
175 */
176 u8 _txOn, // BOTH: enable transmitting (and continue if there's data)
177 _txOff, // BOTH: stop transmitting
178 txFlush, // BOTH: toss outbound data
179 txBreak, // BOTH: turn on break (cleared by _txOn)
180 rxOn, // BOTH: turn on receiver
181 rxOff, // BOTH: turn off receiver
182 rxFlush, // BOTH: toss inbound data
183 rxForward, // BOTH: forward all inbound data, NOW (as if fwdLen==1)
184 returnStatus, // BOTH: return current status (even if it hasn't changed)
185 resetDataToggle;// BOTH: reset data toggle state to DATA0
186
187};
188
189// defines for bits in lcr
190#define USA_DATABITS_5 0x00
191#define USA_DATABITS_6 0x01
192#define USA_DATABITS_7 0x02
193#define USA_DATABITS_8 0x03
194#define STOPBITS_5678_1 0x00 // 1 stop bit for all byte sizes
195#define STOPBITS_5_1p5 0x04 // 1.5 stop bits for 5-bit byte
196#define STOPBITS_678_2 0x04 // 2 stop bits for 6/7/8-bit byte
197#define USA_PARITY_NONE 0x00
198#define USA_PARITY_ODD 0x08
199#define USA_PARITY_EVEN 0x18
200#define PARITY_1 0x28
201#define PARITY_0 0x38
202
203// all things called "StatusMessage" are sent on the status endpoint
204
205struct keyspan_usa26_portStatusMessage // one for each port
206{
207 u8 port, // BOTH: 0=first, 1=second, other=see below
208 hskia_cts, // USA26: reports HSKIA pin
209 // USA17: reports CTS pin
210 gpia_dcd, // USA26: reports GPIA pin
211 // USA17: reports DCD pin
212 dsr, // USA17: reports DSR pin
213 ri, // USA17: reports RI pin
214 _txOff, // port has been disabled (by host)
215 _txXoff, // port is in XOFF state (either host or RX XOFF)
216 rxEnabled, // as configured by rxOn/rxOff 1=on, 0=off
217 controlResponse;// 1=a control message has been processed
218};
219
220// bits in RX data message when STAT byte is included
221#define RXERROR_OVERRUN 0x02
222#define RXERROR_PARITY 0x04
223#define RXERROR_FRAMING 0x08
224#define RXERROR_BREAK 0x10
225
226struct keyspan_usa26_globalControlMessage
227{
228 u8 sendGlobalStatus, // 2=request for two status responses
229 resetStatusToggle, // 1=reset global status toggle
230 resetStatusCount; // a cycling value
231};
232
233struct keyspan_usa26_globalStatusMessage
234{
235 u8 port, // 3
236 sendGlobalStatus, // from request, decremented
237 resetStatusCount; // as in request
238};
239
240struct keyspan_usa26_globalDebugMessage
241{
242 u8 port, // 2
243 a,
244 b,
245 c,
246 d;
247};
248
249// ie: the maximum length of an EZUSB endpoint buffer
250#define MAX_DATA_LEN 64
251
252// update status approx. 60 times a second (16.6666 ms)
253#define STATUS_UPDATE_INTERVAL 16
254
255// status rationing tuning value (each port gets checked each n ms)
256#define STATUS_RATION 10
257
258#endif
259
260
diff --git a/drivers/usb/serial/keyspan_usa28_fw.h b/drivers/usb/serial/keyspan_usa28_fw.h
new file mode 100644
index 000000000000..848b0a21f9ee
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa28_fw.h
@@ -0,0 +1,466 @@
1/* keyspan_usa28_fw.h
2
3 The firmware contained herein as keyspan_usa28_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa28_firmware[] = {
26 {0x0026, 10, { 0x12, 0x17, 0xdb, 0x12, 0x18, 0xb5, 0x12, 0x14, 0xc3, 0x22}},
27 {0x0033, 3, { 0x02, 0x00, 0x1d}},
28 {0x001d, 4, { 0x53, 0xd8, 0xef, 0x32}},
29 {0x0006, 16, { 0x8e, 0x12, 0x8f, 0x13, 0xe5, 0x13, 0x15, 0x13, 0xae, 0x12, 0x70, 0x02, 0x15, 0x12, 0x4e, 0x60}},
30 {0x0016, 7, { 0x05, 0x12, 0x18, 0xa4, 0x80, 0xee, 0x22}},
31 {0x0003, 3, { 0x02, 0x00, 0x46}},
32 {0x0046, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0, 0x08}},
33 {0x0056, 16, { 0x30, 0x99, 0x0e, 0x30, 0x11, 0x07, 0xa2, 0x17, 0x92, 0x9b, 0x85, 0x46, 0x99, 0xc2, 0x99, 0xd2}},
34 {0x0066, 16, { 0x1f, 0x30, 0xc1, 0x0e, 0x30, 0x12, 0x07, 0xa2, 0x18, 0x92, 0xc3, 0x85, 0x47, 0xc1, 0xc2, 0xc1}},
35 {0x0076, 16, { 0xd2, 0x20, 0x20, 0x1f, 0x03, 0x02, 0x04, 0x42, 0xc2, 0x1f, 0x20, 0x03, 0x03, 0x02, 0x02, 0x67}},
36 {0x0086, 16, { 0x20, 0x11, 0x03, 0x02, 0x01, 0x38, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x3e, 0x20, 0x13, 0x36}},
37 {0x0096, 16, { 0x20, 0x0b, 0x33, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x29, 0x30, 0x1b, 0x12}},
38 {0x00a6, 16, { 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13}},
39 {0x00b6, 16, { 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83}},
40 {0x00c6, 16, { 0xe0, 0xf5, 0x46, 0x02, 0x04, 0x40, 0xc2, 0x11, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc7, 0xe4, 0xf0}},
41 {0x00d6, 16, { 0xc2, 0x03, 0x30, 0x15, 0x0c, 0xc2, 0x15, 0x90, 0x7f, 0xbf, 0x04, 0xf0, 0xc2, 0x11, 0x02, 0x04}},
42 {0x00e6, 16, { 0x40, 0x90, 0x7f, 0xc8, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x11, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc9}},
43 {0x00f6, 16, { 0xe0, 0xf5, 0x7c, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x15, 0x20, 0x13, 0x2d, 0x20, 0x0b, 0x2a}},
44 {0x0043, 3, { 0x02, 0x1b, 0x00}},
45 {0x0023, 3, { 0x02, 0x00, 0x46}},
46 {0x003b, 3, { 0x02, 0x00, 0x46}},
47 {0x0000, 3, { 0x02, 0x16, 0x3d}},
48 {0x0106, 64, { 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x20, 0x30, 0x1b, 0x11, 0x90, 0x7d, 0xc1, 0xe0,
49 0x13, 0x92, 0x17, 0xa3, 0xe0, 0xf5, 0x46, 0x75, 0x4a, 0x03, 0x02, 0x04, 0x40, 0x75, 0x4a, 0x02,
50 0x90, 0x7d, 0xc1, 0xe0, 0xf5, 0x46, 0x02, 0x04, 0x40, 0x75, 0x4a, 0x01, 0xc2, 0x11, 0x02, 0x04,
51 0x40, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x03, 0x02, 0x01, 0xe0, 0x90, 0x7f, 0xc6, 0xe0}},
52 {0x0146, 64, { 0x30, 0xe1, 0x07, 0xc2, 0x21, 0xc2, 0x05, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x7c, 0x90,
53 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x15, 0x30, 0x13, 0x03, 0x02, 0x01, 0xd8, 0x20, 0x0b, 0x72, 0x20,
54 0x00, 0x6f, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x65, 0x30, 0x1b, 0x10, 0x90,
55 0x7e, 0x41, 0xe0, 0x13, 0x92, 0x9b, 0xa3, 0xe0, 0xf5, 0x99, 0x75, 0x4a, 0x03, 0x80, 0x09}},
56 {0x0186, 64, { 0x90, 0x7e, 0x41, 0xe0, 0xf5, 0x99, 0x75, 0x4a, 0x02, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x40, 0x17, 0x90,
57 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x03, 0x20, 0x15, 0x03, 0x02, 0x04, 0x40, 0xc2, 0x15, 0x90, 0x7f,
58 0xbf, 0x04, 0xf0, 0x02, 0x04, 0x40, 0x30, 0x1b, 0x12, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e,
59 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a}},
60 {0x01c6, 64, { 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xd2, 0x11, 0x02, 0x04,
61 0x40, 0x75, 0x4a, 0x01, 0xc2, 0x21, 0x02, 0x04, 0x40, 0x30, 0x13, 0x03, 0x02, 0x02, 0x62, 0x20,
62 0x0b, 0x79, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x6f, 0x30, 0x1b, 0x12, 0xae,
63 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13}},
64 {0x0206, 64, { 0x92, 0x9b, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0,
65 0xf5, 0x99, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x40, 0x17, 0x90, 0x7f, 0xc7, 0xe4, 0xf0, 0xc2, 0x03,
66 0x20, 0x15, 0x03, 0x02, 0x04, 0x40, 0xc2, 0x15, 0x90, 0x7f, 0xbf, 0x04, 0xf0, 0x02, 0x04, 0x40,
67 0x30, 0x1b, 0x12, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e}},
68 {0x0246, 64, { 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34,
69 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xd2, 0x11, 0x02, 0x04, 0x40, 0xc2, 0x21, 0x02, 0x04, 0x40,
70 0x20, 0x11, 0x03, 0x02, 0x03, 0x19, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x3e, 0x20, 0x13, 0x36,
71 0x20, 0x0b, 0x33, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x29, 0x30, 0x1b}},
72 {0x0286, 64, { 0x12, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13,
73 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83,
74 0xe0, 0xf5, 0x46, 0x02, 0x04, 0x40, 0xc2, 0x11, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc9, 0xe4, 0xf0,
75 0xd2, 0x03, 0x30, 0x15, 0x0c, 0xc2, 0x15, 0x90, 0x7f, 0xbf, 0x04, 0xf0, 0xc2, 0x11, 0x02}},
76 {0x02c6, 64, { 0x04, 0x40, 0x90, 0x7f, 0xc6, 0xe0, 0x30, 0xe1, 0x05, 0xc2, 0x11, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc7,
77 0xe0, 0xf5, 0x7c, 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x15, 0x20, 0x13, 0x2d, 0x20, 0x0b, 0x2a,
78 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x20, 0x30, 0x1b, 0x11, 0x90, 0x7e, 0x41,
79 0xe0, 0x13, 0x92, 0x17, 0xa3, 0xe0, 0xf5, 0x46, 0x75, 0x4a, 0x03, 0x02, 0x04, 0x40, 0x75}},
80 {0x0306, 64, { 0x4a, 0x02, 0x90, 0x7e, 0x41, 0xe0, 0xf5, 0x46, 0x02, 0x04, 0x40, 0x75, 0x4a, 0x01, 0xc2, 0x11, 0x02,
81 0x04, 0x40, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x03, 0x02, 0x03, 0xc1, 0x90, 0x7f, 0xc8, 0xe0,
82 0x30, 0xe1, 0x07, 0xc2, 0x21, 0xc2, 0x05, 0x02, 0x04, 0x40, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x7c,
83 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x15, 0x30, 0x13, 0x03, 0x02, 0x03, 0xb9, 0x20, 0x0b}},
84 {0x0346, 64, { 0x72, 0x20, 0x00, 0x6f, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x65, 0x30, 0x1b, 0x10,
85 0x90, 0x7d, 0xc1, 0xe0, 0x13, 0x92, 0x9b, 0xa3, 0xe0, 0xf5, 0x99, 0x75, 0x4a, 0x03, 0x80, 0x09,
86 0x90, 0x7d, 0xc1, 0xe0, 0xf5, 0x99, 0x75, 0x4a, 0x02, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x40, 0x17,
87 0x90, 0x7f, 0xc9, 0xe4, 0xf0, 0xd2, 0x03, 0x20, 0x15, 0x03, 0x02, 0x04, 0x40, 0xc2, 0x15}},
88 {0x0386, 64, { 0x90, 0x7f, 0xbf, 0x04, 0xf0, 0x02, 0x04, 0x40, 0x30, 0x1b, 0x12, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0,
89 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a,
90 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xd2, 0x11, 0x02,
91 0x04, 0x40, 0x75, 0x4a, 0x01, 0xc2, 0x21, 0x02, 0x04, 0x40, 0x30, 0x13, 0x03, 0x02, 0x04}},
92 {0x03c6, 64, { 0x3e, 0x20, 0x0b, 0x74, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x20, 0x1c, 0x6a, 0x30, 0x1b, 0x12,
93 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13,
94 0x92, 0x9b, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83,
95 0xe0, 0xf5, 0x99, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x40, 0x13, 0x90, 0x7f, 0xc9, 0xe4, 0xf0}},
96 {0x0406, 64, { 0xd2, 0x03, 0x30, 0x15, 0x35, 0xc2, 0x15, 0x90, 0x7f, 0xbf, 0x04, 0xf0, 0x80, 0x2c, 0x30, 0x1b, 0x12,
97 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13,
98 0x92, 0x17, 0xae, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83,
99 0xe0, 0xf5, 0x46, 0xd2, 0x11, 0x80, 0x02, 0xc2, 0x21, 0xd2, 0x25, 0x20, 0x20, 0x03, 0x02}},
100 {0x0446, 64, { 0x08, 0x0c, 0xc2, 0x20, 0x20, 0x04, 0x03, 0x02, 0x06, 0x31, 0x20, 0x12, 0x03, 0x02, 0x05, 0x02, 0xe5,
101 0x4b, 0xc3, 0x95, 0x7d, 0x50, 0x3e, 0x20, 0x14, 0x36, 0x20, 0x0d, 0x33, 0x90, 0x7f, 0x9a, 0xe0,
102 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x29, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2e,
103 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae, 0x4b, 0x05, 0x4b}},
104 {0x0486, 64, { 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0x02, 0x08, 0x0a, 0xc2,
105 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcb, 0xe4, 0xf0, 0xc2, 0x04, 0x30, 0x16, 0x0c, 0xc2, 0x16,
106 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcc, 0xe0, 0x30, 0xe1,
107 0x05, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0xf5, 0x7d, 0x90, 0x7c, 0xc0}},
108 {0x04c6, 64, { 0xe0, 0x13, 0x92, 0x16, 0x20, 0x14, 0x2d, 0x20, 0x0d, 0x2a, 0x90, 0x7f, 0x9a, 0xe0, 0x20, 0xe5, 0x03,
109 0x20, 0x1e, 0x20, 0x30, 0x1d, 0x11, 0x90, 0x7c, 0xc1, 0xe0, 0x13, 0x92, 0x18, 0xa3, 0xe0, 0xf5,
110 0x47, 0x75, 0x4b, 0x03, 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x02, 0x90, 0x7c, 0xc1, 0xe0, 0xf5, 0x47,
111 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x01, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0xe5, 0x4b, 0xc3, 0x95}},
112 {0x0506, 64, { 0x7d, 0x50, 0x03, 0x02, 0x05, 0xaa, 0x90, 0x7f, 0xca, 0xe0, 0x30, 0xe1, 0x07, 0xc2, 0x22, 0xc2, 0x06,
113 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0xf5, 0x7d, 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x16,
114 0x30, 0x14, 0x03, 0x02, 0x05, 0xa2, 0x20, 0x0d, 0x72, 0x20, 0x00, 0x6f, 0x90, 0x7f, 0x9a, 0xe0,
115 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x65, 0x30, 0x1d, 0x10, 0x90, 0x7d, 0x41, 0xe0, 0x13, 0x92}},
116 {0x0546, 64, { 0xc3, 0xa3, 0xe0, 0xf5, 0xc1, 0x75, 0x4b, 0x03, 0x80, 0x09, 0x90, 0x7d, 0x41, 0xe0, 0xf5, 0xc1, 0x75,
117 0x4b, 0x02, 0xe5, 0x4b, 0xc3, 0x95, 0x7d, 0x40, 0x17, 0x90, 0x7f, 0xcb, 0xe4, 0xf0, 0xc2, 0x04,
118 0x20, 0x16, 0x03, 0x02, 0x08, 0x0a, 0xc2, 0x16, 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0x02, 0x08, 0x0a,
119 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d}},
120 {0x0586, 64, { 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34,
121 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0xd2, 0x12, 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x01, 0xc2, 0x22,
122 0x02, 0x08, 0x0a, 0x30, 0x14, 0x03, 0x02, 0x06, 0x2c, 0x20, 0x0d, 0x79, 0x90, 0x7f, 0x9a, 0xe0,
123 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x6f, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0x40}},
124 {0x05c6, 64, { 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0xc3, 0xae, 0x4b, 0x05, 0x4b, 0x74,
125 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0xc1, 0xe5, 0x4b, 0xc3, 0x95,
126 0x7d, 0x40, 0x17, 0x90, 0x7f, 0xcb, 0xe4, 0xf0, 0xc2, 0x04, 0x20, 0x16, 0x03, 0x02, 0x08, 0x0a,
127 0xc2, 0x16, 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0x02, 0x08, 0x0a, 0x30, 0x1d, 0x12, 0xae, 0x4b}},
128 {0x0606, 64, { 0x05, 0x4b, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae,
129 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x47,
130 0xd2, 0x12, 0x02, 0x08, 0x0a, 0xc2, 0x22, 0x02, 0x08, 0x0a, 0x20, 0x12, 0x03, 0x02, 0x06, 0xe3,
131 0xe5, 0x4b, 0xc3, 0x95, 0x7d, 0x50, 0x3e, 0x20, 0x14, 0x36, 0x20, 0x0d, 0x33, 0x90, 0x7f}},
132 {0x0646, 64, { 0x9a, 0xe0, 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x29, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0xc0,
133 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae, 0x4b, 0x05, 0x4b,
134 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0x02, 0x08, 0x0a,
135 0xc2, 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcd, 0xe4, 0xf0, 0xd2, 0x04, 0x30, 0x16, 0x0c}},
136 {0x0686, 64, { 0xc2, 0x16, 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xca, 0xe0, 0x30,
137 0xe1, 0x05, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0xf5, 0x7d, 0x90, 0x7d, 0x40,
138 0xe0, 0x13, 0x92, 0x16, 0x20, 0x14, 0x2d, 0x20, 0x0d, 0x2a, 0x90, 0x7f, 0x9a, 0xe0, 0x20, 0xe5,
139 0x03, 0x20, 0x1e, 0x20, 0x30, 0x1d, 0x11, 0x90, 0x7d, 0x41, 0xe0, 0x13, 0x92, 0x18, 0xa3}},
140 {0x06c6, 64, { 0xe0, 0xf5, 0x47, 0x75, 0x4b, 0x03, 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x02, 0x90, 0x7d, 0x41, 0xe0, 0xf5,
141 0x47, 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x01, 0xc2, 0x12, 0x02, 0x08, 0x0a, 0xe5, 0x4b, 0xc3, 0x95,
142 0x7d, 0x50, 0x03, 0x02, 0x07, 0x8b, 0x90, 0x7f, 0xcc, 0xe0, 0x30, 0xe1, 0x07, 0xc2, 0x22, 0xc2,
143 0x06, 0x02, 0x08, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0xf5, 0x7d, 0x90, 0x7c, 0xc0, 0xe0, 0x13}},
144 {0x0706, 64, { 0x92, 0x16, 0x30, 0x14, 0x03, 0x02, 0x07, 0x83, 0x20, 0x0d, 0x72, 0x20, 0x00, 0x6f, 0x90, 0x7f, 0x9a,
145 0xe0, 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x65, 0x30, 0x1d, 0x10, 0x90, 0x7c, 0xc1, 0xe0, 0x13, 0x92,
146 0xc3, 0xa3, 0xe0, 0xf5, 0xc1, 0x75, 0x4b, 0x03, 0x80, 0x09, 0x90, 0x7c, 0xc1, 0xe0, 0xf5, 0xc1,
147 0x75, 0x4b, 0x02, 0xe5, 0x4b, 0xc3, 0x95, 0x7d, 0x40, 0x17, 0x90, 0x7f, 0xcd, 0xe4, 0xf0}},
148 {0x0746, 64, { 0xd2, 0x04, 0x20, 0x16, 0x03, 0x02, 0x08, 0x0a, 0xc2, 0x16, 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0x02, 0x08,
149 0x0a, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c,
150 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4,
151 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0xd2, 0x12, 0x02, 0x08, 0x0a, 0x75, 0x4b, 0x01}},
152 {0x0786, 64, { 0xc2, 0x22, 0x02, 0x08, 0x0a, 0x30, 0x14, 0x03, 0x02, 0x08, 0x08, 0x20, 0x0d, 0x74, 0x90, 0x7f, 0x9a,
153 0xe0, 0x20, 0xe5, 0x03, 0x20, 0x1e, 0x6a, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0xc0,
154 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0xc3, 0xae, 0x4b, 0x05, 0x4b,
155 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xf5, 0xc1, 0xe5, 0x4b}},
156 {0x07c6, 64, { 0xc3, 0x95, 0x7d, 0x40, 0x13, 0x90, 0x7f, 0xcd, 0xe4, 0xf0, 0xd2, 0x04, 0x30, 0x16, 0x35, 0xc2, 0x16,
157 0x90, 0x7f, 0xc1, 0x04, 0xf0, 0x80, 0x2c, 0x30, 0x1d, 0x12, 0xae, 0x4b, 0x05, 0x4b, 0x74, 0xc0,
158 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xae, 0x4b, 0x05, 0x4b,
159 0x74, 0xc0, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0xd2, 0x12}},
160 {0x0806, 64, { 0x80, 0x02, 0xc2, 0x22, 0xd2, 0x25, 0x20, 0x98, 0x03, 0x02, 0x09, 0x3e, 0xc2, 0x98, 0x20, 0x01, 0x03,
161 0x02, 0x08, 0xb0, 0x20, 0x23, 0x27, 0xae, 0x48, 0x05, 0x48, 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4,
162 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x1b, 0x49, 0xae, 0x48, 0x05, 0x48, 0x74, 0x80,
163 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0x80, 0x36, 0xaf, 0x99}},
164 {0x0846, 64, { 0xef, 0xb5, 0x58, 0x04, 0xd2, 0x0b, 0x80, 0x2c, 0xef, 0xb5, 0x57, 0x04, 0xc2, 0x0b, 0x80, 0x24, 0xae,
165 0x48, 0x05, 0x48, 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xef, 0xf0, 0x30,
166 0x1b, 0x11, 0xae, 0x48, 0x05, 0x48, 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83,
167 0xe5, 0x98, 0xf0, 0xd2, 0x19, 0xe5, 0x48, 0xc3, 0x95, 0x54, 0x50, 0x03, 0x02, 0x09, 0x3c}},
168 {0x0886, 64, { 0x90, 0x7f, 0xb8, 0xe0, 0x30, 0xe1, 0x15, 0xe5, 0x48, 0xc3, 0x94, 0x40, 0x50, 0x03, 0x02, 0x09, 0x3c,
169 0x15, 0x48, 0x15, 0x48, 0x05, 0x2d, 0xd2, 0x0c, 0x02, 0x09, 0x3c, 0x90, 0x7f, 0xb7, 0xe5, 0x48,
170 0xf0, 0x75, 0x48, 0x00, 0xc2, 0x01, 0x02, 0x09, 0x3c, 0x20, 0x23, 0x27, 0xae, 0x48, 0x05, 0x48,
171 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x99, 0xf0, 0x30, 0x1b}},
172 {0x08c6, 64, { 0x49, 0xae, 0x48, 0x05, 0x48, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98,
173 0xf0, 0x80, 0x36, 0xaf, 0x99, 0xef, 0xb5, 0x58, 0x04, 0xd2, 0x0b, 0x80, 0x2c, 0xef, 0xb5, 0x57,
174 0x04, 0xc2, 0x0b, 0x80, 0x24, 0xae, 0x48, 0x05, 0x48, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34,
175 0x7e, 0xf5, 0x83, 0xef, 0xf0, 0x30, 0x1b, 0x11, 0xae, 0x48, 0x05, 0x48, 0x74, 0x00, 0x2e}},
176 {0x0906, 64, { 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe5, 0x98, 0xf0, 0xd2, 0x19, 0xe5, 0x48, 0xc3, 0x95, 0x54,
177 0x40, 0x23, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x11, 0xe5, 0x48, 0xc3, 0x94, 0x40, 0x40, 0x15,
178 0x15, 0x48, 0x15, 0x48, 0x05, 0x2d, 0xd2, 0x0c, 0x80, 0x0b, 0x90, 0x7f, 0xb9, 0xe5, 0x48, 0xf0,
179 0x75, 0x48, 0x00, 0xd2, 0x01, 0xd2, 0x25, 0x20, 0xc0, 0x03, 0x02, 0x0a, 0x70, 0xc2, 0xc0}},
180 {0x0946, 64, { 0x20, 0x02, 0x03, 0x02, 0x09, 0xe2, 0x20, 0x24, 0x27, 0xae, 0x49, 0x05, 0x49, 0x74, 0x80, 0x2e, 0xf5,
181 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe5, 0xc1, 0xf0, 0x30, 0x1d, 0x49, 0xae, 0x49, 0x05, 0x49,
182 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe5, 0xc0, 0xf0, 0x80, 0x36, 0xaf,
183 0xc1, 0xef, 0xb5, 0x70, 0x04, 0xd2, 0x0d, 0x80, 0x2c, 0xef, 0xb5, 0x6f, 0x04, 0xc2, 0x0d}},
184 {0x0986, 64, { 0x80, 0x24, 0xae, 0x49, 0x05, 0x49, 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xef,
185 0xf0, 0x30, 0x1d, 0x11, 0xae, 0x49, 0x05, 0x49, 0x74, 0x80, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d,
186 0xf5, 0x83, 0xe5, 0xc0, 0xf0, 0xd2, 0x1a, 0xe5, 0x49, 0xc3, 0x95, 0x6c, 0x50, 0x03, 0x02, 0x0a,
187 0x6e, 0x90, 0x7f, 0xbc, 0xe0, 0x30, 0xe1, 0x15, 0xe5, 0x49, 0xc3, 0x94, 0x40, 0x50, 0x03}},
188 {0x09c6, 64, { 0x02, 0x0a, 0x6e, 0x15, 0x49, 0x15, 0x49, 0x05, 0x39, 0xd2, 0x0e, 0x02, 0x0a, 0x6e, 0x90, 0x7f, 0xbb,
189 0xe5, 0x49, 0xf0, 0x75, 0x49, 0x00, 0xc2, 0x02, 0x02, 0x0a, 0x6e, 0x20, 0x24, 0x27, 0xae, 0x49,
190 0x05, 0x49, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe5, 0xc1, 0xf0, 0x30,
191 0x1d, 0x49, 0xae, 0x49, 0x05, 0x49, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5}},
192 {0x0a06, 64, { 0x83, 0xe5, 0xc0, 0xf0, 0x80, 0x36, 0xaf, 0xc1, 0xef, 0xb5, 0x70, 0x04, 0xd2, 0x0d, 0x80, 0x2c, 0xef,
193 0xb5, 0x6f, 0x04, 0xc2, 0x0d, 0x80, 0x24, 0xae, 0x49, 0x05, 0x49, 0x74, 0x00, 0x2e, 0xf5, 0x82,
194 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xef, 0xf0, 0x30, 0x1d, 0x11, 0xae, 0x49, 0x05, 0x49, 0x74, 0x00,
195 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe5, 0xc0, 0xf0, 0xd2, 0x1a, 0xe5, 0x49}},
196 {0x0a46, 64, { 0xc3, 0x95, 0x6c, 0x40, 0x23, 0x90, 0x7f, 0xba, 0xe0, 0x30, 0xe1, 0x11, 0xe5, 0x49, 0xc3, 0x94, 0x40,
197 0x40, 0x15, 0x15, 0x49, 0x15, 0x49, 0x05, 0x39, 0xd2, 0x0e, 0x80, 0x0b, 0x90, 0x7f, 0xbd, 0xe5,
198 0x49, 0xf0, 0x75, 0x49, 0x00, 0xd2, 0x02, 0xd2, 0x25, 0x30, 0x25, 0x05, 0xc2, 0x25, 0x02, 0x00,
199 0x56, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xce}},
200 {0x0a86, 64, { 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x0b, 0xa5, 0xe4, 0xf5, 0x12, 0x74, 0x40, 0x25, 0x12, 0xf5, 0x82, 0xe4,
201 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x12, 0x7c, 0x00, 0x7b, 0x00, 0x24, 0x4c, 0xf9, 0xec,
202 0x34, 0x00, 0xfa, 0xef, 0x12, 0x15, 0xcd, 0x05, 0x12, 0xe5, 0x12, 0xb4, 0x18, 0xdb, 0xe5, 0x4c,
203 0x60, 0x0c, 0x75, 0xc9, 0x20, 0x75, 0xc8, 0x36, 0x85, 0x4d, 0xca, 0x85, 0x4e, 0xcb, 0xe5}},
204 {0x0ac6, 64, { 0x4f, 0x13, 0x92, 0x1b, 0x92, 0x9f, 0xe5, 0x50, 0x13, 0x92, 0x1c, 0xe5, 0x51, 0x13, 0x92, 0x23, 0xe5,
205 0x52, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x98, 0xe0,
206 0x44, 0x04, 0xf0, 0xe5, 0x53, 0x60, 0x09, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0x7f, 0xf0, 0x80, 0x07,
207 0x90, 0x7f, 0x98, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x59, 0x60, 0x0b, 0xc2, 0x13, 0xc2, 0x0b}},
208 {0x0b06, 64, { 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x5a, 0x60, 0x0b, 0xd2, 0x0b, 0xd2, 0x0c, 0x90, 0x7f,
209 0x95, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x5b, 0x60, 0x0d, 0xc2, 0xaf, 0xc2, 0x11, 0xd2, 0x00, 0xe4,
210 0xf5, 0x7c, 0xf5, 0x4a, 0xd2, 0xaf, 0xe5, 0x5c, 0x60, 0x05, 0x30, 0x23, 0x02, 0xd2, 0x0b, 0xe5,
211 0x5d, 0x60, 0x15, 0x90, 0x7f, 0x95, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0x9e, 0xe0, 0x44}},
212 {0x0b46, 64, { 0x02, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x5e, 0x60, 0x0a, 0xd2, 0x9c, 0xc2, 0x98,
213 0x75, 0x2e, 0x01, 0x75, 0x40, 0x28, 0xe5, 0x5f, 0x60, 0x07, 0xc2, 0x9c, 0xe4, 0xf5, 0x48, 0xf5,
214 0x2e, 0xe5, 0x60, 0x60, 0x03, 0xe4, 0xf5, 0x48, 0xe5, 0x61, 0x60, 0x02, 0xd2, 0x07, 0xe5, 0x62,
215 0x60, 0x08, 0xe5, 0x5e, 0x70, 0x02, 0xf5, 0x40, 0xd2, 0x0c, 0xe5, 0x63, 0x60, 0x19, 0x90}},
216 {0x0b86, 64, { 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x15, 0xf0,
217 0x74, 0x35, 0xf0, 0xd2, 0x03, 0xd2, 0x01, 0xd2, 0x09, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0xa2, 0x13,
218 0xe4, 0x33, 0xff, 0x65, 0x2b, 0x60, 0x04, 0x8f, 0x2b, 0xd2, 0x0c, 0xa2, 0x0b, 0xe4, 0x33, 0xff,
219 0x65, 0x2c, 0x60, 0x04, 0x8f, 0x2c, 0xd2, 0x0c, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x08, 0x65}},
220 {0x0bc6, 64, { 0x27, 0x60, 0x07, 0xe0, 0x54, 0x08, 0xf5, 0x27, 0xd2, 0x0c, 0x90, 0x7f, 0x9b, 0xe0, 0x54, 0x40, 0xb5,
221 0x29, 0x09, 0xe0, 0x54, 0x40, 0x64, 0x40, 0xf5, 0x29, 0xd2, 0x0c, 0x30, 0x07, 0x35, 0xc2, 0xaf,
222 0x30, 0x01, 0x18, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x27, 0xe5, 0x48, 0x60, 0x09, 0x90, 0x7f,
223 0xb7, 0xf0, 0xe4, 0xf5, 0x48, 0xc2, 0x01, 0xc2, 0x07, 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0}},
224 {0x0c06, 64, { 0x20, 0xe1, 0x0f, 0xe5, 0x48, 0x60, 0x09, 0x90, 0x7f, 0xb9, 0xf0, 0xe4, 0xf5, 0x48, 0xd2, 0x01, 0xc2,
225 0x07, 0xd2, 0xaf, 0x20, 0x05, 0x37, 0x30, 0x03, 0x1b, 0x90, 0x7f, 0xc6, 0xe0, 0x20, 0xe1, 0x2d,
226 0x90, 0x7e, 0x40, 0xe0, 0x13, 0x92, 0x15, 0x75, 0x4a, 0x01, 0x90, 0x7f, 0xc7, 0xe0, 0xf5, 0x7c,
227 0xd2, 0x05, 0x80, 0x19, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x12, 0x90, 0x7d, 0xc0, 0xe0}},
228 {0x0c46, 64, { 0x13, 0x92, 0x15, 0x75, 0x4a, 0x01, 0x90, 0x7f, 0xc9, 0xe0, 0xf5, 0x7c, 0xd2, 0x05, 0x20, 0x21, 0x33,
229 0x20, 0x00, 0x06, 0xe5, 0x4a, 0x65, 0x7c, 0x70, 0x2a, 0x30, 0x05, 0x1a, 0x30, 0x03, 0x09, 0xe4,
230 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x03, 0x80, 0x07, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x03, 0xc2,
231 0x05, 0xe4, 0xf5, 0x7c, 0xf5, 0x4a, 0x30, 0x15, 0x0a, 0xc2, 0x15, 0xc2, 0x00, 0x90, 0x7f}},
232 {0x0c86, 64, { 0xbf, 0x74, 0x01, 0xf0, 0x30, 0x21, 0x03, 0x02, 0x0d, 0x94, 0x20, 0x05, 0x03, 0x02, 0x0d, 0x94, 0x30,
233 0x1c, 0x0a, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe3, 0x03, 0x02, 0x0d, 0x94, 0x30, 0x0b, 0x03, 0x02,
234 0x0d, 0x94, 0x30, 0x13, 0x03, 0x02, 0x0d, 0x94, 0x30, 0x03, 0x62, 0x30, 0x1b, 0x12, 0xaf, 0x4a,
235 0x05, 0x4a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92}},
236 {0x0cc6, 64, { 0x2d, 0xaf, 0x4a, 0x05, 0x4a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5,
237 0x13, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x2a, 0x30, 0x1b, 0x12, 0xaf, 0x4a, 0x05, 0x4a, 0x74,
238 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x17, 0xaf, 0x4a, 0x05,
239 0x4a, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xd2}},
240 {0x0d06, 64, { 0x11, 0x80, 0x6b, 0xc2, 0x11, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0xc2, 0x03, 0x80, 0x60, 0x30, 0x1b, 0x12,
241 0xaf, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13,
242 0x92, 0x2d, 0xaf, 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83,
243 0xe0, 0xf5, 0x13, 0xe5, 0x4a, 0xc3, 0x95, 0x7c, 0x50, 0x2a, 0x30, 0x1b, 0x12, 0xaf, 0x4a}},
244 {0x0d46, 64, { 0x05, 0x4a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x17, 0xaf,
245 0x4a, 0x05, 0x4a, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x46,
246 0xd2, 0x11, 0x80, 0x09, 0xc2, 0x11, 0xe4, 0x90, 0x7f, 0xc9, 0xf0, 0xd2, 0x03, 0x30, 0x1b, 0x04,
247 0xa2, 0x2d, 0x92, 0x9b, 0xd2, 0x21, 0xc2, 0xaf, 0x85, 0x13, 0x99, 0x20, 0x11, 0x0d, 0x30}},
248 {0x0d86, 64, { 0x15, 0x0a, 0xc2, 0x15, 0xc2, 0x00, 0x90, 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xd2, 0xaf, 0x90, 0x7f, 0xd0,
249 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x0e, 0xb5, 0xe4, 0xf5, 0x12, 0x74, 0xc0, 0x25, 0x12, 0xf5, 0x82,
250 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x12, 0x7c, 0x00, 0x7b, 0x00, 0x24, 0x64, 0xf9,
251 0xec, 0x34, 0x00, 0xfa, 0xef, 0x12, 0x15, 0xcd, 0x05, 0x12, 0xe5, 0x12, 0xb4, 0x18, 0xdb}},
252 {0x0dc6, 64, { 0xe5, 0x64, 0x60, 0x0b, 0x75, 0x89, 0x60, 0x75, 0x88, 0x40, 0xd2, 0xdf, 0x85, 0x65, 0x8d, 0xe5, 0x67,
253 0x13, 0x92, 0x1d, 0x92, 0xc7, 0xe5, 0x68, 0x13, 0x92, 0x1e, 0xe5, 0x69, 0x13, 0x92, 0x24, 0xe5,
254 0x6a, 0x60, 0x09, 0x90, 0x7f, 0x97, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0x97, 0xe0,
255 0x44, 0x10, 0xf0, 0xe5, 0x6b, 0x60, 0x09, 0x90, 0x7f, 0x97, 0xe0, 0x54, 0x7f, 0xf0, 0x80}},
256 {0x0e06, 64, { 0x07, 0x90, 0x7f, 0x97, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x71, 0x60, 0x0b, 0xc2, 0x14, 0xc2, 0x0d, 0x90,
257 0x7f, 0x94, 0xe0, 0x44, 0x08, 0xf0, 0xe5, 0x72, 0x60, 0x0b, 0xd2, 0x0d, 0xd2, 0x0e, 0x90, 0x7f,
258 0x94, 0xe0, 0x44, 0x08, 0xf0, 0xe5, 0x73, 0x60, 0x0d, 0xc2, 0xaf, 0xc2, 0x12, 0xd2, 0x00, 0xe4,
259 0xf5, 0x7d, 0xf5, 0x4b, 0xd2, 0xaf, 0xe5, 0x74, 0x60, 0x05, 0x30, 0x24, 0x02, 0xd2, 0x0d}},
260 {0x0e46, 64, { 0xe5, 0x75, 0x60, 0x15, 0x90, 0x7f, 0x94, 0xe0, 0x54, 0xf7, 0xf0, 0x90, 0x7f, 0x9d, 0xe0, 0x44, 0x08,
261 0xf0, 0x90, 0x7f, 0x97, 0xe0, 0x54, 0xf7, 0xf0, 0xe5, 0x76, 0x60, 0x0a, 0xd2, 0xc4, 0xc2, 0xc0,
262 0x75, 0x3a, 0x01, 0x75, 0x41, 0x28, 0xe5, 0x77, 0x60, 0x07, 0xc2, 0xc4, 0xe4, 0xf5, 0x49, 0xf5,
263 0x3a, 0xe5, 0x78, 0x60, 0x03, 0xe4, 0xf5, 0x49, 0xe5, 0x79, 0x60, 0x02, 0xd2, 0x08, 0xe5}},
264 {0x0e86, 64, { 0x7a, 0x60, 0x08, 0xe5, 0x76, 0x70, 0x02, 0xf5, 0x41, 0xd2, 0x0e, 0xe5, 0x7b, 0x60, 0x19, 0x90, 0x7f,
265 0xd7, 0x74, 0x13, 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x14, 0xf0, 0x74, 0x34, 0xf0, 0x74, 0x16, 0xf0,
266 0x74, 0x36, 0xf0, 0xd2, 0x04, 0xd2, 0x02, 0xd2, 0x0a, 0xe4, 0x90, 0x7f, 0xd1, 0xf0, 0xa2, 0x14,
267 0xe4, 0x33, 0xff, 0x65, 0x37, 0x60, 0x04, 0x8f, 0x37, 0xd2, 0x0e, 0xa2, 0x0d, 0xe4, 0x33}},
268 {0x0ec6, 64, { 0xff, 0x65, 0x38, 0x60, 0x04, 0x8f, 0x38, 0xd2, 0x0e, 0x90, 0x7f, 0x9a, 0xe0, 0x54, 0x20, 0x65, 0x33,
269 0x60, 0x07, 0xe0, 0x54, 0x20, 0xf5, 0x33, 0xd2, 0x0e, 0x90, 0x7f, 0x9a, 0xe0, 0x54, 0x40, 0xb5,
270 0x35, 0x09, 0xe0, 0x54, 0x40, 0x64, 0x40, 0xf5, 0x35, 0xd2, 0x0e, 0x30, 0x08, 0x35, 0xc2, 0xaf,
271 0x30, 0x02, 0x18, 0x90, 0x7f, 0xbc, 0xe0, 0x20, 0xe1, 0x27, 0xe5, 0x49, 0x60, 0x09, 0x90}},
272 {0x0f06, 64, { 0x7f, 0xbb, 0xf0, 0xe4, 0xf5, 0x49, 0xc2, 0x02, 0xc2, 0x08, 0x80, 0x16, 0x90, 0x7f, 0xba, 0xe0, 0x20,
273 0xe1, 0x0f, 0xe5, 0x49, 0x60, 0x09, 0x90, 0x7f, 0xbd, 0xf0, 0xe4, 0xf5, 0x49, 0xd2, 0x02, 0xc2,
274 0x08, 0xd2, 0xaf, 0x20, 0x06, 0x37, 0x30, 0x04, 0x1b, 0x90, 0x7f, 0xca, 0xe0, 0x20, 0xe1, 0x2d,
275 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x16, 0x75, 0x4b, 0x01, 0x90, 0x7f, 0xcb, 0xe0, 0xf5}},
276 {0x0f46, 64, { 0x7d, 0xd2, 0x06, 0x80, 0x19, 0x90, 0x7f, 0xcc, 0xe0, 0x20, 0xe1, 0x12, 0x90, 0x7c, 0xc0, 0xe0, 0x13,
277 0x92, 0x16, 0x75, 0x4b, 0x01, 0x90, 0x7f, 0xcd, 0xe0, 0xf5, 0x7d, 0xd2, 0x06, 0x20, 0x22, 0x33,
278 0x20, 0x00, 0x06, 0xe5, 0x4b, 0x65, 0x7d, 0x70, 0x2a, 0x30, 0x06, 0x1a, 0x30, 0x04, 0x09, 0xe4,
279 0x90, 0x7f, 0xcb, 0xf0, 0xc2, 0x04, 0x80, 0x07, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0xd2, 0x04}},
280 {0x0f86, 64, { 0xc2, 0x06, 0xe4, 0xf5, 0x7d, 0xf5, 0x4b, 0x30, 0x16, 0x0a, 0xc2, 0x16, 0xc2, 0x00, 0x90, 0x7f, 0xc1,
281 0x74, 0x01, 0xf0, 0x30, 0x22, 0x03, 0x02, 0x10, 0xa4, 0x20, 0x06, 0x03, 0x02, 0x10, 0xa4, 0x30,
282 0x1e, 0x0a, 0x90, 0x7f, 0x9a, 0xe0, 0x20, 0xe5, 0x03, 0x02, 0x10, 0xa4, 0x30, 0x0d, 0x03, 0x02,
283 0x10, 0xa4, 0x30, 0x14, 0x03, 0x02, 0x10, 0xa4, 0x30, 0x04, 0x62, 0x30, 0x1d, 0x12, 0xaf}},
284 {0x0fc6, 64, { 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x2d,
285 0xaf, 0x4b, 0x05, 0x4b, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5,
286 0x13, 0xe5, 0x4b, 0xc3, 0x95, 0x7d, 0x50, 0x2a, 0x30, 0x1d, 0x12, 0xaf, 0x4b, 0x05, 0x4b, 0x74,
287 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xaf, 0x4b}},
288 {0x1006, 64, { 0x05, 0x4b, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7d, 0xf5, 0x83, 0xe0, 0xf5, 0x47, 0xd2, 0x12,
289 0x80, 0x6b, 0xc2, 0x12, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0xc2, 0x04, 0x80, 0x60, 0x30, 0x1d, 0x12,
290 0xaf, 0x4b, 0x05, 0x4b, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0x13,
291 0x92, 0x2d, 0xaf, 0x4b, 0x05, 0x4b, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5}},
292 {0x1046, 64, { 0x83, 0xe0, 0xf5, 0x13, 0xe5, 0x4b, 0xc3, 0x95, 0x7d, 0x50, 0x2a, 0x30, 0x1d, 0x12, 0xaf, 0x4b, 0x05,
293 0x4b, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0x13, 0x92, 0x18, 0xaf,
294 0x4b, 0x05, 0x4b, 0x74, 0xc0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xf5, 0x47,
295 0xd2, 0x12, 0x80, 0x09, 0xc2, 0x12, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0xd2, 0x04, 0x30, 0x1d}},
296 {0x1086, 64, { 0x04, 0xa2, 0x2d, 0x92, 0xc3, 0xd2, 0x22, 0xc2, 0xaf, 0x85, 0x13, 0xc1, 0x20, 0x12, 0x0d, 0x30, 0x16,
297 0x0a, 0xc2, 0x16, 0xc2, 0x00, 0x90, 0x7f, 0xc1, 0x74, 0x01, 0xf0, 0xd2, 0xaf, 0x90, 0x7f, 0xc2,
298 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x11, 0x7a, 0xe5, 0x1a, 0x70, 0x46, 0x30, 0x0c, 0x3f, 0xe5, 0x40,
299 0x70, 0x3b, 0xa2, 0x09, 0x33, 0xf5, 0x31, 0xc2, 0x09, 0xc2, 0x0c, 0xe4, 0xf5, 0x12, 0x7e}},
300 {0x10c6, 64, { 0x00, 0x7b, 0x00, 0x74, 0x26, 0x25, 0x12, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x15, 0x87, 0xff, 0x74,
301 0x80, 0x25, 0x12, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x12, 0xe5, 0x12,
302 0xb4, 0x0c, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x0c, 0xf0, 0x75, 0x40, 0x10, 0x22, 0x75, 0x1a, 0x01,
303 0x22, 0xe5, 0x1a, 0x64, 0x01, 0x70, 0x45, 0x30, 0x0e, 0x3e, 0xe5, 0x41, 0x70, 0x3a, 0xa2}},
304 {0x1106, 64, { 0x0a, 0x33, 0xf5, 0x3d, 0xc2, 0x0a, 0xc2, 0x0e, 0xe4, 0xf5, 0x12, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x32,
305 0x25, 0x12, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x15, 0x87, 0xff, 0x74, 0x80, 0x25, 0x12, 0xf5,
306 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x12, 0xe5, 0x12, 0xb4, 0x0c, 0xdb, 0x90,
307 0x7f, 0xc3, 0x74, 0x0c, 0xf0, 0x75, 0x41, 0x10, 0x75, 0x1a, 0x02, 0x22, 0xe5, 0x1c, 0x60}},
308 {0x1146, 64, { 0x30, 0x15, 0x1c, 0xe4, 0xf5, 0x12, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x1b, 0x25, 0x12, 0xf9, 0xee, 0x34,
309 0x00, 0xfa, 0x12, 0x15, 0x87, 0xff, 0x74, 0x80, 0x25, 0x12, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5,
310 0x83, 0xef, 0xf0, 0x05, 0x12, 0xe5, 0x12, 0xb4, 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0,
311 0xe4, 0xf5, 0x1a, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x16, 0x17, 0x12, 0x40, 0x00, 0x12}},
312 {0x1186, 64, { 0xb4, 0x01, 0x13, 0x20, 0x03, 0x11, 0x9e, 0x06, 0x12, 0x33, 0x08, 0x12, 0x2d, 0x09, 0x12, 0x20, 0x0a,
313 0x13, 0x76, 0x0b, 0x00, 0x00, 0x13, 0x6f, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14,
314 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f,
315 0xd5, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x17, 0x4b, 0x8b, 0x12}},
316 {0x11c6, 64, { 0x8a, 0x13, 0x89, 0x14, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01,
317 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02,
318 0x13, 0x76, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x17, 0x9a, 0x8b, 0x12, 0x8a, 0x13, 0x89, 0x14,
319 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90}},
320 {0x1206, 64, { 0x7f, 0xd5, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x13, 0x76, 0x90,
321 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90,
322 0x7f, 0xb5, 0xf0, 0x02, 0x13, 0x76, 0x12, 0x14, 0xc3, 0x02, 0x13, 0x76, 0x90, 0x7f, 0x00, 0x74,
323 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f}},
324 {0x1246, 64, { 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2, 0x26, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff,
325 0xa2, 0x2b, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
326 0x02, 0xf0, 0x02, 0x13, 0x76, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
327 0x02, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54}},
328 {0x1286, 64, { 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83,
329 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0,
330 0x02, 0x13, 0x76, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xe8,
331 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xea}},
332 {0x12c6, 64, { 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x26, 0x02, 0x13, 0x76, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02,
333 0x13, 0x76, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff,
334 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34,
335 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13}},
336 {0x1306, 64, { 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f,
337 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60,
338 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x26, 0x80, 0x3f,
339 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20}},
340 {0x1346, 64, { 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25,
341 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90,
342 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90,
343 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22, 0x20, 0x28, 0x03, 0x02, 0x14, 0xc2, 0xe5, 0x40}},
344 {0x1386, 64, { 0x60, 0x02, 0x15, 0x40, 0xe5, 0x48, 0x60, 0x4f, 0x65, 0x44, 0x70, 0x45, 0xe5, 0x42, 0xf4, 0x60, 0x02,
345 0x05, 0x42, 0xe5, 0x42, 0xc3, 0x95, 0x55, 0x40, 0x3d, 0xc2, 0xaf, 0x30, 0x01, 0x18, 0x90, 0x7f,
346 0xb8, 0xe0, 0x20, 0xe1, 0x27, 0x90, 0x7f, 0xb7, 0xe5, 0x48, 0xf0, 0xc2, 0x01, 0xe4, 0xf5, 0x48,
347 0xf5, 0x42, 0xf5, 0x44, 0x80, 0x16, 0x90, 0x7f, 0xb6, 0xe0, 0x20, 0xe1, 0x0f, 0x90, 0x7f}},
348 {0x13c6, 64, { 0xb9, 0xe5, 0x48, 0xf0, 0xd2, 0x01, 0xe4, 0xf5, 0x48, 0xf5, 0x42, 0xf5, 0x44, 0xd2, 0xaf, 0x80, 0x06,
349 0x85, 0x48, 0x44, 0xe4, 0xf5, 0x42, 0xe5, 0x2e, 0x60, 0x2d, 0x20, 0x19, 0x07, 0x90, 0x7f, 0x9b,
350 0xe0, 0x30, 0xe0, 0x0e, 0xe5, 0x2f, 0x60, 0x05, 0xe4, 0xf5, 0x2f, 0xd2, 0x0c, 0xe4, 0xf5, 0x3e,
351 0x80, 0x13, 0xe5, 0x3e, 0xd3, 0x95, 0x56, 0x50, 0x0c, 0xe5, 0x3e, 0xb5, 0x56, 0x05, 0x75}},
352 {0x1406, 64, { 0x2f, 0x01, 0xd2, 0x0c, 0x05, 0x3e, 0xc2, 0x19, 0xe5, 0x41, 0x60, 0x02, 0x15, 0x41, 0xe5, 0x49, 0x60,
353 0x4f, 0x65, 0x45, 0x70, 0x45, 0xe5, 0x43, 0xf4, 0x60, 0x02, 0x05, 0x43, 0xe5, 0x43, 0xc3, 0x95,
354 0x6d, 0x40, 0x3d, 0xc2, 0xaf, 0x30, 0x02, 0x18, 0x90, 0x7f, 0xbc, 0xe0, 0x20, 0xe1, 0x27, 0x90,
355 0x7f, 0xbb, 0xe5, 0x49, 0xf0, 0xc2, 0x02, 0xe4, 0xf5, 0x49, 0xf5, 0x43, 0xf5, 0x45, 0x80}},
356 {0x1446, 64, { 0x16, 0x90, 0x7f, 0xba, 0xe0, 0x20, 0xe1, 0x0f, 0x90, 0x7f, 0xbd, 0xe5, 0x49, 0xf0, 0xd2, 0x02, 0xe4,
357 0xf5, 0x49, 0xf5, 0x43, 0xf5, 0x45, 0xd2, 0xaf, 0x80, 0x06, 0x85, 0x49, 0x45, 0xe4, 0xf5, 0x43,
358 0xe5, 0x3a, 0x60, 0x2d, 0x20, 0x1a, 0x07, 0x90, 0x7f, 0x9a, 0xe0, 0x30, 0xe2, 0x0e, 0xe5, 0x3b,
359 0x60, 0x05, 0xe4, 0xf5, 0x3b, 0xd2, 0x0e, 0xe4, 0xf5, 0x3f, 0x80, 0x13, 0xe5, 0x3f, 0xd3}},
360 {0x1486, 64, { 0x95, 0x6e, 0x50, 0x0c, 0xe5, 0x3f, 0xb5, 0x6e, 0x05, 0x75, 0x3b, 0x01, 0xd2, 0x0e, 0x05, 0x3f, 0xc2,
361 0x1a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1, 0x23, 0x90, 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5,
362 0x1c, 0x90, 0x7b, 0x42, 0xe0, 0xf5, 0x1d, 0x90, 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7,
363 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4, 0x90, 0x7f, 0xd3, 0xf0, 0x22, 0xe4, 0x90, 0x7f}},
364 {0x14c6, 64, { 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x10, 0xf0, 0x90, 0x7f,
365 0x94, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x9a, 0xf0, 0x90, 0x7f, 0x97, 0xe0, 0x54, 0xfd,
366 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x23, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x84, 0xf0, 0xe4, 0x90, 0x7f,
367 0xc7, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xcf, 0xf0, 0x75, 0x98, 0x40, 0x43, 0xa8}},
368 {0x1506, 64, { 0x10, 0xc2, 0x1b, 0xc2, 0x05, 0xc2, 0x21, 0xc2, 0x0b, 0xc2, 0x13, 0xf5, 0x7c, 0xf5, 0x4a, 0xc2, 0x11,
369 0xc2, 0x15, 0xf5, 0x42, 0xc2, 0x19, 0xf5, 0x44, 0xf5, 0x48, 0xc2, 0x23, 0xc2, 0x1c, 0xf5, 0x2d,
370 0xf5, 0x2f, 0xc2, 0x07, 0xc2, 0x00, 0xc2, 0x1f, 0xf5, 0x3e, 0xc2, 0x09, 0xd2, 0x0c, 0xf5, 0x26,
371 0x90, 0x7f, 0xcb, 0xf0, 0x90, 0x7f, 0xcd, 0xf0, 0x90, 0x7f, 0xd1, 0xf0, 0x75, 0xc0, 0x40}},
372 {0x1546, 64, { 0x43, 0xa8, 0x40, 0xc2, 0x1d, 0xc2, 0x06, 0xc2, 0x22, 0xc2, 0x0d, 0xc2, 0x14, 0xf5, 0x7d, 0xf5, 0x4b,
373 0xc2, 0x12, 0xc2, 0x16, 0xf5, 0x43, 0xc2, 0x1a, 0xf5, 0x45, 0xf5, 0x49, 0xc2, 0x24, 0xc2, 0x1e,
374 0xf5, 0x39, 0xf5, 0x3b, 0xc2, 0x08, 0xc2, 0x00, 0xc2, 0x20, 0xf5, 0x3f, 0xc2, 0x0a, 0xd2, 0x0e,
375 0x75, 0x32, 0x01, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0xd2, 0x28}},
376 {0x1586, 64, { 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02,
377 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5,
378 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22,
379 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5}},
380 {0x15c6, 64, { 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50,
381 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82,
382 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82,
383 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5}},
384 {0x1606, 64, { 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22,
385 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3,
386 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60,
387 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x7d}},
388 {0x1646, 64, { 0x02, 0x16, 0x84, 0x02, 0x16, 0xc9, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80,
389 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8,
390 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46,
391 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x18}},
392 {0x1686, 64, { 0xc5, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe,
393 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4,
394 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5,
395 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde}},
396 {0x16c6, 64, { 0xe7, 0x80, 0xbe, 0x75, 0x11, 0x01, 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xae, 0xe0,
397 0xff, 0xd3, 0x92, 0x26, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90,
398 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90,
399 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44}},
400 {0x1706, 64, { 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0xbc, 0xd2, 0xbe, 0xd2, 0x2d,
401 0x12, 0x18, 0x7f, 0xc2, 0x27, 0xc2, 0x25, 0xc2, 0x28, 0x30, 0x28, 0x03, 0x12, 0x0a, 0x83, 0x90,
402 0x7f, 0xd8, 0xe0, 0x65, 0x10, 0x60, 0x08, 0xe0, 0xf5, 0x10, 0x12, 0x13, 0x7e, 0x80, 0xea, 0x30,
403 0x27, 0x07, 0xc2, 0x27, 0x12, 0x11, 0x7b, 0x80, 0xe0, 0x30, 0x2c, 0xdd, 0xc2, 0x2c, 0x12}},
404 {0x1746, 64, { 0x00, 0x26, 0x80, 0xd6, 0x22, 0xe4, 0xfe, 0x75, 0x17, 0xff, 0x75, 0x18, 0x19, 0x75, 0x19, 0x12, 0xab,
405 0x17, 0xaa, 0x18, 0xa9, 0x19, 0x90, 0x00, 0x01, 0x12, 0x15, 0xa0, 0x64, 0x02, 0x70, 0x2d, 0xad,
406 0x06, 0x0e, 0xed, 0xb5, 0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x15, 0xdf, 0x85, 0xf0, 0x15,
407 0xf5, 0x16, 0x62, 0x15, 0xe5, 0x15, 0x62, 0x16, 0xe5, 0x16, 0x62, 0x15, 0x29, 0xfd, 0xe5}},
408 {0x1786, 64, { 0x15, 0x3a, 0xa9, 0x05, 0x75, 0x17, 0xff, 0xf5, 0x18, 0x89, 0x19, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00,
409 0x79, 0x00, 0x22, 0x8f, 0x15, 0xe4, 0xf5, 0x16, 0x75, 0x17, 0xff, 0x75, 0x18, 0x19, 0x75, 0x19,
410 0x86, 0xab, 0x17, 0xaa, 0x18, 0xa9, 0x19, 0x90, 0x00, 0x01, 0x12, 0x15, 0xa0, 0xb4, 0x03, 0x1d,
411 0xaf, 0x16, 0x05, 0x16, 0xef, 0xb5, 0x15, 0x01, 0x22, 0x12, 0x15, 0x87, 0x7e, 0x00, 0x29}},
412 {0x17c6, 64, { 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x17, 0xff, 0xf5, 0x18, 0x89, 0x19, 0x80, 0xd4, 0x7b, 0x00, 0x7a,
413 0x00, 0x79, 0x00, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0xf0, 0x90, 0x7f, 0x94,
414 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0x97, 0xf0, 0xe4, 0x90, 0x7f, 0x95, 0xf0,
415 0x90, 0x7f, 0x9e, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x90, 0x7f, 0x9d, 0xf0}},
416 {0x1806, 64, { 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90,
417 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0,
418 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82,
419 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x27, 0x53, 0x91, 0xef, 0x90}},
420 {0x1846, 64, { 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0,
421 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00,
422 0xd2, 0x2c, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0,
423 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0}},
424 {0x1886, 64, { 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x2d, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x00,
425 0x06, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x74, 0x00, 0xf5,
426 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f,
427 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xc1}},
428 {0x18c6, 64, { 0xaa, 0x01, 0x1a, 0x00, 0x03, 0x1b, 0x03, 0x00, 0x00, 0xc1, 0x27, 0xc1, 0x2c, 0xc1, 0x26, 0xc1, 0x2b,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
432 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x0f, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x09, 0x02, 0x74, 0x00, 0x01,
433 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
434 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
435 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
436 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
437 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
438 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
439 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
440 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
441 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
442 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
443 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
444 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
445 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
446 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
447 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
448 {0x1a06, 64, { 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
452 {0x1a46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
456 {0x1a86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
460 {0x1ac6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x31, 0x00, 0x02, 0x1b}},
464 {0x1b06, 9, { 0x04, 0x00, 0x02, 0x18, 0x07, 0x00, 0x02, 0x18, 0x58}},
465 {0xffff, 0, {0x00}}
466};
diff --git a/drivers/usb/serial/keyspan_usa28msg.h b/drivers/usb/serial/keyspan_usa28msg.h
new file mode 100644
index 000000000000..dee454c4609a
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa28msg.h
@@ -0,0 +1,201 @@
1/*
2 usa28msg.h
3
4 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
5 This file is available under a BSD-style copyright
6
7 Keyspan USB Async Message Formats for the USA26X
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are
11 met:
12
13 1. Redistributions of source code must retain this licence text
14 without modification, this list of conditions, and the following
15 disclaimer. The following copyright notice must appear immediately at
16 the beginning of all source files:
17
18 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
19
20 This file is available under a BSD-style copyright
21
22 2. The name of InnoSys Incorporated may not be used to endorse or promote
23 products derived from this software without specific prior written
24 permission.
25
26 THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR
27 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
29 NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
30 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 SUCH DAMAGE.
37
38 Note: these message formats are common to USA18, USA19, and USA28;
39 (for USA28X, see usa26msg.h)
40
41 Buffer formats for RX/TX data messages are not defined by
42 a structure, but are described here:
43
44 USB OUT (host -> USA28, transmit) messages contain a
45 REQUEST_ACK indicator (set to 0xff to request an ACK at the
46 completion of transmit; 0x00 otherwise), followed by data.
47 If the port is configured for parity, the data will be an
48 alternating string of parity and data bytes, so the message
49 format will be:
50
51 RQSTACK PAR DAT PAR DAT ...
52
53 so the maximum length is 63 bytes (1 + 62, or 31 data bytes);
54 always an odd number for the total message length.
55
56 If there is no parity, the format is simply:
57
58 RQSTACK DAT DAT DAT ...
59
60 with a total data length of 63.
61
62 USB IN (USA28 -> host, receive) messages contain data and parity
63 if parity is configred, thusly:
64
65 DAT PAR DAT PAR DAT PAR ...
66
67 for a total of 32 data bytes;
68
69 If parity is not configured, the format is:
70
71 DAT DAT DAT ...
72
73 for a total of 64 data bytes.
74
75 In the TX messages (USB OUT), the 0x01 bit of the PARity byte is
76 the parity bit. In the RX messages (USB IN), the PARity byte is
77 the content of the 8051's status register; the parity bit
78 (RX_PARITY_BIT) is the 0x04 bit.
79
80 revision history:
81
82 1999may06 add resetDataToggle to control message
83 2000mar21 add rs232invalid to status response message
84 2000apr04 add 230.4Kb definition to setBaudRate
85 2000apr13 add/remove loopbackMode switch
86 2000apr13 change definition of setBaudRate to cover 115.2Kb, too
87 2000jun01 add extended BSD-style copyright text
88*/
89
90#ifndef __USA28MSG__
91#define __USA28MSG__
92
93
94struct keyspan_usa28_portControlMessage
95{
96 /*
97 there are four types of "commands" sent in the control message:
98
99 1. configuration changes which must be requested by setting
100 the corresponding "set" flag (and should only be requested
101 when necessary, to reduce overhead on the USA28):
102 */
103 u8 setBaudRate, // 0=don't set, 1=baudLo/Hi, 2=115.2K, 3=230.4K
104 baudLo, // host does baud divisor calculation
105 baudHi; // baudHi is only used for first port (gives lower rates)
106
107 /*
108 2. configuration changes which are done every time (because it's
109 hardly more trouble to do them than to check whether to do them):
110 */
111 u8 parity, // 1=use parity, 0=don't
112 ctsFlowControl, // all except 19Q: 1=use CTS flow control, 0=don't
113 // 19Q: 0x08:CTSflowControl 0x10:DSRflowControl
114 xonFlowControl, // 1=use XON/XOFF flow control, 0=don't
115 rts, // 1=on, 0=off
116 dtr; // 1=on, 0=off
117
118 /*
119 3. configuration data which is simply used as is (no overhead,
120 but must be correct in every host message).
121 */
122 u8 forwardingLength, // forward when this number of chars available
123 forwardMs, // forward this many ms after last rx data
124 breakThreshold, // specified in ms, 1-255 (see note below)
125 xonChar, // specified in current character format
126 xoffChar; // specified in current character format
127
128 /*
129 4. commands which are flags only; these are processed in order
130 (so that, e.g., if both _txOn and _txOff flags are set, the
131 port ends in a TX_OFF state); any non-zero value is respected
132 */
133 u8 _txOn, // enable transmitting (and continue if there's data)
134 _txOff, // stop transmitting
135 txFlush, // toss outbound data
136 txForceXoff, // pretend we've received XOFF
137 txBreak, // turn on break (leave on until txOn clears it)
138 rxOn, // turn on receiver
139 rxOff, // turn off receiver
140 rxFlush, // toss inbound data
141 rxForward, // forward all inbound data, NOW
142 returnStatus, // return current status n times (1 or 2)
143 resetDataToggle;// reset data toggle state to DATA0
144
145};
146
147struct keyspan_usa28_portStatusMessage
148{
149 u8 port, // 0=first, 1=second, 2=global (see below)
150 cts,
151 dsr, // (not used in all products)
152 dcd,
153
154 ri, // (not used in all products)
155 _txOff, // port has been disabled (by host)
156 _txXoff, // port is in XOFF state (either host or RX XOFF)
157 dataLost, // count of lost chars; wraps; not guaranteed exact
158
159 rxEnabled, // as configured by rxOn/rxOff 1=on, 0=off
160 rxBreak, // 1=we're in break state
161 rs232invalid, // 1=no valid signals on rs-232 inputs
162 controlResponse;// 1=a control messages has been processed
163};
164
165// bit defines in txState
166#define TX_OFF 0x01 // requested by host txOff command
167#define TX_XOFF 0x02 // either real, or simulated by host
168
169struct keyspan_usa28_globalControlMessage
170{
171 u8 sendGlobalStatus, // 2=request for two status responses
172 resetStatusToggle, // 1=reset global status toggle
173 resetStatusCount; // a cycling value
174};
175
176struct keyspan_usa28_globalStatusMessage
177{
178 u8 port, // 3
179 sendGlobalStatus, // from request, decremented
180 resetStatusCount; // as in request
181};
182
183struct keyspan_usa28_globalDebugMessage
184{
185 u8 port, // 2
186 n, // typically a count/status byte
187 b; // typically a data byte
188};
189
190// ie: the maximum length of an EZUSB endpoint buffer
191#define MAX_DATA_LEN 64
192
193// the parity bytes have only one significant bit
194#define RX_PARITY_BIT 0x04
195#define TX_PARITY_BIT 0x01
196
197// update status approx. 60 times a second (16.6666 ms)
198#define STATUS_UPDATE_INTERVAL 16
199
200#endif
201
diff --git a/drivers/usb/serial/keyspan_usa28x_fw.h b/drivers/usb/serial/keyspan_usa28x_fw.h
new file mode 100644
index 000000000000..3387ed9de4db
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa28x_fw.h
@@ -0,0 +1,447 @@
1/* keyspan_usa28x_fw.h
2
3 The firmware contained herein as keyspan_usa28x_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa28x_firmware[] = {
26 {0x0033, 3, { 0x02, 0x12, 0xf7}},
27 {0x0003, 16, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0}},
28 {0x0013, 16, { 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90}},
29 {0x0023, 15, { 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x07, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x22}},
30 {0x0046, 16, { 0x30, 0x09, 0x18, 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x95, 0x3c, 0x40, 0x03, 0x02, 0x00, 0xd8, 0x90}},
31 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x09, 0xc2, 0x00, 0x80, 0x77, 0x30, 0x03, 0x3b, 0x90, 0x7f}},
32 {0x0066, 16, { 0xc6, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7e}},
33 {0x0076, 16, { 0x40, 0xe0, 0x13, 0x92, 0x09, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60}},
34 {0x0086, 16, { 0x0f, 0xf5, 0x08, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x41, 0x12, 0x0c, 0xba}},
35 {0x0096, 16, { 0xc2, 0x03, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x39, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x32}},
36 {0x00a6, 16, { 0x12, 0x13, 0x1b, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x09}},
37 {0x00b6, 16, { 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d}},
38 {0x00c6, 16, { 0x7f, 0xc1, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0xc1, 0x12, 0x0c, 0xba, 0xd2, 0x03, 0xe4, 0x90, 0x7f}},
39 {0x00d6, 16, { 0xc9, 0xf0, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x01, 0x60, 0x12, 0x11, 0xd6, 0x8f}},
40 {0x00e6, 16, { 0x19, 0x12, 0x13, 0x27, 0x8f, 0x36, 0xe5, 0x19, 0xc3, 0x95, 0x3a, 0x50, 0x0f, 0x12, 0x12, 0xeb}},
41 {0x00f6, 16, { 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x36, 0x20, 0xe7, 0x03, 0x30, 0x0b, 0x5e, 0xc2, 0x0b, 0xe5, 0x19}},
42 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
43 {0x0043, 3, { 0x02, 0x13, 0x00}},
44 {0x0000, 3, { 0x02, 0x0e, 0x00}},
45 {0x0106, 64, { 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x36, 0x02, 0xe5, 0x36, 0x30, 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94,
46 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x0c, 0x7e,
47 0x75, 0x0d, 0x80, 0xaf, 0x36, 0x12, 0x0f, 0x4b, 0xe5, 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xb7, 0xf0,
48 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x19, 0x3f, 0x85, 0x19, 0x08}},
49 {0x0146, 64, { 0x90, 0x7e, 0x80, 0xe5, 0x36, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x81, 0x12,
50 0x0c, 0xdf, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06,
51 0x20, 0x05, 0x03, 0x02, 0x03, 0xc1, 0xc2, 0x05, 0xe4, 0xf5, 0x18, 0x74, 0x40, 0x25, 0x18, 0xf5,
52 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x7c, 0x00, 0x7b, 0x01, 0x7a}},
53 {0x0186, 64, { 0x7e, 0x79, 0x00, 0x24, 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5,
54 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x68, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x24,
55 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x03, 0x7d, 0xcd, 0x12, 0x11, 0xb1, 0x43, 0x46,
56 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0xe4, 0x90}},
57 {0x01c6, 64, { 0x7e, 0x13, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12, 0x10, 0x35, 0x90, 0x7e, 0x02, 0xe0,
58 0xff, 0x12, 0x10, 0x5b, 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x03,
59 0x7d, 0x07, 0x12, 0x11, 0xb1, 0x43, 0x46, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0,
60 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x06, 0x90}},
61 {0x0206, 64, { 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x03, 0xe0, 0x70, 0x06, 0x90, 0x7e, 0x13, 0xe0, 0x70, 0x08, 0xe4, 0x90,
62 0x7e, 0x13, 0xf0, 0x75, 0x25, 0xff, 0x90, 0x7e, 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f,
63 0xf5, 0x44, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x44, 0xf0, 0x90, 0x7e,
64 0x07, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x42, 0x80, 0x80, 0x03, 0x53, 0x42}},
65 {0x0246, 64, { 0x7f, 0x53, 0x42, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x42, 0x02, 0xa3, 0xe0, 0xff, 0x12,
66 0x10, 0xa7, 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x10, 0xcd, 0xaf, 0x42, 0x12, 0x10, 0x81, 0x90,
67 0x7e, 0x03, 0xe0, 0x60, 0x08, 0x53, 0x42, 0x7f, 0xaf, 0x42, 0x12, 0x10, 0x81, 0x90, 0x7e, 0x0c,
68 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x02, 0x80, 0x03, 0x53, 0x46, 0xfd}},
69 {0x0286, 64, { 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x0e, 0xe0, 0x60,
70 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x01, 0x80, 0x03, 0x53, 0x46, 0xfe, 0x90, 0x7f, 0x98,
71 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x3a, 0xa3,
72 0xe0, 0x13, 0x92, 0x0d, 0xa3, 0xe0, 0xf5, 0x3c, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x10}},
73 {0x02c6, 64, { 0x80, 0x03, 0x53, 0x46, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0,
74 0x90, 0x7e, 0x16, 0xe0, 0x60, 0x32, 0x53, 0x44, 0xbf, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5,
75 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x12, 0x12, 0xdf,
76 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3e, 0xfd, 0xe4, 0xff, 0xad, 0x3e, 0x12}},
77 {0x0306, 64, { 0x11, 0xb1, 0xe4, 0xf5, 0x2a, 0xf5, 0x29, 0xd2, 0x07, 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43, 0x3e,
78 0x02, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0x75, 0x29, 0x01, 0xd2, 0x07, 0x90, 0x7e, 0x18,
79 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x04, 0x90, 0xc0, 0x00,
80 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11, 0x43, 0x44, 0x40, 0x90, 0x7f, 0x98}},
81 {0x0346, 64, { 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60, 0x0f,
82 0x53, 0x3e, 0xfe, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0x75, 0x2b, 0x01, 0xd2, 0x07, 0x90,
83 0x7e, 0x1b, 0xe0, 0x60, 0x0f, 0x43, 0x3e, 0x01, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xb1, 0xe4,
84 0xf5, 0x2b, 0xd2, 0x07, 0x90, 0x7e, 0x1c, 0xe0, 0x60, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x12}},
85 {0x0386, 64, { 0xf0, 0xe5, 0x40, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2, 0x0b,
86 0x90, 0x7e, 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x2c, 0x01, 0xe4, 0xf5, 0x38, 0xd2, 0x07, 0x90, 0x7e,
87 0x1f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15, 0xf0,
88 0x74, 0x35, 0xf0, 0xd2, 0x03, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0x30, 0x1a, 0x52, 0xe5, 0x38}},
89 {0x03c6, 64, { 0x60, 0x02, 0x15, 0x38, 0x20, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x13, 0x80,
90 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xd2, 0x13, 0x12, 0x12, 0xdf, 0xef, 0x54, 0x01, 0xf5,
91 0x19, 0x65, 0x2a, 0x60, 0x05, 0x85, 0x19, 0x2a, 0xd2, 0x07, 0x12, 0x13, 0x33, 0xef, 0x54, 0x80,
92 0xf5, 0x19, 0x65, 0x26, 0x60, 0x05, 0x85, 0x19, 0x26, 0xd2, 0x07, 0x30, 0x0d, 0x11, 0x12}},
93 {0x0406, 64, { 0x13, 0x33, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x25, 0x60, 0x05, 0x85, 0x19, 0x25, 0xd2, 0x07, 0x20,
94 0x1b, 0x03, 0x02, 0x07, 0xec, 0x30, 0x0a, 0x18, 0x12, 0x13, 0x6f, 0xef, 0xc3, 0x95, 0x3d, 0x40,
95 0x03, 0x02, 0x04, 0xae, 0x90, 0x7f, 0xc1, 0x74, 0x01, 0xf0, 0xc2, 0x0a, 0xc2, 0x00, 0x80, 0x77,
96 0x30, 0x04, 0x3b, 0x90, 0x7f, 0xca, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x6f, 0xef, 0xc3}},
97 {0x0446, 64, { 0x94, 0x40, 0x50, 0x64, 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0x14, 0xf5,
98 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d, 0x7f, 0x41, 0x75, 0x0c, 0x7d, 0x75,
99 0x0d, 0x41, 0x12, 0x0d, 0x04, 0xc2, 0x04, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x39, 0x90, 0x7f,
100 0xcc, 0xe0, 0x20, 0xe1, 0x32, 0x12, 0x13, 0x6f, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90}},
101 {0x0486, 64, { 0x7c, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60,
102 0x0f, 0xf5, 0x08, 0x7e, 0x7c, 0x7f, 0xc1, 0x75, 0x0c, 0x7c, 0x75, 0x0d, 0xc1, 0x12, 0x0d, 0x04,
103 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0x90, 0x7f, 0xba, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x05,
104 0x36, 0x12, 0x12, 0x20, 0x8f, 0x19, 0x12, 0x13, 0x7b, 0x8f, 0x37, 0xe5, 0x19, 0xc3, 0x95}},
105 {0x04c6, 64, { 0x3b, 0x50, 0x0f, 0x12, 0x13, 0x57, 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x37, 0x20, 0xe7, 0x03, 0x30, 0x0c,
106 0x5e, 0xc2, 0x0c, 0xe5, 0x19, 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x37, 0x02, 0xe5, 0x37, 0x30,
107 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e,
108 0x7d, 0x7f, 0x80, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0x80, 0xaf, 0x37, 0x12, 0x0f, 0x84, 0xe5}},
109 {0x0506, 64, { 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xbb, 0xf0, 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75,
110 0x19, 0x3f, 0x85, 0x19, 0x08, 0x90, 0x7d, 0x80, 0xe5, 0x37, 0xf0, 0x7e, 0x7d, 0x7f, 0x81, 0x75,
111 0x0c, 0x7d, 0x75, 0x0d, 0x81, 0x12, 0x0d, 0x29, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xbb, 0xf0, 0x90,
112 0x7f, 0xd0, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x06, 0x03, 0x02, 0x07, 0x97, 0xc2, 0x06, 0xe4}},
113 {0x0546, 64, { 0xf5, 0x18, 0x74, 0xc0, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18,
114 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x20, 0x24, 0x20, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef,
115 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x20, 0xe0, 0x60, 0x68,
116 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x24, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x03}},
117 {0x0586, 64, { 0x7d, 0xcd, 0x12, 0x11, 0xfb, 0x43, 0x47, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00,
118 0xe5, 0x47, 0xf0, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x21, 0xe0, 0xff, 0x12,
119 0x11, 0x19, 0x90, 0x7e, 0x22, 0xe0, 0xff, 0x12, 0x11, 0x3f, 0x7f, 0x01, 0x90, 0x7e, 0x31, 0xe0,
120 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xfb, 0x43, 0x47, 0x80, 0x90}},
121 {0x05c6, 64, { 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0,
122 0xe5, 0x41, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x23, 0xe0, 0x70, 0x06, 0x90, 0x7e,
123 0x33, 0xe0, 0x70, 0x08, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x75, 0x2e, 0xff, 0x90, 0x7e, 0x25, 0xe0,
124 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x45, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
125 {0x0606, 64, { 0xc0, 0x00, 0xe5, 0x45, 0xf0, 0x90, 0x7e, 0x27, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x43,
126 0x80, 0x80, 0x03, 0x53, 0x43, 0x7f, 0x53, 0x43, 0xfc, 0x90, 0x7e, 0x29, 0xe0, 0x60, 0x11, 0x43,
127 0x43, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x11, 0x65, 0x90, 0x7e, 0x2b, 0xe0, 0xff, 0x12, 0x11, 0x8b,
128 0xaf, 0x43, 0x12, 0x10, 0xf3, 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x08, 0x53, 0x43, 0x7f, 0xaf}},
129 {0x0646, 64, { 0x43, 0x12, 0x10, 0xf3, 0x90, 0x7e, 0x2c, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x02,
130 0x80, 0x03, 0x53, 0x47, 0xfd, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47,
131 0xf0, 0x90, 0x7e, 0x2e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x01, 0x80, 0x03,
132 0x53, 0x47, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0}},
133 {0x0686, 64, { 0x90, 0x7e, 0x32, 0xe0, 0xf5, 0x3b, 0xa3, 0xe0, 0x13, 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0,
134 0x60, 0x05, 0x43, 0x47, 0x10, 0x80, 0x03, 0x53, 0x47, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
135 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7e, 0x36, 0xe0, 0x60, 0x32, 0x53, 0x45, 0xbf, 0x90,
136 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f}},
137 {0x06c6, 64, { 0x98, 0x74, 0x09, 0xf0, 0x12, 0x13, 0x4b, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3f, 0xfd,
138 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0xe4, 0xf5, 0x33, 0xf5, 0x32, 0xd2, 0x08, 0x90, 0x7e,
139 0x37, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x02, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0x75, 0x32,
140 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x38, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0}},
141 {0x0706, 64, { 0xe5, 0x41, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x39, 0xe0, 0x60, 0x11, 0x43,
142 0x45, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
143 0x90, 0x7e, 0x3a, 0xe0, 0x60, 0x0f, 0x53, 0x3f, 0xfe, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb,
144 0x75, 0x34, 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x3b, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x01, 0xe4}},
145 {0x0746, 64, { 0xff, 0xad, 0x3f, 0x12, 0x11, 0xfb, 0xe4, 0xf5, 0x34, 0xd2, 0x08, 0x90, 0x7e, 0x3c, 0xe0, 0x60, 0x0e,
146 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0xe5, 0x41, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e,
147 0x3d, 0xe0, 0x60, 0x02, 0xd2, 0x0c, 0x90, 0x7e, 0x3e, 0xe0, 0x60, 0x08, 0x75, 0x35, 0x01, 0xe4,
148 0xf5, 0x39, 0xd2, 0x08, 0x90, 0x7e, 0x3f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x13}},
149 {0x0786, 64, { 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x16, 0xf0, 0x74, 0x36, 0xf0, 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xd1, 0xf0,
150 0x30, 0x1a, 0x52, 0xe5, 0x39, 0x60, 0x02, 0x15, 0x39, 0x30, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94,
151 0x00, 0x40, 0x04, 0x15, 0x13, 0x80, 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xc2, 0x13, 0x12,
152 0x13, 0x4b, 0xef, 0x54, 0x01, 0xf5, 0x19, 0x65, 0x33, 0x60, 0x05, 0x85, 0x19, 0x33, 0xd2}},
153 {0x07c6, 64, { 0x08, 0x12, 0x13, 0x87, 0xef, 0x54, 0x80, 0xf5, 0x19, 0x65, 0x2f, 0x60, 0x05, 0x85, 0x19, 0x2f, 0xd2,
154 0x08, 0x30, 0x0e, 0x11, 0x12, 0x13, 0x87, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x2e, 0x60, 0x05,
155 0x85, 0x19, 0x2e, 0xd2, 0x08, 0x30, 0x1a, 0x2a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1, 0x23, 0x90,
156 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5, 0x15, 0x90, 0x7b, 0x42, 0xe0, 0xf5, 0x16, 0x90}},
157 {0x0806, 64, { 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4, 0x90, 0x7f,
158 0xd3, 0xf0, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x09, 0x20, 0xe5, 0x0a, 0x70, 0x40,
159 0x30, 0x07, 0x39, 0xe5, 0x38, 0x70, 0x35, 0xc2, 0x07, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
160 0x24, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25}},
161 {0x0846, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb,
162 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x38, 0x10, 0xe4, 0xf5, 0x2c, 0x75, 0x0a, 0x01, 0x22,
163 0xe5, 0x0a, 0x64, 0x01, 0x70, 0x40, 0x30, 0x08, 0x39, 0xe5, 0x39, 0x70, 0x35, 0xc2, 0x08, 0xf5,
164 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12}},
165 {0x0886, 64, { 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05,
166 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x39, 0x10, 0xe4,
167 0xf5, 0x35, 0x75, 0x0a, 0x02, 0x22, 0xe5, 0x0a, 0x64, 0x02, 0x70, 0x36, 0x30, 0x14, 0x2f, 0xc2,
168 0x14, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x0e, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00}},
169 {0x08c6, 64, { 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef,
170 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x05, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x05, 0xf0, 0x75, 0x0a,
171 0x03, 0x22, 0xe5, 0x15, 0x60, 0x30, 0x15, 0x15, 0xe4, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
172 0x14, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x8c, 0xff, 0x74, 0x80, 0x25}},
173 {0x0906, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x03, 0xdb,
174 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x0a, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0e,
175 0xe4, 0x0a, 0x08, 0x00, 0x0a, 0x7c, 0x01, 0x0a, 0xe8, 0x03, 0x09, 0x44, 0x06, 0x09, 0xfb, 0x08,
176 0x09, 0xf5, 0x09, 0x09, 0xdd, 0x0a, 0x09, 0xec, 0x0b, 0x00, 0x00, 0x0b, 0x37, 0x90, 0x7f}},
177 {0x0946, 64, { 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x14, 0x60, 0x61, 0x24, 0x02, 0x60, 0x03, 0x02, 0x09, 0xd3, 0x74,
178 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f,
179 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19,
180 0xef, 0xf0, 0x75, 0x82, 0x7b, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x74, 0x75, 0x83, 0x19}},
181 {0x0986, 64, { 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f,
182 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0,
183 0x74, 0x12, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0f,
184 0x0a, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0}},
185 {0x09c6, 64, { 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0,
186 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0xe5, 0x09, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
187 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x09, 0x02, 0x0b, 0x3e, 0x12, 0x0b,
188 0x46, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xf0, 0x02}},
189 {0x0a06, 64, { 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b,
190 0xa2, 0x10, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x16, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00,
191 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0xe4, 0x90, 0x7f,
192 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f}},
193 {0x0a46, 64, { 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24,
194 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4,
195 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
196 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02}},
197 {0x0a86, 64, { 0x60, 0x03, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x10, 0x02, 0x0b, 0x3e,
198 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38,
199 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f,
200 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f}},
201 {0x0ac6, 64, { 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f,
202 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80,
203 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea,
204 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x10, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0}},
205 {0x0b06, 64, { 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4,
206 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f,
207 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07,
208 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22}},
209 {0x0b46, 64, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90,
210 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x18,
211 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0xe4, 0xf5,
212 0x24, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x18, 0xf9, 0xe4, 0x34, 0x00, 0xfa}},
213 {0x0b86, 64, { 0xe4, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3a, 0x01, 0xe4, 0xf5, 0x38,
214 0xf5, 0x13, 0xf5, 0x36, 0xc2, 0x07, 0xc2, 0x0b, 0xc2, 0x05, 0xc2, 0x00, 0xc2, 0x09, 0xc2, 0x13,
215 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x75, 0x44, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f,
216 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xb1, 0x7f, 0x10, 0x8f, 0x42, 0x12, 0x10, 0x81, 0x90, 0x7f}},
217 {0x0bc6, 64, { 0x98, 0x74, 0x12, 0xf0, 0x7f, 0x01, 0x8f, 0x40, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f,
218 0x98, 0x74, 0x14, 0xf0, 0x75, 0x46, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0x0f, 0xe4, 0xfd,
219 0x12, 0x11, 0xb1, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3e, 0x12, 0x11, 0xb1, 0x90, 0x7f,
220 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x11}},
221 {0x0c06, 64, { 0xb1, 0x7f, 0x01, 0x12, 0x12, 0x6a, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xb1, 0x20, 0x1b, 0x03, 0x02,
222 0x0c, 0xb7, 0x75, 0x2d, 0x01, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xe4,
223 0x34, 0x00, 0xfa, 0xe4, 0x12, 0x0e, 0xd2, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3b,
224 0x01, 0xe4, 0xf5, 0x39, 0xf5, 0x13, 0xf5, 0x37, 0xc2, 0x08, 0xc2, 0x0c, 0xc2, 0x06, 0xc2}},
225 {0x0c46, 64, { 0x00, 0xc2, 0x0a, 0xc2, 0x13, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x75, 0x45, 0x03, 0x90, 0xc0, 0x00,
226 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0x7f, 0x10, 0x8f, 0x43, 0x12, 0x10,
227 0xf3, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x7f, 0x01, 0x8f, 0x41, 0xef, 0x44, 0x06, 0x90, 0xc0,
228 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x75, 0x47, 0x80, 0x90, 0xc0, 0x00, 0x74}},
229 {0x0c86, 64, { 0x80, 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x11, 0xfb, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3f, 0x12,
230 0x11, 0xfb, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d,
231 0x7f, 0x12, 0x11, 0xfb, 0x7f, 0x01, 0x12, 0x12, 0x8b, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xfb,
232 0xd2, 0x12, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82}},
233 {0x0cc6, 64, { 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86,
234 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08,
235 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0,
236 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x90, 0x7f}},
237 {0x0d06, 64, { 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05,
238 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2,
239 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c,
240 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05}},
241 {0x0d46, 64, { 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05,
242 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43,
243 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd2, 0x19, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02,
244 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x10, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0}},
245 {0x0d86, 64, { 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f,
246 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90,
247 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2,
248 0x1a, 0x12, 0x12, 0x45, 0xc2, 0x11, 0xe4, 0xf5, 0x0b, 0xf5, 0x13, 0xc2, 0x17, 0xc2, 0x12}},
249 {0x0dc6, 64, { 0x90, 0x7f, 0xa1, 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x17, 0x60, 0x10, 0x30, 0x12, 0x05, 0xd2,
250 0x1a, 0x12, 0x00, 0x46, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x17, 0x80, 0x08, 0x30, 0x12, 0x05, 0xc2,
251 0x1a, 0x12, 0x00, 0x46, 0x30, 0x11, 0x07, 0xc2, 0x11, 0x12, 0x09, 0x21, 0x80, 0xd6, 0x30, 0x18,
252 0xd3, 0xc2, 0x18, 0x12, 0x13, 0x93, 0x80, 0xcc, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd}},
253 {0x0e06, 64, { 0x75, 0x81, 0x47, 0x02, 0x0e, 0x47, 0x02, 0x0d, 0x6f, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40,
254 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07,
255 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56,
256 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40}},
257 {0x0e46, 64, { 0x80, 0x90, 0x12, 0xac, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09,
258 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8,
259 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82,
260 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca}},
261 {0x0e86, 64, { 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02,
262 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01,
263 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9,
264 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5}},
265 {0x0ec6, 64, { 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82,
266 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0,
267 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74,
268 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3}},
269 {0x0f06, 64, { 0xa3, 0xa3, 0x80, 0xdf, 0x8f, 0x18, 0xe4, 0xf5, 0x19, 0x75, 0x1a, 0xff, 0x75, 0x1b, 0x19, 0x75, 0x1c,
270 0x86, 0xab, 0x1a, 0xaa, 0x1b, 0xa9, 0x1c, 0x90, 0x00, 0x01, 0x12, 0x0e, 0xa5, 0xb4, 0x03, 0x1d,
271 0xaf, 0x19, 0x05, 0x19, 0xef, 0xb5, 0x18, 0x01, 0x22, 0x12, 0x0e, 0x8c, 0x7e, 0x00, 0x29, 0xff,
272 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x1a, 0xff, 0xf5, 0x1b, 0x89, 0x1c, 0x80, 0xd4, 0x7b, 0x00}},
273 {0x0f46, 64, { 0x7a, 0x00, 0x79, 0x00, 0x22, 0x8f, 0x1a, 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c,
274 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12, 0x00, 0x36, 0x05, 0x0d, 0xe5, 0x0d, 0xac,
275 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08,
276 0x60, 0x0a, 0x12, 0x13, 0x27, 0x8f, 0x1a, 0xef, 0x42, 0x36, 0x80, 0xca, 0x22, 0x8f, 0x1a}},
277 {0x0f86, 64, { 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a,
278 0xf0, 0x12, 0x13, 0x3f, 0x05, 0x0d, 0xe5, 0x0d, 0xac, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5,
279 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08, 0x60, 0x0a, 0x12, 0x13, 0x7b, 0x8f, 0x1a,
280 0xef, 0x42, 0x37, 0x80, 0xca, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0}},
281 {0x0fc6, 64, { 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
282 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32,
283 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2,
284 0x11, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0}},
285 {0x1006, 64, { 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0,
286 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08,
287 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f,
288 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10}},
289 {0x1046, 64, { 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90,
290 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
291 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13,
292 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13}},
293 {0x1086, 64, { 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef,
294 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22,
295 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74,
296 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44}},
297 {0x10c6, 64, { 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74,
298 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98,
299 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74,
300 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90}},
301 {0x1106, 64, { 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00,
302 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f,
303 0x98, 0x74, 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5,
304 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
305 {0x1146, 64, { 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90,
306 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f,
307 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
308 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f}},
309 {0x1186, 64, { 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
310 0x90, 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b,
311 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0,
312 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90}},
313 {0x11c6, 64, { 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12,
314 0x13, 0x0f, 0x8f, 0x1a, 0x12, 0x13, 0x0f, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12,
315 0x13, 0x0f, 0x8f, 0x1a, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x0f, 0x8f, 0x1b, 0x80,
316 0xe8, 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90}},
317 {0x1206, 64, { 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0f, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98,
318 0x74, 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13, 0x63, 0x8f, 0x1a, 0x12, 0x13,
319 0x63, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12, 0x13, 0x63, 0x8f, 0x1a, 0xe5, 0x1a,
320 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x63, 0x8f, 0x1b, 0x80, 0xe8, 0xaf, 0x1a, 0x22, 0x90}},
321 {0x1246, 64, { 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x1a, 0x04, 0xe0, 0x44, 0x02, 0xf0,
322 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x12, 0xc8, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44,
323 0x04, 0xf0, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3e, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xb1, 0x90,
324 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3e, 0x44, 0x80}},
325 {0x1286, 64, { 0xfd, 0x12, 0x11, 0xb1, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3f, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xfb,
326 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3f, 0x44, 0x80,
327 0xfd, 0x12, 0x11, 0xfb, 0x22, 0x05, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x03, 0x00,
328 0x00, 0xc1, 0x11, 0xc1, 0x18, 0xc1, 0x95, 0xc1, 0x10, 0xc1, 0x16, 0x01, 0x0a, 0x00, 0xc1}},
329 {0x12c6, 64, { 0x9b, 0x00, 0x8e, 0x18, 0x8f, 0x19, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e,
330 0x60, 0x05, 0x12, 0x0d, 0x4e, 0x80, 0xee, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0,
331 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
332 0x53, 0xd8, 0xef, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0xe7, 0x00, 0x02, 0x13}},
333 {0x1306, 64, { 0x04, 0x00, 0x02, 0x0f, 0xbd, 0x00, 0x02, 0x10, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0,
334 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
335 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
336 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0x90}},
337 {0x1346, 64, { 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
338 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
339 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0,
340 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff}},
341 {0x1386, 64, { 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x12, 0x00, 0x03, 0x12,
342 0x0d, 0x5f, 0x12, 0x0b, 0x46, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
345 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
349 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
353 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
357 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
361 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
365 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
369 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
373 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
377 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
381 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
385 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
389 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
393 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
397 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
401 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
405 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
409 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
413 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
417 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
421 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
425 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
429 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x10, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
430 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
431 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
432 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
433 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
434 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x83, 0x02,
435 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
436 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
437 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
438 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
439 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
440 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
441 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
442 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
443 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
444 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
445 {0x1a06, 4, { 0x72, 0x00, 0x00, 0x00}},
446 {0xffff, 0, {0x00}}
447};
diff --git a/drivers/usb/serial/keyspan_usa28xa_fw.h b/drivers/usb/serial/keyspan_usa28xa_fw.h
new file mode 100644
index 000000000000..7b566781e2d2
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa28xa_fw.h
@@ -0,0 +1,449 @@
1/* keyspan_usa28xa_fw.h
2
3 The firmware contained herein as keyspan_usa28xa.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23
24
25*/
26
27static const struct ezusb_hex_record keyspan_usa28xa_firmware[] = {
28 {0x0033, 3, { 0x02, 0x12, 0xf9}},
29 {0x0003, 16, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0}},
30 {0x0013, 16, { 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90}},
31 {0x0023, 15, { 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x07, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x22}},
32 {0x0046, 16, { 0x30, 0x09, 0x18, 0x12, 0x13, 0x27, 0xef, 0xc3, 0x95, 0x3c, 0x40, 0x03, 0x02, 0x00, 0xd8, 0x90}},
33 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x09, 0xc2, 0x00, 0x80, 0x77, 0x30, 0x03, 0x3b, 0x90, 0x7f}},
34 {0x0066, 16, { 0xc6, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x27, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7e}},
35 {0x0076, 16, { 0x40, 0xe0, 0x13, 0x92, 0x09, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60}},
36 {0x0086, 16, { 0x0f, 0xf5, 0x08, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x41, 0x12, 0x0c, 0xc8}},
37 {0x0096, 16, { 0xc2, 0x03, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x39, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x32}},
38 {0x00a6, 16, { 0x12, 0x13, 0x27, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x09}},
39 {0x00b6, 16, { 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d}},
40 {0x00c6, 16, { 0x7f, 0xc1, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0xc1, 0x12, 0x0c, 0xc8, 0xd2, 0x03, 0xe4, 0x90, 0x7f}},
41 {0x00d6, 16, { 0xc9, 0xf0, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x01, 0x60, 0x12, 0x11, 0xe4, 0x8f}},
42 {0x00e6, 16, { 0x19, 0x12, 0x13, 0x33, 0x8f, 0x36, 0xe5, 0x19, 0xc3, 0x95, 0x3a, 0x50, 0x0f, 0x12, 0x13, 0x0f}},
43 {0x00f6, 16, { 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x36, 0x20, 0xe7, 0x03, 0x30, 0x0b, 0x5e, 0xc2, 0x0b, 0xe5, 0x19}},
44 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
45 {0x0043, 3, { 0x02, 0x13, 0x00}},
46 {0x0000, 3, { 0x02, 0x0e, 0x0e}},
47 {0x0106, 64, { 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x36, 0x02, 0xe5, 0x36, 0x30, 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94,
48 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x0c, 0x7e,
49 0x75, 0x0d, 0x80, 0xaf, 0x36, 0x12, 0x0f, 0x59, 0xe5, 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xb7, 0xf0,
50 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x19, 0x3f, 0x85, 0x19, 0x08}},
51 {0x0146, 64, { 0x90, 0x7e, 0x80, 0xe5, 0x36, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x81, 0x12,
52 0x0c, 0xed, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06,
53 0x20, 0x05, 0x03, 0x02, 0x03, 0xc1, 0xc2, 0x05, 0xe4, 0xf5, 0x18, 0x74, 0x40, 0x25, 0x18, 0xf5,
54 0x82, 0xe4, 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x7c, 0x00, 0x7b, 0x01, 0x7a}},
55 {0x0186, 64, { 0x7e, 0x79, 0x00, 0x24, 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef, 0x12, 0x0e, 0xe0, 0x05, 0x18, 0xe5,
56 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x68, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x24,
57 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x11, 0xbf, 0x7f, 0x03, 0x7d, 0xcd, 0x12, 0x11, 0xbf, 0x43, 0x46,
58 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0xe4, 0x90}},
59 {0x01c6, 64, { 0x7e, 0x13, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12, 0x10, 0x43, 0x90, 0x7e, 0x02, 0xe0,
60 0xff, 0x12, 0x10, 0x69, 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x11, 0xbf, 0x7f, 0x03,
61 0x7d, 0x07, 0x12, 0x11, 0xbf, 0x43, 0x46, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0,
62 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x06, 0x90}},
63 {0x0206, 64, { 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x03, 0xe0, 0x70, 0x06, 0x90, 0x7e, 0x13, 0xe0, 0x70, 0x08, 0xe4, 0x90,
64 0x7e, 0x13, 0xf0, 0x75, 0x25, 0xff, 0x90, 0x7e, 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f,
65 0xf5, 0x44, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x44, 0xf0, 0x90, 0x7e,
66 0x07, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x42, 0x80, 0x80, 0x03, 0x53, 0x42}},
67 {0x0246, 64, { 0x7f, 0x53, 0x42, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x42, 0x02, 0xa3, 0xe0, 0xff, 0x12,
68 0x10, 0xb5, 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x10, 0xdb, 0xaf, 0x42, 0x12, 0x10, 0x8f, 0x90,
69 0x7e, 0x03, 0xe0, 0x60, 0x08, 0x53, 0x42, 0x7f, 0xaf, 0x42, 0x12, 0x10, 0x8f, 0x90, 0x7e, 0x0c,
70 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x02, 0x80, 0x03, 0x53, 0x46, 0xfd}},
71 {0x0286, 64, { 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x0e, 0xe0, 0x60,
72 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x01, 0x80, 0x03, 0x53, 0x46, 0xfe, 0x90, 0x7f, 0x98,
73 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x3a, 0xa3,
74 0xe0, 0x13, 0x92, 0x0d, 0xa3, 0xe0, 0xf5, 0x3c, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x10}},
75 {0x02c6, 64, { 0x80, 0x03, 0x53, 0x46, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0,
76 0x90, 0x7e, 0x16, 0xe0, 0x60, 0x32, 0x53, 0x44, 0xbf, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5,
77 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x12, 0x12, 0xed,
78 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3e, 0xfd, 0xe4, 0xff, 0xad, 0x3e, 0x12}},
79 {0x0306, 64, { 0x11, 0xbf, 0xe4, 0xf5, 0x2a, 0xf5, 0x29, 0xd2, 0x07, 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43, 0x3e,
80 0x02, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xbf, 0x75, 0x29, 0x01, 0xd2, 0x07, 0x90, 0x7e, 0x18,
81 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x04, 0x90, 0xc0, 0x00,
82 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11, 0x43, 0x44, 0x40, 0x90, 0x7f, 0x98}},
83 {0x0346, 64, { 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60, 0x0f,
84 0x53, 0x3e, 0xfe, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xbf, 0x75, 0x2b, 0x01, 0xd2, 0x07, 0x90,
85 0x7e, 0x1b, 0xe0, 0x60, 0x0f, 0x43, 0x3e, 0x01, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xbf, 0xe4,
86 0xf5, 0x2b, 0xd2, 0x07, 0x90, 0x7e, 0x1c, 0xe0, 0x60, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x12}},
87 {0x0386, 64, { 0xf0, 0xe5, 0x40, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2, 0x0b,
88 0x90, 0x7e, 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x2c, 0x01, 0xe4, 0xf5, 0x38, 0xd2, 0x07, 0x90, 0x7e,
89 0x1f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15, 0xf0,
90 0x74, 0x35, 0xf0, 0xd2, 0x03, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0x30, 0x1a, 0x52, 0xe5, 0x38}},
91 {0x03c6, 64, { 0x60, 0x02, 0x15, 0x38, 0x20, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x13, 0x80,
92 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xd2, 0x13, 0x12, 0x12, 0xed, 0xef, 0x54, 0x01, 0xf5,
93 0x19, 0x65, 0x2a, 0x60, 0x05, 0x85, 0x19, 0x2a, 0xd2, 0x07, 0x12, 0x13, 0x3f, 0xef, 0x54, 0x80,
94 0xf5, 0x19, 0x65, 0x26, 0x60, 0x05, 0x85, 0x19, 0x26, 0xd2, 0x07, 0x30, 0x0d, 0x11, 0x12}},
95 {0x0406, 64, { 0x13, 0x3f, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x25, 0x60, 0x05, 0x85, 0x19, 0x25, 0xd2, 0x07, 0x20,
96 0x1b, 0x03, 0x02, 0x07, 0xec, 0x30, 0x0a, 0x18, 0x12, 0x13, 0x7b, 0xef, 0xc3, 0x95, 0x3d, 0x40,
97 0x03, 0x02, 0x04, 0xae, 0x90, 0x7f, 0xc1, 0x74, 0x01, 0xf0, 0xc2, 0x0a, 0xc2, 0x00, 0x80, 0x77,
98 0x30, 0x04, 0x3b, 0x90, 0x7f, 0xca, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x7b, 0xef, 0xc3}},
99 {0x0446, 64, { 0x94, 0x40, 0x50, 0x64, 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0x14, 0xf5,
100 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d, 0x7f, 0x41, 0x75, 0x0c, 0x7d, 0x75,
101 0x0d, 0x41, 0x12, 0x0d, 0x12, 0xc2, 0x04, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x39, 0x90, 0x7f,
102 0xcc, 0xe0, 0x20, 0xe1, 0x32, 0x12, 0x13, 0x7b, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90}},
103 {0x0486, 64, { 0x7c, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60,
104 0x0f, 0xf5, 0x08, 0x7e, 0x7c, 0x7f, 0xc1, 0x75, 0x0c, 0x7c, 0x75, 0x0d, 0xc1, 0x12, 0x0d, 0x12,
105 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0x90, 0x7f, 0xba, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x05,
106 0x36, 0x12, 0x12, 0x2e, 0x8f, 0x19, 0x12, 0x13, 0x87, 0x8f, 0x37, 0xe5, 0x19, 0xc3, 0x95}},
107 {0x04c6, 64, { 0x3b, 0x50, 0x0f, 0x12, 0x13, 0x63, 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x37, 0x20, 0xe7, 0x03, 0x30, 0x0c,
108 0x5e, 0xc2, 0x0c, 0xe5, 0x19, 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x37, 0x02, 0xe5, 0x37, 0x30,
109 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e,
110 0x7d, 0x7f, 0x80, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0x80, 0xaf, 0x37, 0x12, 0x0f, 0x92, 0xe5}},
111 {0x0506, 64, { 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xbb, 0xf0, 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75,
112 0x19, 0x3f, 0x85, 0x19, 0x08, 0x90, 0x7d, 0x80, 0xe5, 0x37, 0xf0, 0x7e, 0x7d, 0x7f, 0x81, 0x75,
113 0x0c, 0x7d, 0x75, 0x0d, 0x81, 0x12, 0x0d, 0x37, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xbb, 0xf0, 0x90,
114 0x7f, 0xd0, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x06, 0x03, 0x02, 0x07, 0x97, 0xc2, 0x06, 0xe4}},
115 {0x0546, 64, { 0xf5, 0x18, 0x74, 0xc0, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18,
116 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x20, 0x24, 0x20, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef,
117 0x12, 0x0e, 0xe0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x20, 0xe0, 0x60, 0x68,
118 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x24, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x12, 0x09, 0x7f, 0x03}},
119 {0x0586, 64, { 0x7d, 0xcd, 0x12, 0x12, 0x09, 0x43, 0x47, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00,
120 0xe5, 0x47, 0xf0, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x21, 0xe0, 0xff, 0x12,
121 0x11, 0x27, 0x90, 0x7e, 0x22, 0xe0, 0xff, 0x12, 0x11, 0x4d, 0x7f, 0x01, 0x90, 0x7e, 0x31, 0xe0,
122 0xfd, 0x12, 0x12, 0x09, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x12, 0x09, 0x43, 0x47, 0x80, 0x90}},
123 {0x05c6, 64, { 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0,
124 0xe5, 0x41, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x23, 0xe0, 0x70, 0x06, 0x90, 0x7e,
125 0x33, 0xe0, 0x70, 0x08, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x75, 0x2e, 0xff, 0x90, 0x7e, 0x25, 0xe0,
126 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x45, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
127 {0x0606, 64, { 0xc0, 0x00, 0xe5, 0x45, 0xf0, 0x90, 0x7e, 0x27, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x43,
128 0x80, 0x80, 0x03, 0x53, 0x43, 0x7f, 0x53, 0x43, 0xfc, 0x90, 0x7e, 0x29, 0xe0, 0x60, 0x11, 0x43,
129 0x43, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x11, 0x73, 0x90, 0x7e, 0x2b, 0xe0, 0xff, 0x12, 0x11, 0x99,
130 0xaf, 0x43, 0x12, 0x11, 0x01, 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x08, 0x53, 0x43, 0x7f, 0xaf}},
131 {0x0646, 64, { 0x43, 0x12, 0x11, 0x01, 0x90, 0x7e, 0x2c, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x02,
132 0x80, 0x03, 0x53, 0x47, 0xfd, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47,
133 0xf0, 0x90, 0x7e, 0x2e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x01, 0x80, 0x03,
134 0x53, 0x47, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0}},
135 {0x0686, 64, { 0x90, 0x7e, 0x32, 0xe0, 0xf5, 0x3b, 0xa3, 0xe0, 0x13, 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0,
136 0x60, 0x05, 0x43, 0x47, 0x10, 0x80, 0x03, 0x53, 0x47, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
137 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7e, 0x36, 0xe0, 0x60, 0x32, 0x53, 0x45, 0xbf, 0x90,
138 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f}},
139 {0x06c6, 64, { 0x98, 0x74, 0x09, 0xf0, 0x12, 0x13, 0x57, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3f, 0xfd,
140 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x09, 0xe4, 0xf5, 0x33, 0xf5, 0x32, 0xd2, 0x08, 0x90, 0x7e,
141 0x37, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x02, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x09, 0x75, 0x32,
142 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x38, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0}},
143 {0x0706, 64, { 0xe5, 0x41, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x39, 0xe0, 0x60, 0x11, 0x43,
144 0x45, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
145 0x90, 0x7e, 0x3a, 0xe0, 0x60, 0x0f, 0x53, 0x3f, 0xfe, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x09,
146 0x75, 0x34, 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x3b, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x01, 0xe4}},
147 {0x0746, 64, { 0xff, 0xad, 0x3f, 0x12, 0x12, 0x09, 0xe4, 0xf5, 0x34, 0xd2, 0x08, 0x90, 0x7e, 0x3c, 0xe0, 0x60, 0x0e,
148 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0xe5, 0x41, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e,
149 0x3d, 0xe0, 0x60, 0x02, 0xd2, 0x0c, 0x90, 0x7e, 0x3e, 0xe0, 0x60, 0x08, 0x75, 0x35, 0x01, 0xe4,
150 0xf5, 0x39, 0xd2, 0x08, 0x90, 0x7e, 0x3f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x13}},
151 {0x0786, 64, { 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x16, 0xf0, 0x74, 0x36, 0xf0, 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xd1, 0xf0,
152 0x30, 0x1a, 0x52, 0xe5, 0x39, 0x60, 0x02, 0x15, 0x39, 0x30, 0x13, 0x49, 0xe5, 0x13, 0xd3, 0x94,
153 0x00, 0x40, 0x04, 0x15, 0x13, 0x80, 0x3e, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xc2, 0x13, 0x12,
154 0x13, 0x57, 0xef, 0x54, 0x01, 0xf5, 0x19, 0x65, 0x33, 0x60, 0x05, 0x85, 0x19, 0x33, 0xd2}},
155 {0x07c6, 64, { 0x08, 0x12, 0x13, 0x93, 0xef, 0x54, 0x80, 0xf5, 0x19, 0x65, 0x2f, 0x60, 0x05, 0x85, 0x19, 0x2f, 0xd2,
156 0x08, 0x30, 0x0e, 0x11, 0x12, 0x13, 0x93, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x2e, 0x60, 0x05,
157 0x85, 0x19, 0x2e, 0xd2, 0x08, 0x30, 0x1a, 0x2a, 0x90, 0x7f, 0xd2, 0xe0, 0x20, 0xe1, 0x23, 0x90,
158 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5, 0x15, 0x90, 0x7b, 0x42, 0xe0, 0xf5, 0x16, 0x90}},
159 {0x0806, 64, { 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0xe4, 0x90, 0x7f,
160 0xd3, 0xf0, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x09, 0x20, 0xe5, 0x0a, 0x70, 0x40,
161 0x30, 0x07, 0x39, 0xe5, 0x38, 0x70, 0x35, 0xc2, 0x07, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
162 0x24, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9a, 0xff, 0x74, 0x80, 0x25}},
163 {0x0846, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb,
164 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x38, 0x10, 0xe4, 0xf5, 0x2c, 0x75, 0x0a, 0x01, 0x22,
165 0xe5, 0x0a, 0x64, 0x01, 0x70, 0x40, 0x30, 0x08, 0x39, 0xe5, 0x39, 0x70, 0x35, 0xc2, 0x08, 0xf5,
166 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12}},
167 {0x0886, 64, { 0x0e, 0x9a, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05,
168 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x39, 0x10, 0xe4,
169 0xf5, 0x35, 0x75, 0x0a, 0x02, 0x22, 0xe5, 0x0a, 0x64, 0x02, 0x70, 0x36, 0x30, 0x14, 0x2f, 0xc2,
170 0x14, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x0e, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00}},
171 {0x08c6, 64, { 0xfa, 0x12, 0x0e, 0x9a, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef,
172 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x05, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x05, 0xf0, 0x75, 0x0a,
173 0x03, 0x22, 0xe5, 0x15, 0x60, 0x30, 0x15, 0x15, 0xe4, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74,
174 0x14, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9a, 0xff, 0x74, 0x80, 0x25}},
175 {0x0906, 64, { 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x03, 0xdb,
176 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x0a, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x0e,
177 0xf2, 0x0a, 0x08, 0x00, 0x0a, 0x7c, 0x01, 0x0a, 0xe8, 0x03, 0x09, 0x44, 0x06, 0x09, 0xfb, 0x08,
178 0x09, 0xf5, 0x09, 0x09, 0xdd, 0x0a, 0x09, 0xec, 0x0b, 0x00, 0x00, 0x0b, 0x37, 0x90, 0x7f}},
179 {0x0946, 64, { 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x14, 0x60, 0x61, 0x24, 0x02, 0x60, 0x03, 0x02, 0x09, 0xd3, 0x74,
180 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f,
181 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19,
182 0xef, 0xf0, 0x75, 0x82, 0x7b, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x74, 0x75, 0x83, 0x19}},
183 {0x0986, 64, { 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f,
184 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0,
185 0x74, 0x12, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0f,
186 0x18, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0}},
187 {0x09c6, 64, { 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0,
188 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0xe5, 0x09, 0xf0, 0x90, 0x7f, 0xb5, 0x74,
189 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x09, 0x02, 0x0b, 0x3e, 0x12, 0x0b,
190 0x46, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xf0, 0x02}},
191 {0x0a06, 64, { 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b,
192 0xa2, 0x10, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x16, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00,
193 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0xe4, 0x90, 0x7f,
194 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f}},
195 {0x0a46, 64, { 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24,
196 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4,
197 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
198 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02}},
199 {0x0a86, 64, { 0x60, 0x03, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x10, 0x02, 0x0b, 0x3e,
200 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38,
201 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f,
202 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f}},
203 {0x0ac6, 64, { 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f,
204 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80,
205 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea,
206 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x10, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0}},
207 {0x0b06, 64, { 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4,
208 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f,
209 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07,
210 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22}},
211 {0x0b46, 64, { 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90,
212 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x18,
213 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0xe4, 0xf5,
214 0x24, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x18, 0xf9, 0xe4, 0x34, 0x00, 0xfa}},
215 {0x0b86, 64, { 0xe4, 0x12, 0x0e, 0xe0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3a, 0x01, 0xe4, 0xf5, 0x38,
216 0xf5, 0x13, 0xf5, 0x36, 0xc2, 0x07, 0xc2, 0x0b, 0xc2, 0x05, 0xc2, 0x00, 0xc2, 0x09, 0xc2, 0x13,
217 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x75, 0x44, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f,
218 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xbf, 0x7f, 0x10, 0x8f, 0x42, 0x12, 0x10, 0x8f, 0x90, 0x7f}},
219 {0x0bc6, 64, { 0x98, 0x74, 0x12, 0xf0, 0x7f, 0x01, 0x8f, 0x40, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f,
220 0x98, 0x74, 0x14, 0xf0, 0x75, 0x46, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0x0f, 0xe4, 0xfd,
221 0x12, 0x11, 0xbf, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3e, 0x12, 0x11, 0xbf, 0x90, 0x7f,
222 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x11}},
223 {0x0c06, 64, { 0xbf, 0x7f, 0x01, 0x12, 0x12, 0x78, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xbf, 0x7f, 0x13, 0x7d, 0x01,
224 0x12, 0x11, 0xbf, 0x20, 0x1b, 0x03, 0x02, 0x0c, 0xc5, 0x75, 0x2d, 0x01, 0x75, 0x18, 0x01, 0x7b,
225 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xe4, 0x34, 0x00, 0xfa, 0xe4, 0x12, 0x0e, 0xe0, 0x05, 0x18,
226 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3b, 0x01, 0xe4, 0xf5, 0x39, 0xf5, 0x13, 0xf5, 0x37}},
227 {0x0c46, 64, { 0xc2, 0x08, 0xc2, 0x0c, 0xc2, 0x06, 0xc2, 0x00, 0xc2, 0x0a, 0xc2, 0x13, 0x90, 0x7f, 0x98, 0x74, 0x0b,
228 0xf0, 0x75, 0x45, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x12,
229 0x09, 0x7f, 0x10, 0x8f, 0x43, 0x12, 0x11, 0x01, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x7f, 0x01,
230 0x8f, 0x41, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0}},
231 {0x0c86, 64, { 0x75, 0x47, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x12, 0x09, 0xe4, 0xff,
232 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3f, 0x12, 0x12, 0x09, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90,
233 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x12, 0x09, 0x7f, 0x01, 0x12, 0x12, 0x99,
234 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x12, 0x09, 0x7f, 0x13, 0x7d, 0x01, 0x12, 0x12, 0x09, 0xd2}},
235 {0x0cc6, 64, { 0x12, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5,
236 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05,
237 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08, 0xe5, 0x0d,
238 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05}},
239 {0x0d06, 64, { 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08,
240 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90,
241 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22,
242 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5}},
243 {0x0d46, 64, { 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7,
244 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5,
245 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd2, 0x19, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02, 0xf0}},
247 {0x0d86, 64, { 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x10, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0, 0xd2, 0xe8, 0x43,
248 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74,
249 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf,
250 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0x1a}},
251 {0x0dc6, 64, { 0x12, 0x12, 0x53, 0xc2, 0x11, 0xe4, 0xf5, 0x0b, 0xf5, 0x13, 0xc2, 0x17, 0xc2, 0x12, 0x90, 0x7f, 0xa1,
252 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x17, 0x60, 0x10, 0x30, 0x12, 0x05, 0xd2, 0x1a, 0x12,
253 0x00, 0x46, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x17, 0x80, 0x08, 0x30, 0x12, 0x05, 0xc2, 0x1a, 0x12,
254 0x00, 0x46, 0x30, 0x11, 0x07, 0xc2, 0x11, 0x12, 0x09, 0x21, 0x80, 0xd6, 0x30, 0x18, 0xd3}},
255 {0x0e06, 64, { 0xc2, 0x18, 0x12, 0x13, 0x9f, 0x80, 0xcc, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x47,
256 0x02, 0x0e, 0x55, 0x02, 0x0d, 0x7d, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6,
257 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c,
258 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80}},
259 {0x0e46, 64, { 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x12,
260 0xba, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f,
261 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8,
262 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8}},
263 {0x0e86, 64, { 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde,
264 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22,
265 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5,
266 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25}},
267 {0x0ec6, 64, { 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5,
268 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83,
269 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8,
270 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01}},
271 {0x0f06, 64, { 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80,
272 0xdf, 0x8f, 0x18, 0xe4, 0xf5, 0x19, 0x75, 0x1a, 0xff, 0x75, 0x1b, 0x19, 0x75, 0x1c, 0x86, 0xab,
273 0x1a, 0xaa, 0x1b, 0xa9, 0x1c, 0x90, 0x00, 0x01, 0x12, 0x0e, 0xb3, 0xb4, 0x03, 0x1d, 0xaf, 0x19,
274 0x05, 0x19, 0xef, 0xb5, 0x18, 0x01, 0x22, 0x12, 0x0e, 0x9a, 0x7e, 0x00, 0x29, 0xff, 0xee}},
275 {0x0f46, 64, { 0x3a, 0xa9, 0x07, 0x75, 0x1a, 0xff, 0xf5, 0x1b, 0x89, 0x1c, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79,
276 0x00, 0x22, 0x8f, 0x1a, 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5,
277 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12, 0x00, 0x36, 0x05, 0x0d, 0xe5, 0x0d, 0xac, 0x0c, 0x70,
278 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08, 0x60}},
279 {0x0f86, 64, { 0x0a, 0x12, 0x13, 0x33, 0x8f, 0x1a, 0xef, 0x42, 0x36, 0x80, 0xca, 0x22, 0x8f, 0x1a, 0x05, 0x0d, 0xe5,
280 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12,
281 0x13, 0x4b, 0x05, 0x0d, 0xe5, 0x0d, 0xac, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8c,
282 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08, 0x60, 0x0a, 0x12, 0x13, 0x87, 0x8f, 0x1a, 0xef}},
283 {0x0fc6, 64, { 0x42, 0x37, 0x80, 0xca, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86,
284 0x75, 0x86, 0x00, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04,
285 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0,
286 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x11}},
287 {0x1006, 64, { 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82,
288 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0,
289 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0,
290 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0x98}},
291 {0x1046, 64, { 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0,
292 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00,
293 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f,
294 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0}},
295 {0x1086, 64, { 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0,
296 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90,
297 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f,
298 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x14}},
299 {0x10c6, 64, { 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90,
300 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
301 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13,
302 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b}},
303 {0x1106, 64, { 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90, 0xc0, 0x00, 0xef,
304 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22,
305 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74,
306 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45}},
307 {0x1146, 64, { 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74,
308 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98,
309 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74,
310 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90}},
311 {0x1186, 64, { 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00,
312 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f,
313 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5,
314 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5}},
315 {0x11c6, 64, { 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90, 0xc0, 0x00, 0xef,
316 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13, 0x1b,
317 0x8f, 0x1a, 0x12, 0x13, 0x1b, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12, 0x13, 0x1b,
318 0x8f, 0x1a, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x1b, 0x8f, 0x1b, 0x80, 0xe8}},
319 {0x1206, 64, { 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
320 0x90, 0x7f, 0x98, 0x74, 0x0f, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0d,
321 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13, 0x6f, 0x8f, 0x1a, 0x12, 0x13, 0x6f, 0x8f,
322 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12, 0x13, 0x6f, 0x8f, 0x1a, 0xe5, 0x1a, 0x65}},
323 {0x1246, 64, { 0x1b, 0x60, 0x07, 0x12, 0x13, 0x6f, 0x8f, 0x1b, 0x80, 0xe8, 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0xd6, 0xe0,
324 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x1a, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4,
325 0x7e, 0x01, 0x12, 0x12, 0xd6, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x04, 0xf0,
326 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3e, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xbf, 0x90, 0x7f}},
327 {0x1286, 64, { 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3e, 0x44, 0x80, 0xfd, 0x12, 0x11,
328 0xbf, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3f, 0x54, 0x7f, 0xfd, 0x12, 0x12, 0x09, 0x90, 0x7f,
329 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3f, 0x44, 0x80, 0xfd, 0x12,
330 0x12, 0x09, 0x22, 0x05, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x03, 0x00, 0x00}},
331 {0x12c6, 64, { 0xc1, 0x11, 0xc1, 0x18, 0xc1, 0x95, 0xc1, 0x10, 0xc1, 0x16, 0x01, 0x0a, 0x00, 0xc1, 0x9b, 0x00, 0x8e,
332 0x18, 0x8f, 0x19, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e, 0x60, 0x05,
333 0x12, 0x0d, 0x5c, 0x80, 0xee, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe0,
334 0xff, 0x22, 0x53, 0xd8, 0xef, 0x32, 0x00, 0x00, 0x00, 0x02, 0x0f, 0xf5, 0x00, 0x02, 0x13}},
335 {0x1306, 64, { 0x04, 0x00, 0x02, 0x0f, 0xcb, 0x00, 0x02, 0x10, 0x1c, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0,
336 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
337 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
338 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90}},
339 {0x1346, 64, { 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
340 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
341 0x0a, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0,
342 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff}},
343 {0x1386, 64, { 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
344 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x12, 0x00, 0x03, 0x12, 0x0d, 0x6d, 0x12, 0x0b,
345 0x46, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
347 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
351 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
355 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
359 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
363 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
367 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
371 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
375 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
379 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
383 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
387 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
391 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
395 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
399 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
403 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
407 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
411 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
415 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
419 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
423 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
427 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
431 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x15, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
432 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
433 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
434 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
435 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
436 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
437 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
438 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
439 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
440 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
441 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
442 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
443 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
444 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
445 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
446 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
447 {0x1a06, 4, { 0x72, 0x00, 0x00, 0x00}},
448 {0xffff, 0, {0x00}}
449};
diff --git a/drivers/usb/serial/keyspan_usa28xb_fw.h b/drivers/usb/serial/keyspan_usa28xb_fw.h
new file mode 100644
index 000000000000..f5fcad44da3a
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa28xb_fw.h
@@ -0,0 +1,448 @@
1/* keyspan_usa28xb_fw.h
2
3 The firmware contained herein as keyspan_usa29xb_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa28xb_firmware[] = {
26 {0x0033, 3, { 0x02, 0x00, 0x2d}},
27 {0x002d, 4, { 0x53, 0xd8, 0xef, 0x32}},
28 {0x0046, 16, { 0x30, 0x09, 0x18, 0x12, 0x13, 0x33, 0xef, 0xc3, 0x95, 0x3c, 0x40, 0x03, 0x02, 0x00, 0xd8, 0x90}},
29 {0x0056, 16, { 0x7f, 0xbf, 0x74, 0x01, 0xf0, 0xc2, 0x09, 0xc2, 0x00, 0x80, 0x77, 0x30, 0x03, 0x3b, 0x90, 0x7f}},
30 {0x0066, 16, { 0xc6, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x33, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7e}},
31 {0x0076, 16, { 0x40, 0xe0, 0x13, 0x92, 0x09, 0x90, 0x7f, 0xc7, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60}},
32 {0x0086, 16, { 0x0f, 0xf5, 0x08, 0x7e, 0x7e, 0x7f, 0x41, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x41, 0x12, 0x0c, 0xcc}},
33 {0x0096, 16, { 0xc2, 0x03, 0xe4, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x39, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x32}},
34 {0x00a6, 16, { 0x12, 0x13, 0x33, 0xef, 0xc3, 0x94, 0x40, 0x50, 0x29, 0x90, 0x7d, 0xc0, 0xe0, 0x13, 0x92, 0x09}},
35 {0x00b6, 16, { 0x90, 0x7f, 0xc9, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d}},
36 {0x00c6, 16, { 0x7f, 0xc1, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0xc1, 0x12, 0x0c, 0xcc, 0xd2, 0x03, 0xe4, 0x90, 0x7f}},
37 {0x00d6, 16, { 0xc9, 0xf0, 0x90, 0x7f, 0xb6, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x01, 0x60, 0x12, 0x11, 0xf5, 0x8f}},
38 {0x00e6, 16, { 0x19, 0x12, 0x13, 0x3f, 0x8f, 0x36, 0xe5, 0x19, 0xc3, 0x95, 0x3a, 0x50, 0x0f, 0x12, 0x13, 0x1b}},
39 {0x00f6, 16, { 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x36, 0x20, 0xe7, 0x03, 0x30, 0x0b, 0x5e, 0xc2, 0x0b, 0xe5, 0x19}},
40 {0x0036, 12, { 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
41 {0x0043, 3, { 0x02, 0x13, 0x00}},
42 {0x0003, 16, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90}},
43 {0x0013, 16, { 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0}},
44 {0x0023, 10, { 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32}},
45 {0x0000, 3, { 0x02, 0x0e, 0x12}},
46 {0x0106, 64, { 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x36, 0x02, 0xe5, 0x36, 0x30, 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94,
47 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x08, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x0c, 0x7e,
48 0x75, 0x0d, 0x80, 0xaf, 0x36, 0x12, 0x0f, 0x5d, 0xe5, 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xb7, 0xf0,
49 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x19, 0x3f, 0x85, 0x19, 0x08}},
50 {0x0146, 64, { 0x90, 0x7e, 0x80, 0xe5, 0x36, 0xf0, 0x7e, 0x7e, 0x7f, 0x81, 0x75, 0x0c, 0x7e, 0x75, 0x0d, 0x81, 0x12,
51 0x0c, 0xf1, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xb7, 0xf0, 0x90, 0x7f, 0xce, 0xe0, 0x30, 0xe1, 0x06,
52 0x20, 0x05, 0x03, 0x02, 0x03, 0xc1, 0xe4, 0xf5, 0x18, 0x74, 0x40, 0x25, 0x18, 0xf5, 0x82, 0xe4,
53 0x34, 0x7c, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79}},
54 {0x0186, 64, { 0x00, 0x24, 0x00, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef, 0x12, 0x0e, 0xe4, 0x05, 0x18, 0xe5, 0x18, 0xb4,
55 0x20, 0xd7, 0x90, 0x7e, 0x00, 0xe0, 0x60, 0x68, 0x90, 0x7e, 0x03, 0xe0, 0x60, 0x24, 0x7f, 0x01,
56 0xe4, 0xfd, 0x12, 0x11, 0xd0, 0x7f, 0x03, 0x7d, 0xcd, 0x12, 0x11, 0xd0, 0x43, 0x46, 0x80, 0x90,
57 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0xe4, 0x90, 0x7e, 0x13}},
58 {0x01c6, 64, { 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x01, 0xe0, 0xff, 0x12, 0x10, 0x54, 0x90, 0x7e, 0x02, 0xe0, 0xff, 0x12,
59 0x10, 0x7a, 0x7f, 0x01, 0x90, 0x7e, 0x11, 0xe0, 0xfd, 0x12, 0x11, 0xd0, 0x7f, 0x03, 0x7d, 0x07,
60 0x12, 0x11, 0xd0, 0x43, 0x46, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5,
61 0x46, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x06, 0x90, 0xc0, 0x00}},
62 {0x0206, 64, { 0xf0, 0x90, 0x7e, 0x03, 0xe0, 0x70, 0x06, 0x90, 0x7e, 0x13, 0xe0, 0x70, 0x08, 0xe4, 0x90, 0x7e, 0x13,
63 0xf0, 0x75, 0x25, 0xff, 0x90, 0x7e, 0x05, 0xe0, 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x44,
64 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x44, 0xf0, 0x90, 0x7e, 0x07, 0xe0,
65 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x42, 0x80, 0x80, 0x03, 0x53, 0x42, 0x7f, 0x53}},
66 {0x0246, 64, { 0x42, 0xfc, 0x90, 0x7e, 0x09, 0xe0, 0x60, 0x11, 0x43, 0x42, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x10, 0xc6,
67 0x90, 0x7e, 0x0b, 0xe0, 0xff, 0x12, 0x10, 0xec, 0xaf, 0x42, 0x12, 0x10, 0xa0, 0x90, 0x7e, 0x03,
68 0xe0, 0x60, 0x08, 0x53, 0x42, 0x7f, 0xaf, 0x42, 0x12, 0x10, 0xa0, 0x90, 0x7e, 0x0c, 0xe0, 0x60,
69 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x02, 0x80, 0x03, 0x53, 0x46, 0xfd, 0x90, 0x7f}},
70 {0x0286, 64, { 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x0e, 0xe0, 0x60, 0x18, 0xa3,
71 0xe0, 0x60, 0x05, 0x43, 0x46, 0x01, 0x80, 0x03, 0x53, 0x46, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x14,
72 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e, 0x12, 0xe0, 0xf5, 0x3a, 0xa3, 0xe0, 0x13,
73 0x92, 0x0d, 0xa3, 0xe0, 0xf5, 0x3c, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x46, 0x10, 0x80, 0x03}},
74 {0x02c6, 64, { 0x53, 0x46, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x46, 0xf0, 0x90, 0x7e,
75 0x16, 0xe0, 0x60, 0x32, 0x53, 0x44, 0xbf, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54,
76 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x12, 0x13, 0x0f, 0xef, 0x54,
77 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3e, 0xfd, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xd0}},
78 {0x0306, 64, { 0xe4, 0xf5, 0x2a, 0xf5, 0x29, 0xd2, 0x07, 0x90, 0x7e, 0x17, 0xe0, 0x60, 0x0f, 0x43, 0x3e, 0x02, 0xe4,
79 0xff, 0xad, 0x3e, 0x12, 0x11, 0xd0, 0x75, 0x29, 0x01, 0xd2, 0x07, 0x90, 0x7e, 0x18, 0xe0, 0x60,
80 0x10, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5, 0x40, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2,
81 0x00, 0x90, 0x7e, 0x19, 0xe0, 0x60, 0x11, 0x43, 0x44, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x13}},
82 {0x0346, 64, { 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1a, 0xe0, 0x60, 0x0f, 0x53, 0x3e,
83 0xfe, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xd0, 0x75, 0x2b, 0x01, 0xd2, 0x07, 0x90, 0x7e, 0x1b,
84 0xe0, 0x60, 0x0f, 0x43, 0x3e, 0x01, 0xe4, 0xff, 0xad, 0x3e, 0x12, 0x11, 0xd0, 0xe4, 0xf5, 0x2b,
85 0xd2, 0x07, 0x90, 0x7e, 0x1c, 0xe0, 0x60, 0x0e, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0xe5}},
86 {0x0386, 64, { 0x40, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x1d, 0xe0, 0x60, 0x02, 0xd2, 0x0b, 0x90, 0x7e,
87 0x1e, 0xe0, 0x60, 0x08, 0x75, 0x2c, 0x01, 0xe4, 0xf5, 0x38, 0xd2, 0x07, 0x90, 0x7e, 0x1f, 0xe0,
88 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x11, 0xf0, 0x74, 0x31, 0xf0, 0x74, 0x15, 0xf0, 0x74, 0x35,
89 0xf0, 0xd2, 0x03, 0xc2, 0x05, 0xe4, 0x90, 0x7f, 0xcf, 0xf0, 0x30, 0x1a, 0x54, 0xe5, 0x38}},
90 {0x03c6, 64, { 0x60, 0x02, 0x15, 0x38, 0x20, 0x13, 0x4b, 0xe5, 0x13, 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x13, 0x80,
91 0x40, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xd2, 0x13, 0x12, 0x13, 0x0f, 0xef, 0x54, 0x01, 0xf5,
92 0x19, 0x65, 0x2a, 0x60, 0x05, 0x85, 0x19, 0x2a, 0xd2, 0x07, 0x12, 0x13, 0x4b, 0xef, 0x54, 0x80,
93 0x64, 0x80, 0xf5, 0x19, 0x65, 0x26, 0x60, 0x05, 0x85, 0x19, 0x26, 0xd2, 0x07, 0x30, 0x0d}},
94 {0x0406, 64, { 0x11, 0x12, 0x13, 0x4b, 0xef, 0x54, 0x10, 0xf5, 0x19, 0x65, 0x25, 0x60, 0x05, 0x85, 0x19, 0x25, 0xd2,
95 0x07, 0x20, 0x1b, 0x03, 0x02, 0x07, 0xf0, 0x30, 0x0a, 0x18, 0x12, 0x13, 0x87, 0xef, 0xc3, 0x95,
96 0x3d, 0x40, 0x03, 0x02, 0x04, 0xb0, 0x90, 0x7f, 0xc1, 0x74, 0x01, 0xf0, 0xc2, 0x0a, 0xc2, 0x00,
97 0x80, 0x77, 0x30, 0x04, 0x3b, 0x90, 0x7f, 0xca, 0xe0, 0x20, 0xe1, 0x6d, 0x12, 0x13, 0x87}},
98 {0x0446, 64, { 0xef, 0xc3, 0x94, 0x40, 0x50, 0x64, 0x90, 0x7d, 0x40, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcb, 0xe0,
99 0x14, 0xf5, 0x19, 0x20, 0x00, 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7d, 0x7f, 0x41, 0x75, 0x0c,
100 0x7d, 0x75, 0x0d, 0x41, 0x12, 0x0d, 0x16, 0xc2, 0x04, 0xe4, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x39,
101 0x90, 0x7f, 0xcc, 0xe0, 0x20, 0xe1, 0x32, 0x12, 0x13, 0x87, 0xef, 0xc3, 0x94, 0x40, 0x50}},
102 {0x0486, 64, { 0x29, 0x90, 0x7c, 0xc0, 0xe0, 0x13, 0x92, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0x14, 0xf5, 0x19, 0x20, 0x00,
103 0x11, 0x60, 0x0f, 0xf5, 0x08, 0x7e, 0x7c, 0x7f, 0xc1, 0x75, 0x0c, 0x7c, 0x75, 0x0d, 0xc1, 0x12,
104 0x0d, 0x16, 0xd2, 0x04, 0xe4, 0x90, 0x7f, 0xcd, 0xf0, 0x90, 0x7f, 0xba, 0xe0, 0x30, 0xe1, 0x03,
105 0x02, 0x05, 0x38, 0x12, 0x12, 0x3f, 0x8f, 0x19, 0x12, 0x13, 0x93, 0x8f, 0x37, 0xe5, 0x19}},
106 {0x04c6, 64, { 0xc3, 0x95, 0x3b, 0x50, 0x0f, 0x12, 0x13, 0x6f, 0xef, 0x30, 0xe0, 0x08, 0xe5, 0x37, 0x20, 0xe7, 0x03,
107 0x30, 0x0c, 0x5e, 0xc2, 0x0c, 0xe5, 0x19, 0x60, 0x58, 0xb4, 0x80, 0x03, 0x43, 0x37, 0x02, 0xe5,
108 0x37, 0x30, 0xe7, 0x26, 0xe5, 0x19, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19,
109 0x08, 0x7e, 0x7d, 0x7f, 0x80, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0x80, 0xaf, 0x37, 0x12, 0x0f}},
110 {0x0506, 64, { 0x96, 0xe5, 0x19, 0x25, 0xe0, 0x90, 0x7f, 0xbb, 0xf0, 0x80, 0x27, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40,
111 0x03, 0x75, 0x19, 0x3f, 0x85, 0x19, 0x08, 0x90, 0x7d, 0x80, 0xe5, 0x37, 0xf0, 0x7e, 0x7d, 0x7f,
112 0x81, 0x75, 0x0c, 0x7d, 0x75, 0x0d, 0x81, 0x12, 0x0d, 0x3b, 0xe5, 0x19, 0x04, 0x90, 0x7f, 0xbb,
113 0xf0, 0x90, 0x7f, 0xd0, 0xe0, 0x30, 0xe1, 0x06, 0x20, 0x06, 0x03, 0x02, 0x07, 0x99, 0xe4}},
114 {0x0546, 64, { 0xf5, 0x18, 0x74, 0xc0, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18,
115 0x7c, 0x00, 0x7b, 0x01, 0x7a, 0x7e, 0x79, 0x20, 0x24, 0x20, 0xf9, 0xec, 0x34, 0x7e, 0xfa, 0xef,
116 0x12, 0x0e, 0xe4, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x20, 0xd7, 0x90, 0x7e, 0x20, 0xe0, 0x60, 0x68,
117 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x24, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x12, 0x1a, 0x7f, 0x03}},
118 {0x0586, 64, { 0x7d, 0xcd, 0x12, 0x12, 0x1a, 0x43, 0x47, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00,
119 0xe5, 0x47, 0xf0, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x80, 0x30, 0x90, 0x7e, 0x21, 0xe0, 0xff, 0x12,
120 0x11, 0x38, 0x90, 0x7e, 0x22, 0xe0, 0xff, 0x12, 0x11, 0x5e, 0x7f, 0x01, 0x90, 0x7e, 0x31, 0xe0,
121 0xfd, 0x12, 0x12, 0x1a, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x12, 0x1a, 0x43, 0x47, 0x80, 0x90}},
122 {0x05c6, 64, { 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0,
123 0xe5, 0x41, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e, 0x23, 0xe0, 0x70, 0x06, 0x90, 0x7e,
124 0x33, 0xe0, 0x70, 0x08, 0xe4, 0x90, 0x7e, 0x33, 0xf0, 0x75, 0x2e, 0xff, 0x90, 0x7e, 0x25, 0xe0,
125 0x60, 0x12, 0xa3, 0xe0, 0x54, 0x3f, 0xf5, 0x45, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90}},
126 {0x0606, 64, { 0xc0, 0x00, 0xe5, 0x45, 0xf0, 0x90, 0x7e, 0x27, 0xe0, 0x60, 0x2b, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x43,
127 0x80, 0x80, 0x03, 0x53, 0x43, 0x7f, 0x53, 0x43, 0xfc, 0x90, 0x7e, 0x29, 0xe0, 0x60, 0x11, 0x43,
128 0x43, 0x02, 0xa3, 0xe0, 0xff, 0x12, 0x11, 0x84, 0x90, 0x7e, 0x2b, 0xe0, 0xff, 0x12, 0x11, 0xaa,
129 0xaf, 0x43, 0x12, 0x11, 0x12, 0x90, 0x7e, 0x23, 0xe0, 0x60, 0x08, 0x53, 0x43, 0x7f, 0xaf}},
130 {0x0646, 64, { 0x43, 0x12, 0x11, 0x12, 0x90, 0x7e, 0x2c, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x02,
131 0x80, 0x03, 0x53, 0x47, 0xfd, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47,
132 0xf0, 0x90, 0x7e, 0x2e, 0xe0, 0x60, 0x18, 0xa3, 0xe0, 0x60, 0x05, 0x43, 0x47, 0x01, 0x80, 0x03,
133 0x53, 0x47, 0xfe, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0}},
134 {0x0686, 64, { 0x90, 0x7e, 0x32, 0xe0, 0xf5, 0x3b, 0xa3, 0xe0, 0x13, 0x92, 0x0e, 0xa3, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0,
135 0x60, 0x05, 0x43, 0x47, 0x10, 0x80, 0x03, 0x53, 0x47, 0xef, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0,
136 0x90, 0xc0, 0x00, 0xe5, 0x47, 0xf0, 0x90, 0x7e, 0x36, 0xe0, 0x60, 0x32, 0x53, 0x45, 0xbf, 0x90,
137 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f}},
138 {0x06c6, 64, { 0x98, 0x74, 0x09, 0xf0, 0x12, 0x13, 0x63, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0x53, 0x3f, 0xfd,
139 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x1a, 0xe4, 0xf5, 0x33, 0xf5, 0x32, 0xd2, 0x08, 0x90, 0x7e,
140 0x37, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x02, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x1a, 0x75, 0x32,
141 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x38, 0xe0, 0x60, 0x10, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0}},
142 {0x0706, 64, { 0xe5, 0x41, 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xd2, 0x00, 0x90, 0x7e, 0x39, 0xe0, 0x60, 0x11, 0x43,
143 0x45, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
144 0x90, 0x7e, 0x3a, 0xe0, 0x60, 0x0f, 0x53, 0x3f, 0xfe, 0xe4, 0xff, 0xad, 0x3f, 0x12, 0x12, 0x1a,
145 0x75, 0x34, 0x01, 0xd2, 0x08, 0x90, 0x7e, 0x3b, 0xe0, 0x60, 0x0f, 0x43, 0x3f, 0x01, 0xe4}},
146 {0x0746, 64, { 0xff, 0xad, 0x3f, 0x12, 0x12, 0x1a, 0xe4, 0xf5, 0x34, 0xd2, 0x08, 0x90, 0x7e, 0x3c, 0xe0, 0x60, 0x0e,
147 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0xe5, 0x41, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7e,
148 0x3d, 0xe0, 0x60, 0x02, 0xd2, 0x0c, 0x90, 0x7e, 0x3e, 0xe0, 0x60, 0x08, 0x75, 0x35, 0x01, 0xe4,
149 0xf5, 0x39, 0xd2, 0x08, 0x90, 0x7e, 0x3f, 0xe0, 0x60, 0x11, 0x90, 0x7f, 0xd7, 0x74, 0x13}},
150 {0x0786, 64, { 0xf0, 0x74, 0x33, 0xf0, 0x74, 0x16, 0xf0, 0x74, 0x36, 0xf0, 0xd2, 0x04, 0xc2, 0x06, 0xe4, 0x90, 0x7f,
151 0xd1, 0xf0, 0x30, 0x1a, 0x54, 0xe5, 0x39, 0x60, 0x02, 0x15, 0x39, 0x30, 0x13, 0x4b, 0xe5, 0x13,
152 0xd3, 0x94, 0x00, 0x40, 0x04, 0x15, 0x13, 0x80, 0x40, 0x75, 0x13, 0x0a, 0x30, 0x1b, 0x02, 0xc2,
153 0x13, 0x12, 0x13, 0x63, 0xef, 0x54, 0x01, 0xf5, 0x19, 0x65, 0x33, 0x60, 0x05, 0x85, 0x19}},
154 {0x07c6, 64, { 0x33, 0xd2, 0x08, 0x12, 0x13, 0x9f, 0xef, 0x54, 0x80, 0x64, 0x80, 0xf5, 0x19, 0x65, 0x2f, 0x60, 0x05,
155 0x85, 0x19, 0x2f, 0xd2, 0x08, 0x30, 0x0e, 0x11, 0x12, 0x13, 0x9f, 0xef, 0x54, 0x10, 0xf5, 0x19,
156 0x65, 0x2e, 0x60, 0x05, 0x85, 0x19, 0x2e, 0xd2, 0x08, 0x30, 0x1a, 0x2a, 0x90, 0x7f, 0xd2, 0xe0,
157 0x20, 0xe1, 0x23, 0x90, 0x7b, 0x40, 0xe0, 0x60, 0x09, 0xe0, 0xf5, 0x15, 0x90, 0x7b, 0x42}},
158 {0x0806, 64, { 0xe0, 0xf5, 0x16, 0x90, 0x7b, 0x41, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37,
159 0xf0, 0xe4, 0x90, 0x7f, 0xd3, 0xf0, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x09, 0x24,
160 0xe5, 0x0a, 0x70, 0x40, 0x30, 0x07, 0x39, 0xe5, 0x38, 0x70, 0x35, 0xc2, 0x07, 0xf5, 0x18, 0x7e,
161 0x00, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9e}},
162 {0x0846, 64, { 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5,
163 0x18, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0, 0x75, 0x38, 0x10, 0xe4, 0xf5, 0x2c,
164 0x75, 0x0a, 0x01, 0x22, 0xe5, 0x0a, 0x64, 0x01, 0x70, 0x40, 0x30, 0x08, 0x39, 0xe5, 0x39, 0x70,
165 0x35, 0xc2, 0x08, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xee}},
166 {0x0886, 64, { 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9e, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5,
167 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x09, 0xf0,
168 0x75, 0x39, 0x10, 0xe4, 0xf5, 0x35, 0x75, 0x0a, 0x02, 0x22, 0xe5, 0x0a, 0x64, 0x02, 0x70, 0x36,
169 0x30, 0x14, 0x2f, 0xc2, 0x14, 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x0e, 0x25, 0x18}},
170 {0x08c6, 64, { 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9e, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34,
171 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x05, 0xdb, 0x90, 0x7f, 0xc3, 0x74,
172 0x05, 0xf0, 0x75, 0x0a, 0x03, 0x22, 0xe5, 0x15, 0x60, 0x30, 0x15, 0x15, 0xe4, 0xf5, 0x18, 0x7e,
173 0x00, 0x7b, 0x00, 0x74, 0x14, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x0e, 0x9e}},
174 {0x0906, 64, { 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5,
175 0x18, 0xb4, 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x0a, 0x22, 0x90, 0x7f,
176 0xe9, 0xe0, 0x12, 0x0e, 0xf6, 0x0a, 0x0c, 0x00, 0x0a, 0x80, 0x01, 0x0a, 0xec, 0x03, 0x09, 0x48,
177 0x06, 0x09, 0xff, 0x08, 0x09, 0xf9, 0x09, 0x09, 0xe1, 0x0a, 0x09, 0xf0, 0x0b, 0x00, 0x00}},
178 {0x0946, 64, { 0x0b, 0x3b, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x19, 0x14, 0x60, 0x61, 0x24, 0x02, 0x60, 0x03,
179 0x02, 0x09, 0xd7, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02,
180 0x0b, 0x42, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82,
181 0x82, 0x75, 0x83, 0x19, 0xef, 0xf0, 0x75, 0x82, 0x7b, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82}},
182 {0x0986, 64, { 0x74, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83,
183 0x19, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x74, 0x19,
184 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x12, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xea,
185 0xe0, 0xff, 0x12, 0x0f, 0x1c, 0xea, 0x49, 0x60, 0x0d, 0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9}},
186 {0x09c6, 64, { 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x42,
187 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0x00, 0xe5, 0x09, 0xf0,
188 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x09, 0x02,
189 0x0b, 0x42, 0x12, 0x0b, 0x4a, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0x00, 0x74, 0x01, 0xf0, 0x90}},
190 {0x0a06, 64, { 0x7f, 0xb5, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31,
191 0x24, 0x02, 0x70, 0x5b, 0xa2, 0x10, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x16, 0xe4, 0x33,
192 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b,
193 0x42, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02}},
194 {0x0a46, 64, { 0x0b, 0x42, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07,
195 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90,
196 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x0b, 0x42, 0x90,
197 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe}},
198 {0x0a86, 64, { 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2,
199 0x10, 0x02, 0x0b, 0x42, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x0b, 0x42, 0x90, 0x7f,
200 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff,
201 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83}},
202 {0x0ac6, 64, { 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54,
203 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0,
204 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70,
205 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x10, 0x80, 0x3f, 0x90, 0x7f, 0xb4}},
206 {0x0b06, 64, { 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4,
207 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5,
208 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
209 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0}},
210 {0x0b46, 64, { 0x44, 0x02, 0xf0, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0x30, 0xf0, 0xe4, 0x90,
211 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90,
212 0x7f, 0x98, 0x74, 0x18, 0xf0, 0xe4, 0xf5, 0x8e, 0x90, 0x7f, 0xdf, 0x74, 0xff, 0xf0, 0x90, 0x7f,
213 0xde, 0xf0, 0xe4, 0xf5, 0x24, 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x24, 0x25, 0x18, 0xf9}},
214 {0x0b86, 64, { 0xe4, 0x34, 0x00, 0xfa, 0xe4, 0x12, 0x0e, 0xe4, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3a,
215 0x01, 0xe4, 0xf5, 0x38, 0xf5, 0x13, 0xf5, 0x36, 0xc2, 0x07, 0xc2, 0x0b, 0xc2, 0x05, 0xc2, 0x00,
216 0xc2, 0x09, 0xc2, 0x13, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x75, 0x44, 0x03, 0x90, 0xc0, 0x00,
217 0x74, 0x03, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x11, 0xd0, 0x7f, 0x10, 0x8f, 0x42, 0x12}},
218 {0x0bc6, 64, { 0x10, 0xa0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x7f, 0x01, 0x8f, 0x40, 0xef, 0x44, 0x06, 0x90, 0xc0,
219 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x14, 0xf0, 0x75, 0x46, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80,
220 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x11, 0xd0, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3e, 0x12,
221 0x11, 0xd0, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05}},
222 {0x0c06, 64, { 0x7d, 0x7f, 0x12, 0x11, 0xd0, 0x7f, 0x01, 0x12, 0x12, 0x89, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x11, 0xd0,
223 0x7f, 0x13, 0x7d, 0x09, 0x12, 0x11, 0xd0, 0x20, 0x1b, 0x03, 0x02, 0x0c, 0xc9, 0x75, 0x2d, 0x01,
224 0x75, 0x18, 0x01, 0x7b, 0x00, 0x74, 0x2d, 0x25, 0x18, 0xf9, 0xe4, 0x34, 0x00, 0xfa, 0xe4, 0x12,
225 0x0e, 0xe4, 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x09, 0xea, 0x75, 0x3b, 0x01, 0xe4, 0xf5, 0x39}},
226 {0x0c46, 64, { 0xf5, 0x13, 0xf5, 0x37, 0xc2, 0x08, 0xc2, 0x0c, 0xc2, 0x06, 0xc2, 0x00, 0xc2, 0x0a, 0xc2, 0x13, 0x90,
227 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x75, 0x45, 0x03, 0x90, 0xc0, 0x00, 0x74, 0x03, 0xf0, 0x7f, 0x0c,
228 0xe4, 0xfd, 0x12, 0x12, 0x1a, 0x7f, 0x10, 0x8f, 0x43, 0x12, 0x11, 0x12, 0x90, 0x7f, 0x98, 0x74,
229 0x0a, 0xf0, 0x7f, 0x01, 0x8f, 0x41, 0xef, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f}},
230 {0x0c86, 64, { 0x98, 0x74, 0x0c, 0xf0, 0x75, 0x47, 0x80, 0x90, 0xc0, 0x00, 0x74, 0x80, 0xf0, 0x0f, 0xe4, 0xfd, 0x12,
231 0x12, 0x1a, 0xe4, 0xff, 0x7e, 0xa3, 0xad, 0x06, 0x8d, 0x3f, 0x12, 0x12, 0x1a, 0x90, 0x7f, 0x98,
232 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x12, 0x1a, 0x7f,
233 0x01, 0x12, 0x12, 0xaa, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x12, 0x1a, 0x7f, 0x13, 0x7d, 0x09}},
234 {0x0cc6, 64, { 0x12, 0x12, 0x1a, 0xd2, 0x12, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5,
235 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3,
236 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf, 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0,
237 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90}},
238 {0x0d06, 64, { 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x90,
239 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5, 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2,
240 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x05, 0x86, 0xdf,
241 0xf7, 0xd2, 0xaf, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0xaf, 0x08, 0xe5, 0x0d, 0xf5}},
242 {0x0d46, 64, { 0x82, 0xe5, 0x0c, 0xf5, 0x83, 0xc2, 0xaf, 0x05, 0x86, 0x90, 0xc0, 0x00, 0xe0, 0x05, 0x86, 0xf0, 0xa3,
243 0x05, 0x86, 0xdf, 0xf7, 0x05, 0x86, 0xd2, 0xaf, 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5,
244 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80,
245 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd2, 0x19, 0x90, 0x7f, 0x92}},
246 {0x0d86, 64, { 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x10, 0xe4, 0x33, 0xfe, 0xef, 0x4e,
247 0xf0, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0,
248 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91,
249 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44, 0x0d, 0xf0}},
250 {0x0dc6, 64, { 0xd2, 0xaf, 0xd2, 0x1a, 0x12, 0x12, 0x64, 0xc2, 0x11, 0xe4, 0xf5, 0x0b, 0xf5, 0x13, 0xc2, 0x17, 0xc2,
251 0x12, 0x90, 0x7f, 0xa1, 0x04, 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x17, 0x60, 0x10, 0x30, 0x12,
252 0x05, 0xd2, 0x1a, 0x12, 0x00, 0x46, 0x90, 0x7f, 0xd8, 0xe0, 0xf5, 0x17, 0x80, 0x08, 0x30, 0x12,
253 0x05, 0xc2, 0x1a, 0x12, 0x00, 0x46, 0x30, 0x11, 0x07, 0xc2, 0x11, 0x12, 0x09, 0x25, 0x80}},
254 {0x0e06, 64, { 0xd6, 0x30, 0x18, 0xd3, 0xc2, 0x18, 0x12, 0x13, 0xab, 0x80, 0xcc, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8,
255 0xfd, 0x75, 0x81, 0x47, 0x02, 0x0e, 0x59, 0x02, 0x0d, 0x81, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93,
256 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8,
257 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40}},
258 {0x0e46, 64, { 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
259 0x40, 0x80, 0x90, 0x12, 0xcb, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30,
260 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0,
261 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3}},
262 {0x0e86, 64, { 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83,
263 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22,
264 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22,
265 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22}},
266 {0x0ec6, 64, { 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22,
267 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06,
268 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0,
269 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3}},
270 {0x0f06, 64, { 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef,
271 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x8f, 0x18, 0xe4, 0xf5, 0x19, 0x75, 0x1a, 0xff, 0x75, 0x1b, 0x19,
272 0x75, 0x1c, 0x86, 0xab, 0x1a, 0xaa, 0x1b, 0xa9, 0x1c, 0x90, 0x00, 0x01, 0x12, 0x0e, 0xb7, 0xb4,
273 0x03, 0x1d, 0xaf, 0x19, 0x05, 0x19, 0xef, 0xb5, 0x18, 0x01, 0x22, 0x12, 0x0e, 0x9e, 0x7e}},
274 {0x0f46, 64, { 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x1a, 0xff, 0xf5, 0x1b, 0x89, 0x1c, 0x80, 0xd4, 0x7b,
275 0x00, 0x7a, 0x00, 0x79, 0x00, 0x22, 0x8f, 0x1a, 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02,
276 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12, 0x00, 0x36, 0x05, 0x0d, 0xe5,
277 0x0d, 0xac, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15}},
278 {0x0f86, 64, { 0x08, 0xe5, 0x08, 0x60, 0x0a, 0x12, 0x13, 0x3f, 0x8f, 0x1a, 0xef, 0x42, 0x36, 0x80, 0xca, 0x22, 0x8f,
279 0x1a, 0x05, 0x0d, 0xe5, 0x0d, 0xae, 0x0c, 0x70, 0x02, 0x05, 0x0c, 0x14, 0xf5, 0x82, 0x8e, 0x83,
280 0xe5, 0x1a, 0xf0, 0x12, 0x13, 0x57, 0x05, 0x0d, 0xe5, 0x0d, 0xac, 0x0c, 0x70, 0x02, 0x05, 0x0c,
281 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15, 0x08, 0xe5, 0x08, 0x60, 0x0a, 0x12, 0x13}},
282 {0x0fc6, 64, { 0x93, 0x8f, 0x1a, 0xef, 0x42, 0x37, 0x80, 0xca, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c,
283 0x74, 0x30, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74,
284 0x27, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x07, 0xf0, 0xe4, 0x90,
285 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x22}},
286 {0x1006, 64, { 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x11,
287 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0,
288 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84,
289 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x18, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08}},
290 {0x1046, 64, { 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7f, 0x98,
291 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x10, 0xf0, 0x90,
292 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0,
293 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0}},
294 {0x1086, 64, { 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0,
295 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90,
296 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0,
297 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22}},
298 {0x10c6, 64, { 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x14,
299 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f,
300 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf,
301 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98}},
302 {0x1106, 64, { 0x74, 0x13, 0xf0, 0xe5, 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b,
303 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90, 0xc0, 0x00,
304 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0,
305 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f}},
306 {0x1146, 64, { 0x98, 0x74, 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45,
307 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00,
308 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f,
309 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f}},
310 {0x1186, 64, { 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90,
311 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0,
312 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90,
313 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0b}},
314 {0x11c6, 64, { 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0xe5,
315 0x44, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x17, 0xf0, 0x90, 0xc0, 0x00,
316 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13,
317 0x27, 0x8f, 0x1a, 0x12, 0x13, 0x27, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12}},
318 {0x1206, 64, { 0x13, 0x27, 0x8f, 0x1a, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x07, 0x12, 0x13, 0x27, 0x8f, 0x1b, 0x80, 0xe8,
319 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0xe5, 0x45, 0x54, 0x7f, 0x90, 0xc0, 0x00,
320 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x0f, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74,
321 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x12, 0x13, 0x7b, 0x8f, 0x1a, 0x12, 0x13}},
322 {0x1246, 64, { 0x7b, 0x8f, 0x1b, 0xe5, 0x1a, 0x65, 0x1b, 0x60, 0x12, 0x12, 0x13, 0x7b, 0x8f, 0x1a, 0xe5, 0x1a, 0x65,
323 0x1b, 0x60, 0x07, 0x12, 0x13, 0x7b, 0x8f, 0x1b, 0x80, 0xe8, 0xaf, 0x1a, 0x22, 0x90, 0x7f, 0xd6,
324 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x1a, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f,
325 0xf4, 0x7e, 0x01, 0x12, 0x12, 0xe7, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44}},
326 {0x1286, 64, { 0x04, 0xf0, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3e, 0x54, 0x7f, 0xfd, 0x12, 0x11, 0xd0, 0x90, 0x7f,
327 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3e, 0x44, 0x80, 0xfd, 0x12,
328 0x11, 0xd0, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x3f, 0x54, 0x7f, 0xfd, 0x12, 0x12, 0x1a, 0x90,
329 0x7f, 0x98, 0x74, 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x3f, 0x44, 0x80}},
330 {0x12c6, 64, { 0xfd, 0x12, 0x12, 0x1a, 0x22, 0x05, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x03, 0x00, 0x00,
331 0xc1, 0x11, 0xc1, 0x18, 0xc1, 0x95, 0xc1, 0x10, 0xc1, 0x16, 0x01, 0x0a, 0x00, 0xc1, 0x9b, 0x00,
332 0x8e, 0x18, 0x8f, 0x19, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e, 0x60,
333 0x05, 0x12, 0x0d, 0x60, 0x80, 0xee, 0x22, 0x00, 0x00, 0x02, 0x10, 0x06, 0x00, 0x02, 0x13}},
334 {0x1306, 64, { 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x10, 0x2d, 0x90, 0x7f, 0x98, 0x74, 0x11, 0xf0, 0x90, 0xc0,
335 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
336 0x90, 0x7f, 0x98, 0x74, 0x13, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
337 0x14, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x15, 0xf0, 0x90}},
338 {0x1346, 64, { 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x16, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
339 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
340 0x09, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0a, 0xf0, 0x90, 0xc0,
341 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0b, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff}},
342 {0x1386, 64, { 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0c, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74,
343 0x0d, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0x98, 0x74, 0x0e, 0xf0, 0x90, 0xc0,
344 0x00, 0xe0, 0xff, 0x22, 0x12, 0x0f, 0xcf, 0x12, 0x0d, 0x71, 0x12, 0x0b, 0x4a, 0x22, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
346 {0x13c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
350 {0x1406, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
354 {0x1446, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
358 {0x1486, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
362 {0x14c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
366 {0x1506, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
370 {0x1546, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
374 {0x1586, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
378 {0x15c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
382 {0x1606, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
386 {0x1646, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
390 {0x1686, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
394 {0x16c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
398 {0x1706, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
402 {0x1746, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
406 {0x1786, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
410 {0x17c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
414 {0x1806, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
418 {0x1846, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
422 {0x1886, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
426 {0x18c6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
430 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x10, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x09, 0x02, 0x74, 0x00, 0x01,
431 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
432 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
433 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
434 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
435 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x83, 0x02,
436 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
437 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
438 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
439 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
440 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
441 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
442 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x4b, 0x00, 0x65,
443 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
444 0x00, 0x42, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c,
445 0x00, 0x20, 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00}},
446 {0x1a06, 4, { 0x72, 0x00, 0x00, 0x00}},
447 {0xffff, 0, {0x00}}
448};
diff --git a/drivers/usb/serial/keyspan_usa49msg.h b/drivers/usb/serial/keyspan_usa49msg.h
new file mode 100644
index 000000000000..163b2dea2ec5
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa49msg.h
@@ -0,0 +1,282 @@
1/*
2 usa49msg.h
3
4 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
5 This file is available under a BSD-style copyright
6
7 Keyspan USB Async Message Formats for the USA49W
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are
11 met:
12
13 1. Redistributions of source code must retain this licence text
14 without modification, this list of conditions, and the following
15 disclaimer. The following copyright notice must appear immediately at
16 the beginning of all source files:
17
18 Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved
19
20 This file is available under a BSD-style copyright
21
22 2. The name of InnoSys Incorporated may not be used to endorse or promote
23 products derived from this software without specific prior written
24 permission.
25
26 THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR
27 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
29 NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
30 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 SUCH DAMAGE.
37
38 4th revision: USA49W version
39
40 Buffer formats for RX/TX data messages are not defined by
41 a structure, but are described here:
42
43 USB OUT (host -> USAxx, transmit) messages contain a
44 REQUEST_ACK indicator (set to 0xff to request an ACK at the
45 completion of transmit; 0x00 otherwise), followed by data:
46
47 RQSTACK DAT DAT DAT ...
48
49 with a total data length of 63.
50
51 USB IN (USAxx -> host, receive) messages begin with a status
52 byte in which the 0x80 bit is either:
53
54 (a) 0x80 bit clear
55 indicates that the bytes following it are all data
56 bytes:
57
58 STAT DATA DATA DATA DATA DATA ...
59
60 for a total of up to 63 DATA bytes,
61
62 or:
63
64 (b) 0x80 bit set
65 indiates that the bytes following alternate data and
66 status bytes:
67
68 STAT DATA STAT DATA STAT DATA STAT DATA ...
69
70 for a total of up to 32 DATA bytes.
71
72 The valid bits in the STAT bytes are:
73
74 OVERRUN 0x02
75 PARITY 0x04
76 FRAMING 0x08
77 BREAK 0x10
78
79 Notes:
80
81 (1) The OVERRUN bit can appear in either (a) or (b) format
82 messages, but the but the PARITY/FRAMING/BREAK bits
83 only appear in (b) format messages.
84 (2) For the host to determine the exact point at which the
85 overrun occurred (to identify the point in the data
86 stream at which the data was lost), it needs to count
87 128 characters, starting at the first character of the
88 message in which OVERRUN was reported; the lost character(s)
89 would have been received between the 128th and 129th
90 characters.
91 (3) An RX data message in which the first byte has 0x80 clear
92 serves as a "break off" indicator.
93 (4) a control message specifying disablePort will be answered
94 with a status message, but no further status will be sent
95 until a control messages with enablePort is sent
96
97 revision history:
98
99 1999feb10 add reportHskiaChanges to allow us to ignore them
100 1999feb10 add txAckThreshold for fast+loose throughput enhancement
101 1999mar30 beef up support for RX error reporting
102 1999apr14 add resetDataToggle to control message
103 2000jan04 merge with usa17msg.h
104 2000mar08 clone from usa26msg.h -> usa49msg.h
105 2000mar09 change to support 4 ports
106 2000may03 change external clocking to match USA-49W hardware
107 2000jun01 add extended BSD-style copyright text
108 2001jul05 change message format to improve OVERRUN case
109*/
110
111#ifndef __USA49MSG__
112#define __USA49MSG__
113
114
115/*
116 Host->device messages sent on the global control endpoint:
117
118 portNumber message
119 ---------- --------------------
120 0,1,2,3 portControlMessage
121 0x80 globalControlMessage
122*/
123
124struct keyspan_usa49_portControlMessage
125{
126 /*
127 0. 0/1/2/3 port control message follows
128 0x80 set non-port control message follows
129 */
130 u8 portNumber,
131
132 /*
133 there are three types of "commands" sent in the control message:
134
135 1. configuration changes which must be requested by setting
136 the corresponding "set" flag (and should only be requested
137 when necessary, to reduce overhead on the USA26):
138 */
139 setClocking, // host requests baud rate be set
140 baudLo, // host does baud divisor calculation
141 baudHi, // baudHi is only used for first port (gives lower rates)
142 prescaler, // specified as N/8; values 8-ff are valid
143 // must be set any time internal baud rate is set;
144 txClocking, // 0=internal, 1=external/DSR
145 rxClocking, // 0=internal, 1=external/DSR
146
147 setLcr, // host requests lcr be set
148 lcr, // use PARITY, STOPBITS, DATABITS below
149
150 setFlowControl, // host requests flow control be set
151 ctsFlowControl, // 1=use CTS flow control, 0=don't
152 xonFlowControl, // 1=use XON/XOFF flow control, 0=don't
153 xonChar, // specified in current character format
154 xoffChar, // specified in current character format
155
156 setRts, // host requests RTS output be set
157 rts, // 1=active, 0=inactive
158
159 setDtr, // host requests DTR output be set
160 dtr; // 1=on, 0=off
161
162
163 /*
164 3. configuration data which is simply used as is (no overhead,
165 but must be specified correctly in every host message).
166 */
167 u8 forwardingLength, // forward when this number of chars available
168 dsrFlowControl, // 1=use DSR flow control, 0=don't
169 txAckThreshold, // 0=not allowed, 1=normal, 2-255 deliver ACK faster
170 loopbackMode; // 0=no loopback, 1=loopback enabled
171
172 /*
173 4. commands which are flags only; these are processed in order
174 (so that, e.g., if both _txOn and _txOff flags are set, the
175 port ends in a TX_OFF state); any non-zero value is respected
176 */
177 u8 _txOn, // enable transmitting (and continue if there's data)
178 _txOff, // stop transmitting
179 txFlush, // toss outbound data
180 txBreak, // turn on break (cleared by _txOn)
181 rxOn, // turn on receiver
182 rxOff, // turn off receiver
183 rxFlush, // toss inbound data
184 rxForward, // forward all inbound data, NOW (as if fwdLen==1)
185 returnStatus, // return current status (even if it hasn't changed)
186 resetDataToggle,// reset data toggle state to DATA0
187 enablePort, // start servicing port (move data, check status)
188 disablePort; // stop servicing port (does implicit tx/rx flush/off)
189
190};
191
192// defines for bits in lcr
193#define USA_DATABITS_5 0x00
194#define USA_DATABITS_6 0x01
195#define USA_DATABITS_7 0x02
196#define USA_DATABITS_8 0x03
197#define STOPBITS_5678_1 0x00 // 1 stop bit for all byte sizes
198#define STOPBITS_5_1p5 0x04 // 1.5 stop bits for 5-bit byte
199#define STOPBITS_678_2 0x04 // 2 stop bits for 6/7/8-bit byte
200#define USA_PARITY_NONE 0x00
201#define USA_PARITY_ODD 0x08
202#define USA_PARITY_EVEN 0x18
203#define PARITY_1 0x28
204#define PARITY_0 0x38
205
206/*
207 during normal operation, status messages are returned
208 to the host whenever the board detects changes. In some
209 circumstances (e.g. Windows), status messages from the
210 device cause problems; to shut them off, the host issues
211 a control message with the disableStatusMessages flags
212 set (to any non-zero value). The device will respond to
213 this message, and then suppress further status messages;
214 it will resume sending status messages any time the host
215 sends any control message (either global or port-specific).
216*/
217
218struct keyspan_usa49_globalControlMessage
219{
220 u8 portNumber, // 0x80
221 sendGlobalStatus, // 1/2=number of status responses requested
222 resetStatusToggle, // 1=reset global status toggle
223 resetStatusCount, // a cycling value
224 remoteWakeupEnable, // 0x10=P1, 0x20=P2, 0x40=P3, 0x80=P4
225 disableStatusMessages; // 1=send no status until host talks
226};
227
228/*
229 Device->host messages send on the global status endpoint
230
231 portNumber message
232 ---------- --------------------
233 0x00,0x01,0x02,0x03 portStatusMessage
234 0x80 globalStatusMessage
235 0x81 globalDebugMessage
236*/
237
238struct keyspan_usa49_portStatusMessage // one for each port
239{
240 u8 portNumber, // 0,1,2,3
241 cts, // reports CTS pin
242 dcd, // reports DCD pin
243 dsr, // reports DSR pin
244 ri, // reports RI pin
245 _txOff, // transmit has been disabled (by host)
246 _txXoff, // transmit is in XOFF state (either host or RX XOFF)
247 rxEnabled, // as configured by rxOn/rxOff 1=on, 0=off
248 controlResponse,// 1=a control message has been processed
249 txAck, // ACK (data TX complete)
250 rs232valid; // RS-232 signal valid
251};
252
253// bits in RX data message when STAT byte is included
254#define RXERROR_OVERRUN 0x02
255#define RXERROR_PARITY 0x04
256#define RXERROR_FRAMING 0x08
257#define RXERROR_BREAK 0x10
258
259struct keyspan_usa49_globalStatusMessage
260{
261 u8 portNumber, // 0x80=globalStatusMessage
262 sendGlobalStatus, // from request, decremented
263 resetStatusCount; // as in request
264};
265
266struct keyspan_usa49_globalDebugMessage
267{
268 u8 portNumber, // 0x81=globalDebugMessage
269 n, // typically a count/status byte
270 b; // typically a data byte
271};
272
273// ie: the maximum length of an EZUSB endpoint buffer
274#define MAX_DATA_LEN 64
275
276// update status approx. 60 times a second (16.6666 ms)
277#define STATUS_UPDATE_INTERVAL 16
278
279// status rationing tuning value (each port gets checked each n ms)
280#define STATUS_RATION 10
281
282#endif
diff --git a/drivers/usb/serial/keyspan_usa49w_fw.h b/drivers/usb/serial/keyspan_usa49w_fw.h
new file mode 100644
index 000000000000..dc24dace1222
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa49w_fw.h
@@ -0,0 +1,464 @@
1/* keyspan_usa49w_fw.h
2
3 The firmware contained herein as keyspan_usa49w_fw.h is
4
5 Copyright (C) 1999-2001
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23*/
24
25static const struct ezusb_hex_record keyspan_usa49w_firmware[] = {
26 {0x0033, 3, { 0x02, 0x18, 0xfb}},
27 {0x0036, 12, { 0x90, 0x78, 0x41, 0x74, 0x01, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
28 {0x0046, 16, { 0xe4, 0xff, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xfe, 0xe5, 0x15}},
29 {0x0056, 16, { 0x24, 0x04, 0xfd, 0xe4, 0x35, 0x14, 0xfa, 0xa9, 0x05, 0x7b, 0x01, 0xef, 0x7c, 0x00, 0x29, 0xf9}},
30 {0x0066, 16, { 0xec, 0x3a, 0xfa, 0xee, 0x12, 0x11, 0xf1, 0x0f, 0xbf, 0x22, 0xd7, 0xe5, 0x15, 0x24, 0x05, 0xf5}},
31 {0x0076, 16, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02, 0x01, 0x34, 0xe5, 0x15, 0x24, 0x09}},
32 {0x0086, 16, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x0a, 0xf5, 0x82}},
33 {0x0096, 16, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x18, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x16, 0x47, 0xe5}},
34 {0x00a6, 16, { 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xcf, 0xf0, 0x80, 0x41}},
35 {0x00b6, 16, { 0xe5, 0x15, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x16, 0x76}},
36 {0x00c6, 16, { 0xe5, 0x15, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x00, 0x03}},
37 {0x00d6, 16, { 0x7f, 0x01, 0xe5, 0x15, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xfd, 0x12}},
38 {0x00e6, 16, { 0x16, 0x47, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x30}},
39 {0x00f6, 16, { 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0}},
40 {0x0003, 16, { 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x78, 0x41, 0x74}},
41 {0x0013, 16, { 0x01, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24}},
42 {0x0023, 16, { 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22}},
43 {0x0043, 3, { 0x02, 0x1b, 0x00}},
44 {0x0000, 3, { 0x02, 0x10, 0x95}},
45 {0x0106, 64, { 0x90, 0x78, 0x41, 0x74, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
46 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5,
47 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24,
48 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x32, 0xe5, 0x15, 0x24, 0x0c}},
49 {0x0146, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x3f, 0xff, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82,
50 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24,
51 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24,
52 0x0d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02, 0x02, 0x4f, 0xe5}},
53 {0x0186, 64, { 0x15, 0x24, 0x17, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x32,
54 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x04, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24,
55 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfb, 0xf0, 0xe4, 0xff, 0xe5, 0x15,
56 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xfd, 0x12, 0x16, 0x47, 0xe5}},
57 {0x01c6, 64, { 0x15, 0x24, 0x0e, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x33,
58 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24,
59 0x33, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xf0, 0xe5, 0x15, 0x24, 0x33,
60 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x15, 0x24, 0x0f}},
61 {0x0206, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x2f, 0xe5, 0x15, 0x24, 0x33, 0xf5, 0x82, 0xe4,
62 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x10, 0xf5, 0x82, 0xe4, 0x35,
63 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x15, 0xe7, 0xe5, 0x15, 0x24, 0x11, 0xf5, 0x82, 0xe4, 0x35,
64 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x16, 0x17, 0xe5, 0x15, 0x24, 0x33, 0xf5, 0x82, 0xe4}},
65 {0x0246, 64, { 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x15, 0xb7, 0xe5, 0x15, 0x24, 0x14, 0xf5, 0x82, 0xe4, 0x35,
66 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x44, 0xe5, 0x15, 0x24, 0x15, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
67 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
68 0x44, 0x01, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5}},
69 {0x0286, 64, { 0x83, 0xe0, 0x54, 0xfe, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82,
70 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x12, 0xf5, 0x82,
71 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x44, 0xe5, 0x15, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x35,
72 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14}},
73 {0x02c6, 64, { 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14,
74 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x39,
75 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x16,
76 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x15, 0x24, 0x35, 0xf5, 0x82}},
77 {0x0306, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x15, 0x24, 0x17, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
78 0x83, 0xe0, 0x30, 0xe0, 0x11, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
79 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
80 0x83, 0xe0, 0x54, 0xbf, 0xf0, 0xe5, 0x15, 0x24, 0x18, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5}},
81 {0x0346, 64, { 0x83, 0xe0, 0xff, 0xe5, 0x15, 0x24, 0x3b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0xe5,
82 0x15, 0x24, 0x19, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24,
83 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x0f, 0xe5, 0x15,
84 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xef, 0xf0, 0x90, 0x78}},
85 {0x0386, 64, { 0x41, 0x74, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90,
86 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x1a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
87 0x6b, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xbf, 0xf0,
88 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14}},
89 {0x03c6, 64, { 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x01, 0xf0, 0x12, 0x00,
90 0x36, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35,
91 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x47, 0xe5, 0x15,
92 0x24, 0x2c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x15, 0x24, 0x2b}},
93 {0x0406, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x1b,
94 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82,
95 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x28, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35,
96 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x47, 0xe5}},
97 {0x0446, 64, { 0x15, 0x24, 0x2b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xe5, 0x16, 0x42, 0x13,
98 0xe5, 0x15, 0x24, 0x1c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x70, 0x0e, 0xe5,
99 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x2a, 0x90, 0x78, 0x41,
100 0x74, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0}},
101 {0x0486, 64, { 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xef, 0x60, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35,
102 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x1d, 0xf5, 0x82, 0xe4, 0x35, 0x14,
103 0xf5, 0x83, 0xe0, 0x60, 0x27, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
104 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5}},
105 {0x04c6, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x1e,
106 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x28, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82,
107 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfe, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x47,
108 0xe5, 0x15, 0x24, 0x2d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xe5}},
109 {0x0506, 64, { 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x1f, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e,
110 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x27, 0xe5, 0x15,
111 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xff, 0xf0, 0xfd, 0xe4,
112 0xff, 0x12, 0x16, 0x47, 0xe5, 0x15, 0x24, 0x2d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83}},
113 {0x0546, 64, { 0xe4, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x20, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
114 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
115 0x18, 0x90, 0x78, 0x41, 0x74, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14,
116 0xf5, 0x83, 0xe0, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x21, 0xf5, 0x82}},
117 {0x0586, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14,
118 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
119 0x83, 0xe0, 0x60, 0x1f, 0xe5, 0x15, 0x24, 0x2e, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74,
120 0x01, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0}},
121 {0x05c6, 64, { 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
122 0x03, 0x12, 0x18, 0x85, 0xe5, 0x15, 0x24, 0x24, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
123 0x60, 0x1b, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x08,
124 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0xff, 0xe5, 0x16, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0xe5, 0x15}},
125 {0x0606, 64, { 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x16, 0xe5, 0x15, 0x24, 0x31, 0xf5,
126 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0x45, 0x16,
127 0xf0, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x12, 0x03, 0x07, 0x83, 0x00, 0x07, 0xf7, 0x01, 0x08,
128 0x63, 0x03, 0x06, 0x4c, 0x06, 0x07, 0x74, 0x08, 0x07, 0x68, 0x09, 0x07, 0x50, 0x0a, 0x07}},
129 {0x0646, 64, { 0x5f, 0x0b, 0x00, 0x00, 0x08, 0xb2, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x1c, 0x14, 0x70, 0x03,
130 0x02, 0x06, 0xfe, 0x24, 0x02, 0x60, 0x03, 0x02, 0x07, 0x46, 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0,
131 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75, 0x82,
132 0x17, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x30, 0xe0, 0x04, 0x7f, 0x03, 0x80}},
133 {0x0686, 64, { 0x02, 0x7f, 0x02, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19, 0xef, 0xf0, 0x75, 0x82, 0x6d, 0x75, 0x83, 0x19,
134 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x5f, 0x75, 0x83, 0x19, 0xf0, 0x75,
135 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x30, 0xe1, 0x04, 0x7f, 0x64, 0x80,
136 0x02, 0x7f, 0x32, 0x75, 0x82, 0x1a, 0x75, 0x83, 0x19, 0xef, 0xf0, 0x90, 0x7f, 0xef, 0xe0}},
137 {0x06c6, 64, { 0xfe, 0x90, 0x7f, 0xee, 0xe0, 0x7c, 0x00, 0x24, 0x00, 0xf5, 0x19, 0xec, 0x3e, 0xf5, 0x18, 0x75, 0x33,
138 0x19, 0x75, 0x34, 0x12, 0x75, 0x82, 0x14, 0x75, 0x83, 0x19, 0xe0, 0x75, 0x27, 0x00, 0xf5, 0x28,
139 0xd3, 0xe5, 0x28, 0x95, 0x19, 0xe5, 0x27, 0x95, 0x18, 0x40, 0x06, 0x85, 0x18, 0x27, 0x85, 0x19,
140 0x28, 0x12, 0x13, 0x12, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x14, 0x2b}},
141 {0x0706, 64, { 0xea, 0x49, 0x60, 0x32, 0x90, 0x7f, 0xee, 0xe0, 0x75, 0x18, 0x00, 0xf5, 0x19, 0xae, 0x02, 0xaf, 0x01,
142 0x8e, 0x33, 0x8f, 0x34, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x27, 0xf5, 0x28,
143 0xd3, 0x95, 0x19, 0xe5, 0x27, 0x95, 0x18, 0x40, 0x06, 0x85, 0x18, 0x27, 0x85, 0x19, 0x28, 0x12,
144 0x13, 0x12, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xb9}},
145 {0x0746, 64, { 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0x00, 0xe5, 0x25, 0xf0, 0x90,
146 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x25, 0x02, 0x08,
147 0xb9, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x22, 0x12, 0x0a, 0xb8, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0x00,
148 0xe5, 0x22, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xe8}},
149 {0x0786, 64, { 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2, 0x00, 0xe4, 0x33, 0xff,
150 0x25, 0xe0, 0xff, 0xa2, 0x06, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90,
151 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x08, 0xb9, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90,
152 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80}},
153 {0x07c6, 64, { 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34,
154 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5,
155 0x74, 0x02, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xb9,
156 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x08, 0xb9}},
157 {0x0806, 64, { 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x00, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
158 0x01, 0xf0, 0x02, 0x08, 0xb9, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4,
159 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5,
160 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff}},
161 {0x0846, 64, { 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20,
162 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0,
163 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2,
164 0x00, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90, 0x7f, 0xea}},
165 {0x0886, 64, { 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54,
166 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0,
167 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
168 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22, 0xe5, 0x11, 0x54, 0x0f, 0x70}},
169 {0x08c6, 64, { 0x03, 0x02, 0x09, 0xb2, 0x12, 0x16, 0xa5, 0xef, 0x20, 0xe1, 0x75, 0x12, 0x17, 0x03, 0xef, 0x14, 0xf5,
170 0x19, 0x12, 0x18, 0xcc, 0xef, 0x25, 0x19, 0xff, 0xe4, 0x33, 0xfe, 0xc3, 0xef, 0x94, 0x80, 0xee,
171 0x64, 0x80, 0x94, 0x80, 0x50, 0x59, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xe0, 0xfe, 0xa3, 0xe0,
172 0xff, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0x30, 0xe0, 0x11, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82}},
173 {0x0906, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82,
174 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4,
175 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x20, 0xe2, 0x12, 0xe5, 0x19, 0x60, 0x0e, 0xf5, 0x23, 0xef, 0x24,
176 0x01, 0xf5, 0x2d, 0xe4, 0x3e, 0xf5, 0x2c, 0x12, 0x14, 0xad, 0xe4, 0xff, 0x12, 0x14, 0xe3}},
177 {0x0946, 64, { 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe7, 0x5d, 0x12, 0x18,
178 0xcc, 0xe5, 0x15, 0x24, 0x3b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xfe, 0xef, 0xc3,
179 0x9e, 0x50, 0x48, 0xe5, 0x15, 0x24, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01,
180 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7b}},
181 {0x0986, 64, { 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x16, 0x42,
182 0x13, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x10, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35,
183 0x14, 0xf5, 0x83, 0xe0, 0xf5, 0x24, 0x80, 0x03, 0x12, 0x12, 0xa1, 0x12, 0x16, 0xd4, 0xef, 0x30,
184 0xe1, 0x03, 0x02, 0x0a, 0xb7, 0x12, 0x17, 0xd2, 0x8f, 0x19, 0x12, 0x18, 0xd8, 0xe5, 0x15}},
185 {0x09c6, 64, { 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x15, 0x24, 0x35, 0xf5, 0x82,
186 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x19, 0xc3, 0x9f, 0x50, 0x28, 0x12, 0x18, 0xb4,
187 0xef, 0x30, 0xe0, 0x21, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
188 0x20, 0xe7, 0x12, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0}},
189 {0x0a06, 64, { 0x20, 0xe1, 0x03, 0x02, 0x0a, 0xb7, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
190 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x19, 0x70, 0x03, 0x02, 0x0a, 0xb7, 0xb4, 0x80, 0x0f, 0xe5, 0x15,
191 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24,
192 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe7, 0x29, 0xe5, 0x19}},
193 {0x0a46, 64, { 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x19, 0x20, 0x85, 0x19, 0x23, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83,
194 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0x8c, 0x2c, 0xf5, 0x2d, 0x12, 0x13, 0xdd, 0xe5, 0x19, 0x25,
195 0xe0, 0xff, 0x12, 0x15, 0x19, 0x22, 0xe5, 0x19, 0xd3, 0x94, 0x3f, 0x40, 0x03, 0x75, 0x19, 0x3f,
196 0x85, 0x19, 0x23, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0}},
197 {0x0a86, 64, { 0xff, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xf5, 0x82, 0x8c, 0x83,
198 0xef, 0xf0, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x24, 0x01,
199 0xf5, 0x2d, 0xe4, 0x3e, 0xf5, 0x2c, 0x12, 0x14, 0x6c, 0xe5, 0x19, 0x04, 0xff, 0x12, 0x15, 0x19,
200 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xf0, 0xf0, 0x90, 0x7f, 0x96}},
201 {0x0ac6, 64, { 0xf0, 0xe4, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x78, 0x4a, 0x04, 0xf0, 0xf5, 0x8e, 0x90, 0x7f, 0x95, 0x74,
202 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x1f, 0xf0, 0x90, 0x78,
203 0x43, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x78, 0x41, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x9f, 0xf0, 0x90,
204 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02, 0xf0, 0x7e, 0x7b, 0x7f, 0xc0, 0x75}},
205 {0x0b06, 64, { 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0, 0x75, 0x16, 0x01, 0x12, 0x0f, 0x12,
206 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0,
207 0x75, 0x16, 0x01, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0,
208 0x7e, 0x7e, 0x7f, 0x40, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0x74, 0x7e, 0xf0, 0xa3, 0x74}},
209 {0x0b46, 64, { 0x40, 0xf0, 0x7e, 0x7e, 0x7f, 0x80, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7e, 0xf0,
210 0xa3, 0x74, 0x80, 0xf0, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f,
211 0x96, 0x74, 0xdf, 0xf0, 0x75, 0x16, 0x02, 0x12, 0x0f, 0x12, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14,
212 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x96, 0x74, 0xdf, 0xf0, 0x75, 0x16, 0x02, 0xe5, 0x15}},
213 {0x0b86, 64, { 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x7e, 0x7d, 0x7f, 0xc0, 0x85,
214 0x15, 0x82, 0x85, 0x14, 0x83, 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0xc0, 0xf0, 0x7e, 0x7e, 0x7f, 0x00,
215 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7e, 0xf0, 0xa3, 0x74, 0x00, 0xf0, 0x7e,
216 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x96, 0x74, 0xbf, 0xf0}},
217 {0x0bc6, 64, { 0x75, 0x16, 0x04, 0x12, 0x0f, 0x12, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90,
218 0x7f, 0x96, 0x74, 0xbf, 0xf0, 0x75, 0x16, 0x04, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35,
219 0x14, 0xf5, 0x83, 0x74, 0x02, 0xf0, 0x7e, 0x7d, 0x7f, 0x40, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83,
220 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0x40, 0xf0, 0x7e, 0x7d, 0x7f, 0x80, 0x85, 0x15, 0x82, 0x85}},
221 {0x0c06, 64, { 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0x80, 0xf0, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14,
222 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x96, 0x74, 0x7f, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x0f, 0x12,
223 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x96, 0x74, 0x7f, 0xf0,
224 0x75, 0x16, 0x08, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74}},
225 {0x0c46, 64, { 0x03, 0xf0, 0x7e, 0x7c, 0x7f, 0xc0, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0x74, 0x7c, 0xf0, 0xa3, 0x74,
226 0xc0, 0xf0, 0x7e, 0x7d, 0x7f, 0x00, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7d,
227 0xf0, 0xa3, 0x74, 0x00, 0xf0, 0xc2, 0x0a, 0xc2, 0x09, 0xd2, 0x02, 0x22, 0xe5, 0x10, 0x04, 0x54,
228 0x03, 0xf5, 0x10, 0x14, 0x60, 0x1f, 0x14, 0x60, 0x31, 0x14, 0x60, 0x43, 0x24, 0x03, 0x70}},
229 {0x0c86, 64, { 0x52, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0,
230 0x75, 0x16, 0x01, 0x80, 0x3d, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90,
231 0x7f, 0x96, 0x74, 0xdf, 0xf0, 0x75, 0x16, 0x02, 0x80, 0x28, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14,
232 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x96, 0x74, 0xbf, 0xf0, 0x75, 0x16, 0x04, 0x80, 0x13}},
233 {0x0cc6, 64, { 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x96, 0x74, 0x7f, 0xf0, 0x75,
234 0x16, 0x08, 0xe5, 0x32, 0x55, 0x16, 0x70, 0x03, 0x02, 0x0e, 0x11, 0xe5, 0x16, 0xf4, 0xff, 0x52,
235 0x32, 0xe5, 0x26, 0x54, 0x7f, 0xfe, 0x70, 0x0f, 0xe5, 0x2a, 0x55, 0x16, 0x60, 0x24, 0x90, 0x7f,
236 0x98, 0xe0, 0x45, 0x16, 0xf0, 0x80, 0x1b, 0xbe, 0x20, 0x18, 0xe5, 0x15, 0x24, 0x31, 0xf5}},
237 {0x0d06, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe3, 0x09, 0xe4, 0xf5, 0x2a, 0x90, 0x7f, 0x98, 0xe0,
238 0x5f, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x03,
239 0xe0, 0x14, 0xf0, 0xe5, 0x15, 0x24, 0x34, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
240 0x03, 0xe0, 0x14, 0xf0, 0xe0, 0x60, 0x03, 0x02, 0x0e, 0x11, 0x74, 0x0a, 0xf0, 0x12, 0x00}},
241 {0x0d46, 64, { 0x36, 0xef, 0x54, 0x01, 0xff, 0xf5, 0x19, 0xe5, 0x15, 0x24, 0x2c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
242 0x83, 0xe0, 0x6f, 0x60, 0x07, 0xe5, 0x19, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0x12, 0x18, 0xe4, 0x8f,
243 0x19, 0xe5, 0x15, 0x24, 0x27, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x19,
244 0x54, 0x10, 0xfe, 0x6f, 0x60, 0x06, 0xee, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24}},
245 {0x0d86, 64, { 0x28, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x19, 0x54, 0x80, 0xfe, 0x6f, 0x60,
246 0x06, 0xee, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x29, 0xf5, 0x82, 0xe4, 0x35, 0x14,
247 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x19, 0x54, 0x20, 0xfe, 0x6f, 0x60, 0x15, 0xee, 0xf0, 0xe5, 0x15,
248 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe4, 0x04, 0xe5, 0x16}},
249 {0x0dc6, 64, { 0x42, 0x13, 0xe5, 0x12, 0x55, 0x16, 0xff, 0xf5, 0x19, 0xe5, 0x15, 0x24, 0x2a, 0xf5, 0x82, 0xe4, 0x35,
250 0x14, 0xf5, 0x83, 0xe0, 0x6f, 0x60, 0x16, 0xe5, 0x19, 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82,
251 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe5, 0x04, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x17, 0x55,
252 0x16, 0xff, 0xf5, 0x19, 0xe5, 0x15, 0x24, 0x30, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83}},
253 {0x0e06, 64, { 0xe0, 0x6f, 0x60, 0x07, 0xe5, 0x19, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0x22, 0x30, 0x09, 0x03, 0x02, 0x0f,
254 0x11, 0xe5, 0x24, 0x14, 0x60, 0x2a, 0x14, 0x60, 0x41, 0x14, 0x60, 0x58, 0x14, 0x60, 0x6f, 0x24,
255 0x04, 0x60, 0x03, 0x02, 0x0e, 0xcf, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0,
256 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0, 0x75, 0x16, 0x01, 0x12, 0x12, 0xa1, 0x75, 0x24, 0x01}},
257 {0x0e46, 64, { 0x22, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x96, 0x74, 0xdf, 0xf0,
258 0x75, 0x16, 0x02, 0x12, 0x12, 0xa1, 0x75, 0x24, 0x02, 0x22, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14,
259 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x96, 0x74, 0xbf, 0xf0, 0x75, 0x16, 0x04, 0x12, 0x12, 0xa1,
260 0x75, 0x24, 0x03, 0x22, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90}},
261 {0x0e86, 64, { 0x7f, 0x96, 0x74, 0x7f, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x12, 0xa1, 0x75, 0x24, 0x04, 0x22, 0x30, 0x04,
262 0x33, 0xc2, 0x04, 0x53, 0x13, 0xdf, 0xe4, 0xf5, 0x19, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x2e, 0x25,
263 0x19, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x11, 0xab, 0xff, 0x74, 0x80, 0x25, 0x19, 0xf5, 0x82,
264 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x19, 0xe5, 0x19, 0xb4, 0x03, 0xdb, 0x90}},
265 {0x0ec6, 64, { 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0x75, 0x24, 0x05, 0x22, 0xe5, 0x36, 0x60, 0x3b, 0xd5, 0x36, 0x0a, 0x53,
266 0x13, 0xef, 0x30, 0x0a, 0x04, 0xd2, 0x09, 0xc2, 0x0a, 0xe4, 0xf5, 0x19, 0x7e, 0x00, 0x7b, 0x00,
267 0x74, 0x35, 0x25, 0x19, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x11, 0xab, 0xff, 0x74, 0x80, 0x25,
268 0x19, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x19, 0xe5, 0x19, 0xb4}},
269 {0x0f06, 64, { 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x24, 0x22, 0xe4, 0xf5, 0x1a, 0x7e, 0x00,
270 0x7b, 0x01, 0xe5, 0x15, 0x25, 0x1a, 0xf9, 0xee, 0x35, 0x14, 0xfa, 0xe4, 0x12, 0x11, 0xf1, 0x05,
271 0x1a, 0xe5, 0x1a, 0xb4, 0x3c, 0xe8, 0xe5, 0x15, 0x24, 0x35, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
272 0x83, 0x74, 0x01, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5}},
273 {0x0f46, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd,
274 0x12, 0x16, 0x47, 0x7f, 0x10, 0xe5, 0x15, 0x24, 0x33, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
275 0xef, 0xf0, 0x12, 0x15, 0xb7, 0x90, 0x78, 0x41, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0xe5, 0x15, 0x24,
276 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0x44, 0x06, 0x90, 0xc0, 0x00}},
277 {0x0f86, 64, { 0xf0, 0x90, 0x78, 0x41, 0x74, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
278 0x83, 0x74, 0x80, 0xf0, 0x90, 0xc0, 0x00, 0xf0, 0x0f, 0xe4, 0xfd, 0x12, 0x16, 0x47, 0xe4, 0xff,
279 0x7e, 0xa3, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xee, 0xf0, 0xfd,
280 0x12, 0x16, 0x47, 0x90, 0x78, 0x41, 0x74, 0x01, 0xf0, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0x7f}},
281 {0x0fc6, 64, { 0x05, 0x7d, 0x7f, 0x12, 0x16, 0x47, 0x7f, 0x01, 0x12, 0x15, 0x4f, 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x16,
282 0x47, 0x22, 0x53, 0x13, 0x3f, 0x90, 0x7b, 0xf1, 0xe0, 0x30, 0xe3, 0x16, 0x7e, 0x7b, 0x7f, 0xc0,
283 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0, 0x75, 0x16, 0x01, 0x12,
284 0x08, 0xc1, 0x90, 0x7c, 0x31, 0xe0, 0x30, 0xe3, 0x16, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14}},
285 {0x1006, 64, { 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x96, 0x74, 0xdf, 0xf0, 0x75, 0x16, 0x02, 0x12, 0x08, 0xc1, 0x90,
286 0x7c, 0x71, 0xe0, 0x30, 0xe3, 0x16, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40,
287 0x90, 0x7f, 0x96, 0x74, 0xbf, 0xf0, 0x75, 0x16, 0x04, 0x12, 0x08, 0xc1, 0x90, 0x7c, 0xb1, 0xe0,
288 0x30, 0xe3, 0x16, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f}},
289 {0x1046, 64, { 0x96, 0x74, 0x7f, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x08, 0xc1, 0x05, 0x11, 0xe5, 0x11, 0x54, 0x0f, 0xf5,
290 0x18, 0x70, 0x1f, 0x90, 0x78, 0x41, 0xe0, 0x54, 0xf7, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0xf5, 0x17,
291 0x90, 0x78, 0x41, 0xe0, 0x44, 0x08, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0xf4, 0xf5, 0x12, 0x12, 0x11,
292 0x21, 0x22, 0xe5, 0x18, 0xb4, 0x01, 0x04, 0x12, 0x0c, 0x73, 0x22, 0x90, 0x7f, 0xc2, 0xe0}},
293 {0x1086, 64, { 0x20, 0xe1, 0x08, 0xe5, 0x13, 0x60, 0x04, 0x12, 0x0e, 0x12, 0x22, 0x12, 0x0c, 0x73, 0x22, 0x78, 0x7f,
294 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x37, 0x02, 0x10, 0xdc, 0x02, 0x12, 0x29, 0xe4, 0x93, 0xa3,
295 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4,
296 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20}},
297 {0x10c6, 64, { 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04,
298 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x18, 0x50, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff,
299 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54,
300 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8}},
301 {0x1106, 64, { 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8,
302 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0x90, 0x7f, 0xd2, 0xe0, 0x30, 0xe1,
303 0x03, 0x02, 0x11, 0xaa, 0xc2, 0x09, 0x90, 0x7b, 0x40, 0xe0, 0x14, 0x60, 0x26, 0x14, 0x60, 0x3b,
304 0x14, 0x60, 0x50, 0x24, 0x83, 0x60, 0x64, 0x24, 0x80, 0x70, 0x63, 0x7e, 0x7b, 0x7f, 0xc0}},
305 {0x1146, 64, { 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x96, 0x74, 0xef, 0xf0, 0x75, 0x16, 0x01, 0x12, 0x00,
306 0x46, 0x80, 0x4b, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x96,
307 0x74, 0xdf, 0xf0, 0x75, 0x16, 0x02, 0x12, 0x00, 0x46, 0x80, 0x33, 0x7e, 0x7c, 0x7f, 0x40, 0x75,
308 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x96, 0x74, 0xbf, 0xf0, 0x75, 0x16, 0x04, 0x12}},
309 {0x1186, 64, { 0x00, 0x46, 0x80, 0x1b, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x96,
310 0x74, 0x7f, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x00, 0x46, 0x80, 0x03, 0x12, 0x17, 0x5c, 0xe4, 0x90,
311 0x7f, 0xd3, 0xf0, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7,
312 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01}},
313 {0x11c6, 64, { 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25,
314 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29,
315 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a,
316 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0}},
317 {0x1206, 64, { 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01,
318 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3,
319 0x80, 0xdf, 0x90, 0x7f, 0xae, 0xe0, 0xff, 0xd3, 0x92, 0x00, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0,
320 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0}},
321 {0x1246, 64, { 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef,
322 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0x74, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0x0b,
323 0x12, 0x18, 0x14, 0xc2, 0x01, 0xe4, 0xf5, 0x2b, 0xf5, 0x31, 0xc2, 0x07, 0xc2, 0x02, 0x75, 0x29,
324 0xf0, 0x90, 0x7f, 0xd8, 0xe0, 0x65, 0x26, 0x60, 0x06, 0x75, 0x32, 0x0f, 0xe0, 0xf5, 0x26}},
325 {0x1286, 64, { 0x30, 0x02, 0x03, 0x12, 0x0f, 0xd9, 0x30, 0x01, 0x07, 0xc2, 0x01, 0x12, 0x06, 0x29, 0x80, 0xe2, 0x30,
326 0x08, 0xdf, 0xc2, 0x08, 0x12, 0x18, 0x35, 0x80, 0xd8, 0x22, 0xe5, 0x13, 0x55, 0x16, 0x60, 0x6a,
327 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x5c, 0xe5, 0x16,
328 0xf4, 0x52, 0x13, 0xe5, 0x15, 0x24, 0x26, 0xff, 0xe4, 0x35, 0x14, 0xfe, 0xe4, 0xfd, 0x0f}},
329 {0x12c6, 64, { 0xef, 0xaa, 0x06, 0x70, 0x01, 0x0e, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xe0, 0xfc, 0x74, 0x80, 0x2d, 0xf5,
330 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xec, 0xf0, 0x0d, 0xbd, 0x0b, 0xe2, 0x90, 0x7f, 0xc3, 0x74,
331 0x0b, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x10, 0xf0,
332 0xe5, 0x15, 0x24, 0x2e, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x15}},
333 {0x1306, 64, { 0x24, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0x22, 0xe5, 0x28, 0x45, 0x27, 0x60,
334 0x57, 0xae, 0x27, 0xaf, 0x28, 0xd3, 0xef, 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x04, 0x7e, 0x00,
335 0x7f, 0x40, 0xc3, 0xe5, 0x28, 0x9f, 0xf5, 0x28, 0xe5, 0x27, 0x9e, 0xf5, 0x27, 0xe4, 0xfd, 0xed,
336 0xc3, 0x9f, 0xe4, 0x9e, 0x50, 0x1f, 0x85, 0x34, 0x82, 0x85, 0x33, 0x83, 0xe0, 0xfc, 0x74}},
337 {0x1346, 64, { 0x00, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xec, 0xf0, 0x0d, 0x05, 0x34, 0xe5, 0x34, 0x70,
338 0x02, 0x05, 0x33, 0x80, 0xda, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x44,
339 0x01, 0xf0, 0x90, 0x7f, 0xb5, 0xef, 0xf0, 0x22, 0x90, 0x7f, 0xac, 0xe0, 0x54, 0xfe, 0xf0, 0xe4,
340 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xf0}},
341 {0x1386, 64, { 0xf0, 0x90, 0x7f, 0x96, 0xf0, 0xe4, 0x90, 0x78, 0x4a, 0xf0, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x7f, 0x9d,
342 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x30, 0x00, 0x07, 0xe5, 0x29, 0x54, 0xf0, 0xff,
343 0x80, 0x02, 0x7f, 0x00, 0xef, 0x44, 0x08, 0x90, 0x78, 0x41, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0,
344 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x98, 0xf0}},
345 {0x13c6, 64, { 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xf0, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f,
346 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x8f, 0x1a, 0x05, 0x2d, 0xe5, 0x2d, 0xae, 0x2c, 0x70, 0x02,
347 0x05, 0x2c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x1a, 0xf0, 0x12, 0x18, 0xf0, 0x05, 0x2d, 0xe5,
348 0x2d, 0xac, 0x2c, 0x70, 0x02, 0x05, 0x2c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x15}},
349 {0x1406, 64, { 0x23, 0xe5, 0x23, 0x60, 0x1f, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xc0,
350 0x83, 0xc0, 0x82, 0xe0, 0xfe, 0x12, 0x18, 0xd8, 0x8f, 0x1a, 0xee, 0x4f, 0xd0, 0x82, 0xd0, 0x83,
351 0xf0, 0x80, 0xb5, 0x22, 0x8f, 0x1a, 0xe4, 0xf5, 0x1b, 0x75, 0x1c, 0xff, 0x75, 0x1d, 0x19, 0x75,
352 0x1e, 0x86, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x90, 0x00, 0x01, 0x12, 0x11, 0xc4, 0xb4}},
353 {0x1446, 64, { 0x03, 0x1d, 0xaf, 0x1b, 0x05, 0x1b, 0xef, 0xb5, 0x1a, 0x01, 0x22, 0x12, 0x11, 0xab, 0x7e, 0x00, 0x29,
354 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x1c, 0xff, 0xf5, 0x1d, 0x89, 0x1e, 0x80, 0xd4, 0x7b, 0x00,
355 0x7a, 0x00, 0x79, 0x00, 0x22, 0xe4, 0x90, 0x78, 0x41, 0xf0, 0x90, 0x78, 0x4f, 0x74, 0xc0, 0xf0,
356 0xe4, 0x90, 0x78, 0x50, 0xf0, 0xe5, 0x2c, 0x90, 0x78, 0x51, 0xf0, 0xae, 0x2c, 0xe5, 0x2d}},
357 {0x1486, 64, { 0x90, 0x78, 0x52, 0xf0, 0x90, 0x78, 0x54, 0xe5, 0x23, 0xf0, 0x90, 0x78, 0x57, 0x74, 0x04, 0xf0, 0x90,
358 0x7f, 0xe2, 0xe0, 0x44, 0x10, 0xf0, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0x90, 0x78, 0x55, 0xf0, 0x90,
359 0x78, 0x55, 0xe0, 0x60, 0xfa, 0x22, 0xe4, 0x90, 0x78, 0x41, 0xf0, 0xe5, 0x2c, 0x90, 0x78, 0x4f,
360 0xf0, 0xae, 0x2c, 0xe5, 0x2d, 0x90, 0x78, 0x50, 0xf0, 0x90, 0x78, 0x51, 0x74, 0xc0, 0xf0}},
361 {0x14c6, 64, { 0xe4, 0x90, 0x78, 0x52, 0xf0, 0x90, 0x78, 0x54, 0xe5, 0x23, 0xf0, 0x90, 0x78, 0x57, 0x74, 0x04, 0xf0,
362 0xe4, 0x90, 0x78, 0x55, 0xf0, 0x90, 0x78, 0x55, 0xe0, 0x60, 0xfa, 0x22, 0xe5, 0x15, 0x24, 0x04,
363 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x13, 0x14, 0x60,
364 0x17, 0x80, 0x00, 0x90, 0x7f, 0xc7, 0xef, 0xf0, 0x80, 0x13, 0x90, 0x7f, 0xc9, 0xef, 0xf0}},
365 {0x1506, 64, { 0x80, 0x0c, 0x90, 0x7f, 0xcb, 0xef, 0xf0, 0x80, 0x05, 0x90, 0x7f, 0xcd, 0xef, 0xf0, 0xe5, 0x16, 0x42,
366 0x2a, 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60,
367 0x0f, 0x14, 0x60, 0x13, 0x14, 0x60, 0x17, 0x80, 0x00, 0x90, 0x7f, 0xb7, 0xef, 0xf0, 0x80, 0x13,
368 0x90, 0x7f, 0xb9, 0xef, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xbb, 0xef, 0xf0, 0x80, 0x05, 0x90}},
369 {0x1546, 64, { 0x7f, 0xbd, 0xef, 0xf0, 0xe5, 0x16, 0x42, 0x2a, 0x22, 0xae, 0x07, 0xe4, 0xff, 0xe5, 0x15, 0x24, 0x32,
370 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xfd, 0x12, 0x16, 0x47, 0x90, 0x78,
371 0x41, 0x74, 0x01, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82,
372 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xfd, 0x12, 0x16, 0x47, 0x22, 0xc0, 0xe0}},
373 {0x1586, 64, { 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0xd0,
374 0x75, 0xd0, 0x08, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0x12, 0x13, 0x12, 0xd0,
375 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32,
376 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x78, 0x41}},
377 {0x15c6, 64, { 0x74, 0x02, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24,
378 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22,
379 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x78, 0x41, 0x74,
380 0x04, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15}},
381 {0x1606, 64, { 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22,
382 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x78, 0x41, 0x74,
383 0x06, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24,
384 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0}},
385 {0x1646, 64, { 0x22, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
386 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x07, 0xf0, 0x90, 0xc0,
387 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x05, 0xf0, 0x90, 0xc0, 0x00, 0xed, 0xf0, 0x22, 0x90,
388 0x78, 0x41, 0x74, 0x03, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0xe4, 0x90, 0x78, 0x41}},
389 {0x1686, 64, { 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5,
390 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0xe5, 0x15,
391 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60, 0x0e, 0x14, 0x60, 0x11,
392 0x14, 0x60, 0x14, 0x80, 0x00, 0x90, 0x7f, 0xc6, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xc8, 0xe0}},
393 {0x16c6, 64, { 0xff, 0x22, 0x90, 0x7f, 0xca, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xcc, 0xe0, 0xff, 0x22, 0xe5, 0x15, 0x24,
394 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60, 0x0e, 0x14, 0x60, 0x11, 0x14,
395 0x60, 0x14, 0x80, 0x00, 0x90, 0x7f, 0xb6, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xb8, 0xe0, 0xff, 0x22,
396 0x90, 0x7f, 0xba, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xbc, 0xe0, 0xff, 0x22, 0xe5, 0x15, 0x24}},
397 {0x1706, 64, { 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60, 0x0e, 0x14, 0x60, 0x11, 0x14, 0x60,
398 0x14, 0x80, 0x00, 0x90, 0x7f, 0xc7, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xc9, 0xe0, 0xff, 0x22, 0x90,
399 0x7f, 0xcb, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xcd, 0xe0, 0xff, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0,
400 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90, 0x7f, 0xc4, 0xe4, 0xf0}},
401 {0x1746, 64, { 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82,
402 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7b, 0x41, 0xe0, 0xf5, 0x36, 0x43, 0x13, 0x10, 0xa3, 0xe0,
403 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0, 0x90, 0x7b, 0x43, 0xe0, 0xf5,
404 0x37, 0xa3, 0xe0, 0x54, 0xf0, 0xf5, 0x29, 0xe0, 0x60, 0x02, 0xd2, 0x0a, 0x22, 0xc0, 0xe0}},
405 {0x1786, 64, { 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x01, 0x53, 0x91,
406 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0,
407 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86,
408 0x75, 0x86, 0x00, 0xd2, 0x08, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0}},
409 {0x17c6, 64, { 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x12, 0x18, 0xc0, 0xae, 0x07,
410 0x12, 0x18, 0xc0, 0xad, 0x07, 0xee, 0x6d, 0x60, 0x10, 0x12, 0x18, 0xc0, 0xae, 0x07, 0xee, 0x6d,
411 0x60, 0x07, 0x12, 0x18, 0xc0, 0xad, 0x07, 0x80, 0xec, 0xaf, 0x06, 0x22, 0x74, 0x00, 0xf5, 0x86,
412 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x22, 0x90, 0x7f}},
413 {0x1806, 64, { 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x90, 0x7f, 0xd6,
414 0xe0, 0x44, 0x04, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x0b, 0x04, 0xe0, 0x44, 0x02, 0xf0, 0x7f,
415 0xf4, 0x7e, 0x01, 0x12, 0x18, 0x6b, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0x12, 0x13,
416 0x7c, 0x12, 0x18, 0x04, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x0a, 0x7f, 0x05, 0x7e, 0x00}},
417 {0x1846, 64, { 0x12, 0x18, 0x6b, 0x12, 0x18, 0x9e, 0x12, 0x0a, 0xb8, 0x22, 0x03, 0x35, 0x80, 0x00, 0x00, 0x03, 0x2e,
418 0x81, 0x00, 0x00, 0xc1, 0x85, 0xc1, 0x81, 0xc1, 0x08, 0xc1, 0x00, 0xc1, 0x06, 0x01, 0x22, 0x00,
419 0x01, 0x24, 0x00, 0x00, 0x8e, 0x18, 0x8f, 0x19, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02,
420 0x15, 0x18, 0x4e, 0x60, 0x08, 0x12, 0x17, 0xf3, 0x12, 0x17, 0xf3, 0x80, 0xeb, 0x22, 0xe5}},
421 {0x1886, 64, { 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x04, 0xff, 0x44, 0x10, 0x90, 0x7f,
422 0xd7, 0xf0, 0xef, 0x44, 0x30, 0xf0, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x0d,
423 0x7e, 0x00, 0x12, 0x18, 0x6b, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22, 0x90, 0x78, 0x41,
424 0x74, 0x02, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x78, 0x41, 0x74, 0x03, 0xf0}},
425 {0x18c6, 64, { 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x78, 0x41, 0x74, 0x04, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff,
426 0x22, 0x90, 0x78, 0x41, 0x74, 0x05, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x78, 0x41,
427 0x74, 0x06, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0xe4, 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0,
428 0x00, 0xe0, 0xff, 0x22, 0x53, 0xd8, 0xef, 0x32, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0x00}},
429 {0x1906, 64, { 0x00, 0x40, 0xcd, 0x06, 0x0a, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x04, 0x09, 0x02, 0x74, 0x00, 0x01,
430 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
431 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
432 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
433 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
434 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
435 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
436 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
437 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
438 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
439 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
440 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
441 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x36, 0x03, 0x55, 0x00, 0x53,
442 0x00, 0x42, 0x00, 0x20, 0x00, 0x34, 0x00, 0x2d, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74,
443 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20,
444 0x00, 0x41, 0x00, 0x64, 0x00, 0x61, 0x00, 0x70, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00}},
445 {0x1a06, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
449 {0x1a46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
453 {0x1a86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
457 {0x1ac6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x17, 0x84, 0x00, 0x02, 0x1b}},
461 {0x1b06, 21, { 0x04, 0x00, 0x02, 0x17, 0x32, 0x00, 0x02, 0x17, 0xab, 0x00, 0x02, 0x1b, 0x10, 0x00, 0x02, 0x1b, 0x14,
462 0x00, 0x02, 0x15, 0x84}},
463 {0xffff, 0, {0x00}}
464};
diff --git a/drivers/usb/serial/keyspan_usa49wlc_fw.h b/drivers/usb/serial/keyspan_usa49wlc_fw.h
new file mode 100644
index 000000000000..bef06a3350ce
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa49wlc_fw.h
@@ -0,0 +1,476 @@
1/* keyspan_usa49w_fw.h
2
3 The firmware contained herein as keyspan_usa49w_fw.h is
4
5 Copyright (C) 1999-2003
6 Keyspan, A division of InnoSys Incorporated ("Keyspan")
7
8 as an unpublished work. This notice does not imply unrestricted or
9 public access to the source code from which this firmware image is
10 derived. Except as noted below this firmware image may not be
11 reproduced, used, sold or transferred to any third party without
12 Keyspan's prior written consent. All Rights Reserved.
13
14 Permission is hereby granted for the distribution of this firmware
15 image as part of a Linux or other Open Source operating system kernel
16 in text or binary form as required.
17
18 This firmware may not be modified and may only be used with
19 Keyspan hardware. Distribution and/or Modification of the
20 keyspan.c driver which includes this firmware, in whole or in
21 part, requires the inclusion of this statement."
22
23static char theFirmwareDate49[] =
24 "02/14/2002 02:37p 19,347 USA49";
25
26
27
28static char theFirmwareDate65[] =
29 "01/31/2003 09:34a 19,331 USA65";
30
31
32*/
33
34static const struct ezusb_hex_record keyspan_usa49wlc_firmware[] = {
35 {0x7f92, 1, { 0x01}},
36 {0x0033, 3, { 0x02, 0x18, 0xfb}},
37 {0x0036, 13, { 0xe5, 0x11, 0x04, 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22}},
38 {0x0046, 16, { 0xe4, 0xff, 0x74, 0x40, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xe0, 0xfe, 0xe5, 0x15}},
39 {0x0056, 16, { 0x24, 0x04, 0xfd, 0xe4, 0x35, 0x14, 0xfa, 0xa9, 0x05, 0x7b, 0x01, 0xef, 0x7c, 0x00, 0x29, 0xf9}},
40 {0x0066, 16, { 0xec, 0x3a, 0xfa, 0xee, 0x12, 0x11, 0xec, 0x0f, 0xbf, 0x22, 0xd7, 0xe5, 0x15, 0x24, 0x05, 0xf5}},
41 {0x0076, 16, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02, 0x01, 0x34, 0xe5, 0x15, 0x24, 0x09}},
42 {0x0086, 16, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x0a, 0xf5, 0x82}},
43 {0x0096, 16, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x18, 0x7f, 0x01, 0xe4, 0xfd, 0x12, 0x16, 0x6b, 0xe5}},
44 {0x00a6, 16, { 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xcf, 0xf0, 0x80, 0x41}},
45 {0x00b6, 16, { 0xe5, 0x15, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x00, 0x03}},
46 {0x00c6, 16, { 0xe5, 0x15, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x15, 0xab}},
47 {0x00d6, 16, { 0x7f, 0x01, 0xe5, 0x15, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xfd, 0x12}},
48 {0x00e6, 16, { 0x16, 0x6b, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x30}},
49 {0x00f6, 16, { 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0}},
50 {0x0003, 16, { 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0, 0x90, 0x78, 0x41, 0x74}},
51 {0x0013, 16, { 0xf0, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0xe5, 0x15, 0x24}},
52 {0x0023, 16, { 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x22}},
53 {0x0043, 3, { 0x02, 0x1b, 0x00}},
54 {0x0000, 3, { 0x02, 0x10, 0x90}},
55 {0x0106, 64, { 0x90, 0x78, 0x41, 0x74, 0xf4, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
56 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf2, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5,
57 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24,
58 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x32, 0xe5, 0x15, 0x24, 0x0c}},
59 {0x0146, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x3f, 0xff, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82,
60 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0xe5, 0x15, 0x24,
61 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24,
62 0x0d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02, 0x02, 0x4f, 0xe5}},
63 {0x0186, 64, { 0x15, 0x24, 0x17, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x32,
64 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x04, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24,
65 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfb, 0xf0, 0xe4, 0xff, 0xe5, 0x15,
66 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xfd, 0x12, 0x16, 0x6b, 0xe5}},
67 {0x01c6, 64, { 0x15, 0x24, 0x0e, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x33,
68 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24,
69 0x33, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xf0, 0xe5, 0x15, 0x24, 0x33,
70 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x15, 0x24, 0x0f}},
71 {0x0206, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x2f, 0xe5, 0x15, 0x24, 0x33, 0xf5, 0x82, 0xe4,
72 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x10, 0xf5, 0x82, 0xe4, 0x35,
73 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x16, 0x0b, 0xe5, 0x15, 0x24, 0x11, 0xf5, 0x82, 0xe4, 0x35,
74 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x16, 0x3b, 0xe5, 0x15, 0x24, 0x33, 0xf5, 0x82, 0xe4}},
75 {0x0246, 64, { 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x12, 0x15, 0xdb, 0xe5, 0x15, 0x24, 0x14, 0xf5, 0x82, 0xe4, 0x35,
76 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x44, 0xe5, 0x15, 0x24, 0x15, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
77 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
78 0x44, 0x01, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5}},
79 {0x0286, 64, { 0x83, 0xe0, 0x54, 0xfe, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf4, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82,
80 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x12, 0xf5, 0x82,
81 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x44, 0xe5, 0x15, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x35,
82 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14}},
83 {0x02c6, 64, { 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14,
84 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf4, 0xf0, 0xe5, 0x15, 0x24, 0x39,
85 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x16,
86 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x15, 0x24, 0x35, 0xf5, 0x82}},
87 {0x0306, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x15, 0x24, 0x17, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
88 0x83, 0xe0, 0x30, 0xe0, 0x11, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
89 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
90 0x83, 0xe0, 0x54, 0xbf, 0xf0, 0xe5, 0x15, 0x24, 0x18, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5}},
91 {0x0346, 64, { 0x83, 0xe0, 0xff, 0xe5, 0x15, 0x24, 0x3b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0xe5,
92 0x15, 0x24, 0x19, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x11, 0xe5, 0x15, 0x24,
93 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x0f, 0xe5, 0x15,
94 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xef, 0xf0, 0x90, 0x78}},
95 {0x0386, 64, { 0x41, 0x74, 0xf4, 0xf0, 0xe5, 0x15, 0x24, 0x39, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x90,
96 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x1a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
97 0x6b, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xbf, 0xf0,
98 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14}},
99 {0x03c6, 64, { 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf1, 0xf0, 0x12, 0x00,
100 0x36, 0xef, 0x54, 0xfe, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35,
101 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x6b, 0xe5, 0x15,
102 0x24, 0x2c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x15, 0x24, 0x2b}},
103 {0x0406, 64, { 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x1b,
104 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82,
105 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x28, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35,
106 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x6b, 0xe5}},
107 {0x0446, 64, { 0x15, 0x24, 0x2b, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xe5, 0x16, 0x42, 0x13,
108 0xe5, 0x15, 0x24, 0x1c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x70, 0x0e, 0xe5,
109 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x2a, 0x90, 0x78, 0x41,
110 0x74, 0xf2, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0}},
111 {0x0486, 64, { 0x44, 0x04, 0x90, 0xc0, 0x00, 0xf0, 0xef, 0x60, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35,
112 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x04, 0xf0, 0xe5, 0x15, 0x24, 0x1d, 0xf5, 0x82, 0xe4, 0x35, 0x14,
113 0xf5, 0x83, 0xe0, 0x60, 0x27, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
114 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5}},
115 {0x04c6, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x1e,
116 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x28, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82,
117 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfe, 0xff, 0xf0, 0xfd, 0xe4, 0xff, 0x12, 0x16, 0x6b,
118 0xe5, 0x15, 0x24, 0x2d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xe5}},
119 {0x0506, 64, { 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x1f, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x0e,
120 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x27, 0xe5, 0x15,
121 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xff, 0xf0, 0xfd, 0xe4,
122 0xff, 0x12, 0x16, 0x6b, 0xe5, 0x15, 0x24, 0x2d, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83}},
123 {0x0546, 64, { 0xe4, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x20, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
124 0xe0, 0x70, 0x0e, 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
125 0x18, 0x90, 0x78, 0x41, 0x74, 0xf2, 0xf0, 0xe5, 0x15, 0x24, 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14,
126 0xf5, 0x83, 0xe0, 0x44, 0x02, 0x90, 0xc0, 0x00, 0xf0, 0xe5, 0x15, 0x24, 0x21, 0xf5, 0x82}},
127 {0x0586, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x0f, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14,
128 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
129 0x83, 0xe0, 0x60, 0x1f, 0xe5, 0x15, 0x24, 0x2e, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74,
130 0x01, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0}},
131 {0x05c6, 64, { 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60,
132 0x03, 0x12, 0x18, 0x7a, 0xe5, 0x15, 0x24, 0x24, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
133 0x60, 0x23, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x08,
134 0xf0, 0xe5, 0x16, 0xc4, 0x54, 0xf0, 0xff, 0x42, 0x11, 0x90, 0x7f, 0x96, 0xe0, 0x4f, 0xf0}},
135 {0x0606, 64, { 0x90, 0x78, 0x41, 0xe0, 0x4f, 0xf0, 0xe5, 0x15, 0x24, 0x25, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
136 0xe0, 0x60, 0x24, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54,
137 0xf7, 0xf0, 0xe5, 0x16, 0xc4, 0x54, 0xf0, 0xf4, 0xff, 0x52, 0x11, 0x90, 0x7f, 0x96, 0xe0, 0x5f,
138 0xf0, 0x90, 0x78, 0x41, 0xe0, 0x5f, 0xf0, 0x22, 0x90, 0x7f, 0xe9, 0xe0, 0x12, 0x11, 0xfe}},
139 {0x0646, 64, { 0x07, 0x99, 0x00, 0x08, 0x0d, 0x01, 0x08, 0x79, 0x03, 0x06, 0x62, 0x06, 0x07, 0x8a, 0x08, 0x07, 0x7e,
140 0x09, 0x07, 0x66, 0x0a, 0x07, 0x75, 0x0b, 0x00, 0x00, 0x08, 0xc8, 0x90, 0x7f, 0xeb, 0xe0, 0x24,
141 0xfe, 0x60, 0x1c, 0x14, 0x70, 0x03, 0x02, 0x07, 0x14, 0x24, 0x02, 0x60, 0x03, 0x02, 0x07, 0x5c,
142 0x74, 0x19, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x08, 0xcf}},
143 {0x0686, 64, { 0x90, 0x7f, 0xea, 0xe0, 0x04, 0x75, 0x82, 0x17, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea, 0xe0, 0x30,
144 0xe0, 0x04, 0x7f, 0x02, 0x80, 0x02, 0x7f, 0x03, 0x75, 0x82, 0x82, 0x75, 0x83, 0x19, 0xef, 0xf0,
145 0x75, 0x82, 0x6d, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x66, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82,
146 0x5f, 0x75, 0x83, 0x19, 0xf0, 0x75, 0x82, 0x58, 0x75, 0x83, 0x19, 0xf0, 0x90, 0x7f, 0xea}},
147 {0x06c6, 64, { 0xe0, 0x30, 0xe1, 0x04, 0x7f, 0x64, 0x80, 0x02, 0x7f, 0x32, 0x75, 0x82, 0x1a, 0x75, 0x83, 0x19, 0xef,
148 0xf0, 0x90, 0x7f, 0xef, 0xe0, 0xfe, 0x90, 0x7f, 0xee, 0xe0, 0x7c, 0x00, 0x24, 0x00, 0xf5, 0x18,
149 0xec, 0x3e, 0xf5, 0x17, 0x75, 0x33, 0x19, 0x75, 0x34, 0x12, 0x75, 0x82, 0x14, 0x75, 0x83, 0x19,
150 0xe0, 0x75, 0x27, 0x00, 0xf5, 0x28, 0xd3, 0xe5, 0x28, 0x95, 0x18, 0xe5, 0x27, 0x95, 0x17}},
151 {0x0706, 64, { 0x40, 0x06, 0x85, 0x17, 0x27, 0x85, 0x18, 0x28, 0x12, 0x13, 0x0d, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xea,
152 0xe0, 0xff, 0x12, 0x14, 0x5f, 0xea, 0x49, 0x60, 0x32, 0x90, 0x7f, 0xee, 0xe0, 0x75, 0x17, 0x00,
153 0xf5, 0x18, 0xae, 0x02, 0xaf, 0x01, 0x8e, 0x33, 0x8f, 0x34, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfe,
154 0xa3, 0xe0, 0x8e, 0x27, 0xf5, 0x28, 0xd3, 0x95, 0x18, 0xe5, 0x27, 0x95, 0x17, 0x40, 0x06}},
155 {0x0746, 64, { 0x85, 0x17, 0x27, 0x85, 0x18, 0x28, 0x12, 0x13, 0x0d, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xb4, 0xe0, 0x44,
156 0x01, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xcf, 0x90,
157 0x7f, 0x00, 0xe5, 0x25, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f,
158 0xea, 0xe0, 0xf5, 0x25, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x22, 0x12, 0x0a}},
159 {0x0786, 64, { 0xce, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0x00, 0xe5, 0x22, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02,
160 0x08, 0xcf, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70,
161 0x5b, 0xa2, 0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x06, 0xe4, 0x33, 0x4f, 0x90, 0x7f,
162 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x08, 0xcf, 0xe4}},
163 {0x07c6, 64, { 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f,
164 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0,
165 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0,
166 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xb4}},
167 {0x0806, 64, { 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02,
168 0x60, 0x03, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x00, 0x02, 0x08,
169 0xcf, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x08, 0xcf, 0x90, 0x7f, 0xea, 0xe0, 0x70,
170 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54}},
171 {0x0846, 64, { 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f,
172 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90,
173 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0,
174 0x80, 0x56, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90}},
175 {0x0886, 64, { 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04, 0xd2, 0x00, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0,
176 0x80, 0x36, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff,
177 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34,
178 0x7f, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0}},
179 {0x08c6, 64, { 0x80, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22,
180 0xe5, 0x12, 0x54, 0x0f, 0x70, 0x03, 0x02, 0x09, 0xc8, 0x12, 0x16, 0x9a, 0xef, 0x20, 0xe1, 0x75,
181 0x12, 0x16, 0xf8, 0xef, 0x14, 0xf5, 0x18, 0x12, 0x18, 0xc5, 0xef, 0x25, 0x18, 0xff, 0xe4, 0x33,
182 0xfe, 0xc3, 0xef, 0x94, 0x80, 0xee, 0x64, 0x80, 0x94, 0x80, 0x50, 0x59, 0x85, 0x15, 0x82}},
183 {0x0906, 64, { 0x85, 0x14, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0x30, 0xe0, 0x11, 0xe5,
184 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x0f,
185 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xf0, 0xe5,
186 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x20, 0xe2, 0x12, 0xe5}},
187 {0x0946, 64, { 0x18, 0x60, 0x0e, 0xf5, 0x23, 0xef, 0x24, 0x01, 0xf5, 0x2d, 0xe4, 0x3e, 0xf5, 0x2c, 0x12, 0x14, 0xa0,
188 0xe4, 0xff, 0x12, 0x14, 0xd7, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83,
189 0xe0, 0x30, 0xe7, 0x5d, 0x12, 0x18, 0xc5, 0xe5, 0x15, 0x24, 0x3b, 0xf5, 0x82, 0xe4, 0x35, 0x14,
190 0xf5, 0x83, 0xe0, 0xfe, 0xef, 0xc3, 0x9e, 0x50, 0x48, 0xe5, 0x15, 0x24, 0x2f, 0xf5, 0x82}},
191 {0x0986, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14,
192 0xf5, 0x83, 0xe0, 0x54, 0x7b, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
193 0x83, 0xe4, 0xf0, 0xe5, 0x16, 0x42, 0x13, 0x90, 0x7f, 0xc2, 0xe0, 0x30, 0xe1, 0x10, 0xe5, 0x15,
194 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xf5, 0x24, 0x80, 0x03, 0x12}},
195 {0x09c6, 64, { 0x12, 0x9c, 0x12, 0x16, 0xc9, 0xef, 0x30, 0xe1, 0x03, 0x02, 0x0a, 0xcd, 0x12, 0x17, 0xc7, 0x8f, 0x18,
196 0x12, 0x18, 0xd3, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0,
197 0xe5, 0x15, 0x24, 0x35, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0xc3,
198 0x9f, 0x50, 0x28, 0x12, 0x18, 0xa9, 0xef, 0x30, 0xe0, 0x21, 0xe5, 0x15, 0x24, 0x38, 0xf5}},
199 {0x0a06, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x20, 0xe7, 0x12, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4,
200 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x0a, 0xcd, 0xe5, 0x15, 0x24, 0x31, 0xf5,
201 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x18, 0x70, 0x03, 0x02, 0x0a,
202 0xcd, 0xb4, 0x80, 0x0f, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83}},
203 {0x0a46, 64, { 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff,
204 0x30, 0xe7, 0x29, 0xe5, 0x18, 0xd3, 0x94, 0x20, 0x40, 0x03, 0x75, 0x18, 0x20, 0x85, 0x18, 0x23,
205 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0x8c, 0x2c, 0xf5, 0x2d,
206 0x12, 0x13, 0xcf, 0xe5, 0x18, 0x25, 0xe0, 0xff, 0x12, 0x15, 0x0d, 0x22, 0xe5, 0x18, 0xd3}},
207 {0x0a86, 64, { 0x94, 0x3f, 0x40, 0x03, 0x75, 0x18, 0x3f, 0x85, 0x18, 0x23, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4,
208 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0xe0, 0xfc,
209 0xa3, 0xe0, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3,
210 0xe0, 0xfe, 0xa3, 0xe0, 0x24, 0x01, 0xf5, 0x2d, 0xe4, 0x3e, 0xf5, 0x2c, 0x12, 0x14, 0x1d}},
211 {0x0ac6, 64, { 0xe5, 0x18, 0x04, 0xff, 0x12, 0x15, 0x0d, 0x22, 0xe4, 0x90, 0x7f, 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74,
212 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x94, 0xf0, 0x90, 0x78, 0x4a, 0x04, 0xf0,
213 0xf5, 0x8e, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f,
214 0x98, 0x74, 0x2f, 0xf0, 0x90, 0x78, 0x43, 0x74, 0xf7, 0xf0, 0xe4, 0x90, 0x78, 0x41, 0xf0}},
215 {0x0b06, 64, { 0x90, 0x7f, 0xdf, 0x74, 0x9f, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0x44, 0x02, 0xf0,
216 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x98, 0x74, 0x2e, 0xf0,
217 0x75, 0x16, 0x01, 0x12, 0x0f, 0x28, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0,
218 0x90, 0x7f, 0x98, 0x74, 0x2e, 0xf0, 0x75, 0x16, 0x01, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82}},
219 {0x0b46, 64, { 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0x7e, 0x7e, 0x7f, 0x40, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83,
220 0x74, 0x7e, 0xf0, 0xa3, 0x74, 0x40, 0xf0, 0x7e, 0x7e, 0x7f, 0x80, 0x85, 0x15, 0x82, 0x85, 0x14,
221 0x83, 0xa3, 0xa3, 0x74, 0x7e, 0xf0, 0xa3, 0x74, 0x80, 0xf0, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14,
222 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0, 0x75, 0x16, 0x02, 0x12, 0x0f}},
223 {0x0b86, 64, { 0x28, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0,
224 0x75, 0x16, 0x02, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01,
225 0xf0, 0x7e, 0x7d, 0x7f, 0xc0, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0x74, 0x7d, 0xf0, 0xa3, 0x74,
226 0xc0, 0xf0, 0x7e, 0x7e, 0x7f, 0x00, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0x74}},
227 {0x0bc6, 64, { 0x7e, 0xf0, 0xa3, 0x74, 0x00, 0xf0, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90,
228 0x7f, 0x98, 0x74, 0x2b, 0xf0, 0x75, 0x16, 0x04, 0x12, 0x0f, 0x28, 0x7e, 0x7c, 0x7f, 0x40, 0x75,
229 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x2b, 0xf0, 0x75, 0x16, 0x04, 0xe5, 0x15,
230 0x24, 0x26, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x02, 0xf0, 0x7e, 0x7d, 0x7f}},
231 {0x0c06, 64, { 0x40, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0x40, 0xf0, 0x7e, 0x7d, 0x7f,
232 0x80, 0x85, 0x15, 0x82, 0x85, 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0x80, 0xf0,
233 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0,
234 0x75, 0x16, 0x08, 0x12, 0x0f, 0x28, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15}},
235 {0x0c46, 64, { 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0, 0x75, 0x16, 0x08, 0xe5, 0x15, 0x24, 0x26, 0xf5, 0x82, 0xe4,
236 0x35, 0x14, 0xf5, 0x83, 0x74, 0x03, 0xf0, 0x7e, 0x7c, 0x7f, 0xc0, 0x85, 0x15, 0x82, 0x85, 0x14,
237 0x83, 0x74, 0x7c, 0xf0, 0xa3, 0x74, 0xc0, 0xf0, 0x7e, 0x7d, 0x7f, 0x00, 0x85, 0x15, 0x82, 0x85,
238 0x14, 0x83, 0xa3, 0xa3, 0x74, 0x7d, 0xf0, 0xa3, 0x74, 0x00, 0xf0, 0xc2, 0x0a, 0xc2, 0x09}},
239 {0x0c86, 64, { 0xe4, 0xf5, 0x11, 0xd2, 0x02, 0x22, 0xe5, 0x10, 0x04, 0x54, 0x03, 0xf5, 0x10, 0x14, 0x60, 0x1f, 0x14,
240 0x60, 0x31, 0x14, 0x60, 0x43, 0x24, 0x03, 0x70, 0x52, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b,
241 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x98, 0x74, 0x2e, 0xf0, 0x75, 0x16, 0x01, 0x80, 0x3d, 0x7e, 0x7c,
242 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0, 0x75}},
243 {0x0cc6, 64, { 0x16, 0x02, 0x80, 0x28, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x98,
244 0x74, 0x2b, 0xf0, 0x75, 0x16, 0x04, 0x80, 0x13, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75,
245 0x15, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0, 0x75, 0x16, 0x08, 0xe5, 0x32, 0x55, 0x16, 0x70,
246 0x03, 0x02, 0x0e, 0x27, 0xe5, 0x16, 0xf4, 0x52, 0x32, 0xe5, 0x26, 0x54, 0x7f, 0xff, 0x70}},
247 {0x0d06, 64, { 0x17, 0xe5, 0x2a, 0x55, 0x16, 0x60, 0x34, 0x90, 0x7f, 0x96, 0xe0, 0xfe, 0xe5, 0x16, 0xc4, 0x54, 0xf0,
248 0xf4, 0xfd, 0xee, 0x5d, 0xf0, 0x80, 0x23, 0xbf, 0x20, 0x20, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82,
249 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe3, 0x11, 0xe4, 0xf5, 0x2a, 0x90, 0x7f, 0x96, 0xe0,
250 0xff, 0xe5, 0x16, 0xc4, 0x54, 0xf0, 0xfe, 0xef, 0x4e, 0xf0, 0xe5, 0x15, 0x24, 0x3a, 0xf5}},
251 {0x0d46, 64, { 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x03, 0xe0, 0x14, 0xf0, 0xe5, 0x15, 0x24, 0x34, 0xf5,
252 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x60, 0x03, 0xe0, 0x14, 0xf0, 0xe0, 0x60, 0x03, 0x02,
253 0x0e, 0x27, 0x74, 0x0a, 0xf0, 0x12, 0x00, 0x36, 0xef, 0x54, 0x01, 0xff, 0xf5, 0x18, 0xe5, 0x15,
254 0x24, 0x2c, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x6f, 0x60, 0x07, 0xe5, 0x18}},
255 {0x0d86, 64, { 0xf0, 0xe5, 0x16, 0x42, 0x13, 0x12, 0x18, 0xe1, 0x8f, 0x18, 0xe5, 0x15, 0x24, 0x27, 0xf5, 0x82, 0xe4,
256 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x54, 0x10, 0xfe, 0x6f, 0x60, 0x06, 0xee, 0xf0,
257 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x28, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0,
258 0xff, 0xe5, 0x18, 0x54, 0x80, 0xfe, 0x6f, 0x60, 0x06, 0xee, 0xf0, 0xe5, 0x16, 0x42, 0x13}},
259 {0x0dc6, 64, { 0xe5, 0x15, 0x24, 0x29, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x54, 0x20,
260 0xfe, 0x6f, 0x60, 0x15, 0xee, 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
261 0x83, 0xe0, 0x30, 0xe4, 0x04, 0xe5, 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x2a, 0xf5, 0x82, 0xe4,
262 0x35, 0x14, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x18, 0x54, 0x40, 0xfe, 0x6f, 0x60, 0x15, 0xee}},
263 {0x0e06, 64, { 0xf0, 0xe5, 0x15, 0x24, 0x31, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x30, 0xe5, 0x04, 0xe5,
264 0x16, 0x42, 0x13, 0xe5, 0x15, 0x24, 0x30, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0,
265 0x22, 0x30, 0x09, 0x03, 0x02, 0x0f, 0x27, 0xe5, 0x24, 0x14, 0x60, 0x2a, 0x14, 0x60, 0x41, 0x14,
266 0x60, 0x58, 0x14, 0x60, 0x6f, 0x24, 0x04, 0x60, 0x03, 0x02, 0x0e, 0xe5, 0x7e, 0x7b, 0x7f}},
267 {0x0e46, 64, { 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x98, 0x74, 0x2e, 0xf0, 0x75, 0x16, 0x01, 0x12,
268 0x12, 0x9c, 0x75, 0x24, 0x01, 0x22, 0x7e, 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00,
269 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0, 0x75, 0x16, 0x02, 0x12, 0x12, 0x9c, 0x75, 0x24, 0x02, 0x22,
270 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x2b}},
271 {0x0e86, 64, { 0xf0, 0x75, 0x16, 0x04, 0x12, 0x12, 0x9c, 0x75, 0x24, 0x03, 0x22, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14,
272 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x12, 0x9c,
273 0x75, 0x24, 0x04, 0x22, 0x30, 0x04, 0x33, 0xc2, 0x04, 0x53, 0x13, 0xdf, 0xe4, 0xf5, 0x18, 0x7e,
274 0x00, 0x7b, 0x00, 0x74, 0x2e, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa, 0x12, 0x11, 0xa6}},
275 {0x0ec6, 64, { 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x18, 0xe5,
276 0x18, 0xb4, 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0x75, 0x24, 0x05, 0x22, 0xe5, 0x36,
277 0x60, 0x3b, 0xd5, 0x36, 0x0a, 0x53, 0x13, 0xef, 0x30, 0x0a, 0x04, 0xd2, 0x09, 0xc2, 0x0a, 0xe4,
278 0xf5, 0x18, 0x7e, 0x00, 0x7b, 0x00, 0x74, 0x35, 0x25, 0x18, 0xf9, 0xee, 0x34, 0x00, 0xfa}},
279 {0x0f06, 64, { 0x12, 0x11, 0xa6, 0xff, 0x74, 0x80, 0x25, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5, 0x83, 0xef, 0xf0,
280 0x05, 0x18, 0xe5, 0x18, 0xb4, 0x03, 0xdb, 0x90, 0x7f, 0xc3, 0x74, 0x03, 0xf0, 0xe4, 0xf5, 0x24,
281 0x22, 0xe4, 0xf5, 0x19, 0x7e, 0x00, 0x7b, 0x01, 0xe5, 0x15, 0x25, 0x19, 0xf9, 0xee, 0x35, 0x14,
282 0xfa, 0xe4, 0x12, 0x11, 0xec, 0x05, 0x19, 0xe5, 0x19, 0xb4, 0x3c, 0xe8, 0xe5, 0x15, 0x24}},
283 {0x0f46, 64, { 0x35, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0,
284 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x03, 0xf0, 0x90, 0xc0,
285 0x00, 0xf0, 0x7f, 0x0c, 0xe4, 0xfd, 0x12, 0x16, 0x6b, 0x7f, 0x10, 0xe5, 0x15, 0x24, 0x33, 0xf5,
286 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0, 0x12, 0x15, 0xdb, 0x90, 0x78, 0x41, 0x74}},
287 {0x0f86, 64, { 0xf2, 0xf0, 0x7f, 0x01, 0xe5, 0x15, 0x24, 0x36, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xef, 0xf0,
288 0x44, 0x06, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf4, 0xf0, 0xe5, 0x15, 0x24, 0x39,
289 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x90, 0xc0, 0x00, 0xf0, 0x0f, 0xe4,
290 0xfd, 0x12, 0x16, 0x6b, 0xe4, 0xff, 0x7e, 0xa3, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4}},
291 {0x0fc6, 64, { 0x35, 0x14, 0xf5, 0x83, 0xee, 0xf0, 0xfd, 0x12, 0x16, 0x6b, 0x90, 0x78, 0x41, 0x74, 0xf1, 0xf0, 0x90,
292 0xc0, 0x00, 0xe4, 0xf0, 0x7f, 0x05, 0x7d, 0x7f, 0x12, 0x16, 0x6b, 0x7f, 0x01, 0x12, 0x15, 0x43,
293 0x7f, 0x03, 0x7d, 0x07, 0x12, 0x16, 0x6b, 0x22, 0x53, 0x13, 0x3f, 0x90, 0x7b, 0xf1, 0xe0, 0x30,
294 0xe3, 0x16, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15, 0xc0, 0x90, 0x7f, 0x98}},
295 {0x1006, 64, { 0x74, 0x2e, 0xf0, 0x75, 0x16, 0x01, 0x12, 0x08, 0xd7, 0x90, 0x7c, 0x31, 0xe0, 0x30, 0xe3, 0x16, 0x7e,
296 0x7c, 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0, 0x75,
297 0x16, 0x02, 0x12, 0x08, 0xd7, 0x90, 0x7c, 0x71, 0xe0, 0x30, 0xe3, 0x16, 0x7e, 0x7c, 0x7f, 0x40,
298 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40, 0x90, 0x7f, 0x98, 0x74, 0x2b, 0xf0, 0x75, 0x16, 0x04}},
299 {0x1046, 64, { 0x12, 0x08, 0xd7, 0x90, 0x7c, 0xb1, 0xe0, 0x30, 0xe3, 0x16, 0x7e, 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c,
300 0x75, 0x15, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0, 0x75, 0x16, 0x08, 0x12, 0x08, 0xd7, 0x05,
301 0x12, 0xe5, 0x12, 0x54, 0x0f, 0xf5, 0x17, 0x70, 0x04, 0x12, 0x11, 0x1c, 0x22, 0xe5, 0x17, 0xb4,
302 0x01, 0x04, 0x12, 0x0c, 0x8c, 0x22, 0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x08, 0xe5, 0x13}},
303 {0x1086, 64, { 0x60, 0x04, 0x12, 0x0e, 0x28, 0x22, 0x12, 0x0c, 0x8c, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75,
304 0x81, 0x37, 0x02, 0x10, 0xd7, 0x02, 0x12, 0x24, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40,
305 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07,
306 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4}},
307 {0x10c6, 64, { 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
308 0x90, 0x18, 0x45, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09,
309 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8,
310 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5}},
311 {0x1106, 64, { 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf,
312 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0x90, 0x7f, 0xd2, 0xe0, 0x30, 0xe1, 0x03, 0x02, 0x11, 0xa5, 0xc2,
313 0x09, 0x90, 0x7b, 0x40, 0xe0, 0x14, 0x60, 0x26, 0x14, 0x60, 0x3b, 0x14, 0x60, 0x50, 0x24, 0x83,
314 0x60, 0x64, 0x24, 0x80, 0x70, 0x63, 0x7e, 0x7b, 0x7f, 0xc0, 0x75, 0x14, 0x7b, 0x75, 0x15}},
315 {0x1146, 64, { 0xc0, 0x90, 0x7f, 0x98, 0x74, 0x2e, 0xf0, 0x75, 0x16, 0x01, 0x12, 0x00, 0x46, 0x80, 0x4b, 0x7e, 0x7c,
316 0x7f, 0x00, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x00, 0x90, 0x7f, 0x98, 0x74, 0x2d, 0xf0, 0x75, 0x16,
317 0x02, 0x12, 0x00, 0x46, 0x80, 0x33, 0x7e, 0x7c, 0x7f, 0x40, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x40,
318 0x90, 0x7f, 0x98, 0x74, 0x2b, 0xf0, 0x75, 0x16, 0x04, 0x12, 0x00, 0x46, 0x80, 0x1b, 0x7e}},
319 {0x1186, 64, { 0x7c, 0x7f, 0x80, 0x75, 0x14, 0x7c, 0x75, 0x15, 0x80, 0x90, 0x7f, 0x98, 0x74, 0x27, 0xf0, 0x75, 0x16,
320 0x08, 0x12, 0x00, 0x46, 0x80, 0x03, 0x12, 0x17, 0x51, 0xe4, 0x90, 0x7f, 0xd3, 0xf0, 0x22, 0xbb,
321 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3,
322 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5}},
323 {0x11c6, 64, { 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb,
324 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a,
325 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02,
326 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70}},
327 {0x1206, 64, { 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83,
328 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x90, 0x7f, 0xae,
329 0xe0, 0xff, 0xd3, 0x92, 0x00, 0xe4, 0x33, 0xfe, 0xef, 0x4e, 0xf0, 0xd2, 0xe8, 0x43, 0xd8, 0x20,
330 0x90, 0x7f, 0xde, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xab, 0x74, 0xff}},
331 {0x1246, 64, { 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0x74, 0x01,
332 0xf0, 0x90, 0x7f, 0xae, 0x74, 0x0d, 0xf0, 0xd2, 0xaf, 0xd2, 0x0b, 0x12, 0x18, 0x09, 0xc2, 0x01,
333 0xe4, 0xf5, 0x2b, 0xf5, 0x31, 0xc2, 0x07, 0xc2, 0x02, 0x75, 0x29, 0x0f, 0x90, 0x7f, 0xd8, 0xe0,
334 0x65, 0x26, 0x60, 0x06, 0x75, 0x32, 0x0f, 0xe0, 0xf5, 0x26, 0x30, 0x02, 0x03, 0x12, 0x0f}},
335 {0x1286, 64, { 0xef, 0x30, 0x01, 0x07, 0xc2, 0x01, 0x12, 0x06, 0x3f, 0x80, 0xe2, 0x30, 0x08, 0xdf, 0xc2, 0x08, 0x12,
336 0x18, 0x2a, 0x80, 0xd8, 0x22, 0xe5, 0x13, 0x55, 0x16, 0x60, 0x6a, 0xe5, 0x15, 0x24, 0x3a, 0xf5,
337 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x70, 0x5c, 0xe5, 0x16, 0xf4, 0x52, 0x13, 0xe5, 0x15,
338 0x24, 0x26, 0xff, 0xe4, 0x35, 0x14, 0xfe, 0xe4, 0xfd, 0x0f, 0xef, 0xaa, 0x06, 0x70, 0x01}},
339 {0x12c6, 64, { 0x0e, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xe0, 0xfc, 0x74, 0x80, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x7b, 0xf5,
340 0x83, 0xec, 0xf0, 0x0d, 0xbd, 0x0b, 0xe2, 0x90, 0x7f, 0xc3, 0x74, 0x0b, 0xf0, 0xe5, 0x15, 0x24,
341 0x3a, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0x74, 0x10, 0xf0, 0xe5, 0x15, 0x24, 0x2e, 0xf5,
342 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x15, 0x24, 0x2f, 0xf5, 0x82, 0xe4}},
343 {0x1306, 64, { 0x35, 0x14, 0xf5, 0x83, 0xe4, 0xf0, 0x22, 0xe5, 0x28, 0x45, 0x27, 0x60, 0x57, 0xae, 0x27, 0xaf, 0x28,
344 0xd3, 0xef, 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x04, 0x7e, 0x00, 0x7f, 0x40, 0xc3, 0xe5, 0x28,
345 0x9f, 0xf5, 0x28, 0xe5, 0x27, 0x9e, 0xf5, 0x27, 0xe4, 0xfd, 0xed, 0xc3, 0x9f, 0xe4, 0x9e, 0x50,
346 0x1f, 0x85, 0x34, 0x82, 0x85, 0x33, 0x83, 0xe0, 0xfc, 0x74, 0x00, 0x2d, 0xf5, 0x82, 0xe4}},
347 {0x1346, 64, { 0x34, 0x7f, 0xf5, 0x83, 0xec, 0xf0, 0x0d, 0x05, 0x34, 0xe5, 0x34, 0x70, 0x02, 0x05, 0x33, 0x80, 0xda,
348 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb5,
349 0xef, 0xf0, 0x22, 0x90, 0x7f, 0xac, 0xe0, 0x54, 0xfe, 0xf0, 0xe4, 0x90, 0x7f, 0xb5, 0xf0, 0x22,
350 0x90, 0x7f, 0x98, 0x74, 0x0f, 0xf0, 0xe4, 0x90, 0x78, 0x4a, 0xf0, 0x90, 0x7f, 0x94, 0xf0}},
351 {0x1386, 64, { 0x90, 0x7f, 0x9d, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x7f, 0x97, 0xf0, 0x90, 0x78, 0x41, 0xf0, 0x90, 0x7f,
352 0x93, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xff, 0xf0, 0x30, 0x00, 0x07, 0xe5, 0x29, 0x54, 0x0f, 0xff,
353 0x80, 0x02, 0x7f, 0x00, 0x90, 0x7f, 0x96, 0xef, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x1f, 0xf0, 0xe4,
354 0x90, 0x7f, 0x95, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x3f, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0xdf}},
355 {0x13c6, 64, { 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x8f, 0x19, 0x05, 0x2d, 0xe5, 0x2d, 0xae, 0x2c,
356 0x70, 0x02, 0x05, 0x2c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x19, 0xf0, 0x12, 0x18, 0xef, 0x05,
357 0x2d, 0xe5, 0x2d, 0xac, 0x2c, 0x70, 0x02, 0x05, 0x2c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0,
358 0x15, 0x23, 0xe5, 0x23, 0x60, 0x1f, 0xe5, 0x15, 0x24, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x14}},
359 {0x1406, 64, { 0xf5, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfe, 0x12, 0x18, 0xd3, 0x8f, 0x19, 0xee, 0x4f, 0xd0, 0x82,
360 0xd0, 0x83, 0xf0, 0x80, 0xb5, 0x22, 0x90, 0x78, 0x41, 0xe5, 0x11, 0xf0, 0x90, 0x78, 0x4f, 0x74,
361 0xc0, 0xf0, 0xe4, 0x90, 0x78, 0x50, 0xf0, 0xe5, 0x2c, 0x90, 0x78, 0x51, 0xf0, 0xae, 0x2c, 0xe5,
362 0x2d, 0x90, 0x78, 0x52, 0xf0, 0x90, 0x78, 0x54, 0xe5, 0x23, 0xf0, 0x90, 0x78, 0x57, 0x74}},
363 {0x1446, 64, { 0x04, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x10, 0xf0, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0x90, 0x78, 0x55,
364 0xf0, 0x90, 0x78, 0x55, 0xe0, 0x60, 0xfa, 0x22, 0x8f, 0x19, 0xe4, 0xf5, 0x1a, 0x75, 0x1b, 0xff,
365 0x75, 0x1c, 0x19, 0x75, 0x1d, 0x86, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x90, 0x00, 0x01, 0x12,
366 0x11, 0xbf, 0xb4, 0x03, 0x1d, 0xaf, 0x1a, 0x05, 0x1a, 0xef, 0xb5, 0x19, 0x01, 0x22, 0x12}},
367 {0x1486, 64, { 0x11, 0xa6, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75, 0x1b, 0xff, 0xf5, 0x1c, 0x89, 0x1d,
368 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x22, 0x90, 0x78, 0x41, 0xe5, 0x11, 0xf0, 0xe5,
369 0x2c, 0x90, 0x78, 0x4f, 0xf0, 0xae, 0x2c, 0xe5, 0x2d, 0x90, 0x78, 0x50, 0xf0, 0x90, 0x78, 0x51,
370 0x74, 0xc0, 0xf0, 0xe4, 0x90, 0x78, 0x52, 0xf0, 0x90, 0x78, 0x54, 0xe5, 0x23, 0xf0, 0x90}},
371 {0x14c6, 64, { 0x78, 0x57, 0x74, 0x04, 0xf0, 0xe4, 0x90, 0x78, 0x55, 0xf0, 0x90, 0x78, 0x55, 0xe0, 0x60, 0xfa, 0x22,
372 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60, 0x0f, 0x14,
373 0x60, 0x13, 0x14, 0x60, 0x17, 0x80, 0x00, 0x90, 0x7f, 0xc7, 0xef, 0xf0, 0x80, 0x13, 0x90, 0x7f,
374 0xc9, 0xef, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xcb, 0xef, 0xf0, 0x80, 0x05, 0x90, 0x7f, 0xcd}},
375 {0x1506, 64, { 0xef, 0xf0, 0xe5, 0x16, 0x42, 0x2a, 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5,
376 0x83, 0xe0, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x13, 0x14, 0x60, 0x17, 0x80, 0x00, 0x90, 0x7f, 0xb7,
377 0xef, 0xf0, 0x80, 0x13, 0x90, 0x7f, 0xb9, 0xef, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xbb, 0xef, 0xf0,
378 0x80, 0x05, 0x90, 0x7f, 0xbd, 0xef, 0xf0, 0xe5, 0x16, 0x42, 0x2a, 0x22, 0xae, 0x07, 0xe4}},
379 {0x1546, 64, { 0xff, 0xe5, 0x15, 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0xfd, 0x12,
380 0x16, 0x6b, 0x90, 0x78, 0x41, 0x74, 0xf1, 0xf0, 0x90, 0xc0, 0x00, 0xee, 0xf0, 0xe4, 0xe5, 0x15,
381 0x24, 0x32, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x44, 0x80, 0xfd, 0x12, 0x16, 0x6b,
382 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86}},
383 {0x1586, 64, { 0x75, 0x86, 0x00, 0xc0, 0xd0, 0x75, 0xd0, 0x08, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0,
384 0x12, 0x13, 0x0d, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0,
385 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
386 0x90, 0x78, 0x41, 0x74, 0xf1, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74}},
387 {0x15c6, 64, { 0xf3, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90,
388 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
389 0x90, 0x78, 0x41, 0x74, 0xf2, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3,
390 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f}},
391 {0x1606, 64, { 0x90, 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf, 0xf0,
392 0x90, 0x78, 0x41, 0x74, 0xf4, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3,
393 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90,
394 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0x90, 0xc0, 0x00, 0x74, 0xbf}},
395 {0x1646, 64, { 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf6, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf3,
396 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90,
397 0xc0, 0x00, 0xf0, 0x22, 0x90, 0x78, 0x41, 0x74, 0xf3, 0xf0, 0xe5, 0x15, 0x24, 0x37, 0xf5, 0x82,
398 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x54, 0x7f, 0x90, 0xc0, 0x00, 0xf0, 0x90, 0x78, 0x41}},
399 {0x1686, 64, { 0x74, 0xf7, 0xf0, 0x90, 0xc0, 0x00, 0xef, 0xf0, 0x90, 0x78, 0x41, 0x74, 0xf5, 0xf0, 0x90, 0xc0, 0x00,
400 0xed, 0xf0, 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14,
401 0x60, 0x0e, 0x14, 0x60, 0x11, 0x14, 0x60, 0x14, 0x80, 0x00, 0x90, 0x7f, 0xc6, 0xe0, 0xff, 0x22,
402 0x90, 0x7f, 0xc8, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xca, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xcc}},
403 {0x16c6, 64, { 0xe0, 0xff, 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60,
404 0x0e, 0x14, 0x60, 0x11, 0x14, 0x60, 0x14, 0x80, 0x00, 0x90, 0x7f, 0xb6, 0xe0, 0xff, 0x22, 0x90,
405 0x7f, 0xb8, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xba, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xbc, 0xe0, 0xff,
406 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0, 0x14, 0x60}},
407 {0x1706, 64, { 0x0e, 0x14, 0x60, 0x11, 0x14, 0x60, 0x14, 0x80, 0x00, 0x90, 0x7f, 0xc7, 0xe0, 0xff, 0x22, 0x90, 0x7f,
408 0xc9, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xcb, 0xe0, 0xff, 0x22, 0x90, 0x7f, 0xcd, 0xe0, 0xff, 0x22,
409 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0x90,
410 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86}},
411 {0x1746, 64, { 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x7b, 0x41, 0xe0, 0xf5, 0x36,
412 0x43, 0x13, 0x10, 0xa3, 0xe0, 0x60, 0x09, 0x90, 0x7f, 0xd7, 0x74, 0x17, 0xf0, 0x74, 0x37, 0xf0,
413 0x90, 0x7b, 0x43, 0xe0, 0xf5, 0x37, 0xa3, 0xe0, 0x54, 0xf0, 0xf5, 0x29, 0xe0, 0x60, 0x02, 0xd2,
414 0x0a, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75}},
415 {0x1786, 64, { 0x86, 0x00, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0xd0, 0x86, 0xd0, 0x84,
416 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0,
417 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xd2, 0x08, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab,
418 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0}},
419 {0x17c6, 64, { 0x32, 0x12, 0x18, 0xb7, 0xae, 0x07, 0x12, 0x18, 0xb7, 0xad, 0x07, 0xee, 0x6d, 0x60, 0x10, 0x12, 0x18,
420 0xb7, 0xae, 0x07, 0xee, 0x6d, 0x60, 0x07, 0x12, 0x18, 0xb7, 0xad, 0x07, 0x80, 0xec, 0xaf, 0x06,
421 0x22, 0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70,
422 0xf9, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x87, 0x01, 0x00, 0x00, 0x00}},
423 {0x1806, 64, { 0x00, 0x00, 0x22, 0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x04, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x0b, 0x04,
424 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x18, 0x60, 0x90, 0x7f, 0xd6, 0xe0, 0x54,
425 0xf7, 0xf0, 0x22, 0x12, 0x13, 0x77, 0x12, 0x17, 0xf9, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x0a,
426 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x18, 0x60, 0x12, 0x18, 0x93, 0x12, 0x0a, 0xce, 0x22, 0x03}},
427 {0x1846, 64, { 0x35, 0x80, 0x00, 0x00, 0x03, 0x2e, 0x81, 0x00, 0x00, 0xc1, 0x85, 0xc1, 0x81, 0xc1, 0x08, 0xc1, 0x00,
428 0xc1, 0x06, 0x01, 0x22, 0x00, 0x01, 0x24, 0x00, 0x00, 0x8e, 0x17, 0x8f, 0x18, 0xe5, 0x18, 0x15,
429 0x18, 0xae, 0x17, 0x70, 0x02, 0x15, 0x17, 0x4e, 0x60, 0x08, 0x12, 0x17, 0xe8, 0x12, 0x17, 0xe8,
430 0x80, 0xeb, 0x22, 0xe5, 0x15, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x14, 0xf5, 0x83, 0xe0}},
431 {0x1886, 64, { 0x04, 0xff, 0x44, 0x10, 0x90, 0x7f, 0xd7, 0xf0, 0xef, 0x44, 0x30, 0xf0, 0x22, 0x90, 0x7f, 0xd6, 0xe0,
432 0x44, 0x01, 0xf0, 0x7f, 0x0d, 0x7e, 0x00, 0x12, 0x18, 0x60, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe,
433 0xf0, 0x22, 0xe5, 0x11, 0x24, 0x02, 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22,
434 0xe5, 0x11, 0x24, 0x03, 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0xe5}},
435 {0x18c6, 64, { 0x11, 0x24, 0x04, 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0xe5, 0x11, 0x24, 0x05,
436 0x90, 0x78, 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0xe5, 0x11, 0x24, 0x06, 0x90, 0x78,
437 0x41, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0xff, 0x22, 0x90, 0x78, 0x41, 0xe5, 0x11, 0xf0, 0x90, 0xc0,
438 0x00, 0xe0, 0xff, 0x22, 0x53, 0xd8, 0xef, 0x32, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, 0xff}},
439 {0x1906, 64, { 0xff, 0x40, 0xcd, 0x06, 0x2a, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x04, 0x09, 0x02, 0x74, 0x00, 0x01,
440 0x01, 0x00, 0xa0, 0x32, 0x09, 0x04, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x07, 0x05, 0x01,
441 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40,
442 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x05, 0x02, 0x40, 0x00}},
443 {0x1946, 64, { 0x00, 0x07, 0x05, 0x06, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05,
444 0x81, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x83, 0x02,
445 0x40, 0x00, 0x01, 0x07, 0x05, 0x84, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x85, 0x02, 0x40, 0x00,
446 0x01, 0x07, 0x05, 0x86, 0x02, 0x40, 0x00, 0x01, 0x07, 0x05, 0x87, 0x02, 0x40, 0x00, 0x01}},
447 {0x1986, 64, { 0x04, 0x03, 0x09, 0x04, 0x48, 0x03, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61,
448 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x76,
449 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66,
450 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x53, 0x00, 0x79, 0x00}},
451 {0x19c6, 64, { 0x73, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x24, 0x03, 0x4b, 0x00, 0x65,
452 0x00, 0x79, 0x00, 0x73, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53,
453 0x00, 0x41, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x39, 0x00, 0x57, 0x00, 0x4c, 0x00, 0x43, 0x00, 0x22,
454 0x03, 0x55, 0x00, 0x53, 0x00, 0x41, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x35, 0x00, 0x20, 0x00}},
455 {0x1a06, 64, { 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x33, 0x00, 0x31,
456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
459 {0x1a46, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
463 {0x1a86, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
467 {0x1ac6, 64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x17, 0x79, 0x00, 0x02, 0x1b}},
471 {0x1b06, 21, { 0x04, 0x00, 0x02, 0x17, 0x27, 0x00, 0x02, 0x17, 0xa0, 0x00, 0x02, 0x1b, 0x10, 0x00, 0x02, 0x1b, 0x14,
472 0x00, 0x02, 0x15, 0x78}},
473 {0xffff, 0, { 0x00}},
474};
475
476
diff --git a/drivers/usb/serial/keyspan_usa90msg.h b/drivers/usb/serial/keyspan_usa90msg.h
new file mode 100644
index 000000000000..dd935b62c1a8
--- /dev/null
+++ b/drivers/usb/serial/keyspan_usa90msg.h
@@ -0,0 +1,198 @@
1/*
2 usa90msg.h
3
4 Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved
5 This file is available under a BSD-style copyright
6
7 Keyspan USB Async Message Formats for the USA19HS
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are
11 met:
12
13 1. Redistributions of source code must retain this licence text
14 without modification, this list of conditions, and the following
15 disclaimer. The following copyright notice must appear immediately at
16 the beginning of all source files:
17
18 Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved
19
20 This file is available under a BSD-style copyright
21
22 2. The name of InnoSys Incorprated may not be used to endorse or promote
23 products derived from this software without specific prior written
24 permission.
25
26 THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR
27 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
29 NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
30 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 SUCH DAMAGE.
37
38 Revisions:
39
40 2003feb14 add setTxMode/txMode and cancelRxXoff to portControl
41 2003mar21 change name of PARITY_0/1 to add MARK/SPACE
42*/
43
44#ifndef __USA90MSG__
45#define __USA90MSG__
46
47struct keyspan_usa90_portControlMessage
48{
49 /*
50 there are three types of "commands" sent in the control message:
51
52 1. configuration changes which must be requested by setting
53 the corresponding "set" flag (and should only be requested
54 when necessary, to reduce overhead on the device):
55 */
56
57 u8 setClocking, // host requests baud rate be set
58 baudLo, // host does baud divisor calculation
59 baudHi, // host does baud divisor calculation
60
61 setLcr, // host requests lcr be set
62 lcr, // use PARITY, STOPBITS, DATABITS below
63
64 setRxMode, // set receive mode
65 rxMode, // RXMODE_DMA or RXMODE_BYHAND
66
67 setTxMode, // set transmit mode
68 txMode, // TXMODE_DMA or TXMODE_BYHAND
69
70 setTxFlowControl, // host requests tx flow control be set
71 txFlowControl , // use TX_FLOW... bits below
72 setRxFlowControl, // host requests rx flow control be set
73 rxFlowControl, // use RX_FLOW... bits below
74 sendXoff, // host requests XOFF transmitted immediately
75 sendXon, // host requests XON char transmitted
76 xonChar, // specified in current character format
77 xoffChar, // specified in current character format
78
79 sendChar, // host requests char transmitted immediately
80 txChar, // character to send
81
82 setRts, // host requests RTS output be set
83 rts, // 1=on, 0=off
84 setDtr, // host requests DTR output be set
85 dtr; // 1=on, 0=off
86
87
88 /*
89 2. configuration data which is simply used as is
90 and must be specified correctly in every host message.
91 */
92
93 u8 rxForwardingLength, // forward when this number of chars available
94 rxForwardingTimeout, // (1-31 in ms)
95 txAckSetting; // 0=don't ack, 1=normal, 2-255 TBD...
96 /*
97 3. Firmware states which cause actions if they change
98 and must be specified correctly in every host message.
99 */
100
101 u8 portEnabled, // 0=disabled, 1=enabled
102 txFlush, // 0=normal, 1=toss outbound data
103 txBreak, // 0=break off, 1=break on
104 loopbackMode; // 0=no loopback, 1=loopback enabled
105
106 /*
107 4. commands which are flags only; these are processed in order
108 (so that, e.g., if rxFlush and rxForward flags are set, the
109 port will have no data to forward); any non-zero value
110 is respected
111 */
112
113 u8 rxFlush, // toss inbound data
114 rxForward, // forward all inbound data, NOW (as if fwdLen==1)
115 cancelRxXoff, // cancel any receive XOFF state (_txXoff)
116 returnStatus; // return current status NOW
117};
118
119// defines for bits in lcr
120#define USA_DATABITS_5 0x00
121#define USA_DATABITS_6 0x01
122#define USA_DATABITS_7 0x02
123#define USA_DATABITS_8 0x03
124#define STOPBITS_5678_1 0x00 // 1 stop bit for all byte sizes
125#define STOPBITS_5_1p5 0x04 // 1.5 stop bits for 5-bit byte
126#define STOPBITS_678_2 0x04 // 2 stop bits for 6-8 bit byte
127#define USA_PARITY_NONE 0x00
128#define USA_PARITY_ODD 0x08
129#define USA_PARITY_EVEN 0x18
130#define PARITY_MARK_1 0x28 // force parity MARK
131#define PARITY_SPACE_0 0x38 // force parity SPACE
132
133#define TXFLOW_CTS 0x04
134#define TXFLOW_DSR 0x08
135#define TXFLOW_XOFF 0x01
136#define TXFLOW_XOFF_ANY 0x02
137#define TXFLOW_XOFF_BITS (TXFLOW_XOFF | TXFLOW_XOFF_ANY)
138
139#define RXFLOW_XOFF 0x10
140#define RXFLOW_RTS 0x20
141#define RXFLOW_DTR 0x40
142#define RXFLOW_DSR_SENSITIVITY 0x80
143
144#define RXMODE_BYHAND 0x00
145#define RXMODE_DMA 0x02
146
147#define TXMODE_BYHAND 0x00
148#define TXMODE_DMA 0x02
149
150
151// all things called "StatusMessage" are sent on the status endpoint
152
153struct keyspan_usa90_portStatusMessage
154{
155 u8 msr, // reports the actual MSR register
156 cts, // reports CTS pin
157 dcd, // reports DCD pin
158 dsr, // reports DSR pin
159 ri, // reports RI pin
160 _txXoff, // port is in XOFF state (we received XOFF)
161 rxBreak, // reports break state
162 rxOverrun, // count of overrun errors (since last reported)
163 rxParity, // count of parity errors (since last reported)
164 rxFrame, // count of frame errors (since last reported)
165 portState, // PORTSTATE_xxx bits (useful for debugging)
166 messageAck, // message acknowledgement
167 charAck, // character acknowledgement
168 controlResponse; // (value = returnStatus) a control message has been processed
169};
170
171// bits in RX data message when STAT byte is included
172
173#define RXERROR_OVERRUN 0x02
174#define RXERROR_PARITY 0x04
175#define RXERROR_FRAMING 0x08
176#define RXERROR_BREAK 0x10
177
178#define PORTSTATE_ENABLED 0x80
179#define PORTSTATE_TXFLUSH 0x01
180#define PORTSTATE_TXBREAK 0x02
181#define PORTSTATE_LOOPBACK 0x04
182
183// MSR bits
184
185#define USA_MSR_dCTS 0x01 // CTS has changed since last report
186#define USA_MSR_dDSR 0x02
187#define USA_MSR_dRI 0x04
188#define USA_MSR_dDCD 0x08
189
190#define USA_MSR_CTS 0x10 // current state of CTS
191#define USA_MSR_DSR 0x20
192#define USA_USA_MSR_RI 0x40
193#define MSR_DCD 0x80
194
195// ie: the maximum length of an endpoint buffer
196#define MAX_DATA_LEN 64
197
198#endif
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
new file mode 100644
index 000000000000..49c602a0b4df
--- /dev/null
+++ b/drivers/usb/serial/kl5kusb105.c
@@ -0,0 +1,1034 @@
1/*
2 * KLSI KL5KUSB105 chip RS232 converter driver
3 *
4 * Copyright (C) 2001 Utz-Uwe Haus <haus@uuhaus.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * All information about the device was acquired using SniffUSB ans snoopUSB
12 * on Windows98.
13 * It was written out of frustration with the PalmConnect USB Serial adapter
14 * sold by Palm Inc.
15 * Neither Palm, nor their contractor (MCCI) or their supplier (KLSI) provided
16 * information that was not already available.
17 *
18 * It seems that KLSI bought some silicon-design information from ScanLogic,
19 * whose SL11R processor is at the core of the KL5KUSB chipset from KLSI.
20 * KLSI has firmware available for their devices; it is probable that the
21 * firmware differs from that used by KLSI in their products. If you have an
22 * original KLSI device and can provide some information on it, I would be
23 * most interested in adding support for it here. If you have any information
24 * on the protocol used (or find errors in my reverse-engineered stuff), please
25 * let me know.
26 *
27 * The code was only tested with a PalmConnect USB adapter; if you
28 * are adventurous, try it with any KLSI-based device and let me know how it
29 * breaks so that I can fix it!
30 */
31
32/* TODO:
33 * check modem line signals
34 * implement handshaking or decide that we do not support it
35 */
36
37/* History:
38 * 0.3a - implemented pools of write URBs
39 * 0.3 - alpha version for public testing
40 * 0.2 - TIOCMGET works, so autopilot(1) can be used!
41 * 0.1 - can be used to to pilot-xfer -p /dev/ttyUSB0 -l
42 *
43 * The driver skeleton is mainly based on mct_u232.c and various other
44 * pieces of code shamelessly copied from the drivers/usb/serial/ directory.
45 */
46
47
48#include <linux/config.h>
49#include <linux/kernel.h>
50#include <linux/errno.h>
51#include <linux/init.h>
52#include <linux/slab.h>
53#include <linux/tty.h>
54#include <linux/tty_driver.h>
55#include <linux/tty_flip.h>
56#include <linux/module.h>
57#include <asm/uaccess.h>
58#include <linux/usb.h>
59#include "usb-serial.h"
60#include "kl5kusb105.h"
61
62static int debug;
63
64/*
65 * Version Information
66 */
67#define DRIVER_VERSION "v0.3a"
68#define DRIVER_AUTHOR "Utz-Uwe Haus <haus@uuhaus.de>"
69#define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver"
70
71
72/*
73 * Function prototypes
74 */
75static int klsi_105_startup (struct usb_serial *serial);
76static void klsi_105_shutdown (struct usb_serial *serial);
77static int klsi_105_open (struct usb_serial_port *port,
78 struct file *filp);
79static void klsi_105_close (struct usb_serial_port *port,
80 struct file *filp);
81static int klsi_105_write (struct usb_serial_port *port,
82 const unsigned char *buf,
83 int count);
84static void klsi_105_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
85static int klsi_105_chars_in_buffer (struct usb_serial_port *port);
86static int klsi_105_write_room (struct usb_serial_port *port);
87
88static void klsi_105_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
89static void klsi_105_set_termios (struct usb_serial_port *port,
90 struct termios * old);
91static int klsi_105_ioctl (struct usb_serial_port *port,
92 struct file * file,
93 unsigned int cmd,
94 unsigned long arg);
95static void klsi_105_throttle (struct usb_serial_port *port);
96static void klsi_105_unthrottle (struct usb_serial_port *port);
97/*
98static void klsi_105_break_ctl (struct usb_serial_port *port,
99 int break_state );
100 */
101static int klsi_105_tiocmget (struct usb_serial_port *port,
102 struct file *file);
103static int klsi_105_tiocmset (struct usb_serial_port *port,
104 struct file *file, unsigned int set,
105 unsigned int clear);
106
107/*
108 * All of the device info needed for the KLSI converters.
109 */
110static struct usb_device_id id_table [] = {
111 { USB_DEVICE(PALMCONNECT_VID, PALMCONNECT_PID) },
112 { USB_DEVICE(KLSI_VID, KLSI_KL5KUSB105D_PID) },
113 { } /* Terminating entry */
114};
115
116MODULE_DEVICE_TABLE (usb, id_table);
117
118static struct usb_driver kl5kusb105d_driver = {
119 .owner = THIS_MODULE,
120 .name = "kl5kusb105d",
121 .probe = usb_serial_probe,
122 .disconnect = usb_serial_disconnect,
123 .id_table = id_table,
124};
125
126static struct usb_serial_device_type kl5kusb105d_device = {
127 .owner = THIS_MODULE,
128 .name = "KL5KUSB105D / PalmConnect",
129 .short_name = "kl5kusb105d",
130 .id_table = id_table,
131 .num_interrupt_in = 1,
132 .num_bulk_in = 1,
133 .num_bulk_out = 1,
134 .num_ports = 1,
135 .open = klsi_105_open,
136 .close = klsi_105_close,
137 .write = klsi_105_write,
138 .write_bulk_callback = klsi_105_write_bulk_callback,
139 .chars_in_buffer = klsi_105_chars_in_buffer,
140 .write_room = klsi_105_write_room,
141 .read_bulk_callback =klsi_105_read_bulk_callback,
142 .ioctl = klsi_105_ioctl,
143 .set_termios = klsi_105_set_termios,
144 /*.break_ctl = klsi_105_break_ctl,*/
145 .tiocmget = klsi_105_tiocmget,
146 .tiocmset = klsi_105_tiocmset,
147 .attach = klsi_105_startup,
148 .shutdown = klsi_105_shutdown,
149 .throttle = klsi_105_throttle,
150 .unthrottle = klsi_105_unthrottle,
151};
152
153struct klsi_105_port_settings {
154 __u8 pktlen; /* always 5, it seems */
155 __u8 baudrate;
156 __u8 databits;
157 __u8 unknown1;
158 __u8 unknown2;
159} __attribute__ ((packed));
160
161/* we implement a pool of NUM_URBS urbs per usb_serial */
162#define NUM_URBS 1
163#define URB_TRANSFER_BUFFER_SIZE 64
164struct klsi_105_private {
165 struct klsi_105_port_settings cfg;
166 struct termios termios;
167 unsigned long line_state; /* modem line settings */
168 /* write pool */
169 struct urb * write_urb_pool[NUM_URBS];
170 spinlock_t lock;
171 unsigned long bytes_in;
172 unsigned long bytes_out;
173};
174
175
176/*
177 * Handle vendor specific USB requests
178 */
179
180
181#define KLSI_TIMEOUT 5000 /* default urb timeout */
182
183static int klsi_105_chg_port_settings(struct usb_serial_port *port,
184 struct klsi_105_port_settings *settings)
185{
186 int rc;
187
188 rc = usb_control_msg(port->serial->dev,
189 usb_sndctrlpipe(port->serial->dev, 0),
190 KL5KUSB105A_SIO_SET_DATA,
191 USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_INTERFACE,
192 0, /* value */
193 0, /* index */
194 settings,
195 sizeof(struct klsi_105_port_settings),
196 KLSI_TIMEOUT);
197 if (rc < 0)
198 err("Change port settings failed (error = %d)", rc);
199 info("%s - %d byte block, baudrate %x, databits %d, u1 %d, u2 %d",
200 __FUNCTION__,
201 settings->pktlen,
202 settings->baudrate, settings->databits,
203 settings->unknown1, settings->unknown2);
204 return rc;
205} /* klsi_105_chg_port_settings */
206
207/* translate a 16-bit status value from the device to linux's TIO bits */
208static unsigned long klsi_105_status2linestate(const __u16 status)
209{
210 unsigned long res = 0;
211
212 res = ((status & KL5KUSB105A_DSR) ? TIOCM_DSR : 0)
213 | ((status & KL5KUSB105A_CTS) ? TIOCM_CTS : 0)
214 ;
215
216 return res;
217}
218/*
219 * Read line control via vendor command and return result through
220 * *line_state_p
221 */
222/* It seems that the status buffer has always only 2 bytes length */
223#define KLSI_STATUSBUF_LEN 2
224static int klsi_105_get_line_state(struct usb_serial_port *port,
225 unsigned long *line_state_p)
226{
227 int rc;
228 __u8 status_buf[KLSI_STATUSBUF_LEN] = { -1,-1};
229 __u16 status;
230
231 info("%s - sending SIO Poll request", __FUNCTION__);
232 rc = usb_control_msg(port->serial->dev,
233 usb_rcvctrlpipe(port->serial->dev, 0),
234 KL5KUSB105A_SIO_POLL,
235 USB_TYPE_VENDOR | USB_DIR_IN,
236 0, /* value */
237 0, /* index */
238 status_buf, KLSI_STATUSBUF_LEN,
239 10000
240 );
241 if (rc < 0)
242 err("Reading line status failed (error = %d)", rc);
243 else {
244 status = status_buf[0] + (status_buf[1]<<8);
245
246 info("%s - read status %x %x", __FUNCTION__,
247 status_buf[0], status_buf[1]);
248
249 *line_state_p = klsi_105_status2linestate(status);
250 }
251
252 return rc;
253}
254
255
256/*
257 * Driver's tty interface functions
258 */
259
260static int klsi_105_startup (struct usb_serial *serial)
261{
262 struct klsi_105_private *priv;
263 int i;
264
265 /* check if we support the product id (see keyspan.c)
266 * FIXME
267 */
268
269 /* allocate the private data structure */
270 for (i=0; i<serial->num_ports; i++) {
271 int j;
272 priv = kmalloc(sizeof(struct klsi_105_private),
273 GFP_KERNEL);
274 if (!priv) {
275 dbg("%skmalloc for klsi_105_private failed.", __FUNCTION__);
276 return -ENOMEM;
277 }
278 /* set initial values for control structures */
279 priv->cfg.pktlen = 5;
280 priv->cfg.baudrate = kl5kusb105a_sio_b9600;
281 priv->cfg.databits = kl5kusb105a_dtb_8;
282 priv->cfg.unknown1 = 0;
283 priv->cfg.unknown2 = 1;
284
285 priv->line_state = 0;
286
287 priv->bytes_in = 0;
288 priv->bytes_out = 0;
289 usb_set_serial_port_data(serial->port[i], priv);
290
291 spin_lock_init (&priv->lock);
292 for (j=0; j<NUM_URBS; j++) {
293 struct urb* urb = usb_alloc_urb(0, GFP_KERNEL);
294
295 priv->write_urb_pool[j] = urb;
296 if (urb == NULL) {
297 err("No more urbs???");
298 continue;
299 }
300
301 urb->transfer_buffer = NULL;
302 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE,
303 GFP_KERNEL);
304 if (!urb->transfer_buffer) {
305 err("%s - out of memory for urb buffers.", __FUNCTION__);
306 continue;
307 }
308 }
309
310 /* priv->termios is left uninitalized until port opening */
311 init_waitqueue_head(&serial->port[i]->write_wait);
312 }
313
314 return (0);
315} /* klsi_105_startup */
316
317
318static void klsi_105_shutdown (struct usb_serial *serial)
319{
320 int i;
321
322 dbg("%s", __FUNCTION__);
323
324 /* stop reads and writes on all ports */
325 for (i=0; i < serial->num_ports; ++i) {
326 struct klsi_105_private *priv = usb_get_serial_port_data(serial->port[i]);
327 unsigned long flags;
328
329 if (priv) {
330 /* kill our write urb pool */
331 int j;
332 struct urb **write_urbs = priv->write_urb_pool;
333 spin_lock_irqsave(&priv->lock,flags);
334
335 for (j = 0; j < NUM_URBS; j++) {
336 if (write_urbs[j]) {
337 /* FIXME - uncomment the following
338 * usb_kill_urb call when the host
339 * controllers get fixed to set
340 * urb->dev = NULL after the urb is
341 * finished. Otherwise this call
342 * oopses. */
343 /* usb_kill_urb(write_urbs[j]); */
344 if (write_urbs[j]->transfer_buffer)
345 kfree(write_urbs[j]->transfer_buffer);
346 usb_free_urb (write_urbs[j]);
347 }
348 }
349
350 spin_unlock_irqrestore (&priv->lock, flags);
351
352 kfree(priv);
353 usb_set_serial_port_data(serial->port[i], NULL);
354 }
355 }
356} /* klsi_105_shutdown */
357
358static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
359{
360 struct klsi_105_private *priv = usb_get_serial_port_data(port);
361 int retval = 0;
362 int rc;
363 int i;
364 unsigned long line_state;
365 struct klsi_105_port_settings cfg;
366 unsigned long flags;
367
368 dbg("%s port %d", __FUNCTION__, port->number);
369
370 /* force low_latency on so that our tty_push actually forces
371 * the data through
372 * port->tty->low_latency = 1; */
373
374 /* Do a defined restart:
375 * Set up sane default baud rate and send the 'READ_ON'
376 * vendor command.
377 * FIXME: set modem line control (how?)
378 * Then read the modem line control and store values in
379 * priv->line_state.
380 */
381 cfg.pktlen = 5;
382 cfg.baudrate = kl5kusb105a_sio_b9600;
383 cfg.databits = kl5kusb105a_dtb_8;
384 cfg.unknown1 = 0;
385 cfg.unknown2 = 1;
386 klsi_105_chg_port_settings(port, &cfg);
387
388 /* set up termios structure */
389 spin_lock_irqsave (&priv->lock, flags);
390 priv->termios.c_iflag = port->tty->termios->c_iflag;
391 priv->termios.c_oflag = port->tty->termios->c_oflag;
392 priv->termios.c_cflag = port->tty->termios->c_cflag;
393 priv->termios.c_lflag = port->tty->termios->c_lflag;
394 for (i=0; i<NCCS; i++)
395 priv->termios.c_cc[i] = port->tty->termios->c_cc[i];
396 priv->cfg.pktlen = cfg.pktlen;
397 priv->cfg.baudrate = cfg.baudrate;
398 priv->cfg.databits = cfg.databits;
399 priv->cfg.unknown1 = cfg.unknown1;
400 priv->cfg.unknown2 = cfg.unknown2;
401 spin_unlock_irqrestore (&priv->lock, flags);
402
403 /* READ_ON and urb submission */
404 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
405 usb_rcvbulkpipe(port->serial->dev,
406 port->bulk_in_endpointAddress),
407 port->read_urb->transfer_buffer,
408 port->read_urb->transfer_buffer_length,
409 klsi_105_read_bulk_callback,
410 port);
411
412 rc = usb_submit_urb(port->read_urb, GFP_KERNEL);
413 if (rc) {
414 err("%s - failed submitting read urb, error %d", __FUNCTION__, rc);
415 retval = rc;
416 goto exit;
417 }
418
419 rc = usb_control_msg(port->serial->dev,
420 usb_sndctrlpipe(port->serial->dev,0),
421 KL5KUSB105A_SIO_CONFIGURE,
422 USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE,
423 KL5KUSB105A_SIO_CONFIGURE_READ_ON,
424 0, /* index */
425 NULL,
426 0,
427 KLSI_TIMEOUT);
428 if (rc < 0) {
429 err("Enabling read failed (error = %d)", rc);
430 retval = rc;
431 } else
432 dbg("%s - enabled reading", __FUNCTION__);
433
434 rc = klsi_105_get_line_state(port, &line_state);
435 if (rc >= 0) {
436 spin_lock_irqsave (&priv->lock, flags);
437 priv->line_state = line_state;
438 spin_unlock_irqrestore (&priv->lock, flags);
439 dbg("%s - read line state 0x%lx", __FUNCTION__, line_state);
440 retval = 0;
441 } else
442 retval = rc;
443
444exit:
445 return retval;
446} /* klsi_105_open */
447
448
449static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
450{
451 struct klsi_105_private *priv = usb_get_serial_port_data(port);
452 int rc;
453
454 dbg("%s port %d", __FUNCTION__, port->number);
455
456 /* send READ_OFF */
457 rc = usb_control_msg (port->serial->dev,
458 usb_sndctrlpipe(port->serial->dev, 0),
459 KL5KUSB105A_SIO_CONFIGURE,
460 USB_TYPE_VENDOR | USB_DIR_OUT,
461 KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
462 0, /* index */
463 NULL, 0,
464 KLSI_TIMEOUT);
465 if (rc < 0)
466 err("Disabling read failed (error = %d)", rc);
467
468 /* shutdown our bulk reads and writes */
469 usb_kill_urb(port->write_urb);
470 usb_kill_urb(port->read_urb);
471 /* unlink our write pool */
472 /* FIXME */
473 /* wgg - do I need this? I think so. */
474 usb_kill_urb(port->interrupt_in_urb);
475 info("kl5kusb105 port stats: %ld bytes in, %ld bytes out", priv->bytes_in, priv->bytes_out);
476} /* klsi_105_close */
477
478
479/* We need to write a complete 64-byte data block and encode the
480 * number actually sent in the first double-byte, LSB-order. That
481 * leaves at most 62 bytes of payload.
482 */
483#define KLSI_105_DATA_OFFSET 2 /* in the bulk urb data block */
484
485
486static int klsi_105_write (struct usb_serial_port *port,
487 const unsigned char *buf, int count)
488{
489 struct klsi_105_private *priv = usb_get_serial_port_data(port);
490 int result, size;
491 int bytes_sent=0;
492
493 dbg("%s - port %d", __FUNCTION__, port->number);
494
495 while (count > 0) {
496 /* try to find a free urb (write 0 bytes if none) */
497 struct urb *urb = NULL;
498 unsigned long flags;
499 int i;
500 /* since the pool is per-port we might not need the spin lock !? */
501 spin_lock_irqsave (&priv->lock, flags);
502 for (i=0; i<NUM_URBS; i++) {
503 if (priv->write_urb_pool[i]->status != -EINPROGRESS) {
504 urb = priv->write_urb_pool[i];
505 dbg("%s - using pool URB %d", __FUNCTION__, i);
506 break;
507 }
508 }
509 spin_unlock_irqrestore (&priv->lock, flags);
510
511 if (urb==NULL) {
512 dbg("%s - no more free urbs", __FUNCTION__);
513 goto exit;
514 }
515
516 if (urb->transfer_buffer == NULL) {
517 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
518 if (urb->transfer_buffer == NULL) {
519 err("%s - no more kernel memory...", __FUNCTION__);
520 goto exit;
521 }
522 }
523
524 size = min (count, port->bulk_out_size - KLSI_105_DATA_OFFSET);
525 size = min (size, URB_TRANSFER_BUFFER_SIZE - KLSI_105_DATA_OFFSET);
526
527 memcpy (urb->transfer_buffer + KLSI_105_DATA_OFFSET, buf, size);
528
529 /* write payload size into transfer buffer */
530 ((__u8 *)urb->transfer_buffer)[0] = (__u8) (size & 0xFF);
531 ((__u8 *)urb->transfer_buffer)[1] = (__u8) ((size & 0xFF00)>>8);
532
533 /* set up our urb */
534 usb_fill_bulk_urb(urb, port->serial->dev,
535 usb_sndbulkpipe(port->serial->dev,
536 port->bulk_out_endpointAddress),
537 urb->transfer_buffer,
538 URB_TRANSFER_BUFFER_SIZE,
539 klsi_105_write_bulk_callback,
540 port);
541
542 /* send the data out the bulk port */
543 result = usb_submit_urb(urb, GFP_ATOMIC);
544 if (result) {
545 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
546 goto exit;
547 }
548 buf += size;
549 bytes_sent += size;
550 count -= size;
551 }
552exit:
553 /* lockless, but it's for debug info only... */
554 priv->bytes_out+=bytes_sent;
555
556 return bytes_sent; /* that's how much we wrote */
557} /* klsi_105_write */
558
559static void klsi_105_write_bulk_callback ( struct urb *urb, struct pt_regs *regs)
560{
561 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
562
563 dbg("%s - port %d", __FUNCTION__, port->number);
564
565 if (urb->status) {
566 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__,
567 urb->status);
568 return;
569 }
570
571 /* from generic_write_bulk_callback */
572 schedule_work(&port->work);
573} /* klsi_105_write_bulk_completion_callback */
574
575
576/* return number of characters currently in the writing process */
577static int klsi_105_chars_in_buffer (struct usb_serial_port *port)
578{
579 int chars = 0;
580 int i;
581 unsigned long flags;
582 struct klsi_105_private *priv = usb_get_serial_port_data(port);
583
584 spin_lock_irqsave (&priv->lock, flags);
585
586 for (i = 0; i < NUM_URBS; ++i) {
587 if (priv->write_urb_pool[i]->status == -EINPROGRESS) {
588 chars += URB_TRANSFER_BUFFER_SIZE;
589 }
590 }
591
592 spin_unlock_irqrestore (&priv->lock, flags);
593
594 dbg("%s - returns %d", __FUNCTION__, chars);
595 return (chars);
596}
597
598static int klsi_105_write_room (struct usb_serial_port *port)
599{
600 unsigned long flags;
601 int i;
602 int room = 0;
603 struct klsi_105_private *priv = usb_get_serial_port_data(port);
604
605 spin_lock_irqsave (&priv->lock, flags);
606 for (i = 0; i < NUM_URBS; ++i) {
607 if (priv->write_urb_pool[i]->status != -EINPROGRESS) {
608 room += URB_TRANSFER_BUFFER_SIZE;
609 }
610 }
611
612 spin_unlock_irqrestore (&priv->lock, flags);
613
614 dbg("%s - returns %d", __FUNCTION__, room);
615 return (room);
616}
617
618
619
620static void klsi_105_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
621{
622 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
623 struct klsi_105_private *priv = usb_get_serial_port_data(port);
624 struct tty_struct *tty;
625 unsigned char *data = urb->transfer_buffer;
626 int rc;
627
628 dbg("%s - port %d", __FUNCTION__, port->number);
629
630 /* The urb might have been killed. */
631 if (urb->status) {
632 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__,
633 urb->status);
634 return;
635 }
636
637 /* The data received is again preceded by a length double-byte in LSB-
638 * first order (see klsi_105_write() )
639 */
640 if (urb->actual_length == 0) {
641 /* empty urbs seem to happen, we ignore them */
642 /* dbg("%s - emtpy URB", __FUNCTION__); */
643 ;
644 } else if (urb->actual_length <= 2) {
645 dbg("%s - size %d URB not understood", __FUNCTION__,
646 urb->actual_length);
647 usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
648 urb->actual_length, data);
649 } else {
650 int i;
651 int bytes_sent = ((__u8 *) data)[0] +
652 ((unsigned int) ((__u8 *) data)[1] << 8);
653 tty = port->tty;
654 /* we should immediately resubmit the URB, before attempting
655 * to pass the data on to the tty layer. But that needs locking
656 * against re-entry an then mixed-up data because of
657 * intermixed tty_flip_buffer_push()s
658 * FIXME
659 */
660 usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
661 urb->actual_length, data);
662
663 if (bytes_sent + 2 > urb->actual_length) {
664 dbg("%s - trying to read more data than available"
665 " (%d vs. %d)", __FUNCTION__,
666 bytes_sent+2, urb->actual_length);
667 /* cap at implied limit */
668 bytes_sent = urb->actual_length - 2;
669 }
670
671 for (i = 2; i < 2+bytes_sent; i++) {
672 /* if we insert more than TTY_FLIPBUF_SIZE characters,
673 * we drop them. */
674 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
675 tty_flip_buffer_push(tty);
676 }
677 /* this doesn't actually push the data through unless
678 * tty->low_latency is set */
679 tty_insert_flip_char(tty, ((__u8*) data)[i], 0);
680 }
681 tty_flip_buffer_push(tty);
682
683 /* again lockless, but debug info only */
684 priv->bytes_in += bytes_sent;
685 }
686 /* Continue trying to always read */
687 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
688 usb_rcvbulkpipe(port->serial->dev,
689 port->bulk_in_endpointAddress),
690 port->read_urb->transfer_buffer,
691 port->read_urb->transfer_buffer_length,
692 klsi_105_read_bulk_callback,
693 port);
694 rc = usb_submit_urb(port->read_urb, GFP_ATOMIC);
695 if (rc)
696 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, rc);
697} /* klsi_105_read_bulk_callback */
698
699
700static void klsi_105_set_termios (struct usb_serial_port *port,
701 struct termios *old_termios)
702{
703 struct klsi_105_private *priv = usb_get_serial_port_data(port);
704 unsigned int iflag = port->tty->termios->c_iflag;
705 unsigned int old_iflag = old_termios->c_iflag;
706 unsigned int cflag = port->tty->termios->c_cflag;
707 unsigned int old_cflag = old_termios->c_cflag;
708 struct klsi_105_port_settings cfg;
709 unsigned long flags;
710
711 /* lock while we are modifying the settings */
712 spin_lock_irqsave (&priv->lock, flags);
713
714 /*
715 * Update baud rate
716 */
717 if( (cflag & CBAUD) != (old_cflag & CBAUD) ) {
718 /* reassert DTR and (maybe) RTS on transition from B0 */
719 if( (old_cflag & CBAUD) == B0 ) {
720 dbg("%s: baud was B0", __FUNCTION__);
721#if 0
722 priv->control_state |= TIOCM_DTR;
723 /* don't set RTS if using hardware flow control */
724 if (!(old_cflag & CRTSCTS)) {
725 priv->control_state |= TIOCM_RTS;
726 }
727 mct_u232_set_modem_ctrl(serial, priv->control_state);
728#endif
729 }
730
731 switch(cflag & CBAUD) {
732 case B0: /* handled below */
733 break;
734 case B1200: priv->cfg.baudrate = kl5kusb105a_sio_b1200;
735 break;
736 case B2400: priv->cfg.baudrate = kl5kusb105a_sio_b2400;
737 break;
738 case B4800: priv->cfg.baudrate = kl5kusb105a_sio_b4800;
739 break;
740 case B9600: priv->cfg.baudrate = kl5kusb105a_sio_b9600;
741 break;
742 case B19200: priv->cfg.baudrate = kl5kusb105a_sio_b19200;
743 break;
744 case B38400: priv->cfg.baudrate = kl5kusb105a_sio_b38400;
745 break;
746 case B57600: priv->cfg.baudrate = kl5kusb105a_sio_b57600;
747 break;
748 case B115200: priv->cfg.baudrate = kl5kusb105a_sio_b115200;
749 break;
750 default:
751 err("KLSI USB->Serial converter:"
752 " unsupported baudrate request, using default"
753 " of 9600");
754 priv->cfg.baudrate = kl5kusb105a_sio_b9600;
755 break;
756 }
757 if ((cflag & CBAUD) == B0 ) {
758 dbg("%s: baud is B0", __FUNCTION__);
759 /* Drop RTS and DTR */
760 /* maybe this should be simulated by sending read
761 * disable and read enable messages?
762 */
763 ;
764#if 0
765 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
766 mct_u232_set_modem_ctrl(serial, priv->control_state);
767#endif
768 }
769 }
770
771 if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
772 /* set the number of data bits */
773 switch (cflag & CSIZE) {
774 case CS5:
775 dbg("%s - 5 bits/byte not supported", __FUNCTION__);
776 spin_unlock_irqrestore (&priv->lock, flags);
777 return ;
778 case CS6:
779 dbg("%s - 6 bits/byte not supported", __FUNCTION__);
780 spin_unlock_irqrestore (&priv->lock, flags);
781 return ;
782 case CS7:
783 priv->cfg.databits = kl5kusb105a_dtb_7;
784 break;
785 case CS8:
786 priv->cfg.databits = kl5kusb105a_dtb_8;
787 break;
788 default:
789 err("CSIZE was not CS5-CS8, using default of 8");
790 priv->cfg.databits = kl5kusb105a_dtb_8;
791 break;
792 }
793 }
794
795 /*
796 * Update line control register (LCR)
797 */
798 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
799 || (cflag & CSTOPB) != (old_cflag & CSTOPB) ) {
800
801#if 0
802 priv->last_lcr = 0;
803
804 /* set the parity */
805 if (cflag & PARENB)
806 priv->last_lcr |= (cflag & PARODD) ?
807 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN;
808 else
809 priv->last_lcr |= MCT_U232_PARITY_NONE;
810
811 /* set the number of stop bits */
812 priv->last_lcr |= (cflag & CSTOPB) ?
813 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
814
815 mct_u232_set_line_ctrl(serial, priv->last_lcr);
816#endif
817 ;
818 }
819
820 /*
821 * Set flow control: well, I do not really now how to handle DTR/RTS.
822 * Just do what we have seen with SniffUSB on Win98.
823 */
824 if( (iflag & IXOFF) != (old_iflag & IXOFF)
825 || (iflag & IXON) != (old_iflag & IXON)
826 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS) ) {
827
828 /* Drop DTR/RTS if no flow control otherwise assert */
829#if 0
830 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS) )
831 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
832 else
833 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
834 mct_u232_set_modem_ctrl(serial, priv->control_state);
835#endif
836 ;
837 }
838 memcpy (&cfg, &priv->cfg, sizeof(cfg));
839 spin_unlock_irqrestore (&priv->lock, flags);
840
841 /* now commit changes to device */
842 klsi_105_chg_port_settings(port, &cfg);
843} /* klsi_105_set_termios */
844
845
846#if 0
847static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state )
848{
849 struct usb_serial *serial = port->serial;
850 struct mct_u232_private *priv = (struct mct_u232_private *)port->private;
851 unsigned char lcr = priv->last_lcr;
852
853 dbg("%sstate=%d", __FUNCTION__, break_state);
854
855 if (break_state)
856 lcr |= MCT_U232_SET_BREAK;
857
858 mct_u232_set_line_ctrl(serial, lcr);
859} /* mct_u232_break_ctl */
860#endif
861
862static int klsi_105_tiocmget (struct usb_serial_port *port, struct file *file)
863{
864 struct klsi_105_private *priv = usb_get_serial_port_data(port);
865 unsigned long flags;
866 int rc;
867 unsigned long line_state;
868 dbg("%s - request, just guessing", __FUNCTION__);
869
870 rc = klsi_105_get_line_state(port, &line_state);
871 if (rc < 0) {
872 err("Reading line control failed (error = %d)", rc);
873 /* better return value? EAGAIN? */
874 return rc;
875 }
876
877 spin_lock_irqsave (&priv->lock, flags);
878 priv->line_state = line_state;
879 spin_unlock_irqrestore (&priv->lock, flags);
880 dbg("%s - read line state 0x%lx", __FUNCTION__, line_state);
881 return (int)line_state;
882}
883
884static int klsi_105_tiocmset (struct usb_serial_port *port, struct file *file,
885 unsigned int set, unsigned int clear)
886{
887 int retval = -EINVAL;
888
889 dbg("%s", __FUNCTION__);
890
891/* if this ever gets implemented, it should be done something like this:
892 struct usb_serial *serial = port->serial;
893 struct klsi_105_private *priv = usb_get_serial_port_data(port);
894 unsigned long flags;
895 int control;
896
897 spin_lock_irqsave (&priv->lock, flags);
898 if (set & TIOCM_RTS)
899 priv->control_state |= TIOCM_RTS;
900 if (set & TIOCM_DTR)
901 priv->control_state |= TIOCM_DTR;
902 if (clear & TIOCM_RTS)
903 priv->control_state &= ~TIOCM_RTS;
904 if (clear & TIOCM_DTR)
905 priv->control_state &= ~TIOCM_DTR;
906 control = priv->control_state;
907 spin_unlock_irqrestore (&priv->lock, flags);
908 retval = mct_u232_set_modem_ctrl(serial, control);
909*/
910 return retval;
911}
912
913static int klsi_105_ioctl (struct usb_serial_port *port, struct file * file,
914 unsigned int cmd, unsigned long arg)
915{
916 struct klsi_105_private *priv = usb_get_serial_port_data(port);
917 void __user *user_arg = (void __user *)arg;
918
919 dbg("%scmd=0x%x", __FUNCTION__, cmd);
920
921 /* Based on code from acm.c and others */
922 switch (cmd) {
923 case TIOCMIWAIT:
924 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
925 /* TODO */
926 dbg("%s - TIOCMIWAIT not handled", __FUNCTION__);
927 return -ENOIOCTLCMD;
928 case TIOCGICOUNT:
929 /* return count of modemline transitions */
930 /* TODO */
931 dbg("%s - TIOCGICOUNT not handled", __FUNCTION__);
932 return -ENOIOCTLCMD;
933 case TCGETS:
934 /* return current info to caller */
935 dbg("%s - TCGETS data faked/incomplete", __FUNCTION__);
936
937 if (!access_ok(VERIFY_WRITE, user_arg, sizeof(struct termios)))
938 return -EFAULT;
939
940 if (kernel_termios_to_user_termios((struct termios __user *)arg,
941 &priv->termios))
942 return -EFAULT;
943 return 0;
944 case TCSETS:
945 /* set port termios to the one given by the user */
946 dbg("%s - TCSETS not handled", __FUNCTION__);
947
948 if (!access_ok(VERIFY_READ, user_arg, sizeof(struct termios)))
949 return -EFAULT;
950
951 if (user_termios_to_kernel_termios(&priv->termios,
952 (struct termios __user *)arg))
953 return -EFAULT;
954 klsi_105_set_termios(port, &priv->termios);
955 return 0;
956 case TCSETSW: {
957 /* set port termios and try to wait for completion of last
958 * write operation */
959 /* We guess here. If there are not too many write urbs
960 * outstanding, we lie. */
961 /* what is the right way to wait here? schedule() ? */
962 /*
963 while (klsi_105_chars_in_buffer(port) > (NUM_URBS / 4 ) * URB_TRANSFER_BUFFER_SIZE)
964 schedule();
965 */
966 return -ENOIOCTLCMD;
967 }
968 default:
969 dbg("%s: arg not supported - 0x%04x", __FUNCTION__,cmd);
970 return(-ENOIOCTLCMD);
971 break;
972 }
973 return 0;
974} /* klsi_105_ioctl */
975
976static void klsi_105_throttle (struct usb_serial_port *port)
977{
978 dbg("%s - port %d", __FUNCTION__, port->number);
979 usb_kill_urb(port->read_urb);
980}
981
982static void klsi_105_unthrottle (struct usb_serial_port *port)
983{
984 int result;
985
986 dbg("%s - port %d", __FUNCTION__, port->number);
987
988 port->read_urb->dev = port->serial->dev;
989 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
990 if (result)
991 err("%s - failed submitting read urb, error %d", __FUNCTION__,
992 result);
993}
994
995
996
997static int __init klsi_105_init (void)
998{
999 int retval;
1000 retval = usb_serial_register(&kl5kusb105d_device);
1001 if (retval)
1002 goto failed_usb_serial_register;
1003 retval = usb_register(&kl5kusb105d_driver);
1004 if (retval)
1005 goto failed_usb_register;
1006
1007 info(DRIVER_DESC " " DRIVER_VERSION);
1008 return 0;
1009failed_usb_register:
1010 usb_serial_deregister(&kl5kusb105d_device);
1011failed_usb_serial_register:
1012 return retval;
1013}
1014
1015
1016static void __exit klsi_105_exit (void)
1017{
1018 usb_deregister (&kl5kusb105d_driver);
1019 usb_serial_deregister (&kl5kusb105d_device);
1020}
1021
1022
1023module_init (klsi_105_init);
1024module_exit (klsi_105_exit);
1025
1026MODULE_AUTHOR( DRIVER_AUTHOR );
1027MODULE_DESCRIPTION( DRIVER_DESC );
1028MODULE_LICENSE("GPL");
1029
1030
1031module_param(debug, bool, S_IRUGO | S_IWUSR);
1032MODULE_PARM_DESC(debug, "enable extensive debugging messages");
1033
1034/* vim: set sts=8 ts=8 sw=8: */
diff --git a/drivers/usb/serial/kl5kusb105.h b/drivers/usb/serial/kl5kusb105.h
new file mode 100644
index 000000000000..1231d9e78398
--- /dev/null
+++ b/drivers/usb/serial/kl5kusb105.h
@@ -0,0 +1,69 @@
1/*
2 * Definitions for the KLSI KL5KUSB105 serial port adapter
3 */
4
5/* vendor/product pairs that are known to contain this chipset */
6#define PALMCONNECT_VID 0x0830
7#define PALMCONNECT_PID 0x0080
8
9#define KLSI_VID 0x05e9
10#define KLSI_KL5KUSB105D_PID 0x00c0
11
12/* Vendor commands: */
13
14
15/* port table -- the chip supports up to 4 channels */
16
17/* baud rates */
18
19enum {
20 kl5kusb105a_sio_b115200 = 0,
21 kl5kusb105a_sio_b57600 = 1,
22 kl5kusb105a_sio_b38400 = 2,
23 kl5kusb105a_sio_b19200 = 4,
24 kl5kusb105a_sio_b14400 = 5,
25 kl5kusb105a_sio_b9600 = 6,
26 kl5kusb105a_sio_b4800 = 8, /* unchecked */
27 kl5kusb105a_sio_b2400 = 9, /* unchecked */
28 kl5kusb105a_sio_b1200 = 0xa, /* unchecked */
29 kl5kusb105a_sio_b600 = 0xb /* unchecked */
30};
31
32/* data bits */
33#define kl5kusb105a_dtb_7 7
34#define kl5kusb105a_dtb_8 8
35
36
37
38/* requests: */
39#define KL5KUSB105A_SIO_SET_DATA 1
40#define KL5KUSB105A_SIO_POLL 2
41#define KL5KUSB105A_SIO_CONFIGURE 3
42/* values used for request KL5KUSB105A_SIO_CONFIGURE */
43#define KL5KUSB105A_SIO_CONFIGURE_READ_ON 3
44#define KL5KUSB105A_SIO_CONFIGURE_READ_OFF 2
45
46/* Interpretation of modem status lines */
47/* These need sorting out by individually connecting pins and checking
48 * results. FIXME!
49 * When data is being sent we see 0x30 in the lower byte; this must
50 * contain DSR and CTS ...
51 */
52#define KL5KUSB105A_DSR ((1<<4) | (1<<5))
53#define KL5KUSB105A_CTS ((1<<5) | (1<<4))
54
55#define KL5KUSB105A_WANTS_TO_SEND 0x30
56//#define KL5KUSB105A_DTR /* Data Terminal Ready */
57//#define KL5KUSB105A_CTS /* Clear To Send */
58//#define KL5KUSB105A_CD /* Carrier Detect */
59//#define KL5KUSB105A_DSR /* Data Set Ready */
60//#define KL5KUSB105A_RxD /* Receive pin */
61
62//#define KL5KUSB105A_LE
63//#define KL5KUSB105A_RTS
64//#define KL5KUSB105A_ST
65//#define KL5KUSB105A_SR
66//#define KL5KUSB105A_RI /* Ring Indicator */
67
68/* vim: set ts=8 sts=8: */
69
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
new file mode 100644
index 000000000000..fe4c98a75171
--- /dev/null
+++ b/drivers/usb/serial/kobil_sct.c
@@ -0,0 +1,774 @@
1/*
2 * KOBIL USB Smart Card Terminal Driver
3 *
4 * Copyright (C) 2002 KOBIL Systems GmbH
5 * Author: Thomas Wahrenbruch
6 *
7 * Contact: linuxusb@kobil.de
8 *
9 * This program is largely derived from work by the linux-usb group
10 * and associated source files. Please see the usb/serial files for
11 * individual credits and copyrights.
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * Thanks to Greg Kroah-Hartman (greg@kroah.com) for his help and
19 * patience.
20 *
21 * Supported readers: USB TWIN, KAAN Standard Plus and SecOVID Reader Plus
22 * (Adapter K), B1 Professional and KAAN Professional (Adapter B)
23 *
24 * (21/05/2004) tw
25 * Fix bug with P'n'P readers
26 *
27 * (28/05/2003) tw
28 * Add support for KAAN SIM
29 *
30 * (12/09/2002) tw
31 * Adapted to 2.5.
32 *
33 * (11/08/2002) tw
34 * Initial version.
35 */
36
37
38#include <linux/config.h>
39#include <linux/kernel.h>
40#include <linux/errno.h>
41#include <linux/init.h>
42#include <linux/slab.h>
43#include <linux/tty.h>
44#include <linux/tty_driver.h>
45#include <linux/tty_flip.h>
46#include <linux/module.h>
47#include <linux/spinlock.h>
48#include <asm/uaccess.h>
49#include <linux/usb.h>
50#include <linux/ioctl.h>
51#include "usb-serial.h"
52#include "kobil_sct.h"
53
54static int debug;
55
56/* Version Information */
57#define DRIVER_VERSION "21/05/2004"
58#define DRIVER_AUTHOR "KOBIL Systems GmbH - http://www.kobil.com"
59#define DRIVER_DESC "KOBIL USB Smart Card Terminal Driver (experimental)"
60
61#define KOBIL_VENDOR_ID 0x0D46
62#define KOBIL_ADAPTER_B_PRODUCT_ID 0x2011
63#define KOBIL_ADAPTER_K_PRODUCT_ID 0x2012
64#define KOBIL_USBTWIN_PRODUCT_ID 0x0078
65#define KOBIL_KAAN_SIM_PRODUCT_ID 0x0081
66
67#define KOBIL_TIMEOUT 500
68#define KOBIL_BUF_LENGTH 300
69
70
71/* Function prototypes */
72static int kobil_startup (struct usb_serial *serial);
73static void kobil_shutdown (struct usb_serial *serial);
74static int kobil_open (struct usb_serial_port *port, struct file *filp);
75static void kobil_close (struct usb_serial_port *port, struct file *filp);
76static int kobil_write (struct usb_serial_port *port,
77 const unsigned char *buf, int count);
78static int kobil_write_room(struct usb_serial_port *port);
79static int kobil_ioctl(struct usb_serial_port *port, struct file *file,
80 unsigned int cmd, unsigned long arg);
81static int kobil_tiocmget(struct usb_serial_port *port, struct file *file);
82static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
83 unsigned int set, unsigned int clear);
84static void kobil_read_int_callback( struct urb *urb, struct pt_regs *regs );
85static void kobil_write_callback( struct urb *purb, struct pt_regs *regs );
86
87
88static struct usb_device_id id_table [] = {
89 { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_ADAPTER_B_PRODUCT_ID) },
90 { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_ADAPTER_K_PRODUCT_ID) },
91 { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_USBTWIN_PRODUCT_ID) },
92 { USB_DEVICE(KOBIL_VENDOR_ID, KOBIL_KAAN_SIM_PRODUCT_ID) },
93 { } /* Terminating entry */
94};
95
96
97MODULE_DEVICE_TABLE (usb, id_table);
98
99static struct usb_driver kobil_driver = {
100 .owner = THIS_MODULE,
101 .name = "kobil",
102 .probe = usb_serial_probe,
103 .disconnect = usb_serial_disconnect,
104 .id_table = id_table,
105};
106
107
108static struct usb_serial_device_type kobil_device = {
109 .owner = THIS_MODULE,
110 .name = "KOBIL USB smart card terminal",
111 .id_table = id_table,
112 .num_interrupt_in = NUM_DONT_CARE,
113 .num_bulk_in = 0,
114 .num_bulk_out = 0,
115 .num_ports = 1,
116 .attach = kobil_startup,
117 .shutdown = kobil_shutdown,
118 .ioctl = kobil_ioctl,
119 .tiocmget = kobil_tiocmget,
120 .tiocmset = kobil_tiocmset,
121 .open = kobil_open,
122 .close = kobil_close,
123 .write = kobil_write,
124 .write_room = kobil_write_room,
125 .read_int_callback = kobil_read_int_callback,
126};
127
128
129struct kobil_private {
130 int write_int_endpoint_address;
131 int read_int_endpoint_address;
132 unsigned char buf[KOBIL_BUF_LENGTH]; // buffer for the APDU to send
133 int filled; // index of the last char in buf
134 int cur_pos; // index of the next char to send in buf
135 __u16 device_type;
136 int line_state;
137 struct termios internal_termios;
138};
139
140
141static int kobil_startup (struct usb_serial *serial)
142{
143 int i;
144 struct kobil_private *priv;
145 struct usb_device *pdev;
146 struct usb_host_config *actconfig;
147 struct usb_interface *interface;
148 struct usb_host_interface *altsetting;
149 struct usb_host_endpoint *endpoint;
150
151 priv = kmalloc(sizeof(struct kobil_private), GFP_KERNEL);
152 if (!priv){
153 return -ENOMEM;
154 }
155
156 priv->filled = 0;
157 priv->cur_pos = 0;
158 priv->device_type = le16_to_cpu(serial->dev->descriptor.idProduct);
159 priv->line_state = 0;
160
161 switch (priv->device_type){
162 case KOBIL_ADAPTER_B_PRODUCT_ID:
163 printk(KERN_DEBUG "KOBIL B1 PRO / KAAN PRO detected\n");
164 break;
165 case KOBIL_ADAPTER_K_PRODUCT_ID:
166 printk(KERN_DEBUG "KOBIL KAAN Standard Plus / SecOVID Reader Plus detected\n");
167 break;
168 case KOBIL_USBTWIN_PRODUCT_ID:
169 printk(KERN_DEBUG "KOBIL USBTWIN detected\n");
170 break;
171 case KOBIL_KAAN_SIM_PRODUCT_ID:
172 printk(KERN_DEBUG "KOBIL KAAN SIM detected\n");
173 break;
174 }
175 usb_set_serial_port_data(serial->port[0], priv);
176
177 // search for the necessary endpoints
178 pdev = serial->dev;
179 actconfig = pdev->actconfig;
180 interface = actconfig->interface[0];
181 altsetting = interface->cur_altsetting;
182 endpoint = altsetting->endpoint;
183
184 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
185 endpoint = &altsetting->endpoint[i];
186 if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) &&
187 ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
188 dbg("%s Found interrupt out endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress);
189 priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress;
190 }
191 if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) &&
192 ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
193 dbg("%s Found interrupt in endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress);
194 priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress;
195 }
196 }
197 return 0;
198}
199
200
201static void kobil_shutdown (struct usb_serial *serial)
202{
203 int i;
204 dbg("%s - port %d", __FUNCTION__, serial->port[0]->number);
205
206 for (i=0; i < serial->num_ports; ++i) {
207 while (serial->port[i]->open_count > 0) {
208 kobil_close (serial->port[i], NULL);
209 }
210 kfree(usb_get_serial_port_data(serial->port[i]));
211 usb_set_serial_port_data(serial->port[i], NULL);
212 }
213}
214
215
216static int kobil_open (struct usb_serial_port *port, struct file *filp)
217{
218 int i, result = 0;
219 struct kobil_private *priv;
220 unsigned char *transfer_buffer;
221 int transfer_buffer_length = 8;
222 int write_urb_transfer_buffer_length = 8;
223
224 dbg("%s - port %d", __FUNCTION__, port->number);
225 priv = usb_get_serial_port_data(port);
226 priv->line_state = 0;
227
228 // someone sets the dev to 0 if the close method has been called
229 port->interrupt_in_urb->dev = port->serial->dev;
230
231
232 /* force low_latency on so that our tty_push actually forces
233 * the data through, otherwise it is scheduled, and with high
234 * data rates (like with OHCI) data can get lost.
235 */
236 port->tty->low_latency = 1;
237
238 // without this, every push_tty_char is echoed :-(
239 port->tty->termios->c_lflag = 0;
240 port->tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
241 port->tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
242 port->tty->termios->c_oflag &= ~ONLCR; // do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D)
243
244 // set up internal termios structure
245 priv->internal_termios.c_iflag = port->tty->termios->c_iflag;
246 priv->internal_termios.c_oflag = port->tty->termios->c_oflag;
247 priv->internal_termios.c_cflag = port->tty->termios->c_cflag;
248 priv->internal_termios.c_lflag = port->tty->termios->c_lflag;
249
250 for (i=0; i<NCCS; i++) {
251 priv->internal_termios.c_cc[i] = port->tty->termios->c_cc[i];
252 }
253
254 // allocate memory for transfer buffer
255 transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
256 if (! transfer_buffer) {
257 return -ENOMEM;
258 } else {
259 memset(transfer_buffer, 0, transfer_buffer_length);
260 }
261
262 // allocate write_urb
263 if (!port->write_urb) {
264 dbg("%s - port %d Allocating port->write_urb", __FUNCTION__, port->number);
265 port->write_urb = usb_alloc_urb(0, GFP_KERNEL);
266 if (!port->write_urb) {
267 dbg("%s - port %d usb_alloc_urb failed", __FUNCTION__, port->number);
268 kfree(transfer_buffer);
269 return -ENOMEM;
270 }
271 }
272
273 // allocate memory for write_urb transfer buffer
274 port->write_urb->transfer_buffer = (unsigned char *) kmalloc(write_urb_transfer_buffer_length, GFP_KERNEL);
275 if (! port->write_urb->transfer_buffer) {
276 kfree(transfer_buffer);
277 usb_free_urb(port->write_urb);
278 port->write_urb = NULL;
279 return -ENOMEM;
280 }
281
282 // get hardware version
283 result = usb_control_msg( port->serial->dev,
284 usb_rcvctrlpipe(port->serial->dev, 0 ),
285 SUSBCRequest_GetMisc,
286 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
287 SUSBCR_MSC_GetHWVersion,
288 0,
289 transfer_buffer,
290 transfer_buffer_length,
291 KOBIL_TIMEOUT
292 );
293 dbg("%s - port %d Send get_HW_version URB returns: %i", __FUNCTION__, port->number, result);
294 dbg("Harware version: %i.%i.%i", transfer_buffer[0], transfer_buffer[1], transfer_buffer[2] );
295
296 // get firmware version
297 result = usb_control_msg( port->serial->dev,
298 usb_rcvctrlpipe(port->serial->dev, 0 ),
299 SUSBCRequest_GetMisc,
300 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
301 SUSBCR_MSC_GetFWVersion,
302 0,
303 transfer_buffer,
304 transfer_buffer_length,
305 KOBIL_TIMEOUT
306 );
307 dbg("%s - port %d Send get_FW_version URB returns: %i", __FUNCTION__, port->number, result);
308 dbg("Firmware version: %i.%i.%i", transfer_buffer[0], transfer_buffer[1], transfer_buffer[2] );
309
310 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) {
311 // Setting Baudrate, Parity and Stopbits
312 result = usb_control_msg( port->serial->dev,
313 usb_rcvctrlpipe(port->serial->dev, 0 ),
314 SUSBCRequest_SetBaudRateParityAndStopBits,
315 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
316 SUSBCR_SBR_9600 | SUSBCR_SPASB_EvenParity | SUSBCR_SPASB_1StopBit,
317 0,
318 transfer_buffer,
319 0,
320 KOBIL_TIMEOUT
321 );
322 dbg("%s - port %d Send set_baudrate URB returns: %i", __FUNCTION__, port->number, result);
323
324 // reset all queues
325 result = usb_control_msg( port->serial->dev,
326 usb_rcvctrlpipe(port->serial->dev, 0 ),
327 SUSBCRequest_Misc,
328 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
329 SUSBCR_MSC_ResetAllQueues,
330 0,
331 transfer_buffer,
332 0,
333 KOBIL_TIMEOUT
334 );
335 dbg("%s - port %d Send reset_all_queues URB returns: %i", __FUNCTION__, port->number, result);
336 }
337 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID ||
338 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
339 // start reading (Adapter B 'cause PNP string)
340 result = usb_submit_urb( port->interrupt_in_urb, GFP_ATOMIC );
341 dbg("%s - port %d Send read URB returns: %i", __FUNCTION__, port->number, result);
342 }
343
344 kfree(transfer_buffer);
345 return 0;
346}
347
348
349static void kobil_close (struct usb_serial_port *port, struct file *filp)
350{
351 dbg("%s - port %d", __FUNCTION__, port->number);
352
353 if (port->write_urb) {
354 usb_kill_urb(port->write_urb);
355 usb_free_urb( port->write_urb );
356 port->write_urb = NULL;
357 }
358 if (port->interrupt_in_urb)
359 usb_kill_urb(port->interrupt_in_urb);
360}
361
362
363static void kobil_read_int_callback( struct urb *purb, struct pt_regs *regs)
364{
365 int i;
366 int result;
367 struct usb_serial_port *port = (struct usb_serial_port *) purb->context;
368 struct tty_struct *tty;
369 unsigned char *data = purb->transfer_buffer;
370// char *dbg_data;
371
372 dbg("%s - port %d", __FUNCTION__, port->number);
373
374 if (purb->status) {
375 dbg("%s - port %d Read int status not zero: %d", __FUNCTION__, port->number, purb->status);
376 return;
377 }
378
379 tty = port->tty;
380 if (purb->actual_length) {
381
382 // BEGIN DEBUG
383 /*
384 dbg_data = (unsigned char *) kmalloc((3 * purb->actual_length + 10) * sizeof(char), GFP_KERNEL);
385 if (! dbg_data) {
386 return;
387 }
388 memset(dbg_data, 0, (3 * purb->actual_length + 10));
389 for (i = 0; i < purb->actual_length; i++) {
390 sprintf(dbg_data +3*i, "%02X ", data[i]);
391 }
392 dbg(" <-- %s", dbg_data );
393 kfree(dbg_data);
394 */
395 // END DEBUG
396
397 for (i = 0; i < purb->actual_length; ++i) {
398 // if we insert more than TTY_FLIPBUF_SIZE characters, we drop them.
399 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
400 tty_flip_buffer_push(tty);
401 }
402 // this doesn't actually push the data through unless tty->low_latency is set
403 tty_insert_flip_char(tty, data[i], 0);
404 }
405 tty_flip_buffer_push(tty);
406 }
407
408 // someone sets the dev to 0 if the close method has been called
409 port->interrupt_in_urb->dev = port->serial->dev;
410
411 result = usb_submit_urb( port->interrupt_in_urb, GFP_ATOMIC );
412 dbg("%s - port %d Send read URB returns: %i", __FUNCTION__, port->number, result);
413}
414
415
416static void kobil_write_callback( struct urb *purb, struct pt_regs *regs )
417{
418}
419
420
421static int kobil_write (struct usb_serial_port *port,
422 const unsigned char *buf, int count)
423{
424 int length = 0;
425 int result = 0;
426 int todo = 0;
427 struct kobil_private * priv;
428
429 if (count == 0) {
430 dbg("%s - port %d write request of 0 bytes", __FUNCTION__, port->number);
431 return 0;
432 }
433
434 priv = usb_get_serial_port_data(port);
435
436 if (count > (KOBIL_BUF_LENGTH - priv->filled)) {
437 dbg("%s - port %d Error: write request bigger than buffer size", __FUNCTION__, port->number);
438 return -ENOMEM;
439 }
440
441 // Copy data to buffer
442 memcpy (priv->buf + priv->filled, buf, count);
443
444 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, priv->buf + priv->filled);
445
446 priv->filled = priv->filled + count;
447
448
449 // only send complete block. TWIN, KAAN SIM and adapter K use the same protocol.
450 if ( ((priv->device_type != KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 2) && (priv->filled >= (priv->buf[1] + 3))) ||
451 ((priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) && (priv->filled > 3) && (priv->filled >= (priv->buf[2] + 4))) ) {
452
453 // stop reading (except TWIN and KAAN SIM)
454 if ( (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) || (priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) )
455 usb_kill_urb(port->interrupt_in_urb);
456
457 todo = priv->filled - priv->cur_pos;
458
459 while(todo > 0) {
460 // max 8 byte in one urb (endpoint size)
461 length = (todo < 8) ? todo : 8;
462 // copy data to transfer buffer
463 memcpy(port->write_urb->transfer_buffer, priv->buf + priv->cur_pos, length );
464 usb_fill_int_urb( port->write_urb,
465 port->serial->dev,
466 usb_sndintpipe(port->serial->dev, priv->write_int_endpoint_address),
467 port->write_urb->transfer_buffer,
468 length,
469 kobil_write_callback,
470 port,
471 8
472 );
473
474 priv->cur_pos = priv->cur_pos + length;
475 result = usb_submit_urb( port->write_urb, GFP_NOIO );
476 dbg("%s - port %d Send write URB returns: %i", __FUNCTION__, port->number, result);
477 todo = priv->filled - priv->cur_pos;
478
479 if (todo > 0) {
480 msleep(24);
481 }
482
483 } // end while
484
485 priv->filled = 0;
486 priv->cur_pos = 0;
487
488 // someone sets the dev to 0 if the close method has been called
489 port->interrupt_in_urb->dev = port->serial->dev;
490
491 // start reading (except TWIN and KAAN SIM)
492 if ( (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) || (priv->device_type == KOBIL_ADAPTER_K_PRODUCT_ID) ) {
493 // someone sets the dev to 0 if the close method has been called
494 port->interrupt_in_urb->dev = port->serial->dev;
495
496 result = usb_submit_urb( port->interrupt_in_urb, GFP_NOIO );
497 dbg("%s - port %d Send read URB returns: %i", __FUNCTION__, port->number, result);
498 }
499 }
500 return count;
501}
502
503
504static int kobil_write_room (struct usb_serial_port *port)
505{
506 //dbg("%s - port %d", __FUNCTION__, port->number);
507 return 8;
508}
509
510
511static int kobil_tiocmget(struct usb_serial_port *port, struct file *file)
512{
513 struct kobil_private * priv;
514 int result;
515 unsigned char *transfer_buffer;
516 int transfer_buffer_length = 8;
517
518 priv = usb_get_serial_port_data(port);
519 if ((priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) || (priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)) {
520 // This device doesn't support ioctl calls
521 return -EINVAL;
522 }
523
524 // allocate memory for transfer buffer
525 transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
526 if (!transfer_buffer) {
527 return -ENOMEM;
528 }
529 memset(transfer_buffer, 0, transfer_buffer_length);
530
531 result = usb_control_msg( port->serial->dev,
532 usb_rcvctrlpipe(port->serial->dev, 0 ),
533 SUSBCRequest_GetStatusLineState,
534 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_IN,
535 0,
536 0,
537 transfer_buffer,
538 transfer_buffer_length,
539 KOBIL_TIMEOUT);
540
541 dbg("%s - port %d Send get_status_line_state URB returns: %i. Statusline: %02x",
542 __FUNCTION__, port->number, result, transfer_buffer[0]);
543
544 if ((transfer_buffer[0] & SUSBCR_GSL_DSR) != 0) {
545 priv->line_state |= TIOCM_DSR;
546 } else {
547 priv->line_state &= ~TIOCM_DSR;
548 }
549
550 kfree(transfer_buffer);
551 return priv->line_state;
552}
553
554static int kobil_tiocmset(struct usb_serial_port *port, struct file *file,
555 unsigned int set, unsigned int clear)
556{
557 struct kobil_private * priv;
558 int result;
559 int dtr = 0;
560 int rts = 0;
561 unsigned char *transfer_buffer;
562 int transfer_buffer_length = 8;
563
564 priv = usb_get_serial_port_data(port);
565 if ((priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) || (priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)) {
566 // This device doesn't support ioctl calls
567 return -EINVAL;
568 }
569
570 // allocate memory for transfer buffer
571 transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
572 if (! transfer_buffer) {
573 return -ENOMEM;
574 }
575 memset(transfer_buffer, 0, transfer_buffer_length);
576
577 if (set & TIOCM_RTS)
578 rts = 1;
579 if (set & TIOCM_DTR)
580 dtr = 1;
581 if (clear & TIOCM_RTS)
582 rts = 0;
583 if (clear & TIOCM_DTR)
584 dtr = 0;
585
586 if (priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID) {
587 if (dtr != 0)
588 dbg("%s - port %d Setting DTR", __FUNCTION__, port->number);
589 else
590 dbg("%s - port %d Clearing DTR", __FUNCTION__, port->number);
591 result = usb_control_msg( port->serial->dev,
592 usb_rcvctrlpipe(port->serial->dev, 0 ),
593 SUSBCRequest_SetStatusLinesOrQueues,
594 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
595 ((dtr != 0) ? SUSBCR_SSL_SETDTR : SUSBCR_SSL_CLRDTR),
596 0,
597 transfer_buffer,
598 0,
599 KOBIL_TIMEOUT);
600 } else {
601 if (rts != 0)
602 dbg("%s - port %d Setting RTS", __FUNCTION__, port->number);
603 else
604 dbg("%s - port %d Clearing RTS", __FUNCTION__, port->number);
605 result = usb_control_msg( port->serial->dev,
606 usb_rcvctrlpipe(port->serial->dev, 0 ),
607 SUSBCRequest_SetStatusLinesOrQueues,
608 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
609 ((rts != 0) ? SUSBCR_SSL_SETRTS : SUSBCR_SSL_CLRRTS),
610 0,
611 transfer_buffer,
612 0,
613 KOBIL_TIMEOUT);
614 }
615 dbg("%s - port %d Send set_status_line URB returns: %i", __FUNCTION__, port->number, result);
616 kfree(transfer_buffer);
617 return (result < 0) ? result : 0;
618}
619
620
621static int kobil_ioctl(struct usb_serial_port *port, struct file *file,
622 unsigned int cmd, unsigned long arg)
623{
624 struct kobil_private * priv;
625 int result;
626 unsigned short urb_val = 0;
627 unsigned char *transfer_buffer;
628 int transfer_buffer_length = 8;
629 char *settings;
630 void __user *user_arg = (void __user *)arg;
631
632 priv = usb_get_serial_port_data(port);
633 if ((priv->device_type == KOBIL_USBTWIN_PRODUCT_ID) || (priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID)) {
634 // This device doesn't support ioctl calls
635 return 0;
636 }
637
638 switch (cmd) {
639 case TCGETS: // 0x5401
640 if (!access_ok(VERIFY_WRITE, user_arg, sizeof(struct termios))) {
641 dbg("%s - port %d Error in access_ok", __FUNCTION__, port->number);
642 return -EFAULT;
643 }
644 if (kernel_termios_to_user_termios((struct termios __user *)arg,
645 &priv->internal_termios))
646 return -EFAULT;
647 return 0;
648
649 case TCSETS: // 0x5402
650 if (!(port->tty->termios)) {
651 dbg("%s - port %d Error: port->tty->termios is NULL", __FUNCTION__, port->number);
652 return -ENOTTY;
653 }
654 if (!access_ok(VERIFY_READ, user_arg, sizeof(struct termios))) {
655 dbg("%s - port %d Error in access_ok", __FUNCTION__, port->number);
656 return -EFAULT;
657 }
658 if (user_termios_to_kernel_termios(&priv->internal_termios,
659 (struct termios __user *)arg))
660 return -EFAULT;
661
662 settings = (unsigned char *) kmalloc(50, GFP_KERNEL);
663 if (! settings) {
664 return -ENOBUFS;
665 }
666 memset(settings, 0, 50);
667
668 switch (priv->internal_termios.c_cflag & CBAUD) {
669 case B1200:
670 urb_val = SUSBCR_SBR_1200;
671 strcat(settings, "1200 ");
672 break;
673 case B9600:
674 default:
675 urb_val = SUSBCR_SBR_9600;
676 strcat(settings, "9600 ");
677 break;
678 }
679
680 urb_val |= (priv->internal_termios.c_cflag & CSTOPB) ? SUSBCR_SPASB_2StopBits : SUSBCR_SPASB_1StopBit;
681 strcat(settings, (priv->internal_termios.c_cflag & CSTOPB) ? "2 StopBits " : "1 StopBit ");
682
683 if (priv->internal_termios.c_cflag & PARENB) {
684 if (priv->internal_termios.c_cflag & PARODD) {
685 urb_val |= SUSBCR_SPASB_OddParity;
686 strcat(settings, "Odd Parity");
687 } else {
688 urb_val |= SUSBCR_SPASB_EvenParity;
689 strcat(settings, "Even Parity");
690 }
691 } else {
692 urb_val |= SUSBCR_SPASB_NoParity;
693 strcat(settings, "No Parity");
694 }
695 dbg("%s - port %d setting port to: %s", __FUNCTION__, port->number, settings );
696
697 result = usb_control_msg( port->serial->dev,
698 usb_rcvctrlpipe(port->serial->dev, 0 ),
699 SUSBCRequest_SetBaudRateParityAndStopBits,
700 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
701 urb_val,
702 0,
703 settings,
704 0,
705 KOBIL_TIMEOUT
706 );
707
708 dbg("%s - port %d Send set_baudrate URB returns: %i", __FUNCTION__, port->number, result);
709 kfree(settings);
710 return 0;
711
712 case TCFLSH: // 0x540B
713 transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);
714 if (! transfer_buffer) {
715 return -ENOBUFS;
716 }
717
718 result = usb_control_msg( port->serial->dev,
719 usb_rcvctrlpipe(port->serial->dev, 0 ),
720 SUSBCRequest_Misc,
721 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT,
722 SUSBCR_MSC_ResetAllQueues,
723 0,
724 NULL,//transfer_buffer,
725 0,
726 KOBIL_TIMEOUT
727 );
728
729 dbg("%s - port %d Send reset_all_queues (FLUSH) URB returns: %i", __FUNCTION__, port->number, result);
730
731 kfree(transfer_buffer);
732 return ((result < 0) ? -EFAULT : 0);
733
734 }
735 return -ENOIOCTLCMD;
736}
737
738
739static int __init kobil_init (void)
740{
741 int retval;
742 retval = usb_serial_register(&kobil_device);
743 if (retval)
744 goto failed_usb_serial_register;
745 retval = usb_register(&kobil_driver);
746 if (retval)
747 goto failed_usb_register;
748
749 info(DRIVER_VERSION " " DRIVER_AUTHOR);
750 info(DRIVER_DESC);
751
752 return 0;
753failed_usb_register:
754 usb_serial_deregister(&kobil_device);
755failed_usb_serial_register:
756 return retval;
757}
758
759
760static void __exit kobil_exit (void)
761{
762 usb_deregister (&kobil_driver);
763 usb_serial_deregister (&kobil_device);
764}
765
766module_init(kobil_init);
767module_exit(kobil_exit);
768
769MODULE_AUTHOR( DRIVER_AUTHOR );
770MODULE_DESCRIPTION( DRIVER_DESC );
771MODULE_LICENSE( "GPL" );
772
773module_param(debug, bool, S_IRUGO | S_IWUSR);
774MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/kobil_sct.h b/drivers/usb/serial/kobil_sct.h
new file mode 100644
index 000000000000..a51fbb5ae45c
--- /dev/null
+++ b/drivers/usb/serial/kobil_sct.h
@@ -0,0 +1,60 @@
1#define SUSBCRequest_SetBaudRateParityAndStopBits 1
2#define SUSBCR_SBR_MASK 0xFF00
3#define SUSBCR_SBR_1200 0x0100
4#define SUSBCR_SBR_9600 0x0200
5#define SUSBCR_SBR_19200 0x0400
6#define SUSBCR_SBR_28800 0x0800
7#define SUSBCR_SBR_38400 0x1000
8#define SUSBCR_SBR_57600 0x2000
9#define SUSBCR_SBR_115200 0x4000
10
11#define SUSBCR_SPASB_MASK 0x0070
12#define SUSBCR_SPASB_NoParity 0x0010
13#define SUSBCR_SPASB_OddParity 0x0020
14#define SUSBCR_SPASB_EvenParity 0x0040
15
16#define SUSBCR_SPASB_STPMASK 0x0003
17#define SUSBCR_SPASB_1StopBit 0x0001
18#define SUSBCR_SPASB_2StopBits 0x0002
19
20#define SUSBCRequest_SetStatusLinesOrQueues 2
21#define SUSBCR_SSL_SETRTS 0x0001
22#define SUSBCR_SSL_CLRRTS 0x0002
23#define SUSBCR_SSL_SETDTR 0x0004
24#define SUSBCR_SSL_CLRDTR 0x0010
25
26#define SUSBCR_SSL_PURGE_TXABORT 0x0100 // Kill the pending/current writes to the comm port.
27#define SUSBCR_SSL_PURGE_RXABORT 0x0200 // Kill the pending/current reads to the comm port.
28#define SUSBCR_SSL_PURGE_TXCLEAR 0x0400 // Kill the transmit queue if there.
29#define SUSBCR_SSL_PURGE_RXCLEAR 0x0800 // Kill the typeahead buffer if there.
30
31#define SUSBCRequest_GetStatusLineState 4
32#define SUSBCR_GSL_RXCHAR 0x0001 // Any Character received
33#define SUSBCR_GSL_TXEMPTY 0x0004 // Transmitt Queue Empty
34#define SUSBCR_GSL_CTS 0x0008 // CTS changed state
35#define SUSBCR_GSL_DSR 0x0010 // DSR changed state
36#define SUSBCR_GSL_RLSD 0x0020 // RLSD changed state
37#define SUSBCR_GSL_BREAK 0x0040 // BREAK received
38#define SUSBCR_GSL_ERR 0x0080 // Line status error occurred
39#define SUSBCR_GSL_RING 0x0100 // Ring signal detected
40
41#define SUSBCRequest_Misc 8
42#define SUSBCR_MSC_ResetReader 0x0001 // use a predefined reset sequence
43#define SUSBCR_MSC_ResetAllQueues 0x0002 // use a predefined sequence to reset the internal queues
44
45#define SUSBCRequest_GetMisc 0x10
46#define SUSBCR_MSC_GetFWVersion 0x0001 /* get the firmware version from device,
47 coded like this 0xHHLLBBPP
48 with HH = Firmware Version High Byte
49 LL = Firmware Version Low Byte
50 BB = Build Number
51 PP = Further Attributes
52 */
53
54#define SUSBCR_MSC_GetHWVersion 0x0002 /* get the hardware version from device
55 coded like this 0xHHLLPPRR
56 with HH = Software Version High Byte
57 LL = Software Version Low Byte
58 PP = Further Attributes
59 RR = Reserved for the hardware ID
60 */
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
new file mode 100644
index 000000000000..50b6369647d2
--- /dev/null
+++ b/drivers/usb/serial/mct_u232.c
@@ -0,0 +1,781 @@
1/*
2 * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver
3 *
4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is largely derived from the Belkin USB Serial Adapter Driver
12 * (see belkin_sa.[ch]). All of the information about the device was acquired
13 * by using SniffUSB on Windows98. For technical details see mct_u232.h.
14 *
15 * William G. Greathouse and Greg Kroah-Hartman provided great help on how to
16 * do the reverse engineering and how to write a USB serial device driver.
17 *
18 * TO BE DONE, TO BE CHECKED:
19 * DTR/RTS signal handling may be incomplete or incorrect. I have mainly
20 * implemented what I have seen with SniffUSB or found in belkin_sa.c.
21 * For further TODOs check also belkin_sa.c.
22 *
23 * TEST STATUS:
24 * Basic tests have been performed with minicom/zmodem transfers and
25 * modem dialing under Linux 2.4.0-test10 (for me it works fine).
26 *
27 * 04-Nov-2003 Bill Marr <marr at flex dot com>
28 * - Mimic Windows driver by sending 2 USB 'device request' messages
29 * following normal 'baud rate change' message. This allows data to be
30 * transmitted to RS-232 devices which don't assert the 'CTS' signal.
31 *
32 * 10-Nov-2001 Wolfgang Grandegger
33 * - Fixed an endianess problem with the baudrate selection for PowerPC.
34 *
35 * 06-Dec-2001 Martin Hamilton <martinh@gnu.org>
36 * Added support for the Belkin F5U109 DB9 adaptor
37 *
38 * 30-May-2001 Greg Kroah-Hartman
39 * switched from using spinlock to a semaphore, which fixes lots of problems.
40 *
41 * 04-May-2001 Stelian Pop
42 * - Set the maximum bulk output size for Sitecom U232-P25 model to 16 bytes
43 * instead of the device reported 32 (using 32 bytes causes many data
44 * loss, Windows driver uses 16 too).
45 *
46 * 02-May-2001 Stelian Pop
47 * - Fixed the baud calculation for Sitecom U232-P25 model
48 *
49 * 08-Apr-2001 gb
50 * - Identify version on module load.
51 *
52 * 06-Jan-2001 Cornel Ciocirlan
53 * - Added support for Sitecom U232-P25 model (Product Id 0x0230)
54 * - Added support for D-Link DU-H3SP USB BAY (Product Id 0x0200)
55 *
56 * 29-Nov-2000 Greg Kroah-Hartman
57 * - Added device id table to fit with 2.4.0-test11 structure.
58 * - took out DEAL_WITH_TWO_INT_IN_ENDPOINTS #define as it's not needed
59 * (lots of things will change if/when the usb-serial core changes to
60 * handle these issues.
61 *
62 * 27-Nov-2000 Wolfgang Grandegger
63 * A version for kernel 2.4.0-test10 released to the Linux community
64 * (via linux-usb-devel).
65 */
66
67#include <linux/config.h>
68#include <linux/kernel.h>
69#include <linux/errno.h>
70#include <linux/init.h>
71#include <linux/slab.h>
72#include <linux/tty.h>
73#include <linux/tty_driver.h>
74#include <linux/tty_flip.h>
75#include <linux/module.h>
76#include <linux/spinlock.h>
77#include <asm/uaccess.h>
78#include <linux/usb.h>
79#include "usb-serial.h"
80#include "mct_u232.h"
81
82/*
83 * Version Information
84 */
85#define DRIVER_VERSION "z2.0" /* Linux in-kernel version */
86#define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
87#define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
88
89static int debug;
90
91/*
92 * Function prototypes
93 */
94static int mct_u232_startup (struct usb_serial *serial);
95static void mct_u232_shutdown (struct usb_serial *serial);
96static int mct_u232_open (struct usb_serial_port *port,
97 struct file *filp);
98static void mct_u232_close (struct usb_serial_port *port,
99 struct file *filp);
100static void mct_u232_read_int_callback (struct urb *urb, struct pt_regs *regs);
101static void mct_u232_set_termios (struct usb_serial_port *port,
102 struct termios * old);
103static int mct_u232_ioctl (struct usb_serial_port *port,
104 struct file * file,
105 unsigned int cmd,
106 unsigned long arg);
107static void mct_u232_break_ctl (struct usb_serial_port *port,
108 int break_state );
109static int mct_u232_tiocmget (struct usb_serial_port *port,
110 struct file *file);
111static int mct_u232_tiocmset (struct usb_serial_port *port,
112 struct file *file, unsigned int set,
113 unsigned int clear);
114/*
115 * All of the device info needed for the MCT USB-RS232 converter.
116 */
117static struct usb_device_id id_table_combined [] = {
118 { USB_DEVICE(MCT_U232_VID, MCT_U232_PID) },
119 { USB_DEVICE(MCT_U232_VID, MCT_U232_SITECOM_PID) },
120 { USB_DEVICE(MCT_U232_VID, MCT_U232_DU_H3SP_PID) },
121 { USB_DEVICE(MCT_U232_BELKIN_F5U109_VID, MCT_U232_BELKIN_F5U109_PID) },
122 { } /* Terminating entry */
123};
124
125MODULE_DEVICE_TABLE (usb, id_table_combined);
126
127static struct usb_driver mct_u232_driver = {
128 .owner = THIS_MODULE,
129 .name = "mct_u232",
130 .probe = usb_serial_probe,
131 .disconnect = usb_serial_disconnect,
132 .id_table = id_table_combined,
133};
134
135static struct usb_serial_device_type mct_u232_device = {
136 .owner = THIS_MODULE,
137 .name = "MCT U232",
138 .short_name = "mct_u232",
139 .id_table = id_table_combined,
140 .num_interrupt_in = 2,
141 .num_bulk_in = 0,
142 .num_bulk_out = 1,
143 .num_ports = 1,
144 .open = mct_u232_open,
145 .close = mct_u232_close,
146 .read_int_callback = mct_u232_read_int_callback,
147 .ioctl = mct_u232_ioctl,
148 .set_termios = mct_u232_set_termios,
149 .break_ctl = mct_u232_break_ctl,
150 .tiocmget = mct_u232_tiocmget,
151 .tiocmset = mct_u232_tiocmset,
152 .attach = mct_u232_startup,
153 .shutdown = mct_u232_shutdown,
154};
155
156
157struct mct_u232_private {
158 spinlock_t lock;
159 unsigned int control_state; /* Modem Line Setting (TIOCM) */
160 unsigned char last_lcr; /* Line Control Register */
161 unsigned char last_lsr; /* Line Status Register */
162 unsigned char last_msr; /* Modem Status Register */
163};
164
165/*
166 * Handle vendor specific USB requests
167 */
168
169#define WDR_TIMEOUT 5000 /* default urb timeout */
170
171/*
172 * Later day 2.6.0-test kernels have new baud rates like B230400 which
173 * we do not know how to support. We ignore them for the moment.
174 * XXX Rate-limit the error message, it's user triggerable.
175 */
176static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value)
177{
178 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
179 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
180 switch (value) {
181 case B300: return 0x01;
182 case B600: return 0x02; /* this one not tested */
183 case B1200: return 0x03;
184 case B2400: return 0x04;
185 case B4800: return 0x06;
186 case B9600: return 0x08;
187 case B19200: return 0x09;
188 case B38400: return 0x0a;
189 case B57600: return 0x0b;
190 case B115200: return 0x0c;
191 default:
192 err("MCT USB-RS232: unsupported baudrate request 0x%x,"
193 " using default of B9600", value);
194 return 0x08;
195 }
196 } else {
197 switch (value) {
198 case B300: value = 300; break;
199 case B600: value = 600; break;
200 case B1200: value = 1200; break;
201 case B2400: value = 2400; break;
202 case B4800: value = 4800; break;
203 case B9600: value = 9600; break;
204 case B19200: value = 19200; break;
205 case B38400: value = 38400; break;
206 case B57600: value = 57600; break;
207 case B115200: value = 115200; break;
208 default:
209 err("MCT USB-RS232: unsupported baudrate request 0x%x,"
210 " using default of B9600", value);
211 value = 9600;
212 }
213 return 115200/value;
214 }
215}
216
217static int mct_u232_set_baud_rate(struct usb_serial *serial, int value)
218{
219 __le32 divisor;
220 int rc;
221 unsigned char zero_byte = 0;
222
223 divisor = cpu_to_le32(mct_u232_calculate_baud_rate(serial, value));
224
225 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
226 MCT_U232_SET_BAUD_RATE_REQUEST,
227 MCT_U232_SET_REQUEST_TYPE,
228 0, 0, &divisor, MCT_U232_SET_BAUD_RATE_SIZE,
229 WDR_TIMEOUT);
230 if (rc < 0)
231 err("Set BAUD RATE %d failed (error = %d)", value, rc);
232 dbg("set_baud_rate: value: 0x%x, divisor: 0x%x", value, divisor);
233
234 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
235 always sends two extra USB 'device request' messages after the
236 'baud rate change' message. The actual functionality of the
237 request codes in these messages is not fully understood but these
238 particular codes are never seen in any operation besides a baud
239 rate change. Both of these messages send a single byte of data
240 whose value is always zero. The second of these two extra messages
241 is required in order for data to be properly written to an RS-232
242 device which does not assert the 'CTS' signal. */
243
244 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
245 MCT_U232_SET_UNKNOWN1_REQUEST,
246 MCT_U232_SET_REQUEST_TYPE,
247 0, 0, &zero_byte, MCT_U232_SET_UNKNOWN1_SIZE,
248 WDR_TIMEOUT);
249 if (rc < 0)
250 err("Sending USB device request code %d failed (error = %d)",
251 MCT_U232_SET_UNKNOWN1_REQUEST, rc);
252
253 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
254 MCT_U232_SET_UNKNOWN2_REQUEST,
255 MCT_U232_SET_REQUEST_TYPE,
256 0, 0, &zero_byte, MCT_U232_SET_UNKNOWN2_SIZE,
257 WDR_TIMEOUT);
258 if (rc < 0)
259 err("Sending USB device request code %d failed (error = %d)",
260 MCT_U232_SET_UNKNOWN2_REQUEST, rc);
261
262 return rc;
263} /* mct_u232_set_baud_rate */
264
265static int mct_u232_set_line_ctrl(struct usb_serial *serial, unsigned char lcr)
266{
267 int rc;
268 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
269 MCT_U232_SET_LINE_CTRL_REQUEST,
270 MCT_U232_SET_REQUEST_TYPE,
271 0, 0, &lcr, MCT_U232_SET_LINE_CTRL_SIZE,
272 WDR_TIMEOUT);
273 if (rc < 0)
274 err("Set LINE CTRL 0x%x failed (error = %d)", lcr, rc);
275 dbg("set_line_ctrl: 0x%x", lcr);
276 return rc;
277} /* mct_u232_set_line_ctrl */
278
279static int mct_u232_set_modem_ctrl(struct usb_serial *serial,
280 unsigned int control_state)
281{
282 int rc;
283 unsigned char mcr = MCT_U232_MCR_NONE;
284
285 if (control_state & TIOCM_DTR)
286 mcr |= MCT_U232_MCR_DTR;
287 if (control_state & TIOCM_RTS)
288 mcr |= MCT_U232_MCR_RTS;
289
290 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
291 MCT_U232_SET_MODEM_CTRL_REQUEST,
292 MCT_U232_SET_REQUEST_TYPE,
293 0, 0, &mcr, MCT_U232_SET_MODEM_CTRL_SIZE,
294 WDR_TIMEOUT);
295 if (rc < 0)
296 err("Set MODEM CTRL 0x%x failed (error = %d)", mcr, rc);
297 dbg("set_modem_ctrl: state=0x%x ==> mcr=0x%x", control_state, mcr);
298
299 return rc;
300} /* mct_u232_set_modem_ctrl */
301
302static int mct_u232_get_modem_stat(struct usb_serial *serial, unsigned char *msr)
303{
304 int rc;
305 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
306 MCT_U232_GET_MODEM_STAT_REQUEST,
307 MCT_U232_GET_REQUEST_TYPE,
308 0, 0, msr, MCT_U232_GET_MODEM_STAT_SIZE,
309 WDR_TIMEOUT);
310 if (rc < 0) {
311 err("Get MODEM STATus failed (error = %d)", rc);
312 *msr = 0;
313 }
314 dbg("get_modem_stat: 0x%x", *msr);
315 return rc;
316} /* mct_u232_get_modem_stat */
317
318static void mct_u232_msr_to_state(unsigned int *control_state, unsigned char msr)
319{
320 /* Translate Control Line states */
321 if (msr & MCT_U232_MSR_DSR)
322 *control_state |= TIOCM_DSR;
323 else
324 *control_state &= ~TIOCM_DSR;
325 if (msr & MCT_U232_MSR_CTS)
326 *control_state |= TIOCM_CTS;
327 else
328 *control_state &= ~TIOCM_CTS;
329 if (msr & MCT_U232_MSR_RI)
330 *control_state |= TIOCM_RI;
331 else
332 *control_state &= ~TIOCM_RI;
333 if (msr & MCT_U232_MSR_CD)
334 *control_state |= TIOCM_CD;
335 else
336 *control_state &= ~TIOCM_CD;
337 dbg("msr_to_state: msr=0x%x ==> state=0x%x", msr, *control_state);
338} /* mct_u232_msr_to_state */
339
340/*
341 * Driver's tty interface functions
342 */
343
344static int mct_u232_startup (struct usb_serial *serial)
345{
346 struct mct_u232_private *priv;
347 struct usb_serial_port *port, *rport;
348
349 priv = kmalloc(sizeof(struct mct_u232_private), GFP_KERNEL);
350 if (!priv)
351 return -ENOMEM;
352 memset(priv, 0, sizeof(struct mct_u232_private));
353 spin_lock_init(&priv->lock);
354 usb_set_serial_port_data(serial->port[0], priv);
355
356 init_waitqueue_head(&serial->port[0]->write_wait);
357
358 /* Puh, that's dirty */
359 port = serial->port[0];
360 rport = serial->port[1];
361 if (port->read_urb) {
362 /* No unlinking, it wasn't submitted yet. */
363 usb_free_urb(port->read_urb);
364 }
365 port->read_urb = rport->interrupt_in_urb;
366 rport->interrupt_in_urb = NULL;
367 port->read_urb->context = port;
368
369 return (0);
370} /* mct_u232_startup */
371
372
373static void mct_u232_shutdown (struct usb_serial *serial)
374{
375 struct mct_u232_private *priv;
376 int i;
377
378 dbg("%s", __FUNCTION__);
379
380 for (i=0; i < serial->num_ports; ++i) {
381 /* My special items, the standard routines free my urbs */
382 priv = usb_get_serial_port_data(serial->port[i]);
383 if (priv) {
384 usb_set_serial_port_data(serial->port[i], NULL);
385 kfree(priv);
386 }
387 }
388} /* mct_u232_shutdown */
389
390static int mct_u232_open (struct usb_serial_port *port, struct file *filp)
391{
392 struct usb_serial *serial = port->serial;
393 struct mct_u232_private *priv = usb_get_serial_port_data(port);
394 int retval = 0;
395 unsigned int control_state;
396 unsigned long flags;
397 unsigned char last_lcr;
398 unsigned char last_msr;
399
400 dbg("%s port %d", __FUNCTION__, port->number);
401
402 /* Compensate for a hardware bug: although the Sitecom U232-P25
403 * device reports a maximum output packet size of 32 bytes,
404 * it seems to be able to accept only 16 bytes (and that's what
405 * SniffUSB says too...)
406 */
407 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID)
408 port->bulk_out_size = 16;
409
410 /* Do a defined restart: the normal serial device seems to
411 * always turn on DTR and RTS here, so do the same. I'm not
412 * sure if this is really necessary. But it should not harm
413 * either.
414 */
415 spin_lock_irqsave(&priv->lock, flags);
416 if (port->tty->termios->c_cflag & CBAUD)
417 priv->control_state = TIOCM_DTR | TIOCM_RTS;
418 else
419 priv->control_state = 0;
420
421 priv->last_lcr = (MCT_U232_DATA_BITS_8 |
422 MCT_U232_PARITY_NONE |
423 MCT_U232_STOP_BITS_1);
424 control_state = priv->control_state;
425 last_lcr = priv->last_lcr;
426 spin_unlock_irqrestore(&priv->lock, flags);
427 mct_u232_set_modem_ctrl(serial, control_state);
428 mct_u232_set_line_ctrl(serial, last_lcr);
429
430 /* Read modem status and update control state */
431 mct_u232_get_modem_stat(serial, &last_msr);
432 spin_lock_irqsave(&priv->lock, flags);
433 priv->last_msr = last_msr;
434 mct_u232_msr_to_state(&priv->control_state, priv->last_msr);
435 spin_unlock_irqrestore(&priv->lock, flags);
436
437 port->read_urb->dev = port->serial->dev;
438 retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
439 if (retval) {
440 err("usb_submit_urb(read bulk) failed pipe 0x%x err %d",
441 port->read_urb->pipe, retval);
442 goto exit;
443 }
444
445 port->interrupt_in_urb->dev = port->serial->dev;
446 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
447 if (retval)
448 err(" usb_submit_urb(read int) failed pipe 0x%x err %d",
449 port->interrupt_in_urb->pipe, retval);
450
451exit:
452 return 0;
453} /* mct_u232_open */
454
455
456static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
457{
458 dbg("%s port %d", __FUNCTION__, port->number);
459
460 if (port->serial->dev) {
461 /* shutdown our urbs */
462 usb_kill_urb(port->write_urb);
463 usb_kill_urb(port->read_urb);
464 usb_kill_urb(port->interrupt_in_urb);
465 }
466} /* mct_u232_close */
467
468
469static void mct_u232_read_int_callback (struct urb *urb, struct pt_regs *regs)
470{
471 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
472 struct mct_u232_private *priv = usb_get_serial_port_data(port);
473 struct usb_serial *serial = port->serial;
474 struct tty_struct *tty;
475 unsigned char *data = urb->transfer_buffer;
476 int status;
477 unsigned long flags;
478
479 switch (urb->status) {
480 case 0:
481 /* success */
482 break;
483 case -ECONNRESET:
484 case -ENOENT:
485 case -ESHUTDOWN:
486 /* this urb is terminated, clean up */
487 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
488 return;
489 default:
490 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
491 goto exit;
492 }
493
494 if (!serial) {
495 dbg("%s - bad serial pointer, exiting", __FUNCTION__);
496 return;
497 }
498
499 dbg("%s - port %d", __FUNCTION__, port->number);
500 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
501
502 /*
503 * Work-a-round: handle the 'usual' bulk-in pipe here
504 */
505 if (urb->transfer_buffer_length > 2) {
506 int i;
507 tty = port->tty;
508 if (urb->actual_length) {
509 for (i = 0; i < urb->actual_length ; ++i) {
510 tty_insert_flip_char(tty, data[i], 0);
511 }
512 tty_flip_buffer_push(tty);
513 }
514 goto exit;
515 }
516
517 /*
518 * The interrupt-in pipe signals exceptional conditions (modem line
519 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
520 */
521 spin_lock_irqsave(&priv->lock, flags);
522 priv->last_msr = data[MCT_U232_MSR_INDEX];
523
524 /* Record Control Line states */
525 mct_u232_msr_to_state(&priv->control_state, priv->last_msr);
526
527#if 0
528 /* Not yet handled. See belin_sa.c for further information */
529 /* Now to report any errors */
530 priv->last_lsr = data[MCT_U232_LSR_INDEX];
531 /*
532 * fill in the flip buffer here, but I do not know the relation
533 * to the current/next receive buffer or characters. I need
534 * to look in to this before committing any code.
535 */
536 if (priv->last_lsr & MCT_U232_LSR_ERR) {
537 tty = port->tty;
538 /* Overrun Error */
539 if (priv->last_lsr & MCT_U232_LSR_OE) {
540 }
541 /* Parity Error */
542 if (priv->last_lsr & MCT_U232_LSR_PE) {
543 }
544 /* Framing Error */
545 if (priv->last_lsr & MCT_U232_LSR_FE) {
546 }
547 /* Break Indicator */
548 if (priv->last_lsr & MCT_U232_LSR_BI) {
549 }
550 }
551#endif
552 spin_unlock_irqrestore(&priv->lock, flags);
553exit:
554 status = usb_submit_urb (urb, GFP_ATOMIC);
555 if (status)
556 err ("%s - usb_submit_urb failed with result %d",
557 __FUNCTION__, status);
558} /* mct_u232_read_int_callback */
559
560static void mct_u232_set_termios (struct usb_serial_port *port,
561 struct termios *old_termios)
562{
563 struct usb_serial *serial = port->serial;
564 struct mct_u232_private *priv = usb_get_serial_port_data(port);
565 unsigned int iflag = port->tty->termios->c_iflag;
566 unsigned int cflag = port->tty->termios->c_cflag;
567 unsigned int old_cflag = old_termios->c_cflag;
568 unsigned long flags;
569 unsigned int control_state, new_state;
570 unsigned char last_lcr;
571
572 /* get a local copy of the current port settings */
573 spin_lock_irqsave(&priv->lock, flags);
574 control_state = priv->control_state;
575 spin_unlock_irqrestore(&priv->lock, flags);
576 last_lcr = 0;
577
578 /*
579 * Update baud rate.
580 * Do not attempt to cache old rates and skip settings,
581 * disconnects screw such tricks up completely.
582 * Premature optimization is the root of all evil.
583 */
584
585 /* reassert DTR and (maybe) RTS on transition from B0 */
586 if ((old_cflag & CBAUD) == B0) {
587 dbg("%s: baud was B0", __FUNCTION__);
588 control_state |= TIOCM_DTR;
589 /* don't set RTS if using hardware flow control */
590 if (!(old_cflag & CRTSCTS)) {
591 control_state |= TIOCM_RTS;
592 }
593 mct_u232_set_modem_ctrl(serial, control_state);
594 }
595
596 mct_u232_set_baud_rate(serial, cflag & CBAUD);
597
598 if ((cflag & CBAUD) == B0 ) {
599 dbg("%s: baud is B0", __FUNCTION__);
600 /* Drop RTS and DTR */
601 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
602 mct_u232_set_modem_ctrl(serial, control_state);
603 }
604
605 /*
606 * Update line control register (LCR)
607 */
608
609 /* set the parity */
610 if (cflag & PARENB)
611 last_lcr |= (cflag & PARODD) ?
612 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN;
613 else
614 last_lcr |= MCT_U232_PARITY_NONE;
615
616 /* set the number of data bits */
617 switch (cflag & CSIZE) {
618 case CS5:
619 last_lcr |= MCT_U232_DATA_BITS_5; break;
620 case CS6:
621 last_lcr |= MCT_U232_DATA_BITS_6; break;
622 case CS7:
623 last_lcr |= MCT_U232_DATA_BITS_7; break;
624 case CS8:
625 last_lcr |= MCT_U232_DATA_BITS_8; break;
626 default:
627 err("CSIZE was not CS5-CS8, using default of 8");
628 last_lcr |= MCT_U232_DATA_BITS_8;
629 break;
630 }
631
632 /* set the number of stop bits */
633 last_lcr |= (cflag & CSTOPB) ?
634 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
635
636 mct_u232_set_line_ctrl(serial, last_lcr);
637
638 /*
639 * Set flow control: well, I do not really now how to handle DTR/RTS.
640 * Just do what we have seen with SniffUSB on Win98.
641 */
642 /* Drop DTR/RTS if no flow control otherwise assert */
643 new_state = control_state;
644 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS))
645 new_state |= TIOCM_DTR | TIOCM_RTS;
646 else
647 new_state &= ~(TIOCM_DTR | TIOCM_RTS);
648 if (new_state != control_state) {
649 mct_u232_set_modem_ctrl(serial, new_state);
650 control_state = new_state;
651 }
652
653 /* save off the modified port settings */
654 spin_lock_irqsave(&priv->lock, flags);
655 priv->control_state = control_state;
656 priv->last_lcr = last_lcr;
657 spin_unlock_irqrestore(&priv->lock, flags);
658} /* mct_u232_set_termios */
659
660static void mct_u232_break_ctl( struct usb_serial_port *port, int break_state )
661{
662 struct usb_serial *serial = port->serial;
663 struct mct_u232_private *priv = usb_get_serial_port_data(port);
664 unsigned char lcr;
665 unsigned long flags;
666
667 dbg("%sstate=%d", __FUNCTION__, break_state);
668
669 spin_lock_irqsave(&priv->lock, flags);
670 lcr = priv->last_lcr;
671 spin_unlock_irqrestore(&priv->lock, flags);
672
673 if (break_state)
674 lcr |= MCT_U232_SET_BREAK;
675
676 mct_u232_set_line_ctrl(serial, lcr);
677} /* mct_u232_break_ctl */
678
679
680static int mct_u232_tiocmget (struct usb_serial_port *port, struct file *file)
681{
682 struct mct_u232_private *priv = usb_get_serial_port_data(port);
683 unsigned int control_state;
684 unsigned long flags;
685
686 dbg("%s", __FUNCTION__);
687
688 spin_lock_irqsave(&priv->lock, flags);
689 control_state = priv->control_state;
690 spin_unlock_irqrestore(&priv->lock, flags);
691
692 return control_state;
693}
694
695static int mct_u232_tiocmset (struct usb_serial_port *port, struct file *file,
696 unsigned int set, unsigned int clear)
697{
698 struct usb_serial *serial = port->serial;
699 struct mct_u232_private *priv = usb_get_serial_port_data(port);
700 unsigned int control_state;
701 unsigned long flags;
702
703 dbg("%s", __FUNCTION__);
704
705 spin_lock_irqsave(&priv->lock, flags);
706 control_state = priv->control_state;
707
708 if (set & TIOCM_RTS)
709 control_state |= TIOCM_RTS;
710 if (set & TIOCM_DTR)
711 control_state |= TIOCM_DTR;
712 if (clear & TIOCM_RTS)
713 control_state &= ~TIOCM_RTS;
714 if (clear & TIOCM_DTR)
715 control_state &= ~TIOCM_DTR;
716
717 priv->control_state = control_state;
718 spin_unlock_irqrestore(&priv->lock, flags);
719 return mct_u232_set_modem_ctrl(serial, control_state);
720}
721
722static int mct_u232_ioctl (struct usb_serial_port *port, struct file * file,
723 unsigned int cmd, unsigned long arg)
724{
725 dbg("%scmd=0x%x", __FUNCTION__, cmd);
726
727 /* Based on code from acm.c and others */
728 switch (cmd) {
729 case TIOCMIWAIT:
730 /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
731 /* TODO */
732 return( 0 );
733
734 case TIOCGICOUNT:
735 /* return count of modemline transitions */
736 /* TODO */
737 return 0;
738
739 default:
740 dbg("%s: arg not supported - 0x%04x", __FUNCTION__,cmd);
741 return(-ENOIOCTLCMD);
742 break;
743 }
744 return 0;
745} /* mct_u232_ioctl */
746
747
748static int __init mct_u232_init (void)
749{
750 int retval;
751 retval = usb_serial_register(&mct_u232_device);
752 if (retval)
753 goto failed_usb_serial_register;
754 retval = usb_register(&mct_u232_driver);
755 if (retval)
756 goto failed_usb_register;
757 info(DRIVER_DESC " " DRIVER_VERSION);
758 return 0;
759failed_usb_register:
760 usb_serial_deregister(&mct_u232_device);
761failed_usb_serial_register:
762 return retval;
763}
764
765
766static void __exit mct_u232_exit (void)
767{
768 usb_deregister (&mct_u232_driver);
769 usb_serial_deregister (&mct_u232_device);
770}
771
772
773module_init (mct_u232_init);
774module_exit(mct_u232_exit);
775
776MODULE_AUTHOR( DRIVER_AUTHOR );
777MODULE_DESCRIPTION( DRIVER_DESC );
778MODULE_LICENSE("GPL");
779
780module_param(debug, bool, S_IRUGO | S_IWUSR);
781MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/mct_u232.h b/drivers/usb/serial/mct_u232.h
new file mode 100644
index 000000000000..73dd0d984cd3
--- /dev/null
+++ b/drivers/usb/serial/mct_u232.h
@@ -0,0 +1,453 @@
1/*
2 * Definitions for MCT (Magic Control Technology) USB-RS232 Converter Driver
3 *
4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This driver is for the device MCT USB-RS232 Converter (25 pin, Model No.
12 * U232-P25) from Magic Control Technology Corp. (there is also a 9 pin
13 * Model No. U232-P9). See http://www.mct.com.tw/p_u232.html for further
14 * information. The properties of this device are listed at the end of this
15 * file. This device is available from various distributors. I know Hana,
16 * http://www.hana.de and D-Link, http://www.dlink.com/products/usb/dsbs25.
17 *
18 * All of the information about the device was acquired by using SniffUSB
19 * on Windows98. The technical details of the reverse engineering are
20 * summarized at the end of this file.
21 */
22
23#ifndef __LINUX_USB_SERIAL_MCT_U232_H
24#define __LINUX_USB_SERIAL_MCT_U232_H
25
26#define MCT_U232_VID 0x0711 /* Vendor Id */
27#define MCT_U232_PID 0x0210 /* Original MCT Product Id */
28
29/* U232-P25, Sitecom */
30#define MCT_U232_SITECOM_PID 0x0230 /* Sitecom Product Id */
31
32/* DU-H3SP USB BAY hub */
33#define MCT_U232_DU_H3SP_PID 0x0200 /* D-Link DU-H3SP USB BAY */
34
35/* Belkin badge the MCT U232-P9 as the F5U109 */
36#define MCT_U232_BELKIN_F5U109_VID 0x050d /* Vendor Id */
37#define MCT_U232_BELKIN_F5U109_PID 0x0109 /* Product Id */
38
39/*
40 * Vendor Request Interface
41 */
42#define MCT_U232_SET_REQUEST_TYPE 0x40
43#define MCT_U232_GET_REQUEST_TYPE 0xc0
44
45#define MCT_U232_GET_MODEM_STAT_REQUEST 2 /* Get Modem Status Register (MSR) */
46#define MCT_U232_GET_MODEM_STAT_SIZE 1
47
48#define MCT_U232_GET_LINE_CTRL_REQUEST 6 /* Get Line Control Register (LCR) */
49#define MCT_U232_GET_LINE_CTRL_SIZE 1 /* ... not used by this driver */
50
51#define MCT_U232_SET_BAUD_RATE_REQUEST 5 /* Set Baud Rate Divisor */
52#define MCT_U232_SET_BAUD_RATE_SIZE 4
53
54#define MCT_U232_SET_LINE_CTRL_REQUEST 7 /* Set Line Control Register (LCR) */
55#define MCT_U232_SET_LINE_CTRL_SIZE 1
56
57#define MCT_U232_SET_MODEM_CTRL_REQUEST 10 /* Set Modem Control Register (MCR) */
58#define MCT_U232_SET_MODEM_CTRL_SIZE 1
59
60/* This USB device request code is not well understood. It is transmitted by
61 the MCT-supplied Windows driver whenever the baud rate changes.
62*/
63#define MCT_U232_SET_UNKNOWN1_REQUEST 11 /* Unknown functionality */
64#define MCT_U232_SET_UNKNOWN1_SIZE 1
65
66/* This USB device request code is not well understood. It is transmitted by
67 the MCT-supplied Windows driver whenever the baud rate changes.
68
69 Without this USB device request, the USB/RS-232 adapter will not write to
70 RS-232 devices which do not assert the 'CTS' signal.
71*/
72#define MCT_U232_SET_UNKNOWN2_REQUEST 12 /* Unknown functionality */
73#define MCT_U232_SET_UNKNOWN2_SIZE 1
74
75/*
76 * Baud rate (divisor)
77 * Actually, there are two of them, MCT website calls them "Philips solution"
78 * and "Intel solution". They are the regular MCT and "Sitecom" for us.
79 * This is pointless to document in the header, see the code for the bits.
80 */
81static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value);
82
83/*
84 * Line Control Register (LCR)
85 */
86#define MCT_U232_SET_BREAK 0x40
87
88#define MCT_U232_PARITY_SPACE 0x38
89#define MCT_U232_PARITY_MARK 0x28
90#define MCT_U232_PARITY_EVEN 0x18
91#define MCT_U232_PARITY_ODD 0x08
92#define MCT_U232_PARITY_NONE 0x00
93
94#define MCT_U232_DATA_BITS_5 0x00
95#define MCT_U232_DATA_BITS_6 0x01
96#define MCT_U232_DATA_BITS_7 0x02
97#define MCT_U232_DATA_BITS_8 0x03
98
99#define MCT_U232_STOP_BITS_2 0x04
100#define MCT_U232_STOP_BITS_1 0x00
101
102/*
103 * Modem Control Register (MCR)
104 */
105#define MCT_U232_MCR_NONE 0x8 /* Deactivate DTR and RTS */
106#define MCT_U232_MCR_RTS 0xa /* Activate RTS */
107#define MCT_U232_MCR_DTR 0x9 /* Activate DTR */
108
109/*
110 * Modem Status Register (MSR)
111 */
112#define MCT_U232_MSR_INDEX 0x0 /* data[index] */
113#define MCT_U232_MSR_CD 0x80 /* Current CD */
114#define MCT_U232_MSR_RI 0x40 /* Current RI */
115#define MCT_U232_MSR_DSR 0x20 /* Current DSR */
116#define MCT_U232_MSR_CTS 0x10 /* Current CTS */
117#define MCT_U232_MSR_DCD 0x08 /* Delta CD */
118#define MCT_U232_MSR_DRI 0x04 /* Delta RI */
119#define MCT_U232_MSR_DDSR 0x02 /* Delta DSR */
120#define MCT_U232_MSR_DCTS 0x01 /* Delta CTS */
121
122/*
123 * Line Status Register (LSR)
124 */
125#define MCT_U232_LSR_INDEX 1 /* data[index] */
126#define MCT_U232_LSR_ERR 0x80 /* OE | PE | FE | BI */
127#define MCT_U232_LSR_TEMT 0x40 /* transmit register empty */
128#define MCT_U232_LSR_THRE 0x20 /* transmit holding register empty */
129#define MCT_U232_LSR_BI 0x10 /* break indicator */
130#define MCT_U232_LSR_FE 0x08 /* framing error */
131#define MCT_U232_LSR_OE 0x02 /* overrun error */
132#define MCT_U232_LSR_PE 0x04 /* parity error */
133#define MCT_U232_LSR_OE 0x02 /* overrun error */
134#define MCT_U232_LSR_DR 0x01 /* receive data ready */
135
136
137/* -----------------------------------------------------------------------------
138 * Technical Specification reverse engineered with SniffUSB on Windows98
139 * =====================================================================
140 *
141 * The technical details of the device have been acquired be using "SniffUSB"
142 * and the vendor-supplied device driver (version 2.3A) under Windows98. To
143 * identify the USB vendor-specific requests and to assign them to terminal
144 * settings (flow control, baud rate, etc.) the program "SerialSettings" from
145 * William G. Greathouse has been proven to be very useful. I also used the
146 * Win98 "HyperTerminal" and "usb-robot" on Linux for testing. The results and
147 * observations are summarized below:
148 *
149 * The USB requests seem to be directly mapped to the registers of a 8250,
150 * 16450 or 16550 UART. The FreeBSD handbook (appendix F.4 "Input/Output
151 * devices") contains a comprehensive description of UARTs and its registers.
152 * The bit descriptions are actually taken from there.
153 *
154 *
155 * Baud rate (divisor)
156 * -------------------
157 *
158 * BmRequestType: 0x40 (0100 0000B)
159 * bRequest: 0x05
160 * wValue: 0x0000
161 * wIndex: 0x0000
162 * wLength: 0x0004
163 * Data: divisor = 115200 / baud_rate
164 *
165 * SniffUSB observations (Nov 2003): Contrary to the 'wLength' value of 4
166 * shown above, observations with a Belkin F5U109 adapter, using the
167 * MCT-supplied Windows98 driver (U2SPORT.VXD, "File version: 1.21P.0104 for
168 * Win98/Me"), show this request has a length of 1 byte, presumably because
169 * of the fact that the Belkin adapter and the 'Sitecom U232-P25' adapter
170 * use a baud-rate code instead of a conventional RS-232 baud rate divisor.
171 * The current source code for this driver does not reflect this fact, but
172 * the driver works fine with this adapter/driver combination nonetheless.
173 *
174 *
175 * Line Control Register (LCR)
176 * ---------------------------
177 *
178 * BmRequestType: 0x40 (0100 0000B) 0xc0 (1100 0000B)
179 * bRequest: 0x07 0x06
180 * wValue: 0x0000
181 * wIndex: 0x0000
182 * wLength: 0x0001
183 * Data: LCR (see below)
184 *
185 * Bit 7: Divisor Latch Access Bit (DLAB). When set, access to the data
186 * transmit/receive register (THR/RBR) and the Interrupt Enable Register
187 * (IER) is disabled. Any access to these ports is now redirected to the
188 * Divisor Latch Registers. Setting this bit, loading the Divisor
189 * Registers, and clearing DLAB should be done with interrupts disabled.
190 * Bit 6: Set Break. When set to "1", the transmitter begins to transmit
191 * continuous Spacing until this bit is set to "0". This overrides any
192 * bits of characters that are being transmitted.
193 * Bit 5: Stick Parity. When parity is enabled, setting this bit causes parity
194 * to always be "1" or "0", based on the value of Bit 4.
195 * Bit 4: Even Parity Select (EPS). When parity is enabled and Bit 5 is "0",
196 * setting this bit causes even parity to be transmitted and expected.
197 * Otherwise, odd parity is used.
198 * Bit 3: Parity Enable (PEN). When set to "1", a parity bit is inserted
199 * between the last bit of the data and the Stop Bit. The UART will also
200 * expect parity to be present in the received data.
201 * Bit 2: Number of Stop Bits (STB). If set to "1" and using 5-bit data words,
202 * 1.5 Stop Bits are transmitted and expected in each data word. For
203 * 6, 7 and 8-bit data words, 2 Stop Bits are transmitted and expected.
204 * When this bit is set to "0", one Stop Bit is used on each data word.
205 * Bit 1: Word Length Select Bit #1 (WLSB1)
206 * Bit 0: Word Length Select Bit #0 (WLSB0)
207 * Together these bits specify the number of bits in each data word.
208 * 1 0 Word Length
209 * 0 0 5 Data Bits
210 * 0 1 6 Data Bits
211 * 1 0 7 Data Bits
212 * 1 1 8 Data Bits
213 *
214 * SniffUSB observations: Bit 7 seems not to be used. There seem to be two bugs
215 * in the Win98 driver: the break does not work (bit 6 is not asserted) and the
216 * stick parity bit is not cleared when set once. The LCR can also be read
217 * back with USB request 6 but this has never been observed with SniffUSB.
218 *
219 *
220 * Modem Control Register (MCR)
221 * ----------------------------
222 *
223 * BmRequestType: 0x40 (0100 0000B)
224 * bRequest: 0x0a
225 * wValue: 0x0000
226 * wIndex: 0x0000
227 * wLength: 0x0001
228 * Data: MCR (Bit 4..7, see below)
229 *
230 * Bit 7: Reserved, always 0.
231 * Bit 6: Reserved, always 0.
232 * Bit 5: Reserved, always 0.
233 * Bit 4: Loop-Back Enable. When set to "1", the UART transmitter and receiver
234 * are internally connected together to allow diagnostic operations. In
235 * addition, the UART modem control outputs are connected to the UART
236 * modem control inputs. CTS is connected to RTS, DTR is connected to
237 * DSR, OUT1 is connected to RI, and OUT 2 is connected to DCD.
238 * Bit 3: OUT 2. An auxiliary output that the host processor may set high or
239 * low. In the IBM PC serial adapter (and most clones), OUT 2 is used
240 * to tri-state (disable) the interrupt signal from the
241 * 8250/16450/16550 UART.
242 * Bit 2: OUT 1. An auxiliary output that the host processor may set high or
243 * low. This output is not used on the IBM PC serial adapter.
244 * Bit 1: Request to Send (RTS). When set to "1", the output of the UART -RTS
245 * line is Low (Active).
246 * Bit 0: Data Terminal Ready (DTR). When set to "1", the output of the UART
247 * -DTR line is Low (Active).
248 *
249 * SniffUSB observations: Bit 2 and 4 seem not to be used but bit 3 has been
250 * seen _always_ set.
251 *
252 *
253 * Modem Status Register (MSR)
254 * ---------------------------
255 *
256 * BmRequestType: 0xc0 (1100 0000B)
257 * bRequest: 0x02
258 * wValue: 0x0000
259 * wIndex: 0x0000
260 * wLength: 0x0001
261 * Data: MSR (see below)
262 *
263 * Bit 7: Data Carrier Detect (CD). Reflects the state of the DCD line on the
264 * UART.
265 * Bit 6: Ring Indicator (RI). Reflects the state of the RI line on the UART.
266 * Bit 5: Data Set Ready (DSR). Reflects the state of the DSR line on the UART.
267 * Bit 4: Clear To Send (CTS). Reflects the state of the CTS line on the UART.
268 * Bit 3: Delta Data Carrier Detect (DDCD). Set to "1" if the -DCD line has
269 * changed state one more more times since the last time the MSR was
270 * read by the host.
271 * Bit 2: Trailing Edge Ring Indicator (TERI). Set to "1" if the -RI line has
272 * had a low to high transition since the last time the MSR was read by
273 * the host.
274 * Bit 1: Delta Data Set Ready (DDSR). Set to "1" if the -DSR line has changed
275 * state one more more times since the last time the MSR was read by the
276 * host.
277 * Bit 0: Delta Clear To Send (DCTS). Set to "1" if the -CTS line has changed
278 * state one more times since the last time the MSR was read by the
279 * host.
280 *
281 * SniffUSB observations: the MSR is also returned as first byte on the
282 * interrupt-in endpoint 0x83 to signal changes of modem status lines. The USB
283 * request to read MSR cannot be applied during normal device operation.
284 *
285 *
286 * Line Status Register (LSR)
287 * --------------------------
288 *
289 * Bit 7 Error in Receiver FIFO. On the 8250/16450 UART, this bit is zero.
290 * This bit is set to "1" when any of the bytes in the FIFO have one or
291 * more of the following error conditions: PE, FE, or BI.
292 * Bit 6 Transmitter Empty (TEMT). When set to "1", there are no words
293 * remaining in the transmit FIFO or the transmit shift register. The
294 * transmitter is completely idle.
295 * Bit 5 Transmitter Holding Register Empty (THRE). When set to "1", the FIFO
296 * (or holding register) now has room for at least one additional word
297 * to transmit. The transmitter may still be transmitting when this bit
298 * is set to "1".
299 * Bit 4 Break Interrupt (BI). The receiver has detected a Break signal.
300 * Bit 3 Framing Error (FE). A Start Bit was detected but the Stop Bit did not
301 * appear at the expected time. The received word is probably garbled.
302 * Bit 2 Parity Error (PE). The parity bit was incorrect for the word received.
303 * Bit 1 Overrun Error (OE). A new word was received and there was no room in
304 * the receive buffer. The newly-arrived word in the shift register is
305 * discarded. On 8250/16450 UARTs, the word in the holding register is
306 * discarded and the newly- arrived word is put in the holding register.
307 * Bit 0 Data Ready (DR). One or more words are in the receive FIFO that the
308 * host may read. A word must be completely received and moved from the
309 * shift register into the FIFO (or holding register for 8250/16450
310 * designs) before this bit is set.
311 *
312 * SniffUSB observations: the LSR is returned as second byte on the interrupt-in
313 * endpoint 0x83 to signal error conditions. Such errors have been seen with
314 * minicom/zmodem transfers (CRC errors).
315 *
316 *
317 * Unknown #1
318 * -------------------
319 *
320 * BmRequestType: 0x40 (0100 0000B)
321 * bRequest: 0x0b
322 * wValue: 0x0000
323 * wIndex: 0x0000
324 * wLength: 0x0001
325 * Data: 0x00
326 *
327 * SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
328 * (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
329 * occurs immediately after a "Baud rate (divisor)" message. It was not
330 * observed at any other time. It is unclear what purpose this message
331 * serves.
332 *
333 *
334 * Unknown #2
335 * -------------------
336 *
337 * BmRequestType: 0x40 (0100 0000B)
338 * bRequest: 0x0c
339 * wValue: 0x0000
340 * wIndex: 0x0000
341 * wLength: 0x0001
342 * Data: 0x00
343 *
344 * SniffUSB observations (Nov 2003): With the MCT-supplied Windows98 driver
345 * (U2SPORT.VXD, "File version: 1.21P.0104 for Win98/Me"), this request
346 * occurs immediately after the 'Unknown #1' message (see above). It was
347 * not observed at any other time. It is unclear what other purpose (if
348 * any) this message might serve, but without it, the USB/RS-232 adapter
349 * will not write to RS-232 devices which do not assert the 'CTS' signal.
350 *
351 *
352 * Flow control
353 * ------------
354 *
355 * SniffUSB observations: no flow control specific requests have been realized
356 * apart from DTR/RTS settings. Both signals are dropped for no flow control
357 * but asserted for hardware or software flow control.
358 *
359 *
360 * Endpoint usage
361 * --------------
362 *
363 * SniffUSB observations: the bulk-out endpoint 0x1 and interrupt-in endpoint
364 * 0x81 is used to transmit and receive characters. The second interrupt-in
365 * endpoint 0x83 signals exceptional conditions like modem line changes and
366 * errors. The first byte returned is the MSR and the second byte the LSR.
367 *
368 *
369 * Other observations
370 * ------------------
371 *
372 * Queued bulk transfers like used in visor.c did not work.
373 *
374 *
375 * Properties of the USB device used (as found in /var/log/messages)
376 * -----------------------------------------------------------------
377 *
378 * Manufacturer: MCT Corporation.
379 * Product: USB-232 Interfact Controller
380 * SerialNumber: U2S22050
381 *
382 * Length = 18
383 * DescriptorType = 01
384 * USB version = 1.00
385 * Vendor:Product = 0711:0210
386 * MaxPacketSize0 = 8
387 * NumConfigurations = 1
388 * Device version = 1.02
389 * Device Class:SubClass:Protocol = 00:00:00
390 * Per-interface classes
391 * Configuration:
392 * bLength = 9
393 * bDescriptorType = 02
394 * wTotalLength = 0027
395 * bNumInterfaces = 01
396 * bConfigurationValue = 01
397 * iConfiguration = 00
398 * bmAttributes = c0
399 * MaxPower = 100mA
400 *
401 * Interface: 0
402 * Alternate Setting: 0
403 * bLength = 9
404 * bDescriptorType = 04
405 * bInterfaceNumber = 00
406 * bAlternateSetting = 00
407 * bNumEndpoints = 03
408 * bInterface Class:SubClass:Protocol = 00:00:00
409 * iInterface = 00
410 * Endpoint:
411 * bLength = 7
412 * bDescriptorType = 05
413 * bEndpointAddress = 81 (in)
414 * bmAttributes = 03 (Interrupt)
415 * wMaxPacketSize = 0040
416 * bInterval = 02
417 * Endpoint:
418 * bLength = 7
419 * bDescriptorType = 05
420 * bEndpointAddress = 01 (out)
421 * bmAttributes = 02 (Bulk)
422 * wMaxPacketSize = 0040
423 * bInterval = 00
424 * Endpoint:
425 * bLength = 7
426 * bDescriptorType = 05
427 * bEndpointAddress = 83 (in)
428 * bmAttributes = 03 (Interrupt)
429 * wMaxPacketSize = 0002
430 * bInterval = 02
431 *
432 *
433 * Hardware details (added by Martin Hamilton, 2001/12/06)
434 * -----------------------------------------------------------------
435 *
436 * This info was gleaned from opening a Belkin F5U109 DB9 USB serial
437 * adaptor, which turns out to simply be a re-badged U232-P9. We
438 * know this because there is a sticky label on the circuit board
439 * which says "U232-P9" ;-)
440 *
441 * The circuit board inside the adaptor contains a Philips PDIUSBD12
442 * USB endpoint chip and a Phillips P87C52UBAA microcontroller with
443 * embedded UART. Exhaustive documentation for these is available at:
444 *
445 * http://www.semiconductors.philips.com/pip/p87c52ubaa
446 * http://www.semiconductors.philips.com/pip/pdiusbd12
447 *
448 * Thanks to Julian Highfield for the pointer to the Philips database.
449 *
450 */
451
452#endif /* __LINUX_USB_SERIAL_MCT_U232_H */
453
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
new file mode 100644
index 000000000000..a1cba4b5fa23
--- /dev/null
+++ b/drivers/usb/serial/omninet.c
@@ -0,0 +1,362 @@
1/*
2 * USB ZyXEL omni.net LCD PLUS driver
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * See Documentation/usb/usb-serial.txt for more information on using this driver
10 *
11 * Please report both successes and troubles to the author at omninet@kroah.com
12 *
13 * (05/30/2001) gkh
14 * switched from using spinlock to a semaphore, which fixes lots of problems.
15 *
16 * (04/08/2001) gb
17 * Identify version on module load.
18 *
19 * (11/01/2000) Adam J. Richter
20 * usb_device_id table support
21 *
22 * (10/05/2000) gkh
23 * Fixed bug with urb->dev not being set properly, now that the usb
24 * core needs it.
25 *
26 * (08/28/2000) gkh
27 * Added locks for SMP safeness.
28 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
29 * than once.
30 * Fixed potential race in omninet_write_bulk_callback
31 *
32 * (07/19/2000) gkh
33 * Added module_init and module_exit functions to handle the fact that this
34 * driver is a loadable module now.
35 *
36 */
37
38#include <linux/config.h>
39#include <linux/kernel.h>
40#include <linux/errno.h>
41#include <linux/init.h>
42#include <linux/slab.h>
43#include <linux/tty.h>
44#include <linux/tty_driver.h>
45#include <linux/tty_flip.h>
46#include <linux/module.h>
47#include <linux/spinlock.h>
48#include <asm/uaccess.h>
49#include <linux/usb.h>
50#include "usb-serial.h"
51
52static int debug;
53
54/*
55 * Version Information
56 */
57#define DRIVER_VERSION "v1.1"
58#define DRIVER_AUTHOR "Alessandro Zummo"
59#define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver"
60
61#define ZYXEL_VENDOR_ID 0x0586
62#define ZYXEL_OMNINET_ID 0x1000
63#define BT_IGNITIONPRO_ID 0x2000 /* This one seems to be a re-branded ZyXEL device */
64
65/* function prototypes */
66static int omninet_open (struct usb_serial_port *port, struct file *filp);
67static void omninet_close (struct usb_serial_port *port, struct file *filp);
68static void omninet_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
69static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
70static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count);
71static int omninet_write_room (struct usb_serial_port *port);
72static void omninet_shutdown (struct usb_serial *serial);
73
74static struct usb_device_id id_table [] = {
75 { USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) },
76 { USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) },
77 { } /* Terminating entry */
78};
79
80MODULE_DEVICE_TABLE (usb, id_table);
81
82static struct usb_driver omninet_driver = {
83 .owner = THIS_MODULE,
84 .name = "omninet",
85 .probe = usb_serial_probe,
86 .disconnect = usb_serial_disconnect,
87 .id_table = id_table,
88};
89
90
91static struct usb_serial_device_type zyxel_omninet_device = {
92 .owner = THIS_MODULE,
93 .name = "ZyXEL - omni.net lcd plus usb",
94 .short_name = "omninet",
95 .id_table = id_table,
96 .num_interrupt_in = 1,
97 .num_bulk_in = 1,
98 .num_bulk_out = 2,
99 .num_ports = 1,
100 .open = omninet_open,
101 .close = omninet_close,
102 .write = omninet_write,
103 .write_room = omninet_write_room,
104 .read_bulk_callback = omninet_read_bulk_callback,
105 .write_bulk_callback = omninet_write_bulk_callback,
106 .shutdown = omninet_shutdown,
107};
108
109
110/* The protocol.
111 *
112 * The omni.net always exchange 64 bytes of data with the host. The first
113 * four bytes are the control header, you can see it in the above structure.
114 *
115 * oh_seq is a sequence number. Don't know if/how it's used.
116 * oh_len is the length of the data bytes in the packet.
117 * oh_xxx Bit-mapped, related to handshaking and status info.
118 * I normally set it to 0x03 in trasmitted frames.
119 * 7: Active when the TA is in a CONNECTed state.
120 * 6: unknown
121 * 5: handshaking, unknown
122 * 4: handshaking, unknown
123 * 3: unknown, usually 0
124 * 2: unknown, usually 0
125 * 1: handshaking, unknown, usually set to 1 in trasmitted frames
126 * 0: handshaking, unknown, usually set to 1 in trasmitted frames
127 * oh_pad Probably a pad byte.
128 *
129 * After the header you will find data bytes if oh_len was greater than zero.
130 *
131 */
132
133struct omninet_header
134{
135 __u8 oh_seq;
136 __u8 oh_len;
137 __u8 oh_xxx;
138 __u8 oh_pad;
139};
140
141struct omninet_data
142{
143 __u8 od_outseq; // Sequence number for bulk_out URBs
144};
145
146static int omninet_open (struct usb_serial_port *port, struct file *filp)
147{
148 struct usb_serial *serial = port->serial;
149 struct usb_serial_port *wport;
150 struct omninet_data *od;
151 int result = 0;
152
153 dbg("%s - port %d", __FUNCTION__, port->number);
154
155 od = kmalloc( sizeof(struct omninet_data), GFP_KERNEL );
156 if( !od ) {
157 err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct omninet_data));
158 return -ENOMEM;
159 }
160
161 usb_set_serial_port_data(port, od);
162 wport = serial->port[1];
163 wport->tty = port->tty;
164
165 /* Start reading from the device */
166 usb_fill_bulk_urb(port->read_urb, serial->dev,
167 usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
168 port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
169 omninet_read_bulk_callback, port);
170 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
171 if (result)
172 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
173
174 return result;
175}
176
177static void omninet_close (struct usb_serial_port *port, struct file * filp)
178{
179 struct usb_serial *serial = port->serial;
180 struct usb_serial_port *wport;
181 struct omninet_data *od;
182
183 dbg("%s - port %d", __FUNCTION__, port->number);
184
185 wport = serial->port[1];
186 usb_kill_urb(wport->write_urb);
187 usb_kill_urb(port->read_urb);
188
189 od = usb_get_serial_port_data(port);
190 if (od)
191 kfree(od);
192}
193
194
195#define OMNINET_DATAOFFSET 0x04
196#define OMNINET_HEADERLEN sizeof(struct omninet_header)
197#define OMNINET_BULKOUTSIZE (64 - OMNINET_HEADERLEN)
198
199static void omninet_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
200{
201 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
202 unsigned char *data = urb->transfer_buffer;
203 struct omninet_header *header = (struct omninet_header *) &data[0];
204
205 int i;
206 int result;
207
208// dbg("omninet_read_bulk_callback");
209
210 if (urb->status) {
211 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
212 return;
213 }
214
215 if ((debug) && (header->oh_xxx != 0x30)) {
216 if (urb->actual_length) {
217 printk (KERN_DEBUG __FILE__ ": omninet_read %d: ", header->oh_len);
218 for (i = 0; i < (header->oh_len + OMNINET_HEADERLEN); i++) {
219 printk ("%.2x ", data[i]);
220 }
221 printk ("\n");
222 }
223 }
224
225 if (urb->actual_length && header->oh_len) {
226 for (i = 0; i < header->oh_len; i++) {
227 tty_insert_flip_char(port->tty, data[OMNINET_DATAOFFSET + i], 0);
228 }
229 tty_flip_buffer_push(port->tty);
230 }
231
232 /* Continue trying to always read */
233 usb_fill_bulk_urb(urb, port->serial->dev,
234 usb_rcvbulkpipe(port->serial->dev, port->bulk_in_endpointAddress),
235 urb->transfer_buffer, urb->transfer_buffer_length,
236 omninet_read_bulk_callback, port);
237 result = usb_submit_urb(urb, GFP_ATOMIC);
238 if (result)
239 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
240
241 return;
242}
243
244static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count)
245{
246 struct usb_serial *serial = port->serial;
247 struct usb_serial_port *wport = serial->port[1];
248
249 struct omninet_data *od = usb_get_serial_port_data(port);
250 struct omninet_header *header = (struct omninet_header *) wport->write_urb->transfer_buffer;
251
252 int result;
253
254// dbg("omninet_write port %d", port->number);
255
256 if (count == 0) {
257 dbg("%s - write request of 0 bytes", __FUNCTION__);
258 return (0);
259 }
260 if (wport->write_urb->status == -EINPROGRESS) {
261 dbg("%s - already writing", __FUNCTION__);
262 return (0);
263 }
264
265 count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count;
266
267 memcpy (wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, count);
268
269 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, wport->write_urb->transfer_buffer);
270
271 header->oh_seq = od->od_outseq++;
272 header->oh_len = count;
273 header->oh_xxx = 0x03;
274 header->oh_pad = 0x00;
275
276 /* send the data out the bulk port, always 64 bytes */
277 wport->write_urb->transfer_buffer_length = 64;
278
279 wport->write_urb->dev = serial->dev;
280 result = usb_submit_urb(wport->write_urb, GFP_ATOMIC);
281 if (result)
282 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
283 else
284 result = count;
285
286 return result;
287}
288
289
290static int omninet_write_room (struct usb_serial_port *port)
291{
292 struct usb_serial *serial = port->serial;
293 struct usb_serial_port *wport = serial->port[1];
294
295 int room = 0; // Default: no room
296
297 if (wport->write_urb->status != -EINPROGRESS)
298 room = wport->bulk_out_size - OMNINET_HEADERLEN;
299
300// dbg("omninet_write_room returns %d", room);
301
302 return (room);
303}
304
305static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
306{
307/* struct omninet_header *header = (struct omninet_header *) urb->transfer_buffer; */
308 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
309
310// dbg("omninet_write_bulk_callback, port %0x\n", port);
311
312 if (urb->status) {
313 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
314 return;
315 }
316
317 schedule_work(&port->work);
318
319// dbg("omninet_write_bulk_callback, tty %0x\n", tty);
320}
321
322
323static void omninet_shutdown (struct usb_serial *serial)
324{
325 dbg ("%s", __FUNCTION__);
326}
327
328
329static int __init omninet_init (void)
330{
331 int retval;
332 retval = usb_serial_register(&zyxel_omninet_device);
333 if (retval)
334 goto failed_usb_serial_register;
335 retval = usb_register(&omninet_driver);
336 if (retval)
337 goto failed_usb_register;
338 info(DRIVER_VERSION ":" DRIVER_DESC);
339 return 0;
340failed_usb_register:
341 usb_serial_deregister(&zyxel_omninet_device);
342failed_usb_serial_register:
343 return retval;
344}
345
346
347static void __exit omninet_exit (void)
348{
349 usb_deregister (&omninet_driver);
350 usb_serial_deregister (&zyxel_omninet_device);
351}
352
353
354module_init(omninet_init);
355module_exit(omninet_exit);
356
357MODULE_AUTHOR( DRIVER_AUTHOR );
358MODULE_DESCRIPTION( DRIVER_DESC );
359MODULE_LICENSE("GPL");
360
361module_param(debug, bool, S_IRUGO | S_IWUSR);
362MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
new file mode 100644
index 000000000000..3368d2b0412d
--- /dev/null
+++ b/drivers/usb/serial/pl2303.c
@@ -0,0 +1,1200 @@
1/*
2 * Prolific PL2303 USB to serial adaptor driver
3 *
4 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2003 IBM Corp.
6 *
7 * Original driver for 2.2.x by anonymous
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * See Documentation/usb/usb-serial.txt for more information on using this driver
15 *
16 * 2002_Mar_26 gkh
17 * allowed driver to work properly if there is no tty assigned to a port
18 * (this happens for serial console devices.)
19 *
20 * 2001_Oct_06 gkh
21 * Added RTS and DTR line control. Thanks to joe@bndlg.de for parts of it.
22 *
23 * 2001_Sep_19 gkh
24 * Added break support.
25 *
26 * 2001_Aug_30 gkh
27 * fixed oops in write_bulk_callback.
28 *
29 * 2001_Aug_28 gkh
30 * reworked buffer logic to be like other usb-serial drivers. Hopefully
31 * removing some reported problems.
32 *
33 * 2001_Jun_06 gkh
34 * finished porting to 2.4 format.
35 *
36 */
37
38#include <linux/config.h>
39#include <linux/kernel.h>
40#include <linux/errno.h>
41#include <linux/init.h>
42#include <linux/slab.h>
43#include <linux/tty.h>
44#include <linux/tty_driver.h>
45#include <linux/tty_flip.h>
46#include <linux/serial.h>
47#include <linux/module.h>
48#include <linux/moduleparam.h>
49#include <linux/spinlock.h>
50#include <asm/uaccess.h>
51#include <linux/usb.h>
52#include "usb-serial.h"
53#include "pl2303.h"
54
55/*
56 * Version Information
57 */
58#define DRIVER_VERSION "v0.12"
59#define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
60
61static int debug;
62
63#define PL2303_CLOSING_WAIT (30*HZ)
64
65#define PL2303_BUF_SIZE 1024
66#define PL2303_TMP_BUF_SIZE 1024
67
68static DECLARE_MUTEX(pl2303_tmp_buf_sem);
69
70struct pl2303_buf {
71 unsigned int buf_size;
72 char *buf_buf;
73 char *buf_get;
74 char *buf_put;
75};
76
77static struct usb_device_id id_table [] = {
78 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
79 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
80 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
81 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
82 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
83 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
84 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
85 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
86 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
87 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
88 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
89 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
90 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
91 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
92 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
93 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
94 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
95 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
96 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
97 { } /* Terminating entry */
98};
99
100MODULE_DEVICE_TABLE (usb, id_table);
101
102static struct usb_driver pl2303_driver = {
103 .owner = THIS_MODULE,
104 .name = "pl2303",
105 .probe = usb_serial_probe,
106 .disconnect = usb_serial_disconnect,
107 .id_table = id_table,
108};
109
110#define SET_LINE_REQUEST_TYPE 0x21
111#define SET_LINE_REQUEST 0x20
112
113#define SET_CONTROL_REQUEST_TYPE 0x21
114#define SET_CONTROL_REQUEST 0x22
115#define CONTROL_DTR 0x01
116#define CONTROL_RTS 0x02
117
118#define BREAK_REQUEST_TYPE 0x21
119#define BREAK_REQUEST 0x23
120#define BREAK_ON 0xffff
121#define BREAK_OFF 0x0000
122
123#define GET_LINE_REQUEST_TYPE 0xa1
124#define GET_LINE_REQUEST 0x21
125
126#define VENDOR_WRITE_REQUEST_TYPE 0x40
127#define VENDOR_WRITE_REQUEST 0x01
128
129#define VENDOR_READ_REQUEST_TYPE 0xc0
130#define VENDOR_READ_REQUEST 0x01
131
132#define UART_STATE 0x08
133#define UART_STATE_TRANSIENT_MASK 0x74
134#define UART_DCD 0x01
135#define UART_DSR 0x02
136#define UART_BREAK_ERROR 0x04
137#define UART_RING 0x08
138#define UART_FRAME_ERROR 0x10
139#define UART_PARITY_ERROR 0x20
140#define UART_OVERRUN_ERROR 0x40
141#define UART_CTS 0x80
142
143/* function prototypes for a PL2303 serial converter */
144static int pl2303_open (struct usb_serial_port *port, struct file *filp);
145static void pl2303_close (struct usb_serial_port *port, struct file *filp);
146static void pl2303_set_termios (struct usb_serial_port *port,
147 struct termios *old);
148static int pl2303_ioctl (struct usb_serial_port *port, struct file *file,
149 unsigned int cmd, unsigned long arg);
150static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs);
151static void pl2303_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
152static void pl2303_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
153static int pl2303_write (struct usb_serial_port *port,
154 const unsigned char *buf, int count);
155static void pl2303_send (struct usb_serial_port *port);
156static int pl2303_write_room(struct usb_serial_port *port);
157static int pl2303_chars_in_buffer(struct usb_serial_port *port);
158static void pl2303_break_ctl(struct usb_serial_port *port,int break_state);
159static int pl2303_tiocmget (struct usb_serial_port *port, struct file *file);
160static int pl2303_tiocmset (struct usb_serial_port *port, struct file *file,
161 unsigned int set, unsigned int clear);
162static int pl2303_startup (struct usb_serial *serial);
163static void pl2303_shutdown (struct usb_serial *serial);
164static struct pl2303_buf *pl2303_buf_alloc(unsigned int size);
165static void pl2303_buf_free(struct pl2303_buf *pb);
166static void pl2303_buf_clear(struct pl2303_buf *pb);
167static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb);
168static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb);
169static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
170 unsigned int count);
171static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
172 unsigned int count);
173
174
175/* All of the device info needed for the PL2303 SIO serial converter */
176static struct usb_serial_device_type pl2303_device = {
177 .owner = THIS_MODULE,
178 .name = "PL-2303",
179 .id_table = id_table,
180 .num_interrupt_in = NUM_DONT_CARE,
181 .num_bulk_in = 1,
182 .num_bulk_out = 1,
183 .num_ports = 1,
184 .open = pl2303_open,
185 .close = pl2303_close,
186 .write = pl2303_write,
187 .ioctl = pl2303_ioctl,
188 .break_ctl = pl2303_break_ctl,
189 .set_termios = pl2303_set_termios,
190 .tiocmget = pl2303_tiocmget,
191 .tiocmset = pl2303_tiocmset,
192 .read_bulk_callback = pl2303_read_bulk_callback,
193 .read_int_callback = pl2303_read_int_callback,
194 .write_bulk_callback = pl2303_write_bulk_callback,
195 .write_room = pl2303_write_room,
196 .chars_in_buffer = pl2303_chars_in_buffer,
197 .attach = pl2303_startup,
198 .shutdown = pl2303_shutdown,
199};
200
201enum pl2303_type {
202 type_0, /* don't know the difference between type 0 and */
203 type_1, /* type 1, until someone from prolific tells us... */
204 HX, /* HX version of the pl2303 chip */
205};
206
207struct pl2303_private {
208 spinlock_t lock;
209 struct pl2303_buf *buf;
210 int write_urb_in_use;
211 wait_queue_head_t delta_msr_wait;
212 u8 line_control;
213 u8 line_status;
214 u8 termios_initialized;
215 enum pl2303_type type;
216};
217
218
219static int pl2303_startup (struct usb_serial *serial)
220{
221 struct pl2303_private *priv;
222 enum pl2303_type type = type_0;
223 int i;
224
225 if (serial->dev->descriptor.bDeviceClass == 0x02)
226 type = type_0;
227 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
228 type = HX;
229 else if (serial->dev->descriptor.bDeviceClass == 0x00)
230 type = type_1;
231 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
232 type = type_1;
233 dbg("device type: %d", type);
234
235 for (i = 0; i < serial->num_ports; ++i) {
236 priv = kmalloc (sizeof (struct pl2303_private), GFP_KERNEL);
237 if (!priv)
238 goto cleanup;
239 memset (priv, 0x00, sizeof (struct pl2303_private));
240 spin_lock_init(&priv->lock);
241 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
242 if (priv->buf == NULL) {
243 kfree(priv);
244 goto cleanup;
245 }
246 init_waitqueue_head(&priv->delta_msr_wait);
247 priv->type = type;
248 usb_set_serial_port_data(serial->port[i], priv);
249 }
250 return 0;
251
252cleanup:
253 for (--i; i>=0; --i) {
254 priv = usb_get_serial_port_data(serial->port[i]);
255 pl2303_buf_free(priv->buf);
256 kfree(priv);
257 usb_set_serial_port_data(serial->port[i], NULL);
258 }
259 return -ENOMEM;
260}
261
262static int set_control_lines (struct usb_device *dev, u8 value)
263{
264 int retval;
265
266 retval = usb_control_msg (dev, usb_sndctrlpipe (dev, 0),
267 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
268 value, 0, NULL, 0, 100);
269 dbg("%s - value = %d, retval = %d", __FUNCTION__, value, retval);
270 return retval;
271}
272
273static int pl2303_write (struct usb_serial_port *port, const unsigned char *buf, int count)
274{
275 struct pl2303_private *priv = usb_get_serial_port_data(port);
276 unsigned long flags;
277
278 dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
279
280 if (!count)
281 return count;
282
283 spin_lock_irqsave(&priv->lock, flags);
284 count = pl2303_buf_put(priv->buf, buf, count);
285 spin_unlock_irqrestore(&priv->lock, flags);
286
287 pl2303_send(port);
288
289 return count;
290}
291
292static void pl2303_send(struct usb_serial_port *port)
293{
294 int count, result;
295 struct pl2303_private *priv = usb_get_serial_port_data(port);
296 unsigned long flags;
297
298 dbg("%s - port %d", __FUNCTION__, port->number);
299
300 spin_lock_irqsave(&priv->lock, flags);
301
302 if (priv->write_urb_in_use) {
303 spin_unlock_irqrestore(&priv->lock, flags);
304 return;
305 }
306
307 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
308 port->bulk_out_size);
309
310 if (count == 0) {
311 spin_unlock_irqrestore(&priv->lock, flags);
312 return;
313 }
314
315 priv->write_urb_in_use = 1;
316
317 spin_unlock_irqrestore(&priv->lock, flags);
318
319 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
320
321 port->write_urb->transfer_buffer_length = count;
322 port->write_urb->dev = port->serial->dev;
323 result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
324 if (result) {
325 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
326 priv->write_urb_in_use = 0;
327 // TODO: reschedule pl2303_send
328 }
329
330 schedule_work(&port->work);
331}
332
333static int pl2303_write_room(struct usb_serial_port *port)
334{
335 struct pl2303_private *priv = usb_get_serial_port_data(port);
336 int room = 0;
337 unsigned long flags;
338
339 dbg("%s - port %d", __FUNCTION__, port->number);
340
341 spin_lock_irqsave(&priv->lock, flags);
342 room = pl2303_buf_space_avail(priv->buf);
343 spin_unlock_irqrestore(&priv->lock, flags);
344
345 dbg("%s - returns %d", __FUNCTION__, room);
346 return room;
347}
348
349static int pl2303_chars_in_buffer(struct usb_serial_port *port)
350{
351 struct pl2303_private *priv = usb_get_serial_port_data(port);
352 int chars = 0;
353 unsigned long flags;
354
355 dbg("%s - port %d", __FUNCTION__, port->number);
356
357 spin_lock_irqsave(&priv->lock, flags);
358 chars = pl2303_buf_data_avail(priv->buf);
359 spin_unlock_irqrestore(&priv->lock, flags);
360
361 dbg("%s - returns %d", __FUNCTION__, chars);
362 return chars;
363}
364
365static void pl2303_set_termios (struct usb_serial_port *port, struct termios *old_termios)
366{
367 struct usb_serial *serial = port->serial;
368 struct pl2303_private *priv = usb_get_serial_port_data(port);
369 unsigned long flags;
370 unsigned int cflag;
371 unsigned char *buf;
372 int baud;
373 int i;
374 u8 control;
375
376 dbg("%s - port %d", __FUNCTION__, port->number);
377
378 if ((!port->tty) || (!port->tty->termios)) {
379 dbg("%s - no tty structures", __FUNCTION__);
380 return;
381 }
382
383 spin_lock_irqsave(&priv->lock, flags);
384 if (!priv->termios_initialized) {
385 *(port->tty->termios) = tty_std_termios;
386 port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
387 priv->termios_initialized = 1;
388 }
389 spin_unlock_irqrestore(&priv->lock, flags);
390
391 cflag = port->tty->termios->c_cflag;
392 /* check that they really want us to change something */
393 if (old_termios) {
394 if ((cflag == old_termios->c_cflag) &&
395 (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
396 dbg("%s - nothing to change...", __FUNCTION__);
397 return;
398 }
399 }
400
401 buf = kmalloc (7, GFP_KERNEL);
402 if (!buf) {
403 dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__);
404 return;
405 }
406 memset (buf, 0x00, 0x07);
407
408 i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
409 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
410 0, 0, buf, 7, 100);
411 dbg ("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
412 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
413
414
415 if (cflag & CSIZE) {
416 switch (cflag & CSIZE) {
417 case CS5: buf[6] = 5; break;
418 case CS6: buf[6] = 6; break;
419 case CS7: buf[6] = 7; break;
420 default:
421 case CS8: buf[6] = 8; break;
422 }
423 dbg("%s - data bits = %d", __FUNCTION__, buf[6]);
424 }
425
426 baud = 0;
427 switch (cflag & CBAUD) {
428 case B0: baud = 0; break;
429 case B75: baud = 75; break;
430 case B150: baud = 150; break;
431 case B300: baud = 300; break;
432 case B600: baud = 600; break;
433 case B1200: baud = 1200; break;
434 case B1800: baud = 1800; break;
435 case B2400: baud = 2400; break;
436 case B4800: baud = 4800; break;
437 case B9600: baud = 9600; break;
438 case B19200: baud = 19200; break;
439 case B38400: baud = 38400; break;
440 case B57600: baud = 57600; break;
441 case B115200: baud = 115200; break;
442 case B230400: baud = 230400; break;
443 case B460800: baud = 460800; break;
444 default:
445 dev_err(&port->dev, "pl2303 driver does not support the baudrate requested (fix it)\n");
446 break;
447 }
448 dbg("%s - baud = %d", __FUNCTION__, baud);
449 if (baud) {
450 buf[0] = baud & 0xff;
451 buf[1] = (baud >> 8) & 0xff;
452 buf[2] = (baud >> 16) & 0xff;
453 buf[3] = (baud >> 24) & 0xff;
454 }
455
456 /* For reference buf[4]=0 is 1 stop bits */
457 /* For reference buf[4]=1 is 1.5 stop bits */
458 /* For reference buf[4]=2 is 2 stop bits */
459 if (cflag & CSTOPB) {
460 buf[4] = 2;
461 dbg("%s - stop bits = 2", __FUNCTION__);
462 } else {
463 buf[4] = 0;
464 dbg("%s - stop bits = 1", __FUNCTION__);
465 }
466
467 if (cflag & PARENB) {
468 /* For reference buf[5]=0 is none parity */
469 /* For reference buf[5]=1 is odd parity */
470 /* For reference buf[5]=2 is even parity */
471 /* For reference buf[5]=3 is mark parity */
472 /* For reference buf[5]=4 is space parity */
473 if (cflag & PARODD) {
474 buf[5] = 1;
475 dbg("%s - parity = odd", __FUNCTION__);
476 } else {
477 buf[5] = 2;
478 dbg("%s - parity = even", __FUNCTION__);
479 }
480 } else {
481 buf[5] = 0;
482 dbg("%s - parity = none", __FUNCTION__);
483 }
484
485 i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
486 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
487 0, 0, buf, 7, 100);
488 dbg ("0x21:0x20:0:0 %d", i);
489
490 /* change control lines if we are switching to or from B0 */
491 spin_lock_irqsave(&priv->lock, flags);
492 control = priv->line_control;
493 if ((cflag & CBAUD) == B0)
494 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
495 else
496 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
497 if (control != priv->line_control) {
498 control = priv->line_control;
499 spin_unlock_irqrestore(&priv->lock, flags);
500 set_control_lines(serial->dev, control);
501 } else {
502 spin_unlock_irqrestore(&priv->lock, flags);
503 }
504
505 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
506
507 i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
508 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
509 0, 0, buf, 7, 100);
510 dbg ("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
511 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
512
513 if (cflag & CRTSCTS) {
514 __u16 index;
515 if (priv->type == HX)
516 index = 0x61;
517 else
518 index = 0x41;
519 i = usb_control_msg(serial->dev,
520 usb_sndctrlpipe(serial->dev, 0),
521 VENDOR_WRITE_REQUEST,
522 VENDOR_WRITE_REQUEST_TYPE,
523 0x0, index, NULL, 0, 100);
524 dbg ("0x40:0x1:0x0:0x%x %d", index, i);
525 }
526
527 kfree (buf);
528}
529
530static int pl2303_open (struct usb_serial_port *port, struct file *filp)
531{
532 struct termios tmp_termios;
533 struct usb_serial *serial = port->serial;
534 struct pl2303_private *priv = usb_get_serial_port_data(port);
535 unsigned char *buf;
536 int result;
537
538 dbg("%s - port %d", __FUNCTION__, port->number);
539
540 usb_clear_halt(serial->dev, port->write_urb->pipe);
541 usb_clear_halt(serial->dev, port->read_urb->pipe);
542
543 buf = kmalloc(10, GFP_KERNEL);
544 if (buf==NULL)
545 return -ENOMEM;
546
547#define FISH(a,b,c,d) \
548 result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0), \
549 b, a, c, d, buf, 1, 100); \
550 dbg("0x%x:0x%x:0x%x:0x%x %d - %x",a,b,c,d,result,buf[0]);
551
552#define SOUP(a,b,c,d) \
553 result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0), \
554 b, a, c, d, NULL, 0, 100); \
555 dbg("0x%x:0x%x:0x%x:0x%x %d",a,b,c,d,result);
556
557 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
558 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
559 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
560 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
561 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
562 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
563 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
564 FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
565 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
566 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
567
568 if (priv->type == HX) {
569 /* HX chip */
570 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x44);
571 /* reset upstream data pipes */
572 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 8, 0);
573 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 9, 0);
574 } else {
575 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x24);
576 }
577
578 kfree(buf);
579
580 /* Setup termios */
581 if (port->tty) {
582 pl2303_set_termios (port, &tmp_termios);
583 }
584
585 //FIXME: need to assert RTS and DTR if CRTSCTS off
586
587 dbg("%s - submitting read urb", __FUNCTION__);
588 port->read_urb->dev = serial->dev;
589 result = usb_submit_urb (port->read_urb, GFP_KERNEL);
590 if (result) {
591 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
592 pl2303_close (port, NULL);
593 return -EPROTO;
594 }
595
596 dbg("%s - submitting interrupt urb", __FUNCTION__);
597 port->interrupt_in_urb->dev = serial->dev;
598 result = usb_submit_urb (port->interrupt_in_urb, GFP_KERNEL);
599 if (result) {
600 dev_err(&port->dev, "%s - failed submitting interrupt urb, error %d\n", __FUNCTION__, result);
601 pl2303_close (port, NULL);
602 return -EPROTO;
603 }
604 return 0;
605}
606
607
608static void pl2303_close (struct usb_serial_port *port, struct file *filp)
609{
610 struct pl2303_private *priv = usb_get_serial_port_data(port);
611 unsigned long flags;
612 unsigned int c_cflag;
613 int bps;
614 long timeout;
615 wait_queue_t wait; \
616
617 dbg("%s - port %d", __FUNCTION__, port->number);
618
619 /* wait for data to drain from the buffer */
620 spin_lock_irqsave(&priv->lock, flags);
621 timeout = PL2303_CLOSING_WAIT;
622 init_waitqueue_entry(&wait, current);
623 add_wait_queue(&port->tty->write_wait, &wait);
624 for (;;) {
625 set_current_state(TASK_INTERRUPTIBLE);
626 if (pl2303_buf_data_avail(priv->buf) == 0
627 || timeout == 0 || signal_pending(current)
628 || !usb_get_intfdata(port->serial->interface)) /* disconnect */
629 break;
630 spin_unlock_irqrestore(&priv->lock, flags);
631 timeout = schedule_timeout(timeout);
632 spin_lock_irqsave(&priv->lock, flags);
633 }
634 set_current_state(TASK_RUNNING);
635 remove_wait_queue(&port->tty->write_wait, &wait);
636 /* clear out any remaining data in the buffer */
637 pl2303_buf_clear(priv->buf);
638 spin_unlock_irqrestore(&priv->lock, flags);
639
640 /* wait for characters to drain from the device */
641 /* (this is long enough for the entire 256 byte */
642 /* pl2303 hardware buffer to drain with no flow */
643 /* control for data rates of 1200 bps or more, */
644 /* for lower rates we should really know how much */
645 /* data is in the buffer to compute a delay */
646 /* that is not unnecessarily long) */
647 bps = tty_get_baud_rate(port->tty);
648 if (bps > 1200)
649 timeout = max((HZ*2560)/bps,HZ/10);
650 else
651 timeout = 2*HZ;
652 set_current_state(TASK_INTERRUPTIBLE);
653 schedule_timeout(timeout);
654
655 /* shutdown our urbs */
656 dbg("%s - shutting down urbs", __FUNCTION__);
657 usb_kill_urb(port->write_urb);
658 usb_kill_urb(port->read_urb);
659 usb_kill_urb(port->interrupt_in_urb);
660
661 if (port->tty) {
662 c_cflag = port->tty->termios->c_cflag;
663 if (c_cflag & HUPCL) {
664 /* drop DTR and RTS */
665 spin_lock_irqsave(&priv->lock, flags);
666 priv->line_control = 0;
667 spin_unlock_irqrestore (&priv->lock, flags);
668 set_control_lines (port->serial->dev, 0);
669 }
670 }
671}
672
673static int pl2303_tiocmset (struct usb_serial_port *port, struct file *file,
674 unsigned int set, unsigned int clear)
675{
676 struct pl2303_private *priv = usb_get_serial_port_data(port);
677 unsigned long flags;
678 u8 control;
679
680 spin_lock_irqsave (&priv->lock, flags);
681 if (set & TIOCM_RTS)
682 priv->line_control |= CONTROL_RTS;
683 if (set & TIOCM_DTR)
684 priv->line_control |= CONTROL_DTR;
685 if (clear & TIOCM_RTS)
686 priv->line_control &= ~CONTROL_RTS;
687 if (clear & TIOCM_DTR)
688 priv->line_control &= ~CONTROL_DTR;
689 control = priv->line_control;
690 spin_unlock_irqrestore (&priv->lock, flags);
691
692 return set_control_lines (port->serial->dev, control);
693}
694
695static int pl2303_tiocmget (struct usb_serial_port *port, struct file *file)
696{
697 struct pl2303_private *priv = usb_get_serial_port_data(port);
698 unsigned long flags;
699 unsigned int mcr;
700 unsigned int status;
701 unsigned int result;
702
703 dbg("%s (%d)", __FUNCTION__, port->number);
704
705 spin_lock_irqsave (&priv->lock, flags);
706 mcr = priv->line_control;
707 status = priv->line_status;
708 spin_unlock_irqrestore (&priv->lock, flags);
709
710 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
711 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
712 | ((status & UART_CTS) ? TIOCM_CTS : 0)
713 | ((status & UART_DSR) ? TIOCM_DSR : 0)
714 | ((status & UART_RING) ? TIOCM_RI : 0)
715 | ((status & UART_DCD) ? TIOCM_CD : 0);
716
717 dbg("%s - result = %x", __FUNCTION__, result);
718
719 return result;
720}
721
722static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
723{
724 struct pl2303_private *priv = usb_get_serial_port_data(port);
725 unsigned long flags;
726 unsigned int prevstatus;
727 unsigned int status;
728 unsigned int changed;
729
730 spin_lock_irqsave (&priv->lock, flags);
731 prevstatus = priv->line_status;
732 spin_unlock_irqrestore (&priv->lock, flags);
733
734 while (1) {
735 interruptible_sleep_on(&priv->delta_msr_wait);
736 /* see if a signal did it */
737 if (signal_pending(current))
738 return -ERESTARTSYS;
739
740 spin_lock_irqsave (&priv->lock, flags);
741 status = priv->line_status;
742 spin_unlock_irqrestore (&priv->lock, flags);
743
744 changed=prevstatus^status;
745
746 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
747 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
748 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
749 ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
750 return 0;
751 }
752 prevstatus = status;
753 }
754 /* NOTREACHED */
755 return 0;
756}
757
758static int pl2303_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
759{
760 dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
761
762 switch (cmd) {
763 case TIOCMIWAIT:
764 dbg("%s (%d) TIOCMIWAIT", __FUNCTION__, port->number);
765 return wait_modem_info(port, arg);
766
767 default:
768 dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
769 break;
770 }
771
772 return -ENOIOCTLCMD;
773}
774
775static void pl2303_break_ctl (struct usb_serial_port *port, int break_state)
776{
777 struct usb_serial *serial = port->serial;
778 u16 state;
779 int result;
780
781 dbg("%s - port %d", __FUNCTION__, port->number);
782
783 if (break_state == 0)
784 state = BREAK_OFF;
785 else
786 state = BREAK_ON;
787 dbg("%s - turning break %s", __FUNCTION__, state==BREAK_OFF ? "off" : "on");
788
789 result = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
790 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
791 0, NULL, 0, 100);
792 if (result)
793 dbg("%s - error sending break = %d", __FUNCTION__, result);
794}
795
796
797static void pl2303_shutdown (struct usb_serial *serial)
798{
799 int i;
800 struct pl2303_private *priv;
801
802 dbg("%s", __FUNCTION__);
803
804 for (i = 0; i < serial->num_ports; ++i) {
805 priv = usb_get_serial_port_data(serial->port[i]);
806 if (priv) {
807 pl2303_buf_free(priv->buf);
808 kfree(priv);
809 usb_set_serial_port_data(serial->port[i], NULL);
810 }
811 }
812}
813
814
815static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs)
816{
817 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
818 struct pl2303_private *priv = usb_get_serial_port_data(port);
819 unsigned char *data = urb->transfer_buffer;
820 unsigned long flags;
821 int status;
822 u8 uart_state;
823
824 dbg("%s (%d)", __FUNCTION__, port->number);
825
826 switch (urb->status) {
827 case 0:
828 /* success */
829 break;
830 case -ECONNRESET:
831 case -ENOENT:
832 case -ESHUTDOWN:
833 /* this urb is terminated, clean up */
834 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
835 return;
836 default:
837 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
838 goto exit;
839 }
840
841
842 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, urb->transfer_buffer);
843
844 if (urb->actual_length < UART_STATE)
845 goto exit;
846
847 /* Save off the uart status for others to look at */
848 uart_state = data[UART_STATE];
849 spin_lock_irqsave(&priv->lock, flags);
850 uart_state |= (priv->line_status & UART_STATE_TRANSIENT_MASK);
851 priv->line_status = uart_state;
852 spin_unlock_irqrestore(&priv->lock, flags);
853
854exit:
855 status = usb_submit_urb (urb, GFP_ATOMIC);
856 if (status)
857 dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
858 __FUNCTION__, status);
859}
860
861
862static void pl2303_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
863{
864 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
865 struct pl2303_private *priv = usb_get_serial_port_data(port);
866 struct tty_struct *tty;
867 unsigned char *data = urb->transfer_buffer;
868 unsigned long flags;
869 int i;
870 int result;
871 u8 status;
872 char tty_flag;
873
874 dbg("%s - port %d", __FUNCTION__, port->number);
875
876 if (urb->status) {
877 dbg("%s - urb->status = %d", __FUNCTION__, urb->status);
878 if (!port->open_count) {
879 dbg("%s - port is closed, exiting.", __FUNCTION__);
880 return;
881 }
882 if (urb->status == -EPROTO) {
883 /* PL2303 mysteriously fails with -EPROTO reschedule the read */
884 dbg("%s - caught -EPROTO, resubmitting the urb", __FUNCTION__);
885 urb->status = 0;
886 urb->dev = port->serial->dev;
887 result = usb_submit_urb(urb, GFP_ATOMIC);
888 if (result)
889 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
890 return;
891 }
892 dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
893 return;
894 }
895
896 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
897
898 /* get tty_flag from status */
899 tty_flag = TTY_NORMAL;
900
901 spin_lock_irqsave(&priv->lock, flags);
902 status = priv->line_status;
903 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
904 spin_unlock_irqrestore(&priv->lock, flags);
905 wake_up_interruptible (&priv->delta_msr_wait);
906
907 /* break takes precedence over parity, */
908 /* which takes precedence over framing errors */
909 if (status & UART_BREAK_ERROR )
910 tty_flag = TTY_BREAK;
911 else if (status & UART_PARITY_ERROR)
912 tty_flag = TTY_PARITY;
913 else if (status & UART_FRAME_ERROR)
914 tty_flag = TTY_FRAME;
915 dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
916
917 tty = port->tty;
918 if (tty && urb->actual_length) {
919 /* overrun is special, not associated with a char */
920 if (status & UART_OVERRUN_ERROR)
921 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
922
923 for (i = 0; i < urb->actual_length; ++i) {
924 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
925 tty_flip_buffer_push(tty);
926 }
927 tty_insert_flip_char (tty, data[i], tty_flag);
928 }
929 tty_flip_buffer_push (tty);
930 }
931
932 /* Schedule the next read _if_ we are still open */
933 if (port->open_count) {
934 urb->dev = port->serial->dev;
935 result = usb_submit_urb(urb, GFP_ATOMIC);
936 if (result)
937 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
938 }
939
940 return;
941}
942
943
944
945static void pl2303_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
946{
947 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
948 struct pl2303_private *priv = usb_get_serial_port_data(port);
949 int result;
950
951 dbg("%s - port %d", __FUNCTION__, port->number);
952
953 switch (urb->status) {
954 case 0:
955 /* success */
956 break;
957 case -ECONNRESET:
958 case -ENOENT:
959 case -ESHUTDOWN:
960 /* this urb is terminated, clean up */
961 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
962 priv->write_urb_in_use = 0;
963 return;
964 default:
965 /* error in the urb, so we have to resubmit it */
966 dbg("%s - Overflow in write", __FUNCTION__);
967 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
968 port->write_urb->transfer_buffer_length = 1;
969 port->write_urb->dev = port->serial->dev;
970 result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
971 if (result)
972 dev_err(&urb->dev->dev, "%s - failed resubmitting write urb, error %d\n", __FUNCTION__, result);
973 else
974 return;
975 }
976
977 priv->write_urb_in_use = 0;
978
979 /* send any buffered data */
980 pl2303_send(port);
981}
982
983
984/*
985 * pl2303_buf_alloc
986 *
987 * Allocate a circular buffer and all associated memory.
988 */
989
990static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
991{
992
993 struct pl2303_buf *pb;
994
995
996 if (size == 0)
997 return NULL;
998
999 pb = (struct pl2303_buf *)kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
1000 if (pb == NULL)
1001 return NULL;
1002
1003 pb->buf_buf = kmalloc(size, GFP_KERNEL);
1004 if (pb->buf_buf == NULL) {
1005 kfree(pb);
1006 return NULL;
1007 }
1008
1009 pb->buf_size = size;
1010 pb->buf_get = pb->buf_put = pb->buf_buf;
1011
1012 return pb;
1013
1014}
1015
1016
1017/*
1018 * pl2303_buf_free
1019 *
1020 * Free the buffer and all associated memory.
1021 */
1022
1023static void pl2303_buf_free(struct pl2303_buf *pb)
1024{
1025 if (pb != NULL) {
1026 if (pb->buf_buf != NULL)
1027 kfree(pb->buf_buf);
1028 kfree(pb);
1029 }
1030}
1031
1032
1033/*
1034 * pl2303_buf_clear
1035 *
1036 * Clear out all data in the circular buffer.
1037 */
1038
1039static void pl2303_buf_clear(struct pl2303_buf *pb)
1040{
1041 if (pb != NULL)
1042 pb->buf_get = pb->buf_put;
1043 /* equivalent to a get of all data available */
1044}
1045
1046
1047/*
1048 * pl2303_buf_data_avail
1049 *
1050 * Return the number of bytes of data available in the circular
1051 * buffer.
1052 */
1053
1054static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
1055{
1056 if (pb != NULL)
1057 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
1058 else
1059 return 0;
1060}
1061
1062
1063/*
1064 * pl2303_buf_space_avail
1065 *
1066 * Return the number of bytes of space available in the circular
1067 * buffer.
1068 */
1069
1070static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
1071{
1072 if (pb != NULL)
1073 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
1074 else
1075 return 0;
1076}
1077
1078
1079/*
1080 * pl2303_buf_put
1081 *
1082 * Copy data data from a user buffer and put it into the circular buffer.
1083 * Restrict to the amount of space available.
1084 *
1085 * Return the number of bytes copied.
1086 */
1087
1088static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
1089 unsigned int count)
1090{
1091
1092 unsigned int len;
1093
1094
1095 if (pb == NULL)
1096 return 0;
1097
1098 len = pl2303_buf_space_avail(pb);
1099 if (count > len)
1100 count = len;
1101
1102 if (count == 0)
1103 return 0;
1104
1105 len = pb->buf_buf + pb->buf_size - pb->buf_put;
1106 if (count > len) {
1107 memcpy(pb->buf_put, buf, len);
1108 memcpy(pb->buf_buf, buf+len, count - len);
1109 pb->buf_put = pb->buf_buf + count - len;
1110 } else {
1111 memcpy(pb->buf_put, buf, count);
1112 if (count < len)
1113 pb->buf_put += count;
1114 else /* count == len */
1115 pb->buf_put = pb->buf_buf;
1116 }
1117
1118 return count;
1119
1120}
1121
1122
1123/*
1124 * pl2303_buf_get
1125 *
1126 * Get data from the circular buffer and copy to the given buffer.
1127 * Restrict to the amount of data available.
1128 *
1129 * Return the number of bytes copied.
1130 */
1131
1132static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
1133 unsigned int count)
1134{
1135
1136 unsigned int len;
1137
1138
1139 if (pb == NULL)
1140 return 0;
1141
1142 len = pl2303_buf_data_avail(pb);
1143 if (count > len)
1144 count = len;
1145
1146 if (count == 0)
1147 return 0;
1148
1149 len = pb->buf_buf + pb->buf_size - pb->buf_get;
1150 if (count > len) {
1151 memcpy(buf, pb->buf_get, len);
1152 memcpy(buf+len, pb->buf_buf, count - len);
1153 pb->buf_get = pb->buf_buf + count - len;
1154 } else {
1155 memcpy(buf, pb->buf_get, count);
1156 if (count < len)
1157 pb->buf_get += count;
1158 else /* count == len */
1159 pb->buf_get = pb->buf_buf;
1160 }
1161
1162 return count;
1163
1164}
1165
1166static int __init pl2303_init (void)
1167{
1168 int retval;
1169 retval = usb_serial_register(&pl2303_device);
1170 if (retval)
1171 goto failed_usb_serial_register;
1172 retval = usb_register(&pl2303_driver);
1173 if (retval)
1174 goto failed_usb_register;
1175 info(DRIVER_DESC " " DRIVER_VERSION);
1176 return 0;
1177failed_usb_register:
1178 usb_serial_deregister(&pl2303_device);
1179failed_usb_serial_register:
1180 return retval;
1181}
1182
1183
1184static void __exit pl2303_exit (void)
1185{
1186 usb_deregister (&pl2303_driver);
1187 usb_serial_deregister (&pl2303_device);
1188}
1189
1190
1191module_init(pl2303_init);
1192module_exit(pl2303_exit);
1193
1194MODULE_DESCRIPTION(DRIVER_DESC);
1195MODULE_VERSION(DRIVER_VERSION);
1196MODULE_LICENSE("GPL");
1197
1198module_param(debug, bool, S_IRUGO | S_IWUSR);
1199MODULE_PARM_DESC(debug, "Debug enabled or not");
1200
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
new file mode 100644
index 000000000000..6c1b4712dc2f
--- /dev/null
+++ b/drivers/usb/serial/pl2303.h
@@ -0,0 +1,57 @@
1/*
2 * Prolific PL2303 USB to serial adaptor driver header file
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 */
10#define PL2303_VENDOR_ID 0x067b
11#define PL2303_PRODUCT_ID 0x2303
12#define PL2303_PRODUCT_ID_RSAQ2 0x04bb
13#define PL2303_PRODUCT_ID_PHAROS 0xaaa0
14#define PL2303_PRODUCT_ID_RSAQ3 0xaaa2
15
16#define ATEN_VENDOR_ID 0x0557
17#define ATEN_VENDOR_ID2 0x0547
18#define ATEN_PRODUCT_ID 0x2008
19
20#define IODATA_VENDOR_ID 0x04bb
21#define IODATA_PRODUCT_ID 0x0a03
22
23#define ELCOM_VENDOR_ID 0x056e
24#define ELCOM_PRODUCT_ID 0x5003
25#define ELCOM_PRODUCT_ID_UCSGT 0x5004
26
27#define ITEGNO_VENDOR_ID 0x0eba
28#define ITEGNO_PRODUCT_ID 0x1080
29
30#define MA620_VENDOR_ID 0x0df7
31#define MA620_PRODUCT_ID 0x0620
32
33#define RATOC_VENDOR_ID 0x0584
34#define RATOC_PRODUCT_ID 0xb000
35
36#define TRIPP_VENDOR_ID 0x2478
37#define TRIPP_PRODUCT_ID 0x2008
38
39#define RADIOSHACK_VENDOR_ID 0x1453
40#define RADIOSHACK_PRODUCT_ID 0x4026
41
42#define DCU10_VENDOR_ID 0x0731
43#define DCU10_PRODUCT_ID 0x0528
44
45#define SITECOM_VENDOR_ID 0x6189
46#define SITECOM_PRODUCT_ID 0x2068
47
48/* Alcatel OT535/735 USB cable */
49#define ALCATEL_VENDOR_ID 0x11f7
50#define ALCATEL_PRODUCT_ID 0x02df
51
52/* Samsung I330 phone cradle */
53#define SAMSUNG_VENDOR_ID 0x04e8
54#define SAMSUNG_PRODUCT_ID 0x8001
55
56#define SIEMENS_VENDOR_ID 0x11f5
57#define SIEMENS_PRODUCT_ID_X65 0x0003
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c
new file mode 100644
index 000000000000..0e85ed6c6c19
--- /dev/null
+++ b/drivers/usb/serial/safe_serial.c
@@ -0,0 +1,451 @@
1/*
2 * Safe Encapsulated USB Serial Driver
3 *
4 * Copyright (C) 2001 Lineo
5 * Copyright (C) 2001 Hewlett-Packard
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * By:
13 * Stuart Lynne <sl@lineo.com>, Tom Rushworth <tbr@lineo.com>
14 */
15
16/*
17 * The encapsultaion is designed to overcome difficulties with some USB hardware.
18 *
19 * While the USB protocol has a CRC over the data while in transit, i.e. while
20 * being carried over the bus, there is no end to end protection. If the hardware
21 * has any problems getting the data into or out of the USB transmit and receive
22 * FIFO's then data can be lost.
23 *
24 * This protocol adds a two byte trailer to each USB packet to specify the number
25 * of bytes of valid data and a 10 bit CRC that will allow the receiver to verify
26 * that the entire USB packet was received without error.
27 *
28 * Because in this case the sender and receiver are the class and function drivers
29 * there is now end to end protection.
30 *
31 * There is an additional option that can be used to force all transmitted packets
32 * to be padded to the maximum packet size. This provides a work around for some
33 * devices which have problems with small USB packets.
34 *
35 * Assuming a packetsize of N:
36 *
37 * 0..N-2 data and optional padding
38 *
39 * N-2 bits 7-2 - number of bytes of valid data
40 * bits 1-0 top two bits of 10 bit CRC
41 * N-1 bottom 8 bits of 10 bit CRC
42 *
43 *
44 * | Data Length | 10 bit CRC |
45 * + 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 | 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0 +
46 *
47 * The 10 bit CRC is computed across the sent data, followed by the trailer with
48 * the length set and the CRC set to zero. The CRC is then OR'd into the trailer.
49 *
50 * When received a 10 bit CRC is computed over the entire frame including the trailer
51 * and should be equal to zero.
52 *
53 * Two module parameters are used to control the encapsulation, if both are
54 * turned of the module works as a simple serial device with NO
55 * encapsulation.
56 *
57 * See linux/drivers/usbd/serial_fd for a device function driver
58 * implementation of this.
59 *
60 */
61
62
63#include <linux/config.h>
64#include <linux/kernel.h>
65#include <linux/errno.h>
66#include <linux/init.h>
67#include <linux/slab.h>
68#include <linux/tty.h>
69#include <linux/tty_driver.h>
70#include <linux/tty_flip.h>
71#include <linux/module.h>
72#include <linux/spinlock.h>
73#include <asm/uaccess.h>
74#include <linux/usb.h>
75#include "usb-serial.h"
76
77
78#ifndef CONFIG_USB_SAFE_PADDED
79#define CONFIG_USB_SAFE_PADDED 0
80#endif
81
82static int debug;
83static int safe = 1;
84static int padded = CONFIG_USB_SAFE_PADDED;
85
86#define DRIVER_VERSION "v0.0b"
87#define DRIVER_AUTHOR "sl@lineo.com, tbr@lineo.com"
88#define DRIVER_DESC "USB Safe Encapsulated Serial"
89
90MODULE_AUTHOR (DRIVER_AUTHOR);
91MODULE_DESCRIPTION (DRIVER_DESC);
92MODULE_LICENSE("GPL");
93
94#if defined(CONFIG_USBD_SAFE_SERIAL_VENDOR) && !defined(CONFIG_USBD_SAFE_SERIAL_PRODUCT)
95#abort "SAFE_SERIAL_VENDOR defined without SAFE_SERIAL_PRODUCT"
96#endif
97
98#if ! defined(CONFIG_USBD_SAFE_SERIAL_VENDOR)
99static __u16 vendor; // no default
100static __u16 product; // no default
101module_param(vendor, ushort, 0);
102MODULE_PARM_DESC(vendor, "User specified USB idVendor (required)");
103module_param(product, ushort, 0);
104MODULE_PARM_DESC(product, "User specified USB idProduct (required)");
105#endif
106
107module_param(debug, bool, S_IRUGO | S_IWUSR);
108MODULE_PARM_DESC(debug, "Debug enabled or not");
109
110module_param(safe, bool, 0);
111MODULE_PARM_DESC(safe, "Turn Safe Encapsulation On/Off");
112
113module_param(padded, bool, 0);
114MODULE_PARM_DESC(padded, "Pad to full wMaxPacketSize On/Off");
115
116#define CDC_DEVICE_CLASS 0x02
117
118#define CDC_INTERFACE_CLASS 0x02
119#define CDC_INTERFACE_SUBCLASS 0x06
120
121#define LINEO_INTERFACE_CLASS 0xff
122
123#define LINEO_INTERFACE_SUBCLASS_SAFENET 0x01
124#define LINEO_SAFENET_CRC 0x01
125#define LINEO_SAFENET_CRC_PADDED 0x02
126
127#define LINEO_INTERFACE_SUBCLASS_SAFESERIAL 0x02
128#define LINEO_SAFESERIAL_CRC 0x01
129#define LINEO_SAFESERIAL_CRC_PADDED 0x02
130
131
132#define MY_USB_DEVICE(vend,prod,dc,ic,isc) \
133 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_CLASS | \
134 USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
135 .idVendor = (vend), \
136 .idProduct = (prod),\
137 .bDeviceClass = (dc),\
138 .bInterfaceClass = (ic), \
139 .bInterfaceSubClass = (isc),
140
141static struct usb_device_id id_table[] = {
142 {MY_USB_DEVICE (0x49f, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Itsy
143 {MY_USB_DEVICE (0x3f0, 0x2101, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Calypso
144 {MY_USB_DEVICE (0x4dd, 0x8001, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Iris
145 {MY_USB_DEVICE (0x4dd, 0x8002, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie
146 {MY_USB_DEVICE (0x4dd, 0x8003, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie
147 {MY_USB_DEVICE (0x4dd, 0x8004, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Collie
148 {MY_USB_DEVICE (0x5f9, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, // Sharp tmp
149#if defined(CONFIG_USB_SAFE_SERIAL_VENDOR)
150 {MY_USB_DEVICE
151 (CONFIG_USB_SAFE_SERIAL_VENDOR, CONFIG_USB_SAFE_SERIAL_PRODUCT, CDC_DEVICE_CLASS,
152 LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)},
153#endif
154 // extra null entry for module
155 // vendor/produc parameters
156 {MY_USB_DEVICE (0, 0, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)},
157 {} // terminating entry
158};
159
160MODULE_DEVICE_TABLE (usb, id_table);
161
162static struct usb_driver safe_driver = {
163 .owner = THIS_MODULE,
164 .name = "safe_serial",
165 .probe = usb_serial_probe,
166 .disconnect = usb_serial_disconnect,
167 .id_table = id_table,
168};
169
170static __u16 crc10_table[256] = {
171 0x000, 0x233, 0x255, 0x066, 0x299, 0x0aa, 0x0cc, 0x2ff, 0x301, 0x132, 0x154, 0x367, 0x198, 0x3ab, 0x3cd, 0x1fe,
172 0x031, 0x202, 0x264, 0x057, 0x2a8, 0x09b, 0x0fd, 0x2ce, 0x330, 0x103, 0x165, 0x356, 0x1a9, 0x39a, 0x3fc, 0x1cf,
173 0x062, 0x251, 0x237, 0x004, 0x2fb, 0x0c8, 0x0ae, 0x29d, 0x363, 0x150, 0x136, 0x305, 0x1fa, 0x3c9, 0x3af, 0x19c,
174 0x053, 0x260, 0x206, 0x035, 0x2ca, 0x0f9, 0x09f, 0x2ac, 0x352, 0x161, 0x107, 0x334, 0x1cb, 0x3f8, 0x39e, 0x1ad,
175 0x0c4, 0x2f7, 0x291, 0x0a2, 0x25d, 0x06e, 0x008, 0x23b, 0x3c5, 0x1f6, 0x190, 0x3a3, 0x15c, 0x36f, 0x309, 0x13a,
176 0x0f5, 0x2c6, 0x2a0, 0x093, 0x26c, 0x05f, 0x039, 0x20a, 0x3f4, 0x1c7, 0x1a1, 0x392, 0x16d, 0x35e, 0x338, 0x10b,
177 0x0a6, 0x295, 0x2f3, 0x0c0, 0x23f, 0x00c, 0x06a, 0x259, 0x3a7, 0x194, 0x1f2, 0x3c1, 0x13e, 0x30d, 0x36b, 0x158,
178 0x097, 0x2a4, 0x2c2, 0x0f1, 0x20e, 0x03d, 0x05b, 0x268, 0x396, 0x1a5, 0x1c3, 0x3f0, 0x10f, 0x33c, 0x35a, 0x169,
179 0x188, 0x3bb, 0x3dd, 0x1ee, 0x311, 0x122, 0x144, 0x377, 0x289, 0x0ba, 0x0dc, 0x2ef, 0x010, 0x223, 0x245, 0x076,
180 0x1b9, 0x38a, 0x3ec, 0x1df, 0x320, 0x113, 0x175, 0x346, 0x2b8, 0x08b, 0x0ed, 0x2de, 0x021, 0x212, 0x274, 0x047,
181 0x1ea, 0x3d9, 0x3bf, 0x18c, 0x373, 0x140, 0x126, 0x315, 0x2eb, 0x0d8, 0x0be, 0x28d, 0x072, 0x241, 0x227, 0x014,
182 0x1db, 0x3e8, 0x38e, 0x1bd, 0x342, 0x171, 0x117, 0x324, 0x2da, 0x0e9, 0x08f, 0x2bc, 0x043, 0x270, 0x216, 0x025,
183 0x14c, 0x37f, 0x319, 0x12a, 0x3d5, 0x1e6, 0x180, 0x3b3, 0x24d, 0x07e, 0x018, 0x22b, 0x0d4, 0x2e7, 0x281, 0x0b2,
184 0x17d, 0x34e, 0x328, 0x11b, 0x3e4, 0x1d7, 0x1b1, 0x382, 0x27c, 0x04f, 0x029, 0x21a, 0x0e5, 0x2d6, 0x2b0, 0x083,
185 0x12e, 0x31d, 0x37b, 0x148, 0x3b7, 0x184, 0x1e2, 0x3d1, 0x22f, 0x01c, 0x07a, 0x249, 0x0b6, 0x285, 0x2e3, 0x0d0,
186 0x11f, 0x32c, 0x34a, 0x179, 0x386, 0x1b5, 0x1d3, 0x3e0, 0x21e, 0x02d, 0x04b, 0x278, 0x087, 0x2b4, 0x2d2, 0x0e1,
187};
188
189#define CRC10_INITFCS 0x000 // Initial FCS value
190#define CRC10_GOODFCS 0x000 // Good final FCS value
191#define CRC10_FCS(fcs, c) ( (((fcs) << 8) & 0x3ff) ^ crc10_table[((fcs) >> 2) & 0xff] ^ (c))
192
193/**
194 * fcs_compute10 - memcpy and calculate 10 bit CRC across buffer
195 * @sp: pointer to buffer
196 * @len: number of bytes
197 * @fcs: starting FCS
198 *
199 * Perform a memcpy and calculate fcs using ppp 10bit CRC algorithm. Return
200 * new 10 bit FCS.
201 */
202static __u16 __inline__ fcs_compute10 (unsigned char *sp, int len, __u16 fcs)
203{
204 for (; len-- > 0; fcs = CRC10_FCS (fcs, *sp++));
205 return fcs;
206}
207
208static void safe_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
209{
210 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
211 unsigned char *data = urb->transfer_buffer;
212 unsigned char length = urb->actual_length;
213 int i;
214 int result;
215
216 dbg ("%s", __FUNCTION__);
217
218 if (urb->status) {
219 dbg ("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
220 return;
221 }
222
223 dbg ("safe_read_bulk_callback length: %d", port->read_urb->actual_length);
224#ifdef ECHO_RCV
225 {
226 int i;
227 unsigned char *cp = port->read_urb->transfer_buffer;
228 for (i = 0; i < port->read_urb->actual_length; i++) {
229 if ((i % 32) == 0) {
230 printk ("\nru[%02x] ", i);
231 }
232 printk ("%02x ", *cp++);
233 }
234 printk ("\n");
235 }
236#endif
237 if (safe) {
238 __u16 fcs;
239 if (!(fcs = fcs_compute10 (data, length, CRC10_INITFCS))) {
240
241 int actual_length = data[length - 2] >> 2;
242
243 if (actual_length <= (length - 2)) {
244
245 info ("%s - actual: %d", __FUNCTION__, actual_length);
246
247 for (i = 0; i < actual_length; i++) {
248 tty_insert_flip_char (port->tty, data[i], 0);
249 }
250 tty_flip_buffer_push (port->tty);
251 } else {
252 err ("%s - inconsistent lengths %d:%d", __FUNCTION__,
253 actual_length, length);
254 }
255 } else {
256 err ("%s - bad CRC %x", __FUNCTION__, fcs);
257 }
258 } else {
259 for (i = 0; i < length; i++) {
260 tty_insert_flip_char (port->tty, data[i], 0);
261 }
262 tty_flip_buffer_push (port->tty);
263 }
264
265 /* Continue trying to always read */
266 usb_fill_bulk_urb (urb, port->serial->dev,
267 usb_rcvbulkpipe (port->serial->dev, port->bulk_in_endpointAddress),
268 urb->transfer_buffer, urb->transfer_buffer_length,
269 safe_read_bulk_callback, port);
270
271 if ((result = usb_submit_urb (urb, GFP_ATOMIC))) {
272 err ("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
273 }
274}
275
276static int safe_write (struct usb_serial_port *port, const unsigned char *buf, int count)
277{
278 unsigned char *data;
279 int result;
280 int i;
281 int packet_length;
282
283 dbg ("safe_write port: %p %d urb: %p count: %d", port, port->number, port->write_urb,
284 count);
285
286 if (!port->write_urb) {
287 dbg ("%s - write urb NULL", __FUNCTION__);
288 return (0);
289 }
290
291 dbg ("safe_write write_urb: %d transfer_buffer_length",
292 port->write_urb->transfer_buffer_length);
293
294 if (!port->write_urb->transfer_buffer_length) {
295 dbg ("%s - write urb transfer_buffer_length zero", __FUNCTION__);
296 return (0);
297 }
298 if (count == 0) {
299 dbg ("%s - write request of 0 bytes", __FUNCTION__);
300 return (0);
301 }
302 if (port->write_urb->status == -EINPROGRESS) {
303 dbg ("%s - already writing", __FUNCTION__);
304 return (0);
305 }
306
307 packet_length = port->bulk_out_size; // get max packetsize
308
309 i = packet_length - (safe ? 2 : 0); // get bytes to send
310 count = (count > i) ? i : count;
311
312
313 // get the data into the transfer buffer
314 data = port->write_urb->transfer_buffer;
315 memset (data, '0', packet_length);
316
317 memcpy (data, buf, count);
318
319 if (safe) {
320 __u16 fcs;
321
322 // pad if necessary
323 if (!padded) {
324 packet_length = count + 2;
325 }
326 // set count
327 data[packet_length - 2] = count << 2;
328 data[packet_length - 1] = 0;
329
330 // compute fcs and insert into trailer
331 fcs = fcs_compute10 (data, packet_length, CRC10_INITFCS);
332 data[packet_length - 2] |= fcs >> 8;
333 data[packet_length - 1] |= fcs & 0xff;
334
335 // set length to send
336 port->write_urb->transfer_buffer_length = packet_length;
337 } else {
338 port->write_urb->transfer_buffer_length = count;
339 }
340
341 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
342#ifdef ECHO_TX
343 {
344 int i;
345 unsigned char *cp = port->write_urb->transfer_buffer;
346 for (i = 0; i < port->write_urb->transfer_buffer_length; i++) {
347 if ((i % 32) == 0) {
348 printk ("\nsu[%02x] ", i);
349 }
350 printk ("%02x ", *cp++);
351 }
352 printk ("\n");
353 }
354#endif
355 port->write_urb->dev = port->serial->dev;
356 if ((result = usb_submit_urb (port->write_urb, GFP_KERNEL))) {
357 err ("%s - failed submitting write urb, error %d", __FUNCTION__, result);
358 return 0;
359 }
360 dbg ("%s urb: %p submitted", __FUNCTION__, port->write_urb);
361
362 return (count);
363}
364
365static int safe_write_room (struct usb_serial_port *port)
366{
367 int room = 0; // Default: no room
368
369 dbg ("%s", __FUNCTION__);
370
371 if (port->write_urb->status != -EINPROGRESS)
372 room = port->bulk_out_size - (safe ? 2 : 0);
373
374 if (room) {
375 dbg ("safe_write_room returns %d", room);
376 }
377
378 return (room);
379}
380
381static int safe_startup (struct usb_serial *serial)
382{
383 switch (serial->interface->cur_altsetting->desc.bInterfaceProtocol) {
384 case LINEO_SAFESERIAL_CRC:
385 break;
386 case LINEO_SAFESERIAL_CRC_PADDED:
387 padded = 1;
388 break;
389 default:
390 return -EINVAL;
391 }
392 return 0;
393}
394
395static struct usb_serial_device_type safe_device = {
396 .owner = THIS_MODULE,
397 .name = "Safe",
398 .id_table = id_table,
399 .num_interrupt_in = NUM_DONT_CARE,
400 .num_bulk_in = NUM_DONT_CARE,
401 .num_bulk_out = NUM_DONT_CARE,
402 .num_ports = 1,
403 .write = safe_write,
404 .write_room = safe_write_room,
405 .read_bulk_callback = safe_read_bulk_callback,
406 .attach = safe_startup,
407};
408
409static int __init safe_init (void)
410{
411 int i, retval;
412
413 info (DRIVER_VERSION " " DRIVER_AUTHOR);
414 info (DRIVER_DESC);
415 info ("vendor: %x product: %x safe: %d padded: %d\n", vendor, product, safe, padded);
416
417 // if we have vendor / product parameters patch them into id list
418 if (vendor || product) {
419 info ("vendor: %x product: %x\n", vendor, product);
420
421 for (i = 0; i < (sizeof (id_table) / sizeof (struct usb_device_id)); i++) {
422 if (!id_table[i].idVendor && !id_table[i].idProduct) {
423 id_table[i].idVendor = vendor;
424 id_table[i].idProduct = product;
425 break;
426 }
427 }
428 }
429
430 retval = usb_serial_register(&safe_device);
431 if (retval)
432 goto failed_usb_serial_register;
433 retval = usb_register(&safe_driver);
434 if (retval)
435 goto failed_usb_register;
436
437 return 0;
438failed_usb_register:
439 usb_serial_deregister(&safe_device);
440failed_usb_serial_register:
441 return retval;
442}
443
444static void __exit safe_exit (void)
445{
446 usb_deregister (&safe_driver);
447 usb_serial_deregister (&safe_device);
448}
449
450module_init (safe_init);
451module_exit (safe_exit);
diff --git a/drivers/usb/serial/ti_fw_3410.h b/drivers/usb/serial/ti_fw_3410.h
new file mode 100644
index 000000000000..71e88579dfe0
--- /dev/null
+++ b/drivers/usb/serial/ti_fw_3410.h
@@ -0,0 +1,885 @@
1/* vi: ts=8 sw=8
2 *
3 * TI 3410 USB Serial Driver Firmware Header
4 *
5 * Copyright (C) 2004 Texas Instruments
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
13#ifndef _TI_FW_3410_H_
14#define _TI_FW_3410_H_
15
16/* firmware 9/10/04 FW3410_Special_StartWdogOnStartPort */
17
18static unsigned char ti_fw_3410[] = {
190xC2, 0x35, /* firmware image length excluding header, little endian */
200x00, /* placeholder for checksum */
21
220x02,0x00,0x1e,0x02,0x1a,0xdb,0xff,0xff,0xff,0xff,0xff,0x02,0x32,0xcb,0xff,0xff,
230xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x33,0x76,0x75,0x81,
240xce,0x90,0xfd,0xe8,0x85,0x83,0xa0,0x12,0x34,0xea,0xec,0x4d,0x60,0x6a,0x78,0xab,
250x80,0x03,0x76,0x00,0x18,0xb8,0x9c,0xfa,0x78,0x7f,0x80,0x03,0x76,0x00,0x18,0xb8,
260x65,0xfa,0x78,0x20,0x80,0x03,0x76,0x00,0x18,0xb8,0x20,0xfa,0x90,0xfd,0xdd,0xae,
270x83,0xaf,0x82,0x90,0xfb,0xf8,0x12,0x00,0xa1,0x60,0x05,0xe4,0xf0,0xa3,0x80,0xf6,
280x90,0xfd,0xe8,0xa8,0x82,0x90,0xfd,0xe8,0xa9,0x82,0xe8,0xc3,0x99,0x50,0x05,0x76,
290x00,0x08,0x80,0xf6,0x90,0x00,0xff,0x12,0x00,0xaa,0x90,0x01,0x03,0x12,0x00,0xaa,
300x90,0x01,0x07,0x12,0x00,0xaa,0x90,0x01,0x0b,0x12,0x00,0xc8,0x90,0x01,0x11,0x12,
310x00,0xc8,0x90,0x01,0x17,0x12,0x00,0xc8,0x75,0xd0,0x00,0x12,0x33,0xc8,0x02,0x01,
320x1d,0xef,0x65,0x82,0x70,0x03,0xee,0x65,0x83,0x22,0xe4,0x93,0xf8,0x74,0x01,0x93,
330xf9,0x74,0x02,0x93,0xfe,0x74,0x03,0x93,0xf5,0x82,0x8e,0x83,0xe8,0x69,0x70,0x01,
340x22,0xe4,0x93,0xf6,0xa3,0x08,0x80,0xf4,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,
350x02,0x93,0xfe,0x74,0x03,0x93,0xff,0x74,0x04,0x93,0xf8,0x74,0x05,0x93,0xf5,0x82,
360x88,0x83,0x12,0x00,0xa1,0x70,0x01,0x22,0xe4,0x93,0xa3,0xa8,0x83,0xa9,0x82,0x8c,
370x83,0x8d,0x82,0xf0,0xa3,0xac,0x83,0xad,0x82,0x88,0x83,0x89,0x82,0x80,0xe3,0x21,
380x21,0x04,0x92,0x80,0x80,0x04,0x92,0xac,0xae,0x04,0x92,0xfd,0xe8,0x04,0x94,0x04,
390x94,0xfb,0xf3,0x04,0x99,0x04,0x94,0xfb,0xf3,0x04,0xf9,0x04,0xf9,0x80,0xfe,0xd0,
400xf0,0x30,0xf0,0x09,0x20,0xf3,0x03,0xf6,0x80,0x10,0xf7,0x80,0x0d,0x30,0xf1,0x09,
410x20,0xf3,0x03,0xf2,0x80,0x04,0xf3,0x80,0x01,0xf0,0x20,0xf4,0x04,0xfc,0xd0,0xe0,
420xcc,0x22,0xcc,0xc0,0xe0,0x12,0x01,0x5a,0x02,0x01,0x4b,0xbc,0x00,0x05,0xd0,0xf0,
430xac,0xf0,0x22,0xc3,0x13,0xdc,0xfc,0x02,0x01,0x21,0xbf,0x00,0x09,0xed,0x25,0x82,
440x75,0xf0,0x01,0xf8,0xe6,0x22,0xbf,0x01,0x0f,0xed,0x25,0x82,0xf5,0x82,0xee,0x35,
450x83,0xf5,0x83,0x75,0xf0,0x04,0xe0,0x22,0xed,0x25,0x82,0x75,0xf0,0x02,0xf8,0xe2,
460x22,0xd0,0x83,0xd0,0x82,0xf5,0xf0,0xc3,0xe4,0x93,0xa3,0xc5,0xf0,0x95,0xf0,0xc0,
470xe0,0xc3,0xd0,0xf0,0xe4,0x93,0xa3,0x95,0xf0,0x40,0x12,0xa3,0xa3,0xc3,0xe5,0xf0,
480x33,0x50,0x02,0x05,0x83,0x25,0x82,0xf5,0x82,0x50,0x02,0x05,0x83,0x74,0x01,0x93,
490xc0,0xe0,0xe4,0x93,0xc0,0xe0,0x22,0xd0,0x83,0xd0,0x82,0xf5,0xf0,0xe4,0x93,0x70,
500x09,0x74,0x01,0x93,0x70,0x04,0xa3,0xa3,0x80,0x0c,0x74,0x02,0x93,0x65,0xf0,0x60,
510x05,0xa3,0xa3,0xa3,0x80,0xe7,0x74,0x01,0x93,0xc0,0xe0,0xe4,0x93,0xc0,0xe0,0x22,
520x12,0x02,0x5b,0x02,0x01,0xf2,0x12,0x02,0xaf,0x02,0x01,0xf2,0x12,0x02,0xd3,0x02,
530x01,0xf2,0x30,0xe0,0x07,0x20,0xe3,0x02,0xe6,0x22,0xe7,0x22,0x30,0xe1,0x07,0x20,
540xe3,0x02,0xe2,0x22,0xe3,0x22,0x30,0xe2,0x02,0xe0,0x22,0xe4,0x93,0x22,0x12,0x02,
550xd3,0x02,0x02,0x1a,0x12,0x02,0xaf,0x02,0x02,0x1a,0xab,0xf0,0x12,0x02,0x24,0xcb,
560xc5,0xf0,0xcb,0x22,0x30,0xe0,0x10,0x20,0xe3,0x06,0xe6,0xf5,0xf0,0x08,0xe6,0x22,
570xe7,0xf5,0xf0,0x09,0xe7,0x19,0x22,0x30,0xe1,0x10,0x20,0xe3,0x06,0xe2,0xf5,0xf0,
580x08,0xe2,0x22,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x30,0xe2,0x06,0xe0,0xf5,0xf0,
590xa3,0xe0,0x22,0xe4,0x93,0xf5,0xf0,0x74,0x01,0x93,0x22,0xbb,0x00,0x03,0x74,0x09,
600x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x74,0x04,0x22,0xbb,0x02,0x07,0x89,0x82,
610x8a,0x83,0x74,0x10,0x22,0x74,0x0a,0x22,0x02,0x02,0x7b,0xbb,0x00,0x07,0xe9,0x25,
620x82,0xf8,0x74,0x01,0x22,0xbb,0x01,0x0d,0xe9,0x25,0x82,0xf5,0x82,0xea,0x35,0x83,
630xf5,0x83,0x74,0x04,0x22,0xbb,0x02,0x0d,0xe9,0x25,0x82,0xf5,0x82,0xea,0x35,0x83,
640xf5,0x83,0x74,0x10,0x22,0xe9,0x25,0x82,0xf8,0x74,0x02,0x22,0x02,0x02,0xaf,0xbf,
650x00,0x05,0xed,0xf8,0x74,0x01,0x22,0xbf,0x01,0x07,0x8d,0x82,0x8e,0x83,0x74,0x04,
660x22,0xbf,0x02,0x07,0x8d,0x82,0x8e,0x83,0x74,0x10,0x22,0xed,0xf8,0x74,0x02,0x22,
670x02,0x02,0xd3,0xbf,0x00,0x07,0xed,0x25,0x82,0xf8,0x74,0x01,0x22,0xbf,0x01,0x0d,
680xed,0x25,0x82,0xf5,0x82,0xee,0x35,0x83,0xf5,0x83,0x74,0x04,0x22,0xbf,0x02,0x0d,
690xed,0x25,0x82,0xf5,0x82,0xee,0x35,0x83,0xf5,0x83,0x74,0x10,0x22,0xed,0x25,0x82,
700xf8,0x74,0x02,0x22,0x02,0x03,0x07,0xc0,0xe0,0x12,0x02,0x5b,0x02,0x03,0x1f,0xc0,
710xe0,0x12,0x02,0xaf,0x02,0x03,0x1f,0xc0,0xe0,0x12,0x02,0xd3,0x02,0x03,0x1f,0x30,
720xe0,0x0b,0x20,0xe3,0x04,0xd0,0xe0,0xf6,0x22,0xd0,0xe0,0xf7,0x22,0x30,0xe1,0x0b,
730x20,0xe3,0x04,0xd0,0xe0,0xf2,0x22,0xd0,0xe0,0xf3,0x22,0xd0,0xe0,0xf0,0x22,0xc9,
740xcd,0xc9,0xca,0xce,0xca,0xcb,0xcf,0xcb,0x12,0x03,0x52,0xed,0xf9,0xee,0xfa,0xef,
750xfb,0x22,0xbb,0x00,0x2f,0xbf,0x00,0x0a,0xfa,0xed,0xf8,0xe7,0xf6,0x08,0x09,0xda,
760xfa,0x22,0xbf,0x01,0x12,0x8d,0x82,0x8e,0x83,0xf8,0x02,0x03,0x6f,0x09,0xa3,0xe7,
770xf0,0xd8,0xfa,0x22,0x02,0x03,0x7a,0xfa,0xed,0xf8,0xe7,0xf2,0x08,0x09,0xda,0xfa,
780x22,0x02,0x03,0x84,0xbb,0x01,0x4d,0xbf,0x00,0x14,0x89,0x82,0x8a,0x83,0xf9,0xed,
790xf8,0x02,0x03,0x96,0x08,0xa3,0xe0,0xf6,0xd9,0xfa,0x22,0x02,0x03,0xa7,0xbf,0x01,
800x22,0x8d,0x82,0x8e,0x83,0xfb,0x08,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xe0,
810xa3,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xdb,0xea,0xd8,0xe8,0x22,
820x02,0x03,0xca,0x8d,0x82,0x8e,0x83,0xf9,0xed,0xf8,0xe0,0xf2,0x08,0xa3,0xd9,0xfa,
830x22,0x02,0x03,0xd4,0xbb,0x02,0x4d,0xbf,0x00,0x12,0x89,0x82,0x8a,0x83,0xf9,0xed,
840xf8,0x02,0x03,0xe6,0x08,0xa3,0xe4,0x93,0xf6,0xd9,0xf9,0x22,0xbf,0x01,0x23,0x8d,
850x82,0x8e,0x83,0xfb,0x08,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xe4,0x93,0xa3,
860xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xdb,0xe9,0xd8,0xe7,0x22,0x02,
870x04,0x19,0x89,0x82,0x8a,0x83,0xf9,0xed,0xf8,0xe4,0x93,0xf2,0x08,0xa3,0xd9,0xf9,
880x22,0x02,0x04,0x2a,0xbf,0x00,0x0d,0xfa,0xed,0xf8,0xe3,0xf6,0x08,0x09,0xda,0xfa,
890x22,0x02,0x04,0x34,0xbf,0x01,0x12,0x8d,0x82,0x8e,0x83,0xf8,0x02,0x04,0x41,0x09,
900xa3,0xe3,0xf0,0xd8,0xfa,0x22,0x02,0x04,0x4c,0xfa,0xed,0xf8,0xe3,0xf2,0x08,0x09,
910xda,0xfa,0x22,0x02,0x04,0x56,0xe6,0xfb,0x08,0xe6,0xfa,0x08,0xe6,0xf9,0x04,0xf6,
920x18,0x70,0x01,0x06,0x22,0xe6,0xff,0x08,0xe6,0xfe,0x08,0xe6,0xfd,0x22,0xef,0xf0,
930xa3,0xee,0xf0,0xa3,0xed,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,
940xe0,0xff,0xa3,0xe0,0xfe,0xa3,0xe0,0xfd,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,
950xf9,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xf9,0x00,0x61,0x05,0x68,0x00,
960x26,0x05,0x8f,0x00,0x33,0x0a,0x00,0x00,0x61,0x0a,0x6c,0x00,0x66,0x15,0x1d,0x00,
970x61,0x0c,0xf0,0x00,0x61,0x09,0xa0,0x00,0x61,0x09,0xd7,0x00,0x61,0x0d,0xb7,0x00,
980x61,0x0b,0xe8,0x00,0x61,0x0a,0x13,0x00,0x61,0x0a,0x48,0x00,0x61,0x17,0x15,0x00,
990x33,0x17,0x28,0x00,0x34,0x1d,0xf6,0x00,0x43,0x1e,0xa1,0x00,0x44,0x20,0x0e,0x00,
1000x44,0x1f,0xfc,0x00,0x47,0x1e,0xc8,0x00,0x47,0x1f,0x6d,0x00,0x4d,0x1f,0xbe,0x00,
1010x4f,0x1e,0xea,0x00,0x58,0x32,0x56,0x00,0x61,0x7c,0xcc,0x7d,0xff,0x12,0x1c,0xa7,
1020x22,0x90,0xff,0xfc,0xe0,0x20,0xe7,0x2d,0xc2,0xaf,0xae,0x59,0xaf,0x58,0x75,0x5a,
1030x20,0xe5,0x5a,0x14,0xc5,0x5a,0x60,0x19,0xe4,0xfe,0x7f,0x05,0xee,0x4f,0xce,0x24,
1040xff,0xce,0xcf,0x34,0xff,0xcf,0x60,0x07,0xe4,0x90,0xff,0x92,0xf0,0x80,0xed,0x80,
1050xe0,0x8e,0x59,0x8f,0x58,0x22,0x12,0x05,0x01,0x7d,0x07,0x7c,0xb7,0x12,0x32,0x72,
1060x7d,0x0f,0x7c,0x6e,0x12,0x32,0x8c,0x78,0x9d,0x7a,0x06,0xe4,0xf6,0x08,0xda,0xfc,
1070x7a,0x06,0x12,0x05,0xc4,0x7c,0x03,0x12,0x0e,0x4c,0x12,0x21,0x4a,0xe4,0xfe,0xff,
1080x7c,0x0f,0x12,0x31,0xfb,0xd2,0xa8,0x22,0x12,0x30,0xe6,0xe4,0x90,0xfc,0x38,0xf0,
1090x90,0xff,0xf0,0xe0,0x30,0xe4,0x08,0x74,0x01,0x90,0xfc,0x39,0xf0,0x80,0x05,0xe4,
1100x90,0xfc,0x39,0xf0,0x7d,0x0a,0x7c,0x00,0x12,0x25,0x26,0x12,0x31,0x69,0x22,0x12,
1110x30,0xe6,0x90,0xfc,0x39,0xe0,0x14,0x70,0x0e,0x90,0xff,0xf0,0xe0,0x44,0x10,0xf0,
1120x7c,0x00,0x12,0x25,0xbf,0x80,0x19,0x90,0xfc,0x39,0xe0,0x70,0x0e,0x90,0xff,0xf0,
1130xe0,0x54,0xef,0xf0,0x7c,0x00,0x12,0x25,0xbf,0x80,0x05,0x7c,0x17,0x12,0x25,0xbf,
1140x12,0x31,0x69,0x22,0x90,0xff,0xf0,0xe0,0x54,0xab,0xf0,0x90,0xff,0xf0,0xe0,0x44,
1150x20,0xf0,0x22,0x8c,0x37,0x8d,0x36,0x78,0x82,0xed,0xf6,0x08,0xec,0xf6,0xed,0xfe,
1160xec,0xfd,0x7f,0x01,0x90,0x00,0x05,0x12,0x01,0xec,0x78,0x80,0xf6,0x78,0x82,0xe6,
1170xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x04,0x12,0x01,0xec,
1180x54,0x0f,0xfc,0x7d,0x80,0x12,0x17,0x46,0x78,0x80,0xe6,0x70,0x0d,0xad,0x3a,0xae,
1190x39,0xaf,0x38,0xe4,0x12,0x03,0x0f,0x7c,0x08,0x22,0x90,0xff,0xf0,0xe0,0x54,0xfe,
1200xf0,0x90,0xff,0xf0,0xe0,0x54,0xfd,0xf0,0x80,0x1e,0x78,0x82,0xe6,0xfd,0x08,0xe6,
1210xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x25,0xe0,0x44,
1220x01,0x90,0xff,0xf3,0xf0,0x02,0x06,0xd0,0x78,0x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,
1230xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x06,0x12,0x02,0x0e,0x54,0xfe,0x90,0xff,0xf3,
1240xf0,0x80,0x2b,0x78,0x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,
1250x90,0x00,0x08,0x12,0x02,0x0e,0xfa,0xeb,0x90,0xff,0xf1,0xf0,0x12,0x08,0xbf,0x40,
1260x0d,0xad,0x3a,0xae,0x39,0xaf,0x38,0xe4,0x12,0x03,0x0f,0x7c,0x18,0x22,0x78,0x82,
1270xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,
1280x0e,0x90,0xff,0xf1,0xf0,0x12,0x08,0xbf,0x40,0x0d,0xad,0x3a,0xae,0x39,0xaf,0x38,
1290xe4,0x12,0x03,0x0f,0x7c,0x18,0x22,0x78,0x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,
1300xec,0xfd,0x7f,0x01,0x90,0x00,0x06,0x12,0x02,0x0e,0x44,0x01,0x90,0xff,0xf3,0xf0,
1310x78,0x83,0xe6,0x24,0x03,0xf6,0x18,0xe6,0x34,0x00,0xf6,0x78,0x80,0xe6,0x24,0xfe,
1320x50,0x09,0x90,0xff,0xf0,0xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0xff,0xf0,0xe0,0x44,
1330x02,0xf0,0xe4,0x90,0xff,0xf1,0xf0,0x78,0x81,0x76,0x00,0x78,0x80,0xe6,0x24,0xff,
1340xfc,0xe4,0x34,0xff,0xfd,0x78,0x81,0xe6,0x7f,0x00,0xfe,0xec,0xd3,0x9e,0xef,0x64,
1350x80,0xcd,0x64,0x80,0x9d,0x40,0x2f,0x12,0x08,0xa4,0x40,0x0f,0x78,0x81,0xe6,0xad,
1360x3a,0xae,0x39,0xaf,0x38,0x12,0x03,0x0f,0x7c,0x18,0x22,0x90,0xff,0xf2,0xe0,0xfc,
1370x78,0x82,0x86,0x83,0x08,0x86,0x82,0xec,0xf0,0x78,0x81,0x06,0xa3,0x78,0x82,0xa6,
1380x83,0x08,0xa6,0x82,0x80,0xb5,0x12,0x08,0xa4,0x40,0x0f,0x78,0x81,0xe6,0xad,0x3a,
1390xae,0x39,0xaf,0x38,0x12,0x03,0x0f,0x7c,0x18,0x22,0x90,0xff,0xf2,0xe0,0xfc,0x78,
1400x82,0x86,0x83,0x08,0x86,0x82,0xec,0xf0,0x78,0x80,0xe6,0xad,0x3a,0xae,0x39,0xaf,
1410x38,0x12,0x03,0x0f,0x7c,0x00,0x22,0x8c,0x37,0x8d,0x36,0x78,0x82,0xed,0xf6,0x08,
1420xec,0xf6,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x05,0x12,0x01,0xec,0x78,0x81,
1430xf6,0x78,0x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,
1440x04,0x12,0x01,0xec,0x54,0x0f,0xfc,0x7d,0x81,0x12,0x17,0x46,0x78,0x81,0xe6,0x70,
1450x03,0x7c,0x08,0x22,0x90,0xff,0xf0,0xe0,0x54,0xfe,0xf0,0x90,0xff,0xf0,0xe0,0x54,
1460xfd,0xf0,0x80,0x1b,0x78,0x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,
1470x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x25,0xe0,0x90,0xff,0xf3,0xf0,0x80,0x5b,0x78,
1480x82,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x06,0x12,
1490x02,0x0e,0x54,0xfe,0x90,0xff,0xf3,0xf0,0x80,0x21,0x78,0x82,0xe6,0xfd,0x08,0xe6,
1500xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0xfa,0xeb,0x90,
1510xff,0xf1,0xf0,0x12,0x08,0xbf,0x40,0x03,0x7c,0x18,0x22,0x78,0x82,0xe6,0xfd,0x08,
1520xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x90,0xff,
1530xf1,0xf0,0x12,0x08,0xbf,0x40,0x03,0x7c,0x18,0x22,0x78,0x83,0xe6,0x24,0x0a,0xf6,
1540x18,0xe6,0x34,0x00,0xf6,0x78,0x80,0x76,0x00,0x78,0x81,0xe6,0x24,0xff,0xfc,0xe4,
1550x34,0xff,0xfd,0x78,0x80,0xe6,0x7f,0x00,0xfe,0xec,0xd3,0x9e,0xef,0x64,0x80,0xcd,
1560x64,0x80,0x9d,0x40,0x21,0x78,0x82,0x86,0x83,0x08,0x86,0x82,0xe0,0x90,0xff,0xf1,
1570xf0,0x12,0x08,0xbf,0x40,0x03,0x7c,0x18,0x22,0x78,0x80,0x06,0x78,0x83,0x06,0xe6,
1580x18,0x70,0x01,0x06,0x80,0xc3,0x90,0xff,0xf0,0xe0,0x44,0x01,0xf0,0x78,0x82,0x86,
1590x83,0x08,0x86,0x82,0xe0,0x90,0xff,0xf1,0xf0,0x12,0x08,0xbf,0x40,0x03,0x7c,0x18,
1600x22,0x7c,0x00,0x22,0x90,0xff,0xf0,0xe0,0x20,0xe7,0x12,0x90,0xff,0xf0,0xe0,0x30,
1610xe5,0x09,0x90,0xff,0xf0,0xe0,0x44,0x20,0xf0,0xc3,0x22,0x80,0xe7,0xd3,0x22,0x90,
1620xff,0xf0,0xe0,0x20,0xe3,0x12,0x90,0xff,0xf0,0xe0,0x30,0xe5,0x09,0x90,0xff,0xf0,
1630xe0,0x44,0x20,0xf0,0xc3,0x22,0x80,0xe7,0xd3,0x22,0x8c,0x42,0x8d,0x41,0x7c,0x00,
1640xed,0x54,0xf0,0xfd,0xec,0x70,0x03,0xed,0x64,0x30,0x70,0x05,0x75,0x3e,0x03,0x80,
1650x03,0x75,0x3e,0x04,0xac,0x3e,0x12,0x0f,0x69,0x75,0x83,0x00,0x85,0x83,0x40,0xe5,
1660x41,0x54,0x0f,0xf5,0x3f,0xe5,0x40,0x70,0x04,0xe5,0x3f,0x64,0x03,0x70,0x35,0xe5,
1670x3e,0x24,0xfd,0x75,0xf0,0x0a,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
1680xe0,0x30,0xe6,0x05,0x12,0x10,0x4b,0x80,0x19,0xe5,0x3e,0x24,0x9d,0xf8,0xc6,0x54,
1690xfb,0xf6,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0x74,
1700x0f,0xf0,0x80,0x59,0xe5,0x40,0x70,0x04,0xe5,0x3f,0x64,0x04,0x70,0x48,0xe5,0x3e,
1710x24,0xfd,0x75,0xf0,0x0a,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,
1720x30,0xe5,0x07,0xac,0x42,0xad,0x41,0x12,0x1c,0x3c,0xe5,0x42,0x30,0xe2,0x15,0x78,
1730xad,0xe6,0x30,0xe0,0x0f,0x78,0xad,0xe6,0x30,0xe1,0x09,0xe4,0xff,0x04,0xfe,0x7c,
1740x04,0x12,0x31,0xfb,0x78,0xa9,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
1750x83,0x74,0x0f,0xf0,0x80,0x07,0xe4,0xfc,0x7d,0xee,0x12,0x1c,0x3c,0xc2,0x03,0x22,
1760x12,0x30,0xe6,0x12,0x0f,0x69,0x78,0xa9,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,
1770x00,0xf5,0x83,0xe0,0x90,0xfc,0x38,0xf0,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,
1780xe6,0x34,0x00,0xf5,0x83,0xe0,0x90,0xfc,0x39,0xf0,0xc2,0x03,0x7d,0x02,0x7c,0x00,
1790x12,0x25,0x26,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0xec,0x24,
1800x9d,0xf8,0xe6,0x30,0xe1,0x07,0x7c,0x13,0x12,0x25,0xbf,0x80,0x0f,0x90,0xfc,0x39,
1810xe0,0xfd,0x78,0x95,0xe6,0xfc,0x12,0x13,0xc8,0x12,0x25,0xbf,0x12,0x31,0x69,0x22,
1820x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0x7d,0x00,0x12,0x0f,0x09,0x12,0x25,0xbf,0x12,
1830x31,0x69,0x22,0x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0xec,0x24,0x9d,0xf8,0xe6,0x30,
1840xe2,0x07,0x7c,0x13,0x12,0x25,0xbf,0x80,0x1b,0x78,0x95,0xe6,0x24,0x9d,0xf8,0xe6,
1850x20,0xe1,0x07,0x7c,0x12,0x12,0x25,0xbf,0x80,0x0a,0x78,0x95,0xe6,0xfc,0x12,0x13,
1860xec,0x12,0x25,0xbf,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0xec,
1870x24,0x9d,0xf8,0xe6,0x20,0xe2,0x07,0x7c,0x11,0x12,0x25,0xbf,0x80,0x0a,0x78,0x95,
1880xe6,0xfc,0x12,0x14,0xed,0x12,0x25,0xbf,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x78,
1890x95,0xec,0xf6,0x12,0x0f,0x69,0x78,0xa9,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,
1900x00,0xf5,0x83,0xe0,0x90,0xfc,0x3f,0xf0,0x78,0xa9,0xe6,0x24,0x0a,0xf5,0x82,0x18,
1910xe6,0x34,0x00,0xf5,0x83,0xe0,0x90,0xfc,0x40,0xf0,0x78,0xa9,0xe6,0x24,0x03,0xf5,
1920x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xfc,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,
1930x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,0x62,0x78,0xa9,0xe6,0x24,0x02,0xf5,0x82,
1940x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,0x63,0x8c,0x61,0xe4,0xec,0x33,0x33,0x54,
1950x01,0x78,0x95,0xf6,0x60,0x08,0xe5,0x62,0x30,0xe1,0x03,0x78,0x95,0x06,0x78,0x95,
1960xe6,0x90,0xfc,0x41,0xf0,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
1970xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x54,0x0c,0xfc,0xed,0x54,0xe6,0x8c,0x65,0xf5,0x64,
1980xe5,0x61,0x30,0xe5,0x03,0x43,0x65,0x01,0xe5,0x62,0x20,0xe5,0x0e,0xe5,0x61,0x54,
1990x7f,0x70,0x08,0xe5,0x61,0x20,0xe7,0x03,0x43,0x65,0x02,0xe5,0x61,0x30,0xe3,0x03,
2000x43,0x65,0x10,0xe5,0x61,0x30,0xe2,0x03,0x43,0x65,0x20,0xe5,0x61,0x54,0x03,0x60,
2010x03,0x43,0x65,0x40,0xe5,0x61,0x30,0xe1,0x03,0x43,0x65,0x80,0xe5,0x61,0x30,0xe4,
2020x03,0x43,0x64,0x01,0xe5,0x61,0x30,0xe6,0x03,0x43,0x64,0x08,0xe5,0x62,0x20,0xe4,
2030x0e,0xe5,0x61,0x54,0x7f,0x70,0x08,0xe5,0x61,0x20,0xe7,0x03,0x43,0x64,0x10,0x53,
2040x65,0xfb,0x53,0x64,0x79,0xad,0x64,0xe5,0x65,0x90,0xfc,0x3a,0xcd,0xf0,0xa3,0xcd,
2050xf0,0xe5,0x63,0x30,0xe3,0x0d,0xe5,0x63,0x54,0x30,0xc4,0x54,0x0f,0x90,0xfc,0x3d,
2060xf0,0x80,0x05,0xe4,0x90,0xfc,0x3d,0xf0,0xe5,0x63,0x54,0x03,0x90,0xfc,0x3c,0xf0,
2070xe5,0x63,0x54,0x04,0xc3,0x13,0x90,0xfc,0x3e,0xf0,0x90,0xfc,0x3c,0xe0,0x70,0x0e,
2080x7d,0x35,0x7e,0xfc,0x7f,0x01,0x74,0x01,0x90,0x00,0x09,0x12,0x01,0x42,0x78,0xa9,
2090xe6,0x24,0x08,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x7c,0x00,0xfd,0x78,
2100xa9,0xe6,0x24,0x07,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x7f,0x00,0x4c,
2110xfe,0xef,0x4d,0x90,0xfc,0x38,0xf0,0xa3,0xce,0xf0,0xce,0xc2,0x03,0x7d,0x0a,0x7c,
2120x00,0x12,0x25,0x26,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0x78,
2130x9a,0x76,0x01,0x08,0x76,0xfc,0x08,0x76,0x38,0x78,0x97,0x76,0x0c,0x78,0x9a,0x12,
2140x04,0x65,0x12,0x02,0x14,0x78,0x98,0xcb,0xf6,0xcb,0x08,0xf6,0x7f,0x00,0xef,0x24,
2150xea,0x40,0x1f,0xe4,0xef,0x25,0xe0,0x90,0x35,0x2c,0xfd,0x93,0xcd,0x04,0x93,0x78,
2160x99,0x66,0x70,0x03,0xed,0x18,0x66,0x70,0x06,0x78,0x97,0x76,0x00,0x80,0x03,0x0f,
2170x80,0xdc,0x78,0x96,0xef,0xf6,0x78,0x9a,0x12,0x04,0x65,0x90,0x00,0x02,0x12,0x02,
2180x0e,0x78,0x98,0xcb,0xf6,0xcb,0x08,0xf6,0x54,0x04,0xcb,0x54,0x86,0x4b,0x60,0x04,
2190x78,0x97,0x76,0x0b,0x78,0x99,0xe6,0x30,0xe3,0x13,0x78,0x9a,0x12,0x04,0x65,0x90,
2200x00,0x05,0x12,0x01,0xec,0x24,0xfb,0x50,0x04,0x78,0x97,0x76,0x0d,0x78,0x99,0xe6,
2210x54,0xc0,0x7d,0x00,0x64,0xc0,0x4d,0x70,0x04,0x78,0x97,0x76,0x0b,0x78,0x9a,0x12,
2220x04,0x65,0x90,0x00,0x04,0x12,0x01,0xec,0x24,0xfc,0x50,0x04,0x78,0x97,0x76,0x0f,
2230x78,0x9a,0x12,0x04,0x65,0x90,0x00,0x06,0x12,0x01,0xec,0x24,0xfd,0x50,0x04,0x78,
2240x97,0x76,0x0e,0x78,0x9a,0x12,0x04,0x65,0x90,0x00,0x09,0x12,0x01,0xec,0x24,0xfd,
2250x50,0x04,0x78,0x97,0x76,0x0a,0x78,0x97,0xe6,0x70,0x2a,0x78,0x95,0xe6,0xfc,0x12,
2260x0f,0x69,0x78,0x9a,0x12,0x04,0x65,0x78,0xa7,0xe6,0xf9,0x78,0xa6,0xe6,0xfa,0x7b,
2270x01,0x74,0x0a,0x78,0x00,0x12,0x03,0x3f,0xc2,0x03,0x78,0x95,0xe6,0xfc,0x12,0x11,
2280x07,0x78,0x97,0xec,0xf6,0x78,0x97,0xe6,0xfc,0x12,0x25,0xbf,0x12,0x31,0x69,0x22,
2290x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0x12,0x0f,0x69,0x78,0x95,0xe6,0x24,0xfd,0x75,
2300xf0,0x0a,0xa4,0x24,0x14,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xac,0x82,0xad,0x83,
2310x78,0xa6,0x86,0x83,0x08,0x86,0x82,0xec,0xf9,0xed,0xfa,0x7b,0x0a,0x78,0x01,0x12,
2320x03,0xa7,0xc2,0x03,0x78,0x95,0xe6,0xfc,0x12,0x11,0x07,0x12,0x31,0x69,0x22,0x8d,
2330x2b,0x8c,0x2a,0xed,0x60,0x40,0x75,0x27,0x01,0x75,0x29,0x48,0x75,0x28,0xff,0xe5,
2340x2a,0x24,0xfd,0xfc,0xe4,0x34,0xff,0xfd,0xec,0x7c,0x03,0x25,0xe0,0xcd,0x33,0xcd,
2350xdc,0xf9,0xfc,0xe5,0x29,0x2c,0xf5,0x29,0xe5,0x28,0x3d,0xf5,0x28,0xad,0x29,0xae,
2360x28,0xaf,0x27,0x74,0x80,0x90,0x00,0x06,0x12,0x03,0x17,0x74,0x80,0x90,0x00,0x02,
2370x12,0x03,0x17,0x12,0x0f,0xb7,0xe5,0x2b,0x14,0x60,0x3b,0x75,0x27,0x01,0x75,0x29,
2380x08,0x75,0x28,0xff,0xe5,0x2a,0x24,0xfd,0xfc,0xe4,0x34,0xff,0xfd,0xec,0x7c,0x03,
2390x25,0xe0,0xcd,0x33,0xcd,0xdc,0xf9,0xfc,0xe5,0x29,0x2c,0xf5,0x29,0xe5,0x28,0x3d,
2400xf5,0x28,0xad,0x29,0xae,0x28,0xaf,0x27,0xe4,0x90,0x00,0x06,0x12,0x03,0x17,0xe4,
2410x90,0x00,0x02,0x12,0x03,0x17,0x22,0x12,0x30,0xe6,0x78,0x95,0xec,0xf6,0xec,0x24,
2420x9d,0xf8,0xe6,0x30,0xe2,0x09,0x78,0x95,0xe6,0xfc,0x12,0x14,0xed,0xd2,0x00,0x78,
2430x95,0xe6,0xfc,0x12,0x0f,0x69,0x78,0x96,0x76,0x00,0x90,0xfc,0x39,0xe0,0x30,0xe7,
2440x04,0x78,0x96,0x76,0x01,0x78,0x96,0xe6,0xfd,0x78,0x95,0xe6,0xfc,0x12,0x0d,0x2f,
2450xc2,0x03,0x30,0x00,0x07,0x78,0x95,0xe6,0xfc,0x12,0x13,0xec,0x7c,0x00,0x12,0x25,
2460xbf,0x12,0x31,0x69,0x22,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,
2470xf5,0x83,0xe0,0x44,0x01,0xf0,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,
2480x00,0xf5,0x83,0xe0,0x30,0xe0,0x02,0x80,0xed,0x78,0xa9,0xe6,0x24,0x0b,0xf5,0x82,
2490x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xf8,0xf0,0x78,0xa9,0xe6,0x24,0x02,0xf5,
2500x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x22,0xc2,0x03,0x8c,0x58,
2510x12,0x0f,0x69,0x78,0xa6,0x86,0x83,0x08,0x86,0x82,0x79,0x5d,0x7a,0x35,0x7b,0x0a,
2520x78,0x01,0x12,0x03,0xf5,0x12,0x0e,0x05,0xac,0x58,0x7d,0x02,0x12,0x0d,0x2f,0xc2,
2530x03,0xac,0x58,0x12,0x11,0x07,0x22,0x8d,0x53,0x8e,0x52,0x8f,0x51,0x8c,0x50,0x12,
2540x0f,0x69,0x75,0x4f,0x00,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,
2550xf5,0x83,0xe0,0x20,0xe4,0x1f,0xe5,0x4f,0x24,0xf6,0x40,0x19,0x05,0x4f,0xc2,0x03,
2560x7c,0x18,0x12,0x32,0xa9,0x90,0xff,0x93,0xe0,0x44,0x01,0xf0,0xb2,0xb3,0xac,0x50,
2570x12,0x0f,0x69,0x80,0xd0,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,
2580xf5,0x83,0xe0,0x20,0xe4,0x05,0xc2,0x03,0x7c,0x02,0x22,0x78,0xa9,0xe6,0x24,0x05,
2590xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0x0f,0x60,0x16,0x78,0xa9,0xe6,
2600x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0x0f,0xf0,0xc2,0x03,
2610x7c,0x01,0x22,0x78,0xa8,0x86,0x83,0x08,0x86,0x82,0xe0,0xad,0x53,0xae,0x52,0xaf,
2620x51,0x12,0x03,0x0f,0xc2,0x03,0x7c,0x00,0x22,0x8d,0x31,0x8c,0x30,0x12,0x14,0xed,
2630xe5,0x31,0x60,0x0f,0xe5,0x30,0xb4,0x03,0x0a,0x7c,0x01,0x12,0x24,0xee,0x7c,0x81,
2640x12,0x24,0xee,0xac,0x30,0x12,0x0f,0x69,0xe5,0x31,0x60,0x1a,0x78,0xaa,0x86,0x83,
2650x08,0x86,0x82,0xe0,0x54,0xe7,0xf0,0xa3,0xa3,0xa3,0xa3,0xe0,0x54,0xe7,0xf0,0xac,
2660x30,0x7d,0x02,0x12,0x0d,0x2f,0x78,0xa6,0x86,0x83,0x08,0x86,0x82,0x79,0x67,0x7a,
2670x35,0x7b,0x0a,0x78,0x01,0x12,0x03,0xf5,0xc2,0x03,0xe5,0x30,0x24,0x9d,0xf8,0xc6,
2680x54,0xfd,0xf6,0xac,0x30,0x12,0x11,0x07,0x22,0x8c,0x26,0x30,0x03,0x05,0x12,0x32,
2690x48,0x80,0xf8,0x7c,0x0a,0x12,0x31,0x5b,0xd2,0x03,0xe5,0x26,0x24,0xfd,0x78,0xa3,
2700xf6,0x70,0x07,0x78,0xaa,0x76,0xff,0x08,0x76,0xe0,0x78,0xa3,0xe6,0x75,0xf0,0x10,
2710xa4,0xad,0xf0,0xfc,0x24,0xa0,0x78,0xa9,0xf6,0xed,0x34,0xff,0x18,0xf6,0x78,0xa3,
2720xe6,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xfc,0xe4,0x34,0xfc,0xfd,0x78,0xa6,0xed,0xf6,
2730x08,0xec,0xf6,0x12,0x31,0xf4,0x22,0x78,0xa9,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,
2740x34,0x00,0xf5,0x83,0xe0,0x30,0xe7,0x22,0x78,0xa9,0xe6,0x24,0x02,0xf5,0x82,0x18,
2750xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0x7f,0xf0,0x78,0xa9,0xe6,0x24,0x02,0xf5,0x82,
2760x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x22,0x78,0xaa,0x86,0x83,0x08,
2770x86,0x82,0xe0,0x54,0x7f,0xf0,0xad,0x83,0xe5,0x82,0x24,0x04,0xfc,0xe4,0x3d,0x8c,
2780x82,0xf5,0x83,0xe0,0x54,0x7f,0xf0,0x78,0xa9,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,
2790x34,0x00,0xf5,0x83,0xe0,0x54,0xf8,0xf0,0x78,0xab,0xe6,0x24,0x01,0xf5,0x82,0x18,
2800xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x03,0xf0,0x78,0xab,0xe6,0x24,0x05,0xf5,0x82,
2810x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x03,0xf0,0x78,0xa9,0xe6,0x24,0x05,0xf5,
2820x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0x74,0x0f,0xf0,0x22,0x78,0xaa,0x86,0x83,0x08,
2830x86,0x82,0xe0,0x54,0x3f,0xf0,0xad,0x83,0xe5,0x82,0x24,0x04,0xfc,0xe4,0x3d,0x8c,
2840x82,0xf5,0x83,0xe0,0x54,0x3f,0xf0,0x78,0xa3,0xe6,0x24,0xa4,0xf8,0xe6,0xfc,0x78,
2850xab,0xe6,0x24,0x01,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa3,
2860xe6,0x24,0xa4,0xf8,0xe6,0xfc,0x78,0xab,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,
2870x00,0xf5,0x83,0xec,0xf0,0x78,0xa9,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,
2880xf5,0x83,0xe0,0x54,0xfb,0x44,0x02,0xf5,0x26,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,
2890x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe5,0x03,0x43,0x26,0x01,0x78,0xa9,0xe6,
2900x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe0,0x03,0x12,0x0f,
2910xb7,0xe5,0x26,0xfc,0x78,0xa9,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
2920x83,0xec,0xf0,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
2930x74,0x0f,0xf0,0x78,0xaa,0x86,0x83,0x08,0x86,0x82,0xe0,0x44,0x80,0xf0,0xa3,0xa3,
2940xa3,0xa3,0xe0,0x44,0x80,0xf0,0x22,0x8c,0x2a,0x12,0x0f,0x69,0x78,0xa7,0xe6,0x24,
2950x08,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xfc,0x78,0xa9,0xe6,0x24,0x0a,
2960xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa7,0xe6,0x24,0x07,0xf5,
2970x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xfc,0x78,0xa9,0xe6,0x24,0x09,0xf5,0x82,
2980x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa6,0x86,0x83,0x08,0x86,0x82,0xe0,
2990xfd,0xa3,0xe0,0xfc,0xed,0xfe,0x78,0xa9,0xe6,0x24,0x08,0xf5,0x82,0x18,0xe6,0x34,
3000x00,0xf5,0x83,0xee,0xf0,0xec,0xfe,0x78,0xa9,0xe6,0x24,0x07,0xf5,0x82,0x18,0xe6,
3010x34,0x00,0xf5,0x83,0xee,0xf0,0x8c,0x29,0x8d,0x28,0xc3,0xec,0x94,0x05,0xed,0x94,
3020x0c,0x40,0x05,0x75,0x27,0x7c,0x80,0x33,0xd3,0xe5,0x29,0x94,0x01,0xe5,0x28,0x94,
3030x03,0x40,0x05,0x75,0x27,0x3c,0x80,0x23,0xd3,0xe5,0x29,0x94,0x81,0xe5,0x28,0x94,
3040x01,0x40,0x05,0x75,0x27,0x18,0x80,0x13,0xd3,0xe5,0x29,0x94,0x60,0xe5,0x28,0x94,
3050x00,0x40,0x05,0x75,0x27,0x0c,0x80,0x03,0x75,0x27,0x08,0xaf,0x27,0xe4,0xef,0x54,
3060x7c,0x44,0x83,0xff,0x8f,0x27,0xe5,0x27,0xfc,0x78,0xab,0xe6,0x24,0x01,0xf5,0x82,
3070x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0xe5,0x27,0xfc,0x78,0xab,0xe6,0x24,0x05,
3080xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0xe5,0x27,0xfc,0x78,0xa3,0xe6,
3090x24,0xa4,0xf8,0xec,0xf6,0x78,0xa9,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
3100xf5,0x83,0xe0,0xf5,0x27,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
3110xf5,0x83,0xa3,0xe0,0x30,0xe3,0x17,0x53,0x27,0xc7,0x78,0xa7,0xe6,0x24,0x05,0xf5,
3120x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x90,0x35,0x58,0x93,0x42,0x27,0x53,0x27,
3130xfb,0x78,0xa7,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x60,
3140x03,0x43,0x27,0x04,0x53,0x27,0xfc,0x78,0xa7,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,
3150x34,0x00,0xf5,0x83,0xe0,0x42,0x27,0x43,0x27,0x80,0xe5,0x27,0xfc,0x78,0xa9,0xe6,
3160x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa9,0xe6,0x24,
3170x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,0x27,0x78,0xa7,0xe6,0x24,
3180x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe1,0x05,0x53,0x27,
3190xdf,0x80,0x03,0x43,0x27,0x20,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,
3200x00,0xf5,0x83,0xe0,0x30,0xe4,0x05,0x53,0x27,0xef,0x80,0x03,0x43,0x27,0x10,0x78,
3210xa7,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xb4,0x02,0x03,
3220x43,0x27,0x02,0xe5,0x27,0xfc,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,
3230x00,0xf5,0x83,0xec,0xf0,0x78,0xa9,0xe6,0x24,0x03,0xf5,0x82,0x18,0xe6,0x34,0x00,
3240xf5,0x83,0xe0,0xf5,0x27,0x78,0xa7,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,0x00,
3250xf5,0x83,0xe0,0x70,0x05,0x53,0x27,0x7f,0x80,0x03,0x43,0x27,0x80,0x78,0xa7,0xe6,
3260x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe0,0x05,0x43,
3270x27,0x20,0x80,0x03,0x53,0x27,0xdf,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,
3280x34,0x00,0xf5,0x83,0xe0,0x30,0xe3,0x05,0x43,0x27,0x40,0x80,0x03,0x53,0x27,0xbf,
3290x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe0,
3300x05,0x43,0x27,0x10,0x80,0x03,0x53,0x27,0xef,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,
3310x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe4,0x05,0x43,0x27,0x08,0x80,0x03,
3320x53,0x27,0xf7,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
3330xa3,0xe0,0x30,0xe5,0x05,0x43,0x27,0x04,0x80,0x03,0x53,0x27,0xfb,0x78,0xa7,0xe6,
3340x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe6,0x05,0x43,
3350x27,0x01,0x80,0x03,0x53,0x27,0xfe,0x78,0xa7,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,
3360x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe7,0x05,0x43,0x27,0x02,0x80,0x03,0x53,0x27,
3370xfd,0xe5,0x27,0xfc,0x78,0xa9,0xe6,0x24,0x03,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
3380x83,0xec,0xf0,0xc2,0x03,0x7c,0x00,0x22,0x8d,0x27,0x8c,0x26,0xed,0x54,0x03,0x14,
3390x60,0x03,0x7c,0x10,0x22,0xe5,0x27,0x54,0x7c,0x24,0xfc,0x40,0x03,0x7c,0x0b,0x22,
3400xe5,0x26,0x24,0x9d,0xf8,0xc6,0x44,0x02,0xf6,0x7c,0x00,0x22,0x8c,0x30,0x12,0x0f,
3410x69,0xe5,0x30,0x24,0x9d,0xf8,0xe6,0x20,0xe2,0x4f,0xac,0x30,0x7d,0x02,0x12,0x0d,
3420x2f,0xe5,0x30,0x24,0xfe,0x44,0x28,0xfc,0x78,0xaa,0x86,0x83,0x08,0x86,0x82,0xec,
3430xf0,0xaf,0x83,0xe5,0x82,0x24,0x04,0xfe,0xe4,0x3f,0xff,0xec,0x8e,0x82,0x8f,0x83,
3440xf0,0x7c,0x03,0x8c,0x2c,0xe5,0x2c,0xfc,0x78,0xab,0xe6,0x24,0x01,0xf5,0x82,0x18,
3450xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0xe5,0x2c,0xfc,0x78,0xab,0xe6,0x24,0x05,0xf5,
3460x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x75,0x2d,0x01,0x75,0x2f,0x48,0x75,
3470x2e,0xff,0xe5,0x30,0x24,0xfd,0xfc,0xe4,0x34,0xff,0xfd,0xec,0x7c,0x03,0x25,0xe0,
3480xcd,0x33,0xcd,0xdc,0xf9,0xfc,0xe5,0x2f,0x2c,0xf5,0x2f,0xe5,0x2e,0x3d,0xf5,0x2e,
3490x78,0xab,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xe7,
3500xf5,0x2c,0xad,0x2f,0xae,0x2e,0xaf,0x2d,0xe4,0x90,0x00,0x02,0x12,0x03,0x17,0xe4,
3510x90,0x00,0x06,0x12,0x03,0x17,0x12,0x01,0xe6,0x30,0xe5,0x03,0x43,0x2c,0x10,0xe5,
3520x2c,0xfc,0x78,0xab,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,
3530xf0,0x12,0x10,0x4b,0x78,0xa9,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
3540x83,0xe0,0xc2,0x03,0xfc,0xe5,0x30,0x24,0x9d,0xf8,0xc6,0x44,0x04,0xf6,0x8c,0x2c,
3550xe5,0x30,0x54,0x0f,0xc4,0x54,0xf0,0x7e,0x00,0xff,0xee,0xef,0x44,0x04,0x7d,0x00,
3560xff,0xec,0x4e,0xfc,0xed,0x4f,0xfd,0x12,0x1c,0xa7,0x7c,0x00,0x22,0x8c,0x2f,0x12,
3570x0f,0x69,0x12,0x0f,0xeb,0x78,0xaa,0x86,0x83,0x08,0x86,0x82,0xe0,0x54,0x08,0xf0,
3580xa3,0xa3,0xa3,0xa3,0xe0,0x54,0x08,0xf0,0xac,0x2f,0x7d,0x02,0x12,0x0d,0x2f,0xc2,
3590x03,0xe5,0x2f,0x24,0x9d,0xf8,0xc6,0x54,0xfb,0xf6,0x7c,0x00,0x22,0x12,0x30,0xe6,
3600x78,0x96,0xec,0xf6,0xec,0x24,0x9d,0xf8,0xe6,0x30,0xe1,0x0a,0x7d,0x00,0x7c,0x13,
3610x12,0x25,0x26,0x12,0x31,0x69,0x78,0x96,0xe6,0x24,0x9d,0xf8,0xc6,0x44,0x01,0xf6,
3620x78,0x96,0xe6,0xfc,0x12,0x0f,0x69,0x78,0x96,0xe6,0x24,0xfd,0x75,0xf0,0x0a,0xa4,
3630x24,0x14,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0x78,0xa6,0xe6,0xfa,0x08,0xe6,0xf9,
3640x7b,0x0a,0x78,0x01,0x12,0x03,0xa7,0x78,0xa6,0x86,0x83,0x08,0x86,0x82,0x79,0x67,
3650x7a,0x35,0x7b,0x0a,0x78,0x01,0x12,0x03,0xf5,0x12,0x0f,0xb7,0xc2,0x03,0x78,0x96,
3660xe6,0xfc,0x12,0x11,0x07,0x78,0x95,0xec,0xf6,0xec,0x60,0x0a,0x7d,0x00,0x7c,0x08,
3670x12,0x25,0x26,0x12,0x31,0x69,0x78,0x96,0xe6,0xfc,0x12,0x0f,0x69,0x78,0xa9,0xe6,
3680x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x10,0x54,0xdf,0xfc,
3690x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,
3700x95,0xec,0xf6,0xc2,0x03,0x7c,0xc8,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,0x12,0x0f,
3710x69,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,
3720xef,0xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,0x12,0x0f,0x69,
3730x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x10,
3740xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,0x12,0x0f,0x69,0x78,
3750xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x20,0xf0,
3760xc2,0x03,0x7c,0xf0,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,0x12,0x0f,0x69,0x78,0xa9,
3770xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe4,0x15,0xc2,
3780x03,0x78,0x96,0xe6,0x44,0x10,0x7f,0x00,0xfe,0x7c,0x07,0x12,0x31,0xfb,0x12,0x31,
3790x69,0x02,0x17,0x14,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
3800x83,0xe0,0x54,0xcf,0xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,
3810x12,0x0f,0x69,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
3820xe0,0x44,0x30,0xf0,0xc2,0x03,0x7c,0xf0,0x12,0x32,0xa9,0x78,0x96,0xe6,0xfc,0x12,
3830x0f,0x69,0x78,0xa9,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,
3840x30,0xe4,0x14,0xc2,0x03,0x78,0x96,0xe6,0x44,0x10,0x7f,0x00,0xfe,0x7c,0x07,0x12,
3850x31,0xfb,0x12,0x31,0x69,0x80,0x5d,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,
3860x34,0x00,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x78,0xa9,0xe6,0x24,0x04,0xf5,0x82,0x18,
3870xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xdf,0xf0,0x78,0x96,0xe6,0x24,0xfd,0x75,0xf0,
3880x0a,0xa4,0x24,0x14,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xac,0x82,0xad,0x83,0x78,
3890xa6,0x86,0x83,0x08,0x86,0x82,0xec,0xf9,0xed,0xfa,0x7b,0x0a,0x78,0x01,0x12,0x03,
3900xa7,0xc2,0x03,0x78,0x96,0xe6,0xfc,0x12,0x11,0x07,0x7d,0x00,0x7c,0x0b,0x12,0x25,
3910x26,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0xe4,0x90,0xfc,0x39,0xf0,0x7d,0x02,0x7c,
3920x00,0x12,0x25,0x26,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x7c,0x00,0x12,0x25,0xbf,
3930x12,0x31,0x69,0x22,0x74,0x3c,0x90,0xfb,0xe0,0xf0,0x74,0x3e,0x90,0xfb,0xe0,0xf0,
3940xe4,0x90,0xfc,0x28,0xf0,0x22,0x8d,0x35,0x8c,0x34,0xec,0xb4,0x01,0x02,0x80,0x03,
3950xd3,0x40,0x02,0x80,0x28,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x08,0xa8,0x35,0xc6,
3960x25,0xe0,0xf6,0x80,0x18,0xb4,0x04,0x02,0x80,0x03,0xd3,0x40,0x0a,0xa8,0x35,0xc6,
3970x25,0xe0,0x25,0xe0,0xf6,0x80,0x06,0xa8,0x35,0x76,0x00,0x80,0x00,0x22,0x8c,0x3c,
3980x8d,0x3b,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x75,0x66,0x06,0x75,0x67,0x00,0x90,0xfc,
3990x29,0x12,0x04,0x6e,0x12,0x01,0xe6,0xb4,0x80,0x02,0x80,0x06,0xd3,0x50,0x03,0x02,
4000x18,0x47,0x90,0xfc,0x29,0x12,0x04,0x80,0x90,0x00,0x03,0x12,0x01,0xec,0x54,0xf0,
4010xb4,0x30,0x02,0x80,0x03,0xd3,0x40,0x5f,0x90,0xfc,0x29,0x12,0x04,0x80,0x90,0x00,
4020x08,0x12,0x02,0x0e,0xfa,0xfd,0xeb,0xfe,0x7f,0x01,0x90,0xfc,0x2c,0x12,0x04,0x6e,
4030xee,0xcd,0x90,0x35,0x71,0xfc,0xe4,0x93,0xff,0x74,0x01,0x93,0xfe,0xf9,0xef,0xfa,
4040x7b,0x01,0xea,0xff,0xe9,0xfe,0xec,0xc3,0x9e,0xed,0x9f,0x40,0x25,0x90,0x35,0x73,
4050xe4,0x93,0xfd,0x74,0x01,0x93,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0xee,0xcd,0xfc,
4060x90,0xfc,0x2e,0xe0,0xd3,0x9c,0x90,0xfc,0x2d,0xe0,0x9d,0x50,0x05,0x75,0x66,0x80,
4070x80,0x33,0x12,0x19,0x65,0x80,0x2e,0xb4,0x60,0x02,0x80,0x03,0xd3,0x40,0x0b,0xac,
4080x3c,0xad,0x3b,0x12,0x07,0x77,0x8c,0x66,0x80,0x1b,0xb4,0x10,0x03,0xb3,0x40,0x10,
4090xc3,0xb4,0x20,0x03,0xb3,0x40,0x09,0xc3,0xb4,0x40,0x02,0x80,0x03,0xd3,0x40,0x00,
4100x75,0x66,0x81,0x80,0x00,0x80,0x75,0xb4,0x81,0x02,0x80,0x03,0xd3,0x40,0x6b,0x90,
4110xfc,0x29,0x12,0x04,0x80,0x90,0x00,0x03,0x12,0x01,0xec,0x54,0xf0,0xb4,0x30,0x02,
4120x80,0x03,0xd3,0x40,0x1d,0x90,0xfc,0x29,0x12,0x04,0x80,0x90,0x00,0x08,0x12,0x02,
4130x0e,0xfa,0xfd,0xeb,0xfe,0x7f,0x01,0x90,0xfc,0x2f,0x12,0x04,0x6e,0x12,0x18,0xcf,
4140x80,0x36,0xb4,0x60,0x02,0x80,0x03,0xd3,0x40,0x13,0x75,0x3a,0x67,0xe4,0xf5,0x39,
4150xf5,0x38,0xac,0x3c,0xad,0x3b,0x12,0x05,0xd3,0x8c,0x66,0x80,0x1b,0xb4,0x10,0x03,
4160xb3,0x40,0x10,0xc3,0xb4,0x20,0x03,0xb3,0x40,0x09,0xc3,0xb4,0x40,0x02,0x80,0x03,
4170xd3,0x40,0x00,0x75,0x66,0x81,0x80,0x00,0x80,0x02,0x80,0x00,0xe5,0x66,0xfc,0x90,
4180xfc,0x29,0x12,0x04,0x80,0xec,0x90,0x00,0x02,0x12,0x03,0x17,0xac,0x67,0x22,0x90,
4190xfc,0x29,0x12,0x04,0x80,0x90,0x00,0x04,0x12,0x01,0xec,0x60,0x04,0x74,0x01,0x80,
4200x01,0xe4,0xa2,0xe0,0x92,0x01,0x90,0xfc,0x29,0x12,0x04,0x80,0xed,0x24,0x03,0xfd,
4210x50,0x01,0x0e,0x90,0xfc,0x2c,0x12,0x04,0x6e,0x90,0xfc,0x29,0x12,0x04,0x80,0x90,
4220x00,0x05,0x12,0x01,0xec,0xf5,0x67,0x90,0x00,0x04,0x12,0x01,0xec,0x54,0x0f,0xfc,
4230x7d,0x67,0x12,0x17,0x46,0xe5,0x67,0x70,0x04,0x75,0x66,0x08,0x22,0x75,0x66,0x00,
4240x78,0x84,0x76,0x00,0x78,0x84,0xe6,0xc3,0x95,0x67,0x50,0x38,0x90,0xfc,0x2f,0x12,
4250x04,0x80,0x12,0x01,0xe6,0xfc,0x90,0xfc,0x2c,0x12,0x04,0x80,0xec,0x12,0x03,0x0f,
4260x30,0x01,0x0e,0x90,0xfc,0x31,0xe0,0x04,0xf0,0x90,0xfc,0x30,0x70,0x03,0xe0,0x04,
4270xf0,0x78,0x84,0x06,0x90,0xfc,0x2e,0xe0,0x04,0xf0,0x90,0xfc,0x2d,0x70,0x03,0xe0,
4280x04,0xf0,0x80,0xc0,0x22,0x90,0xfc,0x2a,0xe0,0xfd,0xa3,0xe0,0xfc,0xed,0xfe,0xec,
4290xfd,0x7f,0x01,0xed,0x24,0x0a,0xfd,0x50,0x01,0x0e,0x90,0xfc,0x32,0x12,0x04,0x6e,
4300x90,0xfc,0x29,0x12,0x04,0x80,0x90,0x00,0x04,0x12,0x01,0xec,0x54,0x0f,0xb4,0x01,
4310x02,0x80,0x03,0xd3,0x40,0x17,0x90,0xfc,0x32,0x12,0x04,0x80,0x0d,0xed,0x70,0x01,
4320x0e,0x90,0xfc,0x2f,0x12,0x04,0x6e,0x78,0x88,0x76,0x01,0x80,0x4e,0xb4,0x02,0x02,
4330x80,0x03,0xd3,0x40,0x19,0x90,0xfc,0x32,0x12,0x04,0x80,0xed,0x24,0x02,0xfd,0x50,
4340x01,0x0e,0x90,0xfc,0x2f,0x12,0x04,0x6e,0x78,0x88,0x76,0x02,0x80,0x2d,0xb4,0x04,
4350x02,0x80,0x03,0xd3,0x40,0x19,0x90,0xfc,0x32,0x12,0x04,0x80,0xed,0x24,0x04,0xfd,
4360x50,0x01,0x0e,0x90,0xfc,0x2f,0x12,0x04,0x6e,0x78,0x88,0x76,0x04,0x80,0x0c,0xb4,
4370x00,0x02,0x80,0x03,0xd3,0x40,0x00,0x75,0x66,0x08,0x22,0x90,0xfc,0x29,0x12,0x04,
4380x80,0x90,0x00,0x05,0x12,0x01,0xec,0xf5,0x67,0x78,0x85,0x76,0x00,0x78,0x85,0xe6,
4390xc3,0x95,0x67,0x40,0x03,0x02,0x1a,0xcd,0x78,0x86,0x76,0x00,0x78,0x86,0xe6,0xc3,
4400x78,0x88,0x96,0x50,0x76,0x90,0xfc,0x2c,0x12,0x04,0x80,0x12,0x01,0xe6,0xfc,0x90,
4410xfc,0x32,0x12,0x04,0x89,0x12,0x01,0xe0,0xf4,0x5c,0xfc,0x12,0x01,0xe0,0xf8,0x90,
4420xfc,0x2f,0x12,0x04,0x80,0xe8,0xc0,0xe0,0x12,0x01,0xe6,0xc8,0xd0,0xe0,0xc8,0x58,
4430x4c,0xfc,0x90,0xfc,0x2c,0x12,0x04,0x80,0xec,0x12,0x03,0x0f,0x78,0x87,0xec,0xf6,
4440x90,0xfc,0x31,0xe0,0x04,0xf0,0x90,0xfc,0x30,0x70,0x03,0xe0,0x04,0xf0,0x09,0xe9,
4450x70,0x01,0x0a,0x90,0xfc,0x32,0x12,0x04,0x77,0x90,0xfc,0x29,0x12,0x04,0x80,0x90,
4460x00,0x04,0x12,0x01,0xec,0x30,0xe4,0x0e,0x90,0xfc,0x2e,0xe0,0x04,0xf0,0x90,0xfc,
4470x2d,0x70,0x03,0xe0,0x04,0xf0,0x78,0x86,0x06,0x80,0x81,0x78,0x88,0xe6,0xfd,0xe4,
4480xfe,0xff,0xee,0xcd,0xfc,0x90,0xfc,0x31,0xe0,0x2c,0xf0,0x90,0xfc,0x30,0xe0,0x3d,
4490xf0,0x78,0x88,0xe6,0xfd,0xe4,0xfe,0xff,0xee,0xcd,0xfc,0x90,0xfc,0x34,0xe0,0x2c,
4500xf0,0x90,0xfc,0x33,0xe0,0x3d,0xf0,0x78,0x85,0x06,0x02,0x1a,0x0d,0x75,0x66,0x00,
4510x22,0xe5,0x3d,0x05,0x3d,0x04,0x70,0x02,0xb2,0xb0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,
4520x82,0xc0,0x83,0xc0,0xd0,0xe8,0xc0,0xe0,0xe9,0xc0,0xe0,0xea,0xc0,0xe0,0xeb,0xc0,
4530xe0,0xec,0xc0,0xe0,0xed,0xc0,0xe0,0xee,0xc0,0xe0,0xef,0xc0,0xe0,0x90,0xff,0x92,
4540xe0,0x12,0x01,0xb7,0x1b,0x29,0x30,0x1b,0x29,0x32,0x1b,0x38,0x38,0x1b,0x4a,0x3a,
4550x1b,0x5c,0x3e,0x1b,0x74,0x44,0x1b,0x68,0x46,0x1b,0x80,0x50,0x1b,0xc2,0x52,0x1b,
4560xa1,0x54,0x1b,0xe3,0x56,0x00,0x00,0x1c,0x04,0x90,0xff,0x92,0xe0,0x7f,0x00,0xfe,
4570x7c,0x01,0x12,0x31,0xfb,0x02,0x1c,0x14,0xe4,0xff,0x04,0xfe,0x7c,0x03,0x12,0x31,
4580xfb,0x74,0x20,0x90,0xff,0xfe,0xf0,0x02,0x1c,0x14,0xe4,0xff,0x04,0xfe,0x7c,0x02,
4590x12,0x31,0xfb,0x74,0x40,0x90,0xff,0xfe,0xf0,0x02,0x1c,0x14,0xe4,0xff,0x04,0xfe,
4600x7c,0x04,0x12,0x31,0xfb,0x02,0x1c,0x14,0xe4,0xff,0x04,0xfe,0x7c,0x05,0x12,0x31,
4610xfb,0x02,0x1c,0x14,0xe4,0xff,0x04,0xfe,0x7c,0x06,0x12,0x31,0xfb,0x02,0x1c,0x14,
4620x90,0xff,0xa5,0xe0,0x7d,0x00,0x90,0xfb,0xf8,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xfb,
4630xf9,0xe0,0xfc,0xf5,0x83,0x90,0xfb,0xf8,0xe0,0x44,0x33,0xfd,0x12,0x1c,0xa7,0x80,
4640x73,0x90,0xff,0xb5,0xe0,0x7d,0x00,0x90,0xfb,0xfa,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,
4650xfb,0xfb,0xe0,0xfc,0xf5,0x83,0x90,0xfb,0xfa,0xe0,0x44,0x43,0xfd,0x12,0x1c,0xa7,
4660x80,0x52,0x90,0xff,0xa6,0xe0,0x7d,0x00,0x90,0xfb,0xfc,0xcd,0xf0,0xa3,0xcd,0xf0,
4670x90,0xfb,0xfd,0xe0,0xfc,0xf5,0x83,0x90,0xfb,0xfc,0xe0,0x44,0x34,0xfd,0x12,0x1c,
4680xa7,0x80,0x31,0x90,0xff,0xb6,0xe0,0x7d,0x00,0x90,0xfb,0xfe,0xcd,0xf0,0xa3,0xcd,
4690xf0,0x90,0xfb,0xff,0xe0,0xfc,0xf5,0x83,0x90,0xfb,0xfe,0xe0,0x44,0x44,0xfd,0x12,
4700x1c,0xa7,0x80,0x10,0x90,0xff,0x92,0xe0,0x7d,0x00,0xfc,0xed,0x44,0xaa,0xfd,0x12,
4710x1c,0xa7,0x80,0x00,0xe4,0x90,0xff,0x92,0xf0,0xd0,0xe0,0xff,0xd0,0xe0,0xfe,0xd0,
4720xe0,0xfd,0xd0,0xe0,0xfc,0xd0,0xe0,0xfb,0xd0,0xe0,0xfa,0xd0,0xe0,0xf9,0xd0,0xe0,
4730xf8,0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32,0x05,0x81,0x05,0x81,
4740x05,0x81,0x05,0x81,0xa8,0x81,0x18,0x18,0x18,0xed,0xf6,0x08,0xec,0xf6,0x90,0xff,
4750x5a,0xe0,0x20,0xe7,0x02,0x80,0xf7,0x90,0xff,0x59,0xe0,0x7d,0x00,0xa8,0x81,0x18,
4760xcd,0xf6,0xcd,0x08,0xf6,0x7d,0x03,0xa8,0x81,0xe6,0x18,0xfc,0xe6,0xcc,0x25,0xe0,
4770xcc,0x33,0xcc,0xdd,0xf9,0xcc,0xf6,0xcc,0x08,0xf6,0xa8,0x81,0x18,0xe6,0x44,0xf8,
4780xf6,0xa8,0x81,0x18,0x18,0x18,0xe6,0xfd,0x08,0xe6,0xfc,0xa8,0x81,0x18,0x86,0x83,
4790x08,0x86,0x82,0xed,0xf0,0xa3,0xec,0xf0,0x74,0x02,0x90,0xff,0x5a,0xf0,0x15,0x81,
4800x15,0x81,0x15,0x81,0x15,0x81,0x22,0xe5,0x81,0x24,0x05,0xf5,0x81,0xe4,0xa8,0x81,
4810x18,0xf6,0xa8,0x81,0x18,0x18,0x18,0x18,0xed,0xf6,0x08,0xec,0xf6,0x90,0xfb,0xf5,
4820xe0,0x24,0xf8,0x50,0x03,0x02,0x1d,0xc8,0xe4,0xa8,0x81,0x18,0x18,0xf6,0xa8,0x81,
4830x18,0xe6,0xfe,0xa8,0x81,0x18,0x18,0x18,0x18,0xe6,0xfd,0x08,0xe6,0xfc,0x7f,0x00,
4840xef,0x24,0xf8,0x40,0x4d,0xe4,0xef,0x25,0xe0,0x24,0x7d,0xf5,0x82,0xe4,0x34,0xfc,
4850xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x6c,0x70,0x03,0xfa,0xeb,0x6d,0x70,0x09,0x74,0x01,
4860xa8,0x81,0x18,0x18,0xf6,0x80,0x2b,0xe4,0xef,0x25,0xe0,0x24,0x7d,0xf5,0x82,0xe4,
4870x34,0xfc,0xf5,0x83,0x7a,0x00,0xe0,0x54,0xf0,0xcc,0xf8,0xcc,0xcd,0xf9,0xcd,0xfb,
4880x78,0x00,0xe9,0x54,0xf0,0xf9,0xea,0x68,0x70,0x02,0xeb,0x69,0x70,0x01,0x0e,0x0f,
4890x80,0xae,0xa8,0x81,0x18,0xee,0xf6,0xa8,0x81,0x18,0x18,0x18,0x18,0xed,0xf6,0x08,
4900xec,0xf6,0xa8,0x81,0xef,0xf6,0xa8,0x81,0x18,0x18,0xe6,0x70,0x79,0xa8,0x81,0x18,
4910xe6,0x24,0xf7,0x40,0x71,0xa8,0x81,0x18,0x18,0x18,0x18,0xe6,0x54,0x0f,0xa8,0x81,
4920xf6,0x64,0x04,0x60,0x17,0xa8,0x81,0xe6,0x64,0x03,0x60,0x10,0xa8,0x81,0x18,0x18,
4930x18,0x18,0xe6,0xfd,0x08,0xe6,0xfc,0x12,0x1c,0x3c,0x80,0x4a,0x7c,0x0a,0x12,0x31,
4940x5b,0xa8,0x81,0x18,0x18,0x18,0x18,0xe6,0xfd,0x08,0xe6,0xfc,0x90,0xfb,0xf4,0xe0,
4950x25,0xe0,0x24,0x7d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0xa3,0xec,0xf0,
4960x90,0xfb,0xf4,0xe0,0xff,0xe4,0xef,0x04,0x54,0x07,0xff,0x90,0xfb,0xf4,0xf0,0x90,
4970xfb,0xf5,0xe0,0x04,0xf0,0x12,0x31,0xf4,0x90,0xfb,0xf6,0xe0,0x70,0x08,0xe4,0xfe,
4980xff,0x7c,0x0f,0x12,0x31,0xfb,0x80,0x27,0x90,0xfb,0xf7,0xe0,0x04,0xf0,0x54,0x3f,
4990x70,0x1d,0x90,0xfb,0xf7,0xe0,0x44,0xfe,0x7d,0x00,0xfc,0x90,0xfb,0xf4,0xe0,0x25,
5000xe0,0x24,0x7d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0xa3,0xec,0xf0,0xe5,
5010x81,0x24,0xfb,0xf5,0x81,0x22,0x78,0x8b,0x76,0x00,0x78,0x8c,0x76,0x00,0x74,0x01,
5020x90,0xfb,0xf6,0xf0,0x12,0x30,0xe6,0x90,0xfb,0xf5,0xe0,0x60,0x57,0x7c,0x0a,0x12,
5030x31,0x5b,0x90,0xfb,0xf3,0xe0,0x25,0xe0,0x24,0x7d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
5040x83,0xe0,0xfd,0xa3,0xe0,0xfc,0x90,0xfb,0xf3,0xe0,0x25,0xe0,0x24,0x7d,0xf5,0x82,
5050xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x90,0xfb,0xf3,0xe0,0xff,0xe4,0xef,
5060x04,0x54,0x07,0xff,0x90,0xfb,0xf3,0xf0,0x90,0xfb,0xf5,0xe0,0x14,0xf0,0x78,0x89,
5070xed,0xf6,0x08,0xec,0xf6,0x12,0x31,0xf4,0x78,0x89,0xe6,0xfd,0x08,0xe6,0xfc,0x12,
5080x08,0xda,0x80,0xa3,0x12,0x32,0x48,0x90,0xff,0x93,0xe0,0x44,0x01,0xf0,0xb2,0xb3,
5090x78,0x8b,0x06,0xb6,0x00,0x11,0x78,0x8b,0x76,0x00,0x78,0x8c,0xe6,0xf4,0x04,0x04,
5100xa2,0xe0,0x92,0xb4,0x78,0x8c,0xf6,0x02,0x1e,0x07,0xe4,0x90,0xfb,0xf6,0xf0,0x90,
5110xfb,0xf5,0xe0,0x7d,0x00,0xfc,0xed,0x44,0xcf,0xfd,0x12,0x1c,0x3c,0x12,0x31,0x69,
5120x22,0x12,0x30,0xe6,0xe5,0x70,0x64,0x49,0x45,0x6f,0x60,0x15,0x90,0xff,0x83,0xe0,
5130x54,0x0f,0x7d,0x00,0xd3,0x95,0x70,0xed,0x95,0x6f,0x50,0x05,0x12,0x2f,0x2f,0x80,
5140x03,0x12,0x2f,0xff,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0xe5,0x70,0x64,0x49,0x45,
5150x6f,0x60,0x05,0x12,0x30,0x39,0x80,0x0e,0x90,0xff,0x80,0xe0,0x44,0x08,0xf0,0x90,
5160xff,0x83,0xe0,0x54,0x7f,0xf0,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x8c,0x54,0xec,
5170x54,0xf0,0xb4,0x10,0x15,0x75,0x6a,0x35,0x75,0x69,0xfc,0x75,0x68,0x01,0xe5,0x6a,
5180x24,0x03,0xf5,0x6a,0xe5,0x69,0x34,0x00,0xf5,0x69,0xe4,0xf5,0x57,0xf5,0x56,0xe5,
5190x56,0xc3,0x94,0x01,0x50,0x27,0xe5,0x54,0x54,0x0f,0xfc,0xad,0x6a,0xae,0x69,0xaf,
5200x68,0x12,0x0e,0x77,0x8c,0x55,0xec,0x60,0x02,0x80,0x12,0x05,0x6a,0xe5,0x6a,0x70,
5210x02,0x05,0x69,0x05,0x57,0xe5,0x57,0x70,0x02,0x05,0x56,0x80,0xd2,0xe5,0x54,0x54,
5220x0f,0x24,0x9d,0xf8,0xc6,0x54,0xfe,0xf6,0xe5,0x54,0x54,0x0f,0x7f,0x00,0xfe,0x7c,
5230x12,0x12,0x31,0xfb,0xe5,0x55,0x14,0x70,0x09,0x7d,0x00,0x7c,0x09,0x12,0x25,0x26,
5240x80,0x07,0xad,0x57,0x7c,0x00,0x12,0x25,0x26,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,
5250x90,0xff,0xfc,0xe0,0x44,0x02,0xf0,0x90,0xff,0x00,0xe0,0x30,0xe7,0x13,0x90,0xff,
5260x83,0xe0,0x44,0x80,0xf0,0x43,0x6d,0x80,0x90,0xff,0xfc,0xe0,0x44,0x01,0xf0,0x80,
5270x11,0x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x53,0x6d,0x7f,0x90,0xff,0xfc,0xe0,0x54,
5280xfe,0xf0,0x90,0xff,0x81,0xe0,0x44,0x80,0xf0,0x12,0x25,0xd9,0x90,0xff,0xfe,0xe0,
5290x44,0x05,0xf0,0x90,0xff,0xfc,0xe0,0x54,0xfd,0xf0,0x12,0x31,0x69,0x22,0x12,0x30,
5300xe6,0x7c,0x01,0x12,0x32,0xa9,0x78,0xad,0xe6,0x44,0x02,0xf6,0x74,0xfe,0xfc,0x04,
5310xfd,0x12,0x1c,0xa7,0x90,0xff,0x5a,0xe0,0x30,0xe7,0x02,0x80,0xf7,0xe4,0xf5,0x4e,
5320x75,0x4d,0x10,0xac,0x4e,0xad,0x4d,0xe5,0x4e,0x15,0x4e,0x70,0x02,0x15,0x4d,0xec,
5330x4d,0x60,0x02,0x80,0xee,0x43,0x87,0x01,0x12,0x31,0x69,0x22,0x12,0x30,0xe6,0x7c,
5340x02,0x12,0x31,0x75,0x78,0xad,0xe6,0x54,0xfd,0xf6,0x12,0x31,0x69,0x22,0x12,0x30,
5350xe6,0x78,0xad,0xe6,0x30,0xe0,0x2c,0x78,0xad,0xe6,0x30,0xe1,0x26,0x78,0xad,0xe6,
5360xfc,0xf5,0x83,0x18,0xe6,0x44,0xf0,0xfd,0x12,0x1c,0x3c,0x90,0xff,0xfc,0xe0,0x44,
5370x20,0xf0,0x7c,0x02,0x12,0x32,0xa9,0x78,0xad,0xe6,0x54,0xfd,0xf6,0x74,0x1a,0x90,
5380xff,0xfe,0xf0,0x78,0xad,0xe6,0xfc,0xf5,0x83,0x18,0xe6,0x44,0xf1,0xfd,0x12,0x1c,
5390x3c,0x12,0x31,0x69,0x22,0x75,0x6d,0x00,0x90,0xff,0xff,0xe0,0x60,0x03,0x43,0x6d,
5400x01,0x75,0x6e,0x00,0xe4,0xf5,0x6c,0xf5,0x6b,0xe4,0xf5,0x6f,0x75,0x70,0x49,0x74,
5410x84,0x90,0xff,0x82,0xf0,0x74,0x84,0x90,0xff,0x80,0xf0,0x74,0x80,0x90,0xff,0x58,
5420xf0,0x74,0x80,0x90,0xff,0x5a,0xf0,0xad,0x46,0xaf,0x45,0x7e,0x00,0xee,0x24,0xfe,
5430x50,0x03,0x02,0x21,0x24,0xe4,0xee,0x75,0xf0,0x07,0xa4,0x24,0x7f,0xf5,0x82,0xe4,
5440x34,0xf8,0xf5,0x83,0xe0,0xff,0xe4,0xef,0x54,0x80,0xfd,0xe4,0xef,0x54,0x0f,0x14,
5450xff,0xed,0x60,0x38,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,
5460xff,0xf5,0x83,0x74,0x90,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4a,0xf5,0x82,
5470xe4,0x34,0xff,0xf5,0x83,0x74,0x80,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4e,
5480xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0x74,0x80,0xf0,0x80,0x34,0xe4,0xef,0x75,0xf0,
5490x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0x74,0x90,0xf0,0xe4,0xef,
5500x75,0xf0,0x08,0xa4,0x24,0x0a,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0xe4,
5510xef,0x75,0xf0,0x08,0xa4,0x24,0x0e,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,
5520x0e,0x02,0x20,0x8d,0x8d,0x46,0x8e,0x44,0x8f,0x45,0x74,0x7f,0x90,0xff,0xfd,0xf0,
5530x74,0x90,0x90,0xff,0xfc,0xf0,0x22,0x8c,0x58,0xec,0x24,0xf6,0x50,0x06,0xe5,0x58,
5540x24,0x37,0xfc,0x22,0xe5,0x58,0x24,0x30,0xfc,0x22,0x12,0x25,0x23,0xec,0x70,0x03,
5550x02,0x22,0x5e,0x75,0x5c,0x03,0xae,0x5b,0x7f,0x00,0xe5,0x5c,0x15,0x5c,0x64,0x80,
5560x24,0x7f,0x50,0x35,0xef,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,
5570x24,0xfe,0x50,0x1e,0xef,0x7d,0x00,0xfc,0xe4,0xfb,0x74,0x74,0xc3,0x9c,0xfa,0xeb,
5580x9d,0xfb,0xee,0x7d,0x00,0xfc,0xea,0xc3,0x9c,0xed,0x64,0x80,0xcb,0x64,0x80,0x9b,
5590x50,0x02,0x80,0x05,0xef,0x2e,0xff,0x80,0xc1,0x8e,0x5b,0x8f,0x5a,0xe5,0x5c,0x64,
5600x80,0x24,0x7f,0x50,0x03,0x02,0x22,0x5e,0xe5,0x5a,0x24,0x8e,0x50,0x03,0x02,0x22,
5610x5e,0x85,0x5a,0x5d,0x75,0x5b,0x00,0xae,0x5a,0xaf,0x5b,0x90,0x35,0x9c,0xe4,0x93,
5620xf5,0x5c,0xe5,0x5c,0x15,0x5c,0x64,0x80,0x24,0x7f,0x50,0x18,0xee,0x24,0x00,0xf5,
5630x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfc,0xef,0x90,0x35,0x9c,0x93,0x6c,0x70,0x04,
5640x0e,0x0f,0x80,0xde,0x8e,0x5a,0x8f,0x5b,0xe5,0x5c,0x64,0x80,0x24,0x7f,0x40,0x6e,
5650x75,0x5e,0x01,0x75,0x60,0xe8,0x75,0x5f,0xff,0xe5,0x5d,0x24,0x02,0xf5,0x5a,0x75,
5660x5c,0x07,0xe5,0x5c,0x33,0x40,0x57,0xad,0x60,0xae,0x5f,0xaf,0x5e,0xe5,0x5c,0xf5,
5670x82,0x33,0x95,0xe0,0xf5,0x83,0x12,0x01,0xec,0xc4,0x54,0x0f,0xfc,0x12,0x21,0x37,
5680xe5,0x5a,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xec,0xf0,0x05,0x5a,0x05,
5690x5a,0xad,0x60,0xae,0x5f,0xaf,0x5e,0xe5,0x5c,0xf5,0x82,0x33,0x95,0xe0,0xf5,0x83,
5700x12,0x01,0xec,0x54,0x0f,0xfc,0x12,0x21,0x37,0xe5,0x5a,0x24,0x00,0xf5,0x82,0xe4,
5710x34,0xfb,0xf5,0x83,0xec,0xf0,0x05,0x5a,0x05,0x5a,0x15,0x5c,0x80,0xa4,0x74,0x02,
5720x90,0xf8,0x51,0xf0,0x90,0xf8,0x6b,0x79,0x75,0x7a,0x35,0x7b,0x27,0x78,0x01,0x12,
5730x03,0xf5,0x75,0x6a,0x35,0x75,0x69,0xfc,0x75,0x68,0x01,0xe4,0x90,0xff,0x83,0xf0,
5740x74,0x80,0x90,0xff,0x81,0xf0,0x75,0x59,0x02,0xe5,0x59,0x75,0xf0,0x07,0xa4,0x24,
5750x7f,0xf5,0x82,0xe4,0x34,0xf8,0xf5,0x83,0xe0,0x78,0x8f,0xf6,0xfc,0x54,0x0f,0x14,
5760xfc,0x78,0x8f,0xec,0xf6,0xe5,0x59,0x75,0xf0,0x07,0xa4,0x24,0x81,0xf5,0x82,0xe4,
5770x34,0xf8,0xf5,0x83,0xe0,0x78,0x92,0x76,0xfd,0x08,0x76,0xe8,0xfc,0x78,0x8f,0xe6,
5780x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,
5790x8f,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xec,
5800xf0,0x78,0x92,0xe6,0xff,0x08,0xe6,0x7e,0x03,0xcf,0xc3,0x13,0xcf,0x13,0xde,0xf9,
5810xfe,0x78,0x8f,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x49,0xf5,0x82,0xe4,0x34,0xff,0xf5,
5820x83,0xee,0xf0,0x78,0x8f,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4a,0xf5,0x82,0xe4,0x34,
5830xff,0xf5,0x83,0x74,0x80,0xf0,0x78,0x90,0xec,0xf6,0x7d,0x00,0x78,0x93,0xe6,0x2c,
5840xf6,0x18,0xe6,0x3d,0xf6,0x78,0x92,0xe6,0xfd,0x08,0xe6,0x7c,0x03,0xcd,0xc3,0x13,
5850xcd,0x13,0xdc,0xf9,0xfc,0x78,0x8f,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4d,0xf5,0x82,
5860xe4,0x34,0xff,0xf5,0x83,0xec,0xf0,0x78,0x8f,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4e,
5870xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x92,0xe6,0xfd,0x08,0xe6,0xfc,
5880x78,0x8f,0xe6,0xff,0x7e,0x00,0xee,0x24,0xfe,0x50,0x03,0x02,0x24,0xdd,0xe4,0xee,
5890x75,0xf0,0x07,0xa4,0x24,0x7f,0xf5,0x82,0xe4,0x34,0xf8,0xf5,0x83,0xe0,0xff,0xe4,
5900xef,0x54,0x80,0xfa,0xe4,0xef,0x54,0x0f,0x14,0xff,0xe4,0xee,0x75,0xf0,0x07,0xa4,
5910x24,0x81,0xf5,0x82,0xe4,0x34,0xf8,0xf5,0x83,0xe0,0x78,0x90,0xf6,0xe4,0xee,0x13,
5920x13,0x54,0x80,0x24,0xf0,0xf8,0xe4,0x34,0xfd,0xf9,0xe8,0xfc,0xe9,0xfd,0x8a,0x5a,
5930xea,0x70,0x03,0x02,0x24,0x4a,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,
5940xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x90,0xe6,0xfa,0xe4,0xef,0x75,0xf0,0x08,
5950xa4,0x24,0x4f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0xed,0xfb,0xec,0x7a,
5960x03,0xcb,0xc3,0x13,0xcb,0x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,
5970x49,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0x78,0x90,0xe6,0x7b,0x00,0xfa,
5980xec,0x2a,0xfc,0xed,0x3b,0xfd,0xfb,0xec,0x7a,0x03,0xcb,0xc3,0x13,0xcb,0x13,0xda,
5990xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4d,0xf5,0x82,0xe4,0x34,0xff,0xf5,
6000x83,0xea,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4a,0xf5,0x82,0xe4,0x34,0xff,
6010xf5,0x83,0x74,0x80,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4e,0xf5,0x82,0xe4,
6020x34,0xff,0xf5,0x83,0x74,0x80,0xf0,0x02,0x24,0xd9,0xe4,0xef,0x75,0xf0,0x08,0xa4,
6030x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x90,0xe6,0xfa,0xe4,
6040xef,0x75,0xf0,0x08,0xa4,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,
6050xed,0xfb,0xec,0x7a,0x03,0xcb,0xc3,0x13,0xcb,0x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,
6060xf0,0x08,0xa4,0x24,0x09,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0x78,0x90,
6070xe6,0x7b,0x00,0xfa,0xec,0x2a,0xfc,0xed,0x3b,0xfd,0xfb,0xec,0x7a,0x03,0xcb,0xc3,
6080x13,0xcb,0x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0d,0xf5,0x82,
6090xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0a,0xf5,
6100x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0e,
6110xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x0e,0x02,0x23,0x66,0x8e,0x59,0x78,
6120x92,0xed,0xf6,0x08,0xec,0xf6,0x78,0x8f,0xef,0xf6,0x12,0x20,0x55,0x22,0x8c,0x26,
6130xec,0x30,0xe7,0x18,0xe5,0x26,0x54,0x0f,0x14,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,
6140x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0xdf,0xf0,0x80,0x16,0xe5,0x26,0x54,0x0f,
6150x14,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,
6160xdf,0xf0,0x22,0x7c,0x00,0x22,0xec,0x90,0xfc,0x37,0xf0,0x8c,0x24,0xed,0x24,0x03,
6170xf5,0x25,0x7d,0x00,0xd3,0x95,0x72,0xed,0x95,0x71,0x40,0x03,0x85,0x72,0x25,0xe5,
6180x25,0x24,0xb7,0x50,0x09,0x75,0x25,0x03,0x74,0x02,0x90,0xfc,0x37,0xf0,0xac,0x25,
6190x12,0x30,0x24,0x22,0xe4,0xf5,0x6c,0xf5,0x6b,0x12,0x25,0x5d,0x22,0x90,0xfc,0x35,
6200xe0,0x65,0x73,0x60,0x0e,0x74,0x04,0x90,0xfc,0x37,0xf0,0xe4,0xf5,0x6b,0x75,0x6c,
6210x03,0x80,0x46,0x7d,0x73,0xe4,0xfe,0xff,0x79,0x35,0x7a,0xfc,0x7b,0x01,0x74,0x05,
6220x78,0x00,0x12,0x03,0x3f,0xe5,0x6c,0x24,0x03,0xf5,0x6c,0xe5,0x6b,0x34,0x00,0xf5,
6230x6b,0xe5,0x6c,0xd3,0x95,0x72,0xe5,0x6b,0x95,0x71,0x40,0x06,0x85,0x72,0x6c,0x85,
6240x71,0x6b,0xd3,0xe5,0x6c,0x94,0x48,0xe5,0x6b,0x94,0x00,0x40,0x0c,0x74,0x02,0x90,
6250xfc,0x37,0xf0,0xe4,0xf5,0x6b,0x75,0x6c,0x03,0xac,0x6c,0x12,0x30,0x24,0x22,0xec,
6260x90,0xfc,0x37,0xf0,0xe4,0xf5,0x6c,0xf5,0x6b,0x8c,0x32,0xec,0x60,0x05,0x12,0x30,
6270x15,0x80,0x05,0x7c,0x00,0x12,0x30,0x24,0x22,0x90,0xff,0x93,0xe0,0x44,0x01,0xf0,
6280xb2,0xb3,0x90,0xff,0x04,0xe0,0xf5,0x4a,0x90,0xff,0x06,0xe0,0xfd,0xa3,0xe0,0xed,
6290x7d,0x00,0xfc,0x7d,0x00,0xfc,0x90,0xff,0x06,0xe0,0xff,0xa3,0xe0,0x7e,0x00,0xff,
6300xe4,0xfe,0xec,0x4e,0xfc,0xed,0x4f,0xfd,0xc3,0xec,0x94,0x48,0xed,0x94,0x00,0x50,
6310x22,0x90,0xff,0x06,0xe0,0xfd,0xa3,0xe0,0xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0x90,
6320xff,0x06,0xe0,0xff,0xa3,0xe0,0x7e,0x00,0xff,0xe4,0xfe,0xec,0x4e,0xfc,0xed,0x4f,
6330xfd,0x80,0x04,0xe4,0xfd,0x7c,0x48,0x8c,0x72,0x8d,0x71,0x90,0xff,0x02,0xe0,0xfd,
6340xa3,0xe0,0xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0x90,0xff,0x02,0xe0,0xff,0xa3,0xe0,
6350x7e,0x00,0xff,0xe4,0xfe,0xec,0x4e,0xf5,0x4c,0xed,0x4f,0xf5,0x4b,0x75,0x6a,0x35,
6360x75,0x69,0xfc,0x75,0x68,0x01,0x7d,0x35,0x7e,0xfc,0x7f,0x01,0x79,0x73,0xe4,0xfa,
6370xfb,0x74,0x05,0x78,0x00,0x12,0x03,0x3f,0x75,0x49,0x00,0xe5,0x49,0x24,0xfe,0x40,
6380x19,0xad,0x6a,0xae,0x69,0xaf,0x68,0xe4,0x12,0x03,0x0f,0x05,0x49,0x0d,0xed,0x70,
6390x01,0x0e,0x8d,0x6a,0x8e,0x69,0x8f,0x68,0x80,0xe1,0x75,0x6a,0x35,0x75,0x69,0xfc,
6400x75,0x68,0x01,0x90,0xff,0x00,0xe0,0x54,0x60,0xb4,0x00,0x02,0x80,0x06,0xd3,0x50,
6410x03,0x02,0x2c,0x6d,0xe5,0x4a,0x54,0x0f,0xf5,0x49,0xe5,0x4a,0x54,0x80,0xa2,0xe0,
6420x92,0x02,0x90,0xff,0x01,0xe0,0x12,0x01,0x81,0x00,0x0b,0x2c,0x68,0x26,0xe5,0x28,
6430x03,0x2c,0x68,0x29,0x0f,0x2c,0x68,0x29,0xf2,0x2a,0x26,0x2b,0x8d,0x2b,0x90,0x2b,
6440xd0,0x2c,0x11,0x2c,0x3f,0xe5,0x6d,0x30,0xe7,0x0e,0xe5,0x4c,0x45,0x4b,0x70,0x08,
6450xe5,0x72,0x64,0x02,0x45,0x71,0x60,0x03,0x02,0x2c,0x6a,0x90,0xff,0x00,0xe0,0x54,
6460x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x29,0xe5,0x4a,0x60,0x03,0x02,0x28,0x00,
6470xad,0x6a,0xae,0x69,0xaf,0x68,0x74,0x01,0x12,0x03,0x0f,0x78,0xad,0xe6,0x30,0xe0,
6480x0b,0xad,0x6a,0xae,0x69,0xaf,0x68,0x74,0x02,0x12,0x03,0x0f,0x7c,0x02,0x12,0x30,
6490x24,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x1b,0xe5,0x6d,0x20,0xe1,0x07,0xe5,
6500x4a,0x60,0x03,0x02,0x28,0x00,0xe5,0x4a,0x24,0xfe,0x50,0x03,0x02,0x28,0x00,0x7c,
6510x02,0x12,0x30,0x24,0x22,0xb4,0x02,0x02,0x80,0x06,0xd3,0x50,0x03,0x02,0x27,0xfe,
6520xe5,0x6d,0x20,0xe1,0x0d,0xe5,0x4a,0x60,0x09,0xe5,0x4a,0x64,0x80,0x60,0x03,0x02,
6530x28,0x00,0xac,0x4a,0x12,0x30,0xab,0x40,0x03,0x02,0x28,0x00,0xe5,0x49,0x70,0x25,
6540x30,0x02,0x11,0x90,0xff,0x80,0xe0,0x54,0x08,0xad,0x6a,0xae,0x69,0xaf,0x68,0x12,
6550x03,0x0f,0x80,0x0f,0x90,0xff,0x82,0xe0,0x54,0x08,0xad,0x6a,0xae,0x69,0xaf,0x68,
6560x12,0x03,0x0f,0x80,0x3d,0x15,0x49,0x30,0x02,0x1d,0xe5,0x49,0x75,0xf0,0x08,0xa4,
6570x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0x08,0xad,0x6a,0xae,0x69,
6580xaf,0x68,0x12,0x03,0x0f,0x80,0x1b,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,
6590x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0x08,0xad,0x6a,0xae,0x69,0xaf,0x68,0x12,
6600x03,0x0f,0xad,0x6a,0xae,0x69,0xaf,0x68,0x12,0x01,0xe6,0x60,0x0b,0xad,0x6a,0xae,
6610x69,0xaf,0x68,0x74,0x01,0x12,0x03,0x0f,0x7c,0x02,0x12,0x30,0x24,0x22,0x80,0x00,
6620x02,0x2c,0x6a,0xe5,0x6d,0x20,0xe7,0x06,0xe5,0x72,0x45,0x71,0x60,0x03,0x02,0x2c,
6630x6a,0x90,0xff,0x00,0xe0,0x54,0x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x1a,0xe5,
6640x4c,0x14,0x45,0x4b,0x70,0x04,0xe5,0x4a,0x60,0x03,0x02,0x29,0x0c,0x78,0xad,0xe6,
6650x54,0xfe,0xf6,0x7c,0x00,0x12,0x30,0x24,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,
6660x2a,0xe5,0x6d,0x20,0xe1,0x08,0xe5,0x6d,0x20,0xe0,0x03,0x02,0x29,0x0c,0xe5,0x6d,
6670x30,0xe0,0x04,0xe5,0x4a,0x70,0x0b,0xe5,0x6d,0x30,0xe1,0x09,0xe5,0x4a,0x24,0xfe,
6680x50,0x03,0x02,0x29,0x0c,0x7c,0x00,0x12,0x30,0x24,0x22,0xb4,0x02,0x02,0x80,0x06,
6690xd3,0x50,0x03,0x02,0x29,0x0a,0xe5,0x4c,0x45,0x4b,0x60,0x03,0x02,0x29,0x0c,0xac,
6700x4a,0x12,0x30,0xab,0x40,0x03,0x02,0x29,0x0c,0xe5,0x6d,0x20,0xe1,0x07,0xe5,0x6d,
6710x20,0xe0,0x02,0x80,0x77,0xe5,0x6d,0x30,0xe0,0x06,0xe5,0x49,0x60,0x02,0x80,0x6c,
6720xe5,0x49,0x70,0x0f,0x90,0xff,0x82,0xe0,0x54,0xf7,0xf0,0x90,0xff,0x80,0xe0,0x54,
6730xf7,0xf0,0x22,0xe5,0x49,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x09,0x7d,0x01,0x7c,
6740x03,0x12,0x0f,0x09,0x80,0x11,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x09,0x7d,0x01,
6750x7c,0x04,0x12,0x0f,0x09,0x80,0x00,0x15,0x49,0x30,0x02,0x15,0xe5,0x49,0x75,0xf0,
6760x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x80,
6770x13,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,
6780xe0,0x54,0xf7,0xf0,0x7c,0x00,0x12,0x30,0x24,0x22,0x80,0x00,0x02,0x2c,0x6a,0xe5,
6790x6d,0x20,0xe7,0x06,0xe5,0x72,0x45,0x71,0x60,0x03,0x02,0x2c,0x6a,0x90,0xff,0x00,
6800xe0,0x54,0x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x1a,0xe5,0x4c,0x14,0x45,0x4b,
6810x70,0x04,0xe5,0x4a,0x60,0x03,0x02,0x29,0xef,0x78,0xad,0xe6,0x44,0x01,0xf6,0x7c,
6820x00,0x12,0x30,0x24,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x29,0xe5,0x6d,0x20,
6830xe1,0x08,0xe5,0x6d,0x20,0xe0,0x03,0x02,0x29,0xef,0xe5,0x6d,0x30,0xe0,0x04,0xe5,
6840x49,0x70,0x0b,0xe5,0x6d,0x30,0xe1,0x08,0xe5,0x49,0x24,0xfe,0x50,0x02,0x80,0x7f,
6850x7c,0x00,0x12,0x30,0x24,0x22,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x6f,0xe5,0x4c,
6860x45,0x4b,0x60,0x02,0x80,0x69,0xac,0x4a,0x12,0x30,0xab,0x40,0x02,0x80,0x60,0xe5,
6870x6d,0x20,0xe1,0x07,0xe5,0x6d,0x20,0xe0,0x02,0x80,0x54,0xe5,0x49,0x70,0x14,0x30,
6880x02,0x09,0x90,0xff,0x80,0xe0,0x44,0x08,0xf0,0x80,0x07,0x90,0xff,0x82,0xe0,0x44,
6890x08,0xf0,0x22,0xe5,0x6d,0x30,0xe1,0x33,0x15,0x49,0x30,0x02,0x15,0xe5,0x49,0x75,
6900xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x44,0x08,0xf0,
6910x80,0x13,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,
6920x83,0xe0,0x44,0x08,0xf0,0x7c,0x00,0x12,0x30,0x24,0x22,0x80,0x02,0x80,0x00,0x02,
6930x2c,0x6a,0xe5,0x6d,0x20,0xe7,0x12,0xe5,0x72,0x45,0x71,0x70,0x0c,0xe5,0x4a,0x70,
6940x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,0x6a,0xe5,0x4c,0x90,0xff,
6950xff,0xf0,0x90,0xff,0xff,0xe0,0x60,0x05,0x43,0x6d,0x01,0x80,0x03,0x53,0x6d,0xfe,
6960x7c,0x00,0x12,0x30,0x24,0x22,0xe5,0x6d,0x30,0xe7,0x0e,0xe5,0x72,0x45,0x71,0x60,
6970x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,0x6a,0xad,0x4b,0xe5,0x4c,
6980xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0xbd,0x00,0x02,0x80,0x03,0x02,0x2b,0x88,0xb4,
6990x01,0x02,0x80,0x03,0xd3,0x40,0x32,0xe5,0x4a,0x70,0x05,0xe5,0x4c,0xfc,0x60,0x03,
7000x02,0x2b,0x8a,0x75,0x6a,0x40,0x75,0x69,0xf8,0x75,0x68,0x01,0xd3,0xe5,0x72,0x94,
7010x12,0xe5,0x71,0x94,0x00,0x40,0x06,0xe4,0xfd,0x7c,0x12,0x80,0x04,0xac,0x72,0xad,
7020x71,0x8c,0x70,0x8d,0x6f,0x12,0x30,0x39,0x22,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,
7030x59,0xe5,0x4a,0x60,0x03,0x02,0x2b,0x8a,0xe5,0x4c,0xfc,0x70,0x27,0x75,0x6a,0x52,
7040x75,0x69,0xf8,0x75,0x68,0x01,0xd3,0xe5,0x72,0x94,0x19,0xe5,0x71,0x94,0x00,0x40,
7050x06,0xe4,0xfd,0x7c,0x19,0x80,0x04,0xac,0x72,0xad,0x71,0x8c,0x70,0x8d,0x6f,0x12,
7060x30,0x39,0x80,0x25,0x75,0x6a,0x6b,0x75,0x69,0xf8,0x75,0x68,0x01,0xd3,0xe5,0x72,
7070x94,0x27,0xe5,0x71,0x94,0x00,0x40,0x06,0xe4,0xfd,0x7c,0x27,0x80,0x04,0xac,0x72,
7080xad,0x71,0x8c,0x70,0x8d,0x6f,0x12,0x30,0x39,0x22,0xb4,0x03,0x02,0x80,0x06,0xd3,
7090x50,0x03,0x02,0x2b,0x88,0xe5,0x4c,0xf5,0x49,0x70,0x0f,0x90,0xff,0x04,0xe0,0xfd,
7100xa3,0xe0,0x4d,0x60,0x03,0x02,0x2b,0x8a,0x80,0x18,0x90,0xfb,0x02,0xe0,0xfd,0xa3,
7110xe0,0xfc,0x90,0xff,0x05,0xe0,0x6c,0x70,0x07,0x90,0xff,0x04,0xe0,0x6d,0x60,0x02,
7120x80,0x68,0xe4,0xf5,0x70,0xf5,0x6f,0x7f,0x00,0xe5,0x49,0x14,0xc5,0x49,0x60,0x0f,
7130xef,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x2f,0xff,0x80,0xea,0x8f,
7140x4a,0xe5,0x4a,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7d,0x00,0xd3,
7150x95,0x72,0xed,0x95,0x71,0x40,0x06,0xac,0x72,0xad,0x71,0x80,0x0f,0xe5,0x4a,0x24,
7160x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7d,0x00,0xfc,0x8c,0x70,0x8d,0x6f,
7170xe5,0x4a,0x24,0x00,0xfc,0xe4,0x34,0xfb,0xfd,0xfe,0xec,0xfd,0x7f,0x01,0x8d,0x6a,
7180x8e,0x69,0x8f,0x68,0x12,0x30,0x39,0x22,0x80,0x00,0x02,0x2c,0x6a,0x02,0x2c,0x6a,
7190xe5,0x6d,0x30,0xe7,0x19,0xe5,0x72,0x14,0x45,0x71,0x70,0x12,0xe5,0x4a,0x70,0x0e,
7200xe5,0x4c,0x45,0x4b,0x70,0x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,
7210x6a,0xe5,0x6d,0x20,0xe0,0x08,0xe5,0x6d,0x20,0xe1,0x03,0x02,0x2c,0x6a,0x75,0x6a,
7220x6e,0xe4,0xf5,0x69,0xf5,0x68,0xe4,0xf5,0x6f,0x04,0xf5,0x70,0x12,0x30,0x39,0x22,
7230xe5,0x6d,0x20,0xe7,0x12,0xe5,0x72,0x45,0x71,0x70,0x0c,0xe5,0x4a,0x70,0x08,0x90,
7240xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,0x6a,0xe5,0x6d,0x20,0xe0,0x07,0xe5,
7250x6d,0x20,0xe1,0x02,0x80,0x74,0x85,0x4c,0x6e,0xe5,0x6e,0x70,0x08,0x43,0x6d,0x01,
7260x53,0x6d,0xfd,0x80,0x06,0x53,0x6d,0xfe,0x43,0x6d,0x02,0x7c,0x00,0x12,0x30,0x24,
7270x22,0xe5,0x6d,0x30,0xe7,0x1a,0xe5,0x72,0x14,0x45,0x71,0x70,0x13,0xe5,0x4a,0x70,
7280x0f,0xe5,0x4c,0x45,0x4b,0x70,0x09,0x90,0xff,0x00,0xe0,0x54,0x1f,0x14,0x60,0x02,
7290x80,0x38,0xe5,0x6d,0x20,0xe1,0x02,0x80,0x31,0x7c,0x01,0x12,0x30,0x24,0x22,0xe5,
7300x6d,0x20,0xe7,0x15,0xe5,0x72,0x45,0x71,0x70,0x0f,0xe5,0x4c,0x45,0x4b,0x70,0x09,
7310x90,0xff,0x00,0xe0,0x54,0x1f,0x14,0x60,0x02,0x80,0x0f,0xe5,0x6d,0x20,0xe1,0x02,
7320x80,0x08,0x7c,0x00,0x12,0x30,0x24,0x22,0x80,0x00,0x02,0x2f,0x2b,0xb4,0x40,0x02,
7330x80,0x06,0xd3,0x50,0x03,0x02,0x2f,0x21,0x90,0xff,0x01,0xe0,0x90,0xfc,0x35,0xf0,
7340xe5,0x4a,0x90,0xfc,0x36,0xf0,0xe4,0x90,0xfc,0x37,0xf0,0xe5,0x6a,0x24,0x03,0xf5,
7350x6a,0xe5,0x69,0x34,0x00,0xf5,0x69,0xad,0x4b,0xe5,0x4c,0x85,0x6a,0x82,0x85,0x69,
7360x83,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xff,0x01,0xe0,0x12,0x01,0xb7,0x2c,0xd8,0x01,
7370x2c,0xfe,0x02,0x2d,0x28,0x03,0x2d,0x52,0x04,0x2d,0xa0,0x05,0x2d,0xdd,0x06,0x2e,
7380x03,0x07,0x2e,0x29,0x08,0x2e,0x55,0x09,0x2e,0x7b,0x0b,0x2e,0xa1,0x0c,0x2e,0xb0,
7390x80,0x2e,0xb0,0x81,0x00,0x00,0x2f,0x0e,0xe5,0x6d,0x20,0xe7,0x06,0x7c,0x05,0x12,
7400x25,0xbf,0x22,0x7d,0x24,0x7e,0x35,0x7f,0x02,0x79,0x38,0x7a,0xfc,0x7b,0x01,0x74,
7410x08,0x78,0x00,0x12,0x03,0x3f,0x7d,0x08,0x7c,0x00,0x12,0x25,0x26,0x22,0xe5,0x6d,
7420x20,0xe7,0x06,0x7c,0x05,0x12,0x25,0xbf,0x22,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,
7430xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x10,0x12,0x31,0xfb,0x22,
7440x7d,0x00,0x7c,0x07,0x12,0x25,0x26,0x22,0xe5,0x6d,0x20,0xe7,0x06,0x7c,0x05,0x12,
7450x25,0xbf,0x22,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,
7460x4a,0x7f,0x00,0xfe,0x7c,0x11,0x12,0x31,0xfb,0x22,0x7d,0x00,0x7c,0x07,0x12,0x25,
7470x26,0x22,0xe5,0x6d,0x20,0xe7,0x06,0x7c,0x05,0x12,0x25,0xbf,0x22,0xe5,0x4a,0xb4,
7480x05,0x02,0x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x0a,0x12,0x31,0xfb,
7490x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x08,0x12,
7500x31,0xfb,0x22,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,
7510x00,0xfe,0x7c,0x13,0x12,0x31,0xfb,0x22,0x7d,0x00,0x7c,0x07,0x12,0x25,0x26,0x22,
7520xe5,0x6d,0x20,0xe7,0x34,0xd3,0xe5,0x72,0x94,0x48,0xe5,0x71,0x94,0x00,0x50,0x06,
7530xe5,0x72,0x45,0x71,0x70,0x06,0x7c,0x02,0x12,0x25,0xbf,0x22,0xe5,0x4a,0xb4,0x01,
7540x03,0xb3,0x40,0x0b,0xc3,0xb4,0x03,0x00,0x40,0x09,0xb4,0x06,0x00,0x50,0x04,0x12,
7550x30,0xd1,0x22,0x7c,0x07,0x12,0x25,0xbf,0x22,0x12,0x25,0x5d,0x22,0xe5,0x6d,0x20,
7560xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,
7570x7f,0x00,0xfe,0x7c,0x16,0x12,0x31,0xfb,0x22,0x7c,0x07,0x12,0x25,0xbf,0x22,0x12,
7580x25,0x5d,0x22,0xe5,0x6d,0x20,0xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,
7590x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x19,0x12,0x31,0xfb,0x22,0x7c,
7600x07,0x12,0x25,0xbf,0x22,0x12,0x25,0x5d,0x22,0xe5,0x6d,0x20,0xe7,0x23,0x74,0x81,
7610x90,0xff,0x93,0xf0,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,
7620xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x17,0x12,0x31,0xfb,0x22,0x7c,0x07,0x12,0x25,0xbf,
7630x22,0x12,0x25,0x5d,0x22,0xe5,0x6d,0x20,0xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,
7640x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x18,0x12,0x31,0xfb,
7650x22,0x7c,0x07,0x12,0x25,0xbf,0x22,0x12,0x25,0x5d,0x22,0xe5,0x6d,0x20,0xe7,0x1d,
7660xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,
7670xfe,0x7c,0x15,0x12,0x31,0xfb,0x22,0x7c,0x07,0x12,0x25,0xbf,0x22,0x12,0x25,0x5d,
7680x22,0xe5,0x6d,0x20,0xe7,0x06,0x7c,0x07,0x12,0x25,0xbf,0x22,0x12,0x25,0x5d,0x22,
7690xe5,0x6d,0x30,0xe7,0x20,0x90,0xff,0x00,0xe0,0x54,0x1f,0x70,0x10,0x90,0xff,0x01,
7700xe0,0xb4,0x80,0x05,0x12,0x25,0x54,0x80,0x03,0x12,0x25,0x5d,0x22,0x7d,0x00,0x7c,
7710x05,0x12,0x25,0x26,0x22,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x06,0x7c,0x05,0x12,
7720x25,0xbf,0x22,0xd3,0xe5,0x72,0x94,0x48,0xe5,0x71,0x94,0x00,0x50,0x0b,0xc3,0xe5,
7730x72,0x94,0x07,0xe5,0x71,0x94,0x00,0x50,0x06,0x7c,0x03,0x12,0x25,0xbf,0x22,0xe5,
7740x4a,0xb4,0x05,0x04,0x12,0x30,0xd1,0x22,0x7c,0x07,0x12,0x25,0xbf,0x22,0xe5,0x6d,
7750x30,0xe7,0x08,0x7d,0x00,0x7c,0x05,0x12,0x25,0x26,0x22,0x7c,0x05,0x12,0x25,0xbf,
7760x22,0xb4,0x20,0x02,0x80,0x03,0xd3,0x40,0x00,0x80,0x00,0x12,0x2f,0xff,0x22,0x75,
7770x43,0x00,0x90,0xff,0x83,0xe0,0x54,0x0f,0xd3,0x95,0x43,0x40,0x24,0xe5,0x43,0x24,
7780xf0,0xf5,0x82,0xe4,0x34,0xfe,0xf5,0x83,0xe0,0xad,0x6a,0xae,0x69,0xaf,0x68,0x12,
7790x03,0x0f,0x05,0x43,0x0d,0xed,0x70,0x01,0x0e,0x8d,0x6a,0x8e,0x69,0x8f,0x68,0x80,
7800xd1,0xe5,0x43,0x7d,0x00,0xfc,0xc3,0xe5,0x70,0x9c,0xf5,0x70,0xe5,0x6f,0x9d,0xf5,
7810x6f,0xe5,0x70,0x45,0x6f,0x60,0x06,0xe4,0x90,0xff,0x83,0xf0,0x22,0x90,0xff,0x82,
7820xe0,0x44,0x08,0xf0,0xe4,0xf5,0x6f,0x75,0x70,0x49,0x90,0xfc,0x35,0xe0,0xb4,0x05,
7830x02,0x80,0x03,0xd3,0x40,0x40,0x90,0xfc,0x36,0xe0,0xf5,0x43,0xb4,0x05,0x02,0x80,
7840x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x0b,0x12,0x31,0xfb,0x22,0xb4,0x01,
7850x02,0x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x09,0x12,0x31,0xfb,0x22,
7860xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x43,0x7f,0x00,0xfe,0x7c,
7870x14,0x12,0x31,0xfb,0x22,0x22,0xb4,0x80,0x00,0x40,0x23,0xb4,0x82,0x00,0x50,0x1e,
7880x7c,0x35,0x7d,0xfc,0x12,0x17,0x7e,0x7d,0x00,0x8c,0x6c,0x8d,0x6b,0x90,0xfc,0x37,
7890xe0,0x60,0x05,0x12,0x2f,0xff,0x80,0x05,0x7c,0x00,0x12,0x30,0x24,0x22,0x22,0x90,
7900xff,0x83,0xe0,0x54,0x7f,0xf0,0x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x90,0xff,0x80,
7910xe0,0x44,0x08,0xf0,0x22,0x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x90,0xff,0x80,0xe0,
7920x44,0x08,0xf0,0x22,0x8c,0x23,0x7d,0x00,0x8c,0x70,0x8d,0x6f,0x75,0x6a,0x35,0x75,
7930x69,0xfc,0x75,0x68,0x01,0x12,0x30,0x39,0x22,0x90,0xff,0x83,0xe0,0x54,0x7f,0xf0,
7940xe5,0x70,0x64,0x49,0x45,0x6f,0x70,0x01,0x22,0xc3,0xe5,0x70,0x94,0x08,0xe5,0x6f,
7950x94,0x00,0x40,0x15,0x75,0x21,0x08,0xe5,0x21,0x7d,0x00,0xfc,0xc3,0xe5,0x70,0x9c,
7960xf5,0x70,0xe5,0x6f,0x9d,0xf5,0x6f,0x80,0x09,0x85,0x70,0x21,0xe4,0xf5,0x6f,0x75,
7970x70,0x49,0x75,0x22,0x00,0xe5,0x22,0xc3,0x95,0x21,0x50,0x26,0xad,0x6a,0xae,0x69,
7980xaf,0x68,0x12,0x01,0xe6,0xfc,0xe5,0x22,0x24,0xf8,0xf5,0x82,0xe4,0x34,0xfe,0xf5,
7990x83,0xec,0xf0,0x05,0x22,0x0d,0xed,0x70,0x01,0x0e,0x8d,0x6a,0x8e,0x69,0x8f,0x68,
8000x80,0xd3,0xe5,0x21,0x54,0x7f,0x90,0xff,0x81,0xf0,0x22,0x8c,0x48,0x7f,0x00,0xef,
8010x24,0xfd,0x40,0x19,0xe4,0xef,0x75,0xf0,0x07,0xa4,0x24,0x7f,0xf5,0x82,0xe4,0x34,
8020xf8,0xf5,0x83,0xe0,0x65,0x48,0x70,0x02,0xd3,0x22,0x0f,0x80,0xe2,0x8f,0x47,0xc3,
8030x22,0x85,0x72,0x70,0x85,0x71,0x6f,0x90,0xff,0x82,0xe0,0x54,0xf7,0xf0,0x90,0xff,
8040x83,0xe0,0x54,0x7f,0xf0,0x22,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x06,0xc0,0x07,
8050xe5,0x78,0x24,0x08,0xf8,0x86,0x06,0x53,0x06,0x7f,0x7c,0xff,0x12,0x31,0x5b,0x7c,
8060x00,0x7d,0x00,0xe5,0x7b,0x60,0x46,0xff,0x90,0xfd,0x95,0xe0,0x54,0x7f,0x6e,0x70,
8070x0f,0xc0,0x83,0xc0,0x82,0xa3,0xe0,0xfd,0xa3,0xe0,0xfc,0xa3,0x15,0x7b,0x80,0x07,
8080xa3,0xa3,0xa3,0xdf,0xe6,0x80,0x26,0xdf,0x06,0xd0,0x82,0xd0,0x83,0x80,0x1e,0xe0,
8090xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xd0,0x82,0xd0,0x83,0xe8,0xf0,0xa3,0xe9,0xf0,
8100xa3,0xea,0xf0,0xa3,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x80,0xda,0x12,0x31,0xf4,
8110xd0,0x07,0xd0,0x06,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x22,0x85,0xa8,0x7a,0x75,0xa8,
8120x88,0xec,0x70,0x02,0x7c,0x3f,0x8c,0x79,0x22,0xe5,0x78,0x24,0x08,0xf8,0x76,0x00,
8130x12,0x32,0x48,0x80,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x06,0xc0,0x07,0xae,
8140x04,0x7c,0xff,0x12,0x31,0x5b,0xe5,0x7b,0x60,0x42,0xff,0x90,0xfd,0x95,0xe0,0x54,
8150x7f,0x6e,0x70,0x0b,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x15,0x7b,0x80,0x07,0xa3,
8160xa3,0xa3,0xdf,0xea,0x80,0x26,0xdf,0x06,0xd0,0x82,0xd0,0x83,0x80,0xd8,0xe0,0xf8,
8170xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xd0,0x82,0xd0,0x83,0xe8,0xf0,0xa3,0xe9,0xf0,0xa3,
8180xea,0xf0,0xa3,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x80,0xda,0x78,0x08,0x08,0x79,
8190x18,0x09,0x7c,0x01,0xe6,0x54,0x7f,0x6e,0x70,0x06,0x76,0x00,0x77,0x00,0x80,0x06,
8200x08,0x09,0x0c,0xbc,0x08,0xee,0x12,0x31,0xf4,0xd0,0x07,0xd0,0x06,0xd0,0x02,0xd0,
8210x01,0xd0,0x00,0x22,0x75,0x79,0x00,0x85,0x7a,0xa8,0x22,0xc0,0xf0,0xc0,0x82,0xc0,
8220x83,0xc3,0xe5,0x7b,0x24,0xe8,0x50,0x05,0x12,0x32,0x48,0x80,0xf4,0xec,0x60,0x31,
8230x90,0x35,0x23,0xe4,0x93,0xc3,0x9c,0x40,0x28,0xc0,0x04,0x7c,0xff,0x12,0x31,0x5b,
8240xd0,0x04,0x43,0x04,0x80,0xe5,0x7b,0x75,0xf0,0x03,0xa4,0x24,0x95,0xf5,0x82,0xe4,
8250x34,0xfd,0xf5,0x83,0xec,0xf0,0xef,0xa3,0xf0,0xee,0xa3,0xf0,0x05,0x7b,0x12,0x31,
8260xf4,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0x22,0xc0,0x04,0x7c,0x20,0xd2,0x8c,0xd2,0x8d,
8270xd5,0x04,0xfd,0xd0,0x04,0x22,0x75,0xa8,0x00,0x75,0x88,0x00,0x75,0xb8,0x00,0x75,
8280xf0,0x00,0x75,0xd0,0x00,0xe4,0xf8,0x90,0x00,0x00,0xf6,0x08,0xb8,0x00,0xfb,0x02,
8290x00,0x00,0xc3,0xed,0x94,0x02,0x50,0x04,0x7d,0x03,0x7c,0xe8,0xec,0xf4,0xfc,0xed,
8300xf4,0xfd,0x0c,0xbc,0x00,0x01,0x0d,0x8c,0x7f,0x8d,0x7e,0x22,0xc3,0xec,0x94,0xbc,
8310xed,0x94,0x02,0x50,0x04,0x7d,0x07,0x7c,0xd0,0xec,0xf4,0xfc,0xed,0xf4,0xfd,0x0c,
8320xbc,0x00,0x01,0x0d,0x8c,0x7d,0x8d,0x7c,0x22,0xec,0x70,0x01,0x22,0xc0,0x00,0xe5,
8330x78,0x24,0x18,0xf8,0xa6,0x04,0xe5,0x78,0x24,0x08,0xf8,0xc6,0x54,0x7f,0xf6,0xe6,
8340x30,0xe7,0x03,0xd0,0x00,0x22,0x12,0x32,0x48,0x80,0xf4,0xc2,0x8c,0x85,0x7c,0x8c,
8350x85,0x7d,0x8a,0xd2,0x8c,0xc0,0xe0,0xc0,0xd0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,
8360x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x12,
8370x1a,0xd1,0xe5,0x78,0x24,0x08,0xf8,0xe6,0x60,0x24,0xe5,0x78,0x24,0x10,0xf8,0xa6,
8380x81,0xe5,0x78,0x75,0xf0,0x21,0xa4,0x24,0x8d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
8390x78,0xae,0xe5,0x81,0x04,0xc3,0x98,0xf9,0xe6,0xf0,0x08,0xa3,0xd9,0xfa,0x74,0x08,
8400x25,0x78,0xf8,0x05,0x78,0x08,0xe6,0x54,0x80,0x70,0x0c,0xe5,0x78,0xb4,0x07,0xf3,
8410x78,0x08,0x75,0x78,0x00,0x80,0xef,0xe5,0x78,0x24,0x10,0xf8,0x86,0x81,0xe5,0x78,
8420x75,0xf0,0x21,0xa4,0x24,0x8d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0x78,0xae,0xe5,
8430x81,0x04,0xc3,0x98,0xf9,0xe0,0xf6,0x08,0xa3,0xd9,0xfa,0xd0,0x07,0xd0,0x06,0xd0,
8440x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0x83,0xd0,0x82,0xd0,
8450xf0,0xd0,0xd0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xd0,0xc0,0x00,0xc0,0x01,0xc0,0x02,
8460xc2,0x8e,0x85,0x7e,0x8d,0x85,0x7f,0x8b,0xd2,0x8e,0x78,0x19,0x79,0x09,0x7a,0x07,
8470xe7,0x70,0x04,0xa6,0x00,0x80,0x0b,0xe6,0x60,0x08,0x16,0xe6,0x70,0x04,0xe7,0x44,
8480x80,0xf7,0x08,0x09,0xda,0xea,0xe5,0x79,0x60,0x13,0x14,0xf5,0x79,0x70,0x0e,0xe5,
8490x78,0x24,0x08,0xf8,0x76,0x00,0x12,0x31,0xf4,0xd2,0x8c,0xd2,0x8d,0xd0,0x02,0xd0,
8500x01,0xd0,0x00,0xd0,0xd0,0xd0,0xe0,0x32,0x75,0x81,0xad,0x74,0x2a,0x90,0xff,0x93,
8510xf0,0x75,0x7f,0x30,0x75,0x7e,0xf8,0x75,0x7d,0x60,0x75,0x7c,0xf0,0x12,0x05,0x36,
8520x12,0x34,0x7c,0x12,0x17,0x34,0x90,0xff,0x93,0xe0,0x44,0x01,0xf0,0xb2,0xb3,0x12,
8530x34,0xa6,0x12,0x32,0x56,0x80,0xda,0x22,0xc0,0x00,0x7c,0x01,0xec,0x24,0x08,0xf8,
8540xe6,0x60,0x09,0x0c,0xbc,0x08,0xf5,0x12,0x32,0x48,0x80,0xee,0xd0,0x00,0x22,0xc0,
8550xf0,0xc0,0x82,0xc0,0x83,0xc0,0x00,0xc0,0x06,0xc0,0x07,0xed,0x24,0x10,0xf8,0x76,
8560xbc,0xed,0x75,0xf0,0x21,0xa4,0x24,0x8d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xc0,
8570x82,0xc0,0x83,0xa3,0xa3,0xe4,0x78,0x0d,0xf0,0xa3,0xd8,0xfc,0xec,0x54,0x7f,0x75,
8580xf0,0x02,0xa4,0x24,0xef,0xf5,0x82,0xe5,0xf0,0x34,0x34,0xf5,0x83,0xe4,0x93,0xfe,
8590x74,0x01,0x93,0xf5,0x82,0x8e,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xd0,0x83,
8600xd0,0x82,0xef,0xf0,0xa3,0xee,0xf0,0xed,0x24,0x08,0xf8,0xec,0x44,0x80,0xf6,0xd0,
8610x07,0xd0,0x06,0xd0,0x00,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0x22,0x75,0x78,0x00,0x75,
8620x7b,0x00,0x7a,0x08,0x79,0x18,0x78,0x08,0x76,0x00,0x77,0x00,0x08,0x09,0xda,0xf8,
8630xe4,0x78,0x08,0x74,0x80,0x44,0x7f,0xf6,0x74,0x01,0x44,0x10,0xf5,0x89,0x75,0xb8,
8640x08,0xd2,0xab,0xd2,0xa9,0x22,0x75,0x81,0xad,0xd2,0x8e,0xd2,0x8c,0xd2,0xaf,0xe5,
8650x7b,0x60,0x32,0xff,0x90,0xfd,0x95,0xe0,0x54,0x80,0x60,0x24,0x78,0x08,0x79,0x08,
8660xe0,0x54,0x7f,0xfa,0x7b,0x00,0xe6,0x54,0x7f,0xb5,0x02,0x02,0x7b,0xff,0x08,0xd9,
8670xf5,0xeb,0x70,0x0c,0xea,0xf0,0x12,0x33,0xf8,0xad,0x04,0xac,0x02,0x12,0x34,0x0f,
8680xa3,0xa3,0xa3,0xdf,0xd2,0x12,0x32,0x48,0x80,0xc5,0x7c,0x01,0x7d,0x00,0x22,0x04,
8690xf5,0x04,0xe9,0x04,0xed,0x04,0xe1,0x04,0xdd,0x04,0xd9,0x04,0xe5,0x04,0xf1,0x04,
8700x9d,0x04,0xa1,0x04,0xcd,0x04,0xd1,0x04,0x99,0x04,0x99,0x04,0x99,0x04,0xd5,0x04,
8710xb5,0x04,0xad,0x04,0xb1,0x04,0xa9,0x04,0xc1,0x04,0xbd,0x04,0xb9,0x04,0xc5,0x04,
8720xc9,0x04,0xa5,0x19,0x01,0x03,0x00,0x22,0x00,0x48,0x02,0x00,0x48,0x0e,0x30,0x14,
8730x20,0xc8,0x1a,0xd0,0x18,0x0a,0x0c,0x05,0x06,0x02,0x03,0x01,0x02,0x00,0x01,0xce,
8740x01,0x81,0x01,0x00,0x00,0xc0,0x00,0x80,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x10,
8750x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x08,0x18,0x38,0x28,0x0c,0x05,0x10,
8760x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x10,0x0a,0x02,0x00,0x00,0x00,0x00,
8770x00,0xfb,0xe0,0xfb,0xf2,0x09,0x02,0x27,0x00,0x01,0x02,0x00,0xa0,0x32,0x09,0x04,
8780x00,0x00,0x03,0xff,0x00,0x00,0x00,0x07,0x05,0x81,0x02,0x40,0x00,0x00,0x07,0x05,
8790x01,0x02,0x40,0x00,0x00,0x07,0x05,0x83,0x03,0x02,0x00,0x01,0x22,0x03,0x54,0x00,
8800x55,0x00,0x53,0x00,0x42,0x00,0x33,0x00,0x34,0x00,0x31,0x00,0x30,0x00,0x20,0x00,
8810x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,
8820x00,0x00,
883};
884
885#endif /* ifndef _TI_FW_3410_H_ */
diff --git a/drivers/usb/serial/ti_fw_5052.h b/drivers/usb/serial/ti_fw_5052.h
new file mode 100644
index 000000000000..6ccf40a09798
--- /dev/null
+++ b/drivers/usb/serial/ti_fw_5052.h
@@ -0,0 +1,885 @@
1/* vi: ts=8 sw=8
2 *
3 * TI 5052 USB Serial Driver Firmware Header
4 *
5 * Copyright (C) 2004 Texas Instruments
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
13#ifndef _TI_FW_5052_H_
14#define _TI_FW_5052_H_
15
16/* firmware 9/18/04 */
17
18static unsigned char ti_fw_5052[] = {
190xC1, 0x35, /* firmware image length excluding header, little endian */
200x00, /* placeholder for checksum */
21
220x02,0x00,0x1e,0x02,0x1b,0x32,0xff,0xff,0xff,0xff,0xff,0x02,0x32,0x6a,0xff,0xff,
230xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x33,0x15,0x75,0x81,
240xc8,0x90,0xfe,0xf0,0x85,0x83,0xa0,0x12,0x34,0x7d,0xec,0x4d,0x60,0x6a,0x78,0xa5,
250x80,0x03,0x76,0x00,0x18,0xb8,0x96,0xfa,0x78,0x79,0x80,0x03,0x76,0x00,0x18,0xb8,
260x5f,0xfa,0x78,0x20,0x80,0x03,0x76,0x00,0x18,0xb8,0x20,0xfa,0x90,0xfe,0xe5,0xae,
270x83,0xaf,0x82,0x90,0xfd,0x00,0x12,0x00,0xa1,0x60,0x05,0xe4,0xf0,0xa3,0x80,0xf6,
280x90,0xfe,0xf0,0xa8,0x82,0x90,0xfe,0xf0,0xa9,0x82,0xe8,0xc3,0x99,0x50,0x05,0x76,
290x00,0x08,0x80,0xf6,0x90,0x00,0xff,0x12,0x00,0xaa,0x90,0x01,0x03,0x12,0x00,0xaa,
300x90,0x01,0x07,0x12,0x00,0xaa,0x90,0x01,0x0b,0x12,0x00,0xc8,0x90,0x01,0x11,0x12,
310x00,0xc8,0x90,0x01,0x17,0x12,0x00,0xc8,0x75,0xd0,0x00,0x12,0x33,0x67,0x02,0x01,
320x1d,0xef,0x65,0x82,0x70,0x03,0xee,0x65,0x83,0x22,0xe4,0x93,0xf8,0x74,0x01,0x93,
330xf9,0x74,0x02,0x93,0xfe,0x74,0x03,0x93,0xf5,0x82,0x8e,0x83,0xe8,0x69,0x70,0x01,
340x22,0xe4,0x93,0xf6,0xa3,0x08,0x80,0xf4,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,
350x02,0x93,0xfe,0x74,0x03,0x93,0xff,0x74,0x04,0x93,0xf8,0x74,0x05,0x93,0xf5,0x82,
360x88,0x83,0x12,0x00,0xa1,0x70,0x01,0x22,0xe4,0x93,0xa3,0xa8,0x83,0xa9,0x82,0x8c,
370x83,0x8d,0x82,0xf0,0xa3,0xac,0x83,0xad,0x82,0x88,0x83,0x89,0x82,0x80,0xe3,0x21,
380x21,0x04,0x92,0x7a,0x7a,0x04,0x92,0xa6,0xa8,0x04,0x92,0xfe,0xf0,0x04,0x94,0x04,
390x94,0xfb,0xfb,0x04,0x99,0x04,0x94,0xfb,0xfb,0x04,0xf9,0x04,0xf9,0x80,0xfe,0xd0,
400xf0,0x30,0xf0,0x09,0x20,0xf3,0x03,0xf6,0x80,0x10,0xf7,0x80,0x0d,0x30,0xf1,0x09,
410x20,0xf3,0x03,0xf2,0x80,0x04,0xf3,0x80,0x01,0xf0,0x20,0xf4,0x04,0xfc,0xd0,0xe0,
420xcc,0x22,0xcc,0xc0,0xe0,0x12,0x01,0x5a,0x02,0x01,0x4b,0xbc,0x00,0x05,0xd0,0xf0,
430xac,0xf0,0x22,0xc3,0x13,0xdc,0xfc,0x02,0x01,0x21,0xbf,0x00,0x09,0xed,0x25,0x82,
440x75,0xf0,0x01,0xf8,0xe6,0x22,0xbf,0x01,0x0f,0xed,0x25,0x82,0xf5,0x82,0xee,0x35,
450x83,0xf5,0x83,0x75,0xf0,0x04,0xe0,0x22,0xed,0x25,0x82,0x75,0xf0,0x02,0xf8,0xe2,
460x22,0xd0,0x83,0xd0,0x82,0xf5,0xf0,0xc3,0xe4,0x93,0xa3,0xc5,0xf0,0x95,0xf0,0xc0,
470xe0,0xc3,0xd0,0xf0,0xe4,0x93,0xa3,0x95,0xf0,0x40,0x12,0xa3,0xa3,0xc3,0xe5,0xf0,
480x33,0x50,0x02,0x05,0x83,0x25,0x82,0xf5,0x82,0x50,0x02,0x05,0x83,0x74,0x01,0x93,
490xc0,0xe0,0xe4,0x93,0xc0,0xe0,0x22,0xd0,0x83,0xd0,0x82,0xf5,0xf0,0xe4,0x93,0x70,
500x09,0x74,0x01,0x93,0x70,0x04,0xa3,0xa3,0x80,0x0c,0x74,0x02,0x93,0x65,0xf0,0x60,
510x05,0xa3,0xa3,0xa3,0x80,0xe7,0x74,0x01,0x93,0xc0,0xe0,0xe4,0x93,0xc0,0xe0,0x22,
520x12,0x02,0x5b,0x02,0x01,0xf2,0x12,0x02,0xaf,0x02,0x01,0xf2,0x12,0x02,0xd3,0x02,
530x01,0xf2,0x30,0xe0,0x07,0x20,0xe3,0x02,0xe6,0x22,0xe7,0x22,0x30,0xe1,0x07,0x20,
540xe3,0x02,0xe2,0x22,0xe3,0x22,0x30,0xe2,0x02,0xe0,0x22,0xe4,0x93,0x22,0x12,0x02,
550xd3,0x02,0x02,0x1a,0x12,0x02,0xaf,0x02,0x02,0x1a,0xab,0xf0,0x12,0x02,0x24,0xcb,
560xc5,0xf0,0xcb,0x22,0x30,0xe0,0x10,0x20,0xe3,0x06,0xe6,0xf5,0xf0,0x08,0xe6,0x22,
570xe7,0xf5,0xf0,0x09,0xe7,0x19,0x22,0x30,0xe1,0x10,0x20,0xe3,0x06,0xe2,0xf5,0xf0,
580x08,0xe2,0x22,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x30,0xe2,0x06,0xe0,0xf5,0xf0,
590xa3,0xe0,0x22,0xe4,0x93,0xf5,0xf0,0x74,0x01,0x93,0x22,0xbb,0x00,0x03,0x74,0x09,
600x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x74,0x04,0x22,0xbb,0x02,0x07,0x89,0x82,
610x8a,0x83,0x74,0x10,0x22,0x74,0x0a,0x22,0x02,0x02,0x7b,0xbb,0x00,0x07,0xe9,0x25,
620x82,0xf8,0x74,0x01,0x22,0xbb,0x01,0x0d,0xe9,0x25,0x82,0xf5,0x82,0xea,0x35,0x83,
630xf5,0x83,0x74,0x04,0x22,0xbb,0x02,0x0d,0xe9,0x25,0x82,0xf5,0x82,0xea,0x35,0x83,
640xf5,0x83,0x74,0x10,0x22,0xe9,0x25,0x82,0xf8,0x74,0x02,0x22,0x02,0x02,0xaf,0xbf,
650x00,0x05,0xed,0xf8,0x74,0x01,0x22,0xbf,0x01,0x07,0x8d,0x82,0x8e,0x83,0x74,0x04,
660x22,0xbf,0x02,0x07,0x8d,0x82,0x8e,0x83,0x74,0x10,0x22,0xed,0xf8,0x74,0x02,0x22,
670x02,0x02,0xd3,0xbf,0x00,0x07,0xed,0x25,0x82,0xf8,0x74,0x01,0x22,0xbf,0x01,0x0d,
680xed,0x25,0x82,0xf5,0x82,0xee,0x35,0x83,0xf5,0x83,0x74,0x04,0x22,0xbf,0x02,0x0d,
690xed,0x25,0x82,0xf5,0x82,0xee,0x35,0x83,0xf5,0x83,0x74,0x10,0x22,0xed,0x25,0x82,
700xf8,0x74,0x02,0x22,0x02,0x03,0x07,0xc0,0xe0,0x12,0x02,0x5b,0x02,0x03,0x1f,0xc0,
710xe0,0x12,0x02,0xaf,0x02,0x03,0x1f,0xc0,0xe0,0x12,0x02,0xd3,0x02,0x03,0x1f,0x30,
720xe0,0x0b,0x20,0xe3,0x04,0xd0,0xe0,0xf6,0x22,0xd0,0xe0,0xf7,0x22,0x30,0xe1,0x0b,
730x20,0xe3,0x04,0xd0,0xe0,0xf2,0x22,0xd0,0xe0,0xf3,0x22,0xd0,0xe0,0xf0,0x22,0xc9,
740xcd,0xc9,0xca,0xce,0xca,0xcb,0xcf,0xcb,0x12,0x03,0x52,0xed,0xf9,0xee,0xfa,0xef,
750xfb,0x22,0xbb,0x00,0x2f,0xbf,0x00,0x0a,0xfa,0xed,0xf8,0xe7,0xf6,0x08,0x09,0xda,
760xfa,0x22,0xbf,0x01,0x12,0x8d,0x82,0x8e,0x83,0xf8,0x02,0x03,0x6f,0x09,0xa3,0xe7,
770xf0,0xd8,0xfa,0x22,0x02,0x03,0x7a,0xfa,0xed,0xf8,0xe7,0xf2,0x08,0x09,0xda,0xfa,
780x22,0x02,0x03,0x84,0xbb,0x01,0x4d,0xbf,0x00,0x14,0x89,0x82,0x8a,0x83,0xf9,0xed,
790xf8,0x02,0x03,0x96,0x08,0xa3,0xe0,0xf6,0xd9,0xfa,0x22,0x02,0x03,0xa7,0xbf,0x01,
800x22,0x8d,0x82,0x8e,0x83,0xfb,0x08,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xe0,
810xa3,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xdb,0xea,0xd8,0xe8,0x22,
820x02,0x03,0xca,0x8d,0x82,0x8e,0x83,0xf9,0xed,0xf8,0xe0,0xf2,0x08,0xa3,0xd9,0xfa,
830x22,0x02,0x03,0xd4,0xbb,0x02,0x4d,0xbf,0x00,0x12,0x89,0x82,0x8a,0x83,0xf9,0xed,
840xf8,0x02,0x03,0xe6,0x08,0xa3,0xe4,0x93,0xf6,0xd9,0xf9,0x22,0xbf,0x01,0x23,0x8d,
850x82,0x8e,0x83,0xfb,0x08,0xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xe4,0x93,0xa3,
860xc9,0xc5,0x82,0xc9,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xdb,0xe9,0xd8,0xe7,0x22,0x02,
870x04,0x19,0x89,0x82,0x8a,0x83,0xf9,0xed,0xf8,0xe4,0x93,0xf2,0x08,0xa3,0xd9,0xf9,
880x22,0x02,0x04,0x2a,0xbf,0x00,0x0d,0xfa,0xed,0xf8,0xe3,0xf6,0x08,0x09,0xda,0xfa,
890x22,0x02,0x04,0x34,0xbf,0x01,0x12,0x8d,0x82,0x8e,0x83,0xf8,0x02,0x04,0x41,0x09,
900xa3,0xe3,0xf0,0xd8,0xfa,0x22,0x02,0x04,0x4c,0xfa,0xed,0xf8,0xe3,0xf2,0x08,0x09,
910xda,0xfa,0x22,0x02,0x04,0x56,0xe6,0xfb,0x08,0xe6,0xfa,0x08,0xe6,0xf9,0x04,0xf6,
920x18,0x70,0x01,0x06,0x22,0xe6,0xff,0x08,0xe6,0xfe,0x08,0xe6,0xfd,0x22,0xef,0xf0,
930xa3,0xee,0xf0,0xa3,0xed,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,
940xe0,0xff,0xa3,0xe0,0xfe,0xa3,0xe0,0xfd,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,
950xf9,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xf9,0x00,0x5b,0x05,0x73,0x00,
960x26,0x05,0x9a,0x00,0x33,0x0a,0x0b,0x00,0x5b,0x0a,0x77,0x00,0x60,0x15,0x52,0x00,
970x5b,0x0c,0xfb,0x00,0x5b,0x09,0xab,0x00,0x5b,0x09,0xe2,0x00,0x5b,0x0d,0xc2,0x00,
980x5b,0x0b,0xf3,0x00,0x5b,0x0a,0x1e,0x00,0x5b,0x0a,0x53,0x00,0x5b,0x17,0x4a,0x00,
990x33,0x17,0x60,0x00,0x34,0x1e,0x4d,0x00,0x43,0x1e,0xf0,0x00,0x44,0x20,0x5d,0x00,
1000x44,0x20,0x4b,0x00,0x47,0x1f,0x17,0x00,0x47,0x1f,0xbc,0x00,0x4d,0x20,0x0d,0x00,
1010x4f,0x1f,0x39,0x00,0x58,0x31,0xf5,0x00,0x5b,0x7c,0xcc,0x7d,0xff,0x12,0x1c,0xfe,
1020x22,0x74,0x90,0x90,0xff,0x91,0xf0,0x90,0xff,0xfc,0xe0,0x20,0xe7,0x2d,0xc2,0xaf,
1030xae,0x59,0xaf,0x58,0x75,0x5a,0x20,0xe5,0x5a,0x14,0xc5,0x5a,0x60,0x19,0xe4,0xfe,
1040x7f,0x05,0xee,0x4f,0xce,0x24,0xff,0xce,0xcf,0x34,0xff,0xcf,0x60,0x07,0xe4,0x90,
1050xff,0x92,0xf0,0x80,0xed,0x80,0xe0,0x8e,0x59,0x8f,0x58,0x22,0x12,0x05,0x01,0x7d,
1060x07,0x7c,0xb7,0x12,0x32,0x11,0x7d,0x0f,0x7c,0x6e,0x12,0x32,0x2b,0x78,0x97,0x7a,
1070x06,0xe4,0xf6,0x08,0xda,0xfc,0x7a,0x06,0x12,0x05,0xcf,0x7c,0x03,0x12,0x0e,0x57,
1080x7c,0x04,0x12,0x0e,0x57,0x12,0x21,0x8b,0xe4,0xfe,0xff,0x7c,0x0f,0x12,0x31,0x9a,
1090xd2,0xa8,0x22,0x12,0x30,0x85,0xe4,0x90,0xfd,0x40,0xf0,0x90,0xff,0xf0,0xe0,0x30,
1100xe4,0x08,0x74,0x01,0x90,0xfd,0x41,0xf0,0x80,0x05,0xe4,0x90,0xfd,0x41,0xf0,0x7d,
1110x0a,0x7c,0x00,0x12,0x24,0xb1,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x90,0xfd,0x41,
1120xe0,0x14,0x70,0x0e,0x90,0xff,0xf0,0xe0,0x44,0x10,0xf0,0x7c,0x00,0x12,0x25,0x4a,
1130x80,0x19,0x90,0xfd,0x41,0xe0,0x70,0x0e,0x90,0xff,0xf0,0xe0,0x54,0xef,0xf0,0x7c,
1140x00,0x12,0x25,0x4a,0x80,0x05,0x7c,0x17,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x90,
1150xff,0xf0,0xe0,0x54,0xab,0xf0,0x90,0xff,0xf0,0xe0,0x44,0x20,0xf0,0x22,0x8c,0x37,
1160x8d,0x36,0x78,0x7c,0xed,0xf6,0x08,0xec,0xf6,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,
1170x00,0x05,0x12,0x01,0xec,0x78,0x7a,0xf6,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,
1180xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x04,0x12,0x01,0xec,0x54,0x0f,0xfc,0x7d,0x7a,
1190x12,0x17,0x9d,0x78,0x7a,0xe6,0x70,0x0d,0xad,0x3a,0xae,0x39,0xaf,0x38,0xe4,0x12,
1200x03,0x0f,0x7c,0x08,0x22,0x90,0xff,0xf0,0xe0,0x54,0xfe,0xf0,0x90,0xff,0xf0,0xe0,
1210x54,0xfd,0xf0,0x80,0x1e,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,
1220x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x25,0xe0,0x44,0x01,0x90,0xff,0xf3,0xf0,
1230x02,0x06,0xdb,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,
1240x90,0x00,0x06,0x12,0x02,0x0e,0x54,0xfe,0x90,0xff,0xf3,0xf0,0x80,0x2b,0x78,0x7c,
1250xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,
1260x0e,0xfa,0xeb,0x90,0xff,0xf1,0xf0,0x12,0x08,0xca,0x40,0x0d,0xad,0x3a,0xae,0x39,
1270xaf,0x38,0xe4,0x12,0x03,0x0f,0x7c,0x18,0x22,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,
1280xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x90,0xff,0xf1,0xf0,
1290x12,0x08,0xca,0x40,0x0d,0xad,0x3a,0xae,0x39,0xaf,0x38,0xe4,0x12,0x03,0x0f,0x7c,
1300x18,0x22,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,
1310x00,0x06,0x12,0x02,0x0e,0x44,0x01,0x90,0xff,0xf3,0xf0,0x78,0x7d,0xe6,0x24,0x03,
1320xf6,0x18,0xe6,0x34,0x00,0xf6,0x78,0x7a,0xe6,0x24,0xfe,0x50,0x09,0x90,0xff,0xf0,
1330xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0xff,0xf0,0xe0,0x44,0x02,0xf0,0xe4,0x90,0xff,
1340xf1,0xf0,0x78,0x7b,0x76,0x00,0x78,0x7a,0xe6,0x24,0xff,0xfc,0xe4,0x34,0xff,0xfd,
1350x78,0x7b,0xe6,0x7f,0x00,0xfe,0xec,0xd3,0x9e,0xef,0x64,0x80,0xcd,0x64,0x80,0x9d,
1360x40,0x2f,0x12,0x08,0xaf,0x40,0x0f,0x78,0x7b,0xe6,0xad,0x3a,0xae,0x39,0xaf,0x38,
1370x12,0x03,0x0f,0x7c,0x18,0x22,0x90,0xff,0xf2,0xe0,0xfc,0x78,0x7c,0x86,0x83,0x08,
1380x86,0x82,0xec,0xf0,0x78,0x7b,0x06,0xa3,0x78,0x7c,0xa6,0x83,0x08,0xa6,0x82,0x80,
1390xb5,0x12,0x08,0xaf,0x40,0x0f,0x78,0x7b,0xe6,0xad,0x3a,0xae,0x39,0xaf,0x38,0x12,
1400x03,0x0f,0x7c,0x18,0x22,0x90,0xff,0xf2,0xe0,0xfc,0x78,0x7c,0x86,0x83,0x08,0x86,
1410x82,0xec,0xf0,0x78,0x7a,0xe6,0xad,0x3a,0xae,0x39,0xaf,0x38,0x12,0x03,0x0f,0x7c,
1420x00,0x22,0x8c,0x37,0x8d,0x36,0x78,0x7c,0xed,0xf6,0x08,0xec,0xf6,0xed,0xfe,0xec,
1430xfd,0x7f,0x01,0x90,0x00,0x05,0x12,0x01,0xec,0x78,0x7b,0xf6,0x78,0x7c,0xe6,0xfd,
1440x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x04,0x12,0x01,0xec,0x54,
1450x0f,0xfc,0x7d,0x7b,0x12,0x17,0x9d,0x78,0x7b,0xe6,0x70,0x03,0x7c,0x08,0x22,0x90,
1460xff,0xf0,0xe0,0x54,0xfe,0xf0,0x90,0xff,0xf0,0xe0,0x54,0xfd,0xf0,0x80,0x1b,0x78,
1470x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x08,0x12,
1480x02,0x0e,0x25,0xe0,0x90,0xff,0xf3,0xf0,0x80,0x5b,0x78,0x7c,0xe6,0xfd,0x08,0xe6,
1490xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x90,0x00,0x06,0x12,0x02,0x0e,0x54,0xfe,0x90,
1500xff,0xf3,0xf0,0x80,0x21,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,0xfd,
1510x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0xfa,0xeb,0x90,0xff,0xf1,0xf0,0x12,0x08,
1520xca,0x40,0x03,0x7c,0x18,0x22,0x78,0x7c,0xe6,0xfd,0x08,0xe6,0xfc,0xed,0xfe,0xec,
1530xfd,0x7f,0x01,0x90,0x00,0x08,0x12,0x02,0x0e,0x90,0xff,0xf1,0xf0,0x12,0x08,0xca,
1540x40,0x03,0x7c,0x18,0x22,0x78,0x7d,0xe6,0x24,0x0a,0xf6,0x18,0xe6,0x34,0x00,0xf6,
1550x78,0x7a,0x76,0x00,0x78,0x7b,0xe6,0x24,0xff,0xfc,0xe4,0x34,0xff,0xfd,0x78,0x7a,
1560xe6,0x7f,0x00,0xfe,0xec,0xd3,0x9e,0xef,0x64,0x80,0xcd,0x64,0x80,0x9d,0x40,0x21,
1570x78,0x7c,0x86,0x83,0x08,0x86,0x82,0xe0,0x90,0xff,0xf1,0xf0,0x12,0x08,0xca,0x40,
1580x03,0x7c,0x18,0x22,0x78,0x7a,0x06,0x78,0x7d,0x06,0xe6,0x18,0x70,0x01,0x06,0x80,
1590xc3,0x90,0xff,0xf0,0xe0,0x44,0x01,0xf0,0x78,0x7c,0x86,0x83,0x08,0x86,0x82,0xe0,
1600x90,0xff,0xf1,0xf0,0x12,0x08,0xca,0x40,0x03,0x7c,0x18,0x22,0x7c,0x00,0x22,0x90,
1610xff,0xf0,0xe0,0x20,0xe7,0x12,0x90,0xff,0xf0,0xe0,0x30,0xe5,0x09,0x90,0xff,0xf0,
1620xe0,0x44,0x20,0xf0,0xc3,0x22,0x80,0xe7,0xd3,0x22,0x90,0xff,0xf0,0xe0,0x20,0xe3,
1630x12,0x90,0xff,0xf0,0xe0,0x30,0xe5,0x09,0x90,0xff,0xf0,0xe0,0x44,0x20,0xf0,0xc3,
1640x22,0x80,0xe7,0xd3,0x22,0x8c,0x42,0x8d,0x41,0x7c,0x00,0xed,0x54,0xf0,0xfd,0xec,
1650x70,0x03,0xed,0x64,0x30,0x70,0x05,0x75,0x3e,0x03,0x80,0x03,0x75,0x3e,0x04,0xac,
1660x3e,0x12,0x0f,0x7c,0x75,0x83,0x00,0x85,0x83,0x40,0xe5,0x41,0x54,0x0f,0xf5,0x3f,
1670xe5,0x40,0x70,0x04,0xe5,0x3f,0x64,0x03,0x70,0x35,0xe5,0x3e,0x24,0xfd,0x75,0xf0,
1680x0a,0xa4,0x24,0x0a,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xe0,0x30,0xe6,0x05,0x12,
1690x10,0x67,0x80,0x19,0xe5,0x3e,0x24,0x97,0xf8,0xc6,0x54,0xfb,0xf6,0x78,0xa3,0xe6,
1700x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0x74,0x0f,0xf0,0x80,0x59,0xe5,
1710x40,0x70,0x04,0xe5,0x3f,0x64,0x04,0x70,0x48,0xe5,0x3e,0x24,0xfd,0x75,0xf0,0x0a,
1720xa4,0x24,0x0a,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xe0,0x30,0xe5,0x07,0xac,0x42,
1730xad,0x41,0x12,0x1c,0x93,0xe5,0x42,0x30,0xe2,0x15,0x78,0xa7,0xe6,0x30,0xe0,0x0f,
1740x78,0xa7,0xe6,0x30,0xe1,0x09,0xe4,0xff,0x04,0xfe,0x7c,0x04,0x12,0x31,0x9a,0x78,
1750xa3,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0x74,0x0f,0xf0,0x80,
1760x07,0xe4,0xfc,0x7d,0xee,0x12,0x1c,0x93,0xc2,0x03,0x22,0x12,0x30,0x85,0x12,0x0f,
1770x7c,0x78,0xa3,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x90,
1780xfd,0x40,0xf0,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
1790xe0,0x90,0xfd,0x41,0xf0,0xc2,0x03,0x7d,0x02,0x7c,0x00,0x12,0x24,0xb1,0x12,0x31,
1800x08,0x22,0x12,0x30,0x85,0x78,0x8f,0xec,0xf6,0xec,0x24,0x97,0xf8,0xe6,0x30,0xe1,
1810x07,0x7c,0x13,0x12,0x25,0x4a,0x80,0x0f,0x90,0xfd,0x41,0xe0,0xfd,0x78,0x8f,0xe6,
1820xfc,0x12,0x13,0xfd,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x78,0x8f,
1830xec,0xf6,0x7d,0x00,0x12,0x0f,0x0b,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x12,0x30,
1840x85,0x78,0x8f,0xec,0xf6,0xec,0x24,0x97,0xf8,0xe6,0x30,0xe2,0x07,0x7c,0x13,0x12,
1850x25,0x4a,0x80,0x1b,0x78,0x8f,0xe6,0x24,0x97,0xf8,0xe6,0x20,0xe1,0x07,0x7c,0x12,
1860x12,0x25,0x4a,0x80,0x0a,0x78,0x8f,0xe6,0xfc,0x12,0x14,0x21,0x12,0x25,0x4a,0x12,
1870x31,0x08,0x22,0x12,0x30,0x85,0x78,0x8f,0xec,0xf6,0xec,0x24,0x97,0xf8,0xe6,0x20,
1880xe2,0x07,0x7c,0x11,0x12,0x25,0x4a,0x80,0x0a,0x78,0x8f,0xe6,0xfc,0x12,0x15,0x22,
1890x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x78,0x8f,0xec,0xf6,0x12,0x0f,
1900x7c,0x78,0xa3,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x90,
1910xfd,0x47,0xf0,0x78,0xa3,0xe6,0x24,0x0a,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
1920xe0,0x90,0xfd,0x48,0xf0,0x78,0xa3,0xe6,0x24,0x03,0xf5,0x82,0x18,0xe6,0x34,0x00,
1930xf5,0x83,0xe0,0xfc,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
1940x83,0xe0,0xf5,0x5c,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
1950x83,0xe0,0xf5,0x5d,0x8c,0x5b,0xe4,0xec,0x33,0x33,0x54,0x01,0x78,0x8f,0xf6,0x60,
1960x08,0xe5,0x5c,0x30,0xe1,0x03,0x78,0x8f,0x06,0x78,0x8f,0xe6,0x90,0xfd,0x49,0xf0,
1970x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xfd,0xa3,
1980xe0,0x54,0x0c,0xfc,0xed,0x54,0xe6,0x8c,0x5f,0xf5,0x5e,0xe5,0x5b,0x30,0xe5,0x03,
1990x43,0x5f,0x01,0xe5,0x5c,0x20,0xe5,0x0e,0xe5,0x5b,0x54,0x7f,0x70,0x08,0xe5,0x5b,
2000x20,0xe7,0x03,0x43,0x5f,0x02,0xe5,0x5b,0x30,0xe3,0x03,0x43,0x5f,0x10,0xe5,0x5b,
2010x30,0xe2,0x03,0x43,0x5f,0x20,0xe5,0x5b,0x54,0x03,0x60,0x03,0x43,0x5f,0x40,0xe5,
2020x5b,0x30,0xe1,0x03,0x43,0x5f,0x80,0xe5,0x5b,0x30,0xe4,0x03,0x43,0x5e,0x01,0xe5,
2030x5b,0x30,0xe6,0x03,0x43,0x5e,0x08,0xe5,0x5c,0x20,0xe4,0x0e,0xe5,0x5b,0x54,0x7f,
2040x70,0x08,0xe5,0x5b,0x20,0xe7,0x03,0x43,0x5e,0x10,0x53,0x5f,0xfb,0x53,0x5e,0xf9,
2050xad,0x5e,0xe5,0x5f,0x90,0xfd,0x42,0xcd,0xf0,0xa3,0xcd,0xf0,0xe5,0x5d,0x30,0xe3,
2060x0d,0xe5,0x5d,0x54,0x30,0xc4,0x54,0x0f,0x90,0xfd,0x45,0xf0,0x80,0x05,0xe4,0x90,
2070xfd,0x45,0xf0,0xe5,0x5d,0x54,0x03,0x90,0xfd,0x44,0xf0,0xe5,0x5d,0x54,0x04,0xc3,
2080x13,0x90,0xfd,0x46,0xf0,0x90,0xfd,0x44,0xe0,0x70,0x0e,0x7d,0x3d,0x7e,0xfd,0x7f,
2090x01,0x74,0x01,0x90,0x00,0x09,0x12,0x01,0x42,0x78,0xa3,0xe6,0x24,0x08,0xf5,0x82,
2100x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x7c,0x00,0xfd,0x78,0xa3,0xe6,0x24,0x07,0xf5,
2110x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x7f,0x00,0x4c,0xfe,0xef,0x4d,0x90,0xfd,
2120x40,0xf0,0xa3,0xce,0xf0,0xce,0xc2,0x03,0x7d,0x0a,0x7c,0x00,0x12,0x24,0xb1,0x12,
2130x31,0x08,0x22,0x12,0x30,0x85,0x78,0x8f,0xec,0xf6,0x78,0x94,0x76,0x01,0x08,0x76,
2140xfd,0x08,0x76,0x40,0x78,0x91,0x76,0x0c,0x78,0x94,0x12,0x04,0x65,0x12,0x02,0x14,
2150x78,0x92,0xcb,0xf6,0xcb,0x08,0xf6,0x7f,0x00,0xef,0x24,0xeb,0x40,0x1f,0xe4,0xef,
2160x25,0xe0,0x90,0x34,0xbf,0xfd,0x93,0xcd,0x04,0x93,0x78,0x93,0x66,0x70,0x03,0xed,
2170x18,0x66,0x70,0x06,0x78,0x91,0x76,0x00,0x80,0x03,0x0f,0x80,0xdc,0x78,0x90,0xef,
2180xf6,0x78,0x94,0x12,0x04,0x65,0x90,0x00,0x02,0x12,0x02,0x0e,0x78,0x92,0xcb,0xf6,
2190xcb,0x08,0xf6,0x54,0x04,0xcb,0x54,0x06,0x4b,0x60,0x04,0x78,0x91,0x76,0x0b,0x78,
2200x93,0xe6,0x30,0xe3,0x13,0x78,0x94,0x12,0x04,0x65,0x90,0x00,0x05,0x12,0x01,0xec,
2210x24,0xfb,0x50,0x04,0x78,0x91,0x76,0x0d,0x78,0x93,0xe6,0x54,0xc0,0x7d,0x00,0x64,
2220xc0,0x4d,0x70,0x04,0x78,0x91,0x76,0x0b,0x78,0x94,0x12,0x04,0x65,0x90,0x00,0x04,
2230x12,0x01,0xec,0x24,0xfc,0x50,0x04,0x78,0x91,0x76,0x0f,0x78,0x94,0x12,0x04,0x65,
2240x90,0x00,0x06,0x12,0x01,0xec,0x24,0xfd,0x50,0x04,0x78,0x91,0x76,0x0e,0x78,0x94,
2250x12,0x04,0x65,0x90,0x00,0x09,0x12,0x01,0xec,0x24,0xfd,0x50,0x04,0x78,0x91,0x76,
2260x0a,0x78,0x91,0xe6,0x70,0x2a,0x78,0x8f,0xe6,0xfc,0x12,0x0f,0x7c,0x78,0x94,0x12,
2270x04,0x65,0x78,0xa1,0xe6,0xf9,0x78,0xa0,0xe6,0xfa,0x7b,0x01,0x74,0x0a,0x78,0x00,
2280x12,0x03,0x3f,0xc2,0x03,0x78,0x8f,0xe6,0xfc,0x12,0x11,0x23,0x78,0x91,0xec,0xf6,
2290x78,0x91,0xe6,0xfc,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x78,0x8f,
2300xec,0xf6,0x12,0x0f,0x7c,0x78,0x8f,0xe6,0x24,0xfd,0x75,0xf0,0x0a,0xa4,0x24,0x1c,
2310xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xac,0x82,0xad,0x83,0x78,0xa0,0x86,0x83,0x08,
2320x86,0x82,0xec,0xf9,0xed,0xfa,0x7b,0x0a,0x78,0x01,0x12,0x03,0xa7,0xc2,0x03,0x78,
2330x8f,0xe6,0xfc,0x12,0x11,0x23,0x12,0x31,0x08,0x22,0x8d,0x2b,0x8c,0x2a,0xed,0x60,
2340x40,0x75,0x27,0x01,0x75,0x29,0x48,0x75,0x28,0xff,0xe5,0x2a,0x24,0xfd,0xfc,0xe4,
2350x34,0xff,0xfd,0xec,0x7c,0x03,0x25,0xe0,0xcd,0x33,0xcd,0xdc,0xf9,0xfc,0xe5,0x29,
2360x2c,0xf5,0x29,0xe5,0x28,0x3d,0xf5,0x28,0xad,0x29,0xae,0x28,0xaf,0x27,0x74,0x80,
2370x90,0x00,0x06,0x12,0x03,0x17,0x74,0x80,0x90,0x00,0x02,0x12,0x03,0x17,0x12,0x0f,
2380xd3,0xe5,0x2b,0x14,0x60,0x3b,0x75,0x27,0x01,0x75,0x29,0x08,0x75,0x28,0xff,0xe5,
2390x2a,0x24,0xfd,0xfc,0xe4,0x34,0xff,0xfd,0xec,0x7c,0x03,0x25,0xe0,0xcd,0x33,0xcd,
2400xdc,0xf9,0xfc,0xe5,0x29,0x2c,0xf5,0x29,0xe5,0x28,0x3d,0xf5,0x28,0xad,0x29,0xae,
2410x28,0xaf,0x27,0xe4,0x90,0x00,0x06,0x12,0x03,0x17,0xe4,0x90,0x00,0x02,0x12,0x03,
2420x17,0x22,0x12,0x30,0x85,0x78,0x8f,0xec,0xf6,0xec,0x24,0x97,0xf8,0xe6,0x30,0xe2,
2430x09,0x78,0x8f,0xe6,0xfc,0x12,0x15,0x22,0xd2,0x00,0x78,0x8f,0xe6,0xfc,0x12,0x0f,
2440x7c,0x78,0x90,0x76,0x00,0x90,0xfd,0x41,0xe0,0x30,0xe7,0x04,0x78,0x90,0x76,0x01,
2450x78,0x90,0xe6,0xfd,0x78,0x8f,0xe6,0xfc,0x12,0x0d,0x3a,0xc2,0x03,0x30,0x00,0x07,
2460x78,0x8f,0xe6,0xfc,0x12,0x14,0x21,0x7c,0x00,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,
2470x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x01,
2480xf0,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,
2490xe0,0x02,0x80,0xed,0x78,0xa3,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
2500x83,0xe0,0x54,0xf8,0xf0,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
2510xf5,0x83,0xe0,0x44,0x80,0xf0,0x22,0xc2,0x03,0x8c,0x58,0x12,0x0f,0x7c,0x78,0xa0,
2520x86,0x83,0x08,0x86,0x82,0x79,0xee,0x7a,0x34,0x7b,0x0a,0x78,0x01,0x12,0x03,0xf5,
2530x12,0x0e,0x10,0xac,0x58,0x7d,0x02,0x12,0x0d,0x3a,0xc2,0x03,0xac,0x58,0x12,0x11,
2540x23,0x22,0x8d,0x53,0x8e,0x52,0x8f,0x51,0x8c,0x50,0x12,0x0f,0x7c,0x75,0x4f,0x00,
2550x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x20,0xe4,
2560x16,0xe5,0x4f,0x24,0xf6,0x40,0x10,0x05,0x4f,0xc2,0x03,0x7c,0x18,0x12,0x32,0x48,
2570xac,0x50,0x12,0x0f,0x7c,0x80,0xd9,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,
2580x34,0x00,0xf5,0x83,0xe0,0x20,0xe4,0x05,0xc2,0x03,0x7c,0x02,0x22,0x78,0xa3,0xe6,
2590x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0x0f,0x60,0x16,0x78,
2600xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0x0f,0xf0,
2610xc2,0x03,0x7c,0x01,0x22,0x78,0xa2,0x86,0x83,0x08,0x86,0x82,0xe0,0xad,0x53,0xae,
2620x52,0xaf,0x51,0x12,0x03,0x0f,0xc2,0x03,0x7c,0x00,0x22,0x8d,0x31,0x8c,0x30,0x12,
2630x15,0x22,0xe5,0x31,0x60,0x20,0xe5,0x30,0xb4,0x03,0x0c,0x7c,0x01,0x12,0x24,0x7c,
2640x7c,0x81,0x12,0x24,0x7c,0x80,0x0f,0xe5,0x30,0xb4,0x04,0x0a,0x7c,0x02,0x12,0x24,
2650x7c,0x7c,0x82,0x12,0x24,0x7c,0xac,0x30,0x12,0x0f,0x7c,0xe5,0x31,0x60,0x1a,0x78,
2660xa4,0x86,0x83,0x08,0x86,0x82,0xe0,0x54,0xe7,0xf0,0xa3,0xa3,0xa3,0xa3,0xe0,0x54,
2670xe7,0xf0,0xac,0x30,0x7d,0x02,0x12,0x0d,0x3a,0x78,0xa0,0x86,0x83,0x08,0x86,0x82,
2680x79,0xf8,0x7a,0x34,0x7b,0x0a,0x78,0x01,0x12,0x03,0xf5,0xc2,0x03,0xe5,0x30,0x24,
2690x97,0xf8,0xc6,0x54,0xfd,0xf6,0xac,0x30,0x12,0x11,0x23,0x22,0x8c,0x26,0x30,0x03,
2700x05,0x12,0x31,0xe7,0x80,0xf8,0x7c,0x0a,0x12,0x30,0xfa,0xd2,0x03,0xe5,0x26,0x24,
2710xfd,0x78,0x9d,0xf6,0x70,0x09,0x78,0xa4,0x76,0xff,0x08,0x76,0xe0,0x80,0x07,0x78,
2720xa4,0x76,0xff,0x08,0x76,0xe2,0x78,0x9d,0xe6,0x75,0xf0,0x10,0xa4,0xad,0xf0,0xfc,
2730x24,0xa0,0x78,0xa3,0xf6,0xed,0x34,0xff,0x18,0xf6,0x78,0x9d,0xe6,0x75,0xf0,0x0a,
2740xa4,0x24,0x08,0xfc,0xe4,0x34,0xfd,0xfd,0x78,0xa0,0xed,0xf6,0x08,0xec,0xf6,0x12,
2750x31,0x93,0x22,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
2760xe0,0x30,0xe7,0x22,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
2770x83,0xe0,0x54,0x7f,0xf0,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
2780xf5,0x83,0xe0,0x44,0x80,0xf0,0x22,0x78,0xa4,0x86,0x83,0x08,0x86,0x82,0xe0,0x54,
2790x7f,0xf0,0xad,0x83,0xe5,0x82,0x24,0x04,0xfc,0xe4,0x3d,0x8c,0x82,0xf5,0x83,0xe0,
2800x54,0x7f,0xf0,0x78,0xa3,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
2810xe0,0x54,0xf8,0xf0,0x78,0xa5,0xe6,0x24,0x01,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
2820x83,0xe0,0x44,0x03,0xf0,0x78,0xa5,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,
2830xf5,0x83,0xe0,0x44,0x03,0xf0,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,
2840x00,0xf5,0x83,0x74,0x0f,0xf0,0x22,0x78,0xa4,0x86,0x83,0x08,0x86,0x82,0xe0,0x54,
2850x3f,0xf0,0xad,0x83,0xe5,0x82,0x24,0x04,0xfc,0xe4,0x3d,0x8c,0x82,0xf5,0x83,0xe0,
2860x54,0x3f,0xf0,0x78,0x9d,0xe6,0x24,0x9e,0xf8,0xe6,0xfc,0x78,0xa5,0xe6,0x24,0x01,
2870xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0x9d,0xe6,0x24,0x9e,0xf8,
2880xe6,0xfc,0x78,0xa5,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,
2890xf0,0x78,0xa3,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,
2900xfb,0x44,0x02,0xf5,0x26,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
2910xf5,0x83,0xe0,0x30,0xe5,0x03,0x43,0x26,0x01,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,
2920x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe0,0x03,0x12,0x0f,0xd3,0xe5,0x26,0xfc,
2930x78,0xa3,0xe6,0x24,0x0b,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,
2940xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0x74,0x0f,0xf0,0x78,
2950xa4,0x86,0x83,0x08,0x86,0x82,0xe0,0x44,0x80,0xf0,0xa3,0xa3,0xa3,0xa3,0xe0,0x44,
2960x80,0xf0,0x22,0x8c,0x2a,0x12,0x0f,0x7c,0x78,0xa1,0xe6,0x24,0x08,0xf5,0x82,0x18,
2970xe6,0x34,0x00,0xf5,0x83,0xe0,0xfc,0x78,0xa3,0xe6,0x24,0x0a,0xf5,0x82,0x18,0xe6,
2980x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa1,0xe6,0x24,0x07,0xf5,0x82,0x18,0xe6,0x34,
2990x00,0xf5,0x83,0xe0,0xfc,0x78,0xa3,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,0x00,
3000xf5,0x83,0xec,0xf0,0x78,0xa0,0x86,0x83,0x08,0x86,0x82,0xe0,0xfd,0xa3,0xe0,0xfc,
3010xed,0xfe,0x78,0xa3,0xe6,0x24,0x08,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xee,
3020xf0,0xec,0xfe,0x78,0xa3,0xe6,0x24,0x07,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
3030xee,0xf0,0x8c,0x29,0x8d,0x28,0xc3,0xec,0x94,0x02,0xed,0x94,0x06,0x40,0x05,0x75,
3040x27,0x7c,0x80,0x33,0xd3,0xe5,0x29,0x94,0x81,0xe5,0x28,0x94,0x01,0x40,0x05,0x75,
3050x27,0x3c,0x80,0x23,0xd3,0xe5,0x29,0x94,0xc0,0xe5,0x28,0x94,0x00,0x40,0x05,0x75,
3060x27,0x18,0x80,0x13,0xd3,0xe5,0x29,0x94,0x30,0xe5,0x28,0x94,0x00,0x40,0x05,0x75,
3070x27,0x0c,0x80,0x03,0x75,0x27,0x08,0xaf,0x27,0xe4,0xef,0x54,0x7c,0x44,0x83,0xff,
3080x8f,0x27,0xe5,0x27,0xfc,0x78,0xa5,0xe6,0x24,0x01,0xf5,0x82,0x18,0xe6,0x34,0x00,
3090xf5,0x83,0xec,0xf0,0xe5,0x27,0xfc,0x78,0xa5,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,
3100x34,0x00,0xf5,0x83,0xec,0xf0,0xe5,0x27,0xfc,0x78,0x9d,0xe6,0x24,0x9e,0xf8,0xec,
3110xf6,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,
3120x27,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,
3130x30,0xe3,0x17,0x53,0x27,0xc7,0x78,0xa1,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,
3140x00,0xf5,0x83,0xe0,0x90,0x34,0xe9,0x93,0x42,0x27,0x78,0xa1,0xe6,0x24,0x02,0xf5,
3150x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe7,0x05,0x43,0x27,0x40,0x80,0x03,
3160x53,0x27,0xbf,0x53,0x27,0xfb,0x78,0xa1,0xe6,0x24,0x06,0xf5,0x82,0x18,0xe6,0x34,
3170x00,0xf5,0x83,0xe0,0x60,0x03,0x43,0x27,0x04,0x53,0x27,0xfc,0x78,0xa1,0xe6,0x24,
3180x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x42,0x27,0x43,0x27,0x80,0xe5,
3190x27,0xfc,0x78,0xa3,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,
3200xf0,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,
3210x27,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,
3220x30,0xe1,0x05,0x53,0x27,0xdf,0x80,0x03,0x43,0x27,0x20,0x78,0xa1,0xe6,0x24,0x02,
3230xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe4,0x05,0x53,0x27,0xef,0x80,
3240x03,0x43,0x27,0x10,0x78,0xa1,0xe6,0x24,0x09,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
3250x83,0xe0,0xb4,0x02,0x03,0x43,0x27,0x02,0xe5,0x27,0xfc,0x78,0xa3,0xe6,0x24,0x04,
3260xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x78,0xa3,0xe6,0x24,0x03,0xf5,
3270x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xf5,0x27,0x78,0xa1,0xe6,0x24,0x09,0xf5,
3280x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x70,0x05,0x53,0x27,0x7f,0x80,0x03,0x43,
3290x27,0x80,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,
3300xe0,0x30,0xe0,0x05,0x43,0x27,0x20,0x80,0x03,0x53,0x27,0xdf,0x78,0xa1,0xe6,0x24,
3310x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x30,0xe3,0x05,0x43,0x27,0x40,
3320x80,0x03,0x53,0x27,0xbf,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,
3330xf5,0x83,0xe0,0x30,0xe0,0x05,0x43,0x27,0x10,0x80,0x03,0x53,0x27,0xef,0x78,0xa1,
3340xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe4,0x05,
3350x43,0x27,0x08,0x80,0x03,0x53,0x27,0xf7,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,
3360xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe5,0x05,0x43,0x27,0x04,0x80,0x03,0x53,
3370x27,0xfb,0x78,0xa1,0xe6,0x24,0x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,
3380xe0,0x30,0xe6,0x05,0x43,0x27,0x01,0x80,0x03,0x53,0x27,0xfe,0x78,0xa1,0xe6,0x24,
3390x02,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xa3,0xe0,0x30,0xe7,0x05,0x43,0x27,
3400x02,0x80,0x03,0x53,0x27,0xfd,0xe5,0x27,0xfc,0x78,0xa3,0xe6,0x24,0x03,0xf5,0x82,
3410x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0xc2,0x03,0x7c,0x00,0x22,0x8d,0x27,0x8c,
3420x26,0xed,0x54,0x03,0x14,0x60,0x03,0x7c,0x10,0x22,0xe5,0x27,0x54,0x7c,0x24,0xfc,
3430x40,0x03,0x7c,0x0b,0x22,0xe5,0x26,0x24,0x97,0xf8,0xc6,0x44,0x02,0xf6,0x7c,0x00,
3440x22,0x8c,0x30,0x12,0x0f,0x7c,0xe5,0x30,0x24,0x97,0xf8,0xe6,0x20,0xe2,0x4f,0xac,
3450x30,0x7d,0x02,0x12,0x0d,0x3a,0xe5,0x30,0x24,0xfe,0x44,0x28,0xfc,0x78,0xa4,0x86,
3460x83,0x08,0x86,0x82,0xec,0xf0,0xaf,0x83,0xe5,0x82,0x24,0x04,0xfe,0xe4,0x3f,0xff,
3470xec,0x8e,0x82,0x8f,0x83,0xf0,0x7c,0x03,0x8c,0x2c,0xe5,0x2c,0xfc,0x78,0xa5,0xe6,
3480x24,0x01,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0xe5,0x2c,0xfc,0x78,
3490xa5,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xec,0xf0,0x75,0x2d,
3500x01,0x75,0x2f,0x48,0x75,0x2e,0xff,0xe5,0x30,0x24,0xfd,0xfc,0xe4,0x34,0xff,0xfd,
3510xec,0x7c,0x03,0x25,0xe0,0xcd,0x33,0xcd,0xdc,0xf9,0xfc,0xe5,0x2f,0x2c,0xf5,0x2f,
3520xe5,0x2e,0x3d,0xf5,0x2e,0x78,0xa5,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,
3530xf5,0x83,0xe0,0x54,0xe7,0xf5,0x2c,0xad,0x2f,0xae,0x2e,0xaf,0x2d,0xe4,0x90,0x00,
3540x02,0x12,0x03,0x17,0xe4,0x90,0x00,0x06,0x12,0x03,0x17,0x12,0x01,0xe6,0x30,0xe5,
3550x03,0x43,0x2c,0x10,0xe5,0x2c,0xfc,0x78,0xa5,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,
3560x34,0x00,0xf5,0x83,0xec,0xf0,0x12,0x10,0x67,0x78,0xa3,0xe6,0x24,0x06,0xf5,0x82,
3570x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0xc2,0x03,0xfc,0xe5,0x30,0x24,0x97,0xf8,0xc6,
3580x44,0x04,0xf6,0x8c,0x2c,0xe5,0x30,0x54,0x0f,0xc4,0x54,0xf0,0x7e,0x00,0xff,0xee,
3590xef,0x44,0x04,0x7d,0x00,0xff,0xec,0x4e,0xfc,0xed,0x4f,0xfd,0x12,0x1c,0xfe,0x7c,
3600x00,0x22,0x8c,0x2f,0x12,0x0f,0x7c,0x12,0x10,0x07,0x78,0xa4,0x86,0x83,0x08,0x86,
3610x82,0xe0,0x54,0x08,0xf0,0xa3,0xa3,0xa3,0xa3,0xe0,0x54,0x08,0xf0,0xac,0x2f,0x7d,
3620x02,0x12,0x0d,0x3a,0xc2,0x03,0xe5,0x2f,0x24,0x97,0xf8,0xc6,0x54,0xfb,0xf6,0x7c,
3630x00,0x22,0x12,0x30,0x85,0x78,0x90,0xec,0xf6,0xec,0x24,0x97,0xf8,0xe6,0x30,0xe1,
3640x0a,0x7d,0x00,0x7c,0x13,0x12,0x24,0xb1,0x12,0x31,0x08,0x78,0x90,0xe6,0x24,0x97,
3650xf8,0xc6,0x44,0x01,0xf6,0x78,0x90,0xe6,0xfc,0x12,0x0f,0x7c,0x78,0x90,0xe6,0x24,
3660xfd,0x75,0xf0,0x0a,0xa4,0x24,0x1c,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0x78,0xa0,
3670xe6,0xfa,0x08,0xe6,0xf9,0x7b,0x0a,0x78,0x01,0x12,0x03,0xa7,0x78,0xa0,0x86,0x83,
3680x08,0x86,0x82,0x79,0xf8,0x7a,0x34,0x7b,0x0a,0x78,0x01,0x12,0x03,0xf5,0x12,0x0f,
3690xd3,0xc2,0x03,0x78,0x90,0xe6,0xfc,0x12,0x11,0x23,0x78,0x8f,0xec,0xf6,0xec,0x60,
3700x0a,0x7d,0x00,0x7c,0x08,0x12,0x24,0xb1,0x12,0x31,0x08,0x78,0x90,0xe6,0xfc,0x12,
3710x0f,0x7c,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,
3720x44,0x10,0x54,0xdf,0xfc,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,
3730xf5,0x83,0xec,0xf0,0x78,0x8f,0xec,0xf6,0xc2,0x03,0x7c,0xc8,0x12,0x32,0x48,0x78,
3740x90,0xe6,0xfc,0x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,
3750x00,0xf5,0x83,0xe0,0x54,0xef,0xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,0x48,0x78,0x90,
3760xe6,0xfc,0x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,
3770xf5,0x83,0xe0,0x44,0x10,0xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,0x48,0x78,0x90,0xe6,
3780xfc,0x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,
3790x83,0xe0,0x44,0x20,0xf0,0xc2,0x03,0x7c,0xf0,0x12,0x32,0x48,0x78,0x90,0xe6,0xfc,
3800x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,
3810xe0,0x30,0xe4,0x15,0xc2,0x03,0x78,0x90,0xe6,0x44,0x10,0x7f,0x00,0xfe,0x7c,0x07,
3820x12,0x31,0x9a,0x12,0x31,0x08,0x02,0x17,0x49,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,
3830x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xcf,0xf0,0xc2,0x03,0x7c,0xc8,0x12,0x32,
3840x48,0x78,0x90,0xe6,0xfc,0x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x04,0xf5,0x82,0x18,
3850xe6,0x34,0x00,0xf5,0x83,0xe0,0x44,0x30,0xf0,0xc2,0x03,0x7c,0xf0,0x12,0x32,0x48,
3860x78,0x90,0xe6,0xfc,0x12,0x0f,0x7c,0x78,0xa3,0xe6,0x24,0x05,0xf5,0x82,0x18,0xe6,
3870x34,0x00,0xf5,0x83,0xe0,0x30,0xe4,0x14,0xc2,0x03,0x78,0x90,0xe6,0x44,0x10,0x7f,
3880x00,0xfe,0x7c,0x07,0x12,0x31,0x9a,0x12,0x31,0x08,0x80,0x5d,0x78,0xa3,0xe6,0x24,
3890x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x78,0xa3,0xe6,
3900x24,0x04,0xf5,0x82,0x18,0xe6,0x34,0x00,0xf5,0x83,0xe0,0x54,0xdf,0xf0,0x78,0x90,
3910xe6,0x24,0xfd,0x75,0xf0,0x0a,0xa4,0x24,0x1c,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,
3920xac,0x82,0xad,0x83,0x78,0xa0,0x86,0x83,0x08,0x86,0x82,0xec,0xf9,0xed,0xfa,0x7b,
3930x0a,0x78,0x01,0x12,0x03,0xa7,0xc2,0x03,0x78,0x90,0xe6,0xfc,0x12,0x11,0x23,0x7d,
3940x00,0x7c,0x0b,0x12,0x24,0xb1,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x90,0xff,0x91,
3950xe0,0x90,0xfd,0x41,0xf0,0x7d,0x02,0x7c,0x00,0x12,0x24,0xb1,0x12,0x31,0x08,0x22,
3960x12,0x30,0x85,0x90,0xfd,0x40,0xe0,0xf4,0xfc,0x90,0xff,0x91,0xe0,0x5c,0xf5,0x33,
3970x90,0xfd,0x41,0xe0,0xfc,0x90,0xfd,0x40,0xe0,0x5c,0x42,0x33,0xe5,0x33,0x90,0xff,
3980x91,0xf0,0x7c,0x00,0x12,0x25,0x4a,0x12,0x31,0x08,0x22,0x74,0x3c,0x90,0xfb,0xe8,
3990xf0,0x74,0x3e,0x90,0xfb,0xe8,0xf0,0xe4,0x90,0xfd,0x30,0xf0,0x22,0x8d,0x35,0x8c,
4000x34,0xec,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x02,0x80,0x28,0xb4,0x02,0x02,0x80,
4010x03,0xd3,0x40,0x08,0xa8,0x35,0xc6,0x25,0xe0,0xf6,0x80,0x18,0xb4,0x04,0x02,0x80,
4020x03,0xd3,0x40,0x0a,0xa8,0x35,0xc6,0x25,0xe0,0x25,0xe0,0xf6,0x80,0x06,0xa8,0x35,
4030x76,0x00,0x80,0x00,0x22,0x8c,0x3c,0x8d,0x3b,0xed,0xfe,0xec,0xfd,0x7f,0x01,0x75,
4040x60,0x06,0x75,0x61,0x00,0x90,0xfd,0x31,0x12,0x04,0x6e,0x12,0x01,0xe6,0xb4,0x80,
4050x02,0x80,0x06,0xd3,0x50,0x03,0x02,0x18,0x9e,0x90,0xfd,0x31,0x12,0x04,0x80,0x90,
4060x00,0x03,0x12,0x01,0xec,0x54,0xf0,0xb4,0x30,0x02,0x80,0x03,0xd3,0x40,0x5f,0x90,
4070xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x08,0x12,0x02,0x0e,0xfa,0xfd,0xeb,0xfe,0x7f,
4080x01,0x90,0xfd,0x34,0x12,0x04,0x6e,0xee,0xcd,0x90,0x35,0x02,0xfc,0xe4,0x93,0xff,
4090x74,0x01,0x93,0xfe,0xf9,0xef,0xfa,0x7b,0x01,0xea,0xff,0xe9,0xfe,0xec,0xc3,0x9e,
4100xed,0x9f,0x40,0x25,0x90,0x35,0x04,0xe4,0x93,0xfd,0x74,0x01,0x93,0xfc,0xed,0xfe,
4110xec,0xfd,0x7f,0x01,0xee,0xcd,0xfc,0x90,0xfd,0x36,0xe0,0xd3,0x9c,0x90,0xfd,0x35,
4120xe0,0x9d,0x50,0x05,0x75,0x60,0x80,0x80,0x33,0x12,0x19,0xbc,0x80,0x2e,0xb4,0x60,
4130x02,0x80,0x03,0xd3,0x40,0x0b,0xac,0x3c,0xad,0x3b,0x12,0x07,0x82,0x8c,0x60,0x80,
4140x1b,0xb4,0x10,0x03,0xb3,0x40,0x10,0xc3,0xb4,0x20,0x03,0xb3,0x40,0x09,0xc3,0xb4,
4150x40,0x02,0x80,0x03,0xd3,0x40,0x00,0x75,0x60,0x81,0x80,0x00,0x80,0x75,0xb4,0x81,
4160x02,0x80,0x03,0xd3,0x40,0x6b,0x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x03,0x12,
4170x01,0xec,0x54,0xf0,0xb4,0x30,0x02,0x80,0x03,0xd3,0x40,0x1d,0x90,0xfd,0x31,0x12,
4180x04,0x80,0x90,0x00,0x08,0x12,0x02,0x0e,0xfa,0xfd,0xeb,0xfe,0x7f,0x01,0x90,0xfd,
4190x37,0x12,0x04,0x6e,0x12,0x19,0x26,0x80,0x36,0xb4,0x60,0x02,0x80,0x03,0xd3,0x40,
4200x13,0x75,0x3a,0x61,0xe4,0xf5,0x39,0xf5,0x38,0xac,0x3c,0xad,0x3b,0x12,0x05,0xde,
4210x8c,0x60,0x80,0x1b,0xb4,0x10,0x03,0xb3,0x40,0x10,0xc3,0xb4,0x20,0x03,0xb3,0x40,
4220x09,0xc3,0xb4,0x40,0x02,0x80,0x03,0xd3,0x40,0x00,0x75,0x60,0x81,0x80,0x00,0x80,
4230x02,0x80,0x00,0xe5,0x60,0xfc,0x90,0xfd,0x31,0x12,0x04,0x80,0xec,0x90,0x00,0x02,
4240x12,0x03,0x17,0xac,0x61,0x22,0x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x04,0x12,
4250x01,0xec,0x60,0x04,0x74,0x01,0x80,0x01,0xe4,0xa2,0xe0,0x92,0x01,0x90,0xfd,0x31,
4260x12,0x04,0x80,0xed,0x24,0x03,0xfd,0x50,0x01,0x0e,0x90,0xfd,0x34,0x12,0x04,0x6e,
4270x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x05,0x12,0x01,0xec,0xf5,0x61,0x90,0x00,
4280x04,0x12,0x01,0xec,0x54,0x0f,0xfc,0x7d,0x61,0x12,0x17,0x9d,0xe5,0x61,0x70,0x04,
4290x75,0x60,0x08,0x22,0x75,0x60,0x00,0x78,0x7e,0x76,0x00,0x78,0x7e,0xe6,0xc3,0x95,
4300x61,0x50,0x38,0x90,0xfd,0x37,0x12,0x04,0x80,0x12,0x01,0xe6,0xfc,0x90,0xfd,0x34,
4310x12,0x04,0x80,0xec,0x12,0x03,0x0f,0x30,0x01,0x0e,0x90,0xfd,0x39,0xe0,0x04,0xf0,
4320x90,0xfd,0x38,0x70,0x03,0xe0,0x04,0xf0,0x78,0x7e,0x06,0x90,0xfd,0x36,0xe0,0x04,
4330xf0,0x90,0xfd,0x35,0x70,0x03,0xe0,0x04,0xf0,0x80,0xc0,0x22,0x90,0xfd,0x32,0xe0,
4340xfd,0xa3,0xe0,0xfc,0xed,0xfe,0xec,0xfd,0x7f,0x01,0xed,0x24,0x0a,0xfd,0x50,0x01,
4350x0e,0x90,0xfd,0x3a,0x12,0x04,0x6e,0x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x04,
4360x12,0x01,0xec,0x54,0x0f,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x17,0x90,0xfd,0x3a,
4370x12,0x04,0x80,0x0d,0xed,0x70,0x01,0x0e,0x90,0xfd,0x37,0x12,0x04,0x6e,0x78,0x82,
4380x76,0x01,0x80,0x4e,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x19,0x90,0xfd,0x3a,0x12,
4390x04,0x80,0xed,0x24,0x02,0xfd,0x50,0x01,0x0e,0x90,0xfd,0x37,0x12,0x04,0x6e,0x78,
4400x82,0x76,0x02,0x80,0x2d,0xb4,0x04,0x02,0x80,0x03,0xd3,0x40,0x19,0x90,0xfd,0x3a,
4410x12,0x04,0x80,0xed,0x24,0x04,0xfd,0x50,0x01,0x0e,0x90,0xfd,0x37,0x12,0x04,0x6e,
4420x78,0x82,0x76,0x04,0x80,0x0c,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x00,0x75,0x60,
4430x08,0x22,0x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x05,0x12,0x01,0xec,0xf5,0x61,
4440x78,0x7f,0x76,0x00,0x78,0x7f,0xe6,0xc3,0x95,0x61,0x40,0x03,0x02,0x1b,0x24,0x78,
4450x80,0x76,0x00,0x78,0x80,0xe6,0xc3,0x78,0x82,0x96,0x50,0x76,0x90,0xfd,0x34,0x12,
4460x04,0x80,0x12,0x01,0xe6,0xfc,0x90,0xfd,0x3a,0x12,0x04,0x89,0x12,0x01,0xe0,0xf4,
4470x5c,0xfc,0x12,0x01,0xe0,0xf8,0x90,0xfd,0x37,0x12,0x04,0x80,0xe8,0xc0,0xe0,0x12,
4480x01,0xe6,0xc8,0xd0,0xe0,0xc8,0x58,0x4c,0xfc,0x90,0xfd,0x34,0x12,0x04,0x80,0xec,
4490x12,0x03,0x0f,0x78,0x81,0xec,0xf6,0x90,0xfd,0x39,0xe0,0x04,0xf0,0x90,0xfd,0x38,
4500x70,0x03,0xe0,0x04,0xf0,0x09,0xe9,0x70,0x01,0x0a,0x90,0xfd,0x3a,0x12,0x04,0x77,
4510x90,0xfd,0x31,0x12,0x04,0x80,0x90,0x00,0x04,0x12,0x01,0xec,0x30,0xe4,0x0e,0x90,
4520xfd,0x36,0xe0,0x04,0xf0,0x90,0xfd,0x35,0x70,0x03,0xe0,0x04,0xf0,0x78,0x80,0x06,
4530x80,0x81,0x78,0x82,0xe6,0xfd,0xe4,0xfe,0xff,0xee,0xcd,0xfc,0x90,0xfd,0x39,0xe0,
4540x2c,0xf0,0x90,0xfd,0x38,0xe0,0x3d,0xf0,0x78,0x82,0xe6,0xfd,0xe4,0xfe,0xff,0xee,
4550xcd,0xfc,0x90,0xfd,0x3c,0xe0,0x2c,0xf0,0x90,0xfd,0x3b,0xe0,0x3d,0xf0,0x78,0x7f,
4560x06,0x02,0x1a,0x64,0x75,0x60,0x00,0x22,0xe5,0x3d,0x05,0x3d,0x04,0x70,0x02,0xb2,
4570xb0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0xe8,0xc0,0xe0,0xe9,
4580xc0,0xe0,0xea,0xc0,0xe0,0xeb,0xc0,0xe0,0xec,0xc0,0xe0,0xed,0xc0,0xe0,0xee,0xc0,
4590xe0,0xef,0xc0,0xe0,0x90,0xff,0x92,0xe0,0x12,0x01,0xb7,0x1b,0x80,0x30,0x1b,0x80,
4600x32,0x1b,0x8f,0x38,0x1b,0xa1,0x3a,0x1b,0xb3,0x3e,0x1b,0xcb,0x44,0x1b,0xbf,0x46,
4610x1b,0xd7,0x50,0x1c,0x19,0x52,0x1b,0xf8,0x54,0x1c,0x3a,0x56,0x00,0x00,0x1c,0x5b,
4620x90,0xff,0x92,0xe0,0x7f,0x00,0xfe,0x7c,0x01,0x12,0x31,0x9a,0x02,0x1c,0x6b,0xe4,
4630xff,0x04,0xfe,0x7c,0x03,0x12,0x31,0x9a,0x74,0x20,0x90,0xff,0xfe,0xf0,0x02,0x1c,
4640x6b,0xe4,0xff,0x04,0xfe,0x7c,0x02,0x12,0x31,0x9a,0x74,0x40,0x90,0xff,0xfe,0xf0,
4650x02,0x1c,0x6b,0xe4,0xff,0x04,0xfe,0x7c,0x04,0x12,0x31,0x9a,0x02,0x1c,0x6b,0xe4,
4660xff,0x04,0xfe,0x7c,0x05,0x12,0x31,0x9a,0x02,0x1c,0x6b,0xe4,0xff,0x04,0xfe,0x7c,
4670x06,0x12,0x31,0x9a,0x02,0x1c,0x6b,0x90,0xff,0xa5,0xe0,0x7d,0x00,0x90,0xfd,0x00,
4680xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xfd,0x01,0xe0,0xfc,0xf5,0x83,0x90,0xfd,0x00,0xe0,
4690x44,0x33,0xfd,0x12,0x1c,0xfe,0x80,0x73,0x90,0xff,0xb5,0xe0,0x7d,0x00,0x90,0xfd,
4700x02,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xfd,0x03,0xe0,0xfc,0xf5,0x83,0x90,0xfd,0x02,
4710xe0,0x44,0x43,0xfd,0x12,0x1c,0xfe,0x80,0x52,0x90,0xff,0xa6,0xe0,0x7d,0x00,0x90,
4720xfd,0x04,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xfd,0x05,0xe0,0xfc,0xf5,0x83,0x90,0xfd,
4730x04,0xe0,0x44,0x34,0xfd,0x12,0x1c,0xfe,0x80,0x31,0x90,0xff,0xb6,0xe0,0x7d,0x00,
4740x90,0xfd,0x06,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xfd,0x07,0xe0,0xfc,0xf5,0x83,0x90,
4750xfd,0x06,0xe0,0x44,0x44,0xfd,0x12,0x1c,0xfe,0x80,0x10,0x90,0xff,0x92,0xe0,0x7d,
4760x00,0xfc,0xed,0x44,0xaa,0xfd,0x12,0x1c,0xfe,0x80,0x00,0xe4,0x90,0xff,0x92,0xf0,
4770xd0,0xe0,0xff,0xd0,0xe0,0xfe,0xd0,0xe0,0xfd,0xd0,0xe0,0xfc,0xd0,0xe0,0xfb,0xd0,
4780xe0,0xfa,0xd0,0xe0,0xf9,0xd0,0xe0,0xf8,0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,
4790xd0,0xe0,0x32,0x05,0x81,0x05,0x81,0x05,0x81,0x05,0x81,0xa8,0x81,0x18,0x18,0x18,
4800xed,0xf6,0x08,0xec,0xf6,0x90,0xff,0x6a,0xe0,0x20,0xe7,0x02,0x80,0xf7,0x90,0xff,
4810x69,0xe0,0x7d,0x00,0xa8,0x81,0x18,0xcd,0xf6,0xcd,0x08,0xf6,0x7d,0x03,0xa8,0x81,
4820xe6,0x18,0xfc,0xe6,0xcc,0x25,0xe0,0xcc,0x33,0xcc,0xdd,0xf9,0xcc,0xf6,0xcc,0x08,
4830xf6,0xa8,0x81,0x18,0xe6,0x44,0xf8,0xf6,0xa8,0x81,0x18,0x18,0x18,0xe6,0xfd,0x08,
4840xe6,0xfc,0xa8,0x81,0x18,0x86,0x83,0x08,0x86,0x82,0xed,0xf0,0xa3,0xec,0xf0,0x74,
4850x02,0x90,0xff,0x6a,0xf0,0x15,0x81,0x15,0x81,0x15,0x81,0x15,0x81,0x22,0xe5,0x81,
4860x24,0x05,0xf5,0x81,0xe4,0xa8,0x81,0x18,0xf6,0xa8,0x81,0x18,0x18,0x18,0x18,0xed,
4870xf6,0x08,0xec,0xf6,0x90,0xfb,0xfd,0xe0,0x24,0xf8,0x50,0x03,0x02,0x1e,0x1f,0xe4,
4880xa8,0x81,0x18,0x18,0xf6,0xa8,0x81,0x18,0xe6,0xfe,0xa8,0x81,0x18,0x18,0x18,0x18,
4890xe6,0xfd,0x08,0xe6,0xfc,0x7f,0x00,0xef,0x24,0xf8,0x40,0x4d,0xe4,0xef,0x25,0xe0,
4900x24,0x85,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x6c,0x70,0x03,
4910xfa,0xeb,0x6d,0x70,0x09,0x74,0x01,0xa8,0x81,0x18,0x18,0xf6,0x80,0x2b,0xe4,0xef,
4920x25,0xe0,0x24,0x85,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0x7a,0x00,0xe0,0x54,0xf0,
4930xcc,0xf8,0xcc,0xcd,0xf9,0xcd,0xfb,0x78,0x00,0xe9,0x54,0xf0,0xf9,0xea,0x68,0x70,
4940x02,0xeb,0x69,0x70,0x01,0x0e,0x0f,0x80,0xae,0xa8,0x81,0x18,0xee,0xf6,0xa8,0x81,
4950x18,0x18,0x18,0x18,0xed,0xf6,0x08,0xec,0xf6,0xa8,0x81,0xef,0xf6,0xa8,0x81,0x18,
4960x18,0xe6,0x70,0x79,0xa8,0x81,0x18,0xe6,0x24,0xf7,0x40,0x71,0xa8,0x81,0x18,0x18,
4970x18,0x18,0xe6,0x54,0x0f,0xa8,0x81,0xf6,0x64,0x04,0x60,0x17,0xa8,0x81,0xe6,0x64,
4980x03,0x60,0x10,0xa8,0x81,0x18,0x18,0x18,0x18,0xe6,0xfd,0x08,0xe6,0xfc,0x12,0x1c,
4990x93,0x80,0x4a,0x7c,0x0a,0x12,0x30,0xfa,0xa8,0x81,0x18,0x18,0x18,0x18,0xe6,0xfd,
5000x08,0xe6,0xfc,0x90,0xfb,0xfc,0xe0,0x25,0xe0,0x24,0x85,0xf5,0x82,0xe4,0x34,0xfd,
5010xf5,0x83,0xed,0xf0,0xa3,0xec,0xf0,0x90,0xfb,0xfc,0xe0,0xff,0xe4,0xef,0x04,0x54,
5020x07,0xff,0x90,0xfb,0xfc,0xf0,0x90,0xfb,0xfd,0xe0,0x04,0xf0,0x12,0x31,0x93,0x90,
5030xfb,0xfe,0xe0,0x70,0x08,0xe4,0xfe,0xff,0x7c,0x0f,0x12,0x31,0x9a,0x80,0x27,0x90,
5040xfb,0xff,0xe0,0x04,0xf0,0x54,0x3f,0x70,0x1d,0x90,0xfb,0xff,0xe0,0x44,0xfe,0x7d,
5050x00,0xfc,0x90,0xfb,0xfc,0xe0,0x25,0xe0,0x24,0x85,0xf5,0x82,0xe4,0x34,0xfd,0xf5,
5060x83,0xed,0xf0,0xa3,0xec,0xf0,0xe5,0x81,0x24,0xfb,0xf5,0x81,0x22,0x78,0x85,0x76,
5070x00,0x78,0x86,0x76,0x00,0x74,0x01,0x90,0xfb,0xfe,0xf0,0x12,0x30,0x85,0x90,0xfb,
5080xfd,0xe0,0x60,0x59,0x7c,0x0a,0x12,0x30,0xfa,0x90,0xfb,0xfb,0xe0,0x25,0xe0,0x24,
5090x85,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0xfc,0x90,0xfb,0xfb,
5100xe0,0x25,0xe0,0x24,0x85,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
5110x90,0xfb,0xfb,0xe0,0xff,0xe4,0xef,0x04,0x54,0x07,0xff,0x90,0xfb,0xfb,0xf0,0x90,
5120xfb,0xfd,0xe0,0x14,0xf0,0x78,0x83,0xed,0xf6,0x08,0xec,0xf6,0x12,0x31,0x93,0xb2,
5130xb3,0x78,0x83,0xe6,0xfd,0x08,0xe6,0xfc,0x12,0x08,0xe5,0x80,0xa1,0x12,0x31,0xe7,
5140x78,0x85,0x06,0xb6,0x00,0x11,0x78,0x85,0x76,0x00,0x78,0x86,0xe6,0xf4,0x04,0x04,
5150xa2,0xe0,0x92,0xb4,0x78,0x86,0xf6,0x80,0x85,0xe4,0x90,0xfb,0xfe,0xf0,0x90,0xfb,
5160xfd,0xe0,0x7d,0x00,0xfc,0xed,0x44,0xcf,0xfd,0x12,0x1c,0x93,0x12,0x31,0x08,0x22,
5170x12,0x30,0x85,0xe5,0x6a,0x64,0x49,0x45,0x69,0x60,0x15,0x90,0xff,0x83,0xe0,0x54,
5180x0f,0x7d,0x00,0xd3,0x95,0x6a,0xed,0x95,0x69,0x50,0x05,0x12,0x2e,0xce,0x80,0x03,
5190x12,0x2f,0x9e,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0xe5,0x6a,0x64,0x49,0x45,0x69,
5200x60,0x05,0x12,0x2f,0xd8,0x80,0x0e,0x90,0xff,0x80,0xe0,0x44,0x08,0xf0,0x90,0xff,
5210x83,0xe0,0x54,0x7f,0xf0,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x8c,0x54,0xec,0x54,
5220xf0,0xb4,0x10,0x15,0x75,0x64,0x3d,0x75,0x63,0xfd,0x75,0x62,0x01,0xe5,0x64,0x24,
5230x03,0xf5,0x64,0xe5,0x63,0x34,0x00,0xf5,0x63,0xe4,0xf5,0x57,0xf5,0x56,0xe5,0x56,
5240xc3,0x94,0x01,0x50,0x27,0xe5,0x54,0x54,0x0f,0xfc,0xad,0x64,0xae,0x63,0xaf,0x62,
5250x12,0x0e,0x82,0x8c,0x55,0xec,0x60,0x02,0x80,0x12,0x05,0x64,0xe5,0x64,0x70,0x02,
5260x05,0x63,0x05,0x57,0xe5,0x57,0x70,0x02,0x05,0x56,0x80,0xd2,0xe5,0x54,0x54,0x0f,
5270x24,0x97,0xf8,0xc6,0x54,0xfe,0xf6,0xe5,0x54,0x54,0x0f,0x7f,0x00,0xfe,0x7c,0x12,
5280x12,0x31,0x9a,0xe5,0x55,0x14,0x70,0x09,0x7d,0x00,0x7c,0x09,0x12,0x24,0xb1,0x80,
5290x07,0xad,0x57,0x7c,0x00,0x12,0x24,0xb1,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x90,
5300xff,0xfc,0xe0,0x44,0x02,0xf0,0x90,0xff,0x00,0xe0,0x30,0xe7,0x13,0x90,0xff,0x83,
5310xe0,0x44,0x80,0xf0,0x43,0x67,0x80,0x90,0xff,0xfc,0xe0,0x44,0x01,0xf0,0x80,0x11,
5320x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x53,0x67,0x7f,0x90,0xff,0xfc,0xe0,0x54,0xfe,
5330xf0,0x90,0xff,0x81,0xe0,0x44,0x80,0xf0,0x12,0x25,0x64,0x90,0xff,0xfe,0xe0,0x44,
5340x05,0xf0,0x90,0xff,0xfc,0xe0,0x54,0xfd,0xf0,0x12,0x31,0x08,0x22,0x12,0x30,0x85,
5350x7c,0x01,0x12,0x32,0x48,0x78,0xa7,0xe6,0x44,0x02,0xf6,0x74,0xfe,0xfc,0x04,0xfd,
5360x12,0x1c,0xfe,0x90,0xff,0x6a,0xe0,0x30,0xe7,0x02,0x80,0xf7,0xe4,0xf5,0x4e,0x75,
5370x4d,0x10,0xac,0x4e,0xad,0x4d,0xe5,0x4e,0x15,0x4e,0x70,0x02,0x15,0x4d,0xec,0x4d,
5380x60,0x02,0x80,0xee,0x43,0x87,0x01,0x12,0x31,0x08,0x22,0x12,0x30,0x85,0x7c,0x02,
5390x12,0x31,0x14,0x78,0xa7,0xe6,0x54,0xfd,0xf6,0x12,0x31,0x08,0x22,0x12,0x30,0x85,
5400x78,0xa7,0xe6,0x30,0xe0,0x2c,0x78,0xa7,0xe6,0x30,0xe1,0x26,0x78,0xa7,0xe6,0xfc,
5410xf5,0x83,0x18,0xe6,0x44,0xf0,0xfd,0x12,0x1c,0x93,0x90,0xff,0xfc,0xe0,0x44,0x20,
5420xf0,0x7c,0x02,0x12,0x32,0x48,0x78,0xa7,0xe6,0x54,0xfd,0xf6,0x74,0x1a,0x90,0xff,
5430xfe,0xf0,0x78,0xa7,0xe6,0xfc,0xf5,0x83,0x18,0xe6,0x44,0xf1,0xfd,0x12,0x1c,0x93,
5440x12,0x31,0x08,0x22,0x75,0x67,0x00,0x75,0x68,0x00,0xe4,0xf5,0x66,0xf5,0x65,0xe4,
5450xf5,0x69,0x75,0x6a,0x49,0x74,0x84,0x90,0xff,0x82,0xf0,0x74,0x84,0x90,0xff,0x80,
5460xf0,0x74,0x80,0x90,0xff,0x68,0xf0,0x74,0x80,0x90,0xff,0x6a,0xf0,0xad,0x46,0xaf,
5470x45,0x7e,0x00,0xee,0x24,0xfc,0x50,0x03,0x02,0x21,0x6a,0xe4,0xee,0x75,0xf0,0x07,
5480xa4,0x24,0x3f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xff,0xe4,0xef,0x54,0x80,
5490xfd,0xe4,0xef,0x54,0x0f,0x14,0xff,0xed,0x60,0x38,0xe4,0xef,0x75,0xf0,0x08,0xa4,
5500x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0x74,0x90,0xf0,0xe4,0xef,0x75,0xf0,
5510x08,0xa4,0x24,0x4a,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0x74,0x80,0xf0,0xe4,0xef,
5520x75,0xf0,0x08,0xa4,0x24,0x4e,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0x74,0x80,0xf0,
5530x80,0x34,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,
5540x83,0x74,0x90,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0a,0xf5,0x82,0xe4,0x34,
5550xff,0xf5,0x83,0xe4,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0e,0xf5,0x82,0xe4,
5560x34,0xff,0xf5,0x83,0xe4,0xf0,0x0e,0x02,0x20,0xd3,0x8d,0x46,0x8e,0x44,0x8f,0x45,
5570x74,0x7f,0x90,0xff,0xfd,0xf0,0x74,0x90,0x90,0xff,0xfc,0xf0,0x90,0xfc,0x19,0xe0,
5580x30,0xe6,0x07,0x90,0xff,0xfc,0xe0,0x44,0x04,0xf0,0x22,0x90,0xfc,0x0d,0xe0,0x14,
5590x70,0x04,0x90,0xfc,0x0c,0xe0,0x70,0x39,0x90,0xfc,0x00,0x79,0x06,0x7a,0x35,0x7b,
5600x12,0x78,0x01,0x12,0x03,0xf5,0x7f,0x00,0xef,0x33,0x40,0x15,0xef,0x90,0x35,0x4d,
5610x93,0xfc,0xef,0x24,0x80,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xec,0xf0,0x0f,0x80,
5620xe7,0x8f,0x59,0x90,0xfc,0x2b,0x79,0x18,0x7a,0x35,0x7b,0x35,0x78,0x01,0x12,0x03,
5630xf5,0xe4,0x90,0xff,0xff,0xf0,0x74,0x51,0x90,0xff,0xfa,0xf0,0x74,0x04,0x90,0xff,
5640xfb,0xf0,0x74,0x53,0x90,0xff,0xf8,0xf0,0x74,0x51,0x90,0xff,0xf9,0xf0,0x74,0x55,
5650x90,0xff,0xf7,0xf0,0x74,0x93,0x90,0xff,0xf6,0xf0,0x74,0x32,0x90,0xff,0xf5,0xf0,
5660x75,0x64,0x3d,0x75,0x63,0xfd,0x75,0x62,0x01,0xe4,0x90,0xff,0x83,0xf0,0x74,0x80,
5670x90,0xff,0x81,0xf0,0x75,0x58,0x04,0xe5,0x58,0x75,0xf0,0x07,0xa4,0x24,0x3f,0xf5,
5680x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x78,0x89,0xf6,0xfc,0x54,0x0f,0x14,0xfc,0x78,
5690x89,0xec,0xf6,0xe5,0x58,0x75,0xf0,0x07,0xa4,0x24,0x41,0xf5,0x82,0xe4,0x34,0xfc,
5700xf5,0x83,0xe0,0x78,0x8c,0x76,0xf8,0x08,0x76,0x00,0xfc,0x78,0x89,0xe6,0x75,0xf0,
5710x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x89,0xe6,
5720x75,0xf0,0x08,0xa4,0x24,0x4f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xec,0xf0,0x78,
5730x8c,0xe6,0xff,0x08,0xe6,0x7e,0x03,0xcf,0xc3,0x13,0xcf,0x13,0xde,0xf9,0xfe,0x78,
5740x89,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x49,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xee,
5750xf0,0x78,0x89,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4a,0xf5,0x82,0xe4,0x34,0xff,0xf5,
5760x83,0x74,0x80,0xf0,0x78,0x8a,0xec,0xf6,0x7d,0x00,0x78,0x8d,0xe6,0x2c,0xf6,0x18,
5770xe6,0x3d,0xf6,0x78,0x8c,0xe6,0xfd,0x08,0xe6,0x7c,0x03,0xcd,0xc3,0x13,0xcd,0x13,
5780xdc,0xf9,0xfc,0x78,0x89,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4d,0xf5,0x82,0xe4,0x34,
5790xff,0xf5,0x83,0xec,0xf0,0x78,0x89,0xe6,0x75,0xf0,0x08,0xa4,0x24,0x4e,0xf5,0x82,
5800xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x8c,0xe6,0xfd,0x08,0xe6,0xfc,0x78,0x89,
5810xe6,0xff,0x7e,0x00,0xee,0x24,0xfc,0x50,0x03,0x02,0x24,0x6b,0xe4,0xee,0x75,0xf0,
5820x07,0xa4,0x24,0x3f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xff,0xe4,0xef,0x54,
5830x80,0xfa,0xe4,0xef,0x54,0x0f,0x14,0xff,0xe4,0xee,0x75,0xf0,0x07,0xa4,0x24,0x41,
5840xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x78,0x8a,0xf6,0xee,0x75,0xf0,0x80,0xa4,
5850x24,0x08,0xf8,0xe5,0xf0,0x34,0xf8,0xf9,0xe8,0xfc,0xe9,0xfd,0x8a,0x59,0xea,0x70,
5860x03,0x02,0x23,0xd8,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,
5870xff,0xf5,0x83,0xe4,0xf0,0x78,0x8a,0xe6,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,
5880x4f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0xed,0xfb,0xec,0x7a,0x03,0xcb,
5890xc3,0x13,0xcb,0x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x49,0xf5,
5900x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0x78,0x8a,0xe6,0x7b,0x00,0xfa,0xec,0x2a,
5910xfc,0xed,0x3b,0xfd,0xfb,0xec,0x7a,0x03,0xcb,0xc3,0x13,0xcb,0x13,0xda,0xf9,0xfa,
5920xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4d,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,
5930xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4a,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,
5940x74,0x80,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x4e,0xf5,0x82,0xe4,0x34,0xff,
5950xf5,0x83,0x74,0x80,0xf0,0x02,0x24,0x67,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x08,
5960xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x78,0x8a,0xe6,0xfa,0xe4,0xef,0x75,
5970xf0,0x08,0xa4,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0xed,0xfb,
5980xec,0x7a,0x03,0xcb,0xc3,0x13,0xcb,0x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,
5990xa4,0x24,0x09,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xea,0xf0,0x78,0x8a,0xe6,0x7b,
6000x00,0xfa,0xec,0x2a,0xfc,0xed,0x3b,0xfd,0xfb,0xec,0x7a,0x03,0xcb,0xc3,0x13,0xcb,
6010x13,0xda,0xf9,0xfa,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0d,0xf5,0x82,0xe4,0x34,
6020xff,0xf5,0x83,0xea,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0a,0xf5,0x82,0xe4,
6030x34,0xff,0xf5,0x83,0xe4,0xf0,0xe4,0xef,0x75,0xf0,0x08,0xa4,0x24,0x0e,0xf5,0x82,
6040xe4,0x34,0xff,0xf5,0x83,0xe4,0xf0,0x0e,0x02,0x22,0xf4,0x8e,0x58,0x78,0x8c,0xed,
6050xf6,0x08,0xec,0xf6,0x78,0x89,0xef,0xf6,0x12,0x20,0xa4,0x22,0x8c,0x26,0xec,0x30,
6060xe7,0x18,0xe5,0x26,0x54,0x0f,0x14,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,
6070x34,0xff,0xf5,0x83,0xe0,0x54,0xdf,0xf0,0x80,0x16,0xe5,0x26,0x54,0x0f,0x14,0x75,
6080xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0xdf,0xf0,
6090x22,0xec,0x90,0xfd,0x3f,0xf0,0x8c,0x24,0xed,0x24,0x03,0xf5,0x25,0x7d,0x00,0xd3,
6100x95,0x6c,0xed,0x95,0x6b,0x40,0x03,0x85,0x6c,0x25,0xe5,0x25,0x24,0xb7,0x50,0x09,
6110x75,0x25,0x03,0x74,0x02,0x90,0xfd,0x3f,0xf0,0xac,0x25,0x12,0x2f,0xc3,0x22,0xe4,
6120xf5,0x66,0xf5,0x65,0x12,0x24,0xe8,0x22,0x90,0xfd,0x3d,0xe0,0x65,0x6d,0x60,0x0e,
6130x74,0x04,0x90,0xfd,0x3f,0xf0,0xe4,0xf5,0x65,0x75,0x66,0x03,0x80,0x46,0x7d,0x6d,
6140xe4,0xfe,0xff,0x79,0x3d,0x7a,0xfd,0x7b,0x01,0x74,0x05,0x78,0x00,0x12,0x03,0x3f,
6150xe5,0x66,0x24,0x03,0xf5,0x66,0xe5,0x65,0x34,0x00,0xf5,0x65,0xe5,0x66,0xd3,0x95,
6160x6c,0xe5,0x65,0x95,0x6b,0x40,0x06,0x85,0x6c,0x66,0x85,0x6b,0x65,0xd3,0xe5,0x66,
6170x94,0x48,0xe5,0x65,0x94,0x00,0x40,0x0c,0x74,0x02,0x90,0xfd,0x3f,0xf0,0xe4,0xf5,
6180x65,0x75,0x66,0x03,0xac,0x66,0x12,0x2f,0xc3,0x22,0xec,0x90,0xfd,0x3f,0xf0,0xe4,
6190xf5,0x66,0xf5,0x65,0x8c,0x32,0xec,0x60,0x05,0x12,0x2f,0xb4,0x80,0x05,0x7c,0x00,
6200x12,0x2f,0xc3,0x22,0x90,0xff,0x04,0xe0,0xf5,0x4a,0x90,0xff,0x06,0xe0,0xfd,0xa3,
6210xe0,0xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0x90,0xff,0x06,0xe0,0xff,0xa3,0xe0,0x7e,
6220x00,0xff,0xe4,0xfe,0xec,0x4e,0xfc,0xed,0x4f,0xfd,0xc3,0xec,0x94,0x48,0xed,0x94,
6230x00,0x50,0x22,0x90,0xff,0x06,0xe0,0xfd,0xa3,0xe0,0xed,0x7d,0x00,0xfc,0x7d,0x00,
6240xfc,0x90,0xff,0x06,0xe0,0xff,0xa3,0xe0,0x7e,0x00,0xff,0xe4,0xfe,0xec,0x4e,0xfc,
6250xed,0x4f,0xfd,0x80,0x04,0xe4,0xfd,0x7c,0x48,0x8c,0x6c,0x8d,0x6b,0x90,0xff,0x02,
6260xe0,0xfd,0xa3,0xe0,0xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0x90,0xff,0x02,0xe0,0xff,
6270xa3,0xe0,0x7e,0x00,0xff,0xe4,0xfe,0xec,0x4e,0xf5,0x4c,0xed,0x4f,0xf5,0x4b,0x75,
6280x64,0x3d,0x75,0x63,0xfd,0x75,0x62,0x01,0x7d,0x3d,0x7e,0xfd,0x7f,0x01,0x79,0x6d,
6290xe4,0xfa,0xfb,0x74,0x05,0x78,0x00,0x12,0x03,0x3f,0x75,0x49,0x00,0xe5,0x49,0x24,
6300xfe,0x40,0x19,0xad,0x64,0xae,0x63,0xaf,0x62,0xe4,0x12,0x03,0x0f,0x05,0x49,0x0d,
6310xed,0x70,0x01,0x0e,0x8d,0x64,0x8e,0x63,0x8f,0x62,0x80,0xe1,0x75,0x64,0x3d,0x75,
6320x63,0xfd,0x75,0x62,0x01,0x90,0xff,0x00,0xe0,0x54,0x60,0xb4,0x00,0x02,0x80,0x06,
6330xd3,0x50,0x03,0x02,0x2c,0x12,0xe5,0x4a,0x54,0x0f,0xf5,0x49,0xe5,0x4a,0x54,0x80,
6340xa2,0xe0,0x92,0x02,0x90,0xff,0x01,0xe0,0x12,0x01,0x81,0x00,0x0b,0x2c,0x0d,0x26,
6350x67,0x27,0x85,0x2c,0x0d,0x28,0x91,0x2c,0x0d,0x29,0x74,0x29,0xa8,0x2b,0x0f,0x2b,
6360x12,0x2b,0x52,0x2b,0xb6,0x2b,0xe4,0xe5,0x67,0x30,0xe7,0x0e,0xe5,0x4c,0x45,0x4b,
6370x70,0x08,0xe5,0x6c,0x64,0x02,0x45,0x6b,0x60,0x03,0x02,0x2c,0x0f,0x90,0xff,0x00,
6380xe0,0x54,0x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x29,0xe5,0x4a,0x60,0x03,0x02,
6390x27,0x82,0xad,0x64,0xae,0x63,0xaf,0x62,0x74,0x01,0x12,0x03,0x0f,0x78,0xa7,0xe6,
6400x30,0xe0,0x0b,0xad,0x64,0xae,0x63,0xaf,0x62,0x74,0x02,0x12,0x03,0x0f,0x7c,0x02,
6410x12,0x2f,0xc3,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x1b,0xe5,0x67,0x20,0xe1,
6420x07,0xe5,0x4a,0x60,0x03,0x02,0x27,0x82,0xe5,0x4a,0x24,0xfe,0x50,0x03,0x02,0x27,
6430x82,0x7c,0x02,0x12,0x2f,0xc3,0x22,0xb4,0x02,0x02,0x80,0x06,0xd3,0x50,0x03,0x02,
6440x27,0x80,0xe5,0x67,0x20,0xe1,0x0d,0xe5,0x4a,0x60,0x09,0xe5,0x4a,0x64,0x80,0x60,
6450x03,0x02,0x27,0x82,0xac,0x4a,0x12,0x30,0x4a,0x40,0x03,0x02,0x27,0x82,0xe5,0x49,
6460x70,0x25,0x30,0x02,0x11,0x90,0xff,0x80,0xe0,0x54,0x08,0xad,0x64,0xae,0x63,0xaf,
6470x62,0x12,0x03,0x0f,0x80,0x0f,0x90,0xff,0x82,0xe0,0x54,0x08,0xad,0x64,0xae,0x63,
6480xaf,0x62,0x12,0x03,0x0f,0x80,0x3d,0x15,0x49,0x30,0x02,0x1d,0xe5,0x49,0x75,0xf0,
6490x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0x08,0xad,0x64,
6500xae,0x63,0xaf,0x62,0x12,0x03,0x0f,0x80,0x1b,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,
6510x08,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0x08,0xad,0x64,0xae,0x63,0xaf,
6520x62,0x12,0x03,0x0f,0xad,0x64,0xae,0x63,0xaf,0x62,0x12,0x01,0xe6,0x60,0x0b,0xad,
6530x64,0xae,0x63,0xaf,0x62,0x74,0x01,0x12,0x03,0x0f,0x7c,0x02,0x12,0x2f,0xc3,0x22,
6540x80,0x00,0x02,0x2c,0x0f,0xe5,0x67,0x20,0xe7,0x06,0xe5,0x6c,0x45,0x6b,0x60,0x03,
6550x02,0x2c,0x0f,0x90,0xff,0x00,0xe0,0x54,0x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,
6560x1a,0xe5,0x4c,0x14,0x45,0x4b,0x70,0x04,0xe5,0x4a,0x60,0x03,0x02,0x28,0x8e,0x78,
6570xa7,0xe6,0x54,0xfe,0xf6,0x7c,0x00,0x12,0x2f,0xc3,0x22,0xb4,0x01,0x02,0x80,0x03,
6580xd3,0x40,0x2a,0xe5,0x67,0x20,0xe1,0x08,0xe5,0x67,0x20,0xe0,0x03,0x02,0x28,0x8e,
6590xe5,0x67,0x30,0xe0,0x04,0xe5,0x4a,0x70,0x0b,0xe5,0x67,0x30,0xe1,0x09,0xe5,0x4a,
6600x24,0xfe,0x50,0x03,0x02,0x28,0x8e,0x7c,0x00,0x12,0x2f,0xc3,0x22,0xb4,0x02,0x02,
6610x80,0x06,0xd3,0x50,0x03,0x02,0x28,0x8c,0xe5,0x4c,0x45,0x4b,0x60,0x03,0x02,0x28,
6620x8e,0xac,0x4a,0x12,0x30,0x4a,0x40,0x03,0x02,0x28,0x8e,0xe5,0x67,0x20,0xe1,0x07,
6630xe5,0x67,0x20,0xe0,0x02,0x80,0x77,0xe5,0x67,0x30,0xe0,0x06,0xe5,0x49,0x60,0x02,
6640x80,0x6c,0xe5,0x49,0x70,0x0f,0x90,0xff,0x82,0xe0,0x54,0xf7,0xf0,0x90,0xff,0x80,
6650xe0,0x54,0xf7,0xf0,0x22,0xe5,0x49,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x09,0x7d,
6660x01,0x7c,0x03,0x12,0x0f,0x0b,0x80,0x11,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x09,
6670x7d,0x01,0x7c,0x04,0x12,0x0f,0x0b,0x80,0x00,0x15,0x49,0x30,0x02,0x15,0xe5,0x49,
6680x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x54,0xf7,
6690xf0,0x80,0x13,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,0xff,
6700xf5,0x83,0xe0,0x54,0xf7,0xf0,0x7c,0x00,0x12,0x2f,0xc3,0x22,0x80,0x00,0x02,0x2c,
6710x0f,0xe5,0x67,0x20,0xe7,0x06,0xe5,0x6c,0x45,0x6b,0x60,0x03,0x02,0x2c,0x0f,0x90,
6720xff,0x00,0xe0,0x54,0x1f,0xb4,0x00,0x02,0x80,0x03,0xd3,0x40,0x1a,0xe5,0x4c,0x14,
6730x45,0x4b,0x70,0x04,0xe5,0x4a,0x60,0x03,0x02,0x29,0x71,0x78,0xa7,0xe6,0x44,0x01,
6740xf6,0x7c,0x00,0x12,0x2f,0xc3,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x29,0xe5,
6750x67,0x20,0xe1,0x08,0xe5,0x67,0x20,0xe0,0x03,0x02,0x29,0x71,0xe5,0x67,0x30,0xe0,
6760x04,0xe5,0x49,0x70,0x0b,0xe5,0x67,0x30,0xe1,0x08,0xe5,0x49,0x24,0xfe,0x50,0x02,
6770x80,0x7f,0x7c,0x00,0x12,0x2f,0xc3,0x22,0xb4,0x02,0x02,0x80,0x03,0xd3,0x40,0x6f,
6780xe5,0x4c,0x45,0x4b,0x60,0x02,0x80,0x69,0xac,0x4a,0x12,0x30,0x4a,0x40,0x02,0x80,
6790x60,0xe5,0x67,0x20,0xe1,0x07,0xe5,0x67,0x20,0xe0,0x02,0x80,0x54,0xe5,0x49,0x70,
6800x14,0x30,0x02,0x09,0x90,0xff,0x80,0xe0,0x44,0x08,0xf0,0x80,0x07,0x90,0xff,0x82,
6810xe0,0x44,0x08,0xf0,0x22,0xe5,0x67,0x30,0xe1,0x33,0x15,0x49,0x30,0x02,0x15,0xe5,
6820x49,0x75,0xf0,0x08,0xa4,0x24,0x48,0xf5,0x82,0xe4,0x34,0xff,0xf5,0x83,0xe0,0x44,
6830x08,0xf0,0x80,0x13,0xe5,0x49,0x75,0xf0,0x08,0xa4,0x24,0x08,0xf5,0x82,0xe4,0x34,
6840xff,0xf5,0x83,0xe0,0x44,0x08,0xf0,0x7c,0x00,0x12,0x2f,0xc3,0x22,0x80,0x02,0x80,
6850x00,0x02,0x2c,0x0f,0xe5,0x67,0x20,0xe7,0x12,0xe5,0x6c,0x45,0x6b,0x70,0x0c,0xe5,
6860x4a,0x70,0x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,0x0f,0xe5,0x4c,
6870x90,0xff,0xff,0xf0,0x90,0xff,0xff,0xe0,0x60,0x05,0x43,0x67,0x01,0x80,0x03,0x53,
6880x67,0xfe,0x7c,0x00,0x12,0x2f,0xc3,0x22,0xe5,0x67,0x30,0xe7,0x0e,0xe5,0x6c,0x45,
6890x6b,0x60,0x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,0x0f,0xad,0x4b,
6900xe5,0x4c,0xed,0x7d,0x00,0xfc,0x7d,0x00,0xfc,0xbd,0x00,0x02,0x80,0x03,0x02,0x2b,
6910x0a,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x32,0xe5,0x4a,0x70,0x05,0xe5,0x4c,0xfc,
6920x60,0x03,0x02,0x2b,0x0c,0x75,0x64,0x00,0x75,0x63,0xfc,0x75,0x62,0x01,0xd3,0xe5,
6930x6c,0x94,0x12,0xe5,0x6b,0x94,0x00,0x40,0x06,0xe4,0xfd,0x7c,0x12,0x80,0x04,0xac,
6940x6c,0xad,0x6b,0x8c,0x6a,0x8d,0x69,0x12,0x2f,0xd8,0x22,0xb4,0x02,0x02,0x80,0x03,
6950xd3,0x40,0x59,0xe5,0x4a,0x60,0x03,0x02,0x2b,0x0c,0xe5,0x4c,0xfc,0x70,0x27,0x75,
6960x64,0x12,0x75,0x63,0xfc,0x75,0x62,0x01,0xd3,0xe5,0x6c,0x94,0x19,0xe5,0x6b,0x94,
6970x00,0x40,0x06,0xe4,0xfd,0x7c,0x19,0x80,0x04,0xac,0x6c,0xad,0x6b,0x8c,0x6a,0x8d,
6980x69,0x12,0x2f,0xd8,0x80,0x25,0x75,0x64,0x2b,0x75,0x63,0xfc,0x75,0x62,0x01,0xd3,
6990xe5,0x6c,0x94,0x35,0xe5,0x6b,0x94,0x00,0x40,0x06,0xe4,0xfd,0x7c,0x35,0x80,0x04,
7000xac,0x6c,0xad,0x6b,0x8c,0x6a,0x8d,0x69,0x12,0x2f,0xd8,0x22,0xb4,0x03,0x02,0x80,
7010x06,0xd3,0x50,0x03,0x02,0x2b,0x0a,0xe5,0x4c,0xf5,0x49,0x70,0x0f,0x90,0xff,0x04,
7020xe0,0xfd,0xa3,0xe0,0x4d,0x60,0x03,0x02,0x2b,0x0c,0x80,0x18,0x90,0xfc,0x82,0xe0,
7030xfd,0xa3,0xe0,0xfc,0x90,0xff,0x05,0xe0,0x6c,0x70,0x07,0x90,0xff,0x04,0xe0,0x6d,
7040x60,0x02,0x80,0x68,0xe4,0xf5,0x6a,0xf5,0x69,0x7f,0x00,0xe5,0x49,0x14,0xc5,0x49,
7050x60,0x0f,0xef,0x24,0x80,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x2f,0xff,0x80,
7060xea,0x8f,0x4a,0xe5,0x4a,0x24,0x80,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x7d,
7070x00,0xd3,0x95,0x6c,0xed,0x95,0x6b,0x40,0x06,0xac,0x6c,0xad,0x6b,0x80,0x0f,0xe5,
7080x4a,0x24,0x80,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x7d,0x00,0xfc,0x8c,0x6a,
7090x8d,0x69,0xe5,0x4a,0x24,0x80,0xfc,0xe4,0x34,0xfc,0xfd,0xfe,0xec,0xfd,0x7f,0x01,
7100x8d,0x64,0x8e,0x63,0x8f,0x62,0x12,0x2f,0xd8,0x22,0x80,0x00,0x02,0x2c,0x0f,0x02,
7110x2c,0x0f,0xe5,0x67,0x30,0xe7,0x19,0xe5,0x6c,0x14,0x45,0x6b,0x70,0x12,0xe5,0x4a,
7120x70,0x0e,0xe5,0x4c,0x45,0x4b,0x70,0x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,
7130x02,0x2c,0x0f,0xe5,0x67,0x20,0xe0,0x08,0xe5,0x67,0x20,0xe1,0x03,0x02,0x2c,0x0f,
7140x75,0x64,0x68,0xe4,0xf5,0x63,0xf5,0x62,0xe4,0xf5,0x69,0x04,0xf5,0x6a,0x12,0x2f,
7150xd8,0x22,0xe5,0x67,0x20,0xe7,0x27,0xe5,0x6c,0x45,0x6b,0x70,0x21,0xe5,0x4a,0x70,
7160x1d,0xe5,0x4c,0x64,0x02,0x45,0x4b,0x60,0x0d,0xe5,0x4c,0x14,0x45,0x4b,0x60,0x06,
7170xe5,0x4c,0x45,0x4b,0x70,0x08,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x03,0x02,0x2c,
7180x0f,0xe5,0x67,0x20,0xe0,0x08,0xe5,0x67,0x20,0xe1,0x03,0x02,0x2c,0x0f,0x85,0x4c,
7190x68,0xe5,0x68,0x70,0x08,0x43,0x67,0x01,0x53,0x67,0xfd,0x80,0x13,0xe5,0x68,0x64,
7200x02,0x60,0x07,0xe5,0x68,0x14,0x60,0x02,0x80,0x65,0x53,0x67,0xfe,0x43,0x67,0x02,
7210x7c,0x00,0x12,0x2f,0xc3,0x22,0xe5,0x67,0x30,0xe7,0x1a,0xe5,0x6c,0x14,0x45,0x6b,
7220x70,0x13,0xe5,0x4a,0x70,0x0f,0xe5,0x4c,0x45,0x4b,0x70,0x09,0x90,0xff,0x00,0xe0,
7230x54,0x1f,0x14,0x60,0x02,0x80,0x38,0xe5,0x67,0x20,0xe1,0x02,0x80,0x31,0x7c,0x01,
7240x12,0x2f,0xc3,0x22,0xe5,0x67,0x20,0xe7,0x15,0xe5,0x6c,0x45,0x6b,0x70,0x0f,0xe5,
7250x4c,0x45,0x4b,0x70,0x09,0x90,0xff,0x00,0xe0,0x54,0x1f,0x14,0x60,0x02,0x80,0x0f,
7260xe5,0x67,0x20,0xe1,0x02,0x80,0x08,0x7c,0x00,0x12,0x2f,0xc3,0x22,0x80,0x00,0x02,
7270x2e,0xca,0xb4,0x40,0x02,0x80,0x06,0xd3,0x50,0x03,0x02,0x2e,0xc0,0x90,0xff,0x01,
7280xe0,0x90,0xfd,0x3d,0xf0,0xe5,0x4a,0x90,0xfd,0x3e,0xf0,0xe4,0x90,0xfd,0x3f,0xf0,
7290xe5,0x64,0x24,0x03,0xf5,0x64,0xe5,0x63,0x34,0x00,0xf5,0x63,0xad,0x4b,0xe5,0x4c,
7300x85,0x64,0x82,0x85,0x63,0x83,0xcd,0xf0,0xa3,0xcd,0xf0,0x90,0xff,0x01,0xe0,0x12,
7310x01,0xb7,0x2c,0x7d,0x01,0x2c,0xa3,0x02,0x2c,0xcd,0x03,0x2c,0xf7,0x04,0x2d,0x45,
7320x05,0x2d,0x82,0x06,0x2d,0xa8,0x07,0x2d,0xce,0x08,0x2d,0xf4,0x09,0x2e,0x1a,0x0b,
7330x2e,0x40,0x0c,0x2e,0x4f,0x80,0x2e,0x4f,0x81,0x00,0x00,0x2e,0xad,0xe5,0x67,0x20,
7340xe7,0x06,0x7c,0x05,0x12,0x25,0x4a,0x22,0x7d,0xb7,0x7e,0x34,0x7f,0x02,0x79,0x40,
7350x7a,0xfd,0x7b,0x01,0x74,0x08,0x78,0x00,0x12,0x03,0x3f,0x7d,0x08,0x7c,0x00,0x12,
7360x24,0xb1,0x22,0xe5,0x67,0x20,0xe7,0x06,0x7c,0x05,0x12,0x25,0x4a,0x22,0xe5,0x4a,
7370xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,
7380x10,0x12,0x31,0x9a,0x22,0x7d,0x00,0x7c,0x07,0x12,0x24,0xb1,0x22,0xe5,0x67,0x20,
7390xe7,0x06,0x7c,0x05,0x12,0x25,0x4a,0x22,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,
7400x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x11,0x12,0x31,0x9a,0x22,0x7d,
7410x00,0x7c,0x07,0x12,0x24,0xb1,0x22,0xe5,0x67,0x20,0xe7,0x06,0x7c,0x05,0x12,0x25,
7420x4a,0x22,0xe5,0x4a,0xb4,0x05,0x02,0x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,
7430x7c,0x0a,0x12,0x31,0x9a,0x22,0xb4,0x01,0x02,0x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,
7440x04,0xfe,0x7c,0x08,0x12,0x31,0x9a,0x22,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,
7450x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x13,0x12,0x31,0x9a,0x22,0x7d,0x00,0x7c,
7460x07,0x12,0x24,0xb1,0x22,0xe5,0x67,0x20,0xe7,0x34,0xd3,0xe5,0x6c,0x94,0x48,0xe5,
7470x6b,0x94,0x00,0x50,0x06,0xe5,0x6c,0x45,0x6b,0x70,0x06,0x7c,0x02,0x12,0x25,0x4a,
7480x22,0xe5,0x4a,0xb4,0x01,0x03,0xb3,0x40,0x0b,0xc3,0xb4,0x03,0x00,0x40,0x09,0xb4,
7490x06,0x00,0x50,0x04,0x12,0x30,0x70,0x22,0x7c,0x07,0x12,0x25,0x4a,0x22,0x12,0x24,
7500xe8,0x22,0xe5,0x67,0x20,0xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,
7510x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x16,0x12,0x31,0x9a,0x22,0x7c,0x07,
7520x12,0x25,0x4a,0x22,0x12,0x24,0xe8,0x22,0xe5,0x67,0x20,0xe7,0x1d,0xe5,0x4a,0xb4,
7530x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x19,
7540x12,0x31,0x9a,0x22,0x7c,0x07,0x12,0x25,0x4a,0x22,0x12,0x24,0xe8,0x22,0xe5,0x67,
7550x20,0xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,
7560x4a,0x7f,0x00,0xfe,0x7c,0x17,0x12,0x31,0x9a,0x22,0x7c,0x07,0x12,0x25,0x4a,0x22,
7570x12,0x24,0xe8,0x22,0xe5,0x67,0x20,0xe7,0x1d,0xe5,0x4a,0xb4,0x03,0x00,0x40,0x10,
7580xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,0x7c,0x18,0x12,0x31,0x9a,0x22,
7590x7c,0x07,0x12,0x25,0x4a,0x22,0x12,0x24,0xe8,0x22,0xe5,0x67,0x20,0xe7,0x1d,0xe5,
7600x4a,0xb4,0x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x4a,0x7f,0x00,0xfe,
7610x7c,0x15,0x12,0x31,0x9a,0x22,0x7c,0x07,0x12,0x25,0x4a,0x22,0x12,0x24,0xe8,0x22,
7620xe5,0x67,0x20,0xe7,0x06,0x7c,0x07,0x12,0x25,0x4a,0x22,0x12,0x24,0xe8,0x22,0xe5,
7630x67,0x30,0xe7,0x20,0x90,0xff,0x00,0xe0,0x54,0x1f,0x70,0x10,0x90,0xff,0x01,0xe0,
7640xb4,0x80,0x05,0x12,0x24,0xdf,0x80,0x03,0x12,0x24,0xe8,0x22,0x7d,0x00,0x7c,0x05,
7650x12,0x24,0xb1,0x22,0x90,0xff,0x00,0xe0,0x54,0x1f,0x60,0x06,0x7c,0x05,0x12,0x25,
7660x4a,0x22,0xd3,0xe5,0x6c,0x94,0x48,0xe5,0x6b,0x94,0x00,0x50,0x0b,0xc3,0xe5,0x6c,
7670x94,0x07,0xe5,0x6b,0x94,0x00,0x50,0x06,0x7c,0x03,0x12,0x25,0x4a,0x22,0xe5,0x4a,
7680xb4,0x05,0x04,0x12,0x30,0x70,0x22,0x7c,0x07,0x12,0x25,0x4a,0x22,0xe5,0x67,0x30,
7690xe7,0x08,0x7d,0x00,0x7c,0x05,0x12,0x24,0xb1,0x22,0x7c,0x05,0x12,0x25,0x4a,0x22,
7700xb4,0x20,0x02,0x80,0x03,0xd3,0x40,0x00,0x80,0x00,0x12,0x2f,0x9e,0x22,0x75,0x43,
7710x00,0x90,0xff,0x83,0xe0,0x54,0x0f,0xd3,0x95,0x43,0x40,0x24,0xe5,0x43,0x24,0xf0,
7720xf5,0x82,0xe4,0x34,0xfe,0xf5,0x83,0xe0,0xad,0x64,0xae,0x63,0xaf,0x62,0x12,0x03,
7730x0f,0x05,0x43,0x0d,0xed,0x70,0x01,0x0e,0x8d,0x64,0x8e,0x63,0x8f,0x62,0x80,0xd1,
7740xe5,0x43,0x7d,0x00,0xfc,0xc3,0xe5,0x6a,0x9c,0xf5,0x6a,0xe5,0x69,0x9d,0xf5,0x69,
7750xe5,0x6a,0x45,0x69,0x60,0x06,0xe4,0x90,0xff,0x83,0xf0,0x22,0x90,0xff,0x82,0xe0,
7760x44,0x08,0xf0,0xe4,0xf5,0x69,0x75,0x6a,0x49,0x90,0xfd,0x3d,0xe0,0xb4,0x05,0x02,
7770x80,0x03,0xd3,0x40,0x40,0x90,0xfd,0x3e,0xe0,0xf5,0x43,0xb4,0x05,0x02,0x80,0x03,
7780xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x0b,0x12,0x31,0x9a,0x22,0xb4,0x01,0x02,
7790x80,0x03,0xd3,0x40,0x0a,0xe4,0xff,0x04,0xfe,0x7c,0x09,0x12,0x31,0x9a,0x22,0xb4,
7800x03,0x00,0x40,0x10,0xb4,0x05,0x00,0x50,0x0b,0xe5,0x43,0x7f,0x00,0xfe,0x7c,0x14,
7810x12,0x31,0x9a,0x22,0x22,0xb4,0x80,0x00,0x40,0x23,0xb4,0x82,0x00,0x50,0x1e,0x7c,
7820x3d,0x7d,0xfd,0x12,0x17,0xd5,0x7d,0x00,0x8c,0x66,0x8d,0x65,0x90,0xfd,0x3f,0xe0,
7830x60,0x05,0x12,0x2f,0x9e,0x80,0x05,0x7c,0x00,0x12,0x2f,0xc3,0x22,0x22,0x90,0xff,
7840x83,0xe0,0x54,0x7f,0xf0,0x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x90,0xff,0x80,0xe0,
7850x44,0x08,0xf0,0x22,0x90,0xff,0x82,0xe0,0x44,0x08,0xf0,0x90,0xff,0x80,0xe0,0x44,
7860x08,0xf0,0x22,0x8c,0x23,0x7d,0x00,0x8c,0x6a,0x8d,0x69,0x75,0x64,0x3d,0x75,0x63,
7870xfd,0x75,0x62,0x01,0x12,0x2f,0xd8,0x22,0x90,0xff,0x83,0xe0,0x54,0x7f,0xf0,0xe5,
7880x6a,0x64,0x49,0x45,0x69,0x70,0x01,0x22,0xc3,0xe5,0x6a,0x94,0x08,0xe5,0x69,0x94,
7890x00,0x40,0x15,0x75,0x21,0x08,0xe5,0x21,0x7d,0x00,0xfc,0xc3,0xe5,0x6a,0x9c,0xf5,
7900x6a,0xe5,0x69,0x9d,0xf5,0x69,0x80,0x09,0x85,0x6a,0x21,0xe4,0xf5,0x69,0x75,0x6a,
7910x49,0x75,0x22,0x00,0xe5,0x22,0xc3,0x95,0x21,0x50,0x26,0xad,0x64,0xae,0x63,0xaf,
7920x62,0x12,0x01,0xe6,0xfc,0xe5,0x22,0x24,0xf8,0xf5,0x82,0xe4,0x34,0xfe,0xf5,0x83,
7930xec,0xf0,0x05,0x22,0x0d,0xed,0x70,0x01,0x0e,0x8d,0x64,0x8e,0x63,0x8f,0x62,0x80,
7940xd3,0xe5,0x21,0x54,0x7f,0x90,0xff,0x81,0xf0,0x22,0x8c,0x48,0x7f,0x00,0xef,0x24,
7950xfb,0x40,0x19,0xe4,0xef,0x75,0xf0,0x07,0xa4,0x24,0x3f,0xf5,0x82,0xe4,0x34,0xfc,
7960xf5,0x83,0xe0,0x65,0x48,0x70,0x02,0xd3,0x22,0x0f,0x80,0xe2,0x8f,0x47,0xc3,0x22,
7970x85,0x6c,0x6a,0x85,0x6b,0x69,0x90,0xff,0x82,0xe0,0x54,0xf7,0xf0,0x90,0xff,0x83,
7980xe0,0x54,0x7f,0xf0,0x22,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x06,0xc0,0x07,0xe5,
7990x72,0x24,0x08,0xf8,0x86,0x06,0x53,0x06,0x7f,0x7c,0xff,0x12,0x30,0xfa,0x7c,0x00,
8000x7d,0x00,0xe5,0x75,0x60,0x46,0xff,0x90,0xfe,0x9d,0xe0,0x54,0x7f,0x6e,0x70,0x0f,
8010xc0,0x83,0xc0,0x82,0xa3,0xe0,0xfd,0xa3,0xe0,0xfc,0xa3,0x15,0x75,0x80,0x07,0xa3,
8020xa3,0xa3,0xdf,0xe6,0x80,0x26,0xdf,0x06,0xd0,0x82,0xd0,0x83,0x80,0x1e,0xe0,0xf8,
8030xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xd0,0x82,0xd0,0x83,0xe8,0xf0,0xa3,0xe9,0xf0,0xa3,
8040xea,0xf0,0xa3,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x80,0xda,0x12,0x31,0x93,0xd0,
8050x07,0xd0,0x06,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x22,0x85,0xa8,0x74,0x75,0xa8,0x88,
8060xec,0x70,0x02,0x7c,0x3f,0x8c,0x73,0x22,0xe5,0x72,0x24,0x08,0xf8,0x76,0x00,0x12,
8070x31,0xe7,0x80,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x06,0xc0,0x07,0xae,0x04,
8080x7c,0xff,0x12,0x30,0xfa,0xe5,0x75,0x60,0x42,0xff,0x90,0xfe,0x9d,0xe0,0x54,0x7f,
8090x6e,0x70,0x0b,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x15,0x75,0x80,0x07,0xa3,0xa3,
8100xa3,0xdf,0xea,0x80,0x26,0xdf,0x06,0xd0,0x82,0xd0,0x83,0x80,0xd8,0xe0,0xf8,0xa3,
8110xe0,0xf9,0xa3,0xe0,0xfa,0xd0,0x82,0xd0,0x83,0xe8,0xf0,0xa3,0xe9,0xf0,0xa3,0xea,
8120xf0,0xa3,0xc0,0x83,0xc0,0x82,0xa3,0xa3,0xa3,0x80,0xda,0x78,0x08,0x08,0x79,0x18,
8130x09,0x7c,0x01,0xe6,0x54,0x7f,0x6e,0x70,0x06,0x76,0x00,0x77,0x00,0x80,0x06,0x08,
8140x09,0x0c,0xbc,0x08,0xee,0x12,0x31,0x93,0xd0,0x07,0xd0,0x06,0xd0,0x02,0xd0,0x01,
8150xd0,0x00,0x22,0x75,0x73,0x00,0x85,0x74,0xa8,0x22,0xc0,0xf0,0xc0,0x82,0xc0,0x83,
8160xc3,0xe5,0x75,0x24,0xe8,0x50,0x05,0x12,0x31,0xe7,0x80,0xf4,0xec,0x60,0x31,0x90,
8170x34,0xb6,0xe4,0x93,0xc3,0x9c,0x40,0x28,0xc0,0x04,0x7c,0xff,0x12,0x30,0xfa,0xd0,
8180x04,0x43,0x04,0x80,0xe5,0x75,0x75,0xf0,0x03,0xa4,0x24,0x9d,0xf5,0x82,0xe4,0x34,
8190xfe,0xf5,0x83,0xec,0xf0,0xef,0xa3,0xf0,0xee,0xa3,0xf0,0x05,0x75,0x12,0x31,0x93,
8200xd0,0x83,0xd0,0x82,0xd0,0xf0,0x22,0xc0,0x04,0x7c,0x20,0xd2,0x8c,0xd2,0x8d,0xd5,
8210x04,0xfd,0xd0,0x04,0x22,0x75,0xa8,0x00,0x75,0x88,0x00,0x75,0xb8,0x00,0x75,0xf0,
8220x00,0x75,0xd0,0x00,0xe4,0xf8,0x90,0x00,0x00,0xf6,0x08,0xb8,0x00,0xfb,0x02,0x00,
8230x00,0xc3,0xed,0x94,0x02,0x50,0x04,0x7d,0x03,0x7c,0xe8,0xec,0xf4,0xfc,0xed,0xf4,
8240xfd,0x0c,0xbc,0x00,0x01,0x0d,0x8c,0x79,0x8d,0x78,0x22,0xc3,0xec,0x94,0xbc,0xed,
8250x94,0x02,0x50,0x04,0x7d,0x07,0x7c,0xd0,0xec,0xf4,0xfc,0xed,0xf4,0xfd,0x0c,0xbc,
8260x00,0x01,0x0d,0x8c,0x77,0x8d,0x76,0x22,0xec,0x70,0x01,0x22,0xc0,0x00,0xe5,0x72,
8270x24,0x18,0xf8,0xa6,0x04,0xe5,0x72,0x24,0x08,0xf8,0xc6,0x54,0x7f,0xf6,0xe6,0x30,
8280xe7,0x03,0xd0,0x00,0x22,0x12,0x31,0xe7,0x80,0xf4,0xc2,0x8c,0x85,0x76,0x8c,0x85,
8290x77,0x8a,0xd2,0x8c,0xc0,0xe0,0xc0,0xd0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x00,
8300xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x12,0x1b,
8310x28,0xe5,0x72,0x24,0x08,0xf8,0xe6,0x60,0x24,0xe5,0x72,0x24,0x10,0xf8,0xa6,0x81,
8320xe5,0x72,0x75,0xf0,0x21,0xa4,0x24,0x95,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0x78,
8330xa8,0xe5,0x81,0x04,0xc3,0x98,0xf9,0xe6,0xf0,0x08,0xa3,0xd9,0xfa,0x74,0x08,0x25,
8340x72,0xf8,0x05,0x72,0x08,0xe6,0x54,0x80,0x70,0x0c,0xe5,0x72,0xb4,0x07,0xf3,0x78,
8350x08,0x75,0x72,0x00,0x80,0xef,0xe5,0x72,0x24,0x10,0xf8,0x86,0x81,0xe5,0x72,0x75,
8360xf0,0x21,0xa4,0x24,0x95,0xf5,0x82,0xe4,0x34,0xfd,0xf5,0x83,0x78,0xa8,0xe5,0x81,
8370x04,0xc3,0x98,0xf9,0xe0,0xf6,0x08,0xa3,0xd9,0xfa,0xd0,0x07,0xd0,0x06,0xd0,0x05,
8380xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0x83,0xd0,0x82,0xd0,0xf0,
8390xd0,0xd0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xd0,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc2,
8400x8e,0x85,0x78,0x8d,0x85,0x79,0x8b,0xd2,0x8e,0x78,0x19,0x79,0x09,0x7a,0x07,0xe7,
8410x70,0x04,0xa6,0x00,0x80,0x0b,0xe6,0x60,0x08,0x16,0xe6,0x70,0x04,0xe7,0x44,0x80,
8420xf7,0x08,0x09,0xda,0xea,0xe5,0x73,0x60,0x13,0x14,0xf5,0x73,0x70,0x0e,0xe5,0x72,
8430x24,0x08,0xf8,0x76,0x00,0x12,0x31,0x93,0xd2,0x8c,0xd2,0x8d,0xd0,0x02,0xd0,0x01,
8440xd0,0x00,0xd0,0xd0,0xd0,0xe0,0x32,0x75,0x81,0xa7,0x75,0x90,0x00,0x75,0x79,0x30,
8450x75,0x78,0xf8,0x75,0x77,0x60,0x75,0x76,0xf0,0x12,0x05,0x3c,0x12,0x34,0x0f,0x12,
8460x17,0x8b,0x12,0x34,0x39,0x12,0x31,0xf5,0x80,0xe3,0x22,0xc0,0x00,0x7c,0x01,0xec,
8470x24,0x08,0xf8,0xe6,0x60,0x09,0x0c,0xbc,0x08,0xf5,0x12,0x31,0xe7,0x80,0xee,0xd0,
8480x00,0x22,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x00,0xc0,0x06,0xc0,0x07,0xed,0x24,
8490x10,0xf8,0x76,0xb6,0xed,0x75,0xf0,0x21,0xa4,0x24,0x95,0xf5,0x82,0xe4,0x34,0xfd,
8500xf5,0x83,0xc0,0x82,0xc0,0x83,0xa3,0xa3,0xe4,0x78,0x0d,0xf0,0xa3,0xd8,0xfc,0xec,
8510x54,0x7f,0x75,0xf0,0x02,0xa4,0x24,0x82,0xf5,0x82,0xe5,0xf0,0x34,0x34,0xf5,0x83,
8520xe4,0x93,0xfe,0x74,0x01,0x93,0xf5,0x82,0x8e,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,
8530xff,0xd0,0x83,0xd0,0x82,0xef,0xf0,0xa3,0xee,0xf0,0xed,0x24,0x08,0xf8,0xec,0x44,
8540x80,0xf6,0xd0,0x07,0xd0,0x06,0xd0,0x00,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0x22,0x75,
8550x72,0x00,0x75,0x75,0x00,0x7a,0x08,0x79,0x18,0x78,0x08,0x76,0x00,0x77,0x00,0x08,
8560x09,0xda,0xf8,0xe4,0x78,0x08,0x74,0x80,0x44,0x7f,0xf6,0x74,0x01,0x44,0x10,0xf5,
8570x89,0x75,0xb8,0x08,0xd2,0xab,0xd2,0xa9,0x22,0x75,0x81,0xa7,0xd2,0x8e,0xd2,0x8c,
8580xd2,0xaf,0xe5,0x75,0x60,0x32,0xff,0x90,0xfe,0x9d,0xe0,0x54,0x80,0x60,0x24,0x78,
8590x08,0x79,0x08,0xe0,0x54,0x7f,0xfa,0x7b,0x00,0xe6,0x54,0x7f,0xb5,0x02,0x02,0x7b,
8600xff,0x08,0xd9,0xf5,0xeb,0x70,0x0c,0xea,0xf0,0x12,0x33,0x8b,0xad,0x04,0xac,0x02,
8610x12,0x33,0xa2,0xa3,0xa3,0xa3,0xdf,0xd2,0x12,0x31,0xe7,0x80,0xc5,0x7c,0x01,0x7d,
8620x00,0x22,0x04,0xf5,0x04,0xe9,0x04,0xed,0x04,0xe1,0x04,0xdd,0x04,0xd9,0x04,0xe5,
8630x04,0xf1,0x04,0x9d,0x04,0xa1,0x04,0xcd,0x04,0xd1,0x04,0x99,0x04,0x99,0x04,0x99,
8640x04,0xd5,0x04,0xb5,0x04,0xad,0x04,0xb1,0x04,0xa9,0x04,0xc1,0x04,0xbd,0x04,0xb9,
8650x04,0xc5,0x04,0xc9,0x04,0xa5,0x19,0x01,0x03,0x00,0x22,0x00,0x48,0x02,0x00,0x24,
8660x0f,0x18,0x0a,0x10,0x64,0x0d,0x68,0x0c,0x05,0x06,0x02,0x03,0x01,0x01,0x81,0x01,
8670x00,0x00,0xe7,0x00,0xc0,0x00,0x80,0x00,0x60,0x00,0x40,0x00,0x30,0x00,0x18,0x00,
8680x0c,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x08,0x18,0x38,0x28,0x06,0x02,
8690x10,0x0a,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x10,0x0a,0x02,0x00,0x00,0x00,
8700x00,0x00,0xfb,0xe8,0xfb,0xfa,0x12,0x01,0x10,0x01,0xff,0x00,0x00,0x08,0x51,0x04,
8710x5f,0x50,0x16,0x01,0x01,0x02,0x00,0x02,0x09,0x02,0x35,0x00,0x01,0x02,0x00,0xe0,
8720x00,0x09,0x04,0x00,0x00,0x05,0xff,0x00,0x00,0x00,0x07,0x05,0x81,0x02,0x40,0x00,
8730x00,0x07,0x05,0x01,0x02,0x40,0x00,0x00,0x07,0x05,0x82,0x02,0x40,0x00,0x00,0x07,
8740x05,0x02,0x02,0x40,0x00,0x00,0x07,0x05,0x85,0x03,0x02,0x00,0x01,0x04,0x03,0x09,
8750x04,0x24,0x03,0x54,0x00,0x65,0x00,0x78,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x49,
8760x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,
8770x00,0x74,0x00,0x73,0x00,0x2a,0x03,0x54,0x00,0x55,0x00,0x53,0x00,0x42,0x00,0x35,
8780x00,0x30,0x00,0x35,0x00,0x32,0x00,0x20,0x00,0x53,0x00,0x65,0x00,0x72,0x00,0x69,
8790x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x50,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x22,
8800x03,0x54,0x00,0x55,0x00,0x53,0x00,0x42,0x00,0x35,0x00,0x30,0x00,0x35,0x00,0x32,
8810x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
8820x00,
883};
884
885#endif /* ifndef _TI_FW_5052_H_ */
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
new file mode 100644
index 000000000000..98054876cca2
--- /dev/null
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -0,0 +1,1842 @@
1/* vi: ts=8 sw=8
2 *
3 * TI 3410/5052 USB Serial Driver
4 *
5 * Copyright (C) 2004 Texas Instruments
6 *
7 * This driver is based on the Linux io_ti driver, which is
8 * Copyright (C) 2000-2002 Inside Out Networks
9 * Copyright (C) 2001-2002 Greg Kroah-Hartman
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * For questions or problems with this driver, contact Texas Instruments
17 * technical support, or Al Borchers <alborchers@steinerpoint.com>, or
18 * Peter Berger <pberger@brimson.com>.
19 *
20 * This driver needs this hotplug script in /etc/hotplug/usb/ti_usb_3410_5052
21 * or in /etc/hotplug.d/usb/ti_usb_3410_5052.hotplug to set the device
22 * configuration.
23 *
24 * #!/bin/bash
25 *
26 * BOOT_CONFIG=1
27 * ACTIVE_CONFIG=2
28 *
29 * if [[ "$ACTION" != "add" ]]
30 * then
31 * exit
32 * fi
33 *
34 * CONFIG_PATH=/sys${DEVPATH%/?*}/bConfigurationValue
35 *
36 * if [[ 0`cat $CONFIG_PATH` -ne $BOOT_CONFIG ]]
37 * then
38 * exit
39 * fi
40 *
41 * PRODUCT=${PRODUCT%/?*} # delete version
42 * VENDOR_ID=`printf "%d" 0x${PRODUCT%/?*}`
43 * PRODUCT_ID=`printf "%d" 0x${PRODUCT#*?/}`
44 *
45 * PARAM_PATH=/sys/module/ti_usb_3410_5052/parameters
46 *
47 * function scan() {
48 * s=$1
49 * shift
50 * for i
51 * do
52 * if [[ $s -eq $i ]]
53 * then
54 * return 0
55 * fi
56 * done
57 * return 1
58 * }
59 *
60 * IFS=$IFS,
61 *
62 * if (scan $VENDOR_ID 1105 `cat $PARAM_PATH/vendor_3410` &&
63 * scan $PRODUCT_ID 13328 `cat $PARAM_PATH/product_3410`) ||
64 * (scan $VENDOR_ID 1105 `cat $PARAM_PATH/vendor_5052` &&
65 * scan $PRODUCT_ID 20562 20818 20570 20575 `cat $PARAM_PATH/product_5052`)
66 * then
67 * echo $ACTIVE_CONFIG > $CONFIG_PATH
68 * fi
69 */
70
71#include <linux/config.h>
72#include <linux/kernel.h>
73#include <linux/errno.h>
74#include <linux/init.h>
75#include <linux/slab.h>
76#include <linux/tty.h>
77#include <linux/tty_driver.h>
78#include <linux/tty_flip.h>
79#include <linux/module.h>
80#include <linux/spinlock.h>
81#include <linux/ioctl.h>
82#include <linux/serial.h>
83#include <linux/circ_buf.h>
84#include <asm/uaccess.h>
85#include <asm/semaphore.h>
86#include <linux/usb.h>
87
88#include "usb-serial.h"
89#include "ti_usb_3410_5052.h"
90#include "ti_fw_3410.h" /* firmware image for 3410 */
91#include "ti_fw_5052.h" /* firmware image for 5052 */
92
93
94/* Defines */
95
96#define TI_DRIVER_VERSION "v0.9"
97#define TI_DRIVER_AUTHOR "Al Borchers <alborchers@steinerpoint.com>"
98#define TI_DRIVER_DESC "TI USB 3410/5052 Serial Driver"
99
100#define TI_FIRMWARE_BUF_SIZE 16284
101
102#define TI_WRITE_BUF_SIZE 1024
103
104#define TI_TRANSFER_TIMEOUT 2
105
106#define TI_DEFAULT_LOW_LATENCY 0
107#define TI_DEFAULT_CLOSING_WAIT 4000 /* in .01 secs */
108
109/* supported setserial flags */
110#define TI_SET_SERIAL_FLAGS (ASYNC_LOW_LATENCY)
111
112/* read urb states */
113#define TI_READ_URB_RUNNING 0
114#define TI_READ_URB_STOPPING 1
115#define TI_READ_URB_STOPPED 2
116
117#define TI_EXTRA_VID_PID_COUNT 5
118
119
120/* Structures */
121
122struct ti_port {
123 int tp_is_open;
124 __u8 tp_msr;
125 __u8 tp_lsr;
126 __u8 tp_shadow_mcr;
127 __u8 tp_uart_mode; /* 232 or 485 modes */
128 unsigned int tp_uart_base_addr;
129 int tp_flags;
130 int tp_closing_wait;/* in .01 secs */
131 struct async_icount tp_icount;
132 wait_queue_head_t tp_msr_wait; /* wait for msr change */
133 wait_queue_head_t tp_write_wait;
134 struct ti_device *tp_tdev;
135 struct usb_serial_port *tp_port;
136 spinlock_t tp_lock;
137 int tp_read_urb_state;
138 int tp_write_urb_in_use;
139 struct circ_buf *tp_write_buf;
140};
141
142struct ti_device {
143 struct semaphore td_open_close_sem;
144 int td_open_port_count;
145 struct usb_serial *td_serial;
146 int td_is_3410;
147 int td_urb_error;
148};
149
150
151/* Function Declarations */
152
153static int ti_startup(struct usb_serial *serial);
154static void ti_shutdown(struct usb_serial *serial);
155static int ti_open(struct usb_serial_port *port, struct file *file);
156static void ti_close(struct usb_serial_port *port, struct file *file);
157static int ti_write(struct usb_serial_port *port, const unsigned char *data,
158 int count);
159static int ti_write_room(struct usb_serial_port *port);
160static int ti_chars_in_buffer(struct usb_serial_port *port);
161static void ti_throttle(struct usb_serial_port *port);
162static void ti_unthrottle(struct usb_serial_port *port);
163static int ti_ioctl(struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg);
164static void ti_set_termios(struct usb_serial_port *port,
165 struct termios *old_termios);
166static int ti_tiocmget(struct usb_serial_port *port, struct file *file);
167static int ti_tiocmset(struct usb_serial_port *port, struct file *file,
168 unsigned int set, unsigned int clear);
169static void ti_break(struct usb_serial_port *port, int break_state);
170static void ti_interrupt_callback(struct urb *urb, struct pt_regs *regs);
171static void ti_bulk_in_callback(struct urb *urb, struct pt_regs *regs);
172static void ti_bulk_out_callback(struct urb *urb, struct pt_regs *regs);
173
174static void ti_recv(struct device *dev, struct tty_struct *tty,
175 unsigned char *data, int length);
176static void ti_send(struct ti_port *tport);
177static int ti_set_mcr(struct ti_port *tport, unsigned int mcr);
178static int ti_get_lsr(struct ti_port *tport);
179static int ti_get_serial_info(struct ti_port *tport,
180 struct serial_struct __user *ret_arg);
181static int ti_set_serial_info(struct ti_port *tport,
182 struct serial_struct __user *new_arg);
183static void ti_handle_new_msr(struct ti_port *tport, __u8 msr);
184
185static void ti_drain(struct ti_port *tport, unsigned long timeout, int flush);
186
187static void ti_stop_read(struct ti_port *tport, struct tty_struct *tty);
188static int ti_restart_read(struct ti_port *tport, struct tty_struct *tty);
189
190static int ti_command_out_sync(struct ti_device *tdev, __u8 command,
191 __u16 moduleid, __u16 value, __u8 *data, int size);
192static int ti_command_in_sync(struct ti_device *tdev, __u8 command,
193 __u16 moduleid, __u16 value, __u8 *data, int size);
194
195static int ti_write_byte(struct ti_device *tdev, unsigned long addr,
196 __u8 mask, __u8 byte);
197
198static int ti_download_firmware(struct ti_device *tdev,
199 unsigned char *firmware, unsigned int firmware_size);
200
201/* circular buffer */
202static struct circ_buf *ti_buf_alloc(void);
203static void ti_buf_free(struct circ_buf *cb);
204static void ti_buf_clear(struct circ_buf *cb);
205static int ti_buf_data_avail(struct circ_buf *cb);
206static int ti_buf_space_avail(struct circ_buf *cb);
207static int ti_buf_put(struct circ_buf *cb, const char *buf, int count);
208static int ti_buf_get(struct circ_buf *cb, char *buf, int count);
209
210
211/* Data */
212
213/* module parameters */
214static int debug;
215static int low_latency = TI_DEFAULT_LOW_LATENCY;
216static int closing_wait = TI_DEFAULT_CLOSING_WAIT;
217static ushort vendor_3410[TI_EXTRA_VID_PID_COUNT];
218static int vendor_3410_count;
219static ushort product_3410[TI_EXTRA_VID_PID_COUNT];
220static int product_3410_count;
221static ushort vendor_5052[TI_EXTRA_VID_PID_COUNT];
222static int vendor_5052_count;
223static ushort product_5052[TI_EXTRA_VID_PID_COUNT];
224static int product_5052_count;
225
226/* supported devices */
227/* the array dimension is the number of default entries plus */
228/* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
229/* null entry */
230static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = {
231 { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
232};
233
234static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = {
235 { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
236 { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
237 { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
238 { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
239};
240
241static struct usb_device_id ti_id_table_combined[] = {
242 { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
243 { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
244 { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
245 { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
246 { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
247 { }
248};
249
250static struct usb_driver ti_usb_driver = {
251 .owner = THIS_MODULE,
252 .name = "ti_usb_3410_5052",
253 .probe = usb_serial_probe,
254 .disconnect = usb_serial_disconnect,
255 .id_table = ti_id_table_combined,
256};
257
258static struct usb_serial_device_type ti_1port_device = {
259 .owner = THIS_MODULE,
260 .name = "TI USB 3410 1 port adapter",
261 .id_table = ti_id_table_3410,
262 .num_interrupt_in = 1,
263 .num_bulk_in = 1,
264 .num_bulk_out = 1,
265 .num_ports = 1,
266 .attach = ti_startup,
267 .shutdown = ti_shutdown,
268 .open = ti_open,
269 .close = ti_close,
270 .write = ti_write,
271 .write_room = ti_write_room,
272 .chars_in_buffer = ti_chars_in_buffer,
273 .throttle = ti_throttle,
274 .unthrottle = ti_unthrottle,
275 .ioctl = ti_ioctl,
276 .set_termios = ti_set_termios,
277 .tiocmget = ti_tiocmget,
278 .tiocmset = ti_tiocmset,
279 .break_ctl = ti_break,
280 .read_int_callback = ti_interrupt_callback,
281 .read_bulk_callback = ti_bulk_in_callback,
282 .write_bulk_callback = ti_bulk_out_callback,
283};
284
285static struct usb_serial_device_type ti_2port_device = {
286 .owner = THIS_MODULE,
287 .name = "TI USB 5052 2 port adapter",
288 .id_table = ti_id_table_5052,
289 .num_interrupt_in = 1,
290 .num_bulk_in = 2,
291 .num_bulk_out = 2,
292 .num_ports = 2,
293 .attach = ti_startup,
294 .shutdown = ti_shutdown,
295 .open = ti_open,
296 .close = ti_close,
297 .write = ti_write,
298 .write_room = ti_write_room,
299 .chars_in_buffer = ti_chars_in_buffer,
300 .throttle = ti_throttle,
301 .unthrottle = ti_unthrottle,
302 .ioctl = ti_ioctl,
303 .set_termios = ti_set_termios,
304 .tiocmget = ti_tiocmget,
305 .tiocmset = ti_tiocmset,
306 .break_ctl = ti_break,
307 .read_int_callback = ti_interrupt_callback,
308 .read_bulk_callback = ti_bulk_in_callback,
309 .write_bulk_callback = ti_bulk_out_callback,
310};
311
312
313/* Module */
314
315MODULE_AUTHOR(TI_DRIVER_AUTHOR);
316MODULE_DESCRIPTION(TI_DRIVER_DESC);
317MODULE_VERSION(TI_DRIVER_VERSION);
318MODULE_LICENSE("GPL");
319
320module_param(debug, bool, S_IRUGO | S_IWUSR);
321MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes");
322
323module_param(low_latency, bool, S_IRUGO | S_IWUSR);
324MODULE_PARM_DESC(low_latency, "TTY low_latency flag, 0=off, 1=on, default is off");
325
326module_param(closing_wait, int, S_IRUGO | S_IWUSR);
327MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain in close, in .01 secs, default is 4000");
328
329module_param_array(vendor_3410, ushort, &vendor_3410_count, S_IRUGO);
330MODULE_PARM_DESC(vendor_3410, "Vendor ids for 3410 based devices, 1-5 short integers");
331module_param_array(product_3410, ushort, &product_3410_count, S_IRUGO);
332MODULE_PARM_DESC(product_3410, "Product ids for 3410 based devices, 1-5 short integers");
333module_param_array(vendor_5052, ushort, &vendor_5052_count, S_IRUGO);
334MODULE_PARM_DESC(vendor_5052, "Vendor ids for 5052 based devices, 1-5 short integers");
335module_param_array(product_5052, ushort, &product_5052_count, S_IRUGO);
336MODULE_PARM_DESC(product_5052, "Product ids for 5052 based devices, 1-5 short integers");
337
338MODULE_DEVICE_TABLE(usb, ti_id_table_combined);
339
340
341/* Functions */
342
343static int __init ti_init(void)
344{
345 int i,j;
346 int ret;
347
348
349 /* insert extra vendor and product ids */
350 j = sizeof(ti_id_table_3410)/sizeof(struct usb_device_id)
351 - TI_EXTRA_VID_PID_COUNT - 1;
352 for (i=0; i<min(vendor_3410_count,product_3410_count); i++,j++) {
353 ti_id_table_3410[j].idVendor = vendor_3410[i];
354 ti_id_table_3410[j].idProduct = product_3410[i];
355 ti_id_table_3410[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
356 }
357 j = sizeof(ti_id_table_5052)/sizeof(struct usb_device_id)
358 - TI_EXTRA_VID_PID_COUNT - 1;
359 for (i=0; i<min(vendor_5052_count,product_5052_count); i++,j++) {
360 ti_id_table_5052[j].idVendor = vendor_5052[i];
361 ti_id_table_5052[j].idProduct = product_5052[i];
362 ti_id_table_5052[j].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
363 }
364
365 ret = usb_serial_register(&ti_1port_device);
366 if (ret)
367 goto failed_1port;
368 ret = usb_serial_register(&ti_2port_device);
369 if (ret)
370 goto failed_2port;
371
372 ret = usb_register(&ti_usb_driver);
373 if (ret)
374 goto failed_usb;
375
376 info(TI_DRIVER_DESC " " TI_DRIVER_VERSION);
377
378 return 0;
379
380failed_usb:
381 usb_serial_deregister(&ti_2port_device);
382failed_2port:
383 usb_serial_deregister(&ti_1port_device);
384failed_1port:
385 return ret;
386}
387
388
389static void __exit ti_exit(void)
390{
391 usb_serial_deregister(&ti_1port_device);
392 usb_serial_deregister(&ti_2port_device);
393 usb_deregister(&ti_usb_driver);
394}
395
396
397module_init(ti_init);
398module_exit(ti_exit);
399
400
401static int ti_startup(struct usb_serial *serial)
402{
403 struct ti_device *tdev;
404 struct ti_port *tport;
405 struct usb_device *dev = serial->dev;
406 int status;
407 int i;
408
409
410 dbg("%s - product 0x%4X, num configurations %d, configuration value %d",
411 __FUNCTION__, le16_to_cpu(dev->descriptor.idProduct),
412 dev->descriptor.bNumConfigurations,
413 dev->actconfig->desc.bConfigurationValue);
414
415 /* create device structure */
416 tdev = kmalloc(sizeof(struct ti_device), GFP_KERNEL);
417 if (tdev == NULL) {
418 dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
419 return -ENOMEM;
420 }
421 memset(tdev, 0, sizeof(struct ti_device));
422 sema_init(&tdev->td_open_close_sem, 1);
423 tdev->td_serial = serial;
424 usb_set_serial_data(serial, tdev);
425
426 /* determine device type */
427 if (usb_match_id(serial->interface, ti_id_table_3410))
428 tdev->td_is_3410 = 1;
429 dbg("%s - device type is %s", __FUNCTION__, tdev->td_is_3410 ? "3410" : "5052");
430
431 /* if we have only 1 configuration, download firmware */
432 if (dev->descriptor.bNumConfigurations == 1) {
433
434 if (tdev->td_is_3410)
435 status = ti_download_firmware(tdev, ti_fw_3410,
436 sizeof(ti_fw_3410));
437 else
438 status = ti_download_firmware(tdev, ti_fw_5052,
439 sizeof(ti_fw_5052));
440 if (status)
441 goto free_tdev;
442
443 /* 3410 must be reset, 5052 resets itself */
444 if (tdev->td_is_3410) {
445 msleep_interruptible(100);
446 usb_reset_device(dev);
447 }
448
449 status = -ENODEV;
450 goto free_tdev;
451 }
452
453 /* the second configuration must be set (in sysfs by hotplug script) */
454 if (dev->actconfig->desc.bConfigurationValue == TI_BOOT_CONFIG) {
455 status = -ENODEV;
456 goto free_tdev;
457 }
458
459 /* set up port structures */
460 for (i = 0; i < serial->num_ports; ++i) {
461 tport = kmalloc(sizeof(struct ti_port), GFP_KERNEL);
462 if (tport == NULL) {
463 dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
464 status = -ENOMEM;
465 goto free_tports;
466 }
467 memset(tport, 0, sizeof(struct ti_port));
468 spin_lock_init(&tport->tp_lock);
469 tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR);
470 tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0;
471 tport->tp_closing_wait = closing_wait;
472 init_waitqueue_head(&tport->tp_msr_wait);
473 init_waitqueue_head(&tport->tp_write_wait);
474 tport->tp_write_buf = ti_buf_alloc();
475 if (tport->tp_write_buf == NULL) {
476 dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
477 kfree(tport);
478 status = -ENOMEM;
479 goto free_tports;
480 }
481 tport->tp_port = serial->port[i];
482 tport->tp_tdev = tdev;
483 usb_set_serial_port_data(serial->port[i], tport);
484 tport->tp_uart_mode = 0; /* default is RS232 */
485 }
486
487 return 0;
488
489free_tports:
490 for (--i; i>=0; --i) {
491 tport = usb_get_serial_port_data(serial->port[i]);
492 ti_buf_free(tport->tp_write_buf);
493 kfree(tport);
494 usb_set_serial_port_data(serial->port[i], NULL);
495 }
496free_tdev:
497 kfree(tdev);
498 usb_set_serial_data(serial, NULL);
499 return status;
500}
501
502
503static void ti_shutdown(struct usb_serial *serial)
504{
505 int i;
506 struct ti_device *tdev = usb_get_serial_data(serial);
507 struct ti_port *tport;
508
509 dbg("%s", __FUNCTION__);
510
511 for (i=0; i < serial->num_ports; ++i) {
512 tport = usb_get_serial_port_data(serial->port[i]);
513 if (tport) {
514 ti_buf_free(tport->tp_write_buf);
515 kfree(tport);
516 usb_set_serial_port_data(serial->port[i], NULL);
517 }
518 }
519
520 if (tdev)
521 kfree(tdev);
522 usb_set_serial_data(serial, NULL);
523}
524
525
526static int ti_open(struct usb_serial_port *port, struct file *file)
527{
528 struct ti_port *tport = usb_get_serial_port_data(port);
529 struct ti_device *tdev;
530 struct usb_device *dev;
531 struct urb *urb;
532 int port_number;
533 int status;
534 __u16 open_settings = (__u8)(TI_PIPE_MODE_CONTINOUS |
535 TI_PIPE_TIMEOUT_ENABLE |
536 (TI_TRANSFER_TIMEOUT << 2));
537
538 dbg("%s - port %d", __FUNCTION__, port->number);
539
540 if (tport == NULL)
541 return -ENODEV;
542
543 dev = port->serial->dev;
544 tdev = tport->tp_tdev;
545
546 /* only one open on any port on a device at a time */
547 if (down_interruptible(&tdev->td_open_close_sem))
548 return -ERESTARTSYS;
549
550 if (port->tty)
551 port->tty->low_latency =
552 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
553
554 port_number = port->number - port->serial->minor;
555
556 memset(&(tport->tp_icount), 0x00, sizeof(tport->tp_icount));
557
558 tport->tp_msr = 0;
559 tport->tp_shadow_mcr |= (TI_MCR_RTS | TI_MCR_DTR);
560
561 /* start interrupt urb the first time a port is opened on this device */
562 if (tdev->td_open_port_count == 0) {
563 dbg("%s - start interrupt in urb", __FUNCTION__);
564 urb = tdev->td_serial->port[0]->interrupt_in_urb;
565 if (!urb) {
566 dev_err(&port->dev, "%s - no interrupt urb\n", __FUNCTION__);
567 status = -EINVAL;
568 goto up_sem;
569 }
570 urb->complete = ti_interrupt_callback;
571 urb->context = tdev;
572 urb->dev = dev;
573 status = usb_submit_urb(urb, GFP_KERNEL);
574 if (status) {
575 dev_err(&port->dev, "%s - submit interrupt urb failed, %d\n", __FUNCTION__, status);
576 goto up_sem;
577 }
578 }
579
580 ti_set_termios(port, NULL);
581
582 dbg("%s - sending TI_OPEN_PORT", __FUNCTION__);
583 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
584 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0);
585 if (status) {
586 dev_err(&port->dev, "%s - cannot send open command, %d\n", __FUNCTION__, status);
587 goto unlink_int_urb;
588 }
589
590 dbg("%s - sending TI_START_PORT", __FUNCTION__);
591 status = ti_command_out_sync(tdev, TI_START_PORT,
592 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
593 if (status) {
594 dev_err(&port->dev, "%s - cannot send start command, %d\n", __FUNCTION__, status);
595 goto unlink_int_urb;
596 }
597
598 dbg("%s - sending TI_PURGE_PORT", __FUNCTION__);
599 status = ti_command_out_sync(tdev, TI_PURGE_PORT,
600 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_INPUT, NULL, 0);
601 if (status) {
602 dev_err(&port->dev, "%s - cannot clear input buffers, %d\n", __FUNCTION__, status);
603 goto unlink_int_urb;
604 }
605 status = ti_command_out_sync(tdev, TI_PURGE_PORT,
606 (__u8)(TI_UART1_PORT + port_number), TI_PURGE_OUTPUT, NULL, 0);
607 if (status) {
608 dev_err(&port->dev, "%s - cannot clear output buffers, %d\n", __FUNCTION__, status);
609 goto unlink_int_urb;
610 }
611
612 /* reset the data toggle on the bulk endpoints to work around bug in
613 * host controllers where things get out of sync some times */
614 usb_clear_halt(dev, port->write_urb->pipe);
615 usb_clear_halt(dev, port->read_urb->pipe);
616
617 ti_set_termios(port, NULL);
618
619 dbg("%s - sending TI_OPEN_PORT (2)", __FUNCTION__);
620 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
621 (__u8)(TI_UART1_PORT + port_number), open_settings, NULL, 0);
622 if (status) {
623 dev_err(&port->dev, "%s - cannot send open command (2), %d\n", __FUNCTION__, status);
624 goto unlink_int_urb;
625 }
626
627 dbg("%s - sending TI_START_PORT (2)", __FUNCTION__);
628 status = ti_command_out_sync(tdev, TI_START_PORT,
629 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
630 if (status) {
631 dev_err(&port->dev, "%s - cannot send start command (2), %d\n", __FUNCTION__, status);
632 goto unlink_int_urb;
633 }
634
635 /* start read urb */
636 dbg("%s - start read urb", __FUNCTION__);
637 urb = port->read_urb;
638 if (!urb) {
639 dev_err(&port->dev, "%s - no read urb\n", __FUNCTION__);
640 status = -EINVAL;
641 goto unlink_int_urb;
642 }
643 tport->tp_read_urb_state = TI_READ_URB_RUNNING;
644 urb->complete = ti_bulk_in_callback;
645 urb->context = tport;
646 urb->dev = dev;
647 status = usb_submit_urb(urb, GFP_KERNEL);
648 if (status) {
649 dev_err(&port->dev, "%s - submit read urb failed, %d\n", __FUNCTION__, status);
650 goto unlink_int_urb;
651 }
652
653 tport->tp_is_open = 1;
654 ++tdev->td_open_port_count;
655
656 goto up_sem;
657
658unlink_int_urb:
659 if (tdev->td_open_port_count == 0)
660 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
661up_sem:
662 up(&tdev->td_open_close_sem);
663 dbg("%s - exit %d", __FUNCTION__, status);
664 return status;
665}
666
667
668static void ti_close(struct usb_serial_port *port, struct file *file)
669{
670 struct ti_device *tdev;
671 struct ti_port *tport;
672 int port_number;
673 int status;
674 int do_up;
675
676 dbg("%s - port %d", __FUNCTION__, port->number);
677
678 tdev = usb_get_serial_data(port->serial);
679 tport = usb_get_serial_port_data(port);
680 if (tdev == NULL || tport == NULL)
681 return;
682
683 tport->tp_is_open = 0;
684
685 ti_drain(tport, (tport->tp_closing_wait*HZ)/100, 1);
686
687 usb_kill_urb(port->read_urb);
688 usb_kill_urb(port->write_urb);
689 tport->tp_write_urb_in_use = 0;
690
691 port_number = port->number - port->serial->minor;
692
693 dbg("%s - sending TI_CLOSE_PORT", __FUNCTION__);
694 status = ti_command_out_sync(tdev, TI_CLOSE_PORT,
695 (__u8)(TI_UART1_PORT + port_number), 0, NULL, 0);
696 if (status)
697 dev_err(&port->dev, "%s - cannot send close port command, %d\n" , __FUNCTION__, status);
698
699 /* if down is interrupted, continue anyway */
700 do_up = !down_interruptible(&tdev->td_open_close_sem);
701 --tport->tp_tdev->td_open_port_count;
702 if (tport->tp_tdev->td_open_port_count <= 0) {
703 /* last port is closed, shut down interrupt urb */
704 usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
705 tport->tp_tdev->td_open_port_count = 0;
706 }
707 if (do_up)
708 up(&tdev->td_open_close_sem);
709
710 dbg("%s - exit", __FUNCTION__);
711}
712
713
714static int ti_write(struct usb_serial_port *port, const unsigned char *data,
715 int count)
716{
717 struct ti_port *tport = usb_get_serial_port_data(port);
718 unsigned long flags;
719
720 dbg("%s - port %d", __FUNCTION__, port->number);
721
722 if (count == 0) {
723 dbg("%s - write request of 0 bytes", __FUNCTION__);
724 return 0;
725 }
726
727 if (tport == NULL || !tport->tp_is_open)
728 return -ENODEV;
729
730 spin_lock_irqsave(&tport->tp_lock, flags);
731 count = ti_buf_put(tport->tp_write_buf, data, count);
732 spin_unlock_irqrestore(&tport->tp_lock, flags);
733
734 ti_send(tport);
735
736 return count;
737}
738
739
740static int ti_write_room(struct usb_serial_port *port)
741{
742 struct ti_port *tport = usb_get_serial_port_data(port);
743 int room = 0;
744 unsigned long flags;
745
746 dbg("%s - port %d", __FUNCTION__, port->number);
747
748 if (tport == NULL)
749 return -ENODEV;
750
751 spin_lock_irqsave(&tport->tp_lock, flags);
752 room = ti_buf_space_avail(tport->tp_write_buf);
753 spin_unlock_irqrestore(&tport->tp_lock, flags);
754
755 dbg("%s - returns %d", __FUNCTION__, room);
756 return room;
757}
758
759
760static int ti_chars_in_buffer(struct usb_serial_port *port)
761{
762 struct ti_port *tport = usb_get_serial_port_data(port);
763 int chars = 0;
764 unsigned long flags;
765
766 dbg("%s - port %d", __FUNCTION__, port->number);
767
768 if (tport == NULL)
769 return -ENODEV;
770
771 spin_lock_irqsave(&tport->tp_lock, flags);
772 chars = ti_buf_data_avail(tport->tp_write_buf);
773 spin_unlock_irqrestore(&tport->tp_lock, flags);
774
775 dbg("%s - returns %d", __FUNCTION__, chars);
776 return chars;
777}
778
779
780static void ti_throttle(struct usb_serial_port *port)
781{
782 struct ti_port *tport = usb_get_serial_port_data(port);
783 struct tty_struct *tty;
784
785 dbg("%s - port %d", __FUNCTION__, port->number);
786
787 if (tport == NULL)
788 return;
789
790 tty = port->tty;
791 if (!tty) {
792 dbg("%s - no tty", __FUNCTION__);
793 return;
794 }
795
796 if (I_IXOFF(tty) || C_CRTSCTS(tty))
797 ti_stop_read(tport, tty);
798
799}
800
801
802static void ti_unthrottle(struct usb_serial_port *port)
803{
804 struct ti_port *tport = usb_get_serial_port_data(port);
805 struct tty_struct *tty;
806 int status;
807
808 dbg("%s - port %d", __FUNCTION__, port->number);
809
810 if (tport == NULL)
811 return;
812
813 tty = port->tty;
814 if (!tty) {
815 dbg("%s - no tty", __FUNCTION__);
816 return;
817 }
818
819 if (I_IXOFF(tty) || C_CRTSCTS(tty)) {
820 status = ti_restart_read(tport, tty);
821 if (status)
822 dev_err(&port->dev, "%s - cannot restart read, %d\n", __FUNCTION__, status);
823 }
824}
825
826
827static int ti_ioctl(struct usb_serial_port *port, struct file *file,
828 unsigned int cmd, unsigned long arg)
829{
830 struct ti_port *tport = usb_get_serial_port_data(port);
831 struct async_icount cnow;
832 struct async_icount cprev;
833
834 dbg("%s - port %d, cmd = 0x%04X", __FUNCTION__, port->number, cmd);
835
836 if (tport == NULL)
837 return -ENODEV;
838
839 switch (cmd) {
840 case TIOCGSERIAL:
841 dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number);
842 return ti_get_serial_info(tport, (struct serial_struct __user *)arg);
843 break;
844
845 case TIOCSSERIAL:
846 dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number);
847 return ti_set_serial_info(tport, (struct serial_struct __user *)arg);
848 break;
849
850 case TIOCMIWAIT:
851 dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number);
852 cprev = tport->tp_icount;
853 while (1) {
854 interruptible_sleep_on(&tport->tp_msr_wait);
855 if (signal_pending(current))
856 return -ERESTARTSYS;
857 cnow = tport->tp_icount;
858 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
859 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
860 return -EIO; /* no change => error */
861 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
862 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
863 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
864 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
865 return 0;
866 }
867 cprev = cnow;
868 }
869 break;
870
871 case TIOCGICOUNT:
872 dbg("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, port->number, tport->tp_icount.rx, tport->tp_icount.tx);
873 if (copy_to_user((void __user *)arg, &tport->tp_icount, sizeof(tport->tp_icount)))
874 return -EFAULT;
875 return 0;
876 }
877
878 return -ENOIOCTLCMD;
879}
880
881
882static void ti_set_termios(struct usb_serial_port *port,
883 struct termios *old_termios)
884{
885 struct ti_port *tport = usb_get_serial_port_data(port);
886 struct tty_struct *tty = port->tty;
887 struct ti_uart_config *config;
888 tcflag_t cflag,iflag;
889 int baud;
890 int status;
891 int port_number = port->number - port->serial->minor;
892 unsigned int mcr;
893
894 dbg("%s - port %d", __FUNCTION__, port->number);
895
896 if (!tty || !tty->termios) {
897 dbg("%s - no tty or termios", __FUNCTION__);
898 return;
899 }
900
901 cflag = tty->termios->c_cflag;
902 iflag = tty->termios->c_iflag;
903
904 if (old_termios && cflag == old_termios->c_cflag
905 && iflag == old_termios->c_iflag) {
906 dbg("%s - nothing to change", __FUNCTION__);
907 return;
908 }
909
910 dbg("%s - clfag %08x, iflag %08x", __FUNCTION__, cflag, iflag);
911
912 if (old_termios)
913 dbg("%s - old clfag %08x, old iflag %08x", __FUNCTION__, old_termios->c_cflag, old_termios->c_iflag);
914
915 if (tport == NULL)
916 return;
917
918 config = kmalloc(sizeof(*config), GFP_KERNEL);
919 if (!config) {
920 dev_err(&port->dev, "%s - out of memory\n", __FUNCTION__);
921 return;
922 }
923
924 config->wFlags = 0;
925
926 /* these flags must be set */
927 config->wFlags |= TI_UART_ENABLE_MS_INTS;
928 config->wFlags |= TI_UART_ENABLE_AUTO_START_DMA;
929 config->bUartMode = (__u8)(tport->tp_uart_mode);
930
931 switch (cflag & CSIZE) {
932 case CS5:
933 config->bDataBits = TI_UART_5_DATA_BITS;
934 break;
935 case CS6:
936 config->bDataBits = TI_UART_6_DATA_BITS;
937 break;
938 case CS7:
939 config->bDataBits = TI_UART_7_DATA_BITS;
940 break;
941 default:
942 case CS8:
943 config->bDataBits = TI_UART_8_DATA_BITS;
944 break;
945 }
946
947 if (cflag & PARENB) {
948 if (cflag & PARODD) {
949 config->wFlags |= TI_UART_ENABLE_PARITY_CHECKING;
950 config->bParity = TI_UART_ODD_PARITY;
951 } else {
952 config->wFlags |= TI_UART_ENABLE_PARITY_CHECKING;
953 config->bParity = TI_UART_EVEN_PARITY;
954 }
955 } else {
956 config->wFlags &= ~TI_UART_ENABLE_PARITY_CHECKING;
957 config->bParity = TI_UART_NO_PARITY;
958 }
959
960 if (cflag & CSTOPB)
961 config->bStopBits = TI_UART_2_STOP_BITS;
962 else
963 config->bStopBits = TI_UART_1_STOP_BITS;
964
965 if (cflag & CRTSCTS) {
966 /* RTS flow control must be off to drop RTS for baud rate B0 */
967 if ((cflag & CBAUD) != B0)
968 config->wFlags |= TI_UART_ENABLE_RTS_IN;
969 config->wFlags |= TI_UART_ENABLE_CTS_OUT;
970 } else {
971 tty->hw_stopped = 0;
972 ti_restart_read(tport, tty);
973 }
974
975 if (I_IXOFF(tty) || I_IXON(tty)) {
976 config->cXon = START_CHAR(tty);
977 config->cXoff = STOP_CHAR(tty);
978
979 if (I_IXOFF(tty))
980 config->wFlags |= TI_UART_ENABLE_X_IN;
981 else
982 ti_restart_read(tport, tty);
983
984 if (I_IXON(tty))
985 config->wFlags |= TI_UART_ENABLE_X_OUT;
986 }
987
988 baud = tty_get_baud_rate(tty);
989 if (!baud) baud = 9600;
990 if (tport->tp_tdev->td_is_3410)
991 config->wBaudRate = (__u16)((923077 + baud/2) / baud);
992 else
993 config->wBaudRate = (__u16)((461538 + baud/2) / baud);
994
995 dbg("%s - BaudRate=%d, wBaudRate=%d, wFlags=0x%04X, bDataBits=%d, bParity=%d, bStopBits=%d, cXon=%d, cXoff=%d, bUartMode=%d",
996 __FUNCTION__, baud, config->wBaudRate, config->wFlags, config->bDataBits, config->bParity, config->bStopBits, config->cXon, config->cXoff, config->bUartMode);
997
998 cpu_to_be16s(&config->wBaudRate);
999 cpu_to_be16s(&config->wFlags);
1000
1001 status = ti_command_out_sync(tport->tp_tdev, TI_SET_CONFIG,
1002 (__u8)(TI_UART1_PORT + port_number), 0, (__u8 *)config,
1003 sizeof(*config));
1004 if (status)
1005 dev_err(&port->dev, "%s - cannot set config on port %d, %d\n", __FUNCTION__, port_number, status);
1006
1007 /* SET_CONFIG asserts RTS and DTR, reset them correctly */
1008 mcr = tport->tp_shadow_mcr;
1009 /* if baud rate is B0, clear RTS and DTR */
1010 if ((cflag & CBAUD) == B0)
1011 mcr &= ~(TI_MCR_DTR | TI_MCR_RTS);
1012 status = ti_set_mcr(tport, mcr);
1013 if (status)
1014 dev_err(&port->dev, "%s - cannot set modem control on port %d, %d\n", __FUNCTION__, port_number, status);
1015
1016 kfree(config);
1017}
1018
1019
1020static int ti_tiocmget(struct usb_serial_port *port, struct file *file)
1021{
1022 struct ti_port *tport = usb_get_serial_port_data(port);
1023 unsigned int result;
1024 unsigned int msr;
1025 unsigned int mcr;
1026
1027 dbg("%s - port %d", __FUNCTION__, port->number);
1028
1029 if (tport == NULL)
1030 return -ENODEV;
1031
1032 msr = tport->tp_msr;
1033 mcr = tport->tp_shadow_mcr;
1034
1035 result = ((mcr & TI_MCR_DTR) ? TIOCM_DTR : 0)
1036 | ((mcr & TI_MCR_RTS) ? TIOCM_RTS : 0)
1037 | ((mcr & TI_MCR_LOOP) ? TIOCM_LOOP : 0)
1038 | ((msr & TI_MSR_CTS) ? TIOCM_CTS : 0)
1039 | ((msr & TI_MSR_CD) ? TIOCM_CAR : 0)
1040 | ((msr & TI_MSR_RI) ? TIOCM_RI : 0)
1041 | ((msr & TI_MSR_DSR) ? TIOCM_DSR : 0);
1042
1043 dbg("%s - 0x%04X", __FUNCTION__, result);
1044
1045 return result;
1046}
1047
1048
1049static int ti_tiocmset(struct usb_serial_port *port, struct file *file,
1050 unsigned int set, unsigned int clear)
1051{
1052 struct ti_port *tport = usb_get_serial_port_data(port);
1053 unsigned int mcr;
1054
1055 dbg("%s - port %d", __FUNCTION__, port->number);
1056
1057 if (tport == NULL)
1058 return -ENODEV;
1059
1060 mcr = tport->tp_shadow_mcr;
1061
1062 if (set & TIOCM_RTS)
1063 mcr |= TI_MCR_RTS;
1064 if (set & TIOCM_DTR)
1065 mcr |= TI_MCR_DTR;
1066 if (set & TIOCM_LOOP)
1067 mcr |= TI_MCR_LOOP;
1068
1069 if (clear & TIOCM_RTS)
1070 mcr &= ~TI_MCR_RTS;
1071 if (clear & TIOCM_DTR)
1072 mcr &= ~TI_MCR_DTR;
1073 if (clear & TIOCM_LOOP)
1074 mcr &= ~TI_MCR_LOOP;
1075
1076 return ti_set_mcr(tport, mcr);
1077}
1078
1079
1080static void ti_break(struct usb_serial_port *port, int break_state)
1081{
1082 struct ti_port *tport = usb_get_serial_port_data(port);
1083 int status;
1084
1085 dbg("%s - state = %d", __FUNCTION__, break_state);
1086
1087 if (tport == NULL)
1088 return;
1089
1090 ti_drain(tport, (tport->tp_closing_wait*HZ)/100, 0);
1091
1092 status = ti_write_byte(tport->tp_tdev,
1093 tport->tp_uart_base_addr + TI_UART_OFFSET_LCR,
1094 TI_LCR_BREAK, break_state == -1 ? TI_LCR_BREAK : 0);
1095
1096 if (status)
1097 dbg("%s - error setting break, %d", __FUNCTION__, status);
1098}
1099
1100
1101static void ti_interrupt_callback(struct urb *urb, struct pt_regs *regs)
1102{
1103 struct ti_device *tdev = (struct ti_device *)urb->context;
1104 struct usb_serial_port *port;
1105 struct usb_serial *serial = tdev->td_serial;
1106 struct ti_port *tport;
1107 struct device *dev = &urb->dev->dev;
1108 unsigned char *data = urb->transfer_buffer;
1109 int length = urb->actual_length;
1110 int port_number;
1111 int function;
1112 int status;
1113 __u8 msr;
1114
1115 dbg("%s", __FUNCTION__);
1116
1117 switch (urb->status) {
1118 case 0:
1119 break;
1120 case -ECONNRESET:
1121 case -ENOENT:
1122 case -ESHUTDOWN:
1123 dbg("%s - urb shutting down, %d", __FUNCTION__, urb->status);
1124 tdev->td_urb_error = 1;
1125 return;
1126 default:
1127 dev_err(dev, "%s - nonzero urb status, %d\n", __FUNCTION__, urb->status);
1128 tdev->td_urb_error = 1;
1129 goto exit;
1130 }
1131
1132 if (length != 2) {
1133 dbg("%s - bad packet size, %d", __FUNCTION__, length);
1134 goto exit;
1135 }
1136
1137 if (data[0] == TI_CODE_HARDWARE_ERROR) {
1138 dev_err(dev, "%s - hardware error, %d\n", __FUNCTION__, data[1]);
1139 goto exit;
1140 }
1141
1142 port_number = TI_GET_PORT_FROM_CODE(data[0]);
1143 function = TI_GET_FUNC_FROM_CODE(data[0]);
1144
1145 dbg("%s - port_number %d, function %d, data 0x%02X", __FUNCTION__, port_number, function, data[1]);
1146
1147 if (port_number >= serial->num_ports) {
1148 dev_err(dev, "%s - bad port number, %d\n", __FUNCTION__, port_number);
1149 goto exit;
1150 }
1151
1152 port = serial->port[port_number];
1153
1154 tport = usb_get_serial_port_data(port);
1155 if (!tport)
1156 goto exit;
1157
1158 switch (function) {
1159 case TI_CODE_DATA_ERROR:
1160 dev_err(dev, "%s - DATA ERROR, port %d, data 0x%02X\n", __FUNCTION__, port_number, data[1]);
1161 break;
1162
1163 case TI_CODE_MODEM_STATUS:
1164 msr = data[1];
1165 dbg("%s - port %d, msr 0x%02X", __FUNCTION__, port_number, msr);
1166 ti_handle_new_msr(tport, msr);
1167 break;
1168
1169 default:
1170 dev_err(dev, "%s - unknown interrupt code, 0x%02X\n", __FUNCTION__, data[1]);
1171 break;
1172 }
1173
1174exit:
1175 status = usb_submit_urb(urb, GFP_ATOMIC);
1176 if (status)
1177 dev_err(dev, "%s - resubmit interrupt urb failed, %d\n", __FUNCTION__, status);
1178}
1179
1180
1181static void ti_bulk_in_callback(struct urb *urb, struct pt_regs *regs)
1182{
1183 struct ti_port *tport = (struct ti_port *)urb->context;
1184 struct usb_serial_port *port = tport->tp_port;
1185 struct device *dev = &urb->dev->dev;
1186 int status = 0;
1187
1188 dbg("%s", __FUNCTION__);
1189
1190 switch (urb->status) {
1191 case 0:
1192 break;
1193 case -ECONNRESET:
1194 case -ENOENT:
1195 case -ESHUTDOWN:
1196 dbg("%s - urb shutting down, %d", __FUNCTION__, urb->status);
1197 tport->tp_tdev->td_urb_error = 1;
1198 wake_up_interruptible(&tport->tp_write_wait);
1199 return;
1200 default:
1201 dev_err(dev, "%s - nonzero urb status, %d\n", __FUNCTION__, urb->status );
1202 tport->tp_tdev->td_urb_error = 1;
1203 wake_up_interruptible(&tport->tp_write_wait);
1204 }
1205
1206 if (urb->status == -EPIPE)
1207 goto exit;
1208
1209 if (urb->status) {
1210 dev_err(dev, "%s - stopping read!\n", __FUNCTION__);
1211 return;
1212 }
1213
1214 if (port->tty && urb->actual_length) {
1215 usb_serial_debug_data(debug, dev, __FUNCTION__,
1216 urb->actual_length, urb->transfer_buffer);
1217
1218 if (!tport->tp_is_open)
1219 dbg("%s - port closed, dropping data", __FUNCTION__);
1220 else
1221 ti_recv(&urb->dev->dev, port->tty, urb->transfer_buffer,
1222 urb->actual_length);
1223
1224 spin_lock(&tport->tp_lock);
1225 tport->tp_icount.rx += urb->actual_length;
1226 spin_unlock(&tport->tp_lock);
1227 }
1228
1229exit:
1230 /* continue to read unless stopping */
1231 spin_lock(&tport->tp_lock);
1232 if (tport->tp_read_urb_state == TI_READ_URB_RUNNING) {
1233 urb->dev = port->serial->dev;
1234 status = usb_submit_urb(urb, GFP_ATOMIC);
1235 } else if (tport->tp_read_urb_state == TI_READ_URB_STOPPING) {
1236 tport->tp_read_urb_state = TI_READ_URB_STOPPED;
1237 }
1238 spin_unlock(&tport->tp_lock);
1239 if (status)
1240 dev_err(dev, "%s - resubmit read urb failed, %d\n", __FUNCTION__, status);
1241}
1242
1243
1244static void ti_bulk_out_callback(struct urb *urb, struct pt_regs *regs)
1245{
1246 struct ti_port *tport = (struct ti_port *)urb->context;
1247 struct usb_serial_port *port = tport->tp_port;
1248 struct device *dev = &urb->dev->dev;
1249
1250 dbg("%s - port %d", __FUNCTION__, port->number);
1251
1252 tport->tp_write_urb_in_use = 0;
1253
1254 switch (urb->status) {
1255 case 0:
1256 break;
1257 case -ECONNRESET:
1258 case -ENOENT:
1259 case -ESHUTDOWN:
1260 dbg("%s - urb shutting down, %d", __FUNCTION__, urb->status);
1261 tport->tp_tdev->td_urb_error = 1;
1262 wake_up_interruptible(&tport->tp_write_wait);
1263 return;
1264 default:
1265 dev_err(dev, "%s - nonzero urb status, %d\n", __FUNCTION__, urb->status);
1266 tport->tp_tdev->td_urb_error = 1;
1267 wake_up_interruptible(&tport->tp_write_wait);
1268 }
1269
1270 /* send any buffered data */
1271 ti_send(tport);
1272}
1273
1274
1275static void ti_recv(struct device *dev, struct tty_struct *tty,
1276 unsigned char *data, int length)
1277{
1278 int cnt;
1279
1280 do {
1281 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
1282 tty_flip_buffer_push(tty);
1283 if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
1284 dev_err(dev, "%s - dropping data, %d bytes lost\n", __FUNCTION__, length);
1285 return;
1286 }
1287 }
1288 cnt = min(length, TTY_FLIPBUF_SIZE - tty->flip.count);
1289 memcpy(tty->flip.char_buf_ptr, data, cnt);
1290 memset(tty->flip.flag_buf_ptr, 0, cnt);
1291 tty->flip.char_buf_ptr += cnt;
1292 tty->flip.flag_buf_ptr += cnt;
1293 tty->flip.count += cnt;
1294 data += cnt;
1295 length -= cnt;
1296 } while (length > 0);
1297
1298 tty_flip_buffer_push(tty);
1299}
1300
1301
1302static void ti_send(struct ti_port *tport)
1303{
1304 int count, result;
1305 struct usb_serial_port *port = tport->tp_port;
1306 struct tty_struct *tty = port->tty;
1307 unsigned long flags;
1308
1309
1310 dbg("%s - port %d", __FUNCTION__, port->number);
1311
1312 spin_lock_irqsave(&tport->tp_lock, flags);
1313
1314 if (tport->tp_write_urb_in_use) {
1315 spin_unlock_irqrestore(&tport->tp_lock, flags);
1316 return;
1317 }
1318
1319 count = ti_buf_get(tport->tp_write_buf,
1320 port->write_urb->transfer_buffer,
1321 port->bulk_out_size);
1322
1323 if (count == 0) {
1324 spin_unlock_irqrestore(&tport->tp_lock, flags);
1325 return;
1326 }
1327
1328 tport->tp_write_urb_in_use = 1;
1329
1330 spin_unlock_irqrestore(&tport->tp_lock, flags);
1331
1332 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
1333
1334 usb_fill_bulk_urb(port->write_urb, port->serial->dev,
1335 usb_sndbulkpipe(port->serial->dev,
1336 port->bulk_out_endpointAddress),
1337 port->write_urb->transfer_buffer, count,
1338 ti_bulk_out_callback, tport);
1339
1340 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1341 if (result) {
1342 dev_err(&port->dev, "%s - submit write urb failed, %d\n", __FUNCTION__, result);
1343 tport->tp_write_urb_in_use = 0;
1344 /* TODO: reschedule ti_send */
1345 } else {
1346 spin_lock_irqsave(&tport->tp_lock, flags);
1347 tport->tp_icount.tx += count;
1348 spin_unlock_irqrestore(&tport->tp_lock, flags);
1349 }
1350
1351 /* more room in the buffer for new writes, wakeup */
1352 if (tty)
1353 tty_wakeup(tty);
1354 wake_up_interruptible(&tport->tp_write_wait);
1355}
1356
1357
1358static int ti_set_mcr(struct ti_port *tport, unsigned int mcr)
1359{
1360 int status;
1361
1362 status = ti_write_byte(tport->tp_tdev,
1363 tport->tp_uart_base_addr + TI_UART_OFFSET_MCR,
1364 TI_MCR_RTS | TI_MCR_DTR | TI_MCR_LOOP, mcr);
1365
1366 if (!status)
1367 tport->tp_shadow_mcr = mcr;
1368
1369 return status;
1370}
1371
1372
1373static int ti_get_lsr(struct ti_port *tport)
1374{
1375 int size,status;
1376 struct ti_device *tdev = tport->tp_tdev;
1377 struct usb_serial_port *port = tport->tp_port;
1378 int port_number = port->number - port->serial->minor;
1379 struct ti_port_status *data;
1380
1381 dbg("%s - port %d", __FUNCTION__, port->number);
1382
1383 size = sizeof(struct ti_port_status);
1384 data = kmalloc(size, GFP_KERNEL);
1385 if (!data) {
1386 dev_err(&port->dev, "%s - out of memory\n", __FUNCTION__);
1387 return -ENOMEM;
1388 }
1389
1390 status = ti_command_in_sync(tdev, TI_GET_PORT_STATUS,
1391 (__u8)(TI_UART1_PORT+port_number), 0, (__u8 *)data, size);
1392 if (status) {
1393 dev_err(&port->dev, "%s - get port status command failed, %d\n", __FUNCTION__, status);
1394 goto free_data;
1395 }
1396
1397 dbg("%s - lsr 0x%02X", __FUNCTION__, data->bLSR);
1398
1399 tport->tp_lsr = data->bLSR;
1400
1401free_data:
1402 kfree(data);
1403 return status;
1404}
1405
1406
1407static int ti_get_serial_info(struct ti_port *tport,
1408 struct serial_struct __user *ret_arg)
1409{
1410 struct usb_serial_port *port = tport->tp_port;
1411 struct serial_struct ret_serial;
1412
1413 if (!ret_arg)
1414 return -EFAULT;
1415
1416 memset(&ret_serial, 0, sizeof(ret_serial));
1417
1418 ret_serial.type = PORT_16550A;
1419 ret_serial.line = port->serial->minor;
1420 ret_serial.port = port->number - port->serial->minor;
1421 ret_serial.flags = tport->tp_flags;
1422 ret_serial.xmit_fifo_size = TI_WRITE_BUF_SIZE;
1423 ret_serial.baud_base = tport->tp_tdev->td_is_3410 ? 921600 : 460800;
1424 ret_serial.closing_wait = tport->tp_closing_wait;
1425
1426 if (copy_to_user(ret_arg, &ret_serial, sizeof(*ret_arg)))
1427 return -EFAULT;
1428
1429 return 0;
1430}
1431
1432
1433static int ti_set_serial_info(struct ti_port *tport,
1434 struct serial_struct __user *new_arg)
1435{
1436 struct usb_serial_port *port = tport->tp_port;
1437 struct serial_struct new_serial;
1438
1439 if (copy_from_user(&new_serial, new_arg, sizeof(new_serial)))
1440 return -EFAULT;
1441
1442 tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS;
1443 if (port->tty)
1444 port->tty->low_latency =
1445 (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1446 tport->tp_closing_wait = new_serial.closing_wait;
1447
1448 return 0;
1449}
1450
1451
1452static void ti_handle_new_msr(struct ti_port *tport, __u8 msr)
1453{
1454 struct async_icount *icount;
1455 struct tty_struct *tty;
1456 unsigned long flags;
1457
1458 dbg("%s - msr 0x%02X", __FUNCTION__, msr);
1459
1460 if (msr & TI_MSR_DELTA_MASK) {
1461 spin_lock_irqsave(&tport->tp_lock, flags);
1462 icount = &tport->tp_icount;
1463 if (msr & TI_MSR_DELTA_CTS)
1464 icount->cts++;
1465 if (msr & TI_MSR_DELTA_DSR)
1466 icount->dsr++;
1467 if (msr & TI_MSR_DELTA_CD)
1468 icount->dcd++;
1469 if (msr & TI_MSR_DELTA_RI)
1470 icount->rng++;
1471 wake_up_interruptible(&tport->tp_msr_wait);
1472 spin_unlock_irqrestore(&tport->tp_lock, flags);
1473 }
1474
1475 tport->tp_msr = msr & TI_MSR_MASK;
1476
1477 /* handle CTS flow control */
1478 tty = tport->tp_port->tty;
1479 if (tty && C_CRTSCTS(tty)) {
1480 if (msr & TI_MSR_CTS) {
1481 tty->hw_stopped = 0;
1482 tty_wakeup(tty);
1483 } else {
1484 tty->hw_stopped = 1;
1485 }
1486 }
1487}
1488
1489
1490static void ti_drain(struct ti_port *tport, unsigned long timeout, int flush)
1491{
1492 struct ti_device *tdev = tport->tp_tdev;
1493 struct usb_serial_port *port = tport->tp_port;
1494 wait_queue_t wait;
1495 unsigned long flags;
1496
1497 dbg("%s - port %d", __FUNCTION__, port->number);
1498
1499 spin_lock_irqsave(&tport->tp_lock, flags);
1500
1501 /* wait for data to drain from the buffer */
1502 tdev->td_urb_error = 0;
1503 init_waitqueue_entry(&wait, current);
1504 add_wait_queue(&tport->tp_write_wait, &wait);
1505 for (;;) {
1506 set_current_state(TASK_INTERRUPTIBLE);
1507 if (ti_buf_data_avail(tport->tp_write_buf) == 0
1508 || timeout == 0 || signal_pending(current)
1509 || tdev->td_urb_error
1510 || !usb_get_intfdata(port->serial->interface)) /* disconnect */
1511 break;
1512 spin_unlock_irqrestore(&tport->tp_lock, flags);
1513 timeout = schedule_timeout(timeout);
1514 spin_lock_irqsave(&tport->tp_lock, flags);
1515 }
1516 set_current_state(TASK_RUNNING);
1517 remove_wait_queue(&tport->tp_write_wait, &wait);
1518
1519 /* flush any remaining data in the buffer */
1520 if (flush)
1521 ti_buf_clear(tport->tp_write_buf);
1522
1523 spin_unlock_irqrestore(&tport->tp_lock, flags);
1524
1525 /* wait for data to drain from the device */
1526 /* wait for empty tx register, plus 20 ms */
1527 timeout += jiffies;
1528 tport->tp_lsr &= ~TI_LSR_TX_EMPTY;
1529 while ((long)(jiffies - timeout) < 0 && !signal_pending(current)
1530 && !(tport->tp_lsr&TI_LSR_TX_EMPTY) && !tdev->td_urb_error
1531 && usb_get_intfdata(port->serial->interface)) { /* not disconnected */
1532 if (ti_get_lsr(tport))
1533 break;
1534 msleep_interruptible(20);
1535 }
1536}
1537
1538
1539static void ti_stop_read(struct ti_port *tport, struct tty_struct *tty)
1540{
1541 unsigned long flags;
1542
1543 spin_lock_irqsave(&tport->tp_lock, flags);
1544
1545 if (tport->tp_read_urb_state == TI_READ_URB_RUNNING)
1546 tport->tp_read_urb_state = TI_READ_URB_STOPPING;
1547
1548 spin_unlock_irqrestore(&tport->tp_lock, flags);
1549}
1550
1551
1552static int ti_restart_read(struct ti_port *tport, struct tty_struct *tty)
1553{
1554 struct urb *urb;
1555 int status = 0;
1556 unsigned long flags;
1557
1558 spin_lock_irqsave(&tport->tp_lock, flags);
1559
1560 if (tport->tp_read_urb_state == TI_READ_URB_STOPPED) {
1561 urb = tport->tp_port->read_urb;
1562 urb->complete = ti_bulk_in_callback;
1563 urb->context = tport;
1564 urb->dev = tport->tp_port->serial->dev;
1565 status = usb_submit_urb(urb, GFP_KERNEL);
1566 }
1567 tport->tp_read_urb_state = TI_READ_URB_RUNNING;
1568
1569 spin_unlock_irqrestore(&tport->tp_lock, flags);
1570
1571 return status;
1572}
1573
1574
1575static int ti_command_out_sync(struct ti_device *tdev, __u8 command,
1576 __u16 moduleid, __u16 value, __u8 *data, int size)
1577{
1578 int status;
1579
1580 status = usb_control_msg(tdev->td_serial->dev,
1581 usb_sndctrlpipe(tdev->td_serial->dev, 0), command,
1582 (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT),
1583 value, moduleid, data, size, 1000);
1584
1585 if (status == size)
1586 status = 0;
1587
1588 if (status > 0)
1589 status = -ECOMM;
1590
1591 return status;
1592}
1593
1594
1595static int ti_command_in_sync(struct ti_device *tdev, __u8 command,
1596 __u16 moduleid, __u16 value, __u8 *data, int size)
1597{
1598 int status;
1599
1600 status = usb_control_msg(tdev->td_serial->dev,
1601 usb_rcvctrlpipe(tdev->td_serial->dev, 0), command,
1602 (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN),
1603 value, moduleid, data, size, 1000);
1604
1605 if (status == size)
1606 status = 0;
1607
1608 if (status > 0)
1609 status = -ECOMM;
1610
1611 return status;
1612}
1613
1614
1615static int ti_write_byte(struct ti_device *tdev, unsigned long addr,
1616 __u8 mask, __u8 byte)
1617{
1618 int status;
1619 unsigned int size;
1620 struct ti_write_data_bytes *data;
1621 struct device *dev = &tdev->td_serial->dev->dev;
1622
1623 dbg("%s - addr 0x%08lX, mask 0x%02X, byte 0x%02X", __FUNCTION__, addr, mask, byte);
1624
1625 size = sizeof(struct ti_write_data_bytes) + 2;
1626 data = kmalloc(size, GFP_KERNEL);
1627 if (!data) {
1628 dev_err(dev, "%s - out of memory\n", __FUNCTION__);
1629 return -ENOMEM;
1630 }
1631
1632 data->bAddrType = TI_RW_DATA_ADDR_XDATA;
1633 data->bDataType = TI_RW_DATA_BYTE;
1634 data->bDataCounter = 1;
1635 data->wBaseAddrHi = cpu_to_be16(addr>>16);
1636 data->wBaseAddrLo = cpu_to_be16(addr);
1637 data->bData[0] = mask;
1638 data->bData[1] = byte;
1639
1640 status = ti_command_out_sync(tdev, TI_WRITE_DATA, TI_RAM_PORT, 0,
1641 (__u8 *)data, size);
1642
1643 if (status < 0)
1644 dev_err(dev, "%s - failed, %d\n", __FUNCTION__, status);
1645
1646 kfree(data);
1647
1648 return status;
1649}
1650
1651
1652static int ti_download_firmware(struct ti_device *tdev,
1653 unsigned char *firmware, unsigned int firmware_size)
1654{
1655 int status = 0;
1656 int buffer_size;
1657 int pos;
1658 int len;
1659 int done;
1660 __u8 cs = 0;
1661 __u8 *buffer;
1662 struct usb_device *dev = tdev->td_serial->dev;
1663 struct ti_firmware_header *header;
1664 unsigned int pipe = usb_sndbulkpipe(dev,
1665 tdev->td_serial->port[0]->bulk_out_endpointAddress);
1666
1667
1668 buffer_size = TI_FIRMWARE_BUF_SIZE + sizeof(struct ti_firmware_header);
1669 buffer = kmalloc(buffer_size, GFP_KERNEL);
1670 if (!buffer) {
1671 dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
1672 return -ENOMEM;
1673 }
1674
1675 memcpy(buffer, firmware, firmware_size);
1676 memset(buffer+firmware_size, 0xff, buffer_size-firmware_size);
1677
1678 for(pos = sizeof(struct ti_firmware_header); pos < buffer_size; pos++)
1679 cs = (__u8)(cs + buffer[pos]);
1680
1681 header = (struct ti_firmware_header *)buffer;
1682 header->wLength = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_firmware_header)));
1683 header->bCheckSum = cs;
1684
1685 dbg("%s - downloading firmware", __FUNCTION__);
1686 for (pos = 0; pos < buffer_size; pos += done) {
1687 len = min(buffer_size - pos, TI_DOWNLOAD_MAX_PACKET_SIZE);
1688 status = usb_bulk_msg(dev, pipe, buffer+pos, len, &done, 1000);
1689 if (status)
1690 break;
1691 }
1692
1693 kfree(buffer);
1694
1695 if (status) {
1696 dev_err(&dev->dev, "%s - error downloading firmware, %d\n", __FUNCTION__, status);
1697 return status;
1698 }
1699
1700 dbg("%s - download successful", __FUNCTION__);
1701
1702 return 0;
1703}
1704
1705
1706/* Circular Buffer Functions */
1707
1708/*
1709 * ti_buf_alloc
1710 *
1711 * Allocate a circular buffer and all associated memory.
1712 */
1713
1714static struct circ_buf *ti_buf_alloc(void)
1715{
1716 struct circ_buf *cb;
1717
1718 cb = (struct circ_buf *)kmalloc(sizeof(struct circ_buf), GFP_KERNEL);
1719 if (cb == NULL)
1720 return NULL;
1721
1722 cb->buf = kmalloc(TI_WRITE_BUF_SIZE, GFP_KERNEL);
1723 if (cb->buf == NULL) {
1724 kfree(cb);
1725 return NULL;
1726 }
1727
1728 ti_buf_clear(cb);
1729
1730 return cb;
1731}
1732
1733
1734/*
1735 * ti_buf_free
1736 *
1737 * Free the buffer and all associated memory.
1738 */
1739
1740static void ti_buf_free(struct circ_buf *cb)
1741{
1742 kfree(cb->buf);
1743 kfree(cb);
1744}
1745
1746
1747/*
1748 * ti_buf_clear
1749 *
1750 * Clear out all data in the circular buffer.
1751 */
1752
1753static void ti_buf_clear(struct circ_buf *cb)
1754{
1755 cb->head = cb->tail = 0;
1756}
1757
1758
1759/*
1760 * ti_buf_data_avail
1761 *
1762 * Return the number of bytes of data available in the circular
1763 * buffer.
1764 */
1765
1766static int ti_buf_data_avail(struct circ_buf *cb)
1767{
1768 return CIRC_CNT(cb->head,cb->tail,TI_WRITE_BUF_SIZE);
1769}
1770
1771
1772/*
1773 * ti_buf_space_avail
1774 *
1775 * Return the number of bytes of space available in the circular
1776 * buffer.
1777 */
1778
1779static int ti_buf_space_avail(struct circ_buf *cb)
1780{
1781 return CIRC_SPACE(cb->head,cb->tail,TI_WRITE_BUF_SIZE);
1782}
1783
1784
1785/*
1786 * ti_buf_put
1787 *
1788 * Copy data data from a user buffer and put it into the circular buffer.
1789 * Restrict to the amount of space available.
1790 *
1791 * Return the number of bytes copied.
1792 */
1793
1794static int ti_buf_put(struct circ_buf *cb, const char *buf, int count)
1795{
1796 int c, ret = 0;
1797
1798 while (1) {
1799 c = CIRC_SPACE_TO_END(cb->head, cb->tail, TI_WRITE_BUF_SIZE);
1800 if (count < c)
1801 c = count;
1802 if (c <= 0)
1803 break;
1804 memcpy(cb->buf + cb->head, buf, c);
1805 cb->head = (cb->head + c) & (TI_WRITE_BUF_SIZE-1);
1806 buf += c;
1807 count -= c;
1808 ret += c;
1809 }
1810
1811 return ret;
1812}
1813
1814
1815/*
1816 * ti_buf_get
1817 *
1818 * Get data from the circular buffer and copy to the given buffer.
1819 * Restrict to the amount of data available.
1820 *
1821 * Return the number of bytes copied.
1822 */
1823
1824static int ti_buf_get(struct circ_buf *cb, char *buf, int count)
1825{
1826 int c, ret = 0;
1827
1828 while (1) {
1829 c = CIRC_CNT_TO_END(cb->head, cb->tail, TI_WRITE_BUF_SIZE);
1830 if (count < c)
1831 c = count;
1832 if (c <= 0)
1833 break;
1834 memcpy(buf, cb->buf + cb->tail, c);
1835 cb->tail = (cb->tail + c) & (TI_WRITE_BUF_SIZE-1);
1836 buf += c;
1837 count -= c;
1838 ret += c;
1839 }
1840
1841 return ret;
1842}
diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h
new file mode 100644
index 000000000000..02c1aeb9e1b8
--- /dev/null
+++ b/drivers/usb/serial/ti_usb_3410_5052.h
@@ -0,0 +1,224 @@
1/* vi: ts=8 sw=8
2 *
3 * TI 3410/5052 USB Serial Driver Header
4 *
5 * Copyright (C) 2004 Texas Instruments
6 *
7 * This driver is based on the Linux io_ti driver, which is
8 * Copyright (C) 2000-2002 Inside Out Networks
9 * Copyright (C) 2001-2002 Greg Kroah-Hartman
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * For questions or problems with this driver, contact Texas Instruments
17 * technical support, or Al Borchers <alborchers@steinerpoint.com>, or
18 * Peter Berger <pberger@brimson.com>.
19 */
20
21#ifndef _TI_3410_5052_H_
22#define _TI_3410_5052_H_
23
24/* Configuration ids */
25#define TI_BOOT_CONFIG 1
26#define TI_ACTIVE_CONFIG 2
27
28/* Vendor and product ids */
29#define TI_VENDOR_ID 0x0451
30#define TI_3410_PRODUCT_ID 0x3410
31#define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */
32#define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */
33#define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */
34#define TI_5052_FIRMWARE_PRODUCT_ID 0x505F /* firmware is running */
35
36/* Commands */
37#define TI_GET_VERSION 0x01
38#define TI_GET_PORT_STATUS 0x02
39#define TI_GET_PORT_DEV_INFO 0x03
40#define TI_GET_CONFIG 0x04
41#define TI_SET_CONFIG 0x05
42#define TI_OPEN_PORT 0x06
43#define TI_CLOSE_PORT 0x07
44#define TI_START_PORT 0x08
45#define TI_STOP_PORT 0x09
46#define TI_TEST_PORT 0x0A
47#define TI_PURGE_PORT 0x0B
48#define TI_RESET_EXT_DEVICE 0x0C
49#define TI_WRITE_DATA 0x80
50#define TI_READ_DATA 0x81
51#define TI_REQ_TYPE_CLASS 0x82
52
53/* Module identifiers */
54#define TI_I2C_PORT 0x01
55#define TI_IEEE1284_PORT 0x02
56#define TI_UART1_PORT 0x03
57#define TI_UART2_PORT 0x04
58#define TI_RAM_PORT 0x05
59
60/* Modem status */
61#define TI_MSR_DELTA_CTS 0x01
62#define TI_MSR_DELTA_DSR 0x02
63#define TI_MSR_DELTA_RI 0x04
64#define TI_MSR_DELTA_CD 0x08
65#define TI_MSR_CTS 0x10
66#define TI_MSR_DSR 0x20
67#define TI_MSR_RI 0x40
68#define TI_MSR_CD 0x80
69#define TI_MSR_DELTA_MASK 0x0F
70#define TI_MSR_MASK 0xF0
71
72/* Line status */
73#define TI_LSR_OVERRUN_ERROR 0x01
74#define TI_LSR_PARITY_ERROR 0x02
75#define TI_LSR_FRAMING_ERROR 0x04
76#define TI_LSR_BREAK 0x08
77#define TI_LSR_ERROR 0x0F
78#define TI_LSR_RX_FULL 0x10
79#define TI_LSR_TX_EMPTY 0x20
80
81/* Line control */
82#define TI_LCR_BREAK 0x40
83
84/* Modem control */
85#define TI_MCR_LOOP 0x04
86#define TI_MCR_DTR 0x10
87#define TI_MCR_RTS 0x20
88
89/* Mask settings */
90#define TI_UART_ENABLE_RTS_IN 0x0001
91#define TI_UART_DISABLE_RTS 0x0002
92#define TI_UART_ENABLE_PARITY_CHECKING 0x0008
93#define TI_UART_ENABLE_DSR_OUT 0x0010
94#define TI_UART_ENABLE_CTS_OUT 0x0020
95#define TI_UART_ENABLE_X_OUT 0x0040
96#define TI_UART_ENABLE_XA_OUT 0x0080
97#define TI_UART_ENABLE_X_IN 0x0100
98#define TI_UART_ENABLE_DTR_IN 0x0800
99#define TI_UART_DISABLE_DTR 0x1000
100#define TI_UART_ENABLE_MS_INTS 0x2000
101#define TI_UART_ENABLE_AUTO_START_DMA 0x4000
102
103/* Parity */
104#define TI_UART_NO_PARITY 0x00
105#define TI_UART_ODD_PARITY 0x01
106#define TI_UART_EVEN_PARITY 0x02
107#define TI_UART_MARK_PARITY 0x03
108#define TI_UART_SPACE_PARITY 0x04
109
110/* Stop bits */
111#define TI_UART_1_STOP_BITS 0x00
112#define TI_UART_1_5_STOP_BITS 0x01
113#define TI_UART_2_STOP_BITS 0x02
114
115/* Bits per character */
116#define TI_UART_5_DATA_BITS 0x00
117#define TI_UART_6_DATA_BITS 0x01
118#define TI_UART_7_DATA_BITS 0x02
119#define TI_UART_8_DATA_BITS 0x03
120
121/* 232/485 modes */
122#define TI_UART_232 0x00
123#define TI_UART_485_RECEIVER_DISABLED 0x01
124#define TI_UART_485_RECEIVER_ENABLED 0x02
125
126/* Pipe transfer mode and timeout */
127#define TI_PIPE_MODE_CONTINOUS 0x01
128#define TI_PIPE_MODE_MASK 0x03
129#define TI_PIPE_TIMEOUT_MASK 0x7C
130#define TI_PIPE_TIMEOUT_ENABLE 0x80
131
132/* Config struct */
133struct ti_uart_config {
134 __u16 wBaudRate;
135 __u16 wFlags;
136 __u8 bDataBits;
137 __u8 bParity;
138 __u8 bStopBits;
139 char cXon;
140 char cXoff;
141 __u8 bUartMode;
142} __attribute__((packed));
143
144/* Get port status */
145struct ti_port_status {
146 __u8 bCmdCode;
147 __u8 bModuleId;
148 __u8 bErrorCode;
149 __u8 bMSR;
150 __u8 bLSR;
151} __attribute__((packed));
152
153/* Purge modes */
154#define TI_PURGE_OUTPUT 0x00
155#define TI_PURGE_INPUT 0x80
156
157/* Read/Write data */
158#define TI_RW_DATA_ADDR_SFR 0x10
159#define TI_RW_DATA_ADDR_IDATA 0x20
160#define TI_RW_DATA_ADDR_XDATA 0x30
161#define TI_RW_DATA_ADDR_CODE 0x40
162#define TI_RW_DATA_ADDR_GPIO 0x50
163#define TI_RW_DATA_ADDR_I2C 0x60
164#define TI_RW_DATA_ADDR_FLASH 0x70
165#define TI_RW_DATA_ADDR_DSP 0x80
166
167#define TI_RW_DATA_UNSPECIFIED 0x00
168#define TI_RW_DATA_BYTE 0x01
169#define TI_RW_DATA_WORD 0x02
170#define TI_RW_DATA_DOUBLE_WORD 0x04
171
172struct ti_write_data_bytes {
173 __u8 bAddrType;
174 __u8 bDataType;
175 __u8 bDataCounter;
176 __be16 wBaseAddrHi;
177 __be16 wBaseAddrLo;
178 __u8 bData[0];
179} __attribute__((packed));
180
181struct ti_read_data_request {
182 __u8 bAddrType;
183 __u8 bDataType;
184 __u8 bDataCounter;
185 __be16 wBaseAddrHi;
186 __be16 wBaseAddrLo;
187} __attribute__((packed));
188
189struct ti_read_data_bytes {
190 __u8 bCmdCode;
191 __u8 bModuleId;
192 __u8 bErrorCode;
193 __u8 bData[0];
194} __attribute__((packed));
195
196/* Interrupt struct */
197struct ti_interrupt {
198 __u8 bICode;
199 __u8 bIInfo;
200} __attribute__((packed));
201
202/* Interrupt codes */
203#define TI_GET_PORT_FROM_CODE(c) (((c) >> 4) - 3)
204#define TI_GET_FUNC_FROM_CODE(c) ((c) & 0x0f)
205#define TI_CODE_HARDWARE_ERROR 0xFF
206#define TI_CODE_DATA_ERROR 0x03
207#define TI_CODE_MODEM_STATUS 0x04
208
209/* Download firmware max packet size */
210#define TI_DOWNLOAD_MAX_PACKET_SIZE 64
211
212/* Firmware image header */
213struct ti_firmware_header {
214 __le16 wLength;
215 __u8 bCheckSum;
216} __attribute__((packed));
217
218/* UART addresses */
219#define TI_UART1_BASE_ADDR 0xFFA0 /* UART 1 base address */
220#define TI_UART2_BASE_ADDR 0xFFB0 /* UART 2 base address */
221#define TI_UART_OFFSET_LCR 0x0002 /* UART MCR register offset */
222#define TI_UART_OFFSET_MCR 0x0004 /* UART MCR register offset */
223
224#endif /* _TI_3410_5052_H_ */
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
new file mode 100644
index 000000000000..4536f63faaea
--- /dev/null
+++ b/drivers/usb/serial/usb-serial.c
@@ -0,0 +1,1435 @@
1/*
2 * USB Serial Converter driver
3 *
4 * Copyright (C) 1999 - 2004 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
6 * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com)
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version
10 * 2 as published by the Free Software Foundation.
11 *
12 * This driver was originally based on the ACM driver by Armin Fuerst (which was
13 * based on a driver by Brad Keryan)
14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver
16 *
17 * (12/10/2002) gkh
18 * Split the ports off into their own struct device, and added a
19 * usb-serial bus driver.
20 *
21 * (11/19/2002) gkh
22 * removed a few #ifdefs for the generic code and cleaned up the failure
23 * logic in initialization.
24 *
25 * (10/02/2002) gkh
26 * moved the console code to console.c and out of this file.
27 *
28 * (06/05/2002) gkh
29 * moved location of startup() call in serial_probe() until after all
30 * of the port information and endpoints are initialized. This makes
31 * things easier for some drivers.
32 *
33 * (04/10/2002) gkh
34 * added serial_read_proc function which creates a
35 * /proc/tty/driver/usb-serial file.
36 *
37 * (03/27/2002) gkh
38 * Got USB serial console code working properly and merged into the main
39 * version of the tree. Thanks to Randy Dunlap for the initial version
40 * of this code, and for pushing me to finish it up.
41 * The USB serial console works with any usb serial driver device.
42 *
43 * (03/21/2002) gkh
44 * Moved all manipulation of port->open_count into the core. Now the
45 * individual driver's open and close functions are called only when the
46 * first open() and last close() is called. Making the drivers a bit
47 * smaller and simpler.
48 * Fixed a bug if a driver didn't have the owner field set.
49 *
50 * (02/26/2002) gkh
51 * Moved all locking into the main serial_* functions, instead of having
52 * the individual drivers have to grab the port semaphore. This should
53 * reduce races.
54 * Reworked the MOD_INC logic a bit to always increment and decrement, even
55 * if the generic driver is being used.
56 *
57 * (10/10/2001) gkh
58 * usb_serial_disconnect() now sets the serial->dev pointer is to NULL to
59 * help prevent child drivers from accessing the device since it is now
60 * gone.
61 *
62 * (09/13/2001) gkh
63 * Moved generic driver initialize after we have registered with the USB
64 * core. Thanks to Randy Dunlap for pointing this problem out.
65 *
66 * (07/03/2001) gkh
67 * Fixed module paramater size. Thanks to John Brockmeyer for the pointer.
68 * Fixed vendor and product getting defined through the MODULE_PARM macro
69 * if the Generic driver wasn't compiled in.
70 * Fixed problem with generic_shutdown() not being called for drivers that
71 * don't have a shutdown() function.
72 *
73 * (06/06/2001) gkh
74 * added evil hack that is needed for the prolific pl2303 device due to the
75 * crazy way its endpoints are set up.
76 *
77 * (05/30/2001) gkh
78 * switched from using spinlock to a semaphore, which fixes lots of problems.
79 *
80 * (04/08/2001) gb
81 * Identify version on module load.
82 *
83 * 2001_02_05 gkh
84 * Fixed buffer overflows bug with the generic serial driver. Thanks to
85 * Todd Squires <squirest@ct0.com> for fixing this.
86 *
87 * (01/10/2001) gkh
88 * Fixed bug where the generic serial adaptor grabbed _any_ device that was
89 * offered to it.
90 *
91 * (12/12/2000) gkh
92 * Removed MOD_INC and MOD_DEC from poll and disconnect functions, and
93 * moved them to the serial_open and serial_close functions.
94 * Also fixed bug with there not being a MOD_DEC for the generic driver
95 * (thanks to Gary Brubaker for finding this.)
96 *
97 * (11/29/2000) gkh
98 * Small NULL pointer initialization cleanup which saves a bit of disk image
99 *
100 * (11/01/2000) Adam J. Richter
101 * instead of using idVendor/idProduct pairs, usb serial drivers
102 * now identify their hardware interest with usb_device_id tables,
103 * which they usually have anyhow for use with MODULE_DEVICE_TABLE.
104 *
105 * (10/05/2000) gkh
106 * Fixed bug with urb->dev not being set properly, now that the usb
107 * core needs it.
108 *
109 * (09/11/2000) gkh
110 * Removed DEBUG #ifdefs with call to usb_serial_debug_data
111 *
112 * (08/28/2000) gkh
113 * Added port_lock to port structure.
114 * Added locks for SMP safeness to generic driver
115 * Fixed the ability to open a generic device's port more than once.
116 *
117 * (07/23/2000) gkh
118 * Added bulk_out_endpointAddress to port structure.
119 *
120 * (07/19/2000) gkh, pberger, and borchers
121 * Modifications to allow usb-serial drivers to be modules.
122 *
123 * (07/03/2000) gkh
124 * Added more debugging to serial_ioctl call
125 *
126 * (06/25/2000) gkh
127 * Changed generic_write_bulk_callback to not call wake_up_interruptible
128 * directly, but to have port_softint do it at a safer time.
129 *
130 * (06/23/2000) gkh
131 * Cleaned up debugging statements in a quest to find UHCI timeout bug.
132 *
133 * (05/22/2000) gkh
134 * Changed the makefile, enabling the big CONFIG_USB_SERIAL_SOMTHING to be
135 * removed from the individual device source files.
136 *
137 * (05/03/2000) gkh
138 * Added the Digi Acceleport driver from Al Borchers and Peter Berger.
139 *
140 * (05/02/2000) gkh
141 * Changed devfs and tty register code to work properly now. This was based on
142 * the ACM driver changes by Vojtech Pavlik.
143 *
144 * (04/27/2000) Ryan VanderBijl
145 * Put calls to *_paranoia_checks into one function.
146 *
147 * (04/23/2000) gkh
148 * Fixed bug that Randy Dunlap found for Generic devices with no bulk out ports.
149 * Moved when the startup code printed out the devices that are supported.
150 *
151 * (04/19/2000) gkh
152 * Added driver for ZyXEL omni.net lcd plus ISDN TA
153 * Made startup info message specify which drivers were compiled in.
154 *
155 * (04/03/2000) gkh
156 * Changed the probe process to remove the module unload races.
157 * Changed where the tty layer gets initialized to have devfs work nicer.
158 * Added initial devfs support.
159 *
160 * (03/26/2000) gkh
161 * Split driver up into device specific pieces.
162 *
163 * (03/19/2000) gkh
164 * Fixed oops that could happen when device was removed while a program
165 * was talking to the device.
166 * Removed the static urbs and now all urbs are created and destroyed
167 * dynamically.
168 * Reworked the internal interface. Now everything is based on the
169 * usb_serial_port structure instead of the larger usb_serial structure.
170 * This fixes the bug that a multiport device could not have more than
171 * one port open at one time.
172 *
173 * (03/17/2000) gkh
174 * Added config option for debugging messages.
175 * Added patch for keyspan pda from Brian Warner.
176 *
177 * (03/06/2000) gkh
178 * Added the keyspan pda code from Brian Warner <warner@lothar.com>
179 * Moved a bunch of the port specific stuff into its own structure. This
180 * is in anticipation of the true multiport devices (there's a bug if you
181 * try to access more than one port of any multiport device right now)
182 *
183 * (02/21/2000) gkh
184 * Made it so that any serial devices only have to specify which functions
185 * they want to overload from the generic function calls (great,
186 * inheritance in C, in a driver, just what I wanted...)
187 * Added support for set_termios and ioctl function calls. No drivers take
188 * advantage of this yet.
189 * Removed the #ifdef MODULE, now there is no module specific code.
190 * Cleaned up a few comments in usb-serial.h that were wrong (thanks again
191 * to Miles Lott).
192 * Small fix to get_free_serial.
193 *
194 * (02/14/2000) gkh
195 * Removed the Belkin and Peracom functionality from the driver due to
196 * the lack of support from the vendor, and me not wanting people to
197 * accidenatly buy the device, expecting it to work with Linux.
198 * Added read_bulk_callback and write_bulk_callback to the type structure
199 * for the needs of the FTDI and WhiteHEAT driver.
200 * Changed all reverences to FTDI to FTDI_SIO at the request of Bill
201 * Ryder.
202 * Changed the output urb size back to the max endpoint size to make
203 * the ftdi_sio driver have it easier, and due to the fact that it didn't
204 * really increase the speed any.
205 *
206 * (02/11/2000) gkh
207 * Added VISOR_FUNCTION_CONSOLE to the visor startup function. This was a
208 * patch from Miles Lott (milos@insync.net).
209 * Fixed bug with not restoring the minor range that a device grabs, if
210 * the startup function fails (thanks Miles for finding this).
211 *
212 * (02/05/2000) gkh
213 * Added initial framework for the Keyspan PDA serial converter so that
214 * Brian Warner has a place to put his code.
215 * Made the ezusb specific functions generic enough that different
216 * devices can use them (whiteheat and keyspan_pda both need them).
217 * Split out a whole bunch of structure and other stuff to a separate
218 * usb-serial.h file.
219 * Made the Visor connection messages a little more understandable, now
220 * that Miles Lott (milos@insync.net) has gotten the Generic channel to
221 * work. Also made them always show up in the log file.
222 *
223 * (01/25/2000) gkh
224 * Added initial framework for FTDI serial converter so that Bill Ryder
225 * has a place to put his code.
226 * Added the vendor specific info from Handspring. Now we can print out
227 * informational debug messages as well as understand what is happening.
228 *
229 * (01/23/2000) gkh
230 * Fixed problem of crash when trying to open a port that didn't have a
231 * device assigned to it. Made the minor node finding a little smarter,
232 * now it looks to find a continuous space for the new device.
233 *
234 * (01/21/2000) gkh
235 * Fixed bug in visor_startup with patch from Miles Lott (milos@insync.net)
236 * Fixed get_serial_by_minor which was all messed up for multi port
237 * devices. Fixed multi port problem for generic devices. Now the number
238 * of ports is determined by the number of bulk out endpoints for the
239 * generic device.
240 *
241 * (01/19/2000) gkh
242 * Removed lots of cruft that was around from the old (pre urb) driver
243 * interface.
244 * Made the serial_table dynamic. This should save lots of memory when
245 * the number of minor nodes goes up to 256.
246 * Added initial support for devices that have more than one port.
247 * Added more debugging comments for the Visor, and added a needed
248 * set_configuration call.
249 *
250 * (01/17/2000) gkh
251 * Fixed the WhiteHEAT firmware (my processing tool had a bug)
252 * and added new debug loader firmware for it.
253 * Removed the put_char function as it isn't really needed.
254 * Added visor startup commands as found by the Win98 dump.
255 *
256 * (01/13/2000) gkh
257 * Fixed the vendor id for the generic driver to the one I meant it to be.
258 *
259 * (01/12/2000) gkh
260 * Forget the version numbering...that's pretty useless...
261 * Made the driver able to be compiled so that the user can select which
262 * converter they want to use. This allows people who only want the Visor
263 * support to not pay the memory size price of the WhiteHEAT.
264 * Fixed bug where the generic driver (idVendor=0000 and idProduct=0000)
265 * grabbed the root hub. Not good.
266 *
267 * version 0.4.0 (01/10/2000) gkh
268 * Added whiteheat.h containing the firmware for the ConnectTech WhiteHEAT
269 * device. Added startup function to allow firmware to be downloaded to
270 * a device if it needs to be.
271 * Added firmware download logic to the WhiteHEAT device.
272 * Started to add #defines to split up the different drivers for potential
273 * configuration option.
274 *
275 * version 0.3.1 (12/30/99) gkh
276 * Fixed problems with urb for bulk out.
277 * Added initial support for multiple sets of endpoints. This enables
278 * the Handspring Visor to be attached successfully. Only the first
279 * bulk in / bulk out endpoint pair is being used right now.
280 *
281 * version 0.3.0 (12/27/99) gkh
282 * Added initial support for the Handspring Visor based on a patch from
283 * Miles Lott (milos@sneety.insync.net)
284 * Cleaned up the code a bunch and converted over to using urbs only.
285 *
286 * version 0.2.3 (12/21/99) gkh
287 * Added initial support for the Connect Tech WhiteHEAT converter.
288 * Incremented the number of ports in expectation of getting the
289 * WhiteHEAT to work properly (4 ports per connection).
290 * Added notification on insertion and removal of what port the
291 * device is/was connected to (and what kind of device it was).
292 *
293 * version 0.2.2 (12/16/99) gkh
294 * Changed major number to the new allocated number. We're legal now!
295 *
296 * version 0.2.1 (12/14/99) gkh
297 * Fixed bug that happens when device node is opened when there isn't a
298 * device attached to it. Thanks to marek@webdesign.no for noticing this.
299 *
300 * version 0.2.0 (11/10/99) gkh
301 * Split up internals to make it easier to add different types of serial
302 * converters to the code.
303 * Added a "generic" driver that gets it's vendor and product id
304 * from when the module is loaded. Thanks to David E. Nelson (dnelson@jump.net)
305 * for the idea and sample code (from the usb scanner driver.)
306 * Cleared up any licensing questions by releasing it under the GNU GPL.
307 *
308 * version 0.1.2 (10/25/99) gkh
309 * Fixed bug in detecting device.
310 *
311 * version 0.1.1 (10/05/99) gkh
312 * Changed the major number to not conflict with anything else.
313 *
314 * version 0.1 (09/28/99) gkh
315 * Can recognize the two different devices and start up a read from
316 * device when asked to. Writes also work. No control signals yet, this
317 * all is vendor specific data (i.e. no spec), also no control for
318 * different baud rates or other bit settings.
319 * Currently we are using the same devid as the acm driver. This needs
320 * to change.
321 *
322 */
323
324#include <linux/config.h>
325#include <linux/kernel.h>
326#include <linux/errno.h>
327#include <linux/init.h>
328#include <linux/slab.h>
329#include <linux/tty.h>
330#include <linux/tty_driver.h>
331#include <linux/tty_flip.h>
332#include <linux/module.h>
333#include <linux/moduleparam.h>
334#include <linux/spinlock.h>
335#include <linux/list.h>
336#include <linux/smp_lock.h>
337#include <asm/uaccess.h>
338#include <linux/usb.h>
339#include "usb-serial.h"
340#include "pl2303.h"
341
342/*
343 * Version Information
344 */
345#define DRIVER_VERSION "v2.0"
346#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"
347#define DRIVER_DESC "USB Serial Driver core"
348
349/* Driver structure we register with the USB core */
350static struct usb_driver usb_serial_driver = {
351 .owner = THIS_MODULE,
352 .name = "usbserial",
353 .probe = usb_serial_probe,
354 .disconnect = usb_serial_disconnect,
355};
356
357/* There is no MODULE_DEVICE_TABLE for usbserial.c. Instead
358 the MODULE_DEVICE_TABLE declarations in each serial driver
359 cause the "hotplug" program to pull in whatever module is necessary
360 via modprobe, and modprobe will load usbserial because the serial
361 drivers depend on it.
362*/
363
364static int debug;
365static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */
366static LIST_HEAD(usb_serial_driver_list);
367
368struct usb_serial *usb_serial_get_by_index(unsigned index)
369{
370 struct usb_serial *serial = serial_table[index];
371
372 if (serial)
373 kref_get(&serial->kref);
374 return serial;
375}
376
377static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_ports, unsigned int *minor)
378{
379 unsigned int i, j;
380 int good_spot;
381
382 dbg("%s %d", __FUNCTION__, num_ports);
383
384 *minor = 0;
385 for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
386 if (serial_table[i])
387 continue;
388
389 good_spot = 1;
390 for (j = 1; j <= num_ports-1; ++j)
391 if ((i+j >= SERIAL_TTY_MINORS) || (serial_table[i+j])) {
392 good_spot = 0;
393 i += j;
394 break;
395 }
396 if (good_spot == 0)
397 continue;
398
399 *minor = i;
400 dbg("%s - minor base = %d", __FUNCTION__, *minor);
401 for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)
402 serial_table[i] = serial;
403 return serial;
404 }
405 return NULL;
406}
407
408static void return_serial(struct usb_serial *serial)
409{
410 int i;
411
412 dbg("%s", __FUNCTION__);
413
414 if (serial == NULL)
415 return;
416
417 for (i = 0; i < serial->num_ports; ++i) {
418 serial_table[serial->minor + i] = NULL;
419 }
420}
421
422static void destroy_serial(struct kref *kref)
423{
424 struct usb_serial *serial;
425 struct usb_serial_port *port;
426 int i;
427
428 serial = to_usb_serial(kref);
429
430 dbg ("%s - %s", __FUNCTION__, serial->type->name);
431
432 serial->type->shutdown(serial);
433
434 /* return the minor range that this device had */
435 return_serial(serial);
436
437 for (i = 0; i < serial->num_ports; ++i)
438 serial->port[i]->open_count = 0;
439
440 /* the ports are cleaned up and released in port_release() */
441 for (i = 0; i < serial->num_ports; ++i)
442 if (serial->port[i]->dev.parent != NULL) {
443 device_unregister(&serial->port[i]->dev);
444 serial->port[i] = NULL;
445 }
446
447 /* If this is a "fake" port, we have to clean it up here, as it will
448 * not get cleaned up in port_release() as it was never registered with
449 * the driver core */
450 if (serial->num_ports < serial->num_port_pointers) {
451 for (i = serial->num_ports; i < serial->num_port_pointers; ++i) {
452 port = serial->port[i];
453 if (!port)
454 continue;
455 usb_kill_urb(port->read_urb);
456 usb_free_urb(port->read_urb);
457 usb_kill_urb(port->write_urb);
458 usb_free_urb(port->write_urb);
459 usb_kill_urb(port->interrupt_in_urb);
460 usb_free_urb(port->interrupt_in_urb);
461 usb_kill_urb(port->interrupt_out_urb);
462 usb_free_urb(port->interrupt_out_urb);
463 kfree(port->bulk_in_buffer);
464 kfree(port->bulk_out_buffer);
465 kfree(port->interrupt_in_buffer);
466 kfree(port->interrupt_out_buffer);
467 }
468 }
469
470 usb_put_dev(serial->dev);
471
472 /* free up any memory that we allocated */
473 kfree (serial);
474}
475
476/*****************************************************************************
477 * Driver tty interface functions
478 *****************************************************************************/
479static int serial_open (struct tty_struct *tty, struct file * filp)
480{
481 struct usb_serial *serial;
482 struct usb_serial_port *port;
483 unsigned int portNumber;
484 int retval;
485
486 dbg("%s", __FUNCTION__);
487
488 /* get the serial object associated with this tty pointer */
489 serial = usb_serial_get_by_index(tty->index);
490 if (!serial) {
491 tty->driver_data = NULL;
492 return -ENODEV;
493 }
494
495 portNumber = tty->index - serial->minor;
496 port = serial->port[portNumber];
497
498 ++port->open_count;
499
500 if (port->open_count == 1) {
501
502 /* set up our port structure making the tty driver
503 * remember our port object, and us it */
504 tty->driver_data = port;
505 port->tty = tty;
506
507 /* lock this module before we call it
508 * this may fail, which means we must bail out,
509 * safe because we are called with BKL held */
510 if (!try_module_get(serial->type->owner)) {
511 retval = -ENODEV;
512 goto bailout_kref_put;
513 }
514
515 /* only call the device specific open if this
516 * is the first time the port is opened */
517 retval = serial->type->open(port, filp);
518 if (retval)
519 goto bailout_module_put;
520 }
521
522 return 0;
523
524bailout_module_put:
525 module_put(serial->type->owner);
526bailout_kref_put:
527 kref_put(&serial->kref, destroy_serial);
528 port->open_count = 0;
529 return retval;
530}
531
532static void serial_close(struct tty_struct *tty, struct file * filp)
533{
534 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
535
536 if (!port)
537 return;
538
539 dbg("%s - port %d", __FUNCTION__, port->number);
540
541 if (port->open_count == 0)
542 return;
543
544 --port->open_count;
545 if (port->open_count == 0) {
546 /* only call the device specific close if this
547 * port is being closed by the last owner */
548 port->serial->type->close(port, filp);
549
550 if (port->tty) {
551 if (port->tty->driver_data)
552 port->tty->driver_data = NULL;
553 port->tty = NULL;
554 }
555
556 module_put(port->serial->type->owner);
557 }
558
559 kref_put(&port->serial->kref, destroy_serial);
560}
561
562static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count)
563{
564 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
565 int retval = -EINVAL;
566
567 dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
568
569 if (!port->open_count) {
570 dbg("%s - port not opened", __FUNCTION__);
571 goto exit;
572 }
573
574 /* pass on to the driver specific version of this function */
575 retval = port->serial->type->write(port, buf, count);
576
577exit:
578 return retval;
579}
580
581static int serial_write_room (struct tty_struct *tty)
582{
583 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
584 int retval = -EINVAL;
585
586 dbg("%s - port %d", __FUNCTION__, port->number);
587
588 if (!port->open_count) {
589 dbg("%s - port not open", __FUNCTION__);
590 goto exit;
591 }
592
593 /* pass on to the driver specific version of this function */
594 retval = port->serial->type->write_room(port);
595
596exit:
597 return retval;
598}
599
600static int serial_chars_in_buffer (struct tty_struct *tty)
601{
602 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
603 int retval = -EINVAL;
604
605 dbg("%s = port %d", __FUNCTION__, port->number);
606
607 if (!port->open_count) {
608 dbg("%s - port not open", __FUNCTION__);
609 goto exit;
610 }
611
612 /* pass on to the driver specific version of this function */
613 retval = port->serial->type->chars_in_buffer(port);
614
615exit:
616 return retval;
617}
618
619static void serial_throttle (struct tty_struct * tty)
620{
621 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
622
623 dbg("%s - port %d", __FUNCTION__, port->number);
624
625 if (!port->open_count) {
626 dbg ("%s - port not open", __FUNCTION__);
627 return;
628 }
629
630 /* pass on to the driver specific version of this function */
631 if (port->serial->type->throttle)
632 port->serial->type->throttle(port);
633}
634
635static void serial_unthrottle (struct tty_struct * tty)
636{
637 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
638
639 dbg("%s - port %d", __FUNCTION__, port->number);
640
641 if (!port->open_count) {
642 dbg("%s - port not open", __FUNCTION__);
643 return;
644 }
645
646 /* pass on to the driver specific version of this function */
647 if (port->serial->type->unthrottle)
648 port->serial->type->unthrottle(port);
649}
650
651static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg)
652{
653 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
654 int retval = -ENODEV;
655
656 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
657
658 if (!port->open_count) {
659 dbg ("%s - port not open", __FUNCTION__);
660 goto exit;
661 }
662
663 /* pass on to the driver specific version of this function if it is available */
664 if (port->serial->type->ioctl)
665 retval = port->serial->type->ioctl(port, file, cmd, arg);
666 else
667 retval = -ENOIOCTLCMD;
668
669exit:
670 return retval;
671}
672
673static void serial_set_termios (struct tty_struct *tty, struct termios * old)
674{
675 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
676
677 dbg("%s - port %d", __FUNCTION__, port->number);
678
679 if (!port->open_count) {
680 dbg("%s - port not open", __FUNCTION__);
681 return;
682 }
683
684 /* pass on to the driver specific version of this function if it is available */
685 if (port->serial->type->set_termios)
686 port->serial->type->set_termios(port, old);
687}
688
689static void serial_break (struct tty_struct *tty, int break_state)
690{
691 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
692
693 dbg("%s - port %d", __FUNCTION__, port->number);
694
695 if (!port->open_count) {
696 dbg("%s - port not open", __FUNCTION__);
697 return;
698 }
699
700 /* pass on to the driver specific version of this function if it is available */
701 if (port->serial->type->break_ctl)
702 port->serial->type->break_ctl(port, break_state);
703}
704
705static int serial_read_proc (char *page, char **start, off_t off, int count, int *eof, void *data)
706{
707 struct usb_serial *serial;
708 int length = 0;
709 int i;
710 off_t begin = 0;
711 char tmp[40];
712
713 dbg("%s", __FUNCTION__);
714 length += sprintf (page, "usbserinfo:1.0 driver:%s\n", DRIVER_VERSION);
715 for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
716 serial = usb_serial_get_by_index(i);
717 if (serial == NULL)
718 continue;
719
720 length += sprintf (page+length, "%d:", i);
721 if (serial->type->owner)
722 length += sprintf (page+length, " module:%s", module_name(serial->type->owner));
723 length += sprintf (page+length, " name:\"%s\"", serial->type->name);
724 length += sprintf (page+length, " vendor:%04x product:%04x",
725 le16_to_cpu(serial->dev->descriptor.idVendor),
726 le16_to_cpu(serial->dev->descriptor.idProduct));
727 length += sprintf (page+length, " num_ports:%d", serial->num_ports);
728 length += sprintf (page+length, " port:%d", i - serial->minor + 1);
729
730 usb_make_path(serial->dev, tmp, sizeof(tmp));
731 length += sprintf (page+length, " path:%s", tmp);
732
733 length += sprintf (page+length, "\n");
734 if ((length + begin) > (off + count))
735 goto done;
736 if ((length + begin) < off) {
737 begin += length;
738 length = 0;
739 }
740 kref_put(&serial->kref, destroy_serial);
741 }
742 *eof = 1;
743done:
744 if (off >= (length + begin))
745 return 0;
746 *start = page + (off-begin);
747 return ((count < begin+length-off) ? count : begin+length-off);
748}
749
750static int serial_tiocmget (struct tty_struct *tty, struct file *file)
751{
752 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
753
754 dbg("%s - port %d", __FUNCTION__, port->number);
755
756 if (!port->open_count) {
757 dbg("%s - port not open", __FUNCTION__);
758 goto exit;
759 }
760
761 if (port->serial->type->tiocmget)
762 return port->serial->type->tiocmget(port, file);
763
764exit:
765 return -EINVAL;
766}
767
768static int serial_tiocmset (struct tty_struct *tty, struct file *file,
769 unsigned int set, unsigned int clear)
770{
771 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
772
773 dbg("%s - port %d", __FUNCTION__, port->number);
774
775 if (!port->open_count) {
776 dbg("%s - port not open", __FUNCTION__);
777 goto exit;
778 }
779
780 if (port->serial->type->tiocmset)
781 return port->serial->type->tiocmset(port, file, set, clear);
782
783exit:
784 return -EINVAL;
785}
786
787void usb_serial_port_softint(void *private)
788{
789 struct usb_serial_port *port = (struct usb_serial_port *)private;
790 struct tty_struct *tty;
791
792 dbg("%s - port %d", __FUNCTION__, port->number);
793
794 if (!port)
795 return;
796
797 tty = port->tty;
798 if (!tty)
799 return;
800
801 tty_wakeup(tty);
802}
803
804static void port_release(struct device *dev)
805{
806 struct usb_serial_port *port = to_usb_serial_port(dev);
807
808 dbg ("%s - %s", __FUNCTION__, dev->bus_id);
809 usb_kill_urb(port->read_urb);
810 usb_free_urb(port->read_urb);
811 usb_kill_urb(port->write_urb);
812 usb_free_urb(port->write_urb);
813 usb_kill_urb(port->interrupt_in_urb);
814 usb_free_urb(port->interrupt_in_urb);
815 usb_kill_urb(port->interrupt_out_urb);
816 usb_free_urb(port->interrupt_out_urb);
817 kfree(port->bulk_in_buffer);
818 kfree(port->bulk_out_buffer);
819 kfree(port->interrupt_in_buffer);
820 kfree(port->interrupt_out_buffer);
821 kfree(port);
822}
823
824static struct usb_serial * create_serial (struct usb_device *dev,
825 struct usb_interface *interface,
826 struct usb_serial_device_type *type)
827{
828 struct usb_serial *serial;
829
830 serial = kmalloc (sizeof (*serial), GFP_KERNEL);
831 if (!serial) {
832 dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
833 return NULL;
834 }
835 memset (serial, 0, sizeof(*serial));
836 serial->dev = usb_get_dev(dev);
837 serial->type = type;
838 serial->interface = interface;
839 kref_init(&serial->kref);
840
841 return serial;
842}
843
844static struct usb_serial_device_type *search_serial_device(struct usb_interface *iface)
845{
846 struct list_head *p;
847 const struct usb_device_id *id;
848 struct usb_serial_device_type *t;
849
850 /* List trough know devices and see if the usb id matches */
851 list_for_each(p, &usb_serial_driver_list) {
852 t = list_entry(p, struct usb_serial_device_type, driver_list);
853 id = usb_match_id(iface, t->id_table);
854 if (id != NULL) {
855 dbg("descriptor matches");
856 return t;
857 }
858 }
859
860 return NULL;
861}
862
863int usb_serial_probe(struct usb_interface *interface,
864 const struct usb_device_id *id)
865{
866 struct usb_device *dev = interface_to_usbdev (interface);
867 struct usb_serial *serial = NULL;
868 struct usb_serial_port *port;
869 struct usb_host_interface *iface_desc;
870 struct usb_endpoint_descriptor *endpoint;
871 struct usb_endpoint_descriptor *interrupt_in_endpoint[MAX_NUM_PORTS];
872 struct usb_endpoint_descriptor *interrupt_out_endpoint[MAX_NUM_PORTS];
873 struct usb_endpoint_descriptor *bulk_in_endpoint[MAX_NUM_PORTS];
874 struct usb_endpoint_descriptor *bulk_out_endpoint[MAX_NUM_PORTS];
875 struct usb_serial_device_type *type = NULL;
876 int retval;
877 int minor;
878 int buffer_size;
879 int i;
880 int num_interrupt_in = 0;
881 int num_interrupt_out = 0;
882 int num_bulk_in = 0;
883 int num_bulk_out = 0;
884 int num_ports = 0;
885 int max_endpoints;
886
887 type = search_serial_device(interface);
888 if (!type) {
889 dbg("none matched");
890 return -ENODEV;
891 }
892
893 serial = create_serial (dev, interface, type);
894 if (!serial) {
895 dev_err(&interface->dev, "%s - out of memory\n", __FUNCTION__);
896 return -ENOMEM;
897 }
898
899 /* if this device type has a probe function, call it */
900 if (type->probe) {
901 const struct usb_device_id *id;
902
903 if (!try_module_get(type->owner)) {
904 dev_err(&interface->dev, "module get failed, exiting\n");
905 kfree (serial);
906 return -EIO;
907 }
908
909 id = usb_match_id(interface, type->id_table);
910 retval = type->probe(serial, id);
911 module_put(type->owner);
912
913 if (retval) {
914 dbg ("sub driver rejected device");
915 kfree (serial);
916 return retval;
917 }
918 }
919
920 /* descriptor matches, let's find the endpoints needed */
921 /* check out the endpoints */
922 iface_desc = interface->cur_altsetting;
923 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
924 endpoint = &iface_desc->endpoint[i].desc;
925
926 if ((endpoint->bEndpointAddress & 0x80) &&
927 ((endpoint->bmAttributes & 3) == 0x02)) {
928 /* we found a bulk in endpoint */
929 dbg("found bulk in on endpoint %d", i);
930 bulk_in_endpoint[num_bulk_in] = endpoint;
931 ++num_bulk_in;
932 }
933
934 if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
935 ((endpoint->bmAttributes & 3) == 0x02)) {
936 /* we found a bulk out endpoint */
937 dbg("found bulk out on endpoint %d", i);
938 bulk_out_endpoint[num_bulk_out] = endpoint;
939 ++num_bulk_out;
940 }
941
942 if ((endpoint->bEndpointAddress & 0x80) &&
943 ((endpoint->bmAttributes & 3) == 0x03)) {
944 /* we found a interrupt in endpoint */
945 dbg("found interrupt in on endpoint %d", i);
946 interrupt_in_endpoint[num_interrupt_in] = endpoint;
947 ++num_interrupt_in;
948 }
949
950 if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
951 ((endpoint->bmAttributes & 3) == 0x03)) {
952 /* we found an interrupt out endpoint */
953 dbg("found interrupt out on endpoint %d", i);
954 interrupt_out_endpoint[num_interrupt_out] = endpoint;
955 ++num_interrupt_out;
956 }
957 }
958
959#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
960 /* BEGIN HORRIBLE HACK FOR PL2303 */
961 /* this is needed due to the looney way its endpoints are set up */
962 if (((le16_to_cpu(dev->descriptor.idVendor) == PL2303_VENDOR_ID) &&
963 (le16_to_cpu(dev->descriptor.idProduct) == PL2303_PRODUCT_ID)) ||
964 ((le16_to_cpu(dev->descriptor.idVendor) == ATEN_VENDOR_ID) &&
965 (le16_to_cpu(dev->descriptor.idProduct) == ATEN_PRODUCT_ID))) {
966 if (interface != dev->actconfig->interface[0]) {
967 /* check out the endpoints of the other interface*/
968 iface_desc = dev->actconfig->interface[0]->cur_altsetting;
969 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
970 endpoint = &iface_desc->endpoint[i].desc;
971 if ((endpoint->bEndpointAddress & 0x80) &&
972 ((endpoint->bmAttributes & 3) == 0x03)) {
973 /* we found a interrupt in endpoint */
974 dbg("found interrupt in for Prolific device on separate interface");
975 interrupt_in_endpoint[num_interrupt_in] = endpoint;
976 ++num_interrupt_in;
977 }
978 }
979 }
980
981 /* Now make sure the PL-2303 is configured correctly.
982 * If not, give up now and hope this hack will work
983 * properly during a later invocation of usb_serial_probe
984 */
985 if (num_bulk_in == 0 || num_bulk_out == 0) {
986 dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
987 kfree (serial);
988 return -ENODEV;
989 }
990 }
991 /* END HORRIBLE HACK FOR PL2303 */
992#endif
993
994 /* found all that we need */
995 dev_info(&interface->dev, "%s converter detected\n", type->name);
996
997#ifdef CONFIG_USB_SERIAL_GENERIC
998 if (type == &usb_serial_generic_device) {
999 num_ports = num_bulk_out;
1000 if (num_ports == 0) {
1001 dev_err(&interface->dev, "Generic device with no bulk out, not allowed.\n");
1002 kfree (serial);
1003 return -EIO;
1004 }
1005 }
1006#endif
1007 if (!num_ports) {
1008 /* if this device type has a calc_num_ports function, call it */
1009 if (type->calc_num_ports) {
1010 if (!try_module_get(type->owner)) {
1011 dev_err(&interface->dev, "module get failed, exiting\n");
1012 kfree (serial);
1013 return -EIO;
1014 }
1015 num_ports = type->calc_num_ports (serial);
1016 module_put(type->owner);
1017 }
1018 if (!num_ports)
1019 num_ports = type->num_ports;
1020 }
1021
1022 if (get_free_serial (serial, num_ports, &minor) == NULL) {
1023 dev_err(&interface->dev, "No more free serial devices\n");
1024 kfree (serial);
1025 return -ENOMEM;
1026 }
1027
1028 serial->minor = minor;
1029 serial->num_ports = num_ports;
1030 serial->num_bulk_in = num_bulk_in;
1031 serial->num_bulk_out = num_bulk_out;
1032 serial->num_interrupt_in = num_interrupt_in;
1033 serial->num_interrupt_out = num_interrupt_out;
1034
1035 /* create our ports, we need as many as the max endpoints */
1036 /* we don't use num_ports here cauz some devices have more endpoint pairs than ports */
1037 max_endpoints = max(num_bulk_in, num_bulk_out);
1038 max_endpoints = max(max_endpoints, num_interrupt_in);
1039 max_endpoints = max(max_endpoints, num_interrupt_out);
1040 max_endpoints = max(max_endpoints, (int)serial->num_ports);
1041 serial->num_port_pointers = max_endpoints;
1042 dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints);
1043 for (i = 0; i < max_endpoints; ++i) {
1044 port = kmalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
1045 if (!port)
1046 goto probe_error;
1047 memset(port, 0x00, sizeof(struct usb_serial_port));
1048 port->number = i + serial->minor;
1049 port->serial = serial;
1050 INIT_WORK(&port->work, usb_serial_port_softint, port);
1051 serial->port[i] = port;
1052 }
1053
1054 /* set up the endpoint information */
1055 for (i = 0; i < num_bulk_in; ++i) {
1056 endpoint = bulk_in_endpoint[i];
1057 port = serial->port[i];
1058 port->read_urb = usb_alloc_urb (0, GFP_KERNEL);
1059 if (!port->read_urb) {
1060 dev_err(&interface->dev, "No free urbs available\n");
1061 goto probe_error;
1062 }
1063 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
1064 port->bulk_in_size = buffer_size;
1065 port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
1066 port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
1067 if (!port->bulk_in_buffer) {
1068 dev_err(&interface->dev, "Couldn't allocate bulk_in_buffer\n");
1069 goto probe_error;
1070 }
1071 usb_fill_bulk_urb (port->read_urb, dev,
1072 usb_rcvbulkpipe (dev,
1073 endpoint->bEndpointAddress),
1074 port->bulk_in_buffer, buffer_size,
1075 serial->type->read_bulk_callback,
1076 port);
1077 }
1078
1079 for (i = 0; i < num_bulk_out; ++i) {
1080 endpoint = bulk_out_endpoint[i];
1081 port = serial->port[i];
1082 port->write_urb = usb_alloc_urb(0, GFP_KERNEL);
1083 if (!port->write_urb) {
1084 dev_err(&interface->dev, "No free urbs available\n");
1085 goto probe_error;
1086 }
1087 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
1088 port->bulk_out_size = buffer_size;
1089 port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
1090 port->bulk_out_buffer = kmalloc (buffer_size, GFP_KERNEL);
1091 if (!port->bulk_out_buffer) {
1092 dev_err(&interface->dev, "Couldn't allocate bulk_out_buffer\n");
1093 goto probe_error;
1094 }
1095 usb_fill_bulk_urb (port->write_urb, dev,
1096 usb_sndbulkpipe (dev,
1097 endpoint->bEndpointAddress),
1098 port->bulk_out_buffer, buffer_size,
1099 serial->type->write_bulk_callback,
1100 port);
1101 }
1102
1103 if (serial->type->read_int_callback) {
1104 for (i = 0; i < num_interrupt_in; ++i) {
1105 endpoint = interrupt_in_endpoint[i];
1106 port = serial->port[i];
1107 port->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
1108 if (!port->interrupt_in_urb) {
1109 dev_err(&interface->dev, "No free urbs available\n");
1110 goto probe_error;
1111 }
1112 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
1113 port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;
1114 port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
1115 if (!port->interrupt_in_buffer) {
1116 dev_err(&interface->dev, "Couldn't allocate interrupt_in_buffer\n");
1117 goto probe_error;
1118 }
1119 usb_fill_int_urb (port->interrupt_in_urb, dev,
1120 usb_rcvintpipe (dev,
1121 endpoint->bEndpointAddress),
1122 port->interrupt_in_buffer, buffer_size,
1123 serial->type->read_int_callback, port,
1124 endpoint->bInterval);
1125 }
1126 } else if (num_interrupt_in) {
1127 dbg("the device claims to support interrupt in transfers, but read_int_callback is not defined");
1128 }
1129
1130 if (serial->type->write_int_callback) {
1131 for (i = 0; i < num_interrupt_out; ++i) {
1132 endpoint = interrupt_out_endpoint[i];
1133 port = serial->port[i];
1134 port->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
1135 if (!port->interrupt_out_urb) {
1136 dev_err(&interface->dev, "No free urbs available\n");
1137 goto probe_error;
1138 }
1139 buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
1140 port->interrupt_out_size = buffer_size;
1141 port->interrupt_out_endpointAddress = endpoint->bEndpointAddress;
1142 port->interrupt_out_buffer = kmalloc (buffer_size, GFP_KERNEL);
1143 if (!port->interrupt_out_buffer) {
1144 dev_err(&interface->dev, "Couldn't allocate interrupt_out_buffer\n");
1145 goto probe_error;
1146 }
1147 usb_fill_int_urb (port->interrupt_out_urb, dev,
1148 usb_sndintpipe (dev,
1149 endpoint->bEndpointAddress),
1150 port->interrupt_out_buffer, buffer_size,
1151 serial->type->write_int_callback, port,
1152 endpoint->bInterval);
1153 }
1154 } else if (num_interrupt_out) {
1155 dbg("the device claims to support interrupt out transfers, but write_int_callback is not defined");
1156 }
1157
1158 /* if this device type has an attach function, call it */
1159 if (type->attach) {
1160 if (!try_module_get(type->owner)) {
1161 dev_err(&interface->dev, "module get failed, exiting\n");
1162 goto probe_error;
1163 }
1164 retval = type->attach (serial);
1165 module_put(type->owner);
1166 if (retval < 0)
1167 goto probe_error;
1168 if (retval > 0) {
1169 /* quietly accept this device, but don't bind to a serial port
1170 * as it's about to disappear */
1171 goto exit;
1172 }
1173 }
1174
1175 /* register all of the individual ports with the driver core */
1176 for (i = 0; i < num_ports; ++i) {
1177 port = serial->port[i];
1178 port->dev.parent = &interface->dev;
1179 port->dev.driver = NULL;
1180 port->dev.bus = &usb_serial_bus_type;
1181 port->dev.release = &port_release;
1182
1183 snprintf (&port->dev.bus_id[0], sizeof(port->dev.bus_id), "ttyUSB%d", port->number);
1184 dbg ("%s - registering %s", __FUNCTION__, port->dev.bus_id);
1185 device_register (&port->dev);
1186 }
1187
1188 usb_serial_console_init (debug, minor);
1189
1190exit:
1191 /* success */
1192 usb_set_intfdata (interface, serial);
1193 return 0;
1194
1195probe_error:
1196 for (i = 0; i < num_bulk_in; ++i) {
1197 port = serial->port[i];
1198 if (!port)
1199 continue;
1200 if (port->read_urb)
1201 usb_free_urb (port->read_urb);
1202 kfree(port->bulk_in_buffer);
1203 }
1204 for (i = 0; i < num_bulk_out; ++i) {
1205 port = serial->port[i];
1206 if (!port)
1207 continue;
1208 if (port->write_urb)
1209 usb_free_urb (port->write_urb);
1210 kfree(port->bulk_out_buffer);
1211 }
1212 for (i = 0; i < num_interrupt_in; ++i) {
1213 port = serial->port[i];
1214 if (!port)
1215 continue;
1216 if (port->interrupt_in_urb)
1217 usb_free_urb (port->interrupt_in_urb);
1218 kfree(port->interrupt_in_buffer);
1219 }
1220 for (i = 0; i < num_interrupt_out; ++i) {
1221 port = serial->port[i];
1222 if (!port)
1223 continue;
1224 if (port->interrupt_out_urb)
1225 usb_free_urb (port->interrupt_out_urb);
1226 kfree(port->interrupt_out_buffer);
1227 }
1228
1229 /* return the minor range that this device had */
1230 return_serial (serial);
1231
1232 /* free up any memory that we allocated */
1233 for (i = 0; i < serial->num_port_pointers; ++i)
1234 kfree(serial->port[i]);
1235 kfree (serial);
1236 return -EIO;
1237}
1238
1239void usb_serial_disconnect(struct usb_interface *interface)
1240{
1241 int i;
1242 struct usb_serial *serial = usb_get_intfdata (interface);
1243 struct device *dev = &interface->dev;
1244 struct usb_serial_port *port;
1245
1246 dbg ("%s", __FUNCTION__);
1247
1248 usb_set_intfdata (interface, NULL);
1249 if (serial) {
1250 for (i = 0; i < serial->num_ports; ++i) {
1251 port = serial->port[i];
1252 if (port && port->tty)
1253 tty_hangup(port->tty);
1254 }
1255 /* let the last holder of this object
1256 * cause it to be cleaned up */
1257 kref_put(&serial->kref, destroy_serial);
1258 }
1259 dev_info(dev, "device disconnected\n");
1260}
1261
1262static struct tty_operations serial_ops = {
1263 .open = serial_open,
1264 .close = serial_close,
1265 .write = serial_write,
1266 .write_room = serial_write_room,
1267 .ioctl = serial_ioctl,
1268 .set_termios = serial_set_termios,
1269 .throttle = serial_throttle,
1270 .unthrottle = serial_unthrottle,
1271 .break_ctl = serial_break,
1272 .chars_in_buffer = serial_chars_in_buffer,
1273 .read_proc = serial_read_proc,
1274 .tiocmget = serial_tiocmget,
1275 .tiocmset = serial_tiocmset,
1276};
1277
1278struct tty_driver *usb_serial_tty_driver;
1279
1280static int __init usb_serial_init(void)
1281{
1282 int i;
1283 int result;
1284
1285 usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS);
1286 if (!usb_serial_tty_driver)
1287 return -ENOMEM;
1288
1289 /* Initialize our global data */
1290 for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
1291 serial_table[i] = NULL;
1292 }
1293
1294 result = bus_register(&usb_serial_bus_type);
1295 if (result) {
1296 err("%s - registering bus driver failed", __FUNCTION__);
1297 goto exit_bus;
1298 }
1299
1300 /* register the generic driver, if we should */
1301 result = usb_serial_generic_register(debug);
1302 if (result < 0) {
1303 err("%s - registering generic driver failed", __FUNCTION__);
1304 goto exit_generic;
1305 }
1306
1307 usb_serial_tty_driver->owner = THIS_MODULE;
1308 usb_serial_tty_driver->driver_name = "usbserial";
1309 usb_serial_tty_driver->devfs_name = "usb/tts/";
1310 usb_serial_tty_driver->name = "ttyUSB";
1311 usb_serial_tty_driver->major = SERIAL_TTY_MAJOR;
1312 usb_serial_tty_driver->minor_start = 0;
1313 usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1314 usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL;
1315 usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
1316 usb_serial_tty_driver->init_termios = tty_std_termios;
1317 usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1318 tty_set_operations(usb_serial_tty_driver, &serial_ops);
1319 result = tty_register_driver(usb_serial_tty_driver);
1320 if (result) {
1321 err("%s - tty_register_driver failed", __FUNCTION__);
1322 goto exit_reg_driver;
1323 }
1324
1325 /* register the USB driver */
1326 result = usb_register(&usb_serial_driver);
1327 if (result < 0) {
1328 err("%s - usb_register failed", __FUNCTION__);
1329 goto exit_tty;
1330 }
1331
1332 info(DRIVER_DESC " " DRIVER_VERSION);
1333
1334 return result;
1335
1336exit_tty:
1337 tty_unregister_driver(usb_serial_tty_driver);
1338
1339exit_reg_driver:
1340 usb_serial_generic_deregister();
1341
1342exit_generic:
1343 bus_unregister(&usb_serial_bus_type);
1344
1345exit_bus:
1346 err ("%s - returning with error %d", __FUNCTION__, result);
1347 put_tty_driver(usb_serial_tty_driver);
1348 return result;
1349}
1350
1351
1352static void __exit usb_serial_exit(void)
1353{
1354 usb_serial_console_exit();
1355
1356 usb_serial_generic_deregister();
1357
1358 usb_deregister(&usb_serial_driver);
1359 tty_unregister_driver(usb_serial_tty_driver);
1360 put_tty_driver(usb_serial_tty_driver);
1361 bus_unregister(&usb_serial_bus_type);
1362}
1363
1364
1365module_init(usb_serial_init);
1366module_exit(usb_serial_exit);
1367
1368#define set_to_generic_if_null(type, function) \
1369 do { \
1370 if (!type->function) { \
1371 type->function = usb_serial_generic_##function; \
1372 dbg("Had to override the " #function \
1373 " usb serial operation with the generic one.");\
1374 } \
1375 } while (0)
1376
1377static void fixup_generic(struct usb_serial_device_type *device)
1378{
1379 set_to_generic_if_null(device, open);
1380 set_to_generic_if_null(device, write);
1381 set_to_generic_if_null(device, close);
1382 set_to_generic_if_null(device, write_room);
1383 set_to_generic_if_null(device, chars_in_buffer);
1384 set_to_generic_if_null(device, read_bulk_callback);
1385 set_to_generic_if_null(device, write_bulk_callback);
1386 set_to_generic_if_null(device, shutdown);
1387}
1388
1389int usb_serial_register(struct usb_serial_device_type *new_device)
1390{
1391 int retval;
1392
1393 fixup_generic(new_device);
1394
1395 /* Add this device to our list of devices */
1396 list_add(&new_device->driver_list, &usb_serial_driver_list);
1397
1398 retval = usb_serial_bus_register(new_device);
1399 if (retval) {
1400 err("problem %d when registering driver %s", retval, new_device->name);
1401 list_del(&new_device->driver_list);
1402 }
1403 else
1404 info("USB Serial support registered for %s", new_device->name);
1405
1406 return retval;
1407}
1408
1409
1410void usb_serial_deregister(struct usb_serial_device_type *device)
1411{
1412 info("USB Serial deregistering driver %s", device->name);
1413 list_del(&device->driver_list);
1414 usb_serial_bus_deregister(device);
1415}
1416
1417
1418
1419/* If the usb-serial core is built into the core, the usb-serial drivers
1420 need these symbols to load properly as modules. */
1421EXPORT_SYMBOL_GPL(usb_serial_register);
1422EXPORT_SYMBOL_GPL(usb_serial_deregister);
1423EXPORT_SYMBOL_GPL(usb_serial_probe);
1424EXPORT_SYMBOL_GPL(usb_serial_disconnect);
1425EXPORT_SYMBOL_GPL(usb_serial_port_softint);
1426
1427
1428/* Module information */
1429MODULE_AUTHOR( DRIVER_AUTHOR );
1430MODULE_DESCRIPTION( DRIVER_DESC );
1431MODULE_VERSION( DRIVER_VERSION );
1432MODULE_LICENSE("GPL");
1433
1434module_param(debug, bool, S_IRUGO | S_IWUSR);
1435MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h
new file mode 100644
index 000000000000..d1f0c4057fa6
--- /dev/null
+++ b/drivers/usb/serial/usb-serial.h
@@ -0,0 +1,332 @@
1/*
2 * USB Serial Converter driver
3 *
4 * Copyright (C) 1999 - 2004
5 * Greg Kroah-Hartman (greg@kroah.com)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * See Documentation/usb/usb-serial.txt for more information on using this driver
13 *
14 * (03/26/2002) gkh
15 * removed the port->tty check from port_paranoia_check() due to serial
16 * consoles not having a tty device assigned to them.
17 *
18 * (12/03/2001) gkh
19 * removed active from the port structure.
20 * added documentation to the usb_serial_device_type structure
21 *
22 * (10/10/2001) gkh
23 * added vendor and product to serial structure. Needed to determine device
24 * owner when the device is disconnected.
25 *
26 * (05/30/2001) gkh
27 * added sem to port structure and removed port_lock
28 *
29 * (10/05/2000) gkh
30 * Added interrupt_in_endpointAddress and bulk_in_endpointAddress to help
31 * fix bug with urb->dev not being set properly, now that the usb core
32 * needs it.
33 *
34 * (09/11/2000) gkh
35 * Added usb_serial_debug_data function to help get rid of #DEBUG in the
36 * drivers.
37 *
38 * (08/28/2000) gkh
39 * Added port_lock to port structure.
40 *
41 * (08/08/2000) gkh
42 * Added open_count to port structure.
43 *
44 * (07/23/2000) gkh
45 * Added bulk_out_endpointAddress to port structure.
46 *
47 * (07/19/2000) gkh, pberger, and borchers
48 * Modifications to allow usb-serial drivers to be modules.
49 *
50 *
51 */
52
53
54#ifndef __LINUX_USB_SERIAL_H
55#define __LINUX_USB_SERIAL_H
56
57#include <linux/config.h>
58#include <linux/kref.h>
59
60#define SERIAL_TTY_MAJOR 188 /* Nice legal number now */
61#define SERIAL_TTY_MINORS 255 /* loads of devices :) */
62
63#define MAX_NUM_PORTS 8 /* The maximum number of ports one device can grab at once */
64
65/* parity check flag */
66#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
67
68/**
69 * usb_serial_port: structure for the specific ports of a device.
70 * @serial: pointer back to the struct usb_serial owner of this port.
71 * @tty: pointer to the corresponding tty for this port.
72 * @number: the number of the port (the minor number).
73 * @interrupt_in_buffer: pointer to the interrupt in buffer for this port.
74 * @interrupt_in_urb: pointer to the interrupt in struct urb for this port.
75 * @interrupt_in_endpointAddress: endpoint address for the interrupt in pipe
76 * for this port.
77 * @interrupt_out_buffer: pointer to the interrupt out buffer for this port.
78 * @interrupt_out_size: the size of the interrupt_out_buffer, in bytes.
79 * @interrupt_out_urb: pointer to the interrupt out struct urb for this port.
80 * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe
81 * for this port.
82 * @bulk_in_buffer: pointer to the bulk in buffer for this port.
83 * @read_urb: pointer to the bulk in struct urb for this port.
84 * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this
85 * port.
86 * @bulk_out_buffer: pointer to the bulk out buffer for this port.
87 * @bulk_out_size: the size of the bulk_out_buffer, in bytes.
88 * @write_urb: pointer to the bulk out struct urb for this port.
89 * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this
90 * port.
91 * @write_wait: a wait_queue_head_t used by the port.
92 * @work: work queue entry for the line discipline waking up.
93 * @open_count: number of times this port has been opened.
94 *
95 * This structure is used by the usb-serial core and drivers for the specific
96 * ports of a device.
97 */
98struct usb_serial_port {
99 struct usb_serial * serial;
100 struct tty_struct * tty;
101 unsigned char number;
102
103 unsigned char * interrupt_in_buffer;
104 struct urb * interrupt_in_urb;
105 __u8 interrupt_in_endpointAddress;
106
107 unsigned char * interrupt_out_buffer;
108 int interrupt_out_size;
109 struct urb * interrupt_out_urb;
110 __u8 interrupt_out_endpointAddress;
111
112 unsigned char * bulk_in_buffer;
113 int bulk_in_size;
114 struct urb * read_urb;
115 __u8 bulk_in_endpointAddress;
116
117 unsigned char * bulk_out_buffer;
118 int bulk_out_size;
119 struct urb * write_urb;
120 __u8 bulk_out_endpointAddress;
121
122 wait_queue_head_t write_wait;
123 struct work_struct work;
124 int open_count;
125 struct device dev;
126};
127#define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev)
128
129/* get and set the port private data pointer helper functions */
130static inline void *usb_get_serial_port_data (struct usb_serial_port *port)
131{
132 return dev_get_drvdata(&port->dev);
133}
134
135static inline void usb_set_serial_port_data (struct usb_serial_port *port, void *data)
136{
137 dev_set_drvdata(&port->dev, data);
138}
139
140/**
141 * usb_serial - structure used by the usb-serial core for a device
142 * @dev: pointer to the struct usb_device for this device
143 * @type: pointer to the struct usb_serial_device_type for this device
144 * @interface: pointer to the struct usb_interface for this device
145 * @minor: the starting minor number for this device
146 * @num_ports: the number of ports this device has
147 * @num_interrupt_in: number of interrupt in endpoints we have
148 * @num_interrupt_out: number of interrupt out endpoints we have
149 * @num_bulk_in: number of bulk in endpoints we have
150 * @num_bulk_out: number of bulk out endpoints we have
151 * @port: array of struct usb_serial_port structures for the different ports.
152 * @private: place to put any driver specific information that is needed. The
153 * usb-serial driver is required to manage this data, the usb-serial core
154 * will not touch this. Use usb_get_serial_data() and
155 * usb_set_serial_data() to access this.
156 */
157struct usb_serial {
158 struct usb_device * dev;
159 struct usb_serial_device_type * type;
160 struct usb_interface * interface;
161 unsigned char minor;
162 unsigned char num_ports;
163 unsigned char num_port_pointers;
164 char num_interrupt_in;
165 char num_interrupt_out;
166 char num_bulk_in;
167 char num_bulk_out;
168 struct usb_serial_port * port[MAX_NUM_PORTS];
169 struct kref kref;
170 void * private;
171};
172#define to_usb_serial(d) container_of(d, struct usb_serial, kref)
173
174#define NUM_DONT_CARE (-1)
175
176/* get and set the serial private data pointer helper functions */
177static inline void *usb_get_serial_data (struct usb_serial *serial)
178{
179 return serial->private;
180}
181
182static inline void usb_set_serial_data (struct usb_serial *serial, void *data)
183{
184 serial->private = data;
185}
186
187/**
188 * usb_serial_device_type - a structure that defines a usb serial device
189 * @owner: pointer to the module that owns this device.
190 * @name: pointer to a string that describes this device. This string used
191 * in the syslog messages when a device is inserted or removed.
192 * @short_name: a pointer to a string that describes this device in
193 * KOBJ_NAME_LEN characters or less. This is used for the sysfs interface
194 * to describe the driver.
195 * @id_table: pointer to a list of usb_device_id structures that define all
196 * of the devices this structure can support.
197 * @num_interrupt_in: the number of interrupt in endpoints this device will
198 * have.
199 * @num_interrupt_out: the number of interrupt out endpoints this device will
200 * have.
201 * @num_bulk_in: the number of bulk in endpoints this device will have.
202 * @num_bulk_out: the number of bulk out endpoints this device will have.
203 * @num_ports: the number of different ports this device will have.
204 * @calc_num_ports: pointer to a function to determine how many ports this
205 * device has dynamically. It will be called after the probe()
206 * callback is called, but before attach()
207 * @probe: pointer to the driver's probe function.
208 * This will be called when the device is inserted into the system,
209 * but before the device has been fully initialized by the usb_serial
210 * subsystem. Use this function to download any firmware to the device,
211 * or any other early initialization that might be needed.
212 * Return 0 to continue on with the initialization sequence. Anything
213 * else will abort it.
214 * @attach: pointer to the driver's attach function.
215 * This will be called when the struct usb_serial structure is fully set
216 * set up. Do any local initialization of the device, or any private
217 * memory structure allocation at this point in time.
218 * @shutdown: pointer to the driver's shutdown function. This will be
219 * called when the device is removed from the system.
220 *
221 * This structure is defines a USB Serial device. It provides all of
222 * the information that the USB serial core code needs. If the function
223 * pointers are defined, then the USB serial core code will call them when
224 * the corresponding tty port functions are called. If they are not
225 * called, the generic serial function will be used instead.
226 */
227struct usb_serial_device_type {
228 struct module *owner;
229 char *name;
230 char *short_name;
231 const struct usb_device_id *id_table;
232 char num_interrupt_in;
233 char num_interrupt_out;
234 char num_bulk_in;
235 char num_bulk_out;
236 char num_ports;
237
238 struct list_head driver_list;
239 struct device_driver driver;
240
241 int (*probe) (struct usb_serial *serial, const struct usb_device_id *id);
242 int (*attach) (struct usb_serial *serial);
243 int (*calc_num_ports) (struct usb_serial *serial);
244
245 void (*shutdown) (struct usb_serial *serial);
246
247 int (*port_probe) (struct usb_serial_port *port);
248 int (*port_remove) (struct usb_serial_port *port);
249
250 /* serial function calls */
251 int (*open) (struct usb_serial_port *port, struct file * filp);
252 void (*close) (struct usb_serial_port *port, struct file * filp);
253 int (*write) (struct usb_serial_port *port, const unsigned char *buf, int count);
254 int (*write_room) (struct usb_serial_port *port);
255 int (*ioctl) (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
256 void (*set_termios) (struct usb_serial_port *port, struct termios * old);
257 void (*break_ctl) (struct usb_serial_port *port, int break_state);
258 int (*chars_in_buffer) (struct usb_serial_port *port);
259 void (*throttle) (struct usb_serial_port *port);
260 void (*unthrottle) (struct usb_serial_port *port);
261 int (*tiocmget) (struct usb_serial_port *port, struct file *file);
262 int (*tiocmset) (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear);
263
264 void (*read_int_callback)(struct urb *urb, struct pt_regs *regs);
265 void (*write_int_callback)(struct urb *urb, struct pt_regs *regs);
266 void (*read_bulk_callback)(struct urb *urb, struct pt_regs *regs);
267 void (*write_bulk_callback)(struct urb *urb, struct pt_regs *regs);
268};
269#define to_usb_serial_driver(d) container_of(d, struct usb_serial_device_type, driver)
270
271extern int usb_serial_register(struct usb_serial_device_type *new_device);
272extern void usb_serial_deregister(struct usb_serial_device_type *device);
273extern void usb_serial_port_softint(void *private);
274
275extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id);
276extern void usb_serial_disconnect(struct usb_interface *iface);
277
278extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest);
279extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit);
280
281/* USB Serial console functions */
282#ifdef CONFIG_USB_SERIAL_CONSOLE
283extern void usb_serial_console_init (int debug, int minor);
284extern void usb_serial_console_exit (void);
285#else
286static inline void usb_serial_console_init (int debug, int minor) { }
287static inline void usb_serial_console_exit (void) { }
288#endif
289
290/* Functions needed by other parts of the usbserial core */
291extern struct usb_serial *usb_serial_get_by_index (unsigned int minor);
292extern int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp);
293extern int usb_serial_generic_write (struct usb_serial_port *port, const unsigned char *buf, int count);
294extern void usb_serial_generic_close (struct usb_serial_port *port, struct file *filp);
295extern int usb_serial_generic_write_room (struct usb_serial_port *port);
296extern int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port);
297extern void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
298extern void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
299extern void usb_serial_generic_shutdown (struct usb_serial *serial);
300extern int usb_serial_generic_register (int debug);
301extern void usb_serial_generic_deregister (void);
302
303extern int usb_serial_bus_register (struct usb_serial_device_type *device);
304extern void usb_serial_bus_deregister (struct usb_serial_device_type *device);
305
306extern struct usb_serial_device_type usb_serial_generic_device;
307extern struct bus_type usb_serial_bus_type;
308extern struct tty_driver *usb_serial_tty_driver;
309
310static inline void usb_serial_debug_data(int debug,
311 struct device *dev,
312 const char *function, int size,
313 const unsigned char *data)
314{
315 int i;
316
317 if (debug) {
318 dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ", function, size);
319 for (i = 0; i < size; ++i)
320 printk ("%.2x ", data[i]);
321 printk ("\n");
322 }
323}
324
325/* Use our own dbg macro */
326#undef dbg
327#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg); } while (0)
328
329
330
331#endif /* ifdef __LINUX_USB_SERIAL_H */
332
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
new file mode 100644
index 000000000000..69d313e98fad
--- /dev/null
+++ b/drivers/usb/serial/visor.c
@@ -0,0 +1,1161 @@
1/*
2 * USB HandSpring Visor, Palm m50x, and Sony Clie driver
3 * (supports all of the Palm OS USB devices)
4 *
5 * Copyright (C) 1999 - 2004
6 * Greg Kroah-Hartman (greg@kroah.com)
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
14 *
15 * (06/03/2003) Judd Montgomery <judd at jpilot.org>
16 * Added support for module parameter options for untested/unknown
17 * devices.
18 *
19 * (03/09/2003) gkh
20 * Added support for the Sony Clie NZ90V device. Thanks to Martin Brachtl
21 * <brachtl@redgrep.cz> for the information.
22 *
23 * (03/05/2003) gkh
24 * Think Treo support is now working.
25 *
26 * (04/03/2002) gkh
27 * Added support for the Sony OS 4.1 devices. Thanks to Hiroyuki ARAKI
28 * <hiro@zob.ne.jp> for the information.
29 *
30 * (03/27/2002) gkh
31 * Removed assumptions that port->tty was always valid (is not true
32 * for usb serial console devices.)
33 *
34 * (03/23/2002) gkh
35 * Added support for the Palm i705 device, thanks to Thomas Riemer
36 * <tom@netmech.com> for the information.
37 *
38 * (03/21/2002) gkh
39 * Added support for the Palm m130 device, thanks to Udo Eisenbarth
40 * <udo.eisenbarth@web.de> for the information.
41 *
42 * (02/27/2002) gkh
43 * Reworked the urb handling logic. We have no more pool, but dynamically
44 * allocate the urb and the transfer buffer on the fly. In testing this
45 * does not incure any measurable overhead. This also relies on the fact
46 * that we have proper reference counting logic for urbs.
47 *
48 * (02/21/2002) SilaS
49 * Added initial support for the Palm m515 devices.
50 *
51 * (02/14/2002) gkh
52 * Added support for the Clie S-360 device.
53 *
54 * (12/18/2001) gkh
55 * Added better Clie support for 3.5 devices. Thanks to Geoffrey Levand
56 * for the patch.
57 *
58 * (11/11/2001) gkh
59 * Added support for the m125 devices, and added check to prevent oopses
60 * for Clié devices that lie about the number of ports they have.
61 *
62 * (08/30/2001) gkh
63 * Added support for the Clie devices, both the 3.5 and 4.0 os versions.
64 * Many thanks to Daniel Burke, and Bryan Payne for helping with this.
65 *
66 * (08/23/2001) gkh
67 * fixed a few potential bugs pointed out by Oliver Neukum.
68 *
69 * (05/30/2001) gkh
70 * switched from using spinlock to a semaphore, which fixes lots of problems.
71 *
72 * (05/28/2000) gkh
73 * Added initial support for the Palm m500 and Palm m505 devices.
74 *
75 * (04/08/2001) gb
76 * Identify version on module load.
77 *
78 * (01/21/2000) gkh
79 * Added write_room and chars_in_buffer, as they were previously using the
80 * generic driver versions which is all wrong now that we are using an urb
81 * pool. Thanks to Wolfgang Grandegger for pointing this out to me.
82 * Removed count assignment in the write function, which was not needed anymore
83 * either. Thanks to Al Borchers for pointing this out.
84 *
85 * (12/12/2000) gkh
86 * Moved MOD_DEC to end of visor_close to be nicer, as the final write
87 * message can sleep.
88 *
89 * (11/12/2000) gkh
90 * Fixed bug with data being dropped on the floor by forcing tty->low_latency
91 * to be on. Hopefully this fixes the OHCI issue!
92 *
93 * (11/01/2000) Adam J. Richter
94 * usb_device_id table support
95 *
96 * (10/05/2000) gkh
97 * Fixed bug with urb->dev not being set properly, now that the usb
98 * core needs it.
99 *
100 * (09/11/2000) gkh
101 * Got rid of always calling kmalloc for every urb we wrote out to the
102 * device.
103 * Added visor_read_callback so we can keep track of bytes in and out for
104 * those people who like to know the speed of their device.
105 * Removed DEBUG #ifdefs with call to usb_serial_debug_data
106 *
107 * (09/06/2000) gkh
108 * Fixed oops in visor_exit. Need to uncomment usb_unlink_urb call _after_
109 * the host controller drivers set urb->dev = NULL when the urb is finished.
110 *
111 * (08/28/2000) gkh
112 * Added locks for SMP safeness.
113 *
114 * (08/08/2000) gkh
115 * Fixed endian problem in visor_startup.
116 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
117 * than once.
118 *
119 * (07/23/2000) gkh
120 * Added pool of write urbs to speed up transfers to the visor.
121 *
122 * (07/19/2000) gkh
123 * Added module_init and module_exit functions to handle the fact that this
124 * driver is a loadable module now.
125 *
126 * (07/03/2000) gkh
127 * Added visor_set_ioctl and visor_set_termios functions (they don't do much
128 * of anything, but are good for debugging.)
129 *
130 * (06/25/2000) gkh
131 * Fixed bug in visor_unthrottle that should help with the disconnect in PPP
132 * bug that people have been reporting.
133 *
134 * (06/23/2000) gkh
135 * Cleaned up debugging statements in a quest to find UHCI timeout bug.
136 *
137 * (04/27/2000) Ryan VanderBijl
138 * Fixed memory leak in visor_close
139 *
140 * (03/26/2000) gkh
141 * Split driver up into device specific pieces.
142 *
143 */
144
145#include <linux/config.h>
146#include <linux/kernel.h>
147#include <linux/errno.h>
148#include <linux/init.h>
149#include <linux/slab.h>
150#include <linux/tty.h>
151#include <linux/tty_driver.h>
152#include <linux/tty_flip.h>
153#include <linux/module.h>
154#include <linux/moduleparam.h>
155#include <linux/spinlock.h>
156#include <asm/uaccess.h>
157#include <linux/usb.h>
158#include "usb-serial.h"
159#include "visor.h"
160
161/*
162 * Version Information
163 */
164#define DRIVER_VERSION "v2.1"
165#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
166#define DRIVER_DESC "USB HandSpring Visor / Palm OS driver"
167
168/* function prototypes for a handspring visor */
169static int visor_open (struct usb_serial_port *port, struct file *filp);
170static void visor_close (struct usb_serial_port *port, struct file *filp);
171static int visor_write (struct usb_serial_port *port, const unsigned char *buf, int count);
172static int visor_write_room (struct usb_serial_port *port);
173static int visor_chars_in_buffer (struct usb_serial_port *port);
174static void visor_throttle (struct usb_serial_port *port);
175static void visor_unthrottle (struct usb_serial_port *port);
176static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id);
177static int visor_calc_num_ports(struct usb_serial *serial);
178static void visor_shutdown (struct usb_serial *serial);
179static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
180static void visor_set_termios (struct usb_serial_port *port, struct termios *old_termios);
181static void visor_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
182static void visor_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
183static void visor_read_int_callback (struct urb *urb, struct pt_regs *regs);
184static int clie_3_5_startup (struct usb_serial *serial);
185static int treo_attach (struct usb_serial *serial);
186static int clie_5_attach (struct usb_serial *serial);
187static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id);
188static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id);
189
190/* Parameters that may be passed into the module. */
191static int debug;
192static __u16 vendor;
193static __u16 product;
194
195static struct usb_device_id id_table [] = {
196 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID),
197 .driver_info = (kernel_ulong_t)&palm_os_3_probe },
198 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID),
199 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
200 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID),
201 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
202 { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID),
203 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
204 { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID),
205 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
206 { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID),
207 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
208 { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID),
209 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
210 { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID),
211 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
212 { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID),
213 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
214 { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID),
215 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
216 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID),
217 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
218 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID),
219 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
220 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE31_ID),
221 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
222 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID),
223 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
224 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID),
225 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
226 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID),
227 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
228 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID),
229 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
230 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID),
231 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
232 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID),
233 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
234 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID),
235 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
236 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID),
237 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
238 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID),
239 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
240 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID),
241 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
242 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID),
243 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
244 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_7135_ID),
245 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
246 { USB_DEVICE(FOSSIL_VENDOR_ID, FOSSIL_ABACUS_ID),
247 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
248 { }, /* optional parameter entry */
249 { } /* Terminating entry */
250};
251
252static struct usb_device_id clie_id_5_table [] = {
253 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID),
254 .driver_info = (kernel_ulong_t)&palm_os_4_probe },
255 { }, /* optional parameter entry */
256 { } /* Terminating entry */
257};
258
259static struct usb_device_id clie_id_3_5_table [] = {
260 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
261 { } /* Terminating entry */
262};
263
264static struct usb_device_id id_table_combined [] = {
265 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
266 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) },
267 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID) },
268 { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
269 { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
270 { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID) },
271 { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID) },
272 { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID) },
273 { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID) },
274 { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID) },
275 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID) },
276 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID) },
277 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE31_ID) },
278 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID) },
279 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
280 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
281 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) },
282 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
283 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
284 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) },
285 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID) },
286 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID) },
287 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) },
288 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID) },
289 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) },
290 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID) },
291 { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_7135_ID) },
292 { USB_DEVICE(FOSSIL_VENDOR_ID, FOSSIL_ABACUS_ID) },
293 { }, /* optional parameter entry */
294 { } /* Terminating entry */
295};
296
297MODULE_DEVICE_TABLE (usb, id_table_combined);
298
299static struct usb_driver visor_driver = {
300 .owner = THIS_MODULE,
301 .name = "visor",
302 .probe = usb_serial_probe,
303 .disconnect = usb_serial_disconnect,
304 .id_table = id_table_combined,
305};
306
307/* All of the device info needed for the Handspring Visor, and Palm 4.0 devices */
308static struct usb_serial_device_type handspring_device = {
309 .owner = THIS_MODULE,
310 .name = "Handspring Visor / Palm OS",
311 .short_name = "visor",
312 .id_table = id_table,
313 .num_interrupt_in = NUM_DONT_CARE,
314 .num_bulk_in = 2,
315 .num_bulk_out = 2,
316 .num_ports = 2,
317 .open = visor_open,
318 .close = visor_close,
319 .throttle = visor_throttle,
320 .unthrottle = visor_unthrottle,
321 .attach = treo_attach,
322 .probe = visor_probe,
323 .calc_num_ports = visor_calc_num_ports,
324 .shutdown = visor_shutdown,
325 .ioctl = visor_ioctl,
326 .set_termios = visor_set_termios,
327 .write = visor_write,
328 .write_room = visor_write_room,
329 .chars_in_buffer = visor_chars_in_buffer,
330 .write_bulk_callback = visor_write_bulk_callback,
331 .read_bulk_callback = visor_read_bulk_callback,
332 .read_int_callback = visor_read_int_callback,
333};
334
335/* All of the device info needed for the Clie UX50, TH55 Palm 5.0 devices */
336static struct usb_serial_device_type clie_5_device = {
337 .owner = THIS_MODULE,
338 .name = "Sony Clie 5.0",
339 .short_name = "clie_5",
340 .id_table = clie_id_5_table,
341 .num_interrupt_in = NUM_DONT_CARE,
342 .num_bulk_in = 2,
343 .num_bulk_out = 2,
344 .num_ports = 2,
345 .open = visor_open,
346 .close = visor_close,
347 .throttle = visor_throttle,
348 .unthrottle = visor_unthrottle,
349 .attach = clie_5_attach,
350 .probe = visor_probe,
351 .calc_num_ports = visor_calc_num_ports,
352 .shutdown = visor_shutdown,
353 .ioctl = visor_ioctl,
354 .set_termios = visor_set_termios,
355 .write = visor_write,
356 .write_room = visor_write_room,
357 .chars_in_buffer = visor_chars_in_buffer,
358 .write_bulk_callback = visor_write_bulk_callback,
359 .read_bulk_callback = visor_read_bulk_callback,
360 .read_int_callback = visor_read_int_callback,
361};
362
363/* device info for the Sony Clie OS version 3.5 */
364static struct usb_serial_device_type clie_3_5_device = {
365 .owner = THIS_MODULE,
366 .name = "Sony Clie 3.5",
367 .short_name = "clie_3.5",
368 .id_table = clie_id_3_5_table,
369 .num_interrupt_in = 0,
370 .num_bulk_in = 1,
371 .num_bulk_out = 1,
372 .num_ports = 1,
373 .open = visor_open,
374 .close = visor_close,
375 .throttle = visor_throttle,
376 .unthrottle = visor_unthrottle,
377 .attach = clie_3_5_startup,
378 .ioctl = visor_ioctl,
379 .set_termios = visor_set_termios,
380 .write = visor_write,
381 .write_room = visor_write_room,
382 .chars_in_buffer = visor_chars_in_buffer,
383 .write_bulk_callback = visor_write_bulk_callback,
384 .read_bulk_callback = visor_read_bulk_callback,
385};
386
387struct visor_private {
388 spinlock_t lock;
389 int bytes_in;
390 int bytes_out;
391 int outstanding_urbs;
392 int throttled;
393};
394
395/* number of outstanding urbs to prevent userspace DoS from happening */
396#define URB_UPPER_LIMIT 42
397
398static int stats;
399
400/******************************************************************************
401 * Handspring Visor specific driver functions
402 ******************************************************************************/
403static int visor_open (struct usb_serial_port *port, struct file *filp)
404{
405 struct usb_serial *serial = port->serial;
406 struct visor_private *priv = usb_get_serial_port_data(port);
407 unsigned long flags;
408 int result = 0;
409
410 dbg("%s - port %d", __FUNCTION__, port->number);
411
412 if (!port->read_urb) {
413 /* this is needed for some brain dead Sony devices */
414 dev_err(&port->dev, "Device lied about number of ports, please use a lower one.\n");
415 return -ENODEV;
416 }
417
418 spin_lock_irqsave(&priv->lock, flags);
419 priv->bytes_in = 0;
420 priv->bytes_out = 0;
421 priv->outstanding_urbs = 0;
422 priv->throttled = 0;
423 spin_unlock_irqrestore(&priv->lock, flags);
424
425 /*
426 * Force low_latency on so that our tty_push actually forces the data
427 * through, otherwise it is scheduled, and with high data rates (like
428 * with OHCI) data can get lost.
429 */
430 if (port->tty)
431 port->tty->low_latency = 1;
432
433 /* Start reading from the device */
434 usb_fill_bulk_urb (port->read_urb, serial->dev,
435 usb_rcvbulkpipe (serial->dev,
436 port->bulk_in_endpointAddress),
437 port->read_urb->transfer_buffer,
438 port->read_urb->transfer_buffer_length,
439 visor_read_bulk_callback, port);
440 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
441 if (result) {
442 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n",
443 __FUNCTION__, result);
444 goto exit;
445 }
446
447 if (port->interrupt_in_urb) {
448 dbg("%s - adding interrupt input for treo", __FUNCTION__);
449 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
450 if (result)
451 dev_err(&port->dev, "%s - failed submitting interrupt urb, error %d\n",
452 __FUNCTION__, result);
453 }
454exit:
455 return result;
456}
457
458
459static void visor_close (struct usb_serial_port *port, struct file * filp)
460{
461 struct visor_private *priv = usb_get_serial_port_data(port);
462 unsigned char *transfer_buffer;
463
464 dbg("%s - port %d", __FUNCTION__, port->number);
465
466 /* shutdown our urbs */
467 usb_kill_urb(port->read_urb);
468 if (port->interrupt_in_urb)
469 usb_kill_urb(port->interrupt_in_urb);
470
471 /* Try to send shutdown message, if the device is gone, this will just fail. */
472 transfer_buffer = kmalloc (0x12, GFP_KERNEL);
473 if (transfer_buffer) {
474 usb_control_msg (port->serial->dev,
475 usb_rcvctrlpipe(port->serial->dev, 0),
476 VISOR_CLOSE_NOTIFICATION, 0xc2,
477 0x0000, 0x0000,
478 transfer_buffer, 0x12, 300);
479 kfree (transfer_buffer);
480 }
481
482 if (stats)
483 dev_info(&port->dev, "Bytes In = %d Bytes Out = %d\n",
484 priv->bytes_in, priv->bytes_out);
485}
486
487
488static int visor_write (struct usb_serial_port *port, const unsigned char *buf, int count)
489{
490 struct visor_private *priv = usb_get_serial_port_data(port);
491 struct usb_serial *serial = port->serial;
492 struct urb *urb;
493 unsigned char *buffer;
494 unsigned long flags;
495 int status;
496
497 dbg("%s - port %d", __FUNCTION__, port->number);
498
499 spin_lock_irqsave(&priv->lock, flags);
500 if (priv->outstanding_urbs > URB_UPPER_LIMIT) {
501 spin_unlock_irqrestore(&priv->lock, flags);
502 dbg("%s - write limit hit\n", __FUNCTION__);
503 return 0;
504 }
505 spin_unlock_irqrestore(&priv->lock, flags);
506
507 buffer = kmalloc (count, GFP_ATOMIC);
508 if (!buffer) {
509 dev_err(&port->dev, "out of memory\n");
510 return -ENOMEM;
511 }
512
513 urb = usb_alloc_urb(0, GFP_ATOMIC);
514 if (!urb) {
515 dev_err(&port->dev, "no more free urbs\n");
516 kfree (buffer);
517 return -ENOMEM;
518 }
519
520 memcpy (buffer, buf, count);
521
522 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, buffer);
523
524 usb_fill_bulk_urb (urb, serial->dev,
525 usb_sndbulkpipe (serial->dev,
526 port->bulk_out_endpointAddress),
527 buffer, count,
528 visor_write_bulk_callback, port);
529
530 /* send it down the pipe */
531 status = usb_submit_urb(urb, GFP_ATOMIC);
532 if (status) {
533 dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed with status = %d\n",
534 __FUNCTION__, status);
535 count = status;
536 kfree (buffer);
537 } else {
538 spin_lock_irqsave(&priv->lock, flags);
539 ++priv->outstanding_urbs;
540 priv->bytes_out += count;
541 spin_unlock_irqrestore(&priv->lock, flags);
542 }
543
544 /* we are done with this urb, so let the host driver
545 * really free it when it is finished with it */
546 usb_free_urb (urb);
547
548 return count;
549}
550
551
552static int visor_write_room (struct usb_serial_port *port)
553{
554 dbg("%s - port %d", __FUNCTION__, port->number);
555
556 /*
557 * We really can take anything the user throws at us
558 * but let's pick a nice big number to tell the tty
559 * layer that we have lots of free space
560 */
561 return 2048;
562}
563
564
565static int visor_chars_in_buffer (struct usb_serial_port *port)
566{
567 dbg("%s - port %d", __FUNCTION__, port->number);
568
569 /*
570 * We can't really account for how much data we
571 * have sent out, but hasn't made it through to the
572 * device, so just tell the tty layer that everything
573 * is flushed.
574 */
575 return 0;
576}
577
578
579static void visor_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
580{
581 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
582 struct visor_private *priv = usb_get_serial_port_data(port);
583 unsigned long flags;
584
585 /* free up the transfer buffer, as usb_free_urb() does not do this */
586 kfree (urb->transfer_buffer);
587
588 dbg("%s - port %d", __FUNCTION__, port->number);
589
590 if (urb->status)
591 dbg("%s - nonzero write bulk status received: %d",
592 __FUNCTION__, urb->status);
593
594 spin_lock_irqsave(&priv->lock, flags);
595 --priv->outstanding_urbs;
596 spin_unlock_irqrestore(&priv->lock, flags);
597
598 schedule_work(&port->work);
599}
600
601
602static void visor_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
603{
604 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
605 struct visor_private *priv = usb_get_serial_port_data(port);
606 unsigned char *data = urb->transfer_buffer;
607 struct tty_struct *tty;
608 unsigned long flags;
609 int i;
610 int throttled;
611 int result;
612
613 dbg("%s - port %d", __FUNCTION__, port->number);
614
615 if (urb->status) {
616 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
617 return;
618 }
619
620 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
621
622 tty = port->tty;
623 if (tty && urb->actual_length) {
624 for (i = 0; i < urb->actual_length ; ++i) {
625 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
626 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
627 tty_flip_buffer_push(tty);
628 }
629 /* this doesn't actually push the data through unless tty->low_latency is set */
630 tty_insert_flip_char(tty, data[i], 0);
631 }
632 tty_flip_buffer_push(tty);
633 }
634 spin_lock_irqsave(&priv->lock, flags);
635 priv->bytes_in += urb->actual_length;
636 throttled = priv->throttled;
637 spin_unlock_irqrestore(&priv->lock, flags);
638
639 /* Continue trying to always read if we should */
640 if (!throttled) {
641 usb_fill_bulk_urb (port->read_urb, port->serial->dev,
642 usb_rcvbulkpipe(port->serial->dev,
643 port->bulk_in_endpointAddress),
644 port->read_urb->transfer_buffer,
645 port->read_urb->transfer_buffer_length,
646 visor_read_bulk_callback, port);
647 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
648 if (result)
649 dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
650 }
651 return;
652}
653
654static void visor_read_int_callback (struct urb *urb, struct pt_regs *regs)
655{
656 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
657 int result;
658
659 switch (urb->status) {
660 case 0:
661 /* success */
662 break;
663 case -ECONNRESET:
664 case -ENOENT:
665 case -ESHUTDOWN:
666 /* this urb is terminated, clean up */
667 dbg("%s - urb shutting down with status: %d",
668 __FUNCTION__, urb->status);
669 return;
670 default:
671 dbg("%s - nonzero urb status received: %d",
672 __FUNCTION__, urb->status);
673 goto exit;
674 }
675
676 /*
677 * This information is still unknown what it can be used for.
678 * If anyone has an idea, please let the author know...
679 *
680 * Rumor has it this endpoint is used to notify when data
681 * is ready to be read from the bulk ones.
682 */
683 usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
684 urb->actual_length, urb->transfer_buffer);
685
686exit:
687 result = usb_submit_urb (urb, GFP_ATOMIC);
688 if (result)
689 dev_err(&urb->dev->dev, "%s - Error %d submitting interrupt urb\n",
690 __FUNCTION__, result);
691}
692
693static void visor_throttle (struct usb_serial_port *port)
694{
695 struct visor_private *priv = usb_get_serial_port_data(port);
696 unsigned long flags;
697
698 dbg("%s - port %d", __FUNCTION__, port->number);
699 spin_lock_irqsave(&priv->lock, flags);
700 priv->throttled = 1;
701 spin_unlock_irqrestore(&priv->lock, flags);
702}
703
704
705static void visor_unthrottle (struct usb_serial_port *port)
706{
707 struct visor_private *priv = usb_get_serial_port_data(port);
708 unsigned long flags;
709 int result;
710
711 dbg("%s - port %d", __FUNCTION__, port->number);
712 spin_lock_irqsave(&priv->lock, flags);
713 priv->throttled = 0;
714 spin_unlock_irqrestore(&priv->lock, flags);
715
716 port->read_urb->dev = port->serial->dev;
717 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
718 if (result)
719 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
720}
721
722static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id)
723{
724 struct device *dev = &serial->dev->dev;
725 struct visor_connection_info *connection_info;
726 unsigned char *transfer_buffer;
727 char *string;
728 int retval = 0;
729 int i;
730 int num_ports = 0;
731
732 dbg("%s", __FUNCTION__);
733
734 transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL);
735 if (!transfer_buffer) {
736 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __FUNCTION__,
737 sizeof(*connection_info));
738 return -ENOMEM;
739 }
740
741 /* send a get connection info request */
742 retval = usb_control_msg (serial->dev,
743 usb_rcvctrlpipe(serial->dev, 0),
744 VISOR_GET_CONNECTION_INFORMATION,
745 0xc2, 0x0000, 0x0000, transfer_buffer,
746 sizeof(*connection_info), 300);
747 if (retval < 0) {
748 dev_err(dev, "%s - error %d getting connection information\n",
749 __FUNCTION__, retval);
750 goto exit;
751 }
752
753 if (retval == sizeof(*connection_info)) {
754 connection_info = (struct visor_connection_info *)transfer_buffer;
755
756 num_ports = le16_to_cpu(connection_info->num_ports);
757 for (i = 0; i < num_ports; ++i) {
758 switch (connection_info->connections[i].port_function_id) {
759 case VISOR_FUNCTION_GENERIC:
760 string = "Generic";
761 break;
762 case VISOR_FUNCTION_DEBUGGER:
763 string = "Debugger";
764 break;
765 case VISOR_FUNCTION_HOTSYNC:
766 string = "HotSync";
767 break;
768 case VISOR_FUNCTION_CONSOLE:
769 string = "Console";
770 break;
771 case VISOR_FUNCTION_REMOTE_FILE_SYS:
772 string = "Remote File System";
773 break;
774 default:
775 string = "unknown";
776 break;
777 }
778 dev_info(dev, "%s: port %d, is for %s use\n",
779 serial->type->name,
780 connection_info->connections[i].port, string);
781 }
782 }
783 /*
784 * Handle devices that report invalid stuff here.
785 */
786 if (num_ports == 0 || num_ports > 2) {
787 dev_warn (dev, "%s: No valid connect info available\n",
788 serial->type->name);
789 num_ports = 2;
790 }
791
792 dev_info(dev, "%s: Number of ports: %d\n", serial->type->name,
793 num_ports);
794
795 /*
796 * save off our num_ports info so that we can use it in the
797 * calc_num_ports callback
798 */
799 usb_set_serial_data(serial, (void *)(long)num_ports);
800
801 /* ask for the number of bytes available, but ignore the response as it is broken */
802 retval = usb_control_msg (serial->dev,
803 usb_rcvctrlpipe(serial->dev, 0),
804 VISOR_REQUEST_BYTES_AVAILABLE,
805 0xc2, 0x0000, 0x0005, transfer_buffer,
806 0x02, 300);
807 if (retval < 0)
808 dev_err(dev, "%s - error %d getting bytes available request\n",
809 __FUNCTION__, retval);
810 retval = 0;
811
812exit:
813 kfree (transfer_buffer);
814
815 return retval;
816}
817
818static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id)
819{
820 struct device *dev = &serial->dev->dev;
821 struct palm_ext_connection_info *connection_info;
822 unsigned char *transfer_buffer;
823 int retval;
824
825 dbg("%s", __FUNCTION__);
826
827 transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL);
828 if (!transfer_buffer) {
829 dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __FUNCTION__,
830 sizeof(*connection_info));
831 return -ENOMEM;
832 }
833
834 retval = usb_control_msg (serial->dev,
835 usb_rcvctrlpipe(serial->dev, 0),
836 PALM_GET_EXT_CONNECTION_INFORMATION,
837 0xc2, 0x0000, 0x0000, transfer_buffer,
838 sizeof (*connection_info), 300);
839 if (retval < 0)
840 dev_err(dev, "%s - error %d getting connection info\n",
841 __FUNCTION__, retval);
842 else
843 usb_serial_debug_data(debug, &serial->dev->dev, __FUNCTION__,
844 retval, transfer_buffer);
845
846 kfree (transfer_buffer);
847 return 0;
848}
849
850
851static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id)
852{
853 int retval = 0;
854 int (*startup) (struct usb_serial *serial, const struct usb_device_id *id);
855
856 dbg("%s", __FUNCTION__);
857
858 if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
859 err("active config #%d != 1 ??",
860 serial->dev->actconfig->desc.bConfigurationValue);
861 return -ENODEV;
862 }
863
864 if (id->driver_info) {
865 startup = (void *)id->driver_info;
866 retval = startup(serial, id);
867 }
868
869 return retval;
870}
871
872static int visor_calc_num_ports (struct usb_serial *serial)
873{
874 int num_ports = (int)(long)(usb_get_serial_data(serial));
875
876 if (num_ports)
877 usb_set_serial_data(serial, NULL);
878
879 return num_ports;
880}
881
882static int generic_startup(struct usb_serial *serial)
883{
884 struct visor_private *priv;
885 int i;
886
887 for (i = 0; i < serial->num_ports; ++i) {
888 priv = kmalloc (sizeof(*priv), GFP_KERNEL);
889 if (!priv)
890 return -ENOMEM;
891 memset (priv, 0x00, sizeof(*priv));
892 spin_lock_init(&priv->lock);
893 usb_set_serial_port_data(serial->port[i], priv);
894 }
895 return 0;
896}
897
898static int clie_3_5_startup (struct usb_serial *serial)
899{
900 struct device *dev = &serial->dev->dev;
901 int result;
902 u8 data;
903
904 dbg("%s", __FUNCTION__);
905
906 /*
907 * Note that PEG-300 series devices expect the following two calls.
908 */
909
910 /* get the config number */
911 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
912 USB_REQ_GET_CONFIGURATION, USB_DIR_IN,
913 0, 0, &data, 1, 3000);
914 if (result < 0) {
915 dev_err(dev, "%s: get config number failed: %d\n", __FUNCTION__, result);
916 return result;
917 }
918 if (result != 1) {
919 dev_err(dev, "%s: get config number bad return length: %d\n", __FUNCTION__, result);
920 return -EIO;
921 }
922
923 /* get the interface number */
924 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
925 USB_REQ_GET_INTERFACE,
926 USB_DIR_IN | USB_RECIP_INTERFACE,
927 0, 0, &data, 1, 3000);
928 if (result < 0) {
929 dev_err(dev, "%s: get interface number failed: %d\n", __FUNCTION__, result);
930 return result;
931 }
932 if (result != 1) {
933 dev_err(dev, "%s: get interface number bad return length: %d\n", __FUNCTION__, result);
934 return -EIO;
935 }
936
937 return generic_startup(serial);
938}
939
940static int treo_attach (struct usb_serial *serial)
941{
942 struct usb_serial_port *swap_port;
943
944 /* Only do this endpoint hack for the Handspring devices with
945 * interrupt in endpoints, which for now are the Treo devices. */
946 if (!((le16_to_cpu(serial->dev->descriptor.idVendor) == HANDSPRING_VENDOR_ID) ||
947 (le16_to_cpu(serial->dev->descriptor.idVendor) == KYOCERA_VENDOR_ID)) ||
948 (serial->num_interrupt_in == 0))
949 goto generic_startup;
950
951 dbg("%s", __FUNCTION__);
952
953 /*
954 * It appears that Treos and Kyoceras want to use the
955 * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint,
956 * so let's swap the 1st and 2nd bulk in and interrupt endpoints.
957 * Note that swapping the bulk out endpoints would break lots of
958 * apps that want to communicate on the second port.
959 */
960#define COPY_PORT(dest, src) \
961 dest->read_urb = src->read_urb; \
962 dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress; \
963 dest->bulk_in_buffer = src->bulk_in_buffer; \
964 dest->interrupt_in_urb = src->interrupt_in_urb; \
965 dest->interrupt_in_endpointAddress = src->interrupt_in_endpointAddress; \
966 dest->interrupt_in_buffer = src->interrupt_in_buffer;
967
968 swap_port = kmalloc(sizeof(*swap_port), GFP_KERNEL);
969 if (!swap_port)
970 return -ENOMEM;
971 COPY_PORT(swap_port, serial->port[0]);
972 COPY_PORT(serial->port[0], serial->port[1]);
973 COPY_PORT(serial->port[1], swap_port);
974 kfree(swap_port);
975
976generic_startup:
977 return generic_startup(serial);
978}
979
980static int clie_5_attach (struct usb_serial *serial)
981{
982 dbg("%s", __FUNCTION__);
983
984 /* TH55 registers 2 ports.
985 Communication in from the UX50/TH55 uses bulk_in_endpointAddress from port 0
986 Communication out to the UX50/TH55 uses bulk_out_endpointAddress from port 1
987
988 Lets do a quick and dirty mapping
989 */
990
991 /* some sanity check */
992 if (serial->num_ports < 2)
993 return -1;
994
995 /* port 0 now uses the modified endpoint Address */
996 serial->port[0]->bulk_out_endpointAddress = serial->port[1]->bulk_out_endpointAddress;
997
998 return generic_startup(serial);
999}
1000
1001static void visor_shutdown (struct usb_serial *serial)
1002{
1003 dbg("%s", __FUNCTION__);
1004}
1005
1006static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
1007{
1008 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
1009
1010 return -ENOIOCTLCMD;
1011}
1012
1013
1014/* This function is all nice and good, but we don't change anything based on it :) */
1015static void visor_set_termios (struct usb_serial_port *port, struct termios *old_termios)
1016{
1017 unsigned int cflag;
1018
1019 dbg("%s - port %d", __FUNCTION__, port->number);
1020
1021 if ((!port->tty) || (!port->tty->termios)) {
1022 dbg("%s - no tty structures", __FUNCTION__);
1023 return;
1024 }
1025
1026 cflag = port->tty->termios->c_cflag;
1027 /* check that they really want us to change something */
1028 if (old_termios) {
1029 if ((cflag == old_termios->c_cflag) &&
1030 (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
1031 dbg("%s - nothing to change...", __FUNCTION__);
1032 return;
1033 }
1034 }
1035
1036 /* get the byte size */
1037 switch (cflag & CSIZE) {
1038 case CS5: dbg("%s - data bits = 5", __FUNCTION__); break;
1039 case CS6: dbg("%s - data bits = 6", __FUNCTION__); break;
1040 case CS7: dbg("%s - data bits = 7", __FUNCTION__); break;
1041 default:
1042 case CS8: dbg("%s - data bits = 8", __FUNCTION__); break;
1043 }
1044
1045 /* determine the parity */
1046 if (cflag & PARENB)
1047 if (cflag & PARODD)
1048 dbg("%s - parity = odd", __FUNCTION__);
1049 else
1050 dbg("%s - parity = even", __FUNCTION__);
1051 else
1052 dbg("%s - parity = none", __FUNCTION__);
1053
1054 /* figure out the stop bits requested */
1055 if (cflag & CSTOPB)
1056 dbg("%s - stop bits = 2", __FUNCTION__);
1057 else
1058 dbg("%s - stop bits = 1", __FUNCTION__);
1059
1060
1061 /* figure out the flow control settings */
1062 if (cflag & CRTSCTS)
1063 dbg("%s - RTS/CTS is enabled", __FUNCTION__);
1064 else
1065 dbg("%s - RTS/CTS is disabled", __FUNCTION__);
1066
1067 /* determine software flow control */
1068 if (I_IXOFF(port->tty))
1069 dbg("%s - XON/XOFF is enabled, XON = %2x, XOFF = %2x",
1070 __FUNCTION__, START_CHAR(port->tty), STOP_CHAR(port->tty));
1071 else
1072 dbg("%s - XON/XOFF is disabled", __FUNCTION__);
1073
1074 /* get the baud rate wanted */
1075 dbg("%s - baud rate = %d", __FUNCTION__, tty_get_baud_rate(port->tty));
1076
1077 return;
1078}
1079
1080
1081static int __init visor_init (void)
1082{
1083 int i, retval;
1084 /* Only if parameters were passed to us */
1085 if ((vendor>0) && (product>0)) {
1086 struct usb_device_id usb_dev_temp[]=
1087 {{USB_DEVICE(vendor, product),
1088 .driver_info = (kernel_ulong_t)&palm_os_4_probe }};
1089
1090 /* Find the last entry in id_table */
1091 for (i=0; ; i++) {
1092 if (id_table[i].idVendor==0) {
1093 id_table[i] = usb_dev_temp[0];
1094 break;
1095 }
1096 }
1097 /* Find the last entry in id_table_combined */
1098 for (i=0; ; i++) {
1099 if (id_table_combined[i].idVendor==0) {
1100 id_table_combined[i] = usb_dev_temp[0];
1101 break;
1102 }
1103 }
1104 info("Untested USB device specified at time of module insertion");
1105 info("Warning: This is not guaranteed to work");
1106 info("Using a newer kernel is preferred to this method");
1107 info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x",
1108 vendor, product);
1109 }
1110 retval = usb_serial_register(&handspring_device);
1111 if (retval)
1112 goto failed_handspring_register;
1113 retval = usb_serial_register(&clie_3_5_device);
1114 if (retval)
1115 goto failed_clie_3_5_register;
1116 retval = usb_serial_register(&clie_5_device);
1117 if (retval)
1118 goto failed_clie_5_register;
1119 retval = usb_register(&visor_driver);
1120 if (retval)
1121 goto failed_usb_register;
1122 info(DRIVER_DESC " " DRIVER_VERSION);
1123
1124 return 0;
1125failed_usb_register:
1126 usb_serial_deregister(&clie_5_device);
1127failed_clie_5_register:
1128 usb_serial_deregister(&clie_3_5_device);
1129failed_clie_3_5_register:
1130 usb_serial_deregister(&handspring_device);
1131failed_handspring_register:
1132 return retval;
1133}
1134
1135
1136static void __exit visor_exit (void)
1137{
1138 usb_deregister (&visor_driver);
1139 usb_serial_deregister (&handspring_device);
1140 usb_serial_deregister (&clie_3_5_device);
1141 usb_serial_deregister (&clie_5_device);
1142}
1143
1144
1145module_init(visor_init);
1146module_exit(visor_exit);
1147
1148MODULE_AUTHOR( DRIVER_AUTHOR );
1149MODULE_DESCRIPTION( DRIVER_DESC );
1150MODULE_LICENSE("GPL");
1151
1152module_param(debug, bool, S_IRUGO | S_IWUSR);
1153MODULE_PARM_DESC(debug, "Debug enabled or not");
1154module_param(stats, bool, S_IRUGO | S_IWUSR);
1155MODULE_PARM_DESC(stats, "Enables statistics or not");
1156
1157module_param(vendor, ushort, 0);
1158MODULE_PARM_DESC(vendor, "User specified vendor ID");
1159module_param(product, ushort, 0);
1160MODULE_PARM_DESC(product, "User specified product ID");
1161
diff --git a/drivers/usb/serial/visor.h b/drivers/usb/serial/visor.h
new file mode 100644
index 000000000000..a2fa2c61a009
--- /dev/null
+++ b/drivers/usb/serial/visor.h
@@ -0,0 +1,151 @@
1/*
2 * USB HandSpring Visor driver
3 *
4 * Copyright (C) 1999 - 2003
5 * Greg Kroah-Hartman (greg@kroah.com)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * See Documentation/usb/usb-serial.txt for more information on using this driver
13 *
14 */
15
16#ifndef __LINUX_USB_SERIAL_VISOR_H
17#define __LINUX_USB_SERIAL_VISOR_H
18
19
20#define HANDSPRING_VENDOR_ID 0x082d
21#define HANDSPRING_VISOR_ID 0x0100
22#define HANDSPRING_TREO_ID 0x0200
23#define HANDSPRING_TREO600_ID 0x0300
24
25#define PALM_VENDOR_ID 0x0830
26#define PALM_M500_ID 0x0001
27#define PALM_M505_ID 0x0002
28#define PALM_M515_ID 0x0003
29#define PALM_I705_ID 0x0020
30#define PALM_M125_ID 0x0040
31#define PALM_M130_ID 0x0050
32#define PALM_TUNGSTEN_T_ID 0x0060
33#define PALM_TUNGSTEN_Z_ID 0x0031
34#define PALM_ZIRE31_ID 0x0061
35#define PALM_ZIRE_ID 0x0070
36#define PALM_M100_ID 0x0080
37
38#define SONY_VENDOR_ID 0x054C
39#define SONY_CLIE_3_5_ID 0x0038
40#define SONY_CLIE_4_0_ID 0x0066
41#define SONY_CLIE_S360_ID 0x0095
42#define SONY_CLIE_4_1_ID 0x009A
43#define SONY_CLIE_NX60_ID 0x00DA
44#define SONY_CLIE_NZ90V_ID 0x00E9
45#define SONY_CLIE_UX50_ID 0x0144
46#define SONY_CLIE_TJ25_ID 0x0169
47
48#define SAMSUNG_VENDOR_ID 0x04E8
49#define SAMSUNG_SCH_I330_ID 0x8001
50#define SAMSUNG_SPH_I500_ID 0x6601
51
52#define GARMIN_VENDOR_ID 0x091E
53#define GARMIN_IQUE_3600_ID 0x0004
54
55#define ACEECA_VENDOR_ID 0x4766
56#define ACEECA_MEZ1000_ID 0x0001
57
58#define KYOCERA_VENDOR_ID 0x0C88
59#define KYOCERA_7135_ID 0x0021
60
61#define FOSSIL_VENDOR_ID 0x0E67
62#define FOSSIL_ABACUS_ID 0x0002
63
64/****************************************************************************
65 * Handspring Visor Vendor specific request codes (bRequest values)
66 * A big thank you to Handspring for providing the following information.
67 * If anyone wants the original file where these values and structures came
68 * from, send email to <greg@kroah.com>.
69 ****************************************************************************/
70
71/****************************************************************************
72 * VISOR_REQUEST_BYTES_AVAILABLE asks the visor for the number of bytes that
73 * are available to be transferred to the host for the specified endpoint.
74 * Currently this is not used, and always returns 0x0001
75 ****************************************************************************/
76#define VISOR_REQUEST_BYTES_AVAILABLE 0x01
77
78/****************************************************************************
79 * VISOR_CLOSE_NOTIFICATION is set to the device to notify it that the host
80 * is now closing the pipe. An empty packet is sent in response.
81 ****************************************************************************/
82#define VISOR_CLOSE_NOTIFICATION 0x02
83
84/****************************************************************************
85 * VISOR_GET_CONNECTION_INFORMATION is sent by the host during enumeration to
86 * get the endpoints used by the connection.
87 ****************************************************************************/
88#define VISOR_GET_CONNECTION_INFORMATION 0x03
89
90
91/****************************************************************************
92 * VISOR_GET_CONNECTION_INFORMATION returns data in the following format
93 ****************************************************************************/
94struct visor_connection_info {
95 __le16 num_ports;
96 struct {
97 __u8 port_function_id;
98 __u8 port;
99 } connections[2];
100};
101
102
103/* struct visor_connection_info.connection[x].port defines: */
104#define VISOR_ENDPOINT_1 0x01
105#define VISOR_ENDPOINT_2 0x02
106
107/* struct visor_connection_info.connection[x].port_function_id defines: */
108#define VISOR_FUNCTION_GENERIC 0x00
109#define VISOR_FUNCTION_DEBUGGER 0x01
110#define VISOR_FUNCTION_HOTSYNC 0x02
111#define VISOR_FUNCTION_CONSOLE 0x03
112#define VISOR_FUNCTION_REMOTE_FILE_SYS 0x04
113
114
115/****************************************************************************
116 * PALM_GET_SOME_UNKNOWN_INFORMATION is sent by the host during enumeration to
117 * get some information from the M series devices, that is currently unknown.
118 ****************************************************************************/
119#define PALM_GET_EXT_CONNECTION_INFORMATION 0x04
120
121/**
122 * struct palm_ext_connection_info - return data from a PALM_GET_EXT_CONNECTION_INFORMATION request
123 * @num_ports: maximum number of functions/connections in use
124 * @endpoint_numbers_different: will be 1 if in and out endpoints numbers are
125 * different, otherwise it is 0. If value is 1, then
126 * connections.end_point_info is non-zero. If value is 0, then
127 * connections.port contains the endpoint number, which is the same for in
128 * and out.
129 * @port_function_id: contains the creator id of the applicaton that opened
130 * this connection.
131 * @port: contains the in/out endpoint number. Is 0 if in and out endpoint
132 * numbers are different.
133 * @end_point_info: high nubbe is in endpoint and low nibble will indicate out
134 * endpoint. Is 0 if in and out endpoints are the same.
135 *
136 * The maximum number of connections currently supported is 2
137 */
138struct palm_ext_connection_info {
139 __u8 num_ports;
140 __u8 endpoint_numbers_different;
141 __le16 reserved1;
142 struct {
143 __u32 port_function_id;
144 __u8 port;
145 __u8 end_point_info;
146 __le16 reserved;
147 } connections[2];
148};
149
150#endif
151
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
new file mode 100644
index 000000000000..cf3bc30675a1
--- /dev/null
+++ b/drivers/usb/serial/whiteheat.c
@@ -0,0 +1,1512 @@
1/*
2 * USB ConnectTech WhiteHEAT driver
3 *
4 * Copyright (C) 2002
5 * Connect Tech Inc.
6 *
7 * Copyright (C) 1999 - 2001
8 * Greg Kroah-Hartman (greg@kroah.com)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver
16 *
17 * (10/09/2002) Stuart MacDonald (stuartm@connecttech.com)
18 * Upgrade to full working driver
19 *
20 * (05/30/2001) gkh
21 * switched from using spinlock to a semaphore, which fixes lots of problems.
22 *
23 * (04/08/2001) gb
24 * Identify version on module load.
25 *
26 * 2001_Mar_19 gkh
27 * Fixed MOD_INC and MOD_DEC logic, the ability to open a port more
28 * than once, and the got the proper usb_device_id table entries so
29 * the driver works again.
30 *
31 * (11/01/2000) Adam J. Richter
32 * usb_device_id table support
33 *
34 * (10/05/2000) gkh
35 * Fixed bug with urb->dev not being set properly, now that the usb
36 * core needs it.
37 *
38 * (10/03/2000) smd
39 * firmware is improved to guard against crap sent to device
40 * firmware now replies CMD_FAILURE on bad things
41 * read_callback fix you provided for private info struct
42 * command_finished now indicates success or fail
43 * setup_port struct now packed to avoid gcc padding
44 * firmware uses 1 based port numbering, driver now handles that
45 *
46 * (09/11/2000) gkh
47 * Removed DEBUG #ifdefs with call to usb_serial_debug_data
48 *
49 * (07/19/2000) gkh
50 * Added module_init and module_exit functions to handle the fact that this
51 * driver is a loadable module now.
52 * Fixed bug with port->minor that was found by Al Borchers
53 *
54 * (07/04/2000) gkh
55 * Added support for port settings. Baud rate can now be changed. Line signals
56 * are not transferred to and from the tty layer yet, but things seem to be
57 * working well now.
58 *
59 * (05/04/2000) gkh
60 * First cut at open and close commands. Data can flow through the ports at
61 * default speeds now.
62 *
63 * (03/26/2000) gkh
64 * Split driver up into device specific pieces.
65 *
66 */
67
68#include <linux/config.h>
69#include <linux/kernel.h>
70#include <linux/errno.h>
71#include <linux/init.h>
72#include <linux/slab.h>
73#include <linux/tty.h>
74#include <linux/tty_driver.h>
75#include <linux/tty_flip.h>
76#include <linux/module.h>
77#include <linux/spinlock.h>
78#include <asm/uaccess.h>
79#include <asm/termbits.h>
80#include <linux/usb.h>
81#include <linux/serial_reg.h>
82#include <linux/serial.h>
83#include "usb-serial.h"
84#include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */
85#include "whiteheat.h" /* WhiteHEAT specific commands */
86
87static int debug;
88
89#ifndef CMSPAR
90#define CMSPAR 0
91#endif
92
93/*
94 * Version Information
95 */
96#define DRIVER_VERSION "v2.0"
97#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Stuart MacDonald <stuartm@connecttech.com>"
98#define DRIVER_DESC "USB ConnectTech WhiteHEAT driver"
99
100#define CONNECT_TECH_VENDOR_ID 0x0710
101#define CONNECT_TECH_FAKE_WHITE_HEAT_ID 0x0001
102#define CONNECT_TECH_WHITE_HEAT_ID 0x8001
103
104/*
105 ID tables for whiteheat are unusual, because we want to different
106 things for different versions of the device. Eventually, this
107 will be doable from a single table. But, for now, we define two
108 separate ID tables, and then a third table that combines them
109 just for the purpose of exporting the autoloading information.
110*/
111static struct usb_device_id id_table_std [] = {
112 { USB_DEVICE(CONNECT_TECH_VENDOR_ID, CONNECT_TECH_WHITE_HEAT_ID) },
113 { } /* Terminating entry */
114};
115
116static struct usb_device_id id_table_prerenumeration [] = {
117 { USB_DEVICE(CONNECT_TECH_VENDOR_ID, CONNECT_TECH_FAKE_WHITE_HEAT_ID) },
118 { } /* Terminating entry */
119};
120
121static struct usb_device_id id_table_combined [] = {
122 { USB_DEVICE(CONNECT_TECH_VENDOR_ID, CONNECT_TECH_WHITE_HEAT_ID) },
123 { USB_DEVICE(CONNECT_TECH_VENDOR_ID, CONNECT_TECH_FAKE_WHITE_HEAT_ID) },
124 { } /* Terminating entry */
125};
126
127MODULE_DEVICE_TABLE (usb, id_table_combined);
128
129static struct usb_driver whiteheat_driver = {
130 .owner = THIS_MODULE,
131 .name = "whiteheat",
132 .probe = usb_serial_probe,
133 .disconnect = usb_serial_disconnect,
134 .id_table = id_table_combined,
135};
136
137/* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */
138static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id);
139static int whiteheat_firmware_attach (struct usb_serial *serial);
140
141/* function prototypes for the Connect Tech WhiteHEAT serial converter */
142static int whiteheat_attach (struct usb_serial *serial);
143static void whiteheat_shutdown (struct usb_serial *serial);
144static int whiteheat_open (struct usb_serial_port *port, struct file *filp);
145static void whiteheat_close (struct usb_serial_port *port, struct file *filp);
146static int whiteheat_write (struct usb_serial_port *port, const unsigned char *buf, int count);
147static int whiteheat_write_room (struct usb_serial_port *port);
148static int whiteheat_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
149static void whiteheat_set_termios (struct usb_serial_port *port, struct termios * old);
150static int whiteheat_tiocmget (struct usb_serial_port *port, struct file *file);
151static int whiteheat_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear);
152static void whiteheat_break_ctl (struct usb_serial_port *port, int break_state);
153static int whiteheat_chars_in_buffer (struct usb_serial_port *port);
154static void whiteheat_throttle (struct usb_serial_port *port);
155static void whiteheat_unthrottle (struct usb_serial_port *port);
156static void whiteheat_read_callback (struct urb *urb, struct pt_regs *regs);
157static void whiteheat_write_callback (struct urb *urb, struct pt_regs *regs);
158
159static struct usb_serial_device_type whiteheat_fake_device = {
160 .owner = THIS_MODULE,
161 .name = "Connect Tech - WhiteHEAT - (prerenumeration)",
162 .short_name = "whiteheatnofirm",
163 .id_table = id_table_prerenumeration,
164 .num_interrupt_in = NUM_DONT_CARE,
165 .num_bulk_in = NUM_DONT_CARE,
166 .num_bulk_out = NUM_DONT_CARE,
167 .num_ports = 1,
168 .probe = whiteheat_firmware_download,
169 .attach = whiteheat_firmware_attach,
170};
171
172static struct usb_serial_device_type whiteheat_device = {
173 .owner = THIS_MODULE,
174 .name = "Connect Tech - WhiteHEAT",
175 .short_name = "whiteheat",
176 .id_table = id_table_std,
177 .num_interrupt_in = NUM_DONT_CARE,
178 .num_bulk_in = NUM_DONT_CARE,
179 .num_bulk_out = NUM_DONT_CARE,
180 .num_ports = 4,
181 .attach = whiteheat_attach,
182 .shutdown = whiteheat_shutdown,
183 .open = whiteheat_open,
184 .close = whiteheat_close,
185 .write = whiteheat_write,
186 .write_room = whiteheat_write_room,
187 .ioctl = whiteheat_ioctl,
188 .set_termios = whiteheat_set_termios,
189 .break_ctl = whiteheat_break_ctl,
190 .tiocmget = whiteheat_tiocmget,
191 .tiocmset = whiteheat_tiocmset,
192 .chars_in_buffer = whiteheat_chars_in_buffer,
193 .throttle = whiteheat_throttle,
194 .unthrottle = whiteheat_unthrottle,
195 .read_bulk_callback = whiteheat_read_callback,
196 .write_bulk_callback = whiteheat_write_callback,
197};
198
199
200struct whiteheat_command_private {
201 spinlock_t lock;
202 __u8 port_running;
203 __u8 command_finished;
204 wait_queue_head_t wait_command; /* for handling sleeping while waiting for a command to finish */
205 __u8 result_buffer[64];
206};
207
208
209#define THROTTLED 0x01
210#define ACTUALLY_THROTTLED 0x02
211
212static int urb_pool_size = 8;
213
214struct whiteheat_urb_wrap {
215 struct list_head list;
216 struct urb *urb;
217};
218
219struct whiteheat_private {
220 spinlock_t lock;
221 __u8 flags;
222 __u8 mcr;
223 struct list_head rx_urbs_free;
224 struct list_head rx_urbs_submitted;
225 struct list_head rx_urb_q;
226 struct work_struct rx_work;
227 struct list_head tx_urbs_free;
228 struct list_head tx_urbs_submitted;
229};
230
231
232/* local function prototypes */
233static int start_command_port(struct usb_serial *serial);
234static void stop_command_port(struct usb_serial *serial);
235static void command_port_write_callback(struct urb *urb, struct pt_regs *regs);
236static void command_port_read_callback(struct urb *urb, struct pt_regs *regs);
237
238static int start_port_read(struct usb_serial_port *port);
239static struct whiteheat_urb_wrap *urb_to_wrap(struct urb *urb, struct list_head *head);
240static struct list_head *list_first(struct list_head *head);
241static void rx_data_softint(void *private);
242
243static int firm_send_command(struct usb_serial_port *port, __u8 command, __u8 *data, __u8 datasize);
244static int firm_open(struct usb_serial_port *port);
245static int firm_close(struct usb_serial_port *port);
246static int firm_setup_port(struct usb_serial_port *port);
247static int firm_set_rts(struct usb_serial_port *port, __u8 onoff);
248static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff);
249static int firm_set_break(struct usb_serial_port *port, __u8 onoff);
250static int firm_purge(struct usb_serial_port *port, __u8 rxtx);
251static int firm_get_dtr_rts(struct usb_serial_port *port);
252static int firm_report_tx_done(struct usb_serial_port *port);
253
254
255#define COMMAND_PORT 4
256#define COMMAND_TIMEOUT (2*HZ) /* 2 second timeout for a command */
257#define COMMAND_TIMEOUT_MS 2000
258#define CLOSING_DELAY (30 * HZ)
259
260
261/*****************************************************************************
262 * Connect Tech's White Heat prerenumeration driver functions
263 *****************************************************************************/
264
265/* steps to download the firmware to the WhiteHEAT device:
266 - hold the reset (by writing to the reset bit of the CPUCS register)
267 - download the VEND_AX.HEX file to the chip using VENDOR_REQUEST-ANCHOR_LOAD
268 - release the reset (by writing to the CPUCS register)
269 - download the WH.HEX file for all addresses greater than 0x1b3f using
270 VENDOR_REQUEST-ANCHOR_EXTERNAL_RAM_LOAD
271 - hold the reset
272 - download the WH.HEX file for all addresses less than 0x1b40 using
273 VENDOR_REQUEST_ANCHOR_LOAD
274 - release the reset
275 - device renumerated itself and comes up as new device id with all
276 firmware download completed.
277*/
278static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id)
279{
280 int response;
281 const struct whiteheat_hex_record *record;
282
283 dbg("%s", __FUNCTION__);
284
285 response = ezusb_set_reset (serial, 1);
286
287 record = &whiteheat_loader[0];
288 while (record->address != 0xffff) {
289 response = ezusb_writememory (serial, record->address,
290 (unsigned char *)record->data, record->data_size, 0xa0);
291 if (response < 0) {
292 err("%s - ezusb_writememory failed for loader (%d %04X %p %d)",
293 __FUNCTION__, response, record->address, record->data, record->data_size);
294 break;
295 }
296 ++record;
297 }
298
299 response = ezusb_set_reset (serial, 0);
300
301 record = &whiteheat_firmware[0];
302 while (record->address < 0x1b40) {
303 ++record;
304 }
305 while (record->address != 0xffff) {
306 response = ezusb_writememory (serial, record->address,
307 (unsigned char *)record->data, record->data_size, 0xa3);
308 if (response < 0) {
309 err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)",
310 __FUNCTION__, response, record->address, record->data, record->data_size);
311 break;
312 }
313 ++record;
314 }
315
316 response = ezusb_set_reset (serial, 1);
317
318 record = &whiteheat_firmware[0];
319 while (record->address < 0x1b40) {
320 response = ezusb_writememory (serial, record->address,
321 (unsigned char *)record->data, record->data_size, 0xa0);
322 if (response < 0) {
323 err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)",
324 __FUNCTION__, response, record->address, record->data, record->data_size);
325 break;
326 }
327 ++record;
328 }
329
330 response = ezusb_set_reset (serial, 0);
331
332 return 0;
333}
334
335
336static int whiteheat_firmware_attach (struct usb_serial *serial)
337{
338 /* We want this device to fail to have a driver assigned to it */
339 return 1;
340}
341
342
343/*****************************************************************************
344 * Connect Tech's White Heat serial driver functions
345 *****************************************************************************/
346static int whiteheat_attach (struct usb_serial *serial)
347{
348 struct usb_serial_port *command_port;
349 struct whiteheat_command_private *command_info;
350 struct usb_serial_port *port;
351 struct whiteheat_private *info;
352 struct whiteheat_hw_info *hw_info;
353 int pipe;
354 int ret;
355 int alen;
356 __u8 *command;
357 __u8 *result;
358 int i;
359 int j;
360 struct urb *urb;
361 int buf_size;
362 struct whiteheat_urb_wrap *wrap;
363 struct list_head *tmp;
364
365 command_port = serial->port[COMMAND_PORT];
366
367 pipe = usb_sndbulkpipe (serial->dev, command_port->bulk_out_endpointAddress);
368 command = kmalloc(2, GFP_KERNEL);
369 if (!command)
370 goto no_command_buffer;
371 command[0] = WHITEHEAT_GET_HW_INFO;
372 command[1] = 0;
373
374 result = kmalloc(sizeof(*hw_info) + 1, GFP_KERNEL);
375 if (!result)
376 goto no_result_buffer;
377 /*
378 * When the module is reloaded the firmware is still there and
379 * the endpoints are still in the usb core unchanged. This is the
380 * unlinking bug in disguise. Same for the call below.
381 */
382 usb_clear_halt(serial->dev, pipe);
383 ret = usb_bulk_msg (serial->dev, pipe, command, 2, &alen, COMMAND_TIMEOUT_MS);
384 if (ret) {
385 err("%s: Couldn't send command [%d]", serial->type->name, ret);
386 goto no_firmware;
387 } else if (alen != sizeof(command)) {
388 err("%s: Send command incomplete [%d]", serial->type->name, alen);
389 goto no_firmware;
390 }
391
392 pipe = usb_rcvbulkpipe (serial->dev, command_port->bulk_in_endpointAddress);
393 /* See the comment on the usb_clear_halt() above */
394 usb_clear_halt(serial->dev, pipe);
395 ret = usb_bulk_msg (serial->dev, pipe, result, sizeof(*hw_info) + 1, &alen, COMMAND_TIMEOUT_MS);
396 if (ret) {
397 err("%s: Couldn't get results [%d]", serial->type->name, ret);
398 goto no_firmware;
399 } else if (alen != sizeof(result)) {
400 err("%s: Get results incomplete [%d]", serial->type->name, alen);
401 goto no_firmware;
402 } else if (result[0] != command[0]) {
403 err("%s: Command failed [%d]", serial->type->name, result[0]);
404 goto no_firmware;
405 }
406
407 hw_info = (struct whiteheat_hw_info *)&result[1];
408
409 info("%s: Driver %s: Firmware v%d.%02d", serial->type->name,
410 DRIVER_VERSION, hw_info->sw_major_rev, hw_info->sw_minor_rev);
411
412 for (i = 0; i < serial->num_ports; i++) {
413 port = serial->port[i];
414
415 info = (struct whiteheat_private *)kmalloc(sizeof(struct whiteheat_private), GFP_KERNEL);
416 if (info == NULL) {
417 err("%s: Out of memory for port structures\n", serial->type->name);
418 goto no_private;
419 }
420
421 spin_lock_init(&info->lock);
422 info->flags = 0;
423 info->mcr = 0;
424 INIT_WORK(&info->rx_work, rx_data_softint, port);
425
426 INIT_LIST_HEAD(&info->rx_urbs_free);
427 INIT_LIST_HEAD(&info->rx_urbs_submitted);
428 INIT_LIST_HEAD(&info->rx_urb_q);
429 INIT_LIST_HEAD(&info->tx_urbs_free);
430 INIT_LIST_HEAD(&info->tx_urbs_submitted);
431
432 for (j = 0; j < urb_pool_size; j++) {
433 urb = usb_alloc_urb(0, GFP_KERNEL);
434 if (!urb) {
435 err("No free urbs available");
436 goto no_rx_urb;
437 }
438 buf_size = port->read_urb->transfer_buffer_length;
439 urb->transfer_buffer = kmalloc(buf_size, GFP_KERNEL);
440 if (!urb->transfer_buffer) {
441 err("Couldn't allocate urb buffer");
442 goto no_rx_buf;
443 }
444 wrap = kmalloc(sizeof(*wrap), GFP_KERNEL);
445 if (!wrap) {
446 err("Couldn't allocate urb wrapper");
447 goto no_rx_wrap;
448 }
449 usb_fill_bulk_urb(urb, serial->dev,
450 usb_rcvbulkpipe(serial->dev,
451 port->bulk_in_endpointAddress),
452 urb->transfer_buffer, buf_size,
453 whiteheat_read_callback, port);
454 wrap->urb = urb;
455 list_add(&wrap->list, &info->rx_urbs_free);
456
457 urb = usb_alloc_urb(0, GFP_KERNEL);
458 if (!urb) {
459 err("No free urbs available");
460 goto no_tx_urb;
461 }
462 buf_size = port->write_urb->transfer_buffer_length;
463 urb->transfer_buffer = kmalloc(buf_size, GFP_KERNEL);
464 if (!urb->transfer_buffer) {
465 err("Couldn't allocate urb buffer");
466 goto no_tx_buf;
467 }
468 wrap = kmalloc(sizeof(*wrap), GFP_KERNEL);
469 if (!wrap) {
470 err("Couldn't allocate urb wrapper");
471 goto no_tx_wrap;
472 }
473 usb_fill_bulk_urb(urb, serial->dev,
474 usb_sndbulkpipe(serial->dev,
475 port->bulk_out_endpointAddress),
476 urb->transfer_buffer, buf_size,
477 whiteheat_write_callback, port);
478 wrap->urb = urb;
479 list_add(&wrap->list, &info->tx_urbs_free);
480 }
481
482 usb_set_serial_port_data(port, info);
483 }
484
485 command_info = (struct whiteheat_command_private *)kmalloc(sizeof(struct whiteheat_command_private), GFP_KERNEL);
486 if (command_info == NULL) {
487 err("%s: Out of memory for port structures\n", serial->type->name);
488 goto no_command_private;
489 }
490
491 spin_lock_init(&command_info->lock);
492 command_info->port_running = 0;
493 init_waitqueue_head(&command_info->wait_command);
494 usb_set_serial_port_data(command_port, command_info);
495 command_port->write_urb->complete = command_port_write_callback;
496 command_port->read_urb->complete = command_port_read_callback;
497 kfree(result);
498 kfree(command);
499
500 return 0;
501
502no_firmware:
503 /* Firmware likely not running */
504 err("%s: Unable to retrieve firmware version, try replugging\n", serial->type->name);
505 err("%s: If the firmware is not running (status led not blinking)\n", serial->type->name);
506 err("%s: please contact support@connecttech.com\n", serial->type->name);
507 return -ENODEV;
508
509no_command_private:
510 for (i = serial->num_ports - 1; i >= 0; i--) {
511 port = serial->port[i];
512 info = usb_get_serial_port_data(port);
513 for (j = urb_pool_size - 1; j >= 0; j--) {
514 tmp = list_first(&info->tx_urbs_free);
515 list_del(tmp);
516 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
517 urb = wrap->urb;
518 kfree(wrap);
519no_tx_wrap:
520 kfree(urb->transfer_buffer);
521no_tx_buf:
522 usb_free_urb(urb);
523no_tx_urb:
524 tmp = list_first(&info->rx_urbs_free);
525 list_del(tmp);
526 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
527 urb = wrap->urb;
528 kfree(wrap);
529no_rx_wrap:
530 kfree(urb->transfer_buffer);
531no_rx_buf:
532 usb_free_urb(urb);
533no_rx_urb:
534 ;
535 }
536 kfree(info);
537no_private:
538 ;
539 }
540 kfree(result);
541no_result_buffer:
542 kfree(command);
543no_command_buffer:
544 return -ENOMEM;
545}
546
547
548static void whiteheat_shutdown (struct usb_serial *serial)
549{
550 struct usb_serial_port *command_port;
551 struct usb_serial_port *port;
552 struct whiteheat_private *info;
553 struct whiteheat_urb_wrap *wrap;
554 struct urb *urb;
555 struct list_head *tmp;
556 struct list_head *tmp2;
557 int i;
558
559 dbg("%s", __FUNCTION__);
560
561 /* free up our private data for our command port */
562 command_port = serial->port[COMMAND_PORT];
563 kfree (usb_get_serial_port_data(command_port));
564
565 for (i = 0; i < serial->num_ports; i++) {
566 port = serial->port[i];
567 info = usb_get_serial_port_data(port);
568 list_for_each_safe(tmp, tmp2, &info->rx_urbs_free) {
569 list_del(tmp);
570 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
571 urb = wrap->urb;
572 kfree(wrap);
573 kfree(urb->transfer_buffer);
574 usb_free_urb(urb);
575 }
576 list_for_each_safe(tmp, tmp2, &info->tx_urbs_free) {
577 list_del(tmp);
578 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
579 urb = wrap->urb;
580 kfree(wrap);
581 kfree(urb->transfer_buffer);
582 usb_free_urb(urb);
583 }
584 kfree(info);
585 }
586
587 return;
588}
589
590
591static int whiteheat_open (struct usb_serial_port *port, struct file *filp)
592{
593 int retval = 0;
594 struct termios old_term;
595
596 dbg("%s - port %d", __FUNCTION__, port->number);
597
598 retval = start_command_port(port->serial);
599 if (retval)
600 goto exit;
601
602 if (port->tty)
603 port->tty->low_latency = 1;
604
605 /* send an open port command */
606 retval = firm_open(port);
607 if (retval) {
608 stop_command_port(port->serial);
609 goto exit;
610 }
611
612 retval = firm_purge(port, WHITEHEAT_PURGE_RX | WHITEHEAT_PURGE_TX);
613 if (retval) {
614 firm_close(port);
615 stop_command_port(port->serial);
616 goto exit;
617 }
618
619 old_term.c_cflag = ~port->tty->termios->c_cflag;
620 old_term.c_iflag = ~port->tty->termios->c_iflag;
621 whiteheat_set_termios(port, &old_term);
622
623 /* Work around HCD bugs */
624 usb_clear_halt(port->serial->dev, port->read_urb->pipe);
625 usb_clear_halt(port->serial->dev, port->write_urb->pipe);
626
627 /* Start reading from the device */
628 retval = start_port_read(port);
629 if (retval) {
630 err("%s - failed submitting read urb, error %d", __FUNCTION__, retval);
631 firm_close(port);
632 stop_command_port(port->serial);
633 goto exit;
634 }
635
636exit:
637 dbg("%s - exit, retval = %d", __FUNCTION__, retval);
638 return retval;
639}
640
641
642static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
643{
644 struct whiteheat_private *info = usb_get_serial_port_data(port);
645 struct whiteheat_urb_wrap *wrap;
646 struct urb *urb;
647 struct list_head *tmp;
648 struct list_head *tmp2;
649 unsigned long flags;
650
651 dbg("%s - port %d", __FUNCTION__, port->number);
652
653 /* filp is NULL when called from usb_serial_disconnect */
654 if (filp && (tty_hung_up_p(filp))) {
655 return;
656 }
657
658 port->tty->closing = 1;
659
660/*
661 * Not currently in use; tty_wait_until_sent() calls
662 * serial_chars_in_buffer() which deadlocks on the second semaphore
663 * acquisition. This should be fixed at some point. Greg's been
664 * notified.
665 if ((filp->f_flags & (O_NDELAY | O_NONBLOCK)) == 0) {
666 tty_wait_until_sent(port->tty, CLOSING_DELAY);
667 }
668*/
669
670 if (port->tty->driver->flush_buffer)
671 port->tty->driver->flush_buffer(port->tty);
672 tty_ldisc_flush(port->tty);
673
674 firm_report_tx_done(port);
675
676 firm_close(port);
677
678 /* shutdown our bulk reads and writes */
679 spin_lock_irqsave(&info->lock, flags);
680 list_for_each_safe(tmp, tmp2, &info->rx_urbs_submitted) {
681 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
682 urb = wrap->urb;
683 usb_kill_urb(urb);
684 list_del(tmp);
685 list_add(tmp, &info->rx_urbs_free);
686 }
687 list_for_each_safe(tmp, tmp2, &info->rx_urb_q) {
688 list_del(tmp);
689 list_add(tmp, &info->rx_urbs_free);
690 }
691 list_for_each_safe(tmp, tmp2, &info->tx_urbs_submitted) {
692 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
693 urb = wrap->urb;
694 usb_kill_urb(urb);
695 list_del(tmp);
696 list_add(tmp, &info->tx_urbs_free);
697 }
698 spin_unlock_irqrestore(&info->lock, flags);
699
700 stop_command_port(port->serial);
701
702 port->tty->closing = 0;
703}
704
705
706static int whiteheat_write(struct usb_serial_port *port, const unsigned char *buf, int count)
707{
708 struct usb_serial *serial = port->serial;
709 struct whiteheat_private *info = usb_get_serial_port_data(port);
710 struct whiteheat_urb_wrap *wrap;
711 struct urb *urb;
712 int result;
713 int bytes;
714 int sent = 0;
715 unsigned long flags;
716 struct list_head *tmp;
717
718 dbg("%s - port %d", __FUNCTION__, port->number);
719
720 if (count == 0) {
721 dbg("%s - write request of 0 bytes", __FUNCTION__);
722 return (0);
723 }
724
725 while (count) {
726 spin_lock_irqsave(&info->lock, flags);
727 if (list_empty(&info->tx_urbs_free)) {
728 spin_unlock_irqrestore(&info->lock, flags);
729 break;
730 }
731 tmp = list_first(&info->tx_urbs_free);
732 list_del(tmp);
733 spin_unlock_irqrestore(&info->lock, flags);
734
735 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
736 urb = wrap->urb;
737 bytes = (count > port->bulk_out_size) ? port->bulk_out_size : count;
738 memcpy (urb->transfer_buffer, buf + sent, bytes);
739
740 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, bytes, urb->transfer_buffer);
741
742 urb->dev = serial->dev;
743 urb->transfer_buffer_length = bytes;
744 result = usb_submit_urb(urb, GFP_ATOMIC);
745 if (result) {
746 err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
747 sent = result;
748 spin_lock_irqsave(&info->lock, flags);
749 list_add(tmp, &info->tx_urbs_free);
750 spin_unlock_irqrestore(&info->lock, flags);
751 break;
752 } else {
753 sent += bytes;
754 count -= bytes;
755 spin_lock_irqsave(&info->lock, flags);
756 list_add(tmp, &info->tx_urbs_submitted);
757 spin_unlock_irqrestore(&info->lock, flags);
758 }
759 }
760
761 return sent;
762}
763
764
765static int whiteheat_write_room(struct usb_serial_port *port)
766{
767 struct whiteheat_private *info = usb_get_serial_port_data(port);
768 struct list_head *tmp;
769 int room = 0;
770 unsigned long flags;
771
772 dbg("%s - port %d", __FUNCTION__, port->number);
773
774 spin_lock_irqsave(&info->lock, flags);
775 list_for_each(tmp, &info->tx_urbs_free)
776 room++;
777 spin_unlock_irqrestore(&info->lock, flags);
778 room *= port->bulk_out_size;
779
780 dbg("%s - returns %d", __FUNCTION__, room);
781 return (room);
782}
783
784
785static int whiteheat_tiocmget (struct usb_serial_port *port, struct file *file)
786{
787 struct whiteheat_private *info = usb_get_serial_port_data(port);
788 unsigned int modem_signals = 0;
789
790 dbg("%s - port %d", __FUNCTION__, port->number);
791
792 firm_get_dtr_rts(port);
793 if (info->mcr & UART_MCR_DTR)
794 modem_signals |= TIOCM_DTR;
795 if (info->mcr & UART_MCR_RTS)
796 modem_signals |= TIOCM_RTS;
797
798 return modem_signals;
799}
800
801
802static int whiteheat_tiocmset (struct usb_serial_port *port, struct file *file,
803 unsigned int set, unsigned int clear)
804{
805 struct whiteheat_private *info = usb_get_serial_port_data(port);
806
807 dbg("%s - port %d", __FUNCTION__, port->number);
808
809 if (set & TIOCM_RTS)
810 info->mcr |= UART_MCR_RTS;
811 if (set & TIOCM_DTR)
812 info->mcr |= UART_MCR_DTR;
813
814 if (clear & TIOCM_RTS)
815 info->mcr &= ~UART_MCR_RTS;
816 if (clear & TIOCM_DTR)
817 info->mcr &= ~UART_MCR_DTR;
818
819 firm_set_dtr(port, info->mcr & UART_MCR_DTR);
820 firm_set_rts(port, info->mcr & UART_MCR_RTS);
821 return 0;
822}
823
824
825static int whiteheat_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
826{
827 struct serial_struct serstruct;
828 void __user *user_arg = (void __user *)arg;
829
830 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
831
832 switch (cmd) {
833 case TIOCGSERIAL:
834 memset(&serstruct, 0, sizeof(serstruct));
835 serstruct.type = PORT_16654;
836 serstruct.line = port->serial->minor;
837 serstruct.port = port->number;
838 serstruct.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
839 serstruct.xmit_fifo_size = port->bulk_out_size;
840 serstruct.custom_divisor = 0;
841 serstruct.baud_base = 460800;
842 serstruct.close_delay = CLOSING_DELAY;
843 serstruct.closing_wait = CLOSING_DELAY;
844
845 if (copy_to_user(user_arg, &serstruct, sizeof(serstruct)))
846 return -EFAULT;
847
848 break;
849
850 case TIOCSSERIAL:
851 if (copy_from_user(&serstruct, user_arg, sizeof(serstruct)))
852 return -EFAULT;
853
854 /*
855 * For now this is ignored. dip sets the ASYNC_[V]HI flags
856 * but this isn't used by us at all. Maybe someone somewhere
857 * will need the custom_divisor setting.
858 */
859
860 break;
861
862 default:
863 break;
864 }
865
866 return -ENOIOCTLCMD;
867}
868
869
870static void whiteheat_set_termios (struct usb_serial_port *port, struct termios *old_termios)
871{
872 dbg("%s -port %d", __FUNCTION__, port->number);
873
874 if ((!port->tty) || (!port->tty->termios)) {
875 dbg("%s - no tty structures", __FUNCTION__);
876 goto exit;
877 }
878
879 /* check that they really want us to change something */
880 if (old_termios) {
881 if ((port->tty->termios->c_cflag == old_termios->c_cflag) &&
882 (port->tty->termios->c_iflag == old_termios->c_iflag)) {
883 dbg("%s - nothing to change...", __FUNCTION__);
884 goto exit;
885 }
886 }
887
888 firm_setup_port(port);
889
890exit:
891 return;
892}
893
894
895static void whiteheat_break_ctl(struct usb_serial_port *port, int break_state) {
896 firm_set_break(port, break_state);
897}
898
899
900static int whiteheat_chars_in_buffer(struct usb_serial_port *port)
901{
902 struct whiteheat_private *info = usb_get_serial_port_data(port);
903 struct list_head *tmp;
904 struct whiteheat_urb_wrap *wrap;
905 int chars = 0;
906 unsigned long flags;
907
908 dbg("%s - port %d", __FUNCTION__, port->number);
909
910 spin_lock_irqsave(&info->lock, flags);
911 list_for_each(tmp, &info->tx_urbs_submitted) {
912 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
913 chars += wrap->urb->transfer_buffer_length;
914 }
915 spin_unlock_irqrestore(&info->lock, flags);
916
917 dbg ("%s - returns %d", __FUNCTION__, chars);
918 return (chars);
919}
920
921
922static void whiteheat_throttle (struct usb_serial_port *port)
923{
924 struct whiteheat_private *info = usb_get_serial_port_data(port);
925 unsigned long flags;
926
927 dbg("%s - port %d", __FUNCTION__, port->number);
928
929 spin_lock_irqsave(&info->lock, flags);
930 info->flags |= THROTTLED;
931 spin_unlock_irqrestore(&info->lock, flags);
932
933 return;
934}
935
936
937static void whiteheat_unthrottle (struct usb_serial_port *port)
938{
939 struct whiteheat_private *info = usb_get_serial_port_data(port);
940 int actually_throttled;
941 unsigned long flags;
942
943 dbg("%s - port %d", __FUNCTION__, port->number);
944
945 spin_lock_irqsave(&info->lock, flags);
946 actually_throttled = info->flags & ACTUALLY_THROTTLED;
947 info->flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
948 spin_unlock_irqrestore(&info->lock, flags);
949
950 if (actually_throttled)
951 rx_data_softint(port);
952
953 return;
954}
955
956
957/*****************************************************************************
958 * Connect Tech's White Heat callback routines
959 *****************************************************************************/
960static void command_port_write_callback (struct urb *urb, struct pt_regs *regs)
961{
962 dbg("%s", __FUNCTION__);
963
964 if (urb->status) {
965 dbg ("nonzero urb status: %d", urb->status);
966 return;
967 }
968}
969
970
971static void command_port_read_callback (struct urb *urb, struct pt_regs *regs)
972{
973 struct usb_serial_port *command_port = (struct usb_serial_port *)urb->context;
974 struct whiteheat_command_private *command_info;
975 unsigned char *data = urb->transfer_buffer;
976 int result;
977 unsigned long flags;
978
979 dbg("%s", __FUNCTION__);
980
981 if (urb->status) {
982 dbg("%s - nonzero urb status: %d", __FUNCTION__, urb->status);
983 return;
984 }
985
986 usb_serial_debug_data(debug, &command_port->dev, __FUNCTION__, urb->actual_length, data);
987
988 command_info = usb_get_serial_port_data(command_port);
989 if (!command_info) {
990 dbg ("%s - command_info is NULL, exiting.", __FUNCTION__);
991 return;
992 }
993 spin_lock_irqsave(&command_info->lock, flags);
994
995 if (data[0] == WHITEHEAT_CMD_COMPLETE) {
996 command_info->command_finished = WHITEHEAT_CMD_COMPLETE;
997 wake_up_interruptible(&command_info->wait_command);
998 } else if (data[0] == WHITEHEAT_CMD_FAILURE) {
999 command_info->command_finished = WHITEHEAT_CMD_FAILURE;
1000 wake_up_interruptible(&command_info->wait_command);
1001 } else if (data[0] == WHITEHEAT_EVENT) {
1002 /* These are unsolicited reports from the firmware, hence no waiting command to wakeup */
1003 dbg("%s - event received", __FUNCTION__);
1004 } else if (data[0] == WHITEHEAT_GET_DTR_RTS) {
1005 memcpy(command_info->result_buffer, &data[1], urb->actual_length - 1);
1006 command_info->command_finished = WHITEHEAT_CMD_COMPLETE;
1007 wake_up_interruptible(&command_info->wait_command);
1008 } else {
1009 dbg("%s - bad reply from firmware", __FUNCTION__);
1010 }
1011
1012 /* Continue trying to always read */
1013 command_port->read_urb->dev = command_port->serial->dev;
1014 result = usb_submit_urb(command_port->read_urb, GFP_ATOMIC);
1015 spin_unlock_irqrestore(&command_info->lock, flags);
1016 if (result)
1017 dbg("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
1018}
1019
1020
1021static void whiteheat_read_callback(struct urb *urb, struct pt_regs *regs)
1022{
1023 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1024 struct whiteheat_urb_wrap *wrap;
1025 unsigned char *data = urb->transfer_buffer;
1026 struct whiteheat_private *info = usb_get_serial_port_data(port);
1027
1028 dbg("%s - port %d", __FUNCTION__, port->number);
1029
1030 spin_lock(&info->lock);
1031 wrap = urb_to_wrap(urb, &info->rx_urbs_submitted);
1032 if (!wrap) {
1033 spin_unlock(&info->lock);
1034 err("%s - Not my urb!", __FUNCTION__);
1035 return;
1036 }
1037 list_del(&wrap->list);
1038 spin_unlock(&info->lock);
1039
1040 if (urb->status) {
1041 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
1042 spin_lock(&info->lock);
1043 list_add(&wrap->list, &info->rx_urbs_free);
1044 spin_unlock(&info->lock);
1045 return;
1046 }
1047
1048 usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
1049
1050 spin_lock(&info->lock);
1051 list_add_tail(&wrap->list, &info->rx_urb_q);
1052 if (info->flags & THROTTLED) {
1053 info->flags |= ACTUALLY_THROTTLED;
1054 spin_unlock(&info->lock);
1055 return;
1056 }
1057 spin_unlock(&info->lock);
1058
1059 schedule_work(&info->rx_work);
1060}
1061
1062
1063static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs)
1064{
1065 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
1066 struct whiteheat_private *info = usb_get_serial_port_data(port);
1067 struct whiteheat_urb_wrap *wrap;
1068
1069 dbg("%s - port %d", __FUNCTION__, port->number);
1070
1071 spin_lock(&info->lock);
1072 wrap = urb_to_wrap(urb, &info->tx_urbs_submitted);
1073 if (!wrap) {
1074 spin_unlock(&info->lock);
1075 err("%s - Not my urb!", __FUNCTION__);
1076 return;
1077 }
1078 list_del(&wrap->list);
1079 list_add(&wrap->list, &info->tx_urbs_free);
1080 spin_unlock(&info->lock);
1081
1082 if (urb->status) {
1083 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
1084 return;
1085 }
1086
1087 usb_serial_port_softint((void *)port);
1088
1089 schedule_work(&port->work);
1090}
1091
1092
1093/*****************************************************************************
1094 * Connect Tech's White Heat firmware interface
1095 *****************************************************************************/
1096static int firm_send_command (struct usb_serial_port *port, __u8 command, __u8 *data, __u8 datasize)
1097{
1098 struct usb_serial_port *command_port;
1099 struct whiteheat_command_private *command_info;
1100 struct whiteheat_private *info;
1101 __u8 *transfer_buffer;
1102 int retval = 0;
1103 unsigned long flags;
1104
1105 dbg("%s - command %d", __FUNCTION__, command);
1106
1107 command_port = port->serial->port[COMMAND_PORT];
1108 command_info = usb_get_serial_port_data(command_port);
1109 spin_lock_irqsave(&command_info->lock, flags);
1110 command_info->command_finished = FALSE;
1111
1112 transfer_buffer = (__u8 *)command_port->write_urb->transfer_buffer;
1113 transfer_buffer[0] = command;
1114 memcpy (&transfer_buffer[1], data, datasize);
1115 command_port->write_urb->transfer_buffer_length = datasize + 1;
1116 command_port->write_urb->dev = port->serial->dev;
1117 retval = usb_submit_urb (command_port->write_urb, GFP_KERNEL);
1118 if (retval) {
1119 dbg("%s - submit urb failed", __FUNCTION__);
1120 goto exit;
1121 }
1122 spin_unlock_irqrestore(&command_info->lock, flags);
1123
1124 /* wait for the command to complete */
1125 wait_event_interruptible_timeout(command_info->wait_command,
1126 (command_info->command_finished != FALSE), COMMAND_TIMEOUT);
1127
1128 spin_lock_irqsave(&command_info->lock, flags);
1129
1130 if (command_info->command_finished == FALSE) {
1131 dbg("%s - command timed out.", __FUNCTION__);
1132 retval = -ETIMEDOUT;
1133 goto exit;
1134 }
1135
1136 if (command_info->command_finished == WHITEHEAT_CMD_FAILURE) {
1137 dbg("%s - command failed.", __FUNCTION__);
1138 retval = -EIO;
1139 goto exit;
1140 }
1141
1142 if (command_info->command_finished == WHITEHEAT_CMD_COMPLETE) {
1143 dbg("%s - command completed.", __FUNCTION__);
1144 switch (command) {
1145 case WHITEHEAT_GET_DTR_RTS:
1146 info = usb_get_serial_port_data(port);
1147 memcpy(&info->mcr, command_info->result_buffer, sizeof(struct whiteheat_dr_info));
1148 break;
1149 }
1150 }
1151
1152exit:
1153 spin_unlock_irqrestore(&command_info->lock, flags);
1154 return retval;
1155}
1156
1157
1158static int firm_open(struct usb_serial_port *port) {
1159 struct whiteheat_simple open_command;
1160
1161 open_command.port = port->number - port->serial->minor + 1;
1162 return firm_send_command(port, WHITEHEAT_OPEN, (__u8 *)&open_command, sizeof(open_command));
1163}
1164
1165
1166static int firm_close(struct usb_serial_port *port) {
1167 struct whiteheat_simple close_command;
1168
1169 close_command.port = port->number - port->serial->minor + 1;
1170 return firm_send_command(port, WHITEHEAT_CLOSE, (__u8 *)&close_command, sizeof(close_command));
1171}
1172
1173
1174static int firm_setup_port(struct usb_serial_port *port) {
1175 struct whiteheat_port_settings port_settings;
1176 unsigned int cflag = port->tty->termios->c_cflag;
1177
1178 port_settings.port = port->number + 1;
1179
1180 /* get the byte size */
1181 switch (cflag & CSIZE) {
1182 case CS5: port_settings.bits = 5; break;
1183 case CS6: port_settings.bits = 6; break;
1184 case CS7: port_settings.bits = 7; break;
1185 default:
1186 case CS8: port_settings.bits = 8; break;
1187 }
1188 dbg("%s - data bits = %d", __FUNCTION__, port_settings.bits);
1189
1190 /* determine the parity */
1191 if (cflag & PARENB)
1192 if (cflag & CMSPAR)
1193 if (cflag & PARODD)
1194 port_settings.parity = WHITEHEAT_PAR_MARK;
1195 else
1196 port_settings.parity = WHITEHEAT_PAR_SPACE;
1197 else
1198 if (cflag & PARODD)
1199 port_settings.parity = WHITEHEAT_PAR_ODD;
1200 else
1201 port_settings.parity = WHITEHEAT_PAR_EVEN;
1202 else
1203 port_settings.parity = WHITEHEAT_PAR_NONE;
1204 dbg("%s - parity = %c", __FUNCTION__, port_settings.parity);
1205
1206 /* figure out the stop bits requested */
1207 if (cflag & CSTOPB)
1208 port_settings.stop = 2;
1209 else
1210 port_settings.stop = 1;
1211 dbg("%s - stop bits = %d", __FUNCTION__, port_settings.stop);
1212
1213 /* figure out the flow control settings */
1214 if (cflag & CRTSCTS)
1215 port_settings.hflow = (WHITEHEAT_HFLOW_CTS | WHITEHEAT_HFLOW_RTS);
1216 else
1217 port_settings.hflow = WHITEHEAT_HFLOW_NONE;
1218 dbg("%s - hardware flow control = %s %s %s %s", __FUNCTION__,
1219 (port_settings.hflow & WHITEHEAT_HFLOW_CTS) ? "CTS" : "",
1220 (port_settings.hflow & WHITEHEAT_HFLOW_RTS) ? "RTS" : "",
1221 (port_settings.hflow & WHITEHEAT_HFLOW_DSR) ? "DSR" : "",
1222 (port_settings.hflow & WHITEHEAT_HFLOW_DTR) ? "DTR" : "");
1223
1224 /* determine software flow control */
1225 if (I_IXOFF(port->tty))
1226 port_settings.sflow = WHITEHEAT_SFLOW_RXTX;
1227 else
1228 port_settings.sflow = WHITEHEAT_SFLOW_NONE;
1229 dbg("%s - software flow control = %c", __FUNCTION__, port_settings.sflow);
1230
1231 port_settings.xon = START_CHAR(port->tty);
1232 port_settings.xoff = STOP_CHAR(port->tty);
1233 dbg("%s - XON = %2x, XOFF = %2x", __FUNCTION__, port_settings.xon, port_settings.xoff);
1234
1235 /* get the baud rate wanted */
1236 port_settings.baud = tty_get_baud_rate(port->tty);
1237 dbg("%s - baud rate = %d", __FUNCTION__, port_settings.baud);
1238
1239 /* handle any settings that aren't specified in the tty structure */
1240 port_settings.lloop = 0;
1241
1242 /* now send the message to the device */
1243 return firm_send_command(port, WHITEHEAT_SETUP_PORT, (__u8 *)&port_settings, sizeof(port_settings));
1244}
1245
1246
1247static int firm_set_rts(struct usb_serial_port *port, __u8 onoff) {
1248 struct whiteheat_set_rdb rts_command;
1249
1250 rts_command.port = port->number - port->serial->minor + 1;
1251 rts_command.state = onoff;
1252 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&rts_command, sizeof(rts_command));
1253}
1254
1255
1256static int firm_set_dtr(struct usb_serial_port *port, __u8 onoff) {
1257 struct whiteheat_set_rdb dtr_command;
1258
1259 dtr_command.port = port->number - port->serial->minor + 1;
1260 dtr_command.state = onoff;
1261 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&dtr_command, sizeof(dtr_command));
1262}
1263
1264
1265static int firm_set_break(struct usb_serial_port *port, __u8 onoff) {
1266 struct whiteheat_set_rdb break_command;
1267
1268 break_command.port = port->number - port->serial->minor + 1;
1269 break_command.state = onoff;
1270 return firm_send_command(port, WHITEHEAT_SET_RTS, (__u8 *)&break_command, sizeof(break_command));
1271}
1272
1273
1274static int firm_purge(struct usb_serial_port *port, __u8 rxtx) {
1275 struct whiteheat_purge purge_command;
1276
1277 purge_command.port = port->number - port->serial->minor + 1;
1278 purge_command.what = rxtx;
1279 return firm_send_command(port, WHITEHEAT_PURGE, (__u8 *)&purge_command, sizeof(purge_command));
1280}
1281
1282
1283static int firm_get_dtr_rts(struct usb_serial_port *port) {
1284 struct whiteheat_simple get_dr_command;
1285
1286 get_dr_command.port = port->number - port->serial->minor + 1;
1287 return firm_send_command(port, WHITEHEAT_GET_DTR_RTS, (__u8 *)&get_dr_command, sizeof(get_dr_command));
1288}
1289
1290
1291static int firm_report_tx_done(struct usb_serial_port *port) {
1292 struct whiteheat_simple close_command;
1293
1294 close_command.port = port->number - port->serial->minor + 1;
1295 return firm_send_command(port, WHITEHEAT_REPORT_TX_DONE, (__u8 *)&close_command, sizeof(close_command));
1296}
1297
1298
1299/*****************************************************************************
1300 * Connect Tech's White Heat utility functions
1301 *****************************************************************************/
1302static int start_command_port(struct usb_serial *serial)
1303{
1304 struct usb_serial_port *command_port;
1305 struct whiteheat_command_private *command_info;
1306 unsigned long flags;
1307 int retval = 0;
1308
1309 command_port = serial->port[COMMAND_PORT];
1310 command_info = usb_get_serial_port_data(command_port);
1311 spin_lock_irqsave(&command_info->lock, flags);
1312 if (!command_info->port_running) {
1313 /* Work around HCD bugs */
1314 usb_clear_halt(serial->dev, command_port->read_urb->pipe);
1315
1316 command_port->read_urb->dev = serial->dev;
1317 retval = usb_submit_urb(command_port->read_urb, GFP_KERNEL);
1318 if (retval) {
1319 err("%s - failed submitting read urb, error %d", __FUNCTION__, retval);
1320 goto exit;
1321 }
1322 }
1323 command_info->port_running++;
1324
1325exit:
1326 spin_unlock_irqrestore(&command_info->lock, flags);
1327 return retval;
1328}
1329
1330
1331static void stop_command_port(struct usb_serial *serial)
1332{
1333 struct usb_serial_port *command_port;
1334 struct whiteheat_command_private *command_info;
1335 unsigned long flags;
1336
1337 command_port = serial->port[COMMAND_PORT];
1338 command_info = usb_get_serial_port_data(command_port);
1339 spin_lock_irqsave(&command_info->lock, flags);
1340 command_info->port_running--;
1341 if (!command_info->port_running)
1342 usb_kill_urb(command_port->read_urb);
1343 spin_unlock_irqrestore(&command_info->lock, flags);
1344}
1345
1346
1347static int start_port_read(struct usb_serial_port *port)
1348{
1349 struct whiteheat_private *info = usb_get_serial_port_data(port);
1350 struct whiteheat_urb_wrap *wrap;
1351 struct urb *urb;
1352 int retval = 0;
1353 unsigned long flags;
1354 struct list_head *tmp;
1355 struct list_head *tmp2;
1356
1357 spin_lock_irqsave(&info->lock, flags);
1358
1359 list_for_each_safe(tmp, tmp2, &info->rx_urbs_free) {
1360 list_del(tmp);
1361 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
1362 urb = wrap->urb;
1363 urb->dev = port->serial->dev;
1364 retval = usb_submit_urb(urb, GFP_KERNEL);
1365 if (retval) {
1366 list_add(tmp, &info->rx_urbs_free);
1367 list_for_each_safe(tmp, tmp2, &info->rx_urbs_submitted) {
1368 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
1369 urb = wrap->urb;
1370 usb_kill_urb(urb);
1371 list_del(tmp);
1372 list_add(tmp, &info->rx_urbs_free);
1373 }
1374 break;
1375 }
1376 list_add(tmp, &info->rx_urbs_submitted);
1377 }
1378
1379 spin_unlock_irqrestore(&info->lock, flags);
1380
1381 return retval;
1382}
1383
1384
1385static struct whiteheat_urb_wrap *urb_to_wrap(struct urb* urb, struct list_head *head)
1386{
1387 struct whiteheat_urb_wrap *wrap;
1388 struct list_head *tmp;
1389
1390 list_for_each(tmp, head) {
1391 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
1392 if (wrap->urb == urb)
1393 return wrap;
1394 }
1395
1396 return NULL;
1397}
1398
1399
1400static struct list_head *list_first(struct list_head *head)
1401{
1402 return head->next;
1403}
1404
1405
1406static void rx_data_softint(void *private)
1407{
1408 struct usb_serial_port *port = (struct usb_serial_port *)private;
1409 struct whiteheat_private *info = usb_get_serial_port_data(port);
1410 struct tty_struct *tty = port->tty;
1411 struct whiteheat_urb_wrap *wrap;
1412 struct urb *urb;
1413 unsigned long flags;
1414 struct list_head *tmp;
1415 struct list_head *tmp2;
1416 int result;
1417 int sent = 0;
1418
1419 spin_lock_irqsave(&info->lock, flags);
1420 if (info->flags & THROTTLED) {
1421 spin_unlock_irqrestore(&info->lock, flags);
1422 return;
1423 }
1424
1425 list_for_each_safe(tmp, tmp2, &info->rx_urb_q) {
1426 list_del(tmp);
1427 spin_unlock_irqrestore(&info->lock, flags);
1428
1429 wrap = list_entry(tmp, struct whiteheat_urb_wrap, list);
1430 urb = wrap->urb;
1431
1432 if (tty && urb->actual_length) {
1433 if (urb->actual_length > TTY_FLIPBUF_SIZE - tty->flip.count) {
1434 spin_lock_irqsave(&info->lock, flags);
1435 list_add(tmp, &info->rx_urb_q);
1436 spin_unlock_irqrestore(&info->lock, flags);
1437 tty_flip_buffer_push(tty);
1438 schedule_work(&info->rx_work);
1439 return;
1440 }
1441
1442 memcpy(tty->flip.char_buf_ptr, urb->transfer_buffer, urb->actual_length);
1443 tty->flip.char_buf_ptr += urb->actual_length;
1444 tty->flip.count += urb->actual_length;
1445 sent += urb->actual_length;
1446 }
1447
1448 urb->dev = port->serial->dev;
1449 result = usb_submit_urb(urb, GFP_ATOMIC);
1450 if (result) {
1451 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
1452 spin_lock_irqsave(&info->lock, flags);
1453 list_add(tmp, &info->rx_urbs_free);
1454 continue;
1455 }
1456
1457 spin_lock_irqsave(&info->lock, flags);
1458 list_add(tmp, &info->rx_urbs_submitted);
1459 }
1460 spin_unlock_irqrestore(&info->lock, flags);
1461
1462 if (sent)
1463 tty_flip_buffer_push(tty);
1464}
1465
1466
1467/*****************************************************************************
1468 * Connect Tech's White Heat module functions
1469 *****************************************************************************/
1470static int __init whiteheat_init (void)
1471{
1472 int retval;
1473 retval = usb_serial_register(&whiteheat_fake_device);
1474 if (retval)
1475 goto failed_fake_register;
1476 retval = usb_serial_register(&whiteheat_device);
1477 if (retval)
1478 goto failed_device_register;
1479 retval = usb_register(&whiteheat_driver);
1480 if (retval)
1481 goto failed_usb_register;
1482 info(DRIVER_DESC " " DRIVER_VERSION);
1483 return 0;
1484failed_usb_register:
1485 usb_serial_deregister(&whiteheat_device);
1486failed_device_register:
1487 usb_serial_deregister(&whiteheat_fake_device);
1488failed_fake_register:
1489 return retval;
1490}
1491
1492
1493static void __exit whiteheat_exit (void)
1494{
1495 usb_deregister (&whiteheat_driver);
1496 usb_serial_deregister (&whiteheat_fake_device);
1497 usb_serial_deregister (&whiteheat_device);
1498}
1499
1500
1501module_init(whiteheat_init);
1502module_exit(whiteheat_exit);
1503
1504MODULE_AUTHOR( DRIVER_AUTHOR );
1505MODULE_DESCRIPTION( DRIVER_DESC );
1506MODULE_LICENSE("GPL");
1507
1508module_param(urb_pool_size, int, 0);
1509MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering");
1510
1511module_param(debug, bool, S_IRUGO | S_IWUSR);
1512MODULE_PARM_DESC(debug, "Debug enabled or not");
diff --git a/drivers/usb/serial/whiteheat.h b/drivers/usb/serial/whiteheat.h
new file mode 100644
index 000000000000..d714eff58dc0
--- /dev/null
+++ b/drivers/usb/serial/whiteheat.h
@@ -0,0 +1,282 @@
1/*
2 * USB ConnectTech WhiteHEAT driver
3 *
4 * Copyright (C) 2002
5 * Connect Tech Inc.
6 *
7 * Copyright (C) 1999, 2000
8 * Greg Kroah-Hartman (greg@kroah.com)
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * See Documentation/usb/usb-serial.txt for more information on using this driver
16 *
17 */
18
19#ifndef __LINUX_USB_SERIAL_WHITEHEAT_H
20#define __LINUX_USB_SERIAL_WHITEHEAT_H
21
22
23#define FALSE 0
24#define TRUE 1
25
26
27/* WhiteHEAT commands */
28#define WHITEHEAT_OPEN 1 /* open the port */
29#define WHITEHEAT_CLOSE 2 /* close the port */
30#define WHITEHEAT_SETUP_PORT 3 /* change port settings */
31#define WHITEHEAT_SET_RTS 4 /* turn RTS on or off */
32#define WHITEHEAT_SET_DTR 5 /* turn DTR on or off */
33#define WHITEHEAT_SET_BREAK 6 /* turn BREAK on or off */
34#define WHITEHEAT_DUMP 7 /* dump memory */
35#define WHITEHEAT_STATUS 8 /* get status */
36#define WHITEHEAT_PURGE 9 /* clear the UART fifos */
37#define WHITEHEAT_GET_DTR_RTS 10 /* get the state of DTR and RTS for a port */
38#define WHITEHEAT_GET_HW_INFO 11 /* get EEPROM info and hardware ID */
39#define WHITEHEAT_REPORT_TX_DONE 12 /* get the next TX done */
40#define WHITEHEAT_EVENT 13 /* unsolicited status events */
41#define WHITEHEAT_ECHO 14 /* send data to the indicated IN endpoint */
42#define WHITEHEAT_DO_TEST 15 /* perform the specified test */
43#define WHITEHEAT_CMD_COMPLETE 16 /* reply for certain commands */
44#define WHITEHEAT_CMD_FAILURE 17 /* reply for failed commands */
45
46
47/*
48 * Commands to the firmware
49 */
50
51
52/*
53 * WHITEHEAT_OPEN
54 * WHITEHEAT_CLOSE
55 * WHITEHEAT_STATUS
56 * WHITEHEAT_GET_DTR_RTS
57 * WHITEHEAT_REPORT_TX_DONE
58*/
59struct whiteheat_simple {
60 __u8 port; /* port number (1 to N) */
61};
62
63
64/*
65 * WHITEHEAT_SETUP_PORT
66 */
67#define WHITEHEAT_PAR_NONE 'n' /* no parity */
68#define WHITEHEAT_PAR_EVEN 'e' /* even parity */
69#define WHITEHEAT_PAR_ODD 'o' /* odd parity */
70#define WHITEHEAT_PAR_SPACE '0' /* space (force 0) parity */
71#define WHITEHEAT_PAR_MARK '1' /* mark (force 1) parity */
72
73#define WHITEHEAT_SFLOW_NONE 'n' /* no software flow control */
74#define WHITEHEAT_SFLOW_RX 'r' /* XOFF/ON is sent when RX fills/empties */
75#define WHITEHEAT_SFLOW_TX 't' /* when received XOFF/ON will stop/start TX */
76#define WHITEHEAT_SFLOW_RXTX 'b' /* both SFLOW_RX and SFLOW_TX */
77
78#define WHITEHEAT_HFLOW_NONE 0x00 /* no hardware flow control */
79#define WHITEHEAT_HFLOW_RTS_TOGGLE 0x01 /* RTS is on during transmit, off otherwise */
80#define WHITEHEAT_HFLOW_DTR 0x02 /* DTR is off/on when RX fills/empties */
81#define WHITEHEAT_HFLOW_CTS 0x08 /* when received CTS off/on will stop/start TX */
82#define WHITEHEAT_HFLOW_DSR 0x10 /* when received DSR off/on will stop/start TX */
83#define WHITEHEAT_HFLOW_RTS 0x80 /* RTS is off/on when RX fills/empties */
84
85struct whiteheat_port_settings {
86 __u8 port; /* port number (1 to N) */
87 __u32 baud; /* any value 7 - 460800, firmware calculates best fit; arrives little endian */
88 __u8 bits; /* 5, 6, 7, or 8 */
89 __u8 stop; /* 1 or 2, default 1 (2 = 1.5 if bits = 5) */
90 __u8 parity; /* see WHITEHEAT_PAR_* above */
91 __u8 sflow; /* see WHITEHEAT_SFLOW_* above */
92 __u8 xoff; /* XOFF byte value */
93 __u8 xon; /* XON byte value */
94 __u8 hflow; /* see WHITEHEAT_HFLOW_* above */
95 __u8 lloop; /* 0/1 turns local loopback mode off/on */
96} __attribute__ ((packed));
97
98
99/*
100 * WHITEHEAT_SET_RTS
101 * WHITEHEAT_SET_DTR
102 * WHITEHEAT_SET_BREAK
103 */
104#define WHITEHEAT_RTS_OFF 0x00
105#define WHITEHEAT_RTS_ON 0x01
106#define WHITEHEAT_DTR_OFF 0x00
107#define WHITEHEAT_DTR_ON 0x01
108#define WHITEHEAT_BREAK_OFF 0x00
109#define WHITEHEAT_BREAK_ON 0x01
110
111struct whiteheat_set_rdb {
112 __u8 port; /* port number (1 to N) */
113 __u8 state; /* 0/1 turns signal off/on */
114};
115
116
117/*
118 * WHITEHEAT_DUMP
119 */
120#define WHITEHEAT_DUMP_MEM_DATA 'd' /* data */
121#define WHITEHEAT_DUMP_MEM_IDATA 'i' /* idata */
122#define WHITEHEAT_DUMP_MEM_BDATA 'b' /* bdata */
123#define WHITEHEAT_DUMP_MEM_XDATA 'x' /* xdata */
124
125/*
126 * Allowable address ranges (firmware checks address):
127 * Type DATA: 0x00 - 0xff
128 * Type IDATA: 0x80 - 0xff
129 * Type BDATA: 0x20 - 0x2f
130 * Type XDATA: 0x0000 - 0xffff
131 *
132 * B/I/DATA all read the local memory space
133 * XDATA reads the external memory space
134 * BDATA returns bits as bytes
135 *
136 * NOTE: 0x80 - 0xff (local space) are the Special Function Registers
137 * of the 8051, and some have on-read side-effects.
138 */
139
140struct whiteheat_dump {
141 __u8 mem_type; /* see WHITEHEAT_DUMP_* above */
142 __u16 addr; /* address, see restrictions above */
143 __u16 length; /* number of bytes to dump, max 63 bytes */
144};
145
146
147/*
148 * WHITEHEAT_PURGE
149 */
150#define WHITEHEAT_PURGE_RX 0x01 /* purge rx fifos */
151#define WHITEHEAT_PURGE_TX 0x02 /* purge tx fifos */
152
153struct whiteheat_purge {
154 __u8 port; /* port number (1 to N) */
155 __u8 what; /* bit pattern of what to purge */
156};
157
158
159/*
160 * WHITEHEAT_ECHO
161 */
162struct whiteheat_echo {
163 __u8 port; /* port number (1 to N) */
164 __u8 length; /* length of message to echo, max 61 bytes */
165 __u8 echo_data[61]; /* data to echo */
166};
167
168
169/*
170 * WHITEHEAT_DO_TEST
171 */
172#define WHITEHEAT_TEST_UART_RW 0x01 /* read/write uart registers */
173#define WHITEHEAT_TEST_UART_INTR 0x02 /* uart interrupt */
174#define WHITEHEAT_TEST_SETUP_CONT 0x03 /* setup for PORT_CONT/PORT_DISCONT */
175#define WHITEHEAT_TEST_PORT_CONT 0x04 /* port connect */
176#define WHITEHEAT_TEST_PORT_DISCONT 0x05 /* port disconnect */
177#define WHITEHEAT_TEST_UART_CLK_START 0x06 /* uart clock test start */
178#define WHITEHEAT_TEST_UART_CLK_STOP 0x07 /* uart clock test stop */
179#define WHITEHEAT_TEST_MODEM_FT 0x08 /* modem signals, requires a loopback cable/connector */
180#define WHITEHEAT_TEST_ERASE_EEPROM 0x09 /* erase eeprom */
181#define WHITEHEAT_TEST_READ_EEPROM 0x0a /* read eeprom */
182#define WHITEHEAT_TEST_PROGRAM_EEPROM 0x0b /* program eeprom */
183
184struct whiteheat_test {
185 __u8 port; /* port number (1 to n) */
186 __u8 test; /* see WHITEHEAT_TEST_* above*/
187 __u8 info[32]; /* additional info */
188};
189
190
191/*
192 * Replies from the firmware
193 */
194
195
196/*
197 * WHITEHEAT_STATUS
198 */
199#define WHITEHEAT_EVENT_MODEM 0x01 /* modem field is valid */
200#define WHITEHEAT_EVENT_ERROR 0x02 /* error field is valid */
201#define WHITEHEAT_EVENT_FLOW 0x04 /* flow field is valid */
202#define WHITEHEAT_EVENT_CONNECT 0x08 /* connect field is valid */
203
204#define WHITEHEAT_FLOW_NONE 0x00 /* no flow control active */
205#define WHITEHEAT_FLOW_HARD_OUT 0x01 /* TX is stopped by CTS (waiting for CTS to go on) */
206#define WHITEHEAT_FLOW_HARD_IN 0x02 /* remote TX is stopped by RTS */
207#define WHITEHEAT_FLOW_SOFT_OUT 0x04 /* TX is stopped by XOFF received (waiting for XON) */
208#define WHITEHEAT_FLOW_SOFT_IN 0x08 /* remote TX is stopped by XOFF transmitted */
209#define WHITEHEAT_FLOW_TX_DONE 0x80 /* TX has completed */
210
211struct whiteheat_status_info {
212 __u8 port; /* port number (1 to N) */
213 __u8 event; /* indicates what the current event is, see WHITEHEAT_EVENT_* above */
214 __u8 modem; /* modem signal status (copy of uart's MSR register) */
215 __u8 error; /* line status (copy of uart's LSR register) */
216 __u8 flow; /* flow control state, see WHITEHEAT_FLOW_* above */
217 __u8 connect; /* 0 means not connected, non-zero means connected */
218};
219
220
221/*
222 * WHITEHEAT_GET_DTR_RTS
223 */
224struct whiteheat_dr_info {
225 __u8 mcr; /* copy of uart's MCR register */
226};
227
228
229/*
230 * WHITEHEAT_GET_HW_INFO
231 */
232struct whiteheat_hw_info {
233 __u8 hw_id; /* hardware id number, WhiteHEAT = 0 */
234 __u8 sw_major_rev; /* major version number */
235 __u8 sw_minor_rev; /* minor version number */
236 struct whiteheat_hw_eeprom_info {
237 __u8 b0; /* B0 */
238 __u8 vendor_id_low; /* vendor id (low byte) */
239 __u8 vendor_id_high; /* vendor id (high byte) */
240 __u8 product_id_low; /* product id (low byte) */
241 __u8 product_id_high; /* product id (high byte) */
242 __u8 device_id_low; /* device id (low byte) */
243 __u8 device_id_high; /* device id (high byte) */
244 __u8 not_used_1;
245 __u8 serial_number_0; /* serial number (low byte) */
246 __u8 serial_number_1; /* serial number */
247 __u8 serial_number_2; /* serial number */
248 __u8 serial_number_3; /* serial number (high byte) */
249 __u8 not_used_2;
250 __u8 not_used_3;
251 __u8 checksum_low; /* checksum (low byte) */
252 __u8 checksum_high; /* checksum (high byte */
253 } hw_eeprom_info; /* EEPROM contents */
254};
255
256
257/*
258 * WHITEHEAT_EVENT
259 */
260struct whiteheat_event_info {
261 __u8 port; /* port number (1 to N) */
262 __u8 event; /* see whiteheat_status_info.event */
263 __u8 info; /* see whiteheat_status_info.modem, .error, .flow, .connect */
264};
265
266
267/*
268 * WHITEHEAT_DO_TEST
269 */
270#define WHITEHEAT_TEST_FAIL 0x00 /* test failed */
271#define WHITEHEAT_TEST_UNKNOWN 0x01 /* unknown test requested */
272#define WHITEHEAT_TEST_PASS 0xff /* test passed */
273
274struct whiteheat_test_info {
275 __u8 port; /* port number (1 to N) */
276 __u8 test; /* indicates which test this is a response for, see WHITEHEAT_DO_TEST above */
277 __u8 status; /* see WHITEHEAT_TEST_* above */
278 __u8 results[32]; /* test-dependent results */
279};
280
281
282#endif
diff --git a/drivers/usb/serial/whiteheat_fw.h b/drivers/usb/serial/whiteheat_fw.h
new file mode 100644
index 000000000000..8e0bdc746f9f
--- /dev/null
+++ b/drivers/usb/serial/whiteheat_fw.h
@@ -0,0 +1,1669 @@
1/*****************************************************************************
2 *
3 * whiteheat.h -- ConnectTech WhiteHEAT Firmware.
4 *
5 * Copyright (C) 2000-2002 ConnectTech Inc (http://www.connecttech.com/)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 * (10/09/2002) Stuart MacDonald
22 * Firmware 4.06
23 *
24 * (04/09/2000) gkh
25 * Updated the firmware with the latest provided by ConnectTech.
26 *
27 * (01/16/2000) gkh
28 * Fixed my intel hex processing tool, so now the firmware actually
29 * matches the original file (this was causing a few problems...)
30 *
31 * (01/15/2000) gkh
32 * Added debug loader firmware if DEBUG is #defined:
33 * Port 1 LED flashes when the vend_ax program is running
34 * Port 2 LED flashes when any SETUP command arrives
35 * Port 3 LED flashes when any valid VENDOR request occurs
36 * Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs
37 *
38 * version 1.0 (01/09/2000) gkh
39 * Original firmware from ConnectTech massaged a little to be program
40 * readable.
41 *
42 *****************************************************************************/
43
44#define whiteheat_DATE "20000106"
45
46struct whiteheat_hex_record {
47 __u16 address;
48 __u8 data_size;
49 __u8 data[16];
50};
51
52static const struct whiteheat_hex_record whiteheat_firmware[] = {
53{ 0x0000, 3, {0x02, 0x97, 0xe3} },
54{ 0x0003, 3, {0x02, 0x13, 0x12} },
55{ 0x000b, 3, {0x02, 0x0b, 0xb5} },
56{ 0x0033, 3, {0x02, 0x08, 0x1c} },
57{ 0x0043, 3, {0x02, 0x0a, 0x00} },
58{ 0x005b, 3, {0x02, 0x83, 0x3b} },
59{ 0x0370, 16, {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x73, 0x14, 0x70, 0x03, 0x02, 0x04, 0xe7, 0x24} },
60{ 0x0380, 16, {0xfe, 0x70, 0x03, 0x02, 0x05, 0x4f, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x64, 0x14, 0x70, 0x03} },
61{ 0x0390, 16, {0x02, 0x04, 0x52, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x49, 0x24} },
62{ 0x03a0, 16, {0x05, 0x60, 0x03, 0x02, 0x05, 0x9e, 0x90, 0x7f, 0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60} },
63{ 0x03b0, 16, {0x36, 0x24, 0x02, 0x70, 0x7b, 0x74, 0x12, 0x90, 0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5} },
64{ 0x03c0, 16, {0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0a, 0x99, 0xea, 0x49, 0x60, 0x0d} },
65{ 0x03d0, 16, {0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xb4} },
66{ 0x03e0, 16, {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0a, 0x58, 0xea} },
67{ 0x03f0, 16, {0x49, 0x60, 0x33, 0x12, 0xa2, 0x3b, 0xf5, 0x4e, 0x90, 0x7f, 0xee, 0xe0, 0xff, 0xe5, 0x4e, 0xd3} },
68{ 0x0400, 16, {0x9f, 0x40, 0x03, 0xe0, 0xf5, 0x4e, 0xe5, 0x4e, 0xd3, 0x94, 0x40, 0x40, 0x03, 0x75, 0x4e, 0x40} },
69{ 0x0410, 16, {0xae, 0x02, 0xaf, 0x01, 0x7c, 0x7f, 0x7d, 0x00, 0xab, 0x4e, 0x12, 0x91, 0x37, 0x90, 0x7f, 0xb5} },
70{ 0x0420, 16, {0xe5, 0x4e, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5} },
71{ 0x0430, 16, {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0x00, 0xe5, 0x21, 0xf0} },
72{ 0x0440, 16, {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x21, 0x02} },
73{ 0x0450, 16, {0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x35, 0xd2, 0x02, 0x43, 0x88, 0x10, 0xd2, 0xeb, 0xd2} },
74{ 0x0460, 16, {0xa8, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0x00, 0xe5, 0x35, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0} },
75{ 0x0470, 16, {0x02, 0x05, 0xa5, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02} },
76{ 0x0480, 16, {0x70, 0x5b, 0xa2, 0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x05, 0xe4, 0x33, 0x4f, 0x90} },
77{ 0x0490, 16, {0x7f, 0x00, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa5, 0xe4} },
78{ 0x04a0, 16, {0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa5, 0x90} },
79{ 0x04b0, 16, {0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25} },
80{ 0x04c0, 16, {0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0x01, 0x90, 0x7f, 0x00} },
81{ 0x04d0, 16, {0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xb4} },
82{ 0x04e0, 16, {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x1d, 0x24} },
83{ 0x04f0, 16, {0x02, 0x60, 0x03, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x05, 0xc2, 0x00, 0x02} },
84{ 0x0500, 16, {0x05, 0xa5, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0} },
85{ 0x0510, 16, {0x70, 0x34, 0x90, 0x7f, 0xec, 0xe0, 0xff, 0x54, 0x07, 0xfe, 0xf5, 0x4e, 0xef, 0x30, 0xe7, 0x03} },
86{ 0x0520, 16, {0x43, 0x4e, 0x10, 0x90, 0x7f, 0xd7, 0xe5, 0x4e, 0xf0, 0xe5, 0x4e, 0x44, 0x20, 0xf0, 0xef, 0xf4} },
87{ 0x0530, 16, {0x54, 0x80, 0xfd, 0xc4, 0x54, 0x0f, 0x2e, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
88{ 0x0540, 16, {0xf5, 0x83, 0xe4, 0xf0, 0x80, 0x5f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x56, 0x90} },
89{ 0x0550, 16, {0x7f, 0xe8, 0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4a, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
90{ 0x0560, 16, {0x01, 0x04, 0xd2, 0x00, 0x80, 0x3f, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x36, 0x90} },
91{ 0x0570, 16, {0x7f, 0xea, 0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f} },
92{ 0x0580, 16, {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
93{ 0x0590, 16, {0x74, 0x01, 0xf0, 0x80, 0x10, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x07, 0x90, 0x7f} },
94{ 0x05a0, 12, {0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
95{ 0x05ac, 1, {0x22} },
96{ 0x05ad, 16, {0x75, 0x4a, 0xff, 0x75, 0x49, 0xff, 0x75, 0x48, 0x0f, 0x75, 0x47, 0x00, 0xd2, 0x03, 0xc2, 0x06} },
97{ 0x05bd, 16, {0xc2, 0x02, 0xc2, 0x00, 0xc2, 0x05, 0xc2, 0x01, 0x90, 0x03, 0x00, 0x74, 0x19, 0xf0, 0xe4, 0x90} },
98{ 0x05cd, 16, {0x01, 0xbc, 0xf0, 0xc2, 0x04, 0x90, 0x01, 0xc0, 0xf0, 0xa3, 0xf0, 0xc2, 0xaf, 0xc2, 0xa8, 0x12} },
99{ 0x05dd, 16, {0x0c, 0x22, 0xe4, 0x90, 0x02, 0xaf, 0xf0, 0x90, 0x01, 0xbd, 0xf0, 0x90, 0x01, 0x00, 0xf0, 0xa3} },
100{ 0x05ed, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3} },
101{ 0x05fd, 16, {0x74, 0x08, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x12, 0x19, 0xc1, 0x75, 0x4c, 0x12, 0x75, 0x4d, 0x0a} },
102{ 0x060d, 16, {0x90, 0x01, 0x0b, 0xe0, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05, 0x4c, 0x14} },
103{ 0x061d, 16, {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x80, 0xff, 0x05, 0x4d, 0xe5} },
104{ 0x062d, 16, {0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01} },
105{ 0x063d, 16, {0x0d, 0xe0, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82} },
106{ 0x064d, 16, {0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70} },
107{ 0x065d, 16, {0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x12, 0x0a, 0xe4, 0x93, 0xff} },
108{ 0x066d, 16, {0x74, 0x01, 0x93, 0x90, 0x01, 0x1c, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0xff} },
109{ 0x067d, 16, {0xa3, 0xe0, 0xfe, 0xef, 0x6e, 0xff, 0x90, 0x01, 0x1c, 0xf0, 0xa3, 0xe0, 0x6f, 0xff, 0xf0, 0x90} },
110{ 0x068d, 16, {0x01, 0x1c, 0xe0, 0x6f, 0xf0, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x75, 0x52, 0x10} },
111{ 0x069d, 16, {0x75, 0x53, 0x02, 0x75, 0x54, 0x12, 0x75, 0x55, 0xac, 0x12, 0x94, 0x26, 0x75, 0x4c, 0x12, 0x75} },
112{ 0x06ad, 16, {0x4d, 0xb2, 0x90, 0x01, 0x0d, 0xe0, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05} },
113{ 0x06bd, 16, {0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x4d, 0xe5} },
114{ 0x06cd, 16, {0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x7f} },
115{ 0x06dd, 16, {0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x24, 0x41, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70} },
116{ 0x06ed, 16, {0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x05, 0x4d, 0xe5, 0x4d, 0xae, 0x4c} },
117{ 0x06fd, 16, {0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x75, 0x82, 0x10, 0x75, 0x83} },
118{ 0x070d, 16, {0x01, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x90, 0x01, 0x18, 0x12} },
119{ 0x071d, 16, {0xa3, 0xee, 0x7e, 0x01, 0x7f, 0x18, 0x12, 0x86, 0xbe, 0x90, 0x01, 0x18, 0xe0, 0xfc, 0xa3, 0xe0} },
120{ 0x072d, 16, {0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x75, 0x52, 0x0a, 0x75, 0x53, 0x06, 0x75, 0x54, 0x12} },
121{ 0x073d, 16, {0x75, 0x55, 0xb8, 0x12, 0x94, 0x26, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff} },
122{ 0x074d, 16, {0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44} },
123{ 0x075d, 16, {0x1f, 0xf0, 0xd2, 0xaf, 0x20, 0x01, 0x2e, 0x20, 0x01, 0x2b, 0xa2, 0x03, 0x92, 0x07, 0x12, 0x09} },
124{ 0x076d, 16, {0xc5, 0x75, 0x46, 0x50, 0x75, 0x45, 0x6d, 0x75, 0x44, 0x33, 0x75, 0x43, 0x00, 0x20, 0x01, 0xe4} },
125{ 0x077d, 16, {0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x43, 0x12, 0xa3, 0xd7, 0xec, 0x4d, 0x4e} },
126{ 0x078d, 16, {0x4f, 0x60, 0xd1, 0x80, 0xe8, 0x30, 0x01, 0x05, 0x12, 0x03, 0x70, 0xc2, 0x01, 0x30, 0x06, 0x0a} },
127{ 0x079d, 16, {0x12, 0x09, 0xfb, 0x50, 0x03, 0x12, 0x0a, 0xe8, 0xc2, 0x06, 0x12, 0x96, 0x5e, 0x90, 0x01, 0xbd} },
128{ 0x07ad, 16, {0xe0, 0x60, 0x0c, 0x12, 0x92, 0x01, 0xe4, 0x90, 0x01, 0xbd, 0xf0, 0x90, 0x7f, 0xd3, 0xf0, 0x90} },
129{ 0x07bd, 16, {0x02, 0xaf, 0xe0, 0xb4, 0x0f, 0x03, 0x12, 0x99, 0xb9, 0x12, 0xa0, 0x95, 0xe4, 0xff, 0x74, 0x01} },
130{ 0x07cd, 16, {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x90, 0x01, 0xbc, 0xe0, 0x5e, 0x60} },
131{ 0x07dd, 16, {0x14, 0x74, 0x28, 0x2f, 0xf8, 0xe6, 0xd3, 0x94, 0x0a, 0x40, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e} },
132{ 0x07ed, 16, {0x00, 0x8e, 0x4b, 0x80, 0x03, 0x75, 0x4b, 0x01, 0x74, 0x68, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x20} },
133{ 0x07fd, 16, {0xf5, 0x83, 0xe5, 0x4b, 0xf0, 0x0f, 0xbf, 0x04, 0xc5, 0xe5, 0x2c, 0xd3, 0x94, 0x0a, 0x40, 0x04} },
134{ 0x080d, 14, {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x90, 0x20, 0x6c, 0xef, 0xf0, 0x02, 0x07, 0x92} },
135{ 0x081b, 1, {0x22} },
136{ 0x081c, 4, {0x53, 0xd8, 0xef, 0x32} },
137{ 0x0820, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x0e, 0x90, 0x7f, 0x93, 0xe0, 0x44, 0x30, 0xf0, 0x90, 0x7f} },
138{ 0x0830, 16, {0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0} },
139{ 0x0840, 16, {0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x08} },
140{ 0x0850, 16, {0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xfb, 0xf0, 0x7f} },
141{ 0x0860, 16, {0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0xe5, 0x33, 0xc3, 0x94, 0x01, 0x50, 0x0e, 0x7f, 0x02, 0x7d} },
142{ 0x0870, 16, {0xff, 0x12, 0x82, 0xea, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x44} },
143{ 0x0880, 16, {0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96} },
144{ 0x0890, 16, {0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x54} },
145{ 0x08a0, 16, {0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0} },
146{ 0x08b0, 8, {0x7f, 0x32, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x22} },
147{ 0x08b8, 16, {0x90, 0x7f, 0x96, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x80, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12} },
148{ 0x08c8, 16, {0x09, 0xae, 0xe5, 0x33, 0xc3, 0x94, 0x01, 0x50, 0x0e, 0x7f, 0x02, 0xe4, 0xfd, 0x12, 0x82, 0xea} },
149{ 0x08d8, 16, {0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x05} },
150{ 0x08e8, 16, {0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x04, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
151{ 0x08f8, 16, {0x12, 0x09, 0xae, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xf7, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09} },
152{ 0x0908, 16, {0xae, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0xe5} },
153{ 0x0918, 16, {0x33, 0xc3, 0x94, 0x01, 0x40, 0x0e, 0x90, 0x7f, 0x93, 0xe0, 0x54, 0xcf, 0xf0, 0x90, 0x7f, 0x95} },
154{ 0x0928, 8, {0xe0, 0x54, 0x3f, 0xf0, 0x12, 0x0b, 0x00, 0x22} },
155{ 0x0930, 16, {0x90, 0x0a, 0xf4, 0xe4, 0x93, 0x70, 0x76, 0x90, 0x7f, 0x93, 0x74, 0x30, 0xf0, 0x90, 0x7f, 0x94} },
156{ 0x0940, 16, {0x74, 0x3c, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc6, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x09, 0xae} },
157{ 0x0950, 16, {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x08, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf} },
158{ 0x0960, 16, {0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x20, 0x70, 0xe0, 0xff, 0xc4, 0x54, 0x0f} },
159{ 0x0970, 16, {0xf5, 0x33, 0xc3, 0x94, 0x01, 0x50, 0x07, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x80, 0xf0, 0xe4, 0x90} },
160{ 0x0980, 16, {0x7f, 0x97, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x02, 0xf0, 0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x0b} },
161{ 0x0990, 16, {0xe4, 0x90, 0x7f, 0x98, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0xc0, 0xf0, 0x90, 0x7f, 0xe2, 0x74, 0x12} },
162{ 0x09a0, 14, {0xf0, 0x12, 0x08, 0x20, 0x75, 0x82, 0xf4, 0x75, 0x83, 0x0a, 0x74, 0xff, 0xf0, 0x22} },
163{ 0x09ae, 16, {0x8e, 0x5d, 0x8f, 0x5e, 0xe5, 0x5e, 0x15, 0x5e, 0xae, 0x5d, 0x70, 0x02, 0x15, 0x5d, 0x4e, 0x60} },
164{ 0x09be, 7, {0x05, 0x12, 0x09, 0xea, 0x80, 0xee, 0x22} },
165{ 0x09c5, 16, {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x07, 0x04, 0xe0, 0x44} },
166{ 0x09d5, 16, {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x09, 0xae, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
167{ 0x09e5, 5, {0xe0, 0x44, 0x04, 0xf0, 0x22} },
168{ 0x09ea, 16, {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
169{ 0x09fa, 1, {0x22} },
170{ 0x09fb, 5, {0x12, 0x08, 0xb8, 0xd3, 0x22} },
171{ 0x0a00, 16, {0x02, 0x0c, 0x4e, 0x00, 0x02, 0x0c, 0x81, 0x00, 0x02, 0x0c, 0x66, 0x00, 0x02, 0x0c, 0xc0, 0x00} },
172{ 0x0a10, 16, {0x02, 0x0c, 0xaa, 0x00, 0x02, 0x0a, 0xed, 0x00, 0x02, 0x0a, 0xee, 0x00, 0x02, 0x0a, 0xef, 0x00} },
173{ 0x0a20, 16, {0x02, 0x0c, 0xdb, 0x00, 0x02, 0x0d, 0xcb, 0x00, 0x02, 0x0d, 0x17, 0x00, 0x02, 0x0e, 0x2b, 0x00} },
174{ 0x0a30, 16, {0x02, 0x0d, 0x53, 0x00, 0x02, 0x0e, 0x8b, 0x00, 0x02, 0x0d, 0x8f, 0x00, 0x02, 0x0e, 0xeb, 0x00} },
175{ 0x0a40, 16, {0x02, 0x0a, 0xf0, 0x00, 0x02, 0x0a, 0xf2, 0x00, 0x02, 0x0a, 0xf1, 0x00, 0x02, 0x0a, 0xf3, 0x00} },
176{ 0x0a50, 8, {0x02, 0x0f, 0x4b, 0x00, 0x02, 0x0f, 0x61, 0x00} },
177{ 0x0a58, 2, {0x8f, 0x4f} },
178{ 0x0a5a, 16, {0xe4, 0xf5, 0x50, 0x75, 0x51, 0xff, 0x75, 0x52, 0x12, 0x75, 0x53, 0x6a, 0xab, 0x51, 0xaa, 0x52} },
179{ 0x0a6a, 16, {0xa9, 0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0xb4, 0x03, 0x1d, 0xaf, 0x50, 0x05, 0x50, 0xef} },
180{ 0x0a7a, 16, {0xb5, 0x4f, 0x01, 0x22, 0x12, 0xa2, 0x3b, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
181{ 0x0a8a, 14, {0x51, 0xff, 0xf5, 0x52, 0x89, 0x53, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
182{ 0x0a98, 1, {0x22} },
183{ 0x0a99, 16, {0xe4, 0xfe, 0x75, 0x51, 0xff, 0x75, 0x52, 0x12, 0x75, 0x53, 0x12, 0xab, 0x51, 0xaa, 0x52, 0xa9} },
184{ 0x0aa9, 16, {0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
185{ 0x0ab9, 16, {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0xa2, 0xad, 0x85, 0xf0, 0x4f, 0xf5, 0x50, 0x62, 0x4f} },
186{ 0x0ac9, 16, {0xe5, 0x4f, 0x62, 0x50, 0xe5, 0x50, 0x62, 0x4f, 0x29, 0xfd, 0xe5, 0x4f, 0x3a, 0xa9, 0x05, 0x75} },
187{ 0x0ad9, 14, {0x51, 0xff, 0xf5, 0x52, 0x89, 0x53, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
188{ 0x0ae7, 1, {0x22} },
189{ 0x0ae8, 5, {0x12, 0x08, 0x20, 0xd3, 0x22} },
190{ 0x0aed, 1, {0x32} },
191{ 0x0aee, 1, {0x32} },
192{ 0x0aef, 1, {0x32} },
193{ 0x0af0, 1, {0x32} },
194{ 0x0af1, 1, {0x32} },
195{ 0x0af2, 1, {0x32} },
196{ 0x0af3, 1, {0x32} },
197{ 0x0af4, 3, {0x00, 0x04, 0x07} },
198{ 0x0b00, 9, {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
199{ 0x0b7d, 16, {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
200{ 0x0b8d, 16, {0x53, 0x8e, 0xf7, 0xe5, 0x89, 0x54, 0xf1, 0x44, 0x01, 0xf5, 0x89, 0x75, 0x8c, 0xb1, 0xd2, 0xa9} },
201{ 0x0b9d, 16, {0x75, 0x98, 0x40, 0x75, 0xcb, 0xff, 0x75, 0xca, 0xf3, 0x75, 0xc8, 0x34, 0xe4, 0xff, 0x7f, 0x05} },
202{ 0x0bad, 7, {0x78, 0x28, 0xe4, 0xf6, 0x08, 0xdf, 0xfc} },
203{ 0x0bb4, 1, {0x22} },
204{ 0x0bb5, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xc0} },
205{ 0x0bc5, 1, {0x07} },
206{ 0x0bc6, 16, {0x30, 0x04, 0x16, 0x75, 0x8c, 0xf8, 0x75, 0x8a, 0x30, 0x7f, 0x2f, 0xae, 0x07, 0x1f, 0xee, 0x60} },
207{ 0x0bd6, 16, {0x3c, 0x90, 0x20, 0x00, 0x74, 0x55, 0xf0, 0x80, 0xf2, 0x75, 0x8c, 0xb1, 0x7f, 0x28, 0xef, 0xd3} },
208{ 0x0be6, 16, {0x94, 0x2c, 0x50, 0x09, 0xa8, 0x07, 0xe6, 0x60, 0x01, 0x16, 0x0f, 0x80, 0xf1, 0x90, 0x03, 0x00} },
209{ 0x0bf6, 16, {0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x0e, 0x90} },
210{ 0x0c06, 13, {0x01, 0xc1, 0xe0, 0x24, 0xff, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x34, 0xff, 0xf0} },
211{ 0x0c13, 15, {0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
212{ 0x0c22, 16, {0xd2, 0x00, 0x75, 0x8e, 0x10, 0x12, 0x09, 0x30, 0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x08, 0x90} },
213{ 0x0c32, 16, {0x7f, 0x92, 0x74, 0x02, 0xf0, 0x80, 0x05, 0xe4, 0x90, 0x7f, 0x92, 0xf0, 0x12, 0x80, 0x00, 0x12} },
214{ 0x0c42, 12, {0x0f, 0x7d, 0x12, 0x94, 0xf7, 0x12, 0x1b, 0x0c, 0x12, 0x0b, 0x8d, 0x22} },
215{ 0x0c4e, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
216{ 0x0c5e, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
217{ 0x0c66, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
218{ 0x0c76, 11, {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
219{ 0x0c81, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x90} },
220{ 0x0c91, 16, {0x7f, 0xd8, 0xe0, 0x70, 0x0d, 0x90, 0x7f, 0xd9, 0xe0, 0x70, 0x07, 0xe5, 0x2c, 0x70, 0x03, 0x75} },
221{ 0x0ca1, 9, {0x2c, 0x14, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
222{ 0x0caa, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
223{ 0x0cba, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
224{ 0x0cc0, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x30, 0x02, 0x02, 0xd2, 0x06, 0x53, 0x91, 0xef, 0x90, 0x7f} },
225{ 0x0cd0, 11, {0xab, 0x74, 0x08, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
226{ 0x0cdb, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
227{ 0x0ceb, 16, {0xa9, 0x74, 0x02, 0xf0, 0xe5, 0x34, 0x30, 0xe0, 0x13, 0xe5, 0x32, 0x30, 0xe0, 0x07, 0x90, 0x20} },
228{ 0x0cfb, 16, {0x04, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2c, 0x70, 0x03} },
229{ 0x0d0b, 12, {0x75, 0x2c, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
230{ 0x0d17, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
231{ 0x0d27, 16, {0xa9, 0x74, 0x04, 0xf0, 0xe5, 0x34, 0x30, 0xe1, 0x13, 0xe5, 0x32, 0x30, 0xe1, 0x07, 0x90, 0x20} },
232{ 0x0d37, 16, {0x0c, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2c, 0x70, 0x03} },
233{ 0x0d47, 12, {0x75, 0x2c, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
234{ 0x0d53, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
235{ 0x0d63, 16, {0xa9, 0x74, 0x08, 0xf0, 0xe5, 0x34, 0x30, 0xe2, 0x13, 0xe5, 0x32, 0x30, 0xe2, 0x07, 0x90, 0x20} },
236{ 0x0d73, 16, {0x14, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2c, 0x70, 0x03} },
237{ 0x0d83, 12, {0x75, 0x2c, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
238{ 0x0d8f, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f} },
239{ 0x0d9f, 16, {0xa9, 0x74, 0x10, 0xf0, 0xe5, 0x34, 0x30, 0xe3, 0x13, 0xe5, 0x32, 0x30, 0xe3, 0x07, 0x90, 0x20} },
240{ 0x0daf, 16, {0x1c, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x2c, 0x70, 0x03} },
241{ 0x0dbf, 12, {0x75, 0x2c, 0x14, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
242{ 0x0dcb, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
243{ 0x0ddb, 16, {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xe5, 0x34, 0x20} },
244{ 0x0deb, 16, {0xe0, 0x06, 0x90, 0x7f, 0xc7, 0xf0, 0x80, 0x22, 0xe5, 0x31, 0x30, 0xe0, 0x0a, 0x90, 0x7f, 0xc7} },
245{ 0x0dfb, 16, {0xe0, 0x90, 0x02, 0xf8, 0xf0, 0x80, 0x13, 0xe5, 0x22, 0x30, 0xe0, 0x07, 0x90, 0x20, 0x04, 0xe0} },
246{ 0x0e0b, 16, {0x44, 0x02, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2c, 0x70, 0x03, 0x75, 0x2c} },
247{ 0x0e1b, 16, {0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
248{ 0x0e2b, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
249{ 0x0e3b, 16, {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xe5, 0x34, 0x20} },
250{ 0x0e4b, 16, {0xe1, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x22, 0xe5, 0x31, 0x30, 0xe1, 0x0a, 0x90, 0x7f, 0xc9} },
251{ 0x0e5b, 16, {0xe0, 0x90, 0x02, 0xf9, 0xf0, 0x80, 0x13, 0xe5, 0x22, 0x30, 0xe1, 0x07, 0x90, 0x20, 0x0c, 0xe0} },
252{ 0x0e6b, 16, {0x44, 0x02, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2c, 0x70, 0x03, 0x75, 0x2c} },
253{ 0x0e7b, 16, {0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
254{ 0x0e8b, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
255{ 0x0e9b, 16, {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xe5, 0x34, 0x20} },
256{ 0x0eab, 16, {0xe2, 0x06, 0x90, 0x7f, 0xcb, 0xf0, 0x80, 0x22, 0xe5, 0x31, 0x30, 0xe2, 0x0a, 0x90, 0x7f, 0xcb} },
257{ 0x0ebb, 16, {0xe0, 0x90, 0x02, 0xfa, 0xf0, 0x80, 0x13, 0xe5, 0x22, 0x30, 0xe2, 0x07, 0x90, 0x20, 0x14, 0xe0} },
258{ 0x0ecb, 16, {0x44, 0x02, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2c, 0x70, 0x03, 0x75, 0x2c} },
259{ 0x0edb, 16, {0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
260{ 0x0eeb, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
261{ 0x0efb, 16, {0xd0, 0x75, 0xd0, 0x10, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xe5, 0x34, 0x20} },
262{ 0x0f0b, 16, {0xe3, 0x06, 0x90, 0x7f, 0xcd, 0xf0, 0x80, 0x22, 0xe5, 0x31, 0x30, 0xe3, 0x0a, 0x90, 0x7f, 0xcd} },
263{ 0x0f1b, 16, {0xe0, 0x90, 0x02, 0xfb, 0xf0, 0x80, 0x13, 0xe5, 0x22, 0x30, 0xe3, 0x07, 0x90, 0x20, 0x1c, 0xe0} },
264{ 0x0f2b, 16, {0x44, 0x02, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x2c, 0x70, 0x03, 0x75, 0x2c} },
265{ 0x0f3b, 16, {0x14, 0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
266{ 0x0f4b, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0} },
267{ 0x0f5b, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
268{ 0x0f61, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0x90} },
269{ 0x0f71, 12, {0x01, 0xbd, 0x74, 0xff, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
270{ 0x0f7d, 16, {0x90, 0x01, 0x20, 0x12, 0xa3, 0xfa, 0x00, 0x00, 0x25, 0x80, 0x90, 0x01, 0x24, 0x74, 0x08, 0xf0} },
271{ 0x0f8d, 16, {0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x6e, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x13, 0xf0, 0xa3, 0x74} },
272{ 0x0f9d, 16, {0x11, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} },
273{ 0x0fad, 16, {0x04, 0xa3, 0xf0, 0xef, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0, 0xa8} },
274{ 0x0fbd, 16, {0x01, 0xfc, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0x1f, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa2} },
275{ 0x0fcd, 16, {0x12, 0x7e, 0x01, 0x7f, 0x1f, 0x12, 0x87, 0xa6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0xe0, 0xc3} },
276{ 0x0fdd, 16, {0x94, 0x04, 0x40, 0xc7, 0xe4, 0xf5, 0x27, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} },
277{ 0x0fed, 16, {0xc3, 0x94, 0x04, 0x50, 0x1a, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4} },
278{ 0x0ffd, 16, {0xf0, 0x74, 0x23, 0x2f, 0xf8, 0xe4, 0xf6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xdc, 0xe4} },
279{ 0x100d, 16, {0xf5, 0x34, 0xe5, 0xc0, 0x60, 0x2f, 0x90, 0x01, 0x1e, 0x74, 0x01, 0xf0, 0x90, 0x01, 0x1e, 0xe0} },
280{ 0x101d, 16, {0xff, 0xd3, 0x94, 0x04, 0x50, 0x1f, 0xef, 0x14, 0xff, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02} },
281{ 0x102d, 16, {0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x34, 0x7e, 0x01, 0x7f, 0x1e, 0x12, 0x84, 0x41, 0x90, 0x01, 0x1e} },
282{ 0x103d, 16, {0xe0, 0x04, 0xf0, 0x80, 0xd7, 0xe4, 0xf5, 0x3e, 0xf5, 0x22, 0xf5, 0x31, 0xf5, 0x32, 0x90, 0x01} },
283{ 0x104d, 16, {0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4} },
284{ 0x105d, 16, {0x34, 0x20, 0xf5, 0x83, 0xe0, 0x54, 0xf0, 0xfe, 0x74, 0xc5, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x01} },
285{ 0x106d, 16, {0xf5, 0x83, 0xee, 0xf0, 0x74, 0x3a, 0x2f, 0xf8, 0xa6, 0x06, 0x74, 0x36, 0x2f, 0xf8, 0xe4, 0xf6} },
286{ 0x107d, 16, {0x74, 0x2d, 0x2f, 0xf8, 0xe4, 0xf6, 0x74, 0xfc, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83} },
287{ 0x108d, 16, {0xe4, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0xe0, 0xb4, 0x04, 0xb6, 0x90, 0x20, 0x60, 0xe0} },
288{ 0x109d, 4, {0x54, 0x0f, 0xf5, 0x4e} },
289{ 0x10a1, 16, {0x70, 0x03, 0x02, 0x11, 0x26, 0xe4, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff, 0xc3} },
290{ 0x10b1, 16, {0x94, 0x04, 0x50, 0xe4, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x55} },
291{ 0x10c1, 16, {0x4e, 0x60, 0x5a, 0x90, 0x01, 0x1e, 0xe0, 0xfe, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82} },
292{ 0x10d1, 16, {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0xff, 0xee, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82} },
293{ 0x10e1, 16, {0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0xee, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, 0xe4} },
294{ 0x10f1, 16, {0x34, 0x20, 0xf5, 0x83, 0xe0, 0xff, 0xaf, 0x06, 0xee, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x02, 0xf5} },
295{ 0x1101, 16, {0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0} },
296{ 0x1111, 16, {0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63, 0x7d, 0x06, 0x12, 0x83, 0xdf, 0x90, 0x01, 0x1e} },
297{ 0x1121, 6, {0xe0, 0x04, 0xf0, 0x80, 0x85, 0x22} },
298{ 0x1127, 2, {0xac, 0x07} },
299{ 0x1129, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xec, 0x25, 0xe0, 0x44, 0x41, 0x90, 0x7f, 0xa6, 0xf0} },
300{ 0x1139, 16, {0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
301{ 0x1149, 16, {0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0xd4, 0x80, 0xf8, 0x90, 0x7f} },
302{ 0x1159, 16, {0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xdc, 0x20, 0xe1, 0x09, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
303{ 0x1169, 16, {0xf9, 0x22, 0xed, 0x30, 0xe2, 0x0c, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f} },
304{ 0x1179, 16, {0xfa, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7b, 0x1e} },
305{ 0x1189, 16, {0xaf, 0x03, 0x1b, 0xef, 0x70, 0x16, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6} },
306{ 0x1199, 16, {0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x60, 0x86, 0x80, 0xf8, 0x90, 0x7f, 0xa5, 0xe0} },
307{ 0x11a9, 16, {0xfd, 0x20, 0xe0, 0xdc, 0x7b, 0x3c, 0xaf, 0x03, 0x1b, 0xef, 0x70, 0x19, 0x90, 0x7f, 0xa5, 0xe0} },
308{ 0x11b9, 16, {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0x7d, 0x32, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03} },
309{ 0x11c9, 16, {0x02, 0x11, 0x29, 0x80, 0xf5, 0x90, 0x7f, 0xa5, 0xe0, 0xfd, 0x30, 0xe0, 0xd9, 0x30, 0xe2, 0x09} },
310{ 0x11d9, 16, {0xe0, 0x44, 0x40, 0xf0, 0x7e, 0xff, 0x7f, 0xfa, 0x22, 0xc2, 0xaf, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
311{ 0x11e9, 12, {0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xfd, 0xd2, 0xaf, 0xff, 0x7e, 0x00} },
312{ 0x11f5, 1, {0x22} },
313{ 0x1200, 16, {0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40, 0x10, 0x07, 0x01, 0x80, 0x42, 0x00, 0x01, 0x02} },
314{ 0x1210, 16, {0x03, 0x01, 0x09, 0x02, 0x58, 0x00, 0x01, 0x01, 0x04, 0x80, 0x3c, 0x09, 0x04, 0x00, 0x00, 0x0a} },
315{ 0x1220, 16, {0xff, 0xff, 0xff, 0x05, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40} },
316{ 0x1230, 16, {0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00} },
317{ 0x1240, 16, {0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05} },
318{ 0x1250, 16, {0x84, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x87, 0x02} },
319{ 0x1260, 16, {0x40, 0x00, 0x00, 0x07, 0x05, 0x07, 0x02, 0x40, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x24, 0x03} },
320{ 0x1270, 16, {0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00} },
321{ 0x1280, 16, {0x54, 0x00, 0x65, 0x00, 0x63, 0x00, 0x68, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00} },
322{ 0x1290, 16, {0x2e, 0x00, 0x18, 0x03, 0x57, 0x00, 0x68, 0x00, 0x69, 0x00, 0x74, 0x00, 0x65, 0x00, 0x48, 0x00} },
323{ 0x12a0, 16, {0x45, 0x00, 0x41, 0x00, 0x54, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x1a, 0x03, 0x58, 0x00, 0x58, 0x00} },
324{ 0x12b0, 16, {0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00} },
325{ 0x12c0, 16, {0x58, 0x00, 0x58, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
326{ 0x12d0, 16, {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
327{ 0x12e0, 16, {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
328{ 0x12f0, 16, {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
329{ 0x1300, 16, {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
330{ 0x1310, 2, {0x00, 0x00} },
331{ 0x1312, 16, {0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0xc0, 0xd0} },
332{ 0x1322, 16, {0x75, 0x86, 0x00, 0x75, 0xd0, 0x18, 0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xf5, 0xf0, 0x70, 0x11} },
333{ 0x1332, 16, {0xd0, 0xd0, 0xd0, 0x86, 0xd0, 0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0} },
334{ 0x1342, 16, {0x32, 0x75, 0x86, 0x00, 0x10, 0xf0, 0x0b, 0x10, 0xf1, 0x12, 0x10, 0xf2, 0x19, 0x10, 0xf3, 0x20} },
335{ 0x1352, 16, {0x80, 0xd4, 0xe5, 0x28, 0x70, 0x03, 0x75, 0x28, 0x14, 0x02, 0x13, 0x7c, 0xe5, 0x29, 0x70, 0x03} },
336{ 0x1362, 16, {0x75, 0x29, 0x14, 0x02, 0x15, 0x0d, 0xe5, 0x2a, 0x70, 0x03, 0x75, 0x2a, 0x14, 0x02, 0x16, 0x9e} },
337{ 0x1372, 16, {0xe5, 0x2b, 0x70, 0x03, 0x75, 0x2b, 0x14, 0x02, 0x18, 0x2f, 0x90, 0x20, 0x02, 0xe0, 0x54, 0x3f} },
338{ 0x1382, 16, {0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02, 0x13} },
339{ 0x1392, 16, {0x43, 0x02, 0x14, 0x65, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x3a, 0x02, 0x13, 0x43} },
340{ 0x13a2, 16, {0x43, 0x82, 0x04, 0xe0, 0x43, 0x2d, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x05} },
341{ 0x13b2, 16, {0xe0, 0x42, 0x36, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1, 0x02} },
342{ 0x13c2, 16, {0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x32, 0x30, 0xe0, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04, 0xe0} },
343{ 0x13d2, 16, {0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x00, 0xf0, 0x90, 0x20} },
344{ 0x13e2, 16, {0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86} },
345{ 0x13f2, 16, {0x90, 0x7e, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f} },
346{ 0x1402, 16, {0xe5, 0xe5, 0x3f, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
347{ 0x1412, 16, {0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90} },
348{ 0x1422, 16, {0x7f, 0xb7, 0xed, 0xf0, 0x90, 0x20, 0x01, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f, 0x40} },
349{ 0x1432, 16, {0x90, 0x7e, 0x80, 0x05, 0x86, 0x90, 0x20, 0x00, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d, 0x84} },
350{ 0x1442, 16, {0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef, 0x05} },
351{ 0x1452, 16, {0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb7, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe, 0xf0} },
352{ 0x1462, 16, {0x02, 0x13, 0x43, 0x53, 0x2d, 0xfa, 0xe5, 0x23, 0x60, 0x08, 0x75, 0x23, 0x00, 0xd2, 0xe7, 0xfe} },
353{ 0x1472, 16, {0x80, 0x0a, 0x90, 0x7f, 0xc7, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x14, 0xff, 0x90, 0x20, 0x50, 0x74} },
354{ 0x1482, 16, {0x00, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
355{ 0x1492, 16, {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7e, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
356{ 0x14a2, 16, {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0, 0x05} },
357{ 0x14b2, 16, {0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03, 0x03} },
358{ 0x14c2, 16, {0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
359{ 0x14d2, 16, {0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x23, 0x90, 0x7f} },
360{ 0x14e2, 16, {0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde, 0xfd} },
361{ 0x14f2, 16, {0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x90, 0x20, 0x01} },
362{ 0x1502, 16, {0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc7, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20, 0x0a, 0xe0, 0x54} },
363{ 0x1512, 16, {0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14, 0x60, 0x09, 0x02} },
364{ 0x1522, 16, {0x13, 0x43, 0x02, 0x15, 0xf6, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5, 0x3b, 0x02, 0x13} },
365{ 0x1532, 16, {0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2e, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82, 0xf8, 0x43, 0x82} },
366{ 0x1542, 16, {0x05, 0xe0, 0x42, 0x37, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13, 0x43, 0x30, 0xe1} },
367{ 0x1552, 16, {0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x32, 0x30, 0xe1, 0x0a, 0x53, 0x82, 0xf8, 0x43, 0x82, 0x04} },
368{ 0x1562, 16, {0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74, 0x01, 0xf0, 0x90} },
369{ 0x1572, 16, {0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05} },
370{ 0x1582, 16, {0x86, 0x90, 0x7e, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90} },
371{ 0x1592, 16, {0x7f, 0xe5, 0xe5, 0x40, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0} },
372{ 0x15a2, 16, {0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
373{ 0x15b2, 16, {0x90, 0x7f, 0xb9, 0xed, 0xf0, 0x90, 0x20, 0x09, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x7f} },
374{ 0x15c2, 16, {0x40, 0x90, 0x7e, 0x00, 0x05, 0x86, 0x90, 0x20, 0x08, 0xe5, 0x84, 0xfe, 0x24, 0x05, 0xfd, 0x8d} },
375{ 0x15d2, 16, {0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xef} },
376{ 0x15e2, 16, {0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xb9, 0xf0, 0x05, 0x86, 0xa3, 0xe0, 0x54, 0xfe} },
377{ 0x15f2, 16, {0xf0, 0x02, 0x13, 0x43, 0x53, 0x2e, 0xfa, 0xe5, 0x24, 0x60, 0x08, 0x75, 0x24, 0x00, 0xd2, 0xe7} },
378{ 0x1602, 16, {0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xc9, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x16, 0x90, 0x90, 0x20, 0x50} },
379{ 0x1612, 16, {0x74, 0x01, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
380{ 0x1622, 16, {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0xc0, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
381{ 0x1632, 16, {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0, 0x24, 0x38, 0xf0} },
382{ 0x1642, 16, {0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60, 0x30, 0x03, 0x03} },
383{ 0x1652, 16, {0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0} },
384{ 0x1662, 16, {0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11, 0x8b, 0x24, 0x90} },
385{ 0x1672, 16, {0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80, 0x1b, 0xe0, 0xde} },
386{ 0x1682, 14, {0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
387{ 0x1690, 16, {0x90, 0x20, 0x09, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x02, 0x13, 0x43, 0x90, 0x20} },
388{ 0x16a0, 16, {0x12, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5, 0x14} },
389{ 0x16b0, 16, {0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x17, 0x87, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0xf5} },
390{ 0x16c0, 16, {0x3c, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x2f, 0x01, 0x02, 0x13, 0x43, 0x53, 0x82} },
391{ 0x16d0, 16, {0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x38, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02, 0x13} },
392{ 0x16e0, 16, {0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x32, 0x30, 0xe2, 0x0a, 0x53, 0x82, 0xf8} },
393{ 0x16f0, 16, {0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50, 0x74} },
394{ 0x1700, 16, {0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0, 0x90} },
395{ 0x1710, 16, {0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x80, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84, 0xf0} },
396{ 0x1720, 16, {0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x41, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0} },
397{ 0x1730, 16, {0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58} },
398{ 0x1740, 16, {0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbb, 0xed, 0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfe, 0xf0, 0x02} },
399{ 0x1750, 16, {0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x80, 0x05, 0x86, 0x90, 0x20, 0x10, 0xe5, 0x84, 0xfe, 0x24} },
400{ 0x1760, 16, {0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x05} },
401{ 0x1770, 16, {0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbb, 0xf0, 0x05, 0x86, 0xa3} },
402{ 0x1780, 16, {0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x2f, 0xfa, 0xe5, 0x25, 0x60, 0x08, 0x75, 0x25} },
403{ 0x1790, 16, {0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcb, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x18, 0x21} },
404{ 0x17a0, 16, {0x90, 0x20, 0x50, 0x74, 0x02, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0} },
405{ 0x17b0, 16, {0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x40, 0x05, 0x86, 0xe5, 0x85, 0xf0} },
406{ 0x17c0, 16, {0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86, 0xe0} },
407{ 0x17d0, 16, {0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78, 0x60} },
408{ 0x17e0, 16, {0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0, 0xe0} },
409{ 0x17f0, 16, {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70, 0x11} },
410{ 0x1800, 16, {0x8b, 0x25, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0, 0x80} },
411{ 0x1810, 16, {0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00} },
412{ 0x1820, 16, {0xf0, 0x90, 0x20, 0x11, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcb, 0xf0, 0x02, 0x13, 0x43, 0x90} },
413{ 0x1830, 16, {0x20, 0x1a, 0xe0, 0x54, 0x3f, 0x20, 0xe2, 0x3a, 0x20, 0xe1, 0x0b, 0x20, 0xe4, 0x0b, 0x20, 0xe5} },
414{ 0x1840, 16, {0x14, 0x60, 0x09, 0x02, 0x13, 0x43, 0x02, 0x19, 0x18, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0} },
415{ 0x1850, 16, {0xf5, 0x3d, 0x02, 0x13, 0x43, 0x43, 0x82, 0x04, 0xe0, 0x43, 0x30, 0x01, 0x02, 0x13, 0x43, 0x53} },
416{ 0x1860, 16, {0x82, 0xf8, 0x43, 0x82, 0x05, 0xe0, 0x42, 0x39, 0x53, 0x82, 0xfb, 0xe0, 0x54, 0xfb, 0xf0, 0x02} },
417{ 0x1870, 16, {0x13, 0x43, 0x30, 0xe1, 0x02, 0x80, 0xe8, 0xf5, 0x85, 0xe5, 0x32, 0x30, 0xe3, 0x0a, 0x53, 0x82} },
418{ 0x1880, 16, {0xf8, 0x43, 0x82, 0x04, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x85, 0x20, 0xe3, 0x56, 0x90, 0x20, 0x50} },
419{ 0x1890, 16, {0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2, 0xe0, 0x44, 0x40, 0xf0} },
420{ 0x18a0, 16, {0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7d, 0x00, 0x05, 0x86, 0xe5, 0x85, 0xf0, 0xa3, 0xe5, 0x84} },
421{ 0x18b0, 16, {0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xe5, 0x42, 0xfd, 0x03, 0x03, 0x03, 0xfe, 0xf0, 0xf0, 0xf0} },
422{ 0x18c0, 16, {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xde, 0xf6, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20} },
423{ 0x18d0, 16, {0x58, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0xbd, 0xed, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfe, 0xf0} },
424{ 0x18e0, 16, {0x02, 0x13, 0x43, 0x7f, 0x40, 0x90, 0x7d, 0x00, 0x05, 0x86, 0x90, 0x20, 0x18, 0xe5, 0x84, 0xfe} },
425{ 0x18f0, 16, {0x24, 0x05, 0xfd, 0x8d, 0x84, 0xe0, 0x8e, 0x84, 0x30, 0xe0, 0x09, 0xe0, 0x05, 0x86, 0xf0, 0xa3} },
426{ 0x1900, 16, {0x05, 0x86, 0xdf, 0xef, 0x05, 0x86, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x7f, 0xbd, 0xf0, 0x05, 0x86} },
427{ 0x1910, 16, {0xa3, 0xe0, 0x54, 0xfe, 0xf0, 0x02, 0x13, 0x43, 0x53, 0x30, 0xfa, 0xe5, 0x26, 0x60, 0x08, 0x75} },
428{ 0x1920, 16, {0x26, 0x00, 0xd2, 0xe7, 0xfe, 0x80, 0x0a, 0x90, 0x7f, 0xcd, 0xe0, 0xfe, 0x70, 0x03, 0x02, 0x19} },
429{ 0x1930, 16, {0xb2, 0x90, 0x20, 0x50, 0x74, 0x03, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xe2} },
430{ 0x1940, 16, {0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xe3, 0x05, 0x86, 0x90, 0x7c, 0xc0, 0x05, 0x86, 0xe5, 0x85} },
431{ 0x1950, 16, {0xf0, 0xa3, 0xe5, 0x84, 0xf0, 0x05, 0x86, 0x90, 0x7f, 0xe5, 0xee, 0x30, 0xe7, 0x08, 0x05, 0x86} },
432{ 0x1960, 16, {0xe0, 0x24, 0x38, 0xf0, 0x05, 0x86, 0xee, 0x54, 0x7f, 0xfe, 0x54, 0x07, 0xfb, 0xee, 0x54, 0x78} },
433{ 0x1970, 16, {0x60, 0x30, 0x03, 0x03, 0x03, 0x30, 0xe3, 0x04, 0x74, 0x07, 0x7b, 0x08, 0xfd, 0xfc, 0xe0, 0xe0} },
434{ 0x1980, 16, {0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdd, 0xf6, 0xeb, 0xfe, 0x60, 0x19, 0xec, 0x64, 0x07, 0x70} },
435{ 0x1990, 16, {0x11, 0x8b, 0x26, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74, 0x00, 0xf0} },
436{ 0x19a0, 16, {0x80, 0x1b, 0xe0, 0xde, 0xfd, 0x90, 0x7f, 0xe2, 0xe0, 0x54, 0xbf, 0xf0, 0x90, 0x20, 0x58, 0x74} },
437{ 0x19b0, 16, {0x00, 0xf0, 0x90, 0x20, 0x19, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0x7f, 0xcd, 0xf0, 0x02, 0x13, 0x43} },
438{ 0x19c0, 1, {0x32} },
439{ 0x19c1, 4, {0xad, 0x07, 0xac, 0x06} },
440{ 0x19c5, 16, {0x79, 0x06, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb} },
441{ 0x19d5, 16, {0x4a, 0x70, 0x03, 0x02, 0x1b, 0x09, 0xe9, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x1a, 0xdb, 0x90} },
442{ 0x19e5, 16, {0x19, 0xeb, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x1a, 0xb9, 0x02, 0x1a, 0x71, 0x02, 0x1a, 0x5a, 0x02} },
443{ 0x19f5, 16, {0x1a, 0x40, 0x02, 0x1a, 0x2f, 0x02, 0x1a, 0x1a, 0x02, 0x1a, 0x00, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
444{ 0x1a05, 16, {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6} },
445{ 0x1a15, 16, {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x19, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x0a} },
446{ 0x1a25, 16, {0xa3, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x02, 0x1a, 0xdb, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
447{ 0x1a35, 16, {0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x19, 0x02, 0x1a, 0xdb, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
448{ 0x1a45, 16, {0x80, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa1, 0x90, 0x7f, 0xa6} },
449{ 0x1a55, 16, {0xf0, 0x19, 0x02, 0x1a, 0xdb, 0xeb, 0x64, 0x01, 0x4a, 0x70, 0x08, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
450{ 0x1a65, 16, {0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xf5, 0x59, 0x19, 0x80, 0x6a, 0xed, 0x24, 0x04, 0xf5} },
451{ 0x1a75, 16, {0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x64, 0x02, 0x4e, 0x70, 0x08, 0x90, 0x7f} },
452{ 0x1a85, 16, {0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xff, 0xed, 0x24, 0x06, 0xf5, 0x82} },
453{ 0x1a95, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83} },
454{ 0x1aa5, 16, {0xef, 0xf0, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12} },
455{ 0x1ab5, 16, {0xa2, 0x81, 0x80, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xff} },
456{ 0x1ac5, 16, {0xed, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xf5, 0x82, 0x8a} },
457{ 0x1ad5, 16, {0x83, 0xef, 0xf0, 0x7f, 0x08, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x59, 0x30, 0xe0, 0xf7, 0x30} },
458{ 0x1ae5, 16, {0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xe9, 0xd3, 0x94, 0x02, 0x50, 0x03, 0x02} },
459{ 0x1af5, 16, {0x19, 0xc7, 0xe5, 0x59, 0x30, 0xe1, 0x03, 0x02, 0x19, 0xc7, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40} },
460{ 0x1b05, 6, {0xf0, 0x7f, 0x07, 0x22, 0x7f, 0x08} },
461{ 0x1b0b, 1, {0x22} },
462{ 0x1b0c, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x50, 0x1c, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x7f, 0x02} },
463{ 0x1b1c, 16, {0x7d, 0xff, 0x12, 0x82, 0xea, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x7f, 0x03, 0x7d, 0xff} },
464{ 0x1b2c, 4, {0x12, 0x82, 0xea, 0x22} },
465{ 0x8000, 16, {0x7b, 0xff, 0x7a, 0x12, 0x79, 0x1b, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x54, 0xfd, 0x8b, 0x50, 0x75} },
466{ 0x8010, 16, {0x51, 0x12, 0x75, 0x52, 0x24, 0xe4, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xe0, 0xf0, 0xf5, 0x4e} },
467{ 0x8020, 16, {0xf5, 0x4f, 0x90, 0x02, 0xae, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f} },
468{ 0x8030, 16, {0xa9, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0xe4, 0xfc, 0xec, 0x25, 0xe0, 0x24, 0xb4, 0xf5} },
469{ 0x8040, 16, {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x0c, 0xbc, 0x10, 0xee, 0xe4, 0x90, 0x7f, 0xdd} },
470{ 0x8050, 16, {0xf0, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03, 0x02, 0x81, 0xc6, 0xab, 0x50, 0xaa, 0x51, 0xa9, 0x52} },
471{ 0x8060, 16, {0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0x64, 0x05, 0x60, 0x03, 0x02, 0x81, 0xb5, 0x90, 0x00, 0x03} },
472{ 0x8070, 16, {0x12, 0xa2, 0x54, 0x64, 0x01, 0x60, 0x03, 0x02, 0x81, 0x3c, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x54} },
473{ 0x8080, 16, {0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50, 0x03, 0x02, 0x81, 0x16, 0xec, 0xc3, 0x94, 0x10} },
474{ 0x8090, 16, {0x40, 0x03, 0x02, 0x81, 0x16, 0xef, 0x30, 0xe7, 0x42, 0xe5, 0x4f, 0xae, 0x4e, 0x78, 0x02, 0xce} },
475{ 0x80a0, 16, {0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xf0, 0x2c, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5} },
476{ 0x80b0, 16, {0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe0, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01, 0xa8, 0x06} },
477{ 0x80c0, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x02, 0xae, 0xe0} },
478{ 0x80d0, 16, {0x04, 0xf0, 0x90, 0x7f, 0xdd, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x3e, 0xe5, 0x4f, 0xae, 0x4e, 0x78} },
479{ 0x80e0, 16, {0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xe8, 0x2c, 0xf5, 0x82, 0xe4, 0x34} },
480{ 0x80f0, 16, {0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe1, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01} },
481{ 0x8100, 16, {0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x02} },
482{ 0x8110, 16, {0xae, 0xe0, 0x04, 0xf0, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x54, 0x25} },
483{ 0x8120, 16, {0x4f, 0xf5, 0x4f, 0xe4, 0x35, 0x4e, 0xf5, 0x4e, 0x90, 0x00, 0x05, 0x12, 0xa2, 0x54, 0xfe, 0xe4} },
484{ 0x8130, 16, {0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5, 0x4e, 0x02, 0x81, 0xb8, 0xab, 0x50, 0xaa, 0x51} },
485{ 0x8140, 16, {0xa9, 0x52, 0x90, 0x00, 0x03, 0x12, 0xa2, 0x54, 0xff, 0x64, 0x02, 0x60, 0x05, 0xef, 0x64, 0x03} },
486{ 0x8150, 16, {0x70, 0x60, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x54, 0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50} },
487{ 0x8160, 16, {0x4e, 0xef, 0x30, 0xe7, 0x1e, 0x90, 0x7f, 0xde, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80} },
488{ 0x8170, 16, {0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x4e} },
489{ 0x8180, 16, {0xf0, 0x80, 0x35, 0x90, 0x7f, 0xdf, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80, 0x02, 0xc3} },
490{ 0x8190, 16, {0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xad, 0xe0, 0x4e, 0xf0, 0xec} },
491{ 0x81a0, 16, {0x25, 0xe0, 0x24, 0xc5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xec, 0xf0, 0x80, 0x09, 0x7f} },
492{ 0x81b0, 16, {0xff, 0x22, 0x7f, 0xff, 0x22, 0x7f, 0xff, 0x22, 0x74, 0x07, 0x25, 0x52, 0xf5, 0x52, 0xe4, 0x35} },
493{ 0x81c0, 16, {0x51, 0xf5, 0x51, 0x02, 0x80, 0x51, 0x20, 0x03, 0x0d, 0x90, 0x02, 0xae, 0xe0, 0x60, 0x07, 0x90} },
494{ 0x81d0, 8, {0x7f, 0xae, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0x00} },
495{ 0x81d8, 1, {0x22} },
496{ 0x81d9, 4, {0x8e, 0x59, 0x8f, 0x5a} },
497{ 0x81dd, 16, {0x75, 0x5b, 0x03, 0xe5, 0x5a, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x59, 0xf5, 0x83, 0xe0, 0xfe} },
498{ 0x81ed, 16, {0xa3, 0xe0, 0x4e, 0x70, 0x03, 0x02, 0x82, 0xe7, 0xe5, 0x5b, 0x60, 0x4e, 0x14, 0x60, 0x38, 0x14} },
499{ 0x81fd, 16, {0x60, 0x20, 0x14, 0x60, 0x03, 0x02, 0x82, 0x8b, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0x85} },
500{ 0x820d, 16, {0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90, 0x7f, 0xa6, 0xf0} },
501{ 0x821d, 16, {0x80, 0x6c, 0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x09, 0xa3, 0xa3} },
502{ 0x822d, 16, {0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x57, 0x15, 0x5b, 0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3} },
503{ 0x823d, 16, {0xa3, 0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x44, 0xe5, 0x5a, 0x24, 0x06, 0xf5, 0x82} },
504{ 0x824d, 16, {0xe4, 0x35, 0x59, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5} },
505{ 0x825d, 16, {0x83, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe5, 0x5a, 0x24} },
506{ 0x826d, 16, {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x59, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0xa2, 0x81, 0x85} },
507{ 0x827d, 16, {0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3, 0xa3, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x81, 0x90, 0x7f} },
508{ 0x828d, 16, {0xa5, 0xe0, 0xf5, 0x5c, 0x30, 0xe0, 0xf7, 0x30, 0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06} },
509{ 0x829d, 16, {0x22, 0xe5, 0x5c, 0x20, 0xe1, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22} },
510{ 0x82ad, 16, {0xe5, 0x5b, 0x70, 0x31, 0x7f, 0x01, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0xa5, 0xe0, 0x44} },
511{ 0x82bd, 16, {0x80, 0xf0, 0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3, 0xe0, 0xff, 0x25, 0xe0, 0x44, 0xa0, 0x90} },
512{ 0x82cd, 16, {0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x5c, 0x30, 0xe0, 0xf7, 0x30, 0xe1, 0xd5, 0x75} },
513{ 0x82dd, 12, {0x5b, 0x03, 0x02, 0x81, 0xe0, 0x15, 0x5b, 0x02, 0x81, 0xe0, 0x7f, 0x08} },
514{ 0x82e9, 1, {0x22} },
515{ 0x82ea, 2, {0xae, 0x07} },
516{ 0x82ec, 16, {0x7c, 0x02, 0xec, 0x14, 0x60, 0x15, 0x14, 0x70, 0x1e, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0} },
517{ 0x82fc, 16, {0xee, 0x25, 0xe0, 0x44, 0x40, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x0c, 0x90, 0x7f, 0xa6, 0xed, 0xf0} },
518{ 0x830c, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0xfb, 0x30, 0xe0, 0xf8, 0xbc} },
519{ 0x831c, 16, {0x02, 0x0a, 0x20, 0xe1, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22, 0xeb, 0x30, 0xe2, 0x0a} },
520{ 0x832c, 14, {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xdc, 0xb6, 0x7f, 0x08} },
521{ 0x833a, 1, {0x22} },
522{ 0x833b, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc2, 0xa9, 0x90, 0x03, 0x00, 0x74, 0x19, 0xf0, 0xd2, 0xa9} },
523{ 0x834b, 15, {0x53, 0x91, 0x7f, 0x90, 0x01, 0xc4, 0xe4, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
524{ 0x835a, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xf5} },
525{ 0x836a, 16, {0x83, 0xa3, 0xe4, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x61, 0x74, 0xbf} },
526{ 0x837a, 16, {0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0, 0x44, 0x10, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3} },
527{ 0x838a, 16, {0xa3, 0xa3, 0xe4, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xf0, 0xf9, 0xed, 0x60, 0x1d, 0x74, 0x01} },
528{ 0x839a, 16, {0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4} },
529{ 0x83aa, 16, {0xef, 0x55, 0x31, 0x60, 0x04, 0x79, 0x09, 0x80, 0x02, 0x79, 0x0d, 0x8b, 0x82, 0x8a, 0x83, 0xa3} },
530{ 0x83ba, 16, {0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x8b, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xe0, 0x54, 0xef, 0xf0, 0x8b} },
531{ 0x83ca, 16, {0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x61, 0xf0, 0xae, 0x02, 0xaf, 0x03, 0x8f, 0x82, 0x8e} },
532{ 0x83da, 4, {0x83, 0xa3, 0xe9, 0xf0} },
533{ 0x83de, 1, {0x22} },
534{ 0x83df, 4, {0x8f, 0x61, 0x8d, 0x62} },
535{ 0x83e3, 16, {0xe4, 0xf5, 0x67, 0x74, 0x3f, 0x2f, 0xf8, 0x76, 0x08, 0x7f, 0x80, 0x7e, 0x25, 0x7d, 0x00, 0x7c} },
536{ 0x83f3, 16, {0x00, 0xab, 0x66, 0xaa, 0x65, 0xa9, 0x64, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0xb3, 0x40, 0x26, 0x7f} },
537{ 0x8403, 16, {0x00, 0x7e, 0x96, 0x7d, 0x00, 0x7c, 0x00, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0xb3, 0x50, 0x0c, 0x75} },
538{ 0x8413, 16, {0x67, 0x40, 0x74, 0x3f, 0x25, 0x61, 0xf8, 0x76, 0x10, 0x80, 0x0a, 0x75, 0x67, 0x80, 0x74, 0x3f} },
539{ 0x8423, 16, {0x25, 0x61, 0xf8, 0x76, 0x38, 0xe5, 0x67, 0x45, 0x62, 0x44, 0x01, 0xff, 0xe5, 0x61, 0x75, 0xf0} },
540{ 0x8433, 13, {0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xef, 0xf0} },
541{ 0x8440, 1, {0x22} },
542{ 0x8441, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x57, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22} },
543{ 0x8451, 16, {0xe5, 0x57, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5} },
544{ 0x8461, 16, {0x58, 0x8f, 0x59, 0xe5, 0x57, 0x25, 0xe0, 0x24, 0xc6, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
545{ 0x8471, 16, {0xe0, 0x20, 0xe1, 0x0f, 0xe5, 0x57, 0x25, 0xe0, 0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5} },
546{ 0x8481, 16, {0x83, 0xe4, 0xf0, 0x74, 0x23, 0x25, 0x57, 0xf8, 0xe4, 0xf6, 0xe5, 0x59, 0x24, 0x04, 0xf5, 0x82} },
547{ 0x8491, 16, {0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0, 0x44, 0x03, 0xf0, 0xe5, 0x57, 0x75, 0xf0, 0x0d, 0xa4, 0x24} },
548{ 0x84a1, 16, {0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
549{ 0x84b1, 16, {0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63, 0x7d, 0x06, 0xaf, 0x57, 0x12, 0x83} },
550{ 0x84c1, 16, {0xdf, 0xaf, 0x57, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xa3, 0xa3} },
551{ 0x84d1, 16, {0xe0, 0x20, 0xe0, 0x43, 0xe0, 0xff, 0xe5, 0x59, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5} },
552{ 0x84e1, 16, {0x83, 0xe0, 0xe5, 0x59, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 0xe0, 0xff, 0xe5} },
553{ 0x84f1, 16, {0x57, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc} },
554{ 0x8501, 16, {0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63} },
555{ 0x8511, 16, {0x7d, 0x06, 0xaf, 0x57, 0x12, 0x83, 0xdf, 0x74, 0xf8, 0x25, 0x57, 0xf5, 0x82, 0xe4, 0x34, 0x02} },
556{ 0x8521, 16, {0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x57, 0x25, 0xe0, 0xff, 0xc3, 0x74, 0x0c, 0x9f, 0x75, 0xf0, 0x40} },
557{ 0x8531, 16, {0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xaf, 0x82, 0xfe, 0xe5, 0x57, 0x25, 0xe0} },
558{ 0x8541, 16, {0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xaf, 0x57} },
559{ 0x8551, 15, {0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x34, 0x7f, 0x00} },
560{ 0x8560, 1, {0x22} },
561{ 0x8561, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x57, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22} },
562{ 0x8571, 16, {0xaf, 0x57, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0x74, 0xf8, 0x25, 0x57, 0xf5, 0x82, 0xe4, 0x34, 0x02} },
563{ 0x8581, 16, {0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x57, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34} },
564{ 0x8591, 16, {0x20, 0xaf, 0x82, 0xf5, 0x59, 0x8f, 0x5a, 0xf5, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4} },
565{ 0x85a1, 16, {0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x57, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x0c} },
566{ 0x85b1, 16, {0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x57, 0x75, 0xf0, 0x0d, 0xa4, 0x24} },
567{ 0x85c1, 16, {0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
568{ 0x85d1, 16, {0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63, 0x7d, 0x06, 0xaf, 0x57, 0x12, 0x83} },
569{ 0x85e1, 16, {0xdf, 0xe5, 0x5a, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x59, 0xf5, 0x83, 0xe0, 0x30, 0xe0, 0x09} },
570{ 0x85f1, 16, {0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xe0, 0xf5, 0x58, 0xaf, 0x57, 0x74, 0x01, 0xa8, 0x07, 0x08} },
571{ 0x8601, 16, {0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x34, 0xe5, 0x57, 0x25, 0xe0, 0x24, 0xc6, 0xf5} },
572{ 0x8611, 16, {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x20, 0xe1, 0x0f, 0xe5, 0x57, 0x25, 0xe0, 0x24, 0xc7} },
573{ 0x8621, 11, {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x7f, 0x00} },
574{ 0x862c, 1, {0x22} },
575{ 0x862d, 4, {0x8e, 0x57, 0x8f, 0x58} },
576{ 0x8631, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x59, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22} },
577{ 0x8641, 16, {0xe5, 0x59, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0} },
578{ 0x8651, 16, {0x54, 0x03, 0x70, 0x66, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0x30, 0xe0, 0x28, 0xe5} },
579{ 0x8661, 16, {0x59, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc} },
580{ 0x8671, 16, {0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63} },
581{ 0x8681, 16, {0x7d, 0x02, 0xaf, 0x59, 0x12, 0x83, 0xdf, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0x30} },
582{ 0x8691, 16, {0xe1, 0x28, 0xe5, 0x59, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5} },
583{ 0x86a1, 16, {0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d} },
584{ 0x86b1, 12, {0x64, 0x8c, 0x63, 0x7d, 0x04, 0xaf, 0x59, 0x12, 0x83, 0xdf, 0x7f, 0x00} },
585{ 0x86bd, 1, {0x22} },
586{ 0x86be, 16, {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0xa3, 0xa3, 0xa3, 0xe0, 0xfc, 0xed} },
587{ 0x86ce, 16, {0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xc0, 0x83, 0xc0} },
588{ 0x86de, 16, {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0} },
589{ 0x86ee, 16, {0x8f, 0x82, 0x8e, 0x83, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0xe0, 0xfd, 0xec, 0x6d, 0xd0} },
590{ 0x86fe, 16, {0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f} },
591{ 0x870e, 16, {0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82} },
592{ 0x871e, 16, {0x8e, 0x83, 0xa3, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0} },
593{ 0x872e, 16, {0xfc, 0xed, 0x6c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xc0, 0x83, 0xc0} },
594{ 0x873e, 16, {0x82, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xff, 0xed, 0x6f, 0xd0, 0x82, 0xd0} },
595{ 0x874e, 3, {0x83, 0xf0, 0x22} },
596{ 0x8751, 4, {0xad, 0x07, 0xac, 0x06} },
597{ 0x8755, 16, {0x79, 0x0d, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff} },
598{ 0x8765, 16, {0x22, 0x8c, 0x57, 0x8d, 0x58, 0xee, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34} },
599{ 0x8775, 16, {0x03, 0xaf, 0x82, 0xfe, 0xad, 0x01, 0x19, 0xed, 0x60, 0x24, 0x0f, 0xef, 0xac, 0x06, 0x70, 0x01} },
600{ 0x8785, 16, {0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05, 0x58, 0xe5, 0x58, 0xaa, 0x57, 0x70, 0x02} },
601{ 0x8795, 16, {0x05, 0x57, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xe0, 0x6d, 0x60, 0xd9, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
602{ 0x87a5, 1, {0x22} },
603{ 0x87a6, 4, {0x8e, 0x57, 0x8f, 0x58} },
604{ 0x87aa, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xf5, 0x5e, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22} },
605{ 0x87ba, 16, {0xe5, 0x5e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5} },
606{ 0x87ca, 16, {0x5f, 0x8f, 0x60, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3} },
607{ 0x87da, 16, {0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x08, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xd3, 0x12, 0xa3} },
608{ 0x87ea, 16, {0xb3, 0x40, 0x10, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xfa, 0x00, 0x00, 0x00} },
609{ 0x87fa, 16, {0x08, 0x80, 0x2e, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3} },
610{ 0x880a, 16, {0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x00, 0x7a, 0x08, 0x79, 0x07, 0x78, 0x00, 0xc3, 0x12, 0xa3} },
611{ 0x881a, 16, {0xb3, 0x50, 0x0e, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xfa, 0x00, 0x07, 0x08} },
612{ 0x882a, 16, {0x00, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa} },
613{ 0x883a, 16, {0xa3, 0xe0, 0xfb, 0x7f, 0x00, 0x7e, 0x50, 0x7d, 0x46, 0x7c, 0x00, 0x12, 0xa3, 0x21, 0x8f, 0x5c} },
614{ 0x884a, 16, {0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59, 0x7b, 0x0a, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa3} },
615{ 0x885a, 16, {0x21, 0xaf, 0x03, 0x8f, 0x5d, 0xaf, 0x5c, 0xae, 0x5b, 0xad, 0x5a, 0xac, 0x59, 0x7b, 0x0a, 0x7a} },
616{ 0x886a, 16, {0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa3, 0x21, 0x8f, 0x5c, 0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59} },
617{ 0x887a, 16, {0xe5, 0x5d, 0xc3, 0x94, 0x05, 0x40, 0x15, 0xe5, 0x5c, 0x24, 0x01, 0xf5, 0x5c, 0xe4, 0x35, 0x5b} },
618{ 0x888a, 16, {0xf5, 0x5b, 0xe4, 0x35, 0x5a, 0xf5, 0x5a, 0xe4, 0x35, 0x59, 0xf5, 0x59, 0x85, 0x60, 0x82, 0x85} },
619{ 0x889a, 16, {0x5f, 0x83, 0xa3, 0xe4, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44} },
620{ 0x88aa, 16, {0x80, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xe5, 0x5c, 0xf0, 0xaf, 0x5c, 0xae, 0x5b, 0xad} },
621{ 0x88ba, 16, {0x5a, 0xac, 0x59, 0x78, 0x08, 0x12, 0xa3, 0xc4, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xef} },
622{ 0x88ca, 16, {0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0xe4, 0xf5} },
623{ 0x88da, 16, {0x5d, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe0} },
624{ 0x88ea, 16, {0x23, 0x54, 0x01, 0xf0, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0} },
625{ 0x88fa, 16, {0x54, 0xfd, 0xf0, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc} },
626{ 0x890a, 16, {0x42, 0x22, 0x80, 0x36, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x5e, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce} },
627{ 0x891a, 16, {0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x22, 0x60, 0x1f, 0xe5, 0x60, 0x24, 0x04, 0xf5} },
628{ 0x892a, 16, {0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07} },
629{ 0x893a, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x22, 0xe5, 0x58, 0x24, 0x08, 0xf5, 0x82} },
630{ 0x894a, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xb4, 0x62, 0x05, 0x43, 0x5d, 0x0a, 0x80, 0x1a, 0xef} },
631{ 0x895a, 16, {0xb4, 0x72, 0x05, 0x43, 0x5d, 0x08, 0x80, 0x11, 0xef, 0xb4, 0x74, 0x05, 0x43, 0x5d, 0x02, 0x80} },
632{ 0x896a, 16, {0x08, 0xef, 0x64, 0x6e, 0x60, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4} },
633{ 0x897a, 16, {0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe3, 0x03, 0x43, 0x5d, 0x80, 0xef, 0x30, 0xe7, 0x12} },
634{ 0x898a, 16, {0x43, 0x5d, 0x40, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44} },
635{ 0x899a, 16, {0x02, 0xf0, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x30, 0xe1} },
636{ 0x89aa, 16, {0x20, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x32} },
637{ 0x89ba, 16, {0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80} },
638{ 0x89ca, 16, {0x10, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52} },
639{ 0x89da, 16, {0x32, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe4} },
640{ 0x89ea, 16, {0x11, 0xae, 0x5e, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x31} },
641{ 0x89fa, 16, {0x80, 0x10, 0xae, 0x5e, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4} },
642{ 0x8a0a, 16, {0x52, 0x31, 0xef, 0x20, 0xe1, 0x03, 0x30, 0xe4, 0x03, 0xe4, 0xf5, 0x5d, 0x85, 0x60, 0x82, 0x85} },
643{ 0x8a1a, 16, {0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3} },
644{ 0x8a2a, 16, {0xe4, 0xf0, 0xe5, 0x5d, 0xf0, 0xe5, 0x58, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83} },
645{ 0x8a3a, 16, {0xe0, 0xff, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5} },
646{ 0x8a4a, 16, {0x58, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x05} },
647{ 0x8a5a, 16, {0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09, 0xf5, 0x82, 0xe4} },
648{ 0x8a6a, 16, {0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5} },
649{ 0x8a7a, 16, {0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff} },
650{ 0x8a8a, 16, {0xe5, 0x60, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0x85, 0x60, 0x82} },
651{ 0x8a9a, 16, {0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe4, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3} },
652{ 0x8aaa, 16, {0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} },
653{ 0x8aba, 16, {0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63, 0x7d, 0x06, 0xaf, 0x5e, 0x12, 0x83} },
654{ 0x8aca, 16, {0xdf, 0x75, 0x5d, 0x08, 0xe5, 0x58, 0x24, 0x0c, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0} },
655{ 0x8ada, 16, {0x60, 0x03, 0x43, 0x5d, 0x10, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83} },
656{ 0x8aea, 16, {0xe0, 0x54, 0x03, 0x45, 0x5d, 0xf0, 0xe5, 0x58, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5} },
657{ 0x8afa, 16, {0x83, 0xe0, 0xfe, 0xc3, 0x94, 0x05, 0x40, 0x06, 0xee, 0xd3, 0x94, 0x08, 0x40, 0x03, 0x7f, 0xff} },
658{ 0x8b0a, 16, {0x22, 0xe5, 0x58, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xfd, 0xc3, 0x94} },
659{ 0x8b1a, 16, {0x01, 0x40, 0x06, 0xed, 0xd3, 0x94, 0x02, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xed, 0x14, 0xff, 0x25} },
660{ 0x8b2a, 16, {0xe0, 0x25, 0xe0, 0xff, 0xee, 0x24, 0xfb, 0x4f, 0xf5, 0x5d, 0xe5, 0x58, 0x24, 0x07, 0xf5, 0x82} },
661{ 0x8b3a, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x24, 0xd0, 0x60, 0x18, 0x14, 0x60, 0x1a, 0x24, 0xc3, 0x60} },
662{ 0x8b4a, 16, {0x1e, 0x14, 0x60, 0x09, 0x24, 0x0a, 0x70, 0x14, 0x43, 0x5d, 0x18, 0x80, 0x12, 0x43, 0x5d, 0x08} },
663{ 0x8b5a, 16, {0x80, 0x0d, 0x43, 0x5d, 0x38, 0x80, 0x08, 0x43, 0x5d, 0x28, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x85} },
664{ 0x8b6a, 16, {0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x5d, 0xf0, 0x74, 0x01, 0x7e, 0x00, 0xa8} },
665{ 0x8b7a, 16, {0x5e, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x34} },
666{ 0x8b8a, 16, {0x60, 0x07, 0xaf, 0x5e, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0xaa, 0x57, 0xa9, 0x58, 0x7b, 0x01, 0xc0} },
667{ 0x8b9a, 16, {0x03, 0xc0, 0x01, 0xe5, 0x5e, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0} },
668{ 0x8baa, 16, {0xa8, 0x01, 0xfc, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa2, 0x12} },
669{ 0x8bba, 2, {0x7f, 0x00} },
670{ 0x8bbc, 1, {0x22} },
671{ 0x8bbd, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} },
672{ 0x8bcd, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x90, 0x01} },
673{ 0x8bdd, 16, {0x2c, 0x74, 0x08, 0xf0, 0xee, 0x04, 0xa3, 0xf0, 0xe4, 0xa3, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xe5} },
674{ 0x8bed, 16, {0x82, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x2f, 0xf0, 0x8d} },
675{ 0x8bfd, 16, {0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54} },
676{ 0x8c0d, 16, {0x1e, 0x90, 0x01, 0x30, 0xf0, 0x74, 0x2d, 0x2e, 0xf8, 0xe6, 0xa3, 0xf0, 0xaf, 0x06, 0x74, 0x01} },
677{ 0x8c1d, 16, {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x57, 0xe5, 0x33, 0xc3, 0x94, 0x01} },
678{ 0x8c2d, 16, {0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x58, 0x00, 0xf5, 0x59, 0x80, 0x09, 0x7f} },
679{ 0x8c3d, 16, {0x02, 0x12, 0x11, 0x27, 0x8e, 0x58, 0x8f, 0x59, 0xc3, 0xe5, 0x58, 0x64, 0x80, 0x94, 0x80, 0x40} },
680{ 0x8c4d, 16, {0xda, 0xe5, 0x57, 0x55, 0x59, 0x90, 0x01, 0x32, 0xf0, 0x7e, 0x01, 0x7f, 0x2c, 0x7d, 0x07, 0x12} },
681{ 0x8c5d, 4, {0x91, 0x6a, 0x7f, 0x00} },
682{ 0x8c61, 1, {0x22} },
683{ 0x8c62, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} },
684{ 0x8c72, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x90, 0x01} },
685{ 0x8c82, 16, {0x33, 0x74, 0x0a, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35} },
686{ 0x8c92, 16, {0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x34, 0xf0, 0x7e, 0x01, 0x7f, 0x33, 0x7d, 0x02, 0x12, 0x91} },
687{ 0x8ca2, 3, {0x6a, 0x7f, 0x00} },
688{ 0x8ca5, 1, {0x22} },
689{ 0x8ca6, 4, {0x8e, 0x57, 0x8f, 0x58} },
690{ 0x8caa, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} },
691{ 0x8cba, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x85, 0x58} },
692{ 0x8cca, 16, {0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5} },
693{ 0x8cda, 16, {0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x43, 0xee, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x0c, 0xf5, 0x82} },
694{ 0x8cea, 16, {0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0x30, 0xe0, 0x20, 0xee, 0x25, 0xe0, 0x24, 0xc6, 0xf5, 0x82} },
695{ 0x8cfa, 16, {0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x30, 0xe1, 0xf0, 0x7f, 0x60, 0xed, 0x24, 0x05, 0xf5, 0x82} },
696{ 0x8d0a, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0x5f, 0xb5, 0x07, 0xf2, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04} },
697{ 0x8d1a, 12, {0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x7f, 0x00} },
698{ 0x8d26, 1, {0x22} },
699{ 0x8d27, 4, {0xad, 0x07, 0xac, 0x06} },
700{ 0x8d2b, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} },
701{ 0x8d3b, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} },
702{ 0x8d4b, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0} },
703{ 0x8d5b, 16, {0x44, 0x01, 0xf0, 0x80, 0x0d, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54} },
704{ 0x8d6b, 4, {0xfe, 0xf0, 0x7f, 0x00} },
705{ 0x8d6f, 1, {0x22} },
706{ 0x8d70, 4, {0xad, 0x07, 0xac, 0x06} },
707{ 0x8d74, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} },
708{ 0x8d84, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} },
709{ 0x8d94, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0d, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x40} },
710{ 0x8da4, 16, {0xf0, 0x80, 0x0b, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x00} },
711{ 0x8db4, 1, {0x22} },
712{ 0x8db5, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xaf} },
713{ 0x8dc5, 16, {0x06, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x3e, 0x7f, 0x00} },
714{ 0x8dd5, 1, {0x22} },
715{ 0x8dd6, 4, {0x8e, 0x57, 0x8f, 0x58} },
716{ 0x8dda, 16, {0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0, 0xf5, 0x5c, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x59, 0xd3} },
717{ 0x8dea, 16, {0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x59, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x1f} },
718{ 0x8dfa, 16, {0x14, 0x60, 0x28, 0x24, 0x03, 0x70, 0x2e, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x5a, 0x7e, 0x75, 0x5b} },
719{ 0x8e0a, 16, {0x80, 0x80, 0x22, 0x7e, 0x7e, 0x7f, 0x00, 0x75, 0x5a, 0x7e, 0x75, 0x5b, 0x00, 0x80, 0x16, 0x7e} },
720{ 0x8e1a, 16, {0x7d, 0x7f, 0x80, 0x75, 0x5a, 0x7d, 0x75, 0x5b, 0x80, 0x80, 0x0a, 0x7e, 0x7d, 0x7f, 0x00, 0x75} },
721{ 0x8e2a, 16, {0x5a, 0x7d, 0x75, 0x5b, 0x00, 0xe5, 0x5c, 0x70, 0x1b, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0x74} },
722{ 0x8e3a, 16, {0xff, 0xf0, 0xe5, 0x59, 0x25, 0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74} },
723{ 0x8e4a, 16, {0x01, 0xf0, 0x80, 0x48, 0xe5, 0x58, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x57, 0xfe, 0xe5, 0x5c, 0x60} },
724{ 0x8e5a, 16, {0x23, 0x0f, 0xef, 0xac, 0x06, 0x70, 0x01, 0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05} },
725{ 0x8e6a, 16, {0x5b, 0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0} },
726{ 0x8e7a, 16, {0x15, 0x5c, 0x80, 0xd9, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xe5, 0x59, 0x25} },
727{ 0x8e8a, 14, {0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x7f, 0x00} },
728{ 0x8e98, 1, {0x22} },
729{ 0x8e99, 16, {0xef, 0x24, 0x05, 0xf5, 0x58, 0xe4, 0x3e, 0xf5, 0x57, 0x90, 0x01, 0x35, 0x74, 0x07, 0xf0, 0x90} },
730{ 0x8ea9, 16, {0x01, 0x7a, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x36, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3} },
731{ 0x8eb9, 16, {0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x59, 0xf5, 0x5a, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} },
732{ 0x8ec9, 16, {0xe0, 0x24, 0x9e, 0x60, 0x61, 0x24, 0xf9, 0x60, 0x0e, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8f, 0x7a} },
733{ 0x8ed9, 16, {0x24, 0x14, 0x60, 0x03, 0x02, 0x8f, 0xc8, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe} },
734{ 0x8ee9, 16, {0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f, 0xf5, 0x5c, 0x74, 0x01, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c} },
735{ 0x8ef9, 16, {0x94, 0x3f, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5} },
736{ 0x8f09, 16, {0x5a, 0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x50, 0x03, 0x02, 0x8f, 0xcb, 0xae, 0x5b, 0xaf, 0x5c} },
737{ 0x8f19, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e} },
738{ 0x8f29, 16, {0x59, 0xf5, 0x5a, 0x02, 0x8f, 0xcb, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3} },
739{ 0x8f39, 16, {0xe0, 0xff, 0xc3, 0x74, 0x30, 0x9f, 0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c, 0x94} },
740{ 0x8f49, 16, {0x10, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x10, 0xd3, 0xe5, 0x5a} },
741{ 0x8f59, 16, {0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x40, 0x6a, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85} },
742{ 0x8f69, 16, {0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80} },
743{ 0x8f79, 16, {0x51, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f} },
744{ 0x8f89, 16, {0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0x45, 0x5c, 0x60, 0x0b, 0xd3, 0xe5, 0x5c, 0x94, 0x3f, 0xe5} },
745{ 0x8f99, 16, {0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5, 0x5a, 0x95, 0x5c} },
746{ 0x8fa9, 16, {0xe5, 0x59, 0x95, 0x5b, 0x40, 0x1c, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} },
747{ 0x8fb9, 16, {0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80, 0x03, 0x7f} },
748{ 0x8fc9, 16, {0x01, 0x22, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe0, 0x24, 0x9e, 0x70, 0x03, 0x02, 0x90, 0x8b} },
749{ 0x8fd9, 16, {0x24, 0xf9, 0x60, 0x58, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x90, 0xdb, 0x24, 0x14, 0x60, 0x03, 0x02} },
750{ 0x8fe9, 16, {0x91, 0x1f, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xd3, 0x94} },
751{ 0x8ff9, 16, {0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x91, 0x1f, 0x90, 0x01, 0x75, 0xef, 0xf0, 0xe5, 0x5a} },
752{ 0x9009, 16, {0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70, 0x03, 0x02, 0x91, 0x1f, 0x90, 0x01} },
753{ 0x9019, 16, {0x75, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01} },
754{ 0x9029, 16, {0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2, 0x85, 0x58, 0x82, 0x85} },
755{ 0x9039, 16, {0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x80, 0xee, 0x94, 0x00, 0x50, 0x03} },
756{ 0x9049, 16, {0x02, 0x91, 0x1f, 0xd3, 0xef, 0x94, 0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x91, 0x1f, 0x90} },
757{ 0x9059, 16, {0x01, 0x76, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70} },
758{ 0x9069, 16, {0x03, 0x02, 0x91, 0x1f, 0x90, 0x01, 0x76, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} },
759{ 0x9079, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} },
760{ 0x9089, 16, {0x80, 0xd2, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94} },
761{ 0x9099, 16, {0x20, 0xee, 0x94, 0x00, 0x50, 0x03, 0x02, 0x91, 0x1f, 0xd3, 0xef, 0x94, 0x2f, 0xee, 0x94, 0x00} },
762{ 0x90a9, 16, {0x50, 0x74, 0x90, 0x01, 0x77, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15} },
763{ 0x90b9, 16, {0x59, 0x4e, 0x60, 0x62, 0x90, 0x01, 0x77, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} },
764{ 0x90c9, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} },
765{ 0x90d9, 16, {0x80, 0xd5, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x01, 0x78} },
766{ 0x90e9, 16, {0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e} },
767{ 0x90f9, 16, {0x60, 0x24, 0x90, 0x01, 0x78, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5} },
768{ 0x9109, 16, {0x83, 0xe0, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82} },
769{ 0x9119, 16, {0xf5, 0x83, 0xef, 0xf0, 0x80, 0xcf, 0x7e, 0x01, 0x7f, 0x35, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} },
770{ 0x9129, 13, {0xa3, 0xa3, 0xa3, 0xe0, 0xa3, 0xe0, 0x04, 0xfd, 0x12, 0x91, 0x6a, 0x7f, 0x00} },
771{ 0x9136, 1, {0x22} },
772{ 0x9137, 16, {0x8e, 0x62, 0x8f, 0x63, 0x8c, 0x64, 0x8d, 0x65, 0xaf, 0x03, 0x1b, 0xef, 0x60, 0x24, 0x05, 0x63} },
773{ 0x9147, 16, {0xe5, 0x63, 0xae, 0x62, 0x70, 0x02, 0x05, 0x62, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05} },
774{ 0x9157, 16, {0x65, 0xe5, 0x65, 0xac, 0x64, 0x70, 0x02, 0x05, 0x64, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
775{ 0x9167, 3, {0x80, 0xd6, 0x22} },
776{ 0x916a, 6, {0x8d, 0x5d, 0xab, 0x07, 0xaa, 0x06} },
777{ 0x9170, 16, {0x75, 0x61, 0x40, 0x75, 0x60, 0x0d, 0x75, 0x5f, 0x03, 0x75, 0x5e, 0x00, 0x90, 0x7f, 0xc2, 0xe0} },
778{ 0x9180, 16, {0x20, 0xe1, 0xf9, 0xaf, 0x61, 0xae, 0x60, 0xad, 0x5f, 0xac, 0x5e, 0xec, 0x4d, 0x4e, 0x4f, 0x70} },
779{ 0x9190, 16, {0x08, 0x90, 0x7f, 0xc2, 0x74, 0x02, 0xf0, 0x80, 0xd7, 0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x16} },
780{ 0x91a0, 16, {0xaf, 0x03, 0xae, 0x02, 0x7c, 0x7b, 0x7d, 0x80, 0xab, 0x5d, 0x12, 0x91, 0x37, 0x90, 0x7f, 0xc3} },
781{ 0x91b0, 8, {0xe5, 0x5d, 0xf0, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
782{ 0x91b8, 1, {0x22} },
783{ 0x91b9, 16, {0x90, 0x01, 0x84, 0x74, 0x0b, 0xf0, 0xa3, 0xe5, 0x33, 0xf0, 0x90, 0x0a, 0xf5, 0xe4, 0x93, 0x90} },
784{ 0x91c9, 16, {0x01, 0x86, 0xf0, 0x90, 0x0a, 0xf6, 0xe4, 0x93, 0x90, 0x01, 0x87, 0xf0, 0xe4, 0x90, 0x01, 0x7c} },
785{ 0x91d9, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01} },
786{ 0x91e9, 16, {0xf0, 0xa3, 0x74, 0x88, 0xf0, 0x7e, 0x01, 0x7f, 0x7c, 0x12, 0x19, 0xc1, 0x7e, 0x01, 0x7f, 0x84} },
787{ 0x91f9, 7, {0x7d, 0x14, 0x12, 0x91, 0x6a, 0x7f, 0x00} },
788{ 0x9200, 1, {0x22} },
789{ 0x9201, 16, {0x7e, 0x7b, 0x7f, 0x40, 0x75, 0x4e, 0x7b, 0x75, 0x4f, 0x40, 0x90, 0x7f, 0xd3, 0xe0, 0xff, 0x85} },
790{ 0x9211, 16, {0x4e, 0x51, 0x85, 0x4f, 0x52, 0xe5, 0x52, 0x24, 0x01, 0xf5, 0x56, 0xe4, 0x35, 0x51, 0xf5, 0x55} },
791{ 0x9221, 16, {0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xfe, 0x14, 0xb4, 0x0c, 0x00, 0x50} },
792{ 0x9231, 16, {0x5b, 0x90, 0x92, 0x39, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x92, 0x5d, 0x02, 0x92, 0x5d, 0x02, 0x92} },
793{ 0x9241, 16, {0x67, 0x02, 0x92, 0x71, 0x02, 0x92, 0x71, 0x02, 0x92, 0x71, 0x02, 0x92, 0x85, 0x02, 0x92, 0x5d} },
794{ 0x9251, 16, {0x02, 0x92, 0x7b, 0x02, 0x92, 0x5d, 0x02, 0x92, 0x8d, 0x02, 0x92, 0x5d, 0xef, 0x64, 0x02, 0x60} },
795{ 0x9261, 16, {0x2b, 0x75, 0x50, 0xff, 0x80, 0x26, 0xef, 0x64, 0x0e, 0x60, 0x21, 0x75, 0x50, 0xff, 0x80, 0x1c} },
796{ 0x9271, 16, {0xef, 0x64, 0x03, 0x60, 0x17, 0x75, 0x50, 0xff, 0x80, 0x12, 0xef, 0x64, 0x03, 0x60, 0x0d, 0x75} },
797{ 0x9281, 16, {0x50, 0xff, 0x80, 0x08, 0xef, 0x64, 0x06, 0x60, 0x03, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x60, 0x15} },
798{ 0x9291, 16, {0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0xa3, 0xee, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12} },
799{ 0x92a1, 16, {0x91, 0x6a, 0xaf, 0x50, 0x22, 0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0x14} },
800{ 0x92b1, 16, {0xb4, 0x0f, 0x00, 0x40, 0x03, 0x02, 0x93, 0xcf, 0x90, 0x92, 0xc0, 0xf8, 0x28, 0x28, 0x73, 0x02} },
801{ 0x92c1, 16, {0x92, 0xed, 0x02, 0x92, 0xf9, 0x02, 0x93, 0x05, 0x02, 0x93, 0x53, 0x02, 0x93, 0x5e, 0x02, 0x93} },
802{ 0x92d1, 16, {0x69, 0x02, 0x93, 0x74, 0x02, 0x93, 0x7f, 0x02, 0x93, 0x8a, 0x02, 0x93, 0x95, 0x02, 0x93, 0xa0} },
803{ 0x92e1, 16, {0x02, 0x93, 0xa7, 0x02, 0x93, 0xcf, 0x02, 0x93, 0xb2, 0x02, 0x93, 0xbd, 0xaf, 0x56, 0xae, 0x55} },
804{ 0x92f1, 16, {0x12, 0x84, 0x41, 0x8f, 0x50, 0x02, 0x93, 0xd2, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x85, 0x61, 0x8f} },
805{ 0x9301, 16, {0x50, 0x02, 0x93, 0xd2, 0x85, 0x55, 0x53, 0x85, 0x56, 0x54, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4} },
806{ 0x9311, 16, {0x35, 0x53, 0xfe, 0x12, 0x86, 0xbe, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0x51, 0x8f, 0x50, 0xef} },
807{ 0x9321, 16, {0x64, 0x01, 0x60, 0x03, 0x02, 0x93, 0xd2, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0xa6, 0x8f, 0x50} },
808{ 0x9331, 16, {0xe5, 0x50, 0x70, 0x03, 0x02, 0x93, 0xd2, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xe0, 0x75, 0xf0} },
809{ 0x9341, 16, {0x0d, 0xa4, 0x24, 0xf4, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xaf, 0x82, 0xfe, 0x12, 0x87, 0xa6, 0x02} },
810{ 0x9351, 16, {0x93, 0xd2, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0xa6, 0x8f, 0x50, 0x80, 0x74, 0xaf, 0x56, 0xae} },
811{ 0x9361, 16, {0x55, 0x12, 0x8d, 0x27, 0x8f, 0x50, 0x80, 0x69, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0x70, 0x8f} },
812{ 0x9371, 16, {0x50, 0x80, 0x5e, 0xaf, 0x4f, 0xae, 0x4e, 0x12, 0x8e, 0x99, 0x8f, 0x50, 0x80, 0x53, 0xaf, 0x56} },
813{ 0x9381, 16, {0xae, 0x55, 0x12, 0x8b, 0xbd, 0x8f, 0x50, 0x80, 0x48, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x86, 0x2d} },
814{ 0x9391, 16, {0x8f, 0x50, 0x80, 0x3d, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0x62, 0x8f, 0x50, 0x80, 0x32, 0x12} },
815{ 0x93a1, 16, {0x91, 0xb9, 0x8f, 0x50, 0x80, 0x2b, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0xb5, 0x8f, 0x50, 0x80} },
816{ 0x93b1, 16, {0x20, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0xd6, 0x8f, 0x50, 0x80, 0x15, 0xaf, 0x4f, 0xae, 0x4e} },
817{ 0x93c1, 16, {0x7c, 0x02, 0x7d, 0xaf, 0x7b, 0x40, 0x12, 0x91, 0x37, 0xe4, 0xf5, 0x50, 0x80, 0x03, 0x75, 0x50} },
818{ 0x93d1, 16, {0xff, 0xe5, 0x50, 0x60, 0x1d, 0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0x85, 0x52, 0x82, 0x85, 0x51} },
819{ 0x93e1, 16, {0x83, 0xe0, 0x90, 0x01, 0x99, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12, 0x91, 0x6a, 0xaf} },
820{ 0x93f1, 16, {0x50, 0x22, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xff, 0x14, 0x24, 0xfa, 0x50, 0x04, 0x24} },
821{ 0x9401, 16, {0xfe, 0x70, 0x1f, 0x90, 0x01, 0x98, 0x74, 0x10, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x56, 0x82, 0x85} },
822{ 0x9411, 16, {0x55, 0x83, 0xe0, 0x90, 0x01, 0x9a, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x03, 0x12, 0x91, 0x6a} },
823{ 0x9421, 4, {0x8f, 0x50, 0xaf, 0x50} },
824{ 0x9425, 1, {0x22} },
825{ 0x9426, 8, {0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e} },
826{ 0x942e, 16, {0x75, 0x58, 0x01, 0x75, 0x59, 0x9c, 0xe4, 0xf5, 0x57, 0xaf, 0x53, 0x15, 0x53, 0xef, 0x70, 0x03} },
827{ 0x943e, 16, {0x02, 0x94, 0xc4, 0xaf, 0x52, 0xe4, 0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xaf, 0x51} },
828{ 0x944e, 16, {0xae, 0x50, 0xad, 0x4f, 0xac, 0x4e, 0x12, 0xa3, 0x21, 0xaf, 0x03, 0x8f, 0x56, 0xaf, 0x51, 0xae} },
829{ 0x945e, 16, {0x50, 0xad, 0x4f, 0xac, 0x4e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x52, 0xe4} },
830{ 0x946e, 16, {0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04} },
831{ 0x947e, 16, {0x12, 0xa3, 0x21, 0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e, 0xe5, 0x56, 0x24, 0x30, 0xf5} },
832{ 0x948e, 16, {0x56, 0xd3, 0x94, 0x39, 0x40, 0x06, 0x74, 0x07, 0x25, 0x56, 0xf5, 0x56, 0x05, 0x59, 0xe5, 0x59} },
833{ 0x949e, 16, {0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x05, 0x59, 0xe5} },
834{ 0x94ae, 16, {0x59, 0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x56, 0xf0, 0x05} },
835{ 0x94be, 16, {0x57, 0x05, 0x57, 0x02, 0x94, 0x37, 0xe5, 0x59, 0x15, 0x59, 0x70, 0x02, 0x15, 0x58, 0xaf, 0x57} },
836{ 0x94ce, 16, {0x15, 0x57, 0xef, 0x60, 0x23, 0xe5, 0x59, 0x15, 0x59, 0xae, 0x58, 0x70, 0x02, 0x15, 0x58, 0xf5} },
837{ 0x94de, 16, {0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05, 0x55, 0xe5, 0x55, 0xac, 0x54, 0x70, 0x02, 0x05, 0x54, 0x14} },
838{ 0x94ee, 8, {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x80, 0xd6} },
839{ 0x94f6, 1, {0x22} },
840{ 0x94f7, 16, {0xe4, 0x90, 0x01, 0xc9, 0xf0, 0x7e, 0x01, 0x7f, 0xca, 0x90, 0x01, 0xbe, 0xee, 0xf0, 0xa3, 0xef} },
841{ 0x9507, 10, {0xf0, 0x90, 0x01, 0xc2, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
842{ 0x9511, 16, {0xaa, 0x07, 0xa9, 0x05, 0x90, 0x01, 0xc9, 0xe0, 0xc3, 0x94, 0x40, 0x50, 0x61, 0xac, 0x02, 0x74} },
843{ 0x9521, 16, {0x01, 0x7e, 0x00, 0xa8, 0x04, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff} },
844{ 0x9531, 16, {0xe4, 0xef, 0x55, 0x34, 0x60, 0x45, 0xea, 0x04, 0xff, 0x90, 0x01, 0xc2, 0xe0, 0xfc, 0xa3, 0xe0} },
845{ 0x9541, 16, {0xfd, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0xa3, 0xe9, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} },
846{ 0x9551, 16, {0xeb, 0xf0, 0x90, 0x01, 0xc2, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x81, 0xfc, 0xd3, 0xe5, 0xf0} },
847{ 0x9561, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xc2, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} },
848{ 0x9571, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x04, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
849{ 0x9581, 1, {0x22} },
850{ 0x9582, 16, {0x90, 0x01, 0xc9, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x55, 0x90, 0x01, 0xbe, 0xe0, 0xfc, 0xa3, 0xe0} },
851{ 0x9592, 16, {0xaa, 0x04, 0xf9, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0xaa, 0x06, 0xa9, 0x07, 0xa8} },
852{ 0x95a2, 16, {0x01, 0xac, 0x02, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x03, 0x12} },
853{ 0x95b2, 16, {0xa2, 0x12, 0x90, 0x01, 0xbe, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x81, 0xfc, 0xd3, 0xe5, 0xf0} },
854{ 0x95c2, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xbe, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} },
855{ 0x95d2, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x14, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} },
856{ 0x95e2, 1, {0x22} },
857{ 0x95e3, 16, {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x73, 0x7e, 0x7b, 0x7f, 0x80, 0x75, 0x53, 0x7b, 0x75, 0x54} },
858{ 0x95f3, 16, {0x80, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x53, 0xa9, 0x07, 0x7b, 0x01, 0x8b, 0x55, 0xf5} },
859{ 0x9603, 16, {0x56, 0x89, 0x57, 0xfe, 0x12, 0x95, 0x82, 0xef, 0x60, 0x50, 0xab, 0x55, 0xaa, 0x56, 0xa9, 0x57} },
860{ 0x9613, 16, {0x12, 0xa2, 0x3b, 0x14, 0xff, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0xb4, 0x02, 0x16, 0xc2, 0xaf} },
861{ 0x9623, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x44} },
862{ 0x9633, 16, {0x04, 0xf0, 0xd2, 0xaf, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce} },
863{ 0x9643, 16, {0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x34, 0x60, 0x0f, 0x85, 0x54, 0x82, 0x85, 0x53} },
864{ 0x9653, 10, {0x83, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0xc3, 0x74, 0x04, 0xf0} },
865{ 0x965d, 1, {0x22} },
866{ 0x965e, 16, {0x12, 0x95, 0xe3, 0xe4, 0xf5, 0x4e, 0x74, 0x3a, 0x25, 0x4e, 0xf8, 0xe6, 0x54, 0xf0, 0xf5, 0x4f} },
867{ 0x966e, 16, {0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0xff, 0xc4} },
868{ 0x967e, 16, {0x54, 0x0f, 0xf5, 0x50, 0x60, 0x22, 0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5} },
869{ 0x968e, 16, {0x83, 0xe5, 0x4f, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0xe5, 0x4f, 0x45, 0x50, 0xfb, 0x12, 0x95, 0x11} },
870{ 0x969e, 16, {0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} },
871{ 0x96ae, 16, {0xb5, 0x12, 0x95, 0xe3, 0xe5, 0x3e, 0x60, 0x48, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x74, 0x01, 0xa8} },
872{ 0x96be, 16, {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x55, 0x3e, 0x60, 0x29, 0xe5, 0x4e} },
873{ 0x96ce, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x30, 0xe6} },
874{ 0x96de, 16, {0x16, 0xaf, 0x4e, 0x7d, 0x04, 0x7b, 0x80, 0x12, 0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3} },
875{ 0x96ee, 16, {0x80, 0xef, 0xe5, 0x4f, 0xf4, 0x52, 0x3e, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40, 0xbb} },
876{ 0x96fe, 16, {0x90, 0x03, 0x00, 0xe0, 0x60, 0x03, 0x02, 0x97, 0xdf, 0x74, 0x19, 0xf0, 0xe5, 0x33, 0xc3, 0x94} },
877{ 0x970e, 16, {0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00, 0xf5, 0x52, 0x80, 0x09} },
878{ 0x971e, 16, {0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51, 0x64, 0x80, 0x94, 0x80} },
879{ 0x972e, 16, {0x40, 0xda, 0x90, 0x01, 0xbc, 0xe0, 0x65, 0x52, 0xf0, 0x60, 0x37, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e} },
880{ 0x973e, 16, {0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xbc} },
881{ 0x974e, 16, {0xe0, 0x55, 0x4f, 0x60, 0x14, 0xaf, 0x4e, 0x7d, 0x08, 0xe5, 0x4f, 0x55, 0x52, 0xfb, 0x12, 0x95} },
882{ 0x975e, 16, {0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04} },
883{ 0x976e, 16, {0x40, 0xcc, 0x90, 0x01, 0xbc, 0xe5, 0x52, 0xf0, 0xe4, 0xf5, 0x4e, 0xc2, 0xaf, 0x74, 0x36, 0x25} },
884{ 0x977e, 16, {0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0xe4, 0xf6, 0xd2, 0xaf, 0x53, 0x4f, 0x1e, 0xe5, 0x4f, 0x60, 0x11} },
885{ 0x978e, 16, {0xaf, 0x4e, 0x7d, 0x02, 0xab, 0x4f, 0x12, 0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80} },
886{ 0x979e, 16, {0xef, 0x74, 0x2d, 0x25, 0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82, 0xe4} },
887{ 0x97ae, 16, {0x34, 0x02, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0x60, 0x11, 0xaf, 0x4e, 0x7d, 0x04, 0xab, 0x4f, 0x12} },
888{ 0x97be, 16, {0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xef, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82} },
889{ 0x97ce, 16, {0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} },
890{ 0x97de, 4, {0x9a, 0x12, 0x95, 0xe3} },
891{ 0x97e2, 1, {0x22} },
892{ 0x97e3, 12, {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x67, 0x02, 0x98, 0x2a} },
893{ 0x97ef, 16, {0x02, 0x05, 0xad, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
894{ 0x97ff, 16, {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
895{ 0x980f, 16, {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
896{ 0x981f, 16, {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x98, 0x6f, 0xe4, 0x7e} },
897{ 0x982f, 16, {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
898{ 0x983f, 16, {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
899{ 0x984f, 16, {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
900{ 0x985f, 16, {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
901{ 0x986f, 16, {0x60, 0x24, 0x02, 0x8a, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x81, 0x82, 0x84, 0x88} },
902{ 0x987f, 16, {0x90, 0xa0, 0xc0, 0xc1, 0xc2, 0xc4, 0xc8, 0xd0, 0xe0, 0xe1, 0xe2, 0xe4, 0xe8, 0xf0, 0xf1, 0xf2} },
903{ 0x988f, 8, {0xf4, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xfe, 0xff} },
904{ 0x9897, 1, {0x00} },
905{ 0x9898, 8, {0x8b, 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x8d, 0x5c} },
906{ 0x98a0, 16, {0xe4, 0xf5, 0x5d, 0xf5, 0x5e, 0xaf, 0x5c, 0x15, 0x5c, 0xef, 0x60, 0x36, 0xab, 0x59, 0x05, 0x5b} },
907{ 0x98b0, 16, {0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf9, 0x12, 0xa2, 0x3b, 0xff, 0xe5, 0x5d} },
908{ 0x98c0, 16, {0xe5, 0x5e, 0x6f, 0x25, 0xe0, 0xff, 0xe4, 0x33, 0xfe, 0x74, 0x95, 0x2f, 0xf5, 0x82, 0xee, 0x34} },
909{ 0x98d0, 16, {0x9e, 0xf5, 0x83, 0xe5, 0x5d, 0xff, 0xe4, 0x93, 0xf5, 0x5d, 0x74, 0x01, 0x93, 0x6f, 0xf5, 0x5e} },
910{ 0x98e0, 6, {0x80, 0xc3, 0xae, 0x5d, 0xaf, 0x5e} },
911{ 0x98e6, 1, {0x22} },
912{ 0x98e7, 11, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18} },
913{ 0x98f2, 16, {0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xfe, 0x30, 0xe0, 0x05, 0x90, 0x20, 0x02, 0xe0, 0xff, 0xee} },
914{ 0x9902, 16, {0x30, 0xe1, 0x05, 0x90, 0x20, 0x0a, 0xe0, 0xff, 0xee, 0x30, 0xe2, 0x05, 0x90, 0x20, 0x12, 0xe0} },
915{ 0x9912, 16, {0xff, 0xee, 0x30, 0xe3, 0x05, 0x90, 0x20, 0x1a, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x1e} },
916{ 0x9922, 10, {0x04, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x01, 0xc4, 0xee, 0xf0} },
917{ 0x992c, 9, {0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
918{ 0x9935, 2, {0xa9, 0x03} },
919{ 0x9937, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xe5} },
920{ 0x9947, 16, {0x5c, 0x45, 0x5d, 0xf5, 0x5e, 0xe9, 0x60, 0x14, 0x8a, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82} },
921{ 0x9957, 16, {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x4d, 0xf0, 0xe4, 0xfe, 0x80, 0x13, 0xeb, 0x24, 0x04, 0xf5} },
922{ 0x9967, 16, {0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0xff, 0xed, 0xf4, 0xfc, 0xef, 0x5c, 0xf0, 0xae, 0x5e, 0xeb} },
923{ 0x9977, 16, {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0x55, 0x5e, 0xfc, 0xb5, 0x06, 0x03, 0xaf} },
924{ 0x9987, 16, {0x05, 0x22, 0xe5, 0x5c, 0x5c, 0xfe, 0xe5, 0x5d, 0x5c, 0xfd, 0xe9, 0x60, 0x16, 0xee, 0x70, 0x04} },
925{ 0x9997, 16, {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xae, 0x07, 0xed, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} },
926{ 0x99a7, 16, {0x00, 0xad, 0x07, 0xee, 0x60, 0x03, 0xaf, 0x5c, 0x22, 0xed, 0x60, 0x03, 0xaf, 0x5d, 0x22, 0x7f} },
927{ 0x99b7, 1, {0x00} },
928{ 0x99b8, 1, {0x22} },
929{ 0x99b9, 16, {0x75, 0x55, 0x02, 0x75, 0x56, 0xb0, 0x90, 0x03, 0x35, 0x74, 0x0f, 0xf0, 0x85, 0x56, 0x82, 0x85} },
930{ 0x99c9, 16, {0x55, 0x83, 0xa3, 0xe0, 0xff, 0x90, 0x03, 0x37, 0xf0, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0} },
931{ 0x99d9, 16, {0x90, 0x03, 0x36, 0xf0, 0x90, 0x03, 0x38, 0x74, 0xff, 0xf0, 0x75, 0x57, 0x03, 0x75, 0x58, 0x39} },
932{ 0x99e9, 16, {0xef, 0x14, 0xb4, 0x0b, 0x00, 0x40, 0x03, 0x02, 0x9e, 0x5d, 0x90, 0x99, 0xfa, 0xf8, 0x28, 0x28} },
933{ 0x99f9, 16, {0x73, 0x02, 0x9a, 0x1b, 0x02, 0x9a, 0xba, 0x02, 0x9b, 0xbf, 0x02, 0x9b, 0xde, 0x02, 0x9b, 0xde} },
934{ 0x9a09, 16, {0x02, 0x9c, 0x94, 0x02, 0x9c, 0xcf, 0x02, 0x9c, 0xf4, 0x02, 0x9d, 0xb2, 0x02, 0x9d, 0xe2, 0x02} },
935{ 0x9a19, 16, {0x9e, 0x0e, 0xe4, 0xf5, 0x4e, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4} },
936{ 0x9a29, 16, {0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xe4, 0xff, 0xe4, 0xfe, 0xef, 0x60, 0x10, 0x74} },
937{ 0x9a39, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf4, 0xf5, 0x4f, 0x80, 0x0d, 0x74} },
938{ 0x9a49, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf5, 0x4f, 0xe5, 0x54, 0x24, 0x07} },
939{ 0x9a59, 16, {0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0xe0, 0xf5, 0x50, 0x65, 0x4f, 0x60} },
940{ 0x9a69, 16, {0x38, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfd, 0x05, 0x58, 0xe5, 0x58, 0xaa, 0x57} },
941{ 0x9a79, 16, {0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0, 0x05, 0x58, 0xe5, 0x58, 0xac} },
942{ 0x9a89, 16, {0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe5, 0x4f, 0xf0, 0x85, 0x58, 0x82} },
943{ 0x9a99, 16, {0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0x0e, 0xbe, 0x24, 0x8f, 0x0f, 0xef, 0x64} },
944{ 0x9aa9, 16, {0x02, 0x70, 0x87, 0x05, 0x4e, 0xe5, 0x4e, 0x64, 0x04, 0x60, 0x03, 0x02, 0x9a, 0x1e, 0x02, 0x9e} },
945{ 0x9ab9, 16, {0x63, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0x05, 0x4e, 0xe5, 0x4e, 0xd3} },
946{ 0x9ac9, 16, {0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x98, 0xf0, 0xa3, 0x74, 0xe7, 0xf0, 0xe4, 0xf5} },
947{ 0x9ad9, 16, {0x50, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0xf5, 0x4e, 0xaf, 0x4e, 0x74} },
948{ 0x9ae9, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xc4, 0xf0} },
949{ 0x9af9, 16, {0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3} },
950{ 0x9b09, 16, {0x74, 0x02, 0xf0, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x4f, 0x34, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02} },
951{ 0x9b19, 16, {0xa3, 0xe0, 0x70, 0xef, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5, 0x58} },
952{ 0x9b29, 16, {0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58, 0x82} },
953{ 0x9b39, 16, {0x85, 0x57, 0x83, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x01, 0xc4, 0xf0, 0x75, 0x50, 0xff, 0x90, 0x01} },
954{ 0x9b49, 16, {0xc4, 0xe0, 0xff, 0x60, 0x37, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfe, 0x05, 0x58} },
955{ 0x9b59, 16, {0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0x05} },
956{ 0x9b69, 16, {0x58, 0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} },
957{ 0x9b79, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x4f, 0xf0, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x70, 0x16} },
958{ 0x9b89, 16, {0x74, 0x08, 0x25, 0x54, 0xf5, 0x54, 0xe4, 0x35, 0x53, 0xf5, 0x53, 0x05, 0x4e, 0xe5, 0x4e, 0x64} },
959{ 0x9b99, 16, {0x04, 0x60, 0x03, 0x02, 0x9a, 0xe6, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} },
960{ 0x9ba9, 16, {0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x13, 0xf0, 0xa3} },
961{ 0x9bb9, 16, {0x74, 0x12, 0xf0, 0x02, 0x9e, 0x63, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0, 0x14, 0xff, 0x74} },
962{ 0x9bc9, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x90, 0x02, 0xf7, 0xf0, 0x90, 0x01} },
963{ 0x9bd9, 16, {0xc4, 0xf0, 0x02, 0x9e, 0x63, 0x90, 0x01, 0xc0, 0x74, 0x03, 0xf0, 0xa3, 0x74, 0xe8, 0xf0, 0xe4} },
964{ 0x9be9, 16, {0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x07, 0x19, 0x90, 0x01} },
965{ 0x9bf9, 16, {0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xea, 0x90, 0x03, 0x38, 0xf0, 0x85, 0x58, 0x82, 0x85} },
966{ 0x9c09, 16, {0x57, 0x83, 0x74, 0xff, 0xf0, 0xf5, 0x50, 0xe5, 0x50, 0x60, 0x03, 0x02, 0x9e, 0x63, 0x90, 0x01} },
967{ 0x9c19, 16, {0xc0, 0xf0, 0xa3, 0x74, 0x96, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6} },
968{ 0x9c29, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00} },
969{ 0x9c39, 16, {0xf5, 0x52, 0x80, 0x09, 0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51} },
970{ 0x9c49, 16, {0x64, 0x80, 0x94, 0x80, 0x40, 0xda, 0xe5, 0x52, 0x54, 0x0f, 0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0} },
971{ 0x9c59, 16, {0x55, 0x50, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f, 0x4f, 0x85, 0x56, 0x82, 0x85} },
972{ 0x9c69, 16, {0x55, 0x83, 0xa3, 0xe0, 0xb4, 0x05, 0x0c, 0xe5, 0x4f, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} },
973{ 0x9c79, 16, {0x00, 0x8f, 0x4f, 0xe5, 0x4f, 0x70, 0x03, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x85} },
974{ 0x9c89, 16, {0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0xe4, 0xff, 0xfd, 0x12, 0x83} },
975{ 0x9c99, 16, {0x5a, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0x85, 0x54, 0x82, 0x85, 0x53} },
976{ 0x9ca9, 16, {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0x74, 0x01} },
977{ 0x9cb9, 16, {0xf0, 0xa3, 0xe4, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f} },
978{ 0x9cc9, 16, {0xf0, 0xd2, 0x04, 0x02, 0x9e, 0x63, 0xc2, 0x04, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75} },
979{ 0x9cd9, 16, {0x54, 0x00, 0xe5, 0x54, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe0, 0x30, 0xe6} },
980{ 0x9ce9, 16, {0xf1, 0xe4, 0xff, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0x02, 0x9e, 0x63, 0xe4, 0xf5, 0x50, 0xf5, 0x4e} },
981{ 0x9cf9, 16, {0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5} },
982{ 0x9d09, 16, {0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xf5, 0x83, 0xe5, 0x82, 0x24, 0x04} },
983{ 0x9d19, 16, {0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0x7b} },
984{ 0x9d29, 16, {0x01, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40, 0x12, 0x99, 0x35, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x11} },
985{ 0x9d39, 16, {0xaf, 0x4e, 0x7d, 0x02, 0x7b, 0x01, 0x75, 0x5c, 0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x35, 0x8f} },
986{ 0x9d49, 16, {0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x01, 0xfb, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40} },
987{ 0x9d59, 16, {0x12, 0x99, 0x35, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x02, 0xfb, 0x75, 0x5c} },
988{ 0x9d69, 16, {0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x35, 0x8f, 0x50, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} },
989{ 0x9d79, 16, {0xe5, 0x50, 0x60, 0x26, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5} },
990{ 0x9d89, 16, {0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58} },
991{ 0x9d99, 16, {0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94} },
992{ 0x9da9, 16, {0x03, 0x50, 0x03, 0x02, 0x9c, 0xf9, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} },
993{ 0x9db9, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x9e, 0xf0, 0xa3, 0x74} },
994{ 0x9dc9, 16, {0x85, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81, 0xd9, 0xef, 0x64, 0x08, 0x70, 0x03, 0x02, 0x9e} },
995{ 0x9dd9, 16, {0x63, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} },
996{ 0x9de9, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0xe5, 0x57, 0xf0, 0xa3, 0xe5} },
997{ 0x9df9, 16, {0x58, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x19, 0xc1, 0xef, 0x64, 0x08, 0x60, 0x5c, 0xe4, 0x90} },
998{ 0x9e09, 16, {0x03, 0x38, 0xf0, 0x80, 0x55, 0xe5, 0x56, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x55, 0xfa, 0xa9, 0x07} },
999{ 0x9e19, 16, {0x7b, 0x01, 0x7d, 0x10, 0x12, 0x98, 0x98, 0xef, 0x4e, 0x70, 0x32, 0x90, 0x03, 0x59, 0xf0, 0xa3} },
1000{ 0x9e29, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xe5, 0x56, 0x24, 0x02, 0x90} },
1001{ 0x9e39, 16, {0x03, 0x60, 0xf0, 0xe4, 0x35, 0x55, 0x90, 0x03, 0x5f, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81} },
1002{ 0x9e49, 16, {0xd9, 0xef, 0x64, 0x08, 0x60, 0x14, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x80, 0x0d, 0xe4, 0x90, 0x03} },
1003{ 0x9e59, 16, {0x38, 0xf0, 0x80, 0x06, 0x90, 0x03, 0x38, 0x74, 0x01, 0xf0, 0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3} },
1004{ 0x9e69, 16, {0x74, 0x0a, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6, 0x7e, 0x03, 0x7f} },
1005{ 0x9e79, 11, {0x35, 0x7d, 0x24, 0x12, 0x91, 0x6a, 0xe4, 0x90, 0x02, 0xaf, 0xf0} },
1006{ 0x9e84, 1, {0x22} },
1007{ 0x9e85, 16, {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f} },
1008{ 0x9e95, 16, {0x00, 0x00, 0xc0, 0xc1, 0xc1, 0x81, 0x01, 0x40, 0xc3, 0x01, 0x03, 0xc0, 0x02, 0x80, 0xc2, 0x41} },
1009{ 0x9ea5, 16, {0xc6, 0x01, 0x06, 0xc0, 0x07, 0x80, 0xc7, 0x41, 0x05, 0x00, 0xc5, 0xc1, 0xc4, 0x81, 0x04, 0x40} },
1010{ 0x9eb5, 16, {0xcc, 0x01, 0x0c, 0xc0, 0x0d, 0x80, 0xcd, 0x41, 0x0f, 0x00, 0xcf, 0xc1, 0xce, 0x81, 0x0e, 0x40} },
1011{ 0x9ec5, 16, {0x0a, 0x00, 0xca, 0xc1, 0xcb, 0x81, 0x0b, 0x40, 0xc9, 0x01, 0x09, 0xc0, 0x08, 0x80, 0xc8, 0x41} },
1012{ 0x9ed5, 16, {0xd8, 0x01, 0x18, 0xc0, 0x19, 0x80, 0xd9, 0x41, 0x1b, 0x00, 0xdb, 0xc1, 0xda, 0x81, 0x1a, 0x40} },
1013{ 0x9ee5, 16, {0x1e, 0x00, 0xde, 0xc1, 0xdf, 0x81, 0x1f, 0x40, 0xdd, 0x01, 0x1d, 0xc0, 0x1c, 0x80, 0xdc, 0x41} },
1014{ 0x9ef5, 16, {0x14, 0x00, 0xd4, 0xc1, 0xd5, 0x81, 0x15, 0x40, 0xd7, 0x01, 0x17, 0xc0, 0x16, 0x80, 0xd6, 0x41} },
1015{ 0x9f05, 16, {0xd2, 0x01, 0x12, 0xc0, 0x13, 0x80, 0xd3, 0x41, 0x11, 0x00, 0xd1, 0xc1, 0xd0, 0x81, 0x10, 0x40} },
1016{ 0x9f15, 16, {0xf0, 0x01, 0x30, 0xc0, 0x31, 0x80, 0xf1, 0x41, 0x33, 0x00, 0xf3, 0xc1, 0xf2, 0x81, 0x32, 0x40} },
1017{ 0x9f25, 16, {0x36, 0x00, 0xf6, 0xc1, 0xf7, 0x81, 0x37, 0x40, 0xf5, 0x01, 0x35, 0xc0, 0x34, 0x80, 0xf4, 0x41} },
1018{ 0x9f35, 16, {0x3c, 0x00, 0xfc, 0xc1, 0xfd, 0x81, 0x3d, 0x40, 0xff, 0x01, 0x3f, 0xc0, 0x3e, 0x80, 0xfe, 0x41} },
1019{ 0x9f45, 16, {0xfa, 0x01, 0x3a, 0xc0, 0x3b, 0x80, 0xfb, 0x41, 0x39, 0x00, 0xf9, 0xc1, 0xf8, 0x81, 0x38, 0x40} },
1020{ 0x9f55, 16, {0x28, 0x00, 0xe8, 0xc1, 0xe9, 0x81, 0x29, 0x40, 0xeb, 0x01, 0x2b, 0xc0, 0x2a, 0x80, 0xea, 0x41} },
1021{ 0x9f65, 16, {0xee, 0x01, 0x2e, 0xc0, 0x2f, 0x80, 0xef, 0x41, 0x2d, 0x00, 0xed, 0xc1, 0xec, 0x81, 0x2c, 0x40} },
1022{ 0x9f75, 16, {0xe4, 0x01, 0x24, 0xc0, 0x25, 0x80, 0xe5, 0x41, 0x27, 0x00, 0xe7, 0xc1, 0xe6, 0x81, 0x26, 0x40} },
1023{ 0x9f85, 16, {0x22, 0x00, 0xe2, 0xc1, 0xe3, 0x81, 0x23, 0x40, 0xe1, 0x01, 0x21, 0xc0, 0x20, 0x80, 0xe0, 0x41} },
1024{ 0x9f95, 16, {0xa0, 0x01, 0x60, 0xc0, 0x61, 0x80, 0xa1, 0x41, 0x63, 0x00, 0xa3, 0xc1, 0xa2, 0x81, 0x62, 0x40} },
1025{ 0x9fa5, 16, {0x66, 0x00, 0xa6, 0xc1, 0xa7, 0x81, 0x67, 0x40, 0xa5, 0x01, 0x65, 0xc0, 0x64, 0x80, 0xa4, 0x41} },
1026{ 0x9fb5, 16, {0x6c, 0x00, 0xac, 0xc1, 0xad, 0x81, 0x6d, 0x40, 0xaf, 0x01, 0x6f, 0xc0, 0x6e, 0x80, 0xae, 0x41} },
1027{ 0x9fc5, 16, {0xaa, 0x01, 0x6a, 0xc0, 0x6b, 0x80, 0xab, 0x41, 0x69, 0x00, 0xa9, 0xc1, 0xa8, 0x81, 0x68, 0x40} },
1028{ 0x9fd5, 16, {0x78, 0x00, 0xb8, 0xc1, 0xb9, 0x81, 0x79, 0x40, 0xbb, 0x01, 0x7b, 0xc0, 0x7a, 0x80, 0xba, 0x41} },
1029{ 0x9fe5, 16, {0xbe, 0x01, 0x7e, 0xc0, 0x7f, 0x80, 0xbf, 0x41, 0x7d, 0x00, 0xbd, 0xc1, 0xbc, 0x81, 0x7c, 0x40} },
1030{ 0x9ff5, 16, {0xb4, 0x01, 0x74, 0xc0, 0x75, 0x80, 0xb5, 0x41, 0x77, 0x00, 0xb7, 0xc1, 0xb6, 0x81, 0x76, 0x40} },
1031{ 0xa005, 16, {0x72, 0x00, 0xb2, 0xc1, 0xb3, 0x81, 0x73, 0x40, 0xb1, 0x01, 0x71, 0xc0, 0x70, 0x80, 0xb0, 0x41} },
1032{ 0xa015, 16, {0x50, 0x00, 0x90, 0xc1, 0x91, 0x81, 0x51, 0x40, 0x93, 0x01, 0x53, 0xc0, 0x52, 0x80, 0x92, 0x41} },
1033{ 0xa025, 16, {0x96, 0x01, 0x56, 0xc0, 0x57, 0x80, 0x97, 0x41, 0x55, 0x00, 0x95, 0xc1, 0x94, 0x81, 0x54, 0x40} },
1034{ 0xa035, 16, {0x9c, 0x01, 0x5c, 0xc0, 0x5d, 0x80, 0x9d, 0x41, 0x5f, 0x00, 0x9f, 0xc1, 0x9e, 0x81, 0x5e, 0x40} },
1035{ 0xa045, 16, {0x5a, 0x00, 0x9a, 0xc1, 0x9b, 0x81, 0x5b, 0x40, 0x99, 0x01, 0x59, 0xc0, 0x58, 0x80, 0x98, 0x41} },
1036{ 0xa055, 16, {0x88, 0x01, 0x48, 0xc0, 0x49, 0x80, 0x89, 0x41, 0x4b, 0x00, 0x8b, 0xc1, 0x8a, 0x81, 0x4a, 0x40} },
1037{ 0xa065, 16, {0x4e, 0x00, 0x8e, 0xc1, 0x8f, 0x81, 0x4f, 0x40, 0x8d, 0x01, 0x4d, 0xc0, 0x4c, 0x80, 0x8c, 0x41} },
1038{ 0xa075, 16, {0x44, 0x00, 0x84, 0xc1, 0x85, 0x81, 0x45, 0x40, 0x87, 0x01, 0x47, 0xc0, 0x46, 0x80, 0x86, 0x41} },
1039{ 0xa085, 16, {0x82, 0x01, 0x42, 0xc0, 0x43, 0x80, 0x83, 0x41, 0x41, 0x00, 0x81, 0xc1, 0x80, 0x81, 0x40, 0x40} },
1040{ 0xa095, 16, {0xe4, 0xff, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02} },
1041{ 0xa0a5, 16, {0xa1, 0x38, 0x74, 0x3a, 0x2f, 0xf8, 0xe6, 0x20, 0xe5, 0x03, 0x02, 0xa1, 0x38, 0xef, 0x75, 0xf0} },
1042{ 0xa0b5, 16, {0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0xf5, 0x83, 0xe5, 0x82} },
1043{ 0xa0c5, 16, {0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x60, 0x64, 0x60, 0x70, 0x63} },
1044{ 0xa0d5, 16, {0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01} },
1045{ 0xa0e5, 16, {0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0, 0x8d, 0x82, 0x8c, 0x83, 0xf0, 0x74, 0xf8} },
1046{ 0xa0f5, 16, {0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x36, 0xef, 0x25, 0xe0} },
1047{ 0xa105, 16, {0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0xef, 0x25, 0xe0, 0xfe, 0xc3} },
1048{ 0xa115, 16, {0x74, 0x0c, 0x9e, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xad} },
1049{ 0xa125, 16, {0x82, 0xfc, 0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xec, 0xf0} },
1050{ 0xa135, 12, {0xa3, 0xed, 0xf0, 0x0f, 0xef, 0x64, 0x04, 0x60, 0x03, 0x02, 0xa0, 0x97} },
1051{ 0xa141, 1, {0x22} },
1052{ 0xa142, 16, {0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e} },
1053{ 0xa152, 16, {0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08} },
1054{ 0xa162, 16, {0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83} },
1055{ 0xa172, 16, {0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08} },
1056{ 0xa182, 16, {0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c} },
1057{ 0xa192, 16, {0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10} },
1058{ 0xa1a2, 16, {0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33} },
1059{ 0xa1b2, 16, {0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83} },
1060{ 0xa1c2, 16, {0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80} },
1061{ 0xa1d2, 16, {0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0} },
1062{ 0xa1e2, 16, {0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc} },
1063{ 0xa1f2, 16, {0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde} },
1064{ 0xa202, 16, {0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc} },
1065{ 0xa212, 16, {0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xc2, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4} },
1066{ 0xa222, 16, {0x04, 0x00, 0x50, 0xb8, 0x23, 0x23, 0x45, 0x82, 0xf5, 0x82, 0xef, 0x4e, 0x60, 0xae, 0xef, 0x60} },
1067{ 0xa232, 9, {0x01, 0x0e, 0xe5, 0x82, 0x23, 0x90, 0xa1, 0x92, 0x73} },
1068{ 0xa23b, 16, {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
1069{ 0xa24b, 9, {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
1070{ 0xa254, 16, {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
1071{ 0xa264, 16, {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
1072{ 0xa274, 13, {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
1073{ 0xa281, 16, {0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02} },
1074{ 0xa291, 6, {0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22} },
1075{ 0xa297, 16, {0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83} },
1076{ 0xa2a7, 6, {0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22} },
1077{ 0xa2ad, 16, {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
1078{ 0xa2bd, 16, {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
1079{ 0xa2cd, 16, {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
1080{ 0xa2dd, 8, {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
1081{ 0xa2e5, 16, {0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc} },
1082{ 0xa2f5, 16, {0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40} },
1083{ 0xa305, 16, {0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6} },
1084{ 0xa315, 16, {0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9} },
1085{ 0xa325, 16, {0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb} },
1086{ 0xa335, 16, {0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb} },
1087{ 0xa345, 16, {0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9} },
1088{ 0xa355, 16, {0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc} },
1089{ 0xa365, 16, {0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a} },
1090{ 0xa375, 16, {0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f} },
1091{ 0xa385, 16, {0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07} },
1092{ 0xa395, 16, {0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8} },
1093{ 0xa3a5, 14, {0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22} },
1094{ 0xa3b3, 16, {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
1095{ 0xa3c3, 1, {0x22} },
1096{ 0xa3c4, 16, {0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee, 0x13, 0xfe, 0xef, 0x13, 0xff} },
1097{ 0xa3d4, 3, {0xd8, 0xf1, 0x22} },
1098{ 0xa3d7, 16, {0x08, 0x08, 0x08, 0xe6, 0xcf, 0x2f, 0xf6, 0x18, 0xe6, 0xce, 0x3e, 0xf6, 0x18, 0xe6, 0xcd, 0x3d} },
1099{ 0xa3e7, 7, {0xf6, 0x18, 0xe6, 0xcc, 0x3c, 0xf6, 0x22} },
1100{ 0xa3ee, 12, {0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} },
1101{ 0xa3fa, 16, {0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0, 0x82, 0x12, 0xa4, 0x11, 0x12, 0xa4, 0x11, 0x12} },
1102{ 0xa40a, 16, {0xa4, 0x11, 0x12, 0xa4, 0x11, 0xe4, 0x73, 0xe4, 0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83} },
1103{ 0xa41a, 16, {0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8} },
1104{ 0xa42a, 1, {0x22} },
1105{ 0xffff, 0, {0x00} }
1106};
1107
1108#ifdef DEBUG
1109static const struct whiteheat_hex_record whiteheat_loader[] = {
1110{ 0x0000, 3, {0x02, 0x09, 0x8d} },
1111{ 0x0033, 3, {0x02, 0x0e, 0x70} },
1112{ 0x0043, 3, {0x02, 0x0b, 0x00} },
1113{ 0x004b, 3, {0x02, 0x05, 0xb3} },
1114{ 0x0100, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
1115{ 0x0110, 16, {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
1116{ 0x0120, 16, {0x7c, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
1117{ 0x0130, 16, {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
1118{ 0x0140, 16, {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
1119{ 0x0150, 16, {0x02, 0x03, 0x7c, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
1120{ 0x0160, 16, {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x7c, 0x12} },
1121{ 0x0170, 16, {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
1122{ 0x0180, 16, {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
1123{ 0x0190, 16, {0x7c, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
1124{ 0x01a0, 16, {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
1125{ 0x01b0, 16, {0x03, 0x12, 0x0d, 0xd5, 0xd2, 0x06, 0x12, 0x0d, 0x0d, 0x02, 0x03, 0x7c, 0x90, 0x7f, 0xea, 0xe0} },
1126{ 0x01c0, 16, {0x75, 0x29, 0x00, 0xf5, 0x2a, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x29, 0x90, 0x7f, 0xee, 0xe0} },
1127{ 0x01d0, 16, {0x75, 0x2b, 0x00, 0xf5, 0x2c, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2b, 0x90, 0x7f, 0xe8, 0xe0} },
1128{ 0x01e0, 16, {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c} },
1129{ 0x01f0, 16, {0xc3, 0xe5, 0x2c, 0x94, 0x40, 0xe5, 0x2b, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2b, 0x2d, 0x85, 0x2c} },
1130{ 0x0200, 16, {0x2e, 0x80, 0x06, 0x75, 0x2d, 0x00, 0x75, 0x2e, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
1131{ 0x0210, 16, {0x34, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x5c} },
1132{ 0x0220, 16, {0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5, 0x31, 0x35, 0x29, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
1133{ 0x0230, 16, {0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70} },
1134{ 0x0240, 16, {0x02, 0x05, 0x31, 0x80, 0xd0, 0xe4, 0xf5, 0x31, 0xf5, 0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5} },
1135{ 0x0250, 16, {0x31, 0x95, 0x2d, 0x50, 0x18, 0x74, 0x00, 0x25, 0x32, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
1136{ 0x0260, 16, {0x74, 0xcd, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80, 0xdd, 0xaf, 0x2a, 0xae} },
1137{ 0x0270, 16, {0x29, 0xad, 0x2e, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
1138{ 0x0280, 16, {0x2e, 0xf0, 0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5} },
1139{ 0x0290, 16, {0x2c, 0x95, 0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
1140{ 0x02a0, 16, {0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3, 0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50} },
1141{ 0x02b0, 16, {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
1142{ 0x02c0, 16, {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
1143{ 0x02d0, 16, {0x03, 0x02, 0x03, 0x7c, 0xe5, 0x2c, 0x45, 0x2b, 0x70, 0x03, 0x02, 0x03, 0x7c, 0xe4, 0x90, 0x7f} },
1144{ 0x02e0, 16, {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2f, 0x00, 0xf5, 0x30, 0xd3} },
1145{ 0x02f0, 16, {0x94, 0x00, 0xe5, 0x2f, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
1146{ 0x0300, 16, {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2d, 0x00, 0xf5} },
1147{ 0x0310, 16, {0x2e, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x38, 0x90, 0x20, 0x6b, 0xf0, 0xf5, 0x31, 0xf5} },
1148{ 0x0320, 16, {0x32, 0xc3, 0xe5, 0x32, 0x95, 0x2e, 0xe5, 0x31, 0x95, 0x2d, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x32} },
1149{ 0x0330, 16, {0xf5, 0x82, 0xe4, 0x34, 0x7e, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x2a, 0x25, 0x32, 0xf5, 0x82, 0xe5} },
1150{ 0x0340, 16, {0x31, 0x35, 0x29, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x32, 0xe5, 0x32, 0x70, 0x02, 0x05, 0x31, 0x80} },
1151{ 0x0350, 16, {0xd0, 0xaf, 0x2a, 0xae, 0x29, 0xad, 0x2e, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x80} },
1152{ 0x0360, 16, {0xe5, 0x2e, 0x25, 0x2a, 0xf5, 0x2a, 0xe5, 0x2d, 0x35, 0x29, 0xf5, 0x29, 0xc3, 0xe5, 0x2c, 0x95} },
1153{ 0x0370, 13, {0x2e, 0xf5, 0x2c, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0x02, 0x02, 0xd4, 0xc3} },
1154{ 0x037d, 1, {0x22} },
1155{ 0x037e, 16, {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x56, 0x14, 0x70, 0x03, 0x02, 0x04, 0xd2, 0x24} },
1156{ 0x038e, 16, {0xfe, 0x70, 0x03, 0x02, 0x05, 0x46, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x50, 0x14, 0x70, 0x03} },
1157{ 0x039e, 16, {0x02, 0x04, 0x4a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3e, 0x14, 0x70, 0x03, 0x02, 0x04, 0x44, 0x24} },
1158{ 0x03ae, 16, {0x05, 0x60, 0x03, 0x02, 0x05, 0x9a, 0x12, 0x0e, 0x7b, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f} },
1159{ 0x03be, 16, {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
1160{ 0x03ce, 16, {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0} },
1161{ 0x03de, 16, {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
1162{ 0x03ee, 16, {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90} },
1163{ 0x03fe, 16, {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0c} },
1164{ 0x040e, 16, {0x3f, 0x8b, 0x26, 0x8a, 0x27, 0x89, 0x28, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
1165{ 0x041e, 16, {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0} },
1166{ 0x042e, 16, {0x44, 0x01, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xab} },
1167{ 0x043e, 16, {0x12, 0x0e, 0x52, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x60, 0x02, 0x05, 0xab, 0x12, 0x0a, 0xf7, 0x02} },
1168{ 0x044e, 16, {0x05, 0xab, 0x12, 0x08, 0xf1, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7d, 0x40, 0x03, 0x02, 0x05, 0xab} },
1169{ 0x045e, 16, {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
1170{ 0x046e, 16, {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
1171{ 0x047e, 16, {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0xe4, 0x90, 0x7f, 0x00} },
1172{ 0x048e, 16, {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xec, 0xe0} },
1173{ 0x049e, 16, {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
1174{ 0x04ae, 16, {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
1175{ 0x04be, 16, {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
1176{ 0x04ce, 16, {0xf0, 0x02, 0x05, 0xab, 0x12, 0x0e, 0x7f, 0x40, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xe8, 0xe0} },
1177{ 0x04de, 16, {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
1178{ 0x04ee, 16, {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xab, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
1179{ 0x04fe, 16, {0xab, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
1180{ 0x050e, 16, {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
1181{ 0x051e, 16, {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
1182{ 0x052e, 16, {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x6e, 0x90} },
1183{ 0x053e, 16, {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x65, 0x12, 0x0e, 0x81, 0x50, 0x60, 0x90, 0x7f, 0xe8} },
1184{ 0x054e, 16, {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x54, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
1185{ 0x055e, 16, {0xd2, 0x00, 0x80, 0x49, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x40, 0x90, 0x7f, 0xea} },
1186{ 0x056e, 16, {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
1187{ 0x057e, 16, {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
1188{ 0x058e, 16, {0xf0, 0x80, 0x1a, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x11, 0xe4, 0x90, 0x20, 0x6a} },
1189{ 0x059e, 16, {0xf0, 0x12, 0x01, 0x00, 0x50, 0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4} },
1190{ 0x05ae, 4, {0xe0, 0x44, 0x02, 0xf0} },
1191{ 0x05b2, 1, {0x22} },
1192{ 0x05b3, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
1193{ 0x05c3, 16, {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
1194{ 0x05d3, 16, {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x7f, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
1195{ 0x05e3, 16, {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x7f, 0xaf, 0x0d, 0xef} },
1196{ 0x05f3, 16, {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
1197{ 0x0603, 16, {0x06, 0x7f, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
1198{ 0x0613, 16, {0x00, 0x12, 0x07, 0x85, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
1199{ 0x0623, 16, {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
1200{ 0x0633, 16, {0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
1201{ 0x0643, 16, {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
1202{ 0x0653, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
1203{ 0x0663, 16, {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x07, 0xb2, 0x05, 0x0c} },
1204{ 0x0673, 16, {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
1205{ 0x0683, 16, {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
1206{ 0x0693, 10, {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1207{ 0x069d, 16, {0xc2, 0x04, 0xd2, 0x05, 0xe4, 0xf5, 0x25, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12} },
1208{ 0x06ad, 16, {0x0e, 0x74, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9} },
1209{ 0x06bd, 16, {0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90} },
1210{ 0x06cd, 16, {0x7f, 0x93, 0x74, 0x30, 0xf0, 0x12, 0x0a, 0x19, 0x75, 0x24, 0x48, 0x75, 0x23, 0x92, 0x75, 0x22} },
1211{ 0x06dd, 16, {0x00, 0x75, 0x21, 0x00, 0xe4, 0xff, 0xfe, 0x7e, 0x05, 0x90, 0x20, 0x68, 0x74, 0x01, 0xf0, 0xa3} },
1212{ 0x06ed, 16, {0xde, 0xfc, 0x7e, 0x00, 0x7f, 0x05, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae} },
1213{ 0x06fd, 16, {0xe0, 0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x68, 0x30, 0x01, 0x0a, 0xe4, 0x90, 0x20, 0x69} },
1214{ 0x070d, 16, {0xf0, 0x12, 0x03, 0x7e, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x77, 0x50, 0x13, 0x12, 0x09} },
1215{ 0x071d, 16, {0x00, 0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x8b, 0x12, 0x0e} },
1216{ 0x072d, 16, {0x79, 0xc2, 0x03, 0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x21, 0x12, 0x08, 0x1d} },
1217{ 0x073d, 16, {0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xc3, 0x12, 0x08, 0x0c, 0x70, 0x1b, 0x75, 0x24} },
1218{ 0x074d, 16, {0x48, 0x75, 0x23, 0x92, 0xf5, 0x22, 0xf5, 0x21, 0x63, 0x25, 0xff, 0x90, 0x20, 0x68, 0xe5, 0x25} },
1219{ 0x075d, 14, {0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0x12, 0x08, 0xff, 0x80, 0x9b} },
1220{ 0x076b, 1, {0x22} },
1221{ 0x076c, 16, {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
1222{ 0x077c, 9, {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
1223{ 0x0785, 16, {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
1224{ 0x0795, 16, {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
1225{ 0x07a5, 13, {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
1226{ 0x07b2, 16, {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
1227{ 0x07c2, 16, {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
1228{ 0x07d2, 2, {0xf2, 0x22} },
1229{ 0x07d4, 16, {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
1230{ 0x07e4, 16, {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
1231{ 0x07f4, 16, {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
1232{ 0x0804, 8, {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
1233{ 0x080c, 16, {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
1234{ 0x081c, 1, {0x22} },
1235{ 0x081d, 16, {0x08, 0x08, 0x08, 0xe6, 0x2f, 0xff, 0xf6, 0x18, 0xe6, 0x3e, 0xfe, 0xf6, 0x18, 0xe6, 0x3d, 0xfd} },
1236{ 0x082d, 7, {0xf6, 0x18, 0xe6, 0x3c, 0xfc, 0xf6, 0x22} },
1237{ 0x0834, 4, {0x8c, 0x34, 0x8d, 0x35} },
1238{ 0x0838, 16, {0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95} },
1239{ 0x0848, 16, {0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x69, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5} },
1240{ 0x0858, 16, {0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
1241{ 0x0868, 16, {0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36} },
1242{ 0x0878, 16, {0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x37, 0xf5} },
1243{ 0x0888, 16, {0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60, 0x02, 0xc3, 0x22, 0xad} },
1244{ 0x0898, 16, {0x37, 0xe5, 0x37, 0x2f, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xed, 0xf0, 0xfc, 0xac, 0x05} },
1245{ 0x08a8, 16, {0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x37, 0xe5, 0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0x8c} },
1246{ 0x08b8, 16, {0xe4, 0xf5, 0x36, 0xf5, 0x37, 0xc3, 0xe5, 0x37, 0x95, 0x35, 0xe5, 0x36, 0x95, 0x34, 0x50, 0x27} },
1247{ 0x08c8, 16, {0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe0, 0x65, 0x37, 0x60, 0x02, 0xc3} },
1248{ 0x08d8, 16, {0x22, 0xef, 0x25, 0x37, 0xf5, 0x82, 0xe5, 0x36, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x37, 0xe5} },
1249{ 0x08e8, 8, {0x37, 0x70, 0x02, 0x05, 0x36, 0x80, 0xce, 0xd3} },
1250{ 0x08f0, 1, {0x22} },
1251{ 0x08f1, 14, {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
1252{ 0x08ff, 1, {0x22} },
1253{ 0x0900, 9, {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
1254{ 0x097d, 16, {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
1255{ 0x098d, 12, {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x3a, 0x02, 0x09, 0xd4} },
1256{ 0x0999, 16, {0x02, 0x06, 0x9d, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
1257{ 0x09a9, 16, {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
1258{ 0x09b9, 16, {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
1259{ 0x09c9, 16, {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0e, 0x2d, 0xe4, 0x7e} },
1260{ 0x09d9, 16, {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
1261{ 0x09e9, 16, {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
1262{ 0x09f9, 16, {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
1263{ 0x0a09, 16, {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
1264{ 0x0a19, 16, {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0x74, 0x89} },
1265{ 0x0a29, 16, {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0xd5, 0x90, 0x7f} },
1266{ 0x0a39, 16, {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x7f, 0x05, 0x7e, 0x00} },
1267{ 0x0a49, 16, {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
1268{ 0x0a59, 16, {0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
1269{ 0x0a69, 16, {0x12, 0x0d, 0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
1270{ 0x0a79, 16, {0xd5, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0xd5, 0x22} },
1271{ 0x0a89, 16, {0x75, 0x33, 0x01, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x0e} },
1272{ 0x0a99, 16, {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
1273{ 0x0aa9, 16, {0x0e, 0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
1274{ 0x0ab9, 16, {0x00, 0x7c, 0x80, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e} },
1275{ 0x0ac9, 16, {0x18, 0xe5, 0x33, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0e, 0x18, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
1276{ 0x0ad9, 16, {0x7c, 0x5b, 0x12, 0x08, 0x34, 0xe4, 0x33, 0xf5, 0x33, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0e, 0x18} },
1277{ 0x0ae9, 13, {0xe5, 0x33, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0e, 0x18, 0xe5, 0x33, 0x24, 0xff} },
1278{ 0x0af6, 1, {0x22} },
1279{ 0x0af7, 8, {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
1280{ 0x0aff, 1, {0x32} },
1281{ 0x0b00, 16, {0x02, 0x0d, 0xa5, 0x00, 0x02, 0x0d, 0xec, 0x00, 0x02, 0x0d, 0x70, 0x00, 0x02, 0x0d, 0xbd, 0x00} },
1282{ 0x0b10, 16, {0x02, 0x0e, 0x02, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x83, 0x00, 0x02, 0x0e, 0x84, 0x00} },
1283{ 0x0b20, 16, {0x02, 0x0e, 0x85, 0x00, 0x02, 0x0e, 0x86, 0x00, 0x02, 0x0e, 0x87, 0x00, 0x02, 0x0e, 0x88, 0x00} },
1284{ 0x0b30, 16, {0x02, 0x0e, 0x89, 0x00, 0x02, 0x0e, 0x8a, 0x00, 0x02, 0x0e, 0x8b, 0x00, 0x02, 0x0e, 0x8c, 0x00} },
1285{ 0x0b40, 16, {0x02, 0x0e, 0x8d, 0x00, 0x02, 0x0e, 0x8e, 0x00, 0x02, 0x0e, 0x8f, 0x00, 0x02, 0x0e, 0x90, 0x00} },
1286{ 0x0b50, 8, {0x02, 0x0e, 0x91, 0x00, 0x02, 0x0e, 0x92, 0x00} },
1287{ 0x0b58, 16, {0xe4, 0xfe, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x12, 0xab, 0x2b, 0xaa, 0x2c, 0xa9} },
1288{ 0x0b68, 16, {0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
1289{ 0x0b78, 16, {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x07, 0xd4, 0x85, 0xf0, 0x29, 0xf5, 0x2a, 0x62, 0x29} },
1290{ 0x0b88, 16, {0xe5, 0x29, 0x62, 0x2a, 0xe5, 0x2a, 0x62, 0x29, 0x29, 0xfd, 0xe5, 0x29, 0x3a, 0xa9, 0x05, 0x75} },
1291{ 0x0b98, 14, {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
1292{ 0x0ba6, 1, {0x22} },
1293{ 0x0ba7, 6, {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05} },
1294{ 0x0bad, 16, {0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82} },
1295{ 0x0bbd, 16, {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05, 0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82} },
1296{ 0x0bcd, 16, {0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d, 0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4} },
1297{ 0x0bdd, 16, {0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x10, 0x12, 0x0d, 0x51, 0x7f} },
1298{ 0x0bed, 6, {0x0a, 0x7e, 0x00, 0x12, 0x0d, 0xd5} },
1299{ 0x0bf3, 1, {0x22} },
1300{ 0x0bf4, 10, {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
1301{ 0x0bfe, 16, {0xe4, 0xfd, 0xf5, 0x38, 0xe5, 0x11, 0x60, 0x12, 0xe5, 0x33, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24} },
1302{ 0x0c0e, 16, {0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x34, 0xae, 0x05, 0x0d, 0x74} },
1303{ 0x0c1e, 16, {0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xe5, 0x34, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
1304{ 0x0c2e, 16, {0x7b, 0x13, 0x12, 0x0d, 0x51, 0xaf, 0x0f, 0xad, 0x35, 0xab, 0x37, 0xaa, 0x36, 0x12, 0x0d, 0x32} },
1305{ 0x0c3e, 1, {0x22} },
1306{ 0x0c3f, 2, {0x8f, 0x29} },
1307{ 0x0c41, 16, {0xe4, 0xf5, 0x2a, 0x75, 0x2b, 0xff, 0x75, 0x2c, 0x11, 0x75, 0x2d, 0x32, 0xab, 0x2b, 0xaa, 0x2c} },
1308{ 0x0c51, 16, {0xa9, 0x2d, 0x90, 0x00, 0x01, 0x12, 0x07, 0x85, 0xb4, 0x03, 0x1d, 0xaf, 0x2a, 0x05, 0x2a, 0xef} },
1309{ 0x0c61, 16, {0xb5, 0x29, 0x01, 0x22, 0x12, 0x07, 0x6c, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
1310{ 0x0c71, 14, {0x2b, 0xff, 0xf5, 0x2c, 0x89, 0x2d, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
1311{ 0x0c7f, 1, {0x22} },
1312{ 0x0c80, 10, {0x8e, 0x33, 0x8f, 0x34, 0x8d, 0x35, 0x8a, 0x36, 0x8b, 0x37} },
1313{ 0x0c8a, 16, {0xe4, 0xf5, 0x38, 0xe5, 0x38, 0xc3, 0x95, 0x35, 0x50, 0x20, 0x05, 0x34, 0xe5, 0x34, 0xae, 0x33} },
1314{ 0x0c9a, 16, {0x70, 0x02, 0x05, 0x33, 0x14, 0xff, 0xe5, 0x37, 0x25, 0x38, 0xf5, 0x82, 0xe4, 0x35, 0x36, 0xf5} },
1315{ 0x0caa, 10, {0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7, 0x05, 0x38, 0x80, 0xd9} },
1316{ 0x0cb4, 1, {0x22} },
1317{ 0x0cb5, 16, {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
1318{ 0x0cc5, 16, {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
1319{ 0x0cd5, 13, {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
1320{ 0x0ce2, 16, {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
1321{ 0x0cf2, 16, {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
1322{ 0x0d02, 11, {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
1323{ 0x0d0d, 16, {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
1324{ 0x0d1d, 16, {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
1325{ 0x0d2d, 5, {0xe0, 0x44, 0x04, 0xf0, 0x22} },
1326{ 0x0d32, 16, {0x12, 0x0c, 0xb5, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
1327{ 0x0d42, 15, {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
1328{ 0x0d51, 16, {0x12, 0x0c, 0xe2, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
1329{ 0x0d61, 15, {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
1330{ 0x0d70, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
1331{ 0x0d80, 11, {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1332{ 0x0d8b, 16, {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
1333{ 0x0d9b, 10, {0x0d, 0xd5, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
1334{ 0x0da5, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
1335{ 0x0db5, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1336{ 0x0dbd, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
1337{ 0x0dcd, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1338{ 0x0dd5, 16, {0x8e, 0x39, 0x8f, 0x3a, 0xe5, 0x3a, 0x15, 0x3a, 0xae, 0x39, 0x70, 0x02, 0x15, 0x39, 0x4e, 0x60} },
1339{ 0x0de5, 7, {0x05, 0x12, 0x0e, 0x41, 0x80, 0xee, 0x22} },
1340{ 0x0dec, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
1341{ 0x0dfc, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1342{ 0x0e02, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
1343{ 0x0e12, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1344{ 0x0e18, 16, {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
1345{ 0x0e28, 5, {0xfa, 0x12, 0x0d, 0x51, 0x22} },
1346{ 0x0e2d, 16, {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
1347{ 0x0e3d, 3, {0xa1, 0x86, 0x8e} },
1348{ 0x0e40, 1, {0x00} },
1349{ 0x0e41, 16, {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
1350{ 0x0e51, 1, {0x22} },
1351{ 0x0e52, 14, {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
1352{ 0x0e60, 8, {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
1353{ 0x0e68, 8, {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
1354{ 0x0e70, 4, {0x53, 0xd8, 0xef, 0x32} },
1355{ 0x0e74, 3, {0xd2, 0x00, 0x22} },
1356{ 0x0e77, 2, {0xd3, 0x22} },
1357{ 0x0e79, 2, {0xd3, 0x22} },
1358{ 0x0e7b, 2, {0xd3, 0x22} },
1359{ 0x0e7d, 2, {0xd3, 0x22} },
1360{ 0x0e7f, 2, {0xd3, 0x22} },
1361{ 0x0e81, 2, {0xd3, 0x22} },
1362{ 0x0e83, 1, {0x32} },
1363{ 0x0e84, 1, {0x32} },
1364{ 0x0e85, 1, {0x32} },
1365{ 0x0e86, 1, {0x32} },
1366{ 0x0e87, 1, {0x32} },
1367{ 0x0e88, 1, {0x32} },
1368{ 0x0e89, 1, {0x32} },
1369{ 0x0e8a, 1, {0x32} },
1370{ 0x0e8b, 1, {0x32} },
1371{ 0x0e8c, 1, {0x32} },
1372{ 0x0e8d, 1, {0x32} },
1373{ 0x0e8e, 1, {0x32} },
1374{ 0x0e8f, 1, {0x32} },
1375{ 0x0e90, 1, {0x32} },
1376{ 0x0e91, 1, {0x32} },
1377{ 0x0e92, 1, {0x32} },
1378{ 0x1100, 16, {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
1379{ 0x1110, 16, {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
1380{ 0x1120, 16, {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
1381{ 0x1130, 16, {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
1382{ 0x1140, 16, {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
1383{ 0x1150, 16, {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
1384{ 0x1160, 16, {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
1385{ 0x1170, 16, {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
1386{ 0x1180, 16, {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
1387{ 0x1190, 16, {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
1388{ 0x11a0, 16, {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
1389{ 0x11b0, 16, {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
1390{ 0x11c0, 16, {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
1391{ 0x11d0, 2, {0x00, 0x00} },
1392{ 0xffff, 0, {0x00} }
1393};
1394
1395#else
1396
1397static const struct whiteheat_hex_record whiteheat_loader[] = {
1398{ 0x0000, 3, {0x02, 0x09, 0x8d} },
1399{ 0x0033, 3, {0x02, 0x08, 0xfb} },
1400{ 0x0043, 3, {0x02, 0x0b, 0x00} },
1401{ 0x004b, 3, {0x02, 0x05, 0xaa} },
1402{ 0x0100, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x54, 0x10, 0xff, 0xc4, 0x54, 0x0f, 0x44, 0x50, 0xf5, 0x0f, 0x13, 0xe4} },
1403{ 0x0110, 16, {0x33, 0xf5, 0x11, 0x90, 0x7f, 0xe9, 0xe0, 0x24, 0x5e, 0xb4, 0x07, 0x00, 0x40, 0x03, 0x02, 0x03} },
1404{ 0x0120, 16, {0x78, 0x90, 0x01, 0x28, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x01, 0xbc, 0x02, 0x01, 0xbc, 0x02, 0x01} },
1405{ 0x0130, 16, {0x91, 0x02, 0x01, 0x3d, 0x02, 0x01, 0x53, 0x02, 0x01, 0x6f, 0x02, 0x01, 0x9a, 0x90, 0x7f, 0x00} },
1406{ 0x0140, 16, {0xe5, 0x11, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0} },
1407{ 0x0150, 16, {0x02, 0x03, 0x78, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x90, 0x7f, 0x00, 0xf0, 0x90} },
1408{ 0x0160, 16, {0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03, 0x78, 0x12} },
1409{ 0x0170, 16, {0x0a, 0x89, 0x50, 0x07, 0xe4, 0x90, 0x7f, 0x00, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0x00, 0x74, 0x0f} },
1410{ 0x0180, 16, {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x03} },
1411{ 0x0190, 16, {0x78, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0f, 0x02, 0x03, 0x78, 0x90, 0x7f, 0x00, 0x74, 0x07, 0xf0} },
1412{ 0x01a0, 16, {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x7f, 0xe8, 0x7e} },
1413{ 0x01b0, 16, {0x03, 0x12, 0x0d, 0x94, 0xd2, 0x06, 0x12, 0x0c, 0xcc, 0x02, 0x03, 0x78, 0x90, 0x7f, 0xea, 0xe0} },
1414{ 0x01c0, 16, {0x75, 0x28, 0x00, 0xf5, 0x29, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x28, 0x90, 0x7f, 0xee, 0xe0} },
1415{ 0x01d0, 16, {0x75, 0x2a, 0x00, 0xf5, 0x2b, 0xa3, 0xe0, 0xfe, 0xe4, 0xee, 0x42, 0x2a, 0x90, 0x7f, 0xe8, 0xe0} },
1416{ 0x01e0, 16, {0x64, 0xc0, 0x60, 0x03, 0x02, 0x02, 0xc9, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78} },
1417{ 0x01f0, 16, {0xc3, 0xe5, 0x2b, 0x94, 0x40, 0xe5, 0x2a, 0x94, 0x00, 0x50, 0x08, 0x85, 0x2a, 0x2c, 0x85, 0x2b} },
1418{ 0x0200, 16, {0x2d, 0x80, 0x06, 0x75, 0x2c, 0x00, 0x75, 0x2d, 0x40, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70} },
1419{ 0x0210, 16, {0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x5c} },
1420{ 0x0220, 16, {0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83, 0xe0, 0xff, 0x74, 0x00} },
1421{ 0x0230, 16, {0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70} },
1422{ 0x0240, 16, {0x02, 0x05, 0x30, 0x80, 0xd0, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31, 0x95, 0x2d, 0xe5} },
1423{ 0x0250, 16, {0x30, 0x95, 0x2c, 0x50, 0x18, 0x74, 0x00, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83} },
1424{ 0x0260, 16, {0x74, 0xcd, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xdd, 0xaf, 0x29, 0xae} },
1425{ 0x0270, 16, {0x28, 0xad, 0x2d, 0x7a, 0x7f, 0x79, 0x00, 0x7b, 0x00, 0x12, 0x0b, 0xf4, 0x90, 0x7f, 0xb5, 0xe5} },
1426{ 0x0280, 16, {0x2d, 0xf0, 0xe5, 0x2d, 0x25, 0x29, 0xf5, 0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5} },
1427{ 0x0290, 16, {0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a, 0x95, 0x2c, 0xf5, 0x2a, 0x90, 0x7f, 0x92, 0xe0, 0xff} },
1428{ 0x02a0, 16, {0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3, 0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50} },
1429{ 0x02b0, 16, {0x0c, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe1, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xb4} },
1430{ 0x02c0, 16, {0xe0, 0x20, 0xe2, 0x03, 0x02, 0x01, 0xe7, 0x80, 0xf4, 0x90, 0x7f, 0xe8, 0xe0, 0x64, 0x40, 0x60} },
1431{ 0x02d0, 16, {0x03, 0x02, 0x03, 0x78, 0xe5, 0x2b, 0x45, 0x2a, 0x70, 0x03, 0x02, 0x03, 0x78, 0xe4, 0x90, 0x7f} },
1432{ 0x02e0, 16, {0xc5, 0xf0, 0x90, 0x7f, 0x92, 0xe0, 0xff, 0xc4, 0x54, 0x0f, 0x75, 0x2e, 0x00, 0xf5, 0x2f, 0xd3} },
1433{ 0x02f0, 16, {0x94, 0x00, 0xe5, 0x2e, 0x94, 0x00, 0x50, 0x09, 0x90, 0x7f, 0xc4, 0xe0, 0x30, 0xe1, 0x09, 0x80} },
1434{ 0x0300, 16, {0xf7, 0x90, 0x7f, 0xb4, 0xe0, 0x20, 0xe3, 0xf9, 0x90, 0x7f, 0xc5, 0xe0, 0x75, 0x2c, 0x00, 0xf5} },
1435{ 0x0310, 16, {0x2d, 0x90, 0x7f, 0xe9, 0xe0, 0x64, 0xa3, 0x70, 0x34, 0xf5, 0x30, 0xf5, 0x31, 0xc3, 0xe5, 0x31} },
1436{ 0x0320, 16, {0x95, 0x2d, 0xe5, 0x30, 0x95, 0x2c, 0x50, 0x34, 0x74, 0xc0, 0x25, 0x31, 0xf5, 0x82, 0xe4, 0x34} },
1437{ 0x0330, 1, {0x7e} },
1438{ 0x0331, 16, {0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x29, 0x25, 0x31, 0xf5, 0x82, 0xe5, 0x30, 0x35, 0x28, 0xf5, 0x83} },
1439{ 0x0341, 16, {0xef, 0xf0, 0x05, 0x31, 0xe5, 0x31, 0x70, 0x02, 0x05, 0x30, 0x80, 0xd0, 0xaf, 0x29, 0xae, 0x28} },
1440{ 0x0351, 16, {0xad, 0x2d, 0x7a, 0x7e, 0x79, 0xc0, 0x7b, 0xc0, 0x12, 0x0c, 0x3f, 0xe5, 0x2d, 0x25, 0x29, 0xf5} },
1441{ 0x0361, 16, {0x29, 0xe5, 0x2c, 0x35, 0x28, 0xf5, 0x28, 0xc3, 0xe5, 0x2b, 0x95, 0x2d, 0xf5, 0x2b, 0xe5, 0x2a} },
1442{ 0x0371, 9, {0x95, 0x2c, 0xf5, 0x2a, 0x02, 0x02, 0xd4, 0xc3, 0x22} },
1443{ 0x037a, 16, {0x90, 0x7f, 0xe9, 0xe0, 0x70, 0x03, 0x02, 0x04, 0x52, 0x14, 0x70, 0x03, 0x02, 0x04, 0xce, 0x24} },
1444{ 0x038a, 16, {0xfe, 0x70, 0x03, 0x02, 0x05, 0x42, 0x24, 0xfb, 0x70, 0x03, 0x02, 0x04, 0x4c, 0x14, 0x70, 0x03} },
1445{ 0x039a, 16, {0x02, 0x04, 0x46, 0x14, 0x70, 0x03, 0x02, 0x04, 0x3a, 0x14, 0x70, 0x03, 0x02, 0x04, 0x40, 0x24} },
1446{ 0x03aa, 16, {0x05, 0x60, 0x03, 0x02, 0x05, 0x96, 0x12, 0x0e, 0x44, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f} },
1447{ 0x03ba, 16, {0xeb, 0xe0, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x40, 0x24, 0x02, 0x70, 0x69, 0x74, 0x11, 0x90} },
1448{ 0x03ca, 16, {0x7f, 0xd4, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0} },
1449{ 0x03da, 16, {0xff, 0x12, 0x0b, 0x58, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02} },
1450{ 0x03ea, 16, {0xee, 0x90, 0x7f, 0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90} },
1451{ 0x03fa, 16, {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x08} },
1452{ 0x040a, 16, {0xba, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0xea, 0x49, 0x60, 0x11, 0xae, 0x02, 0xee, 0x90, 0x7f} },
1453{ 0x041a, 16, {0xd4, 0xf0, 0xaf, 0x01, 0xef, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0} },
1454{ 0x042a, 16, {0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa2} },
1455{ 0x043a, 16, {0x12, 0x0e, 0x1f, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x2d, 0x02, 0x05, 0xa2, 0x12, 0x0a, 0xf7, 0x02} },
1456{ 0x044a, 16, {0x05, 0xa2, 0x12, 0x0e, 0x11, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x46, 0x40, 0x03, 0x02, 0x05, 0xa2} },
1457{ 0x045a, 16, {0x90, 0x7f, 0xe8, 0xe0, 0x24, 0x7f, 0x60, 0x24, 0x14, 0x60, 0x31, 0x24, 0x02, 0x70, 0x5b, 0xa2} },
1458{ 0x046a, 16, {0x00, 0xe4, 0x33, 0xff, 0x25, 0xe0, 0xff, 0xa2, 0x02, 0xe4, 0x33, 0x4f, 0x90, 0x7f, 0x00, 0xf0} },
1459{ 0x047a, 16, {0xe4, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0xe4, 0x90, 0x7f, 0x00} },
1460{ 0x048a, 16, {0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xec, 0xe0} },
1461{ 0x049a, 16, {0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4} },
1462{ 0x04aa, 16, {0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0x90, 0x7f, 0x00, 0xf0, 0xe4, 0xa3} },
1463{ 0x04ba, 16, {0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01} },
1464{ 0x04ca, 16, {0xf0, 0x02, 0x05, 0xa2, 0x12, 0x0e, 0x48, 0x40, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xe8, 0xe0} },
1465{ 0x04da, 16, {0x24, 0xfe, 0x60, 0x1d, 0x24, 0x02, 0x60, 0x03, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xea, 0xe0, 0xb4} },
1466{ 0x04ea, 16, {0x01, 0x05, 0xc2, 0x00, 0x02, 0x05, 0xa2, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05} },
1467{ 0x04fa, 16, {0xa2, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x38, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4} },
1468{ 0x050a, 16, {0x54, 0x0f, 0xff, 0xe0, 0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f} },
1469{ 0x051a, 16, {0xf5, 0x83, 0xe4, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0x54, 0x80, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f} },
1470{ 0x052a, 16, {0xff, 0xe0, 0x54, 0x07, 0x2f, 0x90, 0x7f, 0xd7, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x69, 0x90} },
1471{ 0x053a, 16, {0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x60, 0x12, 0x0e, 0x4a, 0x50, 0x5b, 0x90, 0x7f, 0xe8} },
1472{ 0x054a, 16, {0xe0, 0x24, 0xfe, 0x60, 0x18, 0x24, 0x02, 0x70, 0x4f, 0x90, 0x7f, 0xea, 0xe0, 0xb4, 0x01, 0x04} },
1473{ 0x055a, 16, {0xd2, 0x00, 0x80, 0x44, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x3b, 0x90, 0x7f, 0xea} },
1474{ 0x056a, 16, {0xe0, 0x70, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0xf4, 0x54, 0x80, 0xff, 0xc4, 0x54, 0x0f, 0xff, 0xe0} },
1475{ 0x057a, 16, {0x54, 0x07, 0x2f, 0x25, 0xe0, 0x24, 0xb4, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74, 0x01} },
1476{ 0x058a, 16, {0xf0, 0x80, 0x15, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x0c, 0x12, 0x01, 0x00, 0x50} },
1477{ 0x059a, 16, {0x07, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x22} },
1478{ 0x05aa, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0x85, 0xc0, 0x84, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0} },
1479{ 0x05ba, 16, {0xd0, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x7f, 0xa5} },
1480{ 0x05ca, 16, {0xe0, 0x30, 0xe2, 0x06, 0x75, 0x0d, 0x06, 0x02, 0x06, 0x76, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe1} },
1481{ 0x05da, 16, {0x0c, 0xe5, 0x0d, 0x64, 0x02, 0x60, 0x06, 0x75, 0x0d, 0x07, 0x02, 0x06, 0x76, 0xaf, 0x0d, 0xef} },
1482{ 0x05ea, 16, {0x24, 0xfe, 0x60, 0x48, 0x14, 0x60, 0x2c, 0x24, 0xfe, 0x60, 0x77, 0x24, 0x04, 0x60, 0x03, 0x02} },
1483{ 0x05fa, 16, {0x06, 0x76, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xaf, 0x0c, 0x05, 0x0c, 0x8f, 0x82, 0x75, 0x83} },
1484{ 0x060a, 16, {0x00, 0x12, 0x08, 0x22, 0x90, 0x7f, 0xa6, 0xf0, 0xe5, 0x0c, 0x65, 0x08, 0x70, 0x5e, 0x75, 0x0d} },
1485{ 0x061a, 16, {0x05, 0x80, 0x59, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09, 0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e} },
1486{ 0x062a, 16, {0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x75, 0x0d, 0x02, 0x80, 0x40, 0xe5, 0x08, 0x24, 0xfe} },
1487{ 0x063a, 16, {0xb5, 0x0c, 0x07, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x20, 0xf0, 0xe5, 0x08, 0x14, 0xb5, 0x0c, 0x0a} },
1488{ 0x064a, 16, {0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x90, 0x7f, 0xa6, 0xe0, 0xab, 0x09} },
1489{ 0x065a, 16, {0xaa, 0x0a, 0xa9, 0x0b, 0xae, 0x0c, 0x8e, 0x82, 0x75, 0x83, 0x00, 0x12, 0x08, 0x4f, 0x05, 0x0c} },
1490{ 0x066a, 16, {0x80, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe4, 0xf5, 0x0d, 0x53, 0x91, 0xdf, 0xd0} },
1491{ 0x067a, 16, {0x07, 0xd0, 0x06, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x86, 0xd0} },
1492{ 0x068a, 10, {0x84, 0xd0, 0x85, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1493{ 0x0694, 16, {0x8c, 0x33, 0x8d, 0x34, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x36} },
1494{ 0x06a4, 16, {0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35, 0x95, 0x33, 0x50, 0x69, 0xef, 0x25, 0x36, 0xf5, 0x82} },
1495{ 0x06b4, 16, {0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xff, 0xf0, 0xf4, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
1496{ 0x06c4, 16, {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4, 0xf0, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36} },
1497{ 0x06d4, 16, {0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0xaa, 0xf0, 0x64, 0xaa, 0x60, 0x02, 0xc3, 0x22} },
1498{ 0x06e4, 16, {0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0x74, 0x55, 0xf0, 0x64, 0x55, 0x60} },
1499{ 0x06f4, 16, {0x02, 0xc3, 0x22, 0xad, 0x36, 0xe5, 0x36, 0x2f, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xed} },
1500{ 0x0704, 16, {0xf0, 0xfc, 0xac, 0x05, 0xed, 0x6c, 0x60, 0x02, 0xc3, 0x22, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02} },
1501{ 0x0714, 16, {0x05, 0x35, 0x80, 0x8c, 0xe4, 0xf5, 0x35, 0xf5, 0x36, 0xc3, 0xe5, 0x36, 0x95, 0x34, 0xe5, 0x35} },
1502{ 0x0724, 16, {0x95, 0x33, 0x50, 0x27, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe0, 0x65} },
1503{ 0x0734, 16, {0x36, 0x60, 0x02, 0xc3, 0x22, 0xef, 0x25, 0x36, 0xf5, 0x82, 0xe5, 0x35, 0x3e, 0xf5, 0x83, 0xe4} },
1504{ 0x0744, 13, {0xf0, 0x05, 0x36, 0xe5, 0x36, 0x70, 0x02, 0x05, 0x35, 0x80, 0xce, 0xd3, 0x22} },
1505{ 0x0751, 16, {0xc2, 0x04, 0xd2, 0x05, 0xc2, 0x03, 0xc2, 0x00, 0xc2, 0x02, 0xc2, 0x01, 0x12, 0x0e, 0x3d, 0xd2} },
1506{ 0x0761, 16, {0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xa9, 0xf0, 0x90, 0x7f} },
1507{ 0x0771, 16, {0xaa, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0xc0, 0xf0, 0x90, 0x7f, 0x93, 0x74} },
1508{ 0x0781, 16, {0x30, 0xf0, 0x12, 0x0a, 0x19, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0} },
1509{ 0x0791, 16, {0x44, 0x0d, 0xf0, 0xd2, 0xaf, 0x12, 0x0e, 0x35, 0x20, 0x01, 0x42, 0x75, 0x24, 0x00, 0x75, 0x23} },
1510{ 0x07a1, 16, {0x00, 0x75, 0x22, 0x00, 0x75, 0x21, 0x00, 0x7f, 0x48, 0x7e, 0x92, 0x7d, 0x00, 0x7c, 0x00, 0xab} },
1511{ 0x07b1, 16, {0x24, 0xaa, 0x23, 0xa9, 0x22, 0xa8, 0x21, 0xc3, 0x12, 0x08, 0xa9, 0x50, 0xdb, 0x20, 0x01, 0xd8} },
1512{ 0x07c1, 16, {0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xe5, 0x24, 0x24, 0x01, 0xf5, 0x24, 0xea, 0x35, 0x23, 0xf5} },
1513{ 0x07d1, 16, {0x23, 0xe9, 0x35, 0x22, 0xf5, 0x22, 0xe8, 0x35, 0x21, 0xf5, 0x21, 0x80, 0xca, 0x30, 0x01, 0x05} },
1514{ 0x07e1, 16, {0x12, 0x03, 0x7a, 0xc2, 0x01, 0x30, 0x04, 0x1a, 0x12, 0x0e, 0x40, 0x50, 0x13, 0x12, 0x09, 0x00} },
1515{ 0x07f1, 16, {0x30, 0x00, 0x07, 0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0xf3, 0x12, 0x0d, 0x4a, 0x12, 0x0e, 0x42} },
1516{ 0x0801, 8, {0xc2, 0x03, 0x12, 0x08, 0xff, 0x80, 0xd6, 0x22} },
1517{ 0x0809, 16, {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} },
1518{ 0x0819, 9, {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} },
1519{ 0x0822, 16, {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} },
1520{ 0x0832, 16, {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} },
1521{ 0x0842, 13, {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} },
1522{ 0x084f, 16, {0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0} },
1523{ 0x085f, 16, {0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8} },
1524{ 0x086f, 2, {0xf2, 0x22} },
1525{ 0x0871, 16, {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} },
1526{ 0x0881, 16, {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} },
1527{ 0x0891, 16, {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} },
1528{ 0x08a1, 8, {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} },
1529{ 0x08a9, 16, {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} },
1530{ 0x08b9, 1, {0x22} },
1531{ 0x08ba, 2, {0x8f, 0x28} },
1532{ 0x08bc, 16, {0xe4, 0xf5, 0x29, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x32, 0xab, 0x2a, 0xaa, 0x2b} },
1533{ 0x08cc, 16, {0xa9, 0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0xb4, 0x03, 0x1d, 0xaf, 0x29, 0x05, 0x29, 0xef} },
1534{ 0x08dc, 16, {0xb5, 0x28, 0x01, 0x22, 0x12, 0x08, 0x09, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} },
1535{ 0x08ec, 14, {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
1536{ 0x08fa, 1, {0x22} },
1537{ 0x08fb, 4, {0x53, 0xd8, 0xef, 0x32} },
1538{ 0x08ff, 1, {0x22} },
1539{ 0x0900, 9, {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} },
1540{ 0x097d, 16, {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} },
1541{ 0x098d, 12, {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x39, 0x02, 0x09, 0xd4} },
1542{ 0x0999, 16, {0x02, 0x07, 0x51, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} },
1543{ 0x09a9, 16, {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} },
1544{ 0x09b9, 16, {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} },
1545{ 0x09c9, 16, {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x0d, 0xec, 0xe4, 0x7e} },
1546{ 0x09d9, 16, {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} },
1547{ 0x09e9, 16, {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} },
1548{ 0x09f9, 16, {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} },
1549{ 0x0a09, 16, {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} },
1550{ 0x0a19, 16, {0xe4, 0x90, 0x7f, 0x9c, 0xf0, 0x7f, 0x0a, 0xfe, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0x74, 0x89} },
1551{ 0x0a29, 16, {0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xcf, 0xf0, 0x7f, 0xf4, 0x7e, 0x01, 0x12, 0x0d, 0x94, 0x90, 0x7f} },
1552{ 0x0a39, 16, {0x96, 0xe0, 0x54, 0xfe, 0xf0, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x7f, 0x05, 0x7e, 0x00} },
1553{ 0x0a49, 16, {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x02, 0xf0, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0x05} },
1554{ 0x0a59, 16, {0x7e, 0x00, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x05, 0x7e, 0x00} },
1555{ 0x0a69, 16, {0x12, 0x0d, 0x94, 0x90, 0x7f, 0x96, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d} },
1556{ 0x0a79, 16, {0x94, 0x90, 0x7f, 0x96, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x32, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
1557{ 0x0a89, 16, {0x75, 0x32, 0x01, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x01, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x0e} },
1558{ 0x0a99, 16, {0x7d, 0x00, 0x7c, 0x01, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12} },
1559{ 0x0aa9, 16, {0x0d, 0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x02, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x80, 0x7d} },
1560{ 0x0ab9, 16, {0x00, 0x7c, 0x80, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d} },
1561{ 0x0ac9, 16, {0xd7, 0xe5, 0x32, 0x60, 0x1b, 0x7f, 0x03, 0x12, 0x0d, 0xd7, 0x7f, 0x00, 0x7e, 0x20, 0x7d, 0x40} },
1562{ 0x0ad9, 16, {0x7c, 0x5b, 0x12, 0x06, 0x94, 0xe4, 0x33, 0xf5, 0x32, 0x70, 0x05, 0x7f, 0x0f, 0x12, 0x0d, 0xd7} },
1563{ 0x0ae9, 14, {0xe5, 0x32, 0x60, 0x05, 0xe4, 0xff, 0x12, 0x0d, 0xd7, 0xe5, 0x32, 0x24, 0xff, 0x22} },
1564{ 0x0af7, 8, {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x10, 0xd3, 0x22} },
1565{ 0x0aff, 1, {0x32} },
1566{ 0x0b00, 16, {0x02, 0x0d, 0x64, 0x00, 0x02, 0x0d, 0xab, 0x00, 0x02, 0x0d, 0x2f, 0x00, 0x02, 0x0d, 0x7c, 0x00} },
1567{ 0x0b10, 16, {0x02, 0x0d, 0xc1, 0x00, 0x02, 0x0a, 0xff, 0x00, 0x02, 0x0e, 0x4c, 0x00, 0x02, 0x0e, 0x4d, 0x00} },
1568{ 0x0b20, 16, {0x02, 0x0e, 0x4e, 0x00, 0x02, 0x0e, 0x4f, 0x00, 0x02, 0x0e, 0x50, 0x00, 0x02, 0x0e, 0x51, 0x00} },
1569{ 0x0b30, 16, {0x02, 0x0e, 0x52, 0x00, 0x02, 0x0e, 0x53, 0x00, 0x02, 0x0e, 0x54, 0x00, 0x02, 0x0e, 0x55, 0x00} },
1570{ 0x0b40, 16, {0x02, 0x0e, 0x56, 0x00, 0x02, 0x0e, 0x57, 0x00, 0x02, 0x0e, 0x58, 0x00, 0x02, 0x0e, 0x59, 0x00} },
1571{ 0x0b50, 8, {0x02, 0x0e, 0x5a, 0x00, 0x02, 0x0e, 0x5b, 0x00} },
1572{ 0x0b58, 16, {0xe4, 0xfe, 0x75, 0x2a, 0xff, 0x75, 0x2b, 0x11, 0x75, 0x2c, 0x12, 0xab, 0x2a, 0xaa, 0x2b, 0xa9} },
1573{ 0x0b68, 16, {0x2c, 0x90, 0x00, 0x01, 0x12, 0x08, 0x22, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} },
1574{ 0x0b78, 16, {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0x08, 0x71, 0x85, 0xf0, 0x28, 0xf5, 0x29, 0x62, 0x28} },
1575{ 0x0b88, 16, {0xe5, 0x28, 0x62, 0x29, 0xe5, 0x29, 0x62, 0x28, 0x29, 0xfd, 0xe5, 0x28, 0x3a, 0xa9, 0x05, 0x75} },
1576{ 0x0b98, 14, {0x2a, 0xff, 0xf5, 0x2b, 0x89, 0x2c, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} },
1577{ 0x0ba6, 1, {0x22} },
1578{ 0x0ba7, 16, {0xab, 0x07, 0xaa, 0x06, 0xac, 0x05, 0xe4, 0xfd, 0xe5, 0x11, 0x60, 0x11, 0xea, 0xff, 0xae, 0x05} },
1579{ 0x0bb7, 16, {0x0d, 0xee, 0x24, 0x10, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xef, 0xf0, 0xeb, 0xae, 0x05} },
1580{ 0x0bc7, 16, {0x0d, 0x74, 0x10, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xeb, 0xf0, 0xaf, 0x05, 0x0d} },
1581{ 0x0bd7, 16, {0x74, 0x10, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xf5, 0x83, 0xec, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f} },
1582{ 0x0be7, 13, {0x7b, 0x10, 0x12, 0x0d, 0x10, 0x7f, 0x0a, 0x7e, 0x00, 0x12, 0x0d, 0x94, 0x22} },
1583{ 0x0bf4, 16, {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xfd, 0xf5, 0x37, 0xe5, 0x11} },
1584{ 0x0c04, 16, {0x60, 0x12, 0xe5, 0x32, 0xff, 0xae, 0x05, 0x0d, 0xee, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x34, 0x0f} },
1585{ 0x0c14, 16, {0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x33, 0xae, 0x05, 0x0d, 0x74, 0x13, 0x2e, 0xf5, 0x82, 0xe4, 0x34} },
1586{ 0x0c24, 16, {0x0f, 0xf5, 0x83, 0xe5, 0x33, 0xf0, 0xaf, 0x0f, 0x7a, 0x0f, 0x7b, 0x13, 0x12, 0x0d, 0x10, 0xaf} },
1587{ 0x0c34, 11, {0x0f, 0xad, 0x34, 0xab, 0x36, 0xaa, 0x35, 0x12, 0x0c, 0xf1, 0x22} },
1588{ 0x0c3f, 16, {0x8e, 0x32, 0x8f, 0x33, 0x8d, 0x34, 0x8a, 0x35, 0x8b, 0x36, 0xe4, 0xf5, 0x37, 0xe5, 0x37, 0xc3} },
1589{ 0x0c4f, 16, {0x95, 0x34, 0x50, 0x20, 0x05, 0x33, 0xe5, 0x33, 0xae, 0x32, 0x70, 0x02, 0x05, 0x32, 0x14, 0xff} },
1590{ 0x0c5f, 16, {0xe5, 0x36, 0x25, 0x37, 0xf5, 0x82, 0xe4, 0x35, 0x35, 0xf5, 0x83, 0xe0, 0xfd, 0x12, 0x0b, 0xa7} },
1591{ 0x0c6f, 5, {0x05, 0x37, 0x80, 0xd9, 0x22} },
1592{ 0x0c74, 16, {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x25, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
1593{ 0x0c84, 16, {0x44, 0x01, 0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a} },
1594{ 0x0c94, 13, {0x0a, 0x89, 0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x03, 0xd3, 0x22, 0xc3, 0x22} },
1595{ 0x0ca1, 16, {0xa9, 0x07, 0xe5, 0x0d, 0x70, 0x23, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x80, 0xf0, 0xe9, 0x25, 0xe0} },
1596{ 0x0cb1, 16, {0x90, 0x7f, 0xa6, 0xf0, 0x8d, 0x08, 0xaf, 0x03, 0xa9, 0x07, 0x75, 0x09, 0x01, 0x8a, 0x0a, 0x89} },
1597{ 0x0cc1, 11, {0x0b, 0xe4, 0xf5, 0x0c, 0x75, 0x0d, 0x01, 0xd3, 0x22, 0xc3, 0x22} },
1598{ 0x0ccc, 16, {0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x30, 0x06, 0x04, 0xe0, 0x44} },
1599{ 0x0cdc, 16, {0x02, 0xf0, 0x7f, 0xd0, 0x7e, 0x07, 0x12, 0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xf7, 0xf0} },
1600{ 0x0cec, 5, {0xe0, 0x44, 0x04, 0xf0, 0x22} },
1601{ 0x0cf1, 16, {0x12, 0x0c, 0x74, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
1602{ 0x0d01, 15, {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
1603{ 0x0d10, 16, {0x12, 0x0c, 0xa1, 0xe5, 0x0d, 0x24, 0xfa, 0x60, 0x10, 0x14, 0x60, 0x07, 0x24, 0x07, 0x70, 0xf3} },
1604{ 0x0d20, 15, {0x7f, 0x08, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x07, 0x22, 0xe4, 0xf5, 0x0d, 0x7f, 0x06, 0x22} },
1605{ 0x0d2f, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} },
1606{ 0x0d3f, 11, {0xab, 0x74, 0x04, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1607{ 0x0d4a, 16, {0x90, 0x7f, 0xd6, 0xe0, 0x30, 0xe7, 0x12, 0xe0, 0x44, 0x01, 0xf0, 0x7f, 0x14, 0x7e, 0x00, 0x12} },
1608{ 0x0d5a, 10, {0x0d, 0x94, 0x90, 0x7f, 0xd6, 0xe0, 0x54, 0xfe, 0xf0, 0x22} },
1609{ 0x0d64, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} },
1610{ 0x0d74, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1611{ 0x0d7c, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x03, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x08} },
1612{ 0x0d8c, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1613{ 0x0d94, 16, {0x8e, 0x38, 0x8f, 0x39, 0xe5, 0x39, 0x15, 0x39, 0xae, 0x38, 0x70, 0x02, 0x15, 0x38, 0x4e, 0x60} },
1614{ 0x0da4, 7, {0x05, 0x12, 0x0e, 0x00, 0x80, 0xee, 0x22} },
1615{ 0x0dab, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0} },
1616{ 0x0dbb, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1617{ 0x0dc1, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0} },
1618{ 0x0dd1, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} },
1619{ 0x0dd7, 16, {0xae, 0x07, 0x7f, 0x21, 0x7d, 0x01, 0x74, 0x00, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x0f, 0xab, 0x82} },
1620{ 0x0de7, 5, {0xfa, 0x12, 0x0d, 0x10, 0x22} },
1621{ 0x0dec, 16, {0x50, 0x0f, 0x00, 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6} },
1622{ 0x0dfc, 3, {0xa1, 0x86, 0x8e} },
1623{ 0x0dff, 1, {0x00} },
1624{ 0x0e00, 16, {0x74, 0x00, 0xf5, 0x86, 0x90, 0xfd, 0xa5, 0x7c, 0x05, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9} },
1625{ 0x0e10, 1, {0x22} },
1626{ 0x0e11, 14, {0x90, 0x7f, 0x00, 0xe5, 0x10, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
1627{ 0x0e1f, 14, {0x90, 0x7f, 0x00, 0xe5, 0x0e, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0xd3, 0x22} },
1628{ 0x0e2d, 8, {0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x0e, 0xd3, 0x22} },
1629{ 0x0e35, 8, {0xe4, 0xf5, 0x0d, 0xd2, 0xe9, 0xd2, 0xaf, 0x22} },
1630{ 0x0e3d, 3, {0xd2, 0x00, 0x22} },
1631{ 0x0e40, 2, {0xd3, 0x22} },
1632{ 0x0e42, 2, {0xd3, 0x22} },
1633{ 0x0e44, 2, {0xd3, 0x22} },
1634{ 0x0e46, 2, {0xd3, 0x22} },
1635{ 0x0e48, 2, {0xd3, 0x22} },
1636{ 0x0e4a, 2, {0xd3, 0x22} },
1637{ 0x0e4c, 1, {0x32} },
1638{ 0x0e4d, 1, {0x32} },
1639{ 0x0e4e, 1, {0x32} },
1640{ 0x0e4f, 1, {0x32} },
1641{ 0x0e50, 1, {0x32} },
1642{ 0x0e51, 1, {0x32} },
1643{ 0x0e52, 1, {0x32} },
1644{ 0x0e53, 1, {0x32} },
1645{ 0x0e54, 1, {0x32} },
1646{ 0x0e55, 1, {0x32} },
1647{ 0x0e56, 1, {0x32} },
1648{ 0x0e57, 1, {0x32} },
1649{ 0x0e58, 1, {0x32} },
1650{ 0x0e59, 1, {0x32} },
1651{ 0x0e5a, 1, {0x32} },
1652{ 0x0e5b, 1, {0x32} },
1653{ 0x1100, 16, {0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x47, 0x05, 0x10, 0x27, 0x01, 0x00, 0x01, 0x02} },
1654{ 0x1110, 16, {0x00, 0x01, 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x03, 0xa0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x02} },
1655{ 0x1120, 16, {0xff, 0x00, 0x00, 0x04, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40} },
1656{ 0x1130, 16, {0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x26, 0x03, 0x41, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x68, 0x00} },
1657{ 0x1140, 16, {0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x73, 0x00} },
1658{ 0x1150, 16, {0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x28, 0x03, 0x46, 0x00} },
1659{ 0x1160, 16, {0x69, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00} },
1660{ 0x1170, 16, {0x46, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00} },
1661{ 0x1180, 16, {0x6b, 0x00, 0x73, 0x00, 0x2a, 0x03, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00} },
1662{ 0x1190, 16, {0x67, 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00} },
1663{ 0x11a0, 16, {0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x22, 0x03} },
1664{ 0x11b0, 16, {0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00} },
1665{ 0x11c0, 16, {0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00} },
1666{ 0x11d0, 2, {0x00, 0x00} },
1667{ 0xffff, 0, {0x00} }
1668};
1669#endif
diff --git a/drivers/usb/serial/xircom_pgs.S b/drivers/usb/serial/xircom_pgs.S
new file mode 100644
index 000000000000..05d99dd63776
--- /dev/null
+++ b/drivers/usb/serial/xircom_pgs.S
@@ -0,0 +1,1192 @@
1/* $Id: loop.s,v 1.23 2000/03/20 09:49:06 warner Exp $
2 *
3 * Firmware for the Keyspan PDA Serial Adapter, a USB serial port based on
4 * the EzUSB microcontroller.
5 *
6 * (C) Copyright 2000 Brian Warner <warner@lothar.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * "Keyspan PDA Serial Adapter" is probably a copyright of Keyspan, the
14 * company.
15 *
16 * This serial adapter is basically an EzUSB chip and an RS-232 line driver
17 * in a little widget that has a DB-9 on one end and a USB plug on the other.
18 * It uses the EzUSB's internal UART0 (using the pins from Port C) and timer2
19 * as a baud-rate generator. The wiring is:
20 * PC0/RxD0 <- rxd (DB9 pin 2) PC4 <- dsr pin 6
21 * PC1/TxD0 -> txd pin 3 PC5 <- ri pin 9
22 * PC2 -> rts pin 7 PC6 <- dcd pin 1
23 * PC3 <- cts pin 8 PC7 -> dtr pin 4
24 * PB1 -> line driver standby
25 *
26 * The EzUSB register constants below come from their excellent documentation
27 * and sample code (which used to be available at www.anchorchips.com, but
28 * that has now been absorbed into Cypress' site and the CD-ROM contents
29 * don't appear to be available online anymore). If we get multiple
30 * EzUSB-based drivers into the kernel, it might be useful to pull them out
31 * into a separate .h file.
32 *
33 * THEORY OF OPERATION:
34 *
35 * There are two 256-byte ring buffers, one for tx, one for rx.
36 *
37 * EP2out is pure tx data. When it appears, the data is copied into the tx
38 * ring and serial transmission is started if it wasn't already running. The
39 * "tx buffer empty" interrupt may kick off another character if the ring
40 * still has data. If the host is tx-blocked because the ring filled up,
41 * it will request a "tx unthrottle" interrupt. If sending a serial character
42 * empties the ring below the desired threshold, we set a bit that will send
43 * up the tx unthrottle message as soon as the rx buffer becomes free.
44 *
45 * EP2in (interrupt) is used to send both rx chars and rx status messages
46 * (only "tx unthrottle" at this time) back up to the host. The first byte
47 * of the rx message indicates data (0) or status msg (1). Status messages
48 * are sent before any data.
49 *
50 * Incoming serial characters are put into the rx ring by the serial
51 * interrupt, and the EP2in buffer sent if it wasn't already in transit.
52 * When the EP2in buffer returns, the interrupt prompts us to send more
53 * rx chars (or status messages) if they are pending.
54 *
55 * Device control happens through "vendor specific" control messages on EP0.
56 * All messages are destined for the "Interface" (with the index always 0,
57 * so that if their two-port device might someday use similar firmware, we
58 * can use index=1 to refer to the second port). The messages defined are:
59 *
60 * bRequest = 0 : set baud/bits/parity
61 * 1 : unused
62 * 2 : reserved for setting HW flow control (CTSRTS)
63 * 3 : get/set "modem info" (pin states: DTR, RTS, DCD, RI, etc)
64 * 4 : set break (on/off)
65 * 5 : reserved for requesting interrupts on pin state change
66 * 6 : query buffer room or chars in tx buffer
67 * 7 : request tx unthrottle interrupt
68 *
69 * The host-side driver is set to recognize the device ID values stashed in
70 * serial EEPROM (0x06cd, 0x0103), program this firmware into place, then
71 * start it running. This firmware will use EzUSB's "renumeration" trick by
72 * simulating a bus disconnect, then reconnect with a different device ID
73 * (encoded in the desc_device descriptor below). The host driver then
74 * recognizes the new device ID and glues it to the real serial driver code.
75 *
76 * USEFUL DOCS:
77 * EzUSB Technical Reference Manual: <http://www.anchorchips.com>
78 * 8051 manuals: everywhere, but try www.dalsemi.com because the EzUSB is
79 * basically the Dallas enhanced 8051 code. Remember that the EzUSB IO ports
80 * use totally different registers!
81 * USB 1.1 spec: www.usb.org
82 *
83 * HOW TO BUILD:
84 * gcc -x assembler-with-cpp -P -E -o keyspan_pda.asm keyspan_pda.s
85 * as31 -l keyspan_pda.asm
86 * mv keyspan_pda.obj keyspan_pda.hex
87 * perl ezusb_convert.pl keyspan_pda < keyspan_pda.hex > keyspan_pda_fw.h
88 * Get as31 from <http://www.pjrc.com/tech/8051/index.html>, and hack on it
89 * a bit to make it build.
90 *
91 * THANKS:
92 * Greg Kroah-Hartman, for coordinating the whole usb-serial thing.
93 * AnchorChips, for making such an incredibly useful little microcontroller.
94 * KeySpan, for making a handy, cheap ($40) widget that was so easy to take
95 * apart and trace with an ohmmeter.
96 *
97 * TODO:
98 * lots. grep for TODO. Interrupt safety needs stress-testing. Better flow
99 * control. Interrupting host upon change in DCD, etc, counting transitions.
100 * Need to find a safe device id to use (the one used by the Keyspan firmware
101 * under Windows would be ideal.. can anyone figure out what it is?). Parity.
102 * More baud rates. Oh, and the string-descriptor-length silicon bug
103 * workaround should be implemented, but I'm lazy, and the consequence is
104 * that the device name strings that show up in your kernel log will have
105 * lots of trailing binary garbage in them (appears as ????). Device strings
106 * should be made more accurate.
107 *
108 * Questions, bugs, patches to Brian.
109 *
110 * -Brian Warner <warner@lothar.com>
111 *
112 */
113
114#define HIGH(x) (((x) & 0xff00) / 256)
115#define LOW(x) ((x) & 0xff)
116
117#define dpl1 0x84
118#define dph1 0x85
119#define dps 0x86
120
121;;; our bit assignments
122#define TX_RUNNING 0
123#define DO_TX_UNTHROTTLE 1
124
125 ;; stack from 0x60 to 0x7f: should really set SP to 0x60-1, not 0x60
126#define STACK #0x60-1
127
128#define EXIF 0x91
129#define EIE 0xe8
130 .flag EUSB, EIE.0
131 .flag ES0, IE.4
132
133#define EP0CS #0x7fb4
134#define EP0STALLbit #0x01
135#define IN0BUF #0x7f00
136#define IN0BC #0x7fb5
137#define OUT0BUF #0x7ec0
138#define OUT0BC #0x7fc5
139#define IN2BUF #0x7e00
140#define IN2BC #0x7fb9
141#define IN2CS #0x7fb8
142#define OUT2BC #0x7fc9
143#define OUT2CS #0x7fc8
144#define OUT2BUF #0x7dc0
145#define IN4BUF #0x7d00
146#define IN4BC #0x7fbd
147#define IN4CS #0x7fbc
148#define OEB #0x7f9d
149#define OUTB #0x7f97
150#define OEC #0x7f9e
151#define OUTC #0x7f98
152#define PINSC #0x7f9b
153#define PORTBCFG #0x7f94
154#define PORTCCFG #0x7f95
155#define OEA #0x7f9c
156#define IN07IRQ #0x7fa9
157#define OUT07IRQ #0x7faa
158#define IN07IEN #0x7fac
159#define OUT07IEN #0x7fad
160#define USBIRQ #0x7fab
161#define USBIEN #0x7fae
162#define USBBAV #0x7faf
163#define USBCS #0x7fd6
164#define SUDPTRH #0x7fd4
165#define SUDPTRL #0x7fd5
166#define SETUPDAT #0x7fe8
167
168 ;; usb interrupt : enable is EIE.0 (0xe8), flag is EXIF.4 (0x91)
169
170 .org 0
171 ljmp start
172 ;; interrupt vectors
173 .org 23H
174 ljmp serial_int
175 .byte 0
176
177 .org 43H
178 ljmp USB_Jump_Table
179 .byte 0 ; filled in by the USB core
180
181;;; local variables. These are not initialized properly: do it by hand.
182 .org 30H
183rx_ring_in: .byte 0
184rx_ring_out: .byte 0
185tx_ring_in: .byte 0
186tx_ring_out: .byte 0
187tx_unthrottle_threshold: .byte 0
188
189 .org 0x100H ; wants to be on a page boundary
190USB_Jump_Table:
191 ljmp ISR_Sudav ; Setup Data Available
192 .byte 0
193 ljmp 0 ; Start of Frame
194 .byte 0
195 ljmp 0 ; Setup Data Loading
196 .byte 0
197 ljmp 0 ; Global Suspend
198 .byte 0
199 ljmp 0 ; USB Reset
200 .byte 0
201 ljmp 0 ; Reserved
202 .byte 0
203 ljmp 0 ; End Point 0 In
204 .byte 0
205 ljmp 0 ; End Point 0 Out
206 .byte 0
207 ljmp 0 ; End Point 1 In
208 .byte 0
209 ljmp 0 ; End Point 1 Out
210 .byte 0
211 ljmp ISR_Ep2in
212 .byte 0
213 ljmp ISR_Ep2out
214 .byte 0
215
216
217 .org 0x200
218
219start: mov SP,STACK-1 ; set stack
220 ;; clear local variables
221 clr a
222 mov tx_ring_in, a
223 mov tx_ring_out, a
224 mov rx_ring_in, a
225 mov rx_ring_out, a
226 mov tx_unthrottle_threshold, a
227 clr TX_RUNNING
228 clr DO_TX_UNTHROTTLE
229
230 ;; clear fifo with "fe"
231 mov r1, 0
232 mov a, #0xfe
233 mov dptr, #tx_ring
234clear_tx_ring_loop:
235 movx @dptr, a
236 inc dptr
237 djnz r1, clear_tx_ring_loop
238
239 mov a, #0xfd
240 mov dptr, #rx_ring
241clear_rx_ring_loop:
242 movx @dptr, a
243 inc dptr
244 djnz r1, clear_rx_ring_loop
245
246;;; turn on the RS-232 driver chip (bring the STANDBY pin low)
247;;; on Xircom the STANDBY is wired to PB6 and PC4
248 mov dptr, PORTBCFG
249 mov a, #0xBf
250 movx @dptr, a
251 mov dptr, PORTCCFG
252 mov a, #0xef
253 movx @dptr, a
254
255 ;; set OEC.4
256 mov a, #0x10
257 mov dptr,OEC
258 movx @dptr,a
259
260 ;; clear PC4
261 mov a, #0x00
262 mov dptr,OUTC
263 movx @dptr,a
264
265 ;; set OEB.6
266 mov a, #0x40
267 mov dptr,OEB
268 movx @dptr,a
269
270 ;; clear PB6
271 mov a, #0x00
272 mov dptr,OUTB
273 movx @dptr,a
274
275 ;; set OEC.[17]
276 mov a, #0x82
277 mov dptr,OEC
278 movx @dptr,a
279
280
281 ;; set PORTCCFG.[01] to route TxD0,RxD0 to serial port
282 mov dptr, PORTCCFG
283 mov a, #0x03
284 movx @dptr, a
285
286 ;; set up interrupts, autovectoring
287 ;; set BKPT
288 mov dptr, USBBAV
289 movx a,@dptr
290 setb acc.0 ; AVEN bit to 0
291 movx @dptr, a
292
293 mov a,#0x01 ; enable SUDAV: setup data available (for ep0)
294 mov dptr, USBIRQ
295 movx @dptr, a ; clear SUDAVI
296 mov dptr, USBIEN
297 movx @dptr, a
298
299 mov dptr, IN07IEN
300 mov a,#0x04 ; enable IN2 int
301 movx @dptr, a
302
303 mov dptr, OUT07IEN
304 mov a,#0x04 ; enable OUT2 int
305 movx @dptr, a
306 mov dptr, OUT2BC
307 movx @dptr, a ; arm OUT2
308
309;; mov a, #0x84 ; turn on RTS, DTR
310;; mov dptr,OUTC
311;; movx @dptr, a
312
313 mov a, #0x7 ; turn on DTR
314 mov dptr,USBBAV
315 movx @dptr, a
316
317 mov a, #0x20 ; turn on the RED led
318 mov dptr,OEA
319 movx @dptr, a
320
321 mov a, #0x80 ; turn on RTS
322 mov dptr,OUTC
323 movx @dptr, a
324
325 ;; setup the serial port. 9600 8N1.
326 mov a,#0x53 ; mode 1, enable rx, clear int
327 mov SCON, a
328 ;; using timer2, in 16-bit baud-rate-generator mode
329 ;; (xtal 12MHz, internal fosc 24MHz)
330 ;; RCAP2H,RCAP2L = 65536 - fosc/(32*baud)
331 ;; 57600: 0xFFF2.F, say 0xFFF3
332 ;; 9600: 0xFFB1.E, say 0xFFB2
333 ;; 300: 0xF63C
334#define BAUD 9600
335#define BAUD_TIMEOUT(rate) (65536 - (24 * 1000 * 1000) / (32 * rate))
336#define BAUD_HIGH(rate) HIGH(BAUD_TIMEOUT(rate))
337#define BAUD_LOW(rate) LOW(BAUD_TIMEOUT(rate))
338
339 mov T2CON, #030h ; rclk=1,tclk=1,cp=0,tr2=0(enable later)
340 mov r3, #5
341 acall set_baud
342 setb TR2
343 mov SCON, #050h
344
345#if 0
346 mov r1, #0x40
347 mov a, #0x41
348send:
349 mov SBUF, a
350 inc a
351 anl a, #0x3F
352 orl a, #0x40
353; xrl a, #0x02
354wait1:
355 jnb TI, wait1
356 clr TI
357 djnz r1, send
358;done: sjmp done
359
360#endif
361
362 setb EUSB
363 setb EA
364 setb ES0
365 ;acall dump_stat
366
367 ;; hey, what say we RENUMERATE! (TRM p.62)
368 mov a, #0
369 mov dps, a
370 mov dptr, USBCS
371 mov a, #0x02 ; DISCON=0, DISCOE=0, RENUM=1
372 movx @dptr, a
373 ;; now presence pin is floating, simulating disconnect. wait 0.5s
374 mov r1, #46
375renum_wait1:
376 mov r2, #0
377renum_wait2:
378 mov r3, #0
379renum_wait3:
380 djnz r3, renum_wait3
381 djnz r2, renum_wait2
382 djnz r1, renum_wait1 ; wait about n*(256^2) 6MHz clocks
383 mov a, #0x06 ; DISCON=0, DISCOE=1, RENUM=1
384 movx @dptr, a
385 ;; we are back online. the host device will now re-query us
386
387
388main: sjmp main
389
390
391
392ISR_Sudav:
393 push dps
394 push dpl
395 push dph
396 push dpl1
397 push dph1
398 push acc
399 mov a,EXIF
400 clr acc.4
401 mov EXIF,a ; clear INT2 first
402 mov dptr, USBIRQ ; clear USB int
403 mov a,#01h
404 movx @dptr,a
405
406 ;; get request type
407 mov dptr, SETUPDAT
408 movx a, @dptr
409 mov r1, a ; r1 = bmRequestType
410 inc dptr
411 movx a, @dptr
412 mov r2, a ; r2 = bRequest
413 inc dptr
414 movx a, @dptr
415 mov r3, a ; r3 = wValueL
416 inc dptr
417 movx a, @dptr
418 mov r4, a ; r4 = wValueH
419
420 ;; main switch on bmRequest.type: standard or vendor
421 mov a, r1
422 anl a, #0x60
423 cjne a, #0x00, setup_bmreq_type_not_standard
424 ;; standard request: now main switch is on bRequest
425 ljmp setup_bmreq_is_standard
426
427setup_bmreq_type_not_standard:
428 ;; a still has bmreq&0x60
429 cjne a, #0x40, setup_bmreq_type_not_vendor
430 ;; Anchor reserves bRequest 0xa0-0xaf, we use small ones
431 ;; switch on bRequest. bmRequest will always be 0x41 or 0xc1
432 cjne r2, #0x00, setup_ctrl_not_00
433 ;; 00 is set baud, wValue[0] has baud rate index
434 lcall set_baud ; index in r3, carry set if error
435 jc setup_bmreq_type_not_standard__do_stall
436 ljmp setup_done_ack
437setup_bmreq_type_not_standard__do_stall:
438 ljmp setup_stall
439setup_ctrl_not_00:
440 cjne r2, #0x01, setup_ctrl_not_01
441 ;; 01 is reserved for set bits (parity). TODO
442 ljmp setup_stall
443setup_ctrl_not_01:
444 cjne r2, #0x02, setup_ctrl_not_02
445 ;; 02 is set HW flow control. TODO
446 ljmp setup_stall
447setup_ctrl_not_02:
448 cjne r2, #0x03, setup_ctrl_not_03
449 ;; 03 is control pins (RTS, DTR).
450 ljmp control_pins ; will jump to setup_done_ack,
451 ; or setup_return_one_byte
452setup_ctrl_not_03:
453 cjne r2, #0x04, setup_ctrl_not_04
454 ;; 04 is send break (really "turn break on/off"). TODO
455 cjne r3, #0x00, setup_ctrl_do_break_on
456 ;; do break off: restore PORTCCFG.1 to reconnect TxD0 to serial port
457 mov dptr, PORTCCFG
458 movx a, @dptr
459 orl a, #0x02
460 movx @dptr, a
461 ljmp setup_done_ack
462setup_ctrl_do_break_on:
463 ;; do break on: clear PORTCCFG.0, set TxD high(?) (b1 low)
464 mov dptr, OUTC
465 movx a, @dptr
466 anl a, #0xfd ; ~0x02
467 movx @dptr, a
468 mov dptr, PORTCCFG
469 movx a, @dptr
470 anl a, #0xfd ; ~0x02
471 movx @dptr, a
472 ljmp setup_done_ack
473setup_ctrl_not_04:
474 cjne r2, #0x05, setup_ctrl_not_05
475 ;; 05 is set desired interrupt bitmap. TODO
476 ljmp setup_stall
477setup_ctrl_not_05:
478 cjne r2, #0x06, setup_ctrl_not_06
479 ;; 06 is query room
480 cjne r3, #0x00, setup_ctrl_06_not_00
481 ;; 06, wValue[0]=0 is query write_room
482 mov a, tx_ring_out
483 setb c
484 subb a, tx_ring_in ; out-1-in = 255 - (in-out)
485 ljmp setup_return_one_byte
486setup_ctrl_06_not_00:
487 cjne r3, #0x01, setup_ctrl_06_not_01
488 ;; 06, wValue[0]=1 is query chars_in_buffer
489 mov a, tx_ring_in
490 clr c
491 subb a, tx_ring_out ; in-out
492 ljmp setup_return_one_byte
493setup_ctrl_06_not_01:
494 ljmp setup_stall
495setup_ctrl_not_06:
496 cjne r2, #0x07, setup_ctrl_not_07
497 ;; 07 is request tx unthrottle interrupt
498 mov tx_unthrottle_threshold, r3; wValue[0] is threshold value
499 ljmp setup_done_ack
500setup_ctrl_not_07:
501 ljmp setup_stall
502
503setup_bmreq_type_not_vendor:
504 ljmp setup_stall
505
506
507setup_bmreq_is_standard:
508 cjne r2, #0x00, setup_breq_not_00
509 ;; 00: Get_Status (sub-switch on bmRequestType: device, ep, int)
510 cjne r1, #0x80, setup_Get_Status_not_device
511 ;; Get_Status(device)
512 ;; are we self-powered? no. can we do remote wakeup? no
513 ;; so return two zero bytes. This is reusable
514setup_return_two_zero_bytes:
515 mov dptr, IN0BUF
516 clr a
517 movx @dptr, a
518 inc dptr
519 movx @dptr, a
520 mov dptr, IN0BC
521 mov a, #2
522 movx @dptr, a
523 ljmp setup_done_ack
524setup_Get_Status_not_device:
525 cjne r1, #0x82, setup_Get_Status_not_endpoint
526 ;; Get_Status(endpoint)
527 ;; must get stall bit for ep[wIndexL], return two bytes, bit in lsb 0
528 ;; for now: cheat. TODO
529 sjmp setup_return_two_zero_bytes
530setup_Get_Status_not_endpoint:
531 cjne r1, #0x81, setup_Get_Status_not_interface
532 ;; Get_Status(interface): return two zeros
533 sjmp setup_return_two_zero_bytes
534setup_Get_Status_not_interface:
535 ljmp setup_stall
536
537setup_breq_not_00:
538 cjne r2, #0x01, setup_breq_not_01
539 ;; 01: Clear_Feature (sub-switch on wValueL: stall, remote wakeup)
540 cjne r3, #0x00, setup_Clear_Feature_not_stall
541 ;; Clear_Feature(stall). should clear a stall bit. TODO
542 ljmp setup_stall
543setup_Clear_Feature_not_stall:
544 cjne r3, #0x01, setup_Clear_Feature_not_rwake
545 ;; Clear_Feature(remote wakeup). ignored.
546 ljmp setup_done_ack
547setup_Clear_Feature_not_rwake:
548 ljmp setup_stall
549
550setup_breq_not_01:
551 cjne r2, #0x03, setup_breq_not_03
552 ;; 03: Set_Feature (sub-switch on wValueL: stall, remote wakeup)
553 cjne r3, #0x00, setup_Set_Feature_not_stall
554 ;; Set_Feature(stall). Should set a stall bit. TODO
555 ljmp setup_stall
556setup_Set_Feature_not_stall:
557 cjne r3, #0x01, setup_Set_Feature_not_rwake
558 ;; Set_Feature(remote wakeup). ignored.
559 ljmp setup_done_ack
560setup_Set_Feature_not_rwake:
561 ljmp setup_stall
562
563setup_breq_not_03:
564 cjne r2, #0x06, setup_breq_not_06
565 ;; 06: Get_Descriptor (s-switch on wValueH: dev, config[n], string[n])
566 cjne r4, #0x01, setup_Get_Descriptor_not_device
567 ;; Get_Descriptor(device)
568 mov dptr, SUDPTRH
569 mov a, #HIGH(desc_device)
570 movx @dptr, a
571 mov dptr, SUDPTRL
572 mov a, #LOW(desc_device)
573 movx @dptr, a
574 ljmp setup_done_ack
575setup_Get_Descriptor_not_device:
576 cjne r4, #0x02, setup_Get_Descriptor_not_config
577 ;; Get_Descriptor(config[n])
578 cjne r3, #0x00, setup_stall; only handle n==0
579 ;; Get_Descriptor(config[0])
580 mov dptr, SUDPTRH
581 mov a, #HIGH(desc_config1)
582 movx @dptr, a
583 mov dptr, SUDPTRL
584 mov a, #LOW(desc_config1)
585 movx @dptr, a
586 ljmp setup_done_ack
587setup_Get_Descriptor_not_config:
588 cjne r4, #0x03, setup_Get_Descriptor_not_string
589 ;; Get_Descriptor(string[wValueL])
590 ;; if (wValueL >= maxstrings) stall
591 mov a, #((desc_strings_end-desc_strings)/2)
592 clr c
593 subb a,r3 ; a=4, r3 = 0..3 . if a<=0 then stall
594 jc setup_stall
595 jz setup_stall
596 mov a, r3
597 add a, r3 ; a = 2*wValueL
598 mov dptr, #desc_strings
599 add a, dpl
600 mov dpl, a
601 mov a, #0
602 addc a, dph
603 mov dph, a ; dph = desc_strings[a]. big endian! (handy)
604 ;; it looks like my adapter uses a revision of the EZUSB that
605 ;; contains "rev D errata number 8", as hinted in the EzUSB example
606 ;; code. I cannot find an actual errata description on the Cypress
607 ;; web site, but from the example code it looks like this bug causes
608 ;; the length of string descriptors to be read incorrectly, possibly
609 ;; sending back more characters than the descriptor has. The workaround
610 ;; is to manually send out all of the data. The consequence of not
611 ;; using the workaround is that the strings gathered by the kernel
612 ;; driver are too long and are filled with trailing garbage (including
613 ;; leftover strings). Writing this out by hand is a nuisance, so for
614 ;; now I will just live with the bug.
615 movx a, @dptr
616 mov r1, a
617 inc dptr
618 movx a, @dptr
619 mov r2, a
620 mov dptr, SUDPTRH
621 mov a, r1
622 movx @dptr, a
623 mov dptr, SUDPTRL
624 mov a, r2
625 movx @dptr, a
626 ;; done
627 ljmp setup_done_ack
628
629setup_Get_Descriptor_not_string:
630 ljmp setup_stall
631
632setup_breq_not_06:
633 cjne r2, #0x08, setup_breq_not_08
634 ;; Get_Configuration. always 1. return one byte.
635 ;; this is reusable
636 mov a, #1
637setup_return_one_byte:
638 mov dptr, IN0BUF
639 movx @dptr, a
640 mov a, #1
641 mov dptr, IN0BC
642 movx @dptr, a
643 ljmp setup_done_ack
644setup_breq_not_08:
645 cjne r2, #0x09, setup_breq_not_09
646 ;; 09: Set_Configuration. ignored.
647 ljmp setup_done_ack
648setup_breq_not_09:
649 cjne r2, #0x0a, setup_breq_not_0a
650 ;; 0a: Get_Interface. get the current altsetting for int[wIndexL]
651 ;; since we only have one interface, ignore wIndexL, return a 0
652 mov a, #0
653 ljmp setup_return_one_byte
654setup_breq_not_0a:
655 cjne r2, #0x0b, setup_breq_not_0b
656 ;; 0b: Set_Interface. set altsetting for interface[wIndexL]. ignored
657 ljmp setup_done_ack
658setup_breq_not_0b:
659 ljmp setup_stall
660
661
662setup_done_ack:
663 ;; now clear HSNAK
664 mov dptr, EP0CS
665 mov a, #0x02
666 movx @dptr, a
667 sjmp setup_done
668setup_stall:
669 ;; unhandled. STALL
670 ;EP0CS |= bmEPSTALL
671 mov dptr, EP0CS
672 movx a, @dptr
673 orl a, EP0STALLbit
674 movx @dptr, a
675 sjmp setup_done
676
677setup_done:
678 pop acc
679 pop dph1
680 pop dpl1
681 pop dph
682 pop dpl
683 pop dps
684 reti
685
686;;; ==============================================================
687
688set_baud: ; baud index in r3
689 ;; verify a < 10
690 mov a, r3
691 jb ACC.7, set_baud__badbaud
692 clr c
693 subb a, #10
694 jnc set_baud__badbaud
695 mov a, r3
696 rl a ; a = index*2
697 add a, #LOW(baud_table)
698 mov dpl, a
699 mov a, #HIGH(baud_table)
700 addc a, #0
701 mov dph, a
702 ;; TODO: shut down xmit/receive
703 ;; TODO: wait for current xmit char to leave
704 ;; TODO: shut down timer to avoid partial-char glitch
705 movx a,@dptr ; BAUD_HIGH
706 mov RCAP2H, a
707 mov TH2, a
708 inc dptr
709 movx a,@dptr ; BAUD_LOW
710 mov RCAP2L, a
711 mov TL2, a
712 ;; TODO: restart xmit/receive
713 ;; TODO: reenable interrupts, resume tx if pending
714 clr c ; c=0: success
715 ret
716set_baud__badbaud:
717 setb c ; c=1: failure
718 ret
719
720;;; ==================================================
721control_pins:
722 cjne r1, #0x41, control_pins_in
723control_pins_out:
724 ;TODO BKPT is DTR
725 mov a, r3 ; wValue[0] holds new bits: b7 is new RTS
726 xrl a, #0xff ; 1 means active, 0V, +12V ?
727 anl a, #0x80
728 mov r3, a
729 mov dptr, OUTC
730 movx a, @dptr ; only change bit 7
731 anl a, #0x7F ; ~0x84
732 orl a, r3
733 movx @dptr, a ; other pins are inputs, bits ignored
734 ljmp setup_done_ack
735control_pins_in:
736 mov dptr, PINSC
737 movx a, @dptr
738 xrl a, #0xff
739 ljmp setup_return_one_byte
740
741;;; ========================================
742
743ISR_Ep2in:
744 push dps
745 push dpl
746 push dph
747 push dpl1
748 push dph1
749 push acc
750 mov a,EXIF
751 clr acc.4
752 mov EXIF,a ; clear INT2 first
753 mov dptr, IN07IRQ ; clear USB int
754 mov a,#04h
755 movx @dptr,a
756
757 mov a, #0x20 ; Turn off the green LED
758 mov dptr,OEA
759 movx @dptr, a
760
761
762 ;; do stuff
763 lcall start_in
764
765 mov a, #0x20 ; Turn off the green LED
766 mov dptr,OEA
767 movx @dptr, a
768
769
770
771 pop acc
772 pop dph1
773 pop dpl1
774 pop dph
775 pop dpl
776 pop dps
777 reti
778
779ISR_Ep2out:
780 push dps
781 push dpl
782 push dph
783 push dpl1
784 push dph1
785 push acc
786
787 mov a, #0x10 ; Turn the green LED
788 mov dptr,OEA
789 movx @dptr, a
790
791
792
793 mov a,EXIF
794 clr acc.4
795 mov EXIF,a ; clear INT2 first
796 mov dptr, OUT07IRQ ; clear USB int
797 mov a,#04h
798 movx @dptr,a
799
800 ;; do stuff
801
802 ;; copy data into buffer. for now, assume we will have enough space
803 mov dptr, OUT2BC ; get byte count
804 movx a,@dptr
805 mov r1, a
806 clr a
807 mov dps, a
808 mov dptr, OUT2BUF ; load DPTR0 with source
809 mov dph1, #HIGH(tx_ring) ; load DPTR1 with target
810 mov dpl1, tx_ring_in
811OUT_loop:
812 movx a,@dptr ; read
813 inc dps ; switch to DPTR1: target
814 inc dpl1 ; target = tx_ring_in+1
815 movx @dptr,a ; store
816 mov a,dpl1
817 cjne a, tx_ring_out, OUT_no_overflow
818 sjmp OUT_overflow
819OUT_no_overflow:
820 inc tx_ring_in ; tx_ring_in++
821 inc dps ; switch to DPTR0: source
822 inc dptr
823 djnz r1, OUT_loop
824 sjmp OUT_done
825OUT_overflow:
826 ;; signal overflow
827 ;; fall through
828OUT_done:
829 ;; ack
830 mov dptr,OUT2BC
831 movx @dptr,a
832
833 ;; start tx
834 acall maybe_start_tx
835 ;acall dump_stat
836
837 mov a, #0x20 ; Turn off the green LED
838 mov dptr,OEA
839 movx @dptr, a
840
841 pop acc
842 pop dph1
843 pop dpl1
844 pop dph
845 pop dpl
846 pop dps
847 reti
848
849dump_stat:
850 ;; fill in EP4in with a debugging message:
851 ;; tx_ring_in, tx_ring_out, rx_ring_in, rx_ring_out
852 ;; tx_active
853 ;; tx_ring[0..15]
854 ;; 0xfc
855 ;; rx_ring[0..15]
856 clr a
857 mov dps, a
858
859 mov dptr, IN4CS
860 movx a, @dptr
861 jb acc.1, dump_stat__done; busy: cannot dump, old one still pending
862 mov dptr, IN4BUF
863
864 mov a, tx_ring_in
865 movx @dptr, a
866 inc dptr
867 mov a, tx_ring_out
868 movx @dptr, a
869 inc dptr
870
871 mov a, rx_ring_in
872 movx @dptr, a
873 inc dptr
874 mov a, rx_ring_out
875 movx @dptr, a
876 inc dptr
877
878 clr a
879 jnb TX_RUNNING, dump_stat__no_tx_running
880 inc a
881dump_stat__no_tx_running:
882 movx @dptr, a
883 inc dptr
884 ;; tx_ring[0..15]
885 inc dps
886 mov dptr, #tx_ring ; DPTR1: source
887 mov r1, #16
888dump_stat__tx_ring_loop:
889 movx a, @dptr
890 inc dptr
891 inc dps
892 movx @dptr, a
893 inc dptr
894 inc dps
895 djnz r1, dump_stat__tx_ring_loop
896 inc dps
897
898 mov a, #0xfc
899 movx @dptr, a
900 inc dptr
901
902 ;; rx_ring[0..15]
903 inc dps
904 mov dptr, #rx_ring ; DPTR1: source
905 mov r1, #16
906dump_stat__rx_ring_loop:
907 movx a, @dptr
908 inc dptr
909 inc dps
910 movx @dptr, a
911 inc dptr
912 inc dps
913 djnz r1, dump_stat__rx_ring_loop
914
915 ;; now send it
916 clr a
917 mov dps, a
918 mov dptr, IN4BC
919 mov a, #38
920 movx @dptr, a
921dump_stat__done:
922 ret
923
924;;; ============================================================
925
926maybe_start_tx:
927 ;; make sure the tx process is running.
928 jb TX_RUNNING, start_tx_done
929start_tx:
930 ;; is there work to be done?
931 mov a, tx_ring_in
932 cjne a,tx_ring_out, start_tx__work
933 ret ; no work
934start_tx__work:
935 ;; tx was not running. send the first character, setup the TI int
936 inc tx_ring_out ; [++tx_ring_out]
937 mov dph, #HIGH(tx_ring)
938 mov dpl, tx_ring_out
939 movx a, @dptr
940 mov sbuf, a
941 setb TX_RUNNING
942start_tx_done:
943 ;; can we unthrottle the host tx process?
944 ;; step 1: do we care?
945 mov a, #0
946 cjne a, tx_unthrottle_threshold, start_tx__maybe_unthrottle_tx
947 ;; nope
948start_tx_really_done:
949 ret
950start_tx__maybe_unthrottle_tx:
951 ;; step 2: is there now room?
952 mov a, tx_ring_out
953 setb c
954 subb a, tx_ring_in
955 ;; a is now write_room. If thresh >= a, we can unthrottle
956 clr c
957 subb a, tx_unthrottle_threshold
958 jc start_tx_really_done ; nope
959 ;; yes, we can unthrottle. remove the threshold and mark a request
960 mov tx_unthrottle_threshold, #0
961 setb DO_TX_UNTHROTTLE
962 ;; prod rx, which will actually send the message when in2 becomes free
963 ljmp start_in
964
965
966serial_int:
967 push dps
968 push dpl
969 push dph
970 push dpl1
971 push dph1
972 push acc
973 jnb TI, serial_int__not_tx
974 ;; tx finished. send another character if we have one
975 clr TI ; clear int
976 clr TX_RUNNING
977 lcall start_tx
978serial_int__not_tx:
979 jnb RI, serial_int__not_rx
980 lcall get_rx_char
981 clr RI ; clear int
982serial_int__not_rx:
983 ;; return
984 pop acc
985 pop dph1
986 pop dpl1
987 pop dph
988 pop dpl
989 pop dps
990 reti
991
992get_rx_char:
993 mov dph, #HIGH(rx_ring)
994 mov dpl, rx_ring_in
995 inc dpl ; target = rx_ring_in+1
996 mov a, sbuf
997 movx @dptr, a
998 ;; check for overflow before incrementing rx_ring_in
999 mov a, dpl
1000 cjne a, rx_ring_out, get_rx_char__no_overflow
1001 ;; signal overflow
1002 ret
1003get_rx_char__no_overflow:
1004 inc rx_ring_in
1005 ;; kick off USB INpipe
1006 acall start_in
1007 ret
1008
1009start_in:
1010 ;; check if the inpipe is already running.
1011 mov a,#0x10
1012 mov dptr, OEA
1013 movx @dptr,a
1014
1015 mov dptr, IN2CS
1016 movx a, @dptr
1017 jb acc.1, start_in__done; int will handle it
1018 jb DO_TX_UNTHROTTLE, start_in__do_tx_unthrottle
1019 ;; see if there is any work to do. a serial interrupt might occur
1020 ;; during this sequence?
1021 mov a, rx_ring_in
1022 cjne a, rx_ring_out, start_in__have_work
1023 ret ; nope
1024start_in__have_work:
1025 ;; now copy as much data as possible into the pipe. 63 bytes max.
1026 clr a
1027 mov dps, a
1028 mov dph, #HIGH(rx_ring) ; load DPTR0 with source
1029 inc dps
1030 mov dptr, IN2BUF ; load DPTR1 with target
1031 movx @dptr, a ; in[0] signals that rest of IN is rx data
1032 inc dptr
1033 inc dps
1034 ;; loop until we run out of data, or we have copied 64 bytes
1035 mov r1, #1 ; INbuf size counter
1036start_in__loop:
1037 mov a, rx_ring_in
1038 cjne a, rx_ring_out, start_inlocal_irq_enablell_copying
1039 sjmp start_in__kick
1040start_inlocal_irq_enablell_copying:
1041 inc rx_ring_out
1042 mov dpl, rx_ring_out
1043 movx a, @dptr
1044 inc dps
1045 movx @dptr, a ; write into IN buffer
1046 inc dptr
1047 inc dps
1048 inc r1
1049 cjne r1, #64, start_in__loop; loop
1050start_in__kick:
1051 ;; either we ran out of data, or we copied 64 bytes. r1 has byte count
1052 ;; kick off IN
1053 mov a, #0x10 ; Turn the green LED
1054 mov dptr,OEA
1055 movx @dptr, a
1056 mov dptr, IN2BC
1057 mov a, r1
1058 jz start_in__done
1059 movx @dptr, a
1060 ;; done
1061start_in__done:
1062 ;acall dump_stat
1063 ret
1064start_in__do_tx_unthrottle:
1065 ;; special sequence: send a tx unthrottle message
1066 clr DO_TX_UNTHROTTLE
1067 clr a
1068 mov dps, a
1069 mov dptr, IN2BUF
1070 mov a, #1
1071 movx @dptr, a
1072 inc dptr
1073 mov a, #2
1074 movx @dptr, a
1075 mov dptr, IN2BC
1076 movx @dptr, a
1077 ret
1078
1079putchar:
1080 clr TI
1081 mov SBUF, a
1082putchar_wait:
1083 jnb TI, putchar_wait
1084 clr TI
1085 ret
1086
1087
1088baud_table: ; baud_high, then baud_low
1089 ;; baud[0]: 110
1090 .byte BAUD_HIGH(110)
1091 .byte BAUD_LOW(110)
1092 ;; baud[1]: 300
1093 .byte BAUD_HIGH(300)
1094 .byte BAUD_LOW(300)
1095 ;; baud[2]: 1200
1096 .byte BAUD_HIGH(1200)
1097 .byte BAUD_LOW(1200)
1098 ;; baud[3]: 2400
1099 .byte BAUD_HIGH(2400)
1100 .byte BAUD_LOW(2400)
1101 ;; baud[4]: 4800
1102 .byte BAUD_HIGH(4800)
1103 .byte BAUD_LOW(4800)
1104 ;; baud[5]: 9600
1105 .byte BAUD_HIGH(9600)
1106 .byte BAUD_LOW(9600)
1107 ;; baud[6]: 19200
1108 .byte BAUD_HIGH(19200)
1109 .byte BAUD_LOW(19200)
1110 ;; baud[7]: 38400
1111 .byte BAUD_HIGH(38400)
1112 .byte BAUD_LOW(38400)
1113 ;; baud[8]: 57600
1114 .byte BAUD_HIGH(57600)
1115 .byte BAUD_LOW(57600)
1116 ;; baud[9]: 115200
1117 .byte BAUD_HIGH(115200)
1118 .byte BAUD_LOW(115200)
1119
1120desc_device:
1121 .byte 0x12, 0x01, 0x00, 0x01, 0xff, 0xff, 0xff, 0x40
1122 .byte 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab, 1, 2, 3, 0x01
1123;;; The "real" device id, which must match the host driver, is that
1124;;; "0xcd 0x06 0x04 0x01" sequence, which is 0x06cd, 0x0104
1125
1126desc_config1:
1127 .byte 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32
1128 .byte 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00
1129 .byte 0x07, 0x05, 0x82, 0x03, 0x40, 0x00, 0x01
1130 .byte 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00
1131
1132desc_strings:
1133 .word string_langids, string_mfg, string_product, string_serial
1134desc_strings_end:
1135
1136string_langids: .byte string_langids_end-string_langids
1137 .byte 3
1138 .word 0
1139string_langids_end:
1140
1141 ;; sigh. These strings are Unicode, meaning UTF16? 2 bytes each. Now
1142 ;; *that* is a pain in the ass to encode. And they are little-endian
1143 ;; too. Use this perl snippet to get the bytecodes:
1144 /* while (<>) {
1145 @c = split(//);
1146 foreach $c (@c) {
1147 printf("0x%02x, 0x00, ", ord($c));
1148 }
1149 }
1150 */
1151
1152string_mfg: .byte string_mfg_end-string_mfg
1153 .byte 3
1154; .byte "ACME usb widgets"
1155 .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x73, 0x00
1156string_mfg_end:
1157
1158string_product: .byte string_product_end-string_product
1159 .byte 3
1160; .byte "ACME USB serial widget"
1161 .byte 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00
1162string_product_end:
1163
1164string_serial: .byte string_serial_end-string_serial
1165 .byte 3
1166; .byte "47"
1167 .byte 0x34, 0x00, 0x37, 0x00
1168string_serial_end:
1169
1170;;; ring buffer memory
1171 ;; tx_ring_in+1 is where the next input byte will go
1172 ;; [tx_ring_out] has been sent
1173 ;; if tx_ring_in == tx_ring_out, theres no work to do
1174 ;; there are (tx_ring_in - tx_ring_out) chars to be written
1175 ;; dont let _in lap _out
1176 ;; cannot inc if tx_ring_in+1 == tx_ring_out
1177 ;; write [tx_ring_in+1] then tx_ring_in++
1178 ;; if (tx_ring_in+1 == tx_ring_out), overflow
1179 ;; else tx_ring_in++
1180 ;; read/send [tx_ring_out+1], then tx_ring_out++
1181
1182 ;; rx_ring_in works the same way
1183
1184 .org 0x1000
1185tx_ring:
1186 .skip 0x100 ; 256 bytes
1187rx_ring:
1188 .skip 0x100 ; 256 bytes
1189
1190
1191 .END
1192
diff --git a/drivers/usb/serial/xircom_pgs_fw.h b/drivers/usb/serial/xircom_pgs_fw.h
new file mode 100644
index 000000000000..3ff74a6d71a9
--- /dev/null
+++ b/drivers/usb/serial/xircom_pgs_fw.h
@@ -0,0 +1,103 @@
1/*
2 * USB Xircom PGS Firmware
3 *
4 * Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com>
5 * Copyright (C) 2001 Cristian M. Craciunescu <cristi@dnt.ro>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * Generated from xircom_pgs.S by ezusb_convert_x.pl
13 */
14
15static const struct ezusb_hex_record xircom_pgs_firmware[] = {
16{ 0x0000, 3, {0x02, 0x02, 0x00} },
17{ 0x0023, 4, {0x02, 0x05, 0x9b, 0x00} },
18{ 0x0030, 5, {0x00, 0x00, 0x00, 0x00, 0x00} },
19{ 0x0043, 4, {0x02, 0x01, 0x00, 0x00} },
20{ 0x0100, 16, {0x02, 0x02, 0xba, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00} },
21{ 0x0110, 16, {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00} },
22{ 0x0120, 16, {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x04, 0x85, 0x00, 0x02, 0x04, 0xb9, 0x00} },
23{ 0x0200, 16, {0x75, 0x81, 0x5e, 0xe4, 0xf5, 0x32, 0xf5, 0x33, 0xf5, 0x30, 0xf5, 0x31, 0xf5, 0x34, 0xc2, 0x00} },
24{ 0x0210, 16, {0xc2, 0x01, 0xa9, 0x00, 0x74, 0xfe, 0x90, 0x10, 0x00, 0xf0, 0xa3, 0xd9, 0xfc, 0x74, 0xfd, 0x90} },
25{ 0x0220, 16, {0x11, 0x00, 0xf0, 0xa3, 0xd9, 0xfc, 0x90, 0x7f, 0x94, 0x74, 0xbf, 0xf0, 0x90, 0x7f, 0x95, 0x74} },
26{ 0x0230, 16, {0xef, 0xf0, 0x74, 0x10, 0x90, 0x7f, 0x9e, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0x98, 0xf0, 0x74, 0x40} },
27{ 0x0240, 16, {0x90, 0x7f, 0x9d, 0xf0, 0x74, 0x00, 0x90, 0x7f, 0x97, 0xf0, 0x74, 0x82, 0x90, 0x7f, 0x9e, 0xf0} },
28{ 0x0250, 16, {0x90, 0x7f, 0x95, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xaf, 0xe0, 0xd2, 0xe0, 0xf0, 0x74, 0x01, 0x90} },
29{ 0x0260, 16, {0x7f, 0xab, 0xf0, 0x90, 0x7f, 0xae, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x04, 0xf0, 0x90, 0x7f, 0xad} },
30{ 0x0270, 16, {0x74, 0x04, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x74, 0x07, 0x90, 0x7f, 0xaf, 0xf0, 0x74, 0x20, 0x90} },
31{ 0x0280, 16, {0x7f, 0x9c, 0xf0, 0x74, 0x80, 0x90, 0x7f, 0x98, 0xf0, 0x74, 0x53, 0xf5, 0x98, 0x75, 0xc8, 0x30} },
32{ 0x0290, 16, {0x7b, 0x05, 0x91, 0x44, 0xd2, 0xca, 0x75, 0x98, 0x50, 0xd2, 0xe8, 0xd2, 0xaf, 0xd2, 0xac, 0x74} },
33{ 0x02a0, 16, {0x00, 0xf5, 0x86, 0x90, 0x7f, 0xd6, 0x74, 0x02, 0xf0, 0x79, 0x2e, 0x7a, 0x00, 0x7b, 0x00, 0xdb} },
34{ 0x02b0, 16, {0xfe, 0xda, 0xfa, 0xd9, 0xf6, 0x74, 0x06, 0xf0, 0x80, 0xfe, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83} },
35{ 0x02c0, 16, {0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xe0, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74} },
36{ 0x02d0, 16, {0x01, 0xf0, 0x90, 0x7f, 0xe8, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xa3, 0xe0, 0xfb, 0xa3, 0xe0, 0xfc} },
37{ 0x02e0, 16, {0xe9, 0x54, 0x60, 0xb4, 0x00, 0x03, 0x02, 0x03, 0x5d, 0xb4, 0x40, 0x6e, 0xba, 0x00, 0x0b, 0x12} },
38{ 0x02f0, 16, {0x04, 0x44, 0x40, 0x03, 0x02, 0x04, 0x26, 0x02, 0x04, 0x2e, 0xba, 0x01, 0x03, 0x02, 0x04, 0x2e} },
39{ 0x0300, 16, {0xba, 0x02, 0x03, 0x02, 0x04, 0x2e, 0xba, 0x03, 0x03, 0x02, 0x04, 0x68, 0xba, 0x04, 0x1e, 0xbb} },
40{ 0x0310, 16, {0x00, 0x0a, 0x90, 0x7f, 0x95, 0xe0, 0x44, 0x02, 0xf0, 0x02, 0x04, 0x26, 0x90, 0x7f, 0x98, 0xe0} },
41{ 0x0320, 16, {0x54, 0xfd, 0xf0, 0x90, 0x7f, 0x95, 0xe0, 0x54, 0xfd, 0xf0, 0x02, 0x04, 0x26, 0xba, 0x05, 0x03} },
42{ 0x0330, 16, {0x02, 0x04, 0x2e, 0xba, 0x06, 0x19, 0xbb, 0x00, 0x08, 0xe5, 0x33, 0xd3, 0x95, 0x32, 0x02, 0x04} },
43{ 0x0340, 16, {0x02, 0xbb, 0x01, 0x08, 0xe5, 0x32, 0xc3, 0x95, 0x33, 0x02, 0x04, 0x02, 0x02, 0x04, 0x2e, 0xba} },
44{ 0x0350, 16, {0x07, 0x05, 0x8b, 0x34, 0x02, 0x04, 0x26, 0x02, 0x04, 0x2e, 0x02, 0x04, 0x2e, 0xba, 0x00, 0x20} },
45{ 0x0360, 16, {0xb9, 0x80, 0x10, 0x90, 0x7f, 0x00, 0xe4, 0xf0, 0xa3, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0} },
46{ 0x0370, 16, {0x02, 0x04, 0x26, 0xb9, 0x82, 0x02, 0x80, 0xeb, 0xb9, 0x81, 0x02, 0x80, 0xe6, 0x02, 0x04, 0x2e} },
47{ 0x0380, 16, {0xba, 0x01, 0x0f, 0xbb, 0x00, 0x03, 0x02, 0x04, 0x2e, 0xbb, 0x01, 0x03, 0x02, 0x04, 0x26, 0x02} },
48{ 0x0390, 16, {0x04, 0x2e, 0xba, 0x03, 0x0f, 0xbb, 0x00, 0x03, 0x02, 0x04, 0x2e, 0xbb, 0x01, 0x03, 0x02, 0x04} },
49{ 0x03a0, 16, {0x26, 0x02, 0x04, 0x2e, 0xba, 0x06, 0x56, 0xbc, 0x01, 0x0f, 0x90, 0x7f, 0xd4, 0x74, 0x06, 0xf0} },
50{ 0x03b0, 16, {0x90, 0x7f, 0xd5, 0x74, 0x5a, 0xf0, 0x02, 0x04, 0x26, 0xbc, 0x02, 0x12, 0xbb, 0x00, 0x6f, 0x90} },
51{ 0x03c0, 16, {0x7f, 0xd4, 0x74, 0x06, 0xf0, 0x90, 0x7f, 0xd5, 0x74, 0x6c, 0xf0, 0x02, 0x04, 0x26, 0xbc, 0x03} },
52{ 0x03d0, 16, {0x29, 0x74, 0x04, 0xc3, 0x9b, 0x40, 0x57, 0x60, 0x55, 0xeb, 0x2b, 0x90, 0x06, 0x8c, 0x25, 0x82} },
53{ 0x03e0, 16, {0xf5, 0x82, 0x74, 0x00, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0x90, 0x7f, 0xd4} },
54{ 0x03f0, 16, {0xe9, 0xf0, 0x90, 0x7f, 0xd5, 0xea, 0xf0, 0x02, 0x04, 0x26, 0x02, 0x04, 0x2e, 0xba, 0x08, 0x0f} },
55{ 0x0400, 16, {0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x04, 0x26, 0xba} },
56{ 0x0410, 16, {0x09, 0x03, 0x02, 0x04, 0x26, 0xba, 0x0a, 0x05, 0x74, 0x00, 0x02, 0x04, 0x02, 0xba, 0x0b, 0x03} },
57{ 0x0420, 16, {0x02, 0x04, 0x26, 0x02, 0x04, 0x2e, 0x90, 0x7f, 0xb4, 0x74, 0x02, 0xf0, 0x80, 0x09, 0x90, 0x7f} },
58{ 0x0430, 16, {0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x00, 0xd0, 0xe0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0} },
59{ 0x0440, 16, {0x82, 0xd0, 0x86, 0x32, 0xeb, 0x20, 0xe7, 0x1e, 0xc3, 0x94, 0x0a, 0x50, 0x19, 0xeb, 0x23, 0x24} },
60{ 0x0450, 16, {0x46, 0xf5, 0x82, 0x74, 0x06, 0x34, 0x00, 0xf5, 0x83, 0xe0, 0xf5, 0xcb, 0xf5, 0xcd, 0xa3, 0xe0} },
61{ 0x0460, 16, {0xf5, 0xca, 0xf5, 0xcc, 0xc3, 0x22, 0xd3, 0x22, 0xb9, 0x41, 0x11, 0xeb, 0x64, 0xff, 0x54, 0x80} },
62{ 0x0470, 16, {0xfb, 0x90, 0x7f, 0x98, 0xe0, 0x54, 0x7f, 0x4b, 0xf0, 0x02, 0x04, 0x26, 0x90, 0x7f, 0x9b, 0xe0} },
63{ 0x0480, 16, {0x64, 0xff, 0x02, 0x04, 0x02, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0} },
64{ 0x0490, 16, {0xe0, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0x74, 0x20, 0x90} },
65{ 0x04a0, 16, {0x7f, 0x9c, 0xf0, 0x12, 0x05, 0xdc, 0x74, 0x20, 0x90, 0x7f, 0x9c, 0xf0, 0xd0, 0xe0, 0xd0, 0x85} },
66{ 0x04b0, 16, {0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0xc0, 0x86, 0xc0, 0x82, 0xc0, 0x83, 0xc0} },
67{ 0x04c0, 16, {0x84, 0xc0, 0x85, 0xc0, 0xe0, 0x74, 0x10, 0x90, 0x7f, 0x9c, 0xf0, 0xe5, 0x91, 0xc2, 0xe4, 0xf5} },
68{ 0x04d0, 16, {0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0x90, 0x7f, 0xc9, 0xe0, 0xf9, 0xe4, 0xf5, 0x86, 0x90} },
69{ 0x04e0, 16, {0x7d, 0xc0, 0x75, 0x85, 0x10, 0x85, 0x32, 0x84, 0xe0, 0x05, 0x86, 0x05, 0x84, 0xf0, 0xe5, 0x84} },
70{ 0x04f0, 16, {0xb5, 0x33, 0x02, 0x80, 0x09, 0x05, 0x32, 0x05, 0x86, 0xa3, 0xd9, 0xec, 0x80, 0x00, 0x90, 0x7f} },
71{ 0x0500, 16, {0xc9, 0xf0, 0xb1, 0x6d, 0x74, 0x20, 0x90, 0x7f, 0x9c, 0xf0, 0xd0, 0xe0, 0xd0, 0x85, 0xd0, 0x84} },
72{ 0x0510, 16, {0xd0, 0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0xe4, 0xf5, 0x86, 0x90, 0x7f, 0xbc, 0xe0, 0x20, 0xe1} },
73{ 0x0520, 16, {0x4b, 0x90, 0x7d, 0x00, 0xe5, 0x32, 0xf0, 0xa3, 0xe5, 0x33, 0xf0, 0xa3, 0xe5, 0x30, 0xf0, 0xa3} },
74{ 0x0530, 16, {0xe5, 0x31, 0xf0, 0xa3, 0xe4, 0x30, 0x00, 0x01, 0x04, 0xf0, 0xa3, 0x05, 0x86, 0x90, 0x10, 0x00} },
75{ 0x0540, 16, {0x79, 0x10, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xd9, 0xf6, 0x05, 0x86, 0x74, 0xfc} },
76{ 0x0550, 16, {0xf0, 0xa3, 0x05, 0x86, 0x90, 0x11, 0x00, 0x79, 0x10, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x05} },
77{ 0x0560, 16, {0x86, 0xd9, 0xf6, 0xe4, 0xf5, 0x86, 0x90, 0x7f, 0xbd, 0x74, 0x26, 0xf0, 0x22, 0x20, 0x00, 0x13} },
78{ 0x0570, 16, {0xe5, 0x32, 0xb5, 0x33, 0x01, 0x22, 0x05, 0x33, 0x75, 0x83, 0x10, 0x85, 0x33, 0x82, 0xe0, 0xf5} },
79{ 0x0580, 16, {0x99, 0xd2, 0x00, 0x74, 0x00, 0xb5, 0x34, 0x01, 0x22, 0xe5, 0x33, 0xd3, 0x95, 0x32, 0xc3, 0x95} },
80{ 0x0590, 16, {0x34, 0x40, 0xf5, 0x75, 0x34, 0x00, 0xd2, 0x01, 0x02, 0x05, 0xdc, 0xc0, 0x86, 0xc0, 0x82, 0xc0} },
81{ 0x05a0, 16, {0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xe0, 0x30, 0x99, 0x07, 0xc2, 0x99, 0xc2, 0x00, 0x12, 0x05} },
82{ 0x05b0, 16, {0x70, 0x30, 0x98, 0x05, 0x12, 0x05, 0xc6, 0xc2, 0x98, 0xd0, 0xe0, 0xd0, 0x85, 0xd0, 0x84, 0xd0} },
83{ 0x05c0, 16, {0x83, 0xd0, 0x82, 0xd0, 0x86, 0x32, 0x75, 0x83, 0x11, 0x85, 0x30, 0x82, 0x05, 0x82, 0xe5, 0x99} },
84{ 0x05d0, 16, {0xf0, 0xe5, 0x82, 0xb5, 0x31, 0x01, 0x22, 0x05, 0x30, 0xb1, 0xdc, 0x22, 0x74, 0x10, 0x90, 0x7f} },
85{ 0x05e0, 16, {0x9c, 0xf0, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0x3e, 0x20, 0x01, 0x3c, 0xe5, 0x30, 0xb5, 0x31} },
86{ 0x05f0, 16, {0x01, 0x22, 0xe4, 0xf5, 0x86, 0x75, 0x83, 0x11, 0x05, 0x86, 0x90, 0x7e, 0x00, 0xf0, 0xa3, 0x05} },
87{ 0x0600, 16, {0x86, 0x79, 0x01, 0xe5, 0x30, 0xb5, 0x31, 0x02, 0x80, 0x10, 0x05, 0x31, 0x85, 0x31, 0x82, 0xe0} },
88{ 0x0610, 16, {0x05, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0x09, 0xb9, 0x40, 0xe9, 0x74, 0x10, 0x90, 0x7f, 0x9c, 0xf0} },
89{ 0x0620, 16, {0x90, 0x7f, 0xb9, 0xe9, 0x60, 0x01, 0xf0, 0x22, 0xc2, 0x01, 0xe4, 0xf5, 0x86, 0x90, 0x7e, 0x00} },
90{ 0x0630, 16, {0x74, 0x01, 0xf0, 0xa3, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0xb9, 0xf0, 0x22, 0xc2, 0x99, 0xf5, 0x99} },
91{ 0x0640, 16, {0x30, 0x99, 0xfd, 0xc2, 0x99, 0x22, 0xe5, 0x5e, 0xf6, 0x3c, 0xfd, 0x8f, 0xfe, 0xc8, 0xff, 0x64} },
92{ 0x0650, 16, {0xff, 0xb2, 0xff, 0xd9, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xfa, 0x12, 0x01, 0x00, 0x01, 0xff, 0xff} },
93{ 0x0660, 16, {0xff, 0x40, 0xcd, 0x06, 0x04, 0x01, 0x89, 0xab, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x20, 0x00} },
94{ 0x0670, 16, {0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00, 0x07, 0x05} },
95{ 0x0680, 16, {0x82, 0x03, 0x40, 0x00, 0x01, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x06, 0x94, 0x06, 0x98} },
96{ 0x0690, 16, {0x06, 0xba, 0x06, 0xe8, 0x04, 0x03, 0x00, 0x00, 0x22, 0x03, 0x41, 0x00, 0x43, 0x00, 0x4d, 0x00} },
97{ 0x06a0, 16, {0x45, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x62, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00} },
98{ 0x06b0, 16, {0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2e, 0x03, 0x41, 0x00, 0x43, 0x00} },
99{ 0x06c0, 16, {0x4d, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x20, 0x00, 0x73, 0x00} },
100{ 0x06d0, 16, {0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00} },
101{ 0x06e0, 14, {0x64, 0x00, 0x67, 0x00, 0x65, 0x00, 0x74, 0x00, 0x06, 0x03, 0x34, 0x00, 0x37, 0x00} },
102{ 0xffff, 0, {0x00} }
103};