summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/msg2138
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
committerYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
commit8e4bff4cab0ddac6060645b0715210484d02ff40 (patch)
tree3a5c3024371a04692a3a6d9974d001cdff8ebf84 /drivers/input/touchscreen/msg2138
Initial file dump from open source releaseHEADmaster
Diffstat (limited to 'drivers/input/touchscreen/msg2138')
-rw-r--r--drivers/input/touchscreen/msg2138/Makefile10
-rw-r--r--drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h2112
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_common.c152
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_common.h359
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c195
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h90
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_main.c993
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_main.h89
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c209
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h47
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c553
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h125
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c3974
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h154
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c2514
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h99
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_sprd.c238
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c405
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h101
19 files changed, 12419 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/msg2138/Makefile b/drivers/input/touchscreen/msg2138/Makefile
new file mode 100644
index 00000000..57176e59
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/Makefile
@@ -0,0 +1,10 @@
+#
+# Makefile for the input core drivers.
+#
+
+# Each configuration option enables a list of files.
+obj-$(CONFIG_TOUCHSCREEN_MSG2138) += msg2138_ts.o
+
+msg2138_ts-objs += mstar_drv_sprd.o mstar_drv_common.o mstar_drv_ic_fw_porting_layer.o mstar_drv_main.o mstar_drv_platform_interface.o mstar_drv_platform_porting_layer.o mstar_drv_self_fw_control.o mstar_drv_utility_adaption.o
+
+# end
diff --git a/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h b/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h
new file mode 100644
index 00000000..085c0a15
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h
@@ -0,0 +1,2112 @@
+0x1C,0x21,0xB0,0x0D,0x21,0x4C,0x0D,0x41,0x48,0x0D,0x61,0x44,0x0D,0x81,0x40,0x80,
+0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC1,0x54,0x00,0x01,0xC9,0x6A,0x7A,0x30,0x0C,
+0xEB,0x02,0x0C,0xE1,0x3C,0xC8,0xEA,0x7A,0x70,0x0C,0xE7,0x02,0x0C,0xE1,0x38,0x0C,
+0xE1,0x3E,0xD0,0xE0,0x1D,0x42,0x0C,0xE1,0x3E,0x54,0xC7,0x10,0x20,0xC0,0xD4,0xC9,
+0x4A,0x7A,0x10,0x0C,0xEA,0x02,0x50,0xE7,0x10,0x0C,0xEA,0x00,0x50,0xE0,0x10,0x0C,
+0xEB,0x00,0x1C,0x80,0xEF,0x0C,0xEA,0x02,0x44,0xE7,0x24,0x0C,0xEA,0x00,0xC0,0xE0,
+0x10,0x01,0xE8,0xC7,0x06,0x89,0x50,0xC6,0x10,0xEC,0xC7,0x06,0x89,0xE4,0x00,0x0F,
+0x65,0xC8,0xA0,0x01,0x00,0x44,0xE7,0x2C,0xD0,0xE0,0x3D,0x3A,0x50,0xA0,0x30,0x98,
+0x80,0x1C,0x61,0x04,0xE4,0x00,0x0F,0x5E,0x98,0x60,0xC0,0xE0,0x10,0x01,0xEC,0xE7,
+0x00,0x86,0x84,0xE8,0xC8,0xEA,0x7A,0x10,0x0C,0xC7,0x02,0xC8,0xC6,0x01,0x00,0x0C,
+0xC7,0x00,0xC8,0xE0,0x01,0x00,0x1E,0xE1,0x34,0x0C,0xEB,0x00,0xC9,0x4A,0x24,0x14,
+0x98,0xE0,0x88,0xD7,0x98,0xA0,0x08,0x8A,0x01,0x4C,0x84,0x3E,0x54,0x84,0x0F,0x18,
+0x86,0x00,0x08,0x8A,0x01,0x9C,0xC1,0x5C,0x84,0x04,0x4C,0x84,0x3E,0x9C,0xE4,0x54,
+0x84,0x0F,0x5C,0xE2,0x09,0x8C,0xA4,0x5C,0xA5,0x00,0x23,0xFF,0x71,0xC0,0xE0,0x10,
+0x01,0xEF,0x47,0x06,0xCE,0x23,0x40,0x3C,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x02,0x54,
+0xE4,0x00,0x00,0x19,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x02,0x40,0xC0,0xE0,0x10,0x01,
+0xEC,0xE7,0x04,0xE6,0xD0,0xE0,0x09,0xBE,0x4C,0x85,0x10,0xC0,0xF4,0x00,0x01,0x1C,
+0xC1,0x04,0xC8,0xE7,0x26,0x80,0x8C,0x87,0xE4,0x00,0x00,0x1D,0x0B,0x07,0x01,0x9C,
+0xE4,0x0F,0x06,0x01,0x9C,0xC2,0xD4,0xE4,0xFF,0xB6,0xC0,0xF4,0x00,0x01,0xC8,0xC7,
+0x24,0x2C,0xC8,0x87,0x26,0x74,0x08,0x66,0x01,0xC8,0xC7,0x26,0x70,0x08,0xC6,0x01,
+0x0B,0xA4,0x01,0x5C,0x63,0x04,0x8F,0xA6,0x4C,0x63,0x09,0x5F,0xBD,0x04,0x9C,0x61,
+0x5C,0x63,0x00,0x23,0xA1,0x84,0xCB,0x07,0x24,0x34,0x9B,0x80,0x88,0xF7,0x98,0x80,
+0x1F,0xC1,0x04,0xE4,0x00,0x00,0x9B,0x0B,0x38,0x01,0x88,0xD7,0x9F,0x21,0x5F,0x39,
+0x04,0x9F,0x3F,0xD7,0x3D,0x00,0x68,0xE4,0x00,0x00,0x61,0x13,0x86,0x00,0x9C,0xC1,
+0xD4,0xC7,0xFF,0xDE,0x4F,0x3C,0x08,0x11,0x07,0x00,0x8F,0x3E,0x98,0xC0,0xE4,0x00,
+0x00,0x23,0x9C,0xC1,0x09,0x39,0x00,0x5C,0xC6,0x00,0x9F,0x22,0x21,0x20,0x2E,0xD5,
+0x06,0xFF,0x9D,0xE4,0x00,0x00,0x2F,0x9C,0x81,0x9F,0x04,0x5C,0x84,0x00,0x9C,0xE1,
+0xD4,0x64,0xFD,0xBD,0x98,0xC0,0xE4,0x00,0x00,0x0D,0x98,0xC1,0x23,0x40,0x82,0xC0,
+0xE0,0x10,0x01,0x20,0xC4,0x46,0xF0,0xC7,0x00,0xFD,0x9C,0xC1,0xF8,0xC7,0x00,0xFD,
+0xE4,0x00,0x00,0x4B,0xF8,0x07,0x00,0xFD,0xE4,0x00,0x00,0x3B,0xC0,0xE0,0x10,0x01,
+0x20,0xC4,0x46,0xF0,0xC7,0x00,0xFC,0x9C,0xC1,0xF8,0xC7,0x00,0xFC,0xE4,0x00,0x00,
+0x11,0xF8,0x07,0x00,0xFC,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x00,0x4B,0x5C,0xE7,0x00,
+0xC0,0xE0,0x14,0x00,0x20,0x00,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x00,0xFD,0xD0,
+0xE4,0x00,0x85,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x00,0xFC,0xD0,0xE4,0x01,0x01,0xC0,
+0xF4,0x00,0x01,0x98,0xBE,0xC8,0xC7,0x78,0xC4,0x0C,0xA6,0x01,0xC8,0xE7,0x78,0xC0,
+0xFC,0xC0,0x55,0xAA,0x0C,0xC7,0x01,0xE4,0x00,0x00,0x01,0xC0,0xE0,0x10,0x01,0xEC,
+0xE7,0x04,0xE2,0xD0,0xE0,0x0C,0x5E,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x04,0xE6,0xD0,
+0xE0,0x0B,0xFE,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDD,0x9C,0xC1,0x5C,0xC6,0x00,
+0xF8,0xC7,0x04,0xDD,0xF0,0xC7,0x04,0xDD,0xD0,0xC4,0x00,0x51,0x98,0xC4,0xF8,0xC7,
+0x04,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDD,0xD0,0xC4,0x0A,0xA5,0xF0,0xC7,
+0x04,0xDD,0xD0,0xC3,0x2B,0x09,0xF3,0x47,0x04,0xDD,0x98,0xE4,0x47,0x5A,0x3E,0x5F,
+0x5A,0x08,0x9F,0x5F,0x4F,0x5A,0xF9,0x10,0xE1,0x36,0x12,0xE1,0x34,0x10,0xC1,0x35,
+0x40,0x80,0xBD,0x43,0x86,0xBC,0x40,0x84,0x35,0xC1,0x60,0x10,0x01,0x5C,0x84,0x00,
+0xC1,0x40,0x10,0x01,0x43,0x24,0x3D,0x41,0x1C,0x3C,0x5F,0x39,0x00,0xFD,0x6B,0x0C,
+0x24,0xFD,0x4A,0x0B,0xE2,0x1F,0x01,0x04,0x98,0xE0,0xC0,0x60,0x10,0x01,0x53,0xC0,
+0x18,0x53,0xA0,0xFF,0xE4,0x00,0x00,0x93,0xD6,0xE6,0x00,0xA5,0x40,0xC6,0xBD,0x5C,
+0xC6,0x00,0xD7,0x87,0x00,0x54,0x5D,0x07,0x15,0x48,0xD9,0x20,0x8C,0xCA,0x5F,0x29,
+0x00,0x10,0xC6,0x00,0x41,0x3B,0x3C,0x5C,0x8C,0x00,0x9C,0xE1,0x11,0x89,0x00,0x09,
+0x38,0x00,0x9F,0x02,0x41,0x29,0xEB,0x41,0x29,0x30,0xF0,0xC3,0x04,0xDD,0x9C,0xDF,
+0x40,0xC6,0xF3,0x8C,0xCC,0x4C,0xC6,0x08,0x8C,0xCB,0x0D,0x26,0x01,0x1D,0x84,0x01,
+0x1D,0x39,0x01,0x5C,0xC7,0x00,0xD4,0xA6,0xFD,0x95,0xD3,0x41,0x05,0x26,0xC0,0xD4,
+0x00,0x01,0x98,0xE0,0xC8,0xC6,0x24,0x14,0x98,0x60,0x08,0xA6,0x01,0xC1,0x54,0x00,
+0x01,0x4C,0xA5,0x3E,0x9C,0xE4,0x54,0xA5,0x0F,0x5C,0xE2,0x09,0x8C,0x65,0x5C,0x63,
+0x00,0x23,0xFF,0xA5,0xC1,0x60,0x10,0x01,0x98,0x82,0xEC,0xAB,0x06,0xCE,0xE4,0x00,
+0x25,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xDD,0xEC,0xEB,0x06,0xCE,0x20,0xE1,
+0x0E,0x98,0x61,0x98,0x81,0x98,0xA0,0xE4,0x00,0xE7,0x52,0xC8,0xEA,0x26,0x18,0xFE,
+0xE0,0x80,0x00,0x08,0xC7,0x01,0x44,0xC6,0xBD,0x5C,0xC6,0x04,0x0C,0xC7,0x01,0xC8,
+0xEA,0x24,0x28,0x08,0xC7,0x01,0x50,0xC6,0x01,0x0C,0xC7,0x01,0xC9,0x4A,0x7A,0x10,
+0xFF,0x00,0xFE,0xFF,0x0C,0xEA,0x02,0x44,0xE7,0xC4,0x0C,0xEA,0x00,0xE4,0x00,0x00,
+0x43,0x20,0xE4,0x76,0x98,0x60,0x98,0x81,0x98,0xA0,0xE4,0x00,0xE6,0xCC,0xC0,0xE0,
+0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0xC6,0x01,0x00,0xEC,0xC7,0x06,0x89,0xC0,0xE0,
+0x10,0x01,0xEC,0xE7,0x00,0x86,0xE4,0x00,0x07,0xFF,0x0C,0xE1,0x3A,0xD0,0xE0,0x22,
+0x12,0x0C,0xE1,0x3A,0x54,0xE7,0x20,0xD0,0xE0,0x21,0xC2,0xC0,0xE0,0x10,0x01,0x98,
+0x60,0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC8,0xEA,0x7A,0x50,0x0C,0xA7,0x02,0x50,0xA5,
+0x20,0xC8,0xCA,0x74,0x68,0x0C,0xA7,0x00,0x10,0xA6,0x00,0x54,0xA5,0x04,0xD0,0xA0,
+0x13,0x8A,0xCA,0xEA,0x74,0x20,0xC0,0xE0,0x10,0x01,0xC9,0x4A,0x74,0xE0,0xC0,0x80,
+0x10,0x01,0x08,0xA6,0x01,0xCB,0x40,0x06,0x00,0x44,0xA5,0xD4,0x20,0xA0,0xBA,0x10,
+0xAA,0x00,0x54,0xA5,0x08,0x20,0xA3,0xB4,0xEF,0x04,0x06,0x9E,0xE8,0xA7,0x06,0x8D,
+0x8C,0xB8,0x13,0x17,0x00,0x1B,0x05,0x00,0xE8,0xA7,0x06,0x8D,0xD0,0xAE,0xFE,0xB5,
+0x9C,0xA1,0xEC,0xA7,0x06,0x8D,0xE7,0xFF,0xFF,0x99,0x98,0xE0,0x80,0x01,0x9C,0xE1,
+0xC0,0xE0,0xF0,0x04,0x23,0xFF,0xE1,0xE4,0x00,0x00,0x5F,0x10,0xA6,0x00,0x54,0xA5,
+0x08,0x20,0xA0,0xE4,0xEF,0x04,0x06,0x9E,0xE8,0xA7,0x06,0x8D,0x8C,0xB8,0x13,0x17,
+0x00,0x1B,0x05,0x00,0xE8,0xA7,0x06,0x8D,0xD0,0xAE,0x01,0x15,0x9C,0xA1,0xEC,0xA7,
+0x06,0x8D,0xE4,0x00,0x00,0x31,0xC0,0xD4,0x00,0x01,0xC0,0xE0,0x10,0x01,0xCA,0xE6,
+0x74,0x20,0xC0,0x80,0x10,0x01,0xC8,0xC6,0x74,0xE0,0x10,0xA6,0x00,0x54,0xA5,0x08,
+0x20,0xA2,0xEE,0xC0,0xE0,0x10,0x01,0xE8,0xA7,0x06,0x8D,0xD0,0xA0,0x16,0xFA,0xC0,
+0xC0,0x10,0x01,0xEC,0xC6,0x06,0x9E,0x10,0x86,0x00,0x1E,0xE4,0xB0,0x5E,0xF7,0x00,
+0xD2,0xE6,0x16,0x55,0x5C,0x8A,0x49,0x20,0x01,0xF9,0xD0,0xA4,0x0C,0xAE,0x10,0xA6,
+0x02,0x10,0xE6,0x01,0x10,0xC6,0x03,0x4C,0xE7,0x40,0x44,0xE7,0x2D,0xC0,0xE2,0x7F,
+0xEE,0x20,0x05,0x2D,0xC0,0xC0,0x14,0x04,0x20,0x00,0x99,0x98,0xA5,0xC0,0x80,0x10,
+0x01,0xFC,0xE4,0x07,0x19,0xF8,0xA4,0x07,0x19,0x18,0xA7,0x03,0x18,0xA7,0x01,0x18,
+0x07,0x02,0x98,0xAA,0x18,0xA7,0x05,0x18,0xA7,0x04,0xE4,0x00,0x00,0x5D,0xC0,0xC0,
+0x14,0x24,0x20,0x00,0x99,0x50,0xA0,0x19,0xC0,0x80,0x10,0x01,0xFC,0xE4,0x07,0x19,
+0xF8,0xA4,0x07,0x19,0x18,0xA7,0x03,0x18,0xA7,0x01,0x50,0xA0,0x32,0x18,0xA7,0x05,
+0x18,0xA7,0x04,0x98,0xA1,0x18,0xA7,0x02,0x04,0xE0,0x80,0x50,0xE7,0x4A,0x18,0xC7,
+0x00,0xE4,0x00,0x01,0xD7,0x5C,0x8A,0x69,0x20,0x04,0x5D,0xD0,0xA3,0x08,0xA6,0x10,
+0xA6,0x02,0x10,0xE6,0x01,0x4C,0xE7,0x40,0x44,0xE7,0x2D,0x5C,0xEE,0x89,0x20,0x00,
+0x29,0x50,0xE0,0x2A,0xE4,0x00,0x00,0x1F,0xC0,0xE2,0x80,0x0A,0xC8,0xC0,0x14,0x00,
+0x48,0xE7,0x30,0xC0,0xA0,0x10,0x01,0x07,0x60,0x80,0x40,0x87,0xDC,0xEC,0x85,0x06,
+0x94,0xC0,0xA0,0x10,0x01,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0x08,0x00,0xC8,0xC7,0x78,
+0xCC,0xEE,0xE5,0x06,0x7D,0xC8,0xA7,0x74,0x68,0xE4,0x00,0x00,0x1F,0x08,0xE6,0x01,
+0x50,0xE7,0x02,0x0C,0xE6,0x01,0x80,0x01,0x12,0xE5,0x00,0xC0,0xF4,0x00,0x01,0x56,
+0xF7,0x20,0x22,0xE3,0xAC,0xCA,0xE7,0x74,0xA8,0xC0,0xA0,0x10,0x01,0xEC,0x05,0x06,
+0x8B,0x12,0xF7,0x00,0xCA,0xE7,0x74,0xC0,0x12,0xF7,0x00,0xC8,0xC7,0x74,0x60,0xCB,
+0x40,0xFD,0xFF,0x0A,0xE6,0x01,0x46,0xF7,0xD4,0xCB,0x27,0x74,0x21,0xCB,0x07,0x74,
+0x68,0x0E,0xE6,0x01,0xCA,0xE7,0x74,0xE0,0xC8,0xE7,0x74,0x20,0xE8,0xC5,0x06,0x8B,
+0xC0,0xC1,0x00,0x00,0x20,0x00,0x41,0x0B,0x58,0x01,0xCB,0x60,0x02,0x00,0x47,0x5A,
+0xDC,0x23,0x40,0xFC,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x74,0x60,0x08,0xA6,0x01,0xC8,
+0xA5,0x02,0x00,0x0C,0xA6,0x01,0xC8,0xC7,0x74,0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7,
+0x00,0x10,0xE6,0x00,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0,0xE0,0x10,0x01,
+0xEC,0x07,0x06,0x90,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8D,0xE4,0x00,0x02,0x9D,
+0x13,0x57,0x00,0x57,0x5A,0x02,0x23,0x42,0xC4,0x43,0x44,0x34,0x13,0x5A,0x00,0x1B,
+0x47,0x00,0x9C,0xC1,0xEC,0xC5,0x06,0x8B,0x18,0x19,0x00,0xE7,0xFF,0xFF,0x23,0xEC,
+0x07,0x06,0x8D,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x90,0xE4,0x00,0x02,0x3F,0x10,
+0xC6,0x00,0x54,0xC6,0x20,0xD0,0xC0,0x08,0xAA,0xC8,0xCA,0x74,0xA0,0x10,0xC6,0x00,
+0xC8,0xCA,0x74,0xA8,0x10,0xC6,0x00,0x0C,0xC7,0x02,0x50,0xC6,0x20,0x0C,0xC7,0x00,
+0xC9,0x4A,0x79,0xE9,0xC0,0xE0,0x10,0x01,0x10,0xCA,0x00,0xF8,0xC7,0x04,0xD4,0x98,
+0xC8,0xF0,0xA7,0x04,0xD4,0x20,0xA0,0x7C,0xF0,0xC7,0x04,0xD4,0x20,0xC4,0x54,0xF0,
+0xC7,0x04,0xD4,0x20,0xC8,0x38,0xF0,0xE7,0x04,0xD4,0xC8,0xC0,0xFF,0xFF,0x20,0xEC,
+0x1A,0x50,0xC0,0x80,0xC0,0xF4,0x00,0x01,0xC8,0xA7,0x74,0xA8,0x10,0xA5,0x00,0xC0,
+0xA0,0x10,0x01,0xE8,0x85,0x06,0x7D,0xD4,0xC4,0x00,0x91,0xC8,0x87,0x74,0x21,0x98,
+0xA0,0xC8,0xE7,0x74,0x20,0xE4,0x00,0x01,0x01,0xCB,0x47,0x74,0x21,0xC0,0xA0,0x10,
+0x01,0xC0,0xC0,0x10,0x01,0xCA,0xE7,0x74,0x68,0xEC,0x05,0x06,0x8B,0xEF,0x26,0x06,
+0x96,0xC3,0x00,0x10,0x01,0xC8,0xE7,0x74,0x20,0xE4,0x00,0x00,0x4D,0xF3,0x78,0x04,
+0xD4,0x23,0x60,0x30,0x13,0x77,0x00,0x57,0x7B,0x10,0x23,0x63,0xE8,0x43,0x79,0x34,
+0x13,0x7B,0x00,0x1B,0x67,0x00,0x9C,0xC1,0xEC,0xC5,0x06,0x8B,0x18,0x1A,0x00,0xE8,
+0xC5,0x06,0x8B,0xD4,0xC4,0xFE,0xD6,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0,
+0xF4,0x00,0x01,0xC8,0xC7,0x74,0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7,0x00,0x10,0xE6,
+0x00,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x7D,0xE4,0x00,0x00,0x45,0x18,0x07,0x00,
+0x18,0x04,0x00,0x9C,0xA1,0xD4,0xC5,0xFF,0xC5,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x74,
+0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7,0x00,0x10,0xE6,0x00,0xC0,0xE0,0x10,0x01,0xE8,
+0xC7,0x06,0xA5,0x50,0xC6,0x02,0xEC,0xC7,0x06,0xA5,0xC0,0xE0,0x10,0x01,0xC8,0x80,
+0xFF,0xFE,0xE8,0xC7,0x06,0xA5,0x44,0xC6,0x24,0xEC,0xC7,0x06,0xA5,0xC0,0xF4,0x00,
+0x01,0xC8,0xE7,0x7A,0x50,0x10,0xC7,0x00,0x54,0xC6,0xDF,0x18,0xC7,0x00,0xC0,0xC0,
+0x10,0x01,0xC0,0xE0,0x10,0x01,0xE8,0xA6,0x06,0x7F,0xEC,0xE7,0x00,0x86,0x50,0xA5,
+0x20,0xEC,0xA6,0x06,0x7F,0xC0,0xC0,0x10,0x01,0xEC,0x66,0x04,0xDA,0x84,0xE8,0xE4,
+0x00,0x00,0x81,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08,
+0x86,0x01,0x44,0x84,0xBD,0x5C,0x84,0x04,0x0C,0x86,0x01,0xC8,0xC7,0x24,0x28,0x08,
+0x86,0x01,0x50,0x84,0x01,0x0C,0x86,0x01,0xC8,0xE7,0x7A,0x10,0xFF,0x00,0xFE,0xFF,
+0x0C,0xC7,0x02,0x9B,0x40,0x44,0xC6,0xC4,0x0C,0xC7,0x00,0xE7,0xFF,0xF4,0xF9,0x0D,
+0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x0D,0x21,0x4E,0x1C,0x21,0x50,0x85,0x29,
+0x2C,0x00,0x0D,0xC3,0xE0,0x00,0x01,0xCB,0xFF,0x03,0x67,0x87,0xE9,0xC2,0xE0,0x10,
+0x01,0x5C,0x60,0x5B,0xF3,0x57,0x0C,0x10,0x1E,0xE3,0x01,0x1F,0x7A,0xFF,0x1F,0x03,
+0xFE,0x5F,0x18,0x00,0x4B,0x18,0x00,0x5F,0x77,0x1D,0x5E,0xFB,0x00,0x1F,0x23,0x02,
+0x5F,0x39,0x00,0x4B,0x39,0xB8,0xCA,0xE0,0x20,0x00,0xE4,0x00,0x00,0x31,0x4F,0x98,
+0x10,0x1F,0xB8,0x01,0x8F,0x84,0x5F,0x1D,0x00,0x0F,0x9C,0x02,0x5E,0xFC,0x15,0x4A,
+0xF7,0xE0,0xD7,0x19,0xFF,0x61,0x53,0x80,0x1E,0x4F,0x03,0x10,0x53,0x20,0x14,0x8F,
+0x04,0x0F,0x18,0x02,0xC3,0x00,0xF9,0xE8,0x4B,0x3C,0xC8,0x4B,0xAC,0x53,0x4B,0x8A,
+0x43,0x20,0x60,0x62,0x0F,0x44,0x06,0x0C,0x84,0x02,0x40,0xE7,0xD3,0xCC,0x84,0x00,
+0x32,0xD4,0x87,0x03,0x60,0xE4,0x00,0x01,0x4D,0x20,0x64,0x62,0x0F,0x44,0x06,0x0C,
+0x84,0x02,0x40,0xE7,0xD3,0xCC,0x84,0x00,0x32,0xD4,0x87,0x01,0x20,0xE4,0x00,0x01,
+0x1D,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x46,0x9F,0x5F,0x41,0x08,0xC3,0x4F,0x5A,0x10,
+0x8C,0x9A,0x0C,0xE4,0x02,0xCC,0xE7,0x00,0x32,0xD4,0xE8,0x03,0x94,0x43,0x39,0x2B,
+0x40,0xB7,0x2D,0x43,0xBD,0x2B,0x8F,0x3D,0xE4,0x00,0x00,0x61,0xD4,0x7B,0x02,0x0E,
+0x4C,0xE7,0x10,0x8C,0xE4,0x0C,0xE7,0x02,0x9F,0x5F,0x41,0x08,0x3B,0x4F,0x5A,0x10,
+0x8C,0x9A,0x0C,0xE4,0x02,0xCC,0xE7,0x00,0x32,0xD4,0xE8,0x02,0x14,0x43,0x39,0x2B,
+0x40,0xB7,0x2D,0x43,0x9C,0x2B,0x8F,0x3C,0xCC,0xC6,0x00,0x0A,0x98,0xEA,0x8C,0xD9,
+0x40,0xC6,0x38,0x5F,0x06,0x15,0x48,0x60,0x0A,0xE4,0x00,0x00,0x49,0x43,0x39,0x2B,
+0xCC,0xC6,0x00,0x0A,0x40,0xB7,0x2D,0x98,0xEA,0xCC,0xA5,0x00,0x0E,0x8C,0xC5,0x8F,
+0x26,0x43,0x39,0x38,0x5F,0x19,0x15,0xE7,0xFF,0xFF,0xBF,0x98,0x60,0x85,0x29,0xC0,
+0xE0,0x10,0x01,0xE8,0xC7,0x05,0x08,0x98,0xE1,0x1C,0xA6,0xFF,0x5C,0xA5,0x04,0x24,
+0xA4,0x57,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x05,0x3C,0x9C,0xDF,0x5C,0xC6,0x06,0x8C,
+0xC7,0x10,0xE6,0x00,0x20,0x61,0xA6,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0xC0,
+0x80,0x10,0x01,0x1C,0xA6,0xFF,0x4F,0x86,0x08,0x4F,0x65,0x08,0xCF,0x46,0x00,0x03,
+0x5F,0x9C,0x00,0x5F,0x7B,0x00,0xFC,0x84,0x0B,0x14,0xCF,0x25,0x00,0x03,0x98,0xC0,
+0xE4,0x00,0x00,0x67,0x0B,0xB7,0x01,0x43,0xA7,0xEB,0x0F,0xB7,0x01,0x9F,0x01,0x8C,
+0xBB,0x4F,0x18,0x08,0x5C,0xA5,0x00,0x8F,0x04,0x0A,0xF8,0x01,0x42,0xE7,0xBB,0x0E,
+0xF8,0x01,0x43,0x05,0x34,0x4E,0xF8,0x08,0x8E,0xE4,0xD7,0x25,0xFE,0xD4,0x8C,0xDC,
+0x5C,0xC6,0x00,0xD7,0x46,0x03,0x98,0x98,0xA0,0xE7,0xFF,0xFF,0xD3,0x20,0x65,0xA6,
+0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0xC0,0x80,0x10,0x01,0x1C,0xA6,0xFF,0x4F,
+0x86,0x08,0x4F,0x65,0x08,0xCF,0x46,0x00,0x03,0x5F,0x9C,0x00,0x5F,0x7B,0x00,0xFC,
+0x84,0x0B,0x14,0xCF,0x25,0x00,0x03,0x98,0xC0,0xE4,0x00,0x00,0x67,0x0B,0xB7,0x00,
+0x43,0xBD,0x38,0x0F,0xB7,0x01,0x9F,0x01,0x8C,0xBB,0x4F,0x18,0x08,0x5C,0xA5,0x00,
+0x8F,0x04,0x0A,0xF8,0x00,0x42,0xF7,0x38,0x0E,0xF8,0x01,0x43,0x05,0x34,0x4E,0xF8,
+0x08,0x8E,0xE4,0xD7,0x25,0xFE,0xD4,0x8C,0xDC,0x5C,0xC6,0x00,0xD7,0x46,0x00,0x50,
+0x98,0xA0,0xE7,0xFF,0xFF,0xD3,0xC0,0xE0,0x10,0x01,0xE8,0xA7,0x0B,0x14,0xFC,0xE7,
+0x0B,0x14,0x08,0x87,0x02,0x8C,0xA4,0xC0,0xC0,0x10,0x01,0xEC,0xA6,0x09,0x4C,0xC0,
+0xA0,0x10,0x01,0xF0,0xA5,0x0C,0x10,0x1F,0x05,0xFF,0x4F,0x18,0x10,0x40,0x98,0x3C,
+0xFC,0xC6,0x09,0x4C,0x4E,0xE5,0x08,0x8F,0x06,0x0B,0x24,0x00,0x1C,0x97,0xFF,0x9E,
+0xE1,0x4F,0x44,0x08,0x4E,0xF7,0x08,0x8F,0x47,0x8E,0xE7,0x0B,0x5A,0x00,0x8F,0x3A,
+0x0F,0x38,0x00,0x4C,0xA5,0x10,0x0B,0x37,0x00,0x43,0x05,0x3C,0x42,0xE5,0x34,0x0B,
+0x18,0x00,0x8F,0x19,0x0F,0x17,0x00,0x4C,0x84,0x10,0x9C,0xBF,0x8C,0xC4,0x4C,0xA5,
+0x08,0x8C,0x87,0x8C,0xE5,0x08,0x84,0x00,0x08,0xE7,0x00,0x8C,0xE4,0x0C,0xE6,0x00,
+0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x80,0x10,0x01,0xF2,0xF7,0x0C,0x10,0xC3,0x40,
+0x10,0x01,0x42,0xE7,0xBB,0xFF,0x9C,0x09,0x4C,0x5E,0xF7,0x00,0xFF,0x5A,0x0B,0x14,
+0x8C,0xD7,0x9B,0x20,0x8E,0xE5,0x5C,0xC6,0x00,0x5E,0xF7,0x00,0x98,0xA0,0x9B,0x00,
+0xE4,0x00,0x00,0x4B,0x4F,0x77,0x10,0x43,0xBB,0xD4,0x0B,0xBD,0x00,0x1F,0xD7,0x01,
+0x8F,0x3D,0x5E,0xFE,0x00,0x8B,0xBB,0x8F,0x7C,0x8F,0xBA,0x0F,0x7B,0x02,0x0B,0xBD,
+0x02,0x8F,0x1B,0x8C,0xBD,0xD6,0xE6,0xFE,0xF9,0x24,0xA0,0xF0,0x27,0x00,0xE4,0x27,
+0x20,0xD8,0x9C,0xE2,0xCF,0x39,0xFF,0xF6,0x4C,0xE7,0x10,0xC0,0xC0,0x10,0x01,0xFC,
+0xC6,0x0C,0x0C,0x8C,0xE6,0x0C,0xE7,0x06,0x0F,0x04,0x00,0x40,0xA5,0x3B,0x9C,0xF6,
+0x8C,0xB9,0x40,0xE5,0x38,0xCC,0xE7,0x07,0xFF,0x43,0x07,0xC0,0x0F,0x03,0x01,0x98,
+0x61,0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0xC0,0xF4,0x00,0x01,0xFC,0x80,0xA5,
+0x5A,0xC8,0xA7,0x30,0x80,0xC8,0xC7,0x30,0x41,0x10,0xC6,0x00,0x0C,0x85,0x01,0x5C,
+0xC6,0x00,0xC8,0xE7,0x30,0x89,0x4C,0xC6,0x21,0x4C,0xA6,0x08,0x54,0xC6,0x08,0x50,
+0xA5,0x40,0x4C,0xC6,0x10,0x44,0xC5,0x35,0x18,0xC7,0x00,0x85,0x29,0x98,0xE3,0x98,
+0xC1,0xE4,0x00,0x00,0x11,0x8C,0xC7,0x9C,0xE2,0xD4,0xC3,0xFF,0xE1,0x4C,0xE7,0x09,
+0x1C,0x67,0xFF,0x5C,0x63,0x06,0x85,0x29,0xFC,0xE0,0x7F,0xFF,0xC0,0xA0,0x10,0x01,
+0xEC,0xE5,0x06,0x21,0xFC,0xC5,0x06,0x20,0x0C,0xE6,0x0B,0x0C,0xE6,0x03,0x0C,0xE6,
+0x05,0x0C,0xE6,0x07,0x0C,0xE6,0x09,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,
+0x01,0xFC,0xA5,0x08,0xD8,0xFC,0xE7,0x06,0x20,0x08,0xC5,0x18,0x08,0x87,0x08,0x08,
+0xA5,0x16,0xC0,0x8F,0xFF,0xE0,0x20,0x00,0x4D,0x08,0x87,0x05,0x0C,0x87,0x09,0x08,
+0x87,0x07,0x0C,0x87,0x0B,0xE4,0x00,0x00,0x15,0x0C,0xC7,0x0B,0x0C,0xA7,0x09,0xC0,
+0x80,0x10,0x01,0xFC,0xE4,0x06,0x20,0x0A,0xE7,0x04,0xC2,0xEF,0xFF,0xE4,0x20,0x00,
+0x35,0x0C,0xC7,0x07,0x0C,0xA7,0x05,0xE4,0x00,0x00,0x23,0xE8,0x84,0x06,0x21,0x0C,
+0x87,0x05,0x08,0x87,0x03,0x0C,0x87,0x07,0xC0,0xE0,0x10,0x01,0xEC,0xA7,0x06,0x21,
+0xFC,0xE7,0x06,0x20,0x0C,0xC7,0x03,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D,
+0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0xC1,0x40,0x10,0x01,0xE8,0xEA,0x06,0x21,
+0xFD,0x4A,0x06,0x20,0x09,0x8A,0x05,0x40,0xE7,0x65,0x09,0x6A,0x07,0x5C,0x67,0x06,
+0x0C,0xE1,0x09,0x08,0xEA,0x03,0x40,0xE7,0x5D,0x5C,0xE7,0x06,0x40,0xC7,0x3B,0x0C,
+0xE1,0x0B,0x40,0x63,0x1B,0x8C,0x66,0xE7,0xFF,0xFE,0x2C,0x08,0xEA,0x0B,0x41,0x6B,
+0x3D,0x08,0xEA,0x09,0x41,0x8C,0x3D,0x5D,0x4C,0x06,0x40,0xEA,0x53,0x0C,0x61,0x00,
+0x5D,0x6B,0x06,0x0D,0x81,0x0D,0x0D,0x61,0x0F,0x40,0x6B,0x5B,0x8C,0x67,0xE7,0xFF,
+0xFD,0xDE,0x0C,0xE1,0x02,0x20,0xE0,0xC0,0x20,0x60,0xB4,0x40,0xC7,0x18,0xD0,0xC5,
+0x01,0x3C,0x40,0x63,0x3B,0x08,0xE1,0x0A,0x41,0x6B,0x3B,0x08,0xE1,0x08,0x41,0x4A,
+0x3B,0x40,0xEB,0x54,0xCC,0xE7,0x00,0x64,0x40,0xE7,0x18,0x5C,0xE8,0xB9,0x48,0x60,
+0x0A,0xE4,0x00,0x00,0x0D,0x98,0x61,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,
+0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61,
+0x14,0x0D,0x81,0x10,0xC1,0x60,0x10,0x01,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0x0D,0x21,
+0x1C,0x0D,0xA1,0x0C,0x89,0xE3,0x99,0x43,0xFD,0x8B,0x08,0xD8,0x89,0xCB,0x4C,0xCF,
+0x55,0x88,0xEA,0x54,0xC6,0x01,0x20,0xC0,0x96,0xE4,0x00,0x00,0x65,0x1D,0xA7,0x01,
+0xCC,0xE7,0x00,0x1C,0xCC,0x8D,0x00,0x1C,0x40,0x67,0x64,0x8C,0x8C,0x9C,0x64,0x9C,
+0x84,0x50,0xA0,0x1C,0xE4,0x00,0x00,0xB8,0x5C,0xED,0x00,0x24,0xEF,0x89,0xF0,0xEE,
+0x08,0xD8,0x20,0xE0,0x24,0x9C,0xFF,0xF8,0xEB,0x08,0xD8,0x21,0x40,0x30,0x9D,0x5F,
+0x5D,0x4A,0x00,0xE7,0xFF,0xFF,0x77,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20,
+0xE0,0x52,0xC0,0xE0,0x10,0x01,0x98,0xB7,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC,
+0xC7,0x07,0x23,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,
+0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x2C,0x00,0x0D,
+0xC3,0xE0,0x00,0x01,0xCB,0xFF,0x09,0x0D,0x87,0xE9,0xC0,0xE0,0x10,0x01,0xE8,0xC7,
+0x05,0x08,0x20,0xC4,0xDE,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0xA7,0x0C,
+0x10,0xFC,0xC6,0x07,0x24,0x9C,0xA1,0x98,0xE0,0xE4,0x00,0x00,0x31,0x4C,0x87,0x08,
+0x1E,0xE7,0xFF,0x1F,0x07,0x01,0x8C,0x86,0x4E,0xF7,0x10,0x5C,0xF8,0x00,0x0E,0xE4,
+0x01,0xD4,0xE5,0xFF,0x60,0xE4,0x00,0x00,0xD1,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0C,
+0x0C,0x20,0xC8,0x58,0x10,0xA7,0x04,0xC0,0xC0,0x10,0x01,0x9C,0xA1,0xFC,0xC6,0x07,
+0x24,0x98,0xE0,0xE4,0x00,0x00,0x8D,0x10,0xA7,0x04,0xC0,0xC0,0x10,0x01,0x9C,0xA1,
+0xFC,0xC6,0x07,0x24,0x98,0xE0,0xE4,0x00,0x00,0x31,0x4C,0x87,0x08,0xCE,0xE7,0x00,
+0x06,0x1F,0x07,0x01,0x8C,0x86,0x9E,0xF9,0x5C,0xF8,0x00,0x0E,0xE4,0x01,0xD4,0xE5,
+0xFF,0x60,0xE4,0x00,0x00,0x37,0x4C,0x87,0x08,0x4E,0xE7,0x08,0x1F,0x07,0x01,0x8C,
+0x86,0x9E,0xFF,0x5C,0xF8,0x00,0x0E,0xE4,0x01,0xD4,0xE5,0xFF,0x68,0x85,0x29,0x40,
+0x84,0x1D,0xC2,0xE0,0x10,0x01,0x9C,0x81,0xF2,0xF7,0x0C,0x10,0x5C,0x84,0x00,0x42,
+0xE5,0xBB,0x5E,0xF7,0x00,0x21,0x04,0x3C,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x0B,0x14,
+0xE4,0x00,0x00,0x19,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x09,0x9C,0x8E,0xE3,0xC3,0x0F,
+0xFF,0xE1,0x4F,0x57,0x10,0xCB,0x18,0xFF,0xFF,0x9F,0x42,0x4E,0xF7,0x10,0x8F,0x45,
+0x8E,0xE5,0x4F,0x84,0x10,0x88,0xA6,0x9B,0x20,0xE4,0x00,0x00,0x5B,0x20,0xE0,0x2A,
+0x0B,0x77,0x00,0xE4,0x00,0x00,0x1F,0x0B,0x7A,0x00,0x20,0xE4,0x20,0x0B,0xB7,0x00,
+0x8F,0x7D,0x0F,0x65,0x00,0x9F,0x24,0x0F,0x65,0x02,0x9E,0xE4,0x5F,0x1B,0x15,0x9F,
+0x44,0x9C,0xA4,0x4B,0x18,0xD8,0xD7,0x3C,0xFE,0xBE,0x98,0xE0,0xE4,0x00,0x00,0x29,
+0x0C,0xA6,0x02,0x9C,0xE1,0x40,0xA5,0xC5,0x5C,0xE7,0x00,0x0C,0xA6,0x00,0x9C,0xC4,
+0xD4,0x87,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C,0x89,
+0x44,0x0D,0x81,0x68,0x0D,0xA1,0x64,0x0D,0x21,0x74,0x89,0xA5,0x89,0x83,0x88,0xA6,
+0x88,0x8D,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0x92,0xC0,0xE0,0x10,0x01,0x41,0xAD,
+0x55,0xE8,0xA7,0x05,0x08,0x9D,0xA1,0xCF,0x2A,0x00,0x06,0x4F,0x0A,0x08,0x5D,0xAD,
+0x00,0x89,0x61,0x9F,0x3F,0x9F,0x01,0x98,0x80,0x98,0xC0,0x98,0xE0,0xE4,0x00,0x00,
+0x4B,0x0E,0xEB,0x02,0x43,0x44,0x54,0x43,0x5A,0xBB,0x20,0xA4,0x30,0x43,0x59,0xBB,
+0x20,0xA8,0x18,0x43,0x58,0xBB,0x8C,0xDA,0x8C,0xF7,0x9C,0x81,0x9F,0x26,0x9F,0x02,
+0x9D,0x64,0x5E,0xE4,0x00,0xD5,0xB7,0xFE,0xE5,0x98,0x60,0x24,0xE1,0x30,0xC0,0x80,
+0x10,0x01,0xE8,0x84,0x0C,0x17,0x40,0xC6,0x23,0x20,0xA4,0x32,0x4C,0xA7,0x0A,0x8C,
+0xC5,0xE4,0x00,0x00,0x3B,0x20,0xA8,0x52,0xCC,0xA7,0x00,0x06,0xCC,0xE7,0x00,0x03,
+0x8C,0xE6,0x40,0xE7,0x28,0xE4,0x00,0x00,0x19,0x8C,0xC7,0x4C,0xE7,0x08,0x40,0xE6,
+0x38,0xC0,0xE0,0xFF,0xE8,0xC8,0xC0,0x07,0xFF,0x98,0x61,0x48,0xE7,0x30,0x5C,0xFF,
+0xF9,0x48,0xE7,0x00,0x0C,0xEC,0x01,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E,
+0x0D,0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x80,0x0D,
+0x41,0x78,0x0D,0x61,0x74,0x0D,0x81,0x70,0x0D,0xA1,0x6C,0x0D,0xC1,0x68,0x0D,0xE1,
+0x64,0x0E,0xC1,0x60,0x0D,0x21,0x7C,0x89,0x84,0x89,0xE3,0xC1,0xA0,0x10,0x01,0x88,
+0x64,0xFD,0xAD,0x0C,0x0C,0x10,0x8D,0x04,0x41,0x46,0x23,0x4C,0x84,0x08,0x9C,0x8E,
+0xC4,0x84,0x03,0xF8,0xFE,0xC1,0x00,0x80,0x89,0x65,0x89,0xC1,0x88,0xA6,0x40,0x21,
+0x25,0x1C,0xD6,0x80,0x88,0x8B,0xE7,0xFF,0xFC,0x92,0x10,0x8D,0x04,0xC0,0xC0,0x10,
+0x01,0x5D,0x4A,0x00,0x4C,0x84,0x08,0xFC,0xC6,0x07,0x24,0x88,0xA1,0x98,0xE0,0xE4,
+0x00,0x00,0x25,0x42,0xE5,0x3C,0x43,0x07,0x34,0x9C,0xE2,0x0B,0x18,0x03,0x0F,0x17,
+0x01,0xD4,0xE4,0xFF,0x96,0x8D,0x8A,0x8D,0x6A,0x5D,0x8C,0x00,0x5D,0x6B,0x00,0x1C,
+0xD6,0x80,0x1C,0x8B,0x01,0x98,0xE0,0x40,0x84,0x65,0x5C,0x84,0x00,0xE4,0x00,0x00,
+0x2D,0x1E,0xE7,0x01,0x0F,0x06,0x02,0x27,0x00,0x4A,0x9C,0xC4,0xD5,0x67,0x03,0x31,
+0x5C,0xF7,0x00,0xD4,0x87,0xFF,0x75,0x88,0xEC,0x1C,0x96,0xE0,0x4C,0xC7,0x10,0x8C,
+0xC4,0x1E,0xF6,0xE0,0x0C,0x86,0xA2,0x1C,0xC7,0x01,0x40,0x84,0x23,0x4C,0xC6,0x10,
+0x8C,0xD7,0x0C,0xC6,0xA2,0x40,0xC6,0x33,0x24,0xC0,0xE8,0x24,0x80,0xDC,0x41,0x4C,
+0x55,0x8C,0xEA,0x4C,0xE7,0x08,0x8C,0xA7,0x0B,0x05,0x00,0xC0,0xA0,0x10,0x01,0xFC,
+0xA5,0x0C,0x0C,0x8C,0x86,0x12,0xE5,0x14,0x08,0xE5,0x0B,0x98,0x61,0x40,0xB8,0x3B,
+0x40,0xE6,0x3B,0x40,0xA5,0xB8,0x40,0xE7,0x20,0x8C,0xE5,0x0C,0xEF,0x01,0xE4,0x00,
+0x00,0x0D,0x98,0x60,0x88,0x2E,0x0E,0xC1,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,
+0xA1,0x6E,0x0D,0x81,0x72,0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,
+0x00,0x80,0x85,0x29,0xC0,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0x1C,0x21,0xC0,0xF0,
+0x87,0x0C,0x0C,0x0D,0x41,0x38,0x0D,0x61,0x34,0x0E,0x01,0x20,0x0E,0x21,0x1C,0x0E,
+0x41,0x18,0x0E,0x61,0x14,0x0E,0x81,0x10,0x0E,0xA1,0x0C,0x0E,0xC1,0x08,0x0D,0x21,
+0x3C,0x0D,0x81,0x30,0x0D,0xA1,0x2C,0x0D,0xC1,0x28,0x0D,0xE1,0x24,0xFE,0xC3,0x0A,
+0x30,0x98,0xA0,0x88,0x76,0xC2,0x40,0x10,0x01,0xE4,0x00,0x7D,0x16,0x99,0x60,0x99,
+0x40,0xFE,0x32,0x08,0xD8,0xC2,0xA0,0x10,0x01,0x9A,0x01,0x1E,0x81,0x06,0x1E,0x61,
+0x04,0xE4,0x00,0x01,0x21,0xCD,0x8A,0x00,0x1C,0xE8,0xF5,0x04,0x89,0x40,0x71,0x64,
+0x54,0xE7,0x02,0x8D,0x91,0x1C,0x63,0x16,0x11,0xEC,0x04,0x11,0xCC,0x05,0x88,0x8F,
+0x88,0xAE,0x11,0xAC,0x07,0x20,0xE1,0x04,0x88,0xCD,0x88,0x74,0x98,0xE2,0x99,0x00,
+0xE7,0xFF,0xFA,0xEC,0x20,0x60,0xFC,0x88,0x8F,0x88,0xAE,0x88,0xCD,0x88,0x73,0x98,
+0xE2,0x99,0x00,0xE7,0xFF,0xFC,0x70,0x20,0x60,0xB0,0x08,0xC1,0x04,0xCC,0xC6,0x00,
+0x03,0x08,0xE1,0x06,0xCC,0xE7,0x00,0x07,0x8C,0xE6,0x98,0xCA,0x40,0xE7,0x30,0x0C,
+0xEC,0x17,0xE4,0x00,0x00,0x35,0x88,0xCD,0x98,0xE2,0x99,0x00,0xE7,0xFF,0xFA,0x74,
+0x20,0x60,0x32,0x4C,0xF0,0x54,0x45,0x6B,0x3D,0x5D,0x6B,0x00,0xC0,0xE0,0x10,0x01,
+0x88,0x76,0xF0,0x87,0x0C,0x0C,0x98,0xA1,0x9D,0x41,0xE4,0x00,0x7B,0xD4,0x5D,0x4A,
+0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFB,0x85,0x88,0x6B,0xE7,0xFF,0xF6,0x3A,0xC0,
+0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x6C,0xC0,0xE0,0x10,0x01,0xE8,0xE7,
+0x04,0x8D,0x54,0xE7,0x40,0x20,0xE0,0x34,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xD2,
+0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0x63,
+0x0A,0x30,0x98,0xA1,0xE4,0x00,0x7B,0x40,0x0D,0x21,0x3E,0x0E,0xC1,0x0A,0x0E,0xA1,
+0x0E,0x0E,0x81,0x12,0x0E,0x61,0x16,0x0E,0x41,0x1A,0x0E,0x21,0x1E,0x0E,0x01,0x22,
+0x0D,0xE1,0x26,0x0D,0xC1,0x2A,0x0D,0xA1,0x2E,0x0D,0x81,0x32,0x0D,0x61,0x36,0x0D,
+0x41,0x3A,0x1C,0x21,0x40,0x85,0x29,0x1C,0x21,0xD0,0x0D,0xC1,0x18,0x0D,0xE1,0x14,
+0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0E,
+0x01,0x10,0x0E,0x21,0x0C,0x89,0xE3,0x89,0xC4,0xE7,0xFF,0xFC,0xF6,0xC0,0xE0,0x10,
+0x01,0xE8,0xE7,0x04,0x8D,0x54,0xE7,0x80,0x20,0xE0,0x56,0xC1,0xA0,0x10,0x01,0x99,
+0x60,0x99,0x40,0xFD,0x8D,0x08,0xD8,0x9A,0x01,0xE4,0x00,0x00,0x81,0xC0,0xE0,0x10,
+0x01,0xEC,0xE7,0x00,0xD6,0x84,0xE8,0xE4,0x00,0x00,0x81,0xCC,0x8A,0x00,0x1C,0x40,
+0xC4,0x64,0x88,0x66,0x88,0x86,0x10,0xE6,0x07,0x10,0xA6,0x04,0x1C,0x63,0x18,0x9C,
+0x8C,0x10,0xC6,0x05,0xE7,0xFF,0xF0,0x3C,0x20,0x60,0x32,0x4C,0xF0,0x54,0x45,0x6B,
+0x3D,0x5D,0x6B,0x00,0x9D,0x41,0x5D,0x4A,0x00,0xF0,0xED,0x08,0xD8,0xD4,0xEA,0xFE,
+0x75,0x88,0x6B,0xE7,0xFF,0xF4,0x4A,0x21,0xE0,0x8C,0x21,0xC0,0x80,0xC1,0x80,0x10,
+0x01,0xC2,0x20,0x10,0x01,0x99,0x60,0xFE,0x31,0x04,0xEA,0xFE,0x0C,0x08,0xD8,0xC1,
+0xE0,0x10,0x01,0x1D,0xC1,0x04,0xE4,0x00,0x00,0xC7,0xC0,0xE0,0x10,0x01,0xC0,0xC0,
+0x10,0x01,0xEB,0x07,0x04,0x89,0xF2,0xE6,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xCE,0xF7,
+0x00,0x1C,0xFC,0xE7,0x08,0xF0,0x57,0x18,0x01,0x8E,0xE7,0xFC,0x80,0x07,0xFF,0xC8,
+0xA0,0x07,0xFF,0xE4,0x00,0x00,0xED,0xCD,0x4B,0x00,0x1C,0x8D,0x50,0x08,0xCA,0x16,
+0x0C,0xC1,0x04,0x08,0xCA,0x18,0xEC,0xEF,0x00,0xDA,0x0C,0xC1,0x00,0x88,0x6E,0x88,
+0x81,0x0C,0xAA,0x0E,0x88,0xD1,0x84,0xE8,0x0C,0xE1,0x06,0x9D,0x61,0x0C,0xEA,0x17,
+0x5D,0x6B,0x00,0x0C,0xE1,0x02,0x0C,0xEA,0x19,0xF0,0xEC,0x08,0xD8,0xD4,0xEB,0xFE,
+0x55,0xE7,0xFF,0xFF,0x33,0x08,0xC7,0x00,0x5C,0xDF,0xF9,0x08,0xC7,0x01,0x48,0xC6,
+0x00,0x5C,0xC6,0x06,0xC0,0xC0,0xFF,0xE8,0x48,0xC6,0x20,0x5C,0xC6,0x06,0x0C,0xC7,
+0x01,0x13,0x27,0xEF,0xCC,0xC6,0x03,0xFF,0x23,0x00,0x38,0x40,0xC6,0x28,0x4F,0x39,
+0x50,0x8C,0xD9,0x0C,0xC7,0x01,0x1C,0xE7,0x1C,0xD4,0xF7,0xFE,0x66,0x0E,0x21,0x0E,
+0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D,
+0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0x1C,0x21,0xE0,
+0x5E,0xE3,0x04,0x0D,0x81,0x14,0x0D,0xA1,0x10,0x0D,0xC1,0x0C,0x0D,0xE1,0x08,0x0D,
+0x41,0x1C,0x0D,0x61,0x18,0x0E,0x01,0x04,0xC3,0x00,0x10,0x01,0x9B,0x41,0xFF,0x18,
+0x0C,0x0C,0xC1,0xA0,0x10,0x01,0x08,0xF8,0x0B,0x13,0x38,0x14,0x41,0xE0,0x3D,0x13,
+0x18,0x04,0x41,0xEF,0xBD,0x40,0xC6,0xC3,0x41,0xD7,0x3D,0x43,0x5A,0x35,0x5D,0xEF,
+0x04,0x5C,0xC6,0x00,0x5D,0xCE,0x04,0x8C,0xA6,0xFD,0xAD,0x07,0x24,0x8C,0xC4,0x5C,
+0xA5,0x00,0xC0,0x80,0x10,0x01,0x5C,0xC6,0x00,0xFC,0x84,0x0B,0x14,0x4D,0x87,0x08,
+0x53,0x60,0x64,0xE4,0x00,0x01,0x79,0x43,0x86,0xD4,0x4F,0x9C,0x08,0x8F,0x8D,0x09,
+0x7C,0x00,0x41,0x6B,0x3B,0x41,0x6B,0xC8,0x5D,0x6B,0x06,0x5F,0xAB,0x04,0x43,0x9D,
+0xBD,0x5F,0x9C,0x06,0x4F,0xDC,0xFA,0x47,0x9E,0xE6,0x43,0x9C,0xF5,0xD4,0xFC,0x04,
+0x6C,0x4F,0xC6,0x10,0x8F,0xC4,0xD5,0x9C,0x03,0xC8,0x4F,0xC6,0x08,0x42,0x1D,0x7C,
+0x1D,0x1E,0x01,0x43,0xAE,0xED,0x5E,0x10,0x06,0x5F,0xBD,0x06,0x42,0x07,0x85,0x43,
+0xA7,0xED,0x4D,0x08,0x08,0x4F,0xC6,0x10,0x8D,0x04,0xCE,0x10,0x00,0x64,0xCF,0xBD,
+0x00,0x64,0x8B,0x88,0x41,0x44,0xF4,0xD5,0x63,0x01,0x30,0x0B,0xAA,0x00,0x43,0x90,
+0x38,0x5F,0x9C,0x04,0x43,0xBC,0xEB,0x43,0xBD,0xD8,0x0F,0xAA,0x01,0x0B,0xA8,0x00,
+0x43,0x9C,0xEB,0x43,0x9C,0xD8,0x0F,0x88,0x01,0xE4,0x00,0x00,0x63,0x09,0x0A,0x00,
+0x43,0xBD,0x38,0x5F,0xBD,0x04,0x41,0x1D,0x43,0x41,0x08,0xD8,0x0D,0x0A,0x01,0x0B,
+0xDC,0x00,0x43,0xBD,0xF3,0x43,0xBD,0xD8,0x0F,0xBC,0x01,0xE4,0x00,0x00,0x1F,0x0C,
+0x1E,0x01,0x4F,0x86,0x10,0x8F,0x84,0x0C,0x1C,0x03,0x9C,0xC1,0x5C,0xC6,0x00,0xD4,
+0xC5,0xFA,0x40,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x0C,0x0D,0x43,0x18,0x3B,0x0E,0x01,
+0x06,0x0D,0xE1,0x0A,0x0D,0xC1,0x0E,0x0D,0xA1,0x12,0x0D,0x81,0x16,0x0D,0x61,0x1A,
+0x0D,0x41,0x1E,0x5C,0x78,0x00,0x1C,0x21,0x20,0xE4,0x00,0xA5,0xB1,0x20,0xE1,0x86,
+0xC2,0xE0,0x10,0x01,0x40,0x63,0x25,0xFE,0xF7,0x04,0xEA,0x21,0x08,0xF6,0x5C,0x63,
+0x06,0x0A,0xF7,0x33,0x4C,0xE3,0xFA,0x4E,0xF7,0x08,0x44,0x67,0x1E,0x40,0xE3,0x3D,
+0xD6,0xE7,0x03,0x10,0xD4,0xA6,0x00,0x90,0xCC,0xC6,0x00,0x03,0x41,0x06,0x40,0x5D,
+0x05,0x15,0xE4,0x00,0x00,0x93,0xD4,0xC5,0x02,0x60,0xCC,0xA5,0x00,0x03,0x41,0x05,
+0x40,0x5D,0x06,0x15,0xE4,0x00,0x00,0x6F,0x5C,0x63,0x06,0x08,0xD7,0x33,0x4C,0xE3,
+0xFA,0x4C,0xC6,0x08,0x44,0x67,0x1E,0x40,0xE3,0x3D,0xE4,0x00,0x00,0x3D,0xC0,0xE0,
+0x10,0x01,0x40,0x83,0x25,0xE8,0xC7,0x05,0x1D,0x5C,0x84,0x06,0x4C,0xC6,0x08,0x4C,
+0xE4,0xFA,0x44,0x87,0x26,0x40,0xE4,0x3D,0x5C,0xC7,0x15,0x48,0x60,0x0A,0xE4,0x00,
+0x00,0x0D,0x98,0x60,0x85,0x29,0xD4,0x83,0x00,0xA0,0x8A,0xE3,0x88,0xA6,0x88,0x64,
+0x98,0xC1,0x88,0x97,0x40,0xE6,0x3D,0x5C,0xE7,0x00,0xC0,0xC0,0x10,0x01,0xF0,0xC6,
+0x05,0x1E,0x42,0xE4,0x33,0xD4,0x77,0x00,0x50,0x98,0x80,0xE4,0x00,0x00,0x47,0x4E,
+0xE4,0x08,0xD6,0xE3,0x00,0xE4,0x1E,0xE6,0xFE,0xCF,0x03,0xFF,0xFE,0x42,0xE3,0xBB,
+0x4C,0xC6,0x08,0x40,0xC6,0x23,0x8C,0xD8,0x40,0x86,0x23,0x40,0x84,0xB8,0x5C,0xE0,
+0x01,0x48,0xC3,0x20,0x48,0x64,0x18,0x40,0xE3,0x34,0x24,0xE1,0x5C,0xC0,0xA0,0x7F,
+0xEC,0x20,0x00,0x49,0xC8,0x80,0x04,0x00,0x40,0x84,0x2D,0xC0,0x80,0x25,0x6C,0xE4,
+0x00,0x00,0x11,0xC0,0xA0,0xA5,0x6C,0x48,0x80,0x0A,0x5C,0x84,0x00,0x20,0x80,0xD0,
+0xCC,0xC6,0x03,0xB0,0xCC,0x83,0x04,0x50,0x8C,0x86,0x50,0xC0,0x50,0x40,0x84,0x38,
+0x5C,0x84,0x06,0xFC,0xE4,0xFC,0x00,0x5C,0xE7,0x06,0x4E,0xE7,0xFA,0x44,0xF7,0x3E,
+0x40,0xE7,0xBD,0x40,0xA7,0x2B,0x40,0xE6,0x3D,0x40,0x87,0x23,0x8C,0xA4,0x40,0xA5,
+0x30,0x5C,0x65,0x06,0xC0,0xF4,0x00,0x01,0x5C,0xA5,0x04,0xC8,0xE7,0x79,0xC0,0x0C,
+0xA7,0x01,0x85,0x29,0xFC,0x21,0xFF,0x50,0xC0,0xE0,0x10,0x01,0xED,0x41,0x00,0xAC,
+0xED,0x61,0x00,0xA8,0xED,0x81,0x00,0xA4,0xED,0xA1,0x00,0xA0,0xED,0xC1,0x00,0x9C,
+0xED,0xE1,0x00,0x98,0xEE,0x01,0x00,0x94,0xFC,0xE7,0x0C,0x0C,0x10,0xC7,0x04,0x1F,
+0x21,0x60,0x11,0xA7,0x01,0x4F,0xA4,0x10,0x41,0xAD,0x33,0x8F,0xB9,0x5D,0xAD,0x00,
+0x98,0xC0,0x8A,0xFD,0x8B,0x19,0xE4,0x00,0x00,0x83,0x0C,0x07,0x00,0x9C,0xE4,0xD4,
+0xF7,0xFF,0xDE,0x9C,0xC1,0x1E,0xE7,0x08,0xD0,0xC4,0x01,0x7E,0x4F,0x03,0x08,0xC3,
+0x40,0x10,0x01,0xC3,0xC0,0x10,0x01,0xFF,0x5A,0x0C,0x24,0xFF,0xDE,0x02,0x8A,0xCD,
+0x05,0x00,0x18,0x9D,0xBE,0x41,0x78,0xD4,0x98,0xE0,0xFD,0x81,0x00,0x80,0x89,0x5A,
+0x43,0x68,0xF4,0xE4,0x00,0x00,0xFF,0x4C,0xE6,0x18,0x8C,0xF8,0xE7,0xFF,0xFF,0x87,
+0x42,0x08,0x34,0x1D,0xE6,0x01,0x8E,0x1E,0x12,0x10,0x00,0xD6,0x17,0x00,0xAE,0x8C,
+0xCE,0x4C,0xC6,0x08,0x8C,0xCA,0x08,0xC6,0x01,0x0C,0xDC,0x01,0xE4,0x00,0x00,0x17,
+0x5C,0xCF,0x00,0xD5,0xA6,0xFE,0xEC,0x9E,0xE1,0x9F,0x82,0x5E,0xF7,0x00,0xD4,0x97,
+0x00,0x51,0x98,0xC2,0xE7,0xFF,0xFF,0xDF,0xCC,0xC7,0x00,0x30,0x8A,0xFB,0x8C,0xCA,
+0x4F,0x87,0x08,0xE4,0x00,0x00,0x45,0x09,0xE6,0x01,0x11,0xD7,0x00,0xFE,0x01,0x00,
+0x90,0x8D,0xDC,0x9E,0xE1,0x4D,0xCE,0x08,0x8D,0xD0,0x09,0xCE,0xF1,0x41,0xCF,0x75,
+0x0D,0xC6,0x01,0x9C,0xC2,0xD4,0xCB,0xFF,0x16,0x9C,0xE1,0x1D,0x66,0x30,0xD0,0xE4,
+0x00,0x9A,0x4F,0x87,0x10,0x9A,0xE0,0x8F,0x8C,0xCD,0xC7,0x00,0x18,0xE7,0xFF,0xFF,
+0x63,0x43,0xC1,0xC4,0xC1,0x00,0x10,0x01,0xC1,0xE0,0x10,0x01,0xFD,0x08,0x0C,0xB4,
+0x8A,0xE1,0xFD,0xEF,0x0C,0x24,0x98,0xE0,0x41,0xC8,0xC4,0x89,0xBE,0x5C,0xC7,0x00,
+0x20,0xCC,0x3C,0xCF,0x07,0x00,0x30,0x88,0xD7,0x8F,0x0F,0xE4,0x00,0x00,0x6B,0x88,
+0xC8,0x8B,0x97,0xE4,0x00,0x00,0x2B,0x09,0x46,0x01,0xEB,0x06,0xFF,0x71,0x9C,0xC2,
+0x43,0x0A,0xC5,0x0F,0x1C,0x01,0x9F,0x82,0xD4,0xCE,0xFF,0x7E,0xE4,0x00,0x00,0x31,
+0x09,0x58,0x01,0x0B,0x98,0x31,0x9F,0x02,0x43,0x8A,0xE5,0x0F,0x86,0x01,0x9C,0xC2,
+0xD4,0xDE,0xFF,0x86,0x88,0xD7,0x8B,0x9B,0x4F,0x07,0x08,0xE4,0x00,0x00,0x55,0xFD,
+0x61,0x00,0x90,0x09,0x86,0x00,0x11,0x5C,0x00,0x9C,0xC2,0x8D,0x58,0x9F,0x81,0x4D,
+0x4A,0x10,0x8D,0x4B,0x4D,0x6C,0xFA,0x0E,0x0A,0xD2,0x45,0x8B,0x66,0x41,0x6C,0x5D,
+0x8D,0x70,0x0D,0x6A,0xD0,0xD4,0xCD,0xFE,0xD6,0x9C,0xE1,0xD0,0xE4,0xFC,0x16,0x1C,
+0xE1,0x60,0x9A,0xE0,0xE4,0x00,0x00,0x17,0x0C,0xC7,0x02,0x9C,0xE4,0x8E,0xE6,0xD4,
+0xFD,0xFF,0xCE,0x9C,0x82,0x9B,0x80,0x4C,0x84,0x10,0x98,0xE0,0x8C,0x99,0x98,0xC1,
+0x1F,0xA1,0x60,0xE4,0x00,0x00,0x45,0x0F,0xD8,0x02,0x9F,0x04,0x8F,0x3E,0xD7,0x04,
+0xFF,0xCE,0xD6,0xF9,0x00,0x41,0x8A,0xF9,0x88,0xE6,0x9C,0xC1,0x9C,0x88,0x5C,0xC6,
+0x00,0xD0,0xC4,0x00,0x8A,0x9F,0x81,0x9B,0x20,0x4F,0x1C,0x18,0x8F,0x1D,0xE7,0xFF,
+0xFF,0xC1,0x9A,0xE0,0x98,0xC0,0x24,0xEC,0x77,0xC0,0xC0,0x10,0x01,0xC0,0x80,0x10,
+0x01,0xFC,0xC6,0x05,0x48,0xFC,0x84,0x05,0x4C,0x8C,0xC7,0x8C,0xE4,0x10,0xC6,0x00,
+0x12,0xE7,0x00,0x8B,0x1B,0x4F,0x77,0x08,0xCE,0xF7,0x00,0x30,0xCC,0xE6,0x00,0x30,
+0xCC,0xA5,0x00,0x30,0x4F,0x86,0x08,0xC0,0x80,0x10,0x01,0xCC,0xC6,0x00,0x18,0xFC,
+0x84,0x0C,0x24,0x8C,0x66,0x8C,0xE4,0x4C,0x63,0x08,0x8C,0x97,0x8F,0x43,0xC2,0xE0,
+0x10,0x01,0x9B,0x22,0xFE,0xF7,0x08,0x78,0x8C,0xB7,0xE4,0x00,0x00,0x8D,0x08,0xC7,
+0x01,0x12,0xF8,0x00,0xFE,0x01,0x00,0x90,0x43,0xBC,0xBC,0x4F,0xBD,0x08,0x8F,0xB0,
+0x0B,0xBD,0xF1,0x8C,0xDD,0x0C,0xC7,0x01,0x08,0xC4,0x01,0x8E,0xFB,0x9F,0x01,0x4E,
+0xF7,0x08,0x8E,0xF0,0x0A,0xF7,0xF1,0x8E,0xE6,0x5E,0xF7,0x06,0x0E,0xE4,0x01,0x9C,
+0x82,0x08,0xC7,0x00,0x9C,0xE2,0x8E,0xE6,0x42,0xF7,0xC8,0x0E,0xE5,0x01,0x9C,0xA2,
+0xD4,0xFA,0xFD,0xF6,0xEE,0x01,0x00,0x96,0xED,0xE1,0x00,0x9A,0xED,0xC1,0x00,0x9E,
+0xED,0xA1,0x00,0xA2,0xED,0x81,0x00,0xA6,0xED,0x61,0x00,0xAA,0xED,0x41,0x00,0xAE,
+0xFC,0x21,0x00,0xB0,0x85,0x29,0x08,0xE5,0x02,0xD4,0x67,0x00,0x64,0xD4,0x87,0x00,
+0xB4,0xE4,0x00,0x00,0x5D,0xD4,0x83,0x00,0x74,0x50,0x80,0x64,0x40,0x63,0x20,0xE4,
+0x00,0x00,0x15,0x50,0x60,0x64,0x40,0x64,0x18,0x08,0x85,0x05,0xC0,0xE0,0x10,0x01,
+0x40,0x63,0x23,0xFC,0x63,0x00,0xEA,0xEC,0x67,0x05,0x1D,0xE4,0x00,0x00,0x1F,0x50,
+0xC0,0xEA,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x05,0x1D,0x85,0x29,0xC0,0xE0,0x10,0x01,
+0x9C,0x30,0xFC,0x87,0x08,0xD8,0x0D,0x41,0x0C,0xF1,0x47,0x08,0xD8,0xC0,0xE0,0x10,
+0x01,0xC0,0xA0,0x10,0x01,0xF1,0x07,0x0C,0x10,0x0D,0x61,0x08,0x0D,0x81,0x04,0x9D,
+0x5F,0xFC,0xA5,0x09,0x4C,0x98,0xC0,0x98,0xE0,0x9B,0xC1,0xE4,0x00,0x00,0xDD,0x1F,
+0x27,0x01,0xCC,0xE7,0x00,0x1C,0x43,0x07,0x24,0xCF,0x99,0x00,0x1C,0x13,0x78,0x06,
+0x8A,0xF9,0x5C,0xF9,0x00,0x13,0xB8,0x07,0x8F,0x84,0x43,0x08,0xEB,0x09,0x63,0x00,
+0x5F,0x18,0x00,0x11,0x9C,0x07,0x43,0x38,0xDC,0x4F,0x59,0x10,0x8F,0x45,0x0F,0x5A,
+0x02,0xD5,0x9D,0x01,0xC6,0x9F,0x62,0x13,0x9C,0x06,0xD7,0x7C,0x01,0x7E,0x8F,0x1B,
+0x4F,0x18,0x10,0x8F,0x05,0x0F,0x18,0x02,0xD7,0x1A,0x01,0x0C,0x9F,0x21,0x43,0x5A,
+0x58,0x4F,0x39,0x10,0x8F,0x25,0x0F,0x39,0x02,0x43,0x18,0xCD,0xD7,0x58,0x00,0x68,
+0x4E,0xFE,0xBC,0x44,0xC6,0xBD,0x5C,0xC6,0x00,0xD5,0x47,0xFC,0xB4,0x0D,0x81,0x06,
+0x0D,0x61,0x0A,0x0D,0x41,0x0E,0x88,0x66,0x1C,0x21,0x10,0xE7,0xFF,0xE5,0xDB,0xFC,
+0x21,0xFF,0x68,0xED,0x81,0x00,0x88,0xED,0xA1,0x00,0x84,0x0E,0xC1,0x60,0xED,0x21,
+0x00,0x94,0xED,0x41,0x00,0x90,0xED,0x61,0x00,0x8C,0xED,0xC1,0x00,0x80,0x0D,0xE1,
+0x7C,0x0E,0x01,0x78,0x0E,0x21,0x74,0x0E,0x41,0x70,0x0E,0x61,0x6C,0x0E,0x81,0x68,
+0x0E,0xA1,0x64,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x7A,0x10,0x08,0xA6,0x01,0xC4,0xA5,
+0xFE,0xFF,0x0C,0xA6,0x01,0x50,0xC0,0x31,0xC8,0xA7,0x24,0x34,0x0C,0xC5,0x01,0xC8,
+0xA7,0x24,0x38,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x3C,0x0C,0xC5,0x01,0xC8,0xA7,0x24,
+0x40,0x0C,0xC5,0x01,0xC8,0x87,0x24,0x14,0xFC,0xC0,0x03,0x03,0xC8,0xA7,0x26,0x24,
+0xC8,0xE7,0x26,0x28,0x0C,0xC5,0x01,0xFE,0xC1,0x00,0x98,0xC0,0xA0,0x10,0x01,0x0C,
+0x36,0x8C,0xF0,0xA5,0x0C,0x0C,0x89,0x83,0x0C,0xC7,0x01,0x9C,0xAE,0x1C,0xD6,0xC4,
+0xC4,0xA5,0x01,0xF8,0x98,0xE0,0x40,0x21,0x2D,0x99,0xA0,0x8B,0x21,0x08,0xA4,0x01,
+0x4C,0xA5,0x3E,0x54,0xA5,0x0F,0x18,0xA6,0x00,0x8D,0xA5,0x9C,0xE4,0x5D,0xAD,0x00,
+0x9C,0xC1,0x5C,0xE2,0x09,0x23,0xFF,0xA1,0x10,0xF6,0xC5,0x11,0x76,0xC4,0x10,0xD6,
+0xC6,0x42,0x27,0x5C,0x9B,0x0C,0x42,0x11,0x34,0x43,0x18,0x5D,0x13,0x76,0xC7,0x52,
+0xE0,0x18,0x41,0xE0,0x5D,0x42,0xF7,0x3D,0x41,0xEF,0x3D,0x42,0xF7,0x5D,0x5D,0xEF,
+0x00,0x5F,0x18,0x00,0x1C,0x8F,0x24,0x8F,0x70,0x40,0x84,0x35,0x5E,0xF7,0x00,0x88,
+0xB9,0x5C,0x84,0x00,0x98,0xE0,0x9B,0x5F,0x8B,0x99,0xE4,0x00,0x00,0x75,0xD5,0x79,
+0x01,0x05,0xD6,0x27,0x00,0x58,0x1B,0x05,0x00,0xE4,0x00,0x00,0x31,0xD6,0x07,0x00,
+0x58,0x1A,0xE5,0x00,0xE4,0x00,0x00,0x1B,0x5F,0x67,0x15,0x4B,0x3A,0x20,0x1B,0x25,
+0x00,0x9F,0x01,0x9E,0xE1,0x9C,0x81,0x9C,0xE1,0x9C,0xA1,0x5F,0x18,0x00,0x5E,0xF7,
+0x00,0x5C,0x84,0x00,0x5F,0x27,0x00,0xD5,0xB9,0xFE,0x3D,0xC2,0x54,0x00,0x01,0x40,
+0xCF,0x35,0xCA,0xB2,0x24,0x10,0xCC,0xAC,0x00,0x30,0xC0,0xE0,0x10,0x01,0x1C,0x96,
+0xC4,0xFC,0xE7,0x08,0x78,0x8B,0x3C,0x5C,0xC6,0x00,0x8C,0xE5,0x99,0x40,0xEC,0x96,
+0xFF,0x74,0x1E,0x96,0x95,0x1E,0x76,0xC5,0xCA,0x52,0x22,0x00,0xE4,0x00,0x03,0x2F,
+0x18,0x85,0x00,0xEE,0xF6,0xFF,0x76,0x9C,0xA1,0xD4,0xB7,0xFF,0xBE,0x50,0xA0,0x5A,
+0x5D,0x40,0x01,0x50,0x80,0x42,0x48,0x84,0x28,0x88,0xB4,0x12,0xE5,0xFF,0x13,0x05,
+0x00,0x4F,0x18,0x40,0x47,0x18,0xBD,0x4E,0xE4,0x10,0x8E,0xF2,0x0F,0x17,0x01,0x9C,
+0x81,0x9C,0xA2,0x5C,0x84,0x04,0xD4,0xB3,0xFF,0x2E,0x98,0xAC,0x21,0x40,0x14,0x98,
+0xAE,0x0C,0xB5,0x01,0x99,0xC0,0x53,0x00,0x3F,0x52,0xE0,0x42,0x50,0xA0,0x5A,0x8B,
+0xB9,0x98,0x60,0x88,0x8C,0x0C,0xB6,0x80,0xEC,0xD6,0xFF,0x6C,0xEC,0xF6,0xFF,0x78,
+0x0E,0xF6,0x84,0x0F,0x16,0x88,0xEF,0xB6,0xFF,0x7C,0xE4,0x00,0x47,0x00,0xC0,0x80,
+0x10,0x01,0xF0,0x64,0x04,0xE9,0xC0,0x80,0x10,0x01,0xEC,0xF6,0xFF,0x7A,0xEF,0xC4,
+0x04,0xD2,0xEC,0xD6,0xFF,0x6E,0xEF,0xB6,0xFF,0x7E,0x8B,0x47,0x8B,0x86,0x8B,0x6F,
+0x9B,0x20,0x98,0x81,0xEF,0xB6,0xFF,0x70,0x0C,0xB6,0x82,0x0E,0xF6,0x86,0x0F,0x16,
+0x8A,0xE4,0x00,0x01,0x55,0x20,0x60,0xC4,0x89,0x1D,0xD5,0x7D,0x00,0xA5,0x43,0xBD,
+0x5D,0x5D,0x1D,0x00,0xD6,0x39,0x00,0x54,0x5E,0x19,0x15,0x49,0x1C,0xD8,0x23,0xC0,
+0x60,0x8D,0x1E,0x13,0xA8,0x00,0x23,0xA0,0x40,0x09,0x1A,0x00,0xCD,0x08,0x00,0xFF,
+0x43,0xA8,0xE8,0x0F,0xBA,0x01,0x0B,0xBA,0x00,0x4D,0x1D,0xFA,0x45,0x28,0xEE,0x41,
+0x09,0x45,0xC1,0x00,0x32,0x08,0x20,0x01,0x5D,0x50,0x80,0xCD,0x43,0xBD,0x20,0xEC,
+0x96,0xFF,0x72,0x8C,0x99,0x11,0x04,0x00,0x1C,0x96,0xC8,0x8C,0x88,0x11,0x24,0xCC,
+0x8F,0xA9,0x55,0x29,0x20,0x5F,0xBD,0x04,0x5C,0x9D,0x06,0x5C,0x83,0xF1,0x20,0x00,
+0x35,0x21,0x20,0x72,0x1C,0x9D,0x0C,0xE4,0x00,0x00,0x15,0x21,0x20,0x24,0x1C,0x9D,
+0xF4,0x5C,0x84,0x06,0x24,0x9C,0x26,0x98,0x80,0xE4,0x00,0x00,0x15,0x5C,0x87,0xF1,
+0x48,0x84,0xC0,0x1F,0xB6,0xC8,0x8D,0x1D,0x18,0x88,0xCC,0x98,0x80,0x9F,0x61,0x9F,
+0x81,0x9F,0x21,0x9F,0x42,0x5F,0x7B,0x00,0x5F,0x9C,0x00,0x5F,0xB9,0x00,0xD5,0xBD,
+0xFA,0xBD,0x5D,0x40,0x01,0xEF,0xB6,0xFF,0x72,0x4B,0x57,0x28,0x8B,0x34,0x13,0x79,
+0xFF,0x13,0x99,0x00,0x4F,0x9C,0x40,0x47,0x9C,0xDD,0x4F,0x7A,0x10,0x8F,0x72,0x0F,
+0x9B,0x01,0x9F,0x41,0x9F,0x22,0x5F,0x5A,0x04,0xD7,0x33,0xFF,0x2E,0x20,0x84,0x30,
+0x9D,0xC1,0x5D,0xCE,0x00,0xD1,0xC3,0xF6,0x66,0x9D,0x41,0x8B,0x3D,0x5D,0x4A,0x00,
+0x21,0x48,0x34,0x1C,0xB6,0x94,0x50,0x80,0x10,0xE7,0xFF,0xFC,0xCF,0xC1,0x74,0x00,
+0x01,0xC8,0xEB,0x24,0x10,0x88,0x6C,0x0D,0x47,0x01,0xE4,0x00,0xB3,0x24,0x98,0x61,
+0x88,0x8C,0xE4,0x00,0x44,0x70,0x98,0x61,0xE4,0x00,0x6A,0xE4,0x21,0x80,0xBE,0xC0,
+0xE0,0x10,0x01,0xC9,0x6B,0x23,0x08,0xFC,0xE7,0x08,0x18,0x08,0xCB,0x01,0x0C,0xC7,
+0x01,0x08,0xCB,0x61,0x0C,0xC7,0x19,0xC0,0x94,0x00,0x01,0x9D,0x64,0x9C,0xE2,0xC8,
+0x84,0x23,0x38,0xD5,0x64,0xFF,0x46,0xE4,0x00,0x00,0x5F,0x21,0x84,0xAE,0xC0,0xE0,
+0x10,0x01,0xC9,0x6B,0x23,0x08,0xFC,0xE7,0x07,0xE8,0x08,0xCB,0x01,0x0C,0xC7,0x01,
+0x08,0xCB,0x61,0x0C,0xC7,0x19,0xC0,0xB4,0x00,0x01,0x9D,0x64,0x9C,0xE2,0xC8,0xA5,
+0x23,0x38,0xD5,0x65,0xFF,0x46,0x0C,0x36,0x8E,0x0E,0xC1,0x62,0x0E,0xA1,0x66,0x0E,
+0x81,0x6A,0x0E,0x61,0x6E,0x0E,0x41,0x72,0x0E,0x21,0x76,0x0E,0x01,0x7A,0x0D,0xE1,
+0x7E,0xED,0xC1,0x00,0x82,0xED,0xA1,0x00,0x86,0xED,0x81,0x00,0x8A,0xED,0x61,0x00,
+0x8E,0xED,0x41,0x00,0x92,0xED,0x21,0x00,0x96,0xFC,0x21,0x00,0x98,0x85,0x29,0x1C,
+0x21,0x90,0x0D,0x41,0x68,0x0D,0x61,0x64,0x0D,0xA1,0x5C,0x0D,0xC1,0x58,0x0D,0xE1,
+0x54,0x0E,0x61,0x44,0x0E,0xA1,0x3C,0x0E,0xC1,0x38,0xC2,0x60,0x10,0x01,0xC2,0xA0,
+0x10,0x01,0x0D,0x21,0x6C,0x0D,0x81,0x60,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0E,0x41,
+0x48,0x0E,0x81,0x40,0x0C,0x61,0x08,0x0C,0x81,0x0C,0x0C,0xC1,0x10,0x0C,0xE1,0x14,
+0xFD,0x73,0x08,0xD8,0xFE,0xB5,0x04,0xEA,0x99,0xE1,0x99,0x40,0x51,0xC0,0xFF,0x99,
+0xA1,0xC2,0xC0,0x10,0x01,0xE4,0x00,0x06,0x9D,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,
+0x01,0xFC,0xC6,0x05,0x40,0xF0,0x87,0x0C,0x0C,0x0C,0x66,0x02,0x98,0xA1,0xE4,0x00,
+0x62,0xEC,0xCC,0xEC,0x00,0x1C,0x8C,0xEB,0x08,0xC7,0x16,0x0C,0xC1,0x20,0x08,0xC7,
+0x18,0x0C,0x01,0x24,0x0C,0x01,0x1C,0x0C,0x01,0x2C,0x0C,0xC1,0x18,0x0C,0xC7,0x0E,
+0x0C,0xC1,0x28,0x0C,0xC7,0x0A,0x12,0x47,0x04,0x12,0x27,0x05,0x12,0x07,0x07,0x20,
+0xC0,0x2A,0x4D,0x8D,0x64,0xE4,0x00,0x05,0xE7,0x20,0xC4,0xFE,0xF0,0xB3,0x08,0xD8,
+0x88,0xEF,0xE4,0x00,0x00,0x5D,0xCC,0xC7,0x00,0x1C,0x1C,0x87,0x01,0x8C,0xCB,0x12,
+0xE6,0x07,0x42,0xED,0xBD,0xD6,0x17,0x00,0xC6,0x0E,0xE6,0x0A,0x22,0xE4,0x46,0x12,
+0xE6,0x05,0xD6,0xF2,0x00,0x59,0x10,0xC6,0x04,0xD6,0x26,0x19,0x85,0x5C,0xE4,0x00,
+0xD4,0xA7,0xFE,0xB5,0xE4,0x00,0x00,0xA1,0x9A,0x20,0xD0,0xC2,0x0B,0x76,0xF0,0x93,
+0x08,0xD8,0x88,0xCF,0xE4,0x00,0x00,0x71,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0xD8,
+0xCC,0xA6,0x00,0x1C,0x1E,0xE6,0x01,0x8C,0xB8,0x13,0x05,0x07,0x43,0x0D,0xC5,0xD6,
+0x18,0x00,0xD6,0x0F,0x05,0x0A,0x23,0x08,0x4E,0x10,0xA5,0x06,0x13,0x07,0x06,0xD7,
+0x05,0x00,0x56,0x89,0xC6,0xE4,0x00,0x05,0xCD,0x5C,0xD7,0x00,0xD4,0x86,0xFE,0x65,
+0xE4,0x00,0x02,0x15,0x40,0xCD,0x85,0xC0,0xE0,0x10,0x01,0x0C,0xC1,0x04,0xE9,0x07,
+0x04,0x8D,0x5E,0x86,0x00,0x55,0x08,0x40,0x1C,0x61,0x36,0x4D,0x08,0x31,0x88,0x92,
+0x88,0xB1,0x88,0xD4,0x98,0xE2,0xE7,0xFF,0xDF,0x80,0xD0,0x60,0x06,0x9A,0xC3,0x00,
+0x10,0x01,0xE8,0xF8,0x04,0x8D,0x54,0xE7,0x80,0x20,0xE1,0x60,0xC0,0xC0,0x10,0x01,
+0x1C,0x61,0x30,0xEE,0xE6,0x00,0xDE,0x08,0x81,0x36,0x88,0xB2,0x88,0xD1,0x88,0xF4,
+0x86,0xE8,0xD0,0x60,0x05,0x5A,0x98,0x60,0xE7,0xFF,0xD4,0x0E,0x0C,0xE1,0x06,0x0F,
+0x01,0x16,0xC0,0xC0,0x10,0x01,0x9C,0xE3,0x4C,0xE7,0x18,0x8C,0xF8,0x0C,0x87,0x0A,
+0x08,0xE7,0x04,0x40,0x84,0x3D,0x5C,0x9F,0xF9,0x0C,0x61,0x32,0xEE,0xE6,0x00,0xE2,
+0x48,0x84,0x00,0x88,0xB2,0x88,0xD1,0x88,0xF4,0x86,0xE8,0x98,0x61,0xE7,0xFF,0xD3,
+0xA4,0x88,0xB2,0x88,0xD1,0x88,0xF4,0x1C,0x61,0x34,0x1C,0x81,0x2C,0xE7,0xFF,0xD6,
+0x6A,0x20,0x61,0x70,0x08,0xE1,0x36,0x0C,0xE1,0x24,0x08,0xE1,0x34,0x0C,0xE1,0x1C,
+0x0C,0xE1,0x0A,0x20,0xE0,0x78,0x0F,0x01,0x0E,0x23,0x00,0x60,0xC0,0xC0,0x10,0x01,
+0x1C,0x61,0x24,0xEC,0xE6,0x00,0xDA,0x1C,0x81,0x1C,0x0C,0xA1,0x2E,0x88,0xD5,0x84,
+0xE8,0x0C,0xC1,0x1E,0x5C,0xDF,0xF9,0xC8,0xE0,0x07,0xFF,0x48,0xC6,0x00,0xC0,0xC0,
+0xFF,0xE8,0x48,0xC6,0x38,0xCC,0xC6,0x03,0xFF,0x9A,0x20,0x40,0xE6,0x38,0x40,0xCD,
+0x85,0x4C,0xC6,0x50,0x8C,0xE6,0x0C,0xE1,0x1C,0xE4,0x00,0x00,0x5F,0x0C,0x01,0x24,
+0x0C,0x01,0x1C,0x0C,0x01,0x2C,0xE4,0x00,0x02,0xD1,0x4C,0xED,0x64,0xCD,0x8C,0x00,
+0x1C,0x45,0x4A,0x3D,0xC0,0xE0,0x10,0x01,0x5D,0x4A,0x00,0xFC,0xE7,0x08,0xD8,0x8D,
+0x87,0x0C,0x0C,0x08,0xE4,0x00,0x02,0x95,0xE8,0xF6,0x04,0x8B,0x54,0xE7,0x02,0x20,
+0xE0,0x40,0x0C,0x61,0x2A,0x0C,0x81,0x2E,0x0C,0xA1,0x12,0xE7,0xFF,0xF1,0xB6,0xEA,
+0x56,0x04,0x8B,0x0C,0xA1,0x2A,0x56,0x52,0x01,0x22,0x40,0x88,0xCC,0xEC,0x00,0x1C,
+0x8C,0xEB,0x08,0x61,0x18,0x0D,0x07,0x0A,0x08,0x81,0x1C,0x0C,0xC1,0x2E,0x98,0xE0,
+0xE7,0xFF,0xE9,0x5A,0x20,0x60,0xFE,0xE4,0x00,0x01,0xC1,0xD0,0xA0,0x06,0xE0,0x0C,
+0xE1,0x2E,0xD0,0xE0,0x06,0xA8,0x10,0xD5,0x34,0x40,0x86,0x3B,0xD4,0x85,0x06,0x58,
+0x40,0xA6,0x2B,0xD4,0xA7,0x06,0x20,0x0C,0xE1,0x1E,0x0C,0xC1,0x1A,0x08,0xB5,0x33,
+0x40,0xC6,0x3D,0x4C,0xA5,0x08,0x4C,0xE6,0xFA,0x44,0xC7,0x36,0x40,0xE6,0x3D,0xD4,
+0xA7,0x05,0x40,0x0C,0x61,0x2A,0x0C,0x81,0x2E,0xCE,0x8C,0x00,0x1C,0x40,0xE4,0x1C,
+0x8E,0x8B,0x0C,0xF4,0x0C,0x0C,0xC1,0x1E,0x0C,0xA1,0x1A,0x22,0x40,0xA8,0x88,0xF0,
+0xE7,0xFF,0xE9,0xAC,0x0C,0x81,0x26,0x0C,0xE1,0x2A,0x0C,0xC1,0x2E,0x0C,0x74,0x19,
+0x40,0xA6,0x3C,0x40,0xC6,0x23,0x0C,0x81,0x22,0x40,0xE7,0x23,0x8C,0xE6,0x40,0xE7,
+0x28,0xE4,0x00,0x00,0x47,0x40,0xC4,0x33,0x40,0xA3,0x2B,0x8C,0xC5,0x40,0xC6,0x38,
+0x0C,0xD4,0x19,0x0C,0xC1,0x26,0x40,0x84,0x33,0x0C,0xC1,0x22,0x40,0x63,0x33,0x8C,
+0x83,0x40,0xE4,0x38,0x0C,0xF4,0x17,0xCD,0x8C,0x00,0x1C,0x8D,0x8B,0x0C,0xEC,0x0A,
+0x20,0xE4,0x86,0x9B,0x02,0x0F,0x0C,0x08,0x22,0x21,0x58,0x4C,0xE7,0x74,0x45,0x4A,
+0x3D,0xCC,0xEE,0x00,0x1C,0x5D,0x4A,0x00,0x8C,0xEB,0x0C,0x07,0x08,0xE4,0x00,0x00,
+0x83,0x20,0xE8,0xF6,0xCC,0xEE,0x00,0x1C,0x8C,0xEB,0x0C,0x07,0x08,0x4C,0xED,0x74,
+0x45,0x4A,0x3D,0xE4,0x00,0x00,0x51,0xCC,0xEC,0x00,0x1C,0x8C,0xEB,0x0C,0xC7,0x0A,
+0x20,0xC8,0x7A,0x0C,0x07,0x08,0x4D,0x8D,0x64,0xCC,0xEE,0x00,0x1C,0x45,0x4A,0x65,
+0x8C,0xEB,0x4D,0x8D,0x74,0x0C,0x07,0x08,0x45,0x4C,0x55,0x5D,0x4A,0x00,0x9D,0xE1,
+0x5D,0xEF,0x00,0x1D,0x8F,0xFF,0xC2,0x00,0x10,0x01,0x5D,0x8C,0x00,0xF0,0xF3,0x08,
+0xD8,0xD4,0xEC,0xE5,0x45,0x50,0x80,0x1E,0x98,0xA1,0xC0,0x60,0x10,0x01,0xFC,0x63,
+0x0A,0x30,0xE4,0x00,0x5C,0x44,0x88,0x6A,0xE7,0xFF,0xD6,0xC0,0xF0,0xF0,0x08,0xD8,
+0x0E,0xC1,0x3A,0x5C,0xE0,0x53,0x0E,0xA1,0x3E,0x48,0xE7,0x12,0x0E,0x81,0x42,0xF8,
+0xF0,0x08,0xD8,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D,
+0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41,
+0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x89,0xC7,0xCC,0xEE,0x00,0x1C,0x8C,
+0xEB,0x0C,0xC7,0x0E,0x9A,0x21,0x0C,0xC1,0x2C,0x08,0xC7,0x16,0x08,0xE7,0x18,0x0C,
+0xC1,0x24,0x0C,0xE1,0x1C,0xE7,0xFF,0xFC,0x67,0x1C,0x21,0xB8,0x0D,0x81,0x38,0x0D,
+0xE1,0x2C,0x0E,0x41,0x20,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61,
+0x3C,0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E,0x61,0x1C,
+0x0E,0x81,0x18,0x0E,0xA1,0x14,0x1E,0xC1,0x48,0x0C,0x36,0xC4,0x0C,0x96,0xBC,0x0C,
+0xD6,0xC0,0xC0,0xE0,0x10,0x01,0x89,0xE3,0xF0,0xE7,0x0C,0x10,0x8A,0x45,0x4C,0xE7,
+0x10,0x9C,0xEE,0xC4,0xE7,0x07,0xF8,0x40,0x21,0x3D,0x89,0x81,0x20,0xA8,0x2A,0x0A,
+0x23,0x2E,0xE4,0x00,0x00,0x0F,0x0A,0x23,0x22,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,
+0x01,0xF0,0xA7,0x0C,0x10,0xFC,0xC6,0x09,0x4C,0x4C,0xA5,0x10,0x88,0xEC,0x8C,0xA6,
+0xCA,0x00,0x20,0x00,0x8A,0xE5,0xE4,0x00,0x00,0x71,0x22,0x48,0x3E,0x0F,0x05,0x02,
+0x0C,0x86,0x02,0x8C,0x98,0xE4,0x00,0x00,0x29,0x0C,0x96,0xBE,0x20,0x80,0x2A,0x0C,
+0x86,0x02,0xE4,0x00,0x00,0x0F,0x0C,0x85,0x02,0x0C,0x87,0x00,0x9C,0xC4,0x0C,0x87,
+0x02,0x9C,0xA4,0x5E,0x04,0x15,0x9C,0xE4,0x4A,0x10,0x20,0x5E,0x10,0x06,0xD4,0xD7,
+0xFE,0x66,0x5E,0x1F,0xF9,0xC2,0x80,0x10,0x01,0xC1,0xC0,0x10,0x01,0x4A,0x10,0x00,
+0xFE,0x94,0x0C,0x0C,0x99,0x40,0x9A,0x60,0x99,0x60,0xFD,0xAE,0x08,0xD8,0x9A,0xA2,
+0xE4,0x00,0x06,0x15,0x22,0x48,0xCA,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x05,0x44,0xF0,
+0x8E,0x08,0xD8,0x0C,0xC5,0x02,0x98,0xA0,0xE4,0x00,0x00,0x35,0x9C,0xA1,0x12,0xE6,
+0x00,0x5C,0xA5,0x00,0xD6,0xEA,0x00,0x5D,0x12,0xE6,0x01,0xD5,0x57,0x12,0x21,0x1C,
+0xC6,0x1C,0xD4,0x85,0xFF,0x55,0x21,0x41,0x66,0x0C,0xEC,0x02,0x08,0xCF,0x22,0xD4,
+0xC7,0x11,0x84,0x0C,0xCC,0x06,0xD4,0xE6,0x00,0x7C,0xD4,0xE6,0x11,0x2E,0x0C,0xCC,
+0x0A,0xD4,0xE6,0x10,0xF0,0x98,0x60,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF,0x26,
+0x09,0x0F,0x28,0xE7,0xFF,0xCA,0x14,0xD0,0x60,0x10,0x42,0xF0,0xEE,0x08,0xD8,0x8C,
+0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x99,0x41,0x18,0x07,0x04,0xF0,0xEE,0x08,0xD8,
+0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x18,0x07,0x06,0xE4,0x00,0x00,0xC5,0x21,
+0x45,0xC6,0x0C,0xEC,0x06,0x08,0xCF,0x22,0xD4,0xC7,0x0E,0xBC,0x0C,0xCC,0x02,0xD4,
+0xC7,0x0E,0x84,0x0C,0xCC,0x0A,0xD4,0xE6,0x00,0x7C,0xD4,0xE6,0x0E,0x2E,0x0C,0xCC,
+0x0E,0xD4,0xE6,0x0D,0xF0,0x98,0x61,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF,0x26,
+0x09,0x0F,0x28,0xE7,0xFF,0xC9,0x54,0xD0,0x60,0x0D,0x42,0xF0,0xEE,0x08,0xD8,0x8C,
+0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x98,0xC1,0x18,0x07,0x04,0x99,0x42,0xF0,0xEE,
+0x08,0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x18,0xC7,0x06,0xF0,0xEE,0x08,
+0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x1A,0xA7,0x05,0xE4,0x00,0x02,0xFF,
+0x25,0x45,0xD1,0x1C,0xC7,0xFE,0xD4,0xCA,0x03,0x70,0x4C,0xEA,0x10,0x08,0xCF,0x22,
+0x8C,0xEC,0x0C,0xE7,0x02,0xD4,0xC7,0x0A,0xD4,0x1C,0xCA,0xFF,0x4C,0xC6,0x10,0x8C,
+0xCC,0x0C,0xC6,0x02,0xD4,0xE6,0x01,0x34,0xD4,0xE6,0x0A,0x3E,0x1C,0xAA,0xFE,0x4C,
+0xA5,0x10,0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x09,0xC0,0x1C,0x8A,0x01,0x4C,0x84,
+0x10,0x8C,0x8C,0x0C,0x84,0x02,0xD4,0x85,0x09,0x48,0x1C,0xAA,0x01,0x4C,0xA5,0x10,
+0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x03,0x2C,0xD4,0xE5,0x08,0xB6,0x1C,0xAA,0x02,
+0x4C,0xA5,0x10,0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x08,0x38,0xD4,0xC5,0x08,0x18,
+0xE4,0x00,0x00,0x95,0x1C,0x87,0xFE,0x08,0xAF,0x22,0x4C,0xCA,0x10,0xD5,0x44,0x03,
+0xF6,0x8C,0xCC,0x0C,0xC6,0x02,0xD4,0xA6,0x07,0x4C,0x1C,0xA7,0xFF,0x4C,0xA5,0x10,
+0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xA6,0x06,0xD4,0x1C,0xA7,0xFD,0x4C,0xA5,0x10,0x8C,
+0xAC,0x0C,0xA5,0x02,0xD4,0xC5,0x00,0xB4,0xD4,0xC5,0x06,0x3E,0x9C,0xFC,0x4C,0xE7,
+0x10,0x8C,0xEC,0x0C,0xE7,0x02,0xD4,0xC7,0x05,0xC8,0x88,0x6A,0x88,0x8C,0x88,0xB0,
+0x88,0xD1,0x08,0xEF,0x26,0x09,0x0F,0x28,0xE7,0xFF,0xC7,0x4A,0xD0,0x60,0x05,0x1A,
+0xF0,0xCE,0x08,0xD8,0x8C,0xCB,0xCC,0xC6,0x00,0x1C,0x8C,0xCD,0x1C,0xAA,0xFF,0x1C,
+0xEA,0x01,0x18,0xA6,0x04,0xF0,0xCE,0x08,0xD8,0x8C,0xCB,0xCC,0xC6,0x00,0x1C,0x8C,
+0xCD,0x19,0x46,0x06,0x5D,0x47,0x00,0xE4,0x00,0x00,0xCB,0x8C,0xCC,0x0C,0xE6,0x02,
+0xD4,0xA7,0x03,0x7C,0x1C,0xCA,0xFF,0x4C,0xC6,0x10,0x8C,0xCC,0x0C,0xC6,0x02,0xD4,
+0xE6,0x00,0xBC,0xD4,0xE6,0x02,0xE6,0x1C,0xCA,0xFE,0x4C,0xC6,0x10,0x8C,0xCC,0x0C,
+0xC6,0x02,0xD4,0xE6,0x02,0x68,0x88,0x6A,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF,
+0x26,0x09,0x0F,0x28,0xE7,0xFF,0xC6,0x72,0x20,0x60,0xDC,0xF0,0xEE,0x08,0xD8,0x8C,
+0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x1C,0xCA,0xFE,0x18,0xC7,0x04,0xF0,0xEE,0x08,
+0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x19,0x47,0x06,0xF0,0xEE,0x08,0xD8,
+0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x19,0x47,0x05,0xE4,0x00,0x00,0x21,0x9D,
+0x41,0x5D,0x4A,0x00,0x10,0xF4,0x04,0xD4,0xEA,0xEC,0x6D,0x10,0xF4,0x04,0xD4,0xEA,
+0x04,0x61,0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0xCC,0xC7,0x00,0x1C,0x8C,0xCD,0x10,0xC6,
+0x05,0xD5,0x46,0x00,0x55,0x1D,0x46,0x01,0x5D,0x4A,0x00,0xCC,0xE7,0x00,0x1C,0x8C,
+0xED,0x0C,0x96,0xBE,0x18,0x87,0x07,0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0xCC,0xE7,0x00,
+0x1C,0x8C,0xED,0x0E,0x47,0x08,0x9D,0x61,0x5D,0x6B,0x00,0x8A,0x6B,0x22,0x49,0x36,
+0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0x1C,0x87,0xFF,0xCC,0xE7,0x00,0x1C,0x50,0xA0,0x1C,
+0x40,0x67,0x6C,0xCC,0x84,0x00,0x1C,0x9C,0x64,0x8C,0x8D,0x9C,0x84,0xE7,0xFF,0xCF,
+0xE6,0x1C,0xCB,0x01,0xF0,0xEE,0x08,0xD8,0x98,0xA1,0x8C,0xEB,0x5D,0x66,0x00,0x1C,
+0xC7,0xFF,0x4E,0x6B,0x09,0xCC,0xC6,0x00,0x1C,0xCC,0xE7,0x00,0x1C,0x8C,0xCD,0x8C,
+0xED,0x10,0xC6,0x07,0x40,0xC5,0x35,0x18,0xC7,0x07,0x10,0xF4,0x04,0xD4,0xEA,0x00,
+0x71,0x0C,0xB6,0xC2,0x40,0xF3,0x2C,0xD0,0xE1,0xFA,0xE8,0xC0,0xE0,0x10,0x01,0xF0,
+0xC7,0x08,0xD8,0x8D,0x66,0x88,0x73,0xF9,0x67,0x08,0xD8,0x0C,0x36,0xC6,0x0E,0xC1,
+0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,
+0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,
+0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C,0x21,0xE0,
+0x0D,0x21,0x1C,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,
+0xC1,0x08,0x0E,0xC1,0x04,0xC1,0x80,0x10,0x01,0xF8,0x0C,0x08,0xD8,0xFC,0xEC,0x08,
+0xD8,0x98,0xDF,0x89,0x63,0x18,0xC7,0x5B,0x18,0xC7,0x06,0x18,0xC7,0x07,0x18,0xC7,
+0x22,0x18,0xC7,0x23,0x18,0xC7,0x3E,0x18,0xC7,0x3F,0x18,0xC7,0x5A,0x0C,0x07,0x08,
+0x0C,0x07,0x24,0x0C,0x07,0x40,0x0C,0x07,0x5C,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0C,
+0x0C,0x10,0x67,0x04,0x10,0xE7,0x01,0x40,0x67,0x1B,0x9C,0xEE,0xC4,0xE7,0x01,0xF8,
+0x1E,0xC1,0x20,0x89,0xC4,0x5C,0x63,0x00,0x89,0xA1,0x40,0x21,0x3D,0xE4,0x00,0x82,
+0x88,0x98,0x80,0x98,0xA1,0x98,0xC0,0x18,0x01,0x00,0x88,0x6B,0xE7,0xFF,0xF6,0x9A,
+0x98,0x81,0x18,0x61,0x00,0x18,0x01,0x01,0x88,0x6B,0x98,0xA1,0x98,0xC0,0xE7,0xFF,
+0xF6,0x76,0x18,0x61,0x01,0xC0,0xE0,0x10,0x01,0x89,0x41,0xE8,0xE7,0x04,0x8B,0x54,
+0xE7,0x04,0x20,0xE0,0x40,0xF0,0xEC,0x08,0xD8,0x24,0xE4,0x25,0x88,0x6E,0xE7,0xFF,
+0xE4,0xFC,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x0C,0x0D,0x24,0xE4,0xC9,0x10,0xEA,0x00,
+0x24,0xE4,0xB3,0x10,0xCA,0x01,0x24,0xC4,0x9B,0x5C,0xE6,0x1F,0x88,0x6B,0x48,0xC7,
+0x30,0x98,0x80,0x5C,0xC6,0x00,0x98,0xA2,0xE7,0xFF,0xF5,0xE2,0x10,0xEA,0x00,0x8C,
+0xE3,0x18,0xEA,0x00,0x10,0xEA,0x01,0x8C,0x67,0x18,0x6A,0x01,0x88,0x2D,0x0E,0xC1,
+0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,
+0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC0,0xE0,0x10,0x01,0xF8,0x67,0x00,0xE4,
+0x85,0x29,0x0B,0xC5,0x12,0x08,0xC5,0x00,0x0A,0xE5,0x02,0x0B,0x05,0x04,0x0B,0x25,
+0x06,0x0B,0x45,0x08,0x0B,0x65,0x0A,0x0B,0x85,0x0C,0x0B,0xA5,0x0E,0x88,0xE3,0x08,
+0xA5,0x10,0x20,0x84,0x34,0x8B,0x5E,0x8B,0x25,0x8B,0x1D,0x8A,0xFC,0x88,0xDB,0xC0,
+0xA0,0x10,0x01,0x9B,0x62,0xE8,0x85,0x0C,0x17,0x40,0xB9,0x23,0x40,0xA5,0xD8,0x40,
+0xA0,0x2D,0xFC,0xA5,0x03,0xFF,0xD4,0xE5,0x00,0xC8,0x43,0x3A,0x23,0x5C,0x66,0x04,
+0x43,0x79,0xD8,0xFF,0x7B,0x03,0xFF,0xD7,0x67,0x03,0xCC,0xD4,0xE5,0x00,0xBC,0x24,
+0xFC,0x4C,0x40,0xC6,0x3B,0x40,0xE5,0x3D,0x43,0x07,0xC3,0x40,0x78,0x34,0xE4,0x00,
+0x00,0x73,0x98,0xA2,0x43,0x5A,0x23,0x43,0x5A,0x28,0xFC,0xBA,0x03,0xFF,0xD4,0xA7,
+0x01,0x9C,0xC0,0xE0,0xFF,0xEC,0x20,0x00,0xAD,0x43,0x40,0xD5,0xFC,0xBA,0x04,0x00,
+0xFF,0x5A,0xFC,0x01,0x40,0x7A,0x3C,0x42,0xE3,0xBB,0xC8,0x60,0x07,0xFF,0x40,0xE3,
+0x3D,0x40,0xC6,0x3B,0x40,0x77,0x34,0x40,0x63,0x28,0x5C,0x63,0x04,0xE4,0x00,0x00,
+0x47,0x24,0xFC,0x3E,0x8C,0xE4,0x43,0x18,0x3B,0x40,0x98,0x20,0xE4,0x00,0x00,0x23,
+0xFF,0x84,0x07,0xFF,0x40,0xFC,0x3D,0x42,0xF7,0x3B,0x40,0x97,0x20,0x5C,0x64,0x04,
+0x85,0x29,0x9C,0x38,0xC0,0xE0,0x10,0x01,0x0C,0x01,0x04,0xFC,0xE7,0x0C,0x0C,0x10,
+0xC7,0x14,0x08,0xA7,0x0B,0xC0,0xE0,0x10,0x01,0x5C,0x85,0x06,0xE8,0xE7,0x07,0x24,
+0x40,0xE4,0x3B,0x40,0xE7,0x30,0xD4,0x67,0x00,0x4C,0x98,0xE1,0x0C,0xE1,0x04,0x0C,
+0xE1,0x06,0x20,0xE0,0x82,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x26,0x40,0xE5,0x3B,
+0x40,0xE7,0x30,0xD4,0xE3,0x00,0x78,0x98,0xE1,0x0C,0xE1,0x04,0x98,0xE0,0xE4,0x00,
+0x00,0x0D,0x98,0xFF,0x0C,0x81,0x06,0x20,0x81,0x32,0xC0,0xE0,0x10,0x01,0xC0,0x80,
+0x10,0x01,0xF3,0x07,0x0C,0x10,0xFC,0x84,0x07,0x26,0x9A,0xE0,0x98,0xE1,0xE4,0x00,
+0x00,0x5F,0x0B,0x44,0x00,0x1F,0x27,0x01,0x43,0x45,0xD3,0x43,0x5A,0x30,0xD7,0x43,
+0x00,0xD4,0x0B,0x44,0x02,0x43,0x5A,0x2B,0x43,0x5A,0x30,0xD7,0x43,0x00,0x68,0x98,
+0x81,0x0C,0x81,0x04,0xE4,0x00,0x00,0x1F,0x5C,0xF9,0x02,0x9C,0x82,0x9E,0xE1,0xD6,
+0xF8,0xFE,0x98,0x0C,0x81,0x06,0x20,0x80,0xBE,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10,
+0x01,0xF0,0x84,0x0C,0x10,0xFE,0xF7,0x07,0x24,0x9C,0x81,0x4F,0x04,0x08,0x8E,0xF8,
+0x0A,0xF7,0x00,0x40,0xB7,0x2B,0x40,0xC5,0x30,0xD4,0xC3,0x00,0x64,0x98,0xC1,0x5C,
+0xE4,0x02,0x0C,0xC1,0x04,0x88,0x67,0x9C,0x28,0x85,0x29,0x24,0xC0,0xB8,0xC2,0xE0,
+0x10,0x01,0xF3,0x17,0x0C,0x10,0xD4,0xD8,0x01,0x1C,0x1E,0xE6,0xFF,0x43,0x07,0xC3,
+0x8F,0x17,0xC2,0xE0,0x10,0x01,0x4F,0x38,0x10,0xFE,0xF7,0x0B,0x14,0x8F,0x37,0x0B,
+0x59,0x00,0x0B,0x39,0x02,0xE4,0x00,0x00,0x11,0x9B,0x40,0x9B,0x20,0xC2,0xE0,0x10,
+0x01,0xF2,0xF7,0x0C,0x10,0xD6,0xE6,0x01,0x20,0xD0,0xDF,0x04,0x60,0x40,0xE7,0xBB,
+0xC3,0x00,0x10,0x01,0x8C,0xE6,0xFF,0x18,0x0B,0x14,0x4F,0x67,0x10,0x8F,0x78,0x0B,
+0xDB,0x00,0x0B,0xBB,0x02,0xE4,0x00,0x00,0x17,0x24,0xDD,0xB0,0x9B,0xC0,0x9B,0xA0,
+0xD4,0xD7,0x03,0x2C,0x5C,0xC6,0x00,0xC0,0xE0,0x10,0x01,0x1E,0xE6,0x01,0xFC,0xE7,
+0x07,0x24,0x4C,0xC6,0x08,0x4E,0xF7,0x08,0x8E,0xE7,0x8C,0xE6,0x0B,0x77,0x00,0x0B,
+0x87,0x00,0xC0,0xC0,0x10,0x01,0x43,0x1B,0xE5,0xFC,0xC6,0x0C,0x0C,0x10,0xE6,0x14,
+0x08,0xC6,0x0B,0x43,0x18,0x33,0x43,0x9C,0x33,0x43,0x18,0x38,0x43,0x9C,0x38,0x40,
+0xDB,0x33,0x43,0x83,0xE5,0x40,0xE6,0x38,0x42,0xFE,0xE3,0x40,0x67,0x1D,0x43,0x9D,
+0xE3,0x43,0x5A,0x1B,0x40,0x79,0x1B,0x8E,0xFA,0x8C,0x7C,0x42,0xF7,0xC0,0x40,0x63,
+0xC0,0xE4,0x00,0x00,0x11,0x9A,0xE0,0x98,0x60,0x0C,0x64,0x01,0x0E,0xE5,0x01,0x85,
+0x29,0x1C,0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,
+0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x89,0x64,0x0D,0x21,0x24,0x5D,0x43,
+0x04,0x0C,0xC1,0x04,0x0C,0xE1,0x00,0x89,0x85,0x89,0xC8,0x0D,0xA1,0x2A,0xC2,0x00,
+0x10,0x01,0x99,0xE2,0xFE,0x10,0x0C,0x0C,0x08,0x70,0x0B,0x40,0x6B,0x1B,0x40,0x63,
+0x78,0x40,0x6A,0x1D,0x5C,0x63,0x06,0xE7,0xFF,0xFC,0x16,0x0C,0x81,0x06,0x88,0xC3,
+0x0C,0xE1,0x02,0x24,0x7C,0x36,0x0C,0x04,0x01,0x0C,0x07,0x01,0xE4,0x00,0x00,0x37,
+0x08,0xB0,0x0B,0x40,0xAB,0x2B,0x41,0xE5,0x78,0x88,0xA7,0x41,0xEA,0x7D,0x88,0xEC,
+0x5C,0x6F,0x06,0xE7,0xFF,0xFD,0x70,0xC1,0xE0,0x10,0x01,0xFD,0xEF,0x0C,0x0C,0x08,
+0x6F,0x0B,0x40,0x6B,0x1B,0x4C,0x63,0x0A,0x8C,0x6A,0x5C,0x63,0x06,0xE7,0xFF,0xFB,
+0x8A,0x10,0xEF,0x04,0x88,0xC3,0xD4,0x67,0x01,0x38,0x0C,0x0E,0x01,0x0C,0x0D,0x01,
+0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,
+0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x08,0xEF,0x0B,
+0x41,0x6B,0x3B,0x4D,0x6B,0x0A,0x8D,0x4B,0x88,0x8E,0x88,0xAD,0x5C,0x6A,0x06,0x88,
+0xEC,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,
+0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0xE7,0xFF,0xFC,0x7F,
+0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0xA7,0x0C,0x10,0xF3,0x06,0x08,0xD8,
+0x1F,0x25,0xFD,0xC0,0xE0,0x10,0x01,0x9C,0xBF,0xFC,0xE7,0x08,0xDD,0xCF,0x18,0x00,
+0x1C,0x5E,0xE5,0x00,0x8F,0x07,0x98,0x82,0xE4,0x00,0x00,0x61,0x10,0xC7,0x01,0xD4,
+0xC5,0x00,0x76,0x1A,0xE7,0x00,0x1B,0x27,0xFF,0xE4,0x00,0x00,0x39,0x20,0xC0,0x36,
+0x18,0x87,0x00,0x18,0x07,0xFF,0xE4,0x00,0x00,0x1F,0x1F,0x46,0xFF,0x9C,0xC1,0x1B,
+0x47,0xFF,0x18,0xC7,0x00,0x1C,0xE7,0x1C,0xD4,0xF8,0xFE,0xA6,0x85,0x29,0xFC,0x21,
+0xFF,0x80,0xCA,0xE0,0x01,0x00,0x0D,0x41,0x78,0x0D,0x61,0x74,0x0D,0x81,0x70,0x0D,
+0xA1,0x6C,0x0D,0xE1,0x64,0x0E,0x01,0x60,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x81,
+0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0xCD,0x84,0x0A,0x00,0x0D,0x21,0x7C,0x0D,0xC1,
+0x68,0x0E,0x61,0x54,0xCD,0x63,0x00,0x0A,0xC2,0xC0,0x10,0x01,0x41,0x6B,0x23,0xC2,
+0xA0,0x10,0x01,0xC0,0x80,0x10,0x01,0xC2,0x00,0x10,0x01,0xFC,0x84,0x0C,0x0C,0xC2,
+0x80,0x10,0x01,0x11,0xC4,0x04,0x41,0x8C,0x18,0x41,0xA7,0x73,0x41,0x6B,0xB8,0x5D,
+0xED,0x00,0x89,0x44,0x8C,0xCF,0x9D,0xDF,0x8D,0xE5,0x5C,0xC6,0x00,0x5D,0xEF,0x00,
+0xFE,0xD6,0x04,0x90,0xFE,0xB5,0x07,0x24,0xFE,0x10,0x0B,0x14,0xFE,0x94,0x09,0x4C,
+0x1E,0x41,0x08,0xCA,0x20,0x03,0xE8,0xE4,0x00,0x01,0x45,0x0C,0xC1,0x04,0xE7,0xFF,
+0xC4,0x04,0x08,0xAA,0x0B,0x10,0xEA,0x14,0x42,0x6F,0x6D,0x1C,0x93,0x01,0x4C,0x84,
+0x08,0x8C,0x95,0x08,0x64,0x00,0x98,0x82,0x40,0x63,0x2B,0x88,0xB2,0x40,0x63,0x38,
+0x5C,0x63,0x06,0xE7,0xFF,0xF6,0xFE,0x4C,0xEF,0x10,0x40,0xA3,0x5B,0x9C,0xE2,0x0C,
+0xC1,0x06,0x8C,0xF0,0xD5,0xED,0x00,0x46,0xD6,0x6E,0x01,0x22,0x08,0x87,0x01,0x40,
+0xA5,0x88,0x40,0xA4,0x2D,0x0C,0xA7,0x01,0x40,0x63,0x63,0x4C,0xEF,0x10,0x40,0x63,
+0x88,0x8C,0xF0,0x08,0xA7,0x01,0x40,0x65,0x1D,0x0C,0x67,0x01,0x4C,0xEF,0x08,0x1C,
+0x8F,0x01,0x4E,0xE7,0x08,0x1C,0xA7,0x01,0x8E,0xF0,0x4F,0x05,0x08,0x8F,0x10,0x0B,
+0x38,0x00,0x27,0x3C,0x1A,0x0C,0x18,0x01,0x4C,0xE7,0x08,0x8C,0xF0,0x08,0xA7,0x00,
+0x24,0xBC,0x1A,0x0C,0x07,0x01,0x08,0xF7,0x00,0x08,0xB8,0x00,0x8C,0xA7,0x4C,0xEF,
+0x10,0x5D,0xE4,0x00,0x8C,0xF4,0x0C,0xA7,0x00,0x88,0x96,0x50,0xA0,0x3C,0x88,0x72,
+0xD5,0xE6,0xFA,0xD8,0x0E,0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56,
+0x0E,0x41,0x5A,0x0E,0x21,0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,
+0xA1,0x6E,0x0D,0x81,0x72,0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,
+0x00,0x80,0x85,0x29,0xFC,0x21,0xFF,0x70,0xED,0x41,0x00,0x88,0xED,0x61,0x00,0x84,
+0xED,0x81,0x00,0x80,0x0D,0xA1,0x7C,0x0D,0xC1,0x78,0x0D,0xE1,0x74,0x0E,0x01,0x70,
+0x0E,0x21,0x6C,0x0E,0x41,0x68,0x0E,0x61,0x64,0xC1,0x80,0x10,0x01,0xED,0x21,0x00,
+0x8C,0x0E,0x81,0x60,0x0E,0xA1,0x5C,0x0E,0xC1,0x58,0x8A,0x03,0x8A,0x24,0x89,0x65,
+0x0C,0xC1,0x2C,0x99,0x40,0xFE,0x6C,0x08,0xD8,0x1E,0x41,0x48,0x1D,0xE1,0x38,0x1D,
+0xC1,0x40,0x1D,0xA1,0x30,0xE4,0x00,0x00,0x97,0xCC,0xEA,0x00,0x1C,0x8C,0xF3,0x10,
+0xC7,0x07,0x0A,0xE7,0x17,0x43,0x30,0x34,0x0C,0x81,0x2E,0x13,0x19,0x00,0x88,0xA6,
+0x1F,0x58,0x01,0x1B,0x59,0x00,0x08,0x67,0x16,0x4C,0xE6,0x08,0x1C,0xC1,0x58,0x8C,
+0xF8,0x4C,0xE7,0x08,0x8C,0xC7,0x0E,0xE6,0xF9,0x40,0xCD,0x3C,0x41,0x0E,0x3C,0x0C,
+0xC1,0x00,0x9D,0x41,0x40,0xD2,0x3C,0x5D,0x4A,0x00,0x8C,0xEF,0xE7,0xFF,0xF9,0x6A,
+0xF0,0xEC,0x08,0xD8,0xD4,0xEA,0xFD,0xAD,0xC0,0xE0,0x10,0x01,0x88,0xD1,0xF2,0xC7,
+0x00,0xE4,0x98,0xA1,0x98,0xE0,0xE4,0x00,0x00,0x29,0x40,0x90,0x3C,0x10,0x84,0x00,
+0x24,0x84,0x19,0x0C,0xA6,0x00,0x9C,0xE1,0x9C,0xC4,0x5C,0x87,0x00,0xD6,0xC4,0xFF,
+0x6D,0xC3,0xC0,0x10,0x01,0xC2,0xA0,0x10,0x01,0xFF,0xDE,0x08,0xD8,0xFE,0xB5,0x0C,
+0x0C,0x1D,0xE1,0x50,0x99,0x40,0x99,0x80,0x1E,0x81,0x38,0x1E,0x61,0x48,0x1E,0xE1,
+0x30,0x1F,0x01,0x40,0x9B,0x24,0x53,0x40,0xC8,0xCB,0x60,0x03,0x20,0xE4,0x00,0x04,
+0x3F,0x40,0xF1,0x54,0x0C,0xE7,0x02,0xD0,0xE0,0x04,0xEA,0x08,0x8F,0x00,0x0B,0x8F,
+0x02,0x40,0xC4,0xE5,0x5C,0xC6,0x06,0x4C,0xA6,0xFA,0x08,0xF5,0x0B,0x44,0xC5,0x36,
+0xCF,0xA7,0x00,0x05,0x40,0xC6,0x2D,0x50,0xA0,0x64,0x5C,0xC6,0x06,0xD4,0xDD,0x00,
+0xEC,0x4F,0xA7,0x10,0x98,0xA0,0xD7,0xA6,0x00,0xA4,0xCC,0xA7,0xFF,0xFC,0x8C,0xA6,
+0xCC,0xA5,0x00,0x64,0x40,0xA5,0x38,0x5C,0xA5,0x00,0x5F,0x84,0x1D,0x1F,0x81,0x58,
+0x4C,0xEC,0x08,0x48,0xC1,0x01,0x8C,0xC7,0x4C,0xC6,0x08,0x8C,0xDC,0x4B,0x80,0x0A,
+0x8C,0xFC,0x1F,0x81,0x58,0x4C,0xE7,0x08,0x8C,0xFC,0x09,0x07,0xD8,0x08,0x67,0xE8,
+0x8C,0x68,0x09,0x06,0xF0,0x0B,0xA6,0xE8,0x8C,0x68,0x09,0x06,0xE0,0x08,0xC6,0xD8,
+0x40,0x9A,0x2D,0x0B,0x87,0xE0,0x8F,0xA6,0x8C,0x68,0x08,0xC7,0xF0,0x40,0xA3,0x2B,
+0x40,0xFD,0x34,0x8C,0xFC,0x40,0xE7,0x23,0x8C,0xA7,0x40,0xA5,0xD8,0x0C,0xAB,0x00,
+0xE4,0x00,0x02,0xE9,0x40,0xF0,0x64,0x10,0xE7,0x00,0x20,0xE0,0x52,0x98,0x81,0x4F,
+0x8C,0x08,0x42,0x44,0x75,0x99,0xA0,0x43,0xB0,0x94,0xE4,0x00,0x00,0xFF,0x40,0xF4,
+0x54,0x08,0xC7,0x00,0x40,0xF3,0x54,0x08,0xE7,0x00,0x8C,0xE6,0x40,0xD7,0x54,0x08,
+0xC6,0x00,0x8C,0xE6,0x40,0xD8,0x54,0x08,0xC6,0x00,0xE4,0x00,0x02,0x57,0xCC,0xCD,
+0x00,0x1C,0x8C,0xDE,0x40,0xED,0xE4,0x08,0x66,0x16,0x4C,0xE7,0x08,0x40,0xD7,0x3C,
+0x41,0x18,0x3C,0x0C,0xC1,0x00,0x0E,0xE1,0x28,0x40,0xD3,0x3C,0x0F,0x01,0x24,0x0F,
+0x21,0x20,0x0F,0x41,0x18,0x0F,0x61,0x14,0x0F,0x81,0x10,0x0F,0xA1,0x0C,0x0F,0xC1,
+0x1C,0x0C,0x81,0x2E,0x88,0xAE,0x8C,0xF4,0xE7,0xFF,0xF6,0x72,0x9D,0xA1,0x0F,0xC1,
+0x1E,0x5D,0xAD,0x00,0x0F,0xA1,0x0E,0x0F,0x81,0x12,0x0F,0x61,0x16,0x0F,0x41,0x1A,
+0x0F,0x21,0x22,0x0F,0x01,0x26,0x0E,0xE1,0x2A,0x10,0xFD,0x00,0xD4,0xED,0xFD,0x15,
+0x4C,0xD2,0x10,0x40,0xB1,0x34,0x0C,0xA5,0x02,0xD0,0xA0,0x05,0x0A,0x1C,0xE1,0x58,
+0x8C,0xC7,0x08,0x86,0xF8,0x0B,0x86,0xFA,0x40,0xA4,0xE5,0x5C,0xA5,0x06,0x4C,0xC5,
+0xFA,0x08,0xF5,0x0B,0x44,0xA6,0x2E,0xCF,0xA7,0x00,0x05,0x40,0xA5,0x35,0x50,0xC0,
+0x64,0x5C,0xA5,0x06,0xD4,0xBD,0x00,0xEC,0x4F,0xA7,0x10,0x98,0xC0,0xD7,0xA5,0x00,
+0xA4,0xCC,0xC7,0xFF,0xFC,0x8C,0xC5,0xCC,0xC6,0x00,0x64,0x40,0xC6,0x38,0x5C,0xC6,
+0x00,0x5F,0x84,0x1D,0x48,0x80,0x0A,0x4D,0xCE,0x08,0x1F,0x81,0x58,0x48,0xE1,0x01,
+0x8C,0xEE,0x8D,0xC4,0x1C,0x81,0x58,0x4D,0xCE,0x08,0x8D,0xC4,0x08,0x6E,0xD8,0x4C,
+0xE7,0x08,0x0B,0xAE,0xE8,0x8C,0xFC,0x8F,0xA3,0x0B,0x87,0xE8,0x08,0x67,0xF0,0x40,
+0xBA,0x35,0x8F,0xA3,0x08,0x8E,0xE0,0x08,0x67,0xE0,0x08,0xE7,0xD8,0x8F,0xA3,0x8C,
+0xFC,0x40,0xDD,0x33,0x0B,0x8E,0xF0,0x8C,0xFC,0x8C,0xE4,0x40,0xE7,0x2B,0x8C,0xC7,
+0x40,0xC6,0xD8,0x0C,0xCB,0x00,0xE4,0x00,0x00,0x5D,0x20,0xE0,0x9C,0x1C,0xE1,0x58,
+0x4D,0xCE,0x10,0x8D,0xC7,0x08,0xAE,0xE0,0x08,0xEE,0xF0,0x08,0xCE,0xE8,0x8C,0xE5,
+0x08,0xAE,0xD8,0x8C,0xE5,0x8C,0xE6,0x40,0xE7,0xC8,0x0C,0xEB,0x00,0xE4,0x00,0x00,
+0x0F,0x0C,0x0B,0x00,0x9D,0x81,0x9D,0x64,0x9D,0x44,0x9D,0xE4,0x5D,0xCC,0x00,0xD6,
+0xCE,0xEF,0x15,0x0E,0xC1,0x5A,0x0E,0xA1,0x5E,0x0E,0x81,0x62,0x0E,0x61,0x66,0x0E,
+0x41,0x6A,0x0E,0x21,0x6E,0x0E,0x01,0x72,0x0D,0xE1,0x76,0x0D,0xC1,0x7A,0x0D,0xA1,
+0x7E,0xED,0x81,0x00,0x82,0xED,0x61,0x00,0x86,0xED,0x41,0x00,0x8A,0xED,0x21,0x00,
+0x8E,0xFC,0x21,0x00,0x90,0x85,0x29,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2,
+0xE7,0x0C,0x10,0xF3,0xA6,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xCF,0xBD,0x00,0x1C,0xFC,
+0xE7,0x08,0xDE,0xC0,0xA0,0x10,0x01,0x8F,0xA7,0xFC,0xA5,0x09,0x4C,0x8B,0x45,0xE4,
+0x00,0x01,0x37,0x1C,0x87,0x02,0x10,0xC7,0xFE,0x13,0xC7,0xFF,0x13,0x27,0x01,0x13,
+0x07,0x00,0x0F,0x64,0x02,0x23,0x64,0x5E,0x40,0x97,0xCB,0x8C,0x98,0x4C,0x84,0x10,
+0x8C,0x85,0x0C,0x84,0x02,0x43,0x97,0xCB,0xE4,0x00,0x00,0xD1,0x40,0x97,0xC4,0x4C,
+0x84,0x10,0x8C,0x85,0x0F,0x84,0x02,0x4C,0x98,0x10,0x8C,0x85,0x0C,0x84,0x02,0x8C,
+0x9C,0xE7,0xFF,0xFF,0xC9,0x23,0x64,0x5A,0x43,0x26,0xE4,0x4F,0x39,0x10,0x8F,0x25,
+0x0F,0x39,0x02,0xD7,0x24,0x01,0xA0,0xE4,0x00,0x00,0x55,0x4F,0x26,0x10,0x40,0x66,
+0xBC,0x8F,0x3A,0x4C,0x63,0x10,0x0F,0x39,0x02,0x8C,0x7A,0x0C,0x63,0x02,0x8C,0x79,
+0xD4,0x64,0x00,0xB8,0x40,0x86,0xE4,0x4C,0x84,0x10,0x8C,0x9A,0x0C,0x84,0x02,0x8F,
+0x24,0x8B,0x06,0xE4,0x00,0x00,0x0D,0x8B,0x24,0x9C,0xC1,0x88,0x99,0x5C,0xC6,0x00,
+0xD4,0xDE,0xFD,0xA8,0x1B,0x07,0x00,0x1C,0xE7,0x1C,0xD4,0xFD,0xFB,0x4E,0xE7,0xFF,
+0xF4,0x45,0xC0,0xE0,0x10,0x01,0xF3,0xC7,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xF3,0x07,
+0x0C,0x10,0xC0,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xEB,0xA7,0x05,0x0E,0xFC,0x84,
+0x09,0x4C,0xC0,0xE0,0x10,0x01,0x1F,0x98,0xFE,0xFC,0xE7,0x08,0xE0,0x98,0xA0,0x98,
+0x60,0x9B,0x61,0xE4,0x00,0x00,0xD3,0x0C,0xC7,0x02,0x20,0xC1,0x74,0x10,0xC7,0xFE,
+0x12,0xE7,0xFF,0x42,0xF8,0xBB,0x43,0x37,0x34,0x4F,0x39,0x10,0x8F,0x24,0x0F,0x39,
+0x02,0xC3,0x20,0x7C,0xEC,0x20,0x01,0x09,0x24,0xC4,0xFD,0xD7,0x86,0x01,0xE0,0x1F,
+0x46,0xFF,0x9C,0xC1,0x5C,0xC6,0x00,0x5F,0x5A,0x00,0x8F,0x57,0x8E,0xE6,0x4F,0x5A,
+0x10,0x4E,0xF7,0x10,0x8F,0x44,0x8E,0xE4,0x0F,0x5A,0x02,0x0C,0xD7,0x02,0x5C,0xDA,
+0x15,0x48,0xC6,0xD0,0x5C,0xC6,0x06,0x43,0x39,0x35,0xD7,0xB9,0x00,0x68,0x4C,0xDB,
+0x2C,0x44,0x63,0x35,0x5C,0x63,0x00,0x9C,0xA1,0x1C,0xE7,0x1C,0x5C,0xC5,0x00,0xD7,
+0xC6,0xFC,0xC5,0xE7,0xFF,0xB7,0x8B,0xFC,0x21,0xFF,0x60,0x98,0x60,0xED,0x21,0x00,
+0x9C,0xED,0x41,0x00,0x98,0x0E,0x21,0x7C,0xED,0x61,0x00,0x94,0xED,0x81,0x00,0x90,
+0xED,0xA1,0x00,0x8C,0xED,0xC1,0x00,0x88,0xED,0xE1,0x00,0x84,0xEE,0x01,0x00,0x80,
+0x0E,0x41,0x78,0x0E,0x61,0x74,0x0E,0x81,0x70,0x0E,0xA1,0x6C,0x0E,0xC1,0x68,0x0C,
+0x01,0x5C,0x0C,0x01,0x60,0x18,0x01,0x66,0x18,0x01,0x67,0x0C,0x01,0x54,0x0C,0x01,
+0x58,0xE7,0xFF,0xAF,0xBC,0x1C,0xA1,0x5C,0x98,0xC3,0x89,0x45,0x1C,0x61,0x66,0x1C,
+0x81,0x54,0xE7,0xFF,0xF5,0xC4,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2,0x27,
+0x00,0xE4,0xFC,0xC6,0x04,0xAC,0x4E,0x31,0x10,0x88,0xEA,0x8E,0x2A,0xE4,0x00,0x00,
+0x35,0x0C,0x87,0x02,0x08,0xA6,0x00,0x9C,0xC8,0x40,0xA4,0x2D,0x5C,0xBF,0xF9,0x48,
+0xA5,0x00,0x0C,0xA7,0x00,0x9C,0xE4,0xD4,0xF1,0xFF,0x56,0xC1,0xC0,0x10,0x01,0xC0,
+0xE0,0x10,0x01,0xC2,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0xC2,0xA0,0x10,0x01,0xFD,
+0xCE,0x0C,0x0C,0xFC,0xE7,0x04,0x90,0xFE,0xD6,0x07,0x24,0xFE,0x10,0x0B,0x14,0xFE,
+0xB5,0x09,0x4C,0x1D,0xA1,0x60,0x99,0x60,0x1E,0x81,0x66,0x9A,0x61,0x1D,0xE1,0x10,
+0x52,0x40,0x64,0xE4,0x00,0x01,0x65,0x40,0xD4,0x5C,0x88,0xAB,0x10,0xC6,0x00,0x20,
+0xC0,0x26,0x0C,0xCD,0x02,0x0C,0xCA,0x00,0x10,0xCE,0x04,0x9D,0x61,0x40,0xA5,0x33,
+0x41,0x8C,0x33,0x40,0xB3,0x2D,0x5D,0x8C,0x00,0x0C,0xA1,0x0C,0x40,0xCB,0x33,0xE4,
+0x00,0x00,0xEF,0x0C,0xC1,0x08,0x0C,0xE1,0x04,0xE7,0xFF,0xB6,0xCE,0x0E,0xE1,0x0E,
+0x40,0xAC,0xBC,0x4C,0xA5,0x08,0x8C,0xB6,0x08,0x65,0x00,0x08,0xAE,0x0B,0x40,0x63,
+0x2B,0x10,0xAE,0x14,0x98,0x81,0x40,0x63,0x28,0x88,0xAF,0x5C,0x63,0x06,0xE7,0xFF,
+0xE9,0xC8,0x4C,0xAC,0x10,0x1F,0x0C,0x01,0x9C,0xA2,0x0C,0x8A,0x02,0x8C,0xB0,0x40,
+0x83,0x23,0x0A,0xE5,0x01,0x40,0x84,0x90,0x5C,0x84,0x04,0x42,0xF7,0x25,0x0E,0xE5,
+0x01,0x0C,0xE1,0x06,0x4E,0xEC,0x10,0x0C,0xC1,0x0A,0x5D,0x98,0x00,0x43,0x17,0xAC,
+0x8E,0xF0,0x0B,0x37,0x01,0x40,0x99,0x25,0x5C,0x84,0x06,0x0C,0x97,0x01,0x08,0xA5,
+0x00,0x8C,0x85,0x0C,0x98,0x00,0x88,0x87,0x50,0xA0,0x3C,0x88,0x6F,0xD4,0xCC,0xFC,
+0x34,0x9D,0x44,0x9D,0xBC,0x5D,0x8B,0x00,0xD5,0x51,0xFA,0x7E,0x98,0x61,0xE7,0xFF,
+0xAD,0x42,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF2,0xE7,0x0C,0x10,0xC0,0xC0,
+0x10,0x01,0x4E,0xF7,0x08,0xFC,0xA5,0x09,0x9C,0xFC,0xC6,0x0B,0x14,0x98,0xE0,0xE4,
+0x00,0x00,0x41,0x0B,0x18,0x01,0x0F,0x04,0x01,0x1F,0x07,0x01,0x4C,0x87,0x10,0x5C,
+0xF8,0x00,0x9C,0x82,0x43,0x04,0x34,0x8C,0x85,0x0B,0x18,0x01,0x0F,0x04,0x01,0x4C,
+0x87,0x10,0x43,0x04,0x34,0x8C,0x85,0xD6,0xE7,0xFE,0xE4,0x0E,0xC1,0x6A,0x0E,0xA1,
+0x6E,0x0E,0x81,0x72,0x0E,0x61,0x76,0x0E,0x41,0x7A,0x0E,0x21,0x7E,0xEE,0x01,0x00,
+0x82,0xED,0xE1,0x00,0x86,0xED,0xC1,0x00,0x8A,0xED,0xA1,0x00,0x8E,0xED,0x81,0x00,
+0x92,0xED,0x61,0x00,0x96,0xED,0x41,0x00,0x9A,0xED,0x21,0x00,0x9E,0xFC,0x21,0x00,
+0xA0,0x85,0x29,0xFC,0x21,0xFF,0x58,0xC0,0x60,0x10,0x01,0xED,0xA1,0x00,0x94,0xEE,
+0x21,0x00,0x84,0xEE,0x41,0x00,0x80,0x0E,0x61,0x7C,0x0E,0x81,0x78,0x0E,0xA1,0x74,
+0x0E,0xC1,0x70,0xED,0x21,0x00,0xA4,0xED,0x41,0x00,0xA0,0xED,0x61,0x00,0x9C,0xED,
+0x81,0x00,0x98,0xED,0xC1,0x00,0x90,0xED,0xE1,0x00,0x8C,0xEE,0x01,0x00,0x88,0xC2,
+0x80,0x10,0x01,0xFC,0x63,0x0A,0x30,0xF0,0x94,0x0C,0x0C,0x98,0xA0,0xE4,0x00,0x38,
+0x4E,0xC0,0xE0,0x10,0x01,0xC2,0x40,0x10,0x01,0xE8,0xE7,0x04,0x8D,0x99,0xA0,0xC4,
+0xE7,0x02,0x00,0x1E,0x61,0x0C,0x5C,0xE0,0x09,0xFE,0x32,0x08,0xD8,0x48,0xC2,0x0B,
+0x1E,0xC1,0x6E,0x0C,0xC1,0x04,0x1E,0xA1,0x6C,0xE7,0xFF,0xFA,0xFC,0xE7,0xFF,0xF8,
+0x14,0xC0,0xC0,0x10,0x01,0xE8,0xE6,0x04,0x8D,0x54,0xE7,0x08,0x20,0xE0,0x1C,0xE7,
+0xFF,0xF9,0x86,0x88,0x73,0xF0,0x94,0x0C,0x0C,0x98,0xA0,0x99,0x60,0xE4,0x00,0x37,
+0xAE,0x99,0x40,0xE4,0x00,0x01,0x25,0xCD,0x8A,0x00,0x1C,0xC0,0xC0,0x10,0x01,0x40,
+0x71,0x64,0xE8,0xE6,0x04,0x89,0x8D,0x91,0x1C,0x63,0x16,0x12,0x0C,0x04,0x11,0xEC,
+0x05,0x54,0xE7,0x02,0x88,0x90,0x88,0xAF,0x11,0xCC,0x07,0x20,0xE1,0x04,0x88,0xCE,
+0x88,0x76,0x98,0xE2,0x99,0x01,0xE7,0xFF,0xB5,0xA0,0x20,0x60,0xFC,0x88,0x90,0x88,
+0xAF,0x88,0xCE,0x88,0x75,0x98,0xE2,0x99,0x01,0xE7,0xFF,0xB7,0x24,0x20,0x60,0xB0,
+0x08,0xC1,0x6C,0xCC,0xC6,0x00,0x03,0x08,0xE1,0x6E,0xCC,0xE7,0x00,0x07,0x8C,0xE6,
+0x98,0xCA,0x40,0xE7,0x30,0x0C,0xEC,0x17,0xE4,0x00,0x00,0x39,0x88,0xCE,0x98,0xE2,
+0x99,0x01,0xE7,0xFF,0xB5,0x28,0x20,0x60,0x3A,0x98,0xE1,0x4C,0xE7,0x54,0x45,0x6B,
+0x3D,0x5D,0x6B,0x00,0x88,0x73,0xF0,0x94,0x0C,0x0C,0x98,0xA1,0x9D,0x41,0xE4,0x00,
+0x36,0x8C,0x5D,0x4A,0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFB,0x75,0x88,0x6B,0xE7,
+0xFF,0xB0,0xF2,0x9D,0xA1,0x0C,0xE1,0x06,0x5D,0xAD,0x00,0xD4,0xED,0xF9,0x75,0xC0,
+0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0x63,0x0A,0x30,0x98,
+0xA1,0xE4,0x00,0x36,0x26,0xED,0x21,0x00,0xA6,0x0E,0xC1,0x72,0x0E,0xA1,0x76,0x0E,
+0x81,0x7A,0x0E,0x61,0x7E,0xEE,0x41,0x00,0x82,0xEE,0x21,0x00,0x86,0xEE,0x01,0x00,
+0x8A,0xED,0xE1,0x00,0x8E,0xED,0xC1,0x00,0x92,0xED,0xA1,0x00,0x96,0xED,0x81,0x00,
+0x9A,0xED,0x61,0x00,0x9E,0xED,0x41,0x00,0xA2,0xFC,0x21,0x00,0xA8,0x85,0x29,0x1C,
+0x21,0xE8,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0x21,0x14,0x89,0x66,
+0x89,0x83,0xC0,0xC0,0x10,0x01,0x89,0x45,0xE8,0xC6,0x04,0x89,0x54,0xC6,0x04,0x20,
+0xC0,0x54,0x88,0x64,0x88,0xC7,0x88,0x85,0x0C,0xE1,0x04,0x88,0xAB,0xE7,0xFF,0xBD,
+0x60,0x0C,0xE1,0x06,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0x40,0xC7,0x33,0x5C,
+0xC6,0x00,0xC0,0x80,0x10,0x01,0x8D,0x66,0x8D,0x46,0x5D,0x6B,0x00,0x5D,0x4A,0x00,
+0xFC,0x84,0x0B,0x14,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x00,0x3D,0x4E,0xEA,0x10,0x8E,
+0xE4,0x0A,0xF7,0x02,0x1F,0x0A,0x01,0x8C,0xD7,0x4E,0xEA,0x10,0x5D,0x58,0x00,0x8E,
+0xE4,0x0A,0xF7,0x00,0x8C,0xB7,0xD5,0x4B,0xFF,0x30,0x24,0xC0,0x18,0x24,0xA0,0x26,
+0x98,0x60,0xE4,0x00,0x00,0x7F,0x4C,0x65,0x40,0x9C,0xE4,0x40,0x63,0x30,0x4C,0xE7,
+0x10,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x04,0x90,0x8C,0xE6,0x08,0x87,0x04,0x08,0xE7,
+0x06,0xFC,0x63,0xFF,0x00,0x40,0x63,0x3B,0x98,0xEA,0x4C,0x84,0x40,0x40,0x63,0x38,
+0x50,0xC0,0x64,0x40,0xE4,0x30,0x8C,0x67,0x0C,0x6C,0x00,0x5C,0x60,0x01,0x48,0x63,
+0x0A,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,
+0x85,0x29,0x1C,0x21,0xB0,0x98,0x60,0x0D,0x21,0x4C,0x0D,0x41,0x48,0x0D,0x61,0x44,
+0x0D,0x81,0x40,0x0D,0xA1,0x3C,0x0D,0xC1,0x38,0x0D,0xE1,0x34,0x0E,0x01,0x30,0x0E,
+0x21,0x2C,0x0E,0x41,0x28,0x0E,0x61,0x24,0x0E,0x81,0x20,0x0E,0xA1,0x1C,0x0C,0x01,
+0x08,0x0C,0x01,0x0C,0x18,0x01,0x16,0x18,0x01,0x17,0x0C,0x01,0x00,0x0C,0x01,0x04,
+0xE7,0xFF,0xA6,0xDE,0x1D,0x41,0x08,0x98,0xC4,0x88,0xAA,0x1C,0x61,0x16,0x88,0x81,
+0xE7,0xFF,0xEC,0xE8,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x04,0xB0,
+0xF0,0xA6,0x00,0xE4,0x4C,0xA5,0x10,0x8C,0xAA,0xE4,0x00,0x00,0x3B,0x0C,0xCA,0x02,
+0x0C,0xC7,0x00,0x08,0x87,0xFC,0x9C,0xE8,0x40,0xC6,0x25,0x5C,0xDF,0xF9,0x48,0xC6,
+0x00,0x0C,0xCA,0x00,0x9D,0x44,0xD5,0x45,0xFF,0x3E,0x98,0x61,0xC2,0x40,0x10,0x01,
+0xC2,0xA0,0x10,0x01,0xE7,0xFF,0xA6,0x36,0xFE,0xB5,0x0A,0x30,0x99,0x60,0x99,0x40,
+0xFD,0xB2,0x08,0xD8,0x1E,0x81,0x10,0x9A,0x21,0xC2,0x60,0x10,0x01,0xE4,0x00,0x00,
+0xF9,0xCD,0xCA,0x00,0x1C,0x40,0xEE,0x6C,0x88,0x74,0x12,0x07,0x04,0x11,0xE7,0x05,
+0x08,0x87,0x16,0x11,0x87,0x07,0x88,0xB0,0x88,0xCF,0x88,0xEC,0xE7,0xFF,0xFC,0xC6,
+0x20,0x60,0xFC,0x98,0x60,0xE7,0xFF,0xA5,0xB4,0x1E,0xE1,0x18,0x88,0xB0,0x88,0xCF,
+0x88,0xEC,0x0C,0x61,0x12,0x4C,0x8C,0x10,0x8C,0x97,0x0C,0x84,0xF2,0xE7,0xFF,0xE8,
+0xE2,0x98,0x61,0xE7,0xFF,0xA5,0x78,0x40,0x8D,0x74,0x40,0x6D,0x74,0x88,0xB0,0x88,
+0xCF,0x9C,0x8C,0x88,0xEC,0x1C,0x63,0x18,0xE7,0xFF,0xA8,0x34,0x20,0x60,0x32,0x4C,
+0xF1,0x54,0x45,0x6B,0x3D,0x5D,0x6B,0x00,0x88,0x75,0xF0,0x93,0x0C,0x0C,0x98,0xA1,
+0x9D,0x41,0xE4,0x00,0x31,0xC4,0x5D,0x4A,0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFC,
+0x25,0x88,0x6B,0xE7,0xFF,0xAC,0x2A,0x0D,0x21,0x4E,0x0E,0xA1,0x1E,0x0E,0x81,0x22,
+0x0E,0x61,0x26,0x0E,0x41,0x2A,0x0E,0x21,0x2E,0x0E,0x01,0x32,0x0D,0xE1,0x36,0x0D,
+0xC1,0x3A,0x0D,0xA1,0x3E,0x0D,0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x1C,0x21,
+0x50,0x85,0x29,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xEE,0xCC,0x84,0x00,0x0A,0x8C,
+0x87,0x08,0xE4,0x06,0x40,0xE3,0x3B,0x14,0x64,0x08,0x4C,0x63,0x50,0xFC,0x63,0x02,
+0x00,0x8C,0x67,0x4C,0x63,0x52,0x85,0x29,0xD0,0xA3,0x07,0x05,0xD0,0x7F,0x06,0xE0,
+0x9B,0x43,0xC0,0xE0,0x10,0x01,0x43,0x5A,0x2D,0xF3,0x27,0x00,0xF2,0x4F,0x5A,0x08,
+0x9B,0x00,0x5F,0x5A,0x00,0x8A,0xF9,0x98,0xC0,0xE4,0x00,0x00,0x27,0x8F,0x17,0x9C,
+0xC1,0x9E,0xE2,0x5F,0x18,0x00,0x5C,0xC6,0x00,0x5E,0xF7,0x00,0xD4,0xA6,0xFF,0x8D,
+0x9F,0x3F,0xC0,0xE0,0x10,0x01,0x4C,0xA5,0x08,0x8C,0xB9,0xEF,0x27,0x00,0xF6,0x98,
+0xE0,0xE4,0x00,0x01,0x27,0x40,0xC7,0xD4,0x1F,0x67,0x01,0x1F,0x86,0x01,0x4C,0xC6,
+0x08,0x4F,0x9C,0x08,0x8C,0xD9,0x8F,0x99,0x0A,0xE6,0x00,0xD4,0x77,0x03,0xB4,0x08,
+0xDC,0x00,0xD4,0xC3,0x03,0x7C,0x8C,0xF8,0xC3,0x00,0x10,0x01,0xEF,0x38,0x00,0xFA,
+0x1C,0xA7,0x01,0xCC,0xE7,0x00,0x06,0xCC,0xA5,0x00,0x06,0x8C,0xF9,0x8C,0xB9,0x17,
+0x87,0x00,0x0B,0x45,0x04,0x0B,0x27,0x04,0x17,0x65,0x00,0x0B,0x07,0x02,0x0B,0xA5,
+0x02,0xD6,0xE6,0x02,0x3A,0x40,0xF7,0x35,0x42,0xF7,0x1D,0x40,0xC3,0x35,0x43,0x77,
+0xDB,0x40,0xA6,0xE3,0x8C,0xBB,0x40,0xA5,0x23,0x43,0x57,0xD3,0x43,0x26,0xCB,0x42,
+0xF7,0xEB,0x40,0x7A,0xCC,0x40,0xC6,0xC3,0x8C,0xD7,0x8C,0xC5,0x94,0xA1,0x40,0x86,
+0x23,0xC8,0xA5,0x86,0xA0,0x40,0x84,0x28,0x8C,0x64,0x40,0x63,0x38,0xE4,0x00,0x00,
+0x1B,0x5C,0xFB,0x00,0xD4,0xA7,0xFB,0x8C,0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,
+0xF8,0x77,0x00,0xE5,0xC2,0xE0,0x10,0x01,0xF8,0x97,0x00,0xF2,0xC0,0x80,0x10,0x01,
+0xEC,0xA4,0x00,0xF1,0xC0,0xA0,0x10,0x01,0xEC,0xC5,0x00,0xE8,0xC0,0xC0,0x10,0x01,
+0xEC,0xE6,0x00,0xEC,0xC0,0xE0,0x10,0x01,0x0C,0xC1,0x02,0xED,0x07,0x00,0xF8,0xC0,
+0xE0,0x10,0x01,0xEC,0xC7,0x00,0xF4,0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0x0D,
+0x61,0x3C,0x0D,0xC1,0x30,0x89,0x45,0x0C,0x81,0x0C,0x0C,0xC1,0x08,0x0C,0xE1,0x04,
+0x0D,0x21,0x44,0x0D,0x81,0x38,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E,
+0x21,0x24,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1,0x14,0x0E,0xC1,
+0x10,0xE7,0xFF,0xA6,0x18,0x0C,0xE1,0x06,0x0C,0x81,0x0E,0x5C,0x87,0x15,0xC8,0xA0,
+0x07,0xFF,0x49,0x67,0x20,0x89,0xC3,0x40,0x85,0x3D,0x0C,0xC1,0x0A,0x40,0xA5,0x5D,
+0x5C,0xE5,0x1D,0x49,0x64,0x58,0x20,0xC4,0x8A,0xC0,0xE0,0x10,0x01,0x88,0x6B,0xF0,
+0x87,0x00,0xE5,0x9C,0x9F,0x5C,0x84,0x00,0xE7,0xFF,0xFC,0x96,0x5C,0xE3,0x06,0x5D,
+0xC7,0x15,0x48,0x63,0x70,0x5D,0xC3,0x06,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,
+0xC2,0xAF,0xFF,0xE1,0xEE,0x86,0x00,0xEA,0xE8,0xE7,0x00,0xF0,0xCA,0xB5,0xFF,0xFF,
+0x8A,0x54,0x9A,0x20,0x52,0x00,0xFF,0x99,0xA0,0xC2,0xC0,0x10,0x01,0xE4,0x00,0x01,
+0x21,0x10,0x85,0x00,0x9C,0xC1,0x8D,0xE4,0x5C,0xC6,0x00,0x9C,0xA1,0x5D,0xEF,0x00,
+0xD5,0xA6,0xFF,0x8D,0x99,0x80,0xE4,0x00,0x00,0xCB,0x40,0x8C,0x7C,0xEC,0xB6,0x00,
+0xEE,0x1E,0xE4,0x01,0xCC,0x84,0x00,0x0A,0xCE,0xF7,0x00,0x0A,0x8E,0xE5,0x8C,0xA4,
+0x9C,0xDF,0x08,0x85,0x00,0x88,0xA7,0xD5,0x86,0x00,0x3A,0x08,0xB7,0x00,0xD5,0x65,
+0x01,0xA4,0xD4,0x8B,0x01,0x84,0x0C,0xE1,0x04,0x42,0x6C,0x7C,0x88,0x6B,0x5E,0x73,
+0x00,0x88,0x93,0xE7,0xFF,0xFB,0x80,0x0C,0xE1,0x06,0x40,0xC3,0x75,0x40,0x6E,0x1D,
+0x5C,0x7F,0xF1,0x48,0x66,0x18,0xD6,0xA3,0x00,0x60,0x8A,0xA3,0x8A,0x0D,0xE4,0x00,
+0x00,0x0D,0x8A,0x71,0x9D,0x81,0x8A,0x33,0x5D,0x8C,0x00,0x10,0xD2,0x00,0xD4,0xCC,
+0xFC,0xE5,0x9D,0xA1,0x9E,0x41,0x5D,0xAD,0x00,0xD1,0xA4,0x00,0x72,0x88,0xB4,0x99,
+0xE0,0x98,0xC0,0xE7,0xFF,0xFE,0xFB,0xC2,0x00,0x1F,0xE4,0x88,0x6B,0x20,0x00,0x9B,
+0xCE,0x31,0x00,0x0A,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xEE,0x8E,0x27,0x08,0x71,
+0x02,0x41,0x6B,0x1B,0x08,0x71,0x04,0x4C,0x63,0x50,0xFC,0x63,0x02,0x00,0x8C,0x6B,
+0x4C,0x63,0x52,0x1A,0x0A,0x00,0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,
+0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,
+0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,
+0x1C,0x21,0x48,0x85,0x29,0x1C,0x21,0xE8,0x98,0xFF,0x0D,0x41,0x10,0x0D,0x61,0x0C,
+0x18,0xE1,0x07,0x0D,0x21,0x14,0x0D,0x81,0x08,0x89,0x44,0x88,0xE6,0x89,0x63,0xCA,
+0xE0,0x07,0xFF,0x88,0x65,0x0C,0x84,0x02,0x08,0xA6,0x00,0x98,0xC1,0x42,0xF7,0x2D,
+0xD4,0x97,0x00,0x54,0x5C,0xA4,0x15,0x48,0xC0,0x0A,0x0C,0x8B,0x02,0x08,0xA7,0x06,
+0xD4,0x85,0x01,0x1C,0x08,0xE7,0x02,0x1C,0xA1,0x07,0xE7,0xFF,0xFC,0x3E,0x0C,0x6B,
+0x00,0x0D,0x6A,0x02,0x10,0xA1,0x07,0x88,0x8B,0xE7,0xFF,0xF9,0xDE,0x8C,0x6B,0xE4,
+0x00,0x00,0x63,0xC9,0x80,0x07,0xFF,0x40,0xAC,0x2D,0xD4,0xA4,0x01,0x4C,0x40,0x8C,
+0x25,0x08,0xE7,0x02,0x1C,0xA1,0x07,0xE7,0xFF,0xFB,0xE4,0x41,0x8C,0x1D,0x0D,0x8B,
+0x00,0x0D,0x6A,0x02,0x10,0xA1,0x07,0x88,0x8B,0xE7,0xFF,0xF9,0x7E,0x40,0x6B,0x1D,
+0x0C,0x6A,0x00,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,
+0x21,0x18,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,
+0x81,0x00,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xA2,0x20,0xC0,0x92,0x98,0xC1,0xEC,
+0xC7,0x06,0xA0,0xC0,0xE0,0x10,0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,
+0x0D,0x21,0x0E,0xEC,0x07,0x06,0x84,0x1C,0x21,0x10,0xE4,0x00,0x25,0x97,0xEC,0xE7,
+0x06,0xA2,0xD0,0xE1,0x0A,0xF6,0xC1,0x40,0x10,0x01,0xEC,0xEA,0x06,0x86,0x20,0xE0,
+0xE2,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0x80,0x01,0x00,0x44,0xC6,0x24,
+0xD0,0xC0,0x0A,0x02,0xE8,0xC7,0x06,0x89,0xC8,0xA0,0xFE,0xFF,0x44,0xC6,0x2C,0x0D,
+0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0xEC,0xC7,0x06,0x89,0x1C,
+0x21,0x10,0xE4,0x00,0x55,0x41,0xEC,0xEA,0x06,0x86,0x20,0xE5,0x3E,0xC0,0xF4,0x00,
+0x01,0xFC,0x80,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C,
+0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x24,0x28,0x08,0xA6,0x01,0x50,0xA5,0x01,0x0C,
+0xA6,0x01,0xC8,0xE7,0x7A,0x10,0xFC,0xA0,0xFE,0xFF,0x0C,0xC7,0x02,0x44,0xC6,0x2C,
+0x0C,0xC7,0x00,0x1C,0x80,0xEF,0x0C,0xC7,0x02,0x44,0xC6,0x24,0x0C,0xC7,0x00,0x98,
+0xE2,0xEC,0xEA,0x06,0x84,0xE4,0x00,0x01,0x97,0xED,0x6A,0x06,0x86,0xD1,0x62,0x06,
+0x1E,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0xA0,0x01,0x00,0x44,0xC6,0x2C,
+0xD0,0xC0,0x05,0x82,0xE8,0xC7,0x06,0x89,0x54,0xC6,0x10,0xD0,0xC0,0x05,0x2A,0xE8,
+0xC7,0x06,0x89,0xC8,0x80,0xFF,0xEF,0x44,0xC6,0x24,0xC8,0xA0,0xFE,0xFF,0xEC,0xC7,
+0x06,0x89,0xE8,0xC7,0x06,0x89,0x44,0xC6,0x2C,0xEC,0xC7,0x06,0x89,0xE4,0x00,0x52,
+0xD2,0x98,0x60,0xE4,0x00,0x1A,0xD6,0x20,0x61,0xE6,0xC1,0x94,0x00,0x01,0xC8,0xEC,
+0x26,0x18,0xFC,0x80,0x80,0x00,0x08,0xC7,0x01,0x44,0xC6,0x25,0x5C,0xC6,0x04,0x0C,
+0xC7,0x01,0xC8,0xEC,0x24,0x28,0xFC,0xA0,0xFE,0xFF,0x08,0xC7,0x01,0xC9,0x8C,0x7A,
+0x10,0x50,0xC6,0x01,0x0C,0xC7,0x01,0x0C,0xEC,0x02,0x44,0xE7,0x2C,0x0C,0xEC,0x00,
+0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xEE,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xF8,
+0xE4,0x00,0x74,0xB2,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x80,0x20,
+0xE0,0x44,0xEC,0x0A,0x06,0x84,0x0C,0xEC,0x02,0x50,0xE7,0x10,0xE4,0x00,0x00,0x23,
+0xED,0x6A,0x06,0x84,0x1C,0xC0,0xEF,0x0C,0xEC,0x02,0x44,0xE7,0x34,0x0C,0xEC,0x00,
+0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,
+0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0xC1,0x54,0x00,0x01,0x0D,0x81,0x00,
+0xC1,0x60,0x10,0x01,0xC9,0x8A,0x79,0xC0,0x0D,0x21,0x0C,0xEC,0x0B,0x06,0x80,0xC9,
+0x4A,0x78,0xCC,0x08,0xEA,0x01,0x50,0xE7,0x02,0x0C,0xEA,0x01,0xE7,0xFF,0xFC,0x50,
+0xEC,0xEB,0x06,0x82,0x1C,0xC7,0x01,0x5C,0xE7,0x04,0xEC,0xCB,0x06,0x80,0x0C,0xEC,
+0x01,0xE7,0xFF,0xFF,0xC5,0x1C,0x21,0xD8,0x0D,0x21,0x24,0x0D,0x41,0x20,0xC1,0x54,
+0x00,0x01,0xC8,0xEA,0x36,0x00,0x10,0xC7,0x00,0x54,0xC6,0xFD,0x18,0xC7,0x00,0x98,
+0xE1,0x0C,0xE1,0x14,0x0C,0xE1,0x04,0x98,0xEA,0x0C,0xE1,0x18,0xC0,0xE0,0x10,0x01,
+0xEC,0xC7,0x00,0x02,0x94,0xEF,0xC8,0xE7,0x42,0x40,0x40,0xE6,0x39,0x88,0xC7,0x0C,
+0xE1,0x1C,0x98,0xE2,0x0C,0xE1,0x00,0xC8,0xE0,0x05,0x50,0x0C,0xE1,0x08,0xC8,0xE0,
+0x79,0xD4,0x0C,0xE1,0x0C,0x50,0xE0,0xD0,0x98,0x80,0x98,0xAA,0x0C,0xE1,0x10,0x88,
+0x61,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0x76,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC0,
+0x60,0x10,0x01,0xEC,0xE7,0x00,0x7A,0xFC,0x63,0x05,0x50,0x84,0xE8,0x98,0x60,0xC0,
+0xE0,0x10,0x01,0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06,
+0xA5,0x50,0xC6,0x02,0xEC,0xC7,0x06,0xA5,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0x89,
+0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0x7F,0xEC,0x07,0x06,0xA5,0xC0,0xE0,0x10,0x01,
+0xEC,0x07,0x06,0xA0,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x84,0xC8,0xEA,0x3C,0xD4,
+0x08,0xC7,0x01,0xC8,0xC6,0x04,0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x3C,0xE0,0x08,0xC7,
+0x01,0xC8,0xC6,0x04,0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x78,0xC0,0xFC,0xC0,0x55,0xAA,
+0x0C,0xC7,0x01,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0xD8,0xEC,
+0xC7,0x06,0x9C,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8D,0xC0,0xE0,0x10,0x01,0xEC,
+0x07,0x06,0x99,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0x58,0xEC,
+0xC7,0x06,0x94,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0,0xE0,0x10,0x01,0xEC,
+0x07,0x06,0x7D,0xFC,0xE0,0x03,0xE8,0xC9,0x4A,0x79,0xE0,0x0C,0xEA,0x01,0xE7,0xFF,
+0xFD,0x26,0x0D,0x21,0x26,0x0D,0x41,0x22,0x1C,0x21,0x28,0x85,0x29,0xC0,0xF4,0x00,
+0x01,0xC8,0xC7,0x74,0xD8,0x18,0x06,0x00,0xC8,0xA7,0x74,0x10,0x18,0x65,0x00,0xC8,
+0xA7,0x76,0x30,0x18,0x05,0x00,0x50,0x80,0x24,0xC8,0xA7,0x74,0x00,0x18,0x85,0x00,
+0xCA,0xE7,0x74,0x28,0x50,0xA0,0x60,0x18,0xB7,0x00,0xCA,0xE7,0x74,0x30,0x18,0xB7,
+0x00,0xCA,0xE7,0x74,0x38,0x18,0xB7,0x00,0xCA,0xE7,0x74,0x40,0x18,0xB7,0x00,0xC8,
+0xA7,0x74,0xA8,0x10,0xA5,0x00,0xC8,0xA7,0x74,0x78,0x52,0xE0,0x15,0x1A,0xE5,0x00,
+0xC8,0xA7,0x74,0x70,0x9A,0xE2,0x1A,0xE5,0x00,0xC8,0xE7,0x74,0x60,0x18,0x87,0x00,
+0x98,0x61,0x10,0xE6,0x00,0x50,0xE7,0x01,0x18,0xE6,0x00,0x85,0x29,0x85,0x29,0x85,
+0x29,0x98,0xEA,0x1C,0x21,0xD8,0x0C,0xE1,0x18,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,
+0x02,0x94,0xCF,0xC8,0xC6,0x42,0x40,0x40,0xC7,0x31,0x98,0xE2,0x0C,0xE1,0x00,0xC8,
+0xE0,0x01,0x00,0xC8,0xA0,0xFF,0xFF,0x0C,0xE1,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,
+0x00,0xFE,0x44,0xE7,0x2C,0xFC,0xE7,0x79,0x04,0x0C,0xE1,0x0C,0xC8,0xE0,0x11,0x00,
+0x0C,0xE1,0x10,0x98,0xE1,0x0D,0x21,0x24,0x0C,0xE1,0x14,0x0C,0x01,0x04,0x0C,0xC1,
+0x1C,0x88,0x61,0xC0,0xE0,0x10,0x01,0x98,0x81,0xEC,0xE7,0x00,0x76,0x98,0xAA,0x84,
+0xE8,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x98,0xEA,0x1C,0x21,0xD8,0x0C,0xE1,
+0x18,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0x02,0x94,0xCF,0xC8,0xC6,0x42,0x40,0x40,
+0xC7,0x31,0x98,0xE2,0x0C,0xE1,0x00,0x50,0xE0,0x42,0xC8,0xA0,0xFF,0xFF,0x0C,0xE1,
+0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x01,0xFE,0x44,0xE7,0x2C,0xFC,0xE7,0x79,0x04,
+0x0C,0xE1,0x0C,0xC8,0xE0,0x12,0x00,0x0C,0xE1,0x10,0x98,0xE1,0x0D,0x21,0x24,0x0C,
+0xC1,0x1C,0x0C,0xE1,0x14,0x0C,0x01,0x04,0x88,0x61,0x98,0xAA,0xC0,0xE0,0x10,0x01,
+0x98,0x81,0xEC,0xE7,0x00,0x76,0x84,0xE8,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10,0xC8,
+0xC7,0x25,0xC0,0x0C,0xA6,0x01,0xC8,0xE7,0x22,0x00,0x0C,0x07,0x01,0x0D,0x21,0x26,
+0x1C,0x21,0x28,0x85,0x29,0x9C,0x38,0x98,0xE0,0x88,0xA1,0x98,0xC0,0x54,0x87,0x03,
+0x4C,0x84,0x08,0x8C,0x83,0x0A,0xE4,0x01,0x5F,0x07,0x00,0x9C,0xE1,0x54,0x87,0x03,
+0x4C,0x84,0x08,0x8C,0x83,0x08,0x84,0x01,0x40,0x97,0x25,0x5C,0x84,0x06,0x4E,0xE4,
+0xFA,0x44,0x97,0x26,0x40,0x84,0xBD,0x5C,0x84,0x06,0x0C,0x85,0x01,0x4E,0xE6,0x08,
+0x1F,0x21,0x08,0x9C,0xA2,0x8E,0xF9,0x0A,0xF7,0xF8,0x5E,0xE4,0x15,0x48,0xC6,0xC0,
+0xD0,0xE4,0xFD,0xEE,0x88,0x66,0x9C,0x28,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xF4,0x00,
+0x01,0x0D,0x41,0x24,0x0D,0x61,0x20,0x0D,0x81,0x1C,0x0D,0xA1,0x18,0x0D,0xC1,0x14,
+0x0D,0xE1,0x10,0x0E,0x01,0x0C,0x0E,0x21,0x08,0xCA,0xF7,0x24,0x14,0x1C,0xA1,0x04,
+0x98,0xC0,0x99,0x40,0x08,0xF7,0x01,0x4C,0xE7,0x36,0x54,0xE7,0x0F,0x18,0xE5,0x00,
+0x8D,0x47,0x9C,0xC4,0x5D,0x4A,0x00,0x9C,0xA1,0x5C,0xC2,0x09,0xC0,0xF4,0x00,0x01,
+0x23,0xFF,0x91,0xC8,0xC7,0x7A,0x10,0xFE,0xE0,0xFE,0xFF,0x0C,0xA6,0x02,0x44,0xA5,
+0xBC,0x0C,0xA6,0x00,0xFE,0xE0,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08,0xA6,0x01,0x44,
+0xA5,0xBD,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x7A,0x30,0xC8,0xE7,0x24,0x28,
+0x08,0xA7,0x01,0x50,0xA5,0x01,0x0C,0xA7,0x01,0xC8,0xE0,0x01,0x00,0x08,0xA6,0x01,
+0x44,0xA5,0x3C,0xC0,0xF4,0x00,0x01,0x20,0xA3,0xC8,0x0C,0xA6,0x02,0xCB,0x27,0x26,
+0x00,0xC8,0xA5,0x01,0x00,0xC8,0xE7,0x7A,0x10,0x0C,0xA6,0x00,0x0C,0xC7,0x02,0xC8,
+0xC6,0x01,0x00,0x0C,0xC7,0x00,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0x78,0x10,0xC1,
+0x05,0x51,0x00,0x30,0x41,0x04,0x43,0x8D,0x07,0x10,0xE1,0x06,0x13,0x01,0x04,0xC2,
+0x00,0x10,0x01,0x41,0x66,0xC4,0x42,0xE0,0xC5,0xC3,0xA0,0x10,0x01,0x42,0xF7,0x35,
+0xC3,0x80,0x10,0x01,0x5E,0xF7,0x00,0xC1,0xE0,0x10,0x01,0x43,0xD7,0x3D,0xC1,0xC0,
+0x10,0x01,0x41,0xAB,0x3C,0x5F,0xDE,0x00,0xFE,0x10,0x02,0x54,0xFF,0xBD,0x09,0xE4,
+0xFF,0x9C,0x0B,0xE2,0xFD,0xEF,0x02,0x40,0xFD,0xCE,0x02,0xC2,0x50,0xC0,0x20,0x98,
+0xE0,0x53,0x60,0xFF,0xE4,0x00,0x01,0x73,0x20,0x60,0x4A,0x4C,0xA6,0x10,0x8C,0xB9,
+0x08,0xA5,0x01,0x0C,0xA8,0x01,0xE4,0x00,0x01,0x29,0x88,0xBA,0xD7,0x1A,0x00,0xA5,
+0x40,0xBA,0xC5,0x5C,0xA5,0x00,0xD5,0x67,0x00,0x54,0x5D,0xA7,0x15,0x48,0xBE,0xB8,
+0x20,0x81,0x36,0x43,0x47,0x7C,0x4D,0x86,0x10,0x13,0x5A,0x00,0x5F,0x42,0x33,0x20,
+0x00,0x91,0x8D,0x99,0x8C,0xBC,0x0A,0x2C,0x01,0x8F,0x4E,0x5E,0x31,0x06,0x13,0x5A,
+0xEE,0x42,0x31,0xDB,0x4F,0x5A,0x08,0x11,0x85,0x00,0x8F,0x5D,0x40,0xB1,0x60,0xE4,
+0x00,0x00,0x91,0x8D,0x99,0x4F,0x5A,0x08,0x0A,0x2C,0x01,0x8F,0x5D,0x41,0x9C,0x2C,
+0x5E,0x31,0x06,0x11,0x8C,0x00,0x40,0xB1,0xDB,0xE4,0x00,0x00,0x57,0x20,0x84,0xB6,
+0x43,0x47,0x84,0x13,0x5A,0x00,0x5F,0x42,0x3B,0x20,0x00,0x85,0x8C,0xBC,0x1F,0x5A,
+0x12,0x11,0x85,0x00,0x4F,0x5A,0x08,0x4C,0xA6,0x10,0x8F,0x5D,0x8C,0xB9,0x08,0xA5,
+0x00,0x40,0xA5,0xDB,0x40,0xA5,0x60,0x0C,0xBA,0x01,0x9C,0xC1,0x9E,0xE1,0x9F,0xC1,
+0x9C,0xE1,0x5C,0xC6,0x00,0x9D,0x02,0x5E,0xF7,0x00,0x5F,0xDE,0x00,0x5F,0x47,0x00,
+0xD5,0x5A,0xFA,0x45,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0xFE,0xFF,0xC8,0xE7,0x7A,0x10,
+0x0C,0xC7,0x02,0x44,0xC6,0xBC,0x0C,0xC7,0x00,0x0E,0x21,0x0A,0x0E,0x01,0x0E,0x0D,
+0xE1,0x12,0x0D,0xC1,0x16,0x0D,0xA1,0x1A,0x0D,0x81,0x1E,0x0D,0x61,0x22,0x0D,0x41,
+0x26,0x1C,0x21,0x28,0x85,0x29,0x20,0x60,0xD6,0xC0,0xC0,0x10,0x01,0xC0,0xF4,0x00,
+0x01,0xFC,0xC6,0x08,0x18,0xC8,0xE7,0x23,0x08,0x08,0xA6,0x01,0x0C,0xA7,0x01,0x08,
+0xA6,0x19,0x0C,0xA7,0x61,0x9C,0xC2,0x9C,0xE4,0xC0,0xB4,0x00,0x01,0xC8,0xA5,0x23,
+0x38,0x5C,0xE5,0x0D,0x23,0xFF,0x95,0xE4,0x00,0x00,0x6B,0x20,0x64,0xC6,0xC0,0xC0,
+0x10,0x01,0xC0,0xF4,0x00,0x01,0xFC,0xC6,0x07,0xE8,0xC8,0xE7,0x23,0x08,0x08,0xA6,
+0x01,0x0C,0xA7,0x01,0x08,0xA6,0x19,0x0C,0xA7,0x61,0x9C,0xC2,0x9C,0xE4,0xC0,0xB4,
+0x00,0x01,0xC8,0xA5,0x23,0x38,0x5C,0xE5,0x0D,0x23,0xFF,0x95,0x85,0x29,0xFC,0xA0,
+0x3E,0x3E,0xC2,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xFC,0xD7,0x08,0x60,0xFC,0xE4,
+0x08,0x48,0x0C,0xA6,0x17,0x0C,0xA6,0x15,0x0C,0xA7,0x17,0x0C,0xA7,0x0B,0x0C,0xA7,
+0x15,0xC0,0xA0,0x10,0x01,0xFF,0x05,0x06,0xB2,0x0C,0x18,0x03,0xC3,0x00,0x10,0x01,
+0xFF,0x38,0x06,0xAA,0xEC,0x18,0x06,0xAB,0xFF,0x00,0x19,0x18,0xEF,0x17,0x08,0x61,
+0xFE,0xE0,0x28,0x24,0x0E,0xE6,0x03,0xFE,0xE0,0x2C,0x2B,0x0E,0xE6,0x05,0xFE,0xE0,
+0x09,0x07,0x0E,0xE6,0x07,0xFE,0xE0,0x0C,0x0A,0x0E,0xE6,0x09,0xFE,0xE0,0x2D,0x00,
+0x0E,0xE6,0x0B,0xFE,0xE0,0x1C,0x1A,0x0E,0xE6,0x0D,0xFE,0xE0,0x2A,0x29,0x0E,0xE6,
+0x0F,0xFE,0xE0,0x05,0x04,0x0E,0xE6,0x11,0xFE,0xE0,0x08,0x06,0x0E,0xE6,0x13,0xFC,
+0xC0,0x22,0x23,0xEC,0xC4,0x08,0x49,0xFC,0xC0,0x20,0x16,0x0C,0xC7,0x03,0xFC,0xC0,
+0x1E,0x14,0x0C,0xC7,0x05,0xFC,0xC0,0x12,0x0D,0x0C,0xC7,0x07,0xFC,0xC0,0x0B,0x0E,
+0x0C,0xC7,0x09,0xFC,0xC0,0x21,0x17,0x0C,0xC7,0x0D,0xFC,0xC0,0x1F,0x15,0x0C,0xC7,
+0x0F,0xFC,0xC0,0x1D,0x13,0x0C,0x19,0x03,0x0C,0xC7,0x11,0xFC,0xC0,0x10,0x11,0x0C,
+0xC7,0x13,0xFC,0xE0,0x0C,0x00,0xEC,0xE5,0x06,0xB3,0x85,0x29,0x20,0x61,0x26,0xC0,
+0xB4,0x00,0x01,0xC2,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xC8,0xA5,0x22,0x9C,0xFE,
+0xF7,0x08,0x60,0xFC,0x84,0x06,0xB2,0x98,0xC0,0x98,0xE0,0x43,0x06,0xBC,0x0B,0x18,
+0x01,0x0F,0x05,0x01,0x24,0xE4,0x37,0x43,0x06,0x24,0x0B,0x18,0x01,0xEF,0x05,0x01,
+0x4D,0x9C,0xE1,0x9C,0xC2,0x5C,0xE7,0x00,0x9C,0xA4,0xD0,0xEC,0xFF,0x0E,0x50,0xC0,
+0x8C,0xE4,0x00,0x00,0x93,0x20,0x65,0x42,0xC0,0xB4,0x00,0x01,0xC2,0xE0,0x10,0x01,
+0xC0,0x80,0x10,0x01,0xC8,0xA5,0x22,0x9C,0xFE,0xF7,0x08,0x48,0xFC,0x84,0x06,0xAA,
+0x98,0xC0,0x98,0xE0,0x43,0x06,0xBC,0x0B,0x18,0x01,0x0F,0x05,0x01,0x24,0xE4,0x37,
+0x43,0x06,0x24,0x0B,0x18,0x01,0xEF,0x05,0x01,0x4D,0x9C,0xE1,0x9C,0xC2,0x5C,0xE7,
+0x00,0x9C,0xA4,0xD0,0xEC,0xFF,0x0E,0x50,0xC0,0x8A,0xC0,0xF4,0x00,0x01,0xC8,0xE7,
+0x24,0x14,0x0C,0xC7,0x01,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D,0x41,0x18,
+0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0xC1,
+0x54,0x00,0x01,0x50,0xE0,0x30,0xC9,0x8A,0x25,0xC0,0x0C,0xEC,0x01,0xC9,0x6A,0x24,
+0x81,0xC1,0xC0,0x10,0x01,0x18,0xEB,0x00,0xC1,0xE0,0x10,0x01,0xEC,0x8E,0x00,0x02,
+0xEC,0xEF,0x00,0x66,0x50,0x60,0x64,0x95,0xAF,0xC9,0xAD,0x42,0x40,0x40,0x84,0x69,
+0x84,0xE8,0xC9,0x4A,0x22,0x28,0x50,0xE0,0x40,0x50,0xC0,0x44,0x0C,0xEA,0x01,0x0C,
+0xCA,0x01,0xEC,0xEF,0x00,0x66,0xEC,0x8E,0x00,0x02,0x50,0x60,0x1E,0x40,0x84,0x69,
+0x84,0xE8,0x50,0xE0,0x10,0x0C,0xEC,0x01,0x18,0x0B,0x00,0x0D,0xE1,0x06,0x0D,0xC1,
+0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,
+0x1C,0x21,0x20,0x85,0x29,0xFC,0x21,0xFF,0x28,0xC0,0x80,0x10,0x01,0xED,0xC1,0x00,
+0xC0,0xEE,0x81,0x00,0xA8,0xED,0x21,0x00,0xD4,0xED,0x41,0x00,0xD0,0xED,0x61,0x00,
+0xCC,0xED,0x81,0x00,0xC8,0xED,0xA1,0x00,0xC4,0xED,0xE1,0x00,0xBC,0xEE,0x01,0x00,
+0xB8,0xEE,0x21,0x00,0xB4,0xEE,0x41,0x00,0xB0,0xEE,0x61,0x00,0xAC,0xEE,0xA1,0x00,
+0xA4,0xEE,0xC1,0x00,0xA0,0xFC,0x84,0x05,0x7C,0x1C,0x61,0x08,0x50,0xA0,0x60,0xE7,
+0xFF,0x93,0x22,0xC0,0xD4,0x00,0x01,0xC8,0xE6,0x3C,0xCC,0xC8,0xC6,0x22,0x28,0x1D,
+0xC1,0x68,0x0A,0x86,0x01,0x88,0xCE,0x08,0xA7,0x01,0x0C,0xA6,0x01,0x9C,0xE4,0xC0,
+0xB4,0x00,0x01,0x9C,0xC2,0xC8,0xA5,0x3C,0xFC,0x5C,0xE5,0x0D,0x23,0xFF,0xAD,0x1C,
+0xE1,0x08,0x1C,0xC1,0x68,0x0C,0x87,0x02,0x08,0xA7,0x05,0x4C,0xA5,0x10,0x8C,0xA4,
+0x08,0x87,0x07,0x0C,0x85,0x01,0x9C,0xE8,0xD4,0xE6,0xFF,0x6E,0xC0,0xF4,0x00,0x01,
+0xC8,0xC7,0x24,0x2C,0x0C,0x06,0x01,0x98,0xAC,0xC8,0xC7,0x24,0x10,0x0C,0xA6,0x01,
+0xC8,0xC7,0x22,0x04,0x98,0xBF,0x18,0xA6,0x00,0xFD,0x41,0x00,0x80,0xFC,0xC1,0x00,
+0xA0,0xC9,0xE7,0x22,0x08,0x89,0x8A,0x52,0x20,0x10,0x99,0x60,0xFE,0x41,0x00,0x98,
+0x0C,0xC1,0x04,0xC2,0xC0,0x10,0x01,0xC2,0xA0,0x10,0x01,0xC0,0xF4,0x00,0x01,0xC8,
+0xE7,0x22,0x29,0xC0,0xB4,0x00,0x01,0x1A,0x27,0x00,0xC8,0xA5,0x22,0x00,0x54,0xEB,
+0x01,0x5E,0x6B,0x00,0x5C,0xE0,0x09,0x4E,0x73,0x09,0xC8,0xC0,0x3F,0x00,0x1E,0x73,
+0x27,0x99,0xA0,0x4E,0x73,0x10,0x8E,0x65,0x50,0xA0,0x3F,0x48,0xE6,0x28,0x0C,0xF3,
+0x01,0x21,0xA0,0x5A,0x08,0xEF,0x01,0xC8,0xC0,0xFF,0xFE,0x44,0xE7,0x34,0x0C,0xEF,
+0x01,0x8A,0x12,0xE4,0x00,0x00,0x1D,0x08,0xEF,0x01,0x50,0xE7,0x01,0xE7,0xFF,0xFF,
+0xE3,0x98,0x60,0x98,0x80,0xE7,0xFF,0xF4,0xEA,0xC0,0xA0,0x10,0x01,0x94,0xCF,0xE8,
+0xE5,0x08,0x79,0xC8,0xC6,0x42,0x40,0x0C,0xF0,0x01,0xEC,0x96,0x00,0x02,0xEC,0xF5,
+0x00,0x66,0x50,0x60,0x26,0x40,0x84,0x31,0x84,0xE8,0x9E,0x02,0x0C,0xE1,0x06,0xD6,
+0x07,0xFE,0x96,0x88,0x72,0xE7,0xFF,0xF3,0xE0,0x4C,0x63,0x08,0x21,0xA0,0x42,0xFC,
+0xA1,0x00,0xA0,0x8C,0x65,0x08,0xE3,0xF9,0xE4,0x00,0x00,0x27,0xFC,0xC1,0x00,0xA0,
+0x08,0xEC,0x01,0x8C,0x66,0x08,0xC3,0xF9,0x40,0xE6,0x3D,0x0C,0xEC,0x01,0x9D,0xA1,
+0x5D,0xAD,0x00,0xD1,0xA2,0xFB,0xF6,0x0C,0x13,0x01,0x9E,0x21,0x9D,0x61,0x5E,0x31,
+0x00,0x9D,0x82,0xD1,0x6C,0xF9,0xC6,0xE8,0xA1,0x00,0x80,0x88,0xCA,0x9A,0xE0,0x98,
+0xE0,0x08,0x86,0x00,0xD4,0x85,0x00,0x50,0x8A,0xE7,0xE4,0x00,0x00,0x0D,0x88,0x85,
+0x9C,0xE1,0x9C,0xC2,0x5C,0xE7,0x00,0xD0,0xEC,0x00,0x52,0x88,0xA4,0xE7,0xFF,0xFF,
+0xC9,0xFC,0xE1,0x00,0xA0,0x4E,0xF7,0x08,0x8E,0xE7,0xC0,0xA0,0x10,0x01,0x08,0x97,
+0xE0,0xC0,0xE0,0x10,0x01,0xFC,0xA5,0x0B,0xEE,0xFC,0xE7,0x0B,0xE2,0x52,0xE0,0xFF,
+0x88,0xC7,0x20,0x80,0x3C,0x0B,0x0A,0x00,0x43,0x18,0xBB,0x43,0x18,0x20,0x1B,0x06,
+0x00,0x13,0x06,0x00,0x9D,0x42,0xC3,0x00,0x1D,0x4E,0x20,0x00,0x49,0x98,0xDF,0x18,
+0xC7,0x00,0x9C,0xE1,0xD4,0xE5,0xFF,0xDE,0xE4,0x00,0x00,0x15,0x9C,0xC1,0xD4,0xC5,
+0xFE,0xA6,0xC1,0x54,0x00,0x01,0x50,0xC0,0x7F,0xC8,0xEA,0x22,0x04,0x18,0xC7,0x00,
+0xC8,0xEA,0x22,0x08,0x50,0xC0,0x1E,0x98,0x60,0x0C,0xC7,0x01,0xC9,0x4A,0x3C,0xCC,
+0xE7,0xFF,0xF9,0x38,0x08,0xEE,0x01,0x0C,0xEA,0x01,0xC0,0xB4,0x00,0x01,0x9D,0x44,
+0xC8,0xA5,0x3C,0xFC,0x9D,0xC2,0x5D,0x45,0x0D,0x23,0xFF,0xAD,0xC0,0xF4,0x00,0x01,
+0x98,0xA2,0xC8,0xC7,0x24,0x2C,0x0C,0xA6,0x01,0xC8,0xE7,0x22,0x28,0x0E,0x87,0x01,
+0xEE,0xC1,0x00,0xA2,0xEE,0xA1,0x00,0xA6,0xEE,0x81,0x00,0xAA,0xEE,0x61,0x00,0xAE,
+0xEE,0x41,0x00,0xB2,0xEE,0x21,0x00,0xB6,0xEE,0x01,0x00,0xBA,0xED,0xE1,0x00,0xBE,
+0xED,0xC1,0x00,0xC2,0xED,0xA1,0x00,0xC6,0xED,0x81,0x00,0xCA,0xED,0x61,0x00,0xCE,
+0xED,0x41,0x00,0xD2,0xED,0x21,0x00,0xD6,0xFC,0x21,0x00,0xD8,0x85,0x29,0x1C,0x21,
+0xD0,0xC0,0x80,0x10,0x01,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x21,0x2C,0x89,0x43,
+0xFC,0x84,0x05,0x5C,0x88,0x61,0x50,0xA0,0x20,0xE7,0xFF,0x8E,0x2E,0x08,0xE1,0x01,
+0x89,0x61,0x5C,0xE7,0xB3,0x98,0xE0,0x20,0x00,0x99,0x4C,0xEA,0x08,0xC0,0xC0,0x10,
+0x01,0xFC,0xC6,0x06,0xAE,0x8C,0xC7,0x98,0xAF,0x0C,0xA6,0x01,0xC0,0xC0,0x10,0x01,
+0xFC,0xC6,0x06,0xB6,0x8C,0xE6,0x0C,0x07,0x01,0xE4,0x00,0x00,0x79,0x4C,0xCA,0x08,
+0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0x84,0x06,0xAE,0xFC,0xA5,0x06,0xB6,
+0x8C,0x86,0x8C,0xC5,0x5C,0xA7,0x04,0x9C,0xE1,0x4E,0xE5,0x40,0x8E,0xE5,0x08,0xAB,
+0x01,0x5C,0xA7,0xBB,0x20,0x00,0x45,0x0C,0xA4,0x01,0x0E,0xE6,0x01,0x9D,0x62,0x5C,
+0xE2,0x09,0x23,0xFF,0x89,0x4C,0xEA,0x08,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xAE,
+0x8C,0xC7,0x08,0xA6,0x01,0xC8,0xC0,0x01,0x8A,0x9C,0xA1,0x40,0xC5,0x33,0xC0,0xC9,
+0x9B,0xEE,0x20,0x01,0x01,0x4C,0xA5,0x08,0x50,0xC0,0xC5,0x50,0xE0,0x15,0x40,0xC5,
+0x33,0xFC,0xC6,0xB3,0x1F,0xC0,0xC2,0x69,0xCA,0x20,0x00,0x55,0x9C,0xE1,0x8C,0xC5,
+0x5C,0xE7,0x04,0xC0,0xE0,0x80,0x04,0x23,0xFF,0xB9,0xE4,0x00,0x00,0x01,0x4D,0x4A,
+0x08,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xA6,0x8D,0x46,0x0C,0xEA,0x01,0xE4,0x00,
+0x00,0x29,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xA6,0x8C,0xE6,0x50,0xC0,0x15,0x0C,
+0xC7,0x01,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,
+0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0xEE,0x0D,0x21,0x06,0x98,0x61,
+0x9C,0x28,0xE7,0xFF,0xFD,0xD9,0xC8,0xA0,0x08,0x00,0xD0,0x68,0x00,0xC2,0x5C,0x62,
+0x09,0xC8,0xA0,0x04,0x00,0x20,0x00,0x37,0x5C,0x64,0x09,0xC8,0xA0,0x02,0x00,0x48,
+0xA0,0x28,0xC0,0xD4,0x00,0x01,0xCB,0x20,0x8F,0xFF,0xC8,0xE6,0x26,0x04,0x0A,0xE7,
+0x01,0x0B,0x07,0x01,0x47,0x18,0xCC,0x0F,0x07,0x01,0x0B,0x07,0x01,0xCB,0x18,0x30,
+0x00,0x0F,0x07,0x01,0xC8,0xE6,0x26,0x2C,0xCB,0x26,0x26,0x20,0x0C,0x67,0x01,0x5E,
+0xF7,0x04,0xC8,0xA5,0x80,0x00,0x4F,0x03,0x09,0x98,0xE0,0xC8,0xC6,0x26,0x1C,0xE4,
+0x00,0x00,0x1F,0x0C,0xE6,0x01,0x0C,0xB9,0x01,0x9C,0xE1,0x5C,0xE7,0x04,0xD7,0x07,
+0xFF,0xAD,0x54,0xE4,0x01,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10,0xC8,
+0xC7,0x26,0x24,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x34,0x1C,0xC3,0xFF,0x5C,0xC6,0x04,
+0x0C,0xC7,0x01,0x54,0xE4,0x02,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10,
+0xC8,0xC7,0x26,0x25,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x38,0x1C,0xC3,0xFF,0x5C,0xC6,
+0x04,0x0C,0xC7,0x01,0x54,0xE4,0x04,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0,
+0x10,0xC8,0xC7,0x26,0x28,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x3C,0x1C,0xC3,0xFF,0x5C,
+0xC6,0x04,0x0C,0xC7,0x01,0x54,0x84,0x08,0x20,0x80,0x74,0xC0,0xF4,0x00,0x01,0x50,
+0xA0,0x10,0xC8,0xC7,0x26,0x29,0x18,0xA6,0x00,0x9C,0x7F,0xC8,0xE7,0x24,0x40,0x5C,
+0x63,0x04,0x0C,0x67,0x01,0xC0,0xF4,0x00,0x01,0xC8,0xE7,0x26,0x04,0x0E,0xE7,0x01,
+0x85,0x29,0x9C,0x38,0xFC,0xC0,0xA0,0x30,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x54,
+0x00,0x01,0xC8,0xEA,0x26,0x04,0x0C,0xC7,0x01,0xC8,0xEA,0x26,0x30,0xFC,0xC0,0x10,
+0x11,0x98,0x60,0x0C,0xC7,0x01,0xE4,0x00,0x5C,0x2C,0xC8,0xAA,0x26,0x20,0x50,0xE0,
+0xF4,0xC9,0x4A,0x26,0x1C,0xFC,0xC0,0x80,0x10,0x0C,0xEA,0x01,0x0C,0xC5,0x01,0x9C,
+0xE1,0x5C,0xE7,0x04,0xC0,0xE0,0x20,0x04,0x23,0xFF,0xC5,0xFC,0xC0,0xE0,0x30,0xC0,
+0xF4,0x00,0x01,0xC8,0xE7,0x26,0x04,0x0C,0xC7,0x01,0x0D,0x41,0x02,0x0D,0x21,0x06,
+0x9C,0x28,0x85,0x29,0x9C,0x38,0x98,0x61,0x0D,0x21,0x04,0xE7,0xFF,0xF3,0x62,0x98,
+0x61,0xE4,0x00,0x0F,0x36,0x98,0x61,0xE4,0x00,0x0F,0x6A,0x98,0x61,0xE7,0xFF,0xA2,
+0x24,0x98,0x60,0xE7,0xFF,0xF3,0x32,0x98,0x60,0xE4,0x00,0x0F,0x06,0x98,0x60,0xE4,
+0x00,0x0F,0x3A,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF,0xA1,0xEB,0x9C,0x30,
+0xC0,0xE0,0x10,0x01,0x0D,0x21,0x0C,0xE8,0xE7,0x00,0x4B,0x0D,0x41,0x08,0x0D,0x61,
+0x04,0x0D,0x81,0x00,0x5C,0xE7,0x00,0xC0,0xE0,0x14,0x00,0x20,0x04,0xE5,0xC0,0xE0,
+0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0xC6,0x09,0xE4,0x98,0xE0,
+0xE4,0x00,0x00,0x5D,0x9C,0xE1,0x08,0xA6,0x00,0x5C,0xE7,0x00,0xC0,0xBE,0x4A,0x68,
+0x20,0x00,0xC9,0xC0,0xBF,0x44,0x6C,0x9C,0xC2,0x20,0x00,0x55,0xC0,0xE0,0x10,0x01,
+0xF0,0xC7,0x06,0xDE,0x9C,0xC1,0xF8,0xC7,0x06,0xDE,0xE4,0x00,0x00,0x19,0xD4,0x87,
+0xFE,0xB5,0xE4,0x00,0x02,0x0B,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x06,0xDE,0xD0,0xE9,
+0x07,0x31,0xC0,0xE0,0x10,0x01,0x98,0x60,0xF8,0x07,0x06,0xDE,0xC0,0xE0,0x10,0x01,
+0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC0,0xE0,0x01,0x1F,0x98,0x99,0x44,0xE7,0x24,0xC0,
+0xE0,0x01,0x1D,0xC1,0x74,0x00,0x01,0xC9,0x4B,0x7A,0x10,0x0C,0xEA,0x02,0xC8,0xE7,
+0x01,0x00,0x0C,0xEA,0x00,0xC9,0x6B,0x7A,0x30,0xC9,0x80,0x01,0x00,0x0D,0x8B,0x00,
+0xE7,0xFF,0xFE,0x28,0x0C,0xEA,0x02,0xC8,0xE7,0x01,0x00,0x0C,0xEA,0x00,0x0D,0x8B,
+0x00,0x98,0x60,0xE4,0x00,0x59,0xB2,0xC0,0xE0,0x01,0x1F,0x50,0xE7,0x06,0xC0,0xE0,
+0x01,0x1D,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xEC,0x66,0x04,0xDA,0xEC,0xE7,
+0x00,0x86,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC8,0xA0,0xFF,0xEF,0xE8,0xC7,0x06,0x89,
+0x44,0xC6,0x2C,0xC8,0x80,0xFE,0xFF,0xEC,0xC7,0x06,0x89,0xE8,0xC7,0x06,0x89,0x44,
+0xC6,0x24,0xEC,0xC7,0x06,0x89,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x26,0x18,0xFC,0x80,
+0x80,0x00,0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,
+0x24,0x28,0x08,0xA6,0x01,0x50,0xA5,0x01,0x0C,0xA6,0x01,0xC0,0xC0,0x10,0x01,0xC8,
+0xE7,0x7A,0x10,0x98,0x60,0xEC,0x06,0x06,0x84,0xC8,0xA0,0xFE,0xFF,0x08,0xC7,0x01,
+0x44,0xC6,0x2C,0x0C,0xC7,0x01,0xE4,0x00,0x23,0xCA,0xE4,0x00,0x0C,0xDA,0x98,0x61,
+0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,
+0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xDE,0xE7,
+0xFF,0xFD,0xEF,0x9C,0x38,0xFC,0xA0,0x07,0xFF,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC0,
+0xC0,0x10,0x01,0xFC,0xE6,0x0C,0x0C,0x0C,0xA7,0x09,0x0C,0xA7,0x07,0x50,0xA0,0x15,
+0x0C,0xA7,0x10,0x0C,0xA7,0x0C,0x98,0xA9,0x18,0xA7,0x04,0xFC,0xA0,0x01,0x00,0x0C,
+0xA7,0x0B,0xFC,0xA0,0x04,0x00,0x0C,0xA7,0x03,0x50,0xA0,0x26,0xF8,0xA6,0x0C,0x0C,
+0x98,0xC4,0x99,0x42,0x18,0xC7,0x14,0x19,0x47,0x01,0x98,0x60,0xE4,0x00,0x0F,0x9C,
+0xC0,0xC0,0x10,0x01,0xFC,0xA6,0x06,0xF1,0xF8,0x06,0x06,0xF1,0xC0,0xC0,0x10,0x01,
+0xC0,0xE0,0x10,0x01,0x18,0x05,0x01,0xF8,0x06,0x06,0xFC,0xFC,0xA6,0x06,0xFC,0xC0,
+0xC0,0x10,0x01,0xEC,0x07,0x06,0x89,0x98,0xE1,0x18,0xE5,0x01,0x98,0xAA,0xF8,0xA6,
+0x06,0xDE,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x06,0xC4,0xC0,0xC0,0x10,0x01,0xF8,0x06,
+0x06,0xDF,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0xEC,0xC0,0xC0,0x10,0x01,0xEC,0x06,
+0x06,0xF8,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x07,0x23,0xC0,0xC0,0x10,0x01,0xF8,0x06,
+0x06,0xE8,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x06,0xBD,0xC0,0xC0,0x10,0x01,0xF8,0xE6,
+0x06,0xFE,0xC0,0xC0,0x10,0x01,0xF8,0xE6,0x06,0xD2,0xC0,0xE0,0x10,0x01,0x1C,0xC0,
+0xC8,0xF8,0xC7,0x06,0xD0,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,0x00,0xC0,0xE0,0x10,
+0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0,0xC0,0xE0,0x10,
+0x01,0xF8,0x07,0x07,0x01,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x07,0x05,0xC0,0xE0,0x10,
+0x01,0x50,0xC0,0xB1,0xEC,0xC7,0x06,0xC9,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x07,0x0C,
+0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE0,
+0xC0,0xE0,0x10,0x01,0xF9,0x47,0x07,0x06,0xC0,0xE0,0x10,0x01,0xF9,0x47,0x06,0xBE,
+0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0xE4,0xC0,0xE0,0x10,0x01,0x50,0xC0,0x33,0xF8,
+0xC7,0x06,0xFF,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF3,0xC0,0xE0,0x10,0x01,0x50,
+0xA0,0x50,0xF8,0x07,0x07,0x18,0xC0,0x60,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0x63,
+0x09,0x4C,0xEC,0xE7,0x00,0x7E,0x98,0x80,0x84,0xE8,0xC0,0xC0,0x10,0x01,0xC0,0xF4,
+0x00,0x01,0xF0,0xA6,0x04,0xD4,0xC8,0xC7,0x79,0xE9,0x18,0xA6,0x00,0xC8,0xC7,0x79,
+0xD0,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x18,0x07,0x5A,0x18,0x07,0x04,0x18,
+0x07,0x05,0x18,0x07,0x06,0x18,0x07,0x20,0x18,0x07,0x21,0x18,0x07,0x22,0x18,0x07,
+0x3C,0x18,0x07,0x3D,0x18,0x07,0x3E,0x18,0x07,0x58,0x18,0x07,0x59,0xC0,0xE0,0x10,
+0x01,0xF0,0xE7,0x04,0xD5,0xC0,0xA0,0x10,0x01,0x0C,0xE6,0x01,0xFC,0xA5,0x08,0xA8,
+0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x08,0x78,0xFC,0xE7,0x0C,0x24,
+0x0C,0x06,0x01,0x0C,0x06,0x31,0x0C,0x07,0x01,0x0C,0x07,0x31,0x0C,0x07,0x61,0xEC,
+0x07,0x00,0x91,0x9C,0xC2,0x9C,0xE2,0xD4,0xC5,0xFF,0x4E,0xC1,0x40,0x10,0x01,0xE8,
+0xEA,0x04,0x89,0x50,0xE7,0x01,0xEC,0xEA,0x04,0x89,0xE7,0xFF,0xF5,0xCC,0x50,0xC0,
+0x19,0xE8,0xEA,0x04,0x89,0x50,0xE7,0x04,0xC0,0x80,0x10,0x01,0xEC,0xEA,0x04,0x89,
+0xF8,0xC4,0x07,0x19,0xFC,0xE4,0x07,0x19,0x18,0xC7,0x03,0x18,0xC7,0x01,0x50,0xC0,
+0x32,0x18,0xC7,0x05,0x18,0xC7,0x04,0x50,0xC0,0x50,0x98,0xA1,0x18,0xC7,0x07,0x18,
+0xC7,0x06,0x18,0xA7,0x02,0xC0,0xC0,0x10,0x01,0xFC,0xE6,0x0B,0xFE,0x0C,0x07,0x09,
+0x18,0x07,0x01,0x18,0x07,0x02,0x18,0x07,0x03,0x0C,0x07,0x05,0x0C,0x07,0x07,0x0C,
+0x07,0x0B,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x0B,0xFE,0xEC,0xA7,0x04,0x8B,0xC0,0xDA,
+0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x33,0x43,0xEC,0xC7,0x00,0xD0,0x50,0xC0,
+0xC8,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x04,0x8D,0xC0,0xE0,0x10,0x01,0xC0,0xDA,0x00,
+0x01,0xFC,0xC6,0x35,0xB2,0xEC,0xC7,0x00,0xD4,0xC0,0xE0,0x10,0x01,0xC0,0xDA,0x00,
+0x01,0xFC,0xC6,0x34,0xDF,0x0D,0x41,0x02,0xEC,0xC7,0x00,0xDC,0x0D,0x21,0x06,0xC0,
+0xDA,0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x2B,0x0E,0x9C,0x28,0xEC,0xC7,0x00,
+0xE0,0x85,0x29,0x9C,0x38,0xC0,0xF4,0x00,0x01,0x0D,0x21,0x04,0xC8,0xC7,0x3C,0x48,
+0xFC,0xA0,0x05,0x00,0x0C,0xA6,0x01,0xC8,0xC7,0x3C,0x54,0xFC,0xA0,0x6E,0x00,0x0C,
+0x06,0x01,0xC8,0xC7,0x3D,0xCC,0x0C,0xA6,0x01,0xC8,0xC7,0x3D,0xD0,0x50,0xA0,0x71,
+0xC8,0xE7,0x3C,0x50,0x0C,0xA6,0x01,0xC8,0xA0,0xFF,0xFE,0x08,0xC7,0x01,0x44,0xC6,
+0x2C,0x0C,0xC7,0x01,0xE7,0xFF,0xE1,0x5A,0xE7,0xFF,0xE2,0x22,0x0D,0x21,0x06,0x9C,
+0x28,0xE7,0xFF,0xF5,0xE3,0x1C,0x21,0xE8,0x0D,0x21,0x14,0x0D,0x41,0x10,0x0D,0x61,
+0x0C,0xE7,0xFF,0xF9,0xE4,0x98,0x62,0xE7,0xFF,0xB3,0x22,0xE7,0xFF,0x7F,0xFE,0x50,
+0x60,0x26,0xE7,0xFF,0xE0,0x16,0xE7,0xFF,0x7B,0x66,0xE7,0xFF,0xFF,0x12,0xC1,0x54,
+0x00,0x01,0xC8,0xEA,0x24,0x2C,0x08,0xC7,0x01,0xC0,0xE0,0x10,0x01,0x4C,0xC6,0x09,
+0x9C,0xC1,0xF8,0xC7,0x06,0xD1,0xE7,0xFF,0xE7,0xF0,0x98,0x60,0xC1,0x60,0x10,0x01,
+0xEC,0xEB,0x00,0x86,0x84,0xE8,0xC8,0xEA,0x3C,0x44,0x08,0xC7,0x01,0xC8,0xC6,0x10,
+0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x3C,0x4C,0x08,0xC7,0x01,0xC8,0xC6,0x10,0x00,0x0C,
+0xC7,0x01,0xE7,0xFF,0xEB,0x86,0xE7,0xFF,0xEA,0x62,0xFC,0xA0,0xC0,0x00,0xC9,0x4A,
+0x24,0x80,0x08,0xEA,0x01,0x44,0xE7,0x2D,0x5C,0xE7,0x04,0x0C,0xEA,0x01,0xE7,0xFF,
+0xF5,0x8C,0xC0,0xC0,0x10,0x01,0xEC,0xEB,0x00,0x86,0xEC,0x66,0x04,0xDA,0x84,0xE8,
+0x98,0xC0,0xC8,0xE0,0x48,0x00,0xC0,0xC7,0x00,0x0D,0xC8,0xC0,0x48,0x00,0xC0,0xC6,
+0x00,0x0F,0x50,0xC6,0x04,0xC0,0xC7,0x00,0x0D,0xC8,0xC0,0x48,0x00,0xC0,0xC6,0x00,
+0x0F,0x50,0xC6,0x08,0xC0,0xC7,0x00,0x0D,0xC0,0xE0,0x01,0x1F,0x50,0xE7,0x06,0xC0,
+0xE0,0x01,0x1D,0xC1,0x54,0x00,0x01,0xC8,0xEA,0x79,0x04,0x0C,0x07,0x01,0xC8,0xEA,
+0x79,0x00,0xFC,0xC0,0xEA,0x60,0x0C,0xC7,0x01,0xC8,0xEA,0x79,0x10,0xC9,0x6A,0x7A,
+0x10,0xFC,0xC0,0x03,0x00,0x0C,0xC7,0x01,0x0C,0xEB,0x02,0xC8,0xE7,0x01,0x00,0x0C,
+0xEB,0x00,0xC8,0xEA,0x7A,0x50,0x1E,0xE0,0xDF,0x0C,0xC7,0x02,0xC8,0xA0,0xFF,0xEF,
+0x44,0xC6,0xBC,0x0C,0xC7,0x00,0x08,0xEB,0x01,0x44,0xE7,0x2C,0xCA,0xE0,0xFF,0x00,
+0x0C,0xEB,0x01,0xC8,0xEA,0x26,0x04,0x08,0xC7,0x01,0x44,0xC6,0xBC,0xC8,0xC6,0x80,
+0x00,0x0C,0xC7,0x01,0xC0,0xC0,0x10,0x01,0x08,0xA7,0x01,0xF0,0x86,0x05,0x26,0x44,
+0xA5,0x25,0x0C,0xA7,0x01,0xC8,0xAA,0x26,0x08,0xFC,0xC6,0x05,0x26,0xCA,0xE0,0x0F,
+0xFF,0x08,0x86,0x03,0x44,0x84,0xBC,0x0C,0x85,0x01,0xC8,0xAA,0x26,0x0C,0x08,0x86,
+0x05,0x44,0x84,0xBC,0x0C,0x85,0x01,0xC8,0xA0,0x03,0xFF,0x08,0x86,0x07,0x44,0x84,
+0x2C,0xC8,0xAA,0x26,0x10,0x0C,0x85,0x01,0x08,0xA6,0x09,0xC8,0xC0,0x03,0xFF,0x44,
+0xA5,0x34,0xC8,0xCA,0x26,0x14,0x0C,0xA6,0x01,0x08,0xC7,0x01,0x50,0xC6,0x30,0x98,
+0x60,0x0C,0xC7,0x01,0x98,0x81,0x98,0xA0,0xE4,0x00,0x4F,0xF0,0xC0,0xE0,0x10,0x01,
+0xE8,0xA7,0x02,0xCC,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0x6C,0x98,0x6F,0x0C,0xE1,
+0x00,0x98,0x88,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x02,0xC8,0xFC,
+0xE7,0x02,0xCE,0xC1,0x00,0x10,0x01,0xFD,0x08,0x03,0x64,0xE7,0xFF,0xD1,0x82,0xC8,
+0xEA,0x26,0x18,0xFE,0xE0,0x80,0x00,0x08,0xC7,0x01,0xC9,0x4A,0x24,0x28,0x44,0xC6,
+0xBD,0x5C,0xC6,0x04,0x0C,0xC7,0x01,0x08,0xEA,0x01,0x50,0xE7,0x01,0x0C,0xEA,0x01,
+0x0C,0xEB,0x02,0x50,0xE7,0x10,0xFC,0xA0,0xFE,0xFF,0x0C,0xEB,0x00,0x0C,0xEB,0x02,
+0x44,0xE7,0x2C,0xC0,0xDA,0x00,0x01,0x0C,0xEB,0x00,0xFC,0xC6,0x39,0xF5,0xC0,0xE0,
+0x10,0x01,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0xEC,0xC7,0x00,0xD8,0x1C,
+0x21,0x18,0x85,0x29,0x20,0xA0,0x9A,0x4C,0x84,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,
+0x0B,0x14,0x8C,0x87,0xE4,0x00,0x00,0x1D,0x08,0xC7,0x01,0x9C,0xE2,0x0C,0xC3,0x01,
+0x9C,0x62,0xD4,0xE4,0xFF,0xB6,0xE4,0x00,0x00,0xC5,0x20,0xA5,0x7A,0x4C,0x84,0x08,
+0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0B,0x14,0x8C,0x87,0x8A,0xE7,0x88,0xC7,0xE4,0x00,
+0x00,0x1D,0x08,0xA3,0x01,0x9C,0x62,0x0C,0xA6,0x01,0x9C,0xC2,0xD4,0xC4,0xFF,0xB6,
+0xC0,0xC0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0xC6,0x09,0x4C,0xFC,0xA5,0x0C,0x0C,
+0x10,0x85,0x04,0x10,0xA5,0x01,0x40,0xA5,0x23,0x5C,0xA5,0x00,0x4C,0xA5,0x10,0x8C,
+0xB7,0xE4,0x00,0x00,0x27,0x0A,0xE7,0x02,0x08,0x87,0x00,0x9C,0xE4,0x8C,0x97,0x0C,
+0x86,0x00,0x9C,0xC4,0xD4,0xE5,0xFF,0x8E,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D,
+0x41,0x00,0xC1,0x54,0x00,0x01,0xC9,0x4A,0x36,0x00,0x10,0xEA,0x00,0x54,0xE7,0xFD,
+0x18,0xEA,0x00,0x10,0xEA,0x00,0x50,0xE7,0x02,0x94,0xCF,0x18,0xEA,0x00,0xC8,0xC6,
+0x42,0x40,0xC0,0xE0,0x10,0x01,0x98,0x6F,0xEC,0x87,0x00,0x02,0xC0,0xE0,0x10,0x01,
+0x40,0x84,0x31,0xEC,0xE7,0x00,0x66,0x84,0xE8,0x10,0xEA,0x00,0x54,0xE7,0xFD,0x18,
+0xEA,0x00,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x20,0x60,0x18,0x20,
+0x64,0x6E,0xC0,0xF4,0x00,0x01,0xFC,0xA0,0x02,0xC0,0xC8,0xC7,0x24,0x48,0x0C,0xA6,
+0x01,0xC8,0xE7,0x24,0x54,0x98,0xC9,0x0C,0xC7,0x01,0x85,0x29,0xC0,0xE0,0x10,0x01,
+0xFC,0xE7,0x06,0xA6,0xC0,0xD4,0x00,0x01,0x4C,0x63,0x08,0xC8,0xA6,0x24,0x58,0x8C,
+0x67,0x08,0xE3,0x01,0x0C,0xE5,0x01,0xC8,0xA6,0x24,0x5C,0x0C,0xE5,0x01,0xC8,0xC6,
+0x24,0x60,0x0C,0xE6,0x01,0x85,0x29,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x06,0xBC,0xC0,
+0xD4,0x00,0x01,0xC8,0xC6,0x79,0xE9,0x10,0xC6,0x00,0xC0,0xE0,0x10,0x01,0xF8,0xC7,
+0x04,0xD4,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0x58,0xF0,0xA7,0x04,0xD4,0xC0,0xE0,
+0x10,0x01,0xEC,0xC7,0x06,0x94,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x06,0xA5,0x5C,0xA0,
+0x01,0x54,0xC6,0x02,0x50,0xA0,0x80,0x48,0xA8,0x29,0x20,0xC1,0x40,0xC0,0xC0,0x10,
+0x01,0x88,0x87,0xEC,0x06,0x06,0x7D,0x98,0xE0,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x0B,
+0x60,0xEE,0xE4,0x06,0x96,0x43,0x07,0x34,0x8E,0xE7,0x13,0x18,0x00,0x1B,0x17,0x00,
+0x9C,0xE1,0x5E,0xE7,0x04,0xD4,0xB7,0xFF,0x65,0xC0,0xC0,0x10,0x01,0xE8,0x86,0x06,
+0x7D,0x8C,0xA4,0xC0,0xE0,0x10,0x01,0xEC,0xA6,0x06,0x7D,0xE8,0xC7,0x06,0xA5,0xC8,
+0xA0,0xFF,0xFD,0x44,0xC6,0x2C,0xEC,0xC7,0x06,0xA5,0xE7,0xFF,0xFD,0xA1,0xC0,0xE0,
+0x10,0x01,0xFC,0xE7,0x0B,0x60,0x88,0xA7,0xFC,0xC7,0x00,0x82,0x18,0x07,0x00,0x9C,
+0xE1,0xD4,0xE6,0xFF,0xDE,0xC0,0xE0,0x10,0x01,0x50,0xC0,0x62,0x1C,0xA5,0x1F,0xF8,
+0xC7,0x0B,0x60,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0B,0x61,0x18,0x07,0x00,0x9C,0xE1,
+0xD4,0xE5,0xFF,0xDE,0xC0,0xC0,0x10,0x01,0x1C,0xA0,0x9E,0xF8,0xA6,0x0B,0x7F,0xC0,
+0xD4,0x00,0x01,0xC8,0xC6,0x79,0xD0,0x08,0xC6,0x01,0x5C,0xC6,0x00,0xC0,0xE0,0x10,
+0x01,0xF8,0xC7,0x04,0xD5,0xC0,0xC0,0x10,0x01,0x8B,0x47,0xF3,0x26,0x0C,0x0C,0xC0,
+0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFC,
+0xE7,0x0B,0x80,0xFC,0xA5,0x0A,0x7C,0x4F,0x39,0x08,0xFF,0x18,0x09,0xE4,0xFE,0xF7,
+0x0B,0x14,0x98,0xC0,0xE4,0x00,0x00,0x77,0xF0,0x9A,0x04,0xD5,0x20,0x84,0x38,0xD0,
+0x84,0x00,0xDA,0x40,0x86,0xBC,0xE4,0x00,0x00,0x0F,0x40,0x86,0xC4,0x08,0x84,0x00,
+0x18,0x87,0x01,0x4C,0x84,0x41,0xE4,0x00,0x00,0x21,0x0C,0x85,0x02,0x4F,0x64,0x42,
+0x4C,0x84,0x82,0x1B,0x67,0x01,0x18,0x87,0x00,0x9C,0xC2,0x9C,0xE2,0x9C,0xA4,0xD4,
+0xD9,0xFE,0x4E,0xC0,0xF4,0x00,0x01,0xC8,0xE7,0x7A,0x50,0x1C,0xA0,0xDF,0x0C,0xC7,
+0x02,0x44,0xC6,0x2C,0x0C,0xC7,0x00,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x06,0xA5,0x54,
+0xE7,0x02,0x20,0xE1,0x50,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xEC,0x07,0x06,
+0x7D,0xFC,0xA5,0x0B,0x60,0x98,0xE0,0xC0,0xC0,0x10,0x01,0xEC,0x86,0x06,0x96,0x42,
+0xE7,0x2C,0x8C,0x87,0x12,0xF7,0x00,0x1A,0xE4,0x00,0x9C,0xE1,0xC0,0xE0,0x10,0x04,
+0x23,0xFF,0xAD,0xC0,0xC0,0x10,0x01,0xE8,0xA6,0x06,0x7D,0xFC,0xA5,0x00,0x80,0xC0,
+0xE0,0x10,0x01,0xEC,0xA6,0x06,0x7D,0xE8,0xC7,0x06,0xA5,0xC8,0xA0,0xFF,0xFD,0x44,
+0xC6,0x2C,0xEC,0xC7,0x06,0xA5,0xE7,0xFF,0xFB,0x29,0x20,0x68,0x5A,0xC0,0xE0,0x10,
+0x01,0xFC,0xC7,0x07,0x19,0xF0,0xA7,0x07,0x19,0x10,0xC6,0x01,0xE4,0x00,0x01,0x67,
+0x20,0x6C,0x56,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x07,0x19,0x10,0xC7,0x03,0x10,0xA7,
+0x02,0xE4,0x00,0x01,0x3D,0xD0,0x64,0x00,0xB6,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x07,
+0x19,0x10,0xC7,0x05,0x10,0xA7,0x04,0xE4,0x00,0x01,0x11,0xD0,0x65,0x00,0xB6,0xC0,
+0xE0,0x10,0x01,0xFC,0xE7,0x07,0x19,0x10,0xC7,0x07,0x10,0xA7,0x06,0xE4,0x00,0x00,
+0xE5,0x20,0x60,0xA6,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0A,0x7C,
+0xF0,0xC6,0x0C,0x0C,0x4C,0xC6,0x10,0x8C,0xC7,0xE4,0x00,0x00,0x13,0x0C,0x07,0x00,
+0x9C,0xE4,0xD4,0xE6,0xFF,0xDE,0xE4,0x00,0x01,0xCF,0x98,0xC0,0x98,0xA0,0x20,0x64,
+0xE6,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x09,0xE4,0xC0,0xA0,0x10,
+0x01,0xFC,0xC6,0x0A,0x7C,0xF0,0xA5,0x0C,0x0C,0x4C,0xA5,0x08,0x8C,0xA7,0xE4,0x00,
+0x00,0x23,0x08,0x87,0x00,0x9C,0xE2,0x4C,0x84,0x40,0x0C,0x86,0x00,0x9C,0xC4,0xD4,
+0xE5,0xFF,0x9E,0xE4,0x00,0x01,0x55,0xD0,0x66,0x05,0x32,0xD0,0x67,0x01,0x4A,0xC0,
+0x80,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF3,0x64,0x0C,0x0C,0xFC,0xE7,0x0A,0x7C,0xC3,
+0x00,0x10,0x01,0x4F,0x7B,0x10,0xFF,0x18,0x09,0xE4,0x8F,0x67,0xC8,0x80,0x03,0xE8,
+0xE4,0x00,0x00,0xF3,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2,0xE7,0x0C,0x0C,
+0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0xC6,0x0A,0x7C,0x4E,0xF7,0x08,0xFC,
+0x84,0x0B,0x14,0xFC,0xA5,0x09,0xE4,0x98,0xE0,0xE4,0x00,0x00,0x3B,0x43,0x27,0x2C,
+0x43,0x07,0x24,0x0B,0x59,0x01,0x9C,0xE2,0x0F,0x26,0x02,0x9C,0xC4,0x4F,0x39,0x42,
+0x43,0x3A,0xCD,0x0F,0x38,0x01,0xD4,0xF7,0xFF,0x3E,0xE4,0x00,0x00,0x67,0x0E,0xE7,
+0x02,0x0B,0x58,0x00,0x43,0xB7,0x23,0x4F,0x5A,0x40,0x43,0x3A,0xBD,0xD6,0xFA,0x00,
+0x6C,0x43,0x25,0xCB,0x8F,0x3D,0xE4,0x00,0x00,0x13,0x43,0x26,0xCB,0x8F,0x3D,0x43,
+0x39,0x20,0x9F,0x02,0x0F,0x27,0x00,0x9C,0xE4,0xD4,0xFB,0xFE,0xAE,0x85,0x29,0x9C,
+0x38,0x0D,0x41,0x04,0x0D,0x61,0x00,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x08,0xD8,0xD2,
+0xE1,0x11,0x19,0xC0,0x80,0x10,0x01,0xE8,0xC4,0x06,0xD6,0xFC,0x84,0x06,0xD6,0x0A,
+0xE4,0x04,0xC2,0xEF,0xFF,0xE0,0x20,0x06,0x21,0xFC,0xE7,0x08,0xD8,0x08,0xA4,0x02,
+0x0B,0xA7,0x16,0x0B,0x27,0x34,0x0B,0xC7,0x32,0x08,0x84,0x06,0x41,0x1E,0xBD,0x43,
+0x59,0x25,0x0B,0x07,0x18,0x40,0x7D,0x35,0x40,0xE5,0xC5,0x43,0x63,0xD3,0x40,0xE7,
+0x43,0x8C,0xFB,0x20,0xE1,0x84,0x43,0x97,0x35,0x43,0x65,0x25,0x43,0x5C,0xD3,0x41,
+0x1B,0x43,0x8F,0x48,0x23,0x40,0x40,0x27,0x40,0x28,0x24,0xE0,0x2A,0xE4,0x00,0x00,
+0x8F,0x24,0xFD,0x0E,0x4D,0x5A,0xFA,0x47,0x4A,0xD6,0x4D,0x07,0xFA,0x41,0x5A,0x55,
+0x47,0x48,0x3E,0x43,0x5A,0x45,0xD5,0x5A,0x01,0x74,0x40,0x63,0xDB,0x43,0x78,0x2D,
+0x43,0x7B,0xE3,0x8F,0x63,0x23,0x60,0x40,0x27,0x60,0x28,0x24,0xE0,0x2A,0xE4,0x00,
+0x00,0x2D,0x24,0xFC,0x4A,0x4C,0xFB,0xFA,0x47,0x67,0xDE,0x43,0x7B,0x3D,0x98,0xE1,
+0xD7,0x7A,0x06,0xC8,0x43,0x39,0x2D,0x40,0x7E,0x35,0x43,0x9D,0xBD,0x40,0xE4,0xC5,
+0x43,0x5C,0xCB,0x40,0xE7,0x1B,0x8C,0xFA,0x20,0xE1,0x84,0x43,0x66,0xBD,0x43,0x44,
+0x2D,0x43,0x3B,0xCB,0x40,0x7A,0x1B,0x8F,0x23,0x23,0x20,0x40,0x27,0x20,0x28,0x24,
+0xE0,0x2A,0xE4,0x00,0x00,0x8F,0x24,0xFD,0x0E,0x4D,0x19,0xFA,0x47,0x28,0xCE,0x4C,
+0x67,0xFA,0x41,0x19,0x45,0x47,0x23,0x3E,0x43,0x39,0x1D,0xD5,0x19,0x01,0x74,0x43,
+0x9C,0xD3,0x43,0x58,0x25,0x43,0x5A,0xDB,0x8F,0x5C,0x23,0x40,0x40,0x27,0x40,0x28,
+0x24,0xE0,0x2A,0xE4,0x00,0x00,0x2D,0x24,0xFC,0x4A,0x4C,0xFA,0xFA,0x47,0x47,0xD6,
+0x43,0x5A,0x3D,0x98,0xE0,0xD7,0x59,0x03,0x20,0xC3,0x60,0x10,0x01,0x9B,0x40,0xFF,
+0x7B,0x08,0xEE,0x9B,0x3F,0x50,0xE0,0xFF,0xE4,0x00,0x00,0x25,0x50,0xEA,0x01,0x5C,
+0xE7,0x00,0x9F,0x41,0x1F,0x7B,0x1C,0x23,0x49,0x08,0x09,0x1B,0x00,0x08,0x7B,0x02,
+0x4D,0x5A,0x20,0x43,0x88,0x35,0x41,0x63,0x2D,0x43,0x9C,0xE3,0x41,0x6B,0x5B,0x5D,
+0x4A,0x02,0x8F,0x8B,0xD7,0x99,0x00,0x51,0x8B,0x99,0xE4,0x00,0x00,0x0F,0x5C,0xEA,
+0x00,0x43,0x28,0xBD,0x40,0x63,0x25,0x43,0x39,0xCB,0x40,0x63,0x1B,0x8F,0x23,0xD7,
+0x3C,0xFD,0xE9,0x8B,0x3C,0xE7,0xFF,0xFF,0x7B,0x4C,0xC7,0x21,0x54,0xE7,0x0F,0xD4,
+0xE6,0x0B,0x3A,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x08,0xC7,0x35,0x0F,0xC7,
+0x17,0x0F,0xA7,0x33,0x0F,0x07,0x35,0x0C,0xC7,0x19,0xE4,0x00,0x02,0x99,0xC0,0xCF,
+0xFF,0xE0,0x20,0x05,0x11,0xC2,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0xF0,0xB7,0x04,
+0xE8,0x9C,0xA1,0x5C,0xA5,0x00,0xF8,0xB7,0x04,0xE8,0x0A,0xE7,0x16,0x43,0x17,0x35,
+0x0B,0x44,0x02,0x43,0x78,0xC3,0x08,0x87,0x18,0x43,0x04,0xD5,0x43,0x38,0xC3,0x0B,
+0x07,0x32,0x8F,0x79,0x40,0xD8,0x35,0x0B,0x27,0x34,0x40,0xC6,0x33,0x43,0x39,0xD5,
+0x43,0x39,0xCB,0x8C,0xD9,0x5C,0xDB,0x17,0x50,0xC0,0x10,0x48,0xC6,0x00,0x20,0xC0,
+0x48,0x08,0xC7,0x35,0x0F,0x07,0x17,0x0E,0xE7,0x33,0x0C,0x87,0x35,0x0C,0xC7,0x19,
+0xD0,0xA4,0x00,0xB5,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x08,0xD8,0x9C,0xDF,0xF8,0xC7,
+0x08,0xD8,0xE4,0x00,0x01,0xA9,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xE4,0x00,
+0x01,0x91,0xD2,0xE1,0x06,0x26,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x04,0xE8,0xC0,0xA0,
+0x10,0x01,0xFC,0xC5,0x06,0xD6,0x0B,0x06,0x04,0xC3,0x0F,0xFF,0xE0,0x20,0x02,0xA5,
+0xFC,0xE7,0x08,0xD8,0x08,0x87,0x18,0x0B,0x27,0x16,0x40,0xF9,0xC5,0x43,0x47,0x3B,
+0xE8,0xE5,0x06,0xD6,0x43,0x39,0x3D,0x43,0x79,0xCB,0x0B,0x26,0x02,0x43,0x24,0xCD,
+0x40,0xF9,0xCB,0x8F,0x67,0x08,0xE6,0x06,0x40,0xE4,0x3D,0x40,0xE7,0x3B,0xC3,0x20,
+0x10,0x01,0x43,0x87,0xD4,0xC3,0x40,0x10,0x01,0xFC,0xF9,0x0B,0xEE,0xFC,0x9A,0x07,
+0x10,0xD7,0x9B,0x04,0x65,0xEF,0x05,0x06,0xD7,0x0B,0x06,0x07,0xFC,0xA0,0x7F,0xFF,
+0x0F,0x06,0x03,0x0C,0xA6,0x07,0x0C,0xA6,0x05,0x08,0xC4,0x05,0xEC,0xDA,0x07,0x11,
+0x08,0xC4,0x07,0x0C,0xA4,0x05,0x0C,0xC4,0x03,0x08,0xC7,0x09,0x0C,0xA4,0x07,0xEC,
+0xD9,0x0B,0xEF,0x08,0xC7,0x0B,0x0C,0xC7,0x03,0x08,0xC7,0x0D,0x0C,0xA7,0x09,0x0C,
+0xA7,0x0B,0x0C,0xC7,0x05,0x0C,0xA7,0x0D,0x08,0xC7,0x0F,0x0C,0xA7,0x0F,0x0C,0xC7,
+0x07,0xC0,0xE0,0x10,0x01,0xFC,0xA7,0x06,0xFC,0x10,0xC5,0x01,0x42,0xF7,0x35,0xF8,
+0xC7,0x06,0xFC,0x1A,0xE5,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE6,0x06,0xFC,0x10,0xA7,
+0x01,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x18,0xA7,0x2C,0xF0,0xC6,0x06,0xFC,
+0x18,0xC7,0x10,0x0D,0x61,0x02,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xFC,0xA0,0x7F,
+0xFF,0x0C,0xA7,0x0F,0x0C,0xA6,0x05,0x0C,0xA6,0x07,0x0C,0xA4,0x05,0x0C,0xA4,0x07,
+0x0C,0xA7,0x09,0x0C,0xA7,0x0B,0x0C,0xA7,0x0D,0xE7,0xFF,0xFF,0x7B,0xFC,0xE0,0x7F,
+0xFF,0xC0,0xA0,0x10,0x01,0xEC,0xE5,0x06,0xD7,0xFC,0xC5,0x06,0xD6,0x0C,0xE6,0x05,
+0x0C,0xE6,0x07,0x0C,0xE6,0x03,0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xEC,0xE5,
+0x07,0x11,0xF8,0x06,0x06,0xFC,0xFC,0x86,0x06,0xFC,0xFC,0xC5,0x07,0x10,0x0C,0xE6,
+0x05,0x0C,0xE6,0x07,0x0C,0xE6,0x03,0xC0,0xA0,0x10,0x01,0xEC,0xE5,0x0B,0xEF,0xFC,
+0xC5,0x0B,0xEE,0x0C,0xE6,0x0F,0x0C,0xE6,0x03,0x0C,0xE6,0x05,0x0C,0xE6,0x07,0x0C,
+0xE6,0x09,0x0C,0xE6,0x0B,0x0C,0xE6,0x0D,0x98,0xE1,0x18,0xE4,0x01,0xC0,0xE0,0x10,
+0x01,0xF8,0x07,0x06,0xF3,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,0x21,0x85,0x29,0xC0,
+0xE0,0x10,0x01,0xF0,0x87,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x06,0xF3,0xC0,
+0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF3,0x67,0x07,0x21,0x4C,0x64,0x18,0xC0,0xE0,
+0x10,0x01,0xFC,0xC6,0x08,0xEE,0xFC,0xE7,0x0B,0xF2,0xFC,0xA0,0x7F,0xFF,0x8C,0x67,
+0x9B,0xA3,0x9B,0x8A,0xE4,0x00,0x01,0x35,0xD6,0xE4,0x00,0x92,0x0C,0xA7,0xFD,0x0C,
+0xA7,0xFF,0x0C,0xA7,0x01,0x0C,0xA7,0x03,0x8A,0xE4,0x0B,0x07,0x00,0xC3,0x0F,0xFF,
+0xE4,0x20,0x00,0x41,0x0B,0x06,0x01,0x0F,0x07,0x01,0x0B,0x06,0x03,0xE4,0x00,0x00,
+0x1B,0x0B,0x07,0xFD,0x0F,0x07,0x01,0x0B,0x07,0xFF,0x0F,0x07,0x03,0x5C,0x80,0x29,
+0x0B,0x06,0x01,0x0F,0x07,0xFD,0x0B,0x46,0x02,0x0F,0x47,0xFF,0x4B,0x60,0x12,0x0B,
+0x27,0x00,0xC3,0x20,0xFF,0xEC,0x20,0x01,0x0D,0x5F,0xD8,0x06,0xC3,0xC0,0xFF,0xEC,
+0x20,0x00,0xE5,0x0B,0x07,0x02,0xC3,0x00,0xFF,0xEC,0x20,0x00,0xBD,0xC3,0x40,0xFF,
+0xEC,0x20,0x00,0xA1,0x43,0xDE,0xCD,0x43,0xDE,0xEB,0x43,0xDE,0xE0,0x8F,0x3E,0x0F,
+0x27,0xFD,0x0F,0x26,0x01,0x43,0x5A,0xC5,0x43,0x5A,0xEB,0x43,0x5A,0xE0,0x8F,0x1A,
+0x5F,0x18,0x06,0x0F,0x07,0xFF,0x0F,0x06,0x03,0x9C,0xE8,0x1C,0xC6,0x1C,0xD4,0xE3,
+0xFB,0x56,0xC0,0xE0,0x10,0x01,0xFA,0xE7,0x06,0xF3,0xC0,0xE0,0x10,0x01,0xFB,0x67,
+0x07,0x21,0x85,0x29,0xFC,0x21,0xFF,0x48,0xED,0x41,0x00,0xB0,0xED,0x61,0x00,0xAC,
+0xED,0x81,0x00,0xA8,0xED,0xA1,0x00,0xA4,0xED,0xC1,0x00,0xA0,0xED,0xE1,0x00,0x9C,
+0xEE,0x01,0x00,0x98,0xEE,0x21,0x00,0x94,0xEE,0x41,0x00,0x90,0xEE,0x61,0x00,0x8C,
+0xEE,0x81,0x00,0x88,0xEE,0xA1,0x00,0x84,0xEE,0xC1,0x00,0x80,0xC2,0xA0,0x10,0x01,
+0xC2,0x80,0x10,0x01,0xC2,0x60,0x10,0x01,0xED,0x21,0x00,0xB4,0x8A,0xC3,0xFE,0xB5,
+0x0B,0x14,0xFE,0x94,0x02,0x66,0xFE,0x73,0x02,0xBA,0x99,0x60,0x99,0x40,0x99,0xC0,
+0xC2,0x40,0x10,0x01,0x1D,0xA1,0x04,0x52,0x20,0x12,0x9A,0x08,0xFD,0x80,0x7F,0xFF,
+0x1D,0xE1,0x64,0xE4,0x00,0x02,0xEF,0x22,0xC4,0x5A,0x44,0xE6,0x86,0x5D,0xC6,0x08,
+0x5C,0xE7,0x08,0x9D,0xDF,0x9C,0xFF,0x45,0xCE,0x3D,0x4D,0xCE,0xF9,0x10,0xE4,0x00,
+0xFE,0xE1,0x00,0x80,0x8E,0xE7,0x21,0xC4,0xAA,0x12,0xF7,0xFC,0xFC,0x61,0x00,0x80,
+0x4F,0x57,0x18,0x8F,0x47,0x4F,0x5A,0x08,0x8F,0x43,0x0D,0x9A,0x85,0x4E,0xF7,0x18,
+0x9E,0xE4,0x8E,0xE7,0x4E,0xF7,0x08,0x8E,0xE3,0x0D,0x97,0x85,0xE4,0x00,0x00,0x5B,
+0x12,0xF7,0xFC,0xFF,0x81,0x00,0x80,0x4F,0x57,0x18,0x0B,0x65,0x01,0x8F,0x47,0x4F,
+0x5A,0x08,0x8F,0x5C,0x0F,0x7A,0x85,0x4E,0xF7,0x18,0x0B,0x45,0x03,0x9E,0xE4,0x8E,
+0xE7,0x4E,0xF7,0x08,0x8E,0xFC,0x0F,0x57,0x85,0xFC,0x61,0x00,0x80,0x8C,0xE3,0x12,
+0xE7,0xFC,0x9E,0xE1,0x1A,0xE7,0xFC,0x9C,0xC1,0x9C,0xA4,0x5C,0xC6,0x00,0x9C,0x82,
+0xD0,0xC9,0xFB,0xBE,0x98,0xE0,0xE4,0x00,0x01,0x5F,0xD0,0xA6,0x01,0x82,0x0B,0xC4,
+0x08,0x0B,0x44,0x00,0x1F,0xA5,0x01,0x8F,0x5E,0xFC,0x61,0x00,0x80,0x0F,0x57,0x00,
+0x4F,0xC6,0x10,0x1C,0x84,0x10,0x8F,0xC3,0x9E,0xE4,0x0F,0xDE,0xE6,0x5F,0xDA,0x15,
+0x48,0xC6,0x28,0x5C,0xBD,0x00,0xD7,0x85,0xFE,0xA5,0xFC,0x81,0x00,0x80,0x4C,0xA6,
+0x18,0x4C,0xC6,0x08,0x8C,0xA7,0x4C,0xA5,0x08,0x8C,0xA4,0x08,0x85,0x84,0x5C,0x98,
+0x11,0x20,0x00,0x71,0xFC,0xA1,0x00,0x80,0x9C,0xC1,0x4C,0xC6,0x10,0x8C,0xC7,0x4C,
+0xC6,0x08,0x8C,0xC5,0x08,0xA6,0x84,0x5C,0xB8,0x11,0x20,0x00,0x1F,0x98,0xA0,0x98,
+0x80,0x88,0xD9,0x8B,0x58,0x9A,0xE0,0x1F,0xA4,0x2A,0x1F,0x85,0x2A,0x9E,0xE1,0x13,
+0xDA,0x00,0x5E,0xF7,0x00,0xD7,0xDB,0x01,0x16,0x5F,0xAA,0x9B,0x20,0x00,0x6D,0x5F,
+0x8A,0x9B,0x20,0x00,0x55,0x0B,0xC6,0x01,0x43,0xDE,0x25,0x0F,0xC6,0x01,0x0B,0xC6,
+0x03,0x43,0xDE,0x2D,0x0F,0xC6,0x03,0x9F,0x42,0x9C,0xC4,0xD2,0xE9,0xFE,0x96,0x9C,
+0xE1,0xD0,0xE4,0x01,0x8A,0x40,0xC7,0x9C,0x4C,0x87,0x08,0x13,0x86,0x00,0x0C,0x01,
+0x64,0x0C,0x01,0x68,0x0C,0x01,0x6C,0x0C,0x01,0x70,0x0C,0x01,0x74,0x0C,0x01,0x78,
+0x4F,0x9C,0x09,0x8C,0x8D,0x5F,0x67,0x00,0x8A,0xEF,0x98,0xA0,0x98,0xC0,0xE7,0xFF,
+0xFE,0xB1,0x9D,0x41,0x1D,0x6B,0x12,0x21,0x48,0xC0,0x98,0x80,0x50,0xA0,0x60,0x18,
+0x01,0x7C,0x18,0x01,0x7D,0x18,0x01,0x7E,0x18,0x01,0x7F,0xEC,0xF2,0x00,0x7E,0x88,
+0x6D,0x84,0xE8,0x4F,0x2B,0x08,0x43,0x0A,0x8B,0x8F,0x35,0x8F,0x14,0x88,0xB9,0x88,
+0x98,0x98,0xC0,0xE7,0xFF,0xFC,0xC9,0xEE,0xC1,0x00,0x82,0xEE,0xA1,0x00,0x86,0xEE,
+0x81,0x00,0x8A,0xEE,0x61,0x00,0x8E,0xEE,0x41,0x00,0x92,0xEE,0x21,0x00,0x96,0xEE,
+0x01,0x00,0x9A,0xED,0xE1,0x00,0x9E,0xED,0xC1,0x00,0xA2,0xED,0xA1,0x00,0xA6,0xED,
+0x81,0x00,0xAA,0xED,0x61,0x00,0xAE,0xED,0x41,0x00,0xB2,0xED,0x21,0x00,0xB6,0xFC,
+0x21,0x00,0xB8,0x85,0x29,0xC3,0x80,0x10,0x01,0x1C,0x21,0xE8,0xC0,0xE0,0x10,0x01,
+0x0D,0x41,0x14,0x0D,0x61,0x10,0x0D,0x81,0x0C,0x0D,0xA1,0x08,0x0D,0xC1,0x04,0xFC,
+0xE7,0x04,0xEA,0xF1,0x7C,0x08,0xD8,0x0B,0x27,0x16,0x53,0x80,0x1C,0x08,0xA7,0x06,
+0x08,0xC7,0x0E,0xCA,0xE0,0x07,0xFF,0x0B,0x47,0x14,0x08,0x87,0x02,0x0B,0x67,0x0C,
+0x41,0xD7,0xCD,0x41,0x6B,0xE3,0x41,0x85,0xD5,0x1F,0x1B,0x1E,0xC0,0xE0,0x10,0x01,
+0x5F,0x18,0x06,0xFC,0xE7,0x08,0xF0,0x40,0x65,0xCD,0x41,0xB7,0x35,0x5D,0xCE,0x04,
+0x8D,0x67,0x5F,0x5A,0x04,0x41,0x45,0x25,0x41,0x17,0x2D,0x43,0xC4,0x2D,0x43,0xA6,
+0xC5,0x43,0x98,0x35,0xCB,0x20,0x07,0xFF,0xE4,0x00,0x00,0xC1,0x0A,0xE7,0xFE,0xD4,
+0xB7,0x00,0x98,0x42,0xF7,0x25,0x42,0xEC,0xBB,0x42,0xF7,0x50,0x8E,0xFA,0xE4,0x00,
+0x00,0x2D,0xD6,0xE8,0x00,0xA8,0x42,0xF9,0xBD,0x42,0xF7,0x25,0x42,0xE3,0xBB,0x42,
+0xF7,0xF0,0x8E,0xEE,0x0E,0xE7,0xFF,0x0A,0xE7,0x00,0xD4,0xD7,0x00,0xA0,0x1E,0xF7,
+0xE2,0x42,0xF7,0xDD,0x42,0xF7,0x33,0x42,0xF7,0xE8,0xE4,0x00,0x00,0x31,0xD6,0xED,
+0x00,0xB8,0x42,0xF9,0xBD,0x42,0xF7,0xC5,0x42,0xF7,0x33,0x42,0xF7,0xE0,0xFE,0xF7,
+0x07,0xFF,0x0E,0xE7,0x01,0x1C,0xE7,0x1C,0xD4,0xEB,0xFD,0x26,0x0D,0xC1,0x06,0x0D,
+0xA1,0x0A,0x0D,0x81,0x0E,0x0D,0x61,0x12,0x0D,0x41,0x16,0x1C,0x21,0x18,0x85,0x29,
+0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0xEA,0x0A,0xE7,0x12,0x08,0xA7,0x16,0xC8,0xC0,
+0x07,0xFF,0x08,0x87,0x14,0x43,0x46,0x25,0x43,0x5A,0x2D,0x08,0xA7,0x10,0x40,0xC6,
+0x2D,0x43,0x26,0xBD,0xC2,0xE0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF3,0x17,0x08,0xD8,
+0xFC,0xE7,0x08,0xEE,0x52,0xE0,0x1C,0xC8,0xC0,0x07,0xFF,0x42,0xF8,0xBB,0x8E,0xE7,
+0xE4,0x00,0x00,0x4B,0x0B,0x07,0x00,0x43,0x18,0x25,0x43,0x18,0x33,0x43,0x18,0xD0,
+0x0F,0x07,0x01,0x0B,0x07,0x02,0x43,0x18,0x2D,0x43,0x18,0x33,0x43,0x18,0xC8,0x0F,
+0x07,0x03,0x1C,0xE7,0x1C,0xD4,0xF7,0xFE,0xFE,0x85,0x29,0xC0,0xF4,0x00,0x01,0xC8,
+0xA7,0x79,0xE9,0xC8,0xE7,0x79,0xD0,0x10,0xA5,0x00,0xC0,0xC0,0x10,0x01,0xF8,0xA6,
+0x04,0xD4,0x08,0x87,0x01,0xC0,0xE0,0x10,0x01,0x5C,0x84,0x00,0xC0,0xA0,0x10,0x01,
+0xF8,0x87,0x04,0xD5,0xE8,0xE5,0x07,0x23,0xC8,0x80,0x7F,0xFF,0x44,0xE7,0x24,0xEC,
+0xE5,0x07,0x23,0xD0,0x61,0x1B,0x66,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x04,0xCC,0x20,
+0xC0,0x3A,0xFC,0xC0,0x80,0x00,0x44,0xE7,0x35,0xEC,0xE5,0x07,0x23,0xC0,0xA0,0x10,
+0x01,0xC8,0xC0,0x07,0xFF,0xFC,0xE5,0x08,0xD8,0x08,0x87,0x19,0x40,0x86,0x25,0x0C,
+0x87,0x19,0xF0,0xA5,0x08,0xD8,0x24,0xA4,0x55,0x08,0xA7,0x35,0x40,0xC6,0x2D,0x0C,
+0xC7,0x35,0x08,0xC7,0x1D,0x40,0xC0,0x35,0x0C,0xC7,0x1D,0xC0,0xC0,0x10,0x01,0xFC,
+0xE6,0x08,0xD8,0xF0,0xC6,0x08,0xD8,0xD0,0xC1,0x05,0x29,0x08,0xC7,0x16,0x98,0xE0,
+0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13,0x5C,
+0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8,
+0x0C,0xE6,0x13,0x08,0xC6,0x18,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,
+0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6,0x38,
+0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8,0x0C,0xE6,0x15,0x08,0xC6,0x32,0x98,0xE0,
+0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13,0x5C,
+0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8,
+0x0C,0xE6,0x2F,0x08,0xC6,0x34,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,
+0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6,0x38,
+0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x09,0x09,0xE4,0x00,0x00,0xA3,0x08,0xC7,0x16,0x98,
+0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13,
+0x5C,0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,
+0xD8,0x0C,0xE6,0x13,0x08,0xC6,0x18,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,
+0xC8,0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6,
+0x38,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x08,0xED,0xC0,0xE0,0x10,0x01,0x53,0x20,0x1C,
+0xF0,0xC7,0x08,0xD8,0x9B,0x0F,0xC0,0xE0,0x10,0x01,0x43,0x26,0xCB,0xFC,0xE7,0x08,
+0xEC,0xFE,0xE0,0x07,0xF0,0x8F,0x27,0x98,0x8A,0xFC,0xA0,0x07,0xF5,0xE4,0x00,0x00,
+0x6B,0x0B,0x47,0xFF,0xD3,0x4E,0x00,0x3D,0x0F,0x07,0xFF,0x0B,0x47,0xFF,0xC3,0x40,
+0xFE,0x0A,0x20,0x00,0x19,0x0E,0xE7,0xFF,0x0B,0x47,0x01,0xD3,0x49,0x00,0x3D,0x0C,
+0x87,0x01,0x0B,0x47,0x01,0xC3,0x40,0xFE,0xAA,0x20,0x00,0x19,0x0C,0xA7,0x01,0x1C,
+0xE7,0x1C,0xD4,0xF9,0xFE,0x7E,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x24,0xC4,
+0x7D,0x08,0xA7,0x2F,0x08,0xC7,0x13,0x40,0xC5,0x35,0x08,0xA7,0x31,0x0C,0xC7,0x1B,
+0x08,0xC7,0x15,0x40,0xC5,0x35,0x0C,0xC7,0x1D,0xE4,0x00,0x00,0x15,0x0C,0x07,0x1D,
+0x0C,0x07,0x1B,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF0,0xE7,0x04,0xD4,0xFC,
+0xC5,0x0B,0x60,0xD0,0xE0,0x04,0x86,0x50,0xE0,0x52,0xC0,0x80,0x10,0x01,0xF8,0xE5,
+0x0B,0x60,0xFC,0xE4,0x08,0xD8,0x0A,0xE7,0x13,0x1A,0xE6,0x02,0x4E,0xF7,0x41,0x08,
+0xA7,0x15,0x4E,0xF7,0x20,0x18,0xA6,0x03,0x4C,0xA5,0x41,0x54,0xA5,0x0F,0x44,0xB7,
+0x2D,0x18,0xA6,0x01,0xF0,0xA4,0x08,0xD8,0x24,0xA4,0xAD,0x08,0xA7,0x1C,0x94,0x8F,
+0x18,0xA6,0x06,0xC8,0x84,0xFF,0xF0,0x08,0xE7,0x1A,0x4C,0xA5,0x42,0x18,0xE6,0x05,
+0x54,0xA5,0x0F,0x4C,0xE7,0x21,0x44,0xE7,0x24,0x44,0xE7,0x2D,0x18,0xE6,0x04,0xE4,
+0x00,0x00,0x1B,0x18,0x06,0x06,0x18,0x06,0x04,0x18,0x06,0x05,0xC0,0xE0,0x10,0x01,
+0x98,0xC0,0xFC,0xE7,0x0B,0x60,0x1C,0xA7,0x07,0x10,0x87,0x00,0x9C,0xE1,0x8C,0xC4,
+0xD4,0xE5,0xFF,0xCE,0x40,0xC0,0x35,0xC0,0xE0,0x10,0x01,0xF8,0xC7,0x0B,0x67,0xE4,
+0x00,0x01,0xDD,0x88,0xA6,0xFC,0xE6,0x00,0x82,0x18,0x06,0x00,0x9C,0xC1,0xD4,0xC7,
+0xFF,0xDE,0xC0,0xC0,0x10,0x01,0xF2,0xE6,0x08,0xD8,0x4C,0x97,0x20,0x50,0x84,0x02,
+0xFC,0xC6,0x08,0xD8,0xC3,0x40,0x10,0x01,0xFC,0xFA,0x0B,0x60,0x18,0x87,0x12,0x08,
+0x86,0x1C,0x18,0x87,0x10,0x0B,0x26,0x13,0x1B,0x27,0x02,0x0B,0x06,0x15,0x1B,0x07,
+0x04,0x08,0xC6,0x1A,0x18,0xC7,0x0E,0x4C,0xC6,0x41,0x53,0x60,0x62,0x18,0xC7,0x0D,
+0x4F,0x39,0x41,0x4F,0x18,0x41,0x1B,0x27,0x01,0x1B,0x07,0x03,0x56,0xF7,0x01,0x4C,
+0x84,0x41,0x52,0xF7,0x20,0x18,0x87,0x0F,0x1A,0xE7,0x11,0xFB,0x7A,0x0B,0x60,0x1C,
+0xC5,0x1F,0x98,0xE0,0x10,0x85,0x00,0x9C,0xA1,0x8C,0xE4,0xD4,0xA6,0xFF,0xCE,0x40,
+0xE0,0x3D,0xC0,0xC0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF8,0xE6,0x0B,0x7F,0xC3,0x20,
+0x10,0x01,0xC0,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xFC,0xE7,0x0B,0x80,0xFC,0xA5,
+0x0A,0x7C,0xFF,0x39,0x09,0xE4,0xFF,0x18,0x0B,0x14,0x98,0xC0,0xC2,0xE0,0x10,0x01,
+0xF0,0x97,0x04,0xD5,0x20,0x84,0x38,0xD0,0x84,0x00,0xDA,0x40,0x86,0xC4,0xE4,0x00,
+0x00,0x0F,0x40,0x86,0xCC,0x08,0x84,0x00,0x18,0x87,0x01,0x4C,0x84,0x41,0xE4,0x00,
+0x00,0x21,0x0C,0x85,0x02,0x4F,0x44,0x42,0x4C,0x84,0x82,0x1B,0x47,0x01,0x18,0x87,
+0x00,0x9C,0xC2,0x9C,0xE2,0x9C,0xA4,0x5C,0xC9,0x89,0x23,0xFF,0x19,0xC0,0xE0,0x10,
+0x01,0x98,0xC1,0xE8,0xE7,0x07,0x22,0xD0,0xFF,0x10,0x54,0xE4,0x00,0x03,0xFD,0xD0,
+0x60,0x05,0x96,0xF0,0x86,0x04,0xD4,0xC0,0xA0,0x10,0x01,0xFC,0xC5,0x0B,0x60,0x20,
+0x80,0xFE,0x9A,0xFF,0x88,0x86,0x18,0x06,0x05,0x1A,0xE6,0x06,0x1A,0xE6,0x01,0x1A,
+0xE6,0x02,0x1A,0xE6,0x03,0x1A,0xE6,0x04,0x50,0xC0,0x52,0xF8,0xC5,0x0B,0x60,0x1C,
+0xA4,0x07,0x98,0xC0,0x12,0xE4,0x00,0x9C,0x81,0x8C,0xD7,0xD4,0x85,0xFF,0xCE,0x40,
+0xC0,0x35,0xC0,0xA0,0x10,0x01,0xF8,0xC5,0x0B,0x67,0xE4,0x00,0x00,0x99,0x88,0xA6,
+0xFC,0x86,0x00,0x82,0x18,0x06,0x00,0x9C,0xC1,0xD4,0xC4,0xFF,0xDE,0x50,0x80,0x62,
+0xC0,0xC0,0x10,0x01,0x9A,0xFF,0xF8,0x86,0x0B,0x60,0xC0,0xC0,0x10,0x01,0x1C,0x85,
+0x1F,0xFC,0xC6,0x0B,0x61,0x1A,0xE6,0x00,0x9C,0xC1,0xD4,0xC4,0xFF,0xDE,0x98,0xC0,
+0x12,0xE5,0x00,0x9C,0xA1,0x8C,0xD7,0xD4,0xA4,0xFF,0xCE,0x40,0xC0,0x35,0xC0,0xA0,
+0x10,0x01,0xF8,0xC5,0x0B,0x7F,0xC0,0xC0,0x10,0x01,0xFC,0xA0,0x80,0x00,0xEC,0x06,
+0x06,0xE4,0x44,0xE7,0x2D,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0xE4,0x00,0x02,
+0xA9,0xD0,0x62,0x0A,0x86,0xF0,0x86,0x04,0xD4,0xC0,0xA0,0x10,0x01,0xFC,0xC5,0x0B,
+0x60,0x20,0x81,0x32,0x98,0x9F,0x18,0x86,0x06,0x18,0x86,0x01,0x18,0x86,0x02,0x18,
+0x86,0x03,0x18,0x86,0x04,0x50,0x80,0x52,0xF8,0x85,0x0B,0x60,0xC0,0xA0,0x10,0x01,
+0xF0,0xA5,0x06,0xBC,0x8A,0xE6,0x18,0xA6,0x05,0xC0,0xA0,0x10,0x01,0x98,0xC0,0xFC,
+0xA5,0x0B,0x67,0x10,0x97,0x00,0x9E,0xE1,0x8C,0xC4,0xD6,0xE5,0xFF,0xCE,0x40,0xC0,
+0x35,0xC0,0xA0,0x10,0x01,0xF8,0xC5,0x0B,0x67,0xE4,0x00,0x01,0x73,0x8B,0xA6,0xFC,
+0x86,0x00,0x82,0x88,0xA6,0x18,0x05,0x00,0x9C,0xA1,0xD4,0xA4,0xFF,0xDE,0xC3,0x60,
+0x10,0x01,0xC0,0x80,0x10,0x01,0xFC,0xBB,0x0B,0x60,0xF3,0x04,0x08,0xD8,0x4E,0xF8,
+0x20,0x52,0xF7,0x02,0xFC,0x84,0x08,0xD8,0x1A,0xE5,0x12,0x53,0x80,0x62,0x0A,0xE4,
+0x1C,0x57,0x18,0x01,0x1A,0xE5,0x10,0x53,0x18,0x20,0x0B,0x44,0x13,0x4E,0xF7,0x41,
+0x1B,0x45,0x02,0x1F,0xBD,0x1F,0x0B,0x24,0x15,0x4F,0x5A,0x41,0x1B,0x25,0x04,0x4F,
+0x39,0x41,0x08,0x84,0x1A,0x1B,0x45,0x01,0x18,0x85,0x0E,0x1B,0x25,0x03,0x1B,0x05,
+0x11,0x4C,0x84,0x41,0x1A,0xE5,0x0F,0x18,0x85,0x0D,0xFB,0x9B,0x0B,0x60,0x98,0xA0,
+0x10,0x86,0x00,0x9C,0xC1,0x8C,0xA4,0xD4,0xDD,0xFF,0xCE,0x40,0xA0,0x2D,0xC0,0xC0,
+0x10,0x01,0xC2,0xE0,0x10,0x01,0xF8,0xA6,0x0B,0x7F,0xFE,0xF7,0x0B,0x60,0xC0,0xA0,
+0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xA5,0x0B,0x14,0xFC,0xC6,0x0B,0x80,0x08,0x85,
+0x00,0x18,0x86,0x01,0x4C,0x84,0x41,0x18,0x86,0x00,0x9C,0xA2,0x9C,0xC2,0xD4,0xB7,
+0xFF,0x86,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x04,0xCD,0x20,0xC0,0x78,0x20,0xC4,0xAA,
+0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0B,0x65,0x5C,0xC8,0x01,0x20,0x00,0x35,0xC0,0xC0,
+0x10,0x00,0x20,0x00,0x19,0x20,0xC0,0x4A,0xFC,0xC0,0x80,0x00,0x44,0xE7,0x35,0xC0,
+0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0x98,0xC2,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,
+0xE4,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xA5,0x02,0xC2,0xFC,
+0xE7,0x02,0xC4,0xC0,0xC0,0x10,0x01,0x20,0x60,0x64,0xF2,0xE6,0x06,0xBE,0xC0,0x80,
+0x10,0x01,0x8E,0xE5,0xFC,0x84,0x0B,0x14,0x98,0x61,0x98,0xC3,0xE4,0x00,0x00,0xB7,
+0xF2,0xE6,0x06,0xBE,0xC0,0x80,0x10,0x01,0x8E,0xE5,0xFC,0x84,0x0B,0x14,0x98,0x61,
+0xE4,0x00,0x00,0x49,0x08,0xC7,0x00,0x13,0x05,0x00,0x4F,0x26,0xF9,0x4F,0x18,0x08,
+0x8C,0xD9,0x8F,0x04,0x4C,0xC6,0x0A,0x0B,0x18,0x00,0x9C,0xE2,0x5F,0x06,0x15,0x9C,
+0xA1,0x48,0x63,0x00,0xD4,0xB7,0xFF,0x06,0xE4,0x00,0x00,0x47,0x13,0x05,0x00,0x4F,
+0x18,0x08,0x8F,0x04,0x9C,0xA1,0x0B,0x38,0x00,0x0B,0x07,0x00,0x9C,0xE2,0x43,0x18,
+0x30,0x5F,0x19,0x15,0x48,0x63,0x00,0xD4,0xB7,0xFF,0x2E,0x85,0x29,0xC0,0xE0,0x10,
+0x01,0xC0,0x80,0x10,0x01,0xF3,0x47,0x06,0xBE,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,
+0x01,0xC3,0x20,0x10,0x01,0xF0,0xE7,0x06,0xBC,0xFC,0x84,0x02,0xC4,0xFC,0xA5,0x0B,
+0x14,0xFF,0x39,0x02,0xC2,0x98,0xC0,0x9B,0x01,0xE4,0x00,0x00,0x4D,0x42,0xE6,0xCC,
+0x12,0xF7,0x00,0x4E,0xF7,0x08,0x8E,0xE5,0x0B,0x77,0x00,0x0A,0xE4,0x00,0xD7,0x77,
+0x05,0x1C,0x4E,0xF8,0x34,0x46,0xF7,0xBF,0x44,0xE7,0xBC,0x9C,0xC1,0x9C,0x82,0x5F,
+0x66,0x00,0xC2,0xE0,0x10,0x01,0xD7,0x5B,0xFE,0xBD,0xC0,0xC0,0x10,0x01,0xF0,0x97,
+0x02,0xC2,0xF8,0xE6,0x06,0xBC,0x4C,0x84,0x08,0x8C,0x85,0x0B,0x24,0x00,0xC0,0x80,
+0x10,0x01,0xEB,0x04,0x02,0xC4,0x4F,0x58,0xF9,0x8F,0x1A,0x4F,0x18,0x0A,0xD7,0x38,
+0x01,0x60,0xFE,0xF7,0x02,0xC2,0x12,0xF7,0x01,0x4E,0xF7,0x08,0xFC,0x84,0x02,0xC4,
+0x8C,0xB7,0x08,0x84,0x02,0x08,0xA5,0x00,0x4E,0xE4,0xF9,0x8C,0x97,0x4C,0x84,0x0A,
+0xD4,0xA4,0x00,0x50,0x98,0xE4,0xE4,0x00,0x00,0x1B,0x98,0xBB,0xC0,0xC0,0x10,0x01,
+0x44,0xE7,0x2C,0xF8,0xE6,0x06,0xBC,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBC,0xC0,
+0xE0,0x10,0x01,0x20,0xC0,0x38,0xE8,0xC7,0x07,0x23,0x50,0xC6,0x10,0xE4,0x00,0x00,
+0x1D,0xE8,0xC7,0x07,0x23,0x1C,0xA0,0xEF,0x44,0xC6,0x2C,0xEC,0xC7,0x07,0x23,0x85,
+0x29,0x4E,0xF8,0x34,0x44,0xF7,0x3D,0x5C,0xE7,0x00,0xE7,0xFF,0xFE,0xC3,0x9C,0x38,
+0x0D,0x41,0x00,0x0D,0x21,0x04,0xE7,0xFF,0xFE,0x0E,0xC1,0x40,0x10,0x01,0xEC,0xEA,
+0x07,0x0E,0x20,0xE0,0x7E,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE0,0xC0,0xE0,0x10,
+0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x10,0x20,0xE1,0xEC,0x98,0xE1,0xE4,0x00,0x00,
+0x69,0x20,0xE4,0xE2,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x06,0xE0,0x9C,0xE1,0x5C,0xE7,
+0x00,0xF8,0xE6,0x06,0xE0,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x07,0x23,0x54,0xC6,0x10,
+0x20,0xC1,0x3C,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x07,0x06,0xD4,0xE6,0x02,0x41,0x98,
+0xE2,0xEC,0xEA,0x07,0x0C,0xE4,0x00,0x00,0x7D,0x20,0xE8,0xB6,0xC0,0xE0,0x10,0x01,
+0xF8,0x07,0x06,0xE0,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x10,0x20,
+0xE0,0x44,0x0D,0x41,0x02,0x0D,0x21,0x06,0x98,0x62,0x9C,0x28,0xE7,0xFF,0xF0,0x9F,
+0x98,0xE3,0xE7,0xFF,0xFF,0x9F,0x20,0xEC,0x36,0x98,0x60,0xE7,0xFF,0xF0,0x80,0xEC,
+0x0A,0x07,0x0C,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0x0D,
+0x21,0x04,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x08,0xD0,0xE0,0x07,
+0x12,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xE6,0xD0,0xE1,0x06,0xB2,0xC0,0xE0,0x10,
+0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0xFC,0xC6,0x04,0xEA,0x08,0x87,0x18,
+0x08,0xA6,0x0E,0xD4,0xA4,0x01,0x10,0x08,0xE7,0x16,0x08,0xC6,0x06,0xD4,0xE6,0x00,
+0xC0,0xC8,0xA0,0x07,0xFF,0x40,0xC5,0x35,0xD4,0xC7,0x00,0x68,0x98,0x60,0xE7,0xFF,
+0xFB,0x0A,0x20,0x61,0x92,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFC,0x84,0x08,
+0xD8,0xFE,0xF7,0x04,0xEA,0xCB,0x00,0x07,0xFF,0x08,0xB7,0x0E,0x08,0xE4,0x18,0x40,
+0xD8,0x2D,0xD4,0xE6,0x00,0xA8,0x08,0x84,0x16,0x0A,0xF7,0x06,0xD4,0x97,0x00,0x58,
+0x42,0xF8,0xBD,0xD6,0xE4,0x01,0x9C,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10,0x01,0xE8,
+0x84,0x08,0xEE,0xEA,0xF7,0x04,0xF0,0xD6,0xE4,0x00,0x60,0xD4,0xE5,0x00,0x40,0xD4,
+0xC7,0x00,0xBC,0xCB,0x00,0x07,0xFF,0x42,0xF8,0xBD,0xD4,0x97,0x02,0x28,0xD4,0xE5,
+0x02,0x08,0xD4,0xC7,0x01,0xE8,0xE7,0xFF,0xE4,0xEE,0xC0,0xE0,0x10,0x01,0x98,0xC3,
+0xEC,0xC7,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE8,0xC0,0xE0,0x10,0x01,
+0xF8,0x07,0x06,0xBD,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0,0xC0,0xE0,0x10,0x01,
+0x0D,0x21,0x06,0x98,0x66,0xF8,0x07,0x07,0x01,0x9C,0x28,0xE7,0xFF,0xDB,0x3F,0x0D,
+0x21,0x06,0x9C,0x28,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF0,0xC5,
+0x02,0xBA,0xF2,0xE7,0x02,0xBE,0xFC,0xA5,0x02,0xBA,0xFC,0xE7,0x02,0xBE,0x10,0xA5,
+0x01,0x10,0x87,0x02,0x8C,0xC5,0x13,0x47,0x01,0x13,0x07,0x03,0x8F,0x57,0x8F,0x04,
+0xC2,0xE0,0x10,0x01,0x5F,0x18,0x00,0xC0,0xA0,0x10,0x01,0x4C,0x98,0x08,0xFC,0xA5,
+0x09,0xE4,0x5C,0xC6,0x00,0x5F,0x5A,0x00,0xFE,0xF7,0x08,0x78,0x8C,0x85,0x98,0xE0,
+0xE4,0x00,0x00,0x41,0x0B,0x37,0x01,0xD4,0xC7,0x00,0x5D,0x0F,0x24,0x01,0xE4,0x00,
+0x00,0x0F,0x0F,0x25,0x01,0x9C,0xE1,0x9E,0xE2,0x5C,0xE7,0x00,0x9C,0x82,0x9C,0xA2,
+0xD7,0x47,0xFF,0x25,0x4C,0xC6,0x08,0x4F,0x18,0x08,0xC0,0xE0,0x10,0x01,0xC0,0xA0,
+0x10,0x01,0xFC,0xE7,0x08,0xA8,0xFC,0xA5,0x09,0xE4,0x8F,0x07,0x8C,0xC5,0xE4,0x00,
+0x00,0x1D,0x08,0xA7,0x01,0x9C,0xE2,0x0C,0xA6,0x01,0x9C,0xC2,0xD4,0xF8,0xFF,0xB6,
+0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xC7,
+0x04,0xDC,0x20,0xC4,0x46,0x98,0x60,0xF8,0x07,0x04,0xDC,0xE7,0xFF,0xED,0x00,0xE7,
+0xFF,0xD6,0x10,0xE7,0xFF,0xFE,0x86,0x98,0x67,0xE7,0xFF,0xD9,0xA2,0xC0,0xE0,0x10,
+0x01,0xC1,0x40,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFD,0x4A,0x0B,0x14,0x98,0xC0,0x88,
+0xEA,0xE4,0x00,0x00,0x35,0x9C,0xC1,0x08,0xA7,0x00,0x5C,0xC6,0x00,0x5C,0xB0,0x31,
+0x20,0x00,0x4D,0x5C,0xAF,0xD9,0x9C,0xE2,0x20,0x00,0x2D,0xD4,0x86,0xFF,0x55,0xE4,
+0x00,0x01,0xEB,0x98,0x61,0xE7,0xFF,0xD9,0x2A,0xC0,0xE0,0x10,0x01,0xC0,0x80,0x10,
+0x01,0xF0,0xC7,0x07,0x18,0xF0,0xA4,0x07,0x00,0x9C,0xC1,0x5C,0xC6,0x00,0xF8,0xC7,
+0x07,0x18,0x1C,0xE5,0x01,0x5C,0xE7,0x00,0xF8,0xE4,0x07,0x00,0xD0,0xEA,0x00,0xC5,
+0x5C,0xC2,0x9B,0x20,0x00,0x45,0xC0,0xC0,0x10,0x01,0xF2,0xE6,0x0C,0x0C,0x98,0xC0,
+0xE4,0x00,0x00,0xC3,0x98,0xC1,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0x84,0xC0,0xE0,
+0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0x80,0xFF,0x7F,0xF8,0x06,0x07,0x00,0xE8,0xC7,
+0x07,0x23,0x44,0xC6,0x24,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,
+0x18,0xC0,0xE0,0x10,0x01,0x1C,0xA0,0xEF,0xEC,0x07,0x06,0xEC,0xC0,0xF4,0x00,0x01,
+0xC8,0xE7,0x7A,0x10,0x0C,0xC7,0x02,0xE4,0x00,0x00,0xBB,0x9C,0xC1,0x08,0x8A,0x00,
+0x5C,0xC6,0x00,0x5C,0x98,0x11,0x20,0x00,0x4D,0x5C,0x87,0xF9,0x9D,0x42,0x20,0x00,
+0x2D,0xD6,0xE6,0xFF,0x55,0xE4,0x00,0x00,0x1F,0x20,0xE0,0x2C,0xC0,0xE0,0x10,0x01,
+0xF8,0xA7,0x07,0x00,0xC0,0xF4,0x00,0x01,0xFC,0x80,0x80,0x00,0xC8,0xC7,0x26,0x18,
+0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x24,0x28,
+0x08,0xA6,0x01,0x50,0xA5,0x01,0xC8,0xE7,0x7A,0x10,0x0C,0xA6,0x01,0xFC,0xA0,0xFE,
+0xFF,0x0C,0xC7,0x02,0x44,0xC6,0x2C,0x0C,0xC7,0x00,0x0D,0x41,0x02,0x0D,0x21,0x06,
+0x9C,0x28,0x85,0x29,0x98,0x65,0xE7,0xFF,0xFE,0x1F,0xC0,0xE0,0x10,0x01,0xFC,0xE7,
+0x0C,0x0C,0xC0,0xC0,0x10,0x01,0x10,0x87,0x01,0x10,0xA7,0x04,0xFC,0xC6,0x09,0x4C,
+0xC0,0xE0,0x10,0x01,0x42,0xE4,0x2B,0xFC,0xE7,0x0B,0x14,0x5E,0xF7,0x00,0x4E,0xF7,
+0x10,0x8E,0xE7,0xE4,0x00,0x00,0x27,0x0B,0x27,0x02,0x0B,0x07,0x00,0x9C,0xE4,0x8F,
+0x19,0x0F,0x06,0x00,0x9C,0xC4,0xD4,0xF7,0xFF,0x8E,0xC0,0xE0,0x10,0x01,0x40,0xA4,
+0x2B,0xFF,0x07,0x09,0x4C,0x98,0xC0,0xE8,0xE7,0x09,0x4C,0xE4,0x00,0x00,0x37,0x1E,
+0xE6,0x01,0x4C,0x86,0x10,0x5C,0xD7,0x00,0x8C,0x98,0x0E,0xE4,0x02,0x5E,0xE7,0x1D,
+0x5E,0xF7,0x06,0x48,0xF7,0x38,0xD4,0xA6,0xFF,0x4C,0xC0,0xC0,0x10,0x01,0xEC,0xE6,
+0x06,0xC3,0xC0,0xE2,0x32,0x88,0x20,0x00,0x8D,0xFC,0xC0,0x01,0x18,0xC0,0xE0,0x22,
+0xEC,0x48,0xE7,0x30,0xC0,0xC0,0x10,0x01,0x5C,0xE7,0x06,0xFC,0xC6,0x04,0xEA,0x0C,
+0xE6,0x2F,0x0C,0xE6,0x23,0xE4,0x00,0x00,0x75,0xC0,0xE0,0xAE,0xEC,0xC8,0xC0,0x01,
+0x18,0x20,0x00,0x2F,0x98,0xC5,0x40,0xC7,0x30,0x5C,0xC6,0x06,0xC0,0xA0,0x10,0x01,
+0xEC,0xC5,0x05,0x0D,0xC0,0xE0,0xAE,0xEC,0xC8,0xC0,0x01,0x18,0x20,0x00,0x2F,0x98,
+0xC5,0x40,0xE7,0x30,0x5C,0xC7,0x06,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x05,0x19,0x85,
+0x29,0x4C,0x63,0x10,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0B,0x14,
+0xFC,0xC6,0x09,0x4C,0x8C,0x67,0xE4,0x00,0x00,0x27,0x08,0x87,0x02,0x08,0xA7,0x00,
+0x9C,0xE4,0x8C,0xA4,0x0C,0xA6,0x00,0x9C,0xC4,0xD4,0xE3,0xFF,0x8E,0x85,0x29,0x9C,
+0x38,0x0D,0x41,0x04,0x0D,0x61,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x04,0xD4,0xD0,
+0xE2,0x05,0x32,0xC0,0x80,0x10,0x01,0xFC,0xE4,0x0C,0x0C,0x10,0xE7,0x04,0x4C,0xA7,
+0x08,0x4D,0x47,0x10,0x9C,0xFF,0x1F,0x25,0xFF,0x4F,0x47,0x08,0xC0,0xC0,0x10,0x01,
+0x9D,0x5F,0xFC,0xC6,0x0B,0x14,0xF1,0x04,0x0C,0x0C,0x1F,0xC5,0x01,0x4F,0xB9,0x08,
+0x98,0xE0,0x9B,0x0A,0x53,0x80,0x15,0x8A,0xE6,0x53,0x60,0x16,0xE4,0x00,0x00,0xC5,
+0x24,0x84,0x6D,0xD4,0xFA,0x00,0xC2,0xD4,0xF9,0x00,0xA2,0xD4,0xE5,0x00,0x82,0xD4,
+0xFE,0x00,0x62,0xD4,0xFD,0x00,0x42,0xD4,0xEA,0x02,0x1E,0x20,0x60,0xC6,0x20,0x84,
+0x4E,0x08,0x97,0x02,0x40,0x84,0xC0,0x40,0x84,0xDB,0x0C,0x97,0x03,0xE4,0x00,0x00,
+0x5B,0xD4,0xFA,0x00,0x8E,0x08,0x86,0x00,0x40,0x84,0xC0,0x40,0x84,0xE3,0xE4,0x00,
+0x00,0x33,0x08,0x86,0x01,0x4C,0x84,0x08,0xE4,0x00,0x00,0x1F,0x08,0x86,0x00,0x4D,
+0x64,0xF9,0x8C,0x8B,0x4C,0x84,0x0A,0x0C,0x86,0x01,0x9C,0xE1,0x9C,0xC2,0x5C,0x87,
+0x00,0xD5,0x04,0xFC,0xFD,0x0D,0x61,0x02,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xC0,
+0xE0,0x10,0x01,0xFC,0xA0,0xDF,0x3F,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC,0xC7,
+0x07,0x23,0xC0,0xE0,0x10,0x01,0x1C,0x21,0xC0,0xF8,0x07,0x06,0xE9,0x0D,0x21,0x3C,
+0x0D,0x41,0x38,0x0D,0x61,0x34,0x98,0x67,0x0D,0x81,0x30,0x0D,0xA1,0x2C,0xE7,0xFF,
+0xD3,0x58,0x98,0x60,0xE7,0xFF,0xFE,0x16,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xCC,
+0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xCD,0xC0,0xE0,0x10,0x01,0xC1,0x60,0x10,0x01,
+0xF0,0x87,0x0C,0x10,0xFD,0x6B,0x0B,0x14,0xC0,0xE0,0x10,0x01,0x4E,0xE4,0x10,0xFC,
+0xE7,0x09,0x4C,0x89,0x4B,0x43,0x17,0x5C,0x88,0xA7,0x88,0xCB,0xE4,0x00,0x00,0x27,
+0x0B,0x46,0x02,0x0B,0x26,0x00,0x9C,0xC4,0x8F,0x3A,0x0F,0x25,0x00,0x9C,0xA4,0xD4,
+0xD8,0xFF,0x8E,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x09,0x4C,0x8E,0xE6,0x98,0xC0,0xE4,
+0x00,0x00,0x2B,0x0F,0x07,0x02,0x1C,0xA6,0x01,0x5F,0x0C,0x91,0x20,0x00,0x19,0x5C,
+0xC5,0x04,0x9C,0xE4,0xD4,0xF7,0xFF,0x7E,0x9C,0x9D,0xD4,0x86,0x00,0xFC,0x98,0x61,
+0xE7,0xFF,0xF0,0xE6,0x20,0x60,0x54,0xC0,0xC0,0x10,0x01,0x98,0xE1,0xF8,0xE6,0x04,
+0xCC,0xC0,0xC0,0x10,0x01,0xF8,0xE6,0x04,0xCD,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,
+0x01,0xF0,0xC6,0x0C,0x0C,0x4C,0xC6,0x08,0xF0,0xA7,0x07,0x02,0x8D,0x46,0xC0,0xE0,
+0x10,0x01,0x88,0xCB,0xE8,0xE7,0x07,0x23,0xE4,0x00,0x00,0x47,0x08,0x86,0x00,0xC0,
+0x80,0x11,0x68,0x20,0x00,0x35,0xC8,0xE7,0x20,0x00,0x98,0xA0,0xE4,0x00,0x00,0x15,
+0x5C,0x85,0x51,0x20,0x00,0x19,0x50,0xE7,0x40,0x9C,0xC2,0xD4,0xCA,0xFF,0x0E,0xC0,
+0xC0,0x10,0x01,0xF8,0xA6,0x07,0x02,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0xC0,
+0xE0,0x10,0x01,0xE8,0xE7,0x00,0x4B,0x5C,0xE7,0x00,0xC0,0xE0,0x14,0x04,0x20,0x0D,
+0x05,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0C,0x0C,0xFC,0xC6,0x0B,
+0x14,0x10,0x87,0x01,0x10,0xE7,0x04,0x40,0x87,0x23,0x88,0xA7,0xE4,0x00,0x00,0x55,
+0x1F,0x01,0x28,0x42,0xE7,0x2D,0x4E,0xF7,0x10,0x8E,0xF8,0x4F,0x07,0x10,0x8F,0x06,
+0x1F,0x47,0x01,0x0B,0x38,0x02,0x4F,0x07,0x10,0x5C,0xFA,0x00,0x8F,0x06,0x0B,0x18,
+0x00,0x8F,0x19,0x0F,0x17,0xDC,0xD4,0x87,0xFE,0xD4,0x1E,0xE1,0x04,0x0C,0xA1,0x06,
+0x1F,0x41,0x28,0x88,0xD7,0x98,0xE0,0x0C,0x86,0x02,0x5C,0x87,0x15,0x9C,0xC4,0x48,
+0xE7,0x20,0x5C,0xA4,0x15,0x48,0xA5,0x20,0xD4,0xDA,0xFF,0x7E,0xC0,0xC0,0x10,0x01,
+0xEC,0xC6,0x06,0xC6,0x1C,0x86,0xFC,0x24,0x84,0xF7,0xC0,0xA0,0x7D,0x08,0x20,0x02,
+0x09,0xC3,0x00,0x10,0x01,0x4F,0x25,0x12,0xE8,0x98,0x05,0x31,0xD7,0x24,0x1D,0x58,
+0x43,0x39,0x25,0x9B,0x6A,0x43,0x39,0xD8,0x8C,0x99,0xEC,0x98,0x05,0x31,0xE4,0x00,
+0x07,0x33,0x40,0xA5,0x25,0x9B,0x2A,0x40,0xA5,0xC8,0x8C,0x85,0xEC,0x98,0x05,0x33,
+0xE4,0x00,0x00,0xA1,0x5C,0xEB,0x51,0x20,0x00,0x5D,0xC0,0xA0,0x10,0x01,0xE8,0x85,
+0x05,0x31,0xD4,0x87,0x00,0x60,0xEC,0xE5,0x05,0x31,0xE4,0x00,0x00,0x6D,0x5C,0xE8,
+0xB9,0x20,0x00,0xBD,0x50,0x80,0x5A,0xC0,0xA0,0x10,0x01,0xEC,0x85,0x05,0x31,0xC0,
+0xA0,0x10,0x01,0xE8,0x85,0x05,0x33,0xD4,0xE4,0x00,0x40,0xEC,0xE5,0x05,0x33,0x5C,
+0xE6,0x39,0x20,0x00,0x39,0x50,0x80,0x46,0xC0,0xA0,0x10,0x01,0xEC,0x85,0x05,0x33,
+0xC0,0xA0,0x10,0x01,0x4F,0xA7,0x12,0xEB,0x05,0x05,0x31,0x98,0x80,0x1F,0x98,0xF7,
+0x4F,0x78,0x10,0x98,0xA0,0x1F,0xC4,0x01,0x0F,0x37,0x02,0xD7,0x99,0x00,0x38,0x5C,
+0x9E,0x00,0xD7,0x67,0x00,0x40,0xD7,0x38,0x00,0x64,0xD7,0x3D,0x00,0x68,0xD7,0x38,
+0x00,0x48,0x9C,0xA1,0x5C,0xA5,0x00,0x9E,0xE4,0xD6,0xFA,0xFE,0xE6,0xC0,0xE0,0x10,
+0x01,0x0E,0xE1,0x0A,0xE8,0xE7,0x05,0x33,0xD6,0xE7,0x00,0x5C,0x0E,0xE1,0x22,0xD6,
+0xE7,0x01,0x28,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x05,0x34,0xC2,0xE0,0x16,0x6E,0x20,
+0x00,0x25,0x9E,0xE1,0xFA,0xE7,0x05,0x34,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x35,
+0xE4,0x00,0x00,0x43,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x05,0x35,0xC2,0xE0,0x16,0x6E,
+0x20,0x00,0x25,0x9E,0xE1,0xFA,0xE7,0x05,0x35,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,
+0x34,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x05,0x34,0x5C,0xE2,0x93,0x20,0x00,0x2D,0x98,
+0xA6,0x98,0x80,0xE4,0x00,0x00,0x2D,0xD0,0xA4,0x00,0x95,0xC0,0xE0,0x10,0x01,0xF0,
+0xE7,0x05,0x35,0x5C,0xE1,0x53,0x48,0x84,0x2A,0x20,0xC4,0x56,0xC0,0xE0,0x10,0x01,
+0xF8,0x07,0x06,0xDF,0x98,0xC2,0xD0,0xA4,0x01,0x55,0xE4,0x00,0x03,0x93,0x20,0xC8,
+0xE2,0xC1,0x40,0x10,0x01,0xD0,0xA4,0x01,0x39,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0x5C,
+0xE7,0x00,0xF8,0xEA,0x06,0xDF,0xD0,0xE1,0x0D,0x69,0xF8,0x0A,0x06,0xDF,0x98,0xC3,
+0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x03,0x37,0xF8,0x0A,0x06,0xDF,
+0x98,0xC1,0xE7,0xFF,0xFF,0xDD,0x20,0xCC,0xE2,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06,
+0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x1C,0xE0,0x80,0xC1,0x80,0x10,0x01,0x98,0x62,
+0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xE0,0x4E,0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF,
+0xD0,0xE5,0x0B,0x49,0xF8,0x0A,0x06,0xDF,0x98,0xC4,0xE4,0x00,0x01,0xF3,0xD0,0xC4,
+0x01,0x16,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xD0,0x83,0x0A,0x49,0x98,0xC5,
+0xEC,0xC7,0x06,0xC4,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xDF,0xE4,0x00,0x02,0x6F,
+0xD0,0xC5,0x02,0x6E,0xC1,0x40,0x10,0x01,0x24,0x8C,0xED,0xF0,0xEA,0x06,0xDF,0x9C,
+0xE1,0x5C,0xE7,0x00,0xF8,0xEA,0x06,0xDF,0xD0,0xE1,0x08,0xD9,0xC0,0xE0,0x10,0x01,
+0x98,0xC6,0xEC,0xC7,0x06,0xC4,0x50,0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8,
+0xEC,0x06,0xBC,0xE7,0xFF,0xDF,0x70,0xF8,0x0C,0x06,0xBC,0xF8,0x0A,0x06,0xDF,0xE4,
+0x00,0x01,0xF5,0xF8,0x0A,0x06,0xDF,0x98,0xC4,0xE7,0xFF,0xFE,0x8F,0xD0,0xC6,0x02,
+0x0E,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x50,
+0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xDE,0xFE,
+0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF,0xD0,0xE4,0x06,0x09,0x98,0xC1,0xC0,0xE0,
+0x10,0x01,0xF8,0x0A,0x06,0xDF,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x01,0x2B,0xD0,0xC0,
+0x05,0x2E,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,
+0x50,0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xDE,
+0x7C,0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF,0xD0,0xE4,0x04,0x01,0xC0,0xE0,0x10,
+0x01,0xF8,0x0A,0x06,0xDF,0xF8,0x07,0x05,0x34,0x98,0xC1,0xC0,0xE0,0x10,0x01,0xF8,
+0x07,0x05,0x35,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x00,0xBD,0xC1,
+0x80,0x10,0x01,0xEC,0xEC,0x06,0xC6,0x20,0xE5,0x30,0xC1,0x40,0x10,0x01,0xF0,0xEA,
+0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x50,0xE0,0x40,0xC1,0xA0,0x10,0x01,0x98,
+0x62,0xF8,0xED,0x06,0xBC,0xE7,0xFF,0xDD,0xCC,0xF8,0x0D,0x06,0xBC,0xF0,0xEA,0x06,
+0xDF,0xD0,0xE4,0x01,0x41,0x98,0xE1,0xF8,0x0A,0x06,0xDF,0xEC,0xEC,0x06,0xC4,0xC0,
+0xE0,0x10,0x01,0xF8,0x07,0x05,0x34,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x35,0xE4,
+0x00,0x00,0x15,0x98,0xE0,0xE4,0x00,0x00,0x0D,0x98,0xE1,0xC0,0xC0,0x10,0x01,0xF8,
+0xE6,0x06,0xE9,0x20,0xE0,0x1C,0xE7,0xFF,0xC6,0x62,0x98,0x61,0xE7,0xFF,0xD5,0xF0,
+0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x04,0xE2,0xD0,0xE0,0x05,0x06,0xC0,0xE0,0x10,0x01,
+0xF0,0xC7,0x0C,0x0C,0x98,0xE0,0xE4,0x00,0x00,0x29,0x08,0xAB,0x00,0x9C,0xE1,0x5C,
+0xB8,0x11,0x5C,0xE7,0x00,0x9D,0x62,0x20,0x00,0x2D,0xD4,0xC7,0xFF,0x85,0xE4,0x00,
+0x00,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x07,0x02,0x9C,0xC1,0xF8,0xC7,0x07,0x02,
+0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xC6,0x9C,0xFC,0x24,0xE4,0x2F,0xC0,0xE0,0x10,
+0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x07,0x02,0x24,0xC9,0x2D,
+0xC0,0xC0,0x10,0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x07,0x00,
+0xE8,0xC7,0x07,0x23,0x50,0xC6,0x80,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0xF8,
+0x07,0x07,0x18,0xE4,0x00,0x00,0x4B,0x98,0x86,0xC3,0x00,0x10,0x01,0x40,0xA5,0x20,
+0xE8,0x98,0x05,0x33,0xD4,0xA4,0xE2,0xF4,0xE7,0xFF,0xF9,0x71,0xC0,0xE0,0x10,0x01,
+0xF8,0x07,0x07,0x02,0xE7,0xFF,0xFF,0x39,0x0D,0xA1,0x2E,0x0D,0x81,0x32,0x0D,0x61,
+0x36,0x0D,0x41,0x3A,0x0D,0x21,0x3E,0x1C,0x21,0x40,0x85,0x29,0xC0,0xC0,0x10,0x01,
+0x50,0xE0,0x50,0x1C,0x21,0xC8,0xEC,0xE6,0x06,0xC1,0x0D,0x41,0x30,0x0D,0x61,0x2C,
+0x0D,0x81,0x28,0x0D,0xC1,0x20,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,
+0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0x8A,0x46,0xC2,0xA0,0x10,0x01,0xC0,0xC0,
+0x10,0x01,0xEC,0xF5,0x06,0xF5,0xC2,0x60,0x10,0x01,0x50,0xE0,0x1E,0xC2,0x20,0x10,
+0x01,0xC1,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0x0D,0x21,0x34,0x0D,0xA1,0x24,0x0D,
+0xE1,0x1C,0x8A,0x86,0xEC,0xE6,0x07,0x09,0xEC,0xF3,0x06,0xD5,0xFD,0xCE,0x07,0x10,
+0xFE,0x10,0x06,0xF1,0x99,0x40,0x51,0x80,0x1C,0xFD,0x71,0x08,0xD8,0xE4,0x00,0x02,
+0xD3,0x4C,0xEA,0x10,0x8C,0xEE,0x08,0x87,0x00,0xC0,0x8F,0xFF,0xE0,0x20,0x04,0xF5,
+0x08,0xA7,0x02,0xC0,0xAF,0xFF,0xE0,0x20,0x04,0xCD,0x42,0xEA,0x63,0x8E,0xEB,0x08,
+0xF7,0x19,0x40,0xE5,0x3D,0x5C,0xE7,0x06,0x4C,0xC7,0xFA,0x09,0xF7,0x17,0x44,0xE6,
+0x3E,0x41,0xE4,0x7D,0x40,0xE7,0x35,0x5D,0xEF,0x06,0x5C,0xE7,0x06,0x4C,0xCF,0xFA,
+0xE9,0xB5,0x06,0xF5,0x45,0xE6,0x7E,0x41,0xEF,0x35,0x5D,0xEF,0x06,0xD4,0xED,0x01,
+0x0C,0xE8,0xD2,0x06,0xC1,0xD5,0xE6,0x00,0xCC,0x40,0x8A,0x84,0x10,0xC4,0x00,0x5C,
+0xC0,0x53,0x9C,0xC1,0x5C,0xC6,0x00,0x48,0xC6,0x1A,0xE4,0x00,0x00,0x2B,0x40,0x90,
+0x54,0x10,0xC4,0x00,0x5C,0xC0,0x09,0x9C,0xDF,0x5C,0xC6,0x00,0x48,0xC6,0x00,0x18,
+0xC4,0x00,0x40,0xD0,0x54,0x10,0xC6,0x00,0xD0,0xC2,0x06,0x11,0xE8,0xD3,0x06,0xD5,
+0xD4,0xE6,0x00,0x84,0x40,0xEA,0x63,0x8C,0xEB,0x0C,0xA7,0x19,0xE4,0x00,0x00,0x93,
+0xD4,0xED,0x02,0x2C,0x40,0x87,0x35,0x40,0xAD,0x35,0x40,0xE6,0x3D,0x40,0xA5,0x2B,
+0x40,0xE7,0x23,0x8C,0xE5,0x40,0x6D,0x6B,0x40,0x63,0x3B,0x40,0x63,0x28,0xE7,0xFF,
+0x37,0xFE,0x4C,0xEA,0x10,0x8C,0xEE,0x41,0xAD,0x1D,0x08,0xC7,0x02,0x40,0xEA,0x63,
+0x8C,0xEB,0x08,0xA7,0x18,0xD4,0xC5,0x00,0x58,0x41,0xA6,0x6D,0xE4,0x00,0x00,0x0D,
+0x8D,0xA6,0x0D,0xA7,0x19,0xE8,0xF4,0x07,0x09,0xD5,0xE7,0x00,0xC4,0x40,0xEA,0x63,
+0x4C,0xCA,0x10,0x8C,0xEB,0x8C,0xCE,0x08,0xC6,0x01,0x0C,0xC7,0x17,0xE4,0x00,0x00,
+0x9B,0xE9,0xB2,0x06,0xC1,0xD5,0xED,0x02,0x2C,0x40,0xAF,0x3D,0x40,0xCD,0x3D,0x40,
+0xE7,0x7D,0x40,0xC6,0x33,0x40,0xE7,0x2B,0x8C,0xE6,0x40,0x6D,0x6B,0x40,0x63,0x3B,
+0x40,0x63,0x30,0xE7,0xFF,0x37,0x34,0x4C,0xEA,0x10,0x8C,0xEE,0x41,0xAD,0x1D,0x08,
+0xC7,0x00,0x40,0xEA,0x63,0x8C,0xEB,0x08,0xA7,0x16,0xD4,0xC5,0x00,0x58,0x41,0xA6,
+0x6D,0xE4,0x00,0x00,0x0D,0x8D,0xA6,0x0D,0xA7,0x17,0x1C,0xAA,0x01,0x4C,0xEA,0x10,
+0x40,0xCA,0x63,0x8C,0xEE,0x8C,0xCB,0x5D,0x45,0x00,0x08,0xA6,0x19,0x0C,0xA7,0x03,
+0x08,0xC6,0x17,0x0C,0xC7,0x01,0xF0,0xF1,0x08,0xD8,0xD4,0xEA,0xF4,0xBD,0x0E,0xA1,
+0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,
+0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,
+0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x30,0xC8,0xA0,0x7F,0xFF,
+0x0D,0x61,0x04,0xC1,0x60,0x10,0x01,0xE8,0xEB,0x07,0x23,0x44,0xE7,0x2C,0x0D,0x41,
+0x08,0xEC,0xEB,0x07,0x23,0x0D,0x21,0x0C,0xE7,0xFF,0xE7,0x0A,0xC1,0x40,0x10,0x01,
+0xEC,0xEA,0x06,0xEE,0x20,0xE1,0x0E,0xE8,0xEB,0x07,0x23,0x54,0xE7,0x40,0x20,0xE0,
+0x7C,0xE7,0xFF,0x36,0x0E,0x98,0x66,0xE7,0xFF,0xC3,0xE6,0xC0,0xE0,0x10,0x01,0xF8,
+0x07,0x06,0xF0,0x98,0xE1,0xEC,0xEA,0x06,0xEC,0xE4,0x00,0x00,0x15,0x98,0x62,0xE7,
+0xFF,0xC3,0xB6,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDC,0xD0,0xC1,0x21,0x5E,0xF8,
+0x07,0x04,0xDC,0xE4,0x00,0x08,0x47,0x20,0xE5,0x7A,0xE8,0xEB,0x07,0x23,0x54,0xC7,
+0x08,0x20,0xC0,0x54,0xE7,0xFF,0xCC,0xB2,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE8,
+0x98,0xE2,0xE4,0x00,0x00,0xF9,0x54,0xC7,0x40,0x20,0xC0,0xC0,0xC8,0xC0,0x20,0x00,
+0x44,0xE7,0x34,0x20,0xE0,0x9A,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x06,0xF0,0x9C,0xE1,
+0x5C,0xE7,0x00,0xF8,0xE6,0x06,0xF0,0x98,0x64,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x06,
+0xD0,0xD4,0xE6,0x1E,0xA9,0xE4,0x00,0x07,0x0F,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,
+0xEC,0xE4,0x00,0x07,0x8B,0x20,0xE9,0x06,0xE8,0xEB,0x07,0x23,0xC1,0x60,0x10,0x01,
+0x54,0xE7,0x08,0x20,0xE0,0x94,0xF0,0xEB,0x06,0xE8,0x9C,0xE1,0xF8,0xEB,0x06,0xE8,
+0xE7,0xFF,0x34,0xF2,0xC0,0xE0,0x10,0x01,0xF0,0xCB,0x06,0xE8,0xF0,0xE7,0x06,0xFE,
+0xD4,0xC7,0x1C,0xB1,0xE4,0x00,0x02,0x83,0xF8,0x0B,0x06,0xE8,0x98,0xE6,0xEC,0xEA,
+0x06,0xEC,0xE4,0x00,0x07,0x09,0xD0,0xE3,0x09,0x0E,0xC0,0xE0,0x10,0x01,0xF0,0xE7,
+0x08,0xD8,0x20,0xE4,0x2E,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xC0,0xE0,0x10,
+0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x08,0xD0,0xE0,0x07,0x8A,0x98,0xC1,0xC0,0xE0,
+0x10,0x01,0xF8,0xC7,0x04,0xDC,0xE7,0xFF,0xC4,0xB2,0xE7,0xFF,0x34,0x3E,0xC0,0xE0,
+0x10,0x01,0xF0,0xC7,0x08,0xD8,0x20,0xC5,0x7E,0xFC,0xE7,0x08,0xD8,0x08,0xA7,0x17,
+0xC0,0xC0,0x10,0x01,0xE8,0x86,0x06,0xD7,0x40,0x84,0x2D,0x5C,0x84,0x06,0x4C,0xA4,
+0xFA,0x44,0x85,0x26,0x40,0xA4,0x2D,0xC0,0xA0,0x3E,0x8C,0x20,0x00,0x8D,0x08,0xE7,
+0x19,0xFC,0xC6,0x06,0xD6,0x08,0xC6,0x03,0x40,0xC6,0x3D,0x5C,0xC6,0x06,0x4C,0xE6,
+0xFA,0x44,0xC7,0x36,0x40,0xE6,0x3D,0xC0,0xE0,0x3E,0x88,0x20,0x00,0x69,0xE7,0xFF,
+0x34,0x76,0x20,0x60,0x4C,0xE7,0xFF,0xCA,0x70,0xC0,0xE0,0x10,0x01,0xEC,0xA7,0x06,
+0xE6,0xD0,0xA1,0x15,0x5A,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x07,0x05,0x9C,0xC1,0x5C,
+0xC6,0x04,0xEC,0xC7,0x07,0x05,0xC8,0xA0,0xFF,0xFD,0x5C,0xC5,0x17,0x20,0x00,0x25,
+0x98,0xDE,0xEC,0xC7,0x07,0x05,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF0,0x85,
+0x08,0xD8,0xFC,0xE7,0x08,0xEE,0xC0,0xC0,0x10,0x01,0x50,0xA0,0x1C,0xFC,0xC6,0x06,
+0xD6,0x40,0xA4,0x2B,0x8C,0xA7,0xE4,0x00,0x00,0x2B,0x08,0x87,0x01,0x0C,0x86,0x01,
+0x08,0x87,0x03,0x1C,0xE7,0x1C,0x0C,0x86,0x03,0x9C,0xC4,0xD4,0xE5,0xFF,0x7E,0xE7,
+0xFF,0xF7,0xDA,0xE7,0xFF,0xCA,0x78,0x0D,0x21,0x0E,0x0D,0x61,0x06,0x0D,0x41,0x0A,
+0x98,0x61,0x1C,0x21,0x10,0xE7,0xFF,0xD3,0x6D,0xC0,0xE0,0x10,0x01,0x98,0xC4,0xF8,
+0x07,0x06,0xBD,0xE4,0x00,0x04,0xB7,0xD0,0xE4,0x0B,0x86,0xE8,0xEB,0x07,0x23,0x54,
+0xE7,0x08,0x20,0xE0,0x74,0x98,0xE3,0xEC,0xEA,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xEC,
+0x07,0x07,0x05,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xE4,0x00,0x04,0x77,0xC0,
+0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBD,0x9C,0xC1,0xF8,0xC7,0x06,0xBD,0xC0,0xE0,0x10,
+0x01,0xF0,0xE7,0x07,0x21,0xD0,0xE2,0x04,0xDE,0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,
+0x01,0xE8,0xE4,0x06,0xD6,0xE8,0xC5,0x0B,0xEE,0x43,0x07,0x35,0x5F,0x18,0x06,0x4E,
+0xF8,0xFA,0x47,0x17,0xC6,0x42,0xF8,0xBD,0x5E,0xEC,0x99,0x20,0x00,0x9D,0xFC,0xA5,
+0x0B,0xEE,0x08,0xA5,0x03,0xFC,0x84,0x06,0xD6,0x08,0x84,0x03,0x40,0x84,0x2D,0x5C,
+0x84,0x06,0x4C,0xA4,0xFA,0x44,0x85,0x26,0x40,0xA4,0x2D,0xC0,0xA0,0x10,0xE8,0x20,
+0x01,0x45,0x8C,0xE6,0x4C,0xC7,0xF9,0x8C,0xE6,0xC0,0xA0,0x10,0x01,0x4C,0xC7,0x0A,
+0xFC,0xE5,0x08,0xD8,0x0C,0xC7,0x17,0x99,0x41,0xC0,0xC0,0x10,0x01,0xF9,0x45,0x08,
+0xD8,0xE8,0xA6,0x0B,0xF0,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x06,0xD8,0x8C,0xC5,0x4C,
+0xA6,0xF9,0x8C,0xC5,0x4C,0xC6,0x0A,0x98,0x61,0x0C,0xC7,0x19,0xE7,0xFF,0xD1,0xBE,
+0xC0,0xE0,0x10,0x01,0xF9,0x47,0x07,0x21,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBD,
+0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBD,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x06,0xD2,
+0xD4,0xC7,0x0B,0xB1,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x07,0x21,0xD0,0xE1,0x0B,0x06,
+0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xE8,0xE5,0x06,0xD6,0xEA,0xE6,0x0B,0xEF,
+0x42,0xE7,0xBD,0x5E,0xF7,0x06,0x4C,0x97,0xFA,0x46,0xE4,0xBE,0x40,0x97,0x25,0x5C,
+0x8C,0x99,0x20,0x00,0x9D,0xFC,0xC6,0x0B,0xEE,0x08,0xC6,0x03,0xFC,0xA5,0x06,0xD6,
+0x08,0xA5,0x03,0x40,0xA5,0x35,0x5C,0xA5,0x06,0x4C,0xC5,0xFA,0x44,0xA6,0x2E,0x40,
+0xC5,0x35,0xC0,0xC0,0x10,0xE8,0x20,0x04,0x59,0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10,
+0x01,0xE8,0x85,0x06,0xD9,0xFC,0xA6,0x08,0xD8,0x0C,0xE5,0x17,0x0C,0x85,0x19,0x98,
+0xE1,0x98,0x61,0xF8,0xE6,0x08,0xD8,0xE7,0xFF,0xD0,0x88,0xC0,0xE0,0x10,0x01,0xF8,
+0x07,0x07,0x21,0xE4,0x00,0x01,0xE7,0xD0,0xE5,0x01,0x76,0xC0,0xE0,0x10,0x01,0xEC,
+0x07,0x07,0x05,0xE7,0xFF,0x2F,0x2A,0xE7,0xFF,0xC6,0x4C,0xC0,0xE0,0x10,0x01,0x98,
+0x60,0xF8,0x07,0x04,0xDC,0xE7,0xFF,0xD0,0x2C,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,
+0x01,0xE7,0xFF,0xFA,0x77,0xD0,0xE6,0x06,0x0E,0xE8,0xEB,0x07,0x23,0x54,0xE7,0x40,
+0x20,0xE0,0x26,0x98,0x63,0xE7,0xFF,0xBC,0xAA,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x07,
+0x01,0x9C,0xE1,0x5C,0xE7,0x00,0xF8,0xE6,0x07,0x01,0x5C,0xE6,0x53,0xC0,0xE0,0x10,
+0x01,0x20,0x00,0xB5,0xE8,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0x54,0xC6,0x40,0x20,
+0xC0,0x54,0x98,0xC1,0xEC,0xC7,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0,
+0xE4,0x00,0x00,0x55,0xEC,0x07,0x06,0xEC,0x98,0x62,0xE4,0x00,0x00,0x45,0xE8,0xE7,
+0x07,0x23,0x54,0xE7,0x08,0x20,0xE1,0x84,0xC0,0xE0,0x10,0x01,0x98,0xC2,0xF8,0x07,
+0x06,0xE8,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xEC,0x98,0x66,0x0D,0x61,0x06,0x0D,
+0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xBB,0xC5,0xFC,0xE0,0x7F,0xFF,
+0xC0,0x80,0x10,0x01,0xEC,0xE4,0x06,0xD7,0xFC,0xC4,0x06,0xD6,0x0C,0xE6,0x07,0x0C,
+0xE6,0x03,0x0C,0xE6,0x05,0xC0,0xE0,0x10,0x01,0xFC,0xC7,0x06,0xFC,0xF8,0x07,0x06,
+0xFC,0x18,0xA6,0x01,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBD,0x98,0xC5,0xC0,0xE0,
+0x10,0x01,0xEC,0xC7,0x06,0xEC,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,
+0x21,0x10,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,
+0x81,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xE9,0x20,0xC0,0x2C,0xF8,0x07,0x06,
+0xE9,0xE4,0x00,0x02,0x2F,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xC6,0x9C,0xFD,0xD0,
+0xE3,0x08,0x49,0x98,0x61,0xE7,0xFF,0xE5,0x94,0xE7,0xFF,0xE3,0x82,0xC1,0x60,0x10,
+0x01,0xC1,0x80,0x10,0x01,0xFC,0x6B,0x04,0xEA,0xFC,0x8C,0x05,0x20,0xE7,0xFF,0x61,
+0xA0,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x08,0xD8,0x20,0xE0,0xD8,0x98,0x61,0x98,0x81,
+0xFC,0xAB,0x04,0xEA,0xE7,0xFF,0x39,0xA6,0xFC,0xAB,0x04,0xEA,0xFC,0xCC,0x05,0x20,
+0x98,0x61,0x98,0x81,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0x90,0xE7,0xFF,0x50,0x86,
+0xF0,0xEA,0x08,0xD8,0x20,0xE0,0x2C,0xE7,0xFF,0xCA,0xBC,0xE7,0xFF,0xCC,0x8A,0xC0,
+0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x74,0xC0,0xE0,0x10,0x01,0xF0,0xE7,
+0x04,0xCC,0x20,0xE0,0x4A,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x07,0x23,0x50,0xC6,0x08,
+0xE4,0x00,0x00,0x33,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x08,0xD8,
+0x98,0xB7,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10,
+0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x2C,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x34,
+0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x07,0x0E,0x20,0xE8,0x1C,0xE7,0xFF,0xF4,0xFE,0xC0,
+0xE0,0x10,0x01,0xEC,0xE7,0x06,0xE6,0x20,0xE4,0x1C,0xE7,0xFF,0xDA,0xC8,0xC0,0xE0,
+0x10,0x01,0xEC,0xE7,0x06,0xE6,0x20,0xE4,0x52,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x07,
+0x0E,0x20,0xC8,0x26,0x98,0xC3,0xEC,0xC7,0x07,0x0C,0xC0,0xE0,0x10,0x01,0xE8,0xE7,
+0x07,0x22,0x24,0xFC,0x5A,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,
+0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xB5,0x27,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,
+0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0xE7,0xFF,
+0xE4,0xE2,0xC0,0xE0,0x10,0x01,0xC0,0xD4,0x00,0x01,0xC8,0xC6,0x79,0xE9,0x10,0xC6,
+0x00,0xF8,0xC7,0x04,0xD4,0xF0,0xC7,0x04,0xD4,0x20,0xC0,0x28,0xF0,0xE7,0x04,0xD4,
+0x20,0xE4,0xCE,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x80,0x20,0xE0,
+0x32,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFC,0xFD,0x98,0xC5,0xC0,0xE0,0x10,0x01,
+0x98,0x60,0xEC,0xC7,0x06,0xEC,0xE7,0xFF,0xCB,0x4A,0x0D,0x21,0x06,0x9C,0x28,0xE7,
+0xFF,0xB4,0x51,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xB5,0x6D,0x4C,0x63,0x08,0xC0,
+0xE0,0x10,0x01,0xFC,0xE7,0x06,0xAE,0x8C,0xE3,0x08,0xC7,0x01,0xD0,0xC7,0x00,0x56,
+0x98,0x68,0xE4,0x00,0x00,0x17,0xD0,0xCF,0x00,0x6E,0x50,0x60,0x10,0x98,0x8F,0xE7,
+0xFF,0xA1,0x4F,0xC0,0xF4,0x00,0x01,0xC8,0xA7,0x24,0x34,0x0C,0xC5,0x01,0xC8,0xA7,
+0x24,0x38,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x3C,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x40,
+0x0C,0xC5,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xB6,0xC8,0xA7,0x26,0x24,0x8C,
+0x66,0x08,0xC3,0x01,0x0C,0xC5,0x01,0xC8,0xE7,0x26,0x28,0x0C,0xC7,0x01,0x85,0x29,
+0x9C,0x38,0xC0,0xE0,0x10,0x01,0x0D,0x41,0x00,0x0D,0x21,0x04,0xEC,0x67,0x06,0xCC,
+0x89,0x43,0x20,0x60,0x18,0x20,0x64,0x6E,0xC0,0xF4,0x00,0x01,0xFC,0xA0,0x02,0xC0,
+0xC8,0xC7,0x24,0x48,0x0C,0xA6,0x01,0xC8,0xE7,0x24,0x54,0x98,0xC9,0x0C,0xC7,0x01,
+0x20,0x84,0xB2,0x4C,0xAA,0x08,0xC0,0xD4,0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xE7,
+0x06,0xA6,0x8C,0xE5,0xC8,0xA6,0x24,0x58,0x08,0xE7,0x01,0x0C,0xE5,0x01,0xC8,0xA6,
+0x24,0x5C,0x0C,0xE5,0x01,0xC8,0xC6,0x24,0x60,0x0C,0xE6,0x01,0x88,0x6A,0xE7,0xFF,
+0xFE,0x7C,0x88,0x6A,0xE7,0xFF,0x96,0x30,0x88,0x6A,0x0D,0x21,0x06,0x0D,0x41,0x02,
+0x9C,0x28,0xE7,0xFF,0x93,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0xFF,0xFF,0x7F,0x04,0x1E,0x00,0x00,0x48,0xF1,0x17,0x00,0x17,0x10,0x3F,
+0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x18,0x19,0x24,0x28,0x2B,0x2C,0x07,0x09,0x0A,0x0C,0x00,0x2D,0x1A,0x1C,0x29,0x2A,
+0x04,0x05,0x06,0x08,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,
+0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,
+0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x48,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x02,0x00,0x8C,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x02,0x00,0x00,0x00,0x31,0x00,0x31,0x00,
+0x31,0x00,0x31,0x00,0x00,0x00,0xC0,0x02,0x02,0x21,0x03,0x00,0x09,0x00,0x15,0x00,
+0x15,0x00,0x15,0x00,0xAC,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,
+0x00,0x00,0x00,0xC0,0x00,0x01,0x04,0x05,0x08,0x09,0x0C,0x0D,0x10,0x11,0x12,0x13,
+0x02,0x03,0x06,0x07,0x0A,0x0B,0x0E,0x0F,0x00,0x01,0x04,0x05,0x08,0x09,0x0C,0x0D,
+0x10,0x11,0x02,0x03,0x06,0x07,0x0A,0x0B,0x0E,0x0F,0x00,0x00,0x01,0x01,0x00,0x00,
+0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,
+0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,
+0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,
+0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x08,
+0x0A,0x08,0x0C,0x08,0x0A,0x08,0x25,0x24,0xE9,0x00,0xE9,0x00,0x05,0x03,0x03,0x04,
+0x9B,0x01,0x1B,0x00,0xD7,0x08,0xC7,0xFF,0xB5,0x00,0x0E,0x00,0x30,0x00,0xD1,0x03,
+0x03,0x00,0x26,0x00,0x14,0x00,0x7D,0x00,0xBE,0x03,0x01,0x00,0x05,0x00,0x18,0x00,
+0xFA,0x00,0xA6,0x05,0x93,0xFF,0x02,0x00,0x19,0x00,0x36,0x01,0x1E,0x03,0x54,0x00,
+0x00,0x00,0x19,0x00,0x24,0x00,0x3B,0x05,0xD2,0xFF,0x67,0x00,0x14,0x00,0x62,0x00,
+0x79,0x04,0xE5,0xFF,0x22,0x00,0x1B,0x00,0xB2,0x00,0x19,0x04,0xF7,0xFF,0x02,0x00,
+0x20,0x00,0x39,0x00,0xF8,0x05,0xA9,0xFF,0x6F,0x00,0x17,0x00,0x97,0x00,0x67,0x04,
+0xEB,0xFF,0x0E,0x00,0x25,0x00,0xFC,0x00,0x3A,0x04,0xEA,0xFF,0x01,0x00,0x28,0x00,
+0x50,0x00,0x7C,0x07,0x66,0xFF,0x8E,0x00,0x17,0x00,0xAA,0x00,0x99,0x04,0xE8,0xFF,
+0x18,0x00,0x2A,0x00,0xEA,0x00,0x09,0x03,0x3D,0x00,0x03,0x00,0x2F,0x00,0x52,0x01,
+0x7B,0x05,0x72,0xFF,0x01,0x00,0x2F,0x00,0xFF,0x00,0xDE,0x04,0x2C,0x00,0xFF,0x00,
+0x5B,0x02,0x4D,0x00,0xFF,0x00,0x69,0x03,0x91,0x00,0xFE,0x00,0x4C,0x0B,0xD3,0x00,
+0xFD,0x00,0xF3,0x0F,0x05,0x01,0xFC,0x00,0xB4,0x0E,0x44,0x01,0xFC,0x00,0xEE,0x0D,
+0x98,0x01,0xFB,0x00,0xC5,0x13,0xE3,0x01,0x00,0x00,0xF2,0x03,0x1C,0x00,0xFF,0x00,
+0x04,0x04,0x31,0x00,0xFF,0x00,0x69,0x05,0x5B,0x00,0xFE,0x00,0xAC,0x09,0x89,0x00,
+0xFE,0x00,0x3A,0x0D,0xA9,0x00,0xFD,0x00,0xBC,0x0E,0xC5,0x00,0xFD,0x00,0xC7,0x10,
+0xEE,0x00,0xFC,0x00,0x50,0x16,0x17,0x01,0xFC,0x00,0x0C,0x19,0x39,0x01,0xFB,0x00,
+0x3C,0x17,0x6E,0x01,0xFF,0x00,0x8B,0x09,0x0B,0x00,0xFF,0x00,0x44,0x09,0x1B,0x00,
+0xFF,0x00,0xAB,0x07,0x39,0x00,0xFF,0x00,0xE1,0x07,0x5E,0x00,0xFE,0x00,0xA6,0x0B,
+0x76,0x00,0xFE,0x00,0xA2,0x0E,0x87,0x00,0xFD,0x00,0xD5,0x10,0x9F,0x00,0xFD,0x00,
+0x2D,0x15,0xB9,0x00,0xFC,0x00,0x7A,0x19,0xCB,0x00,0xFC,0x00,0x9D,0x1A,0xDF,0x00,
+0xFB,0x00,0x90,0x1B,0x04,0x01,0xFA,0x00,0xD4,0x20,0x29,0x01,0xFF,0x00,0x25,0x0D,
+0xF7,0xFF,0xFF,0x00,0xA0,0x0C,0x01,0x00,0xFF,0x00,0xBF,0x0B,0x18,0x00,0xFE,0x00,
+0x92,0x0B,0x39,0x00,0xFE,0x00,0x6A,0x0F,0x50,0x00,0xFE,0x00,0x5A,0x12,0x5D,0x00,
+0xFD,0x00,0x8F,0x13,0x6C,0x00,0xFD,0x00,0xBC,0x14,0x80,0x00,0xFD,0x00,0xD3,0x18,
+0x8D,0x00,0xFC,0x00,0xC0,0x1B,0x98,0x00,0xFC,0x00,0x97,0x1C,0xAD,0x00,0xFB,0x00,
+0xEE,0x1F,0xC5,0x00,0xFB,0x00,0x27,0x23,0xD5,0x00,0xFB,0x00,0xD6,0x23,0xE9,0x00,
+0xE6,0x00,0xD4,0x00,0xC2,0x00,0xB1,0x00,0x9F,0x00,0x8D,0x00,0x7C,0x00,0x6A,0x00,
+0x58,0x00,0x46,0x00,0x35,0x00,0x23,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x5A,0x00,0x14,0x00,0x14,0x00,0x02,0x00,0x02,0x00,0x64,0x00,
+0x28,0x00,0x28,0x00,0x01,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x64,0x00,0x01,0x00,
+0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00,0x01,0x03,0x07,0x00,
+0x00,0x00,0x00,0x00,0xE2,0x0B,0x80,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x59,0x01,
+0x5B,0x00,0x1B,0x00,0x9B,0x01,0x1D,0x00,0x19,0x00,0xF6,0xFF,0x51,0x00,0x09,0x00,
+0x03,0x00,0x1B,0x00,0x1B,0x00,0x41,0x02,0x1B,0x00,0xE2,0x00,0x01,0x00,0x15,0x00,
+0x18,0x01,0xC8,0x00,0x78,0x00,0x78,0x00,0x11,0x01,0x15,0x00,0x18,0x01,0xC8,0x00,
+0xCC,0x00,0x0A,0x00,0x06,0x00,0x98,0x08,0x02,0x00,0x01,0x00,0xD8,0x0E,0xD8,0x0E,
+0x00,0x00,0x00,0x00,0x5A,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x02,0x03,0x00,0x00,0x30,0x0A,0x80,0x00,0xDC,0x08,0x80,0x00,0x00,0x01,0x02,0x03,
+0x01,0x02,0x03,0x00,0x49,0x6E,0x20,0x75,0x6D,0x61,0x69,0x6E,0x20,0x0A,0x00,0x00,
+0x19,0x00,0x1F,0x00,0x27,0x00,0x31,0x00,0x3D,0x00,0x4B,0x00,0x5B,0x00,0x6F,0x00,
+0x89,0x00,0xA9,0x00,0xCF,0x00,0xFF,0x00,0x39,0x01,0x7F,0x01,0xD5,0x01,0xF3,0x01,
+0x00,0x3C,0x00,0xA0,0x33,0x00,0xFF,0xFF,0x00,0x3C,0x00,0xA0,0x34,0x00,0xFF,0xFF,
+0x00,0x3C,0x00,0xA0,0x35,0x00,0xFF,0x3F,0x00,0x3C,0x00,0xA0,0x36,0x00,0x00,0x00,
+0x00,0x3C,0x00,0xA0,0x37,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x38,0x00,0x00,0x00,
+0x00,0x3C,0x00,0xA0,0x39,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x3A,0x00,0x00,0x00,
+0x00,0x3C,0x00,0xA0,0x3B,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x3C,0x00,0xFF,0xFF,
+0x00,0x3C,0x00,0xA0,0x3D,0x00,0xFF,0xFF,0x00,0x3C,0x00,0xA0,0x3E,0x00,0xFF,0x3F,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x36,0x6E,0x01,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x80,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x0C,0x00,
+0x01,0x00,0x0E,0x09,0x19,0x30,0x31,0x32,0x00,0x05,0x42,0x42,0x56,0x00,0x42,0x42,
+0x4D,0x44,0x4C,0x00,0x06,0x4C,0x43,0x4D,0x00,0x07,0x01,0xFF,0x01,0x03,0x08,0x00,
+0x09,0x00,0x0A,0x00,0x0B,0x00,0x0C,0x00,0x0D,0x00,0x0E,0x00,0x0F,0x00,0x10,0x00,
+0x11,0x00,0x12,0x00,0x85,0x3C,0x00,0xD0,0x1F,0x14,0x00,0x00,0x32,0x14,0x00,0x00,
+0x50,0x14,0x00,0x00,0x07,0x15,0x00,0x00,0x2C,0x0B,0x00,0x00,0x6E,0x09,0x00,0x00,
+0x67,0x03,0x00,0x00,0x0D,0x09,0x00,0x00,0xE9,0x15,0x00,0x00,0x7A,0x15,0x00,0x00,
+0xCE,0x1D,0x00,0x00,0x8D,0x15,0x00,0x00,0xD4,0x23,0x00,0x00,0x2D,0x3E,0x00,0xD0,
+0x2F,0x3E,0x00,0xD0,0x5B,0x0F,0x00,0x00,0xA5,0x0D,0x00,0x00,0x7C,0x11,0x00,0x00,
+0xDF,0x10,0x00,0x00,0x7A,0x0D,0x00,0x00,0x4D,0x53,0x43,0x54,0x50,0x43,0x33,0x00,
+0x35,0x06,0x00,0x00,0x4F,0x06,0x00,0x00,0x12,0x07,0x00,0x00,0x83,0x07,0x00,0x00,
+0x0B,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0xDA,0xA6,0x58,
+0x4D,0x53,0x54,0x41,0x52,0x54,0x50,0x43,0x00,0x00,0x00,0x00,0x4C,0x43,0x0C,0x00,
+0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x31,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_common.c b/drivers/input/touchscreen/msg2138/mstar_drv_common.c
new file mode 100644
index 00000000..62c553dd
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_common.c
@@ -0,0 +1,152 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_common.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_common.h"
+
+/*=============================================================*/
+// MACRO DEFINITION
+/*=============================================================*/
+
+/*=============================================================*/
+// CONSTANT VALUE DEFINITION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// VARIABLE DEFINITION
+/*=============================================================*/
+
+static u32 _gCrc32Table[256];
+
+/*=============================================================*/
+// DATA TYPE DEFINITION
+/*=============================================================*/
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+/// CRC
+u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh)
+{
+ u32 nValue = 0;
+ u32 i = 0;
+
+ for (i = 1; i < (nCh + 1); i ++)
+ {
+ if (nRef & 1)
+ {
+ nValue |= 1 << (nCh - i);
+ }
+ nRef >>= 1;
+ }
+
+ return nValue;
+}
+
+u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC)
+{
+ u32 nCRC = nPrevCRC;
+
+ nCRC = (nCRC >> 8) ^ _gCrc32Table[(nCRC & 0xFF) ^ nText];
+
+ return nCRC;
+}
+
+void DrvCommonCrcInitTable(void)
+{
+ u32 nMagicNumber = 0x04c11db7;
+ u32 i, j;
+
+ for (i = 0; i <= 0xFF; i ++)
+ {
+ _gCrc32Table[i] = DrvCommonCrcDoReflect(i, 8) << 24;
+ for (j = 0; j < 8; j ++)
+ {
+ _gCrc32Table[i] = (_gCrc32Table[i] << 1) ^ (_gCrc32Table[i] & (0x80000000L) ? nMagicNumber : 0);
+ }
+ _gCrc32Table[i] = DrvCommonCrcDoReflect(_gCrc32Table[i], 32);
+ }
+}
+
+u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength)
+{
+ s32 nCheckSum = 0;
+ u32 i;
+
+ for (i = 0; i < nLength; i ++)
+ {
+ nCheckSum += pMsg[i];
+ }
+
+ return (u8)((-nCheckSum) & 0xFF);
+}
+
+u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength)
+{
+ u32 nRetVal = 0;
+ u32 i;
+
+ DBG("nLength = %d\n", nLength);
+
+ for (i = 0; i < nLength; i ++)
+ {
+ char ch = *pCh++;
+ u32 n = 0;
+
+ if ((i == 0 && ch == '0') || (i == 1 && ch == 'x'))
+ {
+ continue;
+ }
+
+ if ('0' <= ch && ch <= '9')
+ {
+ n = ch-'0';
+ }
+ else if ('a' <= ch && ch <= 'f')
+ {
+ n = 10 + ch-'a';
+ }
+ else if ('A' <= ch && ch <= 'F')
+ {
+ n = 10 + ch-'A';
+ }
+
+ if (i < 6)
+ {
+ nRetVal = n + nRetVal*16;
+ }
+ }
+
+ return nRetVal;
+}
+
+//------------------------------------------------------------------------------// \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_common.h b/drivers/input/touchscreen/msg2138/mstar_drv_common.h
new file mode 100644
index 00000000..d8323c66
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_common.h
@@ -0,0 +1,359 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_common.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_COMMON_H__
+#define __MSTAR_DRV_COMMON_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/types.h>
+#include <linux/input.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/earlysuspend.h>
+#include <linux/i2c.h>
+#include <linux/proc_fs.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+/*--------------------------------------------------------------------------*/
+/* TOUCH DEVICE DRIVER RELEASE VERSION */
+/*--------------------------------------------------------------------------*/
+
+#define DEVICE_DRIVER_RELEASE_VERSION ("2.2.0.0")
+
+
+/*--------------------------------------------------------------------------*/
+/* COMPILE OPTION DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+/*
+ * Note.
+ * The below compile option is used to enable the specific device driver code handling for distinct smart phone developer platform.
+ * For running on Spreadtrum platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM.
+ * For running on Qualcomm platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM.
+ * For running on MediaTek platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM.
+ */
+#define CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM
+//#define CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM
+//#define CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+/*
+ * Note.
+ * The below compile option is used to enable the specific device driver code handling for distinct touch ic.
+ * Please enable the compile option depends on the touch ic that customer project are using and disable the others.
+ */
+#define CONFIG_ENABLE_CHIP_MSG21XXA
+//#define CONFIG_ENABLE_CHIP_MSG22XX
+//#define CONFIG_ENABLE_CHIP_MSG26XXM
+
+/*
+ * Note.
+ * The below compile option is used to enable the specific device driver code handling to make sure main board can supply power to touch ic for some specific BB chip of MTK(EX. MT6582)/SPRD(EX. SC7715)/QCOM(EX. MSM8610).
+ * By default, this compile option is disabled.
+ */
+#define CONFIG_ENABLE_REGULATOR_POWER_ON
+
+/*
+ * Note.
+ * The below compile option is used to distinguish different workqueue scheduling mechanism when firmware report finger touch to device driver by IRQ interrupt.
+ * For MTK platform, there are two type of workqueue scheduling mechanism available.
+ * Please refer to the related code which is enclosed by compile option CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM in mstar_drv_platform_porting_layer.c for more detail.
+ * This compile option is used for MTK platform only.
+ * By default, this compile option is disabled.
+ */
+
+//#define CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+
+/*
+ * Note.
+ * The below compile option is used to apply DMA mode for read/write data between device driver and firmware by I2C.
+ * The DMA mode is used to reslove I2C read/write 8 bytes limitation for specific MTK BB chip(EX. MT6589/MT6572/...)
+ * This compile option is used for MTK platform only.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_ENABLE_DMA_IIC
+
+/*
+ * Note.
+ * The below compile option is used to enable the output log mechanism while touch device driver is running.
+ * If this compile option is not defined, the function for output log will be disabled.
+ * By default, this compile option is enabled.
+ */
+//#define CONFIG_ENABLE_TOUCH_DRIVER_DEBUG
+
+/*
+ * Note.
+ * The below compile option is used to enable the specific device driver code handling when touch panel support virtual key(EX. Menu, Home, Back, Search).
+ * If this compile option is not defined, the function for virtual key handling will be disabled.
+ * By default, this compile option is enabled.
+ */
+#define TOUCH_VIRTUAL_KEYS
+
+/*
+ * Note.
+ * Since specific MTK BB chip report virtual key touch by using coordinate instead of key code, the below compile option is used to enable the code handling for reporting key with coordinate.
+ * This compile option is used for MTK platform only.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE
+
+/*
+ * Note.
+ * The below compile option is used to enable debug mode data log for firmware.
+ * By default, this compile option is enabled.
+ */
+//#define CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+/*
+ * Note.
+ * The below compile option is used to enable gesture wakeup.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*
+ * Note.
+ * The below compile option is used to enable phone level MP test handling.
+ * By the way, phone level MP test is ready for MSG21XXA(support Open Test&Short Test)/MSG26XXM(support Open Test) only, but phone level MP test for MSG22XX is not ready yet.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_ENABLE_ITO_MP_TEST
+
+
+/*
+ * Note.
+ * The below compile option is used to change the permission of the sysfs virtual file system for CTS test.
+ * If this compile option is enabled, the permission 0644 will be used.
+ * If this compile option is disabled, the permission 0777 will be used.
+ * By default, this compile option is disabled.
+ */
+#define SYSFS_AUTHORITY_CHANGE_FOR_CTS_TEST
+
+/*
+ * Note.
+ * If this compile option is not defined, the SW ID mechanism for updating firmware will be disabled.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+/*
+ * Note.
+ * If this compile option is defined, the update firmware bin file shall be stored in a two dimensional array format.
+ * Else, the update firmware bin file shall be stored in an one dimensional array format.
+ * Be careful, MSG22XX only support storing update firmware bin file in an one dimensional array format, it does not support two dimensional array format.
+ * By default, this compile option is disabled.
+ */
+//#define CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+#define u8 unsigned char
+#define u16 unsigned short
+#define u32 unsigned int
+#define s8 signed char
+#define s16 signed short
+#define s32 signed int
+
+//#define SLAVE_I2C_ID_DBBUS (0xB2>>1) //0x59 // for MSG22XX
+#define SLAVE_I2C_ID_DBBUS (0xC4>>1) //0x62 // for MSG21XX/MSG21XXA/MSG26XXM
+#define SLAVE_I2C_ID_DWI2C (0x4C>>1) //0x26
+
+#define CHIP_TYPE_MSG21XX (0x01) // EX. MSG2133
+#define CHIP_TYPE_MSG21XXA (0x02) // EX. MSG2133A/MSG2138A(Besides, use version to distinguish MSG2133A/MSG2138A, you may refer to _DrvFwCtrlUpdateFirmwareCash())
+#define CHIP_TYPE_MSG26XXM (0x03) // EX. MSG2633M
+#define CHIP_TYPE_MSG22XX (0x7A) // EX. MSG2238/MSG2256
+
+#define PACKET_TYPE_TOOTH_PATTERN (0x20)
+#define PACKET_TYPE_GESTURE_WAKEUP (0x50)
+
+//#define TOUCH_SCREEN_X_MIN (0)
+//#define TOUCH_SCREEN_Y_MIN (0)
+/*
+ * Note.
+ * Please change the below touch screen resolution according to the touch panel that you are using.
+ */
+//#define TOUCH_SCREEN_X_MAX (480) //LCD_WIDTH
+//#define TOUCH_SCREEN_Y_MAX (800) //LCD_HEIGHT
+/*
+ * Note.
+ * Please do not change the below setting.
+ */
+#define TPD_WIDTH (2048)
+#define TPD_HEIGHT (2048)
+
+
+#define BIT0 (1<<0) // 0x0001
+#define BIT1 (1<<1) // 0x0002
+#define BIT2 (1<<2) // 0x0004
+#define BIT3 (1<<3) // 0x0008
+#define BIT4 (1<<4) // 0x0010
+#define BIT5 (1<<5) // 0x0020
+#define BIT6 (1<<6) // 0x0040
+#define BIT7 (1<<7) // 0x0080
+#define BIT8 (1<<8) // 0x0100
+#define BIT9 (1<<9) // 0x0200
+#define BIT10 (1<<10) // 0x0400
+#define BIT11 (1<<11) // 0x0800
+#define BIT12 (1<<12) // 0x1000
+#define BIT13 (1<<13) // 0x2000
+#define BIT14 (1<<14) // 0x4000
+#define BIT15 (1<<15) // 0x8000
+
+
+#define MAX_DEBUG_REGISTER_NUM (10)
+
+
+#ifdef SYSFS_AUTHORITY_CHANGE_FOR_CTS_TEST
+#define SYSFS_AUTHORITY (0644)
+#else
+#define SYSFS_AUTHORITY (0777)
+#endif
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+#define GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG 0x0001 //0000 0000 0000 0001
+#define GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG 0x0002 //0000 0000 0000 0010
+#define GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG 0x0004 //0000 0000 0000 0100
+#define GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG 0x0008 //0000 0000 0000 1000
+#define GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG 0x0010 //0000 0000 0001 0000
+#define GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG 0x0020 //0000 0000 0010 0000
+#define GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG 0x0040 //0000 0000 0100 0000
+#define GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG 0x0080 //0000 0000 1000 0000
+#define GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG 0x0100 //0000 0001 0000 0000
+#define GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG 0x0200 //0000 0010 0000 0000
+#define GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG 0x0400 //0000 0100 0000 0000
+#define GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG 0x0800 //0000 1000 0000 0000
+#define GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG 0x1000 //0001 0000 0000 0000
+
+#define GESTURE_WAKEUP_PACKET_LENGTH (6)
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR MACRO DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_TOUCH_DRIVER_DEBUG
+//#define DBG(fmt, arg...) pr_info(fmt, ##arg)
+#define DBG(fmt, arg...) printk(fmt, ##arg)
+#else
+#define DBG(fmt, arg...)
+#endif
+
+/*--------------------------------------------------------------------------*/
+/* SPREADTRUM DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+#define MSG_TP_IC_NAME "msg2138_ts" //"msg21xxA" or "msg22xx" or "msg26xxM"
+#define MSG_TP_I2C_ADDR 0x26
+#define MAX_FINGER_NUM 5
+
+struct msg2138_ts_platform_data{
+ int irq_gpio_number;
+ int reset_gpio_number;
+ const char *vdd_name;
+ int virtualkeys[12];
+ int TP_MAX_X;
+ int TP_MAX_Y;
+};
+struct point_node_t{
+ unsigned char active ;
+ unsigned char finger_id;
+ int posx;
+ int posy;
+};
+struct TouchScreenInfo_t{
+ unsigned char nTouchKeyMode;
+ unsigned char nTouchKeyCode;
+};
+struct touch_info {
+ int x1, y1;
+ int x2, y2;
+ int x3, y3;
+ int p1, p2,p3;
+ int count;
+};
+
+extern struct i2c_client *g_I2cClient;
+extern int MS_TS_MSG_IC_GPIO_RST;
+extern int MS_TS_MSG_IC_GPIO_INT;
+extern int TOUCH_SCREEN_X_MAX;
+extern int TOUCH_SCREEN_Y_MAX;
+extern struct point_node_t point_slot[MAX_FINGER_NUM*2];
+/*--------------------------------------------------------------------------*/
+/* DATA TYPE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+typedef enum
+{
+ EMEM_ALL = 0,
+ EMEM_MAIN,
+ EMEM_INFO
+} EmemType_e;
+
+typedef enum
+{
+ ITO_TEST_MODE_OPEN_TEST = 1,
+ ITO_TEST_MODE_SHORT_TEST = 2
+} ItoTestMode_e;
+
+typedef enum
+{
+ ITO_TEST_OK = 0,
+ ITO_TEST_FAIL,
+ ITO_TEST_GET_TP_TYPE_ERROR,
+ ITO_TEST_UNDEFINED_ERROR,
+ ITO_TEST_UNDER_TESTING
+
+} ItoTestResult_e;
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL VARIABLE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+extern u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength);
+extern u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength);
+extern u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh);
+extern u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC);
+extern void DrvCommonCrcInitTable(void);
+
+#endif /* __MSTAR_DRV_COMMON_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c
new file mode 100644
index 00000000..38f4e0db
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c
@@ -0,0 +1,195 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_ic_fw_porting_layer.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_ic_fw_porting_layer.h"
+
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern u16 g_GestureWakeupMode;
+extern u8 g_GestureWakeupFlag;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+u8 DrvIcFwLyrGetChipType(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvFwCtrlGetChipType();
+}
+
+void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlGetCustomerFirmwareVersion(pMajor, pMinor, ppVersion);
+}
+
+void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlGetPlatformFirmwareVersion(ppVersion);
+}
+
+s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvFwCtrlUpdateFirmware(szFwData, eEmemType);
+}
+
+u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return 1; // Indicate that it is necessary to register interrupt handler with GPIO INT pin when firmware is running on IC
+}
+
+void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlHandleFingerTouch();
+}
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+
+void DrvIcFwLyrOpenGestureWakeup(u16 nWakeupMode)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlOpenGestureWakeup(nWakeupMode);
+}
+
+void DrvIcFwLyrCloseGestureWakeup(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlCloseGestureWakeup();
+}
+
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+u16 DrvIcFwLyrGetFirmwareMode(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvFwCtrlGetFirmwareMode();
+}
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+
+u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvFwCtrlChangeFirmwareMode(nMode);
+}
+
+void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlGetFirmwareInfo(pInfo);
+}
+
+void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlRestoreFirmwareModeToLogDataMode();
+}
+
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+void DrvIcFwLyrCheckFirmwareUpdateBySwId(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvFwCtrlCheckFirmwareUpdateBySwId();
+}
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+
+void DrvIcFwLyrCreateMpTestWorkQueue(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvMpTestCreateMpTestWorkQueue();
+}
+
+void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ DrvMpTestScheduleMpTestWork(eItoTestMode);
+}
+
+s32 DrvIcFwLyrGetMpTestResult(void)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvMpTestGetTestResult();
+}
+
+void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvMpTestGetTestFailChannel(eItoTestMode, pFailChannel, pFailChannelCount);
+}
+
+void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength)
+{
+// DBG("*** %s() ***\n", __func__);
+
+ return DrvMpTestGetTestDataLog(eItoTestMode, pDataLog, pLength);
+}
+#endif //CONFIG_ENABLE_ITO_MP_TEST \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h
new file mode 100644
index 00000000..7981d4f0
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h
@@ -0,0 +1,90 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_ic_fw_porting_layer.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_IC_FW_PORTING_LAYER_H__
+#define __MSTAR_DRV_IC_FW_PORTING_LAYER_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+#include "mstar_drv_mutual_fw_control.h"
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+#include "mstar_drv_mutual_mp_test.h"
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+#include "mstar_drv_self_fw_control.h"
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+#include "mstar_drv_self_mp_test.h"
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+#endif
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern void DrvIcFwLyrOpenGestureWakeup(u16 nWakeupMode);
+extern void DrvIcFwLyrCloseGestureWakeup(void);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode);
+extern void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo);
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+extern u16 DrvIcFwLyrGetFirmwareMode(void);
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+extern void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+extern void DrvIcFwLyrCheckFirmwareUpdateBySwId(void);
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+extern u8 DrvIcFwLyrGetChipType(void);
+extern void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion);
+extern void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion);
+extern void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength);
+extern u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void);
+extern s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType);
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+extern void DrvIcFwLyrCreateMpTestWorkQueue(void);
+extern void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode);
+extern void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength);
+extern void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount);
+extern s32 DrvIcFwLyrGetMpTestResult(void);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#endif /* __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_main.c b/drivers/input/touchscreen/msg2138/mstar_drv_main.c
new file mode 100644
index 00000000..94f6be1e
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_main.c
@@ -0,0 +1,993 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_main.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_main.h"
+#include "mstar_drv_utility_adaption.h"
+#include "mstar_drv_platform_porting_layer.h"
+#include "mstar_drv_ic_fw_porting_layer.h"
+
+/*=============================================================*/
+// CONSTANT VALUE DEFINITION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern FirmwareInfo_t g_FirmwareInfo;
+extern u8 *g_LogModePacket;
+extern u16 g_FirmwareMode;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern u16 g_GestureWakeupMode;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+extern u8 g_ChipType;
+
+/*=============================================================*/
+// LOCAL VARIABLE DEFINITION
+/*=============================================================*/
+
+static u16 _gDebugReg[MAX_DEBUG_REGISTER_NUM] = {0};
+static u32 _gDebugRegCount = 0;
+
+static u8 *_gPlatformFwVersion = NULL; // internal use firmware version for MStar
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+static ItoTestMode_e _gItoTestMode = 0;
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+static u32 _gIsUpdateComplete = 0;
+
+static u8 *_gFwVersion = NULL; // customer firmware version
+
+static struct class *_gFirmwareClass = NULL;
+static struct device *_gFirmwareCmdDev = NULL;
+
+/*=============================================================*/
+// GLOBAL VARIABLE DEFINITION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+struct kset *g_TouchKSet = NULL;
+struct kobject *g_TouchKObj = NULL;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+u8 g_FwData[94][1024];
+u32 g_FwDataCount = 0;
+
+/*=============================================================*/
+// LOCAL FUNCTION DEFINITION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+ssize_t DrvMainFirmwareChipTypeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%d", g_ChipType);
+}
+
+ssize_t DrvMainFirmwareChipTypeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+// g_ChipType = DrvIcFwLyrGetChipType();
+
+ return nSize;
+}
+
+static DEVICE_ATTR(chip_type, SYSFS_AUTHORITY, DrvMainFirmwareChipTypeShow, DrvMainFirmwareChipTypeStore);
+
+ssize_t DrvMainFirmwareDriverVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%s", DEVICE_DRIVER_RELEASE_VERSION);
+}
+
+ssize_t DrvMainFirmwareDriverVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(driver_version, SYSFS_AUTHORITY, DrvMainFirmwareDriverVersionShow, DrvMainFirmwareDriverVersionStore);
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwareUpdateShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gFwVersion);
+}
+
+ssize_t DrvMainFirmwareUpdateStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DrvPlatformLyrDisableFingerTouchReport();
+
+ DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount);
+
+ if (0 != DrvIcFwLyrUpdateFirmware(g_FwData, EMEM_ALL))
+ {
+ _gIsUpdateComplete = 0;
+ DBG("Update FAILED\n");
+ }
+ else
+ {
+ _gIsUpdateComplete = 1;
+ DBG("Update SUCCESS\n");
+ }
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvIcFwLyrRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ return nSize;
+}
+
+static DEVICE_ATTR(update, SYSFS_AUTHORITY, DrvMainFirmwareUpdateShow, DrvMainFirmwareUpdateStore);
+
+ssize_t DrvMainFirmwareVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gFwVersion);
+}
+
+ssize_t DrvMainFirmwareVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u16 nMajor = 0, nMinor = 0;
+
+ DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion);
+
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(version, SYSFS_AUTHORITY, DrvMainFirmwareVersionShow, DrvMainFirmwareVersionStore);
+
+ssize_t DrvMainFirmwareDataShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount);
+
+ return g_FwDataCount;
+}
+
+ssize_t DrvMainFirmwareDataStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nCount = nSize / 1024;
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (nCount > 0) // nSize >= 1024
+ {
+ for (i = 0; i < nCount; i ++)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024);
+
+ g_FwDataCount ++;
+ }
+ }
+ else // nSize < 1024
+ {
+ if (nSize > 0)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf, nSize);
+
+ g_FwDataCount ++;
+ }
+ }
+
+ DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount);
+
+ if (pBuf != NULL)
+ {
+ DBG("*** buf[0] = %c ***\n", pBuf[0]);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(data, SYSFS_AUTHORITY, DrvMainFirmwareDataShow, DrvMainFirmwareDataStore);
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ssize_t DrvMainFirmwareTestShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("*** ctp mp test status = %d ***\n", DrvIcFwLyrGetMpTestResult());
+
+ return sprintf(pBuf, "%d", DrvIcFwLyrGetMpTestResult());
+}
+
+ssize_t DrvMainFirmwareTestStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nMode = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nMode);
+
+ DBG("Mp Test Mode = 0x%x\n", nMode);
+
+ if (nMode == ITO_TEST_MODE_OPEN_TEST) //open test
+ {
+ _gItoTestMode = ITO_TEST_MODE_OPEN_TEST;
+ DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_OPEN_TEST);
+ }
+ else if (nMode == ITO_TEST_MODE_SHORT_TEST) //short test
+ {
+ _gItoTestMode = ITO_TEST_MODE_SHORT_TEST;
+ DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_SHORT_TEST);
+ }
+ else
+ {
+ DBG("*** Undefined MP Test Mode ***\n");
+ }
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test, SYSFS_AUTHORITY, DrvMainFirmwareTestShow, DrvMainFirmwareTestStore);
+
+ssize_t DrvMainFirmwareTestLogShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvIcFwLyrGetMpTestDataLog(_gItoTestMode, pBuf, &nLength);
+
+ return nLength;
+}
+
+ssize_t DrvMainFirmwareTestLogStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test_log, SYSFS_AUTHORITY, DrvMainFirmwareTestLogShow, DrvMainFirmwareTestLogStore);
+
+ssize_t DrvMainFirmwareTestFailChannelShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 nCount = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvIcFwLyrGetMpTestFailChannel(_gItoTestMode, pBuf, &nCount);
+
+ return nCount;
+}
+
+ssize_t DrvMainFirmwareTestFailChannelStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test_fail_channel, SYSFS_AUTHORITY, DrvMainFirmwareTestFailChannelShow, DrvMainFirmwareTestFailChannelStore);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+
+ssize_t DrvMainFirmwareGestureWakeupModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode);
+
+ return sprintf(pBuf, "%x", g_GestureWakeupMode);
+}
+
+ssize_t DrvMainFirmwareGestureWakeupModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nLength, nWakeupMode;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nWakeupMode);
+ DBG("nWakeupMode = 0x%x\n", nWakeupMode);
+
+ nLength = nSize;
+ DBG("nLength = %d\n", nLength);
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) == GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG);
+ }
+
+ DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(gesture_wakeup_mode, SYSFS_AUTHORITY, DrvMainFirmwareGestureWakeupModeShow, DrvMainFirmwareGestureWakeupModeStore);
+
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwareDebugShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 i;
+ u8 nBank, nAddr;
+ u16 szRegData[MAX_DEBUG_REGISTER_NUM] = {0};
+ u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ for (i = 0; i < _gDebugRegCount; i ++)
+ {
+ szRegData[i] = RegGet16BitValue(_gDebugReg[i]);
+ }
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ for (i = 0; i < _gDebugRegCount; i ++)
+ {
+ nBank = (_gDebugReg[i] >> 8) & 0xFF;
+ nAddr = _gDebugReg[i] & 0xFF;
+
+ DBG("reg(0x%X,0x%X)=0x%04X\n", nBank, nAddr, szRegData[i]);
+
+ strcat(szOut, "reg(");
+ sprintf(szValue, "0x%X", nBank);
+ strcat(szOut, szValue);
+ strcat(szOut, ",");
+ sprintf(szValue, "0x%X", nAddr);
+ strcat(szOut, szValue);
+ strcat(szOut, ")=");
+ sprintf(szValue, "0x%04X", szRegData[i]);
+ strcat(szOut, szValue);
+ strcat(szOut, "\n");
+ }
+
+ return sprintf(pBuf, "%s\n", szOut);
+}
+
+ssize_t DrvMainFirmwareDebugStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 i;
+ char *pCh;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ DBG("*** %s() pBuf[0] = %c ***\n", __func__, pBuf[0]);
+ DBG("*** %s() pBuf[1] = %c ***\n", __func__, pBuf[1]);
+ DBG("*** %s() pBuf[2] = %c ***\n", __func__, pBuf[2]);
+ DBG("*** %s() pBuf[3] = %c ***\n", __func__, pBuf[3]);
+ DBG("*** %s() pBuf[4] = %c ***\n", __func__, pBuf[4]);
+ DBG("*** %s() pBuf[5] = %c ***\n", __func__, pBuf[5]);
+
+ DBG("nSize = %d\n", nSize);
+
+ i = 0;
+ while ((pCh = strsep((char **)&pBuf, " ,")) && (i < MAX_DEBUG_REGISTER_NUM))
+ {
+ DBG("pCh = %s\n", pCh);
+
+ _gDebugReg[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh));
+
+ DBG("_gDebugReg[%d] = 0x%04X\n", i, _gDebugReg[i]);
+ i ++;
+ }
+ _gDebugRegCount = i;
+
+ DBG("_gDebugRegCount = %d\n", _gDebugRegCount);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(debug, SYSFS_AUTHORITY, DrvMainFirmwareDebugShow, DrvMainFirmwareDebugStore);
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwarePlatformVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gPlatformFwVersion);
+}
+
+ssize_t DrvMainFirmwarePlatformVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DrvIcFwLyrGetPlatformFirmwareVersion(&_gPlatformFwVersion);
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvIcFwLyrRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(platform_version, SYSFS_AUTHORITY, DrvMainFirmwarePlatformVersionShow, DrvMainFirmwarePlatformVersionStore);
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ssize_t DrvMainFirmwareModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ g_FirmwareMode = DrvIcFwLyrGetFirmwareMode();
+
+ DBG("%s() firmware mode = 0x%x\n", __func__, g_FirmwareMode);
+
+ return sprintf(pBuf, "%x", g_FirmwareMode);
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+
+ DBG("%s() firmware mode = 0x%x, can change firmware mode = %d\n", __func__, g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode);
+
+ return sprintf(pBuf, "%x,%d", g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode);
+#endif
+}
+
+ssize_t DrvMainFirmwareModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ u32 nMode;
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nMode);
+ DBG("firmware mode = 0x%x\n", nMode);
+
+ if (nMode == FIRMWARE_MODE_DEMO_MODE) //demo mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEMO_MODE);
+ }
+ else if (nMode == FIRMWARE_MODE_DEBUG_MODE) //debug mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE);
+ }
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ else if (nMode == FIRMWARE_MODE_RAW_DATA_MODE) //raw data mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE);
+ }
+#endif
+ else
+ {
+ DBG("*** Undefined Firmware Mode ***\n");
+ }
+ }
+
+ DBG("*** g_FirmwareMode = 0x%x ***\n", g_FirmwareMode);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(mode, SYSFS_AUTHORITY, DrvMainFirmwareModeShow, DrvMainFirmwareModeStore);
+/*
+ssize_t DrvMainFirmwarePacketShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 i = 0;
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (g_LogModePacket != NULL)
+ {
+ DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]);
+ DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]);
+ DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7))
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62))
+#endif
+ {
+ for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++)
+ {
+ pBuf[i] = g_LogModePacket[i];
+ }
+
+ nLength = g_FirmwareInfo.nLogModePacketLength;
+ DBG("nLength = %d\n", nLength);
+ }
+ else
+ {
+ DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("g_LogModePacket is NULL\n");
+// nLength = 0;
+ }
+
+ return nLength;
+}
+
+ssize_t DrvMainFirmwarePacketStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(packet, SYSFS_AUTHORITY, DrvMainFirmwarePacketShow, DrvMainFirmwarePacketStore);
+*/
+ssize_t DrvMainFirmwareSensorShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if (g_FirmwareInfo.nLogModePacketHeader == 0xA5 || g_FirmwareInfo.nLogModePacketHeader == 0xAB)
+ {
+ return sprintf(pBuf, "%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy);
+ }
+ else if (g_FirmwareInfo.nLogModePacketHeader == 0xA7)
+ {
+ return sprintf(pBuf, "%d,%d,%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy, g_FirmwareInfo.nSs, g_FirmwareInfo.nSd);
+ }
+ else
+ {
+ DBG("Undefined debug mode packet format : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader);
+ return 0;
+ }
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketLength);
+#endif
+}
+
+ssize_t DrvMainFirmwareSensorStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+*/
+ return nSize;
+}
+
+static DEVICE_ATTR(sensor, SYSFS_AUTHORITY, DrvMainFirmwareSensorShow, DrvMainFirmwareSensorStore);
+
+ssize_t DrvMainFirmwareHeaderShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketHeader);
+}
+
+ssize_t DrvMainFirmwareHeaderStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+*/
+ return nSize;
+}
+
+static DEVICE_ATTR(header, SYSFS_AUTHORITY, DrvMainFirmwareHeaderShow, DrvMainFirmwareHeaderStore);
+
+//------------------------------------------------------------------------------//
+
+ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf)
+{
+ u32 i = 0;
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (strcmp(pAttr->attr.name, "packet") == 0)
+ {
+ if (g_LogModePacket != NULL)
+ {
+ DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]);
+ DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]);
+ DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7))
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62))
+#endif
+ {
+ for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++)
+ {
+ pBuf[i] = g_LogModePacket[i];
+ }
+
+ nLength = g_FirmwareInfo.nLogModePacketLength;
+ DBG("nLength = %d\n", nLength);
+ }
+ else
+ {
+ DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("g_LogModePacket is NULL\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("pAttr->attr.name = %s \n", pAttr->attr.name);
+// nLength = 0;
+ }
+
+ return nLength;
+}
+
+ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ if (strcmp(pAttr->attr.name, "packet") == 0)
+ {
+
+ }
+*/
+ return nCount;
+}
+
+static struct kobj_attribute packet_attr = __ATTR(packet, 0666, DrvMainKObjectPacketShow, DrvMainKObjectPacketStore);
+
+/* Create a group of attributes so that we can create and destroy them all at once. */
+static struct attribute *attrs[] = {
+ &packet_attr.attr,
+ NULL, /* need to NULL terminate the list of attributes */
+};
+
+/*
+ * An unnamed attribute group will put all of the attributes directly in
+ * the kobject directory. If we specify a name, a subdirectory will be
+ * created for the attributes with the directory being the name of the
+ * attribute group.
+ */
+struct attribute_group attr_group = {
+ .attrs = attrs,
+};
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+//------------------------------------------------------------------------------//
+
+s32 DrvMainTouchDeviceInitialize(void)
+{
+ s32 nRetVal = 0;
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ u8 *pDevicePath = NULL;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ /* set sysfs for firmware */
+ _gFirmwareClass = class_create(THIS_MODULE, "ms-touchscreen-msg20xx");
+ if (IS_ERR(_gFirmwareClass))
+ DBG("Failed to create class(firmware)!\n");
+
+ _gFirmwareCmdDev = device_create(_gFirmwareClass, NULL, 0, NULL, "device");
+ if (IS_ERR(_gFirmwareCmdDev))
+ DBG("Failed to create device(_gFirmwareCmdDev)!\n");
+
+ // version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_version.attr.name);
+ // update
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_update) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_update.attr.name);
+ // data
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_data) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_data.attr.name);
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ // test
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test.attr.name);
+ // test_log
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_log) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test_log.attr.name);
+ // test_fail_channel
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_fail_channel) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test_fail_channel.attr.name);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ // mode
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_mode) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_mode.attr.name);
+ // packet
+// if (device_create_file(_gFirmwareCmdDev, &dev_attr_packet) < 0)
+// DBG("Failed to create device file(%s)!\n", dev_attr_packet.attr.name);
+ // sensor
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_sensor) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_sensor.attr.name);
+ // header
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_header) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_header.attr.name);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ // debug
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_debug) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_debug.attr.name);
+ // platform version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_platform_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_platform_version.attr.name);
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ // gesture wakeup mode
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_gesture_wakeup_mode) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_gesture_wakeup_mode.attr.name);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+ // chip type
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_chip_type) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_chip_type.attr.name);
+ // driver version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_driver_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_driver_version.attr.name);
+
+ dev_set_drvdata(_gFirmwareCmdDev, NULL);
+#endif /*CONFIG_UPDATE_FIRMWARE_BY_SW_ID*/
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ DrvIcFwLyrCreateMpTestWorkQueue();
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ /* create a kset with the name of "kset_example" which is located under /sys/kernel/ */
+ g_TouchKSet = kset_create_and_add("kset_example", NULL, kernel_kobj);
+ if (!g_TouchKSet)
+ {
+ DBG("*** kset_create_and_add() failed, nRetVal = %d ***\n", nRetVal);
+
+ nRetVal = -ENOMEM;
+ }
+
+ g_TouchKObj = kobject_create();
+ if (!g_TouchKObj)
+ {
+ DBG("*** kobject_create() failed, nRetVal = %d ***\n", nRetVal);
+
+ nRetVal = -ENOMEM;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ g_TouchKObj->kset = g_TouchKSet;
+
+ nRetVal = kobject_add(g_TouchKObj, NULL, "%s", "kobject_example");
+ if (nRetVal != 0)
+ {
+ DBG("*** kobject_add() failed, nRetVal = %d ***\n", nRetVal);
+
+ kobject_put(g_TouchKObj);
+ g_TouchKObj = NULL;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ /* create the files associated with this kobject */
+ nRetVal = sysfs_create_group(g_TouchKObj, &attr_group);
+ if (nRetVal != 0)
+ {
+ DBG("*** sysfs_create_file() failed, nRetVal = %d ***\n", nRetVal);
+
+ kobject_put(g_TouchKObj);
+ g_TouchKObj = NULL;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ pDevicePath = kobject_get_path(g_TouchKObj, GFP_KERNEL);
+ DBG("DEVPATH = %s\n", pDevicePath);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ g_ChipType = DrvIcFwLyrGetChipType();
+ if(g_ChipType != 2) {
+ pr_err("[Mstar] the chip id error %x\n", g_ChipType);
+ return -ENODEV;
+ }
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ // get firmware mode for parsing packet judgement.
+ g_FirmwareMode = DrvIcFwLyrGetFirmwareMode();
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+
+ memset(&g_FirmwareInfo, 0x0, sizeof(FirmwareInfo_t));
+
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ DrvIcFwLyrCheckFirmwareUpdateBySwId();
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+ return nRetVal;
+}
+
+//------------------------------------------------------------------------------// \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_main.h b/drivers/input/touchscreen/msg2138/mstar_drv_main.h
new file mode 100644
index 00000000..e4c8d6f7
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_main.h
@@ -0,0 +1,89 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_main.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_MAIN_H__
+#define __MSTAR_DRV_MAIN_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR MACRO DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+/* DATA TYPE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+extern ssize_t DrvMainFirmwareDataShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareDataStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainFirmwareUpdateShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareUpdateStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainFirmwareVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+extern ssize_t DrvMainFirmwareTestShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareTestStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern ssize_t DrvMainFirmwareGestureWakeupModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareGestureWakeupModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+extern ssize_t DrvMainFirmwareDebugShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareDebugStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainFirmwarePlatformVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwarePlatformVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern ssize_t DrvMainFirmwareHeaderShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareHeaderStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainFirmwareModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+//extern ssize_t DrvMainFirmwarePacketShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+//extern ssize_t DrvMainFirmwarePacketStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainFirmwareSensorShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainFirmwareSensorStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize);
+extern ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf);
+extern ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern s32 DrvMainTouchDeviceInitialize(void);
+
+#endif /* __MSTAR_DRV_MAIN_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c
new file mode 100644
index 00000000..24314f47
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c
@@ -0,0 +1,209 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_platform_interface.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_platform_interface.h"
+#include "mstar_drv_main.h"
+#include "mstar_drv_ic_fw_porting_layer.h"
+#include "mstar_drv_platform_porting_layer.h"
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern u16 g_GestureWakeupMode;
+extern u8 g_GestureWakeupFlag;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*=============================================================*/
+// GLOBAL VARIABLE DEFINITION
+/*=============================================================*/
+
+extern struct input_dev *g_InputDevice;
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+// g_GestureWakeupMode = 0x1FFF; // Enable all gesture wakeup mode for testing
+
+ if (g_GestureWakeupMode != 0x0000)
+ {
+ DrvIcFwLyrOpenGestureWakeup(g_GestureWakeupMode);
+ return;
+ }
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+ DrvPlatformLyrFingerTouchReleased(0, 0); // Send touch end for clearing point touch
+ input_sync(g_InputDevice);
+
+ DrvPlatformLyrDisableFingerTouchReport();
+ DrvPlatformLyrTouchDevicePowerOff();
+}
+
+void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ if (g_GestureWakeupFlag == 1)
+ {
+ DrvIcFwLyrCloseGestureWakeup();
+ }
+ else
+ {
+ DrvPlatformLyrEnableFingerTouchReport();
+ }
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+ DrvPlatformLyrTouchDevicePowerOn();
+/*
+ DrvPlatformLyrFingerTouchReleased(0, 0);
+ input_sync(g_InputDevice);
+*/
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvIcFwLyrRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifndef CONFIG_ENABLE_GESTURE_WAKEUP
+ DrvPlatformLyrEnableFingerTouchReport();
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+}
+
+#ifdef TOUCH_VIRTUAL_KEYS
+/*static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+{
+ return sprintf(buf,
+ __stringify(EV_KEY) ":" __stringify(KEY_HOMEPAGE) ":192:1000:64:60"
+ ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":256:1000:64:60"
+ ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":128:1000:64:60"
+ ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":64:1000:64:60"
+ "\n");
+}*/
+static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+{
+ struct msg2138_ts_platform_data *pdata = g_I2cClient->dev.platform_data;
+ return sprintf(buf,"%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d\n"
+ ,__stringify(EV_KEY), __stringify(KEY_APPSELECT),pdata ->virtualkeys[0],pdata ->virtualkeys[1],pdata ->virtualkeys[2],pdata ->virtualkeys[3]
+ ,__stringify(EV_KEY), __stringify(KEY_HOMEPAGE),pdata ->virtualkeys[4],pdata ->virtualkeys[5],pdata ->virtualkeys[6],pdata ->virtualkeys[7]
+ ,__stringify(EV_KEY), __stringify(KEY_BACK),pdata ->virtualkeys[8],pdata ->virtualkeys[9],pdata ->virtualkeys[10],pdata ->virtualkeys[11]);
+}
+
+static struct kobj_attribute virtual_keys_attr = {
+ .attr = {
+ .name = "virtualkeys.msg2138_ts",
+ .mode = S_IRUGO,
+ },
+ .show = &virtual_keys_show,
+};
+
+static struct attribute *properties_attrs[] = {
+ &virtual_keys_attr.attr,
+ NULL
+};
+
+static struct attribute_group properties_attr_group = {
+ .attrs = properties_attrs,
+};
+
+static void pixcir_ts_virtual_keys_init(void)
+{
+ int ret;
+ struct kobject *properties_kobj;
+
+ properties_kobj = kobject_create_and_add("board_properties", NULL);
+ if (properties_kobj)
+ ret = sysfs_create_group(properties_kobj,
+ &properties_attr_group);
+ if (!properties_kobj || ret)
+ pr_err("failed to create board_properties\n");
+}
+#endif
+
+/* probe function is used for matching and initializing input device */
+s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId)
+{
+ s32 nRetVal = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrInputDeviceInitialize(pClient);
+
+ nRetVal = DrvPlatformLyrTouchDeviceRequestGPIO();
+ if(nRetVal < 0) {
+ pr_err("[Mstar] DrvPlatformLyrTouchDeviceRequestGPIO failed %d\n",nRetVal);
+ return nRetVal;
+ }
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+ DrvPlatformLyrTouchDeviceRegulatorPowerOn();
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+ DrvPlatformLyrTouchDevicePowerOn();
+
+ nRetVal = DrvMainTouchDeviceInitialize();
+ if(nRetVal < 0) {
+ pr_err("[Mstar] DrvMainTouchDeviceInitialize failed %d\n",nRetVal);
+ return nRetVal;
+ }
+
+#ifdef TOUCH_VIRTUAL_KEYS
+ pixcir_ts_virtual_keys_init();
+#endif
+
+ DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler();
+
+ DrvPlatformLyrTouchDeviceRegisterEarlySuspend();
+
+ printk("*** MStar touch driver registered ***\n");
+
+ return nRetVal;
+}
+
+/* remove function is triggered when the input device is removed from input sub-system */
+s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return DrvPlatformLyrTouchDeviceRemove(pClient);
+}
+
+void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrSetIicDataRate(pClient, nIicDataRate);
+}
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h
new file mode 100644
index 00000000..1d8e8283
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h
@@ -0,0 +1,47 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_platform_interface.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_PLATFORM_INTERFACE_H__
+#define __MSTAR_DRV_PLATFORM_INTERFACE_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+extern s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId);
+extern s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient);
+extern void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend);
+extern void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend);
+extern void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate);
+
+#endif /* __MSTAR_DRV_PLATFORM_INTERFACE_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c
new file mode 100644
index 00000000..2d759a8d
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c
@@ -0,0 +1,553 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_platform_porting_layer.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_platform_porting_layer.h"
+#include "mstar_drv_ic_fw_porting_layer.h"
+#include "mstar_drv_platform_interface.h"
+
+/*=============================================================*/
+// EXTREN VARIABLE DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern struct kset *g_TouchKSet;
+extern struct kobject *g_TouchKObj;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+extern struct tpd_device *tpd;
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+extern struct regulator *g_ReguVdd;
+#endif
+
+/*=============================================================*/
+// LOCAL VARIABLE DEFINITION
+/*=============================================================*/
+
+struct mutex g_Mutex;
+static struct work_struct _gFingerTouchWork;
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+static struct early_suspend _gEarlySuspend;
+#endif
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifndef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+static DECLARE_WAIT_QUEUE_HEAD(_gWaiter);
+static struct task_struct *_gThread = NULL;
+static int _gTpdFlag = 0;
+#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+/*=============================================================*/
+// GLOBAL VARIABLE DEFINITION
+/*=============================================================*/
+
+struct input_dev *g_InputDevice = NULL;
+static int _gIrq = -1;
+
+/*=============================================================*/
+// LOCAL FUNCTION DEFINITION
+/*=============================================================*/
+
+/* read data through I2C then report data to input sub-system when interrupt occurred */
+static void _DrvPlatformLyrFingerTouchDoWork(struct work_struct *pWork)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ mutex_lock(&g_Mutex);
+
+ DrvIcFwLyrHandleFingerTouch(NULL, 0);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+// enable_irq(MS_TS_MSG_IC_GPIO_INT);
+ enable_irq(_gIrq);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
+#endif
+
+ mutex_unlock(&g_Mutex);
+}
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+/* The interrupt service routine will be triggered when interrupt occurred */
+static irqreturn_t _DrvPlatformLyrFingerTouchInterruptHandler(s32 nIrq, void *pDeviceId)
+{
+ DBG("*** %s() ***\n", __func__);
+
+// disable_irq_nosync(MS_TS_MSG_IC_GPIO_INT);
+ disable_irq_nosync(_gIrq);
+ schedule_work(&_gFingerTouchWork);
+
+ return IRQ_HANDLED;
+}
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+static void _DrvPlatformLyrFingerTouchInterruptHandler(void)
+{
+#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+ mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM);
+ schedule_work(&_gFingerTouchWork);
+#else
+ mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM);
+
+ _gTpdFlag = 1;
+ wake_up_interruptible(&_gWaiter);
+#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+}
+
+static int _DrvPlatformLyrFingerTouchHandler(void *pUnUsed)
+{
+ struct sched_param param = { .sched_priority = RTPM_PRIO_TPD };
+ sched_setscheduler(current, SCHED_RR, &param);
+
+ do
+ {
+ set_current_state(TASK_INTERRUPTIBLE);
+ wait_event_interruptible(_gWaiter, _gTpdFlag != 0);
+ _gTpdFlag = 0;
+
+ set_current_state(TASK_RUNNING);
+
+ mutex_lock(&g_Mutex);
+
+ DrvIcFwLyrHandleFingerTouch(NULL, 0);
+
+ mutex_unlock(&g_Mutex);
+
+ mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
+
+ } while (!kthread_should_stop());
+
+ return 0;
+}
+#endif
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void)
+{
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ s32 nRetVal = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nRetVal = regulator_set_voltage(g_ReguVdd, 2800000, 2800000); // For specific SPRD BB chip(ex. SC7715) or QCOM BB chip, need to enable this function call for correctly power on Touch IC.
+
+ if (nRetVal)
+ {
+ DBG("Could not set to 2800mv.\n");
+ }
+ regulator_enable(g_ReguVdd);
+
+ mdelay(20); //mdelay(100);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_2800, "TP"); // For specific MTK BB chip(ex. MT6582), need to enable this function call for correctly power on Touch IC.
+#endif
+}
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+void DrvPlatformLyrTouchDevicePowerOn(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1);
+// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1);
+// mdelay(100);
+ gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0);
+ mdelay(10);
+ gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1);
+ mdelay(50);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT);
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO);
+
+#ifdef TPD_CLOSE_POWER_IN_SLEEP
+ hwPowerDown(TPD_POWER_SOURCE, "TP");
+ mdelay(100);
+ hwPowerOn(TPD_POWER_SOURCE, VOL_2800, "TP");
+ mdelay(10); // reset pulse
+#endif //TPD_CLOSE_POWER_IN_SLEEP
+
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE);
+ mdelay(180); // wait stable
+#endif
+}
+
+void DrvPlatformLyrTouchDevicePowerOff(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+// gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 0);
+ gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT);
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO);
+#ifdef TPD_CLOSE_POWER_IN_SLEEP
+ hwPowerDown(TPD_POWER_SOURCE, "TP");
+#endif //TPD_CLOSE_POWER_IN_SLEEP
+#endif
+}
+
+void DrvPlatformLyrTouchDeviceResetHw(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1);
+// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1);
+ gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0);
+ mdelay(10);
+ gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1);
+ mdelay(50);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT);
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE);
+ mdelay(10);
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT);
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO);
+ mdelay(50);
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT);
+ mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE);
+ mdelay(50);
+#endif
+}
+
+void DrvPlatformLyrDisableFingerTouchReport(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+// disable_irq(MS_TS_MSG_IC_GPIO_RST);
+ disable_irq(_gIrq);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM);
+#endif
+}
+
+void DrvPlatformLyrEnableFingerTouchReport(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+// enable_irq(MS_TS_MSG_IC_GPIO_RST);
+ enable_irq(_gIrq);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
+#endif
+}
+
+void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("point touch pressed\n");
+
+ input_report_key(g_InputDevice, BTN_TOUCH, 1);
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ input_report_abs(g_InputDevice, ABS_MT_TRACKING_ID, nId);
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+ input_report_abs(g_InputDevice, ABS_MT_TOUCH_MAJOR, 1);
+ input_report_abs(g_InputDevice, ABS_MT_WIDTH_MAJOR, 1);
+ input_report_abs(g_InputDevice, ABS_MT_POSITION_X, nX);
+ input_report_abs(g_InputDevice, ABS_MT_POSITION_Y, nY);
+
+ input_mt_sync(g_InputDevice);
+
+}
+
+void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("point touch released\n");
+
+ input_report_key(g_InputDevice, BTN_TOUCH, 0);
+ input_mt_sync(g_InputDevice);
+
+}
+
+s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient)
+{
+ s32 nRetVal = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ mutex_init(&g_Mutex);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ /* allocate an input device */
+ g_InputDevice = input_allocate_device();
+ if (g_InputDevice == NULL)
+ {
+ DBG("*** input device allocation failed ***\n");
+ return -ENOMEM;
+ }
+
+ g_InputDevice->name = MSG_TP_IC_NAME;
+ g_InputDevice->phys = "I2C";
+ g_InputDevice->dev.parent = &pClient->dev;
+ g_InputDevice->id.bustype = BUS_I2C;
+
+ /* set the supported event type for input device */
+ __set_bit(EV_KEY, g_InputDevice->evbit);
+ __set_bit(EV_ABS, g_InputDevice->evbit);
+ __set_bit(EV_SYN, g_InputDevice->evbit);
+ //__set_bit(BTN_TOUCH, g_InputDevice->keybit);
+ __set_bit(ABS_MT_TOUCH_MAJOR, g_InputDevice->absbit);
+ __set_bit(ABS_MT_POSITION_X, g_InputDevice->absbit);
+ __set_bit(ABS_MT_POSITION_Y, g_InputDevice->absbit);
+ __set_bit(ABS_MT_WIDTH_MAJOR, g_InputDevice->absbit);
+
+ __set_bit(KEY_MENU, g_InputDevice->keybit);
+ __set_bit(KEY_BACK, g_InputDevice->keybit);
+ __set_bit(KEY_HOME, g_InputDevice->keybit);
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ input_set_capability(g_InputDevice, EV_KEY, KEY_POWER);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_UP);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_W);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_Z);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_V);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_O);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_M);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_C);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_E);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_S);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*
+#ifdef CONFIG_TP_HAVE_KEY
+ set_bit(TOUCH_KEY_MENU, g_InputDevice->keybit); //Menu
+ set_bit(TOUCH_KEY_HOME, g_InputDevice->keybit); //Home
+ set_bit(TOUCH_KEY_BACK, g_InputDevice->keybit); //Back
+ set_bit(TOUCH_KEY_SEARCH, g_InputDevice->keybit); //Search
+#endif
+*/
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, 255, 0, 0);
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+ input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, 0, TOUCH_SCREEN_X_MAX, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, 0, TOUCH_SCREEN_Y_MAX, 0, 0);
+
+ /* register the input device to input sub-system */
+ nRetVal = input_register_device(g_InputDevice);
+ if (nRetVal < 0)
+ {
+ DBG("*** Unable to register touch input device ***\n");
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ g_InputDevice = tpd->dev;
+
+// g_InputDevice->name = pClient->name;
+ g_InputDevice->phys = "I2C";
+ g_InputDevice->dev.parent = &pClient->dev;
+ g_InputDevice->id.bustype = BUS_I2C;
+
+ /* set the supported event type for input device */
+ set_bit(EV_ABS, g_InputDevice->evbit);
+ set_bit(EV_SYN, g_InputDevice->evbit);
+ set_bit(EV_KEY, g_InputDevice->evbit);
+ set_bit(BTN_TOUCH, g_InputDevice->keybit);
+ set_bit(INPUT_PROP_DIRECT, g_InputDevice->propbit);
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ input_set_capability(g_InputDevice, EV_KEY, KEY_POWER);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_UP);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_W);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_Z);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_V);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_O);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_M);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_C);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_E);
+ input_set_capability(g_InputDevice, EV_KEY, KEY_S);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*
+#ifdef CONFIG_TP_HAVE_KEY
+ set_bit(TOUCH_KEY_MENU, g_InputDevice->keybit); //Menu
+ set_bit(TOUCH_KEY_HOME, g_InputDevice->keybit); //Home
+ set_bit(TOUCH_KEY_BACK, g_InputDevice->keybit); //Back
+ set_bit(TOUCH_KEY_SEARCH, g_InputDevice->keybit); //Search
+#endif
+*/
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, 255, 0, 0);
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+ input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, 0, TOUCH_SCREEN_X_MAX, 0, 0);
+ input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, 0, TOUCH_SCREEN_Y_MAX, 0, 0);
+#endif
+
+ return nRetVal;
+}
+
+s32 DrvPlatformLyrTouchDeviceRequestGPIO(void)
+{
+ s32 nRetVal = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_RST, "C_TP_RST");
+ if (nRetVal < 0)
+ {
+ DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_RST, nRetVal);
+ }
+
+ nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_INT, "C_TP_INT");
+ if (nRetVal < 0)
+ {
+ DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal);
+ }
+#endif
+
+ return nRetVal;
+}
+
+s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void)
+{
+ s32 nRetVal = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (DrvIcFwLyrIsRegisterFingerTouchInterruptHandler())
+ {
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ /* initialize the finger touch work queue */
+ INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork);
+
+ _gIrq = gpio_to_irq(MS_TS_MSG_IC_GPIO_INT);
+
+ /* request an irq and register the isr */
+ nRetVal = request_irq(_gIrq/*MS_TS_MSG_IC_GPIO_INT*/, _DrvPlatformLyrFingerTouchInterruptHandler,
+ IRQF_TRIGGER_RISING /* | IRQF_NO_SUSPEND *//* IRQF_TRIGGER_FALLING */,
+ "msg2xxx", NULL);
+ if (nRetVal != 0)
+ {
+ DBG("*** Unable to claim irq %d; error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_INT, GPIO_CTP_EINT_PIN_M_EINT);
+ mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_INT, GPIO_DIR_IN);
+ mt_set_gpio_pull_enable(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_ENABLE);
+ mt_set_gpio_pull_select(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_UP);
+
+ mt_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN);
+ mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_RISING, _DrvPlatformLyrFingerTouchInterruptHandler, 1);
+
+ mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
+
+#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+ /* initialize the finger touch work queue */
+ INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork);
+#else
+ _gThread = kthread_run(_DrvPlatformLyrFingerTouchHandler, 0, TPD_DEVICE);
+ if (IS_ERR(_gThread))
+ {
+ nRetVal = PTR_ERR(_gThread);
+ DBG("Failed to create kernel thread: %d\n", nRetVal);
+ }
+#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM
+#endif
+ }
+
+ return nRetVal;
+}
+
+void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ _gEarlySuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN;
+ _gEarlySuspend.suspend = MsDrvInterfaceTouchDeviceSuspend;
+ _gEarlySuspend.resume = MsDrvInterfaceTouchDeviceResume;
+ register_early_suspend(&_gEarlySuspend);
+#endif
+}
+
+/* remove function is triggered when the input device is removed from input sub-system */
+s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+// free_irq(MS_TS_MSG_IC_GPIO_INT, g_InputDevice);
+ free_irq(_gIrq, g_InputDevice);
+ gpio_free(MS_TS_MSG_IC_GPIO_INT);
+ gpio_free(MS_TS_MSG_IC_GPIO_RST);
+ input_unregister_device(g_InputDevice);
+#endif
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ kset_unregister(g_TouchKSet);
+ kobject_put(g_TouchKObj);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ return 0;
+}
+
+void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate)
+{
+ DBG("*** %s() nIicDataRate = %d ***\n", __func__, nIicDataRate);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on SPRD platform
+ //sprd_i2c_ctl_chg_clk(pClient->adapter->nr, nIicDataRate);
+ //mdelay(100);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on QCOM platform
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ pClient->timing = nIicDataRate/1000;
+#endif
+} \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h
new file mode 100644
index 00000000..f1f5aaa7
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h
@@ -0,0 +1,125 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_platform_porting_layer.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__
+#define __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+
+#include <soc/sprd/board.h>
+#include <soc/sprd/gpio.h>
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+#include <soc/sprd/regulator.h>
+#include <linux/regulator/consumer.h>
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+#include <linux/regulator/consumer.h>
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+
+#include <linux/sched.h>
+#include <linux/kthread.h>
+#include <linux/rtpm_prio.h>
+#include <linux/wait.h>
+#include <linux/time.h>
+#include <linux/hwmsen_helper.h>
+//#include <linux/hw_module_info.h>
+
+#include <linux/fs.h>
+#include <asm/uaccess.h>
+#include <linux/namei.h>
+#include <linux/vmalloc.h>
+
+#include <mach/mt_pm_ldo.h>
+#include <mach/mt_typedefs.h>
+#include <mach/mt_boot.h>
+#include <mach/mt_gpio.h>
+
+#include <cust_eint.h>
+#include "tpd.h"
+#include "cust_gpio_usage.h"
+
+#endif
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+/*
+ * Note.
+ * Please change the below GPIO pin setting to follow the platform that you are using(EX. MediaTek, Spreadtrum, Qualcomm).
+ */
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+
+// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting
+//#define MS_TS_MSG_IC_GPIO_RST GPIO_TOUCH_RESET //53 //35
+//#define MS_TS_MSG_IC_GPIO_INT GPIO_TOUCH_IRQ //52 //37
+
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+
+// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting
+#define MS_TS_MSG_IC_GPIO_RST 0
+#define MS_TS_MSG_IC_GPIO_INT 1
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+#define MS_TS_MSG_IC_GPIO_RST (GPIO_CTP_RST_PIN)
+#define MS_TS_MSG_IC_GPIO_INT (GPIO_CTP_EINT_PIN)
+#endif
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+extern void DrvPlatformLyrDisableFingerTouchReport(void);
+extern void DrvPlatformLyrEnableFingerTouchReport(void);
+extern void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId);
+extern void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY);
+extern s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient);
+extern void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate);
+extern void DrvPlatformLyrTouchDevicePowerOff(void);
+extern void DrvPlatformLyrTouchDevicePowerOn(void);
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+extern void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void);
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+extern void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void);
+extern s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void);
+extern s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient);
+extern s32 DrvPlatformLyrTouchDeviceRequestGPIO(void);
+extern void DrvPlatformLyrTouchDeviceResetHw(void);
+
+#endif /* __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c
new file mode 100644
index 00000000..dbe21439
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c
@@ -0,0 +1,3974 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_self_fw_control.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_self_fw_control.h"
+#include "mstar_drv_utility_adaption.h"
+#include "mstar_drv_platform_porting_layer.h"
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+static const int g_TpVirtualKeyDimLocal[3][4] = { {256,1000,70,70}, // virtualkey 1 MENU
+ {128,1000,70,70}, // virtualkey 4 HOME
+ {192,1000,70,70} }; // virtualkey 2 BACK
+
+struct point_node_t point_slot[MAX_FINGER_NUM*2];
+static int keycode;
+
+extern struct input_dev *g_InputDevice;
+
+extern u8 g_FwData[94][1024];
+extern u32 g_FwDataCount;
+
+extern struct mutex g_Mutex;
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern struct kobject *g_TouchKObj;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+/*=============================================================*/
+// LOCAL VARIABLE DEFINITION
+/*=============================================================*/
+
+static u8 _gTpVendorCode[3] = {0};
+
+static u8 _gDwIicInfoData[1024];
+static u8 _gOneDimenFwData[MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024+MSG22XX_FIRMWARE_INFO_BLOCK_SIZE] = {0}; // used for MSG22XX
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+/*
+ * Note.
+ * Please modify the name of the below .h depends on the vendor TP that you are using.
+ */
+static unsigned char msg2xxx_yyyy_update_bin[] = {
+};
+static unsigned char msg2xxx_xxxx_update_bin[] = {
+#include "msg2xxx_xxxx_update_bin.h"
+};
+
+static u32 _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+static struct work_struct _gUpdateFirmwareBySwIdWork;
+static struct workqueue_struct *_gUpdateFirmwareBySwIdWorkQueue = NULL;
+
+static u32 _gIsUpdateInfoBlockFirst = 0;
+static u8 _gIsUpdateFirmware = 0x00;
+
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+static u16 _gGestureWakeupValue = 0;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+
+/*=============================================================*/
+// GLOBAL VARIABLE DEFINITION
+/*=============================================================*/
+
+u8 g_ChipType = 0;
+u8 g_DemoModePacket[DEMO_MODE_PACKET_LENGTH] = {0};
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+FirmwareInfo_t g_FirmwareInfo;
+
+u8 *g_LogModePacket = NULL;
+u16 g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+u8 *_gGestureWakeupPacket = NULL;
+
+u16 g_GestureWakeupMode = 0x0000;
+u8 g_GestureWakeupFlag = 0;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*=============================================================*/
+// LOCAL FUNCTION DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork);
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+/*=============================================================*/
+// LOCAL FUNCTION DEFINITION
+/*=============================================================*/
+
+unsigned char tpd_check_sum(unsigned char *pval)
+{
+ int i, sum = 0;
+ for(i = 0; i < 7; i++)
+ sum += pval[i];
+ return (unsigned char)((-sum) & 0xFF);
+}
+
+static void _DrvFwCtrlEraseEmemC32(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ /////////////////////////
+ //Erase all
+ /////////////////////////
+
+ // Enter gpio mode
+ RegSet16BitValue(0x161E, 0xBEAF);
+
+ // Before gpio mode, set the control pin as the orginal status
+ RegSet16BitValue(0x1608, 0x0000);
+ RegSetLByteValue(0x160E, 0x10);
+ mdelay(10);
+
+ // ptrim = 1, h'04[2]
+ RegSetLByteValue(0x1608, 0x04);
+ RegSetLByteValue(0x160E, 0x10);
+ mdelay(10);
+
+ // ptm = 6, h'04[12:14] = b'110
+ RegSetLByteValue(0x1609, 0x60);
+ RegSetLByteValue(0x160E, 0x10);
+
+ // pmasi = 1, h'04[6]
+ RegSetLByteValue(0x1608, 0x44);
+ // pce = 1, h'04[11]
+ RegSetLByteValue(0x1609, 0x68);
+ // perase = 1, h'04[7]
+ RegSetLByteValue(0x1608, 0xC4);
+ // pnvstr = 1, h'04[5]
+ RegSetLByteValue(0x1608, 0xE4);
+ // pwe = 1, h'04[9]
+ RegSetLByteValue(0x1609, 0x6A);
+ // trigger gpio load
+ RegSetLByteValue(0x160E, 0x10);
+}
+
+static void _DrvFwCtrlEraseEmemC33(EmemType_e eEmemType)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ // Stop mcu
+ RegSet16BitValue(0x0FE6, 0x0001);
+
+ // Disable watchdog
+ RegSetLByteValue(0x3C60, 0x55);
+ RegSetLByteValue(0x3C61, 0xAA);
+
+ // Set PROGRAM password
+ RegSetLByteValue(0x161A, 0xBA);
+ RegSetLByteValue(0x161B, 0xAB);
+
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+
+ if (eEmemType == EMEM_ALL)
+ {
+ RegSetLByteValue(0x1608, 0x10); //mark
+ }
+
+ RegSetLByteValue(0x1618, 0x40);
+ mdelay(10);
+
+ RegSetLByteValue(0x1618, 0x80);
+
+ // erase trigger
+ if (eEmemType == EMEM_MAIN)
+ {
+ RegSetLByteValue(0x160E, 0x04); //erase main
+ }
+ else
+ {
+ RegSetLByteValue(0x160E, 0x08); //erase all block
+ }
+}
+
+static void _DrvFwCtrlMsg22xxGetTpVendorCode(u8 *pTpVendorCode)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ u16 nRegData1, nRegData2;
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0xC1E9); // Set start address for tp vendor code on info block(Actually, start reading from 0xC1E8)
+
+ // Enable burst mode
+// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+ nRegData2 = RegGet16BitValue(0x1606);
+
+ pTpVendorCode[0] = ((nRegData1 >> 8) & 0xFF);
+ pTpVendorCode[1] = (nRegData2 & 0xFF);
+ pTpVendorCode[2] = ((nRegData2 >> 8) & 0xFF);
+
+ DBG("pTpVendorCode[0] = 0x%x , %c \n", pTpVendorCode[0], pTpVendorCode[0]);
+ DBG("pTpVendorCode[1] = 0x%x , %c \n", pTpVendorCode[1], pTpVendorCode[1]);
+ DBG("pTpVendorCode[2] = 0x%x , %c \n", pTpVendorCode[2], pTpVendorCode[2]);
+
+ // Clear burst mode
+// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ mdelay(100);
+ }
+}
+
+static void _DrvFwCtrlMsg22xxEraseEmem(EmemType_e eEmemType)
+{
+ u32 i;
+ u16 nRegData = 0;
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+
+ DBG("Erase start\n");
+
+ // Stop mcu
+ RegSet16BitValue(0x0FE6, 0x0001);
+
+ // Disable watchdog
+ RegSetLByteValue(0x3C60, 0x55);
+ RegSetLByteValue(0x3C61, 0xAA);
+
+ // Set PROGRAM password
+ RegSetLByteValue(0x161A, 0xBA);
+ RegSetLByteValue(0x161B, 0xAB);
+
+ if (eEmemType == EMEM_ALL) // 48KB + 512Byte
+ {
+ DBG("Erase all block\n");
+
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(100);
+
+ // Chip erase
+ RegSet16BitValue(0x160E, BIT3);
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+ else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8)
+ {
+ DBG("Erase main block\n");
+
+ for (i = 0; i < 3; i ++)
+ {
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(10);
+
+ if (i == 0)
+ {
+ RegSet16BitValue(0x1600, 0x0000);
+ }
+ else if (i == 1)
+ {
+ RegSet16BitValue(0x1600, 0x8000);
+ }
+ else if (i == 2)
+ {
+ RegSet16BitValue(0x1600, 0xA000);
+ }
+
+ // Sector erase
+ RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2));
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+ }
+ else if (eEmemType == EMEM_INFO) // 512Byte
+ {
+ DBG("Erase info block\n");
+
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(10);
+
+ RegSet16BitValue(0x1600, 0xC000);
+
+ // Sector erase
+ RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2));
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+
+ DBG("Erase end\n");
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+}
+
+static void _DrvFwCtrlMsg22xxProgramEmem(EmemType_e eEmemType) // For MSG22XX
+{
+ u32 i, j;
+ u32 nRemainSize = 0, nBlockSize = 0, nSize = 0, index = 0;
+ u16 nRegData;
+ u8 szDbBusTxData[1024] = {0};
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ u32 nSizePerWrite = 125;
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ u32 nSizePerWrite = 1021;
+#endif
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+
+ // Hold reset pin before program
+ RegSetLByteValue(0x1E06, 0x00);
+
+ DBG("Program start\n");
+
+ RegSet16BitValue(0x161A, 0xABBA);
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ if (eEmemType == EMEM_MAIN)
+ {
+ DBG("Program main block\n");
+
+ RegSet16BitValue(0x1600, 0x0000); // Set start address of main block
+ nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB
+ index = 0;
+ }
+ else if (eEmemType == EMEM_INFO)
+ {
+ DBG("Program info block\n");
+
+ RegSet16BitValue(0x1600, 0xC000); // Set start address of info block
+ nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte
+ index = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024;
+ }
+ else
+ {
+ DBG("eEmemType = %d is not supported for program e-memory.\n", eEmemType);
+ return;
+ }
+
+ RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode
+
+ // Program start
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3);
+
+ szDbBusTxData[0] = 0x20;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ i = 0;
+
+ while (nRemainSize > 0)
+ {
+ if (nRemainSize > nSizePerWrite)
+ {
+ nBlockSize = nSizePerWrite;
+ }
+ else
+ {
+ nBlockSize = nRemainSize;
+ }
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ nSize = 3;
+
+ for (j = 0; j < nBlockSize; j ++)
+ {
+ szDbBusTxData[3+j] = _gOneDimenFwData[index+(i*nSizePerWrite)+j];
+ nSize ++;
+ }
+ i ++;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize);
+
+ nRemainSize = nRemainSize - nBlockSize;
+ }
+
+ // Program end
+ szDbBusTxData[0] = 0x21;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ nRegData = RegGet16BitValue(0x160C);
+ RegSet16BitValue(0x160C, nRegData & (~0x01));
+
+ DBG("Wait write done flag\n");
+
+ // Polling 0x1610 is 0x0002
+ do
+ {
+ nRegData = RegGet16BitValue(0x1610);
+ nRegData = nRegData & BIT1;
+ mdelay(10);
+
+ } while (nRegData != BIT1); // Wait write done flag
+
+ DBG("Program end\n");
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+}
+
+static u32 _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EmemType_e eEmemType) // For MSG22XX
+{
+ u16 nCrcDown = 0;
+ u32 nRetVal = 0;
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Set PCE high
+ RegSetLByteValue(0x1618, 0x40);
+
+ if (eEmemType == EMEM_MAIN)
+ {
+ // Set start address and end address for main block
+ RegSet16BitValue(0x1600, 0x0000);
+ RegSet16BitValue(0x1640, 0xBFF8);
+ }
+ else if (eEmemType == EMEM_INFO)
+ {
+ // Set start address and end address for info block
+ RegSet16BitValue(0x1600, 0xC000);
+ RegSet16BitValue(0x1640, 0xC1F8);
+ }
+
+ // CRC reset
+ RegSet16BitValue(0x164E, 0x0001);
+
+ RegSet16BitValue(0x164E, 0x0000);
+
+ // Trigger CRC check
+ RegSetLByteValue(0x160E, 0x20);
+ mdelay(10);
+
+ nCrcDown = RegGet16BitValue(0x164E);
+
+ while (nCrcDown != 2)
+ {
+ DBG("Wait CRC down\n");
+ mdelay(10);
+ nCrcDown = RegGet16BitValue(0x164E);
+ }
+
+ nRetVal = RegGet16BitValue(0x1652);
+ nRetVal = (nRetVal << 16) | RegGet16BitValue(0x1650);
+
+ DBG("Hardware CRC = 0x%x\n", nRetVal);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ return nRetVal;
+}
+
+static void _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(u8 szTwoDimenFwData[][1024], u8* pOneDimenFwData)
+{
+ u32 i, j;
+
+ DBG("*** %s() ***\n", __func__);
+
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j];
+ }
+ }
+ else // i == 48
+ {
+ for (j = 0; j < 512; j ++)
+ {
+ pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j];
+ }
+ }
+ }
+}
+
+static s32 _DrvFwCtrlParsePacket(u8 *pPacket, u16 nLength, TouchInfo_t *pInfo)
+{
+ u8 nCheckSum = 0;
+ u32 nDeltaX = 0, nDeltaY = 0;
+ u32 nX = 0;
+ u32 nY = 0;
+#ifdef CONFIG_SWAP_X_Y
+ u32 nTempX;
+ u32 nTempY;
+#endif
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ u8 nCheckSumIndex = 0;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE)
+ {
+ nCheckSumIndex = 7;
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE)
+ {
+ nCheckSumIndex = 31;
+ }
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ if (g_GestureWakeupFlag == 1)
+ {
+ nCheckSumIndex = nLength-1;
+ }
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], nCheckSumIndex);
+ DBG("check sum : [%x] == [%x]? \n", pPacket[nCheckSumIndex], nCheckSum);
+#else
+ nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], (nLength-1));
+ DBG("check ksum : [%x] == [%x]? \n", pPacket[nLength-1], nCheckSum);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ if (g_GestureWakeupFlag == 1)
+ {
+ u8 nWakeupMode = 0;
+ u8 bIsCorrectFormat = 0;
+
+ DBG("received raw data from touch panel as following:\n");
+ DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x pPacket[5]=%x \n", \
+ pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5]);
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX && pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x06 && pPacket[3] == 0x50)
+ {
+ nWakeupMode = pPacket[4];
+ bIsCorrectFormat = 1;
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG21XXA && pPacket[0] == 0x52 && pPacket[1] == 0xFF && pPacket[2] == 0xFF && pPacket[3] == 0xFF && pPacket[4] == 0xFF && pPacket[6] == 0xFF)
+ {
+ nWakeupMode = pPacket[5];
+ bIsCorrectFormat = 1;
+ }
+
+ if (bIsCorrectFormat)
+ {
+ DBG("nWakeupMode = 0x%x\n", nWakeupMode);
+
+ switch (nWakeupMode)
+ {
+ case 0x58:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG;
+
+ DBG("Light up screen by DOUBLE_CLICK gesture wakeup.\n");
+
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x60:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG;
+
+ DBG("Light up screen by UP_DIRECT gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_UP, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_UP, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x61:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG;
+
+ DBG("Light up screen by DOWN_DIRECT gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_DOWN, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_DOWN, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x62:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG;
+
+ DBG("Light up screen by LEFT_DIRECT gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_LEFT, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_LEFT, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x63:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG;
+
+ DBG("Light up screen by RIGHT_DIRECT gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_RIGHT, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_RIGHT, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x64:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG;
+
+ DBG("Light up screen by m_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_M, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_M, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x65:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG;
+
+ DBG("Light up screen by W_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_W, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_W, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x66:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG;
+
+ DBG("Light up screen by C_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_C, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_C, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x67:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG;
+
+ DBG("Light up screen by e_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_E, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_E, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x68:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG;
+
+ DBG("Light up screen by V_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_V, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_V, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x69:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG;
+
+ DBG("Light up screen by O_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_O, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_O, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x6A:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG;
+
+ DBG("Light up screen by S_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_S, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_S, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ case 0x6B:
+ _gGestureWakeupValue = GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG;
+
+ DBG("Light up screen by Z_CHARACTER gesture wakeup.\n");
+
+// input_report_key(g_InputDevice, KEY_Z, 1);
+ input_report_key(g_InputDevice, KEY_POWER, 1);
+ input_sync(g_InputDevice);
+// input_report_key(g_InputDevice, KEY_Z, 0);
+ input_report_key(g_InputDevice, KEY_POWER, 0);
+ input_sync(g_InputDevice);
+ break;
+ default:
+ _gGestureWakeupValue = 0;
+ break;
+ }
+
+ DBG("_gGestureWakeupValue = 0x%x\n", _gGestureWakeupValue);
+ }
+ else
+ {
+ DBG("gesture wakeup packet format is incorrect.\n");
+ }
+
+ return -1;
+ }
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+ DBG("received raw data from touch panel as following:\n");
+ DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x \n pPacket[5]=%x pPacket[6]=%x pPacket[7]=%x \n", \
+ pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5], pPacket[6], pPacket[7]);
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ if ((pPacket[nCheckSumIndex] == nCheckSum) && (pPacket[0] == 0x52)) // check the checksum of packet
+#else
+ if ((pPacket[nLength-1] == nCheckSum) && (pPacket[0] == 0x52)) // check the checksum of packet
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ {
+ nX = (((pPacket[1] & 0xF0) << 4) | pPacket[2]); // parse the packet to coordinate
+ nY = (((pPacket[1] & 0x0F) << 8) | pPacket[3]);
+
+ nDeltaX = (((pPacket[4] & 0xF0) << 4) | pPacket[5]);
+ nDeltaY = (((pPacket[4] & 0x0F) << 8) | pPacket[6]);
+
+ DBG("[x,y]=[%d,%d]\n", nX, nY);
+ DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY);
+
+#ifdef CONFIG_SWAP_X_Y
+ nTempY = nX;
+ nTempX = nY;
+ nX = nTempX;
+ nY = nTempY;
+
+ nTempY = nDeltaX;
+ nTempX = nDeltaY;
+ nDeltaX = nTempX;
+ nDeltaY = nTempY;
+#endif
+
+#ifdef CONFIG_REVERSE_X
+ nX = 2047 - nX;
+ nDeltaX = 4095 - nDeltaX;
+#endif
+
+#ifdef CONFIG_REVERSE_Y
+ nY = 2047 - nY;
+ nDeltaY = 4095 - nDeltaY;
+#endif
+
+ /*
+ * pPacket[0]:id, pPacket[1]~pPacket[3]:the first point abs, pPacket[4]~pPacket[6]:the relative distance between the first point abs and the second point abs
+ * when pPacket[1]~pPacket[4], pPacket[6] is 0xFF, keyevent, pPacket[5] to judge which key press.
+ * pPacket[1]~pPacket[6] all are 0xFF, release touch
+ */
+ if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[6] == 0xFF))
+ {
+ pInfo->tPoint[0].nX = 0; // final X coordinate
+ pInfo->tPoint[0].nY = 0; // final Y coordinate
+
+ if ((pPacket[5] != 0x00) && (pPacket[5] != 0xFF)) /* pPacket[5] is key value */
+ { /* 0x00 is key up, 0xff is touch screen up */
+ DBG("touch key down pPacket[5]=%d\n", pPacket[5]);
+ pInfo->nFingerNum = 1;
+ pInfo->nTouchKeyCode = pPacket[5];
+ pInfo->nTouchKeyMode = 1;
+
+#if 1
+ pInfo->nFingerNum = 1;
+ pInfo->nTouchKeyCode = 0;
+ pInfo->nTouchKeyMode = 0;
+
+ if (pPacket[5] == 1) // TOUCH_KEY_MENU
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1];
+ }
+ else if (pPacket[5] == 2) // TOUCH_KEY_BACK
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1];
+ }
+ else if (pPacket[5] == 4) // TOUCH_KEY_HOME
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1];
+ }
+ else
+ {
+ DBG("multi-key is pressed.\n");
+ return -1;
+ }
+#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE
+ }
+ else
+ { /* key up or touch up */
+ DBG("touch end\n");
+ pInfo->nFingerNum = 0; //touch end
+ pInfo->nTouchKeyCode = 0;
+ pInfo->nTouchKeyMode = 0;
+ }
+ }
+ else
+ {
+ pInfo->nTouchKeyMode = 0; //Touch on screen...
+
+// if ((nDeltaX == 0) && (nDeltaY == 0))
+ if(
+#ifdef CONFIG_REVERSE_X
+ (nDeltaX == 4095)
+#else
+ (nDeltaX == 0)
+#endif
+ &&
+#ifdef CONFIG_REVERSE_Y
+ (nDeltaY == 4095)
+#else
+ (nDeltaY == 0)
+#endif
+ )
+ { /* one touch point */
+ pInfo->nFingerNum = 1; // one touch
+ pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY);
+ DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY);
+ }
+ else
+ { /* two touch points */
+ u32 nX2, nY2;
+
+ pInfo->nFingerNum = 2; // two touch
+ /* Finger 1 */
+ pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY);
+ /* Finger 2 */
+ if (nDeltaX > 2048) // transform the unsigned value to signed value
+ {
+ nDeltaX -= 4096;
+ }
+
+ if (nDeltaY > 2048)
+ {
+ nDeltaY -= 4096;
+ }
+
+ nX2 = (u32)(nX + nDeltaX);
+ nY2 = (u32)(nY + nDeltaY);
+
+ pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY);
+ }
+ }
+ }
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ else if (pPacket[nCheckSumIndex] == nCheckSum && pPacket[0] == 0x62)
+ {
+ nX = ((pPacket[1] << 8) | pPacket[2]); // Position_X
+ nY = ((pPacket[3] << 8) | pPacket[4]); // Position_Y
+
+ nDeltaX = ((pPacket[13] << 8) | pPacket[14]); // Distance_X
+ nDeltaY = ((pPacket[15] << 8) | pPacket[16]); // Distance_Y
+
+ DBG("[x,y]=[%d,%d]\n", nX, nY);
+ DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY);
+
+#ifdef CONFIG_SWAP_X_Y
+ nTempY = nX;
+ nTempX = nY;
+ nX = nTempX;
+ nY = nTempY;
+
+ nTempY = nDeltaX;
+ nTempX = nDeltaY;
+ nDeltaX = nTempX;
+ nDeltaY = nTempY;
+#endif
+
+#ifdef CONFIG_REVERSE_X
+ nX = 2047 - nX;
+ nDeltaX = 4095 - nDeltaX;
+#endif
+
+#ifdef CONFIG_REVERSE_Y
+ nY = 2047 - nY;
+ nDeltaY = 4095 - nDeltaY;
+#endif
+
+ /*
+ * pPacket[0]:id, pPacket[1]~pPacket[4]:the first point abs, pPacket[13]~pPacket[16]:the relative distance between the first point abs and the second point abs
+ * when pPacket[1]~pPacket[7] is 0xFF, keyevent, pPacket[8] to judge which key press.
+ * pPacket[1]~pPacket[8] all are 0xFF, release touch
+ */
+ if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[5] == 0xFF) && (pPacket[6] == 0xFF) && (pPacket[7] == 0xFF))
+ {
+ pInfo->tPoint[0].nX = 0; // final X coordinate
+ pInfo->tPoint[0].nY = 0; // final Y coordinate
+
+ if ((pPacket[8] != 0x00) && (pPacket[8] != 0xFF)) /* pPacket[8] is key value */
+ { /* 0x00 is key up, 0xff is touch screen up */
+ DBG("touch key down pPacket[8]=%d\n", pPacket[8]);
+ pInfo->nFingerNum = 1;
+ pInfo->nTouchKeyCode = pPacket[8];
+ pInfo->nTouchKeyMode = 1;
+
+#if 1
+ pInfo->nFingerNum = 1;
+ pInfo->nTouchKeyCode = 0;
+ pInfo->nTouchKeyMode = 0;
+
+ if (pPacket[8] == 1) // TOUCH_KEY_MENU
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1];
+ }
+ else if (pPacket[8] == 2) // TOUCH_KEY_BACK
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1];
+ }
+ else if (pPacket[8] == 4) // TOUCH_KEY_HOME
+ {
+ pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0];
+ pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1];
+ }
+ else
+ {
+ DBG("multi-key is pressed.\n");
+ return -1;
+ }
+#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE
+ }
+ else
+ { /* key up or touch up */
+ DBG("touch end\n");
+ pInfo->nFingerNum = 0; //touch end
+ pInfo->nTouchKeyCode = 0;
+ pInfo->nTouchKeyMode = 0;
+ }
+ }
+ else
+ {
+ pInfo->nTouchKeyMode = 0; //Touch on screen...
+
+// if ((nDeltaX == 0) && (nDeltaY == 0))
+ if (
+#ifdef CONFIG_REVERSE_X
+ (nDeltaX == 4095)
+#else
+ (nDeltaX == 0)
+#endif
+ &&
+#ifdef CONFIG_REVERSE_Y
+ (nDeltaY == 4095)
+#else
+ (nDeltaY == 0)
+#endif
+ )
+ { /* one touch point */
+ pInfo->nFingerNum = 1; // one touch
+ pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY);
+ DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY);
+ }
+ else
+ { /* two touch points */
+ u32 nX2, nY2;
+
+ pInfo->nFingerNum = 2; // two touch
+ /* Finger 1 */
+ pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY);
+ /* Finger 2 */
+ if (nDeltaX > 2048) // transform the unsigned value to signed value
+ {
+ nDeltaX -= 4096;
+ }
+
+ if (nDeltaY > 2048)
+ {
+ nDeltaY -= 4096;
+ }
+
+ nX2 = (u32)(nX + nDeltaX);
+ nY2 = (u32)(nY + nDeltaY);
+
+ pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH;
+ pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT;
+ DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY);
+ }
+
+ // Notify android application to retrieve log data mode packet from device driver by sysfs.
+ if (g_TouchKObj != NULL)
+ {
+ char *pEnvp[2];
+ s32 nRetVal = 0;
+
+ pEnvp[0] = "STATUS=GET_PACKET";
+ pEnvp[1] = NULL;
+
+ nRetVal = kobject_uevent_env(g_TouchKObj, KOBJ_CHANGE, pEnvp);
+ DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal);
+ }
+ }
+ }
+ else
+ {
+ if (pPacket[nCheckSumIndex] != nCheckSum)
+ {
+ DBG("WRONG CHECKSUM\n");
+ return -1;
+ }
+
+ if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE && pPacket[0] != 0x52)
+ {
+ DBG("WRONG DEMO MODE HEADER\n");
+ return -1;
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && pPacket[0] != 0x62)
+ {
+ DBG("WRONG DEBUG MODE HEADER\n");
+ return -1;
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && pPacket[0] != 0x62)
+ {
+ DBG("WRONG RAW DATA MODE HEADER\n");
+ return -1;
+ }
+ }
+#else
+ else
+ {
+ DBG("pPacket[0]=0x%x, pPacket[7]=0x%x, nCheckSum=0x%x\n", pPacket[0], pPacket[7], nCheckSum);
+
+ if (pPacket[nLength-1] != nCheckSum)
+ {
+ DBG("WRONG CHECKSUM\n");
+ return -1;
+ }
+
+ if (pPacket[0] != 0x52)
+ {
+ DBG("WRONG DEMO MODE HEADER\n");
+ return -1;
+ }
+ }
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+static void _DrvFwCtrlStoreFirmwareData(u8 *pBuf, u32 nSize)
+{
+ u32 nCount = nSize / 1024;
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (nCount > 0) // nSize >= 1024
+ {
+ for (i = 0; i < nCount; i ++)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024);
+
+ g_FwDataCount ++;
+ }
+ }
+ else // nSize < 1024
+ {
+ if (nSize > 0)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf, nSize);
+
+ g_FwDataCount ++;
+ }
+ }
+
+ DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount);
+
+ if (pBuf != NULL)
+ {
+ DBG("*** buf[0] = %c ***\n", pBuf[0]);
+ }
+}
+
+//-------------------------Start of SW ID for MSG22XX----------------------------//
+
+static u32 _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EmemType_e eEmemType) // For MSG22XX
+{
+ u32 nRetVal = 0;
+ u16 nRegData1 = 0, nRegData2 = 0;
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from main block
+ {
+ RegSet16BitValue(0x1600, 0xBFFC); // Set start address for main block CRC
+ }
+ else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from info block
+ {
+ RegSet16BitValue(0x1600, 0xC1FC); // Set start address for info block CRC
+ }
+
+ // Enable burst mode
+ RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+ nRegData2 = RegGet16BitValue(0x1606);
+
+ nRetVal = ((nRegData2 >> 8) & 0xFF) << 24;
+ nRetVal |= (nRegData2 & 0xFF) << 16;
+ nRetVal |= ((nRegData1 >> 8) & 0xFF) << 8;
+ nRetVal |= (nRegData1 & 0xFF);
+
+ DBG("CRC = 0x%x\n", nRetVal);
+
+ // Clear burst mode
+ RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ return nRetVal;
+}
+
+static u32 _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(u8 szTmpBuf[], EmemType_e eEmemType) // For MSG22XX
+{
+ u32 nRetVal = 0;
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ if (szTmpBuf != NULL)
+ {
+ if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from bin file
+ {
+ nRetVal = szTmpBuf[0xBFFF] << 24;
+ nRetVal |= szTmpBuf[0xBFFE] << 16;
+ nRetVal |= szTmpBuf[0xBFFD] << 8;
+ nRetVal |= szTmpBuf[0xBFFC];
+ }
+ else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from bin file
+ {
+ nRetVal = szTmpBuf[0xC1FF] << 24;
+ nRetVal |= szTmpBuf[0xC1FE] << 16;
+ nRetVal |= szTmpBuf[0xC1FD] << 8;
+ nRetVal |= szTmpBuf[0xC1FC];
+ }
+ }
+
+ return nRetVal;
+}
+
+static u16 _DrvFwCtrlMsg22xxGetSwId(EmemType_e eEmemType) // For MSG22XX
+{
+ u16 nRetVal = 0;
+ u16 nRegData1 = 0;
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ if (eEmemType == EMEM_MAIN) // Read SW ID from main block
+ {
+ RegSet16BitValue(0x1600, 0xBFF4); // Set start address for main block SW ID
+ }
+ else if (eEmemType == EMEM_INFO) // Read SW ID from info block
+ {
+ RegSet16BitValue(0x1600, 0xC1EC); // Set start address for info block SW ID
+ }
+
+ /*
+ Ex. SW ID in Main Block :
+ Major low byte at address 0xBFF4
+ Major high byte at address 0xBFF5
+
+ SW ID in Info Block :
+ Major low byte at address 0xC1EC
+ Major high byte at address 0xC1ED
+ */
+
+ // Enable burst mode
+// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+// nRegData2 = RegGet16BitValue(0x1606);
+
+ nRetVal = ((nRegData1 >> 8) & 0xFF) << 8;
+ nRetVal |= (nRegData1 & 0xFF);
+
+ // Clear burst mode
+// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ DBG("SW ID = 0x%x\n", nRetVal);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ return nRetVal;
+}
+
+static s32 _DrvFwCtrlMsg22xxUpdateFirmwareBySwId(void) // For MSG22XX
+{
+ s32 nRetVal = -1;
+ u32 nCrcInfoA = 0, nCrcInfoB = 0, nCrcMainA = 0, nCrcMainB = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DBG("_gIsUpdateInfoBlockFirst = %d, _gIsUpdateFirmware = 0x%x\n", _gIsUpdateInfoBlockFirst, _gIsUpdateFirmware);
+
+ _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(g_FwData, _gOneDimenFwData);
+
+ if (_gIsUpdateInfoBlockFirst == 1)
+ {
+ if ((_gIsUpdateFirmware & 0x10) == 0x10)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO);
+
+ nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO);
+ nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO);
+
+ DBG("nCrcInfoA = 0x%x, nCrcInfoB = 0x%x\n", nCrcInfoA, nCrcInfoB);
+
+ if (nCrcInfoA == nCrcInfoB)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN);
+
+ nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN);
+ nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN);
+
+ DBG("nCrcMainA = 0x%x, nCrcMainB = 0x%x\n", nCrcMainA, nCrcMainB);
+
+ if (nCrcMainA == nCrcMainB)
+ {
+ _gIsUpdateFirmware = 0x00;
+ nRetVal = 0;
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x01;
+ }
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x11;
+ }
+ }
+ else if ((_gIsUpdateFirmware & 0x01) == 0x01)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN);
+
+ nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN);
+ nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN);
+
+ DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB);
+
+ if (nCrcMainA == nCrcMainB)
+ {
+ _gIsUpdateFirmware = 0x00;
+ nRetVal = 0;
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x01;
+ }
+ }
+ }
+ else //_gIsUpdateInfoBlockFirst == 0
+ {
+ if ((_gIsUpdateFirmware & 0x10) == 0x10)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN);
+
+ nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN);
+ nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN);
+
+ DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB);
+
+ if (nCrcMainA == nCrcMainB)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO);
+
+ nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO);
+ nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO);
+
+ DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB);
+
+ if (nCrcInfoA == nCrcInfoB)
+ {
+ _gIsUpdateFirmware = 0x00;
+ nRetVal = 0;
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x01;
+ }
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x11;
+ }
+ }
+ else if ((_gIsUpdateFirmware & 0x01) == 0x01)
+ {
+ _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO);
+ _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO);
+
+ nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO);
+ nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO);
+
+ DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB);
+
+ if (nCrcInfoA == nCrcInfoB)
+ {
+ _gIsUpdateFirmware = 0x00;
+ nRetVal = 0;
+ }
+ else
+ {
+ _gIsUpdateFirmware = 0x01;
+ }
+ }
+ }
+
+ return nRetVal;
+}
+
+void _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId(void) // For MSG22XX
+{
+ u32 nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB;
+ u32 i;
+ u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0;
+ u16 nMajor = 0, nMinor = 0;
+ u8 *pVersion = NULL;
+ Msg22xxSwId_e eSwId = MSG22XX_SW_ID_UNDEFINED;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrDisableFingerTouchReport();
+
+ DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion);
+
+ nCrcMainA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN);
+ nCrcMainB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_MAIN);
+
+ nCrcInfoA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO);
+ nCrcInfoB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_INFO);
+
+ _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id");
+ INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork);
+
+ DBG("nCrcMainA=0x%x, nCrcInfoA=0x%x, nCrcMainB=0x%x, nCrcInfoB=0x%x\n", nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB);
+
+ if (nCrcMainA == nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 1. Main Block:OK, Info Block:OK
+ {
+ eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN);
+
+ if (eSwId == MSG22XX_SW_ID_XXXX)
+ {
+ nUpdateBinMajor = msg2xxx_xxxx_update_bin[0xBFF5]<<8 | msg2xxx_xxxx_update_bin[0xBFF4];
+ nUpdateBinMinor = msg2xxx_xxxx_update_bin[0xBFF7]<<8 | msg2xxx_xxxx_update_bin[0xBFF6];
+ }
+ else if (eSwId == MSG22XX_SW_ID_YYYY)
+ {
+ nUpdateBinMajor = msg2xxx_yyyy_update_bin[0xBFF5]<<8 | msg2xxx_yyyy_update_bin[0xBFF4];
+ nUpdateBinMinor = msg2xxx_yyyy_update_bin[0xBFF7]<<8 | msg2xxx_yyyy_update_bin[0xBFF6];
+ }
+ else //eSwId == MSG22XX_SW_ID_UNDEFINED
+ {
+ DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId);
+
+ eSwId = MSG22XX_SW_ID_UNDEFINED;
+ nUpdateBinMajor = 0;
+ nUpdateBinMinor = 0;
+ }
+
+ DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor);
+
+ if (nUpdateBinMinor > nMinor)
+ {
+ if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF)
+ {
+ if (eSwId == MSG22XX_SW_ID_XXXX)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512);
+ }
+ }
+ }
+ else if (eSwId == MSG22XX_SW_ID_YYYY)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512);
+ }
+ }
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer
+
+ _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+ _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete
+ _gIsUpdateFirmware = 0x11;
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ return;
+ }
+ else
+ {
+ DBG("The sw id is invalid.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else
+ {
+ DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else if (nCrcMainA == nCrcMainB && nCrcInfoA != nCrcInfoB) // Case 2. Main Block:OK, Info Block:FAIL
+ {
+ eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN);
+
+ DBG("eSwId=0x%x\n", eSwId);
+
+ if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF)
+ {
+ if (eSwId == MSG22XX_SW_ID_XXXX)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512);
+ }
+ }
+ }
+ else if (eSwId == MSG22XX_SW_ID_YYYY)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512);
+ }
+ }
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer
+
+ _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+ _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete
+ _gIsUpdateFirmware = 0x11;
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ return;
+ }
+ else
+ {
+ DBG("The sw id is invalid.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else if (nCrcMainA != nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 3. Main Block:FAIL, Info Block:OK
+ {
+ eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_INFO);
+
+ DBG("eSwId=0x%x\n", eSwId);
+
+ if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF)
+ {
+ if (eSwId == MSG22XX_SW_ID_XXXX)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512);
+ }
+ }
+ }
+ else if (eSwId == MSG22XX_SW_ID_YYYY)
+ {
+ for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++)
+ {
+ if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024);
+ }
+ else // i == 48
+ {
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512);
+ }
+ }
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer
+
+ _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+ _gIsUpdateInfoBlockFirst = 0; // Set 0 for indicating main block is broken
+ _gIsUpdateFirmware = 0x11;
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ return;
+ }
+ else
+ {
+ DBG("The sw id is invalid.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else // Case 4. Main Block:FAIL, Info Block:FAIL
+ {
+ DBG("Main block and Info block are broken.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DrvPlatformLyrEnableFingerTouchReport();
+}
+
+//-------------------------End of SW ID for MSG22XX----------------------------//
+
+//-------------------------Start of SW ID for MSG21XXA----------------------------//
+
+static u32 _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash(void) // For MSG21XXA
+{
+ u32 nRetVal = 0;
+ u16 nRegData = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(20);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073
+
+ // Stop Watchdog
+ RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030
+
+ // cmd
+ RegSet16BitValue(0x3CE4, 0xDF4C); //bank:reg_PIU_MISC_0, addr:h0072
+
+ // TP SW reset
+ RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002
+ RegSet16BitValue(0x1E04, 0x829F);
+
+ // Start mcu
+ RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073
+
+ mdelay(20);
+
+ // Polling 0x3CE4 is 0x9432
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072
+ } while (nRegData != 0x9432);
+
+ // Read calculated main block CRC from register
+ nRetVal = RegGet16BitValue(0x3C80);
+ nRetVal = (nRetVal << 16) | RegGet16BitValue(0x3C82);
+
+ DBG("Main Block CRC = 0x%x\n", nRetVal);
+
+ return nRetVal;
+}
+
+static u32 _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock(void) // For MSG21XXA
+{
+ u32 nRetVal = 0;
+ u16 nRegData = 0;
+ u8 szDbBusTxData[5] = {0};
+ u8 szDbBusRxData[4] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(20);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030
+
+ // cmd
+ RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072
+
+ // TP SW reset
+ RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002
+ RegSet16BitValue(0x1E04, 0x829F);
+
+ // Start mcu
+ RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073
+
+ mdelay(20);
+
+ // Polling 0x3CE4 is 0x5B58
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072
+ } while (nRegData != 0x5B58);
+
+ // Read main block CRC from main block
+ szDbBusTxData[0] = 0x72;
+ szDbBusTxData[1] = 0x7F;
+ szDbBusTxData[2] = 0xFC;
+ szDbBusTxData[3] = 0x00;
+ szDbBusTxData[4] = 0x04;
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5);
+ IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4);
+
+ nRetVal = szDbBusRxData[0];
+ nRetVal = (nRetVal << 8) | szDbBusRxData[1];
+ nRetVal = (nRetVal << 8) | szDbBusRxData[2];
+ nRetVal = (nRetVal << 8) | szDbBusRxData[3];
+
+ DBG("CRC = 0x%x\n", nRetVal);
+
+ return nRetVal;
+}
+
+static u16 _DrvFwCtrlMsg21xxaGetSwId(EmemType_e eEmemType) // For MSG21XXA
+{
+ u16 nRetVal = 0;
+ u16 nRegData = 0;
+ u8 szDbBusTxData[5] = {0};
+ u8 szDbBusRxData[4] = {0};
+
+ DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(20);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030
+
+ // cmd
+ RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072
+
+ // TP SW reset
+ RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002
+ RegSet16BitValue(0x1E04, 0x829F);
+
+ // Start mcu
+ RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073
+
+ mdelay(20);
+
+ // Polling 0x3CE4 is 0x5B58
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072
+ } while (nRegData != 0x5B58);
+
+ szDbBusTxData[0] = 0x72;
+ if (eEmemType == EMEM_MAIN) // Read SW ID from main block
+ {
+ szDbBusTxData[1] = 0x7F;
+ szDbBusTxData[2] = 0x55;
+ }
+ else if (eEmemType == EMEM_INFO) // Read SW ID from info block
+ {
+ szDbBusTxData[1] = 0x83;
+ szDbBusTxData[2] = 0x00;
+ }
+ szDbBusTxData[3] = 0x00;
+ szDbBusTxData[4] = 0x04;
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5);
+ IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4);
+
+ DBG("szDbBusRxData[0,1,2,3] = 0x%x,0x%x,0x%x,0x%x\n", szDbBusRxData[0], szDbBusRxData[1], szDbBusRxData[2], szDbBusRxData[3]);
+
+ if ((szDbBusRxData[0] >= 0x30 && szDbBusRxData[0] <= 0x39)
+ &&(szDbBusRxData[1] >= 0x30 && szDbBusRxData[1] <= 0x39)
+ &&(szDbBusRxData[2] >= 0x31 && szDbBusRxData[2] <= 0x39))
+ {
+ nRetVal = (szDbBusRxData[0]-0x30)*100+(szDbBusRxData[1]-0x30)*10+(szDbBusRxData[2]-0x30);
+ }
+
+ DBG("SW ID = 0x%x\n", nRetVal);
+
+ return nRetVal;
+}
+
+static s32 _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(u8 szFwData[][1024], EmemType_e eEmemType) // For MSG21XXA
+{
+ u32 i, j, nCalculateCrcSize;
+ u32 nCrcMain = 0, nCrcMainTp = 0;
+ u32 nCrcInfo = 0, nCrcInfoTp = 0;
+ u32 nCrcTemp = 0;
+ u16 nRegData = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nCrcMain = 0xffffffff;
+ nCrcInfo = 0xffffffff;
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ // erase main
+ _DrvFwCtrlEraseEmemC33(EMEM_MAIN);
+ mdelay(1000);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ /////////////////////////
+ // Program
+ /////////////////////////
+
+ // Polling 0x3CE4 is 0x1C70
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x1C70);
+ }
+
+ switch (eEmemType)
+ {
+ case EMEM_ALL:
+ RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks
+ break;
+ case EMEM_MAIN:
+ RegSet16BitValue(0x3CE4, 0x7731); // for main block
+ break;
+ case EMEM_INFO:
+ RegSet16BitValue(0x3CE4, 0x7731); // for info block
+
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ RegSetLByteValue(0x3CE4, 0xC5);
+ RegSetLByteValue(0x3CE5, 0x78);
+
+ RegSetLByteValue(0x1E04, 0x9F);
+ RegSetLByteValue(0x1E05, 0x82);
+
+ RegSetLByteValue(0x0FE6, 0x00);
+ mdelay(100);
+ break;
+ }
+
+ // Polling 0x3CE4 is 0x2F43
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x2F43);
+
+ // Calculate CRC 32
+ DrvCommonCrcInitTable();
+
+ if (eEmemType == EMEM_ALL)
+ {
+ nCalculateCrcSize = MSG21XXA_FIRMWARE_WHOLE_SIZE;
+ }
+ else if (eEmemType == EMEM_MAIN)
+ {
+ nCalculateCrcSize = MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE;
+ }
+ else if (eEmemType == EMEM_INFO)
+ {
+ nCalculateCrcSize = MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE;
+ }
+ else
+ {
+ nCalculateCrcSize = 0;
+ }
+
+ for (i = 0; i < nCalculateCrcSize; i ++)
+ {
+ if (eEmemType == EMEM_INFO)
+ {
+ i = 32;
+ }
+
+ if (i < 32) // emem_main
+ {
+ if (i == 31)
+ {
+ szFwData[i][1014] = 0x5A;
+ szFwData[i][1015] = 0xA5;
+
+ for (j = 0; j < 1016; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+
+ nCrcTemp = nCrcMain;
+ nCrcTemp = nCrcTemp ^ 0xffffffff;
+
+ DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug
+
+ for (j = 0; j < 4; j ++)
+ {
+ szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF);
+
+ DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug
+ DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]);
+ }
+ }
+ else
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+ }
+ }
+ else // emem_info
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo);
+ }
+
+ if (eEmemType == EMEM_MAIN)
+ {
+ break;
+ }
+ }
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ for (j = 0; j < 8; j ++)
+ {
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024);
+#endif
+
+ // Polling 0x3CE4 is 0xD0BC
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0xD0BC);
+
+ RegSet16BitValue(0x3CE4, 0x2F43);
+ }
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // write file done and check crc
+ RegSet16BitValue(0x3CE4, 0x1380);
+ }
+ mdelay(10);
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // Polling 0x3CE4 is 0x9432
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x9432);
+ }
+
+ nCrcMain = nCrcMain ^ 0xffffffff;
+ nCrcInfo = nCrcInfo ^ 0xffffffff;
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // CRC Main from TP
+ nCrcMainTp = RegGet16BitValue(0x3C80);
+ nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82);
+ }
+
+ if (eEmemType == EMEM_ALL)
+ {
+ // CRC Info from TP
+ nCrcInfoTp = RegGet16BitValue(0x3CA0);
+ nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2);
+ }
+
+ DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp);
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ if (nCrcMainTp != nCrcMain)
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+
+ if (eEmemType == EMEM_ALL)
+ {
+ if (nCrcInfoTp != nCrcInfo)
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+
+ DBG("Update SUCCESS\n");
+
+ return 0;
+}
+
+void _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId(void) // For MSG21XXA
+{
+ u32 nCrcMainA, nCrcMainB;
+ u32 i;
+ u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0;
+ u16 nMajor = 0, nMinor = 0;
+ u8 nIsCompareVersion = 0;
+ u8 *pVersion = NULL;
+ Msg21xxaSwId_e eMainSwId = MSG21XXA_SW_ID_UNDEFINED, eInfoSwId = MSG21XXA_SW_ID_UNDEFINED, eSwId = MSG21XXA_SW_ID_UNDEFINED;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvPlatformLyrDisableFingerTouchReport();
+ msleep(100);
+ DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion);
+
+ nCrcMainA = _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash();
+ nCrcMainB = _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock();
+
+ _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id");
+ INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork);
+
+ DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB);
+
+ if (nCrcMainA == nCrcMainB)
+ {
+ eMainSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_MAIN);
+ eInfoSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO);
+
+ DBG("Check firmware integrity success\n");
+ DBG("eMainSwId=0x%x, eInfoSwId=0x%x\n", eMainSwId, eInfoSwId);
+
+ if (eMainSwId == eInfoSwId)
+ {
+ eSwId = eMainSwId;
+ nIsCompareVersion = 1;
+ }
+ else
+ {
+ eSwId = eInfoSwId;
+ nIsCompareVersion = 0;
+ }
+
+ if (eSwId == MSG21XXA_SW_ID_XXXX)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ nUpdateBinMajor = msg2xxx_xxxx_update_bin[31][0x34F]<<8 | msg2xxx_xxxx_update_bin[31][0x34E];
+ nUpdateBinMinor = msg2xxx_xxxx_update_bin[31][0x351]<<8 | msg2xxx_xxxx_update_bin[31][0x350];
+#else // By one dimensional array
+ nUpdateBinMajor = msg2xxx_xxxx_update_bin[0x7F4F]<<8 | msg2xxx_xxxx_update_bin[0x7F4E];
+ nUpdateBinMinor = msg2xxx_xxxx_update_bin[0x7F51]<<8 | msg2xxx_xxxx_update_bin[0x7F50];
+#endif
+ }
+ else if (eSwId == MSG21XXA_SW_ID_YYYY)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ nUpdateBinMajor = msg2xxx_yyyy_update_bin[31][0x34F]<<8 | msg2xxx_yyyy_update_bin[31][0x34E];
+ nUpdateBinMinor = msg2xxx_yyyy_update_bin[31][0x351]<<8 | msg2xxx_yyyy_update_bin[31][0x350];
+#else // By one dimensional array
+ nUpdateBinMajor = msg2xxx_yyyy_update_bin[0x7F4F]<<8 | msg2xxx_yyyy_update_bin[0x7F4E];
+ nUpdateBinMinor = msg2xxx_yyyy_update_bin[0x7F51]<<8 | msg2xxx_yyyy_update_bin[0x7F50];
+#endif
+ }
+ else //eSwId == MSG21XXA_SW_ID_UNDEFINED
+ {
+ DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId);
+
+ eSwId = MSG21XXA_SW_ID_UNDEFINED;
+ nUpdateBinMajor = 0;
+ nUpdateBinMinor = 0;
+ }
+
+ DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor);
+
+ if ((nUpdateBinMinor > nMinor && nIsCompareVersion == 1) || (nIsCompareVersion == 0))
+ {
+ if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF)
+ {
+ if (eSwId == MSG21XXA_SW_ID_XXXX)
+ {
+ for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ _DrvFwCtrlStoreFirmwareData(msg2xxx_xxxx_update_bin[i], 1024);
+#else // By one dimensional array
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024);
+#endif
+ }
+ }
+ else if (eSwId == MSG21XXA_SW_ID_YYYY)
+ {
+ for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ _DrvFwCtrlStoreFirmwareData(msg2xxx_yyyy_update_bin[i], 1024);
+#else // By one dimensional array
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024);
+#endif
+ }
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer
+
+ _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ return;
+ }
+ else
+ {
+ DBG("The sw id is invalid.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else
+ {
+ DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+ else
+ {
+ eSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO);
+
+ DBG("Check firmware integrity failed\n");
+ DBG("eSwId=0x%x\n", eSwId);
+
+ if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF)
+ {
+ if (eSwId == MSG21XXA_SW_ID_XXXX)
+ {
+ for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ _DrvFwCtrlStoreFirmwareData(msg2xxx_xxxx_update_bin[i], 1024);
+#else // By one dimensional array
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024);
+#endif
+ }
+ }
+ else if (eSwId == MSG21XXA_SW_ID_YYYY)
+ {
+ for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array
+ _DrvFwCtrlStoreFirmwareData(msg2xxx_yyyy_update_bin[i], 1024);
+#else // By one dimensional array
+ _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024);
+#endif
+ }
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer
+
+ _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT;
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ return;
+ }
+ else
+ {
+ DBG("The sw id is invalid.\n");
+ DBG("Go to normal boot up process.\n");
+ }
+ }
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DrvPlatformLyrEnableFingerTouchReport();
+}
+
+//-------------------------End of SW ID for MSG21XXA----------------------------//
+
+static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork)
+{
+ s32 nRetVal = 0;
+
+ DBG("*** %s() _gUpdateRetryCount = %d ***\n", __func__, _gUpdateRetryCount);
+
+ if (g_ChipType == CHIP_TYPE_MSG21XXA)
+ {
+ nRetVal = _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(g_FwData, EMEM_MAIN);
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ nRetVal = _DrvFwCtrlMsg22xxUpdateFirmwareBySwId();
+ }
+ else
+ {
+ DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ nRetVal = -1;
+ return;
+ }
+
+ DBG("*** update firmware by sw id result = %d ***\n", nRetVal);
+
+ if (nRetVal == 0)
+ {
+ DBG("update firmware by sw id success\n");
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ _gIsUpdateInfoBlockFirst = 0;
+ _gIsUpdateFirmware = 0x00;
+ }
+ }
+ else //nRetVal == -1
+ {
+ _gUpdateRetryCount --;
+ if (_gUpdateRetryCount > 0)
+ {
+ DBG("_gUpdateRetryCount = %d\n", _gUpdateRetryCount);
+ queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork);
+ }
+ else
+ {
+ DBG("update firmware by sw id failed\n");
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ _gIsUpdateInfoBlockFirst = 0;
+ _gIsUpdateFirmware = 0x00;
+ }
+ }
+ }
+}
+
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+//------------------------------------------------------------------------------//
+
+static void _DrvFwCtrlReadInfoC33(void)
+{
+ u8 szDbBusTxData[5] = {0};
+ u16 nRegData = 0;
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ u32 i;
+#endif
+
+ DBG("*** %s() ***\n", __func__);
+
+ mdelay(300);
+
+ // Stop Watchdog
+ RegSetLByteValue(0x3C60, 0x55);
+ RegSetLByteValue(0x3C61, 0xAA);
+
+ RegSet16BitValue(0x3CE4, 0xA4AB);
+
+ RegSet16BitValue(0x1E04, 0x7d60);
+
+ // TP SW reset
+ RegSet16BitValue(0x1E04, 0x829F);
+ mdelay(1);
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x0F;
+ szDbBusTxData[2] = 0xE6;
+ szDbBusTxData[3] = 0x00;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 4);
+ mdelay(100);
+
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x5B58);
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ szDbBusTxData[0] = 0x72;
+ szDbBusTxData[3] = 0x00;
+ szDbBusTxData[4] = 0x80; // read 128 bytes
+
+ for (i = 0; i < 8; i ++)
+ {
+ szDbBusTxData[1] = 0x80 + (((i*128)&0xff00)>>8);
+ szDbBusTxData[2] = (i*128)&0x00ff;
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5);
+
+ mdelay(50);
+
+ // Receive info data
+ IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[i*128], 128);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ szDbBusTxData[0] = 0x72;
+ szDbBusTxData[1] = 0x80;
+ szDbBusTxData[2] = 0x00;
+ szDbBusTxData[3] = 0x04; // read 1024 bytes
+ szDbBusTxData[4] = 0x00;
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, szDbBusTxData, 5);
+
+ mdelay(50);
+
+ // Receive info data
+ IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024);
+#endif
+}
+
+static s32 _DrvFwCtrlUpdateFirmwareC32(u8 szFwData[][1024], EmemType_e eEmemType)
+{
+ u32 i, j;
+ u32 nCrcMain, nCrcMainTp;
+ u32 nCrcInfo, nCrcInfoTp;
+ u32 nCrcTemp;
+ u16 nRegData = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nCrcMain = 0xffffffff;
+ nCrcInfo = 0xffffffff;
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ /////////////////////////
+ // Erase all
+ /////////////////////////
+ _DrvFwCtrlEraseEmemC32();
+ mdelay(1000);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ // Reset watch dog
+ RegSetLByteValue(0x3C60, 0x55);
+ RegSetLByteValue(0x3C61, 0xAA);
+
+ /////////////////////////
+ // Program
+ /////////////////////////
+
+ // Polling 0x3CE4 is 0x1C70
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x1C70);
+
+ RegSet16BitValue(0x3CE4, 0xE38F); // for all-blocks
+
+ // Polling 0x3CE4 is 0x2F43
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x2F43);
+
+ // Calculate CRC 32
+ DrvCommonCrcInitTable();
+
+ for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W
+ {
+ if (i < 32) // emem_main
+ {
+ if (i == 31)
+ {
+ szFwData[i][1014] = 0x5A;
+ szFwData[i][1015] = 0xA5;
+
+ for (j = 0; j < 1016; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+
+ nCrcTemp = nCrcMain;
+ nCrcTemp = nCrcTemp ^ 0xffffffff;
+
+ DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug
+
+ for (j = 0; j < 4; j ++)
+ {
+ szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF);
+
+ DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug
+ DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]);
+ }
+ }
+ else
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+ }
+ }
+ else // emem_info
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo);
+ }
+ }
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ for (j = 0; j < 8; j ++)
+ {
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024);
+#endif
+
+ // Polling 0x3CE4 is 0xD0BC
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0xD0BC);
+
+ RegSet16BitValue(0x3CE4, 0x2F43);
+ }
+
+ // Write file done
+ RegSet16BitValue(0x3CE4, 0x1380);
+
+ mdelay(10);
+ // Polling 0x3CE4 is 0x9432
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x9432);
+
+ nCrcMain = nCrcMain ^ 0xffffffff;
+ nCrcInfo = nCrcInfo ^ 0xffffffff;
+
+ // CRC Main from TP
+ nCrcMainTp = RegGet16BitValue(0x3C80);
+ nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82);
+
+ // CRC Info from TP
+ nCrcInfoTp = RegGet16BitValue(0x3CA0);
+ nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2);
+
+ DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n",
+ nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp);
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo))
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+
+ DBG("Update SUCCESS\n");
+
+ return 0;
+}
+
+static s32 _DrvFwCtrlUpdateFirmwareC33(u8 szFwData[][1024], EmemType_e eEmemType)
+{
+ u8 szLifeCounter[2];
+ u32 i, j;
+ u32 nCrcMain, nCrcMainTp;
+ u32 nCrcInfo, nCrcInfoTp;
+ u32 nCrcTemp;
+ u16 nRegData = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nCrcMain = 0xffffffff;
+ nCrcInfo = 0xffffffff;
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ _DrvFwCtrlReadInfoC33();
+
+ if (_gDwIicInfoData[0] == 'M' && _gDwIicInfoData[1] == 'S' && _gDwIicInfoData[2] == 'T' && _gDwIicInfoData[3] == 'A' && _gDwIicInfoData[4] == 'R' && _gDwIicInfoData[5] == 'T' && _gDwIicInfoData[6] == 'P' && _gDwIicInfoData[7] == 'C')
+ {
+ _gDwIicInfoData[8] = szFwData[32][8];
+ _gDwIicInfoData[9] = szFwData[32][9];
+ _gDwIicInfoData[10] = szFwData[32][10];
+ _gDwIicInfoData[11] = szFwData[32][11];
+ // updata life counter
+ szLifeCounter[1] = ((((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) >> 8) & 0xFF;
+ szLifeCounter[0] = (((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) & 0xFF;
+ _gDwIicInfoData[12] = szLifeCounter[0];
+ _gDwIicInfoData[13] = szLifeCounter[1];
+
+ RegSet16BitValue(0x3CE4, 0x78C5);
+ RegSet16BitValue(0x1E04, 0x7d60);
+ // TP SW reset
+ RegSet16BitValue(0x1E04, 0x829F);
+
+ mdelay(50);
+
+ // Polling 0x3CE4 is 0x2F43
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x2F43);
+
+ // Transmit lk info data
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ for (j = 0; j < 8; j ++)
+ {
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[j*128], 128);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024);
+#endif
+
+ // Polling 0x3CE4 is 0xD0BC
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0xD0BC);
+ }
+
+ // erase main
+ _DrvFwCtrlEraseEmemC33(EMEM_MAIN);
+ mdelay(1000);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ /////////////////////////
+ // Program
+ /////////////////////////
+
+ // Polling 0x3CE4 is 0x1C70
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x1C70);
+ }
+
+ switch (eEmemType)
+ {
+ case EMEM_ALL:
+ RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks
+ break;
+ case EMEM_MAIN:
+ RegSet16BitValue(0x3CE4, 0x7731); // for main block
+ break;
+ case EMEM_INFO:
+ RegSet16BitValue(0x3CE4, 0x7731); // for info block
+
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ RegSetLByteValue(0x3CE4, 0xC5);
+ RegSetLByteValue(0x3CE5, 0x78);
+
+ RegSetLByteValue(0x1E04, 0x9F);
+ RegSetLByteValue(0x1E05, 0x82);
+
+ RegSetLByteValue(0x0FE6, 0x00);
+ mdelay(100);
+ break;
+ }
+
+ // Polling 0x3CE4 is 0x2F43
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x2F43);
+
+ // Calculate CRC 32
+ DrvCommonCrcInitTable();
+
+ for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W
+ {
+ if (eEmemType == EMEM_INFO)
+ {
+ i = 32;
+ }
+
+ if (i < 32) // emem_main
+ {
+ if (i == 31)
+ {
+ szFwData[i][1014] = 0x5A;
+ szFwData[i][1015] = 0xA5;
+
+ for (j = 0; j < 1016; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+
+ nCrcTemp = nCrcMain;
+ nCrcTemp = nCrcTemp ^ 0xffffffff;
+
+ DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug
+
+ for (j = 0; j < 4; j ++)
+ {
+ szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF);
+
+ DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug
+ DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); // add for debug
+ }
+ }
+ else
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain);
+ }
+ }
+ }
+ else // emem_info
+ {
+ for (j = 0; j < 1024; j ++)
+ {
+ nCrcInfo = DrvCommonCrcGetValue(_gDwIicInfoData[j], nCrcInfo);
+ }
+
+ if (eEmemType == EMEM_MAIN)
+ {
+ break;
+ }
+ }
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ for (j = 0; j < 8; j ++)
+ {
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128);
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024);
+#endif
+
+ // Polling 0x3CE4 is 0xD0BC
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0xD0BC);
+
+ RegSet16BitValue(0x3CE4, 0x2F43);
+ }
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // write file done and check crc
+ RegSet16BitValue(0x3CE4, 0x1380);
+ }
+ mdelay(10);
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // Polling 0x3CE4 is 0x9432
+ do
+ {
+ nRegData = RegGet16BitValue(0x3CE4);
+ } while (nRegData != 0x9432);
+ }
+
+ nCrcMain = nCrcMain ^ 0xffffffff;
+ nCrcInfo = nCrcInfo ^ 0xffffffff;
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ // CRC Main from TP
+ nCrcMainTp = RegGet16BitValue(0x3C80);
+ nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82);
+
+ // CRC Info from TP
+ nCrcInfoTp = RegGet16BitValue(0x3CA0);
+ nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2);
+ }
+ DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp);
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN))
+ {
+ if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo))
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+
+ DBG("Update SUCCESS\n");
+
+ return 0;
+}
+
+static s32 _DrvFwCtrlMsg22xxUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType)
+{
+ u32 i, index;
+ u32 nCrcMain, nCrcMainTp;
+ u32 nCrcInfo, nCrcInfoTp;
+ u32 nRemainSize, nBlockSize, nSize;
+ u16 nRegData = 0;
+ u8 szDbBusTxData[1024] = {0};
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ u32 nSizePerWrite = 125;
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+ u32 nSizePerWrite = 1021;
+#endif
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(szFwData, _gOneDimenFwData);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+
+ DBG("Erase start\n");
+
+ // Stop mcu
+ RegSet16BitValue(0x0FE6, 0x0001);
+
+ // Disable watchdog
+ RegSetLByteValue(0x3C60, 0x55);
+ RegSetLByteValue(0x3C61, 0xAA);
+
+ // Set PROGRAM password
+ RegSetLByteValue(0x161A, 0xBA);
+ RegSetLByteValue(0x161B, 0xAB);
+
+ if (eEmemType == EMEM_ALL) // 48KB + 512Byte
+ {
+ DBG("Erase all block\n");
+
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(100);
+
+ // Chip erase
+ RegSet16BitValue(0x160E, BIT3);
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+ else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8)
+ {
+ DBG("Erase main block\n");
+
+ for (i = 0; i < 3; i ++)
+ {
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(10);
+
+ if (i == 0)
+ {
+ RegSet16BitValue(0x1600, 0x0000);
+ }
+ else if (i == 1)
+ {
+ RegSet16BitValue(0x1600, 0x8000);
+ }
+ else if (i == 2)
+ {
+ RegSet16BitValue(0x1600, 0xA000);
+ }
+
+ // Sector erase
+ RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2));
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+ }
+ else if (eEmemType == EMEM_INFO) // 512Byte
+ {
+ DBG("Erase info block\n");
+
+ // Clear pce
+ RegSetLByteValue(0x1618, 0x80);
+ mdelay(10);
+
+ RegSet16BitValue(0x1600, 0xC000);
+
+ // Sector erase
+ RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2));
+
+ DBG("Wait erase done flag\n");
+
+ do // Wait erase done flag
+ {
+ nRegData = RegGet16BitValue(0x1610); // Memory status
+ mdelay(50);
+ } while((nRegData & BIT1) != BIT1);
+ }
+
+ DBG("Erase end\n");
+
+ // Hold reset pin before program
+ RegSetLByteValue(0x1E06, 0x00);
+
+ /////////////////////////
+ // Program
+ /////////////////////////
+
+ if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN) // 48KB
+ {
+ DBG("Program main block start\n");
+
+ // Program main block
+ RegSet16BitValue(0x161A, 0xABBA);
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0x0000); // Set start address of main block
+ RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode
+
+ // Program start
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3);
+
+ szDbBusTxData[0] = 0x20;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB
+ index = 0;
+
+ while (nRemainSize > 0)
+ {
+ if (nRemainSize > nSizePerWrite)
+ {
+ nBlockSize = nSizePerWrite;
+ }
+ else
+ {
+ nBlockSize = nRemainSize;
+ }
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ nSize = 3;
+
+ for (i = 0; i < nBlockSize; i ++)
+ {
+ szDbBusTxData[3+i] = _gOneDimenFwData[index*nSizePerWrite+i];
+ nSize ++;
+ }
+ index ++;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize);
+
+ nRemainSize = nRemainSize - nBlockSize;
+ }
+
+ // Program end
+ szDbBusTxData[0] = 0x21;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ nRegData = RegGet16BitValue(0x160C);
+ RegSet16BitValue(0x160C, nRegData & (~0x01));
+
+ DBG("Wait main block write done flag\n");
+
+ // Polling 0x1610 is 0x0002
+ do
+ {
+ nRegData = RegGet16BitValue(0x1610);
+ nRegData = nRegData & BIT1;
+ mdelay(10);
+
+ } while (nRegData != BIT1); // Wait write done flag
+
+ DBG("Program main block end\n");
+ }
+
+ if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO) // 512 Byte
+ {
+ DBG("Program info block start\n");
+
+ // Program info block
+ RegSet16BitValue(0x161A, 0xABBA);
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0xC000); // Set start address of info block
+ RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode
+
+ // Program start
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3);
+
+ szDbBusTxData[0] = 0x20;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte
+ index = 0;
+
+ while (nRemainSize > 0)
+ {
+ if (nRemainSize > nSizePerWrite)
+ {
+ nBlockSize = nSizePerWrite;
+ }
+ else
+ {
+ nBlockSize = nRemainSize;
+ }
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x16;
+ szDbBusTxData[2] = 0x02;
+
+ nSize = 3;
+
+ for (i = 0; i < nBlockSize; i ++)
+ {
+ szDbBusTxData[3+i] = _gOneDimenFwData[(MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024)+(index*nSizePerWrite)+i];
+ nSize ++;
+ }
+ index ++;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize);
+
+ nRemainSize = nRemainSize - nBlockSize;
+ }
+
+ // Program end
+ szDbBusTxData[0] = 0x21;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1);
+
+ nRegData = RegGet16BitValue(0x160C);
+ RegSet16BitValue(0x160C, nRegData & (~0x01));
+
+ DBG("Wait info block write done flag\n");
+
+ // Polling 0x1610 is 0x0002
+ do
+ {
+ nRegData = RegGet16BitValue(0x1610);
+ nRegData = nRegData & BIT1;
+ mdelay(10);
+
+ } while (nRegData != BIT1); // Wait write done flag
+
+ DBG("Program info block end\n");
+ }
+
+ if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN)
+ {
+ // Get CRC 32 from updated firmware bin file
+ nCrcMain = _gOneDimenFwData[0xBFFF] << 24;
+ nCrcMain |= _gOneDimenFwData[0xBFFE] << 16;
+ nCrcMain |= _gOneDimenFwData[0xBFFD] << 8;
+ nCrcMain |= _gOneDimenFwData[0xBFFC];
+
+ // CRC Main from TP
+ DBG("Get Main CRC from TP\n");
+
+ nCrcMainTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN);
+
+ DBG("nCrcMain=0x%x, nCrcMainTp=0x%x\n", nCrcMain, nCrcMainTp);
+ }
+
+ if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO)
+ {
+ nCrcInfo = _gOneDimenFwData[0xC1FF] << 24;
+ nCrcInfo |= _gOneDimenFwData[0xC1FE] << 16;
+ nCrcInfo |= _gOneDimenFwData[0xC1FD] << 8;
+ nCrcInfo |= _gOneDimenFwData[0xC1FC];
+
+ // CRC Info from TP
+ DBG("Get Info CRC from TP\n");
+
+ nCrcInfoTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO);
+
+ DBG("nCrcInfo=0x%x, nCrcInfoTp=0x%x\n", nCrcInfo, nCrcInfoTp);
+ }
+
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ if (eEmemType == EMEM_ALL)
+ {
+ if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo))
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+ else if (eEmemType == EMEM_MAIN)
+ {
+ if (nCrcMainTp != nCrcMain)
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+ else if (eEmemType == EMEM_INFO)
+ {
+ if (nCrcInfoTp != nCrcInfo)
+ {
+ DBG("Update FAILED\n");
+
+ return -1;
+ }
+ }
+
+ DBG("Update SUCCESS\n");
+
+ return 0;
+}
+
+static s32 _DrvFwCtrlUpdateFirmwareCash(u8 szFwData[][1024])
+{
+ DBG("*** %s() ***\n", __func__);
+
+ DBG("chip type = 0x%x\n", g_ChipType);
+
+ if (g_ChipType == CHIP_TYPE_MSG21XXA) // (0x02)
+ {
+// u16 nChipType;
+ u8 nChipVersion = 0;
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ // Erase TP Flash first
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ // Stop MCU
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Disable watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ /////////////////////////
+ // Difference between C2 and C3
+ /////////////////////////
+ // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2)
+ // check ic type
+// nChipType = RegGet16BitValue(0x1ECC) & 0xFF;
+
+ // check ic version
+ nChipVersion = RegGet16BitValue(0x3CEA) & 0xFF;
+
+ DBG("chip version = 0x%x\n", nChipVersion);
+
+ if (nChipVersion == 3)
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN);
+#else
+ return _DrvFwCtrlUpdateFirmwareC33(szFwData, EMEM_MAIN);
+#endif
+ }
+ else
+ {
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN);
+#else
+ return _DrvFwCtrlUpdateFirmwareC32(szFwData, EMEM_ALL);
+#endif
+ }
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG22XX) // (0x7A)
+ {
+// _DrvFwCtrlMsg22xxGetTpVendorCode(_gTpVendorCode);
+
+// if (_gTpVendorCode[0] == 'C' && _gTpVendorCode[1] == 'N' && _gTpVendorCode[2] == 'T') // for specific TP vendor which store some important information in info block, only update firmware for main block, do not update firmware for info block.
+// {
+// return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_MAIN);
+// }
+// else
+// {
+ return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_ALL);
+// }
+ }
+ else // CHIP_TYPE_MSG21XX (0x01)
+ {
+ DBG("Can not update firmware. Catch-2 is no need to be maintained now.\n");
+ g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware
+
+ return -1;
+ }
+}
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+u8 DrvFwCtrlGetChipType(void)
+{
+ u8 nChipType = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ //DrvPlatformLyrTouchDeviceResetHw();
+
+ // Erase TP Flash first
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(20);
+
+ // Stop MCU
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Disable watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ /////////////////////////
+ // Difference between C2 and C3
+ /////////////////////////
+ // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2)
+ // check ic type
+ nChipType = RegGet16BitValue(0x1ECC) & 0xFF;
+
+ if (nChipType != CHIP_TYPE_MSG21XX && // (0x01)
+ nChipType != CHIP_TYPE_MSG21XXA && // (0x02)
+ nChipType != CHIP_TYPE_MSG26XXM && // (0x03)
+ nChipType != CHIP_TYPE_MSG22XX) // (0x7A)
+ {
+ nChipType = 0;
+ }
+
+ DBG("*** Chip Type = 0x%x ***\n", nChipType);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ return nChipType;
+}
+
+void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG21XX)
+ {
+ u8 szDbBusTxData[3] = {0};
+ u8 szDbBusRxData[4] = {0};
+
+ szDbBusTxData[0] = 0x53;
+ szDbBusTxData[1] = 0x00;
+
+ if (g_ChipType == CHIP_TYPE_MSG21XXA)
+ {
+ szDbBusTxData[2] = 0x2A;
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG21XX)
+ {
+ szDbBusTxData[2] = 0x74;
+ }
+ else
+ {
+ szDbBusTxData[2] = 0x2A;
+ }
+
+ mutex_lock(&g_Mutex);
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3);
+ IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4);
+
+ mutex_unlock(&g_Mutex);
+
+ *pMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0];
+ *pMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2];
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ u16 nRegData1, nRegData2;
+
+ mutex_lock(&g_Mutex);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block
+
+ // Enable burst mode
+// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+ nRegData2 = RegGet16BitValue(0x1606);
+
+ *pMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF);
+ *pMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF);
+
+ // Clear burst mode
+// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ mdelay(100);
+
+ mutex_unlock(&g_Mutex);
+ }
+
+ DBG("*** major = %d ***\n", *pMajor);
+ DBG("*** minor = %d ***\n", *pMinor);
+
+ if (*ppVersion == NULL)
+ {
+ *ppVersion = kzalloc(sizeof(u8)*6, GFP_KERNEL);
+ }
+
+ sprintf(*ppVersion, "%03d%03d", *pMajor, *pMinor);
+}
+
+void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion)
+{
+ u32 i;
+ u16 nRegData1, nRegData2;
+ u8 szDbBusRxData[12] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ mutex_lock(&g_Mutex);
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX) // Only MSG22XX support platform firmware version
+ {
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0xC1F2); // Set start address for platform firmware version on info block(Actually, start reading from 0xC1F0)
+
+ // Enable burst mode
+ RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ for (i = 0; i < 3; i ++)
+ {
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+ nRegData2 = RegGet16BitValue(0x1606);
+
+ szDbBusRxData[i*4+0] = (nRegData1 & 0xFF);
+ szDbBusRxData[i*4+1] = ((nRegData1 >> 8 ) & 0xFF);
+
+// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+0, szDbBusRxData[i*4+0], szDbBusRxData[i*4+0]); // add for debug
+// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+1, szDbBusRxData[i*4+1], szDbBusRxData[i*4+1]); // add for debug
+
+ szDbBusRxData[i*4+2] = (nRegData2 & 0xFF);
+ szDbBusRxData[i*4+3] = ((nRegData2 >> 8 ) & 0xFF);
+
+// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+2, szDbBusRxData[i*4+2], szDbBusRxData[i*4+2]); // add for debug
+// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+3, szDbBusRxData[i*4+3], szDbBusRxData[i*4+3]); // add for debug
+ }
+
+ // Clear burst mode
+ RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ if (*ppVersion == NULL)
+ {
+ *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL);
+ }
+
+ sprintf(*ppVersion, "%c%c%c%c%c%c%c%c%c%c", szDbBusRxData[2], szDbBusRxData[3], szDbBusRxData[4],
+ szDbBusRxData[5], szDbBusRxData[6], szDbBusRxData[7], szDbBusRxData[8], szDbBusRxData[9], szDbBusRxData[10], szDbBusRxData[11]);
+ }
+ else
+ {
+ if (*ppVersion == NULL)
+ {
+ *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL);
+ }
+
+ sprintf(*ppVersion, "%s", "N/A");
+ }
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ mdelay(100);
+
+ mutex_unlock(&g_Mutex);
+
+ DBG("*** platform firmware version = %s ***\n", *ppVersion);
+}
+
+s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return _DrvFwCtrlUpdateFirmwareCash(szFwData);
+}
+
+void DrvFwCtrlHandleFingerTouch(void)
+{
+ TouchInfo_t tInfo;
+ u32 i;
+ u8 nTouchKeyCode = 0;
+ static u32 nLastKeyCode = 0;
+ u8 *pPacket = NULL;
+ u16 nReportPacketLength = 0;
+
+// DBG("*** %s() ***\n", __func__);
+
+ memset(&tInfo, 0x0, sizeof(tInfo));
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE)
+ {
+ DBG("FIRMWARE_MODE_DEMO_MODE\n");
+
+ nReportPacketLength = DEMO_MODE_PACKET_LENGTH;
+ pPacket = g_DemoModePacket;
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)
+ {
+ DBG("FIRMWARE_MODE_DEBUG_MODE\n");
+
+ if (g_FirmwareInfo.nLogModePacketHeader != 0x62)
+ {
+ DBG("WRONG DEBUG MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader);
+ return;
+ }
+
+ if (g_LogModePacket == NULL)
+ {
+ g_LogModePacket = kzalloc(sizeof(u8)*g_FirmwareInfo.nLogModePacketLength, GFP_KERNEL);
+ }
+
+ nReportPacketLength = g_FirmwareInfo.nLogModePacketLength;
+ pPacket = g_LogModePacket;
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE)
+ {
+ DBG("FIRMWARE_MODE_RAW_DATA_MODE\n");
+
+ if (g_FirmwareInfo.nLogModePacketHeader != 0x62)
+ {
+ DBG("WRONG RAW DATA MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader);
+ return;
+ }
+
+ if (g_LogModePacket == NULL)
+ {
+ g_LogModePacket = kzalloc(sizeof(u8)*g_FirmwareInfo.nLogModePacketLength, GFP_KERNEL);
+ }
+
+ nReportPacketLength = g_FirmwareInfo.nLogModePacketLength;
+ pPacket = g_LogModePacket;
+ }
+ else
+ {
+ DBG("WRONG FIRMWARE MODE : 0x%x\n", g_FirmwareMode);
+ return;
+ }
+#else
+ DBG("FIRMWARE_MODE_DEMO_MODE\n");
+
+ nReportPacketLength = DEMO_MODE_PACKET_LENGTH;
+ pPacket = g_DemoModePacket;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ if (g_GestureWakeupFlag == 1)
+ {
+ DBG("Set gesture wakeup packet length, g_ChipType=%d\n", g_ChipType);
+
+ if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ if (_gGestureWakeupPacket == NULL)
+ {
+ _gGestureWakeupPacket = kzalloc(sizeof(u8)*GESTURE_WAKEUP_PACKET_LENGTH, GFP_KERNEL);
+ }
+
+ nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH;
+ pPacket = _gGestureWakeupPacket;
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG21XXA)
+ {
+ if (_gGestureWakeupPacket == NULL)
+ {
+ _gGestureWakeupPacket = kzalloc(sizeof(u8)*DEMO_MODE_PACKET_LENGTH, GFP_KERNEL);
+ }
+
+ nReportPacketLength = DEMO_MODE_PACKET_LENGTH;
+ pPacket = _gGestureWakeupPacket;
+ }
+ else
+ {
+ DBG("This chip type does not support gesture wakeup.\n");
+ return;
+ }
+ }
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM)
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ if (g_GestureWakeupFlag == 1)
+ {
+ u32 i = 0, rc;
+
+ while (i < 5)
+ {
+ mdelay(50);
+
+ rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength);
+
+ if (rc > 0)
+ {
+ break;
+ }
+
+ i ++;
+ }
+ }
+ else
+ {
+ IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength);
+ }
+#else
+ IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength);
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+ IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength);
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif
+
+ if (0 == _DrvFwCtrlParsePacket(pPacket, nReportPacketLength, &tInfo))
+ {
+ //report...
+ if ((tInfo.nFingerNum) == 0) //touch end
+ {
+ if (nLastKeyCode != 0)
+ {
+ DBG("key touch released\n");
+
+ input_report_key(g_InputDevice, BTN_TOUCH, 0);
+ input_report_key(g_InputDevice, nLastKeyCode, 0);
+
+ nLastKeyCode = 0; //clear key status..
+ }
+ else
+ {
+ DrvPlatformLyrFingerTouchReleased(0, 0);
+ }
+ }
+ else //touch on screen
+ {
+ if (tInfo.nTouchKeyCode != 0)
+ {
+#ifdef CONFIG_TP_HAVE_KEY
+ if (tInfo.nTouchKeyCode == 4) // TOUCH_KEY_HOME
+ {
+ nTouchKeyCode = g_TpVirtualKey[1];
+ }
+ else if (tInfo.nTouchKeyCode == 1) // TOUCH_KEY_MENU
+ {
+ nTouchKeyCode = g_TpVirtualKey[0];
+ }
+ else if (tInfo.nTouchKeyCode == 2) // TOUCH_KEY_BACK
+ {
+ nTouchKeyCode = g_TpVirtualKey[2];
+ }
+ else if (tInfo.nTouchKeyCode == 8) // TOUCH_KEY_SEARCH
+ {
+ nTouchKeyCode = g_TpVirtualKey[3];
+ }
+
+ if (nLastKeyCode != nTouchKeyCode)
+ {
+ DBG("key touch pressed\n");
+ DBG("nTouchKeyCode = %d, nLastKeyCode = %d\n", nTouchKeyCode, nLastKeyCode);
+
+ nLastKeyCode = nTouchKeyCode;
+
+ input_report_key(g_InputDevice, BTN_TOUCH, 1);
+ input_report_key(g_InputDevice, nTouchKeyCode, 1);
+ }
+#endif //CONFIG_TP_HAVE_KEY
+ }
+ else
+ {
+ DBG("tInfo->nFingerNum = %d...............\n", tInfo.nFingerNum);
+
+ for (i = 0; i < tInfo.nFingerNum; i ++)
+ {
+ DrvPlatformLyrFingerTouchPressed(tInfo.tPoint[i].nX, tInfo.tPoint[i].nY, 0, 0);
+ }
+ }
+ }
+
+ input_sync(g_InputDevice);
+ }
+}
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+
+void DrvFwCtrlOpenGestureWakeup(u16 nMode)
+{
+ u8 szDbBusTxData[3] = {0};
+ u32 i = 0;
+ s32 rc;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DBG("wakeup mode = 0x%x\n", nMode);
+
+ szDbBusTxData[0] = 0x58;
+ szDbBusTxData[1] = (nMode >> 8) & 0xFF;
+ szDbBusTxData[2] = nMode & 0xFF;
+
+ while (i < 5)
+ {
+ rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3);
+
+ if (rc > 0)
+ {
+ DBG("Enable gesture wakeup success\n");
+ break;
+ }
+
+ i ++;
+ }
+
+ if (i == 5)
+ {
+ DBG("Enable gesture wakeup failed\n");
+ }
+/*
+ rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3);
+ if (rc < 0)
+ {
+ DBG("Enable gesture wakeup failed\n");
+ }
+ else
+ {
+ DBG("Enable gesture wakeup success\n");
+ }
+*/
+ g_GestureWakeupFlag = 1; // gesture wakeup is enabled
+}
+
+void DrvFwCtrlCloseGestureWakeup(void)
+{
+// u8 szDbBusTxData[3] = {0};
+// s32 rc;
+
+ DBG("*** %s() ***\n", __func__);
+/*
+ szDbBusTxData[0] = 0x58;
+ szDbBusTxData[1] = 0x00;
+ szDbBusTxData[2] = 0x00;
+
+ rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3);
+ if (rc < 0)
+ {
+ DBG("Disable gesture wakeup failed\n");
+ }
+ else
+ {
+ DBG("Disable gesture wakeup success\n");
+ }
+*/
+ g_GestureWakeupFlag = 0; // gesture wakeup is disabled
+}
+
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+u16 DrvFwCtrlChangeFirmwareMode(u16 nMode)
+{
+ u8 szDbBusTxData[2] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ szDbBusTxData[0] = 0x02;
+ szDbBusTxData[1] = (u8)nMode;
+
+ mdelay(20);
+
+ mutex_lock(&g_Mutex);
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 2);
+
+ mutex_unlock(&g_Mutex);
+
+ return nMode;
+}
+
+void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo)
+{
+ u8 szDbBusTxData[1] = {0};
+ u8 szDbBusRxData[8] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ szDbBusTxData[0] = 0x01;
+
+ mutex_lock(&g_Mutex);
+
+ mdelay(300);
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1);
+ mdelay(20);
+ IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 8);
+
+ mutex_unlock(&g_Mutex);
+
+ if ((szDbBusRxData[1] & 0x80) == 0x80)
+ {
+ pInfo->nIsCanChangeFirmwareMode = 0;
+ }
+ else
+ {
+ pInfo->nIsCanChangeFirmwareMode = 1;
+ }
+
+ pInfo->nFirmwareMode = szDbBusRxData[1] & 0x7F;
+ pInfo->nLogModePacketHeader = szDbBusRxData[2];
+ pInfo->nLogModePacketLength = (szDbBusRxData[3]<<8) + szDbBusRxData[4];
+
+ DBG("pInfo->nFirmwareMode=0x%x, pInfo->nLogModePacketHeader=0x%x, pInfo->nLogModePacketLength=%d, pInfo->nIsCanChangeFirmwareMode=%d\n", pInfo->nFirmwareMode, pInfo->nLogModePacketHeader, pInfo->nLogModePacketLength, pInfo->nIsCanChangeFirmwareMode);
+}
+
+void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void)
+{
+ FirmwareInfo_t tInfo;
+
+ DBG("*** %s() ***\n", __func__);
+
+ memset(&tInfo, 0x0, sizeof(FirmwareInfo_t));
+
+ DrvFwCtrlGetFirmwareInfo(&tInfo);
+
+ DBG("g_FirmwareMode = 0x%x, tInfo.nFirmwareMode = 0x%x\n", g_FirmwareMode, tInfo.nFirmwareMode);
+
+ // Since reset_hw() will reset the firmware mode to demo mode, we must reset the firmware mode again after reset_hw().
+ if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && FIRMWARE_MODE_DEBUG_MODE != tInfo.nFirmwareMode)
+ {
+ g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE);
+ }
+ else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && FIRMWARE_MODE_RAW_DATA_MODE != tInfo.nFirmwareMode)
+ {
+ g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE);
+ }
+ else
+ {
+ DBG("firmware mode is not restored\n");
+ }
+}
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+//------------------------------------------------------------------------------//
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+void DrvFwCtrlCheckFirmwareUpdateBySwId(void)
+{
+ if (g_ChipType == CHIP_TYPE_MSG21XXA)
+ {
+ _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId();
+ }
+ else if (g_ChipType == CHIP_TYPE_MSG22XX)
+ {
+ _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId();
+ }
+ else
+ {
+ DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType);
+ }
+}
+
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+//------------------------------------------------------------------------------//
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h
new file mode 100644
index 00000000..2ddae19e
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h
@@ -0,0 +1,154 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_self_fw_control.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_SELF_FW_CONTROL_H__
+#define __MSTAR_DRV_SELF_FW_CONTROL_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+
+/*--------------------------------------------------------------------------*/
+/* COMPILE OPTION DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+//#define CONFIG_SWAP_X_Y
+
+//#define CONFIG_REVERSE_X
+//#define CONFIG_REVERSE_Y
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+#define DEMO_MODE_PACKET_LENGTH (8)
+#define MAX_TOUCH_NUM (2)
+
+#define MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE (32) //32K
+#define MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE (1) //1K
+#define MSG21XXA_FIRMWARE_WHOLE_SIZE (MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE+MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE) //33K
+
+#define MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE (48) //48K
+#define MSG22XX_FIRMWARE_INFO_BLOCK_SIZE (512) //512Byte
+
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+#define FIRMWARE_MODE_DEMO_MODE (0x00)
+#define FIRMWARE_MODE_DEBUG_MODE (0x01)
+#define FIRMWARE_MODE_RAW_DATA_MODE (0x02)
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+#define UPDATE_FIRMWARE_RETRY_COUNT (2)
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+/*--------------------------------------------------------------------------*/
+/* DATA TYPE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+typedef struct
+{
+ u16 nX;
+ u16 nY;
+} TouchPoint_t;
+
+typedef struct
+{
+ u8 nTouchKeyMode;
+ u8 nTouchKeyCode;
+ u8 nFingerNum;
+ TouchPoint_t tPoint[MAX_TOUCH_NUM];
+} TouchInfo_t;
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+typedef struct
+{
+ u8 nFirmwareMode;
+ u8 nLogModePacketHeader;
+ u16 nLogModePacketLength;
+ u8 nIsCanChangeFirmwareMode;
+} FirmwareInfo_t;
+
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+/*
+ * Note.
+ * The following is sw id enum definition for MSG22XX.
+ * 0x0000 and 0xFFFF are not allowed to be defined as SW ID.
+ * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it.
+ * Please modify the SW ID of the below enum value depends on the TP vendor that you are using.
+ */
+typedef enum {
+ MSG22XX_SW_ID_XXXX = 0x0001,
+ MSG22XX_SW_ID_YYYY = 0x0002,
+ MSG22XX_SW_ID_UNDEFINED
+} Msg22xxSwId_e;
+
+
+/*
+ * Note.
+ * The following is sw id enum definition for MSG21XXA.
+ * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it.
+ * Please modify the SW ID of the below enum value depends on the TP vendor that you are using.
+ */
+typedef enum {
+ MSG21XXA_SW_ID_XXXX = 0x0C,
+ MSG21XXA_SW_ID_YYYY,
+ MSG21XXA_SW_ID_UNDEFINED
+} Msg21xxaSwId_e;
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern void DrvFwCtrlOpenGestureWakeup(u16 nMode);
+extern void DrvFwCtrlCloseGestureWakeup(void);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern u16 DrvFwCtrlChangeFirmwareMode(u16 nMode);
+extern void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo);
+extern void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+extern void DrvFwCtrlCheckFirmwareUpdateBySwId(void);
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+extern u8 DrvFwCtrlGetChipType(void);
+extern void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion);
+extern void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion);
+extern void DrvFwCtrlHandleFingerTouch(void);
+extern s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType);
+
+#endif /* __MSTAR_DRV_SELF_FW_CONTROL_H__ */
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c
new file mode 100644
index 00000000..7b7bcac0
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c
@@ -0,0 +1,2514 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_self_mp_test.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_self_mp_test.h"
+#include "mstar_drv_utility_adaption.h"
+#include "mstar_drv_self_fw_control.h"
+#include "mstar_drv_platform_porting_layer.h"
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+// Modify.
+#include "open_test_ANA1_X.h"
+#include "open_test_ANA2_X.h"
+#include "open_test_ANA1_B_X.h"
+#include "open_test_ANA2_B_X.h"
+#include "open_test_ANA3_X.h"
+
+#include "open_test_ANA1_Y.h"
+#include "open_test_ANA2_Y.h"
+#include "open_test_ANA1_B_Y.h"
+#include "open_test_ANA2_B_Y.h"
+#include "open_test_ANA3_Y.h"
+
+// Modify.
+#include "short_test_ANA1_X.h"
+#include "short_test_ANA2_X.h"
+#include "short_test_ANA3_X.h"
+#include "short_test_ANA4_X.h"
+
+#include "short_test_ANA1_Y.h"
+#include "short_test_ANA2_Y.h"
+#include "short_test_ANA3_Y.h"
+#include "short_test_ANA4_Y.h"
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+// Modify.
+#include "open_test_RIU1_X.h"
+#include "open_test_RIU2_X.h"
+#include "open_test_RIU3_X.h"
+
+#include "open_test_RIU1_Y.h"
+#include "open_test_RIU2_Y.h"
+#include "open_test_RIU3_Y.h"
+
+// Modify.
+#include "short_test_RIU1_X.h"
+#include "short_test_RIU2_X.h"
+#include "short_test_RIU3_X.h"
+#include "short_test_RIU4_X.h"
+
+#include "short_test_RIU1_Y.h"
+#include "short_test_RIU2_Y.h"
+#include "short_test_RIU3_Y.h"
+#include "short_test_RIU4_Y.h"
+#endif
+
+/*=============================================================*/
+// PREPROCESSOR CONSTANT DEFINITION
+/*=============================================================*/
+
+// Modify.
+#define TP_OF_X (1) //(2)
+#define TP_OF_Y (4)
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+
+extern struct i2c_client *g_I2cClient;
+
+/*=============================================================*/
+// LOCAL VARIABLE DEFINITION
+/*=============================================================*/
+
+static u32 _gIsInMpTest = 0;
+static u32 _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT;
+static ItoTestMode_e _gItoTestMode = 0;
+
+static s32 _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING;
+static u8 _gTestFailChannel[MAX_CHANNEL_NUM] = {0};
+static u32 _gTestFailChannelCount = 0;
+
+static struct work_struct _gCtpItoTestWork;
+static struct workqueue_struct *_gCtpMpTestWorkQueue = NULL;
+
+static s16 _gRawData1[MAX_CHANNEL_NUM] = {0};
+static s16 _gRawData2[MAX_CHANNEL_NUM] = {0};
+static s16 _gRawData3[MAX_CHANNEL_NUM] = {0};
+static s16 _gRawData4[MAX_CHANNEL_NUM] = {0};
+static s8 _gDataFlag1[MAX_CHANNEL_NUM] = {0};
+static s8 _gDataFlag2[MAX_CHANNEL_NUM] = {0};
+static s8 _gDataFlag3[MAX_CHANNEL_NUM] = {0};
+static s8 _gDataFlag4[MAX_CHANNEL_NUM] = {0};
+
+static u8 _gItoTestKeyNum = 0;
+static u8 _gItoTestDummyNum = 0;
+static u8 _gItoTestTriangleNum = 0;
+static u8 _gIsEnable2R = 0;
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+
+static u8 _gLTP = 1;
+
+// _gOpen1~_gOpen3 are for MSG21XXA
+static u16 *_gOpen1 = NULL;
+static u16 *_gOpen1B = NULL;
+static u16 *_gOpen2 = NULL;
+static u16 *_gOpen2B = NULL;
+static u16 *_gOpen3 = NULL;
+
+// _gShort_1~_gShort_4 are for MSG21XXA
+static u16 *_gShort_1 = NULL;
+static u16 *_gShort_2 = NULL;
+static u16 *_gShort_3 = NULL;
+static u16 *_gShort_4 = NULL;
+
+// _gShort_1_GPO~_gShort_4_GPO are for MSG21XXA
+static u16 *_gShort_1_GPO = NULL;
+static u16 *_gShort_2_GPO = NULL;
+static u16 *_gShort_3_GPO = NULL;
+static u16 *_gShort_4_GPO = NULL;
+
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+
+// _gOpenRIU1~_gOpenRIU3 are for MSG22XX
+static u32 *_gOpenRIU1 = NULL;
+static u32 *_gOpenRIU2 = NULL;
+static u32 *_gOpenRIU3 = NULL;
+
+// _gShort_RIU1~_gShort_RIU4 are for MSG22XX
+static u32 *_gShort_RIU1 = NULL;
+static u32 *_gShort_RIU2 = NULL;
+static u32 *_gShort_RIU3 = NULL;
+static u32 *_gShort_RIU4 = NULL;
+
+// _gOpenSubFrameNum1~_gShortSubFrameNum4 are for MSG22XX
+static u8 _gOpenSubFrameNum1 = 0;
+static u8 _gOpenSubFrameNum2 = 0;
+static u8 _gOpenSubFrameNum3 = 0;
+static u8 _gShortSubFrameNum1 = 0;
+static u8 _gShortSubFrameNum2 = 0;
+static u8 _gShortSubFrameNum3 = 0;
+static u8 _gShortSubFrameNum4 = 0;
+
+#endif
+
+static u8 *_gMAP1 = NULL;
+static u8 *_gMAP2 = NULL;
+static u8 *_gMAP3 = NULL;
+static u8 *_gMAP40_1 = NULL;
+static u8 *_gMAP40_2 = NULL;
+static u8 *_gMAP40_3 = NULL;
+static u8 *_gMAP40_4 = NULL;
+static u8 *_gMAP41_1 = NULL;
+static u8 *_gMAP41_2 = NULL;
+static u8 *_gMAP41_3 = NULL;
+static u8 *_gMAP41_4 = NULL;
+
+static u8 *_gSHORT_MAP1 = NULL;
+static u8 *_gSHORT_MAP2 = NULL;
+static u8 *_gSHORT_MAP3 = NULL;
+static u8 *_gSHORT_MAP4 = NULL;
+
+//static struct proc_dir_entry *_gMsgItoTest = NULL;
+//static struct proc_dir_entry *_gDebug = NULL;
+ItoTestResult_e _gItoTestResult = ITO_TEST_OK;
+
+/*=============================================================*/
+// EXTERN FUNCTION DECLARATION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// LOCAL FUNCTION DEFINITION
+/*=============================================================*/
+
+static u16 _DrvMpTestItoTestGetTpType(void)
+{
+ u16 nMajor = 0, nMinor = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ {
+ u8 szDbBusTxData[3] = {0};
+ u8 szDbBusRxData[4] = {0};
+
+ szDbBusTxData[0] = 0x53;
+ szDbBusTxData[1] = 0x00;
+ szDbBusTxData[2] = 0x2A;
+
+ IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3);
+ IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4);
+
+ nMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0];
+ nMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2];
+ }
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ {
+ u16 nRegData1, nRegData2;
+
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop mcu
+ RegSetLByteValue(0x0FE6, 0x01);
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55);
+
+ // RIU password
+ RegSet16BitValue(0x161A, 0xABBA);
+
+ // Clear pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80));
+
+ RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block
+
+ // Enable burst mode
+// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01));
+
+ // Set pce
+ RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40));
+
+ RegSetLByteValue(0x160E, 0x01);
+
+ nRegData1 = RegGet16BitValue(0x1604);
+ nRegData2 = RegGet16BitValue(0x1606);
+
+ nMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF);
+ nMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF);
+
+ // Clear burst mode
+// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01));
+
+ RegSet16BitValue(0x1600, 0x0000);
+
+ // Clear RIU password
+ RegSet16BitValue(0x161A, 0x0000);
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ mdelay(100);
+ }
+#endif
+
+ DBG("*** major = %d ***\n", nMajor);
+ DBG("*** minor = %d ***\n", nMinor);
+
+ return nMajor;
+}
+
+static u16 _DrvMpTestItoTestChooseTpType(void)
+{
+ u16 nTpType = 0;
+ u32 i = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ // _gOpen1~_gOpen3 are for MSG21XXA
+ _gOpen1 = NULL;
+ _gOpen1B = NULL;
+ _gOpen2 = NULL;
+ _gOpen2B = NULL;
+ _gOpen3 = NULL;
+
+ // _gShort_1~_gShort_4 are for MSG21XXA
+ _gShort_1 = NULL;
+ _gShort_2 = NULL;
+ _gShort_3 = NULL;
+ _gShort_4 = NULL;
+
+ _gShort_1_GPO = NULL;
+ _gShort_2_GPO = NULL;
+ _gShort_3_GPO = NULL;
+ _gShort_4_GPO = NULL;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ // _gOpenRIU1~_gOpenRIU3 are for MSG22XX
+ _gOpenRIU1 = NULL;
+ _gOpenRIU2 = NULL;
+ _gOpenRIU3 = NULL;
+
+ // _gShort_RIU1~_gShort_RIU4 are for MSG22XX
+ _gShort_RIU1 = NULL;
+ _gShort_RIU2 = NULL;
+ _gShort_RIU3 = NULL;
+ _gShort_RIU4 = NULL;
+
+ _gOpenSubFrameNum1 = 0;
+ _gOpenSubFrameNum2 = 0;
+ _gOpenSubFrameNum3 = 0;
+ _gShortSubFrameNum1 = 0;
+ _gShortSubFrameNum2 = 0;
+ _gShortSubFrameNum3 = 0;
+ _gShortSubFrameNum4 = 0;
+#endif
+
+ _gMAP1 = NULL;
+ _gMAP2 = NULL;
+ _gMAP3 = NULL;
+ _gMAP40_1 = NULL;
+ _gMAP40_2 = NULL;
+ _gMAP40_3 = NULL;
+ _gMAP40_4 = NULL;
+ _gMAP41_1 = NULL;
+ _gMAP41_2 = NULL;
+ _gMAP41_3 = NULL;
+ _gMAP41_4 = NULL;
+
+ _gSHORT_MAP1 = NULL;
+ _gSHORT_MAP2 = NULL;
+ _gSHORT_MAP3 = NULL;
+ _gSHORT_MAP4 = NULL;
+
+ _gItoTestKeyNum = 0;
+ _gItoTestDummyNum = 0;
+ _gItoTestTriangleNum = 0;
+ _gIsEnable2R = 0;
+
+ for (i = 0; i < 10; i ++)
+ {
+ nTpType = _DrvMpTestItoTestGetTpType();
+ DBG("nTpType = %d, i = %d\n", nTpType, i);
+
+ if (TP_OF_X == nTpType || TP_OF_Y == nTpType) // Modify.
+ {
+ break;
+ }
+ else if (i < 5)
+ {
+ mdelay(100);
+ }
+ else
+ {
+ DrvPlatformLyrTouchDeviceResetHw();
+ }
+ }
+
+ if (TP_OF_X == nTpType) // Modify.
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _gOpen1 = open_1_X;
+ _gOpen1B = open_1B_X;
+ _gOpen2 = open_2_X;
+ _gOpen2B = open_2B_X;
+ _gOpen3 = open_3_X;
+
+ _gShort_1 = short_1_X;
+ _gShort_2 = short_2_X;
+ _gShort_3 = short_3_X;
+ _gShort_4 = short_4_X;
+
+ _gShort_1_GPO = short_1_X_GPO;
+ _gShort_2_GPO = short_2_X_GPO;
+ _gShort_3_GPO = short_3_X_GPO;
+ _gShort_4_GPO = short_4_X_GPO;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _gOpenRIU1 = open_1_X;
+ _gOpenRIU2 = open_2_X;
+ _gOpenRIU3 = open_3_X;
+
+ _gShort_RIU1 = short_1_X;
+ _gShort_RIU2 = short_2_X;
+ _gShort_RIU3 = short_3_X;
+ _gShort_RIU4 = short_4_X;
+
+ _gOpenSubFrameNum1 = NUM_OPEN_1_SENSOR_X;
+ _gOpenSubFrameNum2 = NUM_OPEN_2_SENSOR_X;
+ _gOpenSubFrameNum3 = NUM_OPEN_3_SENSOR_X;
+ _gShortSubFrameNum1 = NUM_SHORT_1_SENSOR_X;
+ _gShortSubFrameNum2 = NUM_SHORT_2_SENSOR_X;
+ _gShortSubFrameNum3 = NUM_SHORT_3_SENSOR_X;
+ _gShortSubFrameNum4 = NUM_SHORT_4_SENSOR_X;
+#endif
+
+ _gMAP1 = MAP1_X;
+ _gMAP2 = MAP2_X;
+ _gMAP3 = MAP3_X;
+ _gMAP40_1 = MAP40_1_X;
+ _gMAP40_2 = MAP40_2_X;
+ _gMAP40_3 = MAP40_3_X;
+ _gMAP40_4 = MAP40_4_X;
+ _gMAP41_1 = MAP41_1_X;
+ _gMAP41_2 = MAP41_2_X;
+ _gMAP41_3 = MAP41_3_X;
+ _gMAP41_4 = MAP41_4_X;
+
+ _gSHORT_MAP1 = SHORT_MAP1_X;
+ _gSHORT_MAP2 = SHORT_MAP2_X;
+ _gSHORT_MAP3 = SHORT_MAP3_X;
+ _gSHORT_MAP4 = SHORT_MAP4_X;
+
+ _gItoTestKeyNum = NUM_KEY_X;
+ _gItoTestDummyNum = NUM_DUMMY_X;
+ _gItoTestTriangleNum = NUM_SENSOR_X;
+ _gIsEnable2R = ENABLE_2R_X;
+ }
+ else if (TP_OF_Y == nTpType) // Modify.
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _gOpen1 = open_1_Y;
+ _gOpen1B = open_1B_Y;
+ _gOpen2 = open_2_Y;
+ _gOpen2B = open_2B_Y;
+ _gOpen3 = open_3_Y;
+
+ _gShort_1 = short_1_Y;
+ _gShort_2 = short_2_Y;
+ _gShort_3 = short_3_Y;
+ _gShort_4 = short_4_Y;
+
+ _gShort_1_GPO = short_1_Y_GPO;
+ _gShort_2_GPO = short_2_Y_GPO;
+ _gShort_3_GPO = short_3_Y_GPO;
+ _gShort_4_GPO = short_4_Y_GPO;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _gOpenRIU1 = open_1_Y;
+ _gOpenRIU2 = open_2_Y;
+ _gOpenRIU3 = open_3_Y;
+
+ _gShort_RIU1 = short_1_Y;
+ _gShort_RIU2 = short_2_Y;
+ _gShort_RIU3 = short_3_Y;
+ _gShort_RIU4 = short_4_Y;
+
+ _gOpenSubFrameNum1 = NUM_OPEN_1_SENSOR_Y;
+ _gOpenSubFrameNum2 = NUM_OPEN_2_SENSOR_Y;
+ _gOpenSubFrameNum3 = NUM_OPEN_3_SENSOR_Y;
+ _gShortSubFrameNum1 = NUM_SHORT_1_SENSOR_Y;
+ _gShortSubFrameNum2 = NUM_SHORT_2_SENSOR_Y;
+ _gShortSubFrameNum3 = NUM_SHORT_3_SENSOR_Y;
+ _gShortSubFrameNum4 = NUM_SHORT_4_SENSOR_Y;
+#endif
+
+ _gMAP1 = MAP1_Y;
+ _gMAP2 = MAP2_Y;
+ _gMAP3 = MAP3_Y;
+ _gMAP40_1 = MAP40_1_Y;
+ _gMAP40_2 = MAP40_2_Y;
+ _gMAP40_3 = MAP40_3_Y;
+ _gMAP40_4 = MAP40_4_Y;
+ _gMAP41_1 = MAP41_1_Y;
+ _gMAP41_2 = MAP41_2_Y;
+ _gMAP41_3 = MAP41_3_Y;
+ _gMAP41_4 = MAP41_4_Y;
+
+ _gSHORT_MAP1 = SHORT_MAP1_Y;
+ _gSHORT_MAP2 = SHORT_MAP2_Y;
+ _gSHORT_MAP3 = SHORT_MAP3_Y;
+ _gSHORT_MAP4 = SHORT_MAP4_Y;
+
+ _gItoTestKeyNum = NUM_KEY_Y;
+ _gItoTestDummyNum = NUM_DUMMY_Y;
+ _gItoTestTriangleNum = NUM_SENSOR_Y;
+ _gIsEnable2R = ENABLE_2R_Y;
+ }
+ else
+ {
+ nTpType = 0;
+ }
+
+ return nTpType;
+}
+
+static void _DrvMpTestItoTestSwReset(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ RegSet16BitValue(0x1100, 0xFFFF); //bank:ana, addr:h0000
+ RegSet16BitValue(0x1100, 0x0000);
+ mdelay(50); // mdelay(15)
+}
+
+//------------------------------------------------------------------------------//
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+
+static u16 _DrvMpTestItoTestGetNum(void)
+{
+ u32 i;
+ u16 nSensorNum = 0;
+ u16 nRegVal1, nRegVal2;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nRegVal1 = RegGet16BitValue(0x114A); //bank:ana, addr:h0025
+ DBG("nRegValue1 = %d\n", nRegVal1);
+
+ if ((nRegVal1 & BIT1) == BIT1)
+ {
+ nRegVal1 = RegGet16BitValue(0x120A); //bank:ana2, addr:h0005
+ nRegVal1 = nRegVal1 & 0x0F;
+
+ nRegVal2 = RegGet16BitValue(0x1216); //bank:ana2, addr:h000b
+ nRegVal2 = ((nRegVal2 >> 1) & 0x0F) + 1;
+
+ nSensorNum = nRegVal1 * nRegVal2;
+ }
+ else
+ {
+ for (i = 0; i < 4; i ++)
+ {
+ nSensorNum += (RegGet16BitValue(0x120A)>>(4*i))&0x0F; //bank:ana2, addr:h0005
+ }
+ }
+ DBG("nSensorNum = %d\n", nSensorNum);
+
+ return nSensorNum;
+}
+
+static void _DrvMpTestItoTestDisableFilterNoiseDetect(void)
+{
+ u16 nRegValue;
+
+ DBG("*** %s() ***\n", __func__);
+
+ // Disable DIG/ANA drop
+ nRegValue = RegGet16BitValue(0x1302);
+
+ RegSet16BitValue(0x1302, nRegValue & (~(BIT2 | BIT1 | BIT0)));
+}
+
+static void _DrvMpTestItoTestPolling(void)
+{
+ u16 nRegInt = 0x0000;
+ u16 nRegVal;
+
+ DBG("*** %s() ***\n", __func__);
+
+ RegSet16BitValue(0x130C, BIT15); //bank:fir, addr:h0006
+ RegSet16BitValue(0x1214, (RegGet16BitValue(0x1214) | BIT0)); //bank:ana2, addr:h000a
+
+ DBG("polling start\n");
+
+ do
+ {
+ nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c
+ } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000);
+
+ DBG("polling end\n");
+
+ nRegVal = RegGet16BitValue(0x3D18);
+ RegSet16BitValue(0x3D18, nRegVal & (~FIQ_E_FRAME_READY_MASK));
+}
+
+static void _DrvMpTestItoOpenTestSetV(u8 nEnable, u8 nPrs)
+{
+ u16 nRegVal;
+
+ DBG("*** %s() nEnable = %d, nPrs = %d ***\n", __func__, nEnable, nPrs);
+
+ nRegVal = RegGet16BitValue(0x1208); //bank:ana2, addr:h0004
+ nRegVal = nRegVal & 0xF1;
+
+ if (nPrs == 0)
+ {
+ RegSet16BitValue(0x1208, nRegVal|0x0C);
+ }
+ else if (nPrs == 1)
+ {
+ RegSet16BitValue(0x1208, nRegVal|0x0E);
+ }
+ else
+ {
+ RegSet16BitValue(0x1208, nRegVal|0x02);
+ }
+
+ if (nEnable)
+ {
+ nRegVal = RegGet16BitValue(0x1106); //bank:ana, addr:h0003
+ RegSet16BitValue(0x1106, nRegVal|0x03);
+ }
+ else
+ {
+ nRegVal = RegGet16BitValue(0x1106);
+ nRegVal = nRegVal & 0xFC;
+ RegSet16BitValue(0x1106, nRegVal);
+ }
+}
+
+static u16 _DrvMpTestItoTestMsg21xxaGetDataOut(s16 *pRawData)
+{
+ u32 i;
+ u16 szRawData[MAX_CHANNEL_NUM] = {0};
+ u16 nSensorNum;
+ u16 nRegInt;
+ u8 szDbBusTxData[8] = {0};
+ u8 szDbBusRxData[MAX_CHANNEL_NUM*2] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ nSensorNum = _DrvMpTestItoTestGetNum();
+
+ if ((nSensorNum*2) > (MAX_CHANNEL_NUM*2))
+ {
+ DBG("Danger. nSensorNum = %d\n", nSensorNum);
+ return nSensorNum;
+ }
+
+ nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1));
+ RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt & (u16)(~FIQ_E_FRAME_READY_MASK)));
+
+ _DrvMpTestItoTestPolling();
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x13; //bank:fir, addr:h0020
+ szDbBusTxData[2] = 0x40;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3);
+ mdelay(20);
+ IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSensorNum * 2));
+ mdelay(100);
+
+ for (i = 0; i < nSensorNum * 2; i ++)
+ {
+ DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]);
+ }
+
+ nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1));
+ RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt | (u16)FIQ_E_FRAME_READY_MASK));
+
+ for (i = 0; i < nSensorNum; i ++)
+ {
+ szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]);
+ pRawData[i] = (s16)szRawData[i];
+ }
+
+ return nSensorNum;
+}
+
+static void _DrvMpTestItoTestMsg21xxaSendDataIn(u8 nStep)
+{
+ u32 i;
+ u16 *pType = NULL;
+ u8 szDbBusTxData[512] = {0};
+
+ DBG("*** %s() nStep = %d ***\n", __func__, nStep);
+
+ if (nStep == 0) //39-4 (2R)
+ {
+ pType = &_gShort_4[0];
+ }
+ else if (nStep == 1) //39-1
+ {
+ pType = &_gShort_1[0];
+ }
+ else if (nStep == 2) //39-2
+ {
+ pType = &_gShort_2[0];
+ }
+ else if (nStep == 3) //39-3
+ {
+ pType = &_gShort_3[0];
+ }
+ else if (nStep == 4)
+ {
+ pType = &_gOpen1[0];
+ }
+ else if (nStep == 5)
+ {
+ pType = &_gOpen2[0];
+ }
+ else if (nStep == 6)
+ {
+ pType = &_gOpen3[0];
+ }
+ else if (nStep == 9)
+ {
+ pType = &_gOpen1B[0];
+ }
+ else if (nStep == 10)
+ {
+ pType = &_gOpen2B[0];
+ }
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x11; //bank:ana, addr:h0000
+ szDbBusTxData[2] = 0x00;
+ for (i = 0; i <= 0x3E ; i ++)
+ {
+ szDbBusTxData[3+2*i] = pType[i] & 0xFF;
+ szDbBusTxData[4+2*i] = (pType[i] >> 8) & 0xFF;
+ }
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+0x3F*2);
+
+ szDbBusTxData[2] = 0x7A * 2; //bank:ana, addr:h007a
+ for (i = 0x7A; i <= 0x7D ; i ++)
+ {
+ szDbBusTxData[3+2*(i-0x7A)] = 0;
+ szDbBusTxData[4+2*(i-0x7A)] = 0;
+ }
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+8);
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x12; //bank:ana2, addr:h0005
+
+ szDbBusTxData[2] = 0x05 * 2;
+ szDbBusTxData[3] = pType[128+0x05] & 0xFF;
+ szDbBusTxData[4] = (pType[128+0x05] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5);
+
+ szDbBusTxData[2] = 0x0B * 2; //bank:ana2, addr:h000b
+ szDbBusTxData[3] = pType[128+0x0B] & 0xFF;
+ szDbBusTxData[4] = (pType[128+0x0B] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5);
+
+ szDbBusTxData[2] = 0x12 * 2; //bank:ana2, addr:h0012
+ szDbBusTxData[3] = pType[128+0x12] & 0xFF;
+ szDbBusTxData[4] = (pType[128+0x12] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5);
+
+ szDbBusTxData[2] = 0x15 * 2; //bank:ana2, addr:h0015
+ szDbBusTxData[3] = pType[128+0x15] & 0xFF;
+ szDbBusTxData[4] = (pType[128+0x15] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5);
+/*
+//#if 1 //for AC mod --showlo
+ szDbBusTxData[1] = 0x13;
+ szDbBusTxData[2] = 0x12 * 2;
+ szDbBusTxData[3] = 0x30;
+ szDbBusTxData[4] = 0x30;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5);
+
+ szDbBusTxData[2] = 0x14 * 2;
+ szDbBusTxData[3] = 0X30;
+ szDbBusTxData[4] = 0X30;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5);
+
+ szDbBusTxData[1] = 0x12;
+ for (i = 0x0D; i <= 0x10; i ++) //for AC noise(++)
+ {
+ szDbBusTxData[2] = i * 2;
+ szDbBusTxData[3] = pType[128+i] & 0xFF;
+ szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5);
+ }
+
+ for (i = 0x16; i <= 0x18; i ++) //for AC noise
+ {
+ szDbBusTxData[2] = i * 2;
+ szDbBusTxData[3] = pType[128+i] & 0xFF;
+ szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5);
+ }
+//#endif
+*/
+}
+
+static void _DrvMpTestItoOpenTestMsg21xxaSetC(u8 nCSubStep)
+{
+ u32 i;
+ u8 szDbBusTxData[MAX_CHANNEL_NUM+3];
+ u8 nHighLevelCSub = false;
+ u8 nCSubNew;
+
+ DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep);
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x11; //bank:ana, addr:h0042
+ szDbBusTxData[2] = 0x84;
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nCSubNew = nCSubStep;
+ nHighLevelCSub = false;
+
+ if (nCSubNew > 0x1F)
+ {
+ nCSubNew = nCSubNew - 0x14;
+ nHighLevelCSub = true;
+ }
+
+ szDbBusTxData[3+i] = nCSubNew & 0x1F;
+ if (nHighLevelCSub == true)
+ {
+ szDbBusTxData[3+i] |= BIT5;
+ }
+ }
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3);
+
+ szDbBusTxData[2] = 0xB4; //bank:ana, addr:h005a
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3);
+}
+
+static void _DrvMpTestItoOpenTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag)
+{
+ u32 i, j;
+ s16 szTmpRawData[MAX_CHANNEL_NUM] = {0};
+ u16 nRegVal;
+ u8 nLoop;
+ u8 nSensorNum1 = 0, nSensorNum2 = 0, nTotalSensor = 0;
+ u8 *pMapping = NULL;
+
+// nSensorNum1 = 0;
+// nSensorNum2 = 0;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+
+ RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012
+ RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015
+ RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073
+ RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074
+
+ if (nItemId == 40)
+ {
+ pMapping = &_gMAP1[0];
+ if (_gIsEnable2R)
+ {
+ nTotalSensor = _gItoTestTriangleNum/2;
+ }
+ else
+ {
+ nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum;
+ }
+ }
+ else if (nItemId == 41)
+ {
+ pMapping = &_gMAP2[0];
+ if (_gIsEnable2R)
+ {
+ nTotalSensor = _gItoTestTriangleNum/2;
+ }
+ else
+ {
+ nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum;
+ }
+ }
+ else if (nItemId == 42)
+ {
+ pMapping = &_gMAP3[0];
+ nTotalSensor = _gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum;
+ }
+
+ nLoop = 1;
+ if (nItemId != 42)
+ {
+ if (nTotalSensor > 11)
+ {
+ nLoop = 2;
+ }
+ }
+
+ DBG("nLoop = %d\n", nLoop);
+
+ for (i = 0; i < nLoop; i ++)
+ {
+ if (i == 0)
+ {
+ _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId - 36);
+ }
+ else
+ {
+ if (nItemId == 40)
+ {
+ _DrvMpTestItoTestMsg21xxaSendDataIn(9);
+ }
+ else
+ {
+ _DrvMpTestItoTestMsg21xxaSendDataIn(10);
+ }
+ }
+
+ _DrvMpTestItoTestDisableFilterNoiseDetect();
+
+ _DrvMpTestItoOpenTestSetV(1, 0);
+ nRegVal = RegGet16BitValue(0x110E); //bank:ana, addr:h0007
+ RegSet16BitValue(0x110E, nRegVal | BIT11);
+
+ if (_gLTP == 1)
+ {
+ _DrvMpTestItoOpenTestMsg21xxaSetC(32);
+ }
+ else
+ {
+ _DrvMpTestItoOpenTestMsg21xxaSetC(0);
+ }
+
+ _DrvMpTestItoTestSwReset();
+
+ if (i == 0)
+ {
+ nSensorNum1 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData);
+ DBG("nSensorNum1 = %d\n", nSensorNum1);
+ }
+ else
+ {
+ nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(&szTmpRawData[nSensorNum1]);
+ DBG("nSensorNum1 = %d, nSensorNum2 = %d\n", nSensorNum1, nSensorNum2);
+ }
+ }
+
+ for (j = 0; j < nTotalSensor; j ++)
+ {
+ if (_gLTP == 1)
+ {
+ pRawData[pMapping[j]] = szTmpRawData[j] + 4096;
+ pDataFlag[pMapping[j]] = 1;
+ }
+ else
+ {
+ pRawData[pMapping[j]] = szTmpRawData[j];
+ pDataFlag[pMapping[j]] = 1;
+ }
+ }
+}
+
+static void _DrvMpTestItoShortTestChangeGPOSetting(u8 nItemId)
+{
+ u8 szDbBusTxData[3+GPO_SETTING_SIZE*2] = {0};
+ u16 szGPOSetting[3] = {0};
+ u32 i;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ if (nItemId == 0) // 39-4
+ {
+ szGPOSetting[0] = _gShort_4_GPO[0];
+ szGPOSetting[1] = _gShort_4_GPO[1];
+ szGPOSetting[2] = _gShort_4_GPO[2];
+ szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16));
+ }
+ else if (nItemId == 1) // 39-1
+ {
+ szGPOSetting[0] = _gShort_1_GPO[0];
+ szGPOSetting[1] = _gShort_1_GPO[1];
+ szGPOSetting[2] = _gShort_1_GPO[2];
+ szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16));
+ }
+ else if (nItemId == 2) // 39-2
+ {
+ szGPOSetting[0] = _gShort_2_GPO[0];
+ szGPOSetting[1] = _gShort_2_GPO[1];
+ szGPOSetting[2] = _gShort_2_GPO[2];
+ szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16));
+ }
+ else if (nItemId == 3) // 39-3
+ {
+ szGPOSetting[0] = _gShort_3_GPO[0];
+ szGPOSetting[1] = _gShort_3_GPO[1];
+ szGPOSetting[2] = _gShort_3_GPO[2];
+ szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16));
+ }
+ else
+ {
+ DBG("Invalid item id for changing GPIO setting of short test.\n");
+
+ return;
+ }
+
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x12;
+ szDbBusTxData[2] = 0x48;
+
+ for (i = 0; i < GPO_SETTING_SIZE; i ++)
+ {
+ szDbBusTxData[3+2*i] = szGPOSetting[i] & 0xFF;
+ szDbBusTxData[4+2*i] = (szGPOSetting[i] >> 8) & 0xFF;
+ }
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+GPO_SETTING_SIZE*2);
+}
+
+static void _DrvMpTestItoShortTestChangeRmodeSetting(u8 nMode)
+{
+ u8 szDbBusTxData[6] = {0};
+
+ DBG("*** %s() nMode = %d ***\n", __func__, nMode);
+
+ // AFE R-mode enable(Bit-12)
+ RegSetLByteValue(0x1103, 0x10);
+
+ // drv_mux_OV (Bit-8 1:enable)
+ RegSetLByteValue(0x1107, 0x55);
+
+ if (nMode == 1) // P_CODE: 0V
+ {
+ RegSet16BitValue(0x110E, 0x073A);
+ }
+ else if (nMode == 0) // N_CODE: 2.4V
+ {
+ RegSet16BitValue(0x110E, 0x073B);
+ }
+
+ // SW2 rising & SW3 rising return to 0
+ RegSetLByteValue(0x1227, 0x01);
+ // turn off the chopping
+ RegSetLByteValue(0x1208, 0x0C);
+ // idle driver ov
+ RegSetLByteValue(0x1241, 0xC0);
+
+ // AFE ov
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x12;
+ szDbBusTxData[2] = 0x44;
+ szDbBusTxData[3] = 0xFF;
+ szDbBusTxData[4] = 0xFF;
+ szDbBusTxData[5] = 0xFF;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 6);
+}
+
+static void _DrvMpTestItoShortTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag)
+{
+ u32 i;
+ s16 szTmpRawData[MAX_CHANNEL_NUM] = {0};
+ s16 szTmpRawData2[MAX_CHANNEL_NUM] = {0};
+ u8 nSensorNum, nSensorNum2, nNumOfSensorMapping1, nNumOfSensorMapping2, nSensorCount = 0;
+ u8 *pMapping = NULL;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+ // chip top op0
+ RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012
+ RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015
+ RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073
+ RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074
+
+ if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0)
+ {
+ nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1;
+ nNumOfSensorMapping2 = nNumOfSensorMapping1;
+ }
+ else
+ {
+ nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2;
+ nNumOfSensorMapping2 = nNumOfSensorMapping1;
+ if (nNumOfSensorMapping2 % 2 != 0)
+ {
+ nNumOfSensorMapping2 ++;
+ }
+ }
+
+ if (nItemId == 0) // 39-4 (2R)
+ {
+ pMapping = &_gSHORT_MAP4[0];
+ nSensorCount = _gItoTestTriangleNum/2;
+ }
+ else if (nItemId == 1) // 39-1
+ {
+ pMapping = &_gSHORT_MAP1[0];
+ nSensorCount = nNumOfSensorMapping1;
+ }
+ else if (nItemId == 2) // 39-2
+ {
+ pMapping = &_gSHORT_MAP2[0];
+ nSensorCount = nNumOfSensorMapping2;
+ }
+ else if (nItemId == 3) // 39-3
+ {
+ pMapping = &_gSHORT_MAP3[0];
+ nSensorCount = _gItoTestTriangleNum;
+ }
+ DBG("nSensorCount = %d\n", nSensorCount);
+
+ _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId);
+
+ _DrvMpTestItoTestDisableFilterNoiseDetect();
+
+ _DrvMpTestItoShortTestChangeRmodeSetting(1);
+ _DrvMpTestItoShortTestChangeGPOSetting(nItemId);
+ _DrvMpTestItoTestSwReset();
+ nSensorNum = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData);
+ DBG("nSensorNum = %d\n", nSensorNum);
+
+ _DrvMpTestItoShortTestChangeRmodeSetting(0);
+ _DrvMpTestItoShortTestChangeGPOSetting(nItemId);
+ _DrvMpTestItoTestSwReset();
+ nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData2);
+ DBG("nSensorNum2 = %d\n", nSensorNum2);
+
+ for (i = 0; i < nSensorCount; i ++)
+ {
+ pRawData[pMapping[i]] = szTmpRawData[i] - szTmpRawData2[i];
+ pDataFlag[pMapping[i]] = 1;
+ }
+}
+
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+
+static u16 _DrvMpTestItoTestMsg22xxGetDataOut(s16 *pRawData, u16 nSubFrameNum)
+{
+ u32 i;
+ u16 szRawData[MAX_CHANNEL_NUM*2] = {0};
+ u16 nRegInt = 0x0000;
+ u16 nSize = nSubFrameNum * 4;
+ u8 szDbBusTxData[8] = {0};
+ u8 szDbBusRxData[MAX_CHANNEL_NUM*4] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ RegSet16BitValueOff(0x120A, BIT1); //one-shot mode
+ RegSet16BitValueOff(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK
+ //RegSet16BitValueOn(0x130C, BIT15); //MCU read done
+ RegSet16BitValueOn(0x120A, BIT0); //trigger one-shot
+
+ DBG("polling start\n");
+
+ do
+ {
+ nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c
+ } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000);
+
+ DBG("polling end\n");
+
+ RegSet16BitValueOff(0x3D18, BIT8); //Clear frame-ready interrupt status
+
+ //ReadRegBurst start
+ szDbBusTxData[0] = 0x10;
+ szDbBusTxData[1] = 0x15; //bank:fir, addr:h0000
+ szDbBusTxData[2] = 0x00;
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3);
+ mdelay(20);
+// IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (MAX_CHANNEL_NUM * 4));
+ IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSubFrameNum * 4 * 2));
+ mdelay(100);
+
+// for (i = 0; i < (MAX_CHANNEL_NUM * 4); i ++)
+ for (i = 0; i < (nSubFrameNum * 4 * 2); i ++)
+ {
+ DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]);
+ }
+ //ReadRegBurst stop
+
+ RegSet16BitValueOn(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK
+
+// for (i = 0; i < (MAX_CHANNEL_NUM * 2); i ++)
+ for (i = 0; i < nSize; i ++)
+ {
+ szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]);
+ pRawData[i] = (s16)szRawData[i];
+ }
+
+// return (MAX_CHANNEL_NUM * 2);
+ return nSize;
+}
+
+static void _DrvMpTestItoTestMsg22xxSendDataIn(u8 nStep, u16 nSubFrameNum)
+{
+ u32 i;
+ u32 *pType = NULL;
+ u16 nRiuWriteLength = nSubFrameNum * 6;
+
+ DBG("*** %s() nStep = %d, nSubFrameNum = %d ***\n", __func__, nStep, nSubFrameNum);
+
+ if (nStep == 0) //39-4 (2R)
+ {
+ pType = &_gShort_RIU4[0];
+ }
+ else if (nStep == 1) //39-1
+ {
+ pType = &_gShort_RIU1[0];
+ }
+ else if (nStep == 2) //39-2
+ {
+ pType = &_gShort_RIU2[0];
+ }
+ else if (nStep == 3) //39-3
+ {
+ pType = &_gShort_RIU3[0];
+ }
+ else if (nStep == 4)
+ {
+ pType = &_gOpenRIU1[0];
+ }
+ else if (nStep == 5)
+ {
+ pType = &_gOpenRIU2[0];
+ }
+ else if (nStep == 6)
+ {
+ pType = &_gOpenRIU3[0];
+ }
+
+ RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock
+ RegSet16BitValueOff(0x1192, BIT5); // mem clk sel
+ RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst
+ RegSet16BitValue(0x1180, RIU_BASE_ADDR); // sensor mux sram read/write base address
+ RegSet16BitValue(0x1182, nRiuWriteLength); // sensor mux sram write length
+ RegSet16BitValueOn(0x1188, BIT0); // reg_mem0_w_start
+
+ for (i = RIU_BASE_ADDR; i < (RIU_BASE_ADDR + nRiuWriteLength); i ++)
+ {
+ RegSet16BitValue(0x118A, (u16)(pType[i]));
+ RegSet16BitValue(0x118C, (u16)(pType[i] >> 16));
+ }
+}
+
+static void _DrvMpTestItoTestMsg22xxSetC(u8 nCSubStep)
+{
+ u32 i;
+ u16 nCSubNew, nRegVal;
+
+ DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep);
+
+ nCSubNew = (nCSubStep > CSUB_REF_MAX) ? CSUB_REF_MAX : nCSubStep; // 6 bits
+ nCSubNew = (nCSubNew | (nCSubNew << 8));
+
+ nRegVal = RegGet16BitValue(0x11C8); // csub sel overwrite enable, will referance value of 11C0
+
+ if (nRegVal == 0x000F)
+ {
+ RegSet16BitValue(0x11C0, nCSubNew);
+ }
+ else
+ {
+ RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock
+ RegSet16BitValueOff(0x1192, BIT5); // mem clk sel
+ RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst
+ RegSet16BitValue(0x1184, 0); // nAddr
+ RegSet16BitValue(0x1186, MAX_CHANNEL_NUM); // nLen
+ RegSet16BitValueOn(0x1188, BIT2); // reg_mem0_w_start
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ RegSet16BitValue( 0x118E, nCSubNew);
+ RegSet16BitValue( 0x1190, nCSubNew);
+ }
+ }
+}
+
+static void _DrvMpTestItoTestMsg22xxRegReset(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ RegSet16BitValueOn(0x1102, (BIT3 | BIT4 | BIT5 | BIT6 | BIT7));
+ RegSet16BitValueOff(0x1130, (BIT0 | BIT1 | BIT2 | BIT3 | BIT8));
+
+ RegSet16BitValueOn(0x1112, BIT15);
+ RegSet16BitValueOff(0x1112, BIT13);
+
+ RegSet16BitValueOn(0x1250, ((5 << 0) & 0x007F));
+ RegSet16BitValueOn(0x1250, ((1 << 8) & 0x7F00));
+ RegSet16BitValueOff(0x1250, 0x8080);
+
+ RegSet16BitValueOff(0x1312, (BIT12 | BIT14));
+
+ RegSet16BitValueOn(0x1300, BIT15);
+ RegSet16BitValueOff(0x1300, (BIT10 | BIT11 | BIT12 | BIT13 | BIT14));
+
+ RegSet16BitValueOn(0x1130, BIT9);
+
+ RegSet16BitValueOn(0x1318, (BIT12 | BIT13));
+
+ //RegSet16BitValue(0x121A, ((8 - 1) & 0x01FF)); // sampling number group A
+ RegSet16BitValue(0x121C, ((8 - 1) & 0x01FF)); // sampling number group B
+ RegSet16BitValueOn(0x131A, 0x2000);
+ RegSet16BitValueOn(0x131C, BIT9);
+ RegSet16BitValueOff(0x131C, (BIT8 | BIT10));
+
+
+ RegSet16BitValueOff(0x1174, 0x0F00);
+
+ RegSet16BitValue(0x1240, 0x0000); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense
+ RegSet16BitValue(0x1242, 0x0000); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense
+
+ RegSet16BitValue(0x1212, 0xFFFF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B
+ RegSet16BitValue(0x1214, 0x00FF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B
+ //RegSet16BitValue( 0x1212, 0); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B
+ //RegSet16BitValue( 0x1214, 0); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B
+
+ RegSet16BitValue(0x121E, 0xFFFF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B
+ RegSet16BitValue(0x1220, 0x00FF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B
+ //RegSet16BitValue( 0x121E, 0); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B
+ //RegSet16BitValue( 0x1220, 0); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B
+
+ RegSet16BitValue(0x120E, 0x0); // noise sense mode selection for total 24 subframes
+ RegSet16BitValue(0x1210, 0x0); // noise sense mode selection for total 24 subframes
+
+ RegSet16BitValue(0x128C, 0x0F); // ADC afe gain correction bypass
+ mdelay(50);
+}
+
+static void _DrvMpTestItoTestMsg22xxGetChargeDumpTime(u16 nMode, u16 *pChargeTime, u16 *pDumpTime)
+{
+ u16 nChargeTime = 0, nDumpTime = 0;
+ u16 nMinChargeTime = 0xFFFF, nMinDumpTime = 0xFFFF, nMaxChargeTime = 0x0000, nMaxDumpTime = 0x0000;
+
+ DBG("*** %s() ***\n", __func__);
+
+ nChargeTime = RegGet16BitValue(0x1226);
+ nDumpTime = RegGet16BitValue(0x122A);
+
+ if (nMinChargeTime > nChargeTime)
+ {
+ nMinChargeTime = nChargeTime;
+ }
+
+ if (nMaxChargeTime < nChargeTime)
+ {
+ nMaxChargeTime = nChargeTime;
+ }
+
+ if (nMinDumpTime > nDumpTime)
+ {
+ nMinDumpTime = nDumpTime;
+ }
+
+ if (nMaxDumpTime < nDumpTime)
+ {
+ nMaxDumpTime = nDumpTime;
+ }
+
+ DBG("nChargeTime = %d, nDumpTime = %d\n", nChargeTime, nDumpTime);
+
+ if (nMode == 1)
+ {
+ *pChargeTime = nMaxChargeTime;
+ *pDumpTime = nMaxDumpTime;
+ }
+ else
+ {
+ *pChargeTime = nMinChargeTime;
+ *pDumpTime = nMinDumpTime;
+ }
+}
+
+static void _DrvMpTestItoOpenTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag)
+{
+ u32 i;
+ s16 szTmpRawData[MAX_CHANNEL_NUM*2] = {0};
+ u16 nSubFrameNum = 0;
+ u16 nChargeTime, nDumpTime;
+ u8 *pMapping = NULL;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+
+ _DrvMpTestItoTestMsg22xxRegReset();
+
+ switch (nItemId)
+ {
+ case 40:
+ pMapping = &_gMAP1[0];
+ nSubFrameNum = _gOpenSubFrameNum1;
+ break;
+ case 41:
+ pMapping = &_gMAP2[0];
+ nSubFrameNum = _gOpenSubFrameNum2;
+ break;
+ case 42:
+ pMapping = &_gMAP3[0];
+ nSubFrameNum = _gOpenSubFrameNum3;
+ break;
+ }
+
+ if (nSubFrameNum > 24) // MAX_CHANNEL_NUM/2
+ {
+ nSubFrameNum = 24;
+ }
+
+
+ _DrvMpTestItoTestMsg22xxSendDataIn(nItemId - 36, nSubFrameNum * 6);
+
+ if (true)
+ {
+ RegSet16BitValue(0x1110, 0x0060); //2.4V -> 1.2V
+ }
+ else
+ {
+ RegSet16BitValue(0x1110, 0x0020); //3.0V -> 0.6V
+ }
+
+ RegSet16BitValue(0x11C8, 0x000F); //csub sel overwrite enable, will referance value of 11C0
+ RegSet16BitValue(0x1174, 0x0F06); // 1 : sel idel driver for sensor pad that connected to AFE
+ RegSet16BitValue(0x1208, 0x0006); //PRS1
+ RegSet16BitValue(0x1240, 0xFFFF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense
+ RegSet16BitValue(0x1242, 0x00FF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense
+ RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe
+
+ _DrvMpTestItoTestMsg22xxGetChargeDumpTime(1, &nChargeTime, &nDumpTime);
+
+ RegSet16BitValue(0x1226, nChargeTime);
+ RegSet16BitValue(0x122A, nDumpTime);
+
+ _DrvMpTestItoTestMsg22xxSetC(CSUB_REF);
+ _DrvMpTestItoTestSwReset();
+ _DrvMpTestItoTestMsg22xxGetDataOut(szTmpRawData, nSubFrameNum);
+
+// for (i = 0; i < (MAX_CHANNEL_NUM/2) ; i ++)
+ for (i = 0; i < nSubFrameNum ; i ++)
+ {
+// DBG("szTmpRawData[%d * 4] >> 3 = %d\n", i, szTmpRawData[i * 4] >> 3); // add for debug
+// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug
+
+ pRawData[pMapping[i]] = (szTmpRawData[i * 4] >> 3); // Filter to ADC
+ pDataFlag[pMapping[i]] = 1;
+ }
+}
+
+static void _DrvMpTestItoShortTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag)
+{
+ u32 i, j;
+ s16 szRawData[MAX_CHANNEL_NUM*2] = {0};
+ s16 szTmpRawData[MAX_CHANNEL_NUM*2] = {0};
+ u16 nSensorNum = 0, nSubFrameNum = 0;
+ u8 *pMapping = NULL;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+
+ _DrvMpTestItoTestMsg22xxRegReset();
+
+ switch(nItemId)
+ {
+ case 0: // 39-4 (2R)
+ pMapping = &_gSHORT_MAP4[0];
+ nSensorNum = _gShortSubFrameNum4;
+ break;
+ case 1: // 39-1
+ pMapping = &_gSHORT_MAP1[0];
+ nSensorNum = _gShortSubFrameNum1;
+ break;
+ case 2: // 39-2
+ pMapping = &_gSHORT_MAP2[0];
+ nSensorNum = _gShortSubFrameNum2;
+ break;
+ case 3: // 39-3
+ pMapping = &_gSHORT_MAP3[0];
+ nSensorNum = _gShortSubFrameNum3;
+ break;
+ }
+
+ if (nSensorNum > 24) // MAX_CHANNEL_NUM/2
+ {
+ nSubFrameNum = 24;
+ }
+ else
+ {
+ nSubFrameNum = nSensorNum;
+ }
+
+ _DrvMpTestItoTestMsg22xxSendDataIn(nItemId, nSubFrameNum * 6);
+
+
+ //RegSet16BitValue(0x1110, 0x0030); // [6:4} 011 : 2.1V -> 1.5V
+ RegSet16BitValue(0x1110, 0x0060); // 2.4V -> 1.2V
+ RegSet16BitValue(0x11C8, 0x000F); // csub sel overwrite enable, will referance value of 11C0
+ RegSet16BitValue(0x1174, 0x0006); // [11:8] 000 : sel active driver for sensor pad that connected to AFE
+ RegSet16BitValue(0x1208, 0x0006); // PRS1
+ RegSet16BitValueOn(0x1104, BIT14); // R mode
+ RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe
+ RegSet16BitValue(0x1176, 0x0000); // CFB 10p
+ RegSet16BitValue(0x1226, 0x000B); // Charge 4ns
+ RegSet16BitValue(0x122A, 0x000B); // Dump 4ns
+
+
+ _DrvMpTestItoTestMsg22xxSetC(CSUB_REF);
+ _DrvMpTestItoTestSwReset();
+ _DrvMpTestItoTestMsg22xxGetDataOut(szTmpRawData, nSubFrameNum);
+
+ if (nSensorNum > 24)
+ {
+ j = 0;
+
+// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++)
+ for (i = 0; i < nSubFrameNum; i ++)
+ {
+ szRawData[j] = (szTmpRawData[i * 4] >> 2);
+ j ++;
+
+ if ((nSensorNum - 24) > i)
+ {
+ szRawData[j] = (szTmpRawData[i * 4 + 1] >> 2);
+ j ++;
+ }
+ }
+
+// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++)
+ for (i = 0; i < nSubFrameNum; i ++)
+ {
+// DBG("szRawData[%d] = %d\n", i, szRawData[i]); // add for debug
+// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug
+
+ pRawData[pMapping[i]] = szRawData[i];
+ pDataFlag[pMapping[i]] = 1;
+ }
+ }
+ else
+ {
+// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++)
+ for (i = 0; i < nSubFrameNum; i ++)
+ {
+// DBG("szTmpRawData[%d * 4] >> 2 = %d\n", i, szTmpRawData[i * 4] >> 2); // add for debug
+// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug
+
+ pRawData[pMapping[i]] = (szTmpRawData[i * 4] >> 2);
+ pDataFlag[pMapping[i]] = 1;
+ }
+ }
+}
+
+#endif
+
+//------------------------------------------------------------------------------//
+
+static ItoTestResult_e _DrvMpTestItoOpenTestSecond(u8 nItemId)
+{
+ ItoTestResult_e nRetVal = ITO_TEST_OK;
+ u32 i;
+ s32 nTmpRawDataJg1 = 0;
+ s32 nTmpRawDataJg2 = 0;
+ s32 nTmpJgAvgThMax1 = 0;
+ s32 nTmpJgAvgThMin1 = 0;
+ s32 nTmpJgAvgThMax2 = 0;
+ s32 nTmpJgAvgThMin2 = 0;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ if (nItemId == 40)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++)
+ {
+ nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]];
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]];
+ }
+ }
+ else if (nItemId == 41)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++)
+ {
+ nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]];
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]];
+ }
+ }
+
+ nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2 ) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+
+ DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2);
+
+ if (nItemId == 40)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++)
+ {
+ if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ else if (nItemId == 41)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++)
+ {
+ if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+
+ return nRetVal;
+}
+
+static ItoTestResult_e _DrvMpTestItoOpenTestSecond2r(u8 nItemId)
+{
+ ItoTestResult_e nRetVal = ITO_TEST_OK;
+ u32 i;
+ s32 nTmpRawDataJg1 = 0;
+ s32 nTmpRawDataJg2 = 0;
+ s32 nTmpRawDataJg3 = 0;
+ s32 nTmpRawDataJg4 = 0;
+ s32 nTmpJgAvgThMax1 = 0;
+ s32 nTmpJgAvgThMin1 = 0;
+ s32 nTmpJgAvgThMax2 = 0;
+ s32 nTmpJgAvgThMin2 = 0;
+ s32 nTmpJgAvgThMax3 = 0;
+ s32 nTmpJgAvgThMin3 = 0;
+ s32 nTmpJgAvgThMax4 = 0;
+ s32 nTmpJgAvgThMin4 = 0;
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+ if (nItemId == 40)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]]; //first region: non-border
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]]; //first region: border
+ }
+
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ nTmpRawDataJg3 += _gRawData1[_gMAP40_3[i]]; //second region: non-border
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg4 += _gRawData1[_gMAP40_4[i]]; //second region: border
+ }
+ }
+ else if (nItemId == 41)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]]; //first region: non-border
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]]; //first region: border
+ }
+
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ nTmpRawDataJg3 += _gRawData2[_gMAP41_3[i]]; //second region: non-border
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ nTmpRawDataJg4 += _gRawData2[_gMAP41_4[i]]; //second region: border
+ }
+ }
+
+ nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMax3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMax4 = (nTmpRawDataJg4 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+ nTmpJgAvgThMin4 = (nTmpRawDataJg4 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100;
+
+ DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2);
+ DBG("nTmpRawDataJg3 = %d, nTmpJgAvgThMax3 = %d, nTmpJgAvgThMin3 = %d, nTmpRawDataJg4 = %d, nTmpJgAvgThMax4 = %d, nTmpJgAvgThMin4 = %d\n", nTmpRawDataJg3, nTmpJgAvgThMax3, nTmpJgAvgThMin3, nTmpRawDataJg4, nTmpJgAvgThMax4, nTmpJgAvgThMin4);
+
+ if (nItemId == 40)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ if (_gRawData1[_gMAP40_3[i]] > nTmpJgAvgThMax3 || _gRawData1[_gMAP40_3[i]] < nTmpJgAvgThMin3)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_3[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData1[_gMAP40_4[i]] > nTmpJgAvgThMax4 || _gRawData1[_gMAP40_4[i]] < nTmpJgAvgThMin4)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_4[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ else if (nItemId == 41)
+ {
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++)
+ {
+ if (_gRawData2[_gMAP41_3[i]] > nTmpJgAvgThMax3 || _gRawData2[_gMAP41_3[i]] < nTmpJgAvgThMin3)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_3[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+
+ for (i = 0; i < 2; i ++)
+ {
+ if (_gRawData2[_gMAP41_4[i]] > nTmpJgAvgThMax4 || _gRawData2[_gMAP41_4[i]] < nTmpJgAvgThMin4)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_4[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+
+ return nRetVal;
+}
+
+static ItoTestResult_e _DrvMpTestItoShortTestSecond(u8 nItemId)
+{
+ ItoTestResult_e nRetVal = ITO_TEST_OK;
+ u32 i;
+ u8 nSensorCount = 0;
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ u8 nNumOfSensorMapping1, nNumOfSensorMapping2;
+#endif //CONFIG_ENABLE_CHIP_MSG21XXA
+
+ DBG("*** %s() nItemId = %d ***\n", __func__, nItemId);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0)
+ {
+ nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1;
+ nNumOfSensorMapping2 = nNumOfSensorMapping1;
+ }
+ else
+ {
+ nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2;
+ nNumOfSensorMapping2 = nNumOfSensorMapping1;
+ if (nNumOfSensorMapping2 % 2 != 0)
+ {
+ nNumOfSensorMapping2 ++;
+ }
+ }
+#endif //CONFIG_ENABLE_CHIP_MSG21XXA
+
+ if (nItemId == 0) // 39-4 (2R)
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ nSensorCount = _gItoTestTriangleNum/2;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ nSensorCount = _gShortSubFrameNum4;
+#endif
+ for (i = 0; i < nSensorCount; i ++)
+ {
+ if (_gRawData4[_gSHORT_MAP4[i]] > SHORT_TEST_THRESHOLD)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP4[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ else if (nItemId == 1) // 39-1
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ nSensorCount = nNumOfSensorMapping1;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ nSensorCount = _gShortSubFrameNum1;
+#endif
+ for (i = 0; i < nSensorCount; i ++)
+ {
+ if (_gRawData1[_gSHORT_MAP1[i]] > SHORT_TEST_THRESHOLD)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP1[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ else if (nItemId == 2) // 39-2
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ nSensorCount = nNumOfSensorMapping2;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ nSensorCount = _gShortSubFrameNum2;
+#endif
+ for (i = 0; i < nSensorCount; i ++)
+ {
+ if (_gRawData2[_gSHORT_MAP2[i]] > SHORT_TEST_THRESHOLD)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP2[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ else if (nItemId == 3) // 39-3
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ nSensorCount = _gItoTestTriangleNum;
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ nSensorCount = _gShortSubFrameNum3;
+#endif
+ for (i = 0; i < nSensorCount; i ++)
+ {
+ if (_gRawData3[_gSHORT_MAP3[i]] > SHORT_TEST_THRESHOLD)
+ {
+ _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP3[i];
+ _gTestFailChannelCount ++;
+ nRetVal = ITO_TEST_FAIL;
+ }
+ }
+ }
+ DBG("nSensorCount = %d\n", nSensorCount);
+
+ return nRetVal;
+}
+
+s32 _DrvMpTestItoOpenTest(void)
+{
+ ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK;
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ DBG("open test start\n");
+
+ DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ
+
+ DrvPlatformLyrDisableFingerTouchReport();
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ if (!_DrvMpTestItoTestChooseTpType())
+ {
+ DBG("Choose Tp Type failed\n");
+ nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR;
+ goto ITO_TEST_END;
+ }
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030
+
+ mdelay(50);
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ _gRawData1[i] = 0;
+ _gRawData2[i] = 0;
+ _gRawData3[i] = 0;
+ _gDataFlag1[i] = 0;
+ _gDataFlag2[i] = 0;
+ _gDataFlag3[i] = 0;
+ }
+
+ _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoOpenTestMsg21xxaFirst(40, _gRawData1, _gDataFlag1);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoOpenTestMsg22xxFirst(40, _gRawData1, _gDataFlag1);
+#endif
+
+ if (_gIsEnable2R)
+ {
+ nRetVal2 = _DrvMpTestItoOpenTestSecond2r(40);
+ }
+ else
+ {
+ nRetVal2 = _DrvMpTestItoOpenTestSecond(40);
+ }
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoOpenTestMsg21xxaFirst(41, _gRawData2, _gDataFlag2);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoOpenTestMsg22xxFirst(41, _gRawData2, _gDataFlag2);
+#endif
+
+ if (_gIsEnable2R)
+ {
+ nRetVal3 = _DrvMpTestItoOpenTestSecond2r(41);
+ }
+ else
+ {
+ nRetVal3 = _DrvMpTestItoOpenTestSecond(41);
+ }
+/*
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoOpenTestMsg21xxaFirst(42, _gRawData3, _gDataFlag3);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoOpenTestMsg22xxFirst(42, _gRawData3, _gDataFlag3);
+#endif
+*/
+
+ ITO_TEST_END:
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ DBG("open test end\n");
+
+ if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK))
+ {
+ return ITO_TEST_GET_TP_TYPE_ERROR;
+ }
+ else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK)))
+ {
+ return ITO_TEST_FAIL;
+ }
+ else
+ {
+ return ITO_TEST_OK;
+ }
+}
+
+static ItoTestResult_e _DrvMpTestItoShortTest(void)
+{
+ ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK, nRetVal4 = ITO_TEST_OK, nRetVal5 = ITO_TEST_OK;
+ u32 i = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaAlloc();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ DBG("short test start\n");
+
+ DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ
+
+ DrvPlatformLyrDisableFingerTouchReport();
+ DrvPlatformLyrTouchDeviceResetHw();
+
+ if (!_DrvMpTestItoTestChooseTpType())
+ {
+ DBG("Choose Tp Type failed\n");
+ nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR;
+ goto ITO_TEST_END;
+ }
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(100);
+
+ // Stop cpu
+ RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073
+
+ // Stop watchdog
+ RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030
+
+ mdelay(50);
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ _gRawData1[i] = 0;
+ _gRawData2[i] = 0;
+ _gRawData3[i] = 0;
+ _gRawData4[i] = 0;
+ _gDataFlag1[i] = 0;
+ _gDataFlag2[i] = 0;
+ _gDataFlag3[i] = 0;
+ _gDataFlag4[i] = 0;
+ }
+
+ _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoShortTestMsg21xxaFirst(1, _gRawData1, _gDataFlag1);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoShortTestMsg22xxFirst(1, _gRawData1, _gDataFlag1);
+#endif
+
+ nRetVal2 = _DrvMpTestItoShortTestSecond(1);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoShortTestMsg21xxaFirst(2, _gRawData2, _gDataFlag2);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoShortTestMsg22xxFirst(2, _gRawData2, _gDataFlag2);
+#endif
+
+ nRetVal3 = _DrvMpTestItoShortTestSecond(2);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoShortTestMsg21xxaFirst(3, _gRawData3, _gDataFlag3);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoShortTestMsg22xxFirst(3, _gRawData3, _gDataFlag3);
+#endif
+
+ nRetVal4 = _DrvMpTestItoShortTestSecond(3);
+
+ if (_gIsEnable2R)
+ {
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+ _DrvMpTestItoShortTestMsg21xxaFirst(0, _gRawData4, _gDataFlag4);
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ _DrvMpTestItoShortTestMsg22xxFirst(0, _gRawData4, _gDataFlag4);
+#endif
+
+ nRetVal5 = _DrvMpTestItoShortTestSecond(0);
+ }
+
+ ITO_TEST_END:
+#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+#ifdef CONFIG_ENABLE_DMA_IIC
+ DmaFree();
+#endif //CONFIG_ENABLE_DMA_IIC
+#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM
+
+ DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ
+
+ DrvPlatformLyrTouchDeviceResetHw();
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ DBG("short test end\n");
+
+ if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK) && (nRetVal4 == ITO_TEST_OK) && (nRetVal5 == ITO_TEST_OK))
+ {
+ return ITO_TEST_GET_TP_TYPE_ERROR;
+ }
+ else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK) || (nRetVal4 != ITO_TEST_OK) || (nRetVal5 != ITO_TEST_OK)))
+ {
+ return ITO_TEST_FAIL;
+ }
+ else
+ {
+ return ITO_TEST_OK;
+ }
+}
+
+/*
+static s32 DrvMpTestProcReadDebug(char *page, char **start, off_t off, int count, int *eof, void *data)
+{
+ s32 nCount = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ _gItoTestResult = _DrvMpTestItoOpenTest();
+
+ if (ITO_TEST_OK == _gItoTestResult)
+ {
+ DBG("ITO_TEST_OK");
+ }
+ else if (ITO_TEST_FAIL == _gItoTestResult)
+ {
+ DBG("ITO_TEST_FAIL");
+ }
+ else if (ITO_TEST_GET_TP_TYPE_ERROR == _gItoTestResult)
+ {
+ DBG("ITO_TEST_GET_TP_TYPE_ERROR");
+ }
+
+ *eof = 1;
+
+ return nCount;
+}
+
+static s32 DrvMpTestProcWriteDebug(struct file *file, const char *buffer, unsigned long count, void *data)
+{
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DBG("ito test result : %d", _gItoTestResult);
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ DBG("_gRawData1[%d]=%d\n", i, _gRawData1[i]);
+ }
+ mdelay(5);
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ DBG("_gRawData2[%d]=%d\n", i, _gRawData2[i]);
+ }
+ mdelay(5);
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ DBG("_gRawData3[%d]=%d;\n",i , _gRawData3[i]);
+ }
+ mdelay(5);
+
+ return count;
+}
+*/
+
+static void _DrvMpTestItoTestDoWork(struct work_struct *pWork)
+{
+ s32 nRetVal = ITO_TEST_OK;
+
+ DBG("*** %s() _gIsInMpTest = %d, _gTestRetryCount = %d ***\n", __func__, _gIsInMpTest, _gTestRetryCount);
+
+ if (_gItoTestMode == ITO_TEST_MODE_OPEN_TEST)
+ {
+ nRetVal = _DrvMpTestItoOpenTest();
+ }
+ else if (_gItoTestMode == ITO_TEST_MODE_SHORT_TEST)
+ {
+ nRetVal = _DrvMpTestItoShortTest();
+ }
+ else
+ {
+ DBG("*** Undefined Mp Test Mode = %d ***\n", _gItoTestMode);
+ return;
+ }
+
+ DBG("*** ctp mp test result = %d ***\n", nRetVal);
+
+ if (nRetVal == ITO_TEST_OK)
+ {
+ _gCtpMpTestStatus = ITO_TEST_OK;
+ _gIsInMpTest = 0;
+ DBG("mp test success\n");
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvFwCtrlRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ }
+ else
+ {
+ _gTestRetryCount --;
+ if (_gTestRetryCount > 0)
+ {
+ DBG("_gTestRetryCount = %d\n", _gTestRetryCount);
+ queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork);
+ }
+ else
+ {
+ if (nRetVal == ITO_TEST_FAIL)
+ {
+ _gCtpMpTestStatus = ITO_TEST_FAIL;
+ }
+ else if (nRetVal == ITO_TEST_GET_TP_TYPE_ERROR)
+ {
+ _gCtpMpTestStatus = ITO_TEST_GET_TP_TYPE_ERROR;
+ }
+ else
+ {
+ _gCtpMpTestStatus = ITO_TEST_UNDEFINED_ERROR;
+ }
+
+ _gIsInMpTest = 0;
+ DBG("mp test failed\n");
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvFwCtrlRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ }
+ }
+}
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+/*
+void DrvMpTestCreateProcEntry(void)
+{
+ _gMsgItoTest = proc_mkdir(PROC_MSG_ITO_TEST, NULL);
+ _gDebug = create_proc_entry(PROC_ITO_TEST_DEBUG, 0777, _gMsgItoTest);
+
+ if (NULL == _gDebug)
+ {
+ DBG("create_proc_entry PROC_ITO_TEST_DEBUG FAIL\n");
+ }
+ else
+ {
+ _gDebug->read_proc = DrvMpTestProcReadDebug;
+ _gDebug->write_proc = DrvMpTestProcWriteDebug;
+ DBG("create_proc_entry PROC_ITO_TEST_DEBUG OK\n");
+ }
+}
+*/
+
+s32 DrvMpTestGetTestResult(void)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("_gCtpMpTestStatus = %d\n", _gCtpMpTestStatus);
+
+ return _gCtpMpTestStatus;
+}
+
+void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount)
+{
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+ DBG("_gTestFailChannelCount = %d\n", _gTestFailChannelCount);
+
+ for (i = 0; i < _gTestFailChannelCount; i ++)
+ {
+ pFailChannel[i] = _gTestFailChannel[i];
+ }
+
+ *pFailChannelCount = _gTestFailChannelCount;
+}
+
+void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength)
+{
+ u32 i;
+ u8 nHighByte, nLowByte;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (eItoTestMode == ITO_TEST_MODE_OPEN_TEST)
+ {
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData1[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData1[i]) & 0xFF;
+
+ if (_gDataFlag1[i] == 1)
+ {
+ pDataLog[i*4] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData1[i] >= 0)
+ {
+ pDataLog[i*4+1] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[i*4+1] = 1; // - : a negative number
+ }
+
+ pDataLog[i*4+2] = nHighByte;
+ pDataLog[i*4+3] = nLowByte;
+ }
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData2[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData2[i]) & 0xFF;
+
+ if (_gDataFlag2[i] == 1)
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData2[i] >= 0)
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number
+ }
+
+ pDataLog[(i*4+2)+MAX_CHANNEL_NUM*4] = nHighByte;
+ pDataLog[(i*4+3)+MAX_CHANNEL_NUM*4] = nLowByte;
+ }
+
+ *pLength = MAX_CHANNEL_NUM*8;
+ }
+ else if (eItoTestMode == ITO_TEST_MODE_SHORT_TEST)
+ {
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData1[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData1[i]) & 0xFF;
+
+ if (_gDataFlag1[i] == 1)
+ {
+ pDataLog[i*4] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData1[i] >= 0)
+ {
+ pDataLog[i*4+1] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[i*4+1] = 1; // - : a negative number
+ }
+
+ pDataLog[i*4+2] = nHighByte;
+ pDataLog[i*4+3] = nLowByte;
+ }
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData2[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData2[i]) & 0xFF;
+
+ if (_gDataFlag2[i] == 1)
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData2[i] >= 0)
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number
+ }
+
+ pDataLog[i*4+2+MAX_CHANNEL_NUM*4] = nHighByte;
+ pDataLog[i*4+3+MAX_CHANNEL_NUM*4] = nLowByte;
+ }
+
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData3[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData3[i]) & 0xFF;
+
+ if (_gDataFlag3[i] == 1)
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*8] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*8] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData3[i] >= 0)
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 1; // - : a negative number
+ }
+
+ pDataLog[(i*4+2)+MAX_CHANNEL_NUM*8] = nHighByte;
+ pDataLog[(i*4+3)+MAX_CHANNEL_NUM*8] = nLowByte;
+ }
+
+ if (_gIsEnable2R)
+ {
+ for (i = 0; i < MAX_CHANNEL_NUM; i ++)
+ {
+ nHighByte = (_gRawData4[i] >> 8) & 0xFF;
+ nLowByte = (_gRawData4[i]) & 0xFF;
+
+ if (_gDataFlag4[i] == 1)
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*12] = 1; // indicate it is a on-use channel number
+ }
+ else
+ {
+ pDataLog[i*4+MAX_CHANNEL_NUM*12] = 0; // indicate it is a non-use channel number
+ }
+
+ if (_gRawData4[i] >= 0)
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 0; // + : a positive number
+ }
+ else
+ {
+ pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 1; // - : a negative number
+ }
+
+ pDataLog[(i*4+2)+MAX_CHANNEL_NUM*12] = nHighByte;
+ pDataLog[(i*4+3)+MAX_CHANNEL_NUM*12] = nLowByte;
+ }
+ }
+
+ *pLength = MAX_CHANNEL_NUM*16;
+ }
+ else
+ {
+ DBG("*** Undefined MP Test Mode ***\n");
+ }
+}
+
+void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ if (_gIsInMpTest == 0)
+ {
+ DBG("ctp mp test start\n");
+
+ _gItoTestMode = eItoTestMode;
+ _gIsInMpTest = 1;
+ _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT;
+ _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING;
+
+ queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork);
+ }
+}
+
+void DrvMpTestCreateMpTestWorkQueue(void)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ _gCtpMpTestWorkQueue = create_singlethread_workqueue("ctp_mp_test");
+ INIT_WORK(&_gCtpItoTestWork, _DrvMpTestItoTestDoWork);
+}
+
+#endif //CONFIG_ENABLE_ITO_MP_TEST \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h
new file mode 100644
index 00000000..2dba1a7d
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h
@@ -0,0 +1,99 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_self_mp_test.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_SELF_MP_TEST_H__
+#define __MSTAR_DRV_SELF_MP_TEST_H__
+
+/*--------------------------------------------------------------------------*/
+/* INCLUDE FILE */
+/*--------------------------------------------------------------------------*/
+
+#include "mstar_drv_common.h"
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR CONSTANT DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+#define CTP_MP_TEST_RETRY_COUNT (3)
+
+
+#define OPEN_TEST_NON_BORDER_AREA_THRESHOLD (35) // range : 25~60
+#define OPEN_TEST_BORDER_AREA_THRESHOLD (40) // range : 25~60
+
+#define SHORT_TEST_THRESHOLD (3500)
+
+#define MP_TEST_MODE_OPEN_TEST (0x01)
+#define MP_TEST_MODE_SHORT_TEST (0x02)
+
+#define MAX_CHANNEL_NUM (48)
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA)
+#define PIN_GUARD_RING (46) // For MSG21XXA
+#define GPO_SETTING_SIZE (3) // For MSG21XXA
+#elif defined(CONFIG_ENABLE_CHIP_MSG22XX)
+#define RIU_BASE_ADDR (0) // For MSG22XX
+#define RIU_WRITE_LENGTH (144) // For MSG22XX
+#define CSUB_REF (0) //(18) // For MSG22XX
+#define CSUB_REF_MAX (0x3F) // For MSG22XX
+#endif
+
+#define REG_INTR_FIQ_MASK (0x04)
+#define FIQ_E_FRAME_READY_MASK (1 << 8)
+
+
+//#define PROC_MSG_ITO_TEST "msg-ito-test"
+//#define PROC_ITO_TEST_DEBUG "debug"
+
+/*--------------------------------------------------------------------------*/
+/* PREPROCESSOR MACRO DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+/* DATA TYPE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL VARIABLE DEFINITION */
+/*--------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+/* GLOBAL FUNCTION DECLARATION */
+/*--------------------------------------------------------------------------*/
+
+extern void DrvMpTestCreateMpTestWorkQueue(void);
+extern void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength);
+extern void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount);
+extern s32 DrvMpTestGetTestResult(void);
+extern void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode);
+
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#endif /* __MSTAR_DRV_SELF_MP_TEST_H__ */ \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c b/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c
new file mode 100644
index 00000000..03c0ad7a
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c
@@ -0,0 +1,238 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_sprd.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/types.h>
+#include <linux/input.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/earlysuspend.h>
+#include <linux/i2c.h>
+#include <linux/kobject.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include "mstar_drv_platform_interface.h"
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+#include <soc/sprd/regulator.h>
+#include <linux/regulator/consumer.h>
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/of_gpio.h>
+
+/*=============================================================*/
+// CONSTANT VALUE DEFINITION
+/*=============================================================*/
+//#define MSG_TP_IC_NAME "pixcir_ts" //"msg21xxA" or "msg22xx" or "msg26xxM" /* Please define the mstar touch ic name based on the mutual-capacitive ic or self capacitive ic that you are using */
+/*=============================================================*/
+// VARIABLE DEFINITION
+/*=============================================================*/
+
+struct i2c_client *g_I2cClient = NULL;
+int TOUCH_SCREEN_X_MAX = 0;
+int TOUCH_SCREEN_Y_MAX = 0;
+int MS_TS_MSG_IC_GPIO_RST = 0;
+int MS_TS_MSG_IC_GPIO_INT = 0;
+
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+struct regulator *g_ReguVdd = NULL;
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+#ifdef CONFIG_OF
+static struct msg2138_ts_platform_data *pixcir_ts_parse_dt(struct device *dev)
+{
+ struct msg2138_ts_platform_data *pdata = NULL;
+ struct device_node *np = dev->of_node;
+ int ret;
+
+ pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
+ if (!pdata) {
+ dev_err(dev, "Could not allocate struct msg2138_ts_platform_data");
+ return NULL;
+ }
+ pdata->reset_gpio_number = of_get_gpio(np, 0);
+ if(pdata->reset_gpio_number < 0){
+ dev_err(dev, "fail to get reset_gpio_number\n");
+ goto fail;
+ }
+ pdata->irq_gpio_number = of_get_gpio(np, 1);
+ if(pdata->irq_gpio_number < 0){
+ dev_err(dev, "fail to get irq_gpio_number\n");
+ goto fail;
+ }
+ ret = of_property_read_string(np, "vdd_name", &pdata->vdd_name);
+ if(ret){
+ dev_err(dev, "fail to get vdd_name\n");
+ goto fail;
+ }
+ ret = of_property_read_u32_array(np, "virtualkeys", &pdata->virtualkeys,12);
+ if(ret){
+ dev_err(dev, "fail to get virtualkeys\n");
+ goto fail;
+ }
+ ret = of_property_read_u32(np, "TP_MAX_X", &pdata->TP_MAX_X);
+ if(ret){
+ dev_err(dev, "fail to get TP_MAX_X\n");
+ goto fail;
+ }
+ ret = of_property_read_u32(np, "TP_MAX_Y", &pdata->TP_MAX_Y);
+ if(ret){
+ dev_err(dev, "fail to get TP_MAX_Y\n");
+ goto fail;
+ }
+
+ return pdata;
+fail:
+ kfree(pdata);
+ return NULL;
+}
+#endif
+
+/*=============================================================*/
+// FUNCTION DEFINITION
+/*=============================================================*/
+
+/* probe function is used for matching and initializing input device */
+static int /*__devinit*/ touch_driver_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ struct msg2138_ts_platform_data *pdata = client->dev.platform_data;
+ int err = 0, i = 0;
+
+ DBG("*** %s ***\n", __FUNCTION__);
+
+ if (client == NULL)
+ {
+ DBG("i2c client is NULL\n");
+ return -1;
+ }
+
+#ifdef CONFIG_OF
+ struct device_node *np = client->dev.of_node;
+ if (np && !pdata){
+ pdata = pixcir_ts_parse_dt(&client->dev);
+ if(pdata){
+ client->dev.platform_data = pdata;
+ } else {
+ err = -ENOMEM;
+ goto exit_alloc_platform_data_failed;
+ }
+ }
+#endif
+
+ g_I2cClient = client;
+ MS_TS_MSG_IC_GPIO_RST = pdata->reset_gpio_number;
+ MS_TS_MSG_IC_GPIO_INT = pdata->irq_gpio_number;
+ TOUCH_SCREEN_X_MAX = pdata->TP_MAX_X;
+ TOUCH_SCREEN_Y_MAX = pdata->TP_MAX_Y;
+
+ for(i=0; i<MAX_FINGER_NUM*2; i++) {
+ point_slot[i].active = 0;
+ }
+#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON
+ g_ReguVdd = regulator_get(&g_I2cClient->dev, pdata->vdd_name);
+#endif //CONFIG_ENABLE_REGULATOR_POWER_ON
+
+ return MsDrvInterfaceTouchDeviceProbe(g_I2cClient, id);
+exit_alloc_platform_data_failed:
+ return err;
+}
+
+/* remove function is triggered when the input device is removed from input sub-system */
+static int /*__devexit*/ touch_driver_remove(struct i2c_client *client)
+{
+ DBG("*** %s ***\n", __FUNCTION__);
+
+ return MsDrvInterfaceTouchDeviceRemove(client);
+}
+
+/* The I2C device list is used for matching I2C device and I2C device driver. */
+static const struct i2c_device_id touch_device_id[] =
+{
+ {MSG_TP_IC_NAME, MSG_TP_I2C_ADDR}, //SLAVE_I2C_ID_DWI2C
+ {}, /* should not omitted */
+};
+
+MODULE_DEVICE_TABLE(i2c, touch_device_id);
+
+static const struct of_device_id msg2138_of_match[] = {
+ { .compatible = "Mstar,msg2138_ts", },
+ { }
+};
+MODULE_DEVICE_TABLE(of, msg2138_of_match);
+
+static struct i2c_driver touch_device_driver =
+{
+ .driver = {
+ .name = MSG_TP_IC_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = msg2138_of_match,
+ },
+ .probe = touch_driver_probe,
+ .remove = touch_driver_remove,
+/* .remove = __devexit_p(touch_driver_remove), */
+ .id_table = touch_device_id,
+};
+
+static int /*__init*/ touch_driver_init(void)
+{
+ int ret;
+
+ /* register driver */
+ ret = i2c_add_driver(&touch_device_driver);
+ if (ret < 0)
+ {
+ DBG("add touch device driver i2c driver failed.\n");
+ return -ENODEV;
+ }
+ DBG("add touch device driver i2c driver.\n");
+
+ return ret;
+}
+
+static void /*__exit*/ touch_driver_exit(void)
+{
+ DBG("remove touch device driver i2c driver.\n");
+
+ i2c_del_driver(&touch_device_driver);
+}
+
+module_init(touch_driver_init);
+module_exit(touch_driver_exit);
+MODULE_LICENSE("GPL"); \ No newline at end of file
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c
new file mode 100644
index 00000000..7a2b4738
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c
@@ -0,0 +1,405 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_utility_adaption.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+////////////////////////////////////////////////////////////
+/// Included Files
+////////////////////////////////////////////////////////////
+#include "mstar_drv_utility_adaption.h"
+
+////////////////////////////////////////////////////////////
+/// Data Types
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Constant
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Variables
+////////////////////////////////////////////////////////////
+extern struct i2c_client *g_I2cClient;
+
+////////////////////////////////////////////////////////////
+/// Macro
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Function Prototypes
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Function Implementation
+////////////////////////////////////////////////////////////
+
+
+#ifdef CONFIG_ENABLE_DMA_IIC
+#include <linux/dma-mapping.h>
+#include <linux/mm_types.h>
+#include <linux/mm.h>
+#include <asm/uaccess.h>
+#include <asm/page.h>
+#include <linux/vmalloc.h>
+
+static unsigned char *I2CDMABuf_va = NULL;
+static volatile unsigned int I2CDMABuf_pa = NULL;
+
+void DmaAlloc(void)
+{
+ if (NULL == I2CDMABuf_va)
+ {
+ I2CDMABuf_va = (u8 *)dma_alloc_coherent(NULL, 4096, &I2CDMABuf_pa, GFP_KERNEL);
+ }
+
+ if (NULL == I2CDMABuf_va)
+ {
+ DBG("DrvCommonDmaAlloc FAILED!");
+ }
+ else
+ {
+ DBG("DrvCommonDmaAlloc SUCCESS!");
+ }
+}
+
+void DmaFree(void)
+{
+ if (NULL != I2CDMABuf_va)
+ {
+ dma_free_coherent(NULL, 4096, I2CDMABuf_va, I2CDMABuf_pa);
+ I2CDMABuf_va = NULL;
+ I2CDMABuf_pa = 0;
+ }
+}
+#endif //CONFIG_ENABLE_DMA_IIC
+
+//------------------------------------------------------------------------------//
+
+u16 RegGet16BitValue(u16 nAddr)
+{
+ u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF};
+ u8 rx_data[2] = {0};
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3);
+ IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data[0], 2);
+
+ return (rx_data[1] << 8 | rx_data[0]);
+}
+
+u8 RegGetLByteValue(u16 nAddr)
+{
+ u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF};
+ u8 rx_data = {0};
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3);
+ IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1);
+
+ return (rx_data);
+}
+
+u8 RegGetHByteValue(u16 nAddr)
+{
+ u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1};
+ u8 rx_data = {0};
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3);
+ IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1);
+
+ return (rx_data);
+}
+
+void RegSet16BitValue(u16 nAddr, u16 nData)
+{
+ u8 tx_data[5] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData & 0xFF, nData >> 8};
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 5);
+}
+
+void RegSetLByteValue(u16 nAddr, u8 nData)
+{
+ u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData};
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4);
+}
+
+void RegSetHByteValue(u16 nAddr, u8 nData)
+{
+ u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1, nData};
+ IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4);
+}
+
+void RegSet16BitValueOn(u16 nAddr, u16 nData) //Set bit on nData from 0 to 1
+{
+ u16 rData = RegGet16BitValue(nAddr);
+ rData |= nData;
+ RegSet16BitValue(nAddr, rData);
+}
+
+void RegSet16BitValueOff(u16 nAddr, u16 nData) //Set bit on nData from 1 to 0
+{
+ u16 rData = RegGet16BitValue(nAddr);
+ rData &= (~nData);
+ RegSet16BitValue(nAddr, rData);
+}
+
+void DbBusEnterSerialDebugMode(void)
+{
+ u8 data[5];
+
+ // Enter the Serial Debug Mode
+ data[0] = 0x53;
+ data[1] = 0x45;
+ data[2] = 0x52;
+ data[3] = 0x44;
+ data[4] = 0x42;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 5);
+}
+
+void DbBusExitSerialDebugMode(void)
+{
+ u8 data[1];
+
+ // Exit the Serial Debug Mode
+ data[0] = 0x45;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+
+ // Delay some interval to guard the next transaction
+// udelay(200); // delay about 0.2ms
+}
+
+void DbBusIICUseBus(void)
+{
+ u8 data[1];
+
+ // IIC Use Bus
+ data[0] = 0x35;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+}
+
+void DbBusIICNotUseBus(void)
+{
+ u8 data[1];
+
+ // IIC Not Use Bus
+ data[0] = 0x34;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+}
+
+void DbBusIICReshape(void)
+{
+ u8 data[1];
+
+ // IIC Re-shape
+ data[0] = 0x71;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+}
+
+void DbBusStopMCU(void)
+{
+ u8 data[1];
+
+ // Stop the MCU
+ data[0] = 0x37;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+}
+
+void DbBusNotStopMCU(void)
+{
+ u8 data[1];
+
+ // Not Stop the MCU
+ data[0] = 0x36;
+
+ IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1);
+}
+
+s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize)
+{
+ s32 rc = 0;
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ struct i2c_msg msgs[] =
+ {
+ {
+ .addr = nSlaveId,
+ .flags = 0, // if read flag is undefined, then it means write flag.
+ .len = nSize,
+ .buf = pBuf,
+ },
+ };
+
+ /* If everything went ok (i.e. 1 msg transmitted), return #bytes
+ transmitted, else error code. */
+ if (g_I2cClient != NULL)
+ {
+ rc = i2c_transfer(g_I2cClient->adapter, msgs, 1);
+ if (rc < 0)
+ {
+ PRINTF_ERR("IicWriteData() error %d\n", rc);
+ }
+ }
+ else
+ {
+ PRINTF_ERR("i2c client is NULL\n");
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ if (g_I2cClient != NULL)
+ {
+ u8 nAddrBefore = g_I2cClient->addr;
+ g_I2cClient->addr = nSlaveId;
+// g_I2cClient->addr = (g_I2cClient->addr & I2C_MASK_FLAG ) | (I2C_ENEXT_FLAG);
+
+#ifdef CONFIG_ENABLE_DMA_IIC
+ if (nSize > 8 && NULL != I2CDMABuf_va)
+ {
+ s32 i = 0;
+
+ for (i = 0; i < nSize; i ++)
+ {
+ I2CDMABuf_va[i] = pBuf[i];
+ }
+ g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG;
+ rc = i2c_master_send(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize);
+ }
+ else
+ {
+ g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG);
+ rc = i2c_master_send(g_I2cClient, pBuf, nSize);
+ }
+#else
+ rc = i2c_master_send(g_I2cClient, pBuf, nSize);
+#endif //CONFIG_ENABLE_DMA_IIC
+ g_I2cClient->addr = nAddrBefore;
+
+ if (rc < 0)
+ {
+ PRINTF_ERR("IicWriteData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize);
+ }
+ }
+ else
+ {
+ PRINTF_ERR("i2c client is NULL\n");
+ }
+#endif
+
+ return rc;
+}
+
+s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize)
+{
+ s32 rc = 0;
+
+#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM)
+ struct i2c_msg msgs[] =
+ {
+ {
+ .addr = nSlaveId,
+ .flags = I2C_M_RD, // read flag
+ .len = nSize,
+ .buf = pBuf,
+ },
+ };
+
+ /* If everything went ok (i.e. 1 msg transmitted), return #bytes
+ transmitted, else error code. */
+ if (g_I2cClient != NULL)
+ {
+ rc = i2c_transfer(g_I2cClient->adapter, msgs, 1);
+ if (rc < 0)
+ {
+ PRINTF_ERR("IicReadData() error %d\n", rc);
+ }
+ }
+ else
+ {
+ PRINTF_ERR("i2c client is NULL\n");
+ }
+#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM)
+ if (g_I2cClient != NULL)
+ {
+ u8 nAddrBefore = g_I2cClient->addr;
+ g_I2cClient->addr = nSlaveId;
+// g_I2cClient->addr = (g_I2cClient->addr & I2C_MASK_FLAG) | (I2C_ENEXT_FLAG);
+
+#ifdef CONFIG_ENABLE_DMA_IIC
+ if (nSize > 8 && NULL != I2CDMABuf_va)
+ {
+ s32 i = 0;
+
+ g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG;
+ rc = i2c_master_recv(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize);
+
+ for (i = 0; i < nSize; i ++)
+ {
+ pBuf[i] = I2CDMABuf_va[i];
+ }
+ }
+ else
+ {
+ g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG);
+ rc = i2c_master_recv(g_I2cClient, pBuf, nSize);
+ }
+#else
+ rc = i2c_master_recv(g_I2cClient, pBuf, nSize);
+#endif //CONFIG_ENABLE_DMA_IIC
+ g_I2cClient->addr = nAddrBefore;
+
+ if (rc < 0)
+ {
+ PRINTF_ERR("IicReadData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize);
+ }
+ }
+ else
+ {
+ PRINTF_ERR("i2c client is NULL\n");
+ }
+#endif
+
+ return rc;
+}
+
+void mstpMemSet(void *pDst, s8 nVal, u32 nSize)
+{
+ memset(pDst, nVal, nSize);
+}
+
+void mstpMemCopy(void *pDst, void *pSource, u32 nSize)
+{
+ memcpy(pDst, pSource, nSize);
+}
+
+void mstpDelay(u32 nTime)
+{
+ mdelay(nTime);
+}
+
+//------------------------------------------------------------------------------//
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h
new file mode 100644
index 00000000..5e729569
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h
@@ -0,0 +1,101 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_utility_adaption.h
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+#ifndef __MSTAR_DRV_UTILITY_ADAPTION_H__
+#define __MSTAR_DRV_UTILITY_ADAPTION_H__ (1)
+
+
+////////////////////////////////////////////////////////////
+/// Included Files
+////////////////////////////////////////////////////////////
+
+#include "mstar_drv_common.h"
+
+////////////////////////////////////////////////////////////
+/// Constant
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Data Types
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Variables
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+/// Macro
+////////////////////////////////////////////////////////////
+#define BK_REG8_WL(addr,val) ( RegSetLByteValue( addr, val ) )
+#define BK_REG8_WH(addr,val) ( RegSetHByteValue( addr, val ) )
+#define BK_REG16_W(addr,val) ( RegSet16BitValue( addr, val ) )
+#define BK_REG8_RL(addr) ( RegGetLByteValue( addr ) )
+#define BK_REG8_RH(addr) ( RegGetHByteValue( addr ) )
+#define BK_REG16_R(addr) ( RegGet16BitValue( addr ) )
+
+#define PRINTF_EMERG(fmt, ...) printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_ALERT(fmt, ...) printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_CRIT(fmt, ...) printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_ERR(fmt, ...) printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_WARN(fmt, ...) printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_NOTICE(fmt, ...) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_INFO(fmt, ...) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
+#define PRINTF_DEBUG(fmt, ...) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
+
+////////////////////////////////////////////////////////////
+/// Function Prototypes
+////////////////////////////////////////////////////////////
+
+#ifdef CONFIG_ENABLE_DMA_IIC
+extern void DmaAlloc(void);
+extern void DmaFree(void);
+#endif //CONFIG_ENABLE_DMA_IIC
+extern u16 RegGet16BitValue(u16 nAddr);
+extern u8 RegGetLByteValue(u16 nAddr);
+extern u8 RegGetHByteValue(u16 nAddr);
+extern void RegSet16BitValue(u16 nAddr, u16 nData);
+extern void RegSetLByteValue(u16 nAddr, u8 nData);
+extern void RegSetHByteValue(u16 nAddr, u8 nData);
+extern void RegSet16BitValueOn(u16 nAddr, u16 nData);
+extern void RegSet16BitValueOff(u16 nAddr, u16 nData);
+extern void DbBusEnterSerialDebugMode(void);
+extern void DbBusExitSerialDebugMode(void);
+extern void DbBusIICUseBus(void);
+extern void DbBusIICNotUseBus(void);
+extern void DbBusIICReshape(void);
+extern void DbBusStopMCU(void);
+extern void DbBusNotStopMCU(void);
+extern s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize);
+extern s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize);
+extern void mstpMemSet(void *pDst, s8 nVal, u32 nSize);
+extern void mstpMemCopy(void *pDst, void *pSource, u32 nSize);
+extern void mstpDelay(u32 nTime);
+
+#endif // __MSTAR_DRV_UTILITY_ADAPTION_H__