mirror of
https://github.com/sipeed/LicheeRV-Nano-Build.git
synced 2026-09-11 05:09:56 -05:00
Merge pull request #37 from 916BGAI/main
Fix the D240SI31 Panel and add support for cst7xx touchscreen
This commit is contained in:
@@ -117,15 +117,22 @@
|
||||
goodix,rst-gpio = <&porte 4 0>;
|
||||
status = "okay";
|
||||
};
|
||||
hytr: hynitron@5a {
|
||||
compatible = "hynitron,hyn_ts";
|
||||
reg = <0x5a>;
|
||||
hynitron,irq-gpio = <&porte 3 0>;
|
||||
hynitron,reset-gpio = <&porte 4 0>;
|
||||
hynitron,max-touch-number = <5>;
|
||||
hynitron,display-coords = <368 552>;
|
||||
hynitron: hynitron@5a {
|
||||
compatible = "hynitron,hyn_ts", "hyn,7xx";
|
||||
reg = <0x5a>;
|
||||
irq-gpio = <&porte 3 0>;
|
||||
hynitron,irq-gpio = <&porte 3 0>;
|
||||
reset-gpio = <&porte 4 0>;
|
||||
hynitron,reset-gpio = <&porte 4 0>;
|
||||
max-touch-number = <5>;
|
||||
hynitron,max-touch-number = <5>;
|
||||
display-coords = <0 0 480 640>;
|
||||
hynitron,display-coords = <368 552>;
|
||||
pos-swap = <0>;
|
||||
posx-reverse = <0>;
|
||||
posy-reverse = <0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
if [ "$1" = "start" ]
|
||||
then
|
||||
. /etc/profile
|
||||
panel_value=$(grep '^panel=' /boot/uEnv.txt | cut -d '=' -f 2)
|
||||
if [ "$panel_value" = "MaixCam_Pro" ]
|
||||
then
|
||||
echo "load cst7xx touchscreen driver"
|
||||
insmod /mnt/system/ko/hynitron_touch_new.ko
|
||||
else
|
||||
echo "load cst3xx touchscreen driver"
|
||||
insmod /mnt/system/ko/hynitron_touch.ko
|
||||
fi
|
||||
if [ -e /boot/gt9xx ]
|
||||
then
|
||||
echo "load gt9xx touchscreen driver"
|
||||
|
||||
@@ -113,3 +113,4 @@ obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_IQS5XX) += iqs5xx.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_ZINITIX) += zinitix.o
|
||||
obj-y += hynitron/
|
||||
obj-y += hyn/
|
||||
13
linux_5.10/drivers/input/touchscreen/hyn/Makefile
Normal file
13
linux_5.10/drivers/input/touchscreen/hyn/Makefile
Normal file
@@ -0,0 +1,13 @@
|
||||
obj-m += hynitron_touch_new.o
|
||||
|
||||
hynitron_touch_new-objs += hyn_core.o hyn_lib/hyn_i2c.o hyn_lib/hyn_spi.o hyn_lib/hyn_ts_ext.o hyn_lib/hyn_fs_node.o
|
||||
hynitron_touch_new-objs += hyn_lib/hyn_tool.o
|
||||
hynitron_touch_new-objs += hyn_lib/hyn_gesture.o
|
||||
hynitron_touch_new-objs += hyn_lib/hyn_prox.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst66xx.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst3240.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst92xx.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst3xx.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst1xx.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst7xx.o
|
||||
hynitron_touch_new-objs += hyn_chips/hyn_cst8xxT.o
|
||||
Binary file not shown.
44
linux_5.10/drivers/input/touchscreen/hyn/hyn_cfg.h
Normal file
44
linux_5.10/drivers/input/touchscreen/hyn/hyn_cfg.h
Normal file
@@ -0,0 +1,44 @@
|
||||
|
||||
#ifndef _HYNITRON_CFG_H
|
||||
#define _HYNITRON_CFG_H
|
||||
|
||||
|
||||
#define I2C_PORT
|
||||
#ifdef I2C_PORT
|
||||
#define I2C_USE_DMA (0) //0:soft 1:DMA 2:MTK_DMA
|
||||
#else
|
||||
#define SPI_MODE (0)
|
||||
#define SPI_DELAY_CS (10) //us
|
||||
#define SPI_CLOCK_FREQ (8000000)
|
||||
#define I2C_USE_DMA (0)
|
||||
#endif
|
||||
|
||||
#define HYN_TRANSFER_LIMIT_LEN (8192) //need >= 8
|
||||
|
||||
#define HYN_POWER_ON_UPDATA (0) //updata
|
||||
|
||||
#define HYN_GKI_VER (0) //GKI version need enable
|
||||
#define HYN_APK_DEBUG_EN (1)
|
||||
|
||||
#define HYN_GESTURE_EN (0) //gesture
|
||||
|
||||
#define HYN_PROX_TYEP (0) //0:disable 1:default 2:mtk_sensor 3:mtk_alps 4:Spread misc
|
||||
|
||||
#define MAX_POINTS_REPORT (1)
|
||||
|
||||
#define KEY_USED_POS_REPORT (0)
|
||||
|
||||
#define ESD_CHECK_EN (0)
|
||||
|
||||
#define HYN_WAKE_LOCK_EN (0)
|
||||
|
||||
#define HYN_MT_PROTOCOL_B_EN (1)
|
||||
|
||||
//selftest cfg
|
||||
#define HYN_TP0_TEST_LOG_SAVE (0)
|
||||
|
||||
#define HYN_DRIVER_VERSION "== Hynitron V2.5 202406014 =="
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
1544
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst1xx_fw.h
Normal file
1544
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst1xx_fw.h
Normal file
File diff suppressed because it is too large
Load Diff
1027
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst3240_fw.h
Normal file
1027
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst3240_fw.h
Normal file
File diff suppressed because it is too large
Load Diff
1546
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst3xx_fw.h
Normal file
1546
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst3xx_fw.h
Normal file
File diff suppressed because it is too large
Load Diff
2568
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst66xx_fw1.h
Normal file
2568
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst66xx_fw1.h
Normal file
File diff suppressed because it is too large
Load Diff
2568
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst66xx_fw2.h
Normal file
2568
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst66xx_fw2.h
Normal file
File diff suppressed because it is too large
Load Diff
972
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst7xx_fw.h
Normal file
972
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst7xx_fw.h
Normal file
@@ -0,0 +1,972 @@
|
||||
#ifndef HYNITRON_FIRMWARE_H
|
||||
#define HYNITRON_FIRMWARE_H
|
||||
|
||||
static const unsigned char fw_bin[] = {
|
||||
0x00, 0x00, 0x00, 0x3c, 0x97, 0xad,
|
||||
0x02, 0x27, 0x98, 0x22, 0x22, 0x00, 0x02, 0x35, 0xdb, 0x12, 0x2c, 0xa4, 0xe0, 0xff, 0x22, 0x02,
|
||||
0x38, 0x9b, 0xef, 0x78, 0xa4, 0x60, 0x05, 0xe6, 0x44, 0x01, 0xf6, 0x22, 0xe6, 0x54, 0xfe, 0xf6,
|
||||
0x22, 0x02, 0x2b, 0x72, 0xe5, 0x58, 0x24, 0x05, 0x12, 0x0d, 0x18, 0xe0, 0x70, 0x03, 0x02, 0x07,
|
||||
0x4a, 0x12, 0x0d, 0x8d, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x58, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0,
|
||||
0xc3, 0x9f, 0x50, 0x65, 0xe5, 0x58, 0x24, 0x07, 0x12, 0x0d, 0x18, 0xe0, 0x54, 0xfe, 0xf0, 0xe5,
|
||||
0x58, 0x24, 0x11, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0xa3, 0xf0, 0xe5, 0x58, 0x24, 0x13, 0x12, 0x0d,
|
||||
0x18, 0xe4, 0xf0, 0x12, 0x0d, 0x58, 0x12, 0x0e, 0x08, 0x24, 0x1b, 0x12, 0x0d, 0x18, 0x12, 0x0d,
|
||||
0x55, 0x12, 0x0e, 0x06, 0x24, 0x1d, 0x12, 0x0c, 0xde, 0x12, 0x0d, 0x55, 0x12, 0x0e, 0x08, 0x24,
|
||||
0x15, 0x12, 0x0d, 0x18, 0x12, 0x0d, 0x55, 0x12, 0x0e, 0x06, 0x24, 0x17, 0x12, 0x0d, 0x18, 0x12,
|
||||
0x0f, 0x80, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0, 0x60, 0x03, 0x02, 0x01, 0xe1, 0xe5, 0x58, 0x24,
|
||||
0x05, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0x02, 0x01, 0xe1, 0xe5, 0x58, 0x24, 0x07, 0x12, 0x0d, 0x18,
|
||||
0xe0, 0x30, 0xe0, 0x03, 0x02, 0x01, 0x3f, 0xe5, 0x58, 0x24, 0x1b, 0x12, 0x0d, 0x18, 0xe0, 0xfe,
|
||||
0xa3, 0xe0, 0xff, 0x12, 0x0d, 0x5a, 0x12, 0x0e, 0xee, 0xf5, 0x28, 0xec, 0x9e, 0xf5, 0x27, 0xe5,
|
||||
0x58, 0x24, 0x1d, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x0d, 0x5a, 0x12, 0x0e,
|
||||
0xec, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0x12, 0x0d, 0x8d, 0x74, 0x19, 0x93, 0xff, 0xe4, 0x8f,
|
||||
0x36, 0xf5, 0x35, 0xf5, 0x34, 0xf5, 0x33, 0x12, 0x0e, 0x3a, 0x90, 0x04, 0x9c, 0xe0, 0x24, 0x01,
|
||||
0xff, 0xe4, 0x33, 0xfe, 0x12, 0x0e, 0xfa, 0x8f, 0x36, 0x8e, 0x35, 0x8d, 0x34, 0x8c, 0x33, 0xaf,
|
||||
0x2a, 0xae, 0x29, 0x12, 0x2d, 0xa5, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x28, 0xae, 0x27, 0x12, 0x2d,
|
||||
0xa5, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x12, 0x0e, 0x35, 0xc3, 0x12, 0x0b, 0xca,
|
||||
0x50, 0x39, 0xe5, 0x58, 0x24, 0x07, 0x12, 0x0d, 0x18, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x2c, 0xe5,
|
||||
0x58, 0x24, 0x21, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x0d, 0x5a, 0x12, 0x0e,
|
||||
0xee, 0xf5, 0x28, 0xec, 0x9e, 0xf5, 0x27, 0x12, 0x0d, 0x14, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12,
|
||||
0x0d, 0x5a, 0x12, 0x0e, 0xec, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0xe5, 0x58, 0x24, 0x11, 0x12,
|
||||
0x0d, 0x18, 0x12, 0x0e, 0x13, 0xe5, 0x28, 0x9f, 0xfd, 0xe5, 0x27, 0x9e, 0xfc, 0xef, 0x78, 0x03,
|
||||
0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x03, 0x12,
|
||||
0x0f, 0x27, 0xd8, 0xfb, 0xf5, 0x28, 0x8e, 0x27, 0xe5, 0x58, 0x24, 0x13, 0x12, 0x0d, 0x18, 0x12,
|
||||
0x0e, 0x13, 0xe5, 0x2a, 0x9f, 0xfd, 0xe5, 0x29, 0x9e, 0xfc, 0xef, 0x78, 0x03, 0xc3, 0x33, 0xce,
|
||||
0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x03, 0x12, 0x0f, 0x27, 0xd8,
|
||||
0xfb, 0xf5, 0x2a, 0x8e, 0x29, 0xe5, 0x58, 0x24, 0x11, 0x12, 0x0d, 0x18, 0xe5, 0x27, 0xf0, 0xa3,
|
||||
0xe5, 0x28, 0xf0, 0xe5, 0x58, 0x24, 0x13, 0x12, 0x0d, 0x18, 0xe5, 0x29, 0xf0, 0xa3, 0xe5, 0x2a,
|
||||
0xf0, 0x12, 0x0d, 0x8d, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x58, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0,
|
||||
0xc3, 0x9f, 0x50, 0x03, 0x02, 0x07, 0x09, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d, 0x18, 0xe0, 0xfe,
|
||||
0xa3, 0xe0, 0xfd, 0xac, 0x06, 0xe5, 0x27, 0xa2, 0xe7, 0x13, 0xfe, 0xe5, 0x28, 0x12, 0x0e, 0x1a,
|
||||
0x12, 0x0d, 0x5a, 0x12, 0x0f, 0x2e, 0x12, 0x0f, 0x27, 0xd8, 0xfb, 0xf5, 0x24, 0x8e, 0x23, 0x12,
|
||||
0x0d, 0x14, 0xe0, 0xfe, 0xa3, 0xe0, 0xfd, 0xac, 0x06, 0xe5, 0x29, 0xa2, 0xe7, 0x13, 0xfe, 0xe5,
|
||||
0x2a, 0x12, 0x0e, 0x1a, 0x12, 0x0d, 0x5a, 0xa3, 0xa3, 0x12, 0x0f, 0x2e, 0x12, 0x0f, 0x27, 0xd8,
|
||||
0xfb, 0xf5, 0x26, 0x8e, 0x25, 0xc3, 0xe5, 0x24, 0x94, 0x01, 0xe5, 0x23, 0x64, 0x80, 0x94, 0x80,
|
||||
0x50, 0x08, 0x75, 0x23, 0x00, 0x75, 0x24, 0x01, 0x80, 0x1d, 0x12, 0x0d, 0x8d, 0x74, 0x01, 0x93,
|
||||
0xfe, 0x74, 0x02, 0x93, 0xff, 0xd3, 0x95, 0x24, 0xee, 0x95, 0x23, 0x50, 0x0a, 0xef, 0x24, 0xff,
|
||||
0xf5, 0x24, 0xee, 0x34, 0xff, 0xf5, 0x23, 0xc3, 0xe5, 0x26, 0x94, 0x01, 0xe5, 0x25, 0x64, 0x80,
|
||||
0x94, 0x80, 0x50, 0x08, 0x75, 0x25, 0x00, 0x75, 0x26, 0x01, 0x80, 0x1d, 0x12, 0x0d, 0x8d, 0x74,
|
||||
0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0xd3, 0x95, 0x26, 0xee, 0x95, 0x25, 0x50, 0x0a, 0xef,
|
||||
0x24, 0xff, 0xf5, 0x26, 0xee, 0x34, 0xff, 0xf5, 0x25, 0x12, 0x0d, 0x8d, 0x74, 0x20, 0x93, 0x24,
|
||||
0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x58, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0, 0xc3, 0x9f, 0xee,
|
||||
0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x50, 0x5d, 0xe5, 0x58, 0x24, 0x11, 0x12, 0x0d, 0x18, 0x12,
|
||||
0x07, 0x9c, 0x12, 0x0d, 0x8d, 0x74, 0x20, 0x93, 0xfd, 0xe5, 0x58, 0x24, 0x09, 0x12, 0x0d, 0x18,
|
||||
0xe0, 0xc3, 0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 0x12, 0x0e, 0xcd, 0x12, 0x0f, 0x3b, 0xe5, 0x58,
|
||||
0x24, 0x13, 0x12, 0x0d, 0x18, 0x12, 0x07, 0x9c, 0x12, 0x0d, 0x8d, 0x74, 0x20, 0x93, 0xfd, 0xe5,
|
||||
0x58, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0, 0xc3, 0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 0x12, 0x0d,
|
||||
0xdb, 0xf5, 0x83, 0x12, 0x0f, 0x3b, 0x75, 0x3b, 0x00, 0x75, 0x3c, 0x80, 0x75, 0x3d, 0x00, 0x75,
|
||||
0x3e, 0x80, 0x02, 0x05, 0x57, 0xe5, 0x58, 0x24, 0x11, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3, 0xe0,
|
||||
0xff, 0x12, 0x2d, 0xa5, 0x8e, 0x46, 0x8f, 0x47, 0xe5, 0x58, 0x24, 0x13, 0x12, 0x0d, 0x18, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2d, 0xa5, 0x8e, 0x48, 0x8f, 0x49, 0xd3, 0xe5, 0x47, 0x94, 0xff,
|
||||
0xe5, 0x46, 0x94, 0x00, 0x40, 0x06, 0x75, 0x46, 0x00, 0x75, 0x47, 0xff, 0xd3, 0xe5, 0x49, 0x94,
|
||||
0xff, 0xe5, 0x48, 0x94, 0x00, 0x40, 0x06, 0x75, 0x48, 0x00, 0x75, 0x49, 0xff, 0x85, 0x46, 0x3f,
|
||||
0x85, 0x47, 0x40, 0x85, 0x48, 0x41, 0x85, 0x49, 0x42, 0x75, 0x45, 0x09, 0x12, 0x0d, 0x62, 0xe0,
|
||||
0x25, 0x40, 0xf5, 0x40, 0xe4, 0x35, 0x3f, 0xf5, 0x3f, 0x12, 0x0d, 0xdb, 0x12, 0x0d, 0x6f, 0xe0,
|
||||
0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x41, 0xf5, 0x41, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24,
|
||||
0xa2, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0x12, 0x0d, 0x6f, 0xe0, 0xff, 0x12, 0x0d, 0x62, 0xef, 0xf0,
|
||||
0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb6, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0x12, 0x0d, 0x6f,
|
||||
0xe0, 0xff, 0x12, 0x0d, 0xdb, 0x12, 0x0d, 0x6f, 0xef, 0xf0, 0x15, 0x45, 0xe5, 0x45, 0x70, 0xac,
|
||||
0x12, 0x0e, 0xcd, 0xe5, 0x47, 0xf0, 0x12, 0x0d, 0xdb, 0xf5, 0x83, 0xe5, 0x49, 0xf0, 0xd3, 0xe5,
|
||||
0x40, 0x95, 0x42, 0xe5, 0x3f, 0x95, 0x41, 0x40, 0x26, 0x75, 0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75,
|
||||
0x4c, 0x41, 0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, 0x75, 0x4f, 0x3f, 0x75, 0x50, 0x00, 0x75, 0x51,
|
||||
0x00, 0x75, 0x52, 0x3b, 0x75, 0x53, 0x00, 0x75, 0x54, 0x00, 0x75, 0x55, 0x3d, 0x80, 0x24, 0x75,
|
||||
0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x3f, 0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, 0x75, 0x4f,
|
||||
0x41, 0x75, 0x50, 0x00, 0x75, 0x51, 0x00, 0x75, 0x52, 0x3d, 0x75, 0x53, 0x00, 0x75, 0x54, 0x00,
|
||||
0x75, 0x55, 0x3b, 0x12, 0x0f, 0x9a, 0x45, 0xf0, 0x70, 0x06, 0x75, 0xf0, 0x01, 0x12, 0x0a, 0x4b,
|
||||
0xab, 0x4d, 0xaa, 0x4e, 0xa9, 0x4f, 0x12, 0x09, 0xe8, 0xae, 0xf0, 0x78, 0x03, 0xc3, 0x33, 0xce,
|
||||
0x33, 0xce, 0xd8, 0xf9, 0xff, 0x12, 0x0f, 0x9a, 0xfd, 0xac, 0xf0, 0x12, 0x09, 0x47, 0x8e, 0x43,
|
||||
0x8f, 0x44, 0xe5, 0x58, 0x24, 0x0b, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x0e,
|
||||
0x20, 0xe5, 0x44, 0x2f, 0xff, 0xe5, 0x43, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce,
|
||||
0x13, 0xd8, 0xf9, 0xf5, 0x44, 0x8e, 0x43, 0xc3, 0x94, 0x28, 0xe5, 0x43, 0x94, 0x00, 0x50, 0x08,
|
||||
0x75, 0x43, 0x00, 0x75, 0x44, 0x28, 0x80, 0x11, 0xd3, 0xe5, 0x44, 0x94, 0x46, 0xe5, 0x43, 0x94,
|
||||
0x00, 0x40, 0x06, 0x75, 0x43, 0x00, 0x75, 0x44, 0x46, 0xae, 0x43, 0xaf, 0x44, 0x7c, 0x00, 0x7d,
|
||||
0x0a, 0x12, 0x09, 0x35, 0xef, 0x24, 0xf0, 0xff, 0xee, 0x34, 0xfe, 0xab, 0x53, 0xaa, 0x54, 0xa9,
|
||||
0x55, 0x8f, 0xf0, 0x12, 0x0a, 0x4b, 0xe5, 0x44, 0x25, 0xe0, 0xff, 0xe5, 0x43, 0x33, 0xfe, 0xc3,
|
||||
0x74, 0xd0, 0x9f, 0xff, 0xe4, 0x9e, 0xab, 0x50, 0xaa, 0x51, 0xa9, 0x52, 0x8f, 0xf0, 0x12, 0x0a,
|
||||
0x4b, 0xe5, 0x58, 0x24, 0x0b, 0x12, 0x0d, 0x18, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x44, 0xf0, 0xe5,
|
||||
0x58, 0x24, 0x0d, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7d, 0x03, 0x12, 0x09, 0x35,
|
||||
0xe5, 0x3c, 0x2f, 0xff, 0xe5, 0x3b, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13,
|
||||
0xd8, 0xf9, 0xf5, 0x3c, 0x8e, 0x3b, 0xe5, 0x58, 0x24, 0x0f, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xa3,
|
||||
0xe0, 0xff, 0x12, 0x0e, 0x20, 0xe5, 0x3e, 0x2f, 0xff, 0xe5, 0x3d, 0x3e, 0xfe, 0xef, 0x78, 0x02,
|
||||
0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3e, 0x8e, 0x3d, 0xe5, 0x58, 0x24, 0x0d, 0x12,
|
||||
0x0d, 0x18, 0xe5, 0x3b, 0xf0, 0xa3, 0xe5, 0x3c, 0xf0, 0xe5, 0x58, 0x24, 0x0f, 0x12, 0x0d, 0x18,
|
||||
0xe5, 0x3d, 0xf0, 0xa3, 0xe5, 0x3e, 0xf0, 0x12, 0x0d, 0x14, 0x12, 0x07, 0xa5, 0x7c, 0x00, 0x7d,
|
||||
0x02, 0x12, 0x09, 0x9c, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d, 0x18, 0x12,
|
||||
0x07, 0xb5, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0, 0x8f, 0x36, 0x8e,
|
||||
0x35, 0xf5, 0x34, 0xf5, 0x33, 0xae, 0x3b, 0xaf, 0x3c, 0xe4, 0xfc, 0xfd, 0x12, 0x0e, 0x3a, 0xd3,
|
||||
0x12, 0x0b, 0xca, 0x40, 0x0b, 0xe4, 0x85, 0x3c, 0x36, 0x85, 0x3b, 0x35, 0xf5, 0x34, 0xf5, 0x33,
|
||||
0xc3, 0xe5, 0x3c, 0x95, 0x36, 0xfb, 0xe5, 0x3b, 0x95, 0x35, 0xfa, 0xe4, 0x95, 0x34, 0xf9, 0xe4,
|
||||
0x95, 0x33, 0xf8, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d, 0x18, 0x12, 0x0e, 0xf5, 0x8f, 0x2e, 0x8e,
|
||||
0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xae, 0x23, 0xaf, 0x24, 0xee, 0x12, 0x0e, 0x35, 0x12, 0x0a, 0x97,
|
||||
0xef, 0x25, 0x2e, 0xff, 0xee, 0x35, 0x2d, 0xfe, 0xed, 0x35, 0x2c, 0xfd, 0xec, 0x35, 0x2b, 0x12,
|
||||
0x0f, 0x00, 0xe5, 0x3b, 0xc3, 0x13, 0xfe, 0xe5, 0x3c, 0x12, 0x0d, 0xab, 0xc0, 0x06, 0xc0, 0x07,
|
||||
0xae, 0x3b, 0xaf, 0x3c, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12,
|
||||
0x0b, 0x22, 0x8f, 0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d,
|
||||
0x18, 0x12, 0x07, 0xb5, 0x7c, 0x00, 0x7d, 0x02, 0x12, 0x09, 0x9c, 0xc0, 0x06, 0xc0, 0x07, 0x12,
|
||||
0x0d, 0x14, 0x12, 0x07, 0xa5, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0,
|
||||
0x8f, 0x3a, 0x8e, 0x39, 0xf5, 0x38, 0xf5, 0x37, 0xae, 0x3d, 0xaf, 0x3e, 0xe4, 0xfc, 0xfd, 0xab,
|
||||
0x3a, 0xaa, 0x39, 0xa9, 0x38, 0xa8, 0x37, 0xd3, 0x12, 0x0b, 0xca, 0x40, 0x0b, 0xe4, 0x85, 0x3e,
|
||||
0x3a, 0x85, 0x3d, 0x39, 0xf5, 0x38, 0xf5, 0x37, 0xc3, 0xe5, 0x3e, 0x95, 0x3a, 0xfb, 0xe5, 0x3d,
|
||||
0x95, 0x39, 0xfa, 0xe4, 0x95, 0x38, 0xf9, 0xe4, 0x95, 0x37, 0xf8, 0x12, 0x0d, 0x14, 0x12, 0x0e,
|
||||
0xf5, 0x8f, 0x32, 0x8e, 0x31, 0x8d, 0x30, 0x8c, 0x2f, 0xae, 0x25, 0xaf, 0x26, 0xee, 0x33, 0x95,
|
||||
0xe0, 0xfd, 0xfc, 0xab, 0x3a, 0xaa, 0x39, 0xa9, 0x38, 0xa8, 0x37, 0x12, 0x0a, 0x97, 0xef, 0x25,
|
||||
0x32, 0xff, 0xee, 0x35, 0x31, 0xfe, 0xed, 0x35, 0x30, 0xfd, 0xec, 0x35, 0x2f, 0x12, 0x0f, 0x00,
|
||||
0xe5, 0x3d, 0xc3, 0x13, 0xfe, 0xe5, 0x3e, 0x12, 0x0d, 0xab, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3d,
|
||||
0xaf, 0x3e, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x22,
|
||||
0x8f, 0x32, 0x8e, 0x31, 0x8d, 0x30, 0x8c, 0x2f, 0xe5, 0x58, 0x24, 0x07, 0x12, 0x0d, 0x18, 0xe0,
|
||||
0x30, 0xe0, 0x11, 0x12, 0x0d, 0x5a, 0xe5, 0x2d, 0xf0, 0xa3, 0xe5, 0x2e, 0x12, 0x0d, 0x59, 0xa3,
|
||||
0xa3, 0xee, 0x80, 0x21, 0xe5, 0x58, 0x24, 0x1b, 0x12, 0x0d, 0x18, 0xe0, 0xff, 0xa3, 0xe0, 0x12,
|
||||
0x0d, 0x5a, 0xcf, 0x12, 0x0f, 0x81, 0x24, 0x1d, 0x12, 0x0d, 0x18, 0xe0, 0xff, 0xa3, 0xe0, 0x12,
|
||||
0x0d, 0x5a, 0xa3, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d, 0x18,
|
||||
0x12, 0x0e, 0x08, 0x24, 0x15, 0x12, 0x0d, 0x18, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x0d, 0x14,
|
||||
0x12, 0x0e, 0x08, 0x24, 0x17, 0x12, 0x0c, 0xde, 0x12, 0x0f, 0x80, 0x24, 0x09, 0x12, 0x0d, 0x18,
|
||||
0xe0, 0xc3, 0x94, 0x14, 0x50, 0x0a, 0xe5, 0x58, 0x24, 0x09, 0x12, 0x0d, 0x18, 0xe0, 0x04, 0xf0,
|
||||
0xe5, 0x58, 0x24, 0x0a, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0x22, 0xe5, 0x58, 0x24, 0x0a, 0x12, 0x0d,
|
||||
0x18, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x0a, 0xe5, 0x58, 0x24, 0x0a, 0x12, 0x0d, 0x18, 0xe0, 0x14,
|
||||
0xf0, 0xe5, 0x58, 0x24, 0x0a, 0x12, 0x0d, 0x18, 0xe0, 0x70, 0x30, 0xe5, 0x58, 0x24, 0x09, 0x12,
|
||||
0x0d, 0x18, 0xe4, 0xf0, 0xe5, 0x58, 0x24, 0x0d, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0xa3, 0x74, 0x80,
|
||||
0xf0, 0xe5, 0x58, 0x24, 0x0f, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0xa3, 0x74, 0x80, 0xf0, 0xe5, 0x58,
|
||||
0x24, 0x0b, 0x12, 0x0d, 0x18, 0xe4, 0xf0, 0xa3, 0x74, 0x28, 0xf0, 0x22, 0xe0, 0xfe, 0xa3, 0xe0,
|
||||
0xff, 0x12, 0x2d, 0xa5, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x26, 0xff, 0xee, 0x95, 0x25,
|
||||
0xfe, 0x12, 0x2d, 0xa5, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x24, 0xff, 0xee, 0x95, 0x23,
|
||||
0xfe, 0x12, 0x2d, 0xa5, 0x22, 0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2,
|
||||
0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80,
|
||||
0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80,
|
||||
0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a,
|
||||
0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2,
|
||||
0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80,
|
||||
0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80,
|
||||
0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5,
|
||||
0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc,
|
||||
0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf,
|
||||
0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3,
|
||||
0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5,
|
||||
0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2,
|
||||
0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0,
|
||||
0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00,
|
||||
0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x08, 0x15, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82,
|
||||
0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a,
|
||||
0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5,
|
||||
0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25,
|
||||
0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93,
|
||||
0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe,
|
||||
0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5,
|
||||
0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9,
|
||||
0x25, 0x82, 0xc8, 0xf2, 0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c, 0xf0, 0xa4, 0x28,
|
||||
0xce, 0x8d, 0xf0, 0xa4, 0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29, 0xef, 0x8d, 0xf0,
|
||||
0x84, 0xff, 0xad, 0xf0, 0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xee, 0x33,
|
||||
0xfe, 0xec, 0x33, 0xfc, 0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d, 0xfe, 0x0f, 0xd5,
|
||||
0xf0, 0xe9, 0xe4, 0xce, 0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20, 0xd2, 0x1c, 0xfe,
|
||||
0xad, 0xf0, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07, 0x98, 0x50, 0x06,
|
||||
0xd5, 0xf0, 0xf2, 0x22, 0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xc2, 0xd5, 0xec, 0x30,
|
||||
0xe7, 0x09, 0xb2, 0xd5, 0xe4, 0xc3, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0xee, 0x30, 0xe7, 0x15, 0xb2,
|
||||
0xd5, 0xe4, 0xc3, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x12, 0x09, 0x47, 0xc3, 0xe4, 0x9d, 0xfd, 0xe4,
|
||||
0x9c, 0xfc, 0x80, 0x03, 0x12, 0x09, 0x47, 0x30, 0xd5, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e,
|
||||
0xfe, 0x22, 0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82,
|
||||
0x70, 0x02, 0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xe0,
|
||||
0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x06, 0x87, 0xf0, 0x09, 0xe7, 0x19, 0x22, 0xbb, 0xfe, 0x07,
|
||||
0xe3, 0xf5, 0xf0, 0x09, 0xe3, 0x19, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xf5, 0xf0, 0x74,
|
||||
0x01, 0x93, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83,
|
||||
0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6,
|
||||
0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83,
|
||||
0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82,
|
||||
0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7, 0x09, 0xa7, 0xf0, 0x19, 0x22,
|
||||
0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8, 0xbb, 0x01, 0x11, 0xe5, 0x82,
|
||||
0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50,
|
||||
0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb, 0xfe, 0x09, 0xe9, 0x25, 0x82,
|
||||
0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, 0x2c,
|
||||
0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, 0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, 0xf0,
|
||||
0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, 0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, 0xf0,
|
||||
0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, 0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, 0xf0,
|
||||
0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, 0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, 0x35,
|
||||
0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee,
|
||||
0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, 0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a,
|
||||
0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, 0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec,
|
||||
0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, 0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8,
|
||||
0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, 0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf,
|
||||
0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, 0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed,
|
||||
0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, 0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99,
|
||||
0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, 0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe,
|
||||
0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40,
|
||||
0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, 0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb,
|
||||
0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc,
|
||||
0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, 0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd,
|
||||
0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, 0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa,
|
||||
0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0,
|
||||
0xec, 0x64, 0x80, 0xc8, 0x64, 0x80, 0x98, 0x45, 0xf0, 0x22, 0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e,
|
||||
0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, 0x60, 0x0f, 0xef, 0xc3,
|
||||
0x33, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, 0xf1, 0x22, 0xe6, 0xfc,
|
||||
0x08, 0xe6, 0xfd, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe4, 0x93, 0xfc, 0x74, 0x01, 0x93,
|
||||
0xfd, 0x74, 0x02, 0x93, 0xfe, 0x74, 0x03, 0x93, 0xff, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xf9, 0x08,
|
||||
0xe6, 0xfa, 0x08, 0xe6, 0xcb, 0xf8, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, 0x08, 0xee, 0xf6, 0x08,
|
||||
0xef, 0xf6, 0x22, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22, 0xd0,
|
||||
0x83, 0xd0, 0x82, 0xe4, 0x93, 0xf6, 0x08, 0x74, 0x01, 0x93, 0xf6, 0x08, 0x74, 0x02, 0x93, 0xf6,
|
||||
0x08, 0x74, 0x03, 0x93, 0xf6, 0x74, 0x04, 0x73, 0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0,
|
||||
0x82, 0x12, 0x0c, 0x5f, 0x12, 0x0c, 0x5f, 0x12, 0x0c, 0x5f, 0x12, 0x0c, 0x5f, 0xe4, 0x73, 0xe4,
|
||||
0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83,
|
||||
0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8, 0x22, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0,
|
||||
0x35, 0x83, 0xf5, 0x83, 0x22, 0xec, 0x8e, 0xf0, 0xa4, 0xcc, 0xc5, 0xf0, 0xcc, 0xcd, 0xf8, 0xef,
|
||||
0xa4, 0xce, 0xc5, 0xf0, 0x2d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe8, 0xa4, 0x2e, 0xc8, 0xc5, 0xf0, 0x3d,
|
||||
0xfd, 0xe4, 0x3c, 0xfc, 0xef, 0xa4, 0xff, 0xe5, 0xf0, 0x28, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c,
|
||||
0xfc, 0x22, 0xef, 0x4e, 0x60, 0x12, 0xef, 0x60, 0x01, 0x0e, 0xed, 0xbb, 0x01, 0x0b, 0x89, 0x82,
|
||||
0x8a, 0x83, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x22, 0x89, 0xf0, 0x50, 0x07, 0xf7, 0x09, 0xdf,
|
||||
0xfc, 0xa9, 0xf0, 0x22, 0xbb, 0xfe, 0xfc, 0xf3, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xf5, 0x82,
|
||||
0xe4, 0x35, 0x57, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83,
|
||||
0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x58, 0x24, 0x21, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5,
|
||||
0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x58, 0x24, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0x22,
|
||||
0xe5, 0x29, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0xfe, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xe5, 0x29,
|
||||
0x25, 0xe0, 0x25, 0xe0, 0x24, 0xfd, 0xf8, 0xe2, 0x2f, 0xf5, 0x24, 0x18, 0xe2, 0x3e, 0xf5, 0x23,
|
||||
0xe5, 0x29, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xe5, 0x29,
|
||||
0x25, 0xe0, 0x25, 0xe0, 0x22, 0xee, 0xf0, 0xef, 0xa3, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83,
|
||||
0xa3, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xa3, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5,
|
||||
0x83, 0xe5, 0x82, 0x25, 0x45, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x85, 0x1e, 0x82,
|
||||
0x85, 0x1d, 0x83, 0x74, 0x66, 0x93, 0xfe, 0x74, 0x67, 0x93, 0x78, 0x06, 0x22, 0x85, 0x5f, 0x82,
|
||||
0x85, 0x5e, 0x83, 0x22, 0xff, 0xe4, 0xfc, 0xfd, 0xab, 0x1f, 0x05, 0x1f, 0xeb, 0x25, 0xe0, 0x25,
|
||||
0xe0, 0x24, 0xf5, 0xf5, 0x82, 0xe4, 0x34, 0x03, 0xf5, 0x83, 0x22, 0x13, 0xff, 0xe4, 0xfc, 0xfd,
|
||||
0xeb, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xed, 0x39, 0xfd, 0xec, 0x38, 0xfc, 0x22, 0x74, 0x01, 0x93,
|
||||
0xfe, 0x74, 0x02, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x0a, 0xe5, 0x20, 0x75, 0xf0, 0x27,
|
||||
0xa4, 0x24, 0x4d, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5, 0x83, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a,
|
||||
0xa4, 0x24, 0xb7, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0x22, 0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x2f,
|
||||
0xff, 0x18, 0xe2, 0x3e, 0xfe, 0x22, 0xf5, 0x83, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa,
|
||||
0xa3, 0xe0, 0xfb, 0x02, 0x0a, 0x97, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x58, 0x22,
|
||||
0x90, 0x04, 0x70, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x22, 0x13, 0x2d, 0xff, 0xee, 0x3c, 0xfe,
|
||||
0x7c, 0x00, 0x7d, 0x03, 0x02, 0x09, 0x35, 0x90, 0x04, 0xa1, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4,
|
||||
0xfc, 0xfd, 0x02, 0x0c, 0x0a, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0xab, 0x36, 0xaa, 0x35, 0xa9, 0x34,
|
||||
0xa8, 0x33, 0x22, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x12, 0x0c, 0x0a, 0x12, 0x0a, 0x97, 0xe4, 0x7b,
|
||||
0x02, 0xfa, 0xf9, 0xf8, 0x22, 0x7b, 0x01, 0x7e, 0x00, 0x7f, 0x07, 0x02, 0x08, 0x95, 0xc3, 0xef,
|
||||
0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x94, 0x00, 0xfd, 0xec, 0x94, 0x00, 0xfc, 0x02, 0x0c, 0x17,
|
||||
0x24, 0x01, 0xf8, 0xe2, 0x2f, 0xf5, 0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 0x22, 0x7e, 0x00, 0x7f,
|
||||
0x06, 0x7d, 0x00, 0x7b, 0x01, 0x02, 0x0c, 0xb2, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0x25, 0x29, 0xf5,
|
||||
0x29, 0xee, 0x35, 0x28, 0xf5, 0x28, 0xeb, 0x25, 0xe0, 0x22, 0xe5, 0x24, 0x25, 0x26, 0xff, 0xe5,
|
||||
0x23, 0x35, 0x25, 0xfe, 0xe5, 0x28, 0x2f, 0xff, 0xe5, 0x27, 0x3e, 0x22, 0x85, 0x1e, 0x82, 0x85,
|
||||
0x1d, 0x83, 0x74, 0x6c, 0x93, 0xfe, 0x74, 0x6d, 0x93, 0x78, 0x06, 0x22, 0xf8, 0xe2, 0xfe, 0x08,
|
||||
0xe2, 0xff, 0x22, 0xd3, 0xe5, 0x24, 0x95, 0x26, 0xe5, 0x23, 0x95, 0x25, 0x22, 0xe5, 0x22, 0x75,
|
||||
0xf0, 0x0a, 0xa4, 0x24, 0xa3, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5, 0x83, 0x22, 0xf8, 0xe2, 0xfe,
|
||||
0x08, 0xe2, 0x25, 0x27, 0xf5, 0x27, 0xee, 0x35, 0x26, 0xf5, 0x26, 0x22, 0xa3, 0xa3, 0xe0, 0xfc,
|
||||
0xa3, 0xe0, 0xc3, 0x9f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0a, 0x97,
|
||||
0xfc, 0xa8, 0x04, 0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x22, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x02,
|
||||
0x09, 0x35, 0xf0, 0xe5, 0x20, 0x75, 0xf0, 0x27, 0xa4, 0x22, 0xee, 0xf2, 0x08, 0xef, 0xf2, 0x78,
|
||||
0xb3, 0xe6, 0x25, 0xe0, 0x25, 0xe0, 0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0xe0, 0xfc,
|
||||
0xa3, 0xe0, 0x2f, 0xff, 0xee, 0x3c, 0xfe, 0xef, 0x78, 0x02, 0x22, 0xe5, 0x82, 0x2d, 0xf5, 0x82,
|
||||
0xe5, 0x83, 0x3c, 0xf5, 0x83, 0xef, 0xf0, 0x22, 0x78, 0x81, 0x12, 0x0b, 0xee, 0x78, 0x7d, 0x12,
|
||||
0x0c, 0x0a, 0xeb, 0x2f, 0x22, 0x78, 0x7d, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x17, 0x35, 0x2c, 0xfe,
|
||||
0xe4, 0x35, 0x2b, 0xfd, 0xe4, 0x35, 0x2a, 0xfc, 0x22, 0x12, 0x0b, 0x22, 0x8f, 0x2d, 0x8e, 0x2c,
|
||||
0x8d, 0x2b, 0x8c, 0x2a, 0x22, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0xd3, 0x9f, 0xec, 0x9e, 0x22,
|
||||
0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x58, 0x22, 0x74, 0x24, 0x25, 0x23, 0xf8, 0xa6, 0x06, 0x78,
|
||||
0x83, 0xe6, 0x22, 0x85, 0x62, 0x82, 0x85, 0x61, 0x83, 0x22, 0xab, 0x4a, 0xaa, 0x4b, 0xa9, 0x4c,
|
||||
0x02, 0x09, 0xe8, 0xe2, 0x2f, 0xf5, 0x28, 0x18, 0xe2, 0x3e, 0xf5, 0x27, 0x22, 0xe4, 0xf5, 0x22,
|
||||
0xf5, 0x23, 0xf5, 0x24, 0xf5, 0x25, 0x90, 0x04, 0xa1, 0xf0, 0xa3, 0xf0, 0xe5, 0x5a, 0xb4, 0xff,
|
||||
0x09, 0xe5, 0x5b, 0xf4, 0x60, 0x04, 0xe5, 0x5b, 0x80, 0x0c, 0xe5, 0x5a, 0xf4, 0x60, 0x0c, 0xe5,
|
||||
0x5b, 0xb4, 0xff, 0x07, 0xe5, 0x5a, 0x25, 0xe0, 0xfb, 0x80, 0x21, 0xe5, 0x5a, 0xf4, 0x60, 0x10,
|
||||
0xe5, 0x5b, 0xf4, 0x60, 0x0b, 0x90, 0x04, 0x9c, 0xe0, 0xd3, 0x94, 0x30, 0x40, 0x02, 0x80, 0xfe,
|
||||
0xe4, 0x90, 0x04, 0x9c, 0xf0, 0x90, 0x04, 0x9b, 0x74, 0xff, 0xf0, 0x22, 0xeb, 0xc3, 0x13, 0xfa,
|
||||
0xeb, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2, 0xf5, 0x28, 0x08, 0xe2, 0xf5, 0x29, 0xeb, 0x25, 0xe0,
|
||||
0x24, 0x02, 0xf8, 0xe2, 0xf5, 0x26, 0x08, 0xe2, 0xf5, 0x27, 0xea, 0xd3, 0x94, 0x01, 0x40, 0x30,
|
||||
0x74, 0x50, 0x2b, 0xf8, 0xe2, 0xc3, 0x13, 0x20, 0xe0, 0x0a, 0x74, 0x51, 0x2b, 0xf8, 0xe2, 0xc3,
|
||||
0x13, 0x30, 0xe0, 0x1c, 0xeb, 0x25, 0xe0, 0x24, 0xfa, 0x12, 0x0e, 0xbc, 0xeb, 0x25, 0xe0, 0x24,
|
||||
0xf8, 0x12, 0x0f, 0x75, 0x40, 0x02, 0x80, 0x04, 0xae, 0x04, 0xaf, 0x05, 0x8e, 0x22, 0x8f, 0x23,
|
||||
0x78, 0xb3, 0xe6, 0xf9, 0x24, 0xfe, 0xff, 0xea, 0xc3, 0x9f, 0x50, 0x30, 0x74, 0x58, 0x2b, 0xf8,
|
||||
0xe2, 0xc3, 0x13, 0x20, 0xe0, 0x0a, 0x74, 0x59, 0x2b, 0xf8, 0xe2, 0xc3, 0x13, 0x30, 0xe0, 0x1c,
|
||||
0xeb, 0x25, 0xe0, 0x24, 0x0a, 0x12, 0x0e, 0xbc, 0xeb, 0x25, 0xe0, 0x24, 0x08, 0x12, 0x0f, 0x75,
|
||||
0x40, 0x02, 0x80, 0x04, 0xae, 0x04, 0xaf, 0x05, 0x8e, 0x24, 0x8f, 0x25, 0xea, 0xd3, 0x94, 0x00,
|
||||
0x50, 0x03, 0x02, 0x12, 0x02, 0xeb, 0x25, 0xe0, 0x24, 0xfc, 0x12, 0x0e, 0x88, 0x24, 0xfe, 0x12,
|
||||
0x0e, 0xdd, 0xe9, 0x14, 0xff, 0xea, 0xc3, 0x9f, 0x40, 0x03, 0x02, 0x12, 0x02, 0xeb, 0x25, 0xe0,
|
||||
0x24, 0x04, 0x12, 0x0e, 0x88, 0x24, 0x06, 0x12, 0x0e, 0xdd, 0xe5, 0x23, 0x25, 0x25, 0xff, 0xe5,
|
||||
0x22, 0x35, 0x24, 0xfe, 0x7c, 0x00, 0x7d, 0x07, 0x12, 0x09, 0x35, 0xef, 0x78, 0x02, 0xce, 0xc3,
|
||||
0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x90, 0x04, 0xa1, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xe4, 0xf5,
|
||||
0x2a, 0x90, 0x04, 0x9b, 0xe0, 0xb4, 0xff, 0x09, 0x75, 0x2a, 0x01, 0xe4, 0xa3, 0xf0, 0x02, 0x11,
|
||||
0xd9, 0x12, 0x0f, 0x93, 0x74, 0x06, 0x93, 0xf5, 0x2b, 0xff, 0x90, 0x04, 0xa0, 0xe0, 0x2f, 0xff,
|
||||
0x90, 0x04, 0x9f, 0xe0, 0x34, 0x00, 0xfe, 0xc3, 0xef, 0x95, 0x29, 0xee, 0x95, 0x28, 0x7f, 0x00,
|
||||
0x50, 0x02, 0x7f, 0x01, 0x8f, 0x2c, 0x90, 0x04, 0x9e, 0xe0, 0x25, 0x2b, 0xff, 0x90, 0x04, 0x9d,
|
||||
0xe0, 0x34, 0x00, 0xfe, 0xc3, 0xef, 0x95, 0x27, 0xee, 0x95, 0x26, 0x7f, 0x00, 0x50, 0x02, 0x7f,
|
||||
0x01, 0x8f, 0x2d, 0x7e, 0x00, 0xe5, 0x29, 0x25, 0x2b, 0xff, 0xee, 0x35, 0x28, 0xfe, 0xd3, 0x90,
|
||||
0x04, 0xa0, 0xe0, 0x9f, 0x90, 0x04, 0x9f, 0xe0, 0x9e, 0x7f, 0x00, 0x40, 0x02, 0x7f, 0x01, 0x8f,
|
||||
0x2e, 0x7e, 0x00, 0xe5, 0x27, 0x25, 0x2b, 0xff, 0xee, 0x35, 0x26, 0xfe, 0xd3, 0x90, 0x04, 0x9e,
|
||||
0xe0, 0x9f, 0x90, 0x04, 0x9d, 0xe0, 0x9e, 0x7f, 0x00, 0x40, 0x02, 0x7f, 0x01, 0x8f, 0x2f, 0xe5,
|
||||
0x2c, 0x60, 0x04, 0xe5, 0x2f, 0x70, 0x08, 0xe5, 0x2e, 0x60, 0x0d, 0xe5, 0x2d, 0x60, 0x09, 0x90,
|
||||
0x04, 0x9c, 0xe0, 0x60, 0x03, 0xc3, 0x13, 0xf0, 0x90, 0x04, 0x9b, 0xe0, 0x6a, 0x60, 0x0e, 0xe5,
|
||||
0x2e, 0x70, 0x0a, 0xe5, 0x2f, 0x70, 0x06, 0xa3, 0xe0, 0x60, 0x02, 0x14, 0xf0, 0xe5, 0x2e, 0x60,
|
||||
0x11, 0xe5, 0x2f, 0x60, 0x0d, 0x90, 0x04, 0x9c, 0xe0, 0xc3, 0x94, 0x80, 0x50, 0x04, 0xe0, 0x24,
|
||||
0x10, 0xf0, 0xe5, 0x2c, 0x60, 0x10, 0xe5, 0x2d, 0x60, 0x0c, 0x90, 0x04, 0x9c, 0xe0, 0xc3, 0x94,
|
||||
0x80, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0xe5, 0x2c, 0x70, 0x0c, 0xe5, 0x2d, 0x70, 0x08, 0xe5, 0x2e,
|
||||
0x70, 0x04, 0xe5, 0x2f, 0x60, 0x03, 0x75, 0x2a, 0x01, 0x90, 0x04, 0x9c, 0xe0, 0xff, 0x78, 0x4a,
|
||||
0xe4, 0xf2, 0x08, 0xef, 0xf2, 0x90, 0x04, 0x9b, 0xea, 0xf0, 0xe5, 0x2a, 0x60, 0x14, 0x90, 0x04,
|
||||
0x9f, 0xe5, 0x28, 0xf0, 0xa3, 0xe5, 0x29, 0xf0, 0x90, 0x04, 0x9d, 0xe5, 0x26, 0xf0, 0xa3, 0xe5,
|
||||
0x27, 0xf0, 0x22, 0x8b, 0x1d, 0x8a, 0x1e, 0x89, 0x1f, 0x7e, 0x00, 0x7f, 0x0c, 0x7d, 0x00, 0x12,
|
||||
0x0c, 0xb2, 0x7a, 0x04, 0x79, 0x4e, 0x12, 0x0e, 0x7d, 0x7a, 0x04, 0x79, 0x75, 0x12, 0x0e, 0x7d,
|
||||
0xe5, 0x5d, 0x14, 0x60, 0x3a, 0x04, 0x60, 0x03, 0x02, 0x13, 0xd9, 0xe4, 0xf5, 0x5c, 0xff, 0x12,
|
||||
0x2d, 0x8d, 0x12, 0x2d, 0xbd, 0xef, 0x64, 0x03, 0x60, 0x12, 0xe4, 0x90, 0x04, 0xd4, 0xf0, 0x12,
|
||||
0x13, 0xdd, 0x30, 0xe0, 0xed, 0x78, 0xab, 0xe6, 0x30, 0xe4, 0xe7, 0x22, 0x7e, 0x00, 0x7f, 0x4e,
|
||||
0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x04, 0x79, 0x4d, 0x12, 0x0c, 0xb2, 0x75, 0x5d, 0x01, 0x22, 0x12,
|
||||
0x13, 0xdd, 0x30, 0xe0, 0x09, 0x78, 0xab, 0xe6, 0x30, 0xe4, 0x03, 0x02, 0x13, 0xd9, 0x78, 0xab,
|
||||
0xe6, 0x20, 0xe3, 0x03, 0x02, 0x13, 0x66, 0x12, 0x0d, 0x8d, 0x74, 0x0e, 0x93, 0x24, 0x01, 0xf5,
|
||||
0x21, 0x74, 0x0d, 0x93, 0x34, 0x00, 0xf5, 0x20, 0x78, 0x00, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xac,
|
||||
0x20, 0xad, 0x21, 0x12, 0x09, 0x35, 0x78, 0x00, 0xee, 0xf2, 0x08, 0xef, 0xf2, 0x08, 0x12, 0x0f,
|
||||
0x0a, 0x78, 0x02, 0x12, 0x0f, 0x1a, 0x24, 0xfe, 0xf8, 0xc0, 0x00, 0x12, 0x0f, 0x0a, 0xd0, 0x00,
|
||||
0x12, 0x0f, 0x1a, 0x24, 0xfc, 0xf8, 0xc0, 0x00, 0x12, 0x0f, 0x0a, 0xd0, 0x00, 0xee, 0xf2, 0x08,
|
||||
0xef, 0xf2, 0x12, 0x24, 0xd5, 0xaf, 0x5a, 0x12, 0x29, 0x54, 0x8f, 0x5a, 0xaf, 0x5b, 0x12, 0x29,
|
||||
0x54, 0x8f, 0x5b, 0x75, 0x25, 0xfe, 0x75, 0x26, 0x00, 0x75, 0x27, 0x00, 0x7b, 0x00, 0x7a, 0x00,
|
||||
0x79, 0x5a, 0x12, 0x34, 0x8e, 0xaf, 0x59, 0xef, 0xc3, 0x13, 0x30, 0xe0, 0x03, 0x12, 0x0f, 0xad,
|
||||
0xe4, 0xf5, 0x20, 0x74, 0x5a, 0x25, 0x20, 0xf8, 0xe6, 0xff, 0x12, 0x0d, 0xcb, 0xef, 0xf0, 0x12,
|
||||
0x0d, 0xcb, 0xe0, 0xf4, 0x60, 0x49, 0xaf, 0x20, 0x12, 0x17, 0x53, 0x12, 0x0f, 0x13, 0x24, 0x4e,
|
||||
0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xaf, 0x20, 0x12, 0x21,
|
||||
0x60, 0x12, 0x0f, 0x13, 0x24, 0x50, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5, 0x83, 0xee, 0xf0, 0xa3,
|
||||
0xef, 0x12, 0x0f, 0x12, 0x24, 0x52, 0xf5, 0x82, 0xe4, 0x34, 0x04, 0xf5, 0x83, 0x74, 0x01, 0x12,
|
||||
0x0f, 0x12, 0x24, 0x4e, 0xf9, 0x74, 0x04, 0x35, 0xf0, 0xfa, 0x7b, 0x01, 0x12, 0x00, 0x04, 0x05,
|
||||
0x20, 0xe5, 0x20, 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x12, 0x15, 0xa5, 0x78, 0xab, 0xe6, 0x30, 0xe5,
|
||||
0x26, 0x75, 0x5c, 0x01, 0x80, 0x21, 0x90, 0x04, 0x9b, 0x74, 0xff, 0xf0, 0xe4, 0xa3, 0xf0, 0x90,
|
||||
0x04, 0xa1, 0xf0, 0xa3, 0xf0, 0x90, 0x04, 0x9f, 0xf0, 0xa3, 0xf0, 0x90, 0x04, 0x9d, 0xf0, 0xa3,
|
||||
0xf0, 0xe5, 0x5c, 0x60, 0x02, 0x80, 0x52, 0x75, 0x57, 0x04, 0x75, 0x58, 0x4d, 0xe4, 0xf5, 0x20,
|
||||
0xe5, 0x20, 0xc3, 0x94, 0x02, 0x50, 0x15, 0x12, 0x00, 0x24, 0x12, 0x28, 0xc9, 0x05, 0x20, 0x74,
|
||||
0x27, 0x25, 0x58, 0xf5, 0x58, 0xe4, 0x35, 0x57, 0xf5, 0x57, 0x80, 0xe4, 0xa8, 0x1f, 0xac, 0x1e,
|
||||
0xad, 0x1d, 0x7b, 0x01, 0x7a, 0x04, 0x79, 0x4e, 0x7e, 0x00, 0x7f, 0x06, 0x12, 0x08, 0x95, 0xe5,
|
||||
0x1f, 0x24, 0x06, 0xf9, 0xe4, 0x35, 0x1e, 0xa8, 0x01, 0xfc, 0xad, 0x1d, 0x7b, 0x01, 0x7a, 0x04,
|
||||
0x79, 0x75, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x08, 0x95, 0xe4, 0xf5, 0x5d, 0x22, 0x12, 0x20, 0x0d,
|
||||
0xaf, 0x59, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x22, 0x8e, 0x1d, 0x8f, 0x1e, 0xe4, 0xf5, 0x5d, 0x8f,
|
||||
0x82, 0x8e, 0x83, 0x74, 0x63, 0x93, 0xff, 0x78, 0xb3, 0xf6, 0xe5, 0x1e, 0x24, 0x63, 0xf5, 0x5f,
|
||||
0xe4, 0x35, 0x1d, 0xf5, 0x5e, 0xe5, 0x59, 0x44, 0x01, 0xf5, 0x59, 0x54, 0xfd, 0xf5, 0x59, 0x44,
|
||||
0x04, 0xf5, 0x59, 0xe4, 0x90, 0x04, 0x56, 0xf0, 0x90, 0x04, 0x7d, 0xf0, 0x90, 0x04, 0x57, 0xf0,
|
||||
0x90, 0x04, 0x7e, 0xf0, 0xef, 0xd3, 0x94, 0x02, 0x50, 0x03, 0x02, 0x15, 0x68, 0x12, 0x0d, 0x7d,
|
||||
0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xfb, 0xaa, 0x06, 0x78, 0xb3, 0xe6, 0xfd, 0x7c, 0x00,
|
||||
0xaf, 0x03, 0x12, 0x09, 0x47, 0x8e, 0x20, 0x8f, 0x21, 0x12, 0x0e, 0xac, 0xc3, 0x33, 0xce, 0x33,
|
||||
0xce, 0xd8, 0xf9, 0x2b, 0xfd, 0xea, 0x3e, 0xfc, 0x85, 0x1e, 0x82, 0x85, 0x1d, 0x83, 0x74, 0x6e,
|
||||
0x93, 0xfe, 0x74, 0x6f, 0x93, 0x78, 0x06, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xfd,
|
||||
0xec, 0x3e, 0xfc, 0xe5, 0x21, 0x25, 0xe0, 0xff, 0xe5, 0x20, 0x33, 0xfe, 0xc3, 0xed, 0x9f, 0xff,
|
||||
0xec, 0x9e, 0xfe, 0xe4, 0xfc, 0xfd, 0xc0, 0x06, 0xc0, 0x07, 0x78, 0xb3, 0xe6, 0x24, 0xfe, 0xff,
|
||||
0xe4, 0x34, 0xff, 0xab, 0x07, 0xfa, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x22,
|
||||
0x8f, 0x25, 0x8e, 0x24, 0x8d, 0x23, 0x8c, 0x22, 0x85, 0x1e, 0x82, 0x85, 0x1d, 0x83, 0x74, 0x63,
|
||||
0x93, 0xd3, 0x94, 0x14, 0x40, 0x02, 0x80, 0xfe, 0x90, 0x03, 0xf5, 0x12, 0x0c, 0x48, 0x00, 0x00,
|
||||
0x00, 0x40, 0x90, 0x03, 0xf9, 0x12, 0x0c, 0x48, 0x00, 0x00, 0x00, 0x40, 0x12, 0x0e, 0x4e, 0xaf,
|
||||
0x25, 0xae, 0x24, 0xad, 0x23, 0xac, 0x22, 0x12, 0x0b, 0x22, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06,
|
||||
0xc0, 0x07, 0x12, 0x0e, 0xac, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xc3, 0xe5, 0x21,
|
||||
0x9f, 0xff, 0xe5, 0x20, 0x9e, 0xfe, 0xe4, 0xfc, 0xfd, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0,
|
||||
0x00, 0x12, 0x0d, 0xb0, 0x90, 0x03, 0xfd, 0x12, 0x0c, 0x23, 0x75, 0x1f, 0x03, 0xe5, 0x1f, 0xc3,
|
||||
0x78, 0xb3, 0x96, 0x50, 0x34, 0xe5, 0x1f, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0xf1, 0xf5, 0x82, 0xe4,
|
||||
0x34, 0x03, 0xf5, 0x83, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x25,
|
||||
0xff, 0xee, 0x35, 0x24, 0xfe, 0xed, 0x35, 0x23, 0xfd, 0xec, 0x35, 0x22, 0xfc, 0xe5, 0x1f, 0x12,
|
||||
0x0d, 0x9d, 0x12, 0x0c, 0x23, 0x05, 0x1f, 0x80, 0xc4, 0x12, 0x0d, 0x7d, 0xc3, 0x33, 0xce, 0x33,
|
||||
0xce, 0xd8, 0xf9, 0x12, 0x0d, 0x94, 0x12, 0x0c, 0x23, 0x12, 0x0d, 0x7d, 0xc3, 0x33, 0xce, 0x33,
|
||||
0xce, 0xd8, 0xf9, 0x12, 0x0d, 0x94, 0x80, 0x39, 0x78, 0xb3, 0xe6, 0xfb, 0xb4, 0x02, 0x1d, 0x90,
|
||||
0x03, 0xf5, 0x12, 0x0c, 0x48, 0x00, 0x00, 0x00, 0x40, 0x12, 0x0d, 0x7d, 0xc3, 0x33, 0xce, 0x33,
|
||||
0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xfc, 0xfd, 0x90, 0x03, 0xf9, 0x80, 0x15, 0xeb, 0xb4, 0x01, 0x14,
|
||||
0x12, 0x0d, 0x7d, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xfc, 0xfd, 0x90, 0x03,
|
||||
0xf5, 0x12, 0x0c, 0x23, 0x22, 0x90, 0x04, 0x52, 0xe0, 0x60, 0x0e, 0x90, 0x04, 0x79, 0xe0, 0x7f,
|
||||
0x01, 0x60, 0x02, 0x7f, 0x02, 0x8f, 0x27, 0x80, 0x0c, 0x90, 0x04, 0x79, 0xe0, 0x7f, 0x00, 0x60,
|
||||
0x02, 0x7f, 0x01, 0x8f, 0x27, 0x90, 0x04, 0x72, 0xe0, 0xff, 0x60, 0x0e, 0x90, 0x04, 0x99, 0xe0,
|
||||
0x7e, 0x01, 0x60, 0x02, 0x7e, 0x02, 0x8e, 0x28, 0x80, 0x0c, 0x90, 0x04, 0x99, 0xe0, 0x7e, 0x00,
|
||||
0x60, 0x02, 0x7e, 0x01, 0x8e, 0x28, 0xe4, 0xf5, 0x22, 0xe5, 0x27, 0x64, 0x01, 0x70, 0x40, 0xe5,
|
||||
0x28, 0x70, 0x03, 0x02, 0x16, 0xd1, 0xe5, 0x28, 0xb4, 0x01, 0x12, 0xef, 0x60, 0x03, 0x02, 0x16,
|
||||
0xd1, 0x90, 0x04, 0x99, 0xe0, 0x70, 0x03, 0x02, 0x16, 0xd1, 0x02, 0x16, 0xce, 0xe5, 0x28, 0x64,
|
||||
0x02, 0x60, 0x03, 0x02, 0x16, 0xd1, 0x12, 0x16, 0xff, 0x8e, 0x23, 0x8f, 0x24, 0x12, 0x17, 0x18,
|
||||
0x8e, 0x25, 0x8f, 0x26, 0x12, 0x0e, 0xc3, 0x50, 0x03, 0x02, 0x16, 0xd1, 0x02, 0x16, 0xce, 0xe5,
|
||||
0x27, 0x64, 0x02, 0x60, 0x03, 0x02, 0x16, 0xd1, 0xe5, 0x28, 0x70, 0x03, 0x02, 0x16, 0xd1, 0xe5,
|
||||
0x28, 0x64, 0x01, 0x70, 0x42, 0x90, 0x04, 0x72, 0xe0, 0x60, 0x15, 0x12, 0x16, 0xff, 0x8e, 0x23,
|
||||
0x8f, 0x24, 0x12, 0x0e, 0x10, 0x90, 0x04, 0x78, 0xe0, 0x9f, 0xff, 0x90, 0x04, 0x77, 0x80, 0x16,
|
||||
0x12, 0x17, 0x31, 0x8e, 0x23, 0x8f, 0x24, 0x90, 0x04, 0x97, 0x12, 0x0e, 0x13, 0x90, 0x04, 0x51,
|
||||
0xe0, 0x9f, 0xff, 0x90, 0x04, 0x50, 0xe0, 0x9e, 0xfe, 0x12, 0x2d, 0xa5, 0x8e, 0x25, 0x8f, 0x26,
|
||||
0x12, 0x0e, 0xc3, 0x40, 0x4c, 0x80, 0x47, 0xe5, 0x28, 0x64, 0x02, 0x70, 0x44, 0x12, 0x17, 0x31,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0e, 0x10, 0x90, 0x04, 0x51, 0xe0, 0x90, 0x04, 0x50, 0x12, 0x17,
|
||||
0x4a, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x3e, 0xf5, 0x23, 0x12, 0x0e, 0x10, 0x90, 0x04,
|
||||
0x78, 0xe0, 0x90, 0x04, 0x77, 0x12, 0x17, 0x4a, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x17, 0x18, 0xd0,
|
||||
0xe0, 0x2f, 0xf5, 0x26, 0xd0, 0xe0, 0x3e, 0xf5, 0x25, 0x12, 0x0e, 0xc3, 0x40, 0x03, 0x75, 0x22,
|
||||
0x01, 0xe5, 0x22, 0x60, 0x29, 0x78, 0x7d, 0x7c, 0x00, 0x7d, 0x00, 0x7a, 0x04, 0x79, 0x4d, 0x12,
|
||||
0x0e, 0x55, 0x78, 0x4d, 0x7c, 0x04, 0x7d, 0x01, 0x7a, 0x04, 0x79, 0x74, 0x12, 0x0e, 0x55, 0x78,
|
||||
0x74, 0x7c, 0x04, 0x7d, 0x01, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x7d, 0x12, 0x0e, 0x57, 0x22, 0x90,
|
||||
0x04, 0x70, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x04, 0x51, 0xe0, 0x9f, 0xff, 0x90, 0x04,
|
||||
0x50, 0xe0, 0x9e, 0xfe, 0x12, 0x2d, 0xa5, 0x22, 0x90, 0x04, 0x97, 0xe0, 0xfe, 0xa3, 0xe0, 0xff,
|
||||
0xc3, 0x90, 0x04, 0x51, 0xe0, 0x9f, 0xff, 0x90, 0x04, 0x50, 0xe0, 0x9e, 0xfe, 0x12, 0x2d, 0xa5,
|
||||
0x22, 0x90, 0x04, 0x97, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x04, 0x78, 0xe0, 0x9f, 0xff,
|
||||
0x90, 0x04, 0x77, 0xe0, 0x9e, 0xfe, 0x12, 0x2d, 0xa5, 0x22, 0x9f, 0xff, 0xe0, 0x9e, 0xfe, 0x12,
|
||||
0x2d, 0xa5, 0x22, 0xef, 0x12, 0x0d, 0xcd, 0xe0, 0xff, 0x70, 0x04, 0xf5, 0x22, 0x80, 0x18, 0x78,
|
||||
0xb3, 0xe6, 0xfe, 0x14, 0xb5, 0x07, 0x09, 0xee, 0x25, 0xe0, 0x24, 0xfa, 0xf5, 0x22, 0x80, 0x07,
|
||||
0xef, 0x25, 0xe0, 0x24, 0xfe, 0xf5, 0x22, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x04, 0x12, 0x0e, 0xbc,
|
||||
0xe5, 0x22, 0x12, 0x0d, 0xe9, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x09, 0x12, 0x0d, 0xed, 0x12, 0x0f,
|
||||
0x55, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x06, 0x12, 0x0e, 0xbc, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x03,
|
||||
0x12, 0x0d, 0xed, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x0b, 0x12, 0x0d, 0xed, 0x78, 0x81, 0x12, 0x0f,
|
||||
0x57, 0x78, 0x7d, 0x12, 0x0e, 0x27, 0xd3, 0x12, 0x0b, 0xca, 0x40, 0x3d, 0x78, 0x81, 0x12, 0x0e,
|
||||
0x27, 0xd3, 0x12, 0x0b, 0xca, 0x40, 0x32, 0x78, 0x7d, 0x12, 0x0b, 0xee, 0xc0, 0x06, 0xc0, 0x07,
|
||||
0x90, 0x04, 0xa1, 0xe0, 0xfe, 0xa3, 0xe0, 0xfb, 0xaa, 0x06, 0xd0, 0x07, 0xd0, 0x06, 0x78, 0x7d,
|
||||
0x12, 0x0e, 0x5e, 0x78, 0x81, 0x12, 0x0b, 0xee, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x04, 0xa1, 0xa3,
|
||||
0xd0, 0x07, 0xd0, 0x06, 0x78, 0x81, 0x12, 0x0e, 0x5e, 0x12, 0x0d, 0x8d, 0x74, 0x07, 0x93, 0xfe,
|
||||
0x74, 0x08, 0x78, 0x81, 0x12, 0x0e, 0x43, 0x12, 0x0a, 0x97, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06,
|
||||
0xc0, 0x07, 0x12, 0x0d, 0x8d, 0x78, 0x81, 0x12, 0x0d, 0xbd, 0x12, 0x0a, 0x97, 0xd0, 0x03, 0xd0,
|
||||
0x02, 0xd0, 0x01, 0xd0, 0x00, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0x12, 0x0d, 0xb5, 0xc0, 0x04, 0xc0,
|
||||
0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0d, 0x8d, 0x74, 0x05, 0x93, 0xfe, 0x74, 0x06, 0x78, 0x7d,
|
||||
0x12, 0x0e, 0x43, 0x12, 0x0a, 0x97, 0x12, 0x0f, 0x01, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0,
|
||||
0x04, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x99, 0xfd, 0xec, 0x98, 0xfc, 0x78, 0x85,
|
||||
0x12, 0x0c, 0x17, 0x78, 0x85, 0x12, 0x0b, 0xee, 0xec, 0x33, 0x50, 0x0b, 0x78, 0x7d, 0x12, 0x0c,
|
||||
0x2f, 0x00, 0x00, 0x00, 0x01, 0x80, 0x65, 0x12, 0x0f, 0x48, 0xff, 0xea, 0x3e, 0xfe, 0xe9, 0x3d,
|
||||
0xfd, 0xe8, 0x3c, 0xfc, 0x12, 0x0e, 0x4e, 0x12, 0x0b, 0x22, 0x78, 0x85, 0x12, 0x0c, 0x0a, 0xef,
|
||||
0x2b, 0xff, 0xee, 0x3a, 0x12, 0x0d, 0xb5, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12,
|
||||
0x0f, 0x48, 0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 0xf9, 0xe8, 0x3c, 0xf8, 0xd0, 0x07, 0xd0, 0x06,
|
||||
0xd0, 0x05, 0xd0, 0x04, 0x12, 0x0b, 0x22, 0x78, 0x7d, 0x12, 0x0c, 0x17, 0x12, 0x0d, 0x8d, 0x78,
|
||||
0x7d, 0x12, 0x0d, 0xbd, 0xd3, 0x12, 0x0b, 0xca, 0x40, 0x12, 0x12, 0x0d, 0x8d, 0x74, 0x02, 0x93,
|
||||
0x24, 0xff, 0xff, 0x74, 0x01, 0x93, 0x34, 0xff, 0xfe, 0x12, 0x0f, 0x55, 0x78, 0x7d, 0x12, 0x0b,
|
||||
0xee, 0x22, 0x8f, 0x20, 0x8d, 0x21, 0x43, 0xad, 0x04, 0x43, 0x95, 0x80, 0xe4, 0x90, 0xff, 0x41,
|
||||
0xf0, 0x90, 0xff, 0x87, 0x74, 0x03, 0xf0, 0xe4, 0x90, 0xff, 0x4b, 0xf0, 0x90, 0xff, 0x49, 0x04,
|
||||
0xf0, 0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 0x74, 0xc8,
|
||||
0xf0, 0x90, 0xff, 0x5d, 0xf0, 0xe4, 0x12, 0x2d, 0x0b, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x23, 0xf5,
|
||||
0x24, 0xf5, 0x25, 0xf5, 0x26, 0xf5, 0x22, 0xe4, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0,
|
||||
0xe5, 0x20, 0xf4, 0x60, 0x0e, 0xe4, 0xfd, 0xaf, 0x20, 0x12, 0x2b, 0xe8, 0x7d, 0x02, 0xaf, 0x20,
|
||||
0x12, 0x2a, 0xd9, 0xe5, 0x21, 0xf4, 0x60, 0x0e, 0xe4, 0xfd, 0xaf, 0x21, 0x12, 0x2b, 0xe8, 0x7d,
|
||||
0x02, 0xaf, 0x21, 0x12, 0x2a, 0xd9, 0xe4, 0xff, 0xe4, 0x90, 0x04, 0xd4, 0xf0, 0x0f, 0xbf, 0xc8,
|
||||
0xf7, 0x90, 0xff, 0x50, 0x74, 0x03, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xe5, 0x20, 0xf4, 0x60, 0x0e,
|
||||
0xe4, 0xfd, 0xaf, 0x20, 0x12, 0x2c, 0x17, 0x7d, 0x07, 0xaf, 0x20, 0x12, 0x2a, 0xd9, 0xe5, 0x21,
|
||||
0xf4, 0x60, 0x0e, 0x7d, 0x01, 0xaf, 0x21, 0x12, 0x2c, 0x17, 0x7d, 0x07, 0xaf, 0x21, 0x12, 0x2a,
|
||||
0xd9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 0xff, 0x58,
|
||||
0xf0, 0x90, 0xff, 0x40, 0x74, 0x09, 0xf0, 0xe4, 0x90, 0x04, 0xd4, 0xf0, 0x90, 0xff, 0x43, 0xe0,
|
||||
0x30, 0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0,
|
||||
0x25, 0x24, 0xf5, 0x24, 0xee, 0x35, 0x23, 0xf5, 0x23, 0x90, 0xff, 0x5a, 0xe0, 0xfe, 0xa3, 0xe0,
|
||||
0x25, 0x26, 0xf5, 0x26, 0xee, 0x35, 0x25, 0xf5, 0x25, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x10,
|
||||
0x50, 0x03, 0x02, 0x19, 0x27, 0xe5, 0x23, 0xc4, 0xf8, 0x54, 0xf0, 0xc8, 0x68, 0x90, 0x04, 0xcb,
|
||||
0xf0, 0xe5, 0x24, 0xc4, 0x54, 0x0f, 0x48, 0xa3, 0xf0, 0xe5, 0x25, 0xc4, 0xf8, 0x54, 0xf0, 0xc8,
|
||||
0x68, 0xa3, 0xf0, 0xe5, 0x26, 0xc4, 0x54, 0x0f, 0x48, 0xa3, 0xf0, 0x53, 0x95, 0x7f, 0xe4, 0x90,
|
||||
0xff, 0x41, 0xf0, 0x90, 0xff, 0x87, 0xf0, 0x90, 0xff, 0x4b, 0xf0, 0x90, 0xff, 0x49, 0xf0, 0x90,
|
||||
0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x42, 0xf0, 0x90,
|
||||
0xff, 0x55, 0xf0, 0x90, 0xff, 0x5d, 0xf0, 0x12, 0x2d, 0x0b, 0xf0, 0xe5, 0x20, 0xf4, 0x60, 0x14,
|
||||
0x90, 0x04, 0xcb, 0x12, 0x2d, 0x17, 0x40, 0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x40,
|
||||
0x03, 0x7f, 0x01, 0x22, 0xe5, 0x21, 0xf4, 0x60, 0x14, 0x90, 0x04, 0xcd, 0x12, 0x2d, 0x17, 0x40,
|
||||
0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x40, 0x03, 0x7f, 0x01, 0x22, 0x7f, 0x00, 0x22,
|
||||
0x8b, 0x1d, 0x8a, 0x1e, 0x89, 0x1f, 0x43, 0xad, 0x04, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9,
|
||||
0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x07, 0xf0, 0x90, 0xff, 0x87, 0x74, 0x03, 0xf0, 0xe4,
|
||||
0x90, 0xff, 0x4b, 0xf0, 0x90, 0xff, 0x49, 0x04, 0xf0, 0xe4, 0xf5, 0x26, 0xf5, 0x26, 0x12, 0x2c,
|
||||
0x81, 0xe5, 0x26, 0xc3, 0x9f, 0x50, 0x1a, 0xe9, 0x24, 0x0c, 0xf9, 0xe4, 0x3a, 0x12, 0x2c, 0x72,
|
||||
0xe4, 0xfd, 0x12, 0x2c, 0x17, 0x12, 0x2c, 0x68, 0x7d, 0x02, 0x12, 0x2a, 0xd9, 0x05, 0x26, 0x80,
|
||||
0xdd, 0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0xe4, 0x90, 0xff, 0x58,
|
||||
0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0xab, 0x1d, 0xaa,
|
||||
0x1e, 0xa9, 0x1f, 0x12, 0x08, 0xbb, 0x90, 0xff, 0x48, 0xf0, 0x90, 0x00, 0x01, 0x12, 0x08, 0xd4,
|
||||
0x90, 0xff, 0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x08, 0xd4, 0x90, 0xff, 0x55, 0xf0, 0xe4, 0x90,
|
||||
0xff, 0x5d, 0xf0, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0xf5, 0x26, 0x12, 0x2c, 0x81,
|
||||
0xe5, 0x26, 0xc3, 0x9f, 0x50, 0x5d, 0xe4, 0xf5, 0x27, 0x75, 0x28, 0x64, 0x90, 0xff, 0x50, 0xe0,
|
||||
0x20, 0xe7, 0x03, 0x43, 0x27, 0x01, 0xe5, 0x27, 0x64, 0x01, 0x60, 0x03, 0xd5, 0x28, 0xed, 0xe4,
|
||||
0x90, 0x04, 0xd4, 0xf0, 0x12, 0x2c, 0x68, 0x7d, 0x06, 0x12, 0x2a, 0xd9, 0x90, 0xff, 0x40, 0x74,
|
||||
0x09, 0xf0, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x12, 0x2c, 0x68, 0x7d, 0x02, 0x12, 0x2a,
|
||||
0xd9, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xab, 0x20, 0xe5, 0x22, 0xf9, 0x24, 0x02,
|
||||
0xf5, 0x22, 0xe5, 0x21, 0xfa, 0x34, 0x00, 0xf5, 0x21, 0xee, 0x8f, 0xf0, 0x12, 0x0a, 0x4b, 0x05,
|
||||
0x26, 0x80, 0x9a, 0xe4, 0xf5, 0x26, 0x75, 0x27, 0x01, 0x12, 0x2c, 0x68, 0x7d, 0x07, 0x12, 0x2a,
|
||||
0xd9, 0xe5, 0x27, 0x24, 0x02, 0x90, 0xff, 0x55, 0xf0, 0xe4, 0xf5, 0x28, 0xf5, 0x29, 0x05, 0x29,
|
||||
0xe5, 0x29, 0x70, 0x02, 0x05, 0x28, 0xb4, 0x20, 0xf5, 0xe5, 0x28, 0xb4, 0x03, 0xf0, 0x90, 0xff,
|
||||
0x50, 0xe0, 0x30, 0xe7, 0x09, 0x05, 0x27, 0xe5, 0x27, 0xc3, 0x94, 0x64, 0x40, 0xd3, 0xab, 0x23,
|
||||
0xaa, 0x24, 0xa9, 0x25, 0x85, 0x26, 0x82, 0x75, 0x83, 0x00, 0xe5, 0x27, 0x12, 0x09, 0x13, 0x12,
|
||||
0x2c, 0x68, 0x7d, 0x02, 0x12, 0x2a, 0xd9, 0xe4, 0x90, 0x04, 0xd4, 0xf0, 0x12, 0x2c, 0x81, 0x05,
|
||||
0x26, 0xe5, 0x26, 0xc3, 0x9f, 0x40, 0x9f, 0xe4, 0x90, 0xff, 0x50, 0xf0, 0xff, 0x22, 0x8f, 0x2a,
|
||||
0x8d, 0x2b, 0xe4, 0x90, 0x00, 0xa8, 0xf0, 0x78, 0xa0, 0xe6, 0xfd, 0x7c, 0x00, 0x12, 0x1e, 0xad,
|
||||
0xe0, 0xfa, 0xa3, 0xe0, 0xfb, 0xff, 0xae, 0x02, 0x12, 0x09, 0x47, 0xc3, 0xeb, 0x9f, 0xfb, 0xea,
|
||||
0x9e, 0xfa, 0x78, 0xa0, 0xe6, 0xfd, 0x7c, 0x00, 0xe5, 0x2a, 0x12, 0x1f, 0x97, 0xe0, 0xfe, 0xa3,
|
||||
0xe0, 0xff, 0x12, 0x09, 0x47, 0xef, 0x2b, 0xf5, 0x2f, 0xee, 0x3a, 0xf5, 0x2e, 0xe5, 0x2a, 0xc3,
|
||||
0x94, 0x28, 0x40, 0x04, 0x78, 0xa8, 0x80, 0x02, 0x78, 0xa1, 0xe6, 0x75, 0x2c, 0x00, 0xf5, 0x2d,
|
||||
0xae, 0x2c, 0xaf, 0x2d, 0x7c, 0x00, 0x7d, 0xfc, 0x12, 0x09, 0x35, 0xd3, 0xe5, 0x2f, 0x9f, 0xe5,
|
||||
0x2e, 0x9e, 0x40, 0x0b, 0x78, 0xab, 0xe6, 0x44, 0x20, 0x12, 0x1f, 0x7e, 0x44, 0x10, 0xf2, 0x12,
|
||||
0x1e, 0xad, 0xe5, 0x2e, 0xf0, 0xa3, 0xe5, 0x2f, 0xf0, 0x12, 0x1f, 0x23, 0x74, 0x08, 0x93, 0x25,
|
||||
0xe0, 0xf5, 0x2f, 0x74, 0x07, 0x93, 0x33, 0xf5, 0x2e, 0x12, 0x1f, 0x7f, 0xfd, 0x30, 0xe0, 0x19,
|
||||
0xe5, 0x2f, 0xae, 0x2e, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xc3, 0xe5,
|
||||
0x2f, 0x9f, 0xf5, 0x2f, 0xe5, 0x2e, 0x9e, 0xf5, 0x2e, 0xe5, 0x2e, 0xc3, 0x13, 0xfe, 0xe5, 0x2f,
|
||||
0x13, 0xff, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0x12, 0x1e, 0xc3, 0xe0, 0xfa, 0xa3, 0xe0, 0x2f, 0xff,
|
||||
0xea, 0x12, 0x1e, 0xab, 0xe0, 0xfa, 0xa3, 0xe0, 0xd3, 0x9f, 0xea, 0x9e, 0x40, 0x4e, 0x74, 0x54,
|
||||
0x25, 0x2a, 0xf8, 0xed, 0x44, 0x02, 0xf2, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0x12, 0x1e, 0xc3, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0x25, 0x2f, 0xff, 0xe5, 0x2e, 0x12, 0x1e, 0xab, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3,
|
||||
0x9f, 0xec, 0x9e, 0x40, 0x1f, 0x78, 0xab, 0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0x12, 0x1f, 0x7e,
|
||||
0x44, 0x01, 0xf2, 0x12, 0x1f, 0xeb, 0xe5, 0x2a, 0xc3, 0x9f, 0x50, 0x16, 0x90, 0x00, 0xa8, 0xe0,
|
||||
0x04, 0xf0, 0x80, 0x0e, 0x12, 0x1f, 0x7f, 0x54, 0xfe, 0xf2, 0x80, 0x06, 0x12, 0x1f, 0x7f, 0x54,
|
||||
0xfd, 0xf2, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0x12, 0x1e, 0xc3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12,
|
||||
0x1e, 0xad, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x13, 0xed, 0x9f, 0xff,
|
||||
0xec, 0x9e, 0xf8, 0xe5, 0x2a, 0x25, 0xe0, 0x24, 0x00, 0xc8, 0xf2, 0x08, 0xef, 0xf2, 0x80, 0x0b,
|
||||
0xe5, 0x2a, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0x05, 0x2a, 0x15, 0x2b, 0xe5,
|
||||
0x2b, 0x60, 0x03, 0x02, 0x1b, 0xe7, 0x22, 0x15, 0x68, 0x15, 0x68, 0x12, 0x1f, 0xfc, 0x30, 0xe5,
|
||||
0x06, 0x54, 0xdf, 0xf6, 0x02, 0x1d, 0xf0, 0x78, 0xa6, 0xe6, 0x7f, 0x02, 0x60, 0x02, 0x7f, 0x05,
|
||||
0xa8, 0x68, 0xa6, 0x07, 0xe5, 0x63, 0xc3, 0x94, 0x28, 0x40, 0x26, 0xa8, 0x68, 0x08, 0xe4, 0xf6,
|
||||
0x12, 0x1f, 0xeb, 0xa8, 0x68, 0x08, 0xe6, 0xfe, 0xc3, 0x9f, 0x50, 0x30, 0x12, 0x1e, 0xd2, 0x2e,
|
||||
0x12, 0x1f, 0x00, 0xff, 0xa8, 0x68, 0xe6, 0xfd, 0x12, 0x2a, 0x85, 0xa8, 0x68, 0x08, 0x06, 0x80,
|
||||
0xdf, 0x12, 0x1e, 0xd2, 0x12, 0x1e, 0xfe, 0xff, 0xa8, 0x68, 0xe6, 0xfd, 0x12, 0x1e, 0xcf, 0x25,
|
||||
0x60, 0x12, 0x1f, 0x00, 0xff, 0xa8, 0x68, 0xe6, 0xfd, 0x12, 0x2a, 0x85, 0x90, 0xff, 0x52, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x63, 0x12, 0x1f, 0x39, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff,
|
||||
0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x75, 0xf0, 0x0e, 0xe5, 0x60, 0x12, 0x1f, 0x3c, 0xee, 0xf0,
|
||||
0xa3, 0xef, 0xf0, 0x05, 0x63, 0x05, 0x63, 0x05, 0x60, 0x05, 0x60, 0x78, 0xad, 0x16, 0xe6, 0x70,
|
||||
0x0f, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x02, 0x1e, 0xa6,
|
||||
0x78, 0xad, 0xe6, 0x70, 0x03, 0x02, 0x1e, 0xa6, 0xa8, 0x68, 0x76, 0x64, 0xa8, 0x68, 0x08, 0xe4,
|
||||
0xf6, 0x12, 0x1f, 0xbc, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x07, 0xa8, 0x68, 0x08, 0x74, 0x01,
|
||||
0x46, 0xf6, 0x90, 0xff, 0x58, 0xe0, 0x20, 0xe7, 0x07, 0xa8, 0x68, 0x08, 0x74, 0x02, 0x46, 0xf6,
|
||||
0xa8, 0x68, 0x08, 0xe6, 0x64, 0x03, 0x60, 0x06, 0xa8, 0x68, 0x16, 0xe6, 0x70, 0xd6, 0xe5, 0x63,
|
||||
0xc3, 0x94, 0x28, 0x40, 0x2f, 0xa8, 0x68, 0xe4, 0xf6, 0x12, 0x1f, 0xeb, 0xa8, 0x68, 0xe6, 0xfe,
|
||||
0xc3, 0x9f, 0x50, 0x12, 0x12, 0x1e, 0xd2, 0x2e, 0x12, 0x1f, 0x00, 0xff, 0x7d, 0x06, 0x12, 0x2a,
|
||||
0xd9, 0xa8, 0x68, 0x06, 0x80, 0xe3, 0x78, 0xa7, 0x12, 0x1f, 0xc8, 0x78, 0xa9, 0x12, 0x1f, 0x62,
|
||||
0x78, 0xa8, 0x80, 0x23, 0x12, 0x1e, 0xd2, 0x12, 0x1e, 0xfe, 0xff, 0x7d, 0x06, 0x12, 0x1e, 0xcf,
|
||||
0x25, 0x60, 0x12, 0x1f, 0x00, 0xff, 0x7d, 0x06, 0x12, 0x2a, 0x85, 0x78, 0xa2, 0x12, 0x1f, 0xc8,
|
||||
0x78, 0xa3, 0x12, 0x1f, 0x62, 0x78, 0xa1, 0xe6, 0x90, 0xff, 0x48, 0xf0, 0xe5, 0x63, 0x12, 0x1f,
|
||||
0x2a, 0xe0, 0x90, 0xff, 0x54, 0xf0, 0x75, 0xf0, 0x0e, 0xe5, 0x60, 0x12, 0x1f, 0x2d, 0xe0, 0x90,
|
||||
0xff, 0x5c, 0xf0, 0x12, 0x20, 0x06, 0x05, 0x68, 0x05, 0x68, 0x22, 0x3e, 0xfe, 0xe5, 0x2a, 0x75,
|
||||
0xf0, 0x0e, 0xa4, 0x24, 0xaa, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0xe5, 0x2a,
|
||||
0x75, 0xf0, 0x0e, 0xa4, 0x24, 0xac, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x12,
|
||||
0x2a, 0x85, 0xe5, 0x62, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x61, 0xf5, 0x83, 0xe5, 0x82, 0x22,
|
||||
0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x75, 0xf0, 0x0e, 0xe5, 0x22, 0xa4, 0x24, 0xb3, 0xf5, 0x82, 0xe5,
|
||||
0xf0, 0x34, 0x00, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x75, 0xf0, 0x0e, 0x22, 0x25, 0x63,
|
||||
0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0x75, 0xf0, 0x0e, 0xa4, 0x24, 0xb5,
|
||||
0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x7b, 0xfe, 0x02,
|
||||
0x0c, 0xb2, 0xf6, 0x85, 0x62, 0x82, 0x85, 0x61, 0x83, 0x22, 0x75, 0xf0, 0x0e, 0xa4, 0x24, 0xa9,
|
||||
0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x0e, 0xa4, 0x24, 0xb1, 0xf5,
|
||||
0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0xa4, 0x24, 0xae,
|
||||
0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x93, 0xf6, 0x85, 0x1e, 0x82, 0x85, 0x1d,
|
||||
0x83, 0x22, 0xff, 0xe6, 0xfe, 0xef, 0x2e, 0x90, 0xff, 0x55, 0xf0, 0x74, 0x7e, 0x25, 0x60, 0xf8,
|
||||
0xe2, 0x2e, 0x90, 0xff, 0x5d, 0xf0, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x02, 0x0c, 0xb2, 0xf6, 0x74,
|
||||
0x54, 0x25, 0x2a, 0xf8, 0xe2, 0x22, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0xa4, 0x24, 0xaf, 0xf5, 0x82,
|
||||
0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x0e, 0xa4, 0x24, 0xb3, 0xf5, 0x82, 0xe5,
|
||||
0xf0, 0x34, 0x00, 0xf5, 0x83, 0x22, 0xe5, 0x2d, 0x94, 0x00, 0xe5, 0x2c, 0x64, 0x80, 0x94, 0x80,
|
||||
0x22, 0x7e, 0x02, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0xa9, 0x02, 0x0c, 0xb2, 0x78, 0xa5, 0xe6, 0x90,
|
||||
0xff, 0x55, 0xf0, 0x90, 0xff, 0x5d, 0xf0, 0x22, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x74, 0x7e, 0x25,
|
||||
0x63, 0xf8, 0xe2, 0x22, 0x78, 0xab, 0xe6, 0x44, 0x10, 0xf6, 0x22, 0x78, 0xaf, 0xe6, 0xfd, 0xe4,
|
||||
0xff, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x7b, 0xfe, 0x02, 0x0c, 0xb2, 0x78, 0xaf, 0xe6, 0xc3, 0x13,
|
||||
0xff, 0x22, 0xc3, 0x74, 0x08, 0x93, 0x9f, 0x74, 0x07, 0x93, 0x9e, 0x22, 0x90, 0xff, 0x43, 0x74,
|
||||
0x9f, 0xf0, 0x78, 0xa4, 0xe6, 0x22, 0x90, 0xff, 0x40, 0x74, 0x09, 0xf0, 0x22, 0xe4, 0x78, 0xab,
|
||||
0xf6, 0x78, 0xa4, 0xe6, 0x30, 0xe0, 0x05, 0x12, 0x26, 0xc6, 0x80, 0x04, 0xe4, 0x78, 0xac, 0xf6,
|
||||
0x78, 0xaa, 0xe6, 0x70, 0x03, 0x02, 0x20, 0xb5, 0x14, 0x70, 0x03, 0x02, 0x21, 0x50, 0x14, 0x60,
|
||||
0x24, 0x14, 0x60, 0x03, 0x02, 0x21, 0x5b, 0x12, 0x2c, 0xee, 0x7f, 0xff, 0x12, 0x28, 0x35, 0x12,
|
||||
0x1f, 0xdb, 0x12, 0x1b, 0xde, 0x78, 0xab, 0xe6, 0x30, 0xe1, 0x04, 0x78, 0xae, 0x76, 0x28, 0x12,
|
||||
0x1f, 0xdb, 0x02, 0x22, 0x98, 0x12, 0x1f, 0x23, 0x74, 0x08, 0x93, 0x25, 0xe0, 0xf5, 0x24, 0x74,
|
||||
0x07, 0x93, 0x33, 0xf5, 0x23, 0x12, 0x2c, 0xee, 0x7f, 0xff, 0x12, 0x28, 0x35, 0x12, 0x2c, 0xee,
|
||||
0xe4, 0xf5, 0x22, 0xe5, 0x22, 0xc3, 0x78, 0xaf, 0x96, 0x50, 0x35, 0x12, 0x1e, 0xe5, 0xe5, 0x22,
|
||||
0x12, 0x1e, 0xb2, 0x12, 0x1e, 0xe0, 0xe5, 0x22, 0x12, 0x1e, 0xc3, 0x12, 0x1e, 0xe0, 0xe5, 0x22,
|
||||
0x12, 0x1f, 0x0d, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x22, 0x12, 0x1f, 0x0a, 0xe0, 0xfe, 0xa3,
|
||||
0xe0, 0xc3, 0x95, 0x24, 0xee, 0x95, 0x23, 0x50, 0x03, 0x12, 0x1f, 0xd4, 0x05, 0x22, 0x80, 0xc3,
|
||||
0x78, 0xaa, 0x76, 0x03, 0x22, 0xe4, 0x78, 0xae, 0xf6, 0x78, 0xab, 0xf6, 0x7f, 0x30, 0xfd, 0x12,
|
||||
0x1f, 0xb1, 0x7f, 0x50, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x00, 0x12, 0x1f, 0x77, 0x7f, 0x28, 0x7a,
|
||||
0x00, 0x79, 0x54, 0x12, 0x1f, 0xe2, 0x12, 0x1f, 0x23, 0x74, 0x02, 0x93, 0x78, 0xaf, 0xf6, 0x78,
|
||||
0xa6, 0xe6, 0x30, 0xe0, 0x05, 0x75, 0x23, 0x05, 0x80, 0x03, 0x75, 0x23, 0x02, 0xe4, 0xf5, 0x24,
|
||||
0xe4, 0xf5, 0x22, 0xe5, 0x22, 0xc3, 0x78, 0xaf, 0x96, 0x50, 0x50, 0x12, 0x1e, 0xd2, 0x25, 0x22,
|
||||
0x12, 0x1f, 0x00, 0xf5, 0x25, 0xe5, 0x22, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x62, 0x2f,
|
||||
0xf5, 0x82, 0xe5, 0x61, 0x3e, 0xf5, 0x83, 0xe4, 0x93, 0xf5, 0x26, 0xe4, 0xfd, 0xaf, 0x25, 0x12,
|
||||
0x2c, 0x17, 0x7d, 0x01, 0xaf, 0x26, 0x12, 0x2c, 0x17, 0xad, 0x24, 0xaf, 0x25, 0x12, 0x2b, 0xe8,
|
||||
0xad, 0x24, 0xaf, 0x26, 0x12, 0x2b, 0xe8, 0xad, 0x23, 0xaf, 0x25, 0x12, 0x2a, 0xd9, 0xad, 0x23,
|
||||
0xaf, 0x26, 0x12, 0x2a, 0xd9, 0x05, 0x22, 0x05, 0x22, 0x80, 0xa8, 0x78, 0xaa, 0x76, 0x01, 0x22,
|
||||
0x12, 0x1f, 0xdb, 0x12, 0x2b, 0x2d, 0x78, 0xaa, 0x76, 0x02, 0x22, 0xe4, 0x78, 0xaa, 0xf6, 0x22,
|
||||
0xef, 0x12, 0x0d, 0xcd, 0xe0, 0xf5, 0x29, 0xe4, 0xf5, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0xf5, 0x2a,
|
||||
0xe5, 0x29, 0x70, 0x39, 0x78, 0x02, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x01, 0x12, 0x0e, 0x73,
|
||||
0x78, 0x06, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x05, 0x12, 0x0f, 0xa3, 0xd3, 0xe5, 0x26, 0x95,
|
||||
0x28, 0xe5, 0x25, 0x95, 0x27, 0x40, 0x0c, 0xe5, 0x26, 0x95, 0x28, 0xff, 0xe5, 0x25, 0x95, 0x27,
|
||||
0xfe, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0x8e, 0x23, 0x8f, 0x24, 0x80, 0x43, 0x78, 0xb3, 0xe6,
|
||||
0x14, 0x65, 0x29, 0x70, 0x27, 0x12, 0x0d, 0x20, 0x12, 0x0e, 0x70, 0xd3, 0xe5, 0x26, 0x95, 0x24,
|
||||
0xe5, 0x25, 0x95, 0x23, 0x40, 0x0c, 0xe5, 0x26, 0x95, 0x24, 0xff, 0xe5, 0x25, 0x95, 0x23, 0xfe,
|
||||
0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0x8e, 0x27, 0x8f, 0x28, 0x80, 0x14, 0x12, 0x0d, 0x20, 0x12,
|
||||
0x0e, 0x70, 0x12, 0x0d, 0x4e, 0x24, 0x06, 0x12, 0x0d, 0x48, 0x24, 0x05, 0xf8, 0x12, 0x0f, 0xa3,
|
||||
0xae, 0x25, 0xaf, 0x26, 0xe4, 0xfc, 0xfd, 0x12, 0x0d, 0x4e, 0x24, 0xf9, 0xf5, 0x82, 0xe4, 0x34,
|
||||
0x03, 0x12, 0x0d, 0xf6, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x23, 0xaf, 0x24,
|
||||
0xe4, 0xfc, 0xfd, 0x12, 0x0d, 0x4e, 0x12, 0x0d, 0xa1, 0x12, 0x0d, 0xf8, 0xd0, 0x03, 0xd0, 0x02,
|
||||
0xd0, 0x01, 0xd0, 0x00, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0x12, 0x0d, 0xb5, 0xc0, 0x04, 0xc0, 0x05,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0xae, 0x27, 0xaf, 0x28, 0xe4, 0xfc, 0xfd, 0x12, 0x0d, 0x4e, 0x24, 0xfd,
|
||||
0xf5, 0x82, 0xe4, 0x34, 0x03, 0x12, 0x0d, 0xf6, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00,
|
||||
0xef, 0x2b, 0xf5, 0x2d, 0xee, 0x3a, 0xf5, 0x2c, 0xed, 0x39, 0xf5, 0x2b, 0xec, 0x38, 0xf5, 0x2a,
|
||||
0x12, 0x0e, 0x9a, 0xc3, 0x13, 0xfe, 0xef, 0x13, 0xff, 0xef, 0x25, 0x2d, 0xff, 0xee, 0x12, 0x0f,
|
||||
0x5d, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0e, 0x9a, 0xab, 0x07, 0xfa, 0xe4, 0xf9, 0xf8, 0xd0, 0x07,
|
||||
0xd0, 0x06, 0x12, 0x0f, 0x69, 0xe5, 0x2d, 0x24, 0x20, 0xff, 0xe4, 0x12, 0x0f, 0x5d, 0xe4, 0x7b,
|
||||
0x40, 0xfa, 0xf9, 0xf8, 0x12, 0x0f, 0x69, 0x22, 0x8f, 0x2a, 0x8d, 0x2b, 0x78, 0xae, 0xe6, 0x60,
|
||||
0x01, 0x16, 0x12, 0x1e, 0xbe, 0x12, 0x1e, 0xf5, 0xe5, 0x2a, 0x12, 0x1e, 0xb2, 0xe0, 0xfc, 0xa3,
|
||||
0xe0, 0xc3, 0x9f, 0xf5, 0x2d, 0xec, 0x9e, 0xf5, 0x2c, 0x12, 0x1f, 0x86, 0xe0, 0xf5, 0x2e, 0x78,
|
||||
0xae, 0xe6, 0x60, 0x09, 0xd3, 0x12, 0x1f, 0xa6, 0x40, 0x03, 0x02, 0x23, 0xb2, 0xaf, 0x2d, 0xae,
|
||||
0x2c, 0x12, 0x2d, 0xa5, 0x12, 0x1f, 0x23, 0x12, 0x1f, 0xf2, 0x50, 0x0d, 0x12, 0x1f, 0xa6, 0x40,
|
||||
0x04, 0x05, 0x2e, 0x80, 0x57, 0x15, 0x2e, 0x80, 0x53, 0x12, 0x1f, 0x48, 0xe0, 0xff, 0x33, 0x95,
|
||||
0xe0, 0xfe, 0xef, 0x25, 0x2d, 0xf5, 0x2d, 0xee, 0x35, 0x2c, 0xf5, 0x2c, 0xd3, 0xe5, 0x2d, 0x94,
|
||||
0x78, 0x12, 0x1f, 0xaa, 0x40, 0x09, 0x12, 0x1e, 0xbe, 0xe4, 0x75, 0xf0, 0x01, 0x80, 0x1a, 0xe5,
|
||||
0x2d, 0x24, 0x78, 0xe4, 0x35, 0x2c, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x75, 0xf0, 0x0e, 0xe5, 0x2a,
|
||||
0x50, 0x11, 0x12, 0x1e, 0xc3, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x09, 0xd2, 0x12, 0x1f, 0x48, 0xe4,
|
||||
0xf0, 0x80, 0x06, 0x12, 0x1f, 0x4d, 0xe5, 0x2d, 0xf0, 0xe4, 0xf5, 0x2e, 0x12, 0x1f, 0x23, 0x74,
|
||||
0x04, 0x93, 0xff, 0xd3, 0x64, 0x80, 0xf8, 0xe5, 0x2e, 0x64, 0x80, 0x98, 0x50, 0x17, 0xef, 0x33,
|
||||
0x95, 0xe0, 0xfe, 0xad, 0x2e, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 0x3e, 0xc3, 0x64,
|
||||
0x80, 0x94, 0x80, 0x50, 0x18, 0xe4, 0xf5, 0x2e, 0x75, 0xf0, 0x0e, 0xe5, 0x2a, 0x12, 0x1e, 0xb2,
|
||||
0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x1e, 0xbe, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x1f, 0x86,
|
||||
0xe5, 0x2e, 0xf0, 0x78, 0xae, 0xe6, 0x70, 0x2a, 0x12, 0x1e, 0xbe, 0x12, 0x1e, 0xf5, 0xe5, 0x2a,
|
||||
0x12, 0x1f, 0x0d, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xff, 0xec, 0x9e, 0xfe, 0x12, 0x2d, 0xa5,
|
||||
0x7c, 0x00, 0x7d, 0x02, 0x12, 0x09, 0x9c, 0x12, 0x1f, 0x23, 0x12, 0x1f, 0xf2, 0x50, 0x03, 0x12,
|
||||
0x1f, 0xd4, 0x05, 0x2a, 0x15, 0x2b, 0xe5, 0x2b, 0x60, 0x03, 0x02, 0x22, 0xa2, 0x22, 0x8b, 0x1d,
|
||||
0x8a, 0x1e, 0x89, 0x1f, 0xe4, 0xf5, 0x20, 0xf5, 0x21, 0xf5, 0x22, 0x85, 0x65, 0x82, 0x85, 0x64,
|
||||
0x83, 0xe4, 0x93, 0xff, 0xe5, 0x20, 0xc3, 0x9f, 0x40, 0x03, 0x02, 0x24, 0x9f, 0x12, 0x2d, 0x85,
|
||||
0x74, 0x01, 0x93, 0xf5, 0x23, 0x12, 0x2d, 0x7f, 0x74, 0x02, 0x93, 0xf5, 0x24, 0x12, 0x2d, 0x7f,
|
||||
0x74, 0x04, 0x93, 0xfc, 0x74, 0x05, 0x93, 0xfd, 0xe5, 0x23, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2,
|
||||
0xfe, 0x08, 0xe2, 0xff, 0xd3, 0x9d, 0xee, 0x9c, 0x40, 0x6f, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09,
|
||||
0x35, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x24, 0x01, 0xfd, 0x18, 0xe2, 0x34, 0x00,
|
||||
0xfc, 0x12, 0x09, 0x47, 0x8e, 0x25, 0x8f, 0x26, 0x12, 0x2d, 0x7f, 0x74, 0x03, 0x93, 0x30, 0xe7,
|
||||
0x2b, 0x54, 0x7f, 0xc3, 0x95, 0x26, 0xff, 0xe4, 0x95, 0x25, 0xfe, 0x12, 0x2d, 0xa5, 0xc3, 0x74,
|
||||
0x03, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x40, 0x2e, 0xaf, 0x20, 0x74, 0x01, 0xa8,
|
||||
0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x21, 0x80, 0x1d, 0x12, 0x2d, 0x7f, 0x74,
|
||||
0x03, 0x93, 0xc3, 0x95, 0x26, 0xe4, 0x95, 0x25, 0x50, 0x0f, 0xaf, 0x20, 0x74, 0x01, 0xa8, 0x07,
|
||||
0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x21, 0x12, 0x2d, 0x7f, 0x74, 0x01, 0x93, 0x24,
|
||||
0x54, 0xf8, 0xe2, 0xc3, 0x13, 0x20, 0xe0, 0x0f, 0x12, 0x2d, 0x7f, 0x74, 0x02, 0x93, 0x24, 0x54,
|
||||
0xf8, 0xe2, 0xc3, 0x13, 0x30, 0xe0, 0x03, 0x75, 0x22, 0x01, 0x05, 0x20, 0x02, 0x23, 0xcb, 0x90,
|
||||
0x04, 0xd0, 0xe0, 0x65, 0x21, 0x60, 0x0a, 0xe5, 0x21, 0xf0, 0xe4, 0x90, 0x04, 0xcf, 0xf0, 0x80,
|
||||
0x14, 0x90, 0x04, 0xcf, 0xe0, 0x04, 0xf0, 0xc3, 0x94, 0x03, 0x40, 0x09, 0xe0, 0x14, 0xf0, 0x90,
|
||||
0x04, 0xd1, 0xe5, 0x21, 0xf0, 0x90, 0x04, 0xd1, 0xe0, 0xab, 0x1d, 0xaa, 0x1e, 0xa9, 0x1f, 0x12,
|
||||
0x09, 0x01, 0xaf, 0x22, 0x22, 0xe4, 0x78, 0x83, 0xf6, 0x08, 0xf6, 0x78, 0x7d, 0xf6, 0x08, 0xf6,
|
||||
0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0xf5, 0x22, 0xff, 0xf5, 0x23, 0x7e, 0xff, 0xe5,
|
||||
0x22, 0xc3, 0x78, 0xb3, 0x96, 0x40, 0x03, 0x02, 0x25, 0x81, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0,
|
||||
0x24, 0x02, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x01,
|
||||
0xf8, 0xe2, 0x2d, 0xf5, 0x28, 0x18, 0xe2, 0x3c, 0xf5, 0x27, 0x12, 0x0f, 0x93, 0x78, 0x83, 0xe6,
|
||||
0xfc, 0x08, 0xe6, 0xfd, 0x74, 0x08, 0x93, 0x2d, 0xfb, 0x74, 0x07, 0x93, 0x3c, 0xfa, 0xd3, 0xe5,
|
||||
0x28, 0x9b, 0xe5, 0x27, 0x9a, 0x40, 0x05, 0x7f, 0x01, 0x18, 0x80, 0x39, 0x12, 0x0f, 0x93, 0x74,
|
||||
0x08, 0x93, 0x25, 0x28, 0xfb, 0x74, 0x07, 0x93, 0x35, 0x27, 0xfa, 0xd3, 0xed, 0x9b, 0xec, 0x9a,
|
||||
0x40, 0x2a, 0xef, 0x60, 0x1e, 0xe4, 0xff, 0x12, 0x0f, 0x88, 0xfc, 0x08, 0xe6, 0xfd, 0xe5, 0x23,
|
||||
0x25, 0xe0, 0x24, 0x7d, 0xf8, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x05, 0x23, 0xe5, 0x23, 0xc3, 0x94,
|
||||
0x03, 0x50, 0x0e, 0x78, 0x83, 0xa6, 0x27, 0x08, 0xa6, 0x28, 0xae, 0x22, 0x05, 0x22, 0x02, 0x24,
|
||||
0xef, 0xef, 0x60, 0x1c, 0xe5, 0x23, 0xc3, 0x94, 0x02, 0x50, 0x15, 0x12, 0x0f, 0x88, 0xfe, 0x08,
|
||||
0xe6, 0xff, 0xe5, 0x23, 0x25, 0xe0, 0x24, 0x7d, 0xf8, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x05, 0x23,
|
||||
0x7b, 0x00, 0x7a, 0x00, 0x79, 0x7d, 0x75, 0x2d, 0xff, 0x12, 0x25, 0xd9, 0xb4, 0xff, 0x04, 0x7f,
|
||||
0xff, 0x80, 0x07, 0x74, 0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x8f, 0x5a, 0x7b, 0x00, 0x7a, 0x00,
|
||||
0x79, 0x7d, 0x85, 0x22, 0x2d, 0x12, 0x25, 0xd9, 0xb4, 0xff, 0x04, 0x7f, 0xff, 0x80, 0x07, 0x74,
|
||||
0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x8f, 0x5b, 0x22, 0xad, 0x23, 0x12, 0x2b, 0xad, 0x8f, 0x22,
|
||||
0xe5, 0x22, 0x22, 0x8e, 0x1d, 0x8f, 0x1e, 0x12, 0x1f, 0x5b, 0xe4, 0x93, 0xff, 0x74, 0x01, 0x93,
|
||||
0xfd, 0x12, 0x18, 0xe2, 0xef, 0x64, 0x01, 0x60, 0xee, 0xe4, 0x78, 0xaa, 0xf6, 0x78, 0xac, 0xf6,
|
||||
0x85, 0x1d, 0x61, 0x85, 0x1e, 0x62, 0xe5, 0x1e, 0x24, 0x31, 0xff, 0xe4, 0x35, 0x1d, 0xfa, 0xa9,
|
||||
0x07, 0x7b, 0xff, 0x78, 0xa1, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x09, 0x12, 0x08, 0x95,
|
||||
0x7f, 0x2a, 0x7a, 0x00, 0x79, 0x7e, 0x12, 0x1f, 0xe2, 0x7f, 0x4c, 0x7d, 0x00, 0x12, 0x1f, 0xb1,
|
||||
0x12, 0x1f, 0x5b, 0x74, 0x31, 0x78, 0xa1, 0x12, 0x1f, 0x59, 0x74, 0x38, 0x78, 0xa8, 0x12, 0x1f,
|
||||
0x59, 0x74, 0x03, 0x93, 0x04, 0x78, 0xa0, 0x12, 0x1f, 0x22, 0x74, 0x05, 0x93, 0xff, 0x7e, 0x00,
|
||||
0x7c, 0x04, 0x7d, 0x00, 0x12, 0x0c, 0x85, 0xe4, 0x7b, 0xc8, 0xfa, 0xf9, 0xf8, 0x12, 0x0b, 0x22,
|
||||
0x78, 0x9e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xe4, 0x78, 0xad, 0xf6, 0x43, 0x95, 0x80, 0x90, 0xff,
|
||||
0x41, 0x74, 0x07, 0xf0, 0x90, 0xff, 0x87, 0x74, 0x03, 0xf0, 0xe4, 0x90, 0xff, 0x4b, 0xf0, 0x90,
|
||||
0xff, 0x49, 0x04, 0xf0, 0x12, 0x1f, 0x5b, 0xe4, 0x93, 0xf5, 0x1f, 0xf4, 0x60, 0x0c, 0xe4, 0xfd,
|
||||
0xaf, 0x1f, 0x12, 0x2b, 0xe8, 0xe4, 0xfd, 0x12, 0x26, 0xb2, 0x12, 0x1f, 0x5b, 0x74, 0x01, 0x93,
|
||||
0xf5, 0x1f, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x1f, 0x12, 0x2b, 0xe8, 0x7d, 0x01, 0x12, 0x26,
|
||||
0xb2, 0x22, 0xaf, 0x1f, 0x12, 0x2c, 0x17, 0x7d, 0x02, 0xaf, 0x1f, 0x12, 0x2a, 0xd9, 0x7d, 0x07,
|
||||
0xaf, 0x1f, 0x12, 0x2a, 0xd9, 0x22, 0x78, 0xac, 0xe6, 0x70, 0x03, 0x02, 0x27, 0x65, 0x14, 0x70,
|
||||
0x03, 0x02, 0x27, 0x87, 0x14, 0x60, 0x26, 0x14, 0x60, 0x03, 0x02, 0x27, 0x93, 0x12, 0x2c, 0xee,
|
||||
0x7f, 0x28, 0x12, 0x28, 0x35, 0x7d, 0x02, 0x7f, 0x28, 0x12, 0x1b, 0xde, 0x78, 0xab, 0xe6, 0x30,
|
||||
0xe1, 0x04, 0x78, 0xae, 0x76, 0x28, 0x7d, 0x02, 0x7f, 0x28, 0x02, 0x22, 0x98, 0x12, 0x1f, 0x23,
|
||||
0x74, 0x08, 0x93, 0x25, 0xe0, 0xf5, 0x29, 0x74, 0x07, 0x93, 0x33, 0xf5, 0x28, 0x12, 0x2c, 0xee,
|
||||
0x7f, 0x28, 0x12, 0x28, 0x35, 0x12, 0x2c, 0xee, 0x75, 0x27, 0x28, 0xe5, 0x27, 0x12, 0x1e, 0xaf,
|
||||
0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x27, 0x12, 0x1e, 0xc0, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x75,
|
||||
0xf0, 0x0e, 0xe5, 0x27, 0x12, 0x1e, 0xb2, 0x12, 0x1e, 0xf5, 0xe5, 0x27, 0x12, 0x1f, 0x0d, 0xee,
|
||||
0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x27, 0x12, 0x1f, 0x0a, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x29,
|
||||
0xee, 0x95, 0x28, 0x50, 0x03, 0x12, 0x1f, 0xd4, 0x05, 0x27, 0xe5, 0x27, 0x64, 0x2a, 0x70, 0xbb,
|
||||
0x78, 0xac, 0x76, 0x03, 0x22, 0x7f, 0x1c, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0xd9, 0x12, 0x1f, 0x77,
|
||||
0x7f, 0x04, 0x7a, 0x00, 0x79, 0x50, 0x12, 0x1f, 0x19, 0x7f, 0x02, 0x7a, 0x00, 0x79, 0x7c, 0x12,
|
||||
0x1f, 0x19, 0x78, 0xac, 0x76, 0x01, 0x22, 0x7d, 0x02, 0x7f, 0x28, 0x12, 0x2b, 0x2d, 0x78, 0xac,
|
||||
0x76, 0x02, 0x22, 0xe4, 0x78, 0xac, 0xf6, 0x22, 0x78, 0xff, 0xe4, 0xf6, 0xd8, 0xfd, 0x90, 0x00,
|
||||
0x00, 0x7f, 0x00, 0x7e, 0x07, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x75, 0x81, 0xb3, 0x75,
|
||||
0xa0, 0x00, 0x02, 0x27, 0xf0, 0x02, 0x2e, 0xf6, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40,
|
||||
0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07,
|
||||
0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56,
|
||||
0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
|
||||
0x90, 0x2d, 0xb8, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09,
|
||||
0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8,
|
||||
0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82,
|
||||
0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf,
|
||||
0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xbf, 0xff, 0x10, 0xe4, 0xf5, 0x63, 0x75, 0x60, 0x01, 0x78, 0xaf,
|
||||
0xe6, 0xc3, 0x13, 0x78, 0xad, 0xf6, 0x80, 0x0a, 0x8f, 0x63, 0xef, 0x04, 0xf5, 0x60, 0x78, 0xad,
|
||||
0x76, 0x01, 0x78, 0xa6, 0xe6, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90,
|
||||
0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x12, 0x1f, 0xfc, 0x44, 0x20, 0x12, 0x1f,
|
||||
0x22, 0x74, 0x09, 0x93, 0xff, 0x7d, 0x06, 0x12, 0x2a, 0xd9, 0x12, 0x1f, 0x23, 0x74, 0x0a, 0x93,
|
||||
0xff, 0x7d, 0x06, 0x12, 0x2a, 0xd9, 0x78, 0xa2, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x12, 0x1f, 0xbc,
|
||||
0x90, 0xff, 0x48, 0x74, 0x02, 0xf0, 0xe4, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x18,
|
||||
0xe6, 0x30, 0xe7, 0x1e, 0x43, 0xad, 0x04, 0x12, 0x20, 0x06, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4,
|
||||
0x08, 0x75, 0x91, 0x01, 0xe4, 0xf5, 0x91, 0x80, 0xf1, 0x12, 0x1d, 0x47, 0x78, 0xad, 0xe6, 0x70,
|
||||
0xe9, 0x22, 0x53, 0xad, 0xfb, 0x12, 0x20, 0x06, 0x22, 0xe5, 0x58, 0x24, 0x05, 0x12, 0x0d, 0x18,
|
||||
0xe0, 0x60, 0x12, 0xe5, 0x58, 0x24, 0x25, 0x12, 0x0d, 0x18, 0xe0, 0x7e, 0x01, 0x60, 0x02, 0x7e,
|
||||
0x03, 0xaf, 0x06, 0x80, 0x1e, 0xe5, 0x58, 0x24, 0x25, 0x12, 0x0d, 0x18, 0xe0, 0x60, 0x12, 0xe5,
|
||||
0x58, 0x24, 0x0a, 0x12, 0x0d, 0x18, 0xe0, 0x7e, 0x02, 0x60, 0x02, 0x7e, 0x03, 0xaf, 0x06, 0x80,
|
||||
0x02, 0xe4, 0xff, 0xe5, 0x58, 0x24, 0x06, 0x12, 0x0d, 0x18, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x05,
|
||||
0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xe5, 0x58, 0x24, 0x25, 0x12, 0x0d, 0x18, 0xee, 0x12, 0x0d, 0x59,
|
||||
0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xe5, 0x58, 0x24, 0x21, 0x12, 0x0d, 0x18, 0xec, 0xf0, 0xed, 0x12,
|
||||
0x0d, 0x58, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x12, 0x0d, 0x14, 0xec, 0xf0, 0xa3, 0xed,
|
||||
0xf0, 0xe5, 0x58, 0x24, 0x06, 0x12, 0x0d, 0x18, 0xe0, 0xfe, 0xe5, 0x58, 0x24, 0x26, 0x12, 0x0d,
|
||||
0x18, 0xee, 0xf0, 0x22, 0xab, 0x07, 0xbb, 0xff, 0x03, 0x7f, 0xff, 0x22, 0xeb, 0x70, 0x0c, 0x12,
|
||||
0x0d, 0x8d, 0x74, 0x11, 0x93, 0xf5, 0x22, 0x74, 0x12, 0x80, 0x1d, 0x78, 0xb3, 0xe6, 0x14, 0xb5,
|
||||
0x03, 0x0c, 0x12, 0x0d, 0x8d, 0x74, 0x13, 0x93, 0xf5, 0x22, 0x74, 0x14, 0x80, 0x0a, 0x12, 0x0d,
|
||||
0x8d, 0x74, 0x0f, 0x93, 0xf5, 0x22, 0x74, 0x10, 0x93, 0xf5, 0x23, 0x90, 0x04, 0x73, 0xe0, 0x70,
|
||||
0x06, 0x90, 0x04, 0x9a, 0xe0, 0x60, 0x14, 0xe5, 0x23, 0x25, 0xe0, 0xff, 0xe5, 0x22, 0x33, 0xfe,
|
||||
0x7c, 0x00, 0x7d, 0x03, 0x12, 0x09, 0x47, 0x8e, 0x22, 0x8f, 0x23, 0xeb, 0x25, 0xe0, 0x25, 0xe0,
|
||||
0x24, 0x02, 0x12, 0x0e, 0xbc, 0xeb, 0x25, 0xe0, 0x12, 0x0d, 0xe9, 0xc3, 0xef, 0x95, 0x23, 0xee,
|
||||
0x95, 0x22, 0xaf, 0x03, 0x50, 0x02, 0x7f, 0xff, 0x22, 0xef, 0xb4, 0x09, 0x00, 0x50, 0x58, 0x90,
|
||||
0x29, 0xd6, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x29, 0xf1, 0x02, 0x29, 0xf7, 0x02, 0x29, 0xfd, 0x02,
|
||||
0x2a, 0x03, 0x02, 0x2a, 0x09, 0x02, 0x2a, 0x0f, 0x02, 0x2a, 0x15, 0x02, 0x2a, 0x1b, 0x02, 0x2a,
|
||||
0x21, 0x78, 0xa5, 0xa6, 0x05, 0x80, 0x33, 0x78, 0xa2, 0xa6, 0x05, 0x80, 0x2d, 0x78, 0xa4, 0xa6,
|
||||
0x05, 0x80, 0x27, 0x78, 0xa1, 0xa6, 0x05, 0x80, 0x21, 0x78, 0xa3, 0xa6, 0x05, 0x80, 0x1b, 0x78,
|
||||
0xa6, 0xa6, 0x05, 0x80, 0x15, 0x78, 0xa7, 0xa6, 0x05, 0x80, 0x0f, 0x78, 0xa8, 0xa6, 0x05, 0x80,
|
||||
0x09, 0x78, 0xa9, 0xa6, 0x05, 0x80, 0x03, 0x7f, 0x01, 0x22, 0x7f, 0x00, 0x22, 0xef, 0xb4, 0x09,
|
||||
0x00, 0x50, 0x4f, 0x90, 0x2a, 0x3a, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x2a, 0x55, 0x02, 0x2a, 0x5a,
|
||||
0x02, 0x2a, 0x5f, 0x02, 0x2a, 0x64, 0x02, 0x2a, 0x69, 0x02, 0x2a, 0x6e, 0x02, 0x2a, 0x73, 0x02,
|
||||
0x2a, 0x78, 0x02, 0x2a, 0x7d, 0x78, 0xa5, 0xe6, 0xff, 0x22, 0x78, 0xa2, 0xe6, 0xff, 0x22, 0x78,
|
||||
0xa4, 0xe6, 0xff, 0x22, 0x78, 0xa1, 0xe6, 0xff, 0x22, 0x78, 0xa3, 0xe6, 0xff, 0x22, 0x78, 0xa6,
|
||||
0xe6, 0xff, 0x22, 0x78, 0xa7, 0xe6, 0xff, 0x22, 0x78, 0xa8, 0xe6, 0xff, 0x22, 0x78, 0xa9, 0xe6,
|
||||
0xff, 0x22, 0x7f, 0x00, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2e, 0xe6, 0x93, 0xfe, 0xf4, 0xfc, 0xef,
|
||||
0x54, 0xf0, 0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x11, 0x78, 0x12, 0xed, 0x30,
|
||||
0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0x80, 0x0d, 0xef, 0x13, 0x13,
|
||||
0x54, 0x3f, 0x24, 0x11, 0xf8, 0xbd, 0x02, 0x02, 0xe4, 0xfd, 0xed, 0x30, 0xe1, 0x05, 0xe2, 0x4e,
|
||||
0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0xed, 0x30, 0xe0, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03,
|
||||
0xe2, 0x5c, 0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2e, 0xee, 0x93,
|
||||
0xfe, 0xf4, 0xfc, 0xef, 0x54, 0xf0, 0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x11,
|
||||
0x78, 0x12, 0xed, 0x30, 0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0x80,
|
||||
0x0d, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf8, 0xbd, 0x02, 0x02, 0xe4, 0xfd, 0xed, 0x30,
|
||||
0xe1, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0xed, 0x30, 0xe0, 0x05, 0xe2,
|
||||
0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x8f, 0x2a, 0x8d,
|
||||
0x2b, 0x12, 0x2c, 0xee, 0x78, 0xa1, 0xe6, 0xff, 0x78, 0xa8, 0xe6, 0xfe, 0x78, 0xa1, 0x76, 0x04,
|
||||
0x78, 0xa8, 0x76, 0x04, 0xe5, 0x2a, 0x12, 0x1f, 0x2a, 0xe4, 0xf0, 0x75, 0xf0, 0x0e, 0xe5, 0x2a,
|
||||
0xa4, 0x24, 0xb7, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0xe4, 0xf0, 0x15, 0x2b, 0x15,
|
||||
0x2b, 0x05, 0x2a, 0x05, 0x2a, 0xe5, 0x2b, 0x70, 0xdb, 0x78, 0xa1, 0xa6, 0x07, 0x78, 0xa8, 0xa6,
|
||||
0x06, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0,
|
||||
0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12,
|
||||
0x1d, 0x47, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01,
|
||||
0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x8d, 0x2c, 0xe4,
|
||||
0xff, 0xf5, 0x2e, 0xf5, 0x2f, 0x7e, 0xff, 0xef, 0xc3, 0x95, 0x2c, 0x50, 0x28, 0xef, 0x65, 0x2d,
|
||||
0x60, 0x19, 0x12, 0x09, 0xe8, 0xfd, 0xac, 0xf0, 0xd3, 0x95, 0x2f, 0xec, 0x95, 0x2e, 0x40, 0x0b,
|
||||
0xed, 0x24, 0x20, 0xf5, 0x2f, 0xe4, 0x3c, 0xf5, 0x2e, 0xae, 0x07, 0x0f, 0x74, 0x02, 0x29, 0xf9,
|
||||
0xe4, 0x3a, 0xfa, 0x80, 0xd2, 0xaf, 0x06, 0x22, 0x12, 0x2d, 0x71, 0xc2, 0xaf, 0x75, 0xa0, 0xff,
|
||||
0xbf, 0x01, 0x04, 0x7e, 0x18, 0x80, 0x08, 0xef, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x12, 0xfe, 0xed,
|
||||
0xa8, 0x06, 0x60, 0x05, 0xe2, 0x4c, 0xf2, 0x80, 0x08, 0xe2, 0xff, 0xec, 0xf4, 0xfd, 0xef, 0x5d,
|
||||
0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x12, 0x2d, 0x71, 0x90, 0xff, 0x13, 0xd3, 0x94, 0x03,
|
||||
0x40, 0x0f, 0xef, 0x75, 0xf0, 0x04, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5,
|
||||
0x83, 0xed, 0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0,
|
||||
0x22, 0x90, 0x04, 0xcc, 0xe0, 0x24, 0x01, 0xff, 0x90, 0x04, 0xcb, 0xe0, 0x34, 0x00, 0x8f, 0xf0,
|
||||
0x12, 0x0a, 0x4b, 0x90, 0x04, 0xce, 0xe0, 0x24, 0x02, 0xff, 0x90, 0x04, 0xcd, 0xe0, 0x34, 0x00,
|
||||
0x90, 0x00, 0x02, 0x8f, 0xf0, 0x02, 0x0a, 0x6a, 0xab, 0x1d, 0xe5, 0x1f, 0x24, 0x0c, 0xf9, 0xe4,
|
||||
0x35, 0x1e, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 0x26, 0xf9, 0xee, 0x3a, 0xfa, 0x12, 0x08, 0xbb, 0xff,
|
||||
0x22, 0xab, 0x1d, 0xaa, 0x1e, 0xa9, 0x1f, 0x90, 0x00, 0x0b, 0x12, 0x08, 0xd4, 0xff, 0x22, 0x75,
|
||||
0xf0, 0x0e, 0xef, 0xa4, 0x24, 0xaa, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0xf5, 0x83, 0xe0, 0xfe,
|
||||
0xa3, 0xe0, 0xff, 0x22, 0x75, 0xf0, 0x0e, 0xef, 0xa4, 0x24, 0xa9, 0xf5, 0x82, 0xe5, 0xf0, 0x34,
|
||||
0x00, 0xf5, 0x83, 0x22, 0x53, 0xac, 0xfd, 0x75, 0x88, 0x08, 0xef, 0x75, 0xf0, 0x20, 0xa4, 0xff,
|
||||
0xe5, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0xe4, 0x90, 0x04, 0xd4, 0xf0, 0x75, 0x88, 0xa0,
|
||||
0x22, 0x8f, 0x18, 0xc2, 0xaf, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74, 0xc0, 0xf0, 0x90, 0xff,
|
||||
0x01, 0x74, 0x0f, 0xf0, 0x74, 0x0d, 0xf0, 0x43, 0x95, 0x60, 0xe4, 0xf5, 0x96, 0x22, 0x78, 0xad,
|
||||
0xe6, 0x70, 0xfb, 0xff, 0xef, 0x12, 0x1f, 0x39, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x12, 0x1f,
|
||||
0x97, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0x0f, 0xbf, 0x2a, 0xea, 0x22, 0x90, 0xff, 0x54, 0xf0, 0x90,
|
||||
0xff, 0x5c, 0xf0, 0x90, 0xff, 0x48, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x78, 0xee,
|
||||
0x94, 0x00, 0x22, 0xef, 0x24, 0x3a, 0xf5, 0x65, 0xe4, 0x3e, 0xf5, 0x64, 0x7e, 0x00, 0x7f, 0x03,
|
||||
0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x04, 0x79, 0xcf, 0x02, 0x0c, 0xb2, 0xef, 0x14, 0x60, 0x08, 0x04,
|
||||
0x70, 0x0a, 0x8d, 0x59, 0x7f, 0x00, 0x22, 0x8d, 0x5d, 0x7f, 0x00, 0x22, 0x7f, 0x01, 0x22, 0xef,
|
||||
0xc3, 0x94, 0x28, 0x50, 0x08, 0x12, 0x2c, 0xa4, 0xed, 0xf0, 0x7f, 0x00, 0x22, 0x7f, 0x01, 0x22,
|
||||
0x75, 0xf0, 0x0e, 0xef, 0xa4, 0x24, 0xac, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x00, 0x12, 0x2c, 0x9c,
|
||||
0x22, 0xef, 0x54, 0x07, 0x90, 0x2e, 0xee, 0x93, 0xfc, 0xef, 0xc4, 0x54, 0x0f, 0xff, 0x22, 0x85,
|
||||
0x65, 0x82, 0x85, 0x64, 0x83, 0x75, 0xf0, 0x05, 0xe5, 0x20, 0x02, 0x0c, 0x79, 0x78, 0xaa, 0xa6,
|
||||
0x07, 0xef, 0x70, 0x04, 0x78, 0xac, 0xa6, 0x07, 0x22, 0xef, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2,
|
||||
0xfe, 0x08, 0xe2, 0xff, 0x22, 0xee, 0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe,
|
||||
0x22, 0x74, 0x7e, 0x2f, 0xf8, 0xed, 0xf2, 0x22, 0x41, 0x04, 0xd2, 0x00, 0x00, 0x78, 0xaa, 0xe6,
|
||||
0xff, 0x22, 0x12, 0x2c, 0x8f, 0x22, 0x12, 0x2c, 0x8f, 0x22, 0x44, 0x54, 0x0e, 0x01, 0x0f, 0x78,
|
||||
0x0f, 0x00, 0x64, 0x43, 0x42, 0x41, 0x40, 0x61, 0x60, 0x77, 0x76, 0x75, 0x70, 0x57, 0x56, 0x55,
|
||||
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x14, 0x80, 0x64,
|
||||
0x40, 0x40, 0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
|
||||
0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc8, 0x00, 0xc8,
|
||||
0x00, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x44, 0x54,
|
||||
0x0a, 0x01, 0x0f, 0x78, 0x14, 0x00, 0x3c, 0x57, 0x42, 0x70, 0x41, 0x75, 0x40, 0x76, 0x61, 0x77,
|
||||
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
|
||||
0x19, 0x28, 0x80, 0x78, 0x00, 0x40, 0x0e, 0x14, 0x00, 0x0a, 0x0a, 0x85, 0x00, 0x8c, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x05, 0x00, 0xef, 0x00, 0xef, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xc8, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02,
|
||||
0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||
0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02,
|
||||
0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x7f, 0x02, 0x91, 0xd1, 0x7f, 0x0a, 0x91, 0xb4, 0xf1, 0x0a,
|
||||
0xd2, 0xaf, 0xe4, 0xf5, 0x8a, 0x12, 0x32, 0x76, 0x80, 0xf8, 0x75, 0x0a, 0x04, 0xe4, 0x90, 0x04,
|
||||
0xd3, 0xf0, 0x22, 0xf1, 0xd8, 0x7d, 0x03, 0x7f, 0x12, 0x51, 0xd9, 0x7c, 0x02, 0x7d, 0xf5, 0x7f,
|
||||
0x15, 0xf1, 0x8f, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0xf5, 0x12,
|
||||
0x0c, 0xb2, 0x90, 0x03, 0x9c, 0x74, 0x20, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0xf0, 0xe4, 0x90,
|
||||
0x03, 0xe1, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x06, 0xf0, 0x90,
|
||||
0x03, 0xef, 0x74, 0x71, 0xf0, 0xe4, 0x90, 0x03, 0xf2, 0xf0, 0x78, 0xb1, 0xf6, 0xf1, 0x64, 0xe4,
|
||||
0x78, 0xb0, 0xf6, 0x22, 0x90, 0x03, 0xf2, 0xe0, 0xff, 0x30, 0xe0, 0x05, 0x43, 0x90, 0x10, 0x80,
|
||||
0x03, 0x53, 0x90, 0xef, 0xef, 0x90, 0xff, 0x10, 0x30, 0xe1, 0x06, 0xe0, 0x54, 0xe7, 0xf0, 0x80,
|
||||
0x04, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0x03, 0xf2, 0xe0, 0x30, 0xe2, 0x02, 0xf1, 0xe0, 0x22, 0xab,
|
||||
0x07, 0x8c, 0x66, 0x8d, 0x67, 0x12, 0x35, 0x7c, 0x54, 0xe7, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44,
|
||||
0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, 0xf0, 0xe4, 0x90, 0x04, 0xd5, 0xf0, 0x43, 0x90,
|
||||
0x10, 0x53, 0xac, 0xef, 0xf5, 0xa3, 0xeb, 0x44, 0x80, 0xf5, 0xa1, 0x75, 0xa6, 0x68, 0x75, 0xa2,
|
||||
0x81, 0x75, 0xd3, 0x00, 0x75, 0xd2, 0xff, 0xe0, 0x7c, 0x00, 0x25, 0x67, 0xff, 0xec, 0x35, 0x66,
|
||||
0xf5, 0xd7, 0x8f, 0xd6, 0x75, 0xd1, 0x1a, 0x22, 0x90, 0xff, 0x18, 0xe0, 0x44, 0x04, 0xf0, 0x22,
|
||||
0x90, 0xff, 0x19, 0xe0, 0x44, 0x04, 0xf0, 0x53, 0xac, 0xf7, 0x22, 0xac, 0x07, 0xe4, 0xfe, 0x90,
|
||||
0x03, 0xf2, 0xe0, 0x30, 0xe2, 0x0a, 0x90, 0xff, 0x19, 0xe0, 0x54, 0xfb, 0xf0, 0x43, 0xac, 0x08,
|
||||
0x90, 0xff, 0x18, 0xe0, 0x54, 0xfb, 0xf0, 0x0e, 0xee, 0xc3, 0x9c, 0x50, 0x1f, 0xe4, 0xf5, 0x27,
|
||||
0xf5, 0x28, 0xc3, 0xe5, 0x28, 0x94, 0x46, 0xe5, 0x27, 0x94, 0x00, 0x50, 0xea, 0xe4, 0x90, 0x04,
|
||||
0xd4, 0xf0, 0x05, 0x28, 0xe5, 0x28, 0x70, 0x02, 0x05, 0x27, 0x80, 0xe6, 0x12, 0x2f, 0xd8, 0x90,
|
||||
0x03, 0xf2, 0xe0, 0x30, 0xe2, 0x03, 0x12, 0x2f, 0xe0, 0x22, 0x8b, 0x1d, 0x8a, 0x1e, 0x89, 0x1f,
|
||||
0x8d, 0x20, 0x90, 0x03, 0xef, 0xe0, 0xf5, 0x21, 0xe4, 0xf5, 0x22, 0x85, 0x20, 0x20, 0x12, 0x2f,
|
||||
0xd8, 0x90, 0x03, 0x9a, 0xe0, 0x64, 0x03, 0x70, 0x3e, 0x91, 0x57, 0x93, 0xf5, 0x24, 0xe4, 0xf5,
|
||||
0x23, 0xe5, 0x23, 0xc3, 0x95, 0x24, 0x50, 0x22, 0xe5, 0x0c, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35,
|
||||
0x0b, 0xf5, 0x83, 0xe5, 0x82, 0x25, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93,
|
||||
0xff, 0xe4, 0xfd, 0x12, 0x2a, 0xd9, 0x05, 0x23, 0x80, 0xd7, 0xe4, 0xfd, 0x7f, 0x12, 0x12, 0x2a,
|
||||
0xd9, 0xb1, 0x5a, 0x7f, 0x02, 0xa1, 0x76, 0x51, 0x46, 0xff, 0x7e, 0x00, 0x60, 0x02, 0x7e, 0x01,
|
||||
0x90, 0x02, 0xf7, 0xee, 0xf0, 0xef, 0x60, 0x15, 0x51, 0x62, 0x90, 0x02, 0xf8, 0x51, 0x6b, 0x51,
|
||||
0x35, 0x90, 0x02, 0xfa, 0x51, 0x6b, 0xa3, 0x74, 0x10, 0xf0, 0xe4, 0xa3, 0xf0, 0x75, 0x23, 0x09,
|
||||
0x74, 0xf5, 0x25, 0x23, 0x51, 0x25, 0x74, 0xff, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0xb4, 0x20, 0xf0,
|
||||
0xe5, 0x20, 0x60, 0x04, 0x90, 0x02, 0xf6, 0xf0, 0x90, 0x02, 0xf7, 0xe0, 0xff, 0x78, 0xb1, 0xe6,
|
||||
0xfe, 0x6f, 0x60, 0x24, 0xa3, 0xe0, 0x54, 0x3f, 0xf0, 0xee, 0x60, 0x06, 0xe0, 0x44, 0x40, 0xf0,
|
||||
0x80, 0x0a, 0x90, 0x02, 0xf8, 0xe0, 0xf0, 0xe4, 0x90, 0x02, 0xf6, 0xf0, 0x90, 0x02, 0xf7, 0xe0,
|
||||
0x78, 0xb1, 0xf6, 0x75, 0x22, 0x01, 0x80, 0x0d, 0xee, 0x60, 0x0a, 0x90, 0x02, 0xf8, 0xe0, 0x54,
|
||||
0x3f, 0xf0, 0x44, 0x80, 0xf0, 0xe5, 0x21, 0x20, 0xe7, 0x19, 0x30, 0xe6, 0x04, 0x51, 0x46, 0x70,
|
||||
0x12, 0xe5, 0x21, 0x30, 0xe5, 0x04, 0xe5, 0x22, 0x70, 0x09, 0xe5, 0x21, 0x30, 0xe4, 0x0c, 0xe5,
|
||||
0x20, 0x60, 0x08, 0x90, 0x03, 0xe2, 0xe0, 0xff, 0x12, 0x2f, 0xeb, 0x90, 0x03, 0xf2, 0xe0, 0x78,
|
||||
0xb0, 0x66, 0x60, 0x08, 0x12, 0x2f, 0x64, 0x90, 0x03, 0xf2, 0xe0, 0xf6, 0x75, 0x24, 0x30, 0x51,
|
||||
0x2d, 0x51, 0x25, 0x74, 0x30, 0xf0, 0x74, 0xf5, 0x25, 0x24, 0x51, 0x25, 0xe5, 0x20, 0xf0, 0x05,
|
||||
0x24, 0x51, 0x46, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0x01, 0x74, 0xf5, 0x25, 0x24, 0x51, 0x25, 0xef,
|
||||
0xf0, 0x90, 0x00, 0x0a, 0x12, 0x08, 0xd4, 0x60, 0x09, 0x74, 0xf5, 0x25, 0x24, 0x51, 0x25, 0xe0,
|
||||
0x04, 0xf0, 0x05, 0x24, 0x51, 0x62, 0xfd, 0xac, 0xf0, 0xec, 0xff, 0x51, 0x1e, 0xef, 0xf0, 0xaf,
|
||||
0x05, 0x51, 0x1e, 0xef, 0xf0, 0x51, 0x35, 0xe5, 0xf0, 0xff, 0x51, 0x1e, 0xef, 0xf0, 0x51, 0x35,
|
||||
0xff, 0x51, 0x1e, 0x51, 0x52, 0xe5, 0xf0, 0xff, 0x51, 0x1e, 0x51, 0x52, 0xff, 0x51, 0x1e, 0x51,
|
||||
0x5a, 0xe5, 0xf0, 0xff, 0x51, 0x1e, 0x51, 0x5a, 0xff, 0x51, 0x1e, 0xef, 0xf0, 0x75, 0x24, 0x40,
|
||||
0x51, 0x2d, 0x51, 0x25, 0x74, 0x40, 0xf0, 0xe4, 0xf5, 0x23, 0xaf, 0x23, 0x12, 0x2d, 0xc2, 0x51,
|
||||
0x07, 0x51, 0x3b, 0x40, 0xf5, 0x75, 0x24, 0x60, 0x51, 0x2d, 0x51, 0x25, 0x74, 0x60, 0xf0, 0xe4,
|
||||
0xf5, 0x23, 0xaf, 0x23, 0x12, 0x2d, 0x99, 0x51, 0x07, 0x51, 0x3b, 0x40, 0xf5, 0x75, 0x24, 0x80,
|
||||
0x51, 0x2d, 0x51, 0x25, 0x74, 0x60, 0xf0, 0xe4, 0xf5, 0x23, 0xaf, 0x23, 0x12, 0x00, 0x09, 0x51,
|
||||
0x1e, 0xef, 0x51, 0x3d, 0x40, 0xf4, 0x22, 0x8e, 0x25, 0x8f, 0x26, 0xe5, 0x25, 0xff, 0xae, 0x24,
|
||||
0x05, 0x24, 0x74, 0xf5, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xef, 0xf0, 0xae, 0x24,
|
||||
0x05, 0x24, 0x74, 0xf5, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xaf, 0x24, 0x05,
|
||||
0x24, 0x74, 0xf5, 0x2f, 0x22, 0x90, 0x00, 0x02, 0x02, 0x0a, 0x13, 0xe5, 0x26, 0xf0, 0x05, 0x23,
|
||||
0xe5, 0x23, 0xc3, 0x94, 0x10, 0x22, 0xab, 0x1d, 0xaa, 0x1e, 0xa9, 0x1f, 0x90, 0x00, 0x04, 0x02,
|
||||
0x08, 0xd4, 0xef, 0xf0, 0x90, 0x00, 0x06, 0x02, 0x0a, 0x13, 0xef, 0xf0, 0x90, 0x00, 0x08, 0x02,
|
||||
0x0a, 0x13, 0xab, 0x1d, 0xaa, 0x1e, 0xa9, 0x1f, 0x02, 0x09, 0xe8, 0xfd, 0xac, 0xf0, 0xec, 0xf0,
|
||||
0xaf, 0x05, 0xa3, 0xef, 0xf0, 0x22, 0xe4, 0xf5, 0x08, 0x90, 0x03, 0xf4, 0xe0, 0x64, 0x01, 0x70,
|
||||
0x75, 0x85, 0x0c, 0x82, 0x85, 0x0b, 0x83, 0x93, 0xff, 0x74, 0x01, 0x93, 0xfd, 0x12, 0x18, 0xe2,
|
||||
0x7b, 0x00, 0x7a, 0x00, 0x79, 0x69, 0x12, 0x2c, 0x41, 0x78, 0x69, 0xe6, 0xfc, 0x08, 0xe6, 0xfd,
|
||||
0xec, 0x90, 0x03, 0xa5, 0x51, 0x6f, 0x08, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0xec, 0xa3, 0x51, 0x6f,
|
||||
0x91, 0x57, 0x93, 0xff, 0x90, 0x03, 0xc0, 0xf0, 0x7e, 0x00, 0xe5, 0x0c, 0x24, 0x09, 0xfd, 0xe4,
|
||||
0x35, 0x0b, 0xfa, 0xa9, 0x05, 0x7b, 0xff, 0x78, 0xc1, 0x7c, 0x03, 0x7d, 0x01, 0x12, 0x08, 0x95,
|
||||
0x75, 0x20, 0x01, 0x75, 0x21, 0x03, 0x75, 0x22, 0x35, 0x75, 0x23, 0x01, 0x75, 0x24, 0x03, 0x75,
|
||||
0x25, 0x15, 0x7b, 0x01, 0x7a, 0x03, 0x79, 0xb5, 0x12, 0x1a, 0x70, 0xe4, 0x90, 0x03, 0xf4, 0xf0,
|
||||
0x90, 0x04, 0xd4, 0xf0, 0x80, 0xda, 0x90, 0x04, 0xd3, 0xe0, 0x70, 0x02, 0x61, 0x96, 0x14, 0x70,
|
||||
0x02, 0x61, 0xbc, 0x14, 0x70, 0x02, 0x81, 0x2e, 0x24, 0xfe, 0x60, 0x02, 0x81, 0x33, 0xe4, 0xf5,
|
||||
0x1c, 0xf5, 0x1b, 0xf5, 0x1a, 0xf5, 0x19, 0x75, 0x0b, 0x2d, 0x75, 0x0c, 0xca, 0xaf, 0x0c, 0xae,
|
||||
0x0b, 0x12, 0x25, 0xe3, 0x91, 0x72, 0xe4, 0xfd, 0xff, 0x12, 0x2d, 0x3b, 0x91, 0x60, 0x91, 0x60,
|
||||
0xe4, 0xf5, 0x18, 0x91, 0x57, 0x93, 0xff, 0xe5, 0x18, 0xc3, 0x9f, 0x50, 0x39, 0xaf, 0x18, 0x12,
|
||||
0x2d, 0xc2, 0xe4, 0xfc, 0xfd, 0x7b, 0x98, 0x7a, 0x3a, 0xf9, 0xf8, 0xc3, 0x12, 0x0b, 0xb4, 0x50,
|
||||
0x21, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 0xfc, 0xa9, 0x18, 0xa8, 0x01, 0x12, 0x0b, 0xdb, 0xe5, 0x1c,
|
||||
0x4f, 0xf5, 0x1c, 0xe5, 0x1b, 0x4e, 0xf5, 0x1b, 0xe5, 0x1a, 0x4d, 0xf5, 0x1a, 0xe5, 0x19, 0x4c,
|
||||
0xf5, 0x19, 0x05, 0x18, 0x80, 0xbd, 0xaf, 0x1c, 0xae, 0x1b, 0xad, 0x1a, 0xac, 0x19, 0xb1, 0xa3,
|
||||
0x8f, 0x0a, 0x90, 0x03, 0xb6, 0xe5, 0x0a, 0xf0, 0x70, 0x02, 0x81, 0x38, 0x91, 0x79, 0xef, 0x4e,
|
||||
0x70, 0x02, 0x81, 0x38, 0x81, 0x33, 0xe4, 0xf5, 0x09, 0xaf, 0x0a, 0x91, 0x79, 0x12, 0x25, 0xe3,
|
||||
0x12, 0x2f, 0x13, 0x91, 0x72, 0xaf, 0x0c, 0xae, 0x0b, 0x12, 0x2d, 0x23, 0xe4, 0xfd, 0xff, 0x12,
|
||||
0x2d, 0x3b, 0xb1, 0x8f, 0x90, 0x04, 0xd3, 0x74, 0x01, 0xf0, 0x80, 0x7c, 0xe4, 0xf5, 0x18, 0xf5,
|
||||
0x19, 0x90, 0x03, 0xe3, 0xe0, 0xf5, 0x08, 0x91, 0x69, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x19, 0x12,
|
||||
0x23, 0xbe, 0x8f, 0x18, 0xe5, 0x19, 0x60, 0x10, 0x78, 0x71, 0x76, 0x00, 0x08, 0x76, 0x78, 0x08,
|
||||
0x76, 0x00, 0x08, 0x76, 0xfa, 0x08, 0x76, 0x01, 0x78, 0x72, 0xe6, 0x78, 0x6d, 0xf6, 0x78, 0x74,
|
||||
0xe6, 0x78, 0x6e, 0xf6, 0x78, 0x75, 0xe6, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0x01, 0x78, 0x6f, 0xa6,
|
||||
0x07, 0x78, 0x1d, 0x7c, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x6d, 0x7e, 0x00, 0x7f,
|
||||
0x03, 0x12, 0x08, 0x95, 0x90, 0x03, 0xe4, 0xe0, 0xf5, 0x20, 0x75, 0x21, 0x0f, 0xd1, 0x47, 0x78,
|
||||
0x70, 0xef, 0xf6, 0xfd, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x71, 0x11, 0x3a, 0x80, 0x0a, 0x75, 0x08,
|
||||
0x0a, 0x80, 0x05, 0xe4, 0x90, 0x04, 0xd3, 0xf0, 0xe5, 0x08, 0x60, 0x1a, 0x90, 0x04, 0xd3, 0xe0,
|
||||
0xb4, 0x02, 0x0c, 0x75, 0x88, 0x08, 0x75, 0x89, 0x80, 0x75, 0x91, 0x03, 0xe4, 0xf5, 0x91, 0xe4,
|
||||
0x90, 0x04, 0xd4, 0xf0, 0x80, 0xe2, 0x22, 0x85, 0x0c, 0x82, 0x85, 0x0b, 0x83, 0x74, 0x02, 0x22,
|
||||
0x7b, 0x00, 0x7a, 0x00, 0x79, 0x71, 0x12, 0x12, 0x03, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x71, 0x02,
|
||||
0x12, 0x03, 0xaf, 0x0c, 0xae, 0x0b, 0x02, 0x13, 0xe8, 0x91, 0x80, 0x8e, 0x0b, 0x8f, 0x0c, 0x22,
|
||||
0xef, 0x24, 0xfc, 0x70, 0x05, 0x7e, 0x2e, 0x7f, 0x4e, 0x22, 0xe4, 0xfe, 0xff, 0x22, 0x8b, 0x22,
|
||||
0x8a, 0x23, 0x89, 0x24, 0xe4, 0xf5, 0x28, 0xf5, 0x29, 0x91, 0x57, 0x93, 0xff, 0xe5, 0x29, 0xc3,
|
||||
0x9f, 0x50, 0x59, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0xb1, 0x3d, 0xff, 0x85, 0x0c, 0x82, 0x85,
|
||||
0x0b, 0x83, 0xc3, 0x74, 0x08, 0x93, 0x9f, 0x74, 0x07, 0x93, 0x95, 0xf0, 0x50, 0x3a, 0xb1, 0x4b,
|
||||
0xb1, 0x33, 0xc3, 0x9f, 0xff, 0xe5, 0xf0, 0x9e, 0xfe, 0x12, 0x2d, 0xa5, 0xc0, 0x06, 0xc0, 0x07,
|
||||
0xb1, 0x4b, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0xb1, 0x33, 0x2f, 0xff, 0xe5, 0xf0, 0x3e, 0xfe,
|
||||
0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xd0, 0x05, 0xd0, 0x04, 0xc3,
|
||||
0xed, 0x9f, 0xec, 0x9e, 0x50, 0x02, 0x05, 0x28, 0x05, 0x29, 0x80, 0x9d, 0x91, 0x57, 0x93, 0x75,
|
||||
0xf0, 0x04, 0xa4, 0xff, 0xae, 0xf0, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09, 0x47, 0xef, 0x14, 0xff,
|
||||
0xe5, 0x28, 0xc3, 0x9f, 0x40, 0x1c, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x74, 0xff, 0x12, 0x09,
|
||||
0x01, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x90, 0x00, 0x01, 0x12, 0x09, 0x13, 0xe4, 0x90, 0x04,
|
||||
0xd3, 0xf0, 0x22, 0x8f, 0x82, 0xf5, 0x83, 0x12, 0x0a, 0x13, 0xff, 0xae, 0xf0, 0x75, 0xf0, 0x02,
|
||||
0xe5, 0x29, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x02, 0x0a, 0x13, 0xe5, 0x29, 0x24, 0x01, 0xff,
|
||||
0xe4, 0x33, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0x22, 0x43, 0xac, 0x10, 0xb1, 0x7c, 0x44,
|
||||
0x18, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x54, 0xf7, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x54, 0xf7, 0xf0,
|
||||
0xe4, 0xf5, 0xa6, 0xf5, 0xa2, 0x22, 0x90, 0x04, 0xd3, 0xef, 0xf0, 0x22, 0x90, 0xff, 0x12, 0xe0,
|
||||
0x54, 0xe7, 0xf0, 0x90, 0xff, 0x11, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x22, 0x7e,
|
||||
0x00, 0x7f, 0x15, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x89, 0x12, 0x0c, 0xb2, 0x78, 0x9c,
|
||||
0x76, 0xff, 0x22, 0x8f, 0x20, 0x8e, 0x1f, 0x8d, 0x1e, 0x8c, 0x1d, 0x75, 0x21, 0x01, 0xe5, 0x21,
|
||||
0x25, 0xe0, 0x25, 0xe0, 0x24, 0xd2, 0xf5, 0x82, 0xe4, 0x34, 0x2e, 0xf5, 0x83, 0x12, 0x0b, 0xfa,
|
||||
0xab, 0x20, 0xaa, 0x1f, 0xa9, 0x1e, 0xa8, 0x1d, 0xc3, 0x12, 0x0b, 0xca, 0x70, 0x03, 0xaf, 0x21,
|
||||
0x22, 0x05, 0x21, 0xe5, 0x21, 0xb4, 0x05, 0xd6, 0x7f, 0x00, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0,
|
||||
0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03,
|
||||
0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x75, 0x89, 0x80, 0x90, 0x04, 0xd4, 0xe0, 0xc3,
|
||||
0x94, 0x14, 0x50, 0x06, 0xe0, 0x04, 0xf0, 0x75, 0x8a, 0x00, 0xe5, 0x08, 0x60, 0x02, 0x15, 0x08,
|
||||
0x12, 0x00, 0x03, 0xd1, 0x30, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0,
|
||||
0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32,
|
||||
0x78, 0x95, 0xe6, 0x60, 0x06, 0xc3, 0x94, 0xc8, 0x50, 0x01, 0x06, 0x78, 0x96, 0xe6, 0x60, 0x06,
|
||||
0xc3, 0x94, 0xc8, 0x50, 0x01, 0x06, 0x22, 0xe4, 0xf5, 0x22, 0xe5, 0x1d, 0x60, 0x07, 0xe5, 0x1e,
|
||||
0x70, 0x03, 0x02, 0x38, 0x74, 0xe5, 0x1e, 0x60, 0x07, 0xe5, 0x1d, 0x70, 0x03, 0x02, 0x38, 0x74,
|
||||
0xe5, 0x1d, 0x70, 0x03, 0x02, 0x38, 0x0b, 0xe5, 0x1e, 0x70, 0x03, 0x02, 0x38, 0x0b, 0xe5, 0x1f,
|
||||
0xd3, 0x94, 0x01, 0x40, 0x0a, 0x78, 0x9b, 0xe6, 0x94, 0x64, 0x50, 0x0c, 0x06, 0x80, 0x09, 0x78,
|
||||
0x9a, 0xe6, 0xc3, 0x94, 0x64, 0x50, 0x01, 0x06, 0x78, 0x97, 0xe6, 0x65, 0x1f, 0x60, 0x12, 0xe4,
|
||||
0x78, 0x95, 0xf6, 0x78, 0x8b, 0x12, 0x38, 0x8e, 0x78, 0x89, 0xf6, 0x08, 0xf6, 0x78, 0x97, 0xa6,
|
||||
0x1f, 0x78, 0x89, 0xe6, 0xff, 0x60, 0x17, 0xc3, 0xe5, 0x1d, 0x12, 0x39, 0x27, 0x50, 0x0f, 0x78,
|
||||
0x89, 0xe6, 0xff, 0xc3, 0xe5, 0x1d, 0x9f, 0xff, 0xe4, 0x78, 0x8c, 0x12, 0x39, 0x69, 0x78, 0x89,
|
||||
0xa6, 0x1d, 0x08, 0xe6, 0xff, 0x60, 0x17, 0xc3, 0xe5, 0x1e, 0x12, 0x39, 0x27, 0x50, 0x0f, 0x78,
|
||||
0x8a, 0xe6, 0xff, 0xc3, 0xe5, 0x1e, 0x9f, 0xff, 0xe4, 0x78, 0x8e, 0x12, 0x39, 0x69, 0x78, 0x8a,
|
||||
0xa6, 0x1e, 0x78, 0x8f, 0x12, 0x39, 0x1f, 0xc0, 0x06, 0xc0, 0x07, 0x78, 0x8b, 0x12, 0x39, 0x1f,
|
||||
0xd0, 0x05, 0xd0, 0x04, 0x12, 0x39, 0x52, 0x40, 0x04, 0x78, 0x8b, 0x80, 0x02, 0x78, 0x8f, 0xe6,
|
||||
0xfe, 0x08, 0xe6, 0xff, 0x78, 0x8f, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x08, 0x12, 0x39, 0x1f, 0xc0,
|
||||
0x06, 0xc0, 0x07, 0x12, 0x39, 0x1d, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x39, 0x52, 0x40, 0x04, 0x78,
|
||||
0x8d, 0x80, 0x02, 0x78, 0x91, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x91, 0xa6, 0x06, 0x08, 0xa6,
|
||||
0x07, 0xe4, 0x78, 0x96, 0xf6, 0x78, 0x9c, 0xe6, 0x54, 0x3c, 0x60, 0x77, 0x78, 0x8b, 0x12, 0x39,
|
||||
0x1f, 0xd3, 0x12, 0x39, 0x49, 0x50, 0x09, 0x12, 0x39, 0x1d, 0xd3, 0x12, 0x39, 0x49, 0x40, 0x63,
|
||||
0x78, 0x8d, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x7c, 0x00, 0x7d, 0x0a, 0x12, 0x09, 0x35, 0x78, 0x8c,
|
||||
0xe6, 0x24, 0x01, 0xfd, 0x18, 0xe4, 0x36, 0xfc, 0x12, 0x09, 0x9c, 0x8e, 0x23, 0x8f, 0x24, 0x12,
|
||||
0x2d, 0xa5, 0xd3, 0xef, 0x95, 0x20, 0x74, 0x80, 0xf8, 0x6e, 0x98, 0x40, 0x14, 0x78, 0x9c, 0xe6,
|
||||
0x54, 0x0c, 0x60, 0x2f, 0x78, 0x8e, 0x12, 0x39, 0x5e, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x01, 0x80,
|
||||
0x12, 0x78, 0x9c, 0xe6, 0x54, 0x30, 0x60, 0x1b, 0x78, 0x8c, 0x12, 0x39, 0x5e, 0x7f, 0x03, 0x40,
|
||||
0x02, 0x7f, 0x04, 0x8f, 0x22, 0xe4, 0x78, 0x8d, 0xf6, 0x08, 0xf6, 0x78, 0x8b, 0xf6, 0x08, 0xf6,
|
||||
0x78, 0x9c, 0xf6, 0x78, 0x9c, 0xe6, 0x30, 0xe1, 0x49, 0x78, 0x8b, 0x12, 0x39, 0x1f, 0x12, 0x39,
|
||||
0x48, 0x50, 0x3f, 0x12, 0x39, 0x1d, 0x12, 0x39, 0x48, 0x50, 0x37, 0xe5, 0x1f, 0xb4, 0x01, 0x1c,
|
||||
0x78, 0x95, 0xe6, 0xd3, 0x94, 0x64, 0x40, 0x14, 0x75, 0x22, 0x0c, 0x90, 0x03, 0xef, 0xe0, 0x30,
|
||||
0xe0, 0x06, 0xe4, 0x78, 0x9c, 0xf6, 0x80, 0x04, 0x78, 0x9c, 0x76, 0x02, 0xe5, 0x1f, 0xd3, 0x94,
|
||||
0x01, 0x40, 0x0f, 0x78, 0x95, 0xe6, 0xd3, 0x94, 0x64, 0x40, 0x07, 0x75, 0x22, 0x1c, 0xe4, 0x78,
|
||||
0x9c, 0xf6, 0x78, 0x95, 0xe6, 0x70, 0x6d, 0x76, 0x01, 0x80, 0x69, 0x78, 0x95, 0xe6, 0xff, 0x60,
|
||||
0x4b, 0x78, 0x9c, 0xe6, 0x30, 0xe0, 0x23, 0xef, 0xd3, 0x94, 0x02, 0x40, 0x1d, 0x78, 0x95, 0xe6,
|
||||
0x94, 0x64, 0x50, 0x16, 0x79, 0x9a, 0xe7, 0x78, 0x9b, 0x96, 0x40, 0x08, 0xe4, 0x78, 0x99, 0xf6,
|
||||
0x18, 0x06, 0x80, 0x06, 0xe4, 0x78, 0x98, 0xf6, 0x08, 0x06, 0xe4, 0x78, 0x89, 0x11, 0x8e, 0x08,
|
||||
0x11, 0x8e, 0x08, 0xf6, 0x08, 0xf6, 0x78, 0x95, 0xf6, 0x78, 0x9a, 0xf6, 0x08, 0xf6, 0x78, 0x97,
|
||||
0xf6, 0x18, 0x76, 0x01, 0x78, 0x9c, 0xe6, 0x44, 0x3e, 0xf6, 0x80, 0x18, 0x78, 0x96, 0xe6, 0xff,
|
||||
0xd3, 0x94, 0x14, 0x40, 0x0f, 0xef, 0x94, 0x1e, 0x50, 0x0a, 0x78, 0x9c, 0x76, 0xff, 0xe4, 0x78,
|
||||
0x98, 0xf6, 0x08, 0xf6, 0x78, 0x9c, 0xe6, 0x30, 0xe0, 0x0d, 0x78, 0x98, 0xe6, 0xb4, 0x01, 0x07,
|
||||
0x75, 0x22, 0x05, 0xe4, 0xf6, 0x08, 0xf6, 0x78, 0x9d, 0xa6, 0x22, 0xaf, 0x22, 0x22, 0xf6, 0x08,
|
||||
0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x22, 0x8c, 0x66, 0x8d, 0x67, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0,
|
||||
0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x85, 0xa3, 0x56, 0x75, 0xa3, 0x00, 0xe5, 0x56, 0x30, 0xe3,
|
||||
0x14, 0xe5, 0xa6, 0x20, 0xe0, 0x0f, 0x75, 0xd3, 0x00, 0x75, 0xd2, 0x01, 0x75, 0xd7, 0x04, 0x75,
|
||||
0xd6, 0xd5, 0x75, 0xd1, 0x15, 0xe5, 0x56, 0x54, 0xef, 0xff, 0x64, 0x01, 0x70, 0x26, 0x90, 0x04,
|
||||
0xd5, 0xe0, 0xfe, 0xc3, 0x94, 0xc0, 0x50, 0x15, 0xee, 0xb4, 0xa5, 0x08, 0x75, 0xd3, 0x00, 0x75,
|
||||
0xd2, 0xff, 0x80, 0x0b, 0x31, 0x05, 0x31, 0x0f, 0x75, 0xd1, 0x1a, 0x80, 0x07, 0x31, 0x05, 0x31,
|
||||
0x0f, 0x75, 0xd1, 0x15, 0xbf, 0x20, 0x05, 0x31, 0x05, 0x12, 0x2f, 0xc7, 0xd0, 0xd0, 0xd0, 0x82,
|
||||
0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x75, 0xd3, 0x00, 0x75, 0xd2, 0xff, 0x90, 0x04, 0xd5, 0x22, 0xe0,
|
||||
0x7a, 0x00, 0x25, 0x67, 0xfd, 0xea, 0x35, 0x66, 0xf5, 0xd7, 0x8d, 0xd6, 0x22, 0x78, 0x8d, 0xe6,
|
||||
0xfe, 0x08, 0xe6, 0xff, 0x02, 0x2d, 0xa5, 0x9f, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0x12, 0x2d, 0xa5,
|
||||
0xac, 0x06, 0xad, 0x07, 0xe5, 0x21, 0x75, 0xf0, 0x04, 0xa4, 0xff, 0xc3, 0xed, 0x9f, 0xe5, 0xf0,
|
||||
0x64, 0x80, 0xf8, 0xec, 0x64, 0x80, 0x98, 0x22, 0xc3, 0xef, 0x95, 0x21, 0x74, 0x80, 0xf8, 0x6e,
|
||||
0x98, 0x22, 0xd3, 0xef, 0x9d, 0xec, 0x64, 0x80, 0xf8, 0xee, 0x64, 0x80, 0x98, 0x22, 0xd3, 0xe6,
|
||||
0x94, 0x00, 0x18, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x22, 0x94, 0x00, 0xfe, 0xef, 0x26, 0xf6, 0x18,
|
||||
0xee, 0x36, 0xf6, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xad
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
970
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst8xxT_fw.h
Normal file
970
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst8xxT_fw.h
Normal file
@@ -0,0 +1,970 @@
|
||||
#ifndef HYNITRON_FIRMWARE_H
|
||||
#define HYNITRON_FIRMWARE_H
|
||||
|
||||
static const unsigned char fw_bin[] = {
|
||||
0x00, 0x00, 0x00, 0x3c, 0xdc, 0x56,
|
||||
0x02, 0x2b, 0xae, 0x75, 0x91, 0xcc, 0x75, 0x91, 0x00, 0x32, 0x32, 0x22, 0x02, 0x00, 0x03, 0x02,
|
||||
0x2e, 0xfe, 0x74, 0xb7, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xff, 0x22, 0x22,
|
||||
0x00, 0x02, 0x32, 0x3f, 0xe4, 0x7b, 0x02, 0xfa, 0xf9, 0xf8, 0xaf, 0x00, 0xae, 0x00, 0xad, 0x00,
|
||||
0xac, 0x00, 0x12, 0x0f, 0x42, 0xef, 0x25, 0x00, 0xff, 0xee, 0x35, 0x00, 0xfe, 0xed, 0x35, 0x00,
|
||||
0xfd, 0xec, 0x35, 0x00, 0xfc, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0x12, 0x0f, 0x42,
|
||||
0xef, 0x24, 0xe0, 0xfb, 0xee, 0x34, 0xff, 0xfa, 0xed, 0x34, 0xff, 0xf9, 0xec, 0x34, 0xff, 0xf8,
|
||||
0x85, 0x0f, 0x82, 0x85, 0x0e, 0x83, 0x22, 0x74, 0x1c, 0x93, 0x24, 0x64, 0xff, 0xe4, 0x33, 0xfe,
|
||||
0xe4, 0xfc, 0xfd, 0x12, 0x0e, 0xb7, 0xe4, 0x7b, 0x64, 0xfa, 0xf9, 0xf8, 0x12, 0x0f, 0x42, 0x8f,
|
||||
0x00, 0x8e, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xa9,
|
||||
0x00, 0xa8, 0x00, 0xe4, 0xfc, 0xfd, 0xc3, 0x02, 0x0f, 0xd4, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x0d,
|
||||
0xf8, 0xe4, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x16, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0xa8, 0x07, 0xe8,
|
||||
0x24, 0x18, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0xef, 0x04, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xef, 0x24,
|
||||
0x2b, 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0c, 0x68, 0x78, 0x66, 0xe6,
|
||||
0xff, 0x24, 0x05, 0xf8, 0xe4, 0xf2, 0xef, 0x04, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xef, 0x24, 0x07,
|
||||
0x7f, 0x06, 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x02, 0x0c, 0x68, 0xeb, 0x25, 0xe0, 0x25,
|
||||
0xe0, 0x24, 0x61, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x22, 0xe6, 0xff, 0x24, 0x2b, 0xf8, 0xe2,
|
||||
0xfc, 0x08, 0xe2, 0xfd, 0xa8, 0x07, 0xe8, 0x04, 0xf8, 0xec, 0xf2, 0x08, 0xed, 0xf2, 0x78, 0x66,
|
||||
0xe6, 0xff, 0x24, 0x2d, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0xa8, 0x07, 0xe8, 0x22, 0xab, 0x00,
|
||||
0xaa, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x12, 0x0e, 0xb7, 0xa8, 0x04,
|
||||
0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x22, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0xe5, 0x00, 0x75,
|
||||
0xf0, 0x02, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x02, 0x0d, 0xe6, 0x74, 0x1d, 0x93, 0x24, 0x64,
|
||||
0xff, 0xe4, 0x33, 0xfe, 0xe4, 0xfc, 0xfd, 0x12, 0x0e, 0xb7, 0xe4, 0x7b, 0x64, 0xfa, 0xf9, 0xf8,
|
||||
0x12, 0x0f, 0x42, 0x8f, 0x00, 0x8e, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xab,
|
||||
0x00, 0xaa, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xe4, 0xfc, 0xfd, 0xc3, 0x02, 0x0f, 0xd4, 0xaf, 0x00,
|
||||
0xef, 0x33, 0x95, 0xe0, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xfe, 0x74, 0xb5, 0x2f, 0xf5,
|
||||
0x82, 0x74, 0x00, 0x3e, 0xf5, 0x83, 0x22, 0x78, 0x68, 0xa6, 0x07, 0x78, 0x6b, 0xe6, 0x78, 0x69,
|
||||
0xf6, 0x90, 0x00, 0xb7, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x00, 0xb5, 0xcf, 0xf0, 0xa3, 0xef, 0xf0,
|
||||
0x08, 0x76, 0xff, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x7f, 0x04, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0xb5,
|
||||
0x02, 0x10, 0x98, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0xfe, 0xed, 0x39, 0xfd, 0xec, 0x38, 0xfc, 0x22,
|
||||
0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0x85, 0x00, 0x82, 0x75, 0x83, 0x00, 0xe5, 0x00, 0x12, 0x0c,
|
||||
0xe6, 0xe5, 0x00, 0x25, 0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x00, 0xf5, 0x83, 0x22, 0x74,
|
||||
0x15, 0x93, 0x08, 0x26, 0x25, 0xe0, 0x24, 0x5f, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0xef, 0x25,
|
||||
0xe0, 0x24, 0x60, 0xf8, 0xe2, 0x2d, 0xff, 0x18, 0xe2, 0x3c, 0xc3, 0x13, 0xf5, 0x00, 0xef, 0x13,
|
||||
0xf5, 0x00, 0xd3, 0x74, 0x10, 0x93, 0x95, 0x00, 0x74, 0x0f, 0x93, 0x95, 0x00, 0x22, 0xe5, 0x00,
|
||||
0x25, 0xe0, 0xff, 0xe5, 0x00, 0x33, 0xfe, 0xef, 0x24, 0xff, 0xff, 0xee, 0x34, 0xff, 0xfe, 0xe4,
|
||||
0xfc, 0xfd, 0x22, 0xeb, 0x7b, 0x64, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c,
|
||||
0xfc, 0xe4, 0xfa, 0xf9, 0xf8, 0x22, 0x74, 0x1c, 0x93, 0x24, 0x64, 0xff, 0xe4, 0x33, 0xfe, 0xe4,
|
||||
0xfc, 0xfd, 0x12, 0x0e, 0xb7, 0xe4, 0x7b, 0x64, 0xfa, 0xf9, 0xf8, 0x12, 0x0f, 0x42, 0x8f, 0x00,
|
||||
0x8e, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0x22, 0xe5, 0x00, 0x25, 0xe0, 0x24, 0x68, 0xf8, 0xe6, 0xff,
|
||||
0x33, 0x95, 0xe0, 0xfe, 0xad, 0x00, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xc3, 0x22, 0x93, 0xfd, 0x12,
|
||||
0x0d, 0x08, 0x7c, 0x00, 0x7d, 0x32, 0x12, 0x0d, 0x1a, 0xe5, 0x28, 0x2f, 0xf5, 0x2e, 0xe5, 0x27,
|
||||
0x3e, 0xf5, 0x2d, 0xd3, 0xe5, 0x2e, 0x94, 0x00, 0xe5, 0x2d, 0x64, 0x80, 0x94, 0x80, 0x22, 0x7a,
|
||||
0x00, 0x79, 0x02, 0x7b, 0xfe, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x0c, 0x68, 0x75, 0xf0, 0x2f, 0xa4,
|
||||
0x24, 0x02, 0xf8, 0xee, 0xf2, 0x08, 0xef, 0xf2, 0x22, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x60,
|
||||
0xf8, 0xe2, 0x2f, 0xf5, 0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 0x22, 0x13, 0x2d, 0xff, 0xee, 0x3c,
|
||||
0xfe, 0x7c, 0x00, 0x7d, 0x03, 0x02, 0x0d, 0x08, 0x25, 0xe0, 0x24, 0x60, 0xf8, 0xe2, 0x2f, 0xff,
|
||||
0x18, 0xe2, 0x3e, 0xfe, 0x22, 0x7e, 0x00, 0x7f, 0x04, 0x7d, 0xff, 0x7b, 0x00, 0x7a, 0x00, 0x79,
|
||||
0x68, 0x02, 0x10, 0x98, 0x24, 0x09, 0xf8, 0xec, 0xf2, 0x08, 0xed, 0xf2, 0x78, 0x66, 0xe6, 0x24,
|
||||
0x0e, 0xf8, 0xe2, 0xc3, 0x22, 0x74, 0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 0xff, 0xe4, 0xfc, 0xfd,
|
||||
0x02, 0x10, 0x17, 0x74, 0x1a, 0x93, 0xff, 0x33, 0x95, 0xe0, 0xfe, 0xfd, 0xfc, 0xeb, 0x2f, 0x22,
|
||||
0xaf, 0x00, 0xef, 0x33, 0x95, 0xe0, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xab, 0x00, 0xaa,
|
||||
0x00, 0xa9, 0x00, 0x8f, 0x82, 0xf5, 0x83, 0x02, 0x0d, 0xe6, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x07,
|
||||
0xaa, 0x06, 0xc3, 0xe5, 0x00, 0x9b, 0xfb, 0xe5, 0x00, 0x9a, 0xfa, 0xe5, 0x00, 0x94, 0x00, 0xf9,
|
||||
0xe5, 0x00, 0x94, 0x00, 0x22, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x74, 0x04, 0x93, 0xfe, 0x74,
|
||||
0x05, 0x93, 0xff, 0x22, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x07, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xef,
|
||||
0x22, 0xeb, 0x25, 0xe0, 0x24, 0x68, 0xf8, 0xe6, 0x22, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xaa,
|
||||
0x00, 0xa9, 0x00, 0xa8, 0x00, 0x22, 0xe5, 0x00, 0x25, 0xe0, 0xff, 0xe5, 0x00, 0x33, 0xab, 0x07,
|
||||
0xfa, 0xe4, 0xf9, 0xf8, 0x22, 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x7f, 0x04, 0x02, 0x0c,
|
||||
0x68, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0xc3, 0xe5, 0x00, 0x9d, 0xf5, 0x00, 0xe5, 0x00, 0x9c,
|
||||
0xf5, 0x00, 0xa8, 0x07, 0xe8, 0x22, 0x2f, 0xff, 0xe0, 0x3e, 0xfe, 0xd3, 0xe5, 0x00, 0x9f, 0xe5,
|
||||
0x00, 0x9e, 0x22, 0xc3, 0xe5, 0x00, 0x95, 0x00, 0xff, 0xe5, 0x00, 0x95, 0x00, 0xfe, 0x22, 0xe4,
|
||||
0xfa, 0xf9, 0xf8, 0xee, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0x22, 0x74, 0x18, 0x93, 0xfb, 0x7c, 0x00,
|
||||
0x7d, 0x0a, 0x12, 0x0d, 0x1a, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x10, 0x6b, 0xef, 0x22, 0xc3, 0xe5,
|
||||
0x00, 0x95, 0x00, 0xff, 0xe5, 0x00, 0x95, 0x00, 0xfe, 0xe4, 0x95, 0x00, 0xfd, 0xe4, 0x95, 0x00,
|
||||
0xfc, 0x22, 0xe4, 0x93, 0xfd, 0x7c, 0x00, 0x74, 0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0x22,
|
||||
0xc3, 0x74, 0x64, 0x95, 0x23, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0xe4, 0xfc, 0xfd, 0x22, 0x9d, 0xfd,
|
||||
0xe4, 0x94, 0x00, 0xfc, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x22, 0x25, 0xe0, 0x24, 0x5f, 0xf8,
|
||||
0xe2, 0x22, 0xc3, 0xe5, 0x00, 0x95, 0x00, 0xfb, 0xe5, 0x00, 0x95, 0x00, 0xfa, 0xe4, 0x95, 0x00,
|
||||
0xf9, 0xe4, 0x95, 0x00, 0x22, 0xe5, 0x00, 0x25, 0x00, 0xff, 0xe5, 0x00, 0x35, 0x00, 0xfe, 0xe4,
|
||||
0x35, 0x00, 0xfd, 0xe4, 0x35, 0x00, 0xfc, 0x22, 0x7e, 0x00, 0x7f, 0x06, 0x7d, 0x00, 0x7b, 0xfe,
|
||||
0x02, 0x10, 0x98, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x12, 0x10, 0x17, 0x12, 0x0e, 0xb7, 0xe4, 0x7b,
|
||||
0x02, 0xfa, 0xf9, 0xf8, 0x22, 0xf8, 0xe2, 0x2f, 0xf5, 0x28, 0x18, 0xe2, 0x3e, 0xf5, 0x27, 0x22,
|
||||
0xea, 0x33, 0x95, 0xe0, 0xf9, 0xf8, 0xe4, 0xfc, 0xfd, 0x02, 0x0e, 0xb7, 0x85, 0x0d, 0x82, 0x85,
|
||||
0x0c, 0x83, 0x74, 0x05, 0x93, 0x22, 0xff, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xef, 0x2d, 0xff, 0xe4,
|
||||
0x3c, 0xc3, 0x13, 0xef, 0x13, 0x22, 0x24, 0x03, 0xf8, 0xec, 0xf2, 0x08, 0xed, 0xf2, 0x22, 0xf5,
|
||||
0x83, 0xe5, 0x82, 0x2d, 0xf5, 0x82, 0xe5, 0x83, 0x3c, 0xf5, 0x83, 0xef, 0xf0, 0x22, 0xe5, 0x00,
|
||||
0x25, 0xe0, 0x24, 0x69, 0xf8, 0xe6, 0x22, 0xf5, 0x00, 0xea, 0x3e, 0xf5, 0x00, 0xe9, 0x3d, 0xf5,
|
||||
0x00, 0xe8, 0x3c, 0xf5, 0x00, 0x22, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x05, 0xf8, 0xe2, 0x22, 0x74,
|
||||
0x1e, 0x93, 0xfe, 0xa8, 0x07, 0xe8, 0x24, 0x0e, 0xf8, 0xe2, 0xc3, 0x9e, 0x22, 0x24, 0x02, 0xf8,
|
||||
0xc3, 0xe2, 0x9d, 0xf5, 0x29, 0x18, 0xe2, 0x9c, 0xf5, 0x28, 0x22, 0x24, 0x04, 0xf8, 0xc3, 0xe2,
|
||||
0x9d, 0xf5, 0x2b, 0x18, 0xe2, 0x9c, 0xf5, 0x2a, 0x22, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0x2f, 0xff,
|
||||
0xee, 0x3c, 0xfe, 0xef, 0x78, 0x02, 0x22, 0x75, 0xf0, 0x2f, 0xa4, 0x24, 0x04, 0x22, 0xff, 0xae,
|
||||
0xf0, 0xe4, 0xfc, 0xfd, 0x22, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x2b, 0x22, 0x78, 0x66, 0xe6, 0x24,
|
||||
0x0f, 0xf8, 0x22, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c, 0xfc, 0x22,
|
||||
0xef, 0x75, 0xf0, 0x2f, 0xa4, 0x24, 0x01, 0xf8, 0x22, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 0xfc, 0x22,
|
||||
0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0x22, 0xc3, 0xe5, 0x00, 0x9f, 0xf5, 0x00, 0xe5, 0x00, 0x9e,
|
||||
0xf5, 0x00, 0x22, 0x78, 0x53, 0x12, 0x10, 0x0b, 0x78, 0x4f, 0x12, 0x10, 0x17, 0xeb, 0x22, 0xe5,
|
||||
0x30, 0x25, 0x30, 0xf5, 0x30, 0xe5, 0x2f, 0x33, 0xf5, 0x2f, 0x22, 0xc3, 0xe5, 0x26, 0x95, 0x28,
|
||||
0xff, 0xe5, 0x25, 0x95, 0x27, 0xfe, 0x22, 0xe5, 0x00, 0xf0, 0xa3, 0xe5, 0x00, 0xf0, 0x22, 0xf9,
|
||||
0x7a, 0x00, 0x7b, 0xfe, 0x75, 0xf0, 0x02, 0xe5, 0x00, 0x22, 0x13, 0xfb, 0xaa, 0x06, 0xe4, 0xf9,
|
||||
0xf8, 0x22, 0xf8, 0xe4, 0xf2, 0x08, 0x74, 0x80, 0xf2, 0xa8, 0x07, 0xe8, 0x22, 0xe4, 0xfc, 0xfd,
|
||||
0xeb, 0x25, 0x00, 0xff, 0xea, 0x35, 0x00, 0x22, 0x75, 0xf0, 0x2f, 0xa4, 0x24, 0x02, 0x22, 0xce,
|
||||
0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0x78, 0x66, 0xe6, 0x24, 0x1a, 0xf8, 0x22, 0x78, 0x66, 0xe6,
|
||||
0x24, 0x0d, 0xf8, 0x22, 0xd3, 0xe5, 0x35, 0x95, 0x37, 0xe5, 0x34, 0x95, 0x36, 0x22, 0x33, 0xfe,
|
||||
0x7c, 0x00, 0x7d, 0x03, 0x02, 0x0d, 0x1a, 0x24, 0x40, 0xff, 0xe4, 0x3e, 0xfe, 0x22, 0xe5, 0x00,
|
||||
0x25, 0xe0, 0x24, 0x68, 0x22, 0xe5, 0x00, 0x25, 0xe0, 0x24, 0x69, 0x22, 0x8f, 0x22, 0x8d, 0x23,
|
||||
0x12, 0x04, 0xd6, 0x70, 0x03, 0x02, 0x0b, 0x41, 0x12, 0x00, 0x60, 0x12, 0x04, 0xdf, 0x50, 0x06,
|
||||
0x12, 0x00, 0x9a, 0x02, 0x07, 0x1f, 0x12, 0x05, 0xcd, 0xe2, 0x70, 0x50, 0x12, 0x05, 0x25, 0x12,
|
||||
0x01, 0x14, 0x12, 0x04, 0xed, 0x12, 0x01, 0x0e, 0x12, 0x04, 0xfb, 0x12, 0x00, 0x60, 0x74, 0x17,
|
||||
0x93, 0x75, 0x34, 0x00, 0xf5, 0x35, 0xaf, 0x2b, 0xae, 0x2a, 0x12, 0x39, 0xa3, 0xc0, 0x06, 0xc0,
|
||||
0x07, 0xaf, 0x29, 0xae, 0x28, 0x12, 0x39, 0xa3, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe,
|
||||
0xd3, 0xef, 0x95, 0x35, 0xee, 0x95, 0x34, 0x40, 0x08, 0x12, 0x05, 0xcd, 0x74, 0x01, 0xf2, 0x80,
|
||||
0x23, 0xe4, 0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x2a, 0xf5, 0x2b, 0x80, 0x18, 0x78, 0x66, 0xe6, 0xff,
|
||||
0x24, 0x07, 0x12, 0x01, 0x14, 0x12, 0x04, 0xed, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x09, 0x12, 0x01,
|
||||
0x14, 0x12, 0x04, 0xfb, 0x12, 0x04, 0x10, 0xc0, 0x04, 0x12, 0x01, 0x30, 0x78, 0x66, 0xe6, 0x24,
|
||||
0x16, 0x12, 0x00, 0xf3, 0x12, 0x03, 0xd3, 0xd0, 0x00, 0x12, 0x0e, 0xb7, 0xc0, 0x04, 0xc0, 0x05,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x23, 0xab, 0x07, 0xae, 0x28, 0xaf, 0x29, 0x12, 0x03, 0xcf, 0x12,
|
||||
0x0e, 0xb7, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x02, 0x33, 0x12, 0x33, 0x10,
|
||||
0x8e, 0x28, 0x8f, 0x29, 0x12, 0x04, 0x10, 0xc0, 0x04, 0x12, 0x01, 0x30, 0x78, 0x66, 0xe6, 0x24,
|
||||
0x18, 0x12, 0x00, 0xf3, 0x12, 0x03, 0xd3, 0xd0, 0x00, 0x12, 0x0e, 0xb7, 0xc0, 0x04, 0xc0, 0x05,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x23, 0xab, 0x07, 0xae, 0x2a, 0xaf, 0x2b, 0x12, 0x03, 0xcf, 0x12,
|
||||
0x0e, 0xb7, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x02, 0x33, 0x12, 0x33, 0x10,
|
||||
0x8e, 0x2a, 0x8f, 0x2b, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x16, 0xf8, 0xe5, 0x28, 0xf2, 0x08, 0xe5,
|
||||
0x29, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x18, 0xf8, 0xe5, 0x2a, 0xf2, 0x08, 0xe5, 0x2b, 0xf2, 0x12,
|
||||
0x00, 0x60, 0x74, 0x1e, 0x93, 0xff, 0x12, 0x02, 0xfc, 0x9f, 0x50, 0x03, 0x02, 0x0b, 0x1a, 0x78,
|
||||
0x66, 0xe6, 0xfb, 0x24, 0x07, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xfd, 0xac, 0x06, 0xe5, 0x28, 0xa2,
|
||||
0xe7, 0x13, 0xfe, 0xe5, 0x29, 0x12, 0x02, 0xcb, 0xa8, 0x03, 0xe8, 0x04, 0x12, 0x05, 0x09, 0x12,
|
||||
0x05, 0xbf, 0xd8, 0xfb, 0xff, 0x12, 0x00, 0x60, 0x74, 0x01, 0x93, 0xfc, 0x74, 0x02, 0x93, 0xfd,
|
||||
0x12, 0x35, 0x58, 0x8e, 0x24, 0x8f, 0x25, 0x78, 0x66, 0xe6, 0xfb, 0x24, 0x09, 0xf8, 0xe2, 0xfe,
|
||||
0x08, 0xe2, 0xfd, 0xac, 0x06, 0xe5, 0x2a, 0xa2, 0xe7, 0x13, 0xfe, 0xe5, 0x2b, 0x12, 0x02, 0xcb,
|
||||
0xa8, 0x03, 0xe8, 0x24, 0x03, 0x12, 0x05, 0x09, 0x12, 0x05, 0xbf, 0xd8, 0xfb, 0xff, 0x12, 0x00,
|
||||
0x60, 0x74, 0x03, 0x93, 0xfc, 0x74, 0x04, 0x93, 0xfd, 0x12, 0x35, 0x58, 0x8e, 0x26, 0x8f, 0x27,
|
||||
0x12, 0x00, 0x60, 0x74, 0x1e, 0x93, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0x78, 0x66, 0xe6, 0xfd,
|
||||
0x24, 0x0e, 0xf8, 0xe2, 0xc3, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x50, 0x59, 0xa8,
|
||||
0x05, 0xe8, 0x24, 0x16, 0x12, 0x00, 0xf3, 0x12, 0x39, 0xa3, 0x12, 0x00, 0x60, 0x74, 0x1e, 0x93,
|
||||
0xfd, 0x78, 0x66, 0xe6, 0xf9, 0x24, 0x0e, 0xf8, 0xe2, 0xc3, 0x12, 0x04, 0x1e, 0x24, 0x8d, 0xf5,
|
||||
0x82, 0xe4, 0x34, 0x00, 0x12, 0x04, 0xaf, 0xa8, 0x01, 0xe8, 0x24, 0x18, 0x12, 0x00, 0xf3, 0x12,
|
||||
0x39, 0xa3, 0x12, 0x00, 0x60, 0x74, 0x1e, 0x93, 0xfd, 0x12, 0x02, 0xfc, 0x12, 0x04, 0x1e, 0x24,
|
||||
0xa1, 0xf5, 0x82, 0xe4, 0x34, 0x00, 0x12, 0x04, 0xaf, 0x75, 0x38, 0x00, 0x75, 0x39, 0x80, 0x75,
|
||||
0x3a, 0x00, 0x75, 0x3b, 0x80, 0x02, 0x09, 0x89, 0x12, 0x04, 0x24, 0x24, 0x96, 0xf9, 0x74, 0x00,
|
||||
0x35, 0xf0, 0xfa, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x78, 0x66, 0xe6, 0x24, 0x16,
|
||||
0x12, 0x00, 0xf3, 0x12, 0x39, 0xa3, 0xad, 0x07, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x12, 0x34,
|
||||
0x7a, 0x8e, 0x34, 0x8f, 0x35, 0x12, 0x04, 0x24, 0x24, 0xaa, 0xf9, 0x74, 0x00, 0x35, 0xf0, 0xfa,
|
||||
0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x78, 0x66, 0xe6, 0x24, 0x18, 0x12, 0x00, 0xf3,
|
||||
0x12, 0x39, 0xa3, 0xad, 0x07, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x12, 0x34, 0x7a, 0x8e, 0x36,
|
||||
0x8f, 0x37, 0x12, 0x05, 0xd4, 0x40, 0x18, 0xe5, 0x35, 0xae, 0x34, 0x78, 0x03, 0xc3, 0x33, 0xce,
|
||||
0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe5, 0x37, 0x24, 0x01, 0xfd, 0xe4, 0x35, 0x36, 0x80, 0x16, 0xe5,
|
||||
0x37, 0xae, 0x36, 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe5, 0x35, 0x24,
|
||||
0x01, 0xfd, 0xe4, 0x35, 0x34, 0xfc, 0x12, 0x0d, 0x1a, 0xab, 0x07, 0xaa, 0x06, 0x78, 0x66, 0xe6,
|
||||
0xf9, 0x24, 0x10, 0x12, 0x00, 0xf3, 0x12, 0x02, 0xd1, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0xfe, 0xef,
|
||||
0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xfb, 0xaa, 0x06, 0xc3, 0x94, 0x28, 0xea,
|
||||
0x94, 0x00, 0x50, 0x06, 0x7a, 0x00, 0x7b, 0x28, 0x80, 0x0d, 0xd3, 0xeb, 0x94, 0x46, 0xea, 0x94,
|
||||
0x00, 0x40, 0x04, 0x7a, 0x00, 0x7b, 0x46, 0x7c, 0x00, 0x7d, 0x0a, 0xaf, 0x03, 0xae, 0x02, 0x12,
|
||||
0x0d, 0x08, 0xef, 0x24, 0xf0, 0xf5, 0x39, 0xee, 0x34, 0xfe, 0xf5, 0x38, 0xeb, 0x25, 0xe0, 0xff,
|
||||
0xea, 0x33, 0xfe, 0xc3, 0x74, 0xd0, 0x9f, 0xf5, 0x3b, 0xe4, 0x9e, 0xf5, 0x3a, 0x12, 0x05, 0xd4,
|
||||
0x40, 0x12, 0x85, 0x38, 0x34, 0x85, 0x39, 0x35, 0x85, 0x3a, 0x38, 0x85, 0x3b, 0x39, 0x85, 0x34,
|
||||
0x3a, 0x85, 0x35, 0x3b, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x10, 0xf8, 0xea, 0xf2, 0x08, 0xeb, 0xf2,
|
||||
0xa8, 0x07, 0xe8, 0x24, 0x12, 0x12, 0x00, 0xf3, 0x12, 0x02, 0xd1, 0xe5, 0x39, 0x2f, 0xff, 0xe5,
|
||||
0x38, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x39, 0x8e,
|
||||
0x38, 0x78, 0x66, 0xe6, 0xfb, 0x24, 0x14, 0x12, 0x00, 0xf3, 0x12, 0x02, 0xd1, 0xe5, 0x3b, 0x2f,
|
||||
0xff, 0xe5, 0x3a, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5,
|
||||
0x3b, 0x8e, 0x3a, 0xeb, 0x24, 0x12, 0xf8, 0xe5, 0x38, 0xf2, 0x08, 0xe5, 0x39, 0xf2, 0xe9, 0x24,
|
||||
0x14, 0xf8, 0xe5, 0x3a, 0xf2, 0x08, 0xe5, 0x3b, 0xf2, 0x12, 0x0b, 0x70, 0x7c, 0x00, 0x7d, 0x02,
|
||||
0x12, 0x0d, 0x6f, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0b, 0x84, 0xd0, 0xe0, 0x2f, 0xf5, 0x35, 0xd0,
|
||||
0xe0, 0x3e, 0xf5, 0x34, 0x12, 0x00, 0x60, 0xae, 0x34, 0xaf, 0x35, 0x12, 0x03, 0xda, 0x25, 0x35,
|
||||
0xf5, 0x35, 0xee, 0x35, 0x34, 0xf5, 0x34, 0xd3, 0xe5, 0x35, 0x95, 0x39, 0xe5, 0x34, 0x95, 0x38,
|
||||
0x40, 0x06, 0x85, 0x38, 0x34, 0x85, 0x39, 0x35, 0x78, 0x66, 0xe6, 0x24, 0x07, 0x12, 0x00, 0xf3,
|
||||
0xc3, 0xe5, 0x39, 0x95, 0x35, 0xfd, 0xe5, 0x38, 0x95, 0x34, 0xfc, 0x12, 0x10, 0x6b, 0x8f, 0x2f,
|
||||
0x8e, 0x2e, 0x8d, 0x2d, 0x8c, 0x2c, 0xae, 0x24, 0xaf, 0x25, 0xab, 0x07, 0xaa, 0x06, 0xae, 0x34,
|
||||
0xaf, 0x35, 0x12, 0x04, 0x80, 0xef, 0x25, 0x2f, 0xff, 0xee, 0x35, 0x2e, 0xfe, 0xed, 0x35, 0x2d,
|
||||
0xfd, 0xec, 0x35, 0x2c, 0xfc, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x38, 0xc3, 0x13, 0xfe, 0xe5, 0x39,
|
||||
0x12, 0x05, 0x9a, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x05, 0x33, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x38,
|
||||
0xaf, 0x39, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0f, 0x42, 0x8f, 0x2f,
|
||||
0x8e, 0x2e, 0x8d, 0x2d, 0x8c, 0x2c, 0x12, 0x0b, 0x84, 0x7c, 0x00, 0x7d, 0x02, 0x12, 0x0d, 0x6f,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0b, 0x70, 0xd0, 0xe0, 0x2f, 0xf5, 0x37, 0xd0, 0xe0, 0x3e, 0xf5,
|
||||
0x36, 0x12, 0x00, 0x60, 0xae, 0x36, 0xaf, 0x37, 0x12, 0x03, 0xda, 0x25, 0x37, 0xf5, 0x37, 0xee,
|
||||
0x35, 0x36, 0xf5, 0x36, 0xd3, 0xe5, 0x37, 0x95, 0x3b, 0xe5, 0x36, 0x95, 0x3a, 0x40, 0x06, 0x85,
|
||||
0x3a, 0x36, 0x85, 0x3b, 0x37, 0x78, 0x66, 0xe6, 0x24, 0x09, 0x12, 0x00, 0xf3, 0xc3, 0xe5, 0x3b,
|
||||
0x95, 0x37, 0xfd, 0xe5, 0x3a, 0x95, 0x36, 0xfc, 0x12, 0x10, 0x6b, 0x8f, 0x33, 0x8e, 0x32, 0x8d,
|
||||
0x31, 0x8c, 0x30, 0xae, 0x26, 0xaf, 0x27, 0xab, 0x07, 0xaa, 0x06, 0xae, 0x36, 0xaf, 0x37, 0x12,
|
||||
0x04, 0x80, 0xef, 0x25, 0x33, 0xff, 0xee, 0x35, 0x32, 0xfe, 0xed, 0x35, 0x31, 0xfd, 0xec, 0x35,
|
||||
0x30, 0xfc, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3a, 0xc3, 0x13, 0xfe, 0xe5, 0x3b, 0x12, 0x05, 0x9a,
|
||||
0xd0, 0x07, 0xd0, 0x06, 0x12, 0x05, 0x33, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3a, 0xaf, 0x3b, 0xab,
|
||||
0x07, 0xaa, 0x06, 0xe4, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0f, 0x42, 0x8f, 0x33, 0x8e, 0x32, 0x8d,
|
||||
0x31, 0x8c, 0x30, 0x12, 0x00, 0x60, 0x74, 0x16, 0x93, 0xf4, 0x60, 0x2e, 0x78, 0x66, 0xe6, 0xff,
|
||||
0x24, 0x0d, 0xf8, 0xe2, 0xb4, 0x01, 0x1b, 0xa8, 0x07, 0xe8, 0x04, 0xf8, 0xe5, 0x2e, 0xf2, 0x08,
|
||||
0xe5, 0x2f, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x03, 0xf8, 0xe5, 0x32, 0xf2, 0x08, 0xe5, 0x33, 0xf2,
|
||||
0x80, 0x08, 0x78, 0x66, 0x12, 0x00, 0xfa, 0x12, 0x04, 0xa6, 0x78, 0x66, 0xe6, 0xff, 0x04, 0x12,
|
||||
0x01, 0x14, 0x24, 0x07, 0x12, 0x04, 0xa8, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x03, 0x12, 0x01, 0x14,
|
||||
0x12, 0x02, 0xf4, 0x94, 0x14, 0x50, 0x03, 0xe2, 0x04, 0xf2, 0x12, 0x05, 0x2c, 0x74, 0x01, 0xf2,
|
||||
0x22, 0x12, 0x05, 0x2c, 0xe2, 0xd3, 0x94, 0x00, 0x40, 0x03, 0xe2, 0x14, 0xf2, 0xe2, 0x70, 0x1f,
|
||||
0x78, 0x66, 0xe6, 0xff, 0x24, 0x0e, 0xf8, 0xe4, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x12, 0x12, 0x05,
|
||||
0xa2, 0x24, 0x14, 0x12, 0x05, 0xa2, 0x24, 0x10, 0xf8, 0xe4, 0xf2, 0x08, 0x74, 0x28, 0xf2, 0x22,
|
||||
0x78, 0x66, 0xe6, 0x24, 0x0a, 0xf8, 0xc3, 0xe2, 0x95, 0x27, 0xff, 0x18, 0xe2, 0x95, 0x26, 0xfe,
|
||||
0x12, 0x39, 0xa3, 0x22, 0x78, 0x66, 0xe6, 0x24, 0x08, 0xf8, 0xc3, 0xe2, 0x95, 0x25, 0xff, 0x18,
|
||||
0xe2, 0x95, 0x24, 0xfe, 0x12, 0x39, 0xa3, 0x22, 0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46,
|
||||
0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3,
|
||||
0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08,
|
||||
0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64,
|
||||
0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83,
|
||||
0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4,
|
||||
0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8,
|
||||
0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93,
|
||||
0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc,
|
||||
0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3,
|
||||
0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec,
|
||||
0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82,
|
||||
0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4,
|
||||
0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, 0x01, 0x0e, 0x4e, 0x60,
|
||||
0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, 0x82, 0xeb, 0x24, 0x02,
|
||||
0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x0b, 0xe8, 0x73, 0xbb, 0x01,
|
||||
0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22,
|
||||
0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5,
|
||||
0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe,
|
||||
0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5,
|
||||
0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7,
|
||||
0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5,
|
||||
0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb,
|
||||
0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c,
|
||||
0xf0, 0xa4, 0x28, 0xce, 0x8d, 0xf0, 0xa4, 0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29,
|
||||
0xef, 0x8d, 0xf0, 0x84, 0xff, 0xad, 0xf0, 0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f,
|
||||
0xff, 0xee, 0x33, 0xfe, 0xec, 0x33, 0xfc, 0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d,
|
||||
0xfe, 0x0f, 0xd5, 0xf0, 0xe9, 0xe4, 0xce, 0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20,
|
||||
0xd2, 0x1c, 0xfe, 0xad, 0xf0, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07,
|
||||
0x98, 0x50, 0x06, 0xd5, 0xf0, 0xf2, 0x22, 0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xc2,
|
||||
0xd5, 0xec, 0x30, 0xe7, 0x09, 0xb2, 0xd5, 0xe4, 0xc3, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0xee, 0x30,
|
||||
0xe7, 0x15, 0xb2, 0xd5, 0xe4, 0xc3, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x12, 0x0d, 0x1a, 0xc3, 0xe4,
|
||||
0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0x80, 0x03, 0x12, 0x0d, 0x1a, 0x30, 0xd5, 0x07, 0xc3, 0xe4, 0x9f,
|
||||
0xff, 0xe4, 0x9e, 0xfe, 0x22, 0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5,
|
||||
0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82,
|
||||
0x8a, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x06, 0x87, 0xf0, 0x09, 0xe7, 0x19, 0x22,
|
||||
0xbb, 0xfe, 0x07, 0xe3, 0xf5, 0xf0, 0x09, 0xe3, 0x19, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93,
|
||||
0xf5, 0xf0, 0x74, 0x01, 0x93, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83,
|
||||
0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86,
|
||||
0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2,
|
||||
0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, 0xbb, 0x01,
|
||||
0x0d, 0xc5, 0x82, 0x29, 0xc5, 0x82, 0xc5, 0x83, 0x3a, 0xc5, 0x83, 0x02, 0x0d, 0xa5, 0x50, 0x11,
|
||||
0xc5, 0x82, 0x29, 0xf8, 0x08, 0xe5, 0xf0, 0x26, 0xf6, 0x18, 0xf5, 0xf0, 0xe5, 0x82, 0x36, 0xf6,
|
||||
0x22, 0xbb, 0xfe, 0x11, 0xc5, 0x82, 0x29, 0xf8, 0x08, 0xe2, 0x25, 0xf0, 0xf5, 0xf0, 0xf2, 0x18,
|
||||
0xe2, 0x35, 0x82, 0xf2, 0x22, 0xf8, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x2a, 0xf5, 0x83,
|
||||
0x74, 0x01, 0x93, 0x25, 0xf0, 0xf5, 0xf0, 0xe4, 0x93, 0x38, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82,
|
||||
0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7, 0x09, 0xa7, 0xf0, 0x19, 0x22,
|
||||
0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8, 0xbb, 0x01, 0x11, 0xe5, 0x82,
|
||||
0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50,
|
||||
0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb, 0xfe, 0x09, 0xe9, 0x25, 0x82,
|
||||
0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, 0x2c,
|
||||
0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, 0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, 0xf0,
|
||||
0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, 0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, 0xf0,
|
||||
0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, 0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, 0xf0,
|
||||
0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, 0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, 0x35,
|
||||
0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee,
|
||||
0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, 0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a,
|
||||
0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, 0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec,
|
||||
0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, 0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8,
|
||||
0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, 0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf,
|
||||
0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, 0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed,
|
||||
0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, 0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99,
|
||||
0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, 0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe,
|
||||
0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40,
|
||||
0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, 0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb,
|
||||
0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc,
|
||||
0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, 0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd,
|
||||
0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, 0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa,
|
||||
0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0,
|
||||
0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee,
|
||||
0x13, 0xfe, 0xef, 0x13, 0xff, 0xd8, 0xf1, 0x22, 0xe8, 0x60, 0x0f, 0xef, 0xc3, 0x33, 0xff, 0xee,
|
||||
0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, 0xf1, 0x22, 0xe6, 0xfc, 0x08, 0xe6, 0xfd,
|
||||
0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xf9, 0x08, 0xe6, 0xfa, 0x08,
|
||||
0xe6, 0xcb, 0xf8, 0x22, 0xe4, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf9, 0x74, 0x02, 0x93, 0xfa, 0x74,
|
||||
0x03, 0x93, 0xfb, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, 0x08, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0x22,
|
||||
0xd0, 0x83, 0xd0, 0x82, 0xe4, 0x93, 0xf6, 0x08, 0x74, 0x01, 0x93, 0xf6, 0x08, 0x74, 0x02, 0x93,
|
||||
0xf6, 0x08, 0x74, 0x03, 0x93, 0xf6, 0x74, 0x04, 0x73, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0,
|
||||
0x35, 0x83, 0xf5, 0x83, 0x22, 0x8a, 0x83, 0x89, 0x82, 0xe4, 0x73, 0xec, 0x8e, 0xf0, 0xa4, 0xcc,
|
||||
0xc5, 0xf0, 0xcc, 0xcd, 0xf8, 0xef, 0xa4, 0xce, 0xc5, 0xf0, 0x2d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe8,
|
||||
0xa4, 0x2e, 0xc8, 0xc5, 0xf0, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xef, 0xa4, 0xff, 0xe5, 0xf0, 0x28,
|
||||
0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0xef, 0x4e, 0x60, 0x12, 0xef, 0x60, 0x01, 0x0e,
|
||||
0xed, 0xbb, 0x01, 0x0b, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x22, 0x89,
|
||||
0xf0, 0x50, 0x07, 0xf7, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xbb, 0xfe, 0xfc, 0xf3, 0x09, 0xdf,
|
||||
0xfc, 0xa9, 0xf0, 0x22, 0x90, 0x36, 0x03, 0x7d, 0x1f, 0x12, 0x31, 0xda, 0xee, 0x44, 0x80, 0xf5,
|
||||
0x8f, 0x8f, 0x8e, 0x75, 0x8a, 0xa0, 0x75, 0x8a, 0x0a, 0xe4, 0x90, 0x00, 0xc3, 0xf0, 0x90, 0x00,
|
||||
0xc9, 0xe0, 0x70, 0x03, 0x02, 0x11, 0xd7, 0x14, 0x70, 0x03, 0x02, 0x12, 0x02, 0x24, 0xfc, 0x70,
|
||||
0x03, 0x02, 0x13, 0x49, 0x04, 0x60, 0x03, 0x02, 0x13, 0x82, 0xe4, 0xf5, 0x18, 0x78, 0x6e, 0xf6,
|
||||
0x90, 0x36, 0x12, 0x93, 0x70, 0x0e, 0x75, 0x0a, 0x36, 0x75, 0x0b, 0x2a, 0x12, 0x39, 0xb9, 0x8f,
|
||||
0x18, 0x02, 0x11, 0xc6, 0xe4, 0xf5, 0x1a, 0xf5, 0x1b, 0x75, 0x0a, 0x38, 0x75, 0x0b, 0x9e, 0x12,
|
||||
0x14, 0x75, 0x12, 0x31, 0xc7, 0x12, 0x20, 0x0b, 0xe4, 0xf5, 0x19, 0x12, 0x31, 0xac, 0xe4, 0x93,
|
||||
0xff, 0xe5, 0x19, 0xc3, 0x9f, 0x50, 0x33, 0xaf, 0x19, 0x12, 0x39, 0xc9, 0xac, 0x06, 0xad, 0x07,
|
||||
0x12, 0x31, 0xac, 0x74, 0x2c, 0x93, 0x75, 0xf0, 0xc8, 0xa4, 0xff, 0xd3, 0xed, 0x9f, 0xec, 0x95,
|
||||
0xf0, 0x40, 0x13, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 0xfc, 0xa9, 0x19, 0xa8, 0x01, 0x12, 0x0f, 0xf8,
|
||||
0xef, 0x42, 0x1b, 0xee, 0x42, 0x1a, 0x05, 0x19, 0x80, 0xc1, 0xe5, 0x1a, 0x90, 0x01, 0xab, 0xf0,
|
||||
0xa3, 0xe5, 0x1b, 0xf0, 0xe4, 0xf5, 0x19, 0xae, 0x1a, 0xaf, 0x1b, 0xe4, 0xfc, 0xfd, 0xe5, 0x19,
|
||||
0x25, 0xe0, 0x25, 0xe0, 0x24, 0x13, 0xf5, 0x82, 0xe4, 0x34, 0x36, 0xf5, 0x83, 0x12, 0x10, 0x24,
|
||||
0xc3, 0x12, 0x0f, 0xd4, 0x60, 0x07, 0x05, 0x19, 0xe5, 0x19, 0xb4, 0x04, 0xda, 0xe5, 0x19, 0xc3,
|
||||
0x94, 0x04, 0x50, 0x19, 0x85, 0x19, 0x18, 0x75, 0xf0, 0x9d, 0xe5, 0x19, 0xa4, 0x24, 0x2a, 0xf5,
|
||||
0x82, 0xe5, 0xf0, 0x34, 0x36, 0xaf, 0x82, 0xf5, 0x0a, 0x8f, 0x0b, 0x80, 0x09, 0xe4, 0xf5, 0x18,
|
||||
0x75, 0x0a, 0x36, 0x75, 0x0b, 0x2a, 0x90, 0x01, 0xaa, 0xe5, 0x18, 0xf0, 0x90, 0x01, 0xf0, 0x74,
|
||||
0x40, 0xf0, 0xa3, 0xf0, 0x02, 0x13, 0x82, 0xe4, 0x78, 0x6e, 0xf6, 0x12, 0x2f, 0xde, 0xef, 0x64,
|
||||
0x01, 0x60, 0xf8, 0x12, 0x14, 0x75, 0xaf, 0x0b, 0xae, 0x0a, 0x12, 0x00, 0x1f, 0xe5, 0x0b, 0x24,
|
||||
0x79, 0xff, 0xe4, 0x35, 0x0a, 0xfe, 0x12, 0x39, 0x3b, 0x12, 0x31, 0xe4, 0xa3, 0x04, 0xf0, 0x02,
|
||||
0x13, 0x87, 0xe4, 0xf5, 0x18, 0x78, 0x42, 0xf6, 0x90, 0x01, 0xff, 0xe0, 0xb4, 0x01, 0x09, 0x90,
|
||||
0x00, 0xc9, 0x74, 0x05, 0xf0, 0x02, 0x13, 0x87, 0x78, 0x6e, 0x76, 0x01, 0x12, 0x31, 0xc7, 0x12,
|
||||
0x20, 0x0b, 0x78, 0x42, 0xa6, 0x07, 0x12, 0x31, 0xac, 0x74, 0x63, 0x93, 0x70, 0x03, 0x74, 0x62,
|
||||
0x93, 0x60, 0x1b, 0x08, 0xe6, 0xf5, 0x19, 0x08, 0xe6, 0xf5, 0x1a, 0x08, 0xe6, 0xfe, 0x08, 0xe6,
|
||||
0xff, 0x78, 0x43, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x08, 0xa6, 0x19, 0x08, 0xa6, 0x1a, 0x7f, 0x5f,
|
||||
0xe5, 0x0b, 0x24, 0x79, 0xfd, 0xe4, 0x35, 0x0a, 0xfc, 0x12, 0x2c, 0xe4, 0x8f, 0x18, 0x12, 0x31,
|
||||
0xc7, 0x75, 0x20, 0x36, 0x75, 0x21, 0x23, 0xad, 0x18, 0x12, 0x1b, 0x15, 0x8f, 0x18, 0xe4, 0x78,
|
||||
0x42, 0xf6, 0x78, 0x47, 0xe6, 0x70, 0x03, 0x02, 0x12, 0xfc, 0xe5, 0x18, 0x70, 0x12, 0x90, 0x01,
|
||||
0xea, 0xe0, 0x30, 0xe2, 0x0b, 0x78, 0x89, 0xe2, 0x24, 0x01, 0xf2, 0x18, 0xe2, 0x34, 0x00, 0xf2,
|
||||
0x78, 0x4d, 0xe6, 0x60, 0x07, 0x90, 0x01, 0xea, 0xe0, 0x20, 0xe0, 0x0c, 0xe5, 0x18, 0xb4, 0xaa,
|
||||
0x0f, 0x90, 0x01, 0xea, 0xe0, 0x30, 0xe1, 0x08, 0x90, 0x00, 0xc8, 0xe0, 0x04, 0xf0, 0x80, 0x08,
|
||||
0x90, 0x00, 0xc8, 0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x36, 0x08, 0xe4, 0x93, 0x75, 0xf0, 0x64,
|
||||
0xa4, 0xff, 0xd3, 0x78, 0x89, 0xe2, 0x9f, 0x18, 0xe2, 0x95, 0xf0, 0x50, 0x1b, 0x12, 0x31, 0xac,
|
||||
0x74, 0x9c, 0x93, 0x24, 0x02, 0xff, 0xe4, 0x33, 0xfe, 0x90, 0x00, 0xc8, 0xe0, 0xd3, 0x9f, 0xee,
|
||||
0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x40, 0x14, 0x7f, 0x01, 0x12, 0x39, 0xc4, 0xe4, 0x78, 0x47,
|
||||
0xf6, 0x78, 0x4d, 0xf6, 0x78, 0x48, 0x76, 0x04, 0x78, 0x4e, 0x76, 0x04, 0x12, 0x31, 0xc7, 0x78,
|
||||
0x42, 0xe6, 0xf5, 0x20, 0xad, 0x18, 0x12, 0x18, 0xf2, 0x78, 0x47, 0xe6, 0x60, 0x19, 0x90, 0x36,
|
||||
0x06, 0x7d, 0x64, 0x12, 0x31, 0xda, 0xc3, 0x78, 0x70, 0xe6, 0x9f, 0x18, 0xe6, 0x9e, 0x50, 0x67,
|
||||
0xa6, 0x06, 0x08, 0xa6, 0x07, 0x80, 0x60, 0x90, 0x01, 0xfe, 0xe0, 0x70, 0x17, 0x78, 0x70, 0xe6,
|
||||
0x18, 0x46, 0x60, 0x09, 0x08, 0xe6, 0x16, 0x18, 0x70, 0x0a, 0x16, 0x80, 0x07, 0x78, 0x6f, 0x76,
|
||||
0x00, 0x08, 0x76, 0x14, 0x12, 0x31, 0xe4, 0x80, 0x3e, 0x12, 0x31, 0xac, 0xe4, 0x93, 0x90, 0x01,
|
||||
0xcb, 0xf0, 0x90, 0x01, 0xff, 0xe0, 0xb4, 0x01, 0x2e, 0x75, 0x1f, 0x01, 0x75, 0x20, 0x01, 0x75,
|
||||
0x21, 0x40, 0x75, 0x22, 0x01, 0x75, 0x23, 0x01, 0x75, 0x24, 0x80, 0x7b, 0x01, 0x7a, 0x01, 0x79,
|
||||
0xc0, 0x12, 0x1c, 0xd8, 0xe4, 0x90, 0x01, 0xff, 0xf0, 0x75, 0x8a, 0xa0, 0x90, 0x00, 0xc0, 0xf0,
|
||||
0x80, 0xd0, 0xe4, 0x90, 0x00, 0xc9, 0xf0, 0x90, 0x01, 0xe5, 0xe0, 0x64, 0x03, 0x60, 0x0b, 0x90,
|
||||
0x01, 0xb5, 0xe0, 0x64, 0x03, 0x60, 0x03, 0x02, 0x14, 0x20, 0x90, 0x36, 0x0e, 0xe4, 0x93, 0xf5,
|
||||
0x18, 0x7f, 0x01, 0x12, 0x35, 0x32, 0xe5, 0x18, 0x70, 0x05, 0x90, 0xff, 0x11, 0x80, 0x0d, 0xe5,
|
||||
0x18, 0xb4, 0x01, 0x0c, 0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0xa3, 0xe0, 0x44, 0x18, 0xf0,
|
||||
0x90, 0x01, 0xb5, 0xe0, 0xb4, 0x03, 0x15, 0x90, 0xff, 0x12, 0xe0, 0x54, 0xe3, 0xf0, 0x90, 0xff,
|
||||
0x11, 0xe0, 0x54, 0xe3, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x54, 0xe3, 0xf0, 0x75, 0x8f, 0x87, 0x75,
|
||||
0x8e, 0xff, 0x75, 0x8d, 0x87, 0x75, 0x8c, 0xff, 0x12, 0x31, 0xbe, 0x75, 0x8a, 0xa0, 0xf0, 0xe5,
|
||||
0x89, 0x30, 0xe7, 0x08, 0x12, 0x31, 0xb3, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x75, 0x91, 0xc3, 0xe4,
|
||||
0xf5, 0x91, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x31, 0xb3, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x12,
|
||||
0x31, 0xbe, 0x75, 0x8a, 0xa0, 0xf0, 0x75, 0x8a, 0xa0, 0xf0, 0x75, 0x8a, 0xa0, 0xf0, 0x80, 0xc8,
|
||||
0x75, 0x18, 0x27, 0x75, 0x19, 0x10, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x31, 0xb3, 0x50, 0x03,
|
||||
0xe0, 0x04, 0xf0, 0x90, 0x00, 0xc3, 0xe0, 0xff, 0xc3, 0x78, 0x6e, 0x96, 0x50, 0x36, 0xe5, 0x19,
|
||||
0x15, 0x19, 0xac, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4c, 0x60, 0x29, 0xe5, 0x89, 0x30, 0xe7, 0x0c,
|
||||
0x75, 0x89, 0x80, 0xef, 0xc3, 0x94, 0xff, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x75, 0x91, 0xc1, 0xe4,
|
||||
0xf5, 0x91, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x31, 0xb3, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x12,
|
||||
0x31, 0xbe, 0x80, 0xbf, 0x22, 0xaf, 0x0b, 0xae, 0x0a, 0x12, 0x22, 0xe9, 0xaf, 0x0b, 0xae, 0x0a,
|
||||
0x12, 0x35, 0x7b, 0x22, 0x75, 0x89, 0x80, 0x90, 0x00, 0xc3, 0xe0, 0xc3, 0x94, 0xff, 0x22, 0x43,
|
||||
0xad, 0x04, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x85, 0x0d, 0x82, 0x85,
|
||||
0x0c, 0x83, 0x74, 0x26, 0x93, 0x90, 0xff, 0x48, 0xf0, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x74,
|
||||
0x27, 0x93, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x6c, 0xf0, 0x90, 0xff, 0x57, 0x74,
|
||||
0xff, 0xf0, 0x90, 0xff, 0x56, 0xe4, 0xf0, 0x90, 0xff, 0x5f, 0x74, 0xff, 0xf0, 0x90, 0xff, 0x5e,
|
||||
0xe4, 0xf0, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x22, 0x78, 0x5c, 0xe6, 0xff, 0x78, 0x84, 0xe2,
|
||||
0xfc, 0x08, 0xe2, 0x2f, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0x22, 0xe5, 0x22, 0x75, 0xf0,
|
||||
0x0a, 0xa4, 0x24, 0x03, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0x90, 0xff, 0x54, 0xe0,
|
||||
0x90, 0x01, 0xf0, 0xf0, 0x90, 0xff, 0x5c, 0xe0, 0x90, 0x01, 0xf1, 0xf0, 0x75, 0x8a, 0xa0, 0xe4,
|
||||
0x90, 0x00, 0xc0, 0xf0, 0x8c, 0x8f, 0x8d, 0x8e, 0x75, 0x8a, 0xa0, 0xf0, 0x90, 0xff, 0x43, 0x74,
|
||||
0x5f, 0xf0, 0xe5, 0x89, 0x22, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4,
|
||||
0x34, 0x02, 0xf5, 0x83, 0x22, 0x78, 0x5c, 0xe6, 0xff, 0x24, 0xb7, 0xf5, 0x82, 0xe4, 0x34, 0x02,
|
||||
0xf5, 0x83, 0xe0, 0x90, 0xff, 0x54, 0xf0, 0x18, 0xe6, 0x24, 0xb7, 0xf5, 0x82, 0xe4, 0x34, 0x02,
|
||||
0xf5, 0x83, 0xe0, 0x90, 0xff, 0x5c, 0xf0, 0xef, 0xc3, 0x13, 0xff, 0xe5, 0x0d, 0x24, 0x1a, 0xf5,
|
||||
0x82, 0xe4, 0x35, 0x0c, 0xf5, 0x83, 0xe5, 0x82, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83,
|
||||
0xe4, 0x93, 0x90, 0xff, 0x55, 0xf0, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x75, 0xf0, 0x0a,
|
||||
0xa4, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xff, 0xa8, 0x3f, 0x08, 0x08,
|
||||
0xe6, 0xfa, 0x08, 0xe6, 0xf5, 0x82, 0x8a, 0x83, 0x22, 0x74, 0x28, 0x93, 0x90, 0xff, 0x55, 0xf0,
|
||||
0x90, 0x01, 0xf0, 0xe0, 0x90, 0xff, 0x54, 0xf0, 0x90, 0x01, 0xf1, 0xe0, 0x90, 0xff, 0x5c, 0xf0,
|
||||
0x90, 0xff, 0x48, 0xe0, 0xff, 0x7e, 0x00, 0xc3, 0x94, 0x07, 0xee, 0x94, 0x00, 0x22, 0x75, 0x91,
|
||||
0xc3, 0xe4, 0xf5, 0x91, 0xe5, 0x89, 0x22, 0xfd, 0x7c, 0x00, 0xe6, 0xfa, 0x08, 0xe6, 0xfb, 0xc3,
|
||||
0x9d, 0xff, 0xea, 0x9c, 0xfe, 0xef, 0x78, 0x03, 0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22,
|
||||
0xad, 0x8e, 0xac, 0x8f, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xc0, 0x22, 0x90, 0xff, 0x52, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xa6, 0x06, 0x08, 0xf6, 0x90, 0xff, 0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0x22, 0xe5,
|
||||
0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xd3,
|
||||
0xe5, 0x2a, 0x94, 0x00, 0xe5, 0x29, 0x64, 0x80, 0x94, 0x80, 0x22, 0x90, 0xff, 0x52, 0xe0, 0xfa,
|
||||
0xa3, 0xe0, 0xc3, 0x9f, 0xea, 0x9e, 0x22, 0x90, 0xff, 0x5f, 0xf0, 0xed, 0x2b, 0xff, 0xec, 0x3a,
|
||||
0xfe, 0xef, 0x78, 0x03, 0x22, 0x7f, 0xb4, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x03, 0x02, 0x10, 0x98,
|
||||
0x90, 0xff, 0x5e, 0xf0, 0x90, 0xff, 0x56, 0xe0, 0xff, 0xa3, 0xe0, 0xd3, 0x9f, 0x22, 0x75, 0x91,
|
||||
0xc1, 0xe4, 0xf5, 0x91, 0xe5, 0x89, 0x22, 0x78, 0x84, 0xe2, 0xfc, 0x08, 0xe2, 0x22, 0x74, 0xb7,
|
||||
0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x26, 0x22, 0xe5, 0x27,
|
||||
0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xd3, 0x74,
|
||||
0x05, 0x93, 0x9f, 0x74, 0x04, 0x93, 0x9e, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x0b, 0xf5, 0x82,
|
||||
0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x22, 0x78, 0x83, 0xe2,
|
||||
0x90, 0xff, 0x40, 0xf0, 0x22, 0xe5, 0x0d, 0x24, 0x2b, 0xff, 0xe4, 0x35, 0x0c, 0xa9, 0x07, 0x22,
|
||||
0xef, 0x24, 0x01, 0xff, 0xee, 0x33, 0xfe, 0xef, 0x78, 0x07, 0x22, 0xe5, 0x22, 0xc3, 0x78, 0x65,
|
||||
0x96, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0x22, 0x8f, 0x23, 0x12, 0x05, 0x40, 0xe2, 0xfb,
|
||||
0x12, 0x00, 0x60, 0x12, 0x04, 0x02, 0x12, 0x0d, 0x1a, 0x8e, 0x2f, 0x8f, 0x30, 0xeb, 0x70, 0x5f,
|
||||
0x75, 0x24, 0x01, 0x12, 0x05, 0x6f, 0xe4, 0xf5, 0x29, 0xf5, 0x2a, 0x78, 0x61, 0xe2, 0xfe, 0x08,
|
||||
0xe2, 0xff, 0x78, 0x60, 0x12, 0x02, 0xc1, 0x78, 0x65, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x64,
|
||||
0x12, 0x04, 0x76, 0xc3, 0x74, 0x09, 0x93, 0x94, 0x00, 0x50, 0x05, 0x12, 0x05, 0x7b, 0x80, 0x04,
|
||||
0xae, 0x27, 0xaf, 0x28, 0x8e, 0x2d, 0x8f, 0x2e, 0x12, 0x00, 0x60, 0x74, 0x09, 0x93, 0xfc, 0x74,
|
||||
0x0a, 0x12, 0x02, 0x7d, 0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01,
|
||||
0x8e, 0x27, 0x8f, 0x28, 0x78, 0x69, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x68, 0x80, 0x76, 0x78,
|
||||
0x67, 0xe6, 0x14, 0x6b, 0x70, 0x7a, 0xf5, 0x24, 0x12, 0x05, 0x6f, 0x12, 0x00, 0x60, 0x74, 0x03,
|
||||
0x93, 0xf5, 0x29, 0x74, 0x04, 0x93, 0xf5, 0x2a, 0x12, 0x00, 0xec, 0x12, 0x02, 0xb9, 0xeb, 0x25,
|
||||
0xe0, 0x25, 0xe0, 0x24, 0x5d, 0x12, 0x00, 0xf3, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x5c, 0x12,
|
||||
0x04, 0x75, 0xc3, 0x74, 0x0b, 0x93, 0x94, 0x00, 0x50, 0x05, 0x12, 0x05, 0x7b, 0x80, 0x04, 0xae,
|
||||
0x27, 0xaf, 0x28, 0x8e, 0x2d, 0x8f, 0x2e, 0x12, 0x00, 0x60, 0x74, 0x0b, 0x93, 0xfc, 0x74, 0x0c,
|
||||
0x12, 0x02, 0x7d, 0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e,
|
||||
0x27, 0x8f, 0x28, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x59, 0x12, 0x00, 0xf3, 0xeb, 0x25, 0xe0,
|
||||
0x25, 0xe0, 0x24, 0x58, 0xf8, 0xe2, 0x2f, 0xf5, 0x2c, 0x18, 0xe2, 0x3e, 0xf5, 0x2b, 0x80, 0x7d,
|
||||
0xeb, 0xfd, 0x7c, 0x00, 0xae, 0x2f, 0xaf, 0x30, 0x12, 0x0d, 0x08, 0xac, 0x06, 0xad, 0x07, 0xe5,
|
||||
0x2f, 0xc3, 0x13, 0xfe, 0xe5, 0x30, 0x13, 0x2d, 0xf5, 0x2a, 0xec, 0x3e, 0xf5, 0x29, 0xeb, 0x25,
|
||||
0xe0, 0x25, 0xe0, 0x24, 0x5d, 0x12, 0x00, 0xf3, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x5c, 0x12,
|
||||
0x02, 0xc0, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x65, 0x12, 0x00, 0xf3, 0xeb, 0x25, 0xe0, 0x25,
|
||||
0xe0, 0x24, 0x64, 0x12, 0x04, 0x75, 0xd3, 0xe5, 0x26, 0x95, 0x28, 0xe5, 0x27, 0x64, 0x80, 0xf8,
|
||||
0xe5, 0x25, 0x64, 0x80, 0x98, 0x40, 0x11, 0xe4, 0xf5, 0x24, 0x85, 0x27, 0x2b, 0x85, 0x28, 0x2c,
|
||||
0x85, 0x25, 0x27, 0x85, 0x26, 0x28, 0x80, 0x0f, 0x75, 0x24, 0x01, 0x85, 0x25, 0x2b, 0x85, 0x26,
|
||||
0x2c, 0x85, 0x27, 0x27, 0x85, 0x28, 0x28, 0x12, 0x00, 0xec, 0x12, 0x02, 0xb9, 0xc3, 0xe5, 0x26,
|
||||
0x95, 0x2c, 0xf5, 0x26, 0xe5, 0x25, 0x95, 0x2b, 0xf5, 0x25, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50,
|
||||
0x05, 0xe4, 0xf5, 0x25, 0xf5, 0x26, 0xc3, 0xe5, 0x28, 0x95, 0x2c, 0xf5, 0x28, 0xe5, 0x27, 0x95,
|
||||
0x2b, 0xf5, 0x27, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0x85,
|
||||
0x27, 0x2b, 0x85, 0x28, 0x2c, 0xae, 0x2b, 0xaf, 0x2c, 0x12, 0x03, 0xd3, 0xe4, 0x7b, 0x80, 0xfa,
|
||||
0xf9, 0xf8, 0x12, 0x01, 0x2b, 0xae, 0x2f, 0xaf, 0x30, 0x12, 0x04, 0x86, 0xc0, 0x06, 0xc0, 0x07,
|
||||
0xe5, 0x26, 0x25, 0x28, 0xcf, 0xe5, 0x25, 0x35, 0x27, 0xcf, 0x24, 0x01, 0xcf, 0x34, 0x00, 0xab,
|
||||
0x07, 0xfa, 0x33, 0x95, 0xe0, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0f, 0x42, 0xef, 0x12,
|
||||
0x05, 0xe7, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe4, 0x7b, 0x80, 0xfa, 0xf9, 0xf8, 0x12, 0x0f,
|
||||
0x42, 0x8e, 0x2b, 0x8f, 0x2c, 0xe5, 0x24, 0x60, 0x0e, 0xe5, 0x2a, 0x25, 0x2c, 0xf5, 0x2c, 0xe5,
|
||||
0x29, 0x35, 0x2b, 0xf5, 0x2b, 0x80, 0x0d, 0xc3, 0xe5, 0x2a, 0x95, 0x2c, 0xf5, 0x2c, 0xe5, 0x29,
|
||||
0x95, 0x2b, 0xf5, 0x2b, 0xe5, 0x23, 0x12, 0x05, 0x17, 0xf8, 0xe5, 0x2b, 0xf2, 0x08, 0xe5, 0x2c,
|
||||
0xf2, 0x22, 0x8b, 0x1c, 0x8a, 0x1d, 0x89, 0x1e, 0x8d, 0x1f, 0x90, 0x01, 0xfa, 0xe0, 0xf5, 0x21,
|
||||
0xe4, 0xf5, 0x22, 0x85, 0x20, 0x20, 0xe5, 0x1f, 0x60, 0x04, 0x90, 0x00, 0xcb, 0xf0, 0x7d, 0x01,
|
||||
0x7f, 0x12, 0x12, 0x32, 0xcc, 0x75, 0x23, 0x01, 0x75, 0x24, 0x00, 0x78, 0x73, 0xe6, 0xff, 0x70,
|
||||
0x0b, 0x74, 0x20, 0x25, 0x24, 0xf5, 0x24, 0xe4, 0x35, 0x23, 0xf5, 0x23, 0x74, 0x00, 0x2f, 0xf9,
|
||||
0xe4, 0x34, 0x01, 0xfa, 0x7b, 0x01, 0xa8, 0x24, 0xac, 0x23, 0x7d, 0x01, 0x7e, 0x00, 0x7f, 0x20,
|
||||
0x12, 0x0c, 0x68, 0x7e, 0x00, 0x7f, 0x0b, 0x7d, 0xff, 0xe5, 0x24, 0x24, 0x09, 0xfb, 0xe4, 0x35,
|
||||
0x23, 0xfa, 0xa9, 0x03, 0x7b, 0x01, 0x12, 0x10, 0x98, 0x05, 0x24, 0xe5, 0x24, 0xae, 0x23, 0x70,
|
||||
0x02, 0x05, 0x23, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x12, 0x2b, 0x91, 0x90, 0x00, 0x0a,
|
||||
0x12, 0x2b, 0x2a, 0xff, 0x90, 0x00, 0x04, 0x12, 0x0c, 0xa7, 0x2f, 0xf5, 0x22, 0x90, 0x00, 0x05,
|
||||
0x12, 0x0c, 0xa7, 0xb4, 0x04, 0x09, 0x12, 0x2b, 0x58, 0x70, 0x04, 0x90, 0x00, 0xca, 0xf0, 0x90,
|
||||
0x00, 0xca, 0xe0, 0x60, 0x4b, 0x14, 0xf0, 0xe0, 0xff, 0x7e, 0x04, 0x60, 0x02, 0x7e, 0x08, 0x12,
|
||||
0x2b, 0x72, 0x90, 0x00, 0x05, 0xee, 0x12, 0x0c, 0xe6, 0xef, 0x60, 0x08, 0x12, 0x2b, 0x9b, 0xff,
|
||||
0xae, 0xf0, 0x80, 0x10, 0x90, 0x00, 0xcb, 0xe0, 0xff, 0xb4, 0x05, 0x02, 0x80, 0x02, 0x7f, 0x00,
|
||||
0xef, 0x7f, 0x00, 0xfe, 0x12, 0x2b, 0x11, 0x12, 0x2b, 0x27, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 0x2b,
|
||||
0x9b, 0xfd, 0xe5, 0xf0, 0x54, 0x0f, 0xfc, 0xe4, 0x2d, 0xff, 0xee, 0x3c, 0x8f, 0xf0, 0x80, 0x60,
|
||||
0x12, 0x2b, 0x27, 0x70, 0x09, 0x12, 0x2b, 0x58, 0x70, 0x04, 0xe5, 0x1f, 0x60, 0x57, 0x12, 0x2b,
|
||||
0x79, 0x12, 0x2b, 0x11, 0x12, 0x2b, 0x27, 0x60, 0x17, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 0x0d, 0xbb,
|
||||
0x24, 0x00, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 0x2a, 0xec, 0x12, 0x2b, 0x5e, 0x12, 0x0e, 0x6b,
|
||||
0x12, 0x2b, 0x52, 0x60, 0x35, 0xc4, 0x54, 0xf0, 0xfe, 0x90, 0x00, 0x06, 0x12, 0x0d, 0xe6, 0x24,
|
||||
0x00, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 0x2b, 0x11, 0x12, 0x2b, 0x72, 0x90, 0x00, 0x08, 0x12,
|
||||
0x0d, 0xe6, 0x24, 0x00, 0xff, 0xe5, 0xf0, 0x34, 0x10, 0xfe, 0x12, 0x2b, 0x11, 0x12, 0x2b, 0x5e,
|
||||
0x12, 0x0e, 0x6b, 0x80, 0x05, 0xe4, 0x90, 0x00, 0xcb, 0xf0, 0x90, 0x01, 0xfe, 0xe0, 0xd3, 0x94,
|
||||
0xf0, 0x40, 0x70, 0x12, 0x2b, 0x91, 0x12, 0x2b, 0x79, 0x12, 0x2b, 0x11, 0x12, 0x2b, 0x72, 0x12,
|
||||
0x0d, 0xbb, 0xff, 0xae, 0xf0, 0x12, 0x2a, 0xec, 0x90, 0x00, 0x06, 0x12, 0x2b, 0x05, 0x12, 0x2b,
|
||||
0x72, 0x90, 0x00, 0x08, 0x12, 0x2b, 0x0b, 0x90, 0x01, 0x40, 0x74, 0x40, 0xf0, 0x90, 0x01, 0x60,
|
||||
0x74, 0x60, 0xf0, 0x75, 0x2b, 0x01, 0x75, 0x2c, 0x41, 0x12, 0x2b, 0xa4, 0xaf, 0x28, 0x12, 0x39,
|
||||
0xc9, 0xe5, 0x2c, 0xfd, 0x24, 0x02, 0xf5, 0x2c, 0xe5, 0x2b, 0xfc, 0x34, 0x00, 0xf5, 0x2b, 0x8d,
|
||||
0x82, 0x8c, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xaf, 0x28, 0x12, 0x00, 0x12, 0xef, 0xd3, 0x94,
|
||||
0x1c, 0x40, 0x06, 0x7e, 0x0f, 0x7f, 0xff, 0x80, 0x05, 0xaf, 0x28, 0x12, 0x39, 0x97, 0x12, 0x2b,
|
||||
0x33, 0x40, 0xc9, 0x12, 0x2b, 0xa4, 0xaf, 0x28, 0x12, 0x39, 0x97, 0x12, 0x2b, 0x33, 0x40, 0xf6,
|
||||
0x78, 0x73, 0xe6, 0x7f, 0x00, 0x70, 0x02, 0x7f, 0x20, 0x78, 0x73, 0xa6, 0x07, 0xe5, 0x21, 0x20,
|
||||
0xe7, 0x2a, 0x30, 0xe6, 0x0a, 0x12, 0x2b, 0x27, 0x70, 0x22, 0x12, 0x2b, 0x58, 0x70, 0x1d, 0xe5,
|
||||
0x21, 0x30, 0xe5, 0x0f, 0x12, 0x2b, 0x52, 0xff, 0x90, 0x00, 0x05, 0x12, 0x0c, 0xa7, 0x4f, 0x54,
|
||||
0x84, 0x70, 0x09, 0xe5, 0x21, 0x30, 0xe4, 0x0c, 0xe5, 0x1f, 0x60, 0x08, 0x90, 0x01, 0xed, 0xe0,
|
||||
0xff, 0x12, 0x31, 0x5d, 0x22, 0x8b, 0x1c, 0x8a, 0x1d, 0x89, 0x1e, 0x8d, 0x1f, 0xe4, 0xf5, 0x22,
|
||||
0x90, 0x00, 0x05, 0x12, 0x0c, 0xa7, 0xf5, 0x23, 0x90, 0x00, 0x0b, 0x12, 0x0c, 0xa7, 0x60, 0x08,
|
||||
0xe4, 0x78, 0x8a, 0xf2, 0x90, 0x00, 0xbf, 0xf0, 0xe5, 0x23, 0xb4, 0x80, 0x29, 0x78, 0x8a, 0x74,
|
||||
0xff, 0xf2, 0x12, 0x34, 0xe0, 0x90, 0x00, 0xb9, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x34,
|
||||
0xf1, 0x90, 0x00, 0xbb, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3,
|
||||
0xe0, 0x04, 0xf0, 0x02, 0x1c, 0xa9, 0xe5, 0x23, 0x64, 0x08, 0x60, 0x03, 0x02, 0x1c, 0x56, 0x12,
|
||||
0x34, 0xe0, 0xc3, 0x90, 0x00, 0xba, 0xe0, 0x90, 0x00, 0xb9, 0x12, 0x1c, 0xce, 0x8e, 0x24, 0x8f,
|
||||
0x25, 0x12, 0x34, 0xeb, 0xc3, 0x90, 0x00, 0xbc, 0xe0, 0x90, 0x00, 0xbb, 0x12, 0x1c, 0xce, 0x12,
|
||||
0x34, 0xd9, 0x74, 0x01, 0x93, 0xfc, 0x74, 0x02, 0x12, 0x34, 0xf9, 0x40, 0x12, 0x90, 0x01, 0xec,
|
||||
0xe0, 0x30, 0xe0, 0x0b, 0x78, 0x8a, 0xe2, 0x54, 0xfe, 0xf2, 0xe4, 0x90, 0x00, 0xbf, 0xf0, 0xe5,
|
||||
0x25, 0x2f, 0xfd, 0xe5, 0x24, 0x3e, 0xfc, 0x12, 0x34, 0xd9, 0x74, 0x05, 0x93, 0xfb, 0xd3, 0xed,
|
||||
0x9b, 0xec, 0x94, 0x00, 0x40, 0x0b, 0x78, 0x8a, 0xe2, 0x54, 0xfc, 0xf2, 0xe4, 0x90, 0x00, 0xbf,
|
||||
0xf0, 0x12, 0x34, 0xd9, 0x74, 0x03, 0x93, 0xfc, 0x74, 0x04, 0x12, 0x34, 0xf9, 0x40, 0x13, 0x78,
|
||||
0x8a, 0xe2, 0x20, 0xe1, 0x04, 0xe5, 0x1f, 0x60, 0x09, 0x75, 0x22, 0x0c, 0xe4, 0x78, 0x8a, 0xf2,
|
||||
0xf5, 0x1f, 0x78, 0x8a, 0xe2, 0x54, 0x3c, 0x70, 0x03, 0x02, 0x1c, 0xa9, 0x12, 0x34, 0xd9, 0x74,
|
||||
0x06, 0x93, 0xfd, 0x7c, 0x00, 0xd3, 0xe5, 0x25, 0x9d, 0xe5, 0x24, 0x9c, 0x50, 0x09, 0xef, 0x9d,
|
||||
0xee, 0x9c, 0x50, 0x03, 0x02, 0x1c, 0xa9, 0xd3, 0xef, 0x95, 0x25, 0xee, 0x95, 0x24, 0x40, 0x17,
|
||||
0x12, 0x34, 0xeb, 0xd3, 0x90, 0x00, 0xbc, 0xe0, 0x9f, 0x90, 0x00, 0xbb, 0xe0, 0x95, 0xf0, 0x7f,
|
||||
0x02, 0x40, 0x02, 0x7f, 0x01, 0x80, 0x15, 0x12, 0x34, 0xe0, 0xd3, 0x90, 0x00, 0xba, 0xe0, 0x9f,
|
||||
0x90, 0x00, 0xb9, 0xe0, 0x95, 0xf0, 0x7f, 0x04, 0x40, 0x02, 0x7f, 0x03, 0x8f, 0x22, 0x78, 0x8a,
|
||||
0xe2, 0x54, 0xc3, 0xf2, 0x80, 0x53, 0xe5, 0x23, 0xb4, 0x04, 0x09, 0xe4, 0x90, 0x00, 0xbd, 0xf0,
|
||||
0xa3, 0xf0, 0x80, 0x45, 0x12, 0x34, 0xd9, 0x74, 0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 0xff, 0xd3,
|
||||
0x90, 0x00, 0xbe, 0xe0, 0x9f, 0x90, 0x00, 0xbd, 0xe0, 0x9e, 0x50, 0x07, 0x90, 0x01, 0xec, 0xe0,
|
||||
0x20, 0xe0, 0x26, 0x78, 0x8a, 0xe2, 0xff, 0x30, 0xe0, 0x1a, 0x90, 0x00, 0xbf, 0xe0, 0xfe, 0xd3,
|
||||
0x94, 0x02, 0x50, 0x0a, 0xee, 0x7e, 0x0b, 0xb4, 0x01, 0x02, 0x7e, 0x05, 0x8e, 0x22, 0xef, 0x54,
|
||||
0xfe, 0x78, 0x8a, 0xf2, 0xe4, 0x90, 0x00, 0xbf, 0xf0, 0xc3, 0x90, 0x00, 0xbd, 0xe0, 0x94, 0xff,
|
||||
0x50, 0x13, 0x12, 0x34, 0xd9, 0xe4, 0x93, 0xff, 0x90, 0x00, 0xbe, 0xe0, 0x2f, 0xf0, 0x90, 0x00,
|
||||
0xbd, 0xe0, 0x34, 0x00, 0xf0, 0xe5, 0x1f, 0xaf, 0x1f, 0x70, 0x02, 0xaf, 0x22, 0x22, 0x9f, 0xff,
|
||||
0xe0, 0x95, 0xf0, 0xfe, 0x12, 0x39, 0xa3, 0x22, 0x8b, 0x1c, 0x8a, 0x1d, 0x89, 0x1e, 0x43, 0xad,
|
||||
0x04, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x37,
|
||||
0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0xe4, 0xf5, 0x25, 0xf5, 0x25, 0x12, 0x33, 0x70, 0xe5,
|
||||
0x25, 0xc3, 0x9f, 0x50, 0x22, 0xe9, 0x24, 0x0c, 0xf9, 0xe4, 0x3a, 0x12, 0x33, 0x61, 0xe4, 0xfd,
|
||||
0x12, 0x34, 0xaa, 0x12, 0x33, 0x57, 0x7d, 0x08, 0x12, 0x30, 0xb1, 0x12, 0x33, 0x57, 0xe4, 0xfd,
|
||||
0x12, 0x32, 0xcc, 0x05, 0x25, 0x80, 0xd5, 0x90, 0xff, 0x4a, 0xe4, 0xf0, 0x90, 0xff, 0x50, 0x74,
|
||||
0x0f, 0xf0, 0x90, 0xff, 0x58, 0xe4, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43,
|
||||
0x74, 0x9f, 0xf0, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x12, 0x0c, 0x8e, 0x90, 0xff, 0x48, 0xf0,
|
||||
0x90, 0x00, 0x01, 0x12, 0x0c, 0xa7, 0x90, 0xff, 0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x0c, 0xa7,
|
||||
0x90, 0xff, 0x55, 0xf0, 0x90, 0x00, 0x03, 0x12, 0x0c, 0xa7, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff,
|
||||
0x5c, 0xe4, 0xf0, 0xf5, 0x25, 0x12, 0x33, 0x70, 0xe5, 0x25, 0xc3, 0x9f, 0x50, 0x5b, 0xe4, 0xf5,
|
||||
0x26, 0x75, 0x27, 0x64, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x03, 0x43, 0x26, 0x01, 0xe5, 0x26,
|
||||
0x64, 0x01, 0x60, 0x03, 0xd5, 0x27, 0xed, 0x12, 0x33, 0x7e, 0x12, 0x33, 0x57, 0x7d, 0x06, 0x12,
|
||||
0x30, 0xb1, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x12,
|
||||
0x33, 0x57, 0x7d, 0x08, 0x12, 0x30, 0xb1, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xab,
|
||||
0x1f, 0xe5, 0x21, 0xf9, 0x24, 0x02, 0xf5, 0x21, 0xe5, 0x20, 0xfa, 0x34, 0x00, 0xf5, 0x20, 0xee,
|
||||
0x8f, 0xf0, 0x12, 0x0e, 0x6b, 0x05, 0x25, 0x80, 0x9c, 0xe4, 0xf5, 0x25, 0x90, 0xff, 0x54, 0xf0,
|
||||
0x75, 0x28, 0x01, 0x12, 0x33, 0x87, 0x74, 0xff, 0x12, 0x33, 0x54, 0x7d, 0x07, 0x12, 0x30, 0xb1,
|
||||
0x90, 0xff, 0x55, 0x74, 0x64, 0xf0, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 0x90, 0xff, 0x50, 0xe0, 0x30,
|
||||
0xe7, 0x10, 0x05, 0x27, 0xe5, 0x27, 0x70, 0x02, 0x05, 0x26, 0xb4, 0xe8, 0xee, 0xe5, 0x26, 0xb4,
|
||||
0x03, 0xe9, 0xe5, 0x28, 0x24, 0x02, 0x90, 0xff, 0x55, 0xf0, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 0x00,
|
||||
0x05, 0x27, 0xe5, 0x27, 0x70, 0x02, 0x05, 0x26, 0xb4, 0xe8, 0xf4, 0xe5, 0x26, 0xb4, 0x03, 0xef,
|
||||
0xe4, 0xf5, 0x29, 0xf5, 0x26, 0xf5, 0x27, 0x90, 0xff, 0x50, 0xe0, 0x30, 0xe7, 0x03, 0x00, 0x80,
|
||||
0x02, 0x05, 0x29, 0x05, 0x27, 0xe5, 0x27, 0x70, 0x02, 0x05, 0x26, 0x64, 0x64, 0x45, 0x26, 0x70,
|
||||
0xe6, 0xe5, 0x29, 0xd3, 0x94, 0x28, 0x50, 0x0c, 0x12, 0x33, 0x7e, 0x05, 0x28, 0xe5, 0x28, 0xc3,
|
||||
0x94, 0x64, 0x40, 0xae, 0x12, 0x33, 0x87, 0xe5, 0x28, 0x12, 0x33, 0x54, 0x7d, 0x08, 0x12, 0x30,
|
||||
0xb1, 0x12, 0x33, 0x7e, 0x12, 0x33, 0x70, 0x05, 0x25, 0xe5, 0x25, 0xc3, 0x9f, 0x50, 0x03, 0x02,
|
||||
0x1d, 0xe0, 0x90, 0xff, 0x50, 0xe4, 0xf0, 0xff, 0x22, 0xe4, 0x78, 0x62, 0xf6, 0x18, 0xe6, 0x14,
|
||||
0x70, 0x03, 0x02, 0x1f, 0x69, 0x14, 0x70, 0x03, 0x02, 0x1f, 0xda, 0x24, 0x02, 0x60, 0x03, 0x02,
|
||||
0x1f, 0xfc, 0x12, 0x14, 0xd2, 0xe4, 0x93, 0x78, 0x65, 0xf6, 0x78, 0x60, 0xe6, 0x30, 0xe0, 0x08,
|
||||
0x75, 0x23, 0x05, 0x75, 0x24, 0x01, 0x80, 0x06, 0x75, 0x23, 0x08, 0xe4, 0xf5, 0x24, 0xe4, 0xf5,
|
||||
0x22, 0x12, 0x16, 0xbb, 0x50, 0x3f, 0x12, 0x16, 0x57, 0x25, 0x22, 0x12, 0x14, 0xe4, 0xf5, 0x25,
|
||||
0xe5, 0x22, 0x54, 0x01, 0xfd, 0xaf, 0x25, 0x12, 0x34, 0xaa, 0xad, 0x24, 0xaf, 0x25, 0x12, 0x32,
|
||||
0xcc, 0xad, 0x23, 0xaf, 0x25, 0x12, 0x30, 0xb1, 0x78, 0x60, 0xe6, 0xb4, 0x03, 0x13, 0xe5, 0x22,
|
||||
0x30, 0xe0, 0x0e, 0xe4, 0xfd, 0xaf, 0x25, 0x12, 0x32, 0xcc, 0x7d, 0x08, 0xaf, 0x25, 0x12, 0x30,
|
||||
0xb1, 0x05, 0x22, 0x80, 0xbc, 0x78, 0x5d, 0xe6, 0xf5, 0x25, 0x75, 0x26, 0x10, 0x76, 0x40, 0x7e,
|
||||
0x00, 0x7f, 0x12, 0x7d, 0x10, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0xb7, 0x12, 0x10, 0x98, 0xe5, 0x26,
|
||||
0xd3, 0x94, 0x01, 0x40, 0x3c, 0x12, 0x20, 0x01, 0x12, 0x16, 0xbb, 0x50, 0x2c, 0x12, 0x14, 0xd2,
|
||||
0x74, 0x02, 0x93, 0x75, 0xf0, 0xa3, 0xa4, 0xff, 0xae, 0xf0, 0x12, 0x14, 0xec, 0x12, 0x16, 0xc2,
|
||||
0xec, 0x9e, 0x50, 0x08, 0x12, 0x16, 0x5e, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x12, 0x16, 0x5e, 0xc3,
|
||||
0x13, 0xfe, 0xef, 0x4e, 0xf0, 0x05, 0x22, 0x80, 0xcf, 0xe5, 0x26, 0xc3, 0x13, 0xf5, 0x26, 0x80,
|
||||
0xbd, 0x78, 0x5d, 0xa6, 0x25, 0x78, 0x61, 0x76, 0x01, 0x12, 0x14, 0xd2, 0x74, 0x05, 0x93, 0x25,
|
||||
0xe0, 0xf5, 0x25, 0x74, 0x04, 0x93, 0x33, 0xf5, 0x24, 0xe4, 0x78, 0x64, 0xf6, 0xfe, 0xfd, 0x12,
|
||||
0x16, 0x35, 0x7e, 0x00, 0x7f, 0x24, 0x7d, 0x00, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x5f, 0x12, 0x10,
|
||||
0x98, 0x75, 0x23, 0x04, 0x12, 0x31, 0x0b, 0x12, 0x20, 0x01, 0x12, 0x16, 0xbb, 0x50, 0x34, 0x12,
|
||||
0x14, 0xec, 0xe0, 0xfe, 0xa3, 0xe0, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff,
|
||||
0xe5, 0x22, 0x12, 0x15, 0x27, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0xa5, 0xe5, 0x22, 0x12, 0x15, 0x27,
|
||||
0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x22, 0x12, 0x16, 0x88, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05,
|
||||
0x22, 0x80, 0xc7, 0xd5, 0x23, 0xc1, 0x78, 0x61, 0x76, 0x02, 0x12, 0x31, 0x0b, 0x12, 0x26, 0xc2,
|
||||
0x78, 0x65, 0xe6, 0xfd, 0xe4, 0xff, 0x12, 0x2f, 0x6e, 0x78, 0x62, 0xe6, 0x30, 0xe1, 0x04, 0x78,
|
||||
0x64, 0x76, 0x28, 0x78, 0x65, 0xe6, 0xfd, 0xe4, 0xff, 0x02, 0x21, 0x82, 0xe4, 0x78, 0x61, 0xf6,
|
||||
0x22, 0x12, 0x26, 0xc2, 0x12, 0x31, 0x0b, 0xe4, 0xf5, 0x22, 0x22, 0x8b, 0x1c, 0x8a, 0x1d, 0x89,
|
||||
0x1e, 0xe4, 0xf5, 0x1f, 0xfe, 0x7f, 0x0c, 0xfd, 0x12, 0x10, 0x98, 0x7a, 0x00, 0x79, 0x02, 0x12,
|
||||
0x04, 0x58, 0x7a, 0x00, 0x79, 0x31, 0x12, 0x04, 0x58, 0x78, 0x6d, 0xe6, 0x14, 0x60, 0x30, 0x04,
|
||||
0x60, 0x03, 0x02, 0x21, 0x7b, 0xe4, 0x78, 0x6c, 0xf6, 0xff, 0x12, 0x39, 0xc4, 0x12, 0x1e, 0x89,
|
||||
0x78, 0x62, 0xe6, 0x30, 0xe4, 0x03, 0x02, 0x21, 0x7f, 0x7e, 0x00, 0x7f, 0x5e, 0x7d, 0x00, 0x7b,
|
||||
0xfe, 0x7a, 0x00, 0x79, 0x01, 0x12, 0x10, 0x98, 0x78, 0x6d, 0x76, 0x01, 0x02, 0x21, 0x73, 0x12,
|
||||
0x1e, 0x89, 0x78, 0x62, 0xe6, 0xff, 0x30, 0xe4, 0x03, 0x02, 0x21, 0x7b, 0xef, 0x20, 0xe3, 0x03,
|
||||
0x02, 0x21, 0x1f, 0x90, 0x00, 0x8b, 0xe0, 0x30, 0xe1, 0x39, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x21,
|
||||
0x12, 0x39, 0xcd, 0xef, 0x60, 0x2d, 0x90, 0x00, 0x8b, 0x74, 0x02, 0xf0, 0x78, 0x06, 0x14, 0xf2,
|
||||
0x78, 0x02, 0x14, 0xf2, 0x08, 0xe5, 0x21, 0xf2, 0x12, 0x00, 0x60, 0x74, 0x03, 0x93, 0xfc, 0x74,
|
||||
0x04, 0x93, 0xfd, 0xec, 0xc3, 0x13, 0xfe, 0xed, 0x13, 0xff, 0xed, 0x2f, 0x78, 0x05, 0xf2, 0xec,
|
||||
0x3e, 0x18, 0xf2, 0x90, 0x00, 0x8b, 0xe0, 0x30, 0xe0, 0x5b, 0x75, 0x25, 0x00, 0x75, 0x26, 0x00,
|
||||
0x75, 0x27, 0x68, 0x75, 0x28, 0x00, 0x75, 0x29, 0x00, 0x75, 0x2a, 0x6a, 0x7b, 0xfe, 0x7a, 0x00,
|
||||
0x79, 0x5f, 0x12, 0x29, 0x10, 0xe4, 0xf5, 0x20, 0xe5, 0x20, 0x12, 0x03, 0x72, 0xff, 0xe5, 0x20,
|
||||
0x12, 0x05, 0x41, 0xef, 0xf2, 0xf4, 0x60, 0x1b, 0xe5, 0x20, 0x12, 0x05, 0xb8, 0xf9, 0xe4, 0xfa,
|
||||
0x7b, 0xfe, 0xad, 0x20, 0x12, 0x39, 0x8b, 0xe5, 0x20, 0x75, 0xf0, 0x2f, 0xa4, 0x24, 0x06, 0xf8,
|
||||
0x74, 0x01, 0xf2, 0x05, 0x20, 0xe5, 0x20, 0xc3, 0x94, 0x02, 0x40, 0xcc, 0x12, 0x2a, 0x0e, 0x90,
|
||||
0x00, 0x8b, 0x74, 0x01, 0xf0, 0x78, 0x62, 0xe6, 0x30, 0xe5, 0x04, 0x78, 0x6c, 0x76, 0x01, 0x90,
|
||||
0x00, 0x8b, 0xe0, 0xf5, 0x1f, 0x78, 0x66, 0x76, 0x01, 0xe4, 0xf5, 0x20, 0xe5, 0x20, 0xc3, 0x94,
|
||||
0x02, 0x50, 0x19, 0x90, 0x00, 0x8b, 0xe0, 0x30, 0xe0, 0x05, 0xaf, 0x20, 0x12, 0x39, 0xaf, 0x12,
|
||||
0x30, 0x4c, 0x05, 0x20, 0x78, 0x66, 0x74, 0x2f, 0x26, 0xf6, 0x80, 0xe0, 0xa8, 0x1e, 0xac, 0x1d,
|
||||
0xad, 0x1c, 0x12, 0x02, 0x9f, 0xe5, 0x1e, 0x24, 0x06, 0xf9, 0xe4, 0x35, 0x1d, 0xa8, 0x01, 0xfc,
|
||||
0xad, 0x1c, 0x7a, 0x00, 0x79, 0x31, 0x12, 0x02, 0xa3, 0x78, 0x0d, 0xe2, 0x70, 0x11, 0x78, 0x3c,
|
||||
0xe2, 0x70, 0x0c, 0x90, 0x00, 0x8b, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xe4, 0x78, 0x6d, 0xf6, 0xaf,
|
||||
0x1f, 0x22, 0x8f, 0x27, 0x8d, 0x28, 0x78, 0x64, 0xe6, 0x60, 0x01, 0x16, 0x12, 0x15, 0x25, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x27, 0x12, 0x14, 0xee, 0x12, 0x16, 0xc2, 0xf5, 0x2a, 0xec, 0x9e,
|
||||
0xf5, 0x29, 0x12, 0x16, 0x6e, 0xe0, 0xf5, 0x2b, 0xe4, 0xf5, 0x2c, 0x12, 0x16, 0x0f, 0x40, 0x06,
|
||||
0xae, 0x29, 0xaf, 0x2a, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xe5, 0x27, 0x25, 0xe0, 0x24, 0x5f,
|
||||
0xf8, 0xee, 0xf2, 0x08, 0xef, 0xf2, 0x90, 0x36, 0x0b, 0xe4, 0x93, 0x60, 0x07, 0x78, 0x64, 0xe6,
|
||||
0xf5, 0x2c, 0x80, 0x0f, 0x12, 0x16, 0x0f, 0x7f, 0x00, 0x40, 0x02, 0x7f, 0x01, 0xef, 0x78, 0x64,
|
||||
0x56, 0xf5, 0x2c, 0xe5, 0x2c, 0x60, 0x03, 0x02, 0x22, 0x9e, 0xaf, 0x2a, 0xae, 0x29, 0x12, 0x39,
|
||||
0xa3, 0x12, 0x14, 0xd2, 0xc3, 0x12, 0x16, 0x7f, 0x50, 0x0d, 0x12, 0x16, 0x10, 0x40, 0x04, 0x05,
|
||||
0x2b, 0x80, 0x57, 0x15, 0x2b, 0x80, 0x53, 0x12, 0x15, 0xff, 0xe0, 0xff, 0x33, 0x95, 0xe0, 0xfe,
|
||||
0xef, 0x25, 0x2a, 0xf5, 0x2a, 0xee, 0x35, 0x29, 0xf5, 0x29, 0xd3, 0xe5, 0x2a, 0x94, 0x78, 0x12,
|
||||
0x16, 0x14, 0x40, 0x09, 0x12, 0x15, 0x25, 0xe4, 0x75, 0xf0, 0x01, 0x80, 0x1a, 0xe5, 0x2a, 0x24,
|
||||
0x78, 0xe4, 0x35, 0x29, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0x50, 0x11,
|
||||
0x12, 0x15, 0x2a, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x0d, 0xa5, 0x12, 0x15, 0xff, 0xe4, 0xf0, 0x80,
|
||||
0x06, 0x12, 0x16, 0x04, 0xe5, 0x2a, 0xf0, 0xe4, 0xf5, 0x2b, 0x12, 0x14, 0xd2, 0x74, 0x01, 0x93,
|
||||
0xff, 0xd3, 0x64, 0x80, 0xf8, 0xe5, 0x2b, 0x64, 0x80, 0x98, 0x50, 0x17, 0xef, 0x33, 0x95, 0xe0,
|
||||
0xfe, 0xad, 0x2b, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 0x3e, 0xc3, 0x64, 0x80, 0x94,
|
||||
0x80, 0x50, 0x15, 0xe4, 0xf5, 0x2b, 0xe5, 0x27, 0x12, 0x14, 0xee, 0xe0, 0xfe, 0xa3, 0xe0, 0xff,
|
||||
0x12, 0x15, 0x25, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x16, 0x6e, 0xe5, 0x2b, 0xf0, 0x78, 0x64,
|
||||
0xe6, 0x70, 0x3a, 0x12, 0x15, 0x25, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x27, 0x12, 0x16, 0x88,
|
||||
0x12, 0x16, 0xc2, 0xff, 0xec, 0x9e, 0xfe, 0x12, 0x39, 0xa3, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x14,
|
||||
0xd2, 0x74, 0x04, 0x93, 0xfe, 0x74, 0x05, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x0d, 0x08,
|
||||
0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x06, 0x78, 0x62, 0xe6, 0x44, 0x10, 0xf6, 0x05, 0x27, 0x15,
|
||||
0x28, 0xe5, 0x28, 0x60, 0x03, 0x02, 0x21, 0x8c, 0x22, 0x8e, 0x1c, 0x8f, 0x1d, 0xe4, 0x78, 0x61,
|
||||
0xf6, 0x85, 0x1c, 0x0c, 0x85, 0x1d, 0x0d, 0xe5, 0x1d, 0x24, 0x2c, 0xff, 0xe4, 0x35, 0x1c, 0xfa,
|
||||
0xa9, 0x07, 0x7b, 0xff, 0x78, 0x5d, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0c,
|
||||
0x68, 0x78, 0x84, 0x74, 0x01, 0xf2, 0x08, 0x74, 0xcc, 0xf2, 0x85, 0x1d, 0x82, 0x85, 0x1c, 0x83,
|
||||
0xe4, 0x93, 0xff, 0x7e, 0x00, 0xe5, 0x1d, 0x24, 0x06, 0xfd, 0xe4, 0x35, 0x1c, 0xfa, 0xa9, 0x05,
|
||||
0x7b, 0xff, 0x18, 0xe2, 0xfc, 0x08, 0xe2, 0xf8, 0x7d, 0x01, 0x12, 0x0c, 0x68, 0x90, 0x01, 0xa7,
|
||||
0xe0, 0xff, 0x12, 0x34, 0x0d, 0x90, 0x00, 0xc1, 0xe0, 0x64, 0x80, 0x70, 0x04, 0xa3, 0xe0, 0x64,
|
||||
0x75, 0x70, 0x44, 0xff, 0x85, 0x1d, 0x82, 0x85, 0x1c, 0x83, 0xe4, 0x93, 0xfe, 0xef, 0xc3, 0x9e,
|
||||
0x50, 0x35, 0xe4, 0xf5, 0x1f, 0x12, 0x16, 0x57, 0xfd, 0x12, 0x14, 0xe3, 0xfe, 0xe5, 0x1f, 0x90,
|
||||
0x39, 0xd0, 0x93, 0xfb, 0xee, 0x6b, 0x60, 0x0b, 0xe5, 0x1f, 0xc3, 0x94, 0x0f, 0x50, 0x04, 0x05,
|
||||
0x1f, 0x80, 0xe2, 0xe5, 0x1f, 0x90, 0x39, 0xdf, 0x93, 0xfe, 0xed, 0x2f, 0xf5, 0x82, 0xe4, 0x3c,
|
||||
0xf5, 0x83, 0xee, 0xf0, 0x0f, 0x80, 0xbd, 0x7e, 0x00, 0x7d, 0x00, 0x12, 0x16, 0x35, 0x12, 0x14,
|
||||
0xd2, 0x74, 0x02, 0x93, 0xff, 0x7e, 0x00, 0x7c, 0x10, 0x7d, 0x00, 0x12, 0x10, 0x6b, 0xe4, 0x7b,
|
||||
0xc8, 0xfa, 0xf9, 0xf8, 0x12, 0x0f, 0x42, 0x90, 0x02, 0x00, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x78,
|
||||
0x83, 0x74, 0x09, 0xf2, 0x78, 0x5f, 0xe6, 0xff, 0x20, 0xe3, 0x06, 0x78, 0x83, 0xe2, 0x44, 0x04,
|
||||
0xf2, 0xef, 0x20, 0xe2, 0x06, 0x78, 0x83, 0xe2, 0x44, 0x20, 0xf2, 0xe4, 0x78, 0x63, 0xf6, 0x43,
|
||||
0x95, 0x80, 0x78, 0x5f, 0xe6, 0x7f, 0x00, 0x30, 0xe1, 0x02, 0x7f, 0x40, 0xef, 0x44, 0x37, 0x90,
|
||||
0xff, 0x41, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0x75, 0x1e, 0x11, 0xe5, 0x1e, 0xf4, 0x60,
|
||||
0x0c, 0xe4, 0xfd, 0xaf, 0x1e, 0x12, 0x32, 0xcc, 0xe4, 0xfd, 0x12, 0x24, 0x30, 0x75, 0x1e, 0x16,
|
||||
0xe5, 0x1e, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x1e, 0x12, 0x32, 0xcc, 0x7d, 0x01, 0x12, 0x24,
|
||||
0x30, 0x78, 0x60, 0xe6, 0x7f, 0x08, 0x30, 0xe0, 0x02, 0x7f, 0x05, 0x78, 0x87, 0xef, 0xf2, 0x22,
|
||||
0xaf, 0x1e, 0x12, 0x34, 0xaa, 0x7d, 0x08, 0xaf, 0x1e, 0x12, 0x30, 0xb1, 0x7d, 0x07, 0xaf, 0x1e,
|
||||
0x12, 0x30, 0xb1, 0x22, 0x8f, 0x23, 0x12, 0x05, 0x40, 0xe2, 0xff, 0x70, 0x04, 0xf5, 0x24, 0x80,
|
||||
0x18, 0x78, 0x67, 0xe6, 0xfe, 0x14, 0xb5, 0x07, 0x09, 0xee, 0x25, 0xe0, 0x24, 0xfa, 0xf5, 0x24,
|
||||
0x80, 0x07, 0xef, 0x25, 0xe0, 0x24, 0xfe, 0xf5, 0x24, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x63, 0x12,
|
||||
0x00, 0xf3, 0xe5, 0x24, 0x12, 0x02, 0xd8, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x68, 0x12, 0x02, 0xdc,
|
||||
0xe4, 0xfc, 0xfd, 0x78, 0x4f, 0x12, 0x10, 0x34, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x65, 0x12, 0x00,
|
||||
0xf3, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x62, 0x12, 0x02, 0xdc, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x6a,
|
||||
0x12, 0x02, 0xdc, 0xe4, 0xfc, 0xfd, 0x78, 0x53, 0x12, 0x10, 0x34, 0x12, 0x00, 0x60, 0x74, 0x07,
|
||||
0x93, 0xfe, 0x74, 0x08, 0x78, 0x53, 0x12, 0x04, 0x63, 0x12, 0x0e, 0xb7, 0xc0, 0x04, 0xc0, 0x05,
|
||||
0xc0, 0x06, 0xc0, 0x07, 0x12, 0x00, 0x60, 0x78, 0x53, 0x12, 0x03, 0x05, 0x12, 0x0e, 0xb7, 0xd0,
|
||||
0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x01, 0xc3, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06,
|
||||
0xc0, 0x07, 0x12, 0x00, 0x60, 0x74, 0x05, 0x93, 0xfe, 0x74, 0x06, 0x78, 0x4f, 0x12, 0x04, 0x63,
|
||||
0x12, 0x01, 0x2b, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xc3, 0xef, 0x9b, 0xff, 0xee,
|
||||
0x9a, 0xfe, 0xed, 0x99, 0xfd, 0xec, 0x98, 0xfc, 0x78, 0x57, 0x12, 0x10, 0x34, 0x78, 0x57, 0x12,
|
||||
0x10, 0x0b, 0xec, 0x33, 0x50, 0x0b, 0x78, 0x4f, 0x12, 0x10, 0x40, 0x00, 0x00, 0x00, 0x01, 0x80,
|
||||
0x5b, 0x12, 0x05, 0x63, 0x7b, 0x02, 0x12, 0x02, 0x36, 0x12, 0x0f, 0x42, 0x78, 0x57, 0x12, 0x10,
|
||||
0x17, 0x12, 0x01, 0xc3, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0x63, 0x2f,
|
||||
0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 0xf9, 0xe8, 0x3c, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05,
|
||||
0xd0, 0x04, 0x12, 0x0f, 0x42, 0x78, 0x4f, 0x12, 0x10, 0x34, 0x12, 0x00, 0x60, 0x78, 0x4f, 0x12,
|
||||
0x03, 0x05, 0xd3, 0x12, 0x0f, 0xd4, 0x40, 0x14, 0x12, 0x00, 0x60, 0x74, 0x02, 0x93, 0x24, 0xff,
|
||||
0xff, 0x74, 0x01, 0x93, 0x12, 0x02, 0x2c, 0x78, 0x4f, 0x12, 0x10, 0x34, 0x78, 0x4f, 0x12, 0x10,
|
||||
0x0b, 0xe5, 0x23, 0x12, 0x02, 0xac, 0x22, 0x8b, 0x1f, 0x8a, 0x20, 0x89, 0x21, 0x43, 0xad, 0x04,
|
||||
0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x80, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0xa3,
|
||||
0xe4, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x7d, 0xf0, 0x90, 0xff, 0x54,
|
||||
0xe4, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x90, 0xff, 0x48, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x26, 0xf5,
|
||||
0x27, 0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x25, 0xe4, 0x12, 0x35, 0xaa, 0xf4, 0x60, 0x0d, 0xe4, 0xfd,
|
||||
0x12, 0x32, 0xcc, 0x12, 0x35, 0xb2, 0x7d, 0x08, 0x12, 0x30, 0xb1, 0x12, 0x35, 0x9c, 0xf4, 0x60,
|
||||
0x0d, 0xe4, 0xfd, 0x12, 0x32, 0xcc, 0x12, 0x35, 0x9c, 0x7d, 0x08, 0x12, 0x30, 0xb1, 0xe4, 0xff,
|
||||
0x00, 0x0f, 0xbf, 0xc8, 0xfb, 0x74, 0x03, 0x12, 0x35, 0xaa, 0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12,
|
||||
0x34, 0xaa, 0x12, 0x35, 0xb2, 0x7d, 0x07, 0x12, 0x30, 0xb1, 0x12, 0x35, 0x9c, 0xf4, 0x60, 0x0d,
|
||||
0x7d, 0x01, 0x12, 0x34, 0xaa, 0x12, 0x35, 0x9c, 0x7d, 0x07, 0x12, 0x30, 0xb1, 0x90, 0xff, 0x43,
|
||||
0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x40,
|
||||
0x74, 0x09, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xc0, 0xf0, 0x90, 0xff, 0x43, 0xe0, 0x30,
|
||||
0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0x25,
|
||||
0x27, 0xf5, 0x27, 0xee, 0x35, 0x26, 0xf5, 0x26, 0x90, 0xff, 0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0x25,
|
||||
0x29, 0xf5, 0x29, 0xee, 0x35, 0x28, 0xf5, 0x28, 0x05, 0x25, 0xe5, 0x25, 0xc3, 0x94, 0x04, 0x50,
|
||||
0x03, 0x02, 0x25, 0xc7, 0xe5, 0x27, 0xae, 0x26, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8,
|
||||
0xf9, 0xff, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0xee, 0x8f, 0xf0, 0x12, 0x0e, 0x6b, 0xe5, 0x29,
|
||||
0xae, 0x28, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xab, 0x22, 0xaa, 0x23,
|
||||
0xa9, 0x24, 0x90, 0x00, 0x02, 0xee, 0x8f, 0xf0, 0x12, 0x0e, 0x8a, 0x12, 0x35, 0xb2, 0xf4, 0x60,
|
||||
0x05, 0xe4, 0xfd, 0x12, 0x30, 0xb1, 0x12, 0x35, 0x9c, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 0x30,
|
||||
0xb1, 0x22, 0xe4, 0xf5, 0x27, 0xe5, 0x27, 0xc3, 0x78, 0x65, 0x96, 0x50, 0x2b, 0x12, 0x16, 0x57,
|
||||
0x25, 0x27, 0x12, 0x14, 0xe4, 0xf5, 0x28, 0x78, 0x60, 0xe6, 0x54, 0x01, 0xfd, 0xaf, 0x28, 0x12,
|
||||
0x32, 0xcc, 0x78, 0x60, 0xe6, 0xb4, 0x03, 0x0c, 0xe5, 0x27, 0x30, 0xe0, 0x07, 0xe4, 0xfd, 0xaf,
|
||||
0x28, 0x12, 0x32, 0xcc, 0x05, 0x27, 0x80, 0xcd, 0x90, 0xff, 0x4a, 0x74, 0x71, 0xf0, 0x90, 0xff,
|
||||
0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0xe4, 0xf0, 0x12, 0x16, 0x96,
|
||||
0x90, 0xff, 0x54, 0xe4, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x78, 0x5e, 0xe6, 0x90, 0xff, 0x42, 0xf0,
|
||||
0x90, 0xff, 0x55, 0x74, 0x28, 0xf0, 0x90, 0xff, 0x48, 0x74, 0x02, 0xf0, 0x43, 0xad, 0x04, 0x12,
|
||||
0x16, 0x9d, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x1d, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x14,
|
||||
0x84, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x12, 0x16, 0x4e, 0x30, 0xe7, 0xe6, 0x12, 0x14, 0x84, 0x50,
|
||||
0xe1, 0xe0, 0x04, 0xf0, 0x80, 0xdc, 0x12, 0x16, 0x96, 0xe4, 0x78, 0x86, 0xf2, 0x78, 0x5c, 0xf6,
|
||||
0x18, 0x76, 0x01, 0x78, 0x65, 0xe6, 0xc3, 0x13, 0x78, 0x63, 0xf6, 0x78, 0x5e, 0xe6, 0x90, 0xff,
|
||||
0x42, 0xf0, 0x18, 0xe6, 0x90, 0xff, 0x48, 0xf0, 0x78, 0x5f, 0xe6, 0x7f, 0x00, 0x20, 0xe4, 0x02,
|
||||
0x7f, 0x01, 0x90, 0x02, 0x02, 0xef, 0xf0, 0x12, 0x15, 0x35, 0x08, 0x12, 0x14, 0xdb, 0xff, 0x7d,
|
||||
0x06, 0x12, 0x30, 0xb1, 0x78, 0x5b, 0x12, 0x14, 0xdb, 0xff, 0x7d, 0x06, 0x12, 0x30, 0xb1, 0x78,
|
||||
0x83, 0xe2, 0xff, 0x90, 0xff, 0x40, 0xf0, 0x78, 0x5f, 0xe6, 0x30, 0xe7, 0x3e, 0x43, 0xad, 0x04,
|
||||
0xef, 0xf0, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x1d, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x14,
|
||||
0x84, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x12, 0x16, 0x4e, 0x30, 0xe7, 0xe6, 0x12, 0x14, 0x84, 0x50,
|
||||
0xe1, 0xe0, 0x04, 0xf0, 0x80, 0xdc, 0x7b, 0xff, 0x7a, 0x30, 0x79, 0xb1, 0x12, 0x27, 0xf2, 0x12,
|
||||
0x15, 0xe4, 0xf0, 0x78, 0x63, 0xe6, 0x70, 0xca, 0x02, 0x31, 0x0b, 0x53, 0xad, 0xfb, 0x12, 0x16,
|
||||
0x9d, 0x22, 0x15, 0x3f, 0x15, 0x3f, 0x15, 0x3f, 0xa8, 0x3f, 0xa6, 0x03, 0x08, 0xa6, 0x02, 0x08,
|
||||
0xa6, 0x01, 0x15, 0x3f, 0x12, 0x16, 0x96, 0x78, 0x87, 0xe2, 0xa8, 0x3f, 0xf6, 0x12, 0x14, 0xd9,
|
||||
0xff, 0xa8, 0x3f, 0xe6, 0xfd, 0x12, 0x15, 0x8e, 0x12, 0x10, 0x69, 0x78, 0x60, 0xe6, 0x64, 0x03,
|
||||
0x78, 0x5b, 0x60, 0x0d, 0x12, 0x14, 0xdb, 0xff, 0xa8, 0x3f, 0xe6, 0xfd, 0x12, 0x15, 0x8e, 0x80,
|
||||
0x08, 0x12, 0x14, 0xdb, 0x12, 0x15, 0x8b, 0x7d, 0x08, 0x12, 0x10, 0x69, 0x90, 0xff, 0x52, 0xe0,
|
||||
0xfe, 0xa3, 0xe0, 0xff, 0x78, 0x5c, 0xe6, 0x12, 0x15, 0x7d, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12,
|
||||
0x15, 0xf7, 0xff, 0x18, 0xe6, 0x12, 0x15, 0x7d, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x02, 0x02,
|
||||
0xe0, 0x60, 0x2e, 0x08, 0xe6, 0xff, 0x12, 0x14, 0xee, 0x12, 0x15, 0x77, 0x12, 0x29, 0x02, 0x12,
|
||||
0x14, 0xd2, 0x12, 0x16, 0x7e, 0x40, 0x1a, 0x78, 0x5b, 0xe6, 0xff, 0x12, 0x14, 0xee, 0x12, 0x15,
|
||||
0x77, 0x12, 0x29, 0x02, 0x12, 0x14, 0xd2, 0x12, 0x16, 0x7e, 0x40, 0x05, 0xe4, 0x90, 0x02, 0x02,
|
||||
0xf0, 0x90, 0x02, 0x02, 0xe0, 0x70, 0x1b, 0x78, 0x5c, 0x06, 0x06, 0x18, 0x06, 0x06, 0x78, 0x63,
|
||||
0x16, 0x78, 0x5f, 0xe6, 0x7f, 0x00, 0x20, 0xe4, 0x02, 0x7f, 0x01, 0x90, 0x02, 0x02, 0xef, 0xf0,
|
||||
0x80, 0x05, 0xe4, 0x90, 0x02, 0x02, 0xf0, 0x78, 0x63, 0xe6, 0x70, 0x0a, 0x90, 0xff, 0x50, 0xf0,
|
||||
0x90, 0xff, 0x58, 0xf0, 0x80, 0x35, 0x12, 0x15, 0x35, 0xa8, 0x3f, 0x76, 0x64, 0x90, 0xff, 0x58,
|
||||
0xe0, 0xff, 0x90, 0xff, 0x50, 0xe0, 0x4f, 0x30, 0xe7, 0x06, 0xa8, 0x3f, 0x16, 0xe6, 0x70, 0xed,
|
||||
0x12, 0x14, 0xd9, 0x12, 0x15, 0x8b, 0x7d, 0x06, 0x12, 0x10, 0x69, 0x78, 0x5b, 0x12, 0x14, 0xdb,
|
||||
0x12, 0x15, 0x8b, 0x7d, 0x06, 0x12, 0x10, 0x69, 0x12, 0x16, 0x9d, 0xe5, 0x3f, 0x24, 0x04, 0xf5,
|
||||
0x3f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x9d, 0xff, 0xee, 0x9c, 0xfe, 0x12, 0x39, 0xa3, 0x22,
|
||||
0x8b, 0x22, 0x8a, 0x23, 0x89, 0x24, 0x12, 0x2d, 0x79, 0x12, 0x2d, 0xfc, 0x12, 0x31, 0xac, 0x74,
|
||||
0x55, 0x93, 0xf5, 0x2b, 0xe4, 0xf5, 0x2c, 0x12, 0x31, 0xef, 0x12, 0x0c, 0x8e, 0x70, 0x21, 0x12,
|
||||
0x31, 0xac, 0x74, 0x74, 0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x7f, 0x00, 0x50, 0x02,
|
||||
0x7f, 0x01, 0x12, 0x29, 0xd6, 0xee, 0x8f, 0xf0, 0x12, 0x0e, 0x1e, 0x75, 0x2c, 0x03, 0x80, 0x3a,
|
||||
0x12, 0x31, 0xef, 0x12, 0x0c, 0x8e, 0xff, 0xe5, 0x2b, 0x14, 0x6f, 0x70, 0x2d, 0x12, 0x31, 0xac,
|
||||
0x74, 0x75, 0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x2b, 0x50, 0x06, 0x25, 0xe0,
|
||||
0x14, 0xff, 0x80, 0x05, 0x25, 0xe0, 0x24, 0xfe, 0xff, 0x12, 0x29, 0xd6, 0xee, 0x8f, 0xf0, 0x12,
|
||||
0x0e, 0x1e, 0xe5, 0x2b, 0x25, 0xe0, 0x24, 0xfd, 0xf5, 0x2c, 0xe5, 0x2c, 0x60, 0x47, 0x24, 0xff,
|
||||
0xff, 0xe4, 0x34, 0xff, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xab, 0x22, 0xaa, 0x23, 0xa9,
|
||||
0x24, 0x8f, 0x82, 0xf5, 0x83, 0x12, 0x0d, 0xe6, 0xff, 0xae, 0xf0, 0x75, 0xf0, 0x02, 0xe5, 0x2c,
|
||||
0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x12, 0x0d, 0xe6, 0x2f, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12,
|
||||
0x31, 0xac, 0xd3, 0x74, 0x77, 0x93, 0x9f, 0x74, 0x76, 0x93, 0x9e, 0x40, 0x08, 0x12, 0x31, 0xef,
|
||||
0x74, 0xff, 0x12, 0x0c, 0xd4, 0x22, 0x8f, 0x2c, 0xaf, 0x2d, 0xef, 0x33, 0x95, 0xe0, 0xfe, 0x12,
|
||||
0x39, 0xa3, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 0x82,
|
||||
0x85, 0xf0, 0x83, 0x12, 0x0d, 0xe6, 0xfd, 0xac, 0xf0, 0xcf, 0xcd, 0xcf, 0xce, 0xcc, 0xce, 0x12,
|
||||
0x0d, 0x1a, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x22, 0xe4, 0xf5,
|
||||
0x22, 0xf5, 0x23, 0xff, 0xfe, 0x78, 0x35, 0xe2, 0x25, 0xe0, 0xfd, 0x78, 0x06, 0xe2, 0x2d, 0xfd,
|
||||
0x78, 0x0c, 0xe2, 0xc4, 0x54, 0xf0, 0x2d, 0xfd, 0x78, 0x3b, 0xe2, 0xfc, 0xc4, 0x33, 0x54, 0xe0,
|
||||
0x2d, 0x24, 0xfe, 0x60, 0x25, 0x24, 0xf0, 0x60, 0x21, 0x14, 0x60, 0x26, 0x24, 0xf2, 0x60, 0x1a,
|
||||
0x24, 0xfe, 0x60, 0x2e, 0x24, 0xf1, 0x60, 0x0c, 0x14, 0x60, 0x3b, 0x24, 0x02, 0x70, 0x6c, 0xe4,
|
||||
0xfd, 0xff, 0x80, 0x22, 0x7d, 0x01, 0x7f, 0x01, 0x80, 0x0b, 0x75, 0x22, 0x00, 0x75, 0x23, 0x01,
|
||||
0x80, 0x59, 0xe4, 0xfd, 0xff, 0x12, 0x32, 0x86, 0x8e, 0x22, 0x8f, 0x23, 0xe4, 0xfd, 0x7f, 0x01,
|
||||
0x80, 0x0f, 0x7d, 0x01, 0x7f, 0x01, 0x12, 0x32, 0x86, 0x8e, 0x22, 0x8f, 0x23, 0x7d, 0x01, 0xe4,
|
||||
0xff, 0x12, 0x32, 0x86, 0x80, 0x35, 0x7d, 0x01, 0x7f, 0x01, 0x12, 0x32, 0x86, 0xc0, 0x06, 0xc0,
|
||||
0x07, 0xe4, 0xfd, 0xff, 0x12, 0x32, 0x86, 0xd0, 0xe0, 0x2f, 0xf5, 0x23, 0xd0, 0xe0, 0x3e, 0xf5,
|
||||
0x22, 0xe4, 0xfd, 0x7f, 0x01, 0x12, 0x32, 0x86, 0xc0, 0x06, 0xc0, 0x07, 0x7d, 0x01, 0xe4, 0xff,
|
||||
0x12, 0x32, 0x86, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0xd3, 0xe5, 0x23, 0x9f, 0xe5,
|
||||
0x22, 0x9e, 0x40, 0x27, 0x78, 0x24, 0x7c, 0x00, 0x7d, 0x00, 0x12, 0x02, 0x9f, 0x78, 0x02, 0x7c,
|
||||
0x00, 0x7d, 0xfe, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x31, 0x12, 0x02, 0xa5, 0x78, 0x31, 0x7c, 0x00,
|
||||
0x7d, 0xfe, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x12, 0x02, 0xa5, 0x22, 0xab, 0x25, 0xe5, 0x27,
|
||||
0xf9, 0x24, 0x02, 0xf5, 0x27, 0xe5, 0x26, 0xfa, 0x34, 0x00, 0xf5, 0x26, 0xee, 0x8f, 0xf0, 0x12,
|
||||
0x0e, 0x6b, 0x90, 0x00, 0x02, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x12, 0x0d, 0xe6, 0xff, 0xae,
|
||||
0xf0, 0xab, 0x25, 0xe5, 0x27, 0xf9, 0x24, 0x02, 0xf5, 0x27, 0xe5, 0x26, 0xfa, 0x34, 0x00, 0xf5,
|
||||
0x26, 0xee, 0x8f, 0xf0, 0x02, 0x0e, 0x6b, 0x90, 0x00, 0x05, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e,
|
||||
0x02, 0x0c, 0xa7, 0xe5, 0x2a, 0xfd, 0x24, 0x02, 0xf5, 0x2a, 0xe5, 0x29, 0xfc, 0x34, 0x00, 0xf5,
|
||||
0x29, 0x8d, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05, 0x28, 0xe5, 0x28, 0xc3, 0x94,
|
||||
0x10, 0x22, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x90, 0x00, 0x0b, 0x02, 0x0c, 0xa7, 0xab, 0x25,
|
||||
0xe5, 0x27, 0xf9, 0x24, 0x02, 0xf5, 0x27, 0xe5, 0x26, 0xfa, 0x34, 0x00, 0xf5, 0x26, 0xe4, 0xf5,
|
||||
0xf0, 0x22, 0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x22, 0xe5, 0x1f, 0xfe, 0x7c, 0x00, 0xe4, 0x25,
|
||||
0x22, 0xff, 0xec, 0x3e, 0xfe, 0x22, 0x75, 0x89, 0x80, 0x90, 0x00, 0xc3, 0xe0, 0xc3, 0x94, 0xff,
|
||||
0x22, 0x75, 0x25, 0x01, 0x85, 0x23, 0x26, 0x85, 0x24, 0x27, 0x22, 0xab, 0x25, 0xaa, 0x26, 0xa9,
|
||||
0x27, 0x02, 0x0d, 0xbb, 0x75, 0x29, 0x01, 0x75, 0x2a, 0x61, 0xe4, 0xf5, 0x28, 0x22, 0x78, 0xff,
|
||||
0xe4, 0xf6, 0xd8, 0xfd, 0x90, 0x00, 0x00, 0x7f, 0x00, 0x7e, 0x03, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc,
|
||||
0xde, 0xfa, 0x75, 0x81, 0x74, 0x75, 0xa0, 0x00, 0x02, 0x2c, 0x06, 0x02, 0x33, 0xd3, 0xe4, 0x93,
|
||||
0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29,
|
||||
0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20,
|
||||
0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02,
|
||||
0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x39, 0xbf, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3,
|
||||
0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf,
|
||||
0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8,
|
||||
0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82,
|
||||
0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0x90, 0x36, 0x0a, 0xe4, 0x93,
|
||||
0x70, 0x05, 0x43, 0x90, 0x10, 0x80, 0x03, 0x53, 0x90, 0xef, 0x90, 0x36, 0x0c, 0xe4, 0x93, 0xff,
|
||||
0x7c, 0x01, 0x7d, 0x00, 0x12, 0x33, 0x94, 0x90, 0x36, 0x0d, 0xe4, 0x93, 0xb4, 0x01, 0x07, 0x90,
|
||||
0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x01,
|
||||
0x79, 0x00, 0x12, 0x10, 0x98, 0x7d, 0x01, 0x7f, 0x12, 0x12, 0x32, 0xcc, 0x7d, 0x03, 0x7f, 0x12,
|
||||
0x12, 0x30, 0xb1, 0x90, 0xff, 0x1b, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x04,
|
||||
0xf0, 0x90, 0x36, 0x09, 0xe4, 0x93, 0x90, 0x01, 0xfa, 0xf0, 0x90, 0x36, 0x07, 0xe4, 0x93, 0x90,
|
||||
0x01, 0xea, 0xf0, 0x90, 0x36, 0x11, 0xe4, 0x93, 0x90, 0x01, 0xed, 0xf0, 0x78, 0xa7, 0x7c, 0x01,
|
||||
0x7d, 0x01, 0x7b, 0xff, 0x7a, 0x36, 0x79, 0x00, 0x7e, 0x00, 0x7f, 0x03, 0x12, 0x0c, 0x68, 0xe4,
|
||||
0x90, 0x01, 0xec, 0xf0, 0x90, 0x01, 0xfe, 0x04, 0xf0, 0xe4, 0x78, 0x73, 0xf6, 0x90, 0x00, 0xca,
|
||||
0xf0, 0xa3, 0xf0, 0x22, 0x8f, 0x1c, 0x8c, 0x1d, 0x8d, 0x1e, 0xe4, 0xff, 0x79, 0x01, 0xe4, 0xf5,
|
||||
0x1f, 0xfe, 0x12, 0x35, 0xf3, 0xe5, 0x82, 0x2e, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4,
|
||||
0x93, 0x25, 0xe0, 0x25, 0x1c, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0x12, 0x35, 0xf3, 0x74, 0x04,
|
||||
0x93, 0xfa, 0x74, 0x05, 0x93, 0xfb, 0xc3, 0xed, 0x9b, 0xec, 0x9a, 0x40, 0x02, 0x05, 0x1f, 0x0e,
|
||||
0xbe, 0x04, 0xcf, 0x12, 0x35, 0xf3, 0x74, 0x06, 0x93, 0xfd, 0xe5, 0x1f, 0xc3, 0x9d, 0x50, 0x04,
|
||||
0xe4, 0xf9, 0x80, 0x04, 0x0f, 0xbf, 0x05, 0xb6, 0x90, 0x00, 0xcd, 0xe0, 0xb5, 0x01, 0x07, 0xe4,
|
||||
0x90, 0x00, 0xcc, 0xf0, 0x80, 0x28, 0x90, 0x00, 0xcc, 0xe0, 0x04, 0xf0, 0x85, 0x1e, 0x82, 0x85,
|
||||
0x1d, 0x83, 0x74, 0x23, 0x93, 0xff, 0x90, 0x00, 0xcc, 0xe0, 0xfd, 0x33, 0x95, 0xe0, 0xfc, 0xd3,
|
||||
0xed, 0x9f, 0x74, 0x80, 0xf8, 0x6c, 0x98, 0x40, 0x05, 0xe4, 0xf0, 0xa3, 0xe9, 0xf0, 0x90, 0x00,
|
||||
0xcd, 0xe0, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0xaa, 0x22, 0xe4, 0x78, 0x4f, 0xf6, 0x08, 0xf6, 0xfe,
|
||||
0xfd, 0x12, 0x01, 0xb8, 0x12, 0x02, 0xe5, 0xe4, 0xf9, 0xf5, 0x30, 0xf5, 0x2e, 0x75, 0x2f, 0xff,
|
||||
0x78, 0x67, 0xe6, 0xff, 0xe9, 0xc3, 0x9f, 0x50, 0x5b, 0xe9, 0x12, 0x00, 0xed, 0xe9, 0x25, 0xe0,
|
||||
0x25, 0xe0, 0x24, 0x60, 0xf8, 0xe2, 0x2f, 0xf5, 0x32, 0x18, 0xe2, 0x3e, 0xf5, 0x31, 0x12, 0x03,
|
||||
0x55, 0x78, 0x4f, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0xef, 0x2d, 0xfb, 0xee, 0x3c, 0xfa, 0xd3, 0xe5,
|
||||
0x32, 0x9b, 0xe5, 0x31, 0x9a, 0x40, 0x06, 0x75, 0x30, 0x01, 0x18, 0x80, 0x1d, 0xe5, 0x32, 0x2f,
|
||||
0xff, 0xe5, 0x31, 0x3e, 0xfe, 0xd3, 0xed, 0x9f, 0xec, 0x9e, 0x40, 0x15, 0xe5, 0x30, 0x60, 0x08,
|
||||
0xe4, 0xf5, 0x30, 0x12, 0x31, 0xf6, 0x05, 0x2e, 0x78, 0x4f, 0xa6, 0x31, 0x08, 0xa6, 0x32, 0x89,
|
||||
0x2f, 0x09, 0x80, 0x9c, 0xe5, 0x30, 0x60, 0x03, 0x12, 0x31, 0xf6, 0x22, 0xe4, 0xfb, 0x12, 0x03,
|
||||
0x71, 0xfa, 0xf4, 0x60, 0x62, 0xea, 0x70, 0x0c, 0x12, 0x00, 0x60, 0x74, 0x11, 0x93, 0xf5, 0x2e,
|
||||
0x74, 0x12, 0x80, 0x1d, 0x78, 0x67, 0xe6, 0x14, 0xb5, 0x02, 0x0c, 0x12, 0x00, 0x60, 0x74, 0x13,
|
||||
0x93, 0xf5, 0x2e, 0x74, 0x14, 0x80, 0x0a, 0x12, 0x00, 0x60, 0x74, 0x0f, 0x93, 0xf5, 0x2e, 0x74,
|
||||
0x10, 0x93, 0xf5, 0x2f, 0x78, 0x0d, 0xe2, 0x70, 0x05, 0x78, 0x3c, 0xe2, 0x60, 0x0e, 0xe5, 0x2f,
|
||||
0x25, 0xe0, 0xff, 0xe5, 0x2e, 0x12, 0x05, 0xde, 0x8e, 0x2e, 0x8f, 0x2f, 0xea, 0x12, 0x00, 0xed,
|
||||
0xea, 0x25, 0xe0, 0x12, 0x02, 0xd8, 0xc3, 0xef, 0x95, 0x2f, 0xee, 0x95, 0x2e, 0x50, 0x08, 0xeb,
|
||||
0x25, 0xe0, 0x24, 0x68, 0xf8, 0x76, 0xff, 0x0b, 0xeb, 0x64, 0x02, 0x70, 0x91, 0x78, 0x68, 0xe6,
|
||||
0xb4, 0xff, 0x0a, 0x78, 0x6a, 0xe6, 0xff, 0xf4, 0x60, 0x03, 0x12, 0x01, 0x97, 0x22, 0xef, 0x54,
|
||||
0x07, 0xfe, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf9, 0xf4, 0xfe,
|
||||
0xef, 0x54, 0xf0, 0xf5, 0x3e, 0x64, 0x10, 0x70, 0x1e, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x90, 0xff,
|
||||
0x12, 0xed, 0x30, 0xe2, 0x05, 0xe0, 0x49, 0xf0, 0x80, 0x03, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15,
|
||||
0x82, 0x70, 0x14, 0x15, 0x83, 0x80, 0x10, 0xe5, 0x3e, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xfb,
|
||||
0xe4, 0x34, 0xff, 0xf5, 0x83, 0x8b, 0x82, 0xed, 0x24, 0xfb, 0x60, 0x14, 0x14, 0x60, 0x20, 0x24,
|
||||
0xfe, 0x70, 0x2a, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x1e, 0x15, 0x83, 0x80, 0x1a,
|
||||
0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x49, 0xf0, 0x22, 0xe0,
|
||||
0x49, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x5e, 0xf0, 0x22, 0xc0, 0xe0,
|
||||
0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x78, 0x40, 0xa6, 0xa3, 0x08, 0xa6, 0xa6,
|
||||
0x75, 0xa3, 0x08, 0xe6, 0xff, 0x30, 0xe4, 0x07, 0x75, 0xd1, 0xdf, 0x78, 0x72, 0x76, 0x00, 0x78,
|
||||
0x40, 0xe6, 0x30, 0xe0, 0x40, 0xef, 0x20, 0xe0, 0x39, 0x78, 0x72, 0xe6, 0xff, 0x70, 0x18, 0x90,
|
||||
0x02, 0xf8, 0xe0, 0xfe, 0xf5, 0xd6, 0x18, 0xee, 0xf6, 0xc3, 0x94, 0x10, 0x50, 0x24, 0x78, 0x73,
|
||||
0xe6, 0x25, 0xd6, 0xf5, 0xd6, 0x80, 0x1b, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5,
|
||||
0x83, 0xe0, 0xff, 0x78, 0x71, 0xe6, 0x06, 0x25, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83,
|
||||
0xef, 0xf0, 0x78, 0x72, 0x06, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xab, 0x07,
|
||||
0xaa, 0x05, 0xe4, 0x78, 0x62, 0xf6, 0xeb, 0x12, 0x14, 0xee, 0xe0, 0xf5, 0x29, 0xa3, 0xe0, 0xf5,
|
||||
0x2a, 0x78, 0x5d, 0xe6, 0x75, 0x27, 0x00, 0xf5, 0x28, 0xae, 0x27, 0xff, 0x7c, 0x00, 0x7d, 0xfc,
|
||||
0x12, 0x0d, 0x08, 0xd3, 0xe5, 0x2a, 0x9f, 0xe5, 0x29, 0x9e, 0x40, 0x06, 0x78, 0x62, 0xe6, 0x44,
|
||||
0x20, 0xf6, 0x12, 0x14, 0xd2, 0x74, 0x05, 0x93, 0x25, 0xe0, 0xf5, 0x2a, 0x74, 0x04, 0x93, 0x33,
|
||||
0xf5, 0x29, 0xeb, 0x12, 0x15, 0x27, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x2a, 0xff, 0xe5, 0x29, 0x3e,
|
||||
0xfe, 0xeb, 0x12, 0x14, 0xee, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x09, 0x78,
|
||||
0x62, 0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0xf6, 0x0b, 0x1a, 0xea, 0x70, 0x99, 0x22, 0xe4, 0xf5,
|
||||
0x1c, 0x78, 0x1d, 0x7c, 0x00, 0xfd, 0x7b, 0xff, 0x7a, 0x39, 0x79, 0xf6, 0xfe, 0x7f, 0x02, 0x12,
|
||||
0x0c, 0x68, 0x75, 0x22, 0x01, 0x75, 0x23, 0x00, 0x75, 0x24, 0xc4, 0x7b, 0x00, 0x7a, 0x00, 0x79,
|
||||
0x1d, 0x12, 0x25, 0x87, 0xe5, 0x1d, 0xf4, 0x60, 0x14, 0x90, 0x00, 0xc4, 0x12, 0x31, 0xce, 0x40,
|
||||
0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x40, 0x03, 0x75, 0x1c, 0x01, 0xe5, 0x1e, 0xf4,
|
||||
0x60, 0x14, 0x90, 0x00, 0xc6, 0x12, 0x31, 0xce, 0x40, 0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94,
|
||||
0x0b, 0x40, 0x03, 0x75, 0x1c, 0x01, 0x78, 0xb0, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x00,
|
||||
0x79, 0xc4, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0c, 0x68, 0xaf, 0x1c, 0x22, 0x12, 0x04, 0xd6, 0x60,
|
||||
0x11, 0xa8, 0x07, 0xe8, 0x24, 0x0b, 0xf8, 0xe2, 0x7f, 0x80, 0x60, 0x02, 0x7f, 0x08, 0x8f, 0x22,
|
||||
0x80, 0x1e, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x0b, 0xf8, 0xe2, 0x60, 0x11, 0xa8, 0x07, 0xe8, 0x24,
|
||||
0x0f, 0xf8, 0xe2, 0x7f, 0x04, 0x60, 0x02, 0x7f, 0x08, 0x8f, 0x22, 0x80, 0x03, 0xe4, 0xf5, 0x22,
|
||||
0xe5, 0x22, 0xb4, 0x04, 0x0f, 0x12, 0x03, 0x64, 0x04, 0x12, 0x00, 0xe0, 0x78, 0x66, 0xe6, 0x24,
|
||||
0x05, 0xf8, 0xe4, 0xf2, 0x78, 0x66, 0xe6, 0xff, 0x24, 0x06, 0xf8, 0xe5, 0x22, 0xf2, 0xef, 0x04,
|
||||
0x12, 0x03, 0x6a, 0x24, 0x07, 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x0c,
|
||||
0x68, 0xef, 0x54, 0x07, 0x90, 0x39, 0xee, 0x93, 0xfe, 0xf4, 0xf9, 0xef, 0x54, 0xf0, 0xff, 0x64,
|
||||
0x10, 0x60, 0x11, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xfa,
|
||||
0xab, 0x82, 0x80, 0x1a, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x7a, 0xff, 0x7b, 0x12, 0xed, 0x30, 0xe2,
|
||||
0x05, 0x12, 0x35, 0xcd, 0x80, 0x03, 0x12, 0x35, 0xd5, 0xeb, 0x1b, 0x70, 0x01, 0x1a, 0xed, 0x30,
|
||||
0xe1, 0x05, 0x12, 0x35, 0xcd, 0x80, 0x03, 0x12, 0x35, 0xd5, 0xeb, 0x1b, 0x70, 0x01, 0x1a, 0xed,
|
||||
0x30, 0xe0, 0x04, 0x12, 0x35, 0xcd, 0x22, 0x12, 0x35, 0xd5, 0x22, 0x78, 0x63, 0xe6, 0xff, 0x78,
|
||||
0x63, 0xe6, 0x60, 0x29, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x14, 0x84, 0x50, 0x03, 0xe0, 0x04,
|
||||
0xf0, 0x12, 0x16, 0x4e, 0x30, 0xe7, 0x08, 0x12, 0x14, 0x84, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x78,
|
||||
0x63, 0xe6, 0x6f, 0x60, 0xda, 0xe6, 0xff, 0x12, 0x15, 0xe4, 0xf0, 0x80, 0xd2, 0xe4, 0xff, 0x78,
|
||||
0x65, 0xe6, 0xfe, 0xef, 0xc3, 0x9e, 0x50, 0x14, 0x12, 0x15, 0x7c, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd,
|
||||
0xef, 0x12, 0x14, 0xee, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0x0f, 0x80, 0xe3, 0x22, 0x8f, 0x2d, 0xe4,
|
||||
0xfd, 0x7f, 0x12, 0x12, 0x32, 0xcc, 0xaf, 0x2d, 0x15, 0x2d, 0xef, 0x60, 0x38, 0x75, 0xb1, 0x11,
|
||||
0x75, 0xb4, 0x63, 0x75, 0xb0, 0x0d, 0xe5, 0xb1, 0x20, 0xe0, 0x22, 0xe5, 0x89, 0x30, 0xe7, 0x08,
|
||||
0x12, 0x2b, 0x86, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 0xe5, 0x89,
|
||||
0x30, 0xe7, 0xe3, 0x12, 0x2b, 0x86, 0x50, 0xde, 0xe0, 0x04, 0xf0, 0x80, 0xd9, 0xe4, 0xf5, 0xb0,
|
||||
0x75, 0xb1, 0x01, 0x80, 0xc1, 0x7d, 0x01, 0x7f, 0x12, 0x02, 0x32, 0xcc, 0x85, 0x0b, 0x82, 0x85,
|
||||
0x0a, 0x83, 0x22, 0x75, 0x89, 0x80, 0x90, 0x00, 0xc3, 0xe0, 0xc3, 0x94, 0xff, 0x22, 0x75, 0x8a,
|
||||
0xa0, 0xe4, 0x90, 0x00, 0xc0, 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x43, 0x22, 0xe0, 0xfe,
|
||||
0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x78, 0xee, 0x94, 0x00, 0x22, 0xe4, 0x93, 0xff, 0x7e, 0x00, 0x7c,
|
||||
0x00, 0x02, 0x0d, 0x08, 0xe4, 0x78, 0x88, 0xf2, 0x08, 0xf2, 0x90, 0x00, 0xc8, 0xf0, 0x22, 0xab,
|
||||
0x25, 0xaa, 0x26, 0xa9, 0x27, 0x22, 0x78, 0x4f, 0xe6, 0xfa, 0x08, 0xe6, 0xfb, 0xad, 0x2f, 0xaf,
|
||||
0x2e, 0xef, 0xc3, 0x94, 0x02, 0x50, 0x0e, 0xef, 0x25, 0xe0, 0x24, 0x68, 0xf8, 0xa6, 0x05, 0xef,
|
||||
0x12, 0x01, 0xe3, 0x80, 0x24, 0xc3, 0x90, 0x00, 0xb6, 0xe0, 0x9b, 0x90, 0x00, 0xb5, 0xe0, 0x9a,
|
||||
0x50, 0x06, 0x78, 0x68, 0xa6, 0x05, 0x80, 0x11, 0xc3, 0x90, 0x00, 0xb8, 0xe0, 0x9b, 0x90, 0x00,
|
||||
0xb7, 0xe0, 0x9a, 0x50, 0x09, 0x78, 0x6a, 0xa6, 0x05, 0xea, 0xf0, 0xa3, 0xeb, 0xf0, 0x22, 0xc0,
|
||||
0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01,
|
||||
0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x96, 0x12,
|
||||
0x00, 0x0a, 0x7b, 0xff, 0x7a, 0x2e, 0x79, 0x7e, 0x12, 0x27, 0xf2, 0xd0, 0x07, 0xd0, 0x06, 0xd0,
|
||||
0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0,
|
||||
0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x8f, 0x2a, 0x8d, 0x2b, 0xe5, 0x2b, 0x75, 0xf0, 0x2f, 0xa4,
|
||||
0x24, 0x0a, 0x12, 0x00, 0xf3, 0xe5, 0x2a, 0x12, 0x05, 0x17, 0x12, 0x32, 0xbd, 0xc0, 0x06, 0xc0,
|
||||
0x07, 0xe5, 0x2b, 0x75, 0xf0, 0x2f, 0xa4, 0x24, 0x08, 0x12, 0x00, 0xf3, 0xe5, 0x2a, 0x12, 0x05,
|
||||
0xb8, 0x12, 0x32, 0xbd, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x22, 0xf8, 0xe2, 0xfc,
|
||||
0x08, 0xe2, 0xc3, 0x9f, 0xff, 0xec, 0x9e, 0xfe, 0x12, 0x39, 0xa3, 0x22, 0x12, 0x35, 0xbd, 0x60,
|
||||
0x3e, 0xee, 0x64, 0x01, 0x70, 0x18, 0xed, 0x60, 0x07, 0x78, 0x74, 0xe6, 0x4c, 0xf6, 0x80, 0x06,
|
||||
0xec, 0xf4, 0x78, 0x74, 0x56, 0xf6, 0x78, 0x74, 0xe6, 0x90, 0xff, 0x18, 0xf0, 0x22, 0xaf, 0x06,
|
||||
0xef, 0x75, 0xf0, 0x04, 0xa4, 0x24, 0x12, 0xff, 0xe5, 0xf0, 0x34, 0xff, 0x8f, 0x82, 0xf5, 0x83,
|
||||
0xed, 0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22,
|
||||
0xc2, 0xd5, 0xe8, 0x30, 0xe7, 0x0f, 0xb2, 0xd5, 0xe4, 0xc3, 0x9b, 0xfb, 0xe4, 0x9a, 0xfa, 0xe4,
|
||||
0x99, 0xf9, 0xe4, 0x98, 0xf8, 0xec, 0x30, 0xe7, 0x17, 0xb2, 0xd5, 0x12, 0x33, 0x46, 0x12, 0x0f,
|
||||
0x42, 0xe4, 0xc3, 0x9b, 0xfb, 0xe4, 0x9a, 0xfa, 0xe4, 0x99, 0xf9, 0xe4, 0x98, 0xf8, 0x80, 0x03,
|
||||
0x12, 0x0f, 0x42, 0x30, 0xd5, 0x0d, 0xe4, 0xc3, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0xe4, 0x9d, 0xfd,
|
||||
0xe4, 0x9c, 0xfc, 0x22, 0x12, 0x0c, 0xe6, 0xab, 0x1c, 0xe5, 0x1e, 0x24, 0x0c, 0xf9, 0xe4, 0x35,
|
||||
0x1d, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 0x25, 0xf9, 0xee, 0x3a, 0xfa, 0x12, 0x0c, 0x8e, 0xff, 0x22,
|
||||
0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x90, 0x00, 0x0b, 0x12, 0x0c, 0xa7, 0xff, 0x22, 0x75, 0x8a,
|
||||
0xa0, 0xe4, 0x90, 0x00, 0xc0, 0xf0, 0x22, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x85, 0x25, 0x82,
|
||||
0x75, 0x83, 0x00, 0x22, 0x8c, 0x08, 0x8d, 0x09, 0x12, 0x39, 0x5a, 0x44, 0x18, 0x12, 0x39, 0x51,
|
||||
0x90, 0xff, 0x14, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, 0xf0, 0x75, 0xa3,
|
||||
0x08, 0xef, 0x44, 0x80, 0xf5, 0xa1, 0x75, 0xa6, 0x28, 0x75, 0xa2, 0xc1, 0xaf, 0x09, 0x85, 0x08,
|
||||
0xd7, 0x8f, 0xd6, 0x75, 0xd5, 0x02, 0x75, 0xd4, 0xf8, 0x75, 0xd2, 0x01, 0x75, 0xd1, 0xdf, 0x53,
|
||||
0xac, 0xef, 0x22, 0xc2, 0xaf, 0x12, 0x35, 0x07, 0xe5, 0x9b, 0xb4, 0x5a, 0x16, 0xe5, 0x9a, 0xb4,
|
||||
0xa5, 0x11, 0xe5, 0x99, 0xb4, 0xf0, 0x0c, 0xe5, 0x98, 0xb4, 0x0f, 0x07, 0x90, 0xff, 0x85, 0xe0,
|
||||
0x44, 0x20, 0xf0, 0x75, 0x8a, 0x0a, 0xd2, 0xaf, 0x7f, 0x0a, 0x12, 0x34, 0x46, 0x12, 0x39, 0x7a,
|
||||
0x12, 0x10, 0xc4, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xc0, 0xf0, 0x80, 0xf3, 0xad, 0x07, 0x7f,
|
||||
0x3a, 0x12, 0x35, 0xdd, 0x90, 0x00, 0xc1, 0xe4, 0xf0, 0xa3, 0xef, 0xf0, 0x7f, 0x3b, 0x12, 0x35,
|
||||
0xdd, 0xef, 0xfb, 0x7a, 0x00, 0x90, 0x00, 0xc2, 0xe0, 0xfe, 0xe4, 0x2b, 0xff, 0xea, 0x3e, 0x90,
|
||||
0x00, 0xc1, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0xc1, 0xe0, 0xb4, 0x80, 0x08, 0xa3, 0xe0, 0xb4,
|
||||
0x67, 0x03, 0xbd, 0xb6, 0xf1, 0x22, 0xe4, 0x90, 0x00, 0xc0, 0xf0, 0x90, 0x00, 0xc3, 0xf0, 0xef,
|
||||
0x70, 0x0e, 0x75, 0x88, 0x08, 0xf5, 0x8d, 0xf5, 0x8c, 0xf5, 0x8f, 0xf5, 0x8e, 0xf5, 0x88, 0x22,
|
||||
0x75, 0x88, 0x08, 0xe4, 0xf5, 0x8d, 0xf5, 0x8c, 0xef, 0x75, 0xf0, 0x20, 0xa4, 0xff, 0xe5, 0xf0,
|
||||
0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x88, 0xa0, 0x22, 0xe4, 0xf5, 0x3c, 0xf5, 0x3d, 0xff,
|
||||
0x12, 0x0c, 0x8e, 0x25, 0x3d, 0xf5, 0x3d, 0xe4, 0x35, 0x3c, 0xf5, 0x3c, 0x90, 0xff, 0xff, 0x12,
|
||||
0x0c, 0xa7, 0x12, 0x0c, 0xd4, 0x74, 0xff, 0x29, 0xf9, 0x74, 0xff, 0x3a, 0xfa, 0x0f, 0xbf, 0x09,
|
||||
0xdf, 0xed, 0x12, 0x0c, 0xd4, 0xae, 0x3c, 0xaf, 0x3d, 0x22, 0x12, 0x35, 0xbd, 0x60, 0x29, 0x90,
|
||||
0xff, 0x13, 0xee, 0xd3, 0x94, 0x03, 0x40, 0x11, 0xaf, 0x06, 0xef, 0x75, 0xf0, 0x04, 0xa4, 0x25,
|
||||
0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0xed, 0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22,
|
||||
0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0x85, 0x21, 0x82, 0x85, 0x20, 0x83, 0x22,
|
||||
0xab, 0x1c, 0xaa, 0x1d, 0xa9, 0x1e, 0x12, 0x0d, 0xbb, 0xff, 0x22, 0xab, 0x1c, 0xaa, 0x1d, 0xa9,
|
||||
0x1e, 0x90, 0x00, 0x02, 0x12, 0x0d, 0xe6, 0xff, 0x22, 0x93, 0xfd, 0xd3, 0x90, 0x00, 0xbe, 0xe0,
|
||||
0x9d, 0x90, 0x00, 0xbd, 0xe0, 0x9c, 0x22, 0x75, 0x9b, 0x5a, 0x75, 0x9a, 0xa5, 0x75, 0x99, 0xf0,
|
||||
0x75, 0x98, 0x0f, 0x75, 0xac, 0xff, 0x75, 0xad, 0xff, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74,
|
||||
0xc0, 0xf0, 0x90, 0xff, 0x01, 0x74, 0x01, 0xf0, 0x75, 0x95, 0xf1, 0xe4, 0xf5, 0x96, 0x75, 0x97,
|
||||
0xc7, 0x22, 0xef, 0x60, 0x0f, 0x43, 0xac, 0x10, 0x12, 0x39, 0x5a, 0x54, 0xe7, 0x12, 0x39, 0x51,
|
||||
0xe4, 0xf5, 0xa2, 0x22, 0x12, 0x39, 0x52, 0xa3, 0xe0, 0x44, 0x18, 0xf0, 0xa3, 0xe0, 0x54, 0xe7,
|
||||
0xf0, 0x75, 0xa2, 0xc1, 0x53, 0xac, 0xef, 0x22, 0xc3, 0xef, 0x94, 0x01, 0xee, 0x64, 0x80, 0x94,
|
||||
0x80, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x11, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x0a,
|
||||
0xed, 0x24, 0xff, 0xff, 0xec, 0x34, 0xff, 0xfe, 0x80, 0x00, 0x22, 0xe4, 0x78, 0x6d, 0xf6, 0x8f,
|
||||
0x82, 0x8e, 0x83, 0x74, 0x55, 0x93, 0x78, 0x67, 0xf6, 0xef, 0x24, 0x55, 0xf5, 0x0f, 0xe4, 0x3e,
|
||||
0xf5, 0x0e, 0x78, 0x00, 0xe2, 0x54, 0xfe, 0xf2, 0x54, 0xfb, 0xf2, 0x22, 0xab, 0x1f, 0xaa, 0x20,
|
||||
0xa9, 0x21, 0x90, 0x00, 0x01, 0x12, 0x0c, 0xa7, 0xff, 0x22, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff,
|
||||
0x58, 0xf0, 0xab, 0x1f, 0xaa, 0x20, 0xa9, 0x21, 0x12, 0x0c, 0x8e, 0xff, 0x22, 0xef, 0x54, 0x07,
|
||||
0x90, 0x39, 0xee, 0x93, 0xfc, 0xef, 0xc4, 0x54, 0x0f, 0xfe, 0xef, 0xf4, 0x22, 0x8b, 0x82, 0x8a,
|
||||
0x83, 0xe0, 0x4e, 0xf0, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe0, 0x59, 0xf0, 0x22, 0x90, 0xff, 0x00,
|
||||
0x74, 0x02, 0xf0, 0x90, 0xff, 0x04, 0xe4, 0xf0, 0x90, 0xff, 0x03, 0xef, 0xf0, 0x90, 0xff, 0x07,
|
||||
0xe0, 0xff, 0x22, 0x85, 0x1e, 0x82, 0x85, 0x1d, 0x83, 0x75, 0xf0, 0x07, 0xef, 0x02, 0x10, 0x59,
|
||||
0xb6, 0x11, 0x01, 0x0a, 0x14, 0x01, 0x02, 0x05, 0x3c, 0x70, 0x00, 0x00, 0x15, 0x00, 0x02, 0x01,
|
||||
0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
|
||||
0x00, 0x00, 0x03, 0x0a, 0x00, 0xc8, 0x03, 0xe8, 0x0f, 0x1e, 0x0a, 0x10, 0x3c, 0x01, 0x00, 0x50,
|
||||
0x44, 0x41, 0x45, 0x51, 0x46, 0x52, 0x56, 0x53, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x00, 0x28,
|
||||
0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 0x85, 0x00, 0xc8,
|
||||
0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85,
|
||||
0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x05,
|
||||
0x00, 0xef, 0x00, 0xef, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c,
|
||||
0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x9c,
|
||||
0x00, 0x0a, 0x14, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00, 0x01, 0x08, 0x09, 0x01, 0x2c,
|
||||
0x04, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x10, 0x3c, 0x01, 0x00, 0x50, 0x44, 0x41, 0x45,
|
||||
0x51, 0x46, 0x52, 0x56, 0x53, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x00, 0x28, 0x05, 0x0b, 0x28,
|
||||
0xff, 0xff, 0xff, 0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02,
|
||||
0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00,
|
||||
0x3c, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x05, 0x00, 0xf0, 0x00,
|
||||
0xf0, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01,
|
||||
0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14,
|
||||
0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00, 0x01, 0x08, 0x09, 0x01, 0x2c, 0x04, 0x02, 0x03,
|
||||
0x07, 0x06, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x05, 0x0a, 0x10, 0x3c, 0x01, 0x00, 0x50, 0x44, 0x41, 0x45, 0x51, 0x46, 0x52,
|
||||
0x56, 0x53, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e,
|
||||
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x00, 0x28, 0x05, 0x0b, 0x28, 0xff, 0xff, 0xff,
|
||||
0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09,
|
||||
0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58,
|
||||
0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x05, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x46,
|
||||
0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01,
|
||||
0x0a, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14, 0x02, 0x03, 0x07,
|
||||
0x06, 0x01, 0x2c, 0x04, 0x00, 0x01, 0x08, 0x09, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x07, 0x06, 0x01,
|
||||
0x2c, 0x04, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x05, 0x0a, 0x10, 0x3c, 0x01, 0x00, 0x50, 0x44, 0x41, 0x45, 0x51, 0x46, 0x52, 0x56, 0x53, 0x55,
|
||||
0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
|
||||
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x00, 0x28, 0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x64, 0x1e, 0x90,
|
||||
0x01, 0x00, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8,
|
||||
0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x0a, 0x02, 0x85,
|
||||
0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x05, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x46, 0x00, 0x46, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04,
|
||||
0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c,
|
||||
0x04, 0x00, 0x01, 0x08, 0x09, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x02,
|
||||
0x03, 0x07, 0x06, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0e, 0x10,
|
||||
0x3c, 0x01, 0x00, 0x64, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43,
|
||||
0x17, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
|
||||
0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0x22, 0x90, 0x00, 0x00, 0x08,
|
||||
0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02,
|
||||
0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00,
|
||||
0x3c, 0x02, 0x58, 0x07, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x00, 0x00,
|
||||
0x00, 0x02, 0x08, 0xfa, 0x00, 0x64, 0x14, 0x02, 0x03, 0x0b, 0x0a, 0x00, 0xc8, 0x04, 0x00, 0x01,
|
||||
0x0c, 0x0d, 0x00, 0x96, 0x04, 0x02, 0x03, 0x0b, 0x0a, 0x00, 0xc8, 0x04, 0x02, 0x03, 0x0b, 0x0a,
|
||||
0x00, 0xc8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xe4, 0x90, 0x00, 0xcd, 0xf0,
|
||||
0x8f, 0x82, 0x8e, 0x83, 0x74, 0x23, 0x93, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x00, 0xcc, 0xf0,
|
||||
0x22, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x54, 0xe7, 0xf0, 0x22, 0x90, 0xff, 0x12, 0xe0, 0x54, 0xe7,
|
||||
0xf0, 0x90, 0xff, 0x11, 0xe0, 0x22, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x03, 0xf5, 0x82, 0xe4,
|
||||
0x34, 0x02, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x22, 0x12, 0x2c, 0x4b, 0x78, 0x6f, 0x76,
|
||||
0x00, 0x08, 0x76, 0x28, 0x90, 0x00, 0xc9, 0x74, 0x04, 0xf0, 0x22, 0x8d, 0x22, 0xaf, 0x22, 0x12,
|
||||
0x24, 0x44, 0xaf, 0x22, 0x02, 0x16, 0xc9, 0xef, 0x25, 0xe0, 0x24, 0x5f, 0xf8, 0xe2, 0xfe, 0x08,
|
||||
0xe2, 0xff, 0x22, 0xee, 0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 0x12,
|
||||
0x31, 0xac, 0x74, 0x78, 0x93, 0xfd, 0x02, 0x05, 0xfc, 0x7f, 0x30, 0x12, 0x35, 0xdd, 0x22, 0x41,
|
||||
0x00, 0xc8, 0x00, 0x00, 0x78, 0x61, 0xa6, 0x07, 0x22, 0x12, 0x39, 0x66, 0x22, 0x7f, 0x00, 0x22,
|
||||
0x11, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43, 0x17, 0x16, 0x11,
|
||||
0x40, 0x41, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x46, 0x45, 0x44, 0x43, 0x42, 0x16, 0x01, 0x02,
|
||||
0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x11, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xb6, 0x02, 0x30, 0x21, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x56,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
2049
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst92xx_fw.h
Normal file
2049
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/cst92xx_fw.h
Normal file
File diff suppressed because it is too large
Load Diff
432
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst1xx.c
Normal file
432
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst1xx.c
Normal file
@@ -0,0 +1,432 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst1xx_fw.h"
|
||||
|
||||
|
||||
#define BOOT_I2C_ADDR (0x1A)
|
||||
#define MAIN_I2C_ADDR (0x1A)
|
||||
|
||||
#define RW_REG_LEN (2)
|
||||
|
||||
#define CST1XX_BIN_SIZE (24*1024 + 24)
|
||||
|
||||
static struct hyn_ts_data *hyn_1xxdata = NULL;
|
||||
static const u8 gest_map_tbl[33] = {0xff,4,1,3,2,5,12,6,7,7,9,11,10,13,12,7,7,6,10,6,5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,14};
|
||||
|
||||
static int cst1xx_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst1xx_read_checksum(void);
|
||||
static int cst1xx_updata_tpinfo(void);
|
||||
static int cst1xx_enter_boot(void);
|
||||
static int cst1xx_set_workmode(enum work_mode mode,u8 enable);
|
||||
static void cst1xx_rst(void);
|
||||
|
||||
static int cst1xx_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[4];
|
||||
HYN_ENTER();
|
||||
hyn_1xxdata = ts_data;
|
||||
ret = cst1xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_ERROR("cst1xx_enter_boot failed");
|
||||
return -1;
|
||||
}
|
||||
hyn_1xxdata->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_1xxdata->fw_updata_len = CST1XX_BIN_SIZE;
|
||||
hyn_1xxdata->hw_info.ic_fw_checksum = cst1xx_read_checksum();
|
||||
if(hyn_1xxdata->need_updata_fw ==0){
|
||||
hyn_wr_reg(hyn_1xxdata,0xA006EE,3,buf,0); //exit boot
|
||||
cst1xx_rst();
|
||||
mdelay(50);
|
||||
hyn_set_i2c_addr(hyn_1xxdata,MAIN_I2C_ADDR);
|
||||
ret = cst1xx_updata_tpinfo();
|
||||
cst1xx_set_workmode(NOMAL_MODE,0);
|
||||
hyn_1xxdata->need_updata_fw = cst1xx_updata_judge((u8*)fw_bin,CST1XX_BIN_SIZE);
|
||||
}
|
||||
if(hyn_1xxdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst1xx_report(void)
|
||||
{
|
||||
u8 buf[80];
|
||||
u8 finger_num = 0,len = 0,write_tail_end = 0,key_state=0,key_id = 0,tmp_dat;
|
||||
struct hyn_plat_data *dt = &hyn_1xxdata->plat_data;
|
||||
int ret = 0;
|
||||
hyn_1xxdata->rp_buf.report_need = REPORT_NONE;
|
||||
switch(hyn_1xxdata->work_mode){
|
||||
case NOMAL_MODE:
|
||||
write_tail_end = 1;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD000,2,buf,7);
|
||||
if(ret || buf[6] != 0xAB || buf[0] == 0xAB){
|
||||
break;
|
||||
}
|
||||
len = buf[5] & 0x7F;
|
||||
if(len > dt->max_touch_num){
|
||||
len = dt->max_touch_num;
|
||||
}
|
||||
if(buf[5]&0x80){ //key
|
||||
if(buf[5]==0x80){
|
||||
key_id = (buf[1]>>4)-1;
|
||||
key_state = buf[0];
|
||||
}
|
||||
else{
|
||||
finger_num = len;
|
||||
len = (len-1)*5+3;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD007,2,&buf[5],len);
|
||||
len += 5;
|
||||
key_id = (buf[len-2]>>4)-1;
|
||||
key_state = buf[len-3];
|
||||
}
|
||||
if(key_state&0x80){
|
||||
hyn_1xxdata->rp_buf.report_need |= REPORT_KEY;
|
||||
if((key_id == hyn_1xxdata->rp_buf.key_id || 0 == hyn_1xxdata->rp_buf.key_state)&& key_state == 0x83){
|
||||
hyn_1xxdata->rp_buf.key_id = key_id;
|
||||
hyn_1xxdata->rp_buf.key_state = 1;
|
||||
}
|
||||
else{
|
||||
hyn_1xxdata->rp_buf.key_state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{ //pos
|
||||
u16 index = 0;
|
||||
u8 i = 0;
|
||||
finger_num = len;
|
||||
hyn_1xxdata->rp_buf.report_need |= REPORT_POS;
|
||||
if(finger_num > 1){
|
||||
len = (len-1)*5 + 1;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD007,2,&buf[5],len);
|
||||
}
|
||||
hyn_1xxdata->rp_buf.rep_num = finger_num;
|
||||
for(i = 0; i < finger_num; i++){
|
||||
index = i*5;
|
||||
hyn_1xxdata->rp_buf.pos_info[i].pos_id = (buf[index]>>4)&0x0F;
|
||||
hyn_1xxdata->rp_buf.pos_info[i].event = (buf[index]&0x0F) == 0x06 ? 1 : 0;
|
||||
hyn_1xxdata->rp_buf.pos_info[i].pos_x = ((u16)buf[index + 1]<<4) + ((buf[index + 3] >> 4) & 0x0F);
|
||||
hyn_1xxdata->rp_buf.pos_info[i].pos_y = ((u16)buf[index + 2]<<4) + (buf[index + 3] & 0x0F);
|
||||
hyn_1xxdata->rp_buf.pos_info[i].pres_z = buf[index + 4];
|
||||
// HYN_INFO("report_id = %d, xy = %d,%d",hyn_1xxdata->rp_buf.pos_info[i].pos_id,hyn_1xxdata->rp_buf.pos_info[i].pos_x,hyn_1xxdata->rp_buf.pos_info[i].pos_y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD04C,2,&tmp_dat,1);
|
||||
if((tmp_dat&0x7F) <= 32){
|
||||
tmp_dat = tmp_dat&0x7F;
|
||||
hyn_1xxdata->gesture_id = gest_map_tbl[tmp_dat];
|
||||
hyn_1xxdata->rp_buf.report_need |= REPORT_GES;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(write_tail_end){
|
||||
hyn_wr_reg(hyn_1xxdata,0xD000AB,3,buf,0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst1xx_prox_handle(u8 cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
switch(cmd){
|
||||
case 1: //enable
|
||||
hyn_1xxdata->prox_is_enable = 1;
|
||||
hyn_1xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD004B01,3,NULL,0);
|
||||
break;
|
||||
case 0: //disable
|
||||
hyn_1xxdata->prox_is_enable = 0;
|
||||
hyn_1xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD004B00,3,NULL,0);
|
||||
break;
|
||||
case 2: //read
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD004B,2,&hyn_1xxdata->prox_state,1);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cst1xx_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
hyn_1xxdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE)
|
||||
hyn_esdcheck_switch(hyn_1xxdata,DISABLE);
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_irq_set(hyn_1xxdata,ENABLE);
|
||||
hyn_esdcheck_switch(hyn_1xxdata,ENABLE);
|
||||
hyn_wr_reg(hyn_1xxdata,0xD100,2,NULL,0);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
hyn_wr_reg(hyn_1xxdata,0xD04C80,3,NULL,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
hyn_wr_reg(hyn_1xxdata,0xD10D,2,NULL,0);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
hyn_wr_reg(hyn_1xxdata,0xD10A,2,NULL,0);
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
hyn_wr_reg(hyn_1xxdata,0xD119,2,NULL,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_1xxdata,DISABLE);
|
||||
hyn_wr_reg(hyn_1xxdata,0xD105,2,NULL,0);
|
||||
break;
|
||||
default :
|
||||
hyn_esdcheck_switch(hyn_1xxdata,ENABLE);
|
||||
hyn_1xxdata->work_mode = NOMAL_MODE;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int cst1xx_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst1xx_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst1xx_resum(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst1xx_rst();
|
||||
msleep(50);
|
||||
cst1xx_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cst1xx_rst(void)
|
||||
{
|
||||
if(hyn_1xxdata->work_mode==ENTER_BOOT_MODE){
|
||||
hyn_set_i2c_addr(hyn_1xxdata,MAIN_I2C_ADDR);
|
||||
}
|
||||
gpio_set_value(hyn_1xxdata->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_1xxdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
static int cst1xx_enter_boot(void)
|
||||
{
|
||||
int retry = 5,ret = 0 ,cnt_max = 20;
|
||||
u8 buf[4] = {0};
|
||||
hyn_set_i2c_addr(hyn_1xxdata,BOOT_I2C_ADDR);
|
||||
while(++retry<cnt_max){
|
||||
cst1xx_rst();
|
||||
mdelay(retry);
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA001AA,3,buf,0);
|
||||
if(ret != 0){
|
||||
continue;
|
||||
}
|
||||
if(cnt_max ==20){
|
||||
cnt_max = retry+4;
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA002,2,buf,1);
|
||||
if(ret == 0 && buf[0] == 0x55){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int cst1xx_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[28];
|
||||
struct tp_info *ic = &hyn_1xxdata->hw_info;
|
||||
int ret = 0;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD101,2,buf,0);
|
||||
mdelay(1);
|
||||
ret |= hyn_wr_reg(hyn_1xxdata,0xD1F4,2,buf,28);
|
||||
if(ret){
|
||||
HYN_ERROR("cst1xx_updata_tpinfo failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ic->fw_sensor_txnum = buf[0];
|
||||
ic->fw_sensor_rxnum = buf[2];
|
||||
ic->fw_key_num = buf[3];
|
||||
ic->fw_res_y = (buf[7]<<8)|buf[6];
|
||||
ic->fw_res_x = (buf[5]<<8)|buf[4];
|
||||
ic->fw_project_id = (buf[17]<<8)|buf[16];
|
||||
ic->fw_chip_type = (buf[19]<<8)|buf[18];
|
||||
ic->fw_ver = (buf[23]<<24)|(buf[22]<<16)|(buf[21]<<8)|buf[20];
|
||||
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 cst1xx_read_checksum(void)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[4],retry = 5;
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA000,2,buf,1);
|
||||
if(ret){
|
||||
mdelay(2);
|
||||
continue;
|
||||
}
|
||||
if(buf[0]!=0) break;
|
||||
mdelay(2);
|
||||
}
|
||||
mdelay(1);
|
||||
if(buf[0] == 0x01){
|
||||
memset(buf,0,sizeof(buf));
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA008,2,buf,4);
|
||||
}
|
||||
else{
|
||||
hyn_1xxdata->need_updata_fw = 1;
|
||||
}
|
||||
return buf[0] + (buf[1]<<8) + (buf[2]<<16) + (buf[3]<<24);
|
||||
}
|
||||
|
||||
static int cst1xx_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw + len- 16;
|
||||
struct tp_info *ic = &hyn_1xxdata->hw_info;
|
||||
f_fw_project_id = U8TO16(p_data[1],p_data[0]);
|
||||
f_ictype = U8TO16(p_data[3],p_data[2]);
|
||||
f_fw_ver = U8TO16(p_data[7],p_data[6]);
|
||||
f_fw_ver = (f_fw_ver<<16)|U8TO16(p_data[5],p_data[4]);
|
||||
f_checksum = U8TO16(p_data[11],p_data[10]);
|
||||
f_checksum = (f_checksum << 16)|U8TO16(p_data[9],p_data[8]);
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
if(f_ictype != ic->fw_chip_type || f_fw_project_id != ic->fw_project_id){
|
||||
return 0; //not updata
|
||||
}
|
||||
if(f_checksum != ic->ic_fw_checksum && f_fw_ver > ic->fw_ver){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst1xx_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
#define CHECKSUM_OFFECT (24*1024+16)
|
||||
int i,ret, retry = 4;
|
||||
u8 i2c_buf[1024+2];
|
||||
u16 eep_addr = 0, total_kbyte = 24;
|
||||
u32 fw_checksum = 0;
|
||||
HYN_ENTER();
|
||||
if(0 == hyn_1xxdata->fw_file_name[0]){
|
||||
fw_checksum = U8TO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT]);
|
||||
}
|
||||
else{
|
||||
ret = copy_for_updata(hyn_1xxdata,i2c_buf,CHECKSUM_OFFECT,4);
|
||||
if(ret) goto UPDATA_END;
|
||||
fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
|
||||
hyn_irq_set(hyn_1xxdata,DISABLE);
|
||||
while(--retry){
|
||||
ret = cst1xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_ERROR("cst1xx_enter_boot faill");
|
||||
continue;
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA00200,3,i2c_buf,0);
|
||||
if(ret) continue;
|
||||
mdelay(5);
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA003,2,i2c_buf,1);
|
||||
if(i2c_buf[0] != 0x55)continue;
|
||||
//start trans fw
|
||||
for (i=0; i<total_kbyte; i++) {
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x14;
|
||||
eep_addr = i << 10; //i * 1024
|
||||
i2c_buf[2] = eep_addr;
|
||||
i2c_buf[3] = eep_addr>>8;
|
||||
ret = hyn_write_data(hyn_1xxdata, i2c_buf,RW_REG_LEN, 4);
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
if(0 == hyn_1xxdata->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr + eep_addr, 1024);
|
||||
}
|
||||
else{
|
||||
ret |= copy_for_updata(hyn_1xxdata,i2c_buf + 2,eep_addr,1024);
|
||||
}
|
||||
ret |= hyn_write_data(hyn_1xxdata, i2c_buf,RW_REG_LEN, 1026);
|
||||
ret |= hyn_wr_reg(hyn_1xxdata, 0xA004EE, 3,i2c_buf,0);
|
||||
mdelay(60); //wait finsh
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x05;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA005,2,i2c_buf,1);
|
||||
if (ret < 0 || i2c_buf[0] != 0x55){
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(ret) continue;
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xA00300,3,i2c_buf,0);
|
||||
if(ret) continue;
|
||||
hyn_1xxdata->hw_info.ic_fw_checksum = cst1xx_read_checksum();
|
||||
if(fw_checksum == hyn_1xxdata->hw_info.ic_fw_checksum){
|
||||
break;
|
||||
}
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_set_i2c_addr(hyn_1xxdata,MAIN_I2C_ADDR);
|
||||
cst1xx_rst();
|
||||
if(fw_checksum == hyn_1xxdata->hw_info.ic_fw_checksum){
|
||||
mdelay(50);
|
||||
cst1xx_updata_tpinfo();
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("updata_fw failed fw_checksum:%#x ic_checksum:%#x",fw_checksum,hyn_1xxdata->hw_info.ic_fw_checksum);
|
||||
}
|
||||
hyn_irq_set(hyn_1xxdata,ENABLE);
|
||||
return !retry;
|
||||
}
|
||||
|
||||
static u32 cst1xx_check_esd(void)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[6];
|
||||
ret = hyn_wr_reg(hyn_1xxdata,0xD040,2,buf,6);
|
||||
if(ret ==0){
|
||||
u16 checksum = buf[0]+buf[1]+buf[2]+buf[3]+0xA5;
|
||||
if(checksum != ( (buf[4]<<8)+ buf[5])){
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
return ret ? 0:(buf[3]+(buf[2]<<8)+(buf[1]<<16)+(buf[0]<<24));
|
||||
}
|
||||
|
||||
static int cst1xx_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst1xx_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
const struct hyn_ts_fuc cst1xx_fuc = {
|
||||
.tp_rest = cst1xx_rst,
|
||||
.tp_report = cst1xx_report,
|
||||
.tp_supend = cst1xx_supend,
|
||||
.tp_resum = cst1xx_resum,
|
||||
.tp_chip_init = cst1xx_init,
|
||||
.tp_updata_fw = cst1xx_updata_fw,
|
||||
.tp_set_workmode = cst1xx_set_workmode,
|
||||
.tp_check_esd = cst1xx_check_esd,
|
||||
.tp_prox_handle = cst1xx_prox_handle,
|
||||
.tp_get_dbg_data = cst1xx_get_dbg_data,
|
||||
.tp_get_test_result = cst1xx_get_test_result
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
564
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst3240.c
Normal file
564
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst3240.c
Normal file
@@ -0,0 +1,564 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst3240_fw.h"
|
||||
|
||||
#define BOOT_I2C_ADDR (0x5A)
|
||||
#define MAIN_I2C_ADDR (0x5A)
|
||||
#define RW_REG_LEN (2)
|
||||
|
||||
#define CST3240_BIN_SIZE (31*512 + 480)
|
||||
|
||||
static struct hyn_ts_data *hyn_3240data = NULL;
|
||||
static const u8 gest_map_tbl[] = {
|
||||
IDX_NULL, IDX_RIGHT, IDX_UP, IDX_LEFT,
|
||||
IDX_DOWN, IDX_O, IDX_C, IDX_e,
|
||||
IDX_M, IDX_M, IDX_W, IDX_V,
|
||||
IDX_S, IDX_Z, IDX_C, IDX_M,
|
||||
IDX_M, IDX_e, IDX_S, IDX_e,
|
||||
IDX_O, IDX_NULL, IDX_NULL, IDX_NULL,
|
||||
IDX_NULL, IDX_NULL, IDX_NULL, IDX_NULL,
|
||||
IDX_NULL, IDX_NULL, IDX_NULL, IDX_NULL,
|
||||
IDX_POWER
|
||||
};
|
||||
|
||||
static int cst3240_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst3240_read_checksum(void);
|
||||
static int cst3240_updata_tpinfo(void);
|
||||
static int cst3240_enter_boot(void);
|
||||
static void cst3240_rst(void);
|
||||
|
||||
static int cst3240_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
hyn_3240data = ts_data;
|
||||
ret = cst3240_enter_boot();
|
||||
if(ret){
|
||||
HYN_INFO("cst3240_enter_boot failed");
|
||||
return -1;
|
||||
}
|
||||
hyn_3240data->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_3240data->fw_updata_len = CST3240_BIN_SIZE;
|
||||
hyn_3240data->hw_info.ic_fw_checksum = cst3240_read_checksum();
|
||||
HYN_INFO("curt read checksum:%x",hyn_3240data->hw_info.ic_fw_checksum);
|
||||
//hyn_wr_reg(hyn_3240data,0xA006EE,3,buf,0); //exit boot
|
||||
hyn_set_i2c_addr(hyn_3240data,MAIN_I2C_ADDR);
|
||||
cst3240_rst();
|
||||
msleep(50);
|
||||
hyn_3240data->need_updata_fw = cst3240_updata_judge((u8*)fw_bin,CST3240_BIN_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3240_report(void)
|
||||
{
|
||||
u8 buf[80]={0};
|
||||
u8 finger_num = 0,key_flg = 0,tmp_dat;
|
||||
int len = 0;
|
||||
struct hyn_plat_data *dt = &hyn_3240data->plat_data;
|
||||
int ret = 0,retry = 2;
|
||||
switch(hyn_3240data->work_mode){
|
||||
case NOMAL_MODE:
|
||||
retry = 2;
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD000,2,buf,7);
|
||||
if(ret || buf[6] != 0xAB || buf[0] == 0xAB){
|
||||
ret = -2;
|
||||
continue;
|
||||
}
|
||||
finger_num = buf[5] & 0x7F;
|
||||
if(finger_num > dt->max_touch_num){
|
||||
finger_num = dt->max_touch_num;
|
||||
}
|
||||
key_flg = (buf[5]&0x80) ? 1:0;
|
||||
len = 0;
|
||||
if(finger_num > 1){
|
||||
len += (finger_num-1)*5;
|
||||
}
|
||||
if(key_flg && finger_num){
|
||||
len += 3;
|
||||
}
|
||||
if(len > 0){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD007,2,&buf[5],len);
|
||||
}
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD000AB,3,buf,0);
|
||||
if(ret){
|
||||
ret = -3;
|
||||
continue;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
if(ret){
|
||||
hyn_wr_reg(hyn_3240data,0xD000AB,3,buf,0);
|
||||
HYN_ERROR("read frame failed");
|
||||
break;
|
||||
}
|
||||
if(key_flg){ //key
|
||||
if(hyn_3240data->rp_buf.report_need == REPORT_NONE){
|
||||
hyn_3240data->rp_buf.report_need |= REPORT_KEY;
|
||||
}
|
||||
len = finger_num ? (len+5):3;
|
||||
hyn_3240data->rp_buf.key_id = (buf[len-2]>>4)-1;
|
||||
hyn_3240data->rp_buf.key_state = (buf[len-3]&0x0F)==0x03 ? 1:0;
|
||||
HYN_INFO("key_id:%x state:%x",hyn_3240data->rp_buf.key_id ,hyn_3240data->rp_buf.key_state);
|
||||
}
|
||||
if(finger_num){
|
||||
u16 index = 0,i = 0;
|
||||
u8 touch_down = 0;
|
||||
if(hyn_3240data->rp_buf.report_need == REPORT_NONE){
|
||||
hyn_3240data->rp_buf.report_need |= REPORT_POS;
|
||||
}
|
||||
hyn_3240data->rp_buf.rep_num = finger_num;
|
||||
for(i = 0; i < finger_num; i++){
|
||||
index = i*5;
|
||||
hyn_3240data->rp_buf.pos_info[i].pos_id = (buf[index]>>4)&0x0F;
|
||||
hyn_3240data->rp_buf.pos_info[i].event = (buf[index]&0x0F) == 0x06 ? 1 : 0;
|
||||
hyn_3240data->rp_buf.pos_info[i].pos_x = ((u16)buf[index + 1]<<4) + ((buf[index + 3] >> 4) & 0x0F);
|
||||
hyn_3240data->rp_buf.pos_info[i].pos_y = ((u16)buf[index + 2]<<4) + (buf[index + 3] & 0x0F);
|
||||
hyn_3240data->rp_buf.pos_info[i].pres_z = buf[index + 4];
|
||||
if(hyn_3240data->rp_buf.pos_info[i].event) touch_down++;
|
||||
// HYN_INFO("report_id = %d, xy = %d,%d",hyn_3240data->rp_buf.pos_info[i].pos_id,hyn_3240data->rp_buf.pos_info[i].pos_x,hyn_3240data->rp_buf.pos_info[i].pos_y);
|
||||
}
|
||||
if(0== touch_down){
|
||||
hyn_3240data->rp_buf.rep_num = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD04C,2,&tmp_dat,1);
|
||||
if((tmp_dat&0x7F) <= 32){
|
||||
tmp_dat = tmp_dat&0x7F;
|
||||
hyn_3240data->gesture_id = gest_map_tbl[tmp_dat];
|
||||
hyn_3240data->rp_buf.report_need |= REPORT_GES;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3240_prox_handle(u8 cmd)
|
||||
{
|
||||
/*int ret = 0;
|
||||
switch(cmd){
|
||||
case 1: //enable
|
||||
hyn_3240data->prox_is_enable = 1;
|
||||
hyn_3240data->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD004B01,3,NULL,0);
|
||||
break;
|
||||
case 0: //disable
|
||||
hyn_3240data->prox_is_enable = 0;
|
||||
hyn_3240data->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD004B00,3,NULL,0);
|
||||
break;
|
||||
case 2: //read
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD004B,2,&hyn_3240data->prox_state,1);
|
||||
break;
|
||||
}
|
||||
return ret;*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3240_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
hyn_3240data->work_mode = mode;
|
||||
if(mode != NOMAL_MODE)
|
||||
hyn_esdcheck_switch(hyn_3240data,DISABLE);
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_irq_set(hyn_3240data,ENABLE);
|
||||
hyn_esdcheck_switch(hyn_3240data,ENABLE);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD109,2,0,0);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD104,2,0,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD10D,2,0,0);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0x000500,3,0,0);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD10A,2,0,0);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0x000500,3,0,0);
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
cst3240_rst();
|
||||
msleep(50);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD119,2,0,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_3240data,DISABLE);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD105,2,0,0);
|
||||
break;
|
||||
case ENTER_BOOT_MODE:
|
||||
ret |= cst3240_enter_boot();
|
||||
break;
|
||||
default :
|
||||
ret = -2;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int cst3240_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst3240_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3240_resum(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst3240_rst();
|
||||
msleep(50);
|
||||
cst3240_set_workmode(NOMAL_MODE,1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cst3240_rst(void)
|
||||
{
|
||||
if(hyn_3240data->work_mode==ENTER_BOOT_MODE){
|
||||
hyn_set_i2c_addr(hyn_3240data,MAIN_I2C_ADDR);
|
||||
}
|
||||
gpio_set_value(hyn_3240data->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_3240data->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
static int cst3240_enter_boot(void)
|
||||
{
|
||||
int retry = 0,ret = 0,times;
|
||||
u8 buf[4];
|
||||
hyn_set_i2c_addr(hyn_3240data,BOOT_I2C_ADDR);
|
||||
while(++retry<20){
|
||||
cst3240_rst();
|
||||
mdelay(5+retry);
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA001AA,3,0,0);
|
||||
if(ret) continue;
|
||||
times = 5;
|
||||
while(--times){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA002,2,buf,2);
|
||||
if(ret ==0 && buf[0] == 0x55 && buf[1] == 0xA8) break;
|
||||
mdelay(1);
|
||||
}
|
||||
if(times == 0) continue;
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA00100,3,0,0);
|
||||
if(ret) continue;
|
||||
break;
|
||||
}
|
||||
return retry < 20 ? 0:-1;
|
||||
}
|
||||
|
||||
static int cst3240_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[28];
|
||||
struct tp_info *ic = &hyn_3240data->hw_info;
|
||||
int ret = 0,retry = 5;
|
||||
HYN_ENTER();
|
||||
while(--retry){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD101,2,0,0); //get module info mode
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD204,2,buf,8);
|
||||
ret |= hyn_wr_reg(hyn_3240data,0xD1F4,2,&buf[8],8);
|
||||
ret |= cst3240_set_workmode(NOMAL_MODE,ENABLE);
|
||||
if(ret==0 && U8TO16(buf[3],buf[2])==0x3240)break;
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
if(ret || retry==0){
|
||||
HYN_ERROR("cst3240_updata_tpinfo failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ic->fw_project_id = U8TO16(buf[1],buf[0]);
|
||||
ic->fw_chip_type = U8TO16(buf[3],buf[2]);
|
||||
ic->fw_ver = U8TO32(buf[7],buf[6],buf[5],buf[4]);
|
||||
|
||||
ic->fw_sensor_txnum = buf[8];
|
||||
ic->fw_sensor_rxnum = buf[10];
|
||||
ic->fw_key_num = buf[11];
|
||||
ic->fw_res_y = U8TO16(buf[15],buf[14]);
|
||||
ic->fw_res_x = U8TO16(buf[13],buf[12]);
|
||||
|
||||
HYN_INFO("IC_info tx:%d rx:%d key:%d res-x:%d res-y:%d",ic->fw_sensor_txnum,ic->fw_sensor_rxnum,ic->fw_key_num,ic->fw_res_x,ic->fw_res_y);
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 cst3240_read_checksum(void)
|
||||
{
|
||||
int ret;
|
||||
u32 check_sum = 0;
|
||||
u8 buf[4],retry = 6;
|
||||
hyn_3240data->boot_is_pass = 0;
|
||||
while(--retry){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA000,2,buf,1);
|
||||
if(ret ==0 && buf[0] == 0x01) break;
|
||||
mdelay(2);
|
||||
}
|
||||
if(retry){
|
||||
retry = 3;
|
||||
while(retry){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA008,2,buf,4);
|
||||
if(ret==0){
|
||||
check_sum = U8TO32(buf[3],buf[2],buf[1],buf[0]);
|
||||
hyn_3240data->boot_is_pass = 1;
|
||||
break;
|
||||
}
|
||||
mdelay(1);
|
||||
}
|
||||
}
|
||||
return check_sum;
|
||||
}
|
||||
|
||||
static int cst3240_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
int ret;
|
||||
u32 f_check_all,f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw + len- 16;
|
||||
struct tp_info *ic = &hyn_3240data->hw_info;
|
||||
HYN_ENTER();
|
||||
p_data = &p_fw[CST3240_BIN_SIZE-16+4];
|
||||
f_fw_project_id = U8TO16(p_data[1],p_data[0]);
|
||||
f_ictype = U8TO16(p_data[3],p_data[2]);
|
||||
f_fw_ver = U8TO32(p_data[7],p_data[6],p_data[5],p_data[4]);
|
||||
f_checksum = U8TO32(p_data[11],p_data[10],p_data[9],p_data[8]);
|
||||
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
ret = cst3240_updata_tpinfo(); //boot checksum pass, communicate failed not updata
|
||||
if(ret) HYN_ERROR("get tpinfo failed");
|
||||
|
||||
f_check_all = hyn_sum32(0x55,(u32*)p_fw,len/4-1);
|
||||
if(f_check_all != f_checksum){
|
||||
HYN_INFO(".h file checksum erro:%04x",f_check_all);
|
||||
return 0; //no need updata
|
||||
}
|
||||
|
||||
if(hyn_3240data->boot_is_pass ==0 //checksum failed
|
||||
|| ( ret == 0 && f_ictype == ic->fw_chip_type && f_fw_project_id == ic->fw_project_id
|
||||
&& f_checksum != ic->ic_fw_checksum && f_fw_ver >= ic->fw_ver ) // match new ver .h file
|
||||
){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3240_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
int i,ret=-1, times = 0,retry;
|
||||
u8 i2c_buf[512+2];
|
||||
u16 eep_addr = 0;
|
||||
u32 fw_checksum = 0;
|
||||
HYN_ENTER();
|
||||
if(len < CST3240_BIN_SIZE){
|
||||
HYN_ERROR("len = %d",len);
|
||||
goto UPDATA_END;
|
||||
}
|
||||
if(len > CST3240_BIN_SIZE) len = CST3240_BIN_SIZE;
|
||||
|
||||
if(0 == hyn_3240data->fw_file_name[0]){
|
||||
fw_checksum = *(u32*)(bin_addr+CST3240_BIN_SIZE-4);
|
||||
}
|
||||
else{
|
||||
ret = copy_for_updata(hyn_3240data,i2c_buf,CST3240_BIN_SIZE-4,4);
|
||||
if(ret) goto UPDATA_END;
|
||||
fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
hyn_irq_set(hyn_3240data,DISABLE);
|
||||
hyn_esdcheck_switch(hyn_3240data,DISABLE);
|
||||
retry = 4;
|
||||
while(--retry){
|
||||
hyn_3240data->fw_updata_process = 0;
|
||||
ret = cst3240_enter_boot();
|
||||
if(ret) continue;
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA01000,3,0,0);
|
||||
if(ret) continue;
|
||||
//start trans fw
|
||||
for (i=0; i<32;i++) {
|
||||
ret = 0;
|
||||
if(31 == i){
|
||||
ret |= hyn_wr_reg(hyn_3240data, 0xA01002, 3,0,0);
|
||||
ret |= hyn_wr_reg(hyn_3240data, 0xA00CE001, 4,0,0);
|
||||
}
|
||||
eep_addr = i << 9; //i * 512
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA0140000+U16REV(eep_addr),4,0,0);
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
if(0 == hyn_3240data->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr + eep_addr, 512);
|
||||
}else{
|
||||
ret |= copy_for_updata(hyn_3240data,i2c_buf + 2,eep_addr,512);
|
||||
}
|
||||
ret |= hyn_write_data(hyn_3240data, i2c_buf,RW_REG_LEN, i<31 ? 514:482);
|
||||
if(ret){ //com erro
|
||||
continue;
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_3240data, 0xA004EE, 3,0,0);
|
||||
if(ret) ret = hyn_wr_reg(hyn_3240data, 0xA004EE, 3,0,0);
|
||||
mdelay((4-retry)*100); //wait finsh
|
||||
times = 100;
|
||||
while(--times){
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA005,2,i2c_buf,1);
|
||||
if(ret==0 && i2c_buf[0] == 0x55) break;
|
||||
ret = -1;
|
||||
mdelay(10);
|
||||
}
|
||||
if(ret) break;
|
||||
hyn_3240data->fw_updata_process = i*100/32;
|
||||
}
|
||||
// HYN_INFO("ret = %d",ret);
|
||||
if(ret) continue;
|
||||
|
||||
ret = hyn_wr_reg(hyn_3240data,0xA00300,3,i2c_buf,0);
|
||||
if(ret) continue;
|
||||
hyn_3240data->hw_info.ic_fw_checksum = cst3240_read_checksum();
|
||||
HYN_INFO("retry:%d fw_checksum:%x ic_checksum:%x\r\n",4-retry,fw_checksum,hyn_3240data->hw_info.ic_fw_checksum);
|
||||
if(fw_checksum != hyn_3240data->hw_info.ic_fw_checksum){
|
||||
ret = -2;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_set_i2c_addr(hyn_3240data,MAIN_I2C_ADDR);
|
||||
cst3240_rst();
|
||||
if(ret == 0){
|
||||
msleep(50);
|
||||
cst3240_updata_tpinfo();
|
||||
hyn_3240data->fw_updata_process = 100;
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
hyn_3240data->fw_updata_process |= 0x80;
|
||||
HYN_ERROR("updata_fw failed");
|
||||
}
|
||||
hyn_irq_set(hyn_3240data,ENABLE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 cst3240_check_esd(void)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[6];
|
||||
HYN_ENTER();
|
||||
ret = hyn_wr_reg(hyn_3240data,0xD040,2,buf,6);
|
||||
if(ret ==0 && hyn_sum16(0xA5,buf,4)==U8TO16(buf[4],buf[5])){
|
||||
ret = U8TO32(buf[0],buf[1],buf[2],buf[3]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int cst3240_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = -1,timeout;
|
||||
u16 read_len = (hyn_3240data->hw_info.fw_sensor_txnum * hyn_3240data->hw_info.fw_sensor_rxnum)*2;
|
||||
u16 total_len = read_len + (hyn_3240data->hw_info.fw_sensor_txnum + hyn_3240data->hw_info.fw_sensor_rxnum)*2;
|
||||
HYN_ENTER();
|
||||
if(total_len > len){
|
||||
HYN_ERROR("buf too small");
|
||||
return -1;
|
||||
}
|
||||
switch(hyn_3240data->work_mode){
|
||||
case DIFF_MODE:
|
||||
case RAWDATA_MODE:
|
||||
timeout = 60;
|
||||
while(--timeout){ //wait rise edge
|
||||
if(gpio_get_value(hyn_3240data->plat_data.irq_gpio)==1) break;
|
||||
msleep(1);
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_3240data,0x1000,2,buf,read_len); //mt
|
||||
|
||||
buf += read_len;
|
||||
read_len = hyn_3240data->hw_info.fw_sensor_rxnum*2;
|
||||
ret |= hyn_wr_reg(hyn_3240data,0x7000,2,buf,read_len); //rx
|
||||
|
||||
buf += read_len;
|
||||
read_len = hyn_3240data->hw_info.fw_sensor_txnum*2;
|
||||
ret |= hyn_wr_reg(hyn_3240data,0x7200,2,buf,read_len); //tx
|
||||
|
||||
ret |= hyn_wr_reg(hyn_3240data,0x000500,3,0,0); //end
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("work_mode:%d",hyn_3240data->work_mode);
|
||||
break;
|
||||
}
|
||||
return ret==0 ? total_len:-1;
|
||||
}
|
||||
|
||||
#define FACTEST_PATH "/sdcard/hyn_fac_test_cfg.ini"
|
||||
#define FACTEST_LOG_PATH "/sdcard/hyn_fac_test.log"
|
||||
#define FACTEST_ITEM (MULTI_OPEN_TEST|MULTI_SHORT_TEST)
|
||||
static int cst3240_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = 0,timeout;
|
||||
struct tp_info *ic = &hyn_3240data->hw_info;
|
||||
u16 scap_len = (ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*2;
|
||||
u16 mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum*2,i = 0;
|
||||
u16 *raw_s;
|
||||
|
||||
HYN_ENTER();
|
||||
if((mt_len*3 + scap_len) > len || mt_len==0){
|
||||
HYN_ERROR("buf too small");
|
||||
return FAC_GET_DATA_FAIL;
|
||||
}
|
||||
msleep(1);
|
||||
timeout = 500;
|
||||
while(--timeout){ //wait rise edge
|
||||
if(gpio_get_value(hyn_3240data->plat_data.irq_gpio)==1) break;
|
||||
msleep(10);
|
||||
}
|
||||
if(hyn_wr_reg(hyn_3240data,0x3000,2,buf,mt_len)){ //open high
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read open high failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
if(hyn_wr_reg(hyn_3240data,0x1000,2,buf + mt_len,mt_len)){ //open low
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read open low failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
//short test
|
||||
if(hyn_wr_reg(hyn_3240data,0x5000,2,buf+(mt_len*2),scap_len)){
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read fac short failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
else{
|
||||
raw_s = (u16*)(buf + mt_len*2);
|
||||
for(i = 0; i< ic->fw_sensor_rxnum+ic->fw_sensor_txnum; i++){
|
||||
*raw_s = U16REV((u16)*raw_s);
|
||||
raw_s++;
|
||||
}
|
||||
}
|
||||
|
||||
//read data finlish start test
|
||||
ret = factory_multitest(hyn_3240data ,FACTEST_PATH, buf,(s16*)(buf+scap_len+mt_len*2),FACTEST_ITEM);
|
||||
|
||||
selftest_end:
|
||||
if(0 == fac_test_log_save(FACTEST_LOG_PATH,hyn_3240data,(s16*)buf,ret,FACTEST_ITEM)){
|
||||
HYN_INFO("fac_test log save success");
|
||||
}
|
||||
cst3240_resum();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
const struct hyn_ts_fuc cst3240_fuc = {
|
||||
.tp_rest = cst3240_rst,
|
||||
.tp_report = cst3240_report,
|
||||
.tp_supend = cst3240_supend,
|
||||
.tp_resum = cst3240_resum,
|
||||
.tp_chip_init = cst3240_init,
|
||||
.tp_updata_fw = cst3240_updata_fw,
|
||||
.tp_set_workmode = cst3240_set_workmode,
|
||||
.tp_check_esd = cst3240_check_esd,
|
||||
.tp_prox_handle = cst3240_prox_handle,
|
||||
.tp_get_dbg_data = cst3240_get_dbg_data,
|
||||
.tp_get_test_result = cst3240_get_test_result
|
||||
};
|
||||
431
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst3xx.c
Normal file
431
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst3xx.c
Normal file
@@ -0,0 +1,431 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst3xx_fw.h"
|
||||
|
||||
#define BOOT_I2C_ADDR (0x1A)
|
||||
#define MAIN_I2C_ADDR (0x1A)
|
||||
#define RW_REG_LEN (2)
|
||||
#define CST3xx_BIN_SIZE (24*1024 + 24)
|
||||
|
||||
static struct hyn_ts_data *hyn_3xxdata = NULL;
|
||||
static const u8 gest_map_tbl[33] = {0xff,4,1,3,2,5,12,6,7,7,9,11,10,13,12,7,7,6,10,6,5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,14};
|
||||
|
||||
static int cst3xx_updata_judge(u8 *p_fw, u16 len);
|
||||
static int cst3xx_read_checksum(u32* check_sum);
|
||||
static int cst3xx_updata_tpinfo(void);
|
||||
static int cst3xx_enter_boot(void);
|
||||
static int cst3xx_set_workmode(enum work_mode mode,u8 enable);
|
||||
static void cst3xx_rst(void);
|
||||
|
||||
static int cst3xx_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
hyn_3xxdata = ts_data;
|
||||
ret = cst3xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_ERROR("cst3xx_enter_boot failed");
|
||||
return -1;
|
||||
}
|
||||
hyn_3xxdata->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_3xxdata->fw_updata_len = CST3xx_BIN_SIZE;
|
||||
if(0 == cst3xx_read_checksum(&hyn_3xxdata->hw_info.ic_fw_checksum)){
|
||||
hyn_3xxdata->boot_is_pass = 1;
|
||||
}
|
||||
hyn_set_i2c_addr(hyn_3xxdata,MAIN_I2C_ADDR);
|
||||
cst3xx_rst();
|
||||
mdelay(50);
|
||||
|
||||
hyn_3xxdata->need_updata_fw = cst3xx_updata_judge((u8*)fw_bin,CST3xx_BIN_SIZE);
|
||||
if(hyn_3xxdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_report(void)
|
||||
{
|
||||
u8 buf[80];
|
||||
u8 finger_num = 0,len = 0,write_tail_end = 0,key_state=0,key_id = 0,tmp_dat;
|
||||
struct hyn_plat_data *dt = &hyn_3xxdata->plat_data;
|
||||
int ret = 0;
|
||||
hyn_3xxdata->rp_buf.report_need = REPORT_NONE;
|
||||
switch(hyn_3xxdata->work_mode){
|
||||
case NOMAL_MODE:
|
||||
write_tail_end = 1;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD000,2,buf,7);
|
||||
if(ret || buf[6] != 0xAB || buf[0] == 0xAB){
|
||||
break;
|
||||
}
|
||||
len = buf[5] & 0x7F;
|
||||
if(len > dt->max_touch_num){
|
||||
len = dt->max_touch_num;
|
||||
}
|
||||
if(buf[5]&0x80){ //key
|
||||
if(buf[5]==0x80){
|
||||
key_id = (buf[1]>>4)-1;
|
||||
key_state = buf[0];
|
||||
}
|
||||
else{
|
||||
finger_num = len;
|
||||
len = (len-1)*5+3;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD007,2,&buf[5],len);
|
||||
len += 5;
|
||||
key_id = (buf[len-2]>>4)-1;
|
||||
key_state = buf[len-3];
|
||||
}
|
||||
if(key_state&0x80){
|
||||
hyn_3xxdata->rp_buf.report_need |= REPORT_KEY;
|
||||
if((key_id == hyn_3xxdata->rp_buf.key_id || 0 == hyn_3xxdata->rp_buf.key_state)&& key_state == 0x83){
|
||||
hyn_3xxdata->rp_buf.key_id = key_id;
|
||||
hyn_3xxdata->rp_buf.key_state = 1;
|
||||
}
|
||||
else{
|
||||
hyn_3xxdata->rp_buf.key_state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{ //pos
|
||||
u16 index = 0;
|
||||
u8 i = 0;
|
||||
finger_num = len;
|
||||
hyn_3xxdata->rp_buf.report_need |= REPORT_POS;
|
||||
if(finger_num > 1){
|
||||
len = (len-1)*5 + 1;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD007,2,&buf[5],len);
|
||||
}
|
||||
hyn_3xxdata->rp_buf.rep_num = finger_num;
|
||||
for(i = 0; i < finger_num; i++){
|
||||
index = i*5;
|
||||
hyn_3xxdata->rp_buf.pos_info[i].pos_id = (buf[index]>>4)&0x0F;
|
||||
hyn_3xxdata->rp_buf.pos_info[i].event = (buf[index]&0x0F) == 0x06 ? 1 : 0;
|
||||
hyn_3xxdata->rp_buf.pos_info[i].pos_x = ((u16)buf[index + 1]<<4) + ((buf[index + 3] >> 4) & 0x0F);
|
||||
hyn_3xxdata->rp_buf.pos_info[i].pos_y = ((u16)buf[index + 2]<<4) + (buf[index + 3] & 0x0F);
|
||||
hyn_3xxdata->rp_buf.pos_info[i].pres_z = buf[index + 4];
|
||||
// HYN_INFO("report_id = %d, xy = %d,%d",hyn_3xxdata->rp_buf.pos_info[i].pos_id,hyn_3xxdata->rp_buf.pos_info[i].pos_x,hyn_3xxdata->rp_buf.pos_info[i].pos_y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD04C,2,&tmp_dat,1);
|
||||
if((tmp_dat&0x7F) <= 32){
|
||||
tmp_dat = tmp_dat&0x7F;
|
||||
hyn_3xxdata->gesture_id = gest_map_tbl[tmp_dat];
|
||||
hyn_3xxdata->rp_buf.report_need |= REPORT_GES;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(write_tail_end){
|
||||
hyn_wr_reg(hyn_3xxdata,0xD000AB,3,buf,0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_prox_handle(u8 cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
switch(cmd){
|
||||
case 1: //enable
|
||||
hyn_3xxdata->prox_is_enable = 1;
|
||||
hyn_3xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD004B01,3,NULL,0);
|
||||
break;
|
||||
case 0: //disable
|
||||
hyn_3xxdata->prox_is_enable = 0;
|
||||
hyn_3xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD004B00,3,NULL,0);
|
||||
break;
|
||||
case 2: //read
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD004B,2,&hyn_3xxdata->prox_state,1);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cst3xx_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
hyn_3xxdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE)
|
||||
hyn_esdcheck_switch(hyn_3xxdata,DISABLE);
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_irq_set(hyn_3xxdata,ENABLE);
|
||||
hyn_esdcheck_switch(hyn_3xxdata,ENABLE);
|
||||
hyn_wr_reg(hyn_3xxdata,0xD100,2,NULL,0);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
hyn_wr_reg(hyn_3xxdata,0xD04C80,3,NULL,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
hyn_wr_reg(hyn_3xxdata,0xD10D,2,NULL,0);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
hyn_wr_reg(hyn_3xxdata,0xD10A,2,NULL,0);
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
hyn_wr_reg(hyn_3xxdata,0xD119,2,NULL,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_3xxdata,DISABLE);
|
||||
hyn_wr_reg(hyn_3xxdata,0xD105,2,NULL,0);
|
||||
break;
|
||||
default :
|
||||
hyn_esdcheck_switch(hyn_3xxdata,ENABLE);
|
||||
hyn_3xxdata->work_mode = NOMAL_MODE;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int cst3xx_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst3xx_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_resum(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst3xx_rst();
|
||||
msleep(50);
|
||||
cst3xx_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cst3xx_rst(void)
|
||||
{
|
||||
if(hyn_3xxdata->work_mode==ENTER_BOOT_MODE){
|
||||
hyn_set_i2c_addr(hyn_3xxdata,MAIN_I2C_ADDR);
|
||||
}
|
||||
gpio_set_value(hyn_3xxdata->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_3xxdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
static int cst3xx_enter_boot(void)
|
||||
{
|
||||
int retry = 5,ret = 0,cnt_max = 20;
|
||||
u8 buf[4] = {0};
|
||||
hyn_set_i2c_addr(hyn_3xxdata,BOOT_I2C_ADDR);
|
||||
while(++retry < cnt_max){
|
||||
cst3xx_rst();
|
||||
mdelay(retry);
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA001AA,3,buf,0);
|
||||
if(ret != 0){
|
||||
continue;
|
||||
}
|
||||
if(cnt_max == 20){
|
||||
cnt_max = retry+4;
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA002,2,buf,1);
|
||||
if(ret == 0 && buf[0] == 0x55){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int cst3xx_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[28];
|
||||
struct tp_info *ic = &hyn_3xxdata->hw_info;
|
||||
int ret = 0;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD101,2,buf,0);
|
||||
mdelay(1);
|
||||
ret |= hyn_wr_reg(hyn_3xxdata,0xD1F4,2,buf,28);
|
||||
if(ret){
|
||||
HYN_ERROR("cst3xx_updata_tpinfo failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ic->fw_sensor_txnum = buf[0];
|
||||
ic->fw_sensor_rxnum = buf[2];
|
||||
ic->fw_key_num = buf[3];
|
||||
ic->fw_res_y = (buf[7]<<8)|buf[6];
|
||||
ic->fw_res_x = (buf[5]<<8)|buf[4];
|
||||
ic->fw_project_id = (buf[17]<<8)|buf[16];
|
||||
ic->fw_chip_type = (buf[19]<<8)|buf[18];
|
||||
ic->fw_ver = (buf[23]<<24)|(buf[22]<<16)|(buf[21]<<8)|buf[20];
|
||||
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_read_checksum(u32* check_sum)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[4],retry = 5;
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA000,2,buf,1);
|
||||
if(ret){
|
||||
mdelay(2);
|
||||
continue;
|
||||
}
|
||||
if(buf[0]!=0) break;
|
||||
mdelay(2);
|
||||
}
|
||||
mdelay(1);
|
||||
if(buf[0] == 0x01){
|
||||
memset(buf,0,sizeof(buf));
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA008,2,buf,4);
|
||||
if(0 == ret){
|
||||
*check_sum = U8TO32(buf[3],buf[2],buf[1],buf[0]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int cst3xx_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw + len- 16;
|
||||
struct tp_info *ic = &hyn_3xxdata->hw_info;
|
||||
f_fw_project_id = U8TO16(p_data[1],p_data[0]);
|
||||
f_ictype = U8TO16(p_data[3],p_data[2]);
|
||||
f_fw_ver = U8TO16(p_data[7],p_data[6]);
|
||||
f_fw_ver = (f_fw_ver<<16)|U8TO16(p_data[5],p_data[4]);
|
||||
f_checksum = U8TO16(p_data[11],p_data[10]);
|
||||
f_checksum = (f_checksum << 16)|U8TO16(p_data[9],p_data[8]);
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
|
||||
cst3xx_updata_tpinfo();
|
||||
cst3xx_set_workmode(NOMAL_MODE,0);
|
||||
|
||||
if(f_ictype != ic->fw_chip_type || f_fw_project_id != ic->fw_project_id){
|
||||
return 0; //not updata
|
||||
}
|
||||
if( hyn_3xxdata->boot_is_pass ==0 //boot failed
|
||||
||(f_checksum != ic->ic_fw_checksum && f_fw_ver > ic->fw_ver)){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
#define CHECKSUM_OFFECT (24*1024+16)
|
||||
int i,ret, retry = 4;
|
||||
u8 i2c_buf[1024+2];
|
||||
u16 eep_addr = 0, total_kbyte = 24;
|
||||
u32 fw_checksum= 0;
|
||||
HYN_ENTER();
|
||||
if(0 == hyn_3xxdata->fw_file_name[0]){
|
||||
fw_checksum = U8TO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT]);
|
||||
}
|
||||
else{
|
||||
ret = copy_for_updata(hyn_3xxdata,i2c_buf,CHECKSUM_OFFECT,4);
|
||||
if(ret) goto UPDATA_END;
|
||||
fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
hyn_irq_set(hyn_3xxdata,DISABLE);
|
||||
while(--retry){
|
||||
ret = cst3xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_ERROR("cst3xx_enter_boot faill");
|
||||
continue;
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA00200,3,i2c_buf,0);
|
||||
if(ret) continue;
|
||||
mdelay(5);
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA003,2,i2c_buf,1);
|
||||
if(i2c_buf[0] != 0x55)continue;
|
||||
//start trans fw
|
||||
for (i=0; i<total_kbyte; i++) {
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x14;
|
||||
eep_addr = i << 10; //i * 1024
|
||||
i2c_buf[2] = eep_addr;
|
||||
i2c_buf[3] = eep_addr>>8;
|
||||
ret = hyn_write_data(hyn_3xxdata, i2c_buf,RW_REG_LEN, 4);
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
if(0 == hyn_3xxdata->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr + eep_addr, 1024);
|
||||
}
|
||||
else{
|
||||
ret |= copy_for_updata(hyn_3xxdata,i2c_buf + 2,eep_addr,1024);
|
||||
}
|
||||
ret |= hyn_write_data(hyn_3xxdata, i2c_buf,RW_REG_LEN, 1026);
|
||||
|
||||
ret |= hyn_wr_reg(hyn_3xxdata, 0xA004EE, 3,i2c_buf,0);
|
||||
mdelay(60); //wait finsh
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x05;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA005,2,i2c_buf,1);
|
||||
if (ret < 0 || i2c_buf[0] != 0x55){
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(ret) continue;
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xA00300,3,i2c_buf,0);
|
||||
if(ret) continue;
|
||||
cst3xx_read_checksum(&hyn_3xxdata->hw_info.ic_fw_checksum);
|
||||
if(fw_checksum == hyn_3xxdata->hw_info.ic_fw_checksum){
|
||||
break;
|
||||
}
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_set_i2c_addr(hyn_3xxdata,MAIN_I2C_ADDR);
|
||||
cst3xx_rst();
|
||||
if(fw_checksum == hyn_3xxdata->hw_info.ic_fw_checksum){
|
||||
mdelay(50);
|
||||
cst3xx_updata_tpinfo();
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("updata_fw failed fw_checksum:%#x ic_checksum:%#x",fw_checksum,hyn_3xxdata->hw_info.ic_fw_checksum);
|
||||
}
|
||||
hyn_irq_set(hyn_3xxdata,ENABLE);
|
||||
return !retry;
|
||||
}
|
||||
|
||||
static u32 cst3xx_check_esd(void)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[6];
|
||||
ret = hyn_wr_reg(hyn_3xxdata,0xD040,2,buf,6);
|
||||
if(ret ==0){
|
||||
u16 checksum = buf[0]+buf[1]+buf[2]+buf[3]+0xA5;
|
||||
if(checksum != ( (buf[4]<<8)+ buf[5])){
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
return ret ? 0:(buf[3]+(buf[2]<<8)+(buf[1]<<16)+(buf[0]<<24));
|
||||
}
|
||||
|
||||
static int cst3xx_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst3xx_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
const struct hyn_ts_fuc cst3xx_fuc = {
|
||||
.tp_rest = cst3xx_rst,
|
||||
.tp_report = cst3xx_report,
|
||||
.tp_supend = cst3xx_supend,
|
||||
.tp_resum = cst3xx_resum,
|
||||
.tp_chip_init = cst3xx_init,
|
||||
.tp_updata_fw = cst3xx_updata_fw,
|
||||
.tp_set_workmode = cst3xx_set_workmode,
|
||||
.tp_check_esd = cst3xx_check_esd,
|
||||
.tp_prox_handle = cst3xx_prox_handle,
|
||||
.tp_get_dbg_data = cst3xx_get_dbg_data,
|
||||
.tp_get_test_result = cst3xx_get_test_result
|
||||
};
|
||||
|
||||
|
||||
|
||||
728
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst66xx.c
Normal file
728
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst66xx.c
Normal file
@@ -0,0 +1,728 @@
|
||||
#include "../hyn_core.h"
|
||||
|
||||
|
||||
#include "cst66xx_fw1.h"
|
||||
#include "cst66xx_fw2.h"
|
||||
|
||||
#define BOOT_I2C_ADDR (0x5A)
|
||||
#define MAIN_I2C_ADDR (0x58) //use 2 slave addr
|
||||
|
||||
#define PART_NO_EN (0)
|
||||
#define cst66xx_BIN_SIZE (40*1024) //(36*1024)
|
||||
#define MODULE_ID_ADDR (0xA400)
|
||||
#define PARTNUM_ADDR (0xFF10)
|
||||
|
||||
static struct hyn_ts_data *hyn_66xxdata = NULL;
|
||||
static const u8 gest_map_tbl[] = {
|
||||
IDX_POWER, //GESTURE_LABEL_CLICK,
|
||||
IDX_POWER, //GESTURE_LABEL_CLICK2,
|
||||
IDX_UP, //GESTURE_LABEL_TOP,
|
||||
IDX_DOWN, //GESTURE_LABEL_BOTTOM,
|
||||
IDX_LEFT, //GESTURE_LABEL_LEFT,
|
||||
IDX_RIGHT, //GESTURE_LABEL_RIGHT,
|
||||
IDX_C, //GESTURE_LABEL_C,
|
||||
IDX_e, //GESTURE_LABEL_E,
|
||||
IDX_V, //GESTURE_LABEL_v,
|
||||
IDX_NULL, //GESTURE_LABEL_^,
|
||||
IDX_NULL, //GESTURE_LABEL_>,
|
||||
IDX_NULL, //GESTURE_LABEL_<,
|
||||
IDX_M, //GESTURE_LABEL_M,
|
||||
IDX_W, //GESTURE_LABEL_W,
|
||||
IDX_O, //GESTURE_LABEL_O,
|
||||
IDX_S, //GESTURE_LABEL_S,
|
||||
IDX_Z, //GESTURE_LABEL_Z
|
||||
};
|
||||
|
||||
static const struct hyn_chip_series hyn_6xx_fw[] = {
|
||||
{0xCACA220E,0xffffffff,"cst3530",(u8*)fw_module1},//if PART_NO_EN==0 use default chip
|
||||
{0xCACA2202,0xffffffff,"cst3640",(u8*)fw_module1},
|
||||
{0xCACA2201,0xffffffff,"cst6656",(u8*)fw_module1},
|
||||
{0xCACA220C,0xffffffff,"cst3548",(u8*)fw_module1},
|
||||
{0xCACA2209,0xffffffff,"cst3556",(u8*)fw_module1},
|
||||
{0xCACA2203,0xffffffff,"cst6644",(u8*)fw_module1},
|
||||
{0xCACA2204,0xffffffff,"cst6856",(u8*)fw_module1},
|
||||
{0xCACA2204,0x00000002,"cst6856",(u8*)fw_module2},
|
||||
//0xCACA2205 //154
|
||||
//0xCACA2206 //148E
|
||||
{0,0,NULL}
|
||||
};
|
||||
|
||||
static int cst66xx_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst66xx_read_checksum(void);
|
||||
static int cst66xx_enter_boot(void);
|
||||
static u32 cst66xx_fread_word(u32 addr);
|
||||
static void cst66xx_rst(void);
|
||||
|
||||
static int cst66xx_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0,i;
|
||||
u32 read_part_no,module_id;
|
||||
HYN_ENTER();
|
||||
hyn_66xxdata = ts_data;
|
||||
|
||||
ret = cst66xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_ERROR("cst66xx_enter_boot failed");
|
||||
return -1;
|
||||
}
|
||||
hyn_66xxdata->fw_updata_addr = hyn_6xx_fw[0].fw_bin;
|
||||
hyn_66xxdata->fw_updata_len = cst66xx_BIN_SIZE;
|
||||
read_part_no = cst66xx_fread_word(PARTNUM_ADDR);
|
||||
module_id = cst66xx_fread_word(MODULE_ID_ADDR);
|
||||
HYN_INFO("read_part_no:0x%08x module_id:0x%08x",read_part_no,module_id);
|
||||
if(module_id > 10) module_id = 0xffffffff;
|
||||
|
||||
for(i = 0; ;i++){
|
||||
#if PART_NO_EN
|
||||
if(hyn_6xx_fw[i].part_no == read_part_no && hyn_6xx_fw[i].moudle_id == module_id)
|
||||
#else
|
||||
if( hyn_6xx_fw[i].moudle_id == module_id)
|
||||
#endif
|
||||
{ hyn_66xxdata->fw_updata_addr = hyn_6xx_fw[i].fw_bin;
|
||||
HYN_INFO("chip %s match fw success ,partNo check is [%s]",hyn_6xx_fw[i].chip_name,PART_NO_EN ? "enable":"disable");
|
||||
break;
|
||||
}
|
||||
|
||||
if(hyn_6xx_fw[i].part_no == 0 && hyn_6xx_fw[i].moudle_id == 0){
|
||||
HYN_INFO("unknown chip or unknown moudle_id use hyn_6xx_fw[0]");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
hyn_66xxdata->hw_info.ic_fw_checksum = cst66xx_read_checksum();
|
||||
hyn_set_i2c_addr(hyn_66xxdata,MAIN_I2C_ADDR);
|
||||
cst66xx_rst(); //exit boot
|
||||
mdelay(50);
|
||||
|
||||
hyn_66xxdata->need_updata_fw = cst66xx_updata_judge(hyn_66xxdata->fw_updata_addr,cst66xx_BIN_SIZE);
|
||||
if(hyn_66xxdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int cst66xx_report(void)
|
||||
{
|
||||
u8 buf[80],i=0;
|
||||
u8 finger_num = 0,key_num=0,report_typ= 0,key_state=0,key_id = 0,tmp_dat=0;
|
||||
struct hyn_plat_data *dt = &hyn_66xxdata->plat_data;
|
||||
int ret = 0,retry = 2;
|
||||
|
||||
while(retry--){ //read point
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD0070000,0x80|4,buf,9);
|
||||
report_typ = buf[2];//FF:pos F0:ges E0:prox
|
||||
finger_num = buf[3]&0x0f;
|
||||
key_num = (buf[3]&0xf0)>>4;
|
||||
if(finger_num > dt->max_touch_num){
|
||||
HYN_ERROR("fw max finger > dts config");
|
||||
finger_num = dt->max_touch_num;
|
||||
}
|
||||
if(key_num + finger_num > 1){
|
||||
ret |= hyn_read_data(hyn_66xxdata,&buf[9],(key_num + finger_num -1)*5);
|
||||
}
|
||||
if(hyn_sum16(0x55,&buf[4],(key_num + finger_num)*5) != (buf[0] | buf[1]<<8)){
|
||||
ret = -1;
|
||||
}
|
||||
if(ret && retry) continue;
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,buf,0);
|
||||
if(ret == 0){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if((report_typ==0xff)&&((finger_num+key_num)>0)){
|
||||
if(key_num){
|
||||
key_id = buf[8]&0x0f;
|
||||
key_state = buf[8]>>4;
|
||||
if(hyn_66xxdata->rp_buf.report_need == REPORT_NONE){ //Mutually exclusive reporting of coordinates and keys
|
||||
hyn_66xxdata->rp_buf.report_need |= REPORT_KEY;
|
||||
}
|
||||
hyn_66xxdata->rp_buf.key_id = key_id;
|
||||
hyn_66xxdata->rp_buf.key_state = key_state !=0 ? 1:0;
|
||||
}
|
||||
|
||||
if(finger_num){ //pos
|
||||
u16 index = 0;
|
||||
u8 touch_down = 0;
|
||||
if(hyn_66xxdata->rp_buf.report_need == REPORT_NONE){ //Mutually exclusive reporting of coordinates and keys
|
||||
hyn_66xxdata->rp_buf.report_need |= REPORT_POS;
|
||||
}
|
||||
hyn_66xxdata->rp_buf.rep_num = finger_num;
|
||||
for(i = 0; i < finger_num; i++){
|
||||
index = (key_num+i)*5;
|
||||
hyn_66xxdata->rp_buf.pos_info[i].pos_id = buf[index+8]&0x0F;
|
||||
hyn_66xxdata->rp_buf.pos_info[i].event = buf[index+8]>>4;
|
||||
hyn_66xxdata->rp_buf.pos_info[i].pos_x = buf[index+4] + ((u16)(buf[index+7]&0x0F) <<8); //x is rx direction
|
||||
hyn_66xxdata->rp_buf.pos_info[i].pos_y = buf[index+5] + ((u16)(buf[index+7]&0xf0) <<4);
|
||||
hyn_66xxdata->rp_buf.pos_info[i].pres_z = buf[index+6];
|
||||
if(hyn_66xxdata->rp_buf.pos_info[i].event){
|
||||
touch_down++;
|
||||
}
|
||||
}
|
||||
if(0== touch_down){
|
||||
hyn_66xxdata->rp_buf.rep_num = 0;
|
||||
}
|
||||
}
|
||||
}else if(report_typ == 0xF0){
|
||||
tmp_dat = buf[8]&0xff;
|
||||
if((tmp_dat&0x7F) < sizeof(gest_map_tbl) && gest_map_tbl[tmp_dat] != IDX_NULL){
|
||||
hyn_66xxdata->gesture_id = gest_map_tbl[tmp_dat];
|
||||
hyn_66xxdata->rp_buf.report_need |= REPORT_GES;
|
||||
HYN_INFO("gesture_id:%d",tmp_dat);
|
||||
}
|
||||
}else if(report_typ == 0xE0){//proximity
|
||||
if(hyn_66xxdata->prox_is_enable && hyn_66xxdata->prox_state != buf[4]){
|
||||
hyn_66xxdata->prox_state = buf[4];
|
||||
hyn_66xxdata->rp_buf.report_need |= REPORT_PROX;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cst66xx_prox_handle(u8 cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
switch(cmd){
|
||||
case 1: //enable
|
||||
hyn_66xxdata->prox_is_enable = 1;
|
||||
hyn_66xxdata->prox_state = 0;
|
||||
// ret = hyn_wr_reg(hyn_66xxdata,0xD004B01,3,NULL,0);
|
||||
break;
|
||||
case 0: //disable
|
||||
hyn_66xxdata->prox_is_enable = 0;
|
||||
hyn_66xxdata->prox_state = 0;
|
||||
// ret = hyn_wr_reg(hyn_66xxdata,0xD004B00,3,NULL,0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cst66xx_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_INFO("set_workmode:%d",mode);
|
||||
hyn_66xxdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE){
|
||||
hyn_esdcheck_switch(hyn_66xxdata,DISABLE);
|
||||
}
|
||||
if(FAC_TEST_MODE == mode){
|
||||
cst66xx_rst();
|
||||
msleep(50);
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD0000400,4,0,0); //disable lp i2c plu
|
||||
mdelay(1);
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD0000400,4,0,0);
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_irq_set(hyn_66xxdata,ENABLE);
|
||||
hyn_esdcheck_switch(hyn_66xxdata,ENABLE);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0000000,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0000C00,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0000100,4,0,0);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0000C01,4,0,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00004AB,4,0,0);
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
case RAWDATA_MODE:
|
||||
case BASELINE_MODE:
|
||||
case CALIBRATE_MODE:
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00001AB,4,0,0); //enter debug mode
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00000AB,4,0,0); //enter fac test
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_66xxdata,DISABLE);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00022AB,4,0,0);
|
||||
break;
|
||||
case ENTER_BOOT_MODE:
|
||||
ret |= cst66xx_enter_boot();
|
||||
break;
|
||||
default :
|
||||
ret = -2;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int cst66xx_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst66xx_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst66xx_resum(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst66xx_rst();
|
||||
msleep(50);
|
||||
cst66xx_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cst66xx_rst(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
if(hyn_66xxdata->work_mode==ENTER_BOOT_MODE){
|
||||
hyn_set_i2c_addr(hyn_66xxdata,MAIN_I2C_ADDR);
|
||||
}
|
||||
gpio_set_value(hyn_66xxdata->plat_data.reset_gpio,0);
|
||||
msleep(2);
|
||||
gpio_set_value(hyn_66xxdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
static int cst66xx_wait_ready(u16 times,u8 ms,u16 reg,u16 check_vlue)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[4];
|
||||
while(times--){
|
||||
ret = hyn_wr_reg(hyn_66xxdata,reg,2,buf,2);
|
||||
if(0==ret && U8TO16(buf[0],buf[1])==check_vlue){
|
||||
return 0;
|
||||
}
|
||||
mdelay(ms);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int cst66xx_enter_boot(void)
|
||||
{
|
||||
int retry = 0,ret = 0;
|
||||
hyn_set_i2c_addr(hyn_66xxdata,BOOT_I2C_ADDR);
|
||||
while(++retry<20){
|
||||
cst66xx_rst();
|
||||
mdelay(12+retry);
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xA001A8,3,0,0);
|
||||
if(ret < 0){
|
||||
continue;
|
||||
}
|
||||
if(0==cst66xx_wait_ready(10,2,0xA002,0x22DD)){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int cst66xx_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[60];
|
||||
struct tp_info *ic = &hyn_66xxdata->hw_info;
|
||||
int ret = 0;
|
||||
int retry = 5;
|
||||
while(--retry){
|
||||
//get all config info
|
||||
ret |= cst66xx_set_workmode(NOMAL_MODE,ENABLE);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0030000,0x80|4,buf,50);
|
||||
if(ret == 0 && buf[3]==0xCA && buf[2]==0xCA) break;
|
||||
mdelay(1);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0000400,4,buf,0);
|
||||
}
|
||||
|
||||
if(ret || retry==0){
|
||||
HYN_ERROR("cst66xx_updata_tpinfo failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ic->fw_sensor_txnum = buf[48];
|
||||
ic->fw_sensor_rxnum = buf[49];
|
||||
ic->fw_key_num = buf[27];
|
||||
ic->fw_res_y = (buf[31]<<8)|buf[30];
|
||||
ic->fw_res_x = (buf[29]<<8)|buf[28];
|
||||
HYN_INFO("IC_info tx:%d rx:%d key:%d res-x:%d res-y:%d",ic->fw_sensor_txnum,ic->fw_sensor_rxnum,ic->fw_key_num,ic->fw_res_x,ic->fw_res_y);
|
||||
|
||||
ic->fw_project_id = U8TO32(buf[39],buf[38],buf[37],buf[36]);
|
||||
ic->fw_chip_type = U8TO32(buf[3],buf[2],buf[1],buf[0]);
|
||||
ic->fw_ver = U8TO32(buf[35],buf[34],buf[33],buf[32]);
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%04x checksum:%04x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 cst66xx_fread_word(u32 addr)
|
||||
{
|
||||
int ret;
|
||||
u8 rec_buf[4],retry;
|
||||
u32 read_word = 0;
|
||||
|
||||
retry = 3;
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_66xxdata,U8TO32(0xA0,0x06,(addr&0xFF),((addr>>8)&0xFF)),4,NULL,0); //set addr
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA0080400,4,0,0); //set len
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA00A0300,4,0,0); //?
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA004D2,3,NULL,0); //trig read
|
||||
if(ret ==0) break;
|
||||
}
|
||||
if(ret) return 0;
|
||||
|
||||
retry = 20;
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xA020,2,rec_buf,2);
|
||||
if(ret==0 && rec_buf[0]==0xD2 && rec_buf[1]==0x88){
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA040,2,rec_buf,4);
|
||||
if(ret ==0){
|
||||
read_word = U8TO32(rec_buf[3],rec_buf[2],rec_buf[1],rec_buf[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mdelay(1);
|
||||
}
|
||||
return read_word;
|
||||
}
|
||||
|
||||
static int read_checksum(u16 start_val,u16 start_addr,u16 len ,u32 *check_sum)
|
||||
{
|
||||
int ret,retry = 3;
|
||||
u8 buf[8] = {0};
|
||||
while(retry--){
|
||||
ret = hyn_wr_reg(hyn_66xxdata,U8TO32(0xA0,0x06,start_addr&0xFF,start_addr>>8),4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,U8TO32(0xA0,0x08,len&0xFF,len>>8),4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,U8TO32(0xA0,0x0A,start_val&0xFF,start_val>>8),4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA004D6,3,0,0);
|
||||
if(ret) continue;
|
||||
mdelay(len/0xc00 + 1);
|
||||
ret = cst66xx_wait_ready(20,2,0xA020,0xD688);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA040,2,buf,5);
|
||||
if(ret == 0 && buf[0] == 0xCA){
|
||||
*check_sum = U8TO32(buf[4],buf[3],buf[2],buf[1]);
|
||||
break;
|
||||
}
|
||||
else{
|
||||
ret = -1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return ret ? -1:0;
|
||||
}
|
||||
|
||||
static u32 cst66xx_read_checksum(void)
|
||||
{
|
||||
int ret = -1;
|
||||
u32 chipSum1 = 0,chipSum2 = 0,totalSum = 0;
|
||||
hyn_66xxdata->boot_is_pass = 0;
|
||||
if(0==read_checksum(0,0,0x9000,&chipSum1)){
|
||||
ret = read_checksum(1,0xb000,0x0ffc,&chipSum2);
|
||||
}
|
||||
if(ret ==0){
|
||||
totalSum = chipSum1 + chipSum2*2 - 0x55;
|
||||
hyn_66xxdata->boot_is_pass = 1;
|
||||
}
|
||||
HYN_INFO("chipSum1:%04x chipSum2:%04x totalSum:%04x",chipSum1,chipSum2,totalSum);
|
||||
return totalSum;
|
||||
}
|
||||
|
||||
static int cst66xx_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_check_all,f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw + 35*1024; //35k
|
||||
int ret;
|
||||
struct tp_info *ic = &hyn_66xxdata->hw_info;
|
||||
|
||||
f_fw_project_id = U8TO32(p_data[39],p_data[38],p_data[37],p_data[36]);
|
||||
f_ictype = U8TO32(p_data[3],p_data[2],p_data[1],p_data[0]);
|
||||
f_fw_ver = U8TO32(p_data[35],p_data[34],p_data[33],p_data[32]);
|
||||
|
||||
p_data = p_fw + 40*1024;
|
||||
f_checksum = U8TO32(p_data[3],p_data[2],p_data[1],p_data[0]);
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%04x checksum:%04x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
|
||||
ret = cst66xx_updata_tpinfo(); //boot checksum pass, communicate failed not updata
|
||||
if(ret) HYN_ERROR("get tpinfo failed");
|
||||
|
||||
//check h file
|
||||
f_check_all = hyn_sum32(0x55,(u32*)p_fw,len/4);
|
||||
if(f_check_all != f_checksum){
|
||||
HYN_INFO(".h file checksum erro:%04x len:%d",f_check_all,len);
|
||||
return 0; //no need updata
|
||||
}
|
||||
|
||||
if(hyn_66xxdata->boot_is_pass ==0 //boot failed
|
||||
|| ( ret == 0 && f_ictype == ic->fw_chip_type && f_fw_project_id == ic->fw_project_id && f_fw_ver > ic->fw_ver ) // match new ver .h file
|
||||
){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst66xx_erase_flash(u16 start_addr, u16 len, u16 type)
|
||||
{
|
||||
int ret = 0;
|
||||
// HYN_INFO("addr:%04x len:%04x",0xA0060000+U16REV(start_addr),0xA0080000+U16REV(len));
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xA0060000+U16REV(start_addr),4,0,0); //addr
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA0080000+U16REV(len),4,0,0); //len
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA00A0000+U16REV(type),4,0,0); //type
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA018CACA,4,0,0); //key
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA004E0,3,0,0); //trig
|
||||
if(ret) return -1;
|
||||
|
||||
mdelay(20); //wait finsh earse flash
|
||||
ret = cst66xx_wait_ready(100,1,0xA020,0xE088);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cst66xx_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
#define PKG_SIZE (1024)
|
||||
int i,ret = -1, retry_fw= 4,pak_num;
|
||||
u8 i2c_buf[PKG_SIZE+10] , *p_bin_addr;
|
||||
u16 eep_addr = 0, eep_len;
|
||||
u32 fw_checksum = 0;
|
||||
HYN_ENTER();
|
||||
HYN_INFO("len = %d",len);
|
||||
hyn_66xxdata->fw_updata_process = 0;
|
||||
if(len < cst66xx_BIN_SIZE){
|
||||
HYN_ERROR("bin len erro");
|
||||
goto UPDATA_END;
|
||||
}
|
||||
len = cst66xx_BIN_SIZE;
|
||||
if(0 == hyn_66xxdata->fw_file_name[0]){
|
||||
p_bin_addr = bin_addr + len;
|
||||
fw_checksum = U8TO32(p_bin_addr[3],p_bin_addr[2],p_bin_addr[1],p_bin_addr[0]);
|
||||
}
|
||||
else{
|
||||
ret = copy_for_updata(hyn_66xxdata,i2c_buf,cst66xx_BIN_SIZE,4);
|
||||
if(ret) goto UPDATA_END;
|
||||
fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
HYN_INFO("fw_checksum_all:%04x",fw_checksum);
|
||||
hyn_irq_set(hyn_66xxdata,DISABLE);
|
||||
hyn_esdcheck_switch(hyn_66xxdata,DISABLE);
|
||||
pak_num = len/PKG_SIZE;
|
||||
while(--retry_fw){
|
||||
ret = cst66xx_enter_boot();
|
||||
if(ret){
|
||||
HYN_INFO("cst66xx_enter_boot faill");
|
||||
continue;
|
||||
}
|
||||
if(cst66xx_erase_flash(0x0000,0x8000,0x02)) continue; //erase 32k 0x0000~0x8000
|
||||
if(cst66xx_erase_flash(0x8000,0x1000,0x01)) continue; //erase 4k 0x8000~0x9000
|
||||
if(cst66xx_erase_flash(0xB000,0x1000,0x04)) continue; //erase 4k 0xB000~0xC000
|
||||
//start trans fw
|
||||
eep_addr = 0;
|
||||
eep_len = 0;
|
||||
p_bin_addr = bin_addr;
|
||||
for (i=0; i<pak_num; i++){
|
||||
ret = hyn_wr_reg(hyn_66xxdata,U8TO32(0xA0,0x06,eep_addr,eep_addr>>8),4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA0080004,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,i>=36 ? 0xA00A0300:0xA00A0000,4,0,0);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xA018CACA,4,0,0);
|
||||
if(ret) continue;
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x40;
|
||||
if(0 == hyn_66xxdata->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr+eep_len, PKG_SIZE);
|
||||
}else{
|
||||
ret |= copy_for_updata(hyn_66xxdata,i2c_buf + 2,eep_len,PKG_SIZE);
|
||||
}
|
||||
ret |= hyn_write_data(hyn_66xxdata, i2c_buf,2, PKG_SIZE+2);
|
||||
msleep(5);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata, 0xA004E1, 3,0,0);
|
||||
|
||||
eep_len += PKG_SIZE;
|
||||
eep_addr += PKG_SIZE;
|
||||
if(0x9000 == eep_addr){
|
||||
eep_addr = 0xB000;
|
||||
}
|
||||
mdelay(20); //wait finsh
|
||||
cst66xx_wait_ready(100,1,0xA020,0xE188);
|
||||
hyn_66xxdata->fw_updata_process = i*100/pak_num;
|
||||
// HYN_INFO("FB_%d",hyn_66xxdata->fw_updata_process);
|
||||
}
|
||||
if(ret) continue;
|
||||
hyn_66xxdata->hw_info.ic_fw_checksum = cst66xx_read_checksum();
|
||||
if(fw_checksum == hyn_66xxdata->hw_info.ic_fw_checksum && 0 != hyn_66xxdata->boot_is_pass){
|
||||
break;
|
||||
}
|
||||
else{
|
||||
ret = -2;
|
||||
}
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_set_i2c_addr(hyn_66xxdata,MAIN_I2C_ADDR);
|
||||
cst66xx_rst();
|
||||
if(ret == 0){
|
||||
msleep(50);
|
||||
cst66xx_updata_tpinfo();
|
||||
hyn_66xxdata->fw_updata_process = 100;
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
hyn_66xxdata->fw_updata_process |= 0x80;
|
||||
HYN_ERROR("updata_fw failed fw_checksum:%#x ic_checksum:%#x",fw_checksum,hyn_66xxdata->hw_info.ic_fw_checksum);
|
||||
}
|
||||
hyn_irq_set(hyn_66xxdata,ENABLE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 cst66xx_check_esd(void)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[4];
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD0040400,4,buf,4);
|
||||
if(ret){
|
||||
mdelay(1);
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD0040400,4,buf,4);
|
||||
}
|
||||
return ret==0 ? U8TO32(buf[3],buf[2],buf[1],buf[0]):-1;
|
||||
}
|
||||
|
||||
static int red_dbg_data(u8 *buf, u16 len ,u32 *cmd_list,u8 type)
|
||||
{
|
||||
struct tp_info *ic = &hyn_66xxdata->hw_info;
|
||||
int ret = 0;
|
||||
u16 read_len = (ic->fw_sensor_rxnum*ic->fw_sensor_txnum)*type;
|
||||
u16 total_len = (ic->fw_sensor_rxnum*ic->fw_sensor_txnum + ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*type;
|
||||
if(total_len > len || read_len == 0){
|
||||
HYN_ERROR("buf too small or fw_sensor_rxnum fw_sensor_txnum erro");
|
||||
return -1;
|
||||
}
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,*cmd_list++,0x80|4,buf,read_len); //m cap
|
||||
buf += read_len;
|
||||
read_len = ic->fw_sensor_rxnum*type;
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,*cmd_list++,0x80|4,buf,read_len); //s rx cap
|
||||
buf += read_len;
|
||||
read_len = ic->fw_sensor_txnum*type;
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,*cmd_list++,0x80|4,buf,read_len); //s tx cap
|
||||
// ret |= hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,0,0); //end
|
||||
return ret < 0 ? -1:total_len;
|
||||
}
|
||||
|
||||
static int cst66xx_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
int read_len = -1,ret = 0;
|
||||
HYN_ENTER();
|
||||
switch(hyn_66xxdata->work_mode){
|
||||
case DIFF_MODE:
|
||||
read_len = red_dbg_data(buf,len,(u32[]){0xD0120000,0xD01A0000,0xD0160000},2);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
read_len = red_dbg_data(buf,len,(u32[]){0xD0110000,0xD0190000,0xD0150000},2);
|
||||
break;
|
||||
case BASELINE_MODE:
|
||||
read_len = red_dbg_data(buf,len,(u32[]){0xD0130000,0xD01B0000,0xD0170000},2);
|
||||
break;
|
||||
case CALIBRATE_MODE:{
|
||||
u16 tmp_len = len/2;
|
||||
len /= 2;
|
||||
read_len = red_dbg_data(buf+tmp_len,tmp_len,(u32[]){0xD0140000,0xD0180000,0xD01c0000},1);
|
||||
if(read_len > 0){
|
||||
u8 *src_ptr = buf+tmp_len,tmp;
|
||||
s16 *des_ptr = (s16*)buf;
|
||||
tmp_len = read_len;
|
||||
while(tmp_len--){
|
||||
tmp = (*src_ptr++)&0x7F;
|
||||
*des_ptr++ = (tmp & 0x40) ? -(tmp&0x3F):tmp;
|
||||
}
|
||||
read_len *= 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
HYN_ERROR("work_mode:%d",hyn_66xxdata->work_mode);
|
||||
break;
|
||||
}
|
||||
// HYN_INFO("read_len:%d len:%d",(int)(sizeof(struct ts_frame)+read_len),len);
|
||||
if(read_len > 0 && len > (sizeof(struct ts_frame)+read_len)){
|
||||
ret = cst66xx_report();
|
||||
if(ret ==0){
|
||||
memcpy(buf+read_len+4,(void*)&hyn_66xxdata->rp_buf,sizeof(struct ts_frame));
|
||||
read_len += sizeof(struct ts_frame);
|
||||
}
|
||||
}
|
||||
else{
|
||||
ret = hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,0,0); //end
|
||||
}
|
||||
return read_len;
|
||||
}
|
||||
|
||||
static int get_fac_test_data(u32 cmd ,u8 *buf, u16 len ,u8 rev)
|
||||
{
|
||||
int ret = 0;
|
||||
ret = hyn_wr_reg(hyn_66xxdata,cmd,4,0,0);
|
||||
ret |= hyn_wait_irq_timeout(hyn_66xxdata,100);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD0120000,0x80|4,buf+rev,len);
|
||||
ret |= hyn_wr_reg(hyn_66xxdata,0xD00002AB,4,0,0);
|
||||
if(ret==0 && rev){
|
||||
len /= 2;
|
||||
while(len--){
|
||||
*buf = *(buf+2);
|
||||
buf += 2;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define FACTEST_PATH "/sdcard/hyn_fac_test_cfg.ini"
|
||||
#define FACTEST_LOG_PATH "/sdcard/hyn_fac_test.log"
|
||||
#define FACTEST_ITEM (MULTI_OPEN_TEST|MULTI_SHORT_TEST|MULTI_SCAP_TEST)
|
||||
|
||||
static int cst66xx_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
struct tp_info *ic = &hyn_66xxdata->hw_info;
|
||||
u16 mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum*2;
|
||||
u16 st_len = (ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*2;
|
||||
u8 *rbuf = buf;
|
||||
int ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ENTER();
|
||||
if((mt_len*3 + st_len*2 + 4) > len || mt_len==0){
|
||||
HYN_ERROR("%s", mt_len ? "buf too small":" ic->fw_sensor_rxnum*ic->fw_sensor_txnum=0");
|
||||
return FAC_GET_DATA_FAIL;
|
||||
}
|
||||
if(get_fac_test_data(0xD0002000,rbuf,mt_len,0)){ //read open high data
|
||||
HYN_ERROR("read open high failed");
|
||||
goto TEST_ERRO;
|
||||
}
|
||||
rbuf += mt_len;
|
||||
if(get_fac_test_data(0xD0002100,rbuf,mt_len,0)){ //read open low data
|
||||
HYN_ERROR("read open low failed");
|
||||
goto TEST_ERRO;
|
||||
}
|
||||
rbuf += mt_len;
|
||||
if(get_fac_test_data(0xD0002300,rbuf,st_len,1)){ //read short test data
|
||||
HYN_ERROR("read fac short failed");
|
||||
goto TEST_ERRO;
|
||||
}
|
||||
//must rest
|
||||
rbuf += st_len;
|
||||
if(get_fac_test_data(0xD0002500,rbuf,st_len,0)){ ///read scap test data
|
||||
HYN_ERROR("read scap failed");
|
||||
goto TEST_ERRO;
|
||||
}
|
||||
////read data finlish start test
|
||||
ret = factory_multitest(hyn_66xxdata ,FACTEST_PATH, buf,(s16*)(rbuf+st_len),FACTEST_ITEM);
|
||||
|
||||
TEST_ERRO:
|
||||
if(0 == fac_test_log_save(FACTEST_LOG_PATH,hyn_66xxdata,(s16*)buf,ret,FACTEST_ITEM)){
|
||||
HYN_INFO("fac_test log save success");
|
||||
}
|
||||
cst66xx_resum();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
const struct hyn_ts_fuc cst66xx_fuc = {
|
||||
.tp_rest = cst66xx_rst,
|
||||
.tp_report = cst66xx_report,
|
||||
.tp_supend = cst66xx_supend,
|
||||
.tp_resum = cst66xx_resum,
|
||||
.tp_chip_init = cst66xx_init,
|
||||
.tp_updata_fw = cst66xx_updata_fw,
|
||||
.tp_set_workmode = cst66xx_set_workmode,
|
||||
.tp_check_esd = cst66xx_check_esd,
|
||||
.tp_prox_handle = cst66xx_prox_handle,
|
||||
.tp_get_dbg_data = cst66xx_get_dbg_data,
|
||||
.tp_get_test_result = cst66xx_get_test_result
|
||||
};
|
||||
|
||||
|
||||
|
||||
519
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst7xx.c
Normal file
519
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst7xx.c
Normal file
@@ -0,0 +1,519 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst7xx_fw.h"
|
||||
|
||||
#define CUSTOM_SENSOR_NUM (10)
|
||||
|
||||
#define BOOT_I2C_ADDR (0x6A)
|
||||
#define MAIN_I2C_ADDR (0x15)
|
||||
#define RW_REG_LEN (2)
|
||||
#define CST7XX_BIN_SIZE (15*1024)
|
||||
static struct hyn_ts_data *hyn_7xxdata = NULL;
|
||||
|
||||
static int cst7xx_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst7xx_read_checksum(void);
|
||||
static int cst7xx_updata_tpinfo(void);
|
||||
static int cst7xx_enter_boot(void);
|
||||
static int cst7xx_set_workmode(enum work_mode mode,u8 enable);
|
||||
static void cst7xx_rst(void);
|
||||
|
||||
static int cst7xx_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[4];
|
||||
HYN_ENTER();
|
||||
hyn_7xxdata = ts_data;
|
||||
ret = cst7xx_enter_boot();
|
||||
if(ret == FALSE){
|
||||
HYN_ERROR("cst7xx_enter_boot failed");
|
||||
return FALSE;
|
||||
}
|
||||
hyn_7xxdata->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_7xxdata->fw_updata_len = CST7XX_BIN_SIZE;
|
||||
|
||||
hyn_7xxdata->hw_info.ic_fw_checksum = cst7xx_read_checksum();
|
||||
if(hyn_7xxdata->need_updata_fw ==0){
|
||||
hyn_wr_reg(hyn_7xxdata,0xA006EE,3,buf,0); //exit boot
|
||||
cst7xx_rst();
|
||||
mdelay(50);
|
||||
hyn_set_i2c_addr(hyn_7xxdata,MAIN_I2C_ADDR);
|
||||
ret = cst7xx_updata_tpinfo();
|
||||
cst7xx_set_workmode(NOMAL_MODE,0);
|
||||
hyn_7xxdata->need_updata_fw = cst7xx_updata_judge((u8*)fw_bin,CST7XX_BIN_SIZE);
|
||||
}
|
||||
if(hyn_7xxdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int cst7xx_enter_boot(void)
|
||||
{
|
||||
uint8_t t;
|
||||
hyn_set_i2c_addr(hyn_7xxdata,BOOT_I2C_ADDR);
|
||||
for (t = 5;; t += 2)
|
||||
{
|
||||
int ok = FALSE;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
|
||||
if (t >= 15){
|
||||
return FALSE;
|
||||
}
|
||||
cst7xx_rst();
|
||||
mdelay(t);
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA001AA, 3, i2c_buf, 0);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA003, 2, i2c_buf, 1);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
if (i2c_buf[0] != 0x55){
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int write_code(u8 *bin_addr,uint8_t retry)
|
||||
{
|
||||
uint16_t i,t;//,j;
|
||||
int ok = FALSE;
|
||||
u8 i2c_buf[512+2];
|
||||
|
||||
bin_addr+=6;
|
||||
|
||||
for ( i = 0;i < CST7XX_BIN_SIZE; i += 512)
|
||||
{
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x14;
|
||||
|
||||
i2c_buf[2] = i;
|
||||
i2c_buf[3] = i >> 8;
|
||||
ok = hyn_write_data(hyn_7xxdata, i2c_buf,RW_REG_LEN, 4);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
if(0 == hyn_7xxdata->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr + i, 512);
|
||||
}
|
||||
else{
|
||||
ok = copy_for_updata(hyn_7xxdata,i2c_buf + 2,i+6,512);
|
||||
if(ok)break;
|
||||
}
|
||||
ok = hyn_write_data(hyn_7xxdata, i2c_buf,RW_REG_LEN, 514);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA004EE, 3,i2c_buf,0);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
mdelay(100 * retry);
|
||||
|
||||
for (t = 0;; t ++)
|
||||
{
|
||||
if (t >= 50){
|
||||
return FALSE;
|
||||
}
|
||||
mdelay(5);
|
||||
|
||||
ok = hyn_wr_reg(hyn_7xxdata,0xA005,2,i2c_buf,1);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
if (i2c_buf[0] != 0x55){
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
static uint32_t cst7xx_read_checksum(void)
|
||||
{
|
||||
int ok = FALSE,t;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
uint32_t value = 0;
|
||||
int chip_checksum_ok = FALSE;
|
||||
// firmware checksum
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA00300, 3, i2c_buf, 0);
|
||||
if (ok == FALSE){
|
||||
return value;
|
||||
}
|
||||
mdelay(100);
|
||||
for (t = 0;; t += 10)
|
||||
{
|
||||
if (t >= 1000){
|
||||
//return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
mdelay(10);
|
||||
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA000, 2, i2c_buf, 1);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i2c_buf[0] == 1){
|
||||
chip_checksum_ok = TRUE;
|
||||
break;
|
||||
}
|
||||
else if (i2c_buf[0] == 2){
|
||||
chip_checksum_ok = FALSE;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(chip_checksum_ok == FALSE){
|
||||
hyn_7xxdata->need_updata_fw = 1;
|
||||
}
|
||||
else{
|
||||
ok = hyn_wr_reg(hyn_7xxdata, 0xA008, 2, i2c_buf, 2);
|
||||
if (ok == FALSE){
|
||||
//return FALSE;
|
||||
return value;
|
||||
}
|
||||
value = i2c_buf[0];
|
||||
value |= (uint16_t)(i2c_buf[1]) << 8;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
static int cst7xx_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
int retry = 0;
|
||||
int ok_copy = TRUE;
|
||||
int ok = FALSE;
|
||||
u8 i2c_buf[4];
|
||||
u32 fw_checksum = 0;
|
||||
// len = len;
|
||||
HYN_ENTER();
|
||||
if(0 == hyn_7xxdata->fw_file_name[0]){
|
||||
fw_checksum =U8TO16(bin_addr[5],bin_addr[4]);
|
||||
}
|
||||
else{
|
||||
ok = copy_for_updata(hyn_7xxdata,i2c_buf,4,2);
|
||||
if(ok) goto UPDATA_END;
|
||||
fw_checksum = U8TO16(i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
|
||||
hyn_irq_set(hyn_7xxdata,DISABLE);
|
||||
|
||||
for(retry = 1; retry<10; retry++){
|
||||
ok = cst7xx_enter_boot();
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
ok = write_code(bin_addr,retry);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
hyn_7xxdata->hw_info.ic_fw_checksum = cst7xx_read_checksum();
|
||||
if(fw_checksum != hyn_7xxdata->hw_info.ic_fw_checksum){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(retry>=5){
|
||||
ok_copy = FALSE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_wr_reg(hyn_7xxdata,0xA006EE,3,i2c_buf,0); //exit boot
|
||||
mdelay(2);
|
||||
cst7xx_rst();
|
||||
mdelay(50);
|
||||
|
||||
hyn_set_i2c_addr(hyn_7xxdata,MAIN_I2C_ADDR);
|
||||
|
||||
if(ok_copy == TRUE){
|
||||
cst7xx_updata_tpinfo();
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("updata_fw failed");
|
||||
}
|
||||
hyn_irq_set(hyn_7xxdata,ENABLE);
|
||||
|
||||
return ok_copy;
|
||||
}
|
||||
|
||||
|
||||
static int cst7xx_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[8];
|
||||
struct tp_info *ic = &hyn_7xxdata->hw_info;
|
||||
int ret = 0;
|
||||
|
||||
ret = hyn_wr_reg(hyn_7xxdata,0xA7,1,buf,4);
|
||||
if(ret == FALSE){
|
||||
HYN_ERROR("cst7xx_updata_tpinfo failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ic->fw_sensor_txnum = CUSTOM_SENSOR_NUM;
|
||||
ic->fw_sensor_rxnum = 0;
|
||||
ic->fw_key_num = 0;
|
||||
ic->fw_res_y = 0;
|
||||
ic->fw_res_x = 0;
|
||||
ic->fw_project_id = buf[1];
|
||||
ic->fw_chip_type = buf[0];
|
||||
ic->fw_ver = buf[2];
|
||||
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int cst7xx_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw ;
|
||||
struct tp_info *ic = &hyn_7xxdata->hw_info;
|
||||
|
||||
f_fw_project_id = 0;
|
||||
f_ictype = 0;
|
||||
f_fw_ver = 0;
|
||||
|
||||
f_checksum = U8TO16(p_data[5],p_data[4]);
|
||||
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
|
||||
if(f_checksum != ic->ic_fw_checksum ){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------//
|
||||
static int cst7xx_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
hyn_7xxdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE){
|
||||
hyn_esdcheck_switch(hyn_7xxdata,DISABLE);
|
||||
}
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_esdcheck_switch(hyn_7xxdata,ENABLE);
|
||||
hyn_irq_set(hyn_7xxdata,ENABLE);
|
||||
hyn_wr_reg(hyn_7xxdata,0xFE00,2,NULL,0);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
hyn_wr_reg(hyn_7xxdata,0xD001,2,NULL,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
case RAWDATA_MODE:
|
||||
hyn_wr_reg(hyn_7xxdata,0xFEF8,2,NULL,0);
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
//hyn_wr_reg(hyn_7xxdata,0xD119,2,NULL,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_7xxdata,DISABLE);
|
||||
hyn_wr_reg(hyn_7xxdata,0xA503,2,NULL,0);
|
||||
break;
|
||||
default :
|
||||
//hyn_esdcheck_switch(hyn_7xxdata,ENABLE);
|
||||
hyn_7xxdata->work_mode = NOMAL_MODE;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst7xx_prox_handle(u8 cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
switch(cmd){
|
||||
case 1: //enable
|
||||
hyn_7xxdata->prox_is_enable = 1;
|
||||
hyn_7xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_7xxdata,0xB001,2,NULL,0);
|
||||
break;
|
||||
case 0: //disable
|
||||
hyn_7xxdata->prox_is_enable = 0;
|
||||
hyn_7xxdata->prox_state = 0;
|
||||
ret = hyn_wr_reg(hyn_7xxdata,0xB000,2,NULL,0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cst7xx_rst(void)
|
||||
{
|
||||
gpio_set_value(hyn_7xxdata->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_7xxdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int cst7xx_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst7xx_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst7xx_resum(void)
|
||||
{
|
||||
cst7xx_rst();
|
||||
msleep(50);
|
||||
cst7xx_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst7xx_report(void)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
uint8_t i2c_buf[3+6*MAX_POINTS_REPORT] = {0};
|
||||
uint16_t x,y;
|
||||
uint8_t id = 0,index = 0;
|
||||
struct hyn_plat_data *dt = &hyn_7xxdata->plat_data;
|
||||
|
||||
memset(&hyn_7xxdata->rp_buf,0,sizeof(hyn_7xxdata->rp_buf));
|
||||
hyn_7xxdata->rp_buf.report_need = REPORT_NONE;
|
||||
|
||||
|
||||
if(hyn_7xxdata->work_mode == GESTURE_MODE){
|
||||
static const uint8_t ges_map[][2] = {{0x24,IDX_POWER},{0x22,IDX_UP},{0x23,IDX_DOWN},{0x20,IDX_LEFT},{0x21,IDX_RIGHT},
|
||||
{0x34,IDX_C},{0x33,IDX_e},{0x32,IDX_M},{0x30,IDX_O},{0x46,IDX_S},{0x54,IDX_V},{0x31,IDX_W},{0x65,IDX_Z}};
|
||||
if(hyn_wr_reg(hyn_7xxdata,0xD3,1,i2c_buf,1)){
|
||||
goto FAILD_END;
|
||||
}
|
||||
index = sizeof(ges_map)/2;
|
||||
hyn_7xxdata->gesture_id = IDX_NULL;
|
||||
for(i=0; i<index; i++){
|
||||
if(ges_map[i][0] == i2c_buf[0]){
|
||||
hyn_7xxdata->gesture_id = ges_map[i][1];
|
||||
hyn_7xxdata->rp_buf.report_need = REPORT_GES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
else{
|
||||
if(hyn_wr_reg(hyn_7xxdata,0x00,1,i2c_buf,(3+6*2))){
|
||||
goto FAILD_END;
|
||||
}
|
||||
if(hyn_7xxdata->prox_is_enable){
|
||||
u8 state=0;
|
||||
if(i2c_buf[1]==0xE0 || i2c_buf[1]==0){
|
||||
state = PS_FAR_AWAY;
|
||||
}
|
||||
else if(i2c_buf[1]==0xC0){
|
||||
state = PS_NEAR;
|
||||
}
|
||||
if(hyn_7xxdata->prox_state != state){
|
||||
hyn_7xxdata->rp_buf.report_need = REPORT_PROX;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
hyn_7xxdata->rp_buf.rep_num = i2c_buf[2];
|
||||
for(i = 0 ; i < 2 ; i++){
|
||||
id = (i2c_buf[5 + i*6] & 0xf0)>>4;
|
||||
if(id > 1) continue;
|
||||
x = (i2c_buf[3 + i*6] & 0x0f);
|
||||
x = (x<<8) + i2c_buf[4 + i*6];
|
||||
|
||||
y = (i2c_buf[5 + i*6] & 0x0f);
|
||||
y = (y<<8) + i2c_buf[6 + i*6];
|
||||
|
||||
hyn_7xxdata->rp_buf.pos_info[index].pos_id = id;
|
||||
hyn_7xxdata->rp_buf.pos_info[index].event = (i2c_buf[3 + i*6] & 0x40) ? 0:1;
|
||||
hyn_7xxdata->rp_buf.pos_info[index].pos_x = x ;
|
||||
hyn_7xxdata->rp_buf.pos_info[index].pos_y = y ;
|
||||
// hyn_7xxdata->rp_buf.pos_info[index].pres_z = (i2c_buf[7 + i*6] <<8) + i2c_buf[8 + i*6] ;
|
||||
hyn_7xxdata->rp_buf.pos_info[index].pres_z = 3+(x&0x03); //press mast chang
|
||||
index++;
|
||||
hyn_7xxdata->rp_buf.report_need = REPORT_POS;
|
||||
}
|
||||
|
||||
if(dt->key_num){
|
||||
i = dt->key_num;
|
||||
while(i){
|
||||
i--;
|
||||
if(dt->key_y_coords ==hyn_7xxdata->rp_buf.pos_info[0].pos_y && dt->key_x_coords[i] == hyn_7xxdata->rp_buf.pos_info[0].pos_x){
|
||||
hyn_7xxdata->rp_buf.key_id = i;
|
||||
hyn_7xxdata->rp_buf.key_state = hyn_7xxdata->rp_buf.pos_info[0].event;
|
||||
hyn_7xxdata->rp_buf.report_need = REPORT_KEY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
FAILD_END:
|
||||
HYN_ERROR("read report data failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u32 cst7xx_check_esd(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int cst7xx_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = -1,read_len = hyn_7xxdata->hw_info.fw_sensor_txnum*2;
|
||||
if(len < hyn_7xxdata->hw_info.fw_sensor_txnum*2){
|
||||
HYN_ERROR("buf too small");
|
||||
return -1;
|
||||
}
|
||||
switch (hyn_7xxdata->work_mode){
|
||||
case DIFF_MODE:
|
||||
ret = hyn_wr_reg(hyn_7xxdata, 0x41, 1,buf,read_len);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
ret = hyn_wr_reg(hyn_7xxdata, 0x61, 1,buf,read_len);
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("work_mode:%d",hyn_7xxdata->work_mode);
|
||||
break;
|
||||
}
|
||||
return ret==0 ? read_len:-1;
|
||||
}
|
||||
|
||||
|
||||
static int cst7xx_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const struct hyn_ts_fuc cst7xx_fuc = {
|
||||
.tp_rest = cst7xx_rst,
|
||||
.tp_report = cst7xx_report,
|
||||
.tp_supend = cst7xx_supend,
|
||||
.tp_resum = cst7xx_resum,
|
||||
.tp_chip_init = cst7xx_init,
|
||||
.tp_updata_fw = cst7xx_updata_fw,
|
||||
.tp_set_workmode = cst7xx_set_workmode,
|
||||
.tp_check_esd = cst7xx_check_esd,
|
||||
.tp_prox_handle = cst7xx_prox_handle,
|
||||
.tp_get_dbg_data = cst7xx_get_dbg_data,
|
||||
.tp_get_test_result = cst7xx_get_test_result
|
||||
};
|
||||
|
||||
|
||||
485
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst8xxT.c
Normal file
485
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst8xxT.c
Normal file
@@ -0,0 +1,485 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst8xxT_fw.h"
|
||||
|
||||
|
||||
#define CUSTOM_SENSOR_NUM (10)
|
||||
|
||||
#define BOOT_I2C_ADDR (0x6A)
|
||||
#define MAIN_I2C_ADDR (0x15)
|
||||
#define RW_REG_LEN (2)
|
||||
|
||||
#define CST8xxT_BIN_SIZE (15*1024)
|
||||
static struct hyn_ts_data *hyn_8xxTdata = NULL;
|
||||
|
||||
static int cst8xxT_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst8xxT_read_checksum(void);
|
||||
static int cst8xxT_updata_tpinfo(void);
|
||||
static int cst8xxT_enter_boot(void);
|
||||
static int cst8xxT_set_workmode(enum work_mode mode,u8 enable);
|
||||
static void cst8xxT_rst(void);
|
||||
|
||||
static int cst8xxT_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 buf[4];
|
||||
HYN_ENTER();
|
||||
hyn_8xxTdata = ts_data;
|
||||
ret = cst8xxT_enter_boot();
|
||||
if(ret == FALSE){
|
||||
HYN_ERROR("cst8xxT_enter_boot failed");
|
||||
return FALSE;
|
||||
}
|
||||
hyn_8xxTdata->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_8xxTdata->fw_updata_len = CST8xxT_BIN_SIZE;
|
||||
|
||||
hyn_8xxTdata->hw_info.ic_fw_checksum = cst8xxT_read_checksum();
|
||||
if(hyn_8xxTdata->need_updata_fw ==0){
|
||||
hyn_wr_reg(hyn_8xxTdata,0xA006EE,3,buf,0); //exit boot
|
||||
cst8xxT_rst();
|
||||
mdelay(50);
|
||||
hyn_set_i2c_addr(hyn_8xxTdata,MAIN_I2C_ADDR);
|
||||
ret = cst8xxT_updata_tpinfo();
|
||||
cst8xxT_set_workmode(NOMAL_MODE,0);
|
||||
hyn_8xxTdata->need_updata_fw = cst8xxT_updata_judge((u8*)fw_bin,CST8xxT_BIN_SIZE);
|
||||
}
|
||||
if(hyn_8xxTdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int cst8xxT_enter_boot(void)
|
||||
{
|
||||
uint8_t t;
|
||||
hyn_set_i2c_addr(hyn_8xxTdata,BOOT_I2C_ADDR);
|
||||
for (t = 5;; t += 2)
|
||||
{
|
||||
int ok = FALSE;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
|
||||
if (t >= 15){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
cst8xxT_rst();
|
||||
mdelay(t);
|
||||
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA001AB, 3, i2c_buf, 0);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA003, 2, i2c_buf, 1);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i2c_buf[0] != 0xC1){
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int write_code(u8 *bin_addr,uint8_t retry)
|
||||
{
|
||||
uint16_t i,t;//,j;
|
||||
int ok = FALSE;
|
||||
u8 i2c_buf[512+2];
|
||||
|
||||
bin_addr+=6;
|
||||
|
||||
for ( i = 0;i < CST8xxT_BIN_SIZE; i += 512)
|
||||
{
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x14;
|
||||
i2c_buf[2] = i;
|
||||
i2c_buf[3] = i >> 8;
|
||||
ok = hyn_write_data(hyn_8xxTdata, i2c_buf,RW_REG_LEN, 4);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
if(0 == hyn_8xxTdata->fw_file_name[0]){
|
||||
memcpy(i2c_buf + 2, bin_addr + i, 512);
|
||||
}
|
||||
else{
|
||||
ok = copy_for_updata(hyn_8xxTdata,i2c_buf + 2,i+6,512);
|
||||
if(ok)break;
|
||||
}
|
||||
ok = hyn_write_data(hyn_8xxTdata, i2c_buf,RW_REG_LEN, 514);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA004EE, 3,i2c_buf,0);
|
||||
if (ok == FALSE){
|
||||
break;
|
||||
}
|
||||
|
||||
mdelay(100 * retry);
|
||||
|
||||
for (t = 0;; t ++)
|
||||
{
|
||||
if (t >= 50){
|
||||
return FALSE;
|
||||
}
|
||||
mdelay(5);
|
||||
|
||||
ok = hyn_wr_reg(hyn_8xxTdata,0xA005,2,i2c_buf,1);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
if (i2c_buf[0] != 0x55){
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
static uint32_t cst8xxT_read_checksum(void)
|
||||
{
|
||||
int ok = FALSE,t;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
uint32_t value = 0;
|
||||
int chip_checksum_ok = FALSE;
|
||||
// firmware checksum
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA00300, 3, i2c_buf, 0);
|
||||
if (ok == FALSE){
|
||||
return value;
|
||||
}
|
||||
|
||||
mdelay(100);
|
||||
|
||||
for (t = 0;; t += 10)
|
||||
{
|
||||
if (t >= 1000){
|
||||
//return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
mdelay(10);
|
||||
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA000, 2, i2c_buf, 1);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i2c_buf[0] == 1){
|
||||
chip_checksum_ok = TRUE;
|
||||
break;
|
||||
}
|
||||
else if (i2c_buf[0] == 2){
|
||||
chip_checksum_ok = FALSE;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(chip_checksum_ok == FALSE){
|
||||
hyn_8xxTdata->need_updata_fw = 1;
|
||||
}
|
||||
else{
|
||||
ok = hyn_wr_reg(hyn_8xxTdata, 0xA008, 2, i2c_buf, 2);
|
||||
if (ok == FALSE){
|
||||
//return FALSE;
|
||||
return value;
|
||||
}
|
||||
value = i2c_buf[0];
|
||||
value |= (uint16_t)(i2c_buf[1]) << 8;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
static int cst8xxT_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
int retry = 0;
|
||||
int ok_copy = TRUE;
|
||||
int ok = FALSE;
|
||||
u8 i2c_buf[4];
|
||||
u32 fw_checksum = 0;
|
||||
// len = len;
|
||||
HYN_ENTER();
|
||||
if(0 == hyn_8xxTdata->fw_file_name[0]){
|
||||
fw_checksum =U8TO16(bin_addr[5],bin_addr[4]);
|
||||
}
|
||||
else{
|
||||
ok = copy_for_updata(hyn_8xxTdata,i2c_buf,4,2);
|
||||
if(ok) goto UPDATA_END;
|
||||
fw_checksum = U8TO16(i2c_buf[1],i2c_buf[0]);
|
||||
}
|
||||
hyn_irq_set(hyn_8xxTdata,DISABLE);
|
||||
|
||||
for(retry = 1; retry<10; retry++){
|
||||
ok = cst8xxT_enter_boot();
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
ok = write_code(bin_addr,retry);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
hyn_8xxTdata->hw_info.ic_fw_checksum = cst8xxT_read_checksum();
|
||||
if(fw_checksum != hyn_8xxTdata->hw_info.ic_fw_checksum){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(retry>=5){
|
||||
ok_copy = FALSE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
UPDATA_END:
|
||||
hyn_wr_reg(hyn_8xxTdata,0xA006EE,3,i2c_buf,0); //exit boot
|
||||
mdelay(2);
|
||||
cst8xxT_rst();
|
||||
mdelay(50);
|
||||
|
||||
hyn_set_i2c_addr(hyn_8xxTdata,MAIN_I2C_ADDR);
|
||||
if(ok_copy == TRUE){
|
||||
cst8xxT_updata_tpinfo();
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("updata_fw failed");
|
||||
}
|
||||
|
||||
hyn_irq_set(hyn_8xxTdata,ENABLE);
|
||||
|
||||
return ok_copy;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int cst8xxT_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[8];
|
||||
struct tp_info *ic = &hyn_8xxTdata->hw_info;
|
||||
int ret = 0;
|
||||
|
||||
ret = hyn_wr_reg(hyn_8xxTdata,0xA7,1,buf,4);
|
||||
if(ret == FALSE){
|
||||
HYN_ERROR("cst8xxT_updata_tpinfo failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ic->fw_sensor_txnum = CUSTOM_SENSOR_NUM;
|
||||
ic->fw_sensor_rxnum = 0;
|
||||
ic->fw_key_num = 0;
|
||||
ic->fw_res_y = 0;
|
||||
ic->fw_res_x = 0;
|
||||
ic->fw_project_id = buf[1];
|
||||
ic->fw_chip_type = buf[0];
|
||||
ic->fw_ver = buf[2];
|
||||
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int cst8xxT_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw ;
|
||||
struct tp_info *ic = &hyn_8xxTdata->hw_info;
|
||||
|
||||
f_checksum = U8TO16(p_data[5],p_data[4]);
|
||||
|
||||
p_data = p_fw + 6 + CST8xxT_BIN_SIZE - 1 - 15 ;
|
||||
|
||||
f_ictype = p_data[0];
|
||||
f_fw_project_id = (p_data[1]<<24) + (p_data[2]<<16) + (p_data[3]<<8) + (p_data[4]<<0);
|
||||
f_fw_ver = p_data[5];
|
||||
|
||||
HYN_INFO("Bin_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
|
||||
if(f_checksum != ic->ic_fw_checksum && f_fw_ver >= ic->fw_ver){
|
||||
return 1; //need updata
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------//
|
||||
|
||||
static int cst8xxT_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
hyn_8xxTdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE){
|
||||
hyn_esdcheck_switch(hyn_8xxTdata,DISABLE);
|
||||
}
|
||||
if(hyn_wr_reg(hyn_8xxTdata,0x00,1,NULL,0)){ //check_lp mode
|
||||
cst8xxT_rst();
|
||||
mdelay(80);
|
||||
}
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_esdcheck_switch(hyn_8xxTdata,ENABLE);
|
||||
hyn_irq_set(hyn_8xxTdata,ENABLE);
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
hyn_wr_reg(hyn_8xxTdata,0xE501,2,NULL,0);
|
||||
break;
|
||||
case LP_MODE:
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
case RAWDATA_MODE:
|
||||
hyn_wr_reg(hyn_8xxTdata,0xFEF8,2,NULL,0);
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
//hyn_wr_reg(hyn_8xxTdata,0xD119,2,NULL,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_irq_set(hyn_8xxTdata,DISABLE);
|
||||
hyn_wr_reg(hyn_8xxTdata,0xE503,2,NULL,0);
|
||||
break;
|
||||
default :
|
||||
//hyn_esdcheck_switch(hyn_8xxTdata,ENABLE);
|
||||
hyn_8xxTdata->work_mode = NOMAL_MODE;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cst8xxT_rst(void)
|
||||
{
|
||||
gpio_set_value(hyn_8xxTdata->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_8xxTdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
static int cst8xxT_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst8xxT_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst8xxT_resum(void)
|
||||
{
|
||||
cst8xxT_rst();
|
||||
msleep(50);
|
||||
cst8xxT_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int cst8xxT_report(void)
|
||||
{
|
||||
uint8_t i = 0;
|
||||
uint8_t i2c_buf[3+6*MAX_POINTS_REPORT] = {0};
|
||||
uint16_t x,y;
|
||||
uint8_t id = 0,index = 0;
|
||||
struct hyn_plat_data *dt = &hyn_8xxTdata->plat_data;
|
||||
|
||||
memset(&hyn_8xxTdata->rp_buf,0,sizeof(hyn_8xxTdata->rp_buf));
|
||||
hyn_8xxTdata->rp_buf.report_need = REPORT_NONE;
|
||||
|
||||
if(hyn_wr_reg(hyn_8xxTdata,0x00,1,i2c_buf,(3+6*2))){
|
||||
goto FAILD_END;
|
||||
}
|
||||
|
||||
|
||||
hyn_8xxTdata->gesture_id = i2c_buf[1];
|
||||
hyn_8xxTdata->rp_buf.rep_num = i2c_buf[2];
|
||||
// HYN_INFO("rep_num = %d",hyn_8xxTdata->rp_buf.rep_num);
|
||||
for(i = 0 ; i < 2 ; i++)
|
||||
{
|
||||
id = (i2c_buf[5 + i*6] & 0xf0)>>4;
|
||||
if(id > 1) continue;
|
||||
|
||||
x = (i2c_buf[3 + i*6] & 0x0f);
|
||||
x = (x<<8) + i2c_buf[4 + i*6];
|
||||
|
||||
y = (i2c_buf[5 + i*6] & 0x0f);
|
||||
y = (y<<8) + i2c_buf[6 + i*6];
|
||||
|
||||
hyn_8xxTdata->rp_buf.pos_info[index].pos_id = id;
|
||||
hyn_8xxTdata->rp_buf.pos_info[index].event = (i2c_buf[3 + i*6] & 0x40) ? 0:1;
|
||||
hyn_8xxTdata->rp_buf.pos_info[index].pos_x = x ;
|
||||
hyn_8xxTdata->rp_buf.pos_info[index].pos_y = y ;
|
||||
// hyn_8xxTdata->rp_buf.pos_info[index].pres_z = (i2c_buf[7 + i*6] <<8) + i2c_buf[8 + i*6] ;
|
||||
hyn_8xxTdata->rp_buf.pos_info[index].pres_z = 3+(x&0x03); //press mast chang
|
||||
index++;
|
||||
}
|
||||
if(index != 0) hyn_8xxTdata->rp_buf.report_need = REPORT_POS;
|
||||
if(dt->key_num){
|
||||
i = dt->key_num;
|
||||
while(i){
|
||||
i--;
|
||||
if(dt->key_y_coords ==hyn_8xxTdata->rp_buf.pos_info[0].pos_y && dt->key_x_coords[i] == hyn_8xxTdata->rp_buf.pos_info[0].pos_x){
|
||||
hyn_8xxTdata->rp_buf.key_id = i;
|
||||
hyn_8xxTdata->rp_buf.key_state = hyn_8xxTdata->rp_buf.pos_info[0].event;
|
||||
hyn_8xxTdata->rp_buf.report_need = REPORT_KEY;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
FAILD_END:
|
||||
HYN_ERROR("read report data failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u32 cst8xxT_check_esd(void)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int cst8xxT_prox_handle(u8 cmd)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int cst8xxT_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = -1,read_len = hyn_8xxTdata->hw_info.fw_sensor_txnum*2;
|
||||
if(len < hyn_8xxTdata->hw_info.fw_sensor_txnum*2){
|
||||
HYN_ERROR("buf too small");
|
||||
return -1;
|
||||
}
|
||||
switch (hyn_8xxTdata->work_mode){
|
||||
case DIFF_MODE:
|
||||
ret = hyn_wr_reg(hyn_8xxTdata, 0x41, 1,buf,read_len);
|
||||
break;
|
||||
case RAWDATA_MODE:
|
||||
ret = hyn_wr_reg(hyn_8xxTdata, 0x61, 1,buf,read_len);
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("work_mode:%d",hyn_8xxTdata->work_mode);
|
||||
break;
|
||||
}
|
||||
return ret==0 ? read_len:-1;
|
||||
}
|
||||
|
||||
static int cst8xxT_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct hyn_ts_fuc cst8xxT_fuc = {
|
||||
.tp_rest = cst8xxT_rst,
|
||||
.tp_report = cst8xxT_report,
|
||||
.tp_supend = cst8xxT_supend,
|
||||
.tp_resum = cst8xxT_resum,
|
||||
.tp_chip_init = cst8xxT_init,
|
||||
.tp_updata_fw = cst8xxT_updata_fw,
|
||||
.tp_set_workmode = cst8xxT_set_workmode,
|
||||
.tp_check_esd = cst8xxT_check_esd,
|
||||
.tp_prox_handle = cst8xxT_prox_handle,
|
||||
.tp_get_dbg_data = cst8xxT_get_dbg_data,
|
||||
.tp_get_test_result = cst8xxT_get_test_result
|
||||
};
|
||||
|
||||
|
||||
985
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst92xx.c
Normal file
985
linux_5.10/drivers/input/touchscreen/hyn/hyn_chips/hyn_cst92xx.c
Normal file
@@ -0,0 +1,985 @@
|
||||
#include "../hyn_core.h"
|
||||
#include "cst92xx_fw.h"
|
||||
|
||||
#define BOOT_I2C_ADDR (0x5A)
|
||||
#define MAIN_I2C_ADDR (0x5A)
|
||||
#define RW_REG_LEN (2)
|
||||
|
||||
#define CST92XX_BIN_SIZE (0x7F80)
|
||||
|
||||
#define HYNITRON_PROGRAM_PAGE_SIZE (128)
|
||||
|
||||
static struct hyn_ts_data *hyn_92xxdata = NULL;
|
||||
|
||||
|
||||
static const struct hyn_chip_series hyn_6xx_fw[] = {
|
||||
{0xCACA9217,0xffffffff,"cst9217",(u8*)fw_bin},//if PART_NO_EN==0 use default chip
|
||||
{0xCACA9220,0xffffffff,"cst9220",(u8*)fw_bin},
|
||||
{0,0,NULL}
|
||||
};
|
||||
|
||||
static int cst92xx_updata_judge(u8 *p_fw, u16 len);
|
||||
static u32 cst92xx_read_checksum(void);
|
||||
static int cst92xx_updata_tpinfo(void);
|
||||
static int cst92xx_enter_boot(void);
|
||||
static void cst92xx_rst(void);
|
||||
static int cst92xx_set_workmode(enum work_mode mode,u8 enable);
|
||||
static int cst92xx_read_chip_id(void);
|
||||
|
||||
static int cst92xx_init(struct hyn_ts_data* ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
hyn_92xxdata = ts_data;
|
||||
hyn_set_i2c_addr(hyn_92xxdata,BOOT_I2C_ADDR);
|
||||
ret = cst92xx_read_chip_id();
|
||||
if(ret == FALSE){
|
||||
HYN_INFO("cst92xx_read_chip_id failed");
|
||||
return FALSE;
|
||||
}
|
||||
hyn_92xxdata->fw_updata_addr = (u8*)fw_bin;
|
||||
hyn_92xxdata->fw_updata_len = CST92XX_BIN_SIZE;
|
||||
hyn_92xxdata->need_updata_fw = cst92xx_updata_judge((u8*)fw_bin,CST92XX_BIN_SIZE);
|
||||
if(hyn_92xxdata->need_updata_fw){
|
||||
HYN_INFO("need updata FW !!!");
|
||||
}
|
||||
cst92xx_rst();
|
||||
msleep(40);
|
||||
ret = cst92xx_updata_tpinfo();
|
||||
if(ret == FALSE){
|
||||
HYN_INFO("cst92xx_updata_tpinfo failed");
|
||||
}
|
||||
HYN_INFO("cst92xx_init done !!!");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int cst92xx_enter_boot(void)
|
||||
{
|
||||
int ok = FALSE,t;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
|
||||
for (t = 10;; t += 2)
|
||||
{
|
||||
if (t >= 30){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
cst92xx_rst();
|
||||
mdelay(t);
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA001AA, 3, i2c_buf, 0);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
mdelay(1);
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA002, 2, i2c_buf, 2);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((i2c_buf[0] == 0x55) && (i2c_buf[1] == 0xB0)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA00100, 3, i2c_buf, 0);
|
||||
if(ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int erase_all_mem(void)
|
||||
{
|
||||
int ok = FALSE,t;
|
||||
u8 i2c_buf[8];
|
||||
|
||||
//erase_all_mem
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA0140000, 4, i2c_buf, 0);
|
||||
if (ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA00C807F, 4, i2c_buf, 0);
|
||||
if (ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA004EC, 3, i2c_buf, 0);
|
||||
if (ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mdelay(300);
|
||||
for (t = 0;; t += 10) {
|
||||
if (t >= 1000) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mdelay(10);
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata, 0xA005, 2, i2c_buf, 1);
|
||||
if (ok == FALSE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i2c_buf[0] == 0x88) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int write_mem_page(uint16_t addr, uint8_t *buf, uint16_t len)
|
||||
{
|
||||
int ok = FALSE,t;
|
||||
uint8_t i2c_buf[1024+2] = {0};
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x0C;
|
||||
i2c_buf[2] = len;
|
||||
i2c_buf[3] = len >> 8;
|
||||
//ok = hyn_i2c_write_r16(HYN_BOOT_I2C_ADDR, 0xA00C, i2c_buf, 2);
|
||||
ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, 4);
|
||||
if(ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x14;
|
||||
i2c_buf[2] = addr;
|
||||
i2c_buf[3] = addr >> 8;
|
||||
ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, 4);
|
||||
if(ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x18;
|
||||
memcpy(i2c_buf + 2, buf, len);
|
||||
ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, len+2);
|
||||
if(ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xA004EE,3,i2c_buf,0);
|
||||
if(ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (t = 0;; t += 10) {
|
||||
if (t >= 1000) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mdelay(5);
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xA005,2,i2c_buf,1);
|
||||
if(ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i2c_buf[0] == 0x55) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int write_code(u8 *bin_addr,uint8_t retry)
|
||||
{
|
||||
uint8_t data[HYNITRON_PROGRAM_PAGE_SIZE+4];//= (uint8_t *)bin_addr;
|
||||
uint16_t addr = 0;
|
||||
uint16_t remain_len = CST92XX_BIN_SIZE;
|
||||
int ret;
|
||||
|
||||
while (remain_len > 0) {
|
||||
uint16_t cur_len = remain_len;
|
||||
if (cur_len > HYNITRON_PROGRAM_PAGE_SIZE) {
|
||||
cur_len = HYNITRON_PROGRAM_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if(0 == hyn_92xxdata->fw_file_name[0]){
|
||||
memcpy(data, bin_addr + addr, HYNITRON_PROGRAM_PAGE_SIZE);
|
||||
}else{
|
||||
ret = copy_for_updata(hyn_92xxdata,data,addr,HYNITRON_PROGRAM_PAGE_SIZE);
|
||||
if(ret == FALSE){
|
||||
HYN_ERROR("copy_for_updata error");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
//HYN_INFO("write_code addr 0x%x 0x%x",addr,*data);
|
||||
if (write_mem_page(addr, data, cur_len) == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
//data += cur_len;
|
||||
addr += cur_len;
|
||||
remain_len -= cur_len;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static uint32_t cst92xx_read_checksum(void)
|
||||
{
|
||||
int ok = FALSE;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
uint32_t chip_checksum = 0;
|
||||
uint8_t retry = 5;
|
||||
|
||||
hyn_92xxdata->boot_is_pass = 0;
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xA00300,3,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
mdelay(2);
|
||||
while(retry--){
|
||||
mdelay(5);
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xA000,2,i2c_buf,1);
|
||||
if (ok == FALSE) {
|
||||
continue;
|
||||
}
|
||||
if(i2c_buf[0]!=0) break;
|
||||
}
|
||||
|
||||
mdelay(1);
|
||||
if(i2c_buf[0] == 0x01){
|
||||
hyn_92xxdata->boot_is_pass = 1;
|
||||
memset(i2c_buf,0,sizeof(i2c_buf));
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xA008,2,i2c_buf,4);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
chip_checksum = ((uint32_t)(i2c_buf[0])) |
|
||||
(((uint32_t)(i2c_buf[1])) << 8) |
|
||||
(((uint32_t)(i2c_buf[2])) << 16) |
|
||||
(((uint32_t)(i2c_buf[3])) << 24);
|
||||
}
|
||||
else{
|
||||
hyn_92xxdata->need_updata_fw = 1;
|
||||
}
|
||||
|
||||
return chip_checksum;
|
||||
}
|
||||
|
||||
|
||||
static int cst92xx_updata_fw(u8 *bin_addr, u16 len)
|
||||
{
|
||||
#define CHECKSUM_OFFECT (0x7F6C)
|
||||
int retry = 0;
|
||||
int ok_copy = TRUE;
|
||||
int ok = FALSE;
|
||||
u8 i2c_buf[4];
|
||||
|
||||
u32 fw_checksum=0;
|
||||
HYN_ENTER();
|
||||
|
||||
if(len < CST92XX_BIN_SIZE){
|
||||
HYN_ERROR("len = %d",len);
|
||||
goto UPDATA_END;
|
||||
}
|
||||
if(len > CST92XX_BIN_SIZE) len = CST92XX_BIN_SIZE;
|
||||
|
||||
if(0 != hyn_92xxdata->fw_file_name[0]){
|
||||
//node to update
|
||||
ok = copy_for_updata(hyn_92xxdata,i2c_buf,CST92XX_BIN_SIZE-20,4);
|
||||
fw_checksum = U8TO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);
|
||||
if(hyn_92xxdata->hw_info.ic_fw_checksum == fw_checksum || ok != 0){
|
||||
HYN_INFO("no update,fw_checksum is same:0x%04x",fw_checksum);
|
||||
goto UPDATA_END;
|
||||
}
|
||||
}else{
|
||||
fw_checksum = U8TO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT+0]);
|
||||
}
|
||||
HYN_INFO("updating fw checksum:0x%04x",fw_checksum);
|
||||
|
||||
hyn_irq_set(hyn_92xxdata,DISABLE);
|
||||
hyn_esdcheck_switch(hyn_92xxdata,DISABLE);
|
||||
hyn_set_i2c_addr(hyn_92xxdata,BOOT_I2C_ADDR);
|
||||
|
||||
HYN_INFO("updata_fw start");
|
||||
for(retry = 1; retry<5; retry++){
|
||||
hyn_92xxdata->fw_updata_process = 0;
|
||||
ok = cst92xx_enter_boot();
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
hyn_92xxdata->fw_updata_process = 10;
|
||||
ok = erase_all_mem();
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
hyn_92xxdata->fw_updata_process = 20;
|
||||
ok = write_code(bin_addr,retry);
|
||||
if (ok == FALSE){
|
||||
continue;
|
||||
}
|
||||
hyn_92xxdata->fw_updata_process = 30;
|
||||
hyn_92xxdata->hw_info.ic_fw_checksum = cst92xx_read_checksum();
|
||||
if(fw_checksum != hyn_92xxdata->hw_info.ic_fw_checksum){
|
||||
HYN_INFO("out data fw checksum err:0x%04x",hyn_92xxdata->hw_info.ic_fw_checksum);
|
||||
continue;
|
||||
}
|
||||
hyn_92xxdata->fw_updata_process = 40;
|
||||
if(retry>=5){
|
||||
ok_copy = FALSE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
hyn_wr_reg(hyn_92xxdata,0xA006EE,3,i2c_buf,0); //exit boot
|
||||
mdelay(2);
|
||||
|
||||
UPDATA_END:
|
||||
cst92xx_rst();
|
||||
mdelay(50);
|
||||
|
||||
hyn_set_i2c_addr(hyn_92xxdata,MAIN_I2C_ADDR);
|
||||
|
||||
if(ok_copy == TRUE){
|
||||
cst92xx_updata_tpinfo();
|
||||
HYN_INFO("updata_fw success");
|
||||
}
|
||||
else{
|
||||
HYN_INFO("updata_fw failed");
|
||||
}
|
||||
|
||||
hyn_irq_set(hyn_92xxdata,ENABLE);
|
||||
|
||||
return ok_copy;
|
||||
}
|
||||
static int16_t read_word_from_mem(uint8_t type, uint16_t addr, uint32_t *value)
|
||||
{
|
||||
int16_t ret = 0;
|
||||
uint8_t i2c_buf[4] = {0},t;
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x10;
|
||||
i2c_buf[2] = type;
|
||||
ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,3);
|
||||
if (ret)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x0C;
|
||||
i2c_buf[2] = addr;
|
||||
i2c_buf[3] = addr >> 8;
|
||||
ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,4);
|
||||
if (ret)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
i2c_buf[0] = 0xA0;
|
||||
i2c_buf[1] = 0x04;
|
||||
i2c_buf[2] = 0xE4;
|
||||
ret = hyn_write_data(hyn_92xxdata,i2c_buf,2,3);
|
||||
if (ret)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (t = 0;; t++)
|
||||
{
|
||||
if (t >= 100)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
ret =hyn_wr_reg(hyn_92xxdata,0xA004,2,i2c_buf,1);
|
||||
if (ret)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (i2c_buf[0] == 0x00)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret =hyn_wr_reg(hyn_92xxdata,0xA018,2,i2c_buf,4);
|
||||
if (ret)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
*value = ((uint32_t)(i2c_buf[0])) |
|
||||
(((uint32_t)(i2c_buf[1])) << 8) |
|
||||
(((uint32_t)(i2c_buf[2])) << 16) |
|
||||
(((uint32_t)(i2c_buf[3])) << 24);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static int cst92xx_read_chip_id(void)
|
||||
{
|
||||
int16_t ret = 0;
|
||||
uint8_t retry = 3;
|
||||
uint32_t partno_chip_type,module_id;
|
||||
|
||||
ret = cst92xx_enter_boot();
|
||||
if (ret == FALSE)
|
||||
{
|
||||
HYN_ERROR("enter_bootloader error");
|
||||
return -1;
|
||||
}
|
||||
for (; retry > 0; retry--)
|
||||
{
|
||||
// partno
|
||||
ret = read_word_from_mem(1, 0x077C, &partno_chip_type);
|
||||
if (ret)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// module id
|
||||
ret = read_word_from_mem(0, 0x7FC0, &module_id);
|
||||
if (ret)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((partno_chip_type >> 16) == 0xCACA)
|
||||
{
|
||||
partno_chip_type &= 0xffff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cst92xx_rst();
|
||||
msleep(30);
|
||||
HYN_INFO("partno_chip_type: 0x%04x", partno_chip_type);
|
||||
HYN_INFO("module_id: 0x%04x", module_id);
|
||||
if ((partno_chip_type != 0x9217) && (partno_chip_type != 0x9220))
|
||||
{
|
||||
HYN_ERROR("partno_chip_type error 0x%04x", partno_chip_type);
|
||||
//return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst92xx_updata_tpinfo(void)
|
||||
{
|
||||
u8 buf[30];
|
||||
struct tp_info *ic = &hyn_92xxdata->hw_info;
|
||||
int ret = 0;
|
||||
|
||||
cst92xx_set_workmode(0xff,DISABLE);
|
||||
ret = hyn_wr_reg(hyn_92xxdata,0xD101,2,buf,0);
|
||||
if(ret == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
mdelay(5);
|
||||
|
||||
//firmware_project_id firmware_ic_type
|
||||
ret = hyn_wr_reg(hyn_92xxdata,0xD1F4,2,buf,28);
|
||||
if(ret == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
ic->fw_project_id = ((uint16_t)buf[17] <<8) + buf[16];
|
||||
ic->fw_chip_type = ((uint16_t)buf[19] <<8) + buf[18];
|
||||
|
||||
//firmware_version
|
||||
ic->fw_ver = (buf[23]<<24)|(buf[22]<<16)|(buf[21]<<8)|buf[20];
|
||||
|
||||
//tx_num rx_num key_num
|
||||
ic->fw_sensor_txnum = ((uint16_t)buf[1]<<8) + buf[0];
|
||||
ic->fw_sensor_rxnum = buf[2];
|
||||
ic->fw_key_num = buf[3];
|
||||
|
||||
ic->fw_res_y = (buf[7]<<8)|buf[6];
|
||||
ic->fw_res_x = (buf[5]<<8)|buf[4];
|
||||
|
||||
HYN_INFO("IC_info fw_project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);
|
||||
|
||||
cst92xx_set_workmode(NOMAL_MODE,ENABLE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int cst92xx_updata_judge(u8 *p_fw, u16 len)
|
||||
{
|
||||
u32 f_checksum,f_fw_ver,f_ictype,f_fw_project_id;
|
||||
u8 *p_data = p_fw + len - 28; //7F64
|
||||
struct tp_info *ic = &hyn_92xxdata->hw_info;
|
||||
int ret;
|
||||
|
||||
ret = cst92xx_enter_boot();
|
||||
if (ret == FALSE){
|
||||
HYN_INFO("cst92xx_enter_boot fail,need update");
|
||||
return 1;
|
||||
}
|
||||
hyn_92xxdata->hw_info.ic_fw_checksum = cst92xx_read_checksum();
|
||||
if(hyn_92xxdata->boot_is_pass == 0){
|
||||
HYN_INFO("boot_is_pass %d,need force update",hyn_92xxdata->boot_is_pass);
|
||||
return 1; //need updata
|
||||
}
|
||||
|
||||
f_fw_project_id = U8TO16(p_data[1],p_data[0]);
|
||||
f_ictype = U8TO16(p_data[3],p_data[2]);
|
||||
|
||||
f_fw_ver = U8TO16(p_data[7],p_data[6]);
|
||||
f_fw_ver = (f_fw_ver<<16)|U8TO16(p_data[5],p_data[4]);
|
||||
|
||||
f_checksum = U8TO16(p_data[11],p_data[10]);
|
||||
f_checksum = (f_checksum << 16)|U8TO16(p_data[9],p_data[8]);
|
||||
|
||||
|
||||
HYN_INFO("Bin_info fw_project_id:0x%04x ictype:0x%04x fw_ver:0x%x checksum:0x%x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);
|
||||
if(f_ictype != ic->fw_chip_type || f_fw_project_id != ic->fw_project_id){
|
||||
HYN_ERROR("not update,please confirm:f_ictype 0x%04x,f_fw_project_id 0x%04x",f_ictype,f_fw_project_id);
|
||||
return 0; //not updata
|
||||
}
|
||||
if(f_checksum != ic->ic_fw_checksum && f_fw_ver > ic->fw_ver){
|
||||
HYN_ERROR("need update,please confirm:f_checksum 0x%04x,f_fw_ver 0x%04x",f_checksum,f_fw_ver);
|
||||
return 1; //need updata
|
||||
}
|
||||
HYN_INFO("cst92xx_updata_judge done, no need update");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------//
|
||||
|
||||
static int cst92xx_set_workmode(enum work_mode mode,u8 enable)
|
||||
{
|
||||
int ok = FALSE;
|
||||
uint8_t i2c_buf[4] = {0};
|
||||
uint8_t i = 0;
|
||||
hyn_92xxdata->work_mode = mode;
|
||||
if(mode != NOMAL_MODE){
|
||||
hyn_esdcheck_switch(hyn_92xxdata,DISABLE);
|
||||
}
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD11E,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
msleep(1);
|
||||
continue;
|
||||
}
|
||||
msleep(1);
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0x0002,2,i2c_buf,2);
|
||||
if (ok == FALSE) {
|
||||
msleep(1);
|
||||
continue;
|
||||
}
|
||||
if(i2c_buf[1] == 0x1E){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch(mode){
|
||||
case NOMAL_MODE:
|
||||
hyn_irq_set(hyn_92xxdata,ENABLE);
|
||||
hyn_esdcheck_switch(hyn_92xxdata,ENABLE);
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD109,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case GESTURE_MODE:
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case LP_MODE:
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD107,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case DIFF_MODE:
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD10D,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case RAWDATA_MODE:
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD10A,2,i2c_buf,0);
|
||||
if (ok == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case FAC_TEST_MODE:
|
||||
hyn_wr_reg(hyn_92xxdata,0xD114,2,i2c_buf,0);
|
||||
break;
|
||||
case DEEPSLEEP:
|
||||
hyn_wr_reg(hyn_92xxdata,0xD105,2,i2c_buf,0);
|
||||
break;
|
||||
default :
|
||||
hyn_92xxdata->work_mode = NOMAL_MODE;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void cst92xx_rst(void)
|
||||
{
|
||||
gpio_set_value(hyn_92xxdata->plat_data.reset_gpio,0);
|
||||
msleep(5);
|
||||
gpio_set_value(hyn_92xxdata->plat_data.reset_gpio,1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int cst92xx_supend(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
cst92xx_set_workmode(DEEPSLEEP,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cst92xx_resum(void)
|
||||
{
|
||||
cst92xx_rst();
|
||||
msleep(50);
|
||||
cst92xx_set_workmode(NOMAL_MODE,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int cst92xx_report(void)
|
||||
{
|
||||
int ok = FALSE;
|
||||
uint8_t i2c_buf[MAX_POINTS_REPORT*5+5] = {0};
|
||||
uint8_t finger_num = 0;
|
||||
uint8_t key_state=0,key_id = 0;
|
||||
|
||||
hyn_92xxdata->rp_buf.report_need = REPORT_NONE;
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,sizeof(i2c_buf));
|
||||
if (ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD024AB,3,i2c_buf,0);
|
||||
if (ok == FALSE){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (i2c_buf[6] != 0xAB) {
|
||||
HYN_INFO("fail buf[6]=0x%02x",i2c_buf[6]);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
finger_num = i2c_buf[5] & 0x7F;
|
||||
|
||||
if (finger_num > MAX_POINTS_REPORT) {
|
||||
HYN_INFO("fail finger_num=%d",finger_num);
|
||||
return TRUE;
|
||||
}
|
||||
hyn_92xxdata->rp_buf.rep_num = finger_num;
|
||||
|
||||
|
||||
if ((i2c_buf[5] & 0x80) == 0x80) { // button
|
||||
uint8_t *data = i2c_buf + finger_num * 5;
|
||||
if (finger_num > 0) {
|
||||
data += 2;
|
||||
}
|
||||
key_state = data[0];//0x83:<3A><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD> 0x80:<3A><><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>
|
||||
key_id = data[1]; // data[1]; :0x17 0x27 0x37
|
||||
|
||||
if(key_state&0x80){
|
||||
hyn_92xxdata->rp_buf.report_need |= REPORT_KEY;
|
||||
if((key_id == hyn_92xxdata->rp_buf.key_id || 0 == hyn_92xxdata->rp_buf.key_state)&& key_state == 0x83){
|
||||
hyn_92xxdata->rp_buf.key_id = key_id;
|
||||
hyn_92xxdata->rp_buf.key_state = 1;
|
||||
}
|
||||
else{
|
||||
hyn_92xxdata->rp_buf.key_state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else//pos
|
||||
{
|
||||
uint8_t index = 0,i;
|
||||
if((i2c_buf[4]&0xF0) > 0){
|
||||
if((i2c_buf[4]&0x80) == 0x80)
|
||||
hyn_92xxdata->gesture_id = 14;//KEY_POWER;// palm
|
||||
else if(i2c_buf[4]&0x70)
|
||||
hyn_92xxdata->gesture_id = 14;//GESTURE wakeup
|
||||
HYN_INFO("i2c_buf[4]=0x%x,gesture_id=0x%x",i2c_buf[4],hyn_92xxdata->gesture_id);
|
||||
hyn_92xxdata->rp_buf.report_need |= REPORT_GES;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
hyn_92xxdata->rp_buf.report_need |= REPORT_POS;
|
||||
if (finger_num > 0) {
|
||||
uint8_t *data = i2c_buf;
|
||||
//uint8_t *data_ges = i2c_buf + finger_num * 5 + 2;
|
||||
uint8_t id = data[0] >> 4;
|
||||
uint8_t switch_ = data[0] & 0x0F;
|
||||
uint16_t x = ((uint16_t)(data[1]) << 4) | (data[3] >> 4);
|
||||
uint16_t y = ((uint16_t)(data[2]) << 4) | (data[3] & 0x0F);
|
||||
uint16_t z = (data[3] & 0x1F) + 0x03;
|
||||
|
||||
HYN_INFO("finger=%d id=%d x=%d y=%d z=%d",finger_num,id,x,y,z);
|
||||
|
||||
if (id < MAX_POINTS_REPORT) {
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].event = (switch_ == 0x06) ? 1 : 0;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_x = x;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_y = y;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pres_z = z;
|
||||
index++;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
for (i = 1; i < finger_num; i++) {
|
||||
uint8_t *data = i2c_buf+5*i+2;
|
||||
uint8_t id = data[0] >> 4;
|
||||
uint8_t switch_ = data[0] & 0x0F;
|
||||
uint16_t x = ((uint16_t)(data[1]) << 4) | (data[3] >> 4);
|
||||
uint16_t y = ((uint16_t)(data[2]) << 4) | (data[3] & 0x0F);
|
||||
uint16_t z = (data[4] & 0x7F);
|
||||
|
||||
if (id < MAX_POINTS_REPORT) {
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].event = (switch_ == 0x06) ? 1 : 0;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_x = x;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pos_y = y;
|
||||
hyn_92xxdata->rp_buf.pos_info[index].pres_z = z;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
static u32 cst92xx_check_esd(void)
|
||||
{
|
||||
int ret = 0;
|
||||
uint8_t retry=3;
|
||||
u8 buf[6];
|
||||
HYN_ENTER();
|
||||
while (retry--)
|
||||
{
|
||||
ret = hyn_wr_reg(hyn_92xxdata,0xD040,2,buf,0);
|
||||
ret = hyn_wr_reg(hyn_92xxdata,0xD040,2,buf,6);
|
||||
if(ret ==0 && hyn_sum16(0xA5,buf,4)==U8TO16(buf[4],buf[5])){
|
||||
ret = U8TO32(buf[0],buf[1],buf[2],buf[3]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
#if 0
|
||||
static u32 cst92xx_check_esd(void)
|
||||
{
|
||||
|
||||
int16_t ok = FALSE;
|
||||
uint8_t i2c_buf[6], retry;
|
||||
uint8_t flag = 0;
|
||||
uint16_t checksum = 0;
|
||||
uint32_t esd_value = 0;
|
||||
|
||||
if ((hyn_92xxdata->work_mode != NOMAL_MODE)&&(hyn_92xxdata->work_mode != GESTURE_MODE))
|
||||
{
|
||||
HYN_ERROR("esd_check work_mode error return");
|
||||
return 0;
|
||||
}
|
||||
retry = 4;
|
||||
flag = 0;
|
||||
while (retry--)
|
||||
{
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD040,2,i2c_buf,6);
|
||||
if (ok == FALSE){
|
||||
msleep(1);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
checksum = i2c_buf[0] + i2c_buf[1] + i2c_buf[2] + i2c_buf[3] + 0xA5;
|
||||
esd_value = (i2c_buf[0] << 24) + (i2c_buf[1] << 16) + (i2c_buf[2] << 8) + i2c_buf[3];
|
||||
flag = 1;
|
||||
if (((i2c_buf[4] << 8) + i2c_buf[5]) == checksum)
|
||||
{
|
||||
flag = 2;
|
||||
if (((esd_value - hyn_92xxdata->esd_last_value) < 1) && (esd_value > 20))
|
||||
{
|
||||
flag = 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
HYN_INFO("ESD data checksum err:0x%x,0x%x", esd_value, checksum);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
HYN_INFO("ESD data:%d,0x%04x,0x%04x", flag, esd_value, hyn_92xxdata->esd_last_value);
|
||||
|
||||
if ((flag == 0) || (flag == 3) || (flag == 1))
|
||||
{
|
||||
cst92xx_rst();
|
||||
msleep(40);
|
||||
esd_value = 0;
|
||||
hyn_92xxdata->esd_last_value = 0;
|
||||
HYN_INFO("esd_check power reset ic");
|
||||
if (hyn_92xxdata->work_mode == GESTURE_MODE)
|
||||
{
|
||||
ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,0);
|
||||
if (ok == FALSE){
|
||||
HYN_ERROR("enter_sleep failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hyn_92xxdata->esd_last_value = esd_value;
|
||||
|
||||
return esd_value;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int cst92xx_prox_handle(u8 cmd)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int cst92xx_get_dbg_data(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = -1;
|
||||
u16 read_len = (hyn_92xxdata->hw_info.fw_sensor_txnum * hyn_92xxdata->hw_info.fw_sensor_rxnum)*2;
|
||||
u16 total_len = read_len + (hyn_92xxdata->hw_info.fw_sensor_txnum + hyn_92xxdata->hw_info.fw_sensor_rxnum)*2;
|
||||
HYN_ENTER();
|
||||
if(total_len > len){
|
||||
HYN_ERROR("buf too small");
|
||||
return -1;
|
||||
}
|
||||
switch(hyn_92xxdata->work_mode){
|
||||
case DIFF_MODE:
|
||||
case RAWDATA_MODE:
|
||||
ret = hyn_wr_reg(hyn_92xxdata,0x1000,2,buf,read_len); //mt
|
||||
|
||||
buf += read_len;
|
||||
read_len = hyn_92xxdata->hw_info.fw_sensor_rxnum*2;
|
||||
ret |= hyn_wr_reg(hyn_92xxdata,0x7000,2,buf,read_len); //rx
|
||||
|
||||
buf += read_len;
|
||||
read_len = hyn_92xxdata->hw_info.fw_sensor_txnum*2;
|
||||
ret |= hyn_wr_reg(hyn_92xxdata,0x7200,2,buf,read_len); //tx
|
||||
|
||||
ret |= hyn_wr_reg(hyn_92xxdata,0x000500,3,0,0); //end
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("work_mode:%d",hyn_92xxdata->work_mode);
|
||||
break;
|
||||
}
|
||||
return ret==0 ? total_len:-1;
|
||||
}
|
||||
|
||||
|
||||
#define FACTEST_PATH "/sdcard/hyn_fac_test_cfg.ini"
|
||||
#define FACTEST_LOG_PATH "/sdcard/hyn_fac_test.log"
|
||||
#define FACTEST_ITEM (MULTI_OPEN_TEST|MULTI_SHORT_TEST)
|
||||
|
||||
static int cst92xx_get_test_result(u8 *buf, u16 len)
|
||||
{
|
||||
int ret = 0,timeout;
|
||||
struct tp_info *ic = &hyn_92xxdata->hw_info;
|
||||
u16 scap_len = (ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*2;
|
||||
u16 mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum*2,i = 0;
|
||||
u16 *raw_s;
|
||||
|
||||
HYN_ENTER();
|
||||
if((mt_len*3 + scap_len) > len || mt_len==0){
|
||||
HYN_ERROR("buf too small");
|
||||
return FAC_GET_DATA_FAIL;
|
||||
}
|
||||
HYN_INFO("---open_higdrv---");
|
||||
timeout = 500;
|
||||
hyn_wr_reg(hyn_92xxdata,0xD110,2,buf,0); ////test open high
|
||||
while(--timeout){ //wait rise edge
|
||||
if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;
|
||||
msleep(10);
|
||||
}
|
||||
if(hyn_wr_reg(hyn_92xxdata,0x3000,2,buf,mt_len)){ //open high
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read open high failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,0);
|
||||
|
||||
HYN_INFO("---open_low---");
|
||||
timeout = 500;
|
||||
hyn_wr_reg(hyn_92xxdata,0xD111,2,buf,0); ////test open low
|
||||
while(--timeout){ //wait rise edge
|
||||
if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;
|
||||
msleep(10);
|
||||
}
|
||||
if(hyn_wr_reg(hyn_92xxdata,0x1000,2,buf + mt_len,mt_len)){ //open low
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read open low failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,0);
|
||||
|
||||
//short test
|
||||
HYN_INFO("---short---");
|
||||
timeout = 500;
|
||||
hyn_wr_reg(hyn_92xxdata,0xD112,2,buf,0); //// short test
|
||||
while(--timeout){ //wait rise edge
|
||||
if(hyn_wait_irq_timeout(hyn_92xxdata,100) == 0) break;
|
||||
msleep(10);
|
||||
}
|
||||
if(hyn_wr_reg(hyn_92xxdata,0x5000,2,buf+(mt_len*2),scap_len)){
|
||||
ret = FAC_GET_DATA_FAIL;
|
||||
HYN_ERROR("read fac short failed");
|
||||
goto selftest_end;
|
||||
}
|
||||
else{
|
||||
raw_s = (u16*)(buf + mt_len*2);
|
||||
HYN_INFO("raw_s start data = %d",*(raw_s));
|
||||
for(i = 0; i< ic->fw_sensor_rxnum+ic->fw_sensor_txnum; i++){
|
||||
HYN_INFO("short raw data = %d %d",i,*(raw_s+i));
|
||||
if(U16REV((u16)*raw_s) != 0) *raw_s = 2000 / U16REV((u16)*raw_s);
|
||||
else *raw_s =0;
|
||||
HYN_INFO("short reprocess data = %d %d",i,*(raw_s+i));
|
||||
raw_s++;
|
||||
}
|
||||
}
|
||||
|
||||
//read data finlish start test
|
||||
ret = factory_multitest(hyn_92xxdata ,FACTEST_PATH, buf,(s16*)(buf+scap_len+mt_len*2),FACTEST_ITEM);
|
||||
|
||||
selftest_end:
|
||||
if(0 == fac_test_log_save(FACTEST_LOG_PATH,hyn_92xxdata,(s16*)buf,ret,FACTEST_ITEM)){
|
||||
HYN_INFO("fac_test log save success");
|
||||
}
|
||||
cst92xx_rst();
|
||||
msleep(40);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct hyn_ts_fuc cst92xx_fuc = {
|
||||
.tp_rest = cst92xx_rst,
|
||||
.tp_report = cst92xx_report,
|
||||
.tp_supend = cst92xx_supend,
|
||||
.tp_resum = cst92xx_resum,
|
||||
.tp_chip_init = cst92xx_init,
|
||||
.tp_updata_fw = cst92xx_updata_fw,
|
||||
.tp_set_workmode = cst92xx_set_workmode,
|
||||
.tp_check_esd = cst92xx_check_esd,
|
||||
.tp_prox_handle = cst92xx_prox_handle,
|
||||
.tp_get_dbg_data = cst92xx_get_dbg_data,
|
||||
.tp_get_test_result = cst92xx_get_test_result
|
||||
};
|
||||
|
||||
|
||||
828
linux_5.10/drivers/input/touchscreen/hyn/hyn_core.c
Normal file
828
linux_5.10/drivers/input/touchscreen/hyn/hyn_core.c
Normal file
@@ -0,0 +1,828 @@
|
||||
#include "hyn_core.h"
|
||||
#define HYN_DRIVER_NAME "hyn_ts"
|
||||
|
||||
static struct hyn_ts_data *hyn_data = NULL;
|
||||
static const struct hyn_ts_fuc* hyn_fun = NULL;
|
||||
static const struct of_device_id hyn_of_match_table[] = {
|
||||
{.compatible = "hyn,66xx", .data = &cst66xx_fuc,}, /*suport 36xx 35xx 66xx 68xx 148E*/
|
||||
{.compatible = "hyn,3240", .data = &cst3240_fuc,}, /*suport 3240 */
|
||||
{.compatible = "hyn,92xx", .data = &cst92xx_fuc,}, /*suport 9217、9220 */
|
||||
{.compatible = "hyn,3xx", .data = &cst3xx_fuc,}, /*suport 340 348*/
|
||||
{.compatible = "hyn,1xx", .data = &cst1xx_fuc,}, /*suport 328 128 140 148*/
|
||||
{.compatible = "hyn,7xx", .data = &cst7xx_fuc,}, /*suport 726 826 836u*/
|
||||
{.compatible = "hyn,8xxt", .data = &cst8xxT_fuc,}, /*suport 816t 816d 820 08C*/
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, hyn_of_match_table);
|
||||
|
||||
static int hyn_check_ic(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
const struct of_device_id *of_dev;
|
||||
of_dev = of_match_device(hyn_of_match_table,ts_data->dev);
|
||||
if (!of_dev)
|
||||
return -EINVAL;
|
||||
hyn_fun = of_dev->data;
|
||||
if(IS_ERR_OR_NULL(hyn_fun) || IS_ERR_OR_NULL(hyn_fun->tp_chip_init)
|
||||
|| hyn_fun->tp_chip_init(ts_data)){
|
||||
return -ENODEV;
|
||||
}
|
||||
ts_data->hyn_fuc_used = hyn_fun;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hyn_parse_dt(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
struct device *dev = ts_data->dev;
|
||||
struct hyn_plat_data* dt = &ts_data->plat_data;
|
||||
HYN_ENTER();
|
||||
if(dev->of_node){
|
||||
u32 buf[8];
|
||||
struct device_node *np = dev->of_node;
|
||||
dt->vdd_i2c = NULL;
|
||||
dt->vdd_ana = NULL;
|
||||
if(of_property_read_bool(np,"vdd_ana")){
|
||||
dt->vdd_ana = regulator_get(dev, "vdd_ana");
|
||||
if(IS_ERR_OR_NULL(dt->vdd_ana)){
|
||||
dt->vdd_ana = NULL;
|
||||
HYN_ERROR("regulator_get vdd_ana failed");
|
||||
}
|
||||
}
|
||||
else{
|
||||
HYN_INFO("vdd_ana not config");
|
||||
}
|
||||
|
||||
if(of_property_read_bool(np,"vcc_i2c")){
|
||||
dt->vdd_i2c = regulator_get(dev, "vcc_i2c");
|
||||
if(IS_ERR_OR_NULL(dt->vdd_i2c)){
|
||||
dt->vdd_i2c = NULL;
|
||||
HYN_ERROR("regulator_get vdd_i2c failed");
|
||||
}
|
||||
}
|
||||
else{
|
||||
HYN_INFO("vdd_i2c not config");
|
||||
}
|
||||
dt->reset_gpio = of_get_named_gpio_flags(np, "reset-gpio", 0, &dt->reset_gpio_flags);
|
||||
dt->irq_gpio = of_get_named_gpio_flags(np, "irq-gpio", 0, &dt->irq_gpio_flags);
|
||||
if(dt->reset_gpio < 0 || dt->irq_gpio < 0){
|
||||
HYN_ERROR("dts get gpio failed");
|
||||
return -ENODEV;
|
||||
}
|
||||
else{
|
||||
HYN_INFO("reset_gpio:%d irq_gpio:%d",dt->reset_gpio,dt->irq_gpio);
|
||||
}
|
||||
|
||||
dt->pinctl = devm_pinctrl_get(dev);
|
||||
if (!IS_ERR_OR_NULL(dt->pinctl)){
|
||||
dt->pin_active = pinctrl_lookup_state(dt->pinctl, "ts_active");
|
||||
dt->pin_suspend= pinctrl_lookup_state(dt->pinctl, "ts_suspend");
|
||||
if(IS_ERR_OR_NULL(dt->pin_active) || IS_ERR_OR_NULL(dt->pin_suspend)){
|
||||
HYN_ERROR("dts get \"ts-active\" \"ts_suspend\" failed");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
else{
|
||||
HYN_INFO("pinctrl not config");
|
||||
dt->pinctl = NULL;
|
||||
dt->pin_active = NULL;
|
||||
dt->pin_suspend= NULL;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(np, "max-touch-number", &dt->max_touch_num);
|
||||
ret |= of_property_read_u32(np, "pos-swap", &dt->swap_xy);
|
||||
ret |= of_property_read_u32(np, "posx-reverse", &dt->reverse_x);
|
||||
ret |= of_property_read_u32(np, "posy-reverse", &dt->reverse_y);
|
||||
ret |= of_property_read_u32_array(np, "display-coords", buf, 4);
|
||||
dt->x_resolution = buf[2];
|
||||
dt->y_resolution = buf[3];
|
||||
HYN_INFO("dts x_res = %d,y_res = %d,touch-number = %d swap_xy = %d reversex = %d reversey = %d",
|
||||
dt->x_resolution,dt->y_resolution,dt->max_touch_num,dt->swap_xy,dt->reverse_x,dt->reverse_y);
|
||||
if(ret < 0){
|
||||
HYN_ERROR("dts get screen failed");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(np, "key-number", &dt->key_num);
|
||||
if(ret>=0 && dt->key_num && dt->key_num<=8){
|
||||
ret |= of_property_read_u32(np, "key-y-coord", &dt->key_y_coords);
|
||||
ret |= of_property_read_u32_array(np, "key-x-coords", dt->key_x_coords, dt->key_num);
|
||||
ret |= of_property_read_u32_array(np, "keys", dt->key_code, dt->key_num);
|
||||
if(ret < 0){
|
||||
HYN_ERROR("dts get screen failed");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
else{
|
||||
HYN_INFO("key not config");
|
||||
dt->key_num = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("dts match failed");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
static int hyn_power_source_ctrl(int enable)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
if(IS_ERR_OR_NULL(hyn_data->plat_data.vdd_ana)){
|
||||
return ret;
|
||||
}
|
||||
if(hyn_data->power_is_on != enable){
|
||||
if(enable){
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.vdd_ana)){
|
||||
ret |= regulator_enable(hyn_data->plat_data.vdd_ana);
|
||||
}
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.vdd_i2c)){
|
||||
ret |= regulator_enable(hyn_data->plat_data.vdd_i2c);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.vdd_ana)){
|
||||
ret |= regulator_disable(hyn_data->plat_data.vdd_ana);
|
||||
}
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.vdd_i2c)){
|
||||
ret |= regulator_disable(hyn_data->plat_data.vdd_i2c);
|
||||
}
|
||||
}
|
||||
hyn_data->power_is_on = enable;
|
||||
}
|
||||
if(ret)
|
||||
HYN_ERROR("set vdd %s regulator failed,ret=%d",enable ? "off":"on",ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hyn_poweron(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
struct hyn_plat_data* dt = &ts_data->plat_data;
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.pinctl)){
|
||||
if(pinctrl_select_state(dt->pinctl, dt->pin_active)){
|
||||
HYN_ERROR("pin active set failed");
|
||||
}
|
||||
}
|
||||
|
||||
ret = gpio_request(dt->irq_gpio, "hyn_irq_gpio");
|
||||
ret |= gpio_request(dt->reset_gpio, "hyn_reset_gpio");
|
||||
if(ret < 0){
|
||||
HYN_ERROR("gpio_request failed");
|
||||
goto GPIO_SET_FAILE;
|
||||
}
|
||||
|
||||
ret = gpio_direction_input(dt->irq_gpio);
|
||||
ret |= gpio_direction_output(dt->reset_gpio, 0);
|
||||
if(ret < 0){
|
||||
HYN_ERROR("set gpio_direction failed");
|
||||
goto GPIO_SET_FAILE;
|
||||
}
|
||||
|
||||
if(!IS_ERR_OR_NULL(dt->vdd_ana)){
|
||||
if(regulator_count_voltages(dt->vdd_ana) > 0){
|
||||
if(regulator_set_voltage(dt->vdd_ana, 2800000, 3300000)){
|
||||
HYN_ERROR("set voltage vdd_ana failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!IS_ERR_OR_NULL(dt->vdd_i2c)){
|
||||
if(regulator_count_voltages(dt->vdd_i2c) > 0){
|
||||
if(regulator_set_voltage(dt->vdd_i2c, 1800000, 1800000)){
|
||||
HYN_ERROR("set voltage vdd_i2c failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(hyn_power_source_ctrl(1)){
|
||||
HYN_ERROR("enable power failed");
|
||||
}
|
||||
mdelay(5);
|
||||
gpio_set_value(dt->reset_gpio, 1);
|
||||
return 0;
|
||||
GPIO_SET_FAILE:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hyn_input_dev_init(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
int key_num = 0;//,ret =0;
|
||||
struct hyn_plat_data *dt = &ts_data->plat_data;
|
||||
struct input_dev *input_dev;
|
||||
|
||||
HYN_ENTER();
|
||||
input_dev = input_allocate_device();
|
||||
if (!input_dev) {
|
||||
HYN_ERROR("Failed to allocate memory for input device");
|
||||
return -ENOMEM;
|
||||
}
|
||||
input_dev->name = HYN_DRIVER_NAME;
|
||||
input_dev->id.bustype = ts_data->bus_type;
|
||||
input_dev->dev.parent = ts_data->dev;
|
||||
input_set_drvdata(input_dev, ts_data);
|
||||
|
||||
__set_bit(EV_SYN, input_dev->evbit);
|
||||
__set_bit(EV_ABS, input_dev->evbit);
|
||||
__set_bit(EV_KEY, input_dev->evbit);
|
||||
__set_bit(BTN_TOUCH, input_dev->keybit);
|
||||
__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
|
||||
|
||||
for (key_num = 0; key_num < dt->key_num; key_num++)
|
||||
input_set_capability(input_dev, EV_KEY, dt->key_code[key_num]);
|
||||
#if HYN_MT_PROTOCOL_B_EN
|
||||
set_bit(BTN_TOOL_FINGER,input_dev->keybit);
|
||||
//input_mt_init_slots(input_dev, dt->max_touch_num);
|
||||
input_mt_init_slots(input_dev, dt->max_touch_num, INPUT_MT_DIRECT);
|
||||
#else
|
||||
input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
|
||||
#endif
|
||||
|
||||
input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, dt->max_touch_num, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, dt->x_resolution,0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, dt->y_resolution,0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);
|
||||
input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0);
|
||||
|
||||
ts_data->input_dev = input_dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void release_all_finger(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
HYN_ENTER();
|
||||
#if HYN_MT_PROTOCOL_B_EN
|
||||
{
|
||||
u8 i;
|
||||
for(i=0; i< ts_data->plat_data.max_touch_num; i++) {
|
||||
input_mt_slot(ts_data->input_dev, i);
|
||||
input_report_abs(ts_data->input_dev, ABS_MT_TRACKING_ID, -1);
|
||||
input_mt_report_slot_state(ts_data->input_dev, MT_TOOL_FINGER, false);
|
||||
}
|
||||
input_report_key(ts_data->input_dev, BTN_TOUCH, 0);
|
||||
}
|
||||
#else
|
||||
input_report_key(ts_data->input_dev, BTN_TOUCH, 0);
|
||||
input_mt_sync(ts_data->input_dev);
|
||||
#endif
|
||||
ts_data->rp_buf.report_need = REPORT_NONE;
|
||||
}
|
||||
|
||||
static void touch_updata(u8 idx,u8 event)
|
||||
{
|
||||
struct ts_frame *rep_frame = &hyn_data->rp_buf;
|
||||
struct input_dev *dev = hyn_data->input_dev;
|
||||
u16 zpress = rep_frame->pos_info[idx].pres_z;
|
||||
if(zpress < 10){
|
||||
zpress = zpress+(rep_frame->pos_info[idx].pos_x&0x03) + (rep_frame->pos_info[idx].pos_y&0x03);
|
||||
}
|
||||
#if HYN_MT_PROTOCOL_B_EN
|
||||
if(event){
|
||||
input_mt_slot(dev, rep_frame->pos_info[idx].pos_id);
|
||||
input_mt_report_slot_state(dev, MT_TOOL_FINGER, 1);
|
||||
input_report_abs(dev, ABS_MT_TRACKING_ID, rep_frame->pos_info[idx].pos_id);
|
||||
input_report_abs(dev, ABS_MT_POSITION_X, rep_frame->pos_info[idx].pos_x);
|
||||
input_report_abs(dev, ABS_MT_POSITION_Y, rep_frame->pos_info[idx].pos_y);
|
||||
input_report_abs(dev, ABS_MT_TOUCH_MAJOR, zpress>>3);
|
||||
input_report_abs(dev, ABS_MT_WIDTH_MAJOR, zpress>>3);
|
||||
input_report_abs(dev, ABS_MT_PRESSURE, zpress);
|
||||
input_report_key(dev, BTN_TOUCH, 1);
|
||||
}
|
||||
else{
|
||||
input_mt_slot(dev, rep_frame->pos_info[idx].pos_id);
|
||||
input_report_abs(dev, ABS_MT_TRACKING_ID, -1);
|
||||
input_mt_report_slot_state(dev, MT_TOOL_FINGER, 0);
|
||||
}
|
||||
#else
|
||||
if(event){
|
||||
input_report_key(dev, BTN_TOUCH, 1);
|
||||
input_report_abs(dev, ABS_MT_PRESSURE, zpress);
|
||||
input_report_abs(dev, ABS_MT_TRACKING_ID, rep_frame->pos_info[idx].pos_id);
|
||||
input_report_abs(dev, ABS_MT_TOUCH_MAJOR, zpress>>3);
|
||||
// input_report_abs(dev, ABS_MT_WIDTH_MAJOR, zpress>>3);
|
||||
input_report_abs(dev, ABS_MT_POSITION_X, rep_frame->pos_info[idx].pos_x);
|
||||
input_report_abs(dev, ABS_MT_POSITION_Y, rep_frame->pos_info[idx].pos_y);
|
||||
input_mt_sync(dev);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void hyn_irq_report_work(struct work_struct *work)
|
||||
{
|
||||
struct hyn_ts_data *ts_data = hyn_data;
|
||||
struct ts_frame *rep_frame = &hyn_data->rp_buf;
|
||||
struct input_dev *dev = hyn_data->input_dev;
|
||||
struct hyn_plat_data *dt = &hyn_data->plat_data;
|
||||
u16 xpos,ypos;
|
||||
hyn_fun->tp_report();
|
||||
mutex_lock(&ts_data->mutex_report);
|
||||
if(rep_frame->report_need & REPORT_KEY){ //key
|
||||
#if KEY_USED_POS_REPORT
|
||||
rep_frame->pos_info[0].pos_id = 0;
|
||||
rep_frame->pos_info[0].pos_x = dt->key_x_coords[rep_frame->key_id];
|
||||
rep_frame->pos_info[0].pos_y = dt->key_y_coords;
|
||||
rep_frame->pos_info[0].pres_z = 100;
|
||||
touch_updata(0,rep_frame->key_state ? 1:0);
|
||||
#else
|
||||
input_report_key(dev,dt->key_code[rep_frame->key_id],rep_frame->key_state ? 1:0);
|
||||
#endif
|
||||
if(rep_frame->key_state==0){
|
||||
rep_frame->report_need = REPORT_NONE;
|
||||
}
|
||||
input_sync(dev);
|
||||
HYN_INFO2("report keyid:%d keycode:%d",rep_frame->key_id,dt->key_code[rep_frame->key_id]);
|
||||
}
|
||||
|
||||
if(rep_frame->report_need & REPORT_POS){ //pos
|
||||
u8 i;
|
||||
if(rep_frame->rep_num == 0){
|
||||
release_all_finger(ts_data);
|
||||
}
|
||||
else{
|
||||
u8 touch_down = 0;
|
||||
for(i = 0; i < rep_frame->rep_num; i++){
|
||||
HYN_INFO2("id,%d,xy,%d,%d",rep_frame->pos_info[i].pos_id,rep_frame->pos_info[i].pos_x,rep_frame->pos_info[i].pos_y);
|
||||
if(dt->swap_xy){
|
||||
xpos = rep_frame->pos_info[i].pos_y;
|
||||
ypos = rep_frame->pos_info[i].pos_x;
|
||||
}
|
||||
else{
|
||||
xpos = rep_frame->pos_info[i].pos_x;
|
||||
ypos = rep_frame->pos_info[i].pos_y;
|
||||
}
|
||||
if(ypos > dt->y_resolution || xpos > dt->x_resolution || rep_frame->pos_info[i].pos_id >= ts_data->plat_data.max_touch_num){
|
||||
HYN_ERROR("Please check dts or FW config !!!");
|
||||
continue;
|
||||
}
|
||||
if(dt->reverse_x){
|
||||
xpos = dt->x_resolution-xpos;
|
||||
}
|
||||
if(dt->reverse_y){
|
||||
ypos = dt->y_resolution-ypos;
|
||||
}
|
||||
rep_frame->pos_info[i].pos_x = xpos;
|
||||
rep_frame->pos_info[i].pos_y = ypos;
|
||||
touch_updata(i,rep_frame->pos_info[i].event? 1:0);
|
||||
if(rep_frame->pos_info[i].event) touch_down++;
|
||||
}
|
||||
if(touch_down==0){
|
||||
rep_frame->report_need = REPORT_NONE;
|
||||
input_report_key(dev, BTN_TOUCH, 0);
|
||||
#if HYN_MT_PROTOCOL_B_EN==0
|
||||
input_mt_sync(dev);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
input_sync(dev);
|
||||
}
|
||||
else if(rep_frame->report_need & REPORT_PROX){
|
||||
hyn_proximity_report(ts_data->prox_state);
|
||||
rep_frame->report_need = REPORT_NONE;
|
||||
}
|
||||
#if (HYN_GESTURE_EN)
|
||||
else if(rep_frame->report_need & REPORT_GES){
|
||||
hyn_gesture_report(ts_data);
|
||||
rep_frame->report_need = REPORT_NONE;
|
||||
}
|
||||
#endif
|
||||
mutex_unlock(&ts_data->mutex_report);
|
||||
}
|
||||
|
||||
static void hyn_esdcheck_work(struct work_struct *work)
|
||||
{
|
||||
#if ESD_CHECK_EN
|
||||
int ret;
|
||||
HYN_ENTER();
|
||||
ret = hyn_fun->tp_check_esd();
|
||||
// HYN_INFO("esd:%04x",ret);
|
||||
if(hyn_data->esd_last_value != ret){
|
||||
hyn_data->esd_fail_cnt = 0;
|
||||
hyn_data->esd_last_value = ret;
|
||||
}
|
||||
else{
|
||||
hyn_data->esd_fail_cnt++;
|
||||
if(hyn_data->esd_fail_cnt > 2){
|
||||
hyn_data->esd_fail_cnt = 0;
|
||||
hyn_power_source_ctrl(0);
|
||||
mdelay(1);
|
||||
hyn_power_source_ctrl(1);
|
||||
hyn_fun->tp_rest();
|
||||
}
|
||||
}
|
||||
queue_delayed_work(hyn_data->hyn_workqueue, &hyn_data->esdcheck_work,
|
||||
msecs_to_jiffies(1000));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void hyn_resum(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
#if (HYN_WAKE_LOCK_EN==1)
|
||||
wake_unlock(&hyn_data->tp_wakelock);
|
||||
#endif
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.pinctl)){
|
||||
pinctrl_select_state(hyn_data->plat_data.pinctl, hyn_data->plat_data.pin_active);
|
||||
}
|
||||
hyn_power_source_ctrl(1);
|
||||
hyn_fun->tp_resum();
|
||||
if(hyn_data->prox_is_enable){
|
||||
hyn_fun->tp_prox_handle(1);
|
||||
}
|
||||
else if(hyn_data->gesture_is_enable){
|
||||
hyn_irq_set(hyn_data,DISABLE);
|
||||
ret = disable_irq_wake(hyn_data->client->irq);
|
||||
ret |= irq_set_irq_type(hyn_data->client->irq,hyn_data->plat_data.irq_gpio_flags);
|
||||
if(ret < 0){
|
||||
HYN_ERROR("gesture irq_set_irq failed");
|
||||
}
|
||||
hyn_irq_set(hyn_data,ENABLE);
|
||||
}
|
||||
release_all_finger(hyn_data);
|
||||
input_sync(hyn_data->input_dev);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_FB)
|
||||
static void hyn_suspend(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
#if (HYN_WAKE_LOCK_EN==1)
|
||||
wake_lock(&hyn_data->tp_wakelock);
|
||||
#endif
|
||||
if(hyn_data->prox_is_enable ==1){
|
||||
}
|
||||
else if(hyn_data->gesture_is_enable){
|
||||
hyn_irq_set(hyn_data,DISABLE);
|
||||
ret = enable_irq_wake(hyn_data->client->irq);
|
||||
ret |= irq_set_irq_type(hyn_data->client->irq,IRQF_TRIGGER_FALLING|IRQF_NO_SUSPEND|IRQF_ONESHOT);
|
||||
if(ret < 0){
|
||||
HYN_ERROR("gesture irq_set_irq failed");
|
||||
}
|
||||
hyn_fun->tp_set_workmode(GESTURE_MODE,0);
|
||||
hyn_irq_set(hyn_data,ENABLE);
|
||||
hyn_power_source_ctrl(1);
|
||||
}
|
||||
else{
|
||||
hyn_fun->tp_supend();
|
||||
if(!IS_ERR_OR_NULL(hyn_data->plat_data.pinctl)){
|
||||
pinctrl_select_state(hyn_data->plat_data.pinctl, hyn_data->plat_data.pin_suspend);
|
||||
}
|
||||
hyn_power_source_ctrl(0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void hyn_updata_fw_work(struct work_struct *work)
|
||||
{
|
||||
int ret = 0;
|
||||
if(!IS_ERR_OR_NULL(hyn_data->fw_updata_addr)){
|
||||
ret = hyn_fun->tp_updata_fw(hyn_data->fw_updata_addr,hyn_data->fw_updata_len);
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("fw_updata_addr is erro");
|
||||
}
|
||||
}
|
||||
|
||||
static void hyn_resum_work(struct work_struct *work)
|
||||
{
|
||||
hyn_resum(hyn_data->dev);
|
||||
}
|
||||
|
||||
static irqreturn_t hyn_irq_handler(int irq, void *data)
|
||||
{
|
||||
atomic_set(&hyn_data->hyn_irq_flg,1);
|
||||
if(hyn_data->work_mode < DIFF_MODE){
|
||||
// queue_work(hyn_data->hyn_workqueue,&hyn_data->work_report);
|
||||
flush_workqueue(hyn_data->hyn_workqueue);
|
||||
hyn_irq_report_work(NULL);
|
||||
}
|
||||
else{
|
||||
wake_up(&hyn_data->wait_irq);
|
||||
}
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FB)
|
||||
static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data)
|
||||
{
|
||||
struct fb_event *evdata = data;
|
||||
int *blank = NULL;
|
||||
|
||||
if (event != FB_EVENT_BLANK) {
|
||||
HYN_INFO("event(%lu) do not need process\n", event);
|
||||
return 0;
|
||||
}
|
||||
|
||||
blank = evdata->data;
|
||||
HYN_INFO("FB event:%lu,blank:%d", event, *blank);
|
||||
if(hyn_data->old_fb_state == *blank){
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(*blank == FB_BLANK_UNBLANK){
|
||||
queue_work(hyn_data->hyn_workqueue, &hyn_data->work_resume);
|
||||
}
|
||||
else{
|
||||
cancel_work_sync(&hyn_data->work_resume);
|
||||
hyn_suspend(hyn_data->dev);
|
||||
}
|
||||
hyn_data->old_fb_state = *blank;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
||||
static void hyn_ts_early_suspend(struct early_suspend *handler)
|
||||
{
|
||||
hyn_suspend(hyn_data->dev);
|
||||
}
|
||||
static void hyn_ts_late_resume(struct early_suspend *handler)
|
||||
{
|
||||
hyn_resum(hyn_data->dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef I2C_PORT
|
||||
static int hyn_ts_remove(struct i2c_client *client);
|
||||
static int hyn_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
#else
|
||||
static int hyn_ts_remove(struct spi_device *client);
|
||||
static int hyn_ts_probe(struct spi_device *client)
|
||||
#endif
|
||||
{
|
||||
int ret = 0;
|
||||
u16 bus_type;
|
||||
struct hyn_ts_data *ts_data = 0;
|
||||
|
||||
HYN_ENTER();
|
||||
HYN_INFO(HYN_DRIVER_VERSION);
|
||||
#ifdef I2C_PORT
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||
HYN_ERROR("I2C not supported");
|
||||
return -ENODEV;
|
||||
}
|
||||
bus_type = BUS_I2C;
|
||||
#else
|
||||
client->mode = SPI_MODE;
|
||||
client->max_speed_hz = SPI_CLOCK_FREQ;
|
||||
client->bits_per_word = 8;
|
||||
if (spi_setup(client) < 0){
|
||||
HYN_ERROR("SPI not supported");
|
||||
return -ENODEV;
|
||||
}
|
||||
bus_type = BUS_SPI;
|
||||
#endif
|
||||
if(!IS_ERR_OR_NULL(hyn_data)){
|
||||
HYN_ERROR("other dev is insmode");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ts_data = kzalloc(sizeof(*ts_data), GFP_KERNEL);
|
||||
if (!ts_data) {
|
||||
HYN_ERROR("alloc ts data failed");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ts_data->bus_type = bus_type;
|
||||
ts_data->rp_buf.key_id = 0xFF;
|
||||
ts_data->work_mode = NOMAL_MODE;
|
||||
ts_data->log_level = 0;
|
||||
|
||||
hyn_data = ts_data;
|
||||
ts_data->client = client;
|
||||
ts_data->dev = &client->dev;
|
||||
dev_set_drvdata(ts_data->dev, ts_data);
|
||||
|
||||
#if (I2C_USE_DMA==2)
|
||||
ts_data->dma_buff_va = (u8 *)dma_alloc_coherent(NULL,
|
||||
2048, &ts_data->dma_buff_pa, GFP_KERNEL);
|
||||
if (!ts_data->dma_buff_va) {
|
||||
HYN_ERROR("Allocate I2C DMA Buffer fail");
|
||||
}
|
||||
#endif
|
||||
ret = hyn_parse_dt(ts_data);
|
||||
if(ret){
|
||||
HYN_ERROR("hyn_parse_dt failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
|
||||
ret = hyn_poweron(ts_data);
|
||||
if(ret){
|
||||
HYN_ERROR("hyn_poweron failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
// spin_lock_init(&ts_data->irq_lock);
|
||||
mutex_init(&ts_data->mutex_report);
|
||||
mutex_init(&ts_data->mutex_bus);
|
||||
mutex_init(&ts_data->mutex_fs);
|
||||
init_waitqueue_head(&ts_data->wait_irq);
|
||||
|
||||
ret = hyn_check_ic(ts_data);
|
||||
if(ret){
|
||||
HYN_ERROR("hyn_check_ic failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
|
||||
INIT_WORK(&ts_data->work_report,hyn_irq_report_work);
|
||||
INIT_WORK(&ts_data->work_updata_fw,hyn_updata_fw_work);
|
||||
INIT_WORK(&ts_data->work_resume,hyn_resum_work);
|
||||
INIT_DELAYED_WORK(&ts_data->esdcheck_work,hyn_esdcheck_work);
|
||||
|
||||
ts_data->hyn_workqueue = create_singlethread_workqueue("hyn_wq");
|
||||
if (IS_ERR_OR_NULL(ts_data->hyn_workqueue)){
|
||||
HYN_ERROR("create work queue failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
|
||||
ret = hyn_input_dev_init(ts_data);
|
||||
if(ret){
|
||||
if(!IS_ERR_OR_NULL(ts_data->input_dev)){
|
||||
input_set_drvdata(ts_data->input_dev, NULL);
|
||||
input_free_device(ts_data->input_dev);
|
||||
ts_data->input_dev = NULL;
|
||||
}
|
||||
HYN_ERROR("hyn_input_dev_init failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
ret = input_register_device(ts_data->input_dev);
|
||||
if(ret){
|
||||
HYN_ERROR("input_register_device failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
|
||||
#if (HYN_WAKE_LOCK_EN==1)
|
||||
wake_lock_init(&ts_data->tp_wakelock, WAKE_LOCK_SUSPEND, "suspend_tp_lock");
|
||||
#endif
|
||||
|
||||
#if (HYN_GESTURE_EN)
|
||||
ret = hyn_gesture_init(ts_data);
|
||||
if(ret){
|
||||
HYN_ERROR("gesture_init failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
#endif
|
||||
|
||||
ts_data->gpio_irq = gpio_to_irq(ts_data->plat_data.irq_gpio);
|
||||
ret = request_threaded_irq(ts_data->gpio_irq, NULL, hyn_irq_handler,
|
||||
(IRQF_TRIGGER_FALLING | IRQF_ONESHOT), HYN_DRIVER_NAME, ts_data);
|
||||
if(ret){
|
||||
HYN_ERROR("request_threaded_irq failed");
|
||||
goto FREE_RESOURCE;
|
||||
}
|
||||
atomic_set(&ts_data->irq_is_disable,ENABLE);
|
||||
hyn_irq_set(ts_data , DISABLE);
|
||||
#if defined(CONFIG_FB)
|
||||
ts_data->fb_notif.notifier_call = fb_notifier_callback;
|
||||
ret = fb_register_client(&ts_data->fb_notif);
|
||||
if (ret) {
|
||||
HYN_ERROR("register fb_notifier failed: %d", ret);
|
||||
}
|
||||
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
||||
ts_data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
|
||||
ts_data->early_suspend.suspend = hyn_ts_early_suspend;
|
||||
ts_data->early_suspend.resume = hyn_ts_late_resume;
|
||||
register_early_suspend(&ts_data->early_suspend);
|
||||
#endif
|
||||
hyn_create_sysfs(ts_data);
|
||||
#if (HYN_APK_DEBUG_EN)
|
||||
hyn_tool_fs_int(ts_data);
|
||||
#endif
|
||||
hyn_proximity_int(ts_data);
|
||||
hyn_irq_set(ts_data,ENABLE);
|
||||
hyn_esdcheck_switch(ts_data,ENABLE);
|
||||
|
||||
#if HYN_POWER_ON_UPDATA
|
||||
if(ts_data->need_updata_fw){
|
||||
queue_work(ts_data->hyn_workqueue,&ts_data->work_updata_fw);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
FREE_RESOURCE:
|
||||
hyn_ts_remove(client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef I2C_PORT
|
||||
static int hyn_ts_remove(struct i2c_client *client)
|
||||
#else
|
||||
static int hyn_ts_remove(struct spi_device *client)
|
||||
#endif
|
||||
{
|
||||
struct hyn_ts_data *ts_data = hyn_data;
|
||||
HYN_ENTER();
|
||||
if(!IS_ERR_OR_NULL(ts_data)){
|
||||
if (ts_data->hyn_workqueue){
|
||||
flush_workqueue(ts_data->hyn_workqueue);
|
||||
hyn_esdcheck_switch(ts_data,DISABLE);
|
||||
destroy_workqueue(ts_data->hyn_workqueue);
|
||||
}
|
||||
HYN_INFO("ts_remove1");
|
||||
#if (HYN_APK_DEBUG_EN)
|
||||
hyn_tool_fs_exit();
|
||||
#endif
|
||||
hyn_proximity_exit();
|
||||
#if (HYN_GESTURE_EN)
|
||||
hyn_gesture_exit(ts_data);
|
||||
#endif
|
||||
hyn_release_sysfs(ts_data);
|
||||
HYN_INFO("ts_remove2");
|
||||
if(ts_data->gpio_irq != 0)
|
||||
free_irq(ts_data->gpio_irq, ts_data);
|
||||
HYN_INFO("ts_remove3");
|
||||
if(!IS_ERR_OR_NULL(ts_data->input_dev)){
|
||||
input_unregister_device(ts_data->input_dev);
|
||||
}
|
||||
HYN_INFO("ts_remove4");
|
||||
#if defined(CONFIG_FB)
|
||||
fb_unregister_client(&ts_data->fb_notif);
|
||||
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
||||
unregister_early_suspend(&ts_data->early_suspend);
|
||||
#endif
|
||||
if(gpio_is_valid(ts_data->plat_data.irq_gpio))
|
||||
gpio_free(ts_data->plat_data.irq_gpio);
|
||||
if(gpio_is_valid(ts_data->plat_data.reset_gpio))
|
||||
gpio_free(ts_data->plat_data.reset_gpio);
|
||||
HYN_INFO("ts_remove5");
|
||||
hyn_power_source_ctrl(0);
|
||||
if(!IS_ERR_OR_NULL(ts_data->plat_data.vdd_ana)){
|
||||
regulator_put(ts_data->plat_data.vdd_ana);
|
||||
}
|
||||
if(!IS_ERR_OR_NULL(ts_data->plat_data.vdd_i2c)){
|
||||
regulator_put(ts_data->plat_data.vdd_i2c);
|
||||
}
|
||||
HYN_INFO("ts_remove6");
|
||||
#if (I2C_USE_DMA==2)
|
||||
if(!IS_ERR_OR_NULL(ts_data->dma_buff_va)){
|
||||
dma_free_coherent(NULL, 2048, ts_data->dma_buff_va, ts_data->dma_buff_pa);
|
||||
}
|
||||
#endif
|
||||
kfree(ts_data);
|
||||
hyn_data = NULL;
|
||||
HYN_INFO("ts_remove7");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef I2C_PORT
|
||||
static const struct i2c_device_id hyn_id_table[] = {
|
||||
{.name = HYN_DRIVER_NAME, .driver_data = 0,},
|
||||
{},
|
||||
};
|
||||
|
||||
static struct i2c_driver hyn_ts_driver = {
|
||||
.probe = hyn_ts_probe,
|
||||
.remove = hyn_ts_remove,
|
||||
.driver = {
|
||||
.name = HYN_DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = hyn_of_match_table,
|
||||
},
|
||||
.id_table = hyn_id_table,
|
||||
};
|
||||
#else
|
||||
static struct spi_driver hyn_ts_driver = {
|
||||
.driver = {
|
||||
.name = HYN_DRIVER_NAME,
|
||||
.of_match_table = hyn_of_match_table,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = hyn_ts_probe,
|
||||
.remove = hyn_ts_remove,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init hyn_ts_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
#ifdef I2C_PORT
|
||||
ret = i2c_add_driver(&hyn_ts_driver);
|
||||
#else
|
||||
ret = spi_register_driver(&hyn_ts_driver);
|
||||
#endif
|
||||
if (ret) {
|
||||
HYN_ERROR("add i2c driver failed");
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit hyn_ts_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
#ifdef I2C_PORT
|
||||
i2c_del_driver(&hyn_ts_driver);
|
||||
#else
|
||||
spi_unregister_driver(&hyn_ts_driver);
|
||||
#endif
|
||||
}
|
||||
|
||||
late_initcall(hyn_ts_init);
|
||||
// module_init(hyn_ts_init);
|
||||
module_exit(hyn_ts_exit);
|
||||
|
||||
MODULE_AUTHOR("Hynitron Driver Team");
|
||||
MODULE_DESCRIPTION("Hynitron Touchscreen Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
340
linux_5.10/drivers/input/touchscreen/hyn/hyn_core.h
Normal file
340
linux_5.10/drivers/input/touchscreen/hyn/hyn_core.h
Normal file
@@ -0,0 +1,340 @@
|
||||
#ifndef HYNITRON_CORE_H
|
||||
#define HYNITRON_CORE_H
|
||||
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/kernel.h>
|
||||
//#include <linux/rtpm_prio.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pm_wakeup.h>
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/mt.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
// #include <linux/regulator/driver.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include "hyn_cfg.h"
|
||||
|
||||
#if (HYN_WAKE_LOCK_EN==1)
|
||||
#include <linux/wakelock.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FB)
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/fb.h>
|
||||
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
||||
#include <linux/earlysuspend.h>
|
||||
#endif
|
||||
|
||||
|
||||
#define HYN_INFO(fmt, args...) printk(KERN_INFO "[HYN]"fmt"\n", ##args)
|
||||
#define HYN_INFO2(fmt, args...) if(hyn_data->log_level > 0)printk(KERN_INFO "[HYN]"fmt"\n", ##args)
|
||||
#define HYN_INFO3(fmt, args...) if(hyn_data->log_level > 1)printk(KERN_INFO "[HYN]"fmt"\n", ##args)
|
||||
#define HYN_INFO4(fmt, args...) if(hyn_data->log_level > 2)printk(KERN_INFO "[HYN]"fmt"\n", ##args)
|
||||
#define HYN_ERROR(fmt, args...) printk(KERN_ERR "[HYN][Error]%s:"fmt"\n",__func__,##args)
|
||||
#define HYN_ENTER() printk(KERN_ERR "[HYN][enter]%s\n",__func__)
|
||||
|
||||
// #if HYN_GKI_VER
|
||||
// MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
|
||||
// #endif
|
||||
|
||||
// #define IS_ERR_OR_NULL(x) (x <= 0)
|
||||
#define U8TO16(x1,x2) ((((x1)&0xFF)<<8)|((x2)&0xFF))
|
||||
#define U8TO32(x1,x2,x3,x4) ((((x1)&0xFF)<<24)|(((x2)&0xFF)<<16)|(((x3)&0xFF)<<8)|((x4)&0xFF))
|
||||
#define U16REV(x) ((((x)<<8)&0xFF00)|(((x)>>8)&0x00FF))
|
||||
|
||||
#undef NULL
|
||||
#undef FALSE
|
||||
#undef TRUE
|
||||
#undef DISABLE
|
||||
#undef ENABLE
|
||||
#define NULL ((void*)0)
|
||||
#define FALSE (-1)
|
||||
#define TRUE (0)
|
||||
#define DISABLE (0)
|
||||
#define ENABLE (1)
|
||||
|
||||
#define PS_FAR_AWAY 1
|
||||
#define PS_NEAR 0
|
||||
|
||||
#define MULTI_OPEN_TEST (0x80)
|
||||
#define MULTI_SHORT_TEST (0x01)
|
||||
#define MULTI_SCAP_TEST (0x02)
|
||||
|
||||
#if HYN_GKI_VER
|
||||
#define hyn_fs_write(...)
|
||||
#define hyn_fs_read(...)
|
||||
#else
|
||||
#define hyn_fs_write kernel_write
|
||||
#define hyn_fs_read kernel_read
|
||||
#endif
|
||||
|
||||
enum work_mode{
|
||||
NOMAL_MODE = 0,
|
||||
GESTURE_MODE = 1,
|
||||
LP_MODE = 2,
|
||||
DEEPSLEEP = 3,
|
||||
DIFF_MODE = 4,
|
||||
RAWDATA_MODE = 5,
|
||||
BASELINE_MODE = 6,
|
||||
CALIBRATE_MODE = 7,
|
||||
FAC_TEST_MODE = 8,
|
||||
ENTER_BOOT_MODE = 0xCA,
|
||||
};
|
||||
|
||||
enum report_typ{
|
||||
REPORT_NONE = 0,
|
||||
REPORT_POS = 0x01,
|
||||
REPORT_KEY = 0x02,
|
||||
REPORT_GES = 0x04,
|
||||
REPORT_PROX = 0x08
|
||||
};
|
||||
|
||||
enum fac_test_ero{
|
||||
FAC_TEST_PASS = 0,
|
||||
FAC_GET_DATA_FAIL = -1,
|
||||
FAC_GET_CFG_FAIL = -4,
|
||||
FAC_TEST_OPENL_FAIL = -5,
|
||||
FAC_TEST_OPENH_FAIL = -7,
|
||||
FAC_TEST_SHORT_FAIL = -6,
|
||||
FAC_TEST_SCAP_FAIL = -8,
|
||||
};
|
||||
|
||||
enum ges_idx{
|
||||
IDX_U = 0,
|
||||
IDX_UP,
|
||||
IDX_DOWN,
|
||||
IDX_LEFT,
|
||||
IDX_RIGHT,
|
||||
IDX_O,
|
||||
IDX_e,
|
||||
IDX_M,
|
||||
IDX_L,
|
||||
IDX_W,
|
||||
IDX_S,
|
||||
IDX_V,
|
||||
IDX_C,
|
||||
IDX_Z,
|
||||
IDX_POWER,
|
||||
IDX_NULL = 0xFF,
|
||||
};
|
||||
|
||||
|
||||
struct hyn_plat_data {
|
||||
struct regulator *vdd_ana;
|
||||
struct regulator *vdd_i2c;
|
||||
|
||||
int reset_gpio;
|
||||
u32 reset_gpio_flags;
|
||||
int irq_gpio;
|
||||
u32 irq_gpio_flags;
|
||||
|
||||
struct pinctrl *pinctl;
|
||||
struct pinctrl_state *pin_active;
|
||||
struct pinctrl_state *pin_suspend;
|
||||
|
||||
u32 x_resolution;
|
||||
u32 y_resolution;
|
||||
int swap_xy;
|
||||
int reverse_x;
|
||||
int reverse_y;
|
||||
|
||||
int max_touch_num;
|
||||
int key_num;
|
||||
u32 key_x_coords[8]; // max support 8 keys
|
||||
u32 key_y_coords;
|
||||
u32 key_code[8];
|
||||
};
|
||||
|
||||
struct hyn_chip_series{
|
||||
u32 part_no;
|
||||
u32 moudle_id;
|
||||
u8* chip_name;
|
||||
u8* fw_bin;
|
||||
};
|
||||
|
||||
struct ts_frame{
|
||||
u8 rep_num;
|
||||
enum report_typ report_need;
|
||||
u8 key_id;
|
||||
u8 key_state;
|
||||
struct {
|
||||
u8 pos_id;
|
||||
u8 event;
|
||||
u16 pos_x;
|
||||
u16 pos_y;
|
||||
u16 pres_z;
|
||||
}pos_info[MAX_POINTS_REPORT];
|
||||
};
|
||||
|
||||
struct tp_info{
|
||||
u8 fw_sensor_txnum;
|
||||
u8 fw_sensor_rxnum;
|
||||
u8 fw_key_num;
|
||||
u8 reserve;
|
||||
u16 fw_res_y;
|
||||
u16 fw_res_x;
|
||||
u32 fw_boot_time;
|
||||
u32 fw_project_id;
|
||||
u32 fw_chip_type;
|
||||
u32 fw_ver;
|
||||
u32 ic_fw_checksum;
|
||||
u32 fw_module_id;
|
||||
};
|
||||
|
||||
|
||||
struct hyn_ts_data {
|
||||
u16 bus_type;
|
||||
#ifdef I2C_PORT
|
||||
struct i2c_client *client;
|
||||
#else
|
||||
struct spi_device *client;
|
||||
#endif
|
||||
struct device *dev;
|
||||
struct input_dev *input_dev;
|
||||
struct workqueue_struct *hyn_workqueue;
|
||||
int gpio_irq;
|
||||
int esd_fail_cnt;
|
||||
u32 esd_last_value;
|
||||
enum work_mode work_mode;
|
||||
|
||||
int power_is_on;
|
||||
atomic_t irq_is_disable;
|
||||
atomic_t hyn_irq_flg;
|
||||
// spinlock_t irq_lock;
|
||||
struct mutex mutex_report;
|
||||
struct mutex mutex_bus;
|
||||
struct mutex mutex_fs;
|
||||
#if (HYN_WAKE_LOCK_EN==1)
|
||||
struct wake_lock tp_wakelock;
|
||||
#endif
|
||||
|
||||
#if (I2C_USE_DMA==2)
|
||||
u8 *dma_buff_va;
|
||||
dma_addr_t dma_buff_pa;
|
||||
#endif
|
||||
struct hyn_plat_data plat_data;
|
||||
struct tp_info hw_info;
|
||||
struct ts_frame rp_buf;
|
||||
|
||||
struct work_struct work_report;
|
||||
struct work_struct work_resume;
|
||||
struct delayed_work esdcheck_work;
|
||||
|
||||
struct work_struct work_updata_fw;
|
||||
int boot_is_pass;
|
||||
int need_updata_fw;
|
||||
u8 fw_file_name[128];
|
||||
u8 *fw_updata_addr;
|
||||
int fw_updata_len;
|
||||
int fw_dump_state;
|
||||
u8 fw_updata_process;
|
||||
u8 host_cmd_save[16];
|
||||
wait_queue_head_t wait_irq;
|
||||
|
||||
u8 log_level;
|
||||
u8 prox_is_enable;
|
||||
u8 prox_state;
|
||||
|
||||
u8 gesture_is_enable;
|
||||
u8 gesture_id;
|
||||
const void *hyn_fuc_used;
|
||||
#if defined(CONFIG_FB)
|
||||
struct notifier_block fb_notif;
|
||||
int old_fb_state;
|
||||
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
||||
struct early_suspend early_suspend;
|
||||
#endif
|
||||
struct kobject *sys_node;
|
||||
};
|
||||
|
||||
struct hyn_ts_fuc{
|
||||
void (*tp_rest)(void);
|
||||
int (*tp_report)(void);
|
||||
int (*tp_supend)(void);
|
||||
int (*tp_resum)(void);
|
||||
int (*tp_chip_init)(struct hyn_ts_data *ts_data);
|
||||
int (*tp_updata_fw)(u8 *bin_addr, u16 len);
|
||||
int (*tp_set_workmode)(enum work_mode mode,u8 enable);
|
||||
u32 (*tp_check_esd)(void);
|
||||
int (*tp_prox_handle)(u8 cmd);
|
||||
int (*tp_get_dbg_data)(u8 *buf,u16 len);
|
||||
int (*tp_get_test_result)(u8 *buf,u16 len);
|
||||
};
|
||||
|
||||
|
||||
int hyn_write_data(struct hyn_ts_data *ts_data, u8 *buf, u8 reg_len, u16 len);
|
||||
int hyn_read_data(struct hyn_ts_data *ts_data,u8 *buf, u16 len);
|
||||
int hyn_wr_reg(struct hyn_ts_data *ts_data, u32 reg_addr, u8 reg_len, u8 *rbuf, u16 rlen);
|
||||
|
||||
void hyn_irq_set(struct hyn_ts_data *ts_data, u8 value);
|
||||
void hyn_esdcheck_switch(struct hyn_ts_data *ts_data, u8 enable);
|
||||
int copy_for_updata(struct hyn_ts_data *ts_data,u8 *buf,u32 offset,u16 len);
|
||||
int get_word(u8 **sc_str, u8* ds_str);
|
||||
void hyn_set_i2c_addr(struct hyn_ts_data *ts_data,u8 addr);
|
||||
|
||||
int hyn_proc_fs_int(struct hyn_ts_data *ts_data);
|
||||
void hyn_proc_fs_exit(void);
|
||||
int hyn_tool_fs_int(struct hyn_ts_data *ts_data);
|
||||
void hyn_tool_fs_exit(void);
|
||||
|
||||
int hyn_create_sysfs(struct hyn_ts_data *ts_data);
|
||||
void hyn_release_sysfs(struct hyn_ts_data *ts_data);
|
||||
int hyn_gesture_init(struct hyn_ts_data *ts_data);
|
||||
void hyn_gesture_report(struct hyn_ts_data *ts_data);
|
||||
void hyn_gesture_exit(struct hyn_ts_data *ts_data);
|
||||
|
||||
int hyn_proximity_exit(void);
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data);
|
||||
int hyn_proximity_report(u8 proximity_value);
|
||||
|
||||
int hyn_wait_irq_timeout(struct hyn_ts_data *ts_data,int msec);
|
||||
int factory_multitest(struct hyn_ts_data *ts_data ,char *cfg_path, u8 *data,s16 *test_th,u8 test_item);
|
||||
int fac_test_log_save(char *log_name,struct hyn_ts_data *ts_data,s16 *test_data, int test_ret, u8 test_item);
|
||||
int str_2_num(char *str,u8 type);
|
||||
u16 hyn_sum16(int val, u8* buf,u16 len);
|
||||
u32 hyn_sum32(int val, u32* buf,u16 len);
|
||||
|
||||
|
||||
//ic type
|
||||
extern const struct hyn_ts_fuc cst1xx_fuc;
|
||||
extern const struct hyn_ts_fuc cst3xx_fuc;
|
||||
extern const struct hyn_ts_fuc cst66xx_fuc;
|
||||
extern const struct hyn_ts_fuc cst7xx_fuc;
|
||||
extern const struct hyn_ts_fuc cst8xxT_fuc;
|
||||
extern const struct hyn_ts_fuc cst92xx_fuc;
|
||||
extern const struct hyn_ts_fuc cst3240_fuc;
|
||||
|
||||
#endif
|
||||
304
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_fs_node.c
Normal file
304
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_fs_node.c
Normal file
@@ -0,0 +1,304 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
|
||||
static struct hyn_ts_data *hyn_fs_data = NULL;
|
||||
|
||||
//echo fd /sdcard/app.bin
|
||||
//echo w d1 01
|
||||
//echo w d1 01 r 2
|
||||
//echo w 1 2 3 4 5
|
||||
//echo rst
|
||||
#define DEBUG_BUF_SIZE (256)
|
||||
|
||||
static ssize_t hyn_dbg_show(struct device *dev,struct device_attribute *attr,char *buf)
|
||||
{
|
||||
ssize_t len = 0;
|
||||
int ret = -1;
|
||||
u8 *kbuf =NULL;
|
||||
u16 i;
|
||||
HYN_ENTER();
|
||||
mutex_lock(&hyn_fs_data->mutex_fs);
|
||||
kbuf = kzalloc(DEBUG_BUF_SIZE, GFP_KERNEL);
|
||||
|
||||
if(hyn_fs_data->host_cmd_save[0]==0x5A){
|
||||
if(hyn_fs_data->host_cmd_save[1] > 4) hyn_fs_data->host_cmd_save[1] = 4;
|
||||
len = hyn_fs_data->host_cmd_save[6];
|
||||
if(len != 0 && hyn_fs_data->host_cmd_save[1] !=0){
|
||||
u32 reg;
|
||||
reg = hyn_fs_data->host_cmd_save[2];
|
||||
i = 0;
|
||||
while(++i < hyn_fs_data->host_cmd_save[1]){
|
||||
reg <<= 8;
|
||||
reg |= hyn_fs_data->host_cmd_save[2+i];
|
||||
}
|
||||
ret = hyn_wr_reg(hyn_fs_data,reg,hyn_fs_data->host_cmd_save[1],kbuf,(u16)len);
|
||||
}
|
||||
}
|
||||
else if(hyn_fs_data->host_cmd_save[0]==0x7A){
|
||||
len = hyn_fs_data->host_cmd_save[6];
|
||||
ret = hyn_read_data(hyn_fs_data,kbuf,(u16)len);
|
||||
}
|
||||
|
||||
if(ret ==0){
|
||||
ssize_t cnt_char = 0;
|
||||
for(i = 0; i< len; i++){
|
||||
ret = sprintf(buf+cnt_char,"0x%02x ",*(kbuf+i));
|
||||
cnt_char += ret;
|
||||
}
|
||||
buf[cnt_char] = '\n';
|
||||
ret = cnt_char+1;
|
||||
}
|
||||
else{
|
||||
sprintf(buf,"fs read failed\n");
|
||||
ret = 13;
|
||||
}
|
||||
|
||||
if(!IS_ERR_OR_NULL(kbuf)) kfree(kbuf);
|
||||
mutex_unlock(&hyn_fs_data->mutex_fs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t hyn_dbg_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
|
||||
{
|
||||
u16 rec_len;
|
||||
u8 str[128];
|
||||
u8 *next_ptr;
|
||||
int val;
|
||||
const struct hyn_ts_fuc* hyn_fun = hyn_fs_data->hyn_fuc_used;
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
mutex_lock(&hyn_fs_data->mutex_fs);
|
||||
rec_len = strlen(buf);
|
||||
HYN_INFO("rec_len =%d",rec_len);
|
||||
// HYN_INFO("%ddata:0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",(int)count,buf[0], buf[1],buf[2], buf[3],buf[4], buf[5],buf[6],buf[7]);
|
||||
if(rec_len < 1 || rec_len > DEBUG_BUF_SIZE){
|
||||
HYN_INFO("erro write len");
|
||||
goto END;
|
||||
}
|
||||
next_ptr = (u8*)buf;
|
||||
str[0] = '\0';
|
||||
ret = get_word(&next_ptr,str);
|
||||
if(0 == strcmp(str,"fd")){ //updata fw
|
||||
ret = get_word(&next_ptr,str);
|
||||
if(strlen(str)<4){
|
||||
strcpy(str,"/sdcard/app.bin");
|
||||
}
|
||||
HYN_INFO("filename = %s",str);
|
||||
strcpy(hyn_fs_data->fw_file_name,str);
|
||||
ret = hyn_fun->tp_updata_fw(hyn_fs_data->fw_updata_addr,hyn_fs_data->fw_updata_len);
|
||||
// if(0 == hyn_read_fw_file(str, &pdata, &bin_len)){
|
||||
// ret = hyn_fun->tp_updata_fw(pdata,bin_len);
|
||||
// kfree(pdata);
|
||||
// }
|
||||
}
|
||||
else if(0 == strcmp(str,"w")){
|
||||
u8 i = 0;
|
||||
u8 *kbuf = kzalloc(count/2, GFP_KERNEL);
|
||||
hyn_fs_data->host_cmd_save[0] = 0;
|
||||
hyn_fs_data->host_cmd_save[1] = 0xA5;
|
||||
hyn_fs_data->host_cmd_save[6] = 0;
|
||||
while(1){
|
||||
str[0] = '\0';
|
||||
ret = get_word(&next_ptr,str);
|
||||
// next_ptr += ret;
|
||||
HYN_INFO("read =%s ,len =%d",str,(int)strlen(str));
|
||||
if(0 == strcmp(str,"r")){
|
||||
ret = get_word(&next_ptr,str);
|
||||
val = str_2_num(str,16);
|
||||
if(ret < 0x100){
|
||||
hyn_fs_data->host_cmd_save[0] = 0x5A;
|
||||
hyn_fs_data->host_cmd_save[1] = i>4 ? 4:i;
|
||||
hyn_fs_data->host_cmd_save[6] = val;
|
||||
memcpy(&hyn_fs_data->host_cmd_save[2],kbuf,4);
|
||||
i = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(ret == 0 || strlen(str)==0 || strlen(str)>2){
|
||||
break;
|
||||
}
|
||||
val = str_2_num(str,16);
|
||||
if(val > 0xFF) break;
|
||||
*(kbuf+i) = val;
|
||||
HYN_INFO(" %02x",val);
|
||||
i++;
|
||||
}
|
||||
if(i){
|
||||
hyn_write_data(hyn_fs_data,kbuf,2,i);
|
||||
}
|
||||
kfree(kbuf);
|
||||
}
|
||||
else if(0 == strcmp(str,"r")){
|
||||
ret = get_word(&next_ptr,str);
|
||||
val = str_2_num(str,16);
|
||||
if(val < 0x100){
|
||||
hyn_fs_data->host_cmd_save[0] = 0x7A;
|
||||
hyn_fs_data->host_cmd_save[6] = val;
|
||||
}
|
||||
}
|
||||
else if(0 == strcmp(str,"rst")){
|
||||
hyn_fun->tp_rest();
|
||||
}
|
||||
else if(0 == strcmp(str,"log")){
|
||||
ret = get_word(&next_ptr,str);
|
||||
hyn_fs_data->log_level = str[0]-'0';
|
||||
}
|
||||
else if(0 == strcmp(str,"workmode")){
|
||||
ret = get_word(&next_ptr,str);
|
||||
if(ret){
|
||||
char mode = str[0]-'0';
|
||||
ret = get_word(&next_ptr,str);
|
||||
if(ret) hyn_fun->tp_set_workmode(mode,str[0]=='0'? 0:1);
|
||||
}
|
||||
}
|
||||
END:
|
||||
mutex_unlock(&hyn_fs_data->mutex_fs);
|
||||
return count;
|
||||
}
|
||||
|
||||
/////
|
||||
///cat hyntpfwver
|
||||
static ssize_t hyn_tpfwver_show(struct device *dev, struct device_attribute *attr,char *buf)
|
||||
{
|
||||
ssize_t num_read = 0;
|
||||
HYN_ENTER();
|
||||
num_read = snprintf(buf, 128, "fw_version:0x%02X,chip_type:0x%02X,checksum:0x%02X,project_id:%04x\n",
|
||||
hyn_fs_data->hw_info.fw_ver,
|
||||
hyn_fs_data->hw_info.fw_chip_type,
|
||||
hyn_fs_data->hw_info.ic_fw_checksum,
|
||||
hyn_fs_data->hw_info.fw_project_id
|
||||
);
|
||||
return num_read;
|
||||
}
|
||||
|
||||
static ssize_t hyn_tpfwver_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
|
||||
{
|
||||
/*place holder for future use*/
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
///cat hynselftest
|
||||
static ssize_t hyn_selftest_show(struct device *dev, struct device_attribute *attr,char *buf)
|
||||
{
|
||||
ssize_t num_read = 0;
|
||||
u8 *rbuf = NULL;
|
||||
const struct hyn_ts_fuc* hyn_fun = hyn_fs_data->hyn_fuc_used;
|
||||
int ret = 0;
|
||||
int max_len = hyn_fs_data->hw_info.fw_sensor_rxnum*hyn_fs_data->hw_info.fw_sensor_txnum*2
|
||||
+ (hyn_fs_data->hw_info.fw_sensor_rxnum + hyn_fs_data->hw_info.fw_sensor_txnum)*4;
|
||||
HYN_ENTER();
|
||||
max_len = max_len*3;
|
||||
rbuf = kzalloc(max_len, GFP_KERNEL);
|
||||
if(rbuf == NULL){
|
||||
HYN_ERROR("zalloc GFP_KERNEL memory[%d] failed.\n",max_len);
|
||||
return -ENOMEM;
|
||||
}
|
||||
hyn_fun->tp_set_workmode(FAC_TEST_MODE,0);
|
||||
ret = hyn_fun->tp_get_test_result(rbuf,max_len);
|
||||
num_read = snprintf(buf, 128, "module selftest %s ret:%d\r\n",
|
||||
ret==0 ? "pass":"failed", ret);
|
||||
if(!IS_ERR_OR_NULL(rbuf)){
|
||||
kfree(rbuf);
|
||||
}
|
||||
return num_read;
|
||||
}
|
||||
|
||||
static ssize_t hyn_selftest_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
|
||||
{
|
||||
/*place reserver*/
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
//hyndumpfw
|
||||
static ssize_t hyn_dumpfw_show(struct device *dev,struct device_attribute *attr,char *buf)
|
||||
{
|
||||
HYN_ENTER();
|
||||
return (ssize_t)snprintf(buf, 128, "place reserver");
|
||||
}
|
||||
|
||||
static ssize_t hyn_dumpfw_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
|
||||
{
|
||||
u8 str[16]={'\0'};
|
||||
int max_len = hyn_fs_data->fw_updata_len+64;
|
||||
if(count<10){
|
||||
memcpy(str,buf,count);
|
||||
if(str[count-1]==0x0A) str[count-1] = '\0';
|
||||
}
|
||||
// HYN_INFO("state[%d]: %d,%s",(int)count,hyn_fs_data->fw_dump_state,str);
|
||||
if(0 == strcmp(str,"fwstart")){
|
||||
hyn_fs_data->fw_dump_state = 0;
|
||||
hyn_fs_data->fw_updata_addr = vmalloc(max_len);
|
||||
if(hyn_fs_data->fw_updata_addr == NULL){
|
||||
HYN_ERROR("vmalloc memory[%d] failed.\n",max_len);
|
||||
hyn_fs_data->fw_dump_state=-1;
|
||||
return -EPERM;
|
||||
}
|
||||
else{
|
||||
HYN_INFO("vmalloc memory[%d] success",max_len);
|
||||
}
|
||||
}
|
||||
else if(0 == strcmp(str,"fwend")){
|
||||
if(hyn_fs_data->fw_dump_state >= 0){
|
||||
const struct hyn_ts_fuc* hyn_fun = hyn_fs_data->hyn_fuc_used;
|
||||
memset(hyn_fs_data->fw_file_name,0,sizeof(hyn_fs_data->fw_file_name));
|
||||
hyn_fun->tp_updata_fw(hyn_fs_data->fw_updata_addr,hyn_fs_data->fw_updata_len);
|
||||
vfree(hyn_fs_data->fw_updata_addr);
|
||||
}
|
||||
hyn_fs_data->fw_dump_state = -2;
|
||||
}
|
||||
else if(hyn_fs_data->fw_dump_state >=0 && (hyn_fs_data->fw_dump_state + count) < max_len){
|
||||
memcpy(hyn_fs_data->fw_updata_addr+hyn_fs_data->fw_dump_state,buf,count);
|
||||
hyn_fs_data->fw_dump_state += count;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(hyntpfwver, S_IRUGO | S_IWUSR, hyn_tpfwver_show, hyn_tpfwver_store);
|
||||
static DEVICE_ATTR(hyntpdbg, S_IRUGO | S_IWUSR, hyn_dbg_show, hyn_dbg_store);
|
||||
static DEVICE_ATTR(hynselftest, S_IRUGO | S_IWUSR, hyn_selftest_show, hyn_selftest_store);
|
||||
static DEVICE_ATTR(hyndumpfw, S_IRUGO | S_IWUSR, hyn_dumpfw_show, hyn_dumpfw_store);
|
||||
|
||||
static struct attribute *hyn_attributes[] = {
|
||||
&dev_attr_hyndumpfw.attr,
|
||||
&dev_attr_hyntpdbg.attr,
|
||||
&dev_attr_hynselftest.attr,
|
||||
&dev_attr_hyntpfwver.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group hyn_attribute_group = {
|
||||
.attrs = hyn_attributes
|
||||
};
|
||||
|
||||
int hyn_create_sysfs(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
hyn_fs_data = ts_data;
|
||||
hyn_fs_data->fw_dump_state = -1;
|
||||
ts_data->sys_node = kobject_create_and_add("hynitron_debug", NULL);
|
||||
if(IS_ERR_OR_NULL(ts_data->sys_node)){
|
||||
HYN_ERROR("kobject_create_and_add failed");
|
||||
return -1;
|
||||
}
|
||||
ret = sysfs_create_group(ts_data->sys_node, &hyn_attribute_group);
|
||||
if(ret){
|
||||
kobject_put(ts_data->sys_node);
|
||||
return -1;
|
||||
}
|
||||
HYN_INFO("sys_node creat success ,GKI version is [%s]",HYN_GKI_VER ? "enable":"disable");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hyn_release_sysfs(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
if(!IS_ERR_OR_NULL(ts_data->sys_node)){
|
||||
sysfs_remove_group(ts_data->sys_node, &hyn_attribute_group);
|
||||
kobject_put(ts_data->sys_node);
|
||||
ts_data->sys_node = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
|
||||
static const u8 gesture_key[] = {KEY_U,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,
|
||||
KEY_O,KEY_E, KEY_M, KEY_L, KEY_W,
|
||||
KEY_S,KEY_V, KEY_C, KEY_Z, KEY_POWER};
|
||||
|
||||
static struct hyn_ts_data *gesture_data = NULL;
|
||||
|
||||
|
||||
/* sysfs gesture node
|
||||
* read example: cat hyn_gesture_mode ---read gesture mode
|
||||
* write example:echo 01 > hyn_gesture_mode ---write gesture mode to 01
|
||||
*/
|
||||
|
||||
static ssize_t hyn_gesture_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
int count;
|
||||
HYN_ENTER();
|
||||
mutex_lock(&gesture_data->mutex_fs);
|
||||
count = sprintf(buf, "Gesture Mode: %s\n", gesture_data->gesture_is_enable ? "On" : "Off");
|
||||
count += sprintf(buf + count, "Reg = %d\n", gesture_data->gesture_id);
|
||||
mutex_unlock(&gesture_data->mutex_fs);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t hyn_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
HYN_ENTER();
|
||||
mutex_lock(&gesture_data->mutex_fs);
|
||||
if (buf[0]==1){
|
||||
HYN_INFO("[GESTURE]enable gesture");
|
||||
gesture_data->gesture_is_enable= ENABLE;
|
||||
}else if (buf[0]==0){
|
||||
HYN_INFO("[GESTURE]disable gesture");
|
||||
gesture_data->gesture_is_enable = DISABLE;
|
||||
}
|
||||
mutex_unlock(&gesture_data->mutex_fs);
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR (hyn_gesture_mode, S_IRUGO|S_IWUSR, hyn_gesture_show, hyn_gesture_store);
|
||||
static struct attribute *hyn_gesture_mode_attrs[] =
|
||||
{
|
||||
&dev_attr_hyn_gesture_mode.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group hyn_gesture_group =
|
||||
{
|
||||
.attrs = hyn_gesture_mode_attrs,
|
||||
};
|
||||
|
||||
int hyn_gesture_init(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
u8 i;
|
||||
int ret = -1;
|
||||
struct input_dev *dev = ts_data->input_dev;
|
||||
HYN_ENTER();
|
||||
gesture_data = ts_data;
|
||||
for(i = 0; i< sizeof(gesture_key); i++){
|
||||
input_set_capability(dev, EV_KEY, gesture_key[i]);
|
||||
__set_bit(gesture_key[i], dev->keybit);
|
||||
}
|
||||
|
||||
ts_data->gesture_id = 0xFF;
|
||||
ts_data->gesture_is_enable = ENABLE;
|
||||
|
||||
ret = sysfs_create_group(&ts_data->dev->kobj, &hyn_gesture_group);
|
||||
if(ret){
|
||||
HYN_ERROR("ges_sys_node creat failed");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void hyn_gesture_report(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
struct input_dev *dev = ts_data->input_dev;//ges_input_dev;//ts_data->input_dev;
|
||||
if(ts_data->gesture_id < sizeof(gesture_key)){
|
||||
input_report_key(dev, gesture_key[ts_data->gesture_id], 1);
|
||||
input_sync(dev);
|
||||
input_report_key(dev, gesture_key[ts_data->gesture_id], 0);
|
||||
input_sync(dev);
|
||||
HYN_INFO("fw gesture idx:%d key value:%d",ts_data->gesture_id,gesture_key[ts_data->gesture_id]);
|
||||
}
|
||||
}
|
||||
|
||||
void hyn_gesture_exit(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
sysfs_remove_group(&ts_data->dev->kobj, &hyn_gesture_group);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
227
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_i2c.c
Normal file
227
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_i2c.c
Normal file
@@ -0,0 +1,227 @@
|
||||
#include "../hyn_core.h"
|
||||
|
||||
#ifdef I2C_PORT
|
||||
|
||||
#if (I2C_USE_DMA==1)
|
||||
|
||||
int hyn_read_data(struct hyn_ts_data *ts_data,u8 *buf, u16 len)
|
||||
{
|
||||
int ret = -1;
|
||||
struct i2c_msg i2c_msg;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
i2c_msg.addr = ts_data->client->addr;
|
||||
i2c_msg.flags = I2C_M_RD;
|
||||
while(len){
|
||||
if(len > HYN_TRANSFER_LIMIT_LEN){
|
||||
i2c_msg.len = HYN_TRANSFER_LIMIT_LEN;
|
||||
i2c_msg.buf = buf;
|
||||
len -= HYN_TRANSFER_LIMIT_LEN;
|
||||
buf += HYN_TRANSFER_LIMIT_LEN;
|
||||
}
|
||||
else{
|
||||
i2c_msg.len = len;
|
||||
i2c_msg.buf = buf;
|
||||
len = 0;
|
||||
}
|
||||
ret = i2c_transfer(ts_data->client->adapter, &i2c_msg, 1);
|
||||
if (ret < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
int hyn_write_data(struct hyn_ts_data *ts_data, u8 *buf, u8 reg_len, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
struct i2c_msg i2c_msg;
|
||||
u8 cmd_len = reg_len&0x0F;
|
||||
if(cmd_len > 4) return -1;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
i2c_msg.addr = ts_data->client->addr;
|
||||
i2c_msg.flags = 0;
|
||||
#if HYN_TRANSFER_LIMIT_LEN < 1048
|
||||
if(len > HYN_TRANSFER_LIMIT_LEN){
|
||||
u32 reg = U8TO32(buf[0],buf[1],buf[2],buf[3])>>((4-cmd_len)*8);
|
||||
u8 w_buf[HYN_TRANSFER_LIMIT_LEN],i;
|
||||
u16 step = HYN_TRANSFER_LIMIT_LEN-cmd_len;
|
||||
buf += cmd_len;
|
||||
len -= cmd_len;
|
||||
while(len){
|
||||
i = cmd_len;
|
||||
while(i--){
|
||||
w_buf[cmd_len-1-i] = reg>>(i*8);
|
||||
}
|
||||
memcpy(&w_buf[cmd_len],buf,step);
|
||||
if(0==(reg_len&0x80)){
|
||||
reg += step;
|
||||
}
|
||||
else{
|
||||
reg = (reg&0xffff0000)|((reg>>8)&0xff)|((reg<<8)&0xff00);
|
||||
reg += step;
|
||||
reg = (reg&0xffff0000)|((reg>>8)&0xff)|((reg<<8)&0xff00);
|
||||
}
|
||||
buf += step;
|
||||
if(len > step){
|
||||
i2c_msg.len = HYN_TRANSFER_LIMIT_LEN;
|
||||
len -= step;
|
||||
}
|
||||
else{
|
||||
i2c_msg.len = len+cmd_len;
|
||||
len = 0;
|
||||
}
|
||||
i2c_msg.buf = w_buf;
|
||||
ret = i2c_transfer(ts_data->client->adapter, &i2c_msg, 1);
|
||||
if(ret < 0) break;
|
||||
}
|
||||
}else
|
||||
#endif
|
||||
{
|
||||
i2c_msg.addr = ts_data->client->addr;
|
||||
i2c_msg.flags = 0;
|
||||
i2c_msg.len = len;
|
||||
i2c_msg.buf = buf;
|
||||
ret = i2c_transfer(ts_data->client->adapter, &i2c_msg, 1);
|
||||
}
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
int hyn_wr_reg(struct hyn_ts_data *ts_data, u32 reg_addr, u8 reg_len, u8 *rbuf, u16 rlen)
|
||||
{
|
||||
int ret = 0,i=0;
|
||||
struct i2c_msg i2c_msg[2];
|
||||
u8 wbuf[4];
|
||||
u8 cmd_len = reg_len&0x0F;
|
||||
if(cmd_len==0 || cmd_len > 4) return -1;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
|
||||
i2c_msg[0].addr = ts_data->client->addr;
|
||||
i2c_msg[0].flags = 0;
|
||||
i2c_msg[0].len = cmd_len;
|
||||
i2c_msg[0].buf = wbuf;
|
||||
i2c_msg[1].addr = ts_data->client->addr;
|
||||
i2c_msg[1].flags = I2C_M_RD;
|
||||
do{
|
||||
i = cmd_len-1;
|
||||
do{
|
||||
wbuf[cmd_len-1-i] = reg_addr>>(i*8);
|
||||
}while(i--);
|
||||
i2c_msg[1].buf = rbuf;
|
||||
i2c_msg[1].len = rlen < HYN_TRANSFER_LIMIT_LEN ? rlen : HYN_TRANSFER_LIMIT_LEN;
|
||||
ret = i2c_transfer(ts_data->client->adapter, i2c_msg, rlen==0 ? 1:2);
|
||||
if(ret < 0) break;
|
||||
if(rlen > HYN_TRANSFER_LIMIT_LEN){
|
||||
rbuf += HYN_TRANSFER_LIMIT_LEN;
|
||||
rlen -= HYN_TRANSFER_LIMIT_LEN;
|
||||
if(0==(reg_len&0x80)){
|
||||
reg_addr += HYN_TRANSFER_LIMIT_LEN;
|
||||
}
|
||||
else{
|
||||
reg_addr = (reg_addr&0xffff0000)|((reg_addr>>8)&0xff)|((reg_addr<<8)&0xff00);
|
||||
reg_addr += HYN_TRANSFER_LIMIT_LEN;
|
||||
reg_addr = (reg_addr&0xffff0000)|((reg_addr>>8)&0xff)|((reg_addr<<8)&0xff00);
|
||||
}
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}while(1);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
#elif (I2C_USE_DMA==2)
|
||||
|
||||
int hyn_write_data(struct hyn_ts_data *ts_data, u8 *buf, u8 reg_len, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
ts_data->client->addr = ((ts_data->client->addr & I2C_MASK_FLAG) | I2C_DMA_FLAG);
|
||||
memcpy(ts_data->dma_buff_va,buf, len);
|
||||
ret = i2c_master_send(ts_data->client, (u8 *)ts_data->dma_buff_pa, len);
|
||||
ts_data->client->addr = ts_data->client->addr& I2C_MASK_FLAG & (~I2C_DMA_FLAG);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
int hyn_read_data(struct hyn_ts_data *ts_data,u8 *buf, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
ts_data->client->addr = ((ts_data->client->addr & I2C_MASK_FLAG) | I2C_DMA_FLAG);
|
||||
ret = i2c_master_recv(ts_data->client, (u8 *)ts_data->dma_buff_pa, len);
|
||||
memcpy(buf, ts_data->dma_buff_va, len);
|
||||
ts_data->client->addr = ts_data->client->addr& I2C_MASK_FLAG & (~I2C_DMA_FLAG);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
int hyn_wr_reg(struct hyn_ts_data *ts_data, u32 reg_addr, u8 reg_len, u8 *rbuf, u16 rlen)
|
||||
{
|
||||
int ret = 0,i=0;
|
||||
u8 wbuf[4];
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
reg_len = reg_len&0x0F;
|
||||
memset(wbuf,0,sizeof(wbuf));
|
||||
i = reg_len;
|
||||
while(i){
|
||||
i--;
|
||||
wbuf[i] = reg_addr;
|
||||
reg_addr >>= 8;
|
||||
}
|
||||
ts_data->client->addr = ((ts_data->client->addr & I2C_MASK_FLAG) | I2C_DMA_FLAG);
|
||||
memcpy(ts_data->dma_buff_va,wbuf, reg_len);
|
||||
ret = i2c_master_send(ts_data->client, (u8 *)ts_data->dma_buff_pa, reg_len);
|
||||
if(rlen){
|
||||
ret |= i2c_master_recv(ts_data->client, (u8 *)ts_data->dma_buff_pa, rlen);
|
||||
memcpy(rbuf, ts_data->dma_buff_va, rlen);
|
||||
}
|
||||
ts_data->client->addr = ts_data->client->addr& I2C_MASK_FLAG & (~I2C_DMA_FLAG);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
#else //0
|
||||
int hyn_write_data(struct hyn_ts_data *ts_data, u8 *buf, u8 reg_len, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
ret = i2c_master_send(ts_data->client, buf, len);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
int hyn_read_data(struct hyn_ts_data *ts_data,u8 *buf, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
ret = i2c_master_recv(ts_data->client, buf, len);
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
int hyn_wr_reg(struct hyn_ts_data *ts_data, u32 reg_addr, u8 reg_len, u8 *rbuf, u16 rlen)
|
||||
{
|
||||
int ret = 0,i=0;
|
||||
u8 wbuf[4];
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
reg_len = reg_len&0x0F;
|
||||
memset(wbuf,0,sizeof(wbuf));
|
||||
i = reg_len;
|
||||
while(i){
|
||||
i--;
|
||||
wbuf[i] = reg_addr;
|
||||
reg_addr >>= 8;
|
||||
}
|
||||
ret = i2c_master_send(ts_data->client, wbuf, reg_len);
|
||||
if(rlen){
|
||||
ret |= i2c_master_recv(ts_data->client, rbuf, rlen);
|
||||
}
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? -1:0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
371
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_prox.c
Normal file
371
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_prox.c
Normal file
@@ -0,0 +1,371 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
|
||||
static struct hyn_ts_data *hyn_prox_data = NULL;
|
||||
static const struct hyn_ts_fuc* hyn_prox_fun = NULL;
|
||||
|
||||
#if (HYN_PROX_TYEP==4) //Spread
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
#define CTP_IOCTL_MAGIC 0x13
|
||||
#define CTP_IOCTL_PROX_ON _IOW(CTP_IOCTL_MAGIC, 1, int)
|
||||
#define CTP_IOCTL_PROX_OFF _IOW(CTP_IOCTL_MAGIC, 2, int)
|
||||
#define CTP_PROXIMITY_DEVICE_NAME "ltr_558als" //match HAL name
|
||||
|
||||
static long hyn_ioctl_operate(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
HYN_INFO("prox_ioctl_operate %d!\n", cmd);
|
||||
switch(cmd)
|
||||
{
|
||||
case CTP_IOCTL_PROX_ON:
|
||||
hyn_prox_fun->tp_prox_handle(1);
|
||||
break;
|
||||
case CTP_IOCTL_PROX_OFF:
|
||||
hyn_prox_fun->tp_prox_handle(0);
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("%s: invalid cmd %d\n", __func__, _IOC_NR(cmd));
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct file_operations hyn_proximity_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = NULL,
|
||||
.release = NULL,
|
||||
.unlocked_ioctl = hyn_ioctl_operate
|
||||
};
|
||||
|
||||
struct miscdevice hyn_proximity_misc = {
|
||||
.minor = MISC_DYNAMIC_MINOR,
|
||||
.name = CTP_PROXIMITY_DEVICE_NAME, //match the hal's name
|
||||
.fops = &hyn_proximity_fops,
|
||||
.mode = 0x666,
|
||||
};
|
||||
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
HYN_ENTER();
|
||||
int ret;
|
||||
hyn_prox_data = ts_data;
|
||||
hyn_prox_fun = ts_data->hyn_fuc_used;
|
||||
hyn_prox_data->prox_is_enable = 0;
|
||||
ret = misc_register(&hyn_proximity_misc);
|
||||
if (ret < 0){
|
||||
HYN_ERROR("%s: could not register misc device\n", __func__);
|
||||
goto misc_device_failed;
|
||||
}
|
||||
input_set_abs_params(hyn_prox_data->input_dev, ABS_DISTANCE, 0, 1, 0, 0);
|
||||
return 0;
|
||||
misc_device_failed:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_report(u8 proximity_value)
|
||||
{
|
||||
HYN_ENTER();
|
||||
input_report_abs(hyn_prox_data->input_dev, ABS_DISTANCE, proximity_value);
|
||||
input_mt_sync(hyn_prox_data->input_dev);
|
||||
input_sync(hyn_prox_data->input_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hyn_proximity_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
misc_deregister(&hyn_proximity_misc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif (HYN_PROX_TYEP==3) //alps sensor
|
||||
#include <hwmsensor.h>
|
||||
//#include <hwmsen_dev.h>
|
||||
#include <sensors_io.h>
|
||||
#include <alsps.h>
|
||||
|
||||
static int ps_open_report_data(int open)
|
||||
{
|
||||
/* should queue work to report event if is_report_input_direct=true */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if use this type of enable , Psensor only enabled but not report inputEvent to HAL */
|
||||
static int ps_enable_nodata(int en)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_INFO("[PROXIMITY]SENSOR_ENABLE value = %d", en);
|
||||
/* Enable proximity */
|
||||
ret = hyn_prox_fun->tp_prox_handle(en);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ps_set_delay(u64 ns)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ps_flush(void)
|
||||
{
|
||||
return ps_flush_report();
|
||||
}
|
||||
|
||||
static int ps_batch(int flag, int64_t samplingPeriodNs, int64_t maxBatchReportLatencyNs)
|
||||
{
|
||||
int value = 0;
|
||||
|
||||
value = (int)samplingPeriodNs / 1000 / 1000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ps_get_data(int *value, int *status)
|
||||
{
|
||||
*value = (int)hyn_prox_data->prox_state;
|
||||
HYN_INFO("fts_proximity_data.detect = %d\n", *value);
|
||||
*status = SENSOR_STATUS_ACCURACY_MEDIUM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ps_local_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
struct ps_control_path ps_ctl = { 0 };
|
||||
struct ps_data_path ps_data = { 0 };
|
||||
HYN_ENTER();
|
||||
ps_ctl.is_use_common_factory = false;
|
||||
ps_ctl.open_report_data = ps_open_report_data;
|
||||
ps_ctl.enable_nodata = ps_enable_nodata;
|
||||
ps_ctl.batch = ps_batch;
|
||||
ps_ctl.flush = ps_flush;
|
||||
ps_ctl.set_delay = ps_set_delay;
|
||||
ps_ctl.is_report_input_direct = true;
|
||||
ps_ctl.is_support_batch = false;
|
||||
|
||||
err = ps_register_control_path(&ps_ctl);
|
||||
HYN_INFO("psregister control_path %s = %d\n",err? "fail":"success", err);
|
||||
|
||||
ps_data.get_data = ps_get_data;
|
||||
ps_data.vender_div = 100;
|
||||
err = ps_register_data_path(&ps_data);
|
||||
HYN_INFO("psregister data_path %s = %d\n",err? "fail":"success", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
// int ps_local_uninit(void)
|
||||
// {
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// struct alsps_init_info ps_init_info = {
|
||||
// .name = "hyn_ts",
|
||||
// .init = ps_local_init,
|
||||
// .uninit = ps_local_uninit,
|
||||
// };
|
||||
|
||||
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
hyn_prox_data = ts_data;
|
||||
hyn_prox_fun = ts_data->hyn_fuc_used;
|
||||
hyn_prox_data->prox_is_enable = 0;
|
||||
hyn_prox_data->prox_state = PS_FAR_AWAY;
|
||||
// alsps_driver_add(&ps_init_info);
|
||||
ps_local_init();
|
||||
HYN_INFO("hyn_proximity_int exit");
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_report(u8 proximity_value)
|
||||
{
|
||||
int ret;
|
||||
ret = ps_report_interrupt_data(proximity_value);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif (HYN_PROX_TYEP==2)//mtk sensor
|
||||
|
||||
#include <hwmsensor.h>
|
||||
#include <hwmsen_dev.h>
|
||||
#include <sensors_io.h>
|
||||
|
||||
#define SENSOR_DELAY 0
|
||||
#define SENSOR_ENABLE 0
|
||||
#define SENSOR_GET_DATA 0
|
||||
#define SENSOR_STATUS_ACCURACY_MEDIUM 0
|
||||
|
||||
struct hwmsen_object obj_ps;
|
||||
|
||||
static int hyn_proximiy_operate(void* self, uint32_t command, void* buff_in, int size_in,
|
||||
void* buff_out, int size_out, int* actualout)
|
||||
{
|
||||
int err = 0,value;
|
||||
HYN_INFO("prox command = 0x%02X\n", command);
|
||||
switch (command)
|
||||
{
|
||||
case SENSOR_DELAY:
|
||||
if((buff_in == NULL) || (size_in < sizeof(int))){
|
||||
HYN_ERROR("Set delay parameter error!\n");
|
||||
err = -EINVAL;
|
||||
}
|
||||
// Do nothing
|
||||
break;
|
||||
|
||||
case SENSOR_ENABLE:
|
||||
if((buff_in == NULL) || (size_in < sizeof(int))){
|
||||
HYN_ERROR("Enable sensor parameter error!\n");
|
||||
err = -EINVAL;
|
||||
}else{
|
||||
value = *(int *)buff_in;
|
||||
hyn_prox_fun->tp_prox_handle(value > 0 ? 1 : 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case SENSOR_GET_DATA:
|
||||
if((buff_out == NULL)){
|
||||
HYN_ERROR("get sensor data parameter error!\n");
|
||||
err = -EINVAL;
|
||||
}else{
|
||||
hyn_proximity_report(hyn_prox_data->prox_state);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
HYN_ERROR("proxmy sensor operate function no this parameter %d!\n", command);
|
||||
err = -1;
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
HYN_ENTER();
|
||||
int ret;
|
||||
hyn_prox_data = ts_data;
|
||||
hyn_prox_fun = ts_data->hyn_fuc_used;
|
||||
hyn_prox_data->prox_is_enable = 0;
|
||||
obj_ps.polling = 0;//interrupt mode
|
||||
obj_ps.sensor_operate = hyn_proximiy_operate;
|
||||
ret = hwmsen_attach(ID_PROXIMITY, &obj_ps);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_report(u8 proximity_value)
|
||||
{
|
||||
HYN_ENTER();
|
||||
int ret=0;
|
||||
struct hwm_sensor_data sensor_data;
|
||||
sensor_data.values[0] = proximity_value;
|
||||
sensor_data.value_divide = 1;
|
||||
sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM;
|
||||
ret = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data);
|
||||
if (ret){
|
||||
HYN_ERROR(" proxi call hwmsen_get_interrupt_data failed= %d\n", err);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif (HYN_PROX_TYEP==1)//default sensor
|
||||
|
||||
static ssize_t hyn_prox_show(struct device *dev,struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "proximity is %s value:%d\n",hyn_prox_data->prox_is_enable ? "enable":"disable" ,hyn_prox_data->prox_state);
|
||||
}
|
||||
|
||||
/* Allow users to enable/disable prox */
|
||||
static ssize_t hyn_prox_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)
|
||||
{
|
||||
unsigned long enable;
|
||||
enable = simple_strtoul(buf, NULL, 10);
|
||||
hyn_prox_fun->tp_prox_handle(enable > 0 ? 1 : 0);
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR (hyn_prox_enable, S_IRUGO|S_IWUSR, hyn_prox_show, hyn_prox_store);
|
||||
static struct attribute *hyn_prox_enable_attrs[] =
|
||||
{
|
||||
&dev_attr_hyn_prox_enable.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group hyn_prox_group =
|
||||
{
|
||||
.attrs = hyn_prox_enable_attrs,
|
||||
};
|
||||
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
HYN_ENTER();
|
||||
int ret;
|
||||
hyn_prox_data = ts_data;
|
||||
hyn_prox_fun = ts_data->hyn_fuc_used;
|
||||
hyn_prox_data->prox_is_enable = 0;
|
||||
__set_bit(KEY_SLEEP, hyn_prox_data->input_dev->evbit);
|
||||
__set_bit(KEY_WAKEUP, hyn_prox_data->input_dev->evbit);
|
||||
|
||||
ret = sysfs_create_group(&ts_data->dev->kobj, &hyn_prox_group);
|
||||
if(ret){
|
||||
HYN_ERROR("prox_sys_node creat failed");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_proximity_report(u8 proximity_value)
|
||||
{
|
||||
HYN_ENTER();
|
||||
int keycode = proximity_value ? KEY_SLEEP:KEY_WAKEUP;
|
||||
input_report_key(hyn_prox_data->input_dev, keycode, 1);
|
||||
input_sync(hyn_prox_data->input_dev);
|
||||
input_report_key(hyn_prox_data->input_dev, keycode, 0);
|
||||
input_sync(hyn_prox_data->input_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hyn_proximity_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
sysfs_remove_group(&hyn_prox_data->dev->kobj, &hyn_prox_group);
|
||||
return 0;
|
||||
}
|
||||
#elif (HYN_PROX_TYEP==0)
|
||||
int hyn_proximity_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
HYN_ENTER();
|
||||
hyn_prox_data = ts_data;
|
||||
hyn_prox_fun = ts_data->hyn_fuc_used;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hyn_proximity_report(u8 proximity_value)
|
||||
{
|
||||
HYN_ENTER();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hyn_proximity_exit(void)
|
||||
{
|
||||
HYN_ENTER();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
86
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_spi.c
Normal file
86
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_spi.c
Normal file
@@ -0,0 +1,86 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
|
||||
#ifndef I2C_PORT
|
||||
|
||||
int hyn_write_data(struct hyn_ts_data *ts_data, u8 *buf, u8 reg_len, u16 len)
|
||||
{
|
||||
struct spi_message msg;
|
||||
struct spi_transfer transfer[1] = { {0} };
|
||||
int ret;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
|
||||
spi_message_init(&msg);
|
||||
transfer[0].len = len;
|
||||
transfer[0].delay_usecs = SPI_DELAY_CS;
|
||||
transfer[0].tx_buf = buf;
|
||||
transfer[0].rx_buf = NULL;
|
||||
spi_message_add_tail(&transfer[0], &msg);
|
||||
ret = spi_sync(ts_data->client, &msg);
|
||||
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? ret:0;
|
||||
}
|
||||
|
||||
int hyn_read_data(struct hyn_ts_data *ts_data,u8 *buf, u16 len)
|
||||
{
|
||||
struct spi_message msg;
|
||||
struct spi_transfer transfer[1] = { {0} };
|
||||
int ret;
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
|
||||
spi_message_init(&msg);
|
||||
transfer[0].len = len;
|
||||
transfer[0].delay_usecs = SPI_DELAY_CS;
|
||||
transfer[0].tx_buf = NULL;
|
||||
transfer[0].rx_buf = buf;
|
||||
spi_message_add_tail(&transfer[0], &msg);
|
||||
ret = spi_sync(ts_data->client, &msg);
|
||||
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret < 0 ? ret:0;
|
||||
}
|
||||
|
||||
int hyn_wr_reg(struct hyn_ts_data *ts_data, u32 reg_addr, u8 reg_len, u8 *rbuf, u16 rlen)
|
||||
{
|
||||
int ret = 0,i=0;
|
||||
struct spi_message msg;
|
||||
struct spi_transfer transfer[2] = { {0}, {0} };
|
||||
u8 cmd[4];
|
||||
mutex_lock(&ts_data->mutex_bus);
|
||||
reg_len = reg_len&0x0F;
|
||||
memset(cmd,0,sizeof(cmd));
|
||||
i = reg_len;
|
||||
while(i){
|
||||
i--;
|
||||
cmd[i] = reg_addr;
|
||||
reg_addr >>= 8;
|
||||
}
|
||||
spi_message_init(&msg);
|
||||
transfer[0].len = reg_len;
|
||||
transfer[0].tx_buf = cmd;
|
||||
transfer[0].rx_buf = NULL;
|
||||
spi_message_add_tail(&transfer[0], &msg);
|
||||
ret = spi_sync(ts_data->client, &msg);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (rlen > 0) {
|
||||
spi_message_init(&msg);
|
||||
transfer[1].len = rlen;
|
||||
transfer[1].delay_usecs = SPI_DELAY_CS;
|
||||
transfer[1].tx_buf = NULL;
|
||||
transfer[1].rx_buf = rbuf;
|
||||
spi_message_add_tail(&transfer[1], &msg);
|
||||
ret = spi_sync(ts_data->client, &msg);
|
||||
}
|
||||
|
||||
mutex_unlock(&ts_data->mutex_bus);
|
||||
|
||||
return ret < 0 ? ret:0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
196
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_tool.c
Normal file
196
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_tool.c
Normal file
@@ -0,0 +1,196 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
|
||||
#if HYN_APK_DEBUG_EN
|
||||
|
||||
#define HYN_PROC_DIR_NAME "hyn_apk_tool"
|
||||
#define HYN_PROC_NODE_NAME "fops_nod"
|
||||
|
||||
static struct hyn_ts_data *hyn_tool_data = NULL;
|
||||
static const struct hyn_ts_fuc* hyn_tool_fun = NULL;
|
||||
|
||||
static struct proc_dir_entry *g_tool_dir = NULL;
|
||||
static struct proc_dir_entry *g_tool_node = NULL;
|
||||
|
||||
#define READ_TPINF (0x0A)
|
||||
#define WRITE_IIC (0x1A) //len
|
||||
#define READ_REG (0x2A)
|
||||
#define READ_IIC (0x3A)
|
||||
#define SET_WORK_MODE (0x7A)
|
||||
#define RESET_IC (0xCA)
|
||||
#define UPDATA_FW (0xAC)
|
||||
|
||||
|
||||
// #undef HYN_INFO
|
||||
// #define HYN_INFO(...)
|
||||
|
||||
static ssize_t hyn_proc_tool_read(struct file *page,char __user *user_buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
unsigned char *buf = NULL;
|
||||
int ret_len = 0,ret = 0;
|
||||
int mt_total_len = hyn_tool_data->hw_info.fw_sensor_rxnum*hyn_tool_data->hw_info.fw_sensor_txnum*2
|
||||
+ (hyn_tool_data->hw_info.fw_sensor_rxnum + hyn_tool_data->hw_info.fw_sensor_txnum)*2;
|
||||
u8 *cmd = hyn_tool_data->host_cmd_save;
|
||||
mutex_lock(&hyn_tool_data->mutex_fs);
|
||||
|
||||
if(*f_pos != 0){
|
||||
goto tool_read_end;
|
||||
}
|
||||
ret_len = (mt_total_len + sizeof(struct ts_frame))*2;
|
||||
if(ret_len > count){
|
||||
ret_len = count;
|
||||
}
|
||||
if(hyn_tool_data->work_mode == FAC_TEST_MODE){
|
||||
ret_len += mt_total_len;
|
||||
}
|
||||
buf = kzalloc(ret_len, GFP_KERNEL);
|
||||
// buf = kzalloc(ret_len, GFP_KERNEL);
|
||||
if(buf == NULL){
|
||||
HYN_ERROR("zalloc GFP_KERNEL memory failed.\n");
|
||||
goto tool_read_end;
|
||||
}
|
||||
if(DIFF_MODE <= hyn_tool_data->work_mode && FAC_TEST_MODE >= hyn_tool_data->work_mode){
|
||||
wait_event_interruptible_timeout(hyn_tool_data->wait_irq,(atomic_read(&hyn_tool_data->hyn_irq_flg)==1),msecs_to_jiffies(500)); //
|
||||
atomic_set(&hyn_tool_data->hyn_irq_flg,0);
|
||||
if(hyn_tool_data->work_mode == FAC_TEST_MODE){
|
||||
if(NULL != hyn_tool_fun->tp_get_test_result){
|
||||
u8 restut[4];
|
||||
if(buf == NULL){
|
||||
HYN_ERROR("zalloc GFP_KERNEL memory failed.\n");
|
||||
goto tool_read_end;
|
||||
}
|
||||
*(int*)&restut = hyn_tool_fun->tp_get_test_result(buf,ret_len);
|
||||
HYN_INFO("test ret = %d",ret);
|
||||
ret = copy_to_user(user_buf,restut,4);
|
||||
ret = copy_to_user(user_buf+4,buf,count-4);
|
||||
}
|
||||
}
|
||||
else{
|
||||
ret_len = hyn_tool_fun->tp_get_dbg_data(buf,count);
|
||||
if(ret_len > 0)
|
||||
ret = copy_to_user(user_buf,buf,ret_len);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(cmd[0] == READ_REG){ //0:head 1~4:reg 5:reg_len 6~7:read_len
|
||||
u32 reg_addr = U8TO32(cmd[4],cmd[3],cmd[2],cmd[1]); //eg (read A1 A2 len 256):2A 00 00 A1 A2 02 FF 00
|
||||
ret = hyn_wr_reg(hyn_tool_data,reg_addr,cmd[5],buf,count);
|
||||
ret |= copy_to_user(user_buf,buf,count);
|
||||
}
|
||||
else if(cmd[0] == READ_IIC){ //0:head 1~2:read_len
|
||||
ret = hyn_read_data(hyn_tool_data,buf,count);
|
||||
ret |= copy_to_user(user_buf,buf,count);
|
||||
}
|
||||
else if(cmd[0] == READ_TPINF){
|
||||
ret_len = sizeof(hyn_tool_data->hw_info);
|
||||
ret = copy_to_user(user_buf,&hyn_tool_data->hw_info,ret_len);
|
||||
}
|
||||
else if(cmd[0] == UPDATA_FW){
|
||||
ret_len = sizeof(hyn_tool_data->fw_updata_process);
|
||||
ret = copy_to_user(user_buf,&hyn_tool_data->fw_updata_process,ret_len);
|
||||
msleep(1);
|
||||
}
|
||||
}
|
||||
tool_read_end:
|
||||
if(!IS_ERR_OR_NULL(buf)){
|
||||
kfree(buf);
|
||||
}
|
||||
mutex_unlock(&hyn_tool_data->mutex_fs);
|
||||
// HYN_INFO("count = %d copy len = %d ret = %d\r\n",(int)count,ret_len,ret);
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t hyn_proc_tool_write(struct file *file, const char __user *buffer,size_t count, loff_t *data)
|
||||
{
|
||||
u8 *cmd = NULL;
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
mutex_lock(&hyn_tool_data->mutex_fs);
|
||||
#define MAX_W_SIZE (1024+8)
|
||||
if(count > MAX_W_SIZE){
|
||||
ret = -1;
|
||||
HYN_ERROR("count > MAX_W_SIZE\n");
|
||||
goto ERRO_WEND;
|
||||
}
|
||||
cmd = kzalloc(count, GFP_KERNEL);
|
||||
if(IS_ERR_OR_NULL(cmd)){
|
||||
ret = -1;
|
||||
HYN_ERROR("kzalloc failed\n");
|
||||
goto ERRO_WEND;
|
||||
}
|
||||
if(copy_from_user(cmd, buffer, count)){
|
||||
ret = -1;
|
||||
HYN_ERROR("copy data from user space failed.\n");
|
||||
goto ERRO_WEND;
|
||||
}
|
||||
memcpy(hyn_tool_data->host_cmd_save,cmd,count <sizeof(hyn_tool_data->host_cmd_save) ? count:sizeof(hyn_tool_data->host_cmd_save));
|
||||
HYN_INFO("cmd:0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x***len:%d ", cmd[0], cmd[1],cmd[2], cmd[3],cmd[4], cmd[5],cmd[6], cmd[7],(u16)count);
|
||||
|
||||
switch(cmd[0]){
|
||||
case UPDATA_FW: // apk download bin
|
||||
HYN_INFO("updata file_name =%s",&cmd[1]);
|
||||
strcpy(hyn_tool_data->fw_file_name,&cmd[1]);
|
||||
hyn_tool_data->fw_updata_process = 0;
|
||||
if(0==queue_work(hyn_tool_data->hyn_workqueue,&hyn_tool_data->work_updata_fw)){
|
||||
HYN_ERROR("queue_work work_updata_fw failed");
|
||||
}
|
||||
break;
|
||||
case SET_WORK_MODE://
|
||||
atomic_set(&hyn_tool_data->hyn_irq_flg,0);
|
||||
ret = hyn_tool_fun->tp_set_workmode(cmd[1],0);
|
||||
break;
|
||||
case RESET_IC:
|
||||
hyn_tool_fun->tp_rest();
|
||||
break;
|
||||
case WRITE_IIC: //
|
||||
ret = hyn_write_data(hyn_tool_data,&cmd[1],2,count-1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ERRO_WEND:
|
||||
if(!IS_ERR_OR_NULL(cmd)){
|
||||
kfree(cmd);
|
||||
}
|
||||
mutex_unlock(&hyn_tool_data->mutex_fs);
|
||||
return ret == 0 ? count:-1;
|
||||
}
|
||||
|
||||
static const struct file_operations proc_tool_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = hyn_proc_tool_read,
|
||||
.write = hyn_proc_tool_write,
|
||||
};
|
||||
|
||||
int hyn_tool_fs_int(struct hyn_ts_data *ts_data)
|
||||
{
|
||||
hyn_tool_data = ts_data;
|
||||
hyn_tool_fun = ts_data->hyn_fuc_used;
|
||||
g_tool_dir = proc_mkdir(HYN_PROC_DIR_NAME, NULL);
|
||||
if (IS_ERR_OR_NULL(g_tool_dir)){
|
||||
HYN_INFO("proc_mkdir %s failed.\n",HYN_PROC_DIR_NAME);
|
||||
return -1;
|
||||
}
|
||||
g_tool_node = proc_create_data(HYN_PROC_NODE_NAME, 0777 | S_IFREG, g_tool_dir, (void *)&proc_tool_fops, (void *)ts_data->client);
|
||||
//proc_create(HYN_PROC_NODE_NAME, 0777|S_IFREG, g_tool_dir, &proc_tool_fops);
|
||||
if (IS_ERR_OR_NULL(g_tool_node)) {
|
||||
HYN_INFO("proc_create %s failed.\n",HYN_PROC_NODE_NAME);
|
||||
remove_proc_entry(HYN_PROC_DIR_NAME, NULL);
|
||||
return -ENOMEM;
|
||||
}
|
||||
HYN_INFO("apk node creat success");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hyn_tool_fs_exit(void)
|
||||
{
|
||||
if(!IS_ERR_OR_NULL(g_tool_node)){
|
||||
remove_proc_entry(HYN_PROC_NODE_NAME, g_tool_dir);
|
||||
}
|
||||
if(!IS_ERR_OR_NULL(g_tool_dir)){
|
||||
remove_proc_entry(HYN_PROC_DIR_NAME, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
485
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_ts_ext.c
Normal file
485
linux_5.10/drivers/input/touchscreen/hyn/hyn_lib/hyn_ts_ext.c
Normal file
@@ -0,0 +1,485 @@
|
||||
|
||||
#include "../hyn_core.h"
|
||||
|
||||
void hyn_irq_set(struct hyn_ts_data *ts_data, u8 value)
|
||||
{
|
||||
// HYN_ENTER();
|
||||
if(atomic_read(&ts_data->irq_is_disable) != value){
|
||||
if(value ==0){
|
||||
disable_irq(ts_data->gpio_irq);
|
||||
msleep(1); //wait switch
|
||||
}
|
||||
else{
|
||||
enable_irq(ts_data->gpio_irq);
|
||||
}
|
||||
atomic_set(&ts_data->irq_is_disable,value);
|
||||
// HYN_INFO("IRQ %d",value);
|
||||
}
|
||||
}
|
||||
|
||||
void hyn_set_i2c_addr(struct hyn_ts_data *ts_data,u8 addr)
|
||||
{
|
||||
#ifdef I2C_PORT
|
||||
ts_data->client->addr = addr;
|
||||
#endif
|
||||
}
|
||||
|
||||
u16 hyn_sum16(int val, u8* buf,u16 len)
|
||||
{
|
||||
u16 sum = val;
|
||||
while(len--) sum += *buf++;
|
||||
return sum;
|
||||
}
|
||||
|
||||
u32 hyn_sum32(int val, u32* buf,u16 len)
|
||||
{
|
||||
u32 sum = val;
|
||||
while(len--) sum += *buf++;
|
||||
return sum;
|
||||
}
|
||||
|
||||
// int hyn_u8_extend_u16(u8 *des_ptr, u16 len)
|
||||
// {
|
||||
// u8 *src_ptr = des_ptr+len;
|
||||
// while(--len){
|
||||
// *des_ptr++ = *src_ptr++;
|
||||
// *des_ptr++ = 0;
|
||||
// }
|
||||
// }
|
||||
|
||||
void hyn_esdcheck_switch(struct hyn_ts_data *ts_data, u8 enable)
|
||||
{
|
||||
#if ESD_CHECK_EN
|
||||
if(IS_ERR_OR_NULL(ts_data->hyn_workqueue) || IS_ERR_OR_NULL(&ts_data->esdcheck_work)) return;
|
||||
if(enable){
|
||||
ts_data->esd_fail_cnt = 0;
|
||||
queue_delayed_work(ts_data->hyn_workqueue, &ts_data->esdcheck_work,
|
||||
msecs_to_jiffies(1000));
|
||||
}
|
||||
else{
|
||||
cancel_delayed_work_sync(&ts_data->esdcheck_work);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int copy_for_updata(struct hyn_ts_data *ts_data,u8 *buf,u32 offset,u16 len)
|
||||
{
|
||||
int ret = -1;
|
||||
#if (HYN_GKI_VER==0)
|
||||
struct file *fp;
|
||||
loff_t pos;
|
||||
u8 *pdata;
|
||||
|
||||
// HYN_ENTER();
|
||||
|
||||
if(strlen(ts_data->fw_file_name) == 0)
|
||||
return ret;
|
||||
fp = filp_open(ts_data->fw_file_name,O_RDONLY, 0);//
|
||||
if (IS_ERR(fp)) {
|
||||
HYN_INFO("open file %s failed \r\n", ts_data->fw_file_name);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
// fp->f_op->llseek(fp, offset, 0);
|
||||
fp->f_op->llseek(fp, 0, 0);
|
||||
pdata = kzalloc(len, GFP_KERNEL);
|
||||
if(IS_ERR_OR_NULL(pdata)){
|
||||
HYN_ERROR("kzalloc failed");
|
||||
filp_close(fp, NULL);
|
||||
return -1;
|
||||
}
|
||||
pos = offset;
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0)
|
||||
{
|
||||
mm_segment_t old_fs;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
ret=vfs_read(fp, pdata, len, &pos);
|
||||
set_fs(old_fs);
|
||||
}
|
||||
#else
|
||||
ret = hyn_fs_read(fp,pdata, len,&pos);
|
||||
#endif
|
||||
filp_close(fp, NULL);
|
||||
// HYN_INFO("rlen = %d nlen = %d",ret,len);
|
||||
if(ret <= len){
|
||||
memcpy(buf,pdata,len);
|
||||
ret = 0;
|
||||
}
|
||||
else{
|
||||
ret = -3;
|
||||
}
|
||||
kfree(pdata);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hyn_wait_irq_timeout(struct hyn_ts_data *ts_data,int msec)
|
||||
{
|
||||
atomic_set(&ts_data->hyn_irq_flg,0);
|
||||
while(msec--){
|
||||
msleep(1);
|
||||
if(atomic_read(&ts_data->hyn_irq_flg)==1){
|
||||
atomic_set(&ts_data->hyn_irq_flg,0);
|
||||
msec = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return msec == -1 ? 0:-1;
|
||||
}
|
||||
|
||||
#define MAX_WROD_LEN (64)
|
||||
int get_word(u8**sc_str, u8* ds_str)
|
||||
{
|
||||
u8 ch,cnt = 0,nul_flg = 0;
|
||||
while(1){
|
||||
ch = **sc_str;
|
||||
*sc_str += 1;
|
||||
if((ch==' '&& nul_flg) || ch=='\t' || ch=='\0' || (ch=='\r' && **sc_str == '\n') || ch=='\n'|| ch==','|| ch=='=' || cnt>=MAX_WROD_LEN){
|
||||
*ds_str++ = '\0';
|
||||
break;
|
||||
}
|
||||
if(ch >= 'A' && ch <= 'Z') ch = ch + 'a' - 'A';
|
||||
if(ch!=' '){
|
||||
*ds_str++ = ch;
|
||||
nul_flg = 1;
|
||||
}
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
int str_2_num(char *str,u8 type)
|
||||
{
|
||||
int ret = 0,step = 0,flg = 0,cnt = 15;
|
||||
char ch;
|
||||
while(*str != '\0' && --cnt){
|
||||
ch = *str++;
|
||||
if(ch==' ') continue;
|
||||
else if(ch=='-' && step==0){
|
||||
flg = 1;
|
||||
continue;
|
||||
}
|
||||
if(type == 10){
|
||||
if(ch <= '9' && ch >= '0'){
|
||||
step++;
|
||||
ret *= 10;
|
||||
ret += (ch - '0');
|
||||
}
|
||||
else{
|
||||
cnt = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(ch <= '9' && ch >= '0'){
|
||||
step++;
|
||||
ret *= 16;
|
||||
ret += (ch - '0');
|
||||
}
|
||||
else if(ch <= 'f' && ch >= 'a'){
|
||||
step++;
|
||||
ret *= 16;
|
||||
ret += (10 + ch - 'a');
|
||||
}
|
||||
else{
|
||||
cnt = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// if(cnt == 0 || step==0)HYN_ERROR("failed");
|
||||
return (cnt == 0 || step==0) ? 0xAC5AC5AC : (flg ? -ret:ret);
|
||||
}
|
||||
|
||||
static int hyn_get_threshold(char *filename,char *match_string,s16 *pstore, u16 len)
|
||||
{
|
||||
int ret = 0;
|
||||
HYN_ENTER();
|
||||
#if (HYN_GKI_VER==0)
|
||||
{
|
||||
u8 *buf = NULL,*ptr = NULL;
|
||||
u8 tmp_word[66];
|
||||
u16 i;
|
||||
int dec,cnt;
|
||||
off_t fsize;
|
||||
struct file *fp;
|
||||
loff_t pos;
|
||||
|
||||
if(strlen(filename) == 0)
|
||||
return ret;
|
||||
|
||||
fp = filp_open(filename, O_RDONLY, 0);
|
||||
if (IS_ERR(fp)) {
|
||||
HYN_INFO("error occured while opening file %s.\n", filename);
|
||||
return -EIO;
|
||||
}
|
||||
fp->f_op->llseek(fp, 0, 0);
|
||||
fsize = fp->f_inode->i_size;
|
||||
buf = vmalloc(fsize);
|
||||
if(IS_ERR_OR_NULL(buf)){
|
||||
HYN_ERROR("vmalloc failed");
|
||||
filp_close(fp, NULL);
|
||||
return -1;
|
||||
}
|
||||
pos = 0;
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0)
|
||||
{mm_segment_t old_fs;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
ret=vfs_read(fp,buf, fsize, &pos);
|
||||
set_fs(old_fs);}
|
||||
#else
|
||||
ret = hyn_fs_read(fp,buf,fsize,&pos);
|
||||
#endif
|
||||
HYN_INFO("read %s %s.ret:%d.\n",filename,ret==fsize ? "success":"failed",ret);
|
||||
filp_close(fp, NULL);
|
||||
|
||||
////read finsh start match key string
|
||||
i = fsize;
|
||||
ptr = buf;
|
||||
while(--i){
|
||||
if(*ptr++ == '\n'){
|
||||
cnt = strlen(match_string);
|
||||
while(--cnt){
|
||||
if(ptr[cnt]!= match_string[cnt]) break;
|
||||
}
|
||||
if(cnt ==0) break; //ignor idx 0,1
|
||||
}
|
||||
}
|
||||
if(i == 0){
|
||||
ret = -1;
|
||||
goto MATCH_FAIL1;
|
||||
}
|
||||
|
||||
///////match key string end
|
||||
i = 0;
|
||||
while(i<10){
|
||||
cnt = get_word(&ptr,tmp_word);
|
||||
if(cnt==0){
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
// HYN_INFO("@@%s",tmp_word);
|
||||
dec = str_2_num(tmp_word,10);
|
||||
if(dec == 0xAC5AC5AC) continue;
|
||||
*pstore = dec;
|
||||
pstore++;
|
||||
i = 0;
|
||||
if(--len == 0) break;
|
||||
}
|
||||
ret = len ? -1:0;
|
||||
|
||||
MATCH_FAIL1:
|
||||
if(!IS_ERR_OR_NULL(buf)) vfree(buf);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int factory_multitest(struct hyn_ts_data *ts_data ,char *cfg_path, u8 *data,s16 *test_th,u8 test_item)
|
||||
{
|
||||
int ret = 0;
|
||||
struct tp_info *ic = &ts_data->hw_info;
|
||||
u16 mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum,i=0;
|
||||
u16 st_len = ic->fw_sensor_txnum + ic->fw_sensor_rxnum;
|
||||
s16 *raw_h,*raw_l,*raw_s,*scap_p,tmp=0,scap_fix;
|
||||
raw_h = (s16*)data;
|
||||
raw_l = raw_h + mt_len;
|
||||
raw_s = raw_l + mt_len;
|
||||
scap_p = raw_s + st_len;
|
||||
|
||||
if(test_item & MULTI_OPEN_TEST){
|
||||
//judge low TH
|
||||
HYN_INFO("check MULTI_OPEN_TEST OpenMin");
|
||||
if(hyn_get_threshold(cfg_path,"TX0OpenMin",test_th,mt_len)){
|
||||
HYN_ERROR("read threshold failed");
|
||||
return FAC_GET_CFG_FAIL;
|
||||
}
|
||||
for(i = mt_len; i< mt_len; i++){
|
||||
if(*(raw_h+i)-*(raw_l+i) < test_th[i]) break;
|
||||
}
|
||||
if(i == mt_len){
|
||||
HYN_INFO("open low pass");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("open low test failed row= %d clo= %d %d<(th)%d"
|
||||
,i/ic->fw_sensor_rxnum,i%ic->fw_sensor_rxnum,*(raw_h+i)-*(raw_l+i),test_th[i]);
|
||||
return FAC_TEST_OPENL_FAIL;
|
||||
}
|
||||
//judge high TH
|
||||
HYN_INFO("check MULTI_OPEN_TEST OpenMax");
|
||||
if(hyn_get_threshold(cfg_path,"TX0OpenMax",test_th,mt_len)){
|
||||
HYN_ERROR("read threshold failed");
|
||||
return FAC_GET_CFG_FAIL;
|
||||
}
|
||||
for(i = 0; i< mt_len; i++){
|
||||
if(*(raw_h+i)-*(raw_l+i) > test_th[i]) break;
|
||||
}
|
||||
if(i == mt_len){
|
||||
HYN_INFO("open high pass");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("open high test failed row= %d clo= %d %d>(th)%d"
|
||||
,i/ic->fw_sensor_rxnum,i%ic->fw_sensor_rxnum,*(raw_h+i)-*(raw_l+i),test_th[i]);
|
||||
return FAC_TEST_OPENH_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
if(test_item & MULTI_SHORT_TEST){
|
||||
//judge short TH
|
||||
if(hyn_get_threshold(cfg_path,"FactoryTxShortTh",&tmp,1)){
|
||||
HYN_ERROR("read threshold failed");
|
||||
return FAC_GET_CFG_FAIL;
|
||||
}
|
||||
for(i = 0; i< st_len; i++){
|
||||
if(*(raw_s+i) < tmp) break;
|
||||
}
|
||||
HYN_INFO("%s,shortth = %d",i == st_len ? "short test pass":"short test failed",tmp);
|
||||
if(i != st_len){
|
||||
return FAC_TEST_SHORT_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
if(test_item & MULTI_SCAP_TEST){
|
||||
// self captest
|
||||
ret = hyn_get_threshold(cfg_path,"RxSCapScanMin",test_th,ic->fw_sensor_rxnum);
|
||||
ret |= hyn_get_threshold(cfg_path,"TxSCapScanMin",test_th+ic->fw_sensor_rxnum,ic->fw_sensor_txnum);
|
||||
ret |= hyn_get_threshold(cfg_path,"RxSCapScanMax",test_th+st_len,ic->fw_sensor_rxnum);
|
||||
ret |= hyn_get_threshold(cfg_path,"TxSCapScanMax",test_th+st_len+ic->fw_sensor_rxnum,ic->fw_sensor_txnum);
|
||||
if(ret){
|
||||
HYN_ERROR("read threshold failed");
|
||||
return FAC_GET_CFG_FAIL;
|
||||
}
|
||||
else{
|
||||
scap_fix = 128*(test_th[st_len+2] - test_th[2])/(abs(*(scap_p+2))+1);
|
||||
for(i = 0; i< st_len; i++){
|
||||
tmp = *(scap_p+i)*scap_fix/128;
|
||||
if(tmp < test_th[i] || tmp > test_th[st_len+i]) break;
|
||||
}
|
||||
if(i == st_len){
|
||||
HYN_INFO("scap test pass");
|
||||
}
|
||||
else{
|
||||
HYN_ERROR("scap test failed[%d] %d<%d>%d",i,test_th[i],tmp,test_th[st_len+i]);
|
||||
return FAC_TEST_SCAP_FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if (HYN_GKI_VER==0)
|
||||
static int arry_to_string(s16 *from,u16 cnt,u8 *des,u16 maxlen)
|
||||
{
|
||||
int str_cnt = 0;
|
||||
int ret;
|
||||
while(cnt--){
|
||||
ret = snprintf(&des[str_cnt],maxlen, "%d,",*from++);
|
||||
str_cnt += ret;
|
||||
if(str_cnt > maxlen-ret){
|
||||
str_cnt = maxlen;
|
||||
HYN_ERROR("str full");
|
||||
break;
|
||||
}
|
||||
}
|
||||
return str_cnt;
|
||||
}
|
||||
#endif
|
||||
|
||||
int fac_test_log_save(char *log_name,struct hyn_ts_data *ts_data,s16 *test_data, int test_ret, u8 test_item)
|
||||
{
|
||||
HYN_ENTER();
|
||||
#if (HYN_GKI_VER==0)
|
||||
{
|
||||
struct file *fp;
|
||||
u8 w_buf[256],i;
|
||||
int ret = -1;
|
||||
if(strlen(log_name) == 0)
|
||||
return ret;
|
||||
|
||||
fp = filp_open(log_name, O_RDWR | O_CREAT, 0644);
|
||||
if (IS_ERR(fp)) {
|
||||
HYN_INFO("error occured while opening file %s.\n", log_name);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0)
|
||||
{mm_segment_t old_fs;
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
#undef hyn_fs_write
|
||||
#define hyn_fs_write vfs_write
|
||||
#endif
|
||||
ret = snprintf(w_buf,sizeof(w_buf), test_ret ==0 ? "factory test pass\n":"factory test ng\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
if(test_ret == FAC_GET_DATA_FAIL){
|
||||
ret = snprintf(w_buf,sizeof(w_buf), "read fac_test data fail\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
}
|
||||
else{
|
||||
|
||||
if(test_item & MULTI_OPEN_TEST){
|
||||
ret = snprintf(w_buf,sizeof(w_buf), "open high test data\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
for(i = 0; i< ts_data->hw_info.fw_sensor_txnum; i++){
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_rxnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_rxnum;
|
||||
}
|
||||
|
||||
ret = snprintf(w_buf,sizeof(w_buf), "open low test data\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
for(i = 0; i< ts_data->hw_info.fw_sensor_txnum; i++){
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_rxnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_rxnum;
|
||||
}
|
||||
}
|
||||
|
||||
if(test_item & MULTI_SHORT_TEST){
|
||||
ret = snprintf(w_buf,sizeof(w_buf), "short test data\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_rxnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_rxnum;
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_txnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_txnum;
|
||||
}
|
||||
|
||||
if(test_item & MULTI_SCAP_TEST){
|
||||
ret = snprintf(w_buf,sizeof(w_buf), "scap test data\n");
|
||||
hyn_fs_write(fp, w_buf, ret, &fp->f_pos);
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_rxnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_rxnum;
|
||||
ret = arry_to_string(test_data,ts_data->hw_info.fw_sensor_txnum,w_buf,sizeof(w_buf)-2);
|
||||
w_buf[ret+1] = '\n';
|
||||
hyn_fs_write(fp, w_buf, ret+2, &fp->f_pos);
|
||||
test_data += ts_data->hw_info.fw_sensor_txnum;
|
||||
}
|
||||
}
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 14, 0)
|
||||
set_fs(old_fs);}
|
||||
#endif
|
||||
filp_close(fp, NULL);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
191
linux_5.10/drivers/input/touchscreen/hyn/readme.txt
Normal file
191
linux_5.10/drivers/input/touchscreen/hyn/readme.txt
Normal file
@@ -0,0 +1,191 @@
|
||||
1、芯片对应关系
|
||||
----------匹配符-------------------------函数接口----------支持的芯片型号--------------
|
||||
{.compatible = "hyn,66xx", .data = &cst66xx_fuc,}, /*suport 36xx、35xx、66xx、68xx */
|
||||
{.compatible = "hyn,3240", .data = &cst3240_fuc,}, /*suport 3240 */
|
||||
{.compatible = "hyn,92xx", .data = &cst92xx_fuc,}, /*suport 9217、9220 */
|
||||
{.compatible = "hyn,3xx", .data = &cst3xx_fuc,}, /*suport 340 348*/
|
||||
{.compatible = "hyn,1xx", .data = &cst1xx_fuc,}, /*suport 328 128 140 148*/
|
||||
{.compatible = "hyn,7xx", .data = &cst7xx_fuc,}, /*suport 726 826 836u*/
|
||||
{.compatible = "hyn,8xxt", .data = &cst8xxT_fuc,}, /*suport 816t 816d 820 08C*/
|
||||
|
||||
|
||||
2、I2c接口最小dts参考配置,下面都是必配项:
|
||||
hynitron@5A {
|
||||
compatible = "hyn,66xx"; //根据芯片型号配置
|
||||
reg = <0x5A>; //根据芯片型号配置
|
||||
|
||||
interrupt-parent = <&tlmm>; //根据平台配置
|
||||
interrupts = <65 0x02>; //根据平台配置
|
||||
reset-gpio = <&tlmm 64 0x01>; //根据平台配置
|
||||
irq-gpio = <&tlmm 65 0x02>; //根据平台配置
|
||||
|
||||
max-touch-number = <5>;
|
||||
display-coords = <0 0 800 1280>;
|
||||
pos-swap = <1>; //xy坐标交换
|
||||
posx-reverse = <0>; //x坐标反向
|
||||
posy-reverse = <0>; //y坐标反向
|
||||
};
|
||||
|
||||
3、SPI接口最小dts参考配置,下面都是必配项:
|
||||
spi@78b900{
|
||||
hynitron@0 {
|
||||
compatible = "hyn,66xx"; //根据芯片型号配置
|
||||
reg = <0>; //根据芯片型号配置
|
||||
spi-max-frequency=<6000000>; //默认配6M
|
||||
|
||||
interrupt-parent = <&tlmm>; //根据平台配置
|
||||
interrupts = <65 0x02>; //根据平台配置
|
||||
reset-gpio = <&tlmm 64 0x01>; //根据平台配置
|
||||
irq-gpio = <&tlmm 65 0x02>; //根据平台配置
|
||||
|
||||
max-touch-number = <5>;
|
||||
display-coords = <0 0 800 1280>;
|
||||
pos-swap = <1>; //xy坐标交换
|
||||
posx-reverse = <0>; //x坐标反向
|
||||
posy-reverse = <0>; //y坐标反向
|
||||
};
|
||||
};
|
||||
|
||||
4、全dts参考配置:
|
||||
hynitron@5A {
|
||||
compatible = "hyn,66xx";
|
||||
reg = <0x5A>;
|
||||
vdd_ana-supply = <&pm8953_l10>;
|
||||
vcc_i2c-supply = <&pm8953_l6>;
|
||||
|
||||
interrupt-parent = <&tlmm>;
|
||||
interrupts = <65 0x02>;
|
||||
reset-gpio = <&tlmm 64 0x01>;
|
||||
irq-gpio = <&tlmm 65 0x02>;
|
||||
|
||||
pinctrl-names = "ts_active","ts_suspend";
|
||||
pinctrl-0 = <&ts_int_active &ts_reset_active>;
|
||||
pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
|
||||
|
||||
max-touch-number = <5>;
|
||||
display-coords = <0 0 800 1280>;
|
||||
pos-swap = <1>;
|
||||
posx-reverse = <0>;
|
||||
posy-reverse = <0>;
|
||||
|
||||
key-number = <0>;
|
||||
keys = <139 102 158>;
|
||||
key-y-coord = <2000>;
|
||||
key-x-coords = <200 600 800>;
|
||||
};
|
||||
|
||||
PINCTL配置
|
||||
pmx_ts_int_active {
|
||||
ts_int_active: ts_int_active {
|
||||
mux {
|
||||
pins = "gpio65";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
config {
|
||||
pins = "gpio65";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pmx_ts_reset_active {
|
||||
ts_reset_active: ts_reset_active {
|
||||
mux {
|
||||
pins = "gpio64";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
config {
|
||||
pins = "gpio64";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pmx_ts_int_suspend {
|
||||
ts_int_suspend: ts_int_suspend {
|
||||
mux {
|
||||
pins = "gpio65";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
config {
|
||||
pins = "gpio65";
|
||||
drive-strength = <2>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pmx_ts_reset_suspend {
|
||||
ts_reset_suspend: ts_reset_suspend {
|
||||
mux {
|
||||
pins = "gpio64";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
config {
|
||||
pins = "gpio64";
|
||||
drive-strength = <2>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
3、参考Makefile配置:
|
||||
|
||||
obj-y += hynitron_touch.o
|
||||
hynitron_touch-objs += hyn_core.o hyn_lib/hyn_i2c.o hyn_lib/hyn_spi.o hyn_lib/hyn_ts_ext.o hyn_lib/hyn_fs_node.o
|
||||
hynitron_touch-objs += hyn_lib/hyn_tool.o
|
||||
hynitron_touch-objs += hyn_lib/hyn_gesture.o
|
||||
hynitron_touch-objs += hyn_lib/hyn_prox.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst66xx.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst3240.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst92xx.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst3xx.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst1xx.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst7xx.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst8xxT.o
|
||||
hynitron_touch-objs += hyn_chips/hyn_cst7xx.o
|
||||
|
||||
|
||||
4、sys节点操作
|
||||
1、升级
|
||||
通过文件升级
|
||||
adb push xxx.bin /sdcard/app.bin
|
||||
echo fd>/sys/hynitron_debug/hyntpdbg
|
||||
通过dump升级(GKI version)
|
||||
adb push xxx.bin /sdcard/app.bin
|
||||
cd /sys/hynitron_debug && echo fwstart>./hyndumpfw && dd if=/sdcard/app.bin of=./hyndumpfw && echo fwend>./hyndumpfw
|
||||
|
||||
2、write
|
||||
eg:写 d1 01 02 03 04
|
||||
echo w d1 01 02 03 04 >/sys/hynitron_debug/hyntpdbg
|
||||
3、read
|
||||
eg 读 20 byte
|
||||
echo r 20 >/sys/hynitron_debug/hyntpdbg && cat /sys/hynitron_debug/hyntpdbg
|
||||
3、read reg (max reg长度4 byte max read 256 byte)
|
||||
eg:写 d1 01 读 2 byte
|
||||
echo w d1 01 r 2 >/sys/hynitron_debug/hyntpdbg && cat /sys/hynitron_debug/hyntpdbg
|
||||
eg:写 d1 01 02 03 读 20 byte
|
||||
echo w d1 01 02 03 r 20 >/sys/hynitron_debug/hyntpdbg && cat /sys/hynitron_debug/hyntpdbg
|
||||
如果reg 不变可以直接用 cat /sys/hynitron_debug/hyntpdbg 读(reg沿用上次的操作)
|
||||
4、调试log debug
|
||||
echo 7 >/proc/sys/kernel/printk
|
||||
echo log,3>/sys/hynitron_debug/hyntpdbg
|
||||
|
||||
5、读版TP_FW本号
|
||||
cat /sys/hynitron_debug/hyntpfwver
|
||||
|
||||
6、tp0 自测(需要提前准备自测配置文件)
|
||||
cat /sys/hynitron_debug/hynselftest
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
|
||||
# Linux driver folder
|
||||
|
||||
#ccflags-y += -I$(srctree)/drivers/input/touchscreen/mediatek/
|
||||
#ccflags-y += -I$(srctree)/drivers/input/touchscreen/mediatek/hynitron
|
||||
#ccflags-y += -I$(srctree)/drivers/misc/mediatek/include/mt-plat/
|
||||
#ccflags-y += -I$(srctree)/drivers/misc/mediatek/include/mt-plat/$(MTK_PLATFORM)/include/
|
||||
#ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include/
|
||||
obj-m += hynitron_touch.o
|
||||
|
||||
obj-y += hynitron_core.o
|
||||
obj-y += hynitron_i2c.o
|
||||
obj-y += hynitron_esd_check.o
|
||||
obj-y += hynitron_tool_debug.o
|
||||
obj-y += hynitron_update_firmware.o
|
||||
obj-y += hynitron_gesture.o
|
||||
obj-y += hynitron_proximity.o
|
||||
hynitron_touch-objs += hynitron_core.o
|
||||
hynitron_touch-objs += hynitron_i2c.o
|
||||
hynitron_touch-objs += hynitron_esd_check.o
|
||||
hynitron_touch-objs += hynitron_tool_debug.o
|
||||
hynitron_touch-objs += hynitron_update_firmware.o
|
||||
hynitron_touch-objs += hynitron_gesture.o
|
||||
hynitron_touch-objs += hynitron_proximity.o
|
||||
|
||||
@@ -340,4 +340,4 @@ void hyn_esd_exit(void)
|
||||
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -658,4 +658,4 @@ int hyn_gesture_exit(void)
|
||||
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -249,4 +249,4 @@ int cst3xx_i2c_read_register(struct i2c_client *client, unsigned char *buf, int
|
||||
#endif
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -51,7 +51,7 @@ static int hyn_proximity_get_value(void);
|
||||
|
||||
/************************************************
|
||||
MTKƽ̨:
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC----<2D><><EFBFBD><EFBFBD>hwmsen_attach(ID_PROXIMITY)----<2D>ϱ<EFBFBD>hwm_sensor_data
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC----<2D><>hwmsen_attach(ID_PROXIMITY)----<2D>ϱ<EFBFBD>hwm_sensor_data
|
||||
|
||||
*************************************************/
|
||||
|
||||
@@ -147,7 +147,7 @@ void hyn_proximity_mtk_init(void)
|
||||
|
||||
/************************************************
|
||||
Spreadtrumƽ̨:
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC----<2D><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>proximity-----<2D>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC----<2D><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>proximity-----<2D>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>
|
||||
|
||||
*************************************************/
|
||||
|
||||
@@ -539,4 +539,4 @@ void hyn_proximity_exit(void)
|
||||
#endif
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
#define HYN_TP_OPEN_TX_DROP_RATIO 25
|
||||
#define HYN_TP_SHORT_RX_TX_RESISTANCE 600
|
||||
|
||||
#define vfs_write(fp, buf, len, pos) kernel_write(fp, buf, len, pos)
|
||||
#define vfs_read(fp, buf, len, pos) kernel_read(fp, buf, len, pos)
|
||||
|
||||
#if HYN_AUTO_FACTORY_TEST_EN
|
||||
static char factory_test[512];
|
||||
static int hyn_factory_touch_test(void);
|
||||
@@ -1762,11 +1765,11 @@ static ssize_t hyn_tprwreg_store(struct device *dev,struct device_attribute *att
|
||||
HYN_INFO("register(0x%x).\n",regaddr);
|
||||
|
||||
/**********************************************
|
||||
//0-ascll-0x30:2<><32>?<3F><><EFBFBD><EFBFBD>?<3F><>?o?
|
||||
//1-ascll-0x31:1?<3F><>??D??
|
||||
//2-ascll-0x32:<3A>䨰?a?D??
|
||||
//3-ascll-0x33:?<3F><>??D???
|
||||
//4-ascll-0x34:<3A><>y????<3F><>?1<><31>?t
|
||||
//0-ascll-0x30:2<><32>?<3F><><EFBFBD>?<3F><>?o?
|
||||
//1-ascll-0x31:1?<3F><>??D??
|
||||
//2-ascll-0x32:<3A>䨰?a?D??
|
||||
//3-ascll-0x33:?<3F><>??D???
|
||||
//4-ascll-0x34:<3A><>y????<3F><>?1<><31>?t
|
||||
//5-ascll-0x35:
|
||||
//6-ascll-0x36:
|
||||
//7-ascll-0x37:
|
||||
@@ -1805,9 +1808,9 @@ static ssize_t hyn_tprwreg_store(struct device *dev,struct device_attribute *att
|
||||
HYN_INFO("register(0x%02x).\n",regaddr);
|
||||
|
||||
/**********************************************
|
||||
//11-ascll-0x3131: <20><><EFBFBD><EFBFBD>??1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>?1
|
||||
//11-ascll-0x3131: <20><><EFBFBD><EFBFBD>??1<><31><EFBFBD><EFBFBD><EFBFBD>?<3F>?1
|
||||
***
|
||||
//19-ascll-0x3139: <20><><EFBFBD><EFBFBD>??1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>?9
|
||||
//19-ascll-0x3139: <20><><EFBFBD><EFBFBD>??1<><31><EFBFBD><EFBFBD><EFBFBD>?<3F>?9
|
||||
****************************************/
|
||||
if((regaddr>>8)==0x31){
|
||||
if((regaddr&0xff)==0x30){
|
||||
@@ -2132,4 +2135,4 @@ void hyn_release_sysfs(struct i2c_client *client)
|
||||
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -4066,4 +4066,4 @@ int hyn_detect_bootloader(struct i2c_client *client)
|
||||
|
||||
|
||||
// I dont known
|
||||
MODULE_LICENSE("NOP");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -65,50 +65,49 @@ static CVI_U8 data_d240si31_0[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x13};
|
||||
static CVI_U8 data_d240si31_1[] = {0xef, 0x08};
|
||||
static CVI_U8 data_d240si31_2[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x10};
|
||||
static CVI_U8 data_d240si31_3[] = {0xc0, 0x4f, 0x00};
|
||||
static CVI_U8 data_d240si31_4[] = {0xc1, 0x0d, 0x12};
|
||||
static CVI_U8 data_d240si31_5[] = {0xc2, 0x00, 0x0A};
|
||||
static CVI_U8 data_d240si31_4[] = {0xc1, 0x10, 0x0c};
|
||||
static CVI_U8 data_d240si31_5[] = {0xc2, 0x01, 0x14};
|
||||
static CVI_U8 data_d240si31_6[] = {0xcc, 0x10};
|
||||
static CVI_U8 data_d240si31_7[] = {0xb0, 0x00, 0x0D, 0x0B, 0x08, 0x0e, 0x07, 0x00, 0x07, 0x07, 0x16, 0x07, 0x10, 0x13, 0x1b, 0x29, 0x1f};
|
||||
static CVI_U8 data_d240si31_8[] = {0xb1, 0x00, 0x01, 0x15, 0x12, 0x12, 0x02, 0x00, 0x08, 0x08, 0x21, 0x03, 0x14, 0x0f, 0x2d, 0x2e, 0x1f};
|
||||
static CVI_U8 data_d240si31_7[] = {0xb0, 0x00, 0x0b, 0x13, 0x0d, 0x10, 0x07, 0x02, 0x08, 0x07, 0x1f, 0x04, 0x11, 0x0f, 0x28, 0x2f, 0x1f};
|
||||
static CVI_U8 data_d240si31_8[] = {0xb1, 0x00, 0x0c, 0x13, 0x0c, 0x10, 0x05, 0x02, 0x08, 0x08, 0x1e, 0x05, 0x13, 0x11, 0x27, 0x30, 0x1f};
|
||||
static CVI_U8 data_d240si31_9[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x11};
|
||||
static CVI_U8 data_d240si31_10[] = {0xb0, 0x6d};
|
||||
static CVI_U8 data_d240si31_11[] = {0xb1, 0x4d};
|
||||
static CVI_U8 data_d240si31_10[] = {0xb0, 0x4d};
|
||||
static CVI_U8 data_d240si31_11[] = {0xb1, 0x6A};
|
||||
static CVI_U8 data_d240si31_12[] = {0xb2, 0x87};
|
||||
static CVI_U8 data_d240si31_13[] = {0xb3, 0x80};
|
||||
static CVI_U8 data_d240si31_14[] = {0xb5, 0x49};
|
||||
static CVI_U8 data_d240si31_15[] = {0xb7, 0x87};
|
||||
static CVI_U8 data_d240si31_16[] = {0xb8, 0x23};
|
||||
static CVI_U8 data_d240si31_14[] = {0xb5, 0x45};
|
||||
static CVI_U8 data_d240si31_15[] = {0xb7, 0x85};
|
||||
static CVI_U8 data_d240si31_16[] = {0xb8, 0x20};
|
||||
static CVI_U8 data_d240si31_17[] = {0xc1, 0x78};
|
||||
static CVI_U8 data_d240si31_18[] = {0xc2, 0x78};
|
||||
static CVI_U8 data_d240si31_19[] = {0xd0, 0x88};
|
||||
//delay 100 ms
|
||||
static CVI_U8 data_d240si31_20[] = {0xe0, 0x00, 0x00, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_21[] = {0xe1, 0x06, 0xa8, 0x08, 0xa8, 0x05, 0xa8, 0x07, 0xa8, 0x00, 0x44, 0x44};
|
||||
static CVI_U8 data_d240si31_22[] = {0xe2, 0x22, 0x22, 0x44, 0x44, 0x8b, 0xa8, 0x8d, 0xa8, 0x8a, 0xa8, 0x8c, 0xa8, 0x00};
|
||||
static CVI_U8 data_d240si31_20[] = {0xe0, 0x00, 0x00, 0x02};
|
||||
static CVI_U8 data_d240si31_21[] = {0xe1, 0x04, 0xb0, 0x06, 0xb0, 0x05, 0xb0, 0x07, 0xb0, 0x00, 0x44, 0x44};
|
||||
static CVI_U8 data_d240si31_22[] = {0xe2, 0x20, 0x20, 0x44, 0x44, 0x96, 0xa0, 0x00, 0x00, 0x96, 0xa0, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_23[] = {0xe3, 0x00, 0x00, 0x22, 0x22};
|
||||
static CVI_U8 data_d240si31_24[] = {0xe4, 0x44, 0x44};
|
||||
static CVI_U8 data_d240si31_25[] = {0xe5, 0x08, 0x8c, 0xd1, 0xd9, 0x0a, 0x8e, 0xd1, 0xd9, 0x0c, 0x90, 0xd1, 0xd9, 0x0e, 0x93, 0xd1, 0xd9};
|
||||
static CVI_U8 data_d240si31_25[] = {0xe5, 0x0c, 0x90, 0xb0, 0xa0, 0x0e, 0x92, 0xb0, 0xa0, 0x08, 0x8c, 0xb0, 0xa0, 0x0a, 0x8e, 0xb0, 0xa0};
|
||||
static CVI_U8 data_d240si31_26[] = {0xe6, 0x00, 0x00, 0x22, 0x22};
|
||||
static CVI_U8 data_d240si31_27[] = {0xe7, 0x44, 0x44};
|
||||
static CVI_U8 data_d240si31_28[] = {0xe8, 0x07, 0x8b, 0xd1, 0xd9, 0x09, 0x8d, 0xd1, 0xd9, 0x0b, 0x8f, 0xd1, 0xd9, 0x0d, 0x91, 0xd1, 0xd9};
|
||||
static CVI_U8 data_d240si31_28[] = {0xe8, 0x0d, 0x91, 0xb0, 0xa0, 0x0f, 0x93, 0xb0, 0xa0, 0x09, 0x8d, 0xb0, 0xa0, 0x0b, 0x8f, 0xb0, 0xa0};
|
||||
static CVI_U8 data_d240si31_29[] = {0xe9, 0x36, 0x00};
|
||||
static CVI_U8 data_d240si31_30[] = {0xeb, 0x00, 0x00, 0x4e, 0x4e, 0xee, 0x44, 0x40};
|
||||
static CVI_U8 data_d240si31_31[] = {0xed, 0xff, 0xff, 0x32, 0xbf, 0x01, 0xc4, 0x56, 0x7F, 0x76, 0x54, 0xc1, 0x0f, 0xb2, 0x3f, 0xff, 0xff};
|
||||
static CVI_U8 data_d240si31_32[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_33[] = {0x11};
|
||||
static CVI_U8 data_d240si31_30[] = {0xeb, 0x00, 0x00, 0xe4, 0xe4, 0x44, 0x88, 0x40};
|
||||
static CVI_U8 data_d240si31_31[] = {0xed, 0xf1, 0xb2, 0xac, 0x0f, 0x67, 0x45, 0xff, 0xff, 0xff, 0xff, 0x54, 0x76, 0xf0, 0xca, 0x2b, 0x1f};
|
||||
static CVI_U8 data_d240si31_32[] = {0xef, 0x10, 0x0d, 0x04, 0x08, 0x3f, 0x1f};
|
||||
static CVI_U8 data_d240si31_33[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x13};
|
||||
static CVI_U8 data_d240si31_34[] = {0xe8, 0x00, 0x0e};
|
||||
static CVI_U8 data_d240si31_35[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_36[] = {0x11};
|
||||
//delay 120 ms
|
||||
//彩条
|
||||
// static CVI_U8 data_d240si31_37[] = {0xFF,0x77,0x01,0x00,0x00,0x12};
|
||||
// static CVI_U8 data_d240si31_38[] = {0xd1,0x81,0x10,0x03,0x03,0x08,0x01,0xA0,0x01,0xe0,0xB0,0x01,0xe0,0x03,0x20};
|
||||
// static CVI_U8 data_d240si31_39[] = {0xd2,0x08};///彩条
|
||||
// static CVI_U8 data_d240si31_40[] = {0xFF,0x77,0x01,0x00,0x00,0x10};
|
||||
// static CVI_U8 data_d240si31_41[] = {0xC2,0x31,0x08};
|
||||
//delay 120 ms
|
||||
|
||||
static CVI_U8 data_d240si31_34[] = {0x35, 0x00};
|
||||
static CVI_U8 data_d240si31_35[] = {0x36, 0x00};
|
||||
static CVI_U8 data_d240si31_36[] = {0x29};
|
||||
//delay 30 ms
|
||||
static CVI_U8 data_d240si31_37[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x13};
|
||||
static CVI_U8 data_d240si31_38[] = {0x11, 0xe8, 0x00, 0x0c};
|
||||
//delay 10 ms
|
||||
static CVI_U8 data_d240si31_39[] = {0xe8, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_40[] = {0xff, 0x77, 0x01, 0x00, 0x00, 0x00};
|
||||
static CVI_U8 data_d240si31_41[] = {0x36, 0x10};
|
||||
static CVI_U8 data_d240si31_42[] = {0x29};
|
||||
//delay 20 ms
|
||||
|
||||
// len == 1 , type 0x05
|
||||
// len == 2 , type 0x15 or type 23
|
||||
@@ -140,7 +139,7 @@ const struct dsc_instr dsi_init_cmds_d240si31[] = {
|
||||
{.delay = 100, .data_type = TYPE2_DCS_SHORT_WRITE, .size = 2, .data = data_d240si31_19 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 5, .data = data_d240si31_20 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 12, .data = data_d240si31_21 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 14, .data = data_d240si31_22 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 13, .data = data_d240si31_22 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 5, .data = data_d240si31_23 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 3, .data = data_d240si31_24 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 17, .data = data_d240si31_25 },
|
||||
@@ -150,18 +149,17 @@ const struct dsc_instr dsi_init_cmds_d240si31[] = {
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 3, .data = data_d240si31_29 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 8, .data = data_d240si31_30 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 17, .data = data_d240si31_31 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_32 },
|
||||
{.delay = 120, .data_type = TYPE1_DCS_SHORT_WRITE, .size = 1, .data = data_d240si31_33 },
|
||||
|
||||
// {.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_37 },
|
||||
// {.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 15, .data = data_d240si31_38 },
|
||||
// {.delay = 0, .data_type = TYPE2_DCS_SHORT_WRITE, .size = 2, .data = data_d240si31_39 },
|
||||
// {.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_40 },
|
||||
// {.delay = 120, .data_type = TYPE3_DCS_LONG_WRITE, .size = 3, .data = data_d240si31_41 },
|
||||
|
||||
{.delay = 0, .data_type = TYPE2_DCS_SHORT_WRITE, .size = 2, .data = data_d240si31_34 },
|
||||
{.delay = 0, .data_type = TYPE2_DCS_SHORT_WRITE, .size = 2, .data = data_d240si31_35 },
|
||||
{.delay = 30, .data_type = TYPE1_DCS_SHORT_WRITE, .size = 1, .data = data_d240si31_36 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 7, .data = data_d240si31_32 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_33 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 3, .data = data_d240si31_34 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_35 },
|
||||
{.delay = 120, .data_type = TYPE1_DCS_SHORT_WRITE, .size = 1, .data = data_d240si31_36 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_37 },
|
||||
{.delay = 10, .data_type = TYPE3_DCS_LONG_WRITE, .size = 4, .data = data_d240si31_38 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 3, .data = data_d240si31_39 },
|
||||
{.delay = 0, .data_type = TYPE3_DCS_LONG_WRITE, .size = 6, .data = data_d240si31_40 },
|
||||
{.delay = 0, .data_type = TYPE2_DCS_SHORT_WRITE, .size = 2, .data = data_d240si31_41 },
|
||||
{.delay = 20, .data_type = TYPE1_DCS_SHORT_WRITE, .size = 1, .data = data_d240si31_42 },
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user