The following 2 patches add driver for S5K4ECGX sensor with embedded ISP SoC, and minor v4l2 control API enhancement. S5K4ECGX is 5M CMOS Image sensor from Samsung
Changes since v2: - added GPIO (reset/stby) and regulators - updated I2C read/write, based on s5k6aa datasheet - fixed set_fmt errors - reduced register tables a bit - removed vmalloc
Changes since v1: - fixed s_stream(0) when it called twice - changed mutex_X position to be used when strictly necessary - add additional s_power(0) in case that error happens - update more accurate debugging statements - remove dummy else
Sangwook Lee (2): v4l: Add factory register values form S5K4ECGX sensor v4l: Add v4l2 subdev driver for S5K4ECGX sensor
drivers/media/video/Kconfig | 8 + drivers/media/video/Makefile | 1 + drivers/media/video/s5k4ecgx.c | 839 ++++++++++ drivers/media/video/s5k4ecgx_regs.h | 3105 +++++++++++++++++++++++++++++++++++ include/media/s5k4ecgx.h | 39 + 5 files changed, 3992 insertions(+) create mode 100644 drivers/media/video/s5k4ecgx.c create mode 100644 drivers/media/video/s5k4ecgx_regs.h create mode 100644 include/media/s5k4ecgx.h
Add factory default settings for S5K4ECGX sensor registers, which was copied from the reference code of Samsung S.LSI.
Signed-off-by: Sangwook Lee sangwook.lee@linaro.org --- drivers/media/video/s5k4ecgx_regs.h | 3105 +++++++++++++++++++++++++++++++++++ 1 file changed, 3105 insertions(+) create mode 100644 drivers/media/video/s5k4ecgx_regs.h
diff --git a/drivers/media/video/s5k4ecgx_regs.h b/drivers/media/video/s5k4ecgx_regs.h new file mode 100644 index 0000000..ef87c09 --- /dev/null +++ b/drivers/media/video/s5k4ecgx_regs.h @@ -0,0 +1,3105 @@ +/* + * Samsung S5K4ECGX register tables for default values + * + * Copyright (C) 2012 Linaro + * Copyright (C) 2012 Insignal Co,. Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __DRIVERS_MEDIA_VIDEO_S5K4ECGX_H__ +#define __DRIVERS_MEDIA_VIDEO_S5K4ECGX_H__ + +struct regval_list { + u32 addr; + u16 val; +}; + +/* + * FIXME: + * The tables are default values of a S5K4ECGX sensor EVT1.1 + * from Samsung LSI. currently there is no information available + * to the public in order to reduce these tables size. + */ +static const struct regval_list s5k4ecgx_apb_regs[] = { + { 0xd0001082, 0x01aa }, + { 0xd0001084, 0x01aa }, + { 0xd0001086, 0x0055 }, + { 0xd0001088, 0x01af }, + { 0xd000100e, 0x0000 }, + { 0xd000007a, 0x0000 }, + { 0xd000e406, 0x0092 }, + { 0xd000e410, 0x3804 }, + { 0xd000e41a, 0x0010 }, + { 0xd000e420, 0x0003 }, + { 0xd000e422, 0x0060 }, + { 0xd000e42e, 0x0004 }, + { 0xd000f400, 0x5a3c }, + { 0xd000f402, 0x0023 }, + { 0xd000f404, 0x8080 }, + { 0xd000f406, 0x03af }, + { 0xd000f408, 0x000a }, + { 0xd000f40a, 0xaa54 }, + { 0xd000f40c, 0x0040 }, + { 0xd000f40e, 0x464e }, + { 0xd000f410, 0x0240 }, + { 0xd000f412, 0x0240 }, + { 0xd000f414, 0x0040 }, + { 0xd000f416, 0x1000 }, + { 0xd000f418, 0x55ff }, + { 0xd000f41a, 0xd000 }, + { 0xd000f41c, 0x0010 }, + { 0xd000f41e, 0x0202 }, + { 0xd000f420, 0x0401 }, + { 0xd000f422, 0x0022 }, + { 0xd000f424, 0x0088 }, + { 0xd000f426, 0x009f }, + { 0xd000f428, 0x0000 }, + { 0xd000f42a, 0x1800 }, + { 0xd000f42c, 0x0088 }, + { 0xd000f42e, 0x0000 }, + { 0xd000f430, 0x2428 }, + { 0xd000f432, 0x0000 }, + { 0xd000f434, 0x03ee }, + { 0xd000f436, 0x0000 }, + { 0xd000f438, 0x0000 }, + { 0xd000f43a, 0x0000 }, + { 0xd000f552, 0x0708 }, + { 0xd000f554, 0x080c }, +}; + +/* Configure video stream registers */ +static const struct regval_list s5k4ecgx_img_regs[] = { + { 0x700018bc, 0x0004 }, + { 0x700018be, 0x05b6 }, + { 0x700018c0, 0x0000 }, + { 0x700018c2, 0x0000 }, + { 0x700018c4, 0x0001 }, + { 0x700018c6, 0x05ba }, + { 0x700018c8, 0x0000 }, + { 0x700018ca, 0x0000 }, + { 0x700018cc, 0x0007 }, + { 0x700018ce, 0x05ba }, + { 0x700018d0, 0x0000 }, + { 0x700018d2, 0x0000 }, + { 0x700018d4, 0x01f4 }, + { 0x700018d6, 0x024e }, + { 0x700018d8, 0x0000 }, + { 0x700018da, 0x0000 }, + { 0x700018dc, 0x01f4 }, + { 0x700018de, 0x05b6 }, + { 0x700018e0, 0x0000 }, + { 0x700018e2, 0x0000 }, + { 0x700018e4, 0x01f4 }, + { 0x700018e6, 0x05ba }, + { 0x700018e8, 0x0000 }, + { 0x700018ea, 0x0000 }, + { 0x700018ec, 0x01f4 }, + { 0x700018ee, 0x024f }, + { 0x700018f0, 0x0000 }, + { 0x700018f2, 0x0000 }, + { 0x700018f4, 0x0000 }, + { 0x700018f6, 0x0000 }, + { 0x700018f8, 0x0000 }, + { 0x700018fa, 0x0000 }, + { 0x700018fc, 0x0075 }, + { 0x700018fe, 0x00cf }, + { 0x70001900, 0x0000 }, + { 0x70001902, 0x0000 }, + { 0x70001904, 0x0075 }, + { 0x70001906, 0x00d6 }, + { 0x70001908, 0x0000 }, + { 0x7000190a, 0x0000 }, + { 0x7000190c, 0x0004 }, + { 0x7000190e, 0x01f4 }, + { 0x70001910, 0x0000 }, + { 0x70001912, 0x0000 }, + { 0x70001914, 0x00f0 }, + { 0x70001916, 0x01f4 }, + { 0x70001918, 0x029e }, + { 0x7000191a, 0x05b2 }, + { 0x7000191c, 0x0000 }, + { 0x7000191e, 0x0000 }, + { 0x70001920, 0x0000 }, + { 0x70001922, 0x0000 }, + { 0x70001924, 0x01f8 }, + { 0x70001926, 0x0228 }, + { 0x70001928, 0x0000 }, + { 0x7000192a, 0x0000 }, + { 0x7000192c, 0x0000 }, + { 0x7000192e, 0x0000 }, + { 0x70001930, 0x0208 }, + { 0x70001932, 0x0238 }, + { 0x70001934, 0x0000 }, + { 0x70001936, 0x0000 }, + { 0x70001938, 0x0000 }, + { 0x7000193a, 0x0000 }, + { 0x7000193c, 0x0218 }, + { 0x7000193e, 0x0238 }, + { 0x70001940, 0x0000 }, + { 0x70001942, 0x0000 }, + { 0x70001944, 0x0000 }, + { 0x70001946, 0x0000 }, + { 0x70001948, 0x0001 }, + { 0x7000194a, 0x0009 }, + { 0x7000194c, 0x00de }, + { 0x7000194e, 0x05c0 }, + { 0x70001950, 0x0000 }, + { 0x70001952, 0x0000 }, + { 0x70001954, 0x00df }, + { 0x70001956, 0x00e4 }, + { 0x70001958, 0x01f8 }, + { 0x7000195a, 0x01fd }, + { 0x7000195c, 0x05b6 }, + { 0x7000195e, 0x05bb }, + { 0x70001960, 0x0000 }, + { 0x70001962, 0x0000 }, + { 0x70001964, 0x0000 }, + { 0x70001966, 0x0000 }, + { 0x70001968, 0x0000 }, + { 0x7000196a, 0x0000 }, + { 0x7000196c, 0x0000 }, + { 0x7000196e, 0x0000 }, + { 0x70001970, 0x0000 }, + { 0x70001972, 0x0000 }, + { 0x70001974, 0x0000 }, + { 0x70001976, 0x0000 }, + { 0x70001978, 0x01f8 }, + { 0x7000197a, 0x0000 }, + { 0x7000197c, 0x0000 }, + { 0x7000197e, 0x0077 }, + { 0x70001980, 0x007e }, + { 0x70001982, 0x024f }, + { 0x70001984, 0x025e }, + { 0x70001986, 0x0000 }, + { 0x70001988, 0x0000 }, + { 0x7000198a, 0x0000 }, + { 0x7000198c, 0x0000 }, + { 0x7000198e, 0x0004 }, + { 0x70001990, 0x09d1 }, + { 0x70001992, 0x0000 }, + { 0x70001994, 0x0000 }, + { 0x70001996, 0x0001 }, + { 0x70001998, 0x09d5 }, + { 0x7000199a, 0x0000 }, + { 0x7000199c, 0x0000 }, + { 0x7000199e, 0x0008 }, + { 0x700019a0, 0x09d5 }, + { 0x700019a2, 0x0000 }, + { 0x700019a4, 0x0000 }, + { 0x700019a6, 0x02aa }, + { 0x700019a8, 0x0326 }, + { 0x700019aa, 0x0000 }, + { 0x700019ac, 0x0000 }, + { 0x700019ae, 0x02aa }, + { 0x700019b0, 0x09d1 }, + { 0x700019b2, 0x0000 }, + { 0x700019b4, 0x0000 }, + { 0x700019b6, 0x02aa }, + { 0x700019b8, 0x09d5 }, + { 0x700019ba, 0x0000 }, + { 0x700019bc, 0x0000 }, + { 0x700019be, 0x02aa }, + { 0x700019c0, 0x0327 }, + { 0x700019c2, 0x0000 }, + { 0x700019c4, 0x0000 }, + { 0x700019c6, 0x0000 }, + { 0x700019c8, 0x0000 }, + { 0x700019ca, 0x0000 }, + { 0x700019cc, 0x0000 }, + { 0x700019ce, 0x0008 }, + { 0x700019d0, 0x0084 }, + { 0x700019d2, 0x0000 }, + { 0x700019d4, 0x0000 }, + { 0x700019d6, 0x0008 }, + { 0x700019d8, 0x008d }, + { 0x700019da, 0x0000 }, + { 0x700019dc, 0x0000 }, + { 0x700019de, 0x0008 }, + { 0x700019e0, 0x02aa }, + { 0x700019e2, 0x0000 }, + { 0x700019e4, 0x0000 }, + { 0x700019e6, 0x00aa }, + { 0x700019e8, 0x02aa }, + { 0x700019ea, 0x03ad }, + { 0x700019ec, 0x09cd }, + { 0x700019ee, 0x0000 }, + { 0x700019f0, 0x0000 }, + { 0x700019f2, 0x0000 }, + { 0x700019f4, 0x0000 }, + { 0x700019f6, 0x02ae }, + { 0x700019f8, 0x02de }, + { 0x700019fa, 0x0000 }, + { 0x700019fc, 0x0000 }, + { 0x700019fe, 0x0000 }, + { 0x70001a00, 0x0000 }, + { 0x70001a02, 0x02be }, + { 0x70001a04, 0x02ee }, + { 0x70001a06, 0x0000 }, + { 0x70001a08, 0x0000 }, + { 0x70001a0a, 0x0000 }, + { 0x70001a0c, 0x0000 }, + { 0x70001a0e, 0x02ce }, + { 0x70001a10, 0x02ee }, + { 0x70001a12, 0x0000 }, + { 0x70001a14, 0x0000 }, + { 0x70001a16, 0x0000 }, + { 0x70001a18, 0x0000 }, + { 0x70001a1a, 0x0001 }, + { 0x70001a1c, 0x0009 }, + { 0x70001a1e, 0x0095 }, + { 0x70001a20, 0x09db }, + { 0x70001a22, 0x0000 }, + { 0x70001a24, 0x0000 }, + { 0x70001a26, 0x0096 }, + { 0x70001a28, 0x009b }, + { 0x70001a2a, 0x02ae }, + { 0x70001a2c, 0x02b3 }, + { 0x70001a2e, 0x09d1 }, + { 0x70001a30, 0x09d6 }, + { 0x70001a32, 0x0000 }, + { 0x70001a34, 0x0000 }, + { 0x70001a36, 0x0000 }, + { 0x70001a38, 0x0000 }, + { 0x70001a3a, 0x0000 }, + { 0x70001a3c, 0x0000 }, + { 0x70001a3e, 0x0000 }, + { 0x70001a40, 0x0000 }, + { 0x70001a42, 0x0000 }, + { 0x70001a44, 0x0000 }, + { 0x70001a46, 0x0000 }, + { 0x70001a48, 0x0000 }, + { 0x70001a4a, 0x02ae }, + { 0x70001a4c, 0x0000 }, + { 0x70001a4e, 0x0000 }, + { 0x70001a50, 0x0009 }, + { 0x70001a52, 0x0010 }, + { 0x70001a54, 0x0327 }, + { 0x70001a56, 0x0336 }, + { 0x70001a58, 0x0000 }, + { 0x70001a5a, 0x0000 }, + { 0x70001a5c, 0x0000 }, + { 0x70001a5e, 0x0000 }, + { 0x70001af8, 0x5a3c }, + { 0x70001896, 0x0002 }, + { 0x70001898, 0x0000 }, + { 0x7000189a, 0x0003 }, + { 0x7000189e, 0x0fb0 }, + { 0x700018ac, 0x0060 }, + { 0x700018ae, 0x0060 }, + { 0x700018b0, 0x05c0 }, + { 0x700018b2, 0x05c0 }, + { 0x70001aea, 0x8080 }, + { 0x70001aec, 0x0080 }, + { 0x70001ae0, 0x0000 }, + { 0x70001a72, 0x0000 }, + { 0x700018a2, 0x0004 }, + { 0x70001a6a, 0x009a }, + { 0x7000385e, 0x024c }, + { 0x70000ee6, 0x0000 }, + { 0x70001b2a, 0x0300 }, + { 0x70001b2c, 0x00d6 }, + { 0x70001b2e, 0x008d }, + { 0x70001b30, 0x00cf }, + { 0x70001b32, 0x0084 }, + { 0x70000722, 0x0100 }, + { 0x70000726, 0x0001 }, + { 0x700008d6, 0x0001 }, + { 0x7000146e, 0x0000 }, + { 0x700008dc, 0x0000 }, + { 0x70003af8, 0xb570 }, + { 0x70003afa, 0x4b39 }, + { 0x70003afc, 0x4939 }, + { 0x70003afe, 0x483a }, + { 0x70003b00, 0x2200 }, + { 0x70003b02, 0xc008 }, + { 0x70003b04, 0x6001 }, + { 0x70003b06, 0x4939 }, + { 0x70003b08, 0x4839 }, + { 0x70003b0a, 0x2401 }, + { 0x70003b0c, 0xf000 }, + { 0x70003b0e, 0xfbd4 }, + { 0x70003b10, 0x4938 }, + { 0x70003b12, 0x4839 }, + { 0x70003b14, 0x2502 }, + { 0x70003b16, 0x0022 }, + { 0x70003b18, 0xf000 }, + { 0x70003b1a, 0xfbce }, + { 0x70003b1c, 0x4837 }, + { 0x70003b1e, 0x0261 }, + { 0x70003b20, 0x8001 }, + { 0x70003b22, 0x2100 }, + { 0x70003b24, 0x8041 }, + { 0x70003b26, 0x4936 }, + { 0x70003b28, 0x4836 }, + { 0x70003b2a, 0x6041 }, + { 0x70003b2c, 0x4936 }, + { 0x70003b2e, 0x4837 }, + { 0x70003b30, 0x2403 }, + { 0x70003b32, 0x002a }, + { 0x70003b34, 0xf000 }, + { 0x70003b36, 0xfbc0 }, + { 0x70003b38, 0x4832 }, + { 0x70003b3a, 0x4935 }, + { 0x70003b3c, 0x30c0 }, + { 0x70003b3e, 0x63c1 }, + { 0x70003b40, 0x4930 }, + { 0x70003b42, 0x4834 }, + { 0x70003b44, 0x3980 }, + { 0x70003b46, 0x6408 }, + { 0x70003b48, 0x4833 }, + { 0x70003b4a, 0x4934 }, + { 0x70003b4c, 0x6388 }, + { 0x70003b4e, 0x4934 }, + { 0x70003b50, 0x4834 }, + { 0x70003b52, 0x0022 }, + { 0x70003b54, 0x2504 }, + { 0x70003b56, 0xf000 }, + { 0x70003b58, 0xfbaf }, + { 0x70003b5a, 0x4933 }, + { 0x70003b5c, 0x4833 }, + { 0x70003b5e, 0x2405 }, + { 0x70003b60, 0x002a }, + { 0x70003b62, 0xf000 }, + { 0x70003b64, 0xf881 }, + { 0x70003b66, 0x491f }, + { 0x70003b68, 0x4830 }, + { 0x70003b6a, 0x0022 }, + { 0x70003b6c, 0x2506 }, + { 0x70003b6e, 0x39b6 }, + { 0x70003b70, 0x1d80 }, + { 0x70003b72, 0xf000 }, + { 0x70003b74, 0xf879 }, + { 0x70003b76, 0x482d }, + { 0x70003b78, 0x492d }, + { 0x70003b7a, 0x2407 }, + { 0x70003b7c, 0x002a }, + { 0x70003b7e, 0x300c }, + { 0x70003b80, 0xf000 }, + { 0x70003b82, 0xf872 }, + { 0x70003b84, 0x4829 }, + { 0x70003b86, 0x492b }, + { 0x70003b88, 0x0022 }, + { 0x70003b8a, 0x2508 }, + { 0x70003b8c, 0x3010 }, + { 0x70003b8e, 0xf000 }, + { 0x70003b90, 0xf86b }, + { 0x70003b92, 0x4929 }, + { 0x70003b94, 0x4829 }, + { 0x70003b96, 0x2409 }, + { 0x70003b98, 0x002a }, + { 0x70003b9a, 0xf000 }, + { 0x70003b9c, 0xfb8d }, + { 0x70003b9e, 0x4928 }, + { 0x70003ba0, 0x4828 }, + { 0x70003ba2, 0x0022 }, + { 0x70003ba4, 0x250a }, + { 0x70003ba6, 0xf000 }, + { 0x70003ba8, 0xfb87 }, + { 0x70003baa, 0x4927 }, + { 0x70003bac, 0x4827 }, + { 0x70003bae, 0x240b }, + { 0x70003bb0, 0x002a }, + { 0x70003bb2, 0xf000 }, + { 0x70003bb4, 0xfb81 }, + { 0x70003bb6, 0x4926 }, + { 0x70003bb8, 0x4826 }, + { 0x70003bba, 0x0022 }, + { 0x70003bbc, 0x250c }, + { 0x70003bbe, 0xf000 }, + { 0x70003bc0, 0xfb7b }, + { 0x70003bc2, 0x4925 }, + { 0x70003bc4, 0x4825 }, + { 0x70003bc6, 0x240d }, + { 0x70003bc8, 0x002a }, + { 0x70003bca, 0xf000 }, + { 0x70003bcc, 0xfb75 }, + { 0x70003bce, 0x4924 }, + { 0x70003bd0, 0x4824 }, + { 0x70003bd2, 0x0022 }, + { 0x70003bd4, 0xf000 }, + { 0x70003bd6, 0xfb70 }, + { 0x70003bd8, 0xbc70 }, + { 0x70003bda, 0xbc08 }, + { 0x70003bdc, 0x4718 }, + { 0x70003bde, 0x0000 }, + { 0x70003be0, 0x018f }, + { 0x70003be2, 0x4ec2 }, + { 0x70003be4, 0x037f }, + { 0x70003be6, 0x0000 }, + { 0x70003be8, 0x1f90 }, + { 0x70003bea, 0x7000 }, + { 0x70003bec, 0x3c81 }, + { 0x70003bee, 0x7000 }, + { 0x70003bf0, 0xe38b }, + { 0x70003bf2, 0x0000 }, + { 0x70003bf4, 0x3cb9 }, + { 0x70003bf6, 0x7000 }, + { 0x70003bf8, 0xc3b1 }, + { 0x70003bfa, 0x0000 }, + { 0x70003bfc, 0x4780 }, + { 0x70003bfe, 0x7000 }, + { 0x70003c00, 0x3d17 }, + { 0x70003c02, 0x7000 }, + { 0x70003c04, 0x0080 }, + { 0x70003c06, 0x7000 }, + { 0x70003c08, 0x3d53 }, + { 0x70003c0a, 0x7000 }, + { 0x70003c0c, 0xb49d }, + { 0x70003c0e, 0x0000 }, + { 0x70003c10, 0x3dff }, + { 0x70003c12, 0x7000 }, + { 0x70003c14, 0x3db3 }, + { 0x70003c16, 0x7000 }, + { 0x70003c18, 0xffff }, + { 0x70003c1a, 0x00ff }, + { 0x70003c1c, 0x17e0 }, + { 0x70003c1e, 0x7000 }, + { 0x70003c20, 0x3f7b }, + { 0x70003c22, 0x7000 }, + { 0x70003c24, 0x053d }, + { 0x70003c26, 0x0000 }, + { 0x70003c28, 0x0000 }, + { 0x70003c2a, 0x0a89 }, + { 0x70003c2c, 0x6cd2 }, + { 0x70003c2e, 0x0000 }, + { 0x70003c30, 0x0000 }, + { 0x70003c32, 0x0a9a }, + { 0x70003c34, 0x0000 }, + { 0x70003c36, 0x02d2 }, + { 0x70003c38, 0x3fc9 }, + { 0x70003c3a, 0x7000 }, + { 0x70003c3c, 0x9e65 }, + { 0x70003c3e, 0x0000 }, + { 0x70003c40, 0x403d }, + { 0x70003c42, 0x7000 }, + { 0x70003c44, 0x7c49 }, + { 0x70003c46, 0x0000 }, + { 0x70003c48, 0x40b1 }, + { 0x70003c4a, 0x7000 }, + { 0x70003c4c, 0x7c63 }, + { 0x70003c4e, 0x0000 }, + { 0x70003c50, 0x40cd }, + { 0x70003c52, 0x7000 }, + { 0x70003c54, 0x8f01 }, + { 0x70003c56, 0x0000 }, + { 0x70003c58, 0x416f }, + { 0x70003c5a, 0x7000 }, + { 0x70003c5c, 0x7f3f }, + { 0x70003c5e, 0x0000 }, + { 0x70003c60, 0x41fd }, + { 0x70003c62, 0x7000 }, + { 0x70003c64, 0x98c5 }, + { 0x70003c66, 0x0000 }, + { 0x70003c68, 0xb570 }, + { 0x70003c6a, 0x000c }, + { 0x70003c6c, 0x0015 }, + { 0x70003c6e, 0x0029 }, + { 0x70003c70, 0xf000 }, + { 0x70003c72, 0xfb2a }, + { 0x70003c74, 0x49f8 }, + { 0x70003c76, 0x00a8 }, + { 0x70003c78, 0x500c }, + { 0x70003c7a, 0xbc70 }, + { 0x70003c7c, 0xbc08 }, + { 0x70003c7e, 0x4718 }, + { 0x70003c80, 0x6808 }, + { 0x70003c82, 0x0400 }, + { 0x70003c84, 0x0c00 }, + { 0x70003c86, 0x6849 }, + { 0x70003c88, 0x0409 }, + { 0x70003c8a, 0x0c09 }, + { 0x70003c8c, 0x4af3 }, + { 0x70003c8e, 0x8992 }, + { 0x70003c90, 0x2a00 }, + { 0x70003c92, 0xd00d }, + { 0x70003c94, 0x2300 }, + { 0x70003c96, 0x1a89 }, + { 0x70003c98, 0xd400 }, + { 0x70003c9a, 0x000b }, + { 0x70003c9c, 0x0419 }, + { 0x70003c9e, 0x0c09 }, + { 0x70003ca0, 0x23ff }, + { 0x70003ca2, 0x33c1 }, + { 0x70003ca4, 0x1810 }, + { 0x70003ca6, 0x4298 }, + { 0x70003ca8, 0xd800 }, + { 0x70003caa, 0x0003 }, + { 0x70003cac, 0x0418 }, + { 0x70003cae, 0x0c00 }, + { 0x70003cb0, 0x4aeb }, + { 0x70003cb2, 0x8150 }, + { 0x70003cb4, 0x8191 }, + { 0x70003cb6, 0x4770 }, + { 0x70003cb8, 0xb5f3 }, + { 0x70003cba, 0x0004 }, + { 0x70003cbc, 0xb081 }, + { 0x70003cbe, 0x9802 }, + { 0x70003cc0, 0x6800 }, + { 0x70003cc2, 0x0600 }, + { 0x70003cc4, 0x0e00 }, + { 0x70003cc6, 0x2201 }, + { 0x70003cc8, 0x0015 }, + { 0x70003cca, 0x0021 }, + { 0x70003ccc, 0x3910 }, + { 0x70003cce, 0x408a }, + { 0x70003cd0, 0x40a5 }, + { 0x70003cd2, 0x4fe4 }, + { 0x70003cd4, 0x0016 }, + { 0x70003cd6, 0x2c10 }, + { 0x70003cd8, 0xda03 }, + { 0x70003cda, 0x8839 }, + { 0x70003cdc, 0x43a9 }, + { 0x70003cde, 0x8039 }, + { 0x70003ce0, 0xe002 }, + { 0x70003ce2, 0x8879 }, + { 0x70003ce4, 0x43b1 }, + { 0x70003ce6, 0x8079 }, + { 0x70003ce8, 0xf000 }, + { 0x70003cea, 0xfaf6 }, + { 0x70003cec, 0x2c10 }, + { 0x70003cee, 0xda03 }, + { 0x70003cf0, 0x8839 }, + { 0x70003cf2, 0x4329 }, + { 0x70003cf4, 0x8039 }, + { 0x70003cf6, 0xe002 }, + { 0x70003cf8, 0x8879 }, + { 0x70003cfa, 0x4331 }, + { 0x70003cfc, 0x8079 }, + { 0x70003cfe, 0x49da }, + { 0x70003d00, 0x8809 }, + { 0x70003d02, 0x2900 }, + { 0x70003d04, 0xd102 }, + { 0x70003d06, 0xf000 }, + { 0x70003d08, 0xfaef }, + { 0x70003d0a, 0x2000 }, + { 0x70003d0c, 0x9902 }, + { 0x70003d0e, 0x6008 }, + { 0x70003d10, 0xbcfe }, + { 0x70003d12, 0xbc08 }, + { 0x70003d14, 0x4718 }, + { 0x70003d16, 0xb538 }, + { 0x70003d18, 0x9c04 }, + { 0x70003d1a, 0x0015 }, + { 0x70003d1c, 0x002a }, + { 0x70003d1e, 0x9400 }, + { 0x70003d20, 0xf000 }, + { 0x70003d22, 0xfaea }, + { 0x70003d24, 0x4ad1 }, + { 0x70003d26, 0x8811 }, + { 0x70003d28, 0x2900 }, + { 0x70003d2a, 0xd00f }, + { 0x70003d2c, 0x8820 }, + { 0x70003d2e, 0x4281 }, + { 0x70003d30, 0xd20c }, + { 0x70003d32, 0x8861 }, + { 0x70003d34, 0x8853 }, + { 0x70003d36, 0x4299 }, + { 0x70003d38, 0xd200 }, + { 0x70003d3a, 0x1e40 }, + { 0x70003d3c, 0x0400 }, + { 0x70003d3e, 0x0c00 }, + { 0x70003d40, 0x8020 }, + { 0x70003d42, 0x8851 }, + { 0x70003d44, 0x8061 }, + { 0x70003d46, 0x4368 }, + { 0x70003d48, 0x1840 }, + { 0x70003d4a, 0x6060 }, + { 0x70003d4c, 0xbc38 }, + { 0x70003d4e, 0xbc08 }, + { 0x70003d50, 0x4718 }, + { 0x70003d52, 0xb5f8 }, + { 0x70003d54, 0x0004 }, + { 0x70003d56, 0x6808 }, + { 0x70003d58, 0x0400 }, + { 0x70003d5a, 0x0c00 }, + { 0x70003d5c, 0x2201 }, + { 0x70003d5e, 0x0015 }, + { 0x70003d60, 0x0021 }, + { 0x70003d62, 0x3910 }, + { 0x70003d64, 0x408a }, + { 0x70003d66, 0x40a5 }, + { 0x70003d68, 0x4fbe }, + { 0x70003d6a, 0x0016 }, + { 0x70003d6c, 0x2c10 }, + { 0x70003d6e, 0xda03 }, + { 0x70003d70, 0x8839 }, + { 0x70003d72, 0x43a9 }, + { 0x70003d74, 0x8039 }, + { 0x70003d76, 0xe002 }, + { 0x70003d78, 0x8879 }, + { 0x70003d7a, 0x43b1 }, + { 0x70003d7c, 0x8079 }, + { 0x70003d7e, 0xf000 }, + { 0x70003d80, 0xfac3 }, + { 0x70003d82, 0x2c10 }, + { 0x70003d84, 0xda03 }, + { 0x70003d86, 0x8838 }, + { 0x70003d88, 0x4328 }, + { 0x70003d8a, 0x8038 }, + { 0x70003d8c, 0xe002 }, + { 0x70003d8e, 0x8878 }, + { 0x70003d90, 0x4330 }, + { 0x70003d92, 0x8078 }, + { 0x70003d94, 0x48b6 }, + { 0x70003d96, 0x8800 }, + { 0x70003d98, 0x0400 }, + { 0x70003d9a, 0xd507 }, + { 0x70003d9c, 0x4bb5 }, + { 0x70003d9e, 0x7819 }, + { 0x70003da0, 0x4ab5 }, + { 0x70003da2, 0x7810 }, + { 0x70003da4, 0x7018 }, + { 0x70003da6, 0x7011 }, + { 0x70003da8, 0x49b4 }, + { 0x70003daa, 0x8188 }, + { 0x70003dac, 0xbcf8 }, + { 0x70003dae, 0xbc08 }, + { 0x70003db0, 0x4718 }, + { 0x70003db2, 0xb538 }, + { 0x70003db4, 0x48b2 }, + { 0x70003db6, 0x4669 }, + { 0x70003db8, 0xf000 }, + { 0x70003dba, 0xfaae }, + { 0x70003dbc, 0x48b1 }, + { 0x70003dbe, 0x49b0 }, + { 0x70003dc0, 0x69c2 }, + { 0x70003dc2, 0x2400 }, + { 0x70003dc4, 0x31a8 }, + { 0x70003dc6, 0x2a00 }, + { 0x70003dc8, 0xd008 }, + { 0x70003dca, 0x61c4 }, + { 0x70003dcc, 0x684a }, + { 0x70003dce, 0x6242 }, + { 0x70003dd0, 0x6282 }, + { 0x70003dd2, 0x466b }, + { 0x70003dd4, 0x881a }, + { 0x70003dd6, 0x6302 }, + { 0x70003dd8, 0x885a }, + { 0x70003dda, 0x6342 }, + { 0x70003ddc, 0x6a02 }, + { 0x70003dde, 0x2a00 }, + { 0x70003de0, 0xd00a }, + { 0x70003de2, 0x6204 }, + { 0x70003de4, 0x6849 }, + { 0x70003de6, 0x6281 }, + { 0x70003de8, 0x466b }, + { 0x70003dea, 0x8819 }, + { 0x70003dec, 0x6301 }, + { 0x70003dee, 0x8859 }, + { 0x70003df0, 0x6341 }, + { 0x70003df2, 0x49a5 }, + { 0x70003df4, 0x88c9 }, + { 0x70003df6, 0x63c1 }, + { 0x70003df8, 0xf000 }, + { 0x70003dfa, 0xfa96 }, + { 0x70003dfc, 0xe7a6 }, + { 0x70003dfe, 0xb5f0 }, + { 0x70003e00, 0xb08b }, + { 0x70003e02, 0x20ff }, + { 0x70003e04, 0x1c40 }, + { 0x70003e06, 0x49a1 }, + { 0x70003e08, 0x89cc }, + { 0x70003e0a, 0x4e9e }, + { 0x70003e0c, 0x6ab1 }, + { 0x70003e0e, 0x4284 }, + { 0x70003e10, 0xd101 }, + { 0x70003e12, 0x489f }, + { 0x70003e14, 0x6081 }, + { 0x70003e16, 0x6a70 }, + { 0x70003e18, 0x0200 }, + { 0x70003e1a, 0xf000 }, + { 0x70003e1c, 0xfa8d }, + { 0x70003e1e, 0x0400 }, + { 0x70003e20, 0x0c00 }, + { 0x70003e22, 0x4a96 }, + { 0x70003e24, 0x8a11 }, + { 0x70003e26, 0x9109 }, + { 0x70003e28, 0x2101 }, + { 0x70003e2a, 0x0349 }, + { 0x70003e2c, 0x4288 }, + { 0x70003e2e, 0xd200 }, + { 0x70003e30, 0x0001 }, + { 0x70003e32, 0x4a92 }, + { 0x70003e34, 0x8211 }, + { 0x70003e36, 0x4d97 }, + { 0x70003e38, 0x8829 }, + { 0x70003e3a, 0x9108 }, + { 0x70003e3c, 0x4a8b }, + { 0x70003e3e, 0x2303 }, + { 0x70003e40, 0x3222 }, + { 0x70003e42, 0x1f91 }, + { 0x70003e44, 0xf000 }, + { 0x70003e46, 0xfa7e }, + { 0x70003e48, 0x8028 }, + { 0x70003e4a, 0x488e }, + { 0x70003e4c, 0x4987 }, + { 0x70003e4e, 0x6bc2 }, + { 0x70003e50, 0x6ac0 }, + { 0x70003e52, 0x4282 }, + { 0x70003e54, 0xd201 }, + { 0x70003e56, 0x8cc8 }, + { 0x70003e58, 0x8028 }, + { 0x70003e5a, 0x88e8 }, + { 0x70003e5c, 0x9007 }, + { 0x70003e5e, 0x2240 }, + { 0x70003e60, 0x4310 }, + { 0x70003e62, 0x80e8 }, + { 0x70003e64, 0x2000 }, + { 0x70003e66, 0x0041 }, + { 0x70003e68, 0x194b }, + { 0x70003e6a, 0x001e }, + { 0x70003e6c, 0x3680 }, + { 0x70003e6e, 0x8bb2 }, + { 0x70003e70, 0xaf04 }, + { 0x70003e72, 0x527a }, + { 0x70003e74, 0x4a7d }, + { 0x70003e76, 0x188a }, + { 0x70003e78, 0x8897 }, + { 0x70003e7a, 0x83b7 }, + { 0x70003e7c, 0x33a0 }, + { 0x70003e7e, 0x891f }, + { 0x70003e80, 0xae01 }, + { 0x70003e82, 0x5277 }, + { 0x70003e84, 0x8a11 }, + { 0x70003e86, 0x8119 }, + { 0x70003e88, 0x1c40 }, + { 0x70003e8a, 0x0400 }, + { 0x70003e8c, 0x0c00 }, + { 0x70003e8e, 0x2806 }, + { 0x70003e90, 0xd3e9 }, + { 0x70003e92, 0xf000 }, + { 0x70003e94, 0xfa5f }, + { 0x70003e96, 0xf000 }, + { 0x70003e98, 0xfa65 }, + { 0x70003e9a, 0x4f79 }, + { 0x70003e9c, 0x37a8 }, + { 0x70003e9e, 0x2800 }, + { 0x70003ea0, 0xd10a }, + { 0x70003ea2, 0x1fe0 }, + { 0x70003ea4, 0x38fd }, + { 0x70003ea6, 0xd001 }, + { 0x70003ea8, 0x1cc0 }, + { 0x70003eaa, 0xd105 }, + { 0x70003eac, 0x4874 }, + { 0x70003eae, 0x8829 }, + { 0x70003eb0, 0x3818 }, + { 0x70003eb2, 0x6840 }, + { 0x70003eb4, 0x4348 }, + { 0x70003eb6, 0x6078 }, + { 0x70003eb8, 0x4972 }, + { 0x70003eba, 0x6878 }, + { 0x70003ebc, 0x6b89 }, + { 0x70003ebe, 0x4288 }, + { 0x70003ec0, 0xd300 }, + { 0x70003ec2, 0x0008 }, + { 0x70003ec4, 0x6078 }, + { 0x70003ec6, 0x2000 }, + { 0x70003ec8, 0x0041 }, + { 0x70003eca, 0xaa04 }, + { 0x70003ecc, 0x5a53 }, + { 0x70003ece, 0x194a }, + { 0x70003ed0, 0x269c }, + { 0x70003ed2, 0x52b3 }, + { 0x70003ed4, 0xab01 }, + { 0x70003ed6, 0x5a59 }, + { 0x70003ed8, 0x32a0 }, + { 0x70003eda, 0x8111 }, + { 0x70003edc, 0x1c40 }, + { 0x70003ede, 0x0400 }, + { 0x70003ee0, 0x0c00 }, + { 0x70003ee2, 0x2806 }, + { 0x70003ee4, 0xd3f0 }, + { 0x70003ee6, 0x4965 }, + { 0x70003ee8, 0x9809 }, + { 0x70003eea, 0x8208 }, + { 0x70003eec, 0x9808 }, + { 0x70003eee, 0x8028 }, + { 0x70003ef0, 0x9807 }, + { 0x70003ef2, 0x80e8 }, + { 0x70003ef4, 0x1fe0 }, + { 0x70003ef6, 0x38fd }, + { 0x70003ef8, 0xd13b }, + { 0x70003efa, 0x4d64 }, + { 0x70003efc, 0x89e8 }, + { 0x70003efe, 0x1fc1 }, + { 0x70003f00, 0x39ff }, + { 0x70003f02, 0xd136 }, + { 0x70003f04, 0x4c5f }, + { 0x70003f06, 0x8ae0 }, + { 0x70003f08, 0xf000 }, + { 0x70003f0a, 0xfa34 }, + { 0x70003f0c, 0x0006 }, + { 0x70003f0e, 0x8b20 }, + { 0x70003f10, 0xf000 }, + { 0x70003f12, 0xfa38 }, + { 0x70003f14, 0x9000 }, + { 0x70003f16, 0x6aa1 }, + { 0x70003f18, 0x6878 }, + { 0x70003f1a, 0x1809 }, + { 0x70003f1c, 0x0200 }, + { 0x70003f1e, 0xf000 }, + { 0x70003f20, 0xfa0b }, + { 0x70003f22, 0x0400 }, + { 0x70003f24, 0x0c00 }, + { 0x70003f26, 0x0022 }, + { 0x70003f28, 0x3246 }, + { 0x70003f2a, 0x0011 }, + { 0x70003f2c, 0x310a }, + { 0x70003f2e, 0x2305 }, + { 0x70003f30, 0xf000 }, + { 0x70003f32, 0xfa08 }, + { 0x70003f34, 0x66e8 }, + { 0x70003f36, 0x6b23 }, + { 0x70003f38, 0x0002 }, + { 0x70003f3a, 0x0031 }, + { 0x70003f3c, 0x0018 }, + { 0x70003f3e, 0xf000 }, + { 0x70003f40, 0xfa29 }, + { 0x70003f42, 0x466b }, + { 0x70003f44, 0x8518 }, + { 0x70003f46, 0x6eea }, + { 0x70003f48, 0x6b60 }, + { 0x70003f4a, 0x9900 }, + { 0x70003f4c, 0xf000 }, + { 0x70003f4e, 0xfa22 }, + { 0x70003f50, 0x466b }, + { 0x70003f52, 0x8558 }, + { 0x70003f54, 0x0029 }, + { 0x70003f56, 0x980a }, + { 0x70003f58, 0x3170 }, + { 0x70003f5a, 0xf000 }, + { 0x70003f5c, 0xfa23 }, + { 0x70003f5e, 0x0028 }, + { 0x70003f60, 0x3060 }, + { 0x70003f62, 0x8a02 }, + { 0x70003f64, 0x4946 }, + { 0x70003f66, 0x3128 }, + { 0x70003f68, 0x808a }, + { 0x70003f6a, 0x8a42 }, + { 0x70003f6c, 0x80ca }, + { 0x70003f6e, 0x8a80 }, + { 0x70003f70, 0x8108 }, + { 0x70003f72, 0xb00b }, + { 0x70003f74, 0xbcf0 }, + { 0x70003f76, 0xbc08 }, + { 0x70003f78, 0x4718 }, + { 0x70003f7a, 0xb570 }, + { 0x70003f7c, 0x2400 }, + { 0x70003f7e, 0x4d46 }, + { 0x70003f80, 0x4846 }, + { 0x70003f82, 0x8881 }, + { 0x70003f84, 0x4846 }, + { 0x70003f86, 0x8041 }, + { 0x70003f88, 0x2101 }, + { 0x70003f8a, 0x8001 }, + { 0x70003f8c, 0xf000 }, + { 0x70003f8e, 0xfa12 }, + { 0x70003f90, 0x4842 }, + { 0x70003f92, 0x3820 }, + { 0x70003f94, 0x8bc0 }, + { 0x70003f96, 0xf000 }, + { 0x70003f98, 0xfa15 }, + { 0x70003f9a, 0x4b42 }, + { 0x70003f9c, 0x220d }, + { 0x70003f9e, 0x0712 }, + { 0x70003fa0, 0x18a8 }, + { 0x70003fa2, 0x8806 }, + { 0x70003fa4, 0x00e1 }, + { 0x70003fa6, 0x18c9 }, + { 0x70003fa8, 0x81ce }, + { 0x70003faa, 0x8846 }, + { 0x70003fac, 0x818e }, + { 0x70003fae, 0x8886 }, + { 0x70003fb0, 0x824e }, + { 0x70003fb2, 0x88c0 }, + { 0x70003fb4, 0x8208 }, + { 0x70003fb6, 0x3508 }, + { 0x70003fb8, 0x042d }, + { 0x70003fba, 0x0c2d }, + { 0x70003fbc, 0x1c64 }, + { 0x70003fbe, 0x0424 }, + { 0x70003fc0, 0x0c24 }, + { 0x70003fc2, 0x2c07 }, + { 0x70003fc4, 0xd3ec }, + { 0x70003fc6, 0xe658 }, + { 0x70003fc8, 0xb510 }, + { 0x70003fca, 0x4834 }, + { 0x70003fcc, 0x4c34 }, + { 0x70003fce, 0x88c0 }, + { 0x70003fd0, 0x8060 }, + { 0x70003fd2, 0x2001 }, + { 0x70003fd4, 0x8020 }, + { 0x70003fd6, 0x4831 }, + { 0x70003fd8, 0x3820 }, + { 0x70003fda, 0x8bc0 }, + { 0x70003fdc, 0xf000 }, + { 0x70003fde, 0xf9f2 }, + { 0x70003fe0, 0x88e0 }, + { 0x70003fe2, 0x4a31 }, + { 0x70003fe4, 0x2800 }, + { 0x70003fe6, 0xd003 }, + { 0x70003fe8, 0x4930 }, + { 0x70003fea, 0x8849 }, + { 0x70003fec, 0x2900 }, + { 0x70003fee, 0xd009 }, + { 0x70003ff0, 0x2001 }, + { 0x70003ff2, 0x03c0 }, + { 0x70003ff4, 0x8050 }, + { 0x70003ff6, 0x80d0 }, + { 0x70003ff8, 0x2000 }, + { 0x70003ffa, 0x8090 }, + { 0x70003ffc, 0x8110 }, + { 0x70003ffe, 0xbc10 }, + { 0x70004000, 0xbc08 }, + { 0x70004002, 0x4718 }, + { 0x70004004, 0x8050 }, + { 0x70004006, 0x8920 }, + { 0x70004008, 0x80d0 }, + { 0x7000400a, 0x8960 }, + { 0x7000400c, 0x0400 }, + { 0x7000400e, 0x1400 }, + { 0x70004010, 0x8090 }, + { 0x70004012, 0x89a1 }, + { 0x70004014, 0x0409 }, + { 0x70004016, 0x1409 }, + { 0x70004018, 0x8111 }, + { 0x7000401a, 0x89e3 }, + { 0x7000401c, 0x8a24 }, + { 0x7000401e, 0x2b00 }, + { 0x70004020, 0xd104 }, + { 0x70004022, 0x17c3 }, + { 0x70004024, 0x0f5b }, + { 0x70004026, 0x1818 }, + { 0x70004028, 0x10c0 }, + { 0x7000402a, 0x8090 }, + { 0x7000402c, 0x2c00 }, + { 0x7000402e, 0xd1e6 }, + { 0x70004030, 0x17c8 }, + { 0x70004032, 0x0f40 }, + { 0x70004034, 0x1840 }, + { 0x70004036, 0x10c0 }, + { 0x70004038, 0x8110 }, + { 0x7000403a, 0xe7e0 }, + { 0x7000403c, 0xb510 }, + { 0x7000403e, 0x000c }, + { 0x70004040, 0x4919 }, + { 0x70004042, 0x2204 }, + { 0x70004044, 0x6820 }, + { 0x70004046, 0x5e8a }, + { 0x70004048, 0x0140 }, + { 0x7000404a, 0x1a80 }, + { 0x7000404c, 0x0280 }, + { 0x7000404e, 0x8849 }, + { 0x70004050, 0xf000 }, + { 0x70004052, 0xf9c0 }, + { 0x70004054, 0x6020 }, + { 0x70004056, 0xe7d2 }, + { 0x70004058, 0x38d4 }, + { 0x7000405a, 0x7000 }, + { 0x7000405c, 0x17d0 }, + { 0x7000405e, 0x7000 }, + { 0x70004060, 0x5000 }, + { 0x70004062, 0xd000 }, + { 0x70004064, 0x1100 }, + { 0x70004066, 0xd000 }, + { 0x70004068, 0x171a }, + { 0x7000406a, 0x7000 }, + { 0x7000406c, 0x4780 }, + { 0x7000406e, 0x7000 }, + { 0x70004070, 0x2fca }, + { 0x70004072, 0x7000 }, + { 0x70004074, 0x2fc5 }, + { 0x70004076, 0x7000 }, + { 0x70004078, 0x2fc6 }, + { 0x7000407a, 0x7000 }, + { 0x7000407c, 0x2ed8 }, + { 0x7000407e, 0x7000 }, + { 0x70004080, 0x2bd0 }, + { 0x70004082, 0x7000 }, + { 0x70004084, 0x17e0 }, + { 0x70004086, 0x7000 }, + { 0x70004088, 0x2de8 }, + { 0x7000408a, 0x7000 }, + { 0x7000408c, 0x37e0 }, + { 0x7000408e, 0x7000 }, + { 0x70004090, 0x210c }, + { 0x70004092, 0x7000 }, + { 0x70004094, 0x1484 }, + { 0x70004096, 0x7000 }, + { 0x70004098, 0xa006 }, + { 0x7000409a, 0x0000 }, + { 0x7000409c, 0x0724 }, + { 0x7000409e, 0x7000 }, + { 0x700040a0, 0xa000 }, + { 0x700040a2, 0xd000 }, + { 0x700040a4, 0x2270 }, + { 0x700040a6, 0x7000 }, + { 0x700040a8, 0x2558 }, + { 0x700040aa, 0x7000 }, + { 0x700040ac, 0x146c }, + { 0x700040ae, 0x7000 }, + { 0x700040b0, 0xb510 }, + { 0x700040b2, 0x000c }, + { 0x700040b4, 0x4979 }, + { 0x700040b6, 0x2208 }, + { 0x700040b8, 0x6820 }, + { 0x700040ba, 0x5e8a }, + { 0x700040bc, 0x0140 }, + { 0x700040be, 0x1a80 }, + { 0x700040c0, 0x0280 }, + { 0x700040c2, 0x88c9 }, + { 0x700040c4, 0xf000 }, + { 0x700040c6, 0xf986 }, + { 0x700040c8, 0x6020 }, + { 0x700040ca, 0xe798 }, + { 0x700040cc, 0xb5fe }, + { 0x700040ce, 0x000c }, + { 0x700040d0, 0x6825 }, + { 0x700040d2, 0x6866 }, + { 0x700040d4, 0x68a0 }, + { 0x700040d6, 0x9001 }, + { 0x700040d8, 0x68e7 }, + { 0x700040da, 0x1ba8 }, + { 0x700040dc, 0x42b5 }, + { 0x700040de, 0xda00 }, + { 0x700040e0, 0x1b70 }, + { 0x700040e2, 0x9000 }, + { 0x700040e4, 0x496d }, + { 0x700040e6, 0x486e }, + { 0x700040e8, 0x884a }, + { 0x700040ea, 0x8843 }, + { 0x700040ec, 0x435a }, + { 0x700040ee, 0x2304 }, + { 0x700040f0, 0x5ecb }, + { 0x700040f2, 0x0a92 }, + { 0x700040f4, 0x18d2 }, + { 0x700040f6, 0x02d2 }, + { 0x700040f8, 0x0c12 }, + { 0x700040fa, 0x88cb }, + { 0x700040fc, 0x8880 }, + { 0x700040fe, 0x4343 }, + { 0x70004100, 0x0a98 }, + { 0x70004102, 0x2308 }, + { 0x70004104, 0x5ecb }, + { 0x70004106, 0x18c0 }, + { 0x70004108, 0x02c0 }, + { 0x7000410a, 0x0c00 }, + { 0x7000410c, 0x0411 }, + { 0x7000410e, 0x0400 }, + { 0x70004110, 0x1409 }, + { 0x70004112, 0x1400 }, + { 0x70004114, 0x1a08 }, + { 0x70004116, 0x4962 }, + { 0x70004118, 0x39e0 }, + { 0x7000411a, 0x6148 }, + { 0x7000411c, 0x9801 }, + { 0x7000411e, 0x3040 }, + { 0x70004120, 0x7880 }, + { 0x70004122, 0x2800 }, + { 0x70004124, 0xd103 }, + { 0x70004126, 0x9801 }, + { 0x70004128, 0x0029 }, + { 0x7000412a, 0xf000 }, + { 0x7000412c, 0xf959 }, + { 0x7000412e, 0x8839 }, + { 0x70004130, 0x9800 }, + { 0x70004132, 0x4281 }, + { 0x70004134, 0xd814 }, + { 0x70004136, 0x8879 }, + { 0x70004138, 0x9800 }, + { 0x7000413a, 0x4281 }, + { 0x7000413c, 0xd20c }, + { 0x7000413e, 0x9801 }, + { 0x70004140, 0x0029 }, + { 0x70004142, 0xf000 }, + { 0x70004144, 0xf955 }, + { 0x70004146, 0x9801 }, + { 0x70004148, 0x0029 }, + { 0x7000414a, 0xf000 }, + { 0x7000414c, 0xf951 }, + { 0x7000414e, 0x9801 }, + { 0x70004150, 0x0029 }, + { 0x70004152, 0xf000 }, + { 0x70004154, 0xf94d }, + { 0x70004156, 0xe003 }, + { 0x70004158, 0x9801 }, + { 0x7000415a, 0x0029 }, + { 0x7000415c, 0xf000 }, + { 0x7000415e, 0xf948 }, + { 0x70004160, 0x9801 }, + { 0x70004162, 0x0032 }, + { 0x70004164, 0x0039 }, + { 0x70004166, 0xf000 }, + { 0x70004168, 0xf94b }, + { 0x7000416a, 0x6020 }, + { 0x7000416c, 0xe5d0 }, + { 0x7000416e, 0xb57c }, + { 0x70004170, 0x484c }, + { 0x70004172, 0xa901 }, + { 0x70004174, 0x0004 }, + { 0x70004176, 0xf000 }, + { 0x70004178, 0xf8cf }, + { 0x7000417a, 0x466b }, + { 0x7000417c, 0x88d9 }, + { 0x7000417e, 0x8898 }, + { 0x70004180, 0x4b47 }, + { 0x70004182, 0x3346 }, + { 0x70004184, 0x1e9a }, + { 0x70004186, 0xf000 }, + { 0x70004188, 0xf943 }, + { 0x7000418a, 0x4846 }, + { 0x7000418c, 0x4944 }, + { 0x7000418e, 0x3812 }, + { 0x70004190, 0x3140 }, + { 0x70004192, 0x8a42 }, + { 0x70004194, 0x888b }, + { 0x70004196, 0x18d2 }, + { 0x70004198, 0x8242 }, + { 0x7000419a, 0x8ac2 }, + { 0x7000419c, 0x88c9 }, + { 0x7000419e, 0x1851 }, + { 0x700041a0, 0x82c1 }, + { 0x700041a2, 0x0020 }, + { 0x700041a4, 0x4669 }, + { 0x700041a6, 0xf000 }, + { 0x700041a8, 0xf8b7 }, + { 0x700041aa, 0x483f }, + { 0x700041ac, 0x214d }, + { 0x700041ae, 0x8301 }, + { 0x700041b0, 0x2196 }, + { 0x700041b2, 0x8381 }, + { 0x700041b4, 0x211d }, + { 0x700041b6, 0x3020 }, + { 0x700041b8, 0x8001 }, + { 0x700041ba, 0xf000 }, + { 0x700041bc, 0xf931 }, + { 0x700041be, 0xf000 }, + { 0x700041c0, 0xf937 }, + { 0x700041c2, 0x483a }, + { 0x700041c4, 0x4c3a }, + { 0x700041c6, 0x6e00 }, + { 0x700041c8, 0x60e0 }, + { 0x700041ca, 0x466b }, + { 0x700041cc, 0x8818 }, + { 0x700041ce, 0x8859 }, + { 0x700041d0, 0x0025 }, + { 0x700041d2, 0x1a40 }, + { 0x700041d4, 0x3540 }, + { 0x700041d6, 0x61a8 }, + { 0x700041d8, 0x4831 }, + { 0x700041da, 0x9900 }, + { 0x700041dc, 0x3060 }, + { 0x700041de, 0xf000 }, + { 0x700041e0, 0xf92f }, + { 0x700041e2, 0x466b }, + { 0x700041e4, 0x8819 }, + { 0x700041e6, 0x1de0 }, + { 0x700041e8, 0x30f9 }, + { 0x700041ea, 0x8741 }, + { 0x700041ec, 0x8859 }, + { 0x700041ee, 0x8781 }, + { 0x700041f0, 0x2000 }, + { 0x700041f2, 0x71a0 }, + { 0x700041f4, 0x74a8 }, + { 0x700041f6, 0xbc7c }, + { 0x700041f8, 0xbc08 }, + { 0x700041fa, 0x4718 }, + { 0x700041fc, 0xb5f8 }, + { 0x700041fe, 0x0005 }, + { 0x70004200, 0x6808 }, + { 0x70004202, 0x0400 }, + { 0x70004204, 0x0c00 }, + { 0x70004206, 0x684a }, + { 0x70004208, 0x0412 }, + { 0x7000420a, 0x0c12 }, + { 0x7000420c, 0x688e }, + { 0x7000420e, 0x68cc }, + { 0x70004210, 0x4922 }, + { 0x70004212, 0x884b }, + { 0x70004214, 0x4343 }, + { 0x70004216, 0x0a98 }, + { 0x70004218, 0x2304 }, + { 0x7000421a, 0x5ecb }, + { 0x7000421c, 0x18c0 }, + { 0x7000421e, 0x02c0 }, + { 0x70004220, 0x0c00 }, + { 0x70004222, 0x88cb }, + { 0x70004224, 0x4353 }, + { 0x70004226, 0x0a9a }, + { 0x70004228, 0x2308 }, + { 0x7000422a, 0x5ecb }, + { 0x7000422c, 0x18d1 }, + { 0x7000422e, 0x02c9 }, + { 0x70004230, 0x0c09 }, + { 0x70004232, 0x2701 }, + { 0x70004234, 0x003a }, + { 0x70004236, 0x40aa }, + { 0x70004238, 0x9200 }, + { 0x7000423a, 0x002a }, + { 0x7000423c, 0x3a10 }, + { 0x7000423e, 0x4097 }, + { 0x70004240, 0x2d10 }, + { 0x70004242, 0xda06 }, + { 0x70004244, 0x4a1b }, + { 0x70004246, 0x9b00 }, + { 0x70004248, 0x8812 }, + { 0x7000424a, 0x439a }, + { 0x7000424c, 0x4b19 }, + { 0x7000424e, 0x801a }, + { 0x70004250, 0xe003 }, + { 0x70004252, 0x4b18 }, + { 0x70004254, 0x885a }, + { 0x70004256, 0x43ba }, + { 0x70004258, 0x805a }, + { 0x7000425a, 0x0023 }, + { 0x7000425c, 0x0032 }, + { 0x7000425e, 0xf000 }, + { 0x70004260, 0xf8d7 }, + { 0x70004262, 0x2d10 }, + { 0x70004264, 0xda05 }, + { 0x70004266, 0x4913 }, + { 0x70004268, 0x9a00 }, + { 0x7000426a, 0x8808 }, + { 0x7000426c, 0x4310 }, + { 0x7000426e, 0x8008 }, + { 0x70004270, 0xe003 }, + { 0x70004272, 0x4810 }, + { 0x70004274, 0x8841 }, + { 0x70004276, 0x4339 }, + { 0x70004278, 0x8041 }, + { 0x7000427a, 0x4d0d }, + { 0x7000427c, 0x2000 }, + { 0x7000427e, 0x3580 }, + { 0x70004280, 0x88aa }, + { 0x70004282, 0x5e30 }, + { 0x70004284, 0x2100 }, + { 0x70004286, 0xf000 }, + { 0x70004288, 0xf8e3 }, + { 0x7000428a, 0x8030 }, + { 0x7000428c, 0x2000 }, + { 0x7000428e, 0x88aa }, + { 0x70004290, 0x5e20 }, + { 0x70004292, 0x2100 }, + { 0x70004294, 0xf000 }, + { 0x70004296, 0xf8dc }, + { 0x70004298, 0x8020 }, + { 0x7000429a, 0xe587 }, + { 0x7000429c, 0x2558 }, + { 0x7000429e, 0x7000 }, + { 0x700042a0, 0x2ab8 }, + { 0x700042a2, 0x7000 }, + { 0x700042a4, 0x145e }, + { 0x700042a6, 0x7000 }, + { 0x700042a8, 0x2698 }, + { 0x700042aa, 0x7000 }, + { 0x700042ac, 0x2bb8 }, + { 0x700042ae, 0x7000 }, + { 0x700042b0, 0x2998 }, + { 0x700042b2, 0x7000 }, + { 0x700042b4, 0x1100 }, + { 0x700042b6, 0xd000 }, + { 0x700042b8, 0x4778 }, + { 0x700042ba, 0x46c0 }, + { 0x700042bc, 0xc000 }, + { 0x700042be, 0xe59f }, + { 0x700042c0, 0xff1c }, + { 0x700042c2, 0xe12f }, + { 0x700042c4, 0x1789 }, + { 0x700042c6, 0x0001 }, + { 0x700042c8, 0x4778 }, + { 0x700042ca, 0x46c0 }, + { 0x700042cc, 0xc000 }, + { 0x700042ce, 0xe59f }, + { 0x700042d0, 0xff1c }, + { 0x700042d2, 0xe12f }, + { 0x700042d4, 0x16f1 }, + { 0x700042d6, 0x0001 }, + { 0x700042d8, 0x4778 }, + { 0x700042da, 0x46c0 }, + { 0x700042dc, 0xc000 }, + { 0x700042de, 0xe59f }, + { 0x700042e0, 0xff1c }, + { 0x700042e2, 0xe12f }, + { 0x700042e4, 0xc3b1 }, + { 0x700042e6, 0x0000 }, + { 0x700042e8, 0x4778 }, + { 0x700042ea, 0x46c0 }, + { 0x700042ec, 0xc000 }, + { 0x700042ee, 0xe59f }, + { 0x700042f0, 0xff1c }, + { 0x700042f2, 0xe12f }, + { 0x700042f4, 0xc36d }, + { 0x700042f6, 0x0000 }, + { 0x700042f8, 0x4778 }, + { 0x700042fa, 0x46c0 }, + { 0x700042fc, 0xc000 }, + { 0x700042fe, 0xe59f }, + { 0x70004300, 0xff1c }, + { 0x70004302, 0xe12f }, + { 0x70004304, 0xf6d7 }, + { 0x70004306, 0x0000 }, + { 0x70004308, 0x4778 }, + { 0x7000430a, 0x46c0 }, + { 0x7000430c, 0xc000 }, + { 0x7000430e, 0xe59f }, + { 0x70004310, 0xff1c }, + { 0x70004312, 0xe12f }, + { 0x70004314, 0xb49d }, + { 0x70004316, 0x0000 }, + { 0x70004318, 0x4778 }, + { 0x7000431a, 0x46c0 }, + { 0x7000431c, 0xc000 }, + { 0x7000431e, 0xe59f }, + { 0x70004320, 0xff1c }, + { 0x70004322, 0xe12f }, + { 0x70004324, 0x7edf }, + { 0x70004326, 0x0000 }, + { 0x70004328, 0x4778 }, + { 0x7000432a, 0x46c0 }, + { 0x7000432c, 0xc000 }, + { 0x7000432e, 0xe59f }, + { 0x70004330, 0xff1c }, + { 0x70004332, 0xe12f }, + { 0x70004334, 0x448d }, + { 0x70004336, 0x0000 }, + { 0x70004338, 0x4778 }, + { 0x7000433a, 0x46c0 }, + { 0x7000433c, 0xf004 }, + { 0x7000433e, 0xe51f }, + { 0x70004340, 0x29ec }, + { 0x70004342, 0x0001 }, + { 0x70004344, 0x4778 }, + { 0x70004346, 0x46c0 }, + { 0x70004348, 0xc000 }, + { 0x7000434a, 0xe59f }, + { 0x7000434c, 0xff1c }, + { 0x7000434e, 0xe12f }, + { 0x70004350, 0x2ef1 }, + { 0x70004352, 0x0000 }, + { 0x70004354, 0x4778 }, + { 0x70004356, 0x46c0 }, + { 0x70004358, 0xc000 }, + { 0x7000435a, 0xe59f }, + { 0x7000435c, 0xff1c }, + { 0x7000435e, 0xe12f }, + { 0x70004360, 0xee03 }, + { 0x70004362, 0x0000 }, + { 0x70004364, 0x4778 }, + { 0x70004366, 0x46c0 }, + { 0x70004368, 0xc000 }, + { 0x7000436a, 0xe59f }, + { 0x7000436c, 0xff1c }, + { 0x7000436e, 0xe12f }, + { 0x70004370, 0xa58b }, + { 0x70004372, 0x0000 }, + { 0x70004374, 0x4778 }, + { 0x70004376, 0x46c0 }, + { 0x70004378, 0xc000 }, + { 0x7000437a, 0xe59f }, + { 0x7000437c, 0xff1c }, + { 0x7000437e, 0xe12f }, + { 0x70004380, 0x7c49 }, + { 0x70004382, 0x0000 }, + { 0x70004384, 0x4778 }, + { 0x70004386, 0x46c0 }, + { 0x70004388, 0xc000 }, + { 0x7000438a, 0xe59f }, + { 0x7000438c, 0xff1c }, + { 0x7000438e, 0xe12f }, + { 0x70004390, 0x7c63 }, + { 0x70004392, 0x0000 }, + { 0x70004394, 0x4778 }, + { 0x70004396, 0x46c0 }, + { 0x70004398, 0xc000 }, + { 0x7000439a, 0xe59f }, + { 0x7000439c, 0xff1c }, + { 0x7000439e, 0xe12f }, + { 0x700043a0, 0x2db7 }, + { 0x700043a2, 0x0000 }, + { 0x700043a4, 0x4778 }, + { 0x700043a6, 0x46c0 }, + { 0x700043a8, 0xc000 }, + { 0x700043aa, 0xe59f }, + { 0x700043ac, 0xff1c }, + { 0x700043ae, 0xe12f }, + { 0x700043b0, 0xeb3d }, + { 0x700043b2, 0x0000 }, + { 0x700043b4, 0x4778 }, + { 0x700043b6, 0x46c0 }, + { 0x700043b8, 0xc000 }, + { 0x700043ba, 0xe59f }, + { 0x700043bc, 0xff1c }, + { 0x700043be, 0xe12f }, + { 0x700043c0, 0xf061 }, + { 0x700043c2, 0x0000 }, + { 0x700043c4, 0x4778 }, + { 0x700043c6, 0x46c0 }, + { 0x700043c8, 0xc000 }, + { 0x700043ca, 0xe59f }, + { 0x700043cc, 0xff1c }, + { 0x700043ce, 0xe12f }, + { 0x700043d0, 0xf0ef }, + { 0x700043d2, 0x0000 }, + { 0x700043d4, 0x4778 }, + { 0x700043d6, 0x46c0 }, + { 0x700043d8, 0xf004 }, + { 0x700043da, 0xe51f }, + { 0x700043dc, 0x2824 }, + { 0x700043de, 0x0001 }, + { 0x700043e0, 0x4778 }, + { 0x700043e2, 0x46c0 }, + { 0x700043e4, 0xc000 }, + { 0x700043e6, 0xe59f }, + { 0x700043e8, 0xff1c }, + { 0x700043ea, 0xe12f }, + { 0x700043ec, 0x8edd }, + { 0x700043ee, 0x0000 }, + { 0x700043f0, 0x4778 }, + { 0x700043f2, 0x46c0 }, + { 0x700043f4, 0xc000 }, + { 0x700043f6, 0xe59f }, + { 0x700043f8, 0xff1c }, + { 0x700043fa, 0xe12f }, + { 0x700043fc, 0x8dcb }, + { 0x700043fe, 0x0000 }, + { 0x70004400, 0x4778 }, + { 0x70004402, 0x46c0 }, + { 0x70004404, 0xc000 }, + { 0x70004406, 0xe59f }, + { 0x70004408, 0xff1c }, + { 0x7000440a, 0xe12f }, + { 0x7000440c, 0x8e17 }, + { 0x7000440e, 0x0000 }, + { 0x70004410, 0x4778 }, + { 0x70004412, 0x46c0 }, + { 0x70004414, 0xc000 }, + { 0x70004416, 0xe59f }, + { 0x70004418, 0xff1c }, + { 0x7000441a, 0xe12f }, + { 0x7000441c, 0x98c5 }, + { 0x7000441e, 0x0000 }, + { 0x70004420, 0x4778 }, + { 0x70004422, 0x46c0 }, + { 0x70004424, 0xc000 }, + { 0x70004426, 0xe59f }, + { 0x70004428, 0xff1c }, + { 0x7000442a, 0xe12f }, + { 0x7000442c, 0x7c7d }, + { 0x7000442e, 0x0000 }, + { 0x70004430, 0x4778 }, + { 0x70004432, 0x46c0 }, + { 0x70004434, 0xc000 }, + { 0x70004436, 0xe59f }, + { 0x70004438, 0xff1c }, + { 0x7000443a, 0xe12f }, + { 0x7000443c, 0x7e31 }, + { 0x7000443e, 0x0000 }, + { 0x70004440, 0x4778 }, + { 0x70004442, 0x46c0 }, + { 0x70004444, 0xc000 }, + { 0x70004446, 0xe59f }, + { 0x70004448, 0xff1c }, + { 0x7000444a, 0xe12f }, + { 0x7000444c, 0x7eab }, + { 0x7000444e, 0x0000 }, + { 0x70004450, 0x4778 }, + { 0x70004452, 0x46c0 }, + { 0x70004454, 0xc000 }, + { 0x70004456, 0xe59f }, + { 0x70004458, 0xff1c }, + { 0x7000445a, 0xe12f }, + { 0x7000445c, 0x7501 }, + { 0x7000445e, 0x0000 }, + { 0xd0001000, 0x0001 }, + { 0x700001fc, 0x0001 }, + { 0x700001fe, 0x0003 }, + { 0x70000200, 0x0000 }, + { 0x70000204, 0x0061 }, + { 0x7000020c, 0x2f0c }, + { 0x7000020e, 0x0190 }, + { 0x70000294, 0x0100 }, + { 0x70000296, 0x00e3 }, + { 0x70000298, 0x0200 }, + { 0x7000029a, 0x0238 }, + { 0x7000029c, 0x01c6 }, + { 0x7000029e, 0x0166 }, + { 0x700002a0, 0x0074 }, + { 0x700002a2, 0x0132 }, + { 0x700002a4, 0x0001 }, + { 0x7000070e, 0x00ff }, + { 0x7000071e, 0x0001 }, + { 0x7000163c, 0x0000 }, + { 0x70001648, 0x9002 }, + { 0x70001652, 0x0002 }, + { 0x70001654, 0x0000 }, + { 0x700015e0, 0x0801 }, + { 0x7000164c, 0x0003 }, + { 0x7000163e, 0x00e5 }, + { 0x70001640, 0x00cc }, + { 0x700015d4, 0x0000 }, + { 0x700015d6, 0xd000 }, + { 0x7000169a, 0xff95 }, + { 0x7000166a, 0x0280 }, + { 0x70001676, 0x03a0 }, + { 0x70001678, 0x0320 }, + { 0x700016bc, 0x0030 }, + { 0x700016e0, 0x0060 }, + { 0x700016d4, 0x0010 }, + { 0x70001656, 0x0000 }, + { 0x700015e6, 0x003c }, + { 0x700015e8, 0x0015 }, + { 0x700015ea, 0x0032 }, + { 0x700015ec, 0x0038 }, + { 0x700015ee, 0x003e }, + { 0x700015f0, 0x0044 }, + { 0x700015f2, 0x004a }, + { 0x700015f4, 0x0050 }, + { 0x700015f6, 0x0056 }, + { 0x700015f8, 0x005c }, + { 0x700015fa, 0x0062 }, + { 0x700015fc, 0x0068 }, + { 0x700015fe, 0x006e }, + { 0x70001600, 0x0074 }, + { 0x70001602, 0x007a }, + { 0x70001604, 0x0080 }, + { 0x70001606, 0x0086 }, + { 0x70001608, 0x008c }, + { 0x7000160a, 0x0092 }, + { 0x7000160c, 0x0098 }, + { 0x7000160e, 0x009e }, + { 0x70001610, 0x00a4 }, + { 0x70001612, 0x00aa }, + { 0x70001614, 0x00b0 }, + { 0x70001722, 0x8000 }, + { 0x70001724, 0x0006 }, + { 0x70001726, 0x3ff0 }, + { 0x70001728, 0x03e8 }, + { 0x7000172a, 0x0000 }, + { 0x7000172c, 0x0080 }, + { 0x7000172e, 0x0009 }, + { 0x70001730, 0x0020 }, + { 0x70001732, 0x0040 }, + { 0x70001734, 0x0080 }, + { 0x70001736, 0x00c0 }, + { 0x70001738, 0x00e0 }, + { 0x7000028c, 0x0003 }, + { 0x700008b4, 0x0001 }, + { 0x700008bc, 0x00c0 }, + { 0x700008be, 0x00df }, + { 0x700008c0, 0x0100 }, + { 0x700008c2, 0x0125 }, + { 0x700008c4, 0x015f }, + { 0x700008c6, 0x017c }, + { 0x700008c8, 0x0194 }, + { 0x700008f6, 0x4000 }, + { 0x700008f8, 0x4000 }, + { 0x700008fa, 0x4000 }, + { 0x700008fc, 0x4000 }, + { 0x700008fe, 0x4000 }, + { 0x70000900, 0x4000 }, + { 0x70000902, 0x4000 }, + { 0x70000904, 0x4000 }, + { 0x70000906, 0x4000 }, + { 0x70000908, 0x4000 }, + { 0x7000090a, 0x4000 }, + { 0x7000090c, 0x4000 }, + { 0x7000090e, 0x3800 }, + { 0x70000910, 0x4000 }, + { 0x70000912, 0x4000 }, + { 0x70000914, 0x4000 }, + { 0x70000916, 0x3b00 }, + { 0x70000918, 0x4000 }, + { 0x7000091a, 0x4000 }, + { 0x7000091c, 0x4000 }, + { 0x7000091e, 0x4300 }, + { 0x70000920, 0x4000 }, + { 0x70000922, 0x4000 }, + { 0x70000924, 0x4000 }, + { 0x70000926, 0x4300 }, + { 0x70000928, 0x4000 }, + { 0x7000092a, 0x4000 }, + { 0x7000092c, 0x4000 }, + { 0x7000092e, 0x4500 }, + { 0x70000930, 0x4000 }, + { 0x70000932, 0x4000 }, + { 0x70000934, 0x4000 }, + { 0x700008f4, 0x0001 }, + { 0x70001492, 0x0100 }, + { 0x70001494, 0x0101 }, + { 0x70001496, 0x0101 }, + { 0x70001498, 0x0001 }, + { 0x7000149a, 0x0101 }, + { 0x7000149c, 0x0201 }, + { 0x7000149e, 0x0102 }, + { 0x700014a0, 0x0101 }, + { 0x700014a2, 0x0101 }, + { 0x700014a4, 0x0202 }, + { 0x700014a6, 0x0202 }, + { 0x700014a8, 0x0101 }, + { 0x700014aa, 0x0201 }, + { 0x700014ac, 0x0302 }, + { 0x700014ae, 0x0203 }, + { 0x700014b0, 0x0102 }, + { 0x700014b2, 0x0201 }, + { 0x700014b4, 0x0302 }, + { 0x700014b6, 0x0203 }, + { 0x700014b8, 0x0102 }, + { 0x700014ba, 0x0201 }, + { 0x700014bc, 0x0202 }, + { 0x700014be, 0x0202 }, + { 0x700014c0, 0x0102 }, + { 0x700014c2, 0x0101 }, + { 0x700014c4, 0x0202 }, + { 0x700014c6, 0x0202 }, + { 0x700014c8, 0x0101 }, + { 0x700014ca, 0x0101 }, + { 0x700014cc, 0x0101 }, + { 0x700014ce, 0x0101 }, + { 0x700014d0, 0x0101 }, + { 0x70001484, 0x003c }, + { 0x7000148a, 0x000f }, + { 0x7000058c, 0x3520 }, + { 0x7000058e, 0x0000 }, + { 0x70000590, 0xc350 }, + { 0x70000592, 0x0000 }, + { 0x70000594, 0x3520 }, + { 0x70000596, 0x0000 }, + { 0x70000598, 0xc350 }, + { 0x7000059a, 0x0000 }, + { 0x7000059c, 0x0470 }, + { 0x7000059e, 0x0c00 }, + { 0x700005a0, 0x0100 }, + { 0x700005a2, 0x1000 }, + { 0x70000544, 0x0111 }, + { 0x70000546, 0x00ef }, + { 0x70000f2a, 0x0000 }, + { 0x700004e6, 0x077f }, + { 0x70000f30, 0x0001 }, + { 0x70000608, 0x0001 }, + { 0x7000060a, 0x0001 }, + { 0x7000060c, 0x0800 }, + { 0x7000060e, 0x0100 }, + { 0x70000610, 0x0001 }, + { 0x70000612, 0x0000 }, + { 0x70000614, 0x0a3c }, + { 0x70000616, 0x0000 }, + { 0x70000618, 0x0d05 }, + { 0x7000061a, 0x0000 }, + { 0x7000061c, 0x4008 }, + { 0x7000061e, 0x0000 }, + { 0x70000620, 0x7000 }, + { 0x70000622, 0x0000 }, + { 0x70000624, 0x9c00 }, + { 0x70000626, 0x0000 }, + { 0x70000628, 0xad00 }, + { 0x7000062a, 0x0001 }, + { 0x7000062c, 0xf1d4 }, + { 0x7000062e, 0x0002 }, + { 0x70000630, 0xdc00 }, + { 0x70000632, 0x0005 }, + { 0x70000634, 0xdc00 }, + { 0x70000636, 0x0005 }, + { 0x70000638, 0x0001 }, + { 0x7000063a, 0x0000 }, + { 0x7000063c, 0x0a3c }, + { 0x7000063e, 0x0000 }, + { 0x70000640, 0x0d05 }, + { 0x70000642, 0x0000 }, + { 0x70000644, 0x3408 }, + { 0x70000646, 0x0000 }, + { 0x70000648, 0x3408 }, + { 0x7000064a, 0x0000 }, + { 0x7000064c, 0x6810 }, + { 0x7000064e, 0x0000 }, + { 0x70000650, 0x8214 }, + { 0x70000652, 0x0000 }, + { 0x70000654, 0xc350 }, + { 0x70000656, 0x0000 }, + { 0x70000658, 0xc350 }, + { 0x7000065a, 0x0000 }, + { 0x7000065c, 0xc350 }, + { 0x7000065e, 0x0000 }, + { 0x70000660, 0x0650 }, + { 0x70000662, 0x0100 }, + { 0x700006b8, 0x452c }, + { 0x700006ba, 0x0005 }, + { 0x700005d0, 0x0000 }, + { 0x7000145e, 0x0580 }, + { 0x70001460, 0x0428 }, + { 0x70001462, 0x07b0 }, + { 0x700011f0, 0x0120 }, + { 0x700011f2, 0x0121 }, + { 0x7000101c, 0x037c }, + { 0x7000101e, 0x038e }, + { 0x70001020, 0x033c }, + { 0x70001022, 0x0384 }, + { 0x70001024, 0x02fe }, + { 0x70001026, 0x036c }, + { 0x70001028, 0x02ba }, + { 0x7000102a, 0x0352 }, + { 0x7000102c, 0x028e }, + { 0x7000102e, 0x0300 }, + { 0x70001030, 0x026a }, + { 0x70001032, 0x02c8 }, + { 0x70001034, 0x0254 }, + { 0x70001036, 0x02a8 }, + { 0x70001038, 0x0242 }, + { 0x7000103a, 0x02a0 }, + { 0x7000103c, 0x021a }, + { 0x7000103e, 0x02a0 }, + { 0x70001040, 0x01f4 }, + { 0x70001042, 0x0298 }, + { 0x70001044, 0x01d4 }, + { 0x70001046, 0x0290 }, + { 0x70001048, 0x01cc }, + { 0x7000104a, 0x0276 }, + { 0x7000104c, 0x01d2 }, + { 0x7000104e, 0x0260 }, + { 0x70001050, 0x01f6 }, + { 0x70001052, 0x023a }, + { 0x70001054, 0x0000 }, + { 0x70001056, 0x0000 }, + { 0x70001058, 0x0000 }, + { 0x7000105a, 0x0000 }, + { 0x7000105c, 0x0000 }, + { 0x7000105e, 0x0000 }, + { 0x70001060, 0x0000 }, + { 0x70001062, 0x0000 }, + { 0x70001064, 0x0000 }, + { 0x70001066, 0x0000 }, + { 0x70001068, 0x0000 }, + { 0x7000106a, 0x0000 }, + { 0x7000106c, 0x0005 }, + { 0x70001070, 0x000e }, + { 0x70001074, 0x0126 }, + { 0x70001078, 0x0272 }, + { 0x7000107a, 0x02a0 }, + { 0x7000107c, 0x025a }, + { 0x7000107e, 0x02bc }, + { 0x70001080, 0x024a }, + { 0x70001082, 0x02c0 }, + { 0x70001084, 0x023c }, + { 0x70001086, 0x02be }, + { 0x70001088, 0x022e }, + { 0x7000108a, 0x02bc }, + { 0x7000108c, 0x0224 }, + { 0x7000108e, 0x02b6 }, + { 0x70001090, 0x0218 }, + { 0x70001092, 0x02aa }, + { 0x70001094, 0x0210 }, + { 0x70001096, 0x02a0 }, + { 0x70001098, 0x020c }, + { 0x7000109a, 0x0296 }, + { 0x7000109c, 0x020a }, + { 0x7000109e, 0x028c }, + { 0x700010a0, 0x0212 }, + { 0x700010a2, 0x027e }, + { 0x700010a4, 0x0234 }, + { 0x700010a6, 0x0256 }, + { 0x700010a8, 0x0004 }, + { 0x700010ac, 0x000c }, + { 0x700010b0, 0x01d8 }, + { 0x700010b4, 0x0350 }, + { 0x700010b6, 0x0422 }, + { 0x700010b8, 0x02c4 }, + { 0x700010ba, 0x0452 }, + { 0x700010bc, 0x0278 }, + { 0x700010be, 0x041c }, + { 0x700010c0, 0x0230 }, + { 0x700010c2, 0x03ee }, + { 0x700010c4, 0x01f0 }, + { 0x700010c6, 0x0392 }, + { 0x700010c8, 0x01c0 }, + { 0x700010ca, 0x0340 }, + { 0x700010cc, 0x0194 }, + { 0x700010ce, 0x0302 }, + { 0x700010d0, 0x016e }, + { 0x700010d2, 0x02c2 }, + { 0x700010d4, 0x0148 }, + { 0x700010d6, 0x0286 }, + { 0x700010d8, 0x018a }, + { 0x700010da, 0x0242 }, + { 0x700010dc, 0x0000 }, + { 0x700010de, 0x0000 }, + { 0x700010e0, 0x0000 }, + { 0x700010e2, 0x0000 }, + { 0x700010e4, 0x0006 }, + { 0x700010e8, 0x000a }, + { 0x700010ec, 0x0106 }, + { 0x700010f0, 0x0380 }, + { 0x700010f2, 0x0000 }, + { 0x700010f4, 0x0168 }, + { 0x700010f6, 0x0000 }, + { 0x700010f8, 0x2d90 }, + { 0x700010fa, 0x0000 }, + { 0x70001464, 0x0008 }, + { 0x70001466, 0x0190 }, + { 0x70001468, 0x00a0 }, + { 0x70001228, 0x00c0 }, + { 0x7000122c, 0x0010 }, + { 0x7000122a, 0x0010 }, + { 0x7000120a, 0x05d5 }, + { 0x7000120e, 0x0000 }, + { 0x70001210, 0x0771 }, + { 0x70001212, 0x03a4 }, + { 0x70001214, 0x0036 }, + { 0x70001216, 0x002a }, + { 0x70001278, 0xfef7 }, + { 0x7000127a, 0x0021 }, + { 0x7000127c, 0x0af0 }, + { 0x7000127e, 0x0af0 }, + { 0x70001280, 0x018f }, + { 0x70001282, 0x0096 }, + { 0x70001284, 0x000e }, + { 0x70001224, 0x0032 }, + { 0x70001226, 0x001e }, + { 0x70001228, 0x00c0 }, + { 0x7000122a, 0x0010 }, + { 0x7000122c, 0x0002 }, + { 0x70002ba4, 0x0006 }, + { 0x7000146c, 0x0002 }, + { 0x70001434, 0x02ce }, + { 0x70001436, 0x0347 }, + { 0x70001438, 0x03c2 }, + { 0x7000143a, 0x10a0 }, + { 0x7000143c, 0x10a1 }, + { 0x7000143e, 0x1185 }, + { 0x70001440, 0x1186 }, + { 0x70001442, 0x11e5 }, + { 0x70001444, 0x11e6 }, + { 0x70001446, 0x00ab }, + { 0x70001448, 0x00bf }, + { 0x7000144a, 0x00d2 }, + { 0x7000144c, 0x0093 }, + { 0x700013a4, 0xfff6 }, + { 0x700013a6, 0xffd8 }, + { 0x700013a8, 0xffd8 }, + { 0x700013aa, 0xffd8 }, + { 0x700013ac, 0xffd8 }, + { 0x700013ae, 0xffd0 }, + { 0x700013b0, 0xfff6 }, + { 0x700013b2, 0xffd8 }, + { 0x700013b4, 0xffd8 }, + { 0x700013b6, 0xffd8 }, + { 0x700013b8, 0xffd8 }, + { 0x700013ba, 0xffd0 }, + { 0x700013bc, 0xfff6 }, + { 0x700013be, 0xffd8 }, + { 0x700013c0, 0xffd8 }, + { 0x700013c2, 0xffd8 }, + { 0x700013c4, 0xffd8 }, + { 0x700013c6, 0xffd0 }, + { 0x700013c8, 0xffec }, + { 0x700013ca, 0x000a }, + { 0x700013cc, 0x000a }, + { 0x700013ce, 0x0050 }, + { 0x700013d0, 0x0050 }, + { 0x700013d2, 0x0078 }, + { 0x700013d4, 0xffec }, + { 0x700013d6, 0x000a }, + { 0x700013d8, 0x000a }, + { 0x700013da, 0x0050 }, + { 0x700013dc, 0x0050 }, + { 0x700013de, 0x0078 }, + { 0x700013e0, 0xffec }, + { 0x700013e2, 0x000a }, + { 0x700013e4, 0x000a }, + { 0x700013e6, 0x0050 }, + { 0x700013e8, 0x0050 }, + { 0x700013ea, 0x0078 }, + { 0x700013ec, 0x0000 }, + { 0x700013ee, 0x0000 }, + { 0x700013f0, 0x0000 }, + { 0x700013f2, 0x0000 }, + { 0x700013f4, 0x0000 }, + { 0x700013f6, 0x0000 }, + { 0x700013f8, 0x0000 }, + { 0x700013fa, 0x0000 }, + { 0x700013fc, 0x0000 }, + { 0x700013fe, 0x0000 }, + { 0x70001400, 0x0000 }, + { 0x70001402, 0x0000 }, + { 0x70001404, 0x0000 }, + { 0x70001406, 0x0000 }, + { 0x70001408, 0x0000 }, + { 0x7000140a, 0x0000 }, + { 0x7000140c, 0x0000 }, + { 0x7000140e, 0x0000 }, + { 0x70001410, 0xffc0 }, + { 0x70001412, 0xffc0 }, + { 0x70001414, 0xffc0 }, + { 0x70001416, 0x0000 }, + { 0x70001418, 0x0000 }, + { 0x7000141a, 0x0000 }, + { 0x7000141c, 0xffc0 }, + { 0x7000141e, 0xffc0 }, + { 0x70001420, 0xffc0 }, + { 0x70001422, 0x0000 }, + { 0x70001424, 0x0000 }, + { 0x70001426, 0x0000 }, + { 0x70001428, 0xffc0 }, + { 0x7000142a, 0xffc0 }, + { 0x7000142c, 0xffc0 }, + { 0x7000142e, 0x0000 }, + { 0x70001430, 0x0000 }, + { 0x70001432, 0x0000 }, + { 0x70001208, 0x0020 }, + { 0x7000144e, 0x0000 }, + { 0x70001450, 0xffe0 }, + { 0x70001452, 0x0000 }, + { 0x70000734, 0x0000 }, + { 0x70000736, 0x000a }, + { 0x70000738, 0x0016 }, + { 0x7000073a, 0x0030 }, + { 0x7000073c, 0x0066 }, + { 0x7000073e, 0x00d5 }, + { 0x70000740, 0x0138 }, + { 0x70000742, 0x0163 }, + { 0x70000744, 0x0189 }, + { 0x70000746, 0x01c6 }, + { 0x70000748, 0x01f8 }, + { 0x7000074a, 0x0222 }, + { 0x7000074c, 0x0247 }, + { 0x7000074e, 0x0282 }, + { 0x70000750, 0x02b5 }, + { 0x70000752, 0x030f }, + { 0x70000754, 0x035f }, + { 0x70000756, 0x03a2 }, + { 0x70000758, 0x03d8 }, + { 0x7000075a, 0x03ff }, + { 0x7000075c, 0x0000 }, + { 0x7000075e, 0x000a }, + { 0x70000760, 0x0016 }, + { 0x70000762, 0x0030 }, + { 0x70000764, 0x0066 }, + { 0x70000766, 0x00d5 }, + { 0x70000768, 0x0138 }, + { 0x7000076a, 0x0163 }, + { 0x7000076c, 0x0189 }, + { 0x7000076e, 0x01c6 }, + { 0x70000770, 0x01f8 }, + { 0x70000772, 0x0222 }, + { 0x70000774, 0x0247 }, + { 0x70000776, 0x0282 }, + { 0x70000778, 0x02b5 }, + { 0x7000077a, 0x030f }, + { 0x7000077c, 0x035f }, + { 0x7000077e, 0x03a2 }, + { 0x70000780, 0x03d8 }, + { 0x70000782, 0x03ff }, + { 0x70000784, 0x0000 }, + { 0x70000786, 0x000a }, + { 0x70000788, 0x0016 }, + { 0x7000078a, 0x0030 }, + { 0x7000078c, 0x0066 }, + { 0x7000078e, 0x00d5 }, + { 0x70000790, 0x0138 }, + { 0x70000792, 0x0163 }, + { 0x70000794, 0x0189 }, + { 0x70000796, 0x01c6 }, + { 0x70000798, 0x01f8 }, + { 0x7000079a, 0x0222 }, + { 0x7000079c, 0x0247 }, + { 0x7000079e, 0x0282 }, + { 0x700007a0, 0x02b5 }, + { 0x700007a2, 0x030f }, + { 0x700007a4, 0x035f }, + { 0x700007a6, 0x03a2 }, + { 0x700007a8, 0x03d8 }, + { 0x700007aa, 0x03ff }, + { 0x700007ac, 0x0000 }, + { 0x700007ae, 0x000b }, + { 0x700007b0, 0x0019 }, + { 0x700007b2, 0x0036 }, + { 0x700007b4, 0x006f }, + { 0x700007b6, 0x00d8 }, + { 0x700007b8, 0x0135 }, + { 0x700007ba, 0x015f }, + { 0x700007bc, 0x0185 }, + { 0x700007be, 0x01c1 }, + { 0x700007c0, 0x01f3 }, + { 0x700007c2, 0x0220 }, + { 0x700007c4, 0x024a }, + { 0x700007c6, 0x0291 }, + { 0x700007c8, 0x02d0 }, + { 0x700007ca, 0x032a }, + { 0x700007cc, 0x036a }, + { 0x700007ce, 0x039f }, + { 0x700007d0, 0x03cc }, + { 0x700007d2, 0x03f9 }, + { 0x700007d4, 0x0000 }, + { 0x700007d6, 0x000b }, + { 0x700007d8, 0x0019 }, + { 0x700007da, 0x0036 }, + { 0x700007dc, 0x006f }, + { 0x700007de, 0x00d8 }, + { 0x700007e0, 0x0135 }, + { 0x700007e2, 0x015f }, + { 0x700007e4, 0x0185 }, + { 0x700007e6, 0x01c1 }, + { 0x700007e8, 0x01f3 }, + { 0x700007ea, 0x0220 }, + { 0x700007ec, 0x024a }, + { 0x700007ee, 0x0291 }, + { 0x700007f0, 0x02d0 }, + { 0x700007f2, 0x032a }, + { 0x700007f4, 0x036a }, + { 0x700007f6, 0x039f }, + { 0x700007f8, 0x03cc }, + { 0x700007fa, 0x03f9 }, + { 0x700007fc, 0x0000 }, + { 0x700007fe, 0x000b }, + { 0x70000800, 0x0019 }, + { 0x70000802, 0x0036 }, + { 0x70000804, 0x006f }, + { 0x70000806, 0x00d8 }, + { 0x70000808, 0x0135 }, + { 0x7000080a, 0x015f }, + { 0x7000080c, 0x0185 }, + { 0x7000080e, 0x01c1 }, + { 0x70000810, 0x01f3 }, + { 0x70000812, 0x0220 }, + { 0x70000814, 0x024a }, + { 0x70000816, 0x0291 }, + { 0x70000818, 0x02d0 }, + { 0x7000081a, 0x032a }, + { 0x7000081c, 0x036a }, + { 0x7000081e, 0x039f }, + { 0x70000820, 0x03cc }, + { 0x70000822, 0x03f9 }, + { 0x700008a6, 0x00c0 }, + { 0x700008a8, 0x0100 }, + { 0x700008aa, 0x0125 }, + { 0x700008ac, 0x015f }, + { 0x700008ae, 0x017c }, + { 0x700008b0, 0x0194 }, + { 0x700008b2, 0x0001 }, + { 0x70000898, 0x4800 }, + { 0x7000089a, 0x7000 }, + { 0x700008a0, 0x48d8 }, + { 0x700008a2, 0x7000 }, + { 0x70004800, 0x024c }, + { 0x70004802, 0xff5e }, + { 0x70004804, 0xff9d }, + { 0x70004806, 0xfec9 }, + { 0x70004808, 0x0203 }, + { 0x7000480a, 0xff08 }, + { 0x7000480c, 0xffdb }, + { 0x7000480e, 0xff8f }, + { 0x70004810, 0x0206 }, + { 0x70004812, 0x00e0 }, + { 0x70004814, 0x009f }, + { 0x70004816, 0xfe7b }, + { 0x70004818, 0x0227 }, + { 0x7000481a, 0xfefe }, + { 0x7000481c, 0x0194 }, + { 0x7000481e, 0xfe86 }, + { 0x70004820, 0x01e0 }, + { 0x70004822, 0x0104 }, + { 0x70004824, 0x024c }, + { 0x70004826, 0xff5e }, + { 0x70004828, 0xff9d }, + { 0x7000482a, 0xfec9 }, + { 0x7000482c, 0x0203 }, + { 0x7000482e, 0xff08 }, + { 0x70004830, 0xffdb }, + { 0x70004832, 0xff8f }, + { 0x70004834, 0x0206 }, + { 0x70004836, 0x00e0 }, + { 0x70004838, 0x009f }, + { 0x7000483a, 0xfe7b }, + { 0x7000483c, 0x0227 }, + { 0x7000483e, 0xfefe }, + { 0x70004840, 0x0194 }, + { 0x70004842, 0xfe86 }, + { 0x70004844, 0x01e0 }, + { 0x70004846, 0x0104 }, + { 0x70004848, 0x0208 }, + { 0x7000484a, 0xffb5 }, + { 0x7000484c, 0xffe8 }, + { 0x7000484e, 0xff20 }, + { 0x70004850, 0x01bf }, + { 0x70004852, 0xff53 }, + { 0x70004854, 0x0022 }, + { 0x70004856, 0xffea }, + { 0x70004858, 0x01c2 }, + { 0x7000485a, 0x00c6 }, + { 0x7000485c, 0x0095 }, + { 0x7000485e, 0xfefd }, + { 0x70004860, 0x0206 }, + { 0x70004862, 0xff7f }, + { 0x70004864, 0x0191 }, + { 0x70004866, 0xff06 }, + { 0x70004868, 0x01ba }, + { 0x7000486a, 0x0108 }, + { 0x7000486c, 0x0204 }, + { 0x7000486e, 0xffb2 }, + { 0x70004870, 0xfff5 }, + { 0x70004872, 0xfef1 }, + { 0x70004874, 0x014e }, + { 0x70004876, 0xff18 }, + { 0x70004878, 0xffe6 }, + { 0x7000487a, 0xffdd }, + { 0x7000487c, 0x01b2 }, + { 0x7000487e, 0x00f2 }, + { 0x70004880, 0x00ca }, + { 0x70004882, 0xff48 }, + { 0x70004884, 0x0151 }, + { 0x70004886, 0xff50 }, + { 0x70004888, 0x0147 }, + { 0x7000488a, 0xff75 }, + { 0x7000488c, 0x0187 }, + { 0x7000488e, 0x01bf }, + { 0x70004890, 0x0204 }, + { 0x70004892, 0xffb2 }, + { 0x70004894, 0xfff5 }, + { 0x70004896, 0xfef1 }, + { 0x70004898, 0x014e }, + { 0x7000489a, 0xff18 }, + { 0x7000489c, 0xffe6 }, + { 0x7000489e, 0xffdd }, + { 0x700048a0, 0x01b2 }, + { 0x700048a2, 0x00f2 }, + { 0x700048a4, 0x00ca }, + { 0x700048a6, 0xff48 }, + { 0x700048a8, 0x0151 }, + { 0x700048aa, 0xff50 }, + { 0x700048ac, 0x0147 }, + { 0x700048ae, 0xff75 }, + { 0x700048b0, 0x0187 }, + { 0x700048b2, 0x01bf }, + { 0x700048b4, 0x0204 }, + { 0x700048b6, 0xffb2 }, + { 0x700048b8, 0xfff5 }, + { 0x700048ba, 0xfef1 }, + { 0x700048bc, 0x014e }, + { 0x700048be, 0xff18 }, + { 0x700048c0, 0xffe6 }, + { 0x700048c2, 0xffdd }, + { 0x700048c4, 0x01b2 }, + { 0x700048c6, 0x00f2 }, + { 0x700048c8, 0x00ca }, + { 0x700048ca, 0xff48 }, + { 0x700048cc, 0x0151 }, + { 0x700048ce, 0xff50 }, + { 0x700048d0, 0x0147 }, + { 0x700048d2, 0xff75 }, + { 0x700048d4, 0x0187 }, + { 0x700048d6, 0x01bf }, + { 0x700048d8, 0x01e5 }, + { 0x700048da, 0xffa4 }, + { 0x700048dc, 0xffdc }, + { 0x700048de, 0xfe90 }, + { 0x700048e0, 0x013f }, + { 0x700048e2, 0xff1b }, + { 0x700048e4, 0xffd2 }, + { 0x700048e6, 0xffdf }, + { 0x700048e8, 0x0236 }, + { 0x700048ea, 0x00ec }, + { 0x700048ec, 0x00f8 }, + { 0x700048ee, 0xff34 }, + { 0x700048f0, 0x01ce }, + { 0x700048f2, 0xff83 }, + { 0x700048f4, 0x0195 }, + { 0x700048f6, 0xfef3 }, + { 0x700048f8, 0x0126 }, + { 0x700048fa, 0x0162 }, + { 0x70000944, 0x0050 }, + { 0x70000946, 0x00b0 }, + { 0x70000948, 0x0196 }, + { 0x7000094a, 0x0245 }, + { 0x7000094c, 0x0300 }, + { 0x7000097a, 0x0000 }, + { 0x7000097c, 0x01cc }, + { 0x7000097e, 0x01cc }, + { 0x70000980, 0x01cc }, + { 0x70000982, 0x01cc }, + { 0x70000984, 0x01cc }, + { 0x70000986, 0x0180 }, + { 0x70000988, 0x0196 }, + { 0x70000976, 0x0070 }, + { 0x70000978, 0x0005 }, + { 0x70000938, 0x0000 }, + { 0x7000093a, 0x0014 }, + { 0x7000093c, 0x00d2 }, + { 0x7000093e, 0x0384 }, + { 0x70000940, 0x07d0 }, + { 0x70000942, 0x1388 }, + { 0x7000098c, 0x0000 }, + { 0x7000098e, 0x0000 }, + { 0x70000990, 0x0000 }, + { 0x70000992, 0x0000 }, + { 0x70000994, 0x0000 }, + { 0x70000996, 0x00c0 }, + { 0x70000998, 0x0064 }, + { 0x7000099a, 0x0384 }, + { 0x7000099c, 0x005f }, + { 0x7000099e, 0x01f4 }, + { 0x700009a0, 0x0070 }, + { 0x700009a2, 0x0040 }, + { 0x700009a4, 0x00a0 }, + { 0x700009a6, 0x0100 }, + { 0x700009a8, 0x0010 }, + { 0x700009aa, 0x0040 }, + { 0x700009ac, 0x00a0 }, + { 0x700009ae, 0x1430 }, + { 0x700009b0, 0x0201 }, + { 0x700009b2, 0x0204 }, + { 0x700009b4, 0x3604 }, + { 0x700009b6, 0x032a }, + { 0x700009b8, 0x0403 }, + { 0x700009ba, 0x1b06 }, + { 0x700009bc, 0x6015 }, + { 0x700009be, 0x00c0 }, + { 0x700009c0, 0x6080 }, + { 0x700009c2, 0x4080 }, + { 0x700009c4, 0x0640 }, + { 0x700009c6, 0x0306 }, + { 0x700009c8, 0x2003 }, + { 0x700009ca, 0xff01 }, + { 0x700009cc, 0x0000 }, + { 0x700009ce, 0x0400 }, + { 0x700009d0, 0x365a }, + { 0x700009d2, 0x102a }, + { 0x700009d4, 0x000b }, + { 0x700009d6, 0x0600 }, + { 0x700009d8, 0x5a0f }, + { 0x700009da, 0x0505 }, + { 0x700009dc, 0x1802 }, + { 0x700009de, 0x0000 }, + { 0x700009e0, 0x2006 }, + { 0x700009e2, 0x3028 }, + { 0x700009e4, 0x0418 }, + { 0x700009e6, 0x0101 }, + { 0x700009e8, 0x0800 }, + { 0x700009ea, 0x1804 }, + { 0x700009ec, 0x4008 }, + { 0x700009ee, 0x0540 }, + { 0x700009f0, 0x8006 }, + { 0x700009f2, 0x0020 }, + { 0x700009f4, 0x0000 }, + { 0x700009f6, 0x1800 }, + { 0x700009f8, 0x0000 }, + { 0x700009fa, 0x1e10 }, + { 0x700009fc, 0x000b }, + { 0x700009fe, 0x0607 }, + { 0x70000a00, 0x0005 }, + { 0x70000a02, 0x0607 }, + { 0x70000a04, 0x0405 }, + { 0x70000a06, 0x0205 }, + { 0x70000a08, 0x0304 }, + { 0x70000a0a, 0x0409 }, + { 0x70000a0c, 0x0306 }, + { 0x70000a0e, 0x0407 }, + { 0x70000a10, 0x1c04 }, + { 0x70000a12, 0x0214 }, + { 0x70000a14, 0x1002 }, + { 0x70000a16, 0x0610 }, + { 0x70000a18, 0x1a02 }, + { 0x70000a1a, 0x4a18 }, + { 0x70000a1c, 0x0080 }, + { 0x70000a1e, 0x0348 }, + { 0x70000a20, 0x0180 }, + { 0x70000a22, 0x0a0a }, + { 0x70000a24, 0x0101 }, + { 0x70000a26, 0x2a36 }, + { 0x70000a28, 0x6024 }, + { 0x70000a2a, 0x2a36 }, + { 0x70000a2c, 0xffff }, + { 0x70000a2e, 0x0808 }, + { 0x70000a30, 0x0a01 }, + { 0x70000a32, 0x010a }, + { 0x70000a34, 0x3601 }, + { 0x70000a36, 0x242a }, + { 0x70000a38, 0x3660 }, + { 0x70000a3a, 0xff2a }, + { 0x70000a3c, 0x08ff }, + { 0x70000a3e, 0x0008 }, + { 0x70000a40, 0x0001 }, + { 0x70000a42, 0x0000 }, + { 0x70000a44, 0x0000 }, + { 0x70000a46, 0x0010 }, + { 0x70000a48, 0x0000 }, + { 0x70000a4a, 0x0000 }, + { 0x70000a4c, 0x00c0 }, + { 0x70000a4e, 0x0064 }, + { 0x70000a50, 0x0384 }, + { 0x70000a52, 0x0051 }, + { 0x70000a54, 0x01f4 }, + { 0x70000a56, 0x0070 }, + { 0x70000a58, 0x0040 }, + { 0x70000a5a, 0x00a0 }, + { 0x70000a5c, 0x0100 }, + { 0x70000a5e, 0x0010 }, + { 0x70000a60, 0x0060 }, + { 0x70000a62, 0x0100 }, + { 0x70000a64, 0x1430 }, + { 0x70000a66, 0x0201 }, + { 0x70000a68, 0x0204 }, + { 0x70000a6a, 0x2404 }, + { 0x70000a6c, 0x031b }, + { 0x70000a6e, 0x0103 }, + { 0x70000a70, 0x1205 }, + { 0x70000a72, 0x400d }, + { 0x70000a74, 0x0080 }, + { 0x70000a76, 0x2080 }, + { 0x70000a78, 0x3040 }, + { 0x70000a7a, 0x0630 }, + { 0x70000a7c, 0x0306 }, + { 0x70000a7e, 0x2003 }, + { 0x70000a80, 0xff01 }, + { 0x70000a82, 0x0404 }, + { 0x70000a84, 0x0300 }, + { 0x70000a86, 0x245a }, + { 0x70000a88, 0x1018 }, + { 0x70000a8a, 0x000b }, + { 0x70000a8c, 0x0b00 }, + { 0x70000a8e, 0x5a0f }, + { 0x70000a90, 0x0505 }, + { 0x70000a92, 0x1802 }, + { 0x70000a94, 0x0000 }, + { 0x70000a96, 0x2006 }, + { 0x70000a98, 0x3428 }, + { 0x70000a9a, 0x041c }, + { 0x70000a9c, 0x0101 }, + { 0x70000a9e, 0x0800 }, + { 0x70000aa0, 0x1004 }, + { 0x70000aa2, 0x4008 }, + { 0x70000aa4, 0x0540 }, + { 0x70000aa6, 0x8006 }, + { 0x70000aa8, 0x0020 }, + { 0x70000aaa, 0x0000 }, + { 0x70000aac, 0x1800 }, + { 0x70000aae, 0x0000 }, + { 0x70000ab0, 0x1e10 }, + { 0x70000ab2, 0x000b }, + { 0x70000ab4, 0x0607 }, + { 0x70000ab6, 0x0005 }, + { 0x70000ab8, 0x0607 }, + { 0x70000aba, 0x0405 }, + { 0x70000abc, 0x0205 }, + { 0x70000abe, 0x0304 }, + { 0x70000ac0, 0x0409 }, + { 0x70000ac2, 0x0306 }, + { 0x70000ac4, 0x0407 }, + { 0x70000ac6, 0x1f04 }, + { 0x70000ac8, 0x0218 }, + { 0x70000aca, 0x1102 }, + { 0x70000acc, 0x0611 }, + { 0x70000ace, 0x1a02 }, + { 0x70000ad0, 0x8018 }, + { 0x70000ad2, 0x0080 }, + { 0x70000ad4, 0x0380 }, + { 0x70000ad6, 0x0180 }, + { 0x70000ad8, 0x0a0a }, + { 0x70000ada, 0x0101 }, + { 0x70000adc, 0x1b24 }, + { 0x70000ade, 0x6024 }, + { 0x70000ae0, 0x1d22 }, + { 0x70000ae2, 0xffff }, + { 0x70000ae4, 0x0808 }, + { 0x70000ae6, 0x0a01 }, + { 0x70000ae8, 0x010a }, + { 0x70000aea, 0x2401 }, + { 0x70000aec, 0x241b }, + { 0x70000aee, 0x1e60 }, + { 0x70000af0, 0xff18 }, + { 0x70000af2, 0x08ff }, + { 0x70000af4, 0x0008 }, + { 0x70000af6, 0x0001 }, + { 0x70000af8, 0x0000 }, + { 0x70000afa, 0x0000 }, + { 0x70000afc, 0x0010 }, + { 0x70000afe, 0x0000 }, + { 0x70000b00, 0x0000 }, + { 0x70000b02, 0x00c0 }, + { 0x70000b04, 0x0064 }, + { 0x70000b06, 0x0384 }, + { 0x70000b08, 0x0043 }, + { 0x70000b0a, 0x01f4 }, + { 0x70000b0c, 0x0070 }, + { 0x70000b0e, 0x0040 }, + { 0x70000b10, 0x00a0 }, + { 0x70000b12, 0x0100 }, + { 0x70000b14, 0x0010 }, + { 0x70000b16, 0x0060 }, + { 0x70000b18, 0x0100 }, + { 0x70000b1a, 0x1430 }, + { 0x70000b1c, 0x0201 }, + { 0x70000b1e, 0x0204 }, + { 0x70000b20, 0x1b04 }, + { 0x70000b22, 0x0312 }, + { 0x70000b24, 0x0003 }, + { 0x70000b26, 0x0c03 }, + { 0x70000b28, 0x2806 }, + { 0x70000b2a, 0x0060 }, + { 0x70000b2c, 0x1580 }, + { 0x70000b2e, 0x2020 }, + { 0x70000b30, 0x0620 }, + { 0x70000b32, 0x0306 }, + { 0x70000b34, 0x2003 }, + { 0x70000b36, 0xff01 }, + { 0x70000b38, 0x0404 }, + { 0x70000b3a, 0x0300 }, + { 0x70000b3c, 0x145a }, + { 0x70000b3e, 0x1010 }, + { 0x70000b40, 0x000b }, + { 0x70000b42, 0x0e00 }, + { 0x70000b44, 0x5a0f }, + { 0x70000b46, 0x0504 }, + { 0x70000b48, 0x1802 }, + { 0x70000b4a, 0x0000 }, + { 0x70000b4c, 0x2006 }, + { 0x70000b4e, 0x3828 }, + { 0x70000b50, 0x0428 }, + { 0x70000b52, 0x0101 }, + { 0x70000b54, 0x8000 }, + { 0x70000b56, 0x0a04 }, + { 0x70000b58, 0x4008 }, + { 0x70000b5a, 0x0540 }, + { 0x70000b5c, 0x8006 }, + { 0x70000b5e, 0x0020 }, + { 0x70000b60, 0x0000 }, + { 0x70000b62, 0x1800 }, + { 0x70000b64, 0x0000 }, + { 0x70000b66, 0x1e10 }, + { 0x70000b68, 0x000b }, + { 0x70000b6a, 0x0607 }, + { 0x70000b6c, 0x0005 }, + { 0x70000b6e, 0x0607 }, + { 0x70000b70, 0x0405 }, + { 0x70000b72, 0x0207 }, + { 0x70000b74, 0x0304 }, + { 0x70000b76, 0x0409 }, + { 0x70000b78, 0x0306 }, + { 0x70000b7a, 0x0407 }, + { 0x70000b7c, 0x2404 }, + { 0x70000b7e, 0x0221 }, + { 0x70000b80, 0x1202 }, + { 0x70000b82, 0x0613 }, + { 0x70000b84, 0x1a02 }, + { 0x70000b86, 0x8018 }, + { 0x70000b88, 0x0080 }, + { 0x70000b8a, 0x0080 }, + { 0x70000b8c, 0x0180 }, + { 0x70000b8e, 0x0a0a }, + { 0x70000b90, 0x0101 }, + { 0x70000b92, 0x141d }, + { 0x70000b94, 0x6024 }, + { 0x70000b96, 0x0c0c }, + { 0x70000b98, 0xffff }, + { 0x70000b9a, 0x0808 }, + { 0x70000b9c, 0x0a01 }, + { 0x70000b9e, 0x010a }, + { 0x70000ba0, 0x1b01 }, + { 0x70000ba2, 0x2412 }, + { 0x70000ba4, 0x0c60 }, + { 0x70000ba6, 0xff0c }, + { 0x70000ba8, 0x08ff }, + { 0x70000baa, 0x0008 }, + { 0x70000bac, 0x0001 }, + { 0x70000bae, 0x0000 }, + { 0x70000bb0, 0x0000 }, + { 0x70000bb2, 0x000a }, + { 0x70000bb4, 0x0000 }, + { 0x70000bb6, 0x0000 }, + { 0x70000bb8, 0x00c0 }, + { 0x70000bba, 0x0064 }, + { 0x70000bbc, 0x0384 }, + { 0x70000bbe, 0x0032 }, + { 0x70000bc0, 0x01f4 }, + { 0x70000bc2, 0x0070 }, + { 0x70000bc4, 0x0040 }, + { 0x70000bc6, 0x00a0 }, + { 0x70000bc8, 0x0100 }, + { 0x70000bca, 0x0010 }, + { 0x70000bcc, 0x0060 }, + { 0x70000bce, 0x0100 }, + { 0x70000bd0, 0x1430 }, + { 0x70000bd2, 0x0201 }, + { 0x70000bd4, 0x0204 }, + { 0x70000bd6, 0x1504 }, + { 0x70000bd8, 0x030f }, + { 0x70000bda, 0x0003 }, + { 0x70000bdc, 0x0902 }, + { 0x70000bde, 0x2004 }, + { 0x70000be0, 0x0050 }, + { 0x70000be2, 0x1140 }, + { 0x70000be4, 0x201c }, + { 0x70000be6, 0x0620 }, + { 0x70000be8, 0x0306 }, + { 0x70000bea, 0x2003 }, + { 0x70000bec, 0xff01 }, + { 0x70000bee, 0x0404 }, + { 0x70000bf0, 0x0300 }, + { 0x70000bf2, 0x145a }, + { 0x70000bf4, 0x1010 }, + { 0x70000bf6, 0x000b }, + { 0x70000bf8, 0x1000 }, + { 0x70000bfa, 0x5a0f }, + { 0x70000bfc, 0x0503 }, + { 0x70000bfe, 0x1802 }, + { 0x70000c00, 0x0000 }, + { 0x70000c02, 0x2006 }, + { 0x70000c04, 0x3c28 }, + { 0x70000c06, 0x042c }, + { 0x70000c08, 0x0101 }, + { 0x70000c0a, 0xff00 }, + { 0x70000c0c, 0x0904 }, + { 0x70000c0e, 0x4008 }, + { 0x70000c10, 0x0540 }, + { 0x70000c12, 0x8006 }, + { 0x70000c14, 0x0020 }, + { 0x70000c16, 0x0000 }, + { 0x70000c18, 0x1800 }, + { 0x70000c1a, 0x0000 }, + { 0x70000c1c, 0x1e10 }, + { 0x70000c1e, 0x000b }, + { 0x70000c20, 0x0607 }, + { 0x70000c22, 0x0005 }, + { 0x70000c24, 0x0607 }, + { 0x70000c26, 0x0405 }, + { 0x70000c28, 0x0206 }, + { 0x70000c2a, 0x0304 }, + { 0x70000c2c, 0x0409 }, + { 0x70000c2e, 0x0305 }, + { 0x70000c30, 0x0406 }, + { 0x70000c32, 0x2804 }, + { 0x70000c34, 0x0228 }, + { 0x70000c36, 0x1402 }, + { 0x70000c38, 0x0618 }, + { 0x70000c3a, 0x1a02 }, + { 0x70000c3c, 0x8018 }, + { 0x70000c3e, 0x0080 }, + { 0x70000c40, 0x0080 }, + { 0x70000c42, 0x0180 }, + { 0x70000c44, 0x0a0a }, + { 0x70000c46, 0x0101 }, + { 0x70000c48, 0x1117 }, + { 0x70000c4a, 0x6024 }, + { 0x70000c4c, 0x0a0a }, + { 0x70000c4e, 0xffff }, + { 0x70000c50, 0x0808 }, + { 0x70000c52, 0x0a01 }, + { 0x70000c54, 0x010a }, + { 0x70000c56, 0x1501 }, + { 0x70000c58, 0x240f }, + { 0x70000c5a, 0x0a60 }, + { 0x70000c5c, 0xff0a }, + { 0x70000c5e, 0x08ff }, + { 0x70000c60, 0x0008 }, + { 0x70000c62, 0x0001 }, + { 0x70000c64, 0x0000 }, + { 0x70000c66, 0x0000 }, + { 0x70000c68, 0x0000 }, + { 0x70000c6a, 0x0000 }, + { 0x70000c6c, 0x0000 }, + { 0x70000c6e, 0x00c0 }, + { 0x70000c70, 0x0064 }, + { 0x70000c72, 0x0384 }, + { 0x70000c74, 0x0032 }, + { 0x70000c76, 0x01f4 }, + { 0x70000c78, 0x0070 }, + { 0x70000c7a, 0x0040 }, + { 0x70000c7c, 0x00a0 }, + { 0x70000c7e, 0x0100 }, + { 0x70000c80, 0x0010 }, + { 0x70000c82, 0x0060 }, + { 0x70000c84, 0x0100 }, + { 0x70000c86, 0x1430 }, + { 0x70000c88, 0x0201 }, + { 0x70000c8a, 0x0204 }, + { 0x70000c8c, 0x0f04 }, + { 0x70000c8e, 0x030c }, + { 0x70000c90, 0x0003 }, + { 0x70000c92, 0x0602 }, + { 0x70000c94, 0x1803 }, + { 0x70000c96, 0x0040 }, + { 0x70000c98, 0x0e20 }, + { 0x70000c9a, 0x2018 }, + { 0x70000c9c, 0x0620 }, + { 0x70000c9e, 0x0306 }, + { 0x70000ca0, 0x2003 }, + { 0x70000ca2, 0xff01 }, + { 0x70000ca4, 0x0404 }, + { 0x70000ca6, 0x0200 }, + { 0x70000ca8, 0x145a }, + { 0x70000caa, 0x1010 }, + { 0x70000cac, 0x000b }, + { 0x70000cae, 0x1200 }, + { 0x70000cb0, 0x5a0f }, + { 0x70000cb2, 0x0502 }, + { 0x70000cb4, 0x1802 }, + { 0x70000cb6, 0x0000 }, + { 0x70000cb8, 0x2006 }, + { 0x70000cba, 0x4028 }, + { 0x70000cbc, 0x0430 }, + { 0x70000cbe, 0x0101 }, + { 0x70000cc0, 0xff00 }, + { 0x70000cc2, 0x0804 }, + { 0x70000cc4, 0x4008 }, + { 0x70000cc6, 0x0540 }, + { 0x70000cc8, 0x8006 }, + { 0x70000cca, 0x0020 }, + { 0x70000ccc, 0x0000 }, + { 0x70000cce, 0x1800 }, + { 0x70000cd0, 0x0000 }, + { 0x70000cd2, 0x1e10 }, + { 0x70000cd4, 0x000b }, + { 0x70000cd6, 0x0607 }, + { 0x70000cd8, 0x0005 }, + { 0x70000cda, 0x0607 }, + { 0x70000cdc, 0x0405 }, + { 0x70000cde, 0x0205 }, + { 0x70000ce0, 0x0304 }, + { 0x70000ce2, 0x0409 }, + { 0x70000ce4, 0x0306 }, + { 0x70000ce6, 0x0407 }, + { 0x70000ce8, 0x2c04 }, + { 0x70000cea, 0x022c }, + { 0x70000cec, 0x1402 }, + { 0x70000cee, 0x0618 }, + { 0x70000cf0, 0x1a02 }, + { 0x70000cf2, 0x8018 }, + { 0x70000cf4, 0x0080 }, + { 0x70000cf6, 0x0080 }, + { 0x70000cf8, 0x0180 }, + { 0x70000cfa, 0x0a0a }, + { 0x70000cfc, 0x0101 }, + { 0x70000cfe, 0x0c0f }, + { 0x70000d00, 0x6024 }, + { 0x70000d02, 0x0808 }, + { 0x70000d04, 0xffff }, + { 0x70000d06, 0x0808 }, + { 0x70000d08, 0x0a01 }, + { 0x70000d0a, 0x010a }, + { 0x70000d0c, 0x0f01 }, + { 0x70000d0e, 0x240c }, + { 0x70000d10, 0x0860 }, + { 0x70000d12, 0xff08 }, + { 0x70000d14, 0x08ff }, + { 0x70000d16, 0x0008 }, + { 0x70000d18, 0x0001 }, + { 0x70000d1a, 0x23ce }, + { 0x70000d1c, 0xfdc8 }, + { 0x70000d1e, 0x112e }, + { 0x70000d20, 0x93a5 }, + { 0x70000d22, 0xfe67 }, + { 0x70000d24, 0x0000 }, + { 0x700001f8, 0x5dc0 }, + { 0x70000212, 0x0002 }, + { 0x70000214, 0x0000 }, + { 0x70000216, 0x0000 }, + { 0x7000021a, 0x3a98 }, + { 0x7000021c, 0x4f1a }, + { 0x7000021e, 0x4f1a }, + { 0x70000220, 0x4f1a }, + { 0x70000222, 0x4f1a }, + { 0x70000224, 0x4f1a }, + { 0x7000022c, 0x0001 }, + { 0x70000478, 0x005f }, + { 0x7000047a, 0x005f }, + { 0x7000047c, 0x0001 }, + { 0x7000047e, 0x0280 }, + { 0x70000480, 0x01e0 }, + { 0x70000482, 0x0005 }, + { 0x700017dc, 0x0054 }, + { 0x70001ae4, 0x001c }, + { 0x70000284, 0x0001 }, + { 0x7000028a, 0x0000 }, + { 0x700002a6, 0x0288 }, + { 0x700002a8, 0x01e8 }, + { 0x700002aa, 0x0005 }, + { 0x700002ac, 0x4f1a }, + { 0x700002ae, 0x4f1a }, + { 0x700002b0, 0x0100 }, + { 0x700002b2, 0x0300 }, + { 0x700002b4, 0x0042 }, + { 0x700002b6, 0x0000 }, + { 0x700002b8, 0x01e0 }, + { 0x700002ba, 0x0000 }, + { 0x700002bc, 0x0000 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0002 }, + { 0x700002c2, 0x03e8 }, + { 0x700002c4, 0x014a }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x700002d4, 0x0000 }, + { 0x70000396, 0x0000 }, + { 0x70000398, 0x0a00 }, + { 0x7000039a, 0x0780 }, + { 0x7000039c, 0x0005 }, + { 0x7000039e, 0x4f1a }, + { 0x700003a0, 0x4f1a }, + { 0x700003a2, 0x0100 }, + { 0x700003a4, 0x0300 }, + { 0x700003a6, 0x0042 }, + { 0x700003a8, 0x0070 }, + { 0x700003aa, 0x0810 }, + { 0x700003ac, 0x0900 }, + { 0x700003ae, 0x0001 }, + { 0x700003b0, 0x0000 }, + { 0x700003b2, 0x0002 }, + { 0x700003b4, 0x0535 }, + { 0x700003b6, 0x029a }, + { 0x70000250, 0x0a00 }, + { 0x70000252, 0x0780 }, + { 0x70000254, 0x0010 }, + { 0x70000256, 0x000c }, + { 0x70000258, 0x0a00 }, + { 0x7000025a, 0x0780 }, + { 0x7000025c, 0x0010 }, + { 0x7000025e, 0x000c }, + { 0x70000494, 0x0a00 }, + { 0x70000496, 0x0780 }, + { 0x70000498, 0x0000 }, + { 0x7000049a, 0x0000 }, + { 0x7000049c, 0x0a00 }, + { 0x7000049e, 0x0780 }, + { 0x700004a0, 0x0000 }, + { 0x700004a2, 0x0000 }, + { 0x70000262, 0x0001 }, + { 0x70000264, 0x0001 }, + { 0x70001cc2, 0x0100 }, + { 0x70001cc4, 0x0100 }, + { 0x70001cc6, 0x0100 }, + { 0x70001cc8, 0x0100 }, + { 0x700001a8, 0x0a0a }, + { 0x7000147c, 0x0170 }, + { 0x70001482, 0x01e0 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0x70000270, 0x0001 }, + { 0x7000023e, 0x0001 }, + { 0x70000240, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* configure 30 fps */ +static const struct regval_list s5k4ecgx_fps_30[] = { + { 0x700002b4, 0x0052 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0001 }, + { 0x700002c2, 0x014d }, + { 0x700002c4, 0x014d }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +static const struct regval_list s5k4ecgx_effect_normal[] = { + { 0x7000023c, 0x0000 }, + { 0xffffffff, 0x0000 }, +}; + +static const struct regval_list s5k4ecgx_wb_auto[] = { + { 0x700004e6, 0x077f }, + { 0xffffffff, 0x0000 }, +}; + +static const struct regval_list s5k4ecgx_iso_auto[] = { + { 0x70000938, 0x0000 }, + { 0x70000f2a, 0x0001 }, + { 0x700004e6, 0x077f }, + { 0x700004d0, 0x0000 }, + { 0x700004d2, 0x0000 }, + { 0x700004d4, 0x0001 }, + { 0x700006c2, 0x0200 }, + { 0xffffffff, 0x0000 }, +}; + +static const struct regval_list s5k4ecgx_contrast_default[] = { + { 0x70000232, 0x0000 }, + { 0xffffffff, 0x0000 }, +}; + +static const struct regval_list s5k4ecgx_scene_default[] = { + { 0x70001492, 0x0000 }, + { 0x70001494, 0x0101 }, + { 0x70001496, 0x0101 }, + { 0x70001498, 0x0000 }, + { 0x7000149a, 0x0101 }, + { 0x7000149c, 0x0101 }, + { 0x7000149e, 0x0101 }, + { 0x700014a0, 0x0101 }, + { 0x700014a2, 0x0201 }, + { 0x700014a4, 0x0303 }, + { 0x700014a6, 0x0303 }, + { 0x700014a8, 0x0102 }, + { 0x700014aa, 0x0201 }, + { 0x700014ac, 0x0403 }, + { 0x700014ae, 0x0304 }, + { 0x700014b0, 0x0102 }, + { 0x700014b2, 0x0201 }, + { 0x700014b4, 0x0403 }, + { 0x700014b6, 0x0304 }, + { 0x700014b8, 0x0102 }, + { 0x700014ba, 0x0201 }, + { 0x700014bc, 0x0403 }, + { 0x700014be, 0x0304 }, + { 0x700014c0, 0x0102 }, + { 0x700014c2, 0x0201 }, + { 0x700014c4, 0x0303 }, + { 0x700014c6, 0x0303 }, + { 0x700014c8, 0x0102 }, + { 0x700014ca, 0x0201 }, + { 0x700014cc, 0x0202 }, + { 0x700014ce, 0x0202 }, + { 0x700014d0, 0x0102 }, + { 0x70000938, 0x0000 }, + { 0x700006b8, 0x452c }, + { 0x700006ba, 0x000c }, + { 0x70000f2a, 0x0001 }, + { 0x70000f30, 0x0001 }, + { 0x700004e6, 0x077f }, + { 0x700004d0, 0x0000 }, + { 0x700004d2, 0x0000 }, + { 0x700004d4, 0x0001 }, + { 0x700006c2, 0x0200 }, + { 0x70002c66, 0x0001 }, + { 0x70001484, 0x003c }, + { 0x7000148a, 0x000f }, + { 0x7000058c, 0x3520 }, + { 0x7000058e, 0x0000 }, + { 0x70000590, 0xc350 }, + { 0x70000592, 0x0000 }, + { 0x70000594, 0x3520 }, + { 0x70000596, 0x0000 }, + { 0x70000598, 0xc350 }, + { 0x7000059a, 0x0000 }, + { 0x7000059c, 0x0470 }, + { 0x7000059e, 0x0c00 }, + { 0x700005a0, 0x0100 }, + { 0x700005a2, 0x1000 }, + { 0x70000544, 0x0111 }, + { 0x70000546, 0x00ef }, + { 0x70000608, 0x0001 }, + { 0x7000060a, 0x0001 }, + { 0x70000a28, 0x6024 }, + { 0x70000ade, 0x6024 }, + { 0x70000b94, 0x6024 }, + { 0x70000c4a, 0x6024 }, + { 0x70000d00, 0x6024 }, + { 0x70000234, 0x0000 }, + { 0x70000638, 0x0001 }, + { 0x7000063a, 0x0000 }, + { 0x7000063c, 0x0a3c }, + { 0x7000063e, 0x0000 }, + { 0x70000640, 0x0d05 }, + { 0x70000642, 0x0000 }, + { 0x70000644, 0x3408 }, + { 0x70000646, 0x0000 }, + { 0x70000648, 0x3408 }, + { 0x7000064a, 0x0000 }, + { 0x7000064c, 0x6810 }, + { 0x7000064e, 0x0000 }, + { 0x70000650, 0x8214 }, + { 0x70000652, 0x0000 }, + { 0x70000654, 0xc350 }, + { 0x70000656, 0x0000 }, + { 0x70000658, 0xc350 }, + { 0x7000065a, 0x0000 }, + { 0x7000065c, 0xc350 }, + { 0x7000065e, 0x0000 }, + { 0x700002c2, 0x029a }, + /* #reg_0tc_pcfg_usmaxfrtimemsecmult10 */ + { 0x700002c4, 0x014a }, + /* #reg_0tc_pcfg_usminfrtimemsecmult10 */ + { 0x700003b4, 0x0535 }, + { 0x700003b6, 0x029a }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0x70000270, 0x0001 }, + { 0x7000023e, 0x0001 }, + { 0x70000240, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* configure 720x480 preview size */ +static const struct regval_list s5k4ecgx_720_preview[] = { + { 0x70000250, 0x0a00 }, + { 0x70000252, 0x06a8 }, + { 0x70000254, 0x0010 }, + { 0x70000256, 0x0078 }, + { 0x70000258, 0x0a00 }, + { 0x7000025a, 0x06a8 }, + { 0x7000025c, 0x0010 }, + { 0x7000025e, 0x0078 }, + { 0x70000494, 0x0a00 }, + { 0x70000496, 0x06a8 }, + { 0x70000498, 0x0000 }, + { 0x7000049a, 0x0000 }, + { 0x7000049c, 0x0a00 }, + { 0x7000049e, 0x06a8 }, + { 0x700004a0, 0x0000 }, + { 0x700004a2, 0x0000 }, + { 0x70000262, 0x0001 }, + /* #reg_tc_gp_busereqinputinpre */ + { 0x70000a1e, 0x0028 }, + { 0x70000ad4, 0x003c }, + { 0x700002a6, 0x02d0 }, + { 0x700002a8, 0x01e0 }, + { 0x700002aa, 0x0005 }, + { 0x700002b4, 0x0052 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0001 }, + { 0x700002c2, 0x029a }, + { 0x700002c4, 0x014d }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* configure 640x480 preview size */ +static const struct regval_list s5k4ecgx_640_preview[] = { + { 0x70000250, 0x0a00 }, + { 0x70000252, 0x0780 }, + { 0x70000254, 0x0010 }, + { 0x70000256, 0x000c }, + { 0x70000258, 0x0a00 }, + { 0x7000025a, 0x0780 }, + { 0x7000025c, 0x0010 }, + { 0x7000025e, 0x000c }, + { 0x70000494, 0x0a00 }, + { 0x70000496, 0x0780 }, + { 0x70000498, 0x0000 }, + { 0x7000049a, 0x0000 }, + { 0x7000049c, 0x0a00 }, + { 0x7000049e, 0x0780 }, + { 0x700004a0, 0x0000 }, + { 0x700004a2, 0x0000 }, + { 0x70000262, 0x0001 }, + { 0x70000a1e, 0x0028 }, + { 0x70000ad4, 0x003c }, + { 0x700002a6, 0x0280 }, + { 0x700002a8, 0x01e0 }, + { 0x700002aa, 0x0005 }, + { 0x700002b4, 0x0052 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0001 }, + { 0x700002c2, 0x029a }, + { 0x700002c4, 0x014a }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* configure 352x288 preview size */ +static const struct regval_list s5k4ecgx_352_preview[] = { + { 0x70000250, 0x0928 }, + { 0x70000252, 0x0780 }, + { 0x70000254, 0x007c }, + { 0x70000256, 0x000c }, + { 0x70000258, 0x0928 }, + { 0x7000025a, 0x0780 }, + { 0x7000025c, 0x007c }, + { 0x7000025e, 0x000c }, + { 0x70000494, 0x0928 }, + { 0x70000496, 0x0780 }, + { 0x70000498, 0x0000 }, + { 0x7000049a, 0x0000 }, + { 0x7000049c, 0x0928 }, + { 0x7000049e, 0x0780 }, + { 0x700004a0, 0x0000 }, + { 0x700004a2, 0x0000 }, + { 0x70000262, 0x0001 }, + { 0x70000a1e, 0x0028 }, + { 0x70000ad4, 0x003c }, + { 0x700002a6, 0x0160 }, + { 0x700002a8, 0x0120 }, + { 0x700002aa, 0x0005 }, + { 0x700002b4, 0x0052 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0001 }, + { 0x700002c2, 0x029a }, + { 0x700002c4, 0x014d }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* configure 176x144 preview size */ +static const struct regval_list s5k4ecgx_176_preview[] = { + { 0x70000250, 0x0928 }, + { 0x70000252, 0x0780 }, + { 0x70000254, 0x007c }, + { 0x70000256, 0x000c }, + { 0x70000258, 0x0928 }, + { 0x7000025a, 0x0780 }, + { 0x7000025c, 0x007c }, + { 0x7000025e, 0x000c }, + { 0x70000494, 0x0928 }, + { 0x70000496, 0x0780 }, + { 0x70000498, 0x0000 }, + { 0x7000049a, 0x0000 }, + { 0x7000049c, 0x0928 }, + { 0x7000049e, 0x0780 }, + { 0x700004a0, 0x0000 }, + { 0x700004a2, 0x0000 }, + { 0x70000262, 0x0001 }, + { 0x70000a1e, 0x0028 }, + { 0x70000ad4, 0x003c }, + { 0x700002a6, 0x00b0 }, + { 0x700002a8, 0x0090 }, + { 0x700002aa, 0x0005 }, + { 0x700002b4, 0x0052 }, + { 0x700002be, 0x0000 }, + { 0x700002c0, 0x0001 }, + { 0x700002c2, 0x029a }, + { 0x700002c4, 0x014d }, + { 0x700002d0, 0x0000 }, + { 0x700002d2, 0x0000 }, + { 0x70000266, 0x0000 }, + { 0x7000026a, 0x0001 }, + { 0x7000024e, 0x0001 }, + { 0x70000268, 0x0001 }, + { 0xffffffff, 0x0000 }, +}; + +/* Default value for brightness */ +static const struct regval_list s5k4ecgx_ev_default[] = { + { 0x70000230, 0x0000 }, + { 0xffffffff, 0x0000 }, +}; + +/* Default value for saturation */ +static const struct regval_list s5k4ecgx_saturation_default[] = { + { 0x70000234, 0x0000 }, + { 0xffffffff, 0x0000 }, +}; + +/* Default value for sharpness */ +static const struct regval_list s5k4ecgx_sharpness_default[] = { + { 0x70000a28, 0x6024 }, + { 0x70000ade, 0x6024 }, + { 0x70000b94, 0x6024 }, + { 0x70000c4a, 0x6024 }, + { 0x70000d00, 0x6024 }, + { 0xffffffff, 0x0000 }, +}; + +#endif /* __DRIVERS_MEDIA_VIDEO_S5K4ECGX_H__ */
This driver implements preview mode of the S5K4ECGX sensor. capture (snapshot) operation, face detection are missing now.
Following controls are supported: contrast/saturation/brightness/sharpness
Signed-off-by: Sangwook Lee sangwook.lee@linaro.org --- drivers/media/video/Kconfig | 8 + drivers/media/video/Makefile | 1 + drivers/media/video/s5k4ecgx.c | 839 ++++++++++++++++++++++++++++++++++++++++ include/media/s5k4ecgx.h | 39 ++ 4 files changed, 887 insertions(+) create mode 100644 drivers/media/video/s5k4ecgx.c create mode 100644 include/media/s5k4ecgx.h
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index c128fac..2c3f434 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig @@ -580,6 +580,14 @@ config VIDEO_S5K6AA This is a V4L2 sensor-level driver for Samsung S5K6AA(FX) 1.3M camera sensor with an embedded SoC image signal processor.
+config VIDEO_S5K4ECGX + tristate "Samsung S5K4ECGX sensor support" + depends on MEDIA_CAMERA_SUPPORT + depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API + ---help--- + This is a V4L2 sensor-level driver for Samsung S5K4ECGX 5M + camera sensor with an embedded SoC image signal processor. + source "drivers/media/video/smiapp/Kconfig"
comment "Flash devices" diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index b7da9fa..ec39c47 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile @@ -80,6 +80,7 @@ obj-$(CONFIG_VIDEO_SR030PC30) += sr030pc30.o obj-$(CONFIG_VIDEO_NOON010PC30) += noon010pc30.o obj-$(CONFIG_VIDEO_M5MOLS) += m5mols/ obj-$(CONFIG_VIDEO_S5K6AA) += s5k6aa.o +obj-$(CONFIG_VIDEO_S5K4ECGX) += s5k4ecgx.o obj-$(CONFIG_VIDEO_SMIAPP) += smiapp/ obj-$(CONFIG_VIDEO_ADP1653) += adp1653.o obj-$(CONFIG_VIDEO_AS3645A) += as3645a.o diff --git a/drivers/media/video/s5k4ecgx.c b/drivers/media/video/s5k4ecgx.c new file mode 100644 index 0000000..cfc90b8 --- /dev/null +++ b/drivers/media/video/s5k4ecgx.c @@ -0,0 +1,839 @@ +/* + * Driver for s5k4ecgx (5MP Camera) from Samsung + * a quarter-inch optical format 1.4 micron 5 megapixel (Mp) + * CMOS image sensor. + * + * Copyright (C) 2012, Linaro, Sangwook Lee sangwook.lee@linaro.org + * Copyright (C) 2012, Insignal Co,. Ltd, Homin Lee suapapa@insignal.co.kr + * + * Based on s5k6aa, noon010pc30 driver + * Copyright (C) 2011, Samsung Electronics Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/regulator/consumer.h> +#include <linux/slab.h> +#include <linux/vmalloc.h> + +#include <media/media-entity.h> +#include <media/s5k4ecgx.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-device.h> +#include <media/v4l2-mediabus.h> +#include <media/v4l2-subdev.h> + +#include "s5k4ecgx_regs.h" + +static int debug; +module_param(debug, int, 0644); + +#define S5K4ECGX_DRIVER_NAME "s5k4ecgx" + +/* Firmware revision information */ +#define REG_FW_REVISION 0x700001a6 +#define REG_FW_VERSION 0x700001a4 +#define S5K4ECGX_REVISION_1_1 0x11 +#define S5K4ECGX_FW_VERSION 0x4ec0 + +/* General purpose parameters */ +#define REG_USER_BRIGHTNESS 0x7000022c /* Brigthness */ +#define REG_USER_CONTRAST 0x7000022e /* Contrast */ +#define REG_USER_SATURATION 0x70000230 /* Saturation */ + +#define REG_USER_SHARP1 0x70000a28 +#define REG_USER_SHARP2 0x70000ade +#define REG_USER_SHARP3 0x70000b94 +#define REG_USER_SHARP4 0x70000c4a +#define REG_USER_SHARP5 0x70000d00 + +/* Reduce sharpness range for user space API */ +#define SHARPNESS_DIV 8208 + +#define TOK_TERM 0xffffffff + +/* + * FIMXE: This is copied from s5k6aa, because of no information + * in s5k4ecgx's datasheet + * H/W register Interface (0xd0000000 - 0xd0000fff) + */ +#define AHB_MSB_ADDR_PTR 0xfcfc +#define GEN_REG_OFFSH 0xd000 +#define REG_CMDWR_ADDRH 0x0028 +#define REG_CMDWR_ADDRL 0x002a +#define REG_CMDRD_ADDRH 0x002c +#define REG_CMDRD_ADDRL 0x002e +#define REG_CMDBUF0_ADDR 0x0f12 + +/* + * Preview size lists supported by sensor + */ +static const struct regval_list *prev_regs[] = { + s5k4ecgx_176_preview, + s5k4ecgx_352_preview, + s5k4ecgx_640_preview, + s5k4ecgx_720_preview, +}; + +struct s5k4ecgx_frmsize { + u32 idx; /* Should indicate index of prev_regs */ + u32 width; + u32 height; +}; + +/* + * TODO: currently only preview is supported and snapshopt(capture) + * is not implemented yet + */ +static const struct s5k4ecgx_frmsize s5k4ecgx_sizes[] = { + {0, 176, 144}, + {1, 352, 288}, + {2, 640, 480}, + {3, 720, 480}, +}; + +#define S5K4ECGX_NUM_PREV ARRAY_SIZE(s5k4ecgx_sizes) + +struct s5k4ecgx_format { + enum v4l2_mbus_pixelcode code; + u32 colorspace; +}; + +/* By default value, output from sensor will be YUV422 0-255 */ +static const struct s5k4ecgx_format s5k4ecgx_formats[] = { + { V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG }, +}; + +static const char * const s5k4ecgx_supply_names[] = { + /* + * vdd_2.8v is for Analog power supply 2.8V(vdda) + * and Digital IO(vddio, vddd_core) + */ + "vdd_2.8v", + /* vdd_1.8v is for regulator input */ + "vdd_1.8v", +}; + +#define S5K4ECGX_NUM_SUPPLIES ARRAY_SIZE(s5k4ecgx_supply_names) + +enum s5k4ecgx_gpio_id { + STBY, + RST, + GPIO_NUM, +}; + +struct s5k4ecgx { + struct v4l2_subdev sd; + struct media_pad pad; + struct v4l2_ctrl_handler handler; + + struct s5k4ecgx_platform_data *pdata; + const struct s5k4ecgx_format *curr_fmt; + const struct s5k4ecgx_frmsize *curr_win; + struct v4l2_fract timeperframe; + struct mutex lock; + int streaming; + + struct regulator_bulk_data supplies[S5K4ECGX_NUM_SUPPLIES]; + struct s5k4ecgx_gpio gpio[GPIO_NUM]; + int msleep; +}; + +static inline struct s5k4ecgx *to_s5k4ecgx(struct v4l2_subdev *sd) +{ + return container_of(sd, struct s5k4ecgx, sd); +} + +static int s5k4ecgx_i2c_read(struct i2c_client *client, u16 addr, u16 *val) +{ + u8 wbuf[2] = { addr >> 8, addr & 0xff }; + struct i2c_msg msg[2]; + u8 rbuf[2]; + int ret; + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = 2; + msg[0].buf = wbuf; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].len = 2; + msg[1].buf = rbuf; + + ret = i2c_transfer(client->adapter, msg, 2); + *val = be16_to_cpu(*((u16 *)rbuf)); + + v4l2_dbg(3, debug, client, "i2c_read: 0x%04X : 0x%04x\n", addr, *val); + + return ret == 2 ? 0 : ret; +} + +static int s5k4ecgx_i2c_write(struct i2c_client *client, u16 addr, u16 val) +{ + u8 buf[4] = { addr >> 8, addr & 0xff, val >> 8, val & 0xff }; + + int ret = i2c_master_send(client, buf, 4); + v4l2_dbg(4, debug, client, "i2c_write: 0x%04X : 0x%04x\n", addr, val); + + return ret == 4 ? 0 : ret; +} + +static int s5k4ecgx_write(struct i2c_client *client, u32 addr, u16 val) +{ + int ret = 0; + u16 high = addr >> 16, low = addr & 0xffff; + + ret = s5k4ecgx_i2c_write(client, REG_CMDWR_ADDRH, high); + ret |= s5k4ecgx_i2c_write(client, REG_CMDWR_ADDRL, low); + ret |= s5k4ecgx_i2c_write(client, REG_CMDBUF0_ADDR, val); + if (ret) + return -ENODEV; + + return 0; +} + +static int s5k4ecgx_read(struct i2c_client *client, u32 addr, u16 *val) +{ + int ret = 0; + u16 high = addr >> 16, low = addr & 0xffff; + + ret = s5k4ecgx_i2c_write(client, REG_CMDRD_ADDRH, high); + ret |= s5k4ecgx_i2c_write(client, REG_CMDRD_ADDRL, low); + ret |= s5k4ecgx_i2c_read(client, REG_CMDBUF0_ADDR, val); + if (ret) { + dev_err(&client->dev, "Failed to execute read command\n"); + return -ENODEV; + } + + return 0; +} + +static int s5k4ecgx_set_ahb_address(struct v4l2_subdev *sd) +{ + int ret; + struct i2c_client *client = v4l2_get_subdevdata(sd); + + /* Set APB peripherals start address */ + ret = s5k4ecgx_i2c_write(client, AHB_MSB_ADDR_PTR, GEN_REG_OFFSH); + if (ret) + return ret; + /* + * FIMXE: This is copied from s5k6aa, because of no information + * in s5k4ecgx's datasheet. + * sw_reset is activated to put device into idle status + */ + ret = s5k4ecgx_i2c_write(client, 0x0010, 0x0001); + if (ret) + return ret; + + /* FIXME: no information avaialbe about this register */ + ret = s5k4ecgx_i2c_write(client, 0x1030, 0x0000); + if (ret) + return ret; + /* Halt ARM CPU */ + ret = s5k4ecgx_i2c_write(client, 0x0014, 0x0001); + + return ret; +} + +static int s5k4ecgx_write_array(struct v4l2_subdev *sd, + const struct regval_list *reg) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u16 addr_incr = 0; + int ret = 0; + + while (reg->addr != TOK_TERM) { + if (addr_incr != 2) + ret = s5k4ecgx_write(client, reg->addr, reg->val); + else + ret = s5k4ecgx_i2c_write(client, REG_CMDBUF0_ADDR, + reg->val); + if (ret) + break; + /* Assume that msg->addr is always less than 0xfffc */ + addr_incr = (reg + 1)->addr - reg->addr; + reg++; + } + + return ret; +} + +static int s5k4ecgx_read_fw_ver(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u16 fw_ver = 0, hw_rev = 0; + int ret; + + ret = s5k4ecgx_read(client, REG_FW_VERSION, &fw_ver); + if (fw_ver != S5K4ECGX_FW_VERSION && ret) { + v4l2_err(sd, "FW version check failed!"); + return -ENODEV; + } + + ret = s5k4ecgx_read(client, REG_FW_REVISION, &hw_rev); + if (ret) + return ret; + + if (hw_rev == S5K4ECGX_REVISION_1_1) { + v4l2_info(sd, "chip found FW ver: 0x%x, HW rev: 0x%x\n", + fw_ver, hw_rev); + } else { + v4l2_err(sd, "Unknown H/W revision 0x%x\n", hw_rev); + return -ENODEV; + }; + + return 0; +} + +static int s5k4ecgx_init_sensor(struct v4l2_subdev *sd) +{ + int ret = 0; + + ret = s5k4ecgx_set_ahb_address(sd); + /* The delay is from manufacturer's settings */ + msleep(100); + + ret |= s5k4ecgx_write_array(sd, s5k4ecgx_apb_regs); + ret |= s5k4ecgx_write_array(sd, s5k4ecgx_img_regs); + + if (ret) + v4l2_err(sd, "Failed to write initial settings\n"); + + return 0; +} + +static int s5k4ecgx_gpio_set_value(struct s5k4ecgx *priv, int id, u32 val) +{ + if (!gpio_is_valid(priv->gpio[id].gpio)) + return 0; + gpio_set_value(priv->gpio[id].gpio, val); + + return 1; +} + +static int __s5k4ecgx_power_on(struct s5k4ecgx *priv) +{ + int ret; + + ret = regulator_bulk_enable(S5K4ECGX_NUM_SUPPLIES, priv->supplies); + if (ret) + return ret; + usleep_range(30, 50); + + /* The polarity of STBY is controlled by TSP */ + if (s5k4ecgx_gpio_set_value(priv, STBY, priv->gpio[STBY].level)) + usleep_range(30, 50); + + if (s5k4ecgx_gpio_set_value(priv, RST, priv->gpio[RST].level)) + usleep_range(30, 50); + + return 0; +} + +static int __s5k4ecgx_power_off(struct s5k4ecgx *priv) +{ + if (s5k4ecgx_gpio_set_value(priv, RST, !priv->gpio[RST].level)) + usleep_range(30, 50); + + if (s5k4ecgx_gpio_set_value(priv, STBY, !priv->gpio[STBY].level)) + usleep_range(30, 50); + + priv->streaming = 0; + + return regulator_bulk_disable(S5K4ECGX_NUM_SUPPLIES, priv->supplies); +} + +/* Find nearest matching image pixel size. */ +static int s5k4ecgx_try_frame_size(struct v4l2_mbus_framefmt *mf, + const struct s5k4ecgx_frmsize **size) +{ + unsigned int min_err = ~0; + int i = ARRAY_SIZE(s5k4ecgx_sizes); + const struct s5k4ecgx_frmsize *fsize = &s5k4ecgx_sizes[0], + *match = NULL; + + while (i--) { + int err = abs(fsize->width - mf->width) + + abs(fsize->height - mf->height); + if (err < min_err) { + min_err = err; + match = fsize; + } + fsize++; + } + if (match) { + mf->width = match->width; + mf->height = match->height; + if (size) + *size = match; + return 0; + } + + return -EINVAL; +} + +static int s5k4ecgx_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_fh *fh, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->index >= ARRAY_SIZE(s5k4ecgx_formats)) + return -EINVAL; + code->code = s5k4ecgx_formats[code->index].code; + + return 0; +} + +static int s5k4ecgx_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, + struct v4l2_subdev_format *fmt) +{ + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + struct v4l2_mbus_framefmt *mf; + + if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { + if (fh) { + mf = v4l2_subdev_get_try_format(fh, 0); + fmt->format = *mf; + } + return 0; + } + mf = &fmt->format; + + mutex_lock(&priv->lock); + mf->width = priv->curr_win->width; + mf->height = priv->curr_win->height; + mf->code = priv->curr_fmt->code; + mf->colorspace = priv->curr_fmt->colorspace; + mf->field = V4L2_FIELD_NONE; + mutex_unlock(&priv->lock); + + return 0; +} + +static const struct s5k4ecgx_format *s5k4ecgx_try_fmt(struct v4l2_subdev *sd, + struct v4l2_mbus_framefmt *mf) +{ + int i = ARRAY_SIZE(s5k4ecgx_formats); + + while (--i) + if (mf->code == s5k4ecgx_formats[i].code) + break; + mf->code = s5k4ecgx_formats[i].code; + + return &s5k4ecgx_formats[i]; +} + +static int s5k4ecgx_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, + struct v4l2_subdev_format *fmt) +{ + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + const struct s5k4ecgx_frmsize *size = NULL; + const struct s5k4ecgx_format *sf; + struct v4l2_mbus_framefmt *mf; + int ret = 0; + + sf = s5k4ecgx_try_fmt(sd, &fmt->format); + s5k4ecgx_try_frame_size(&fmt->format, &size); + fmt->format.colorspace = V4L2_COLORSPACE_JPEG; + + if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { + if (fh) { + mf = v4l2_subdev_get_try_format(fh, 0); + *mf = fmt->format; + } + return 0; + } + + mutex_lock(&priv->lock); + if (!priv->streaming) { + s5k4ecgx_try_frame_size(&fmt->format, &size); + priv->curr_win = size; + priv->curr_fmt = sf; + } else { + ret = -EBUSY; + } + mutex_unlock(&priv->lock); + + return ret; +} + +static const struct v4l2_subdev_pad_ops s5k4ecgx_pad_ops = { + .enum_mbus_code = s5k4ecgx_enum_mbus_code, + .get_fmt = s5k4ecgx_get_fmt, + .set_fmt = s5k4ecgx_set_fmt, +}; + +/* + * V4L2 subdev controls + */ +static int s5k4ecgx_s_ctrl(struct v4l2_ctrl *ctrl) +{ + + struct v4l2_subdev *sd = &container_of(ctrl->handler, struct s5k4ecgx, + handler)->sd; + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + int err = 0; + + v4l2_dbg(1, debug, sd, "ctrl: 0x%x, value: %d\n", ctrl->id, ctrl->val); + + mutex_lock(&priv->lock); + switch (ctrl->id) { + case V4L2_CID_CONTRAST: + err = s5k4ecgx_write(client, REG_USER_CONTRAST, ctrl->val); + break; + + case V4L2_CID_SATURATION: + err = s5k4ecgx_write(client, REG_USER_SATURATION, ctrl->val); + break; + + case V4L2_CID_SHARPNESS: + ctrl->val *= SHARPNESS_DIV; + err |= s5k4ecgx_write(client, REG_USER_SHARP1, ctrl->val); + err |= s5k4ecgx_write(client, REG_USER_SHARP2, ctrl->val); + err |= s5k4ecgx_write(client, REG_USER_SHARP3, ctrl->val); + err |= s5k4ecgx_write(client, REG_USER_SHARP4, ctrl->val); + err |= s5k4ecgx_write(client, REG_USER_SHARP5, ctrl->val); + break; + + case V4L2_CID_BRIGHTNESS: + err = s5k4ecgx_write(client, REG_USER_BRIGHTNESS, ctrl->val); + break; + } + mutex_unlock(&priv->lock); + if (err < 0) + v4l2_err(sd, "Failed to write s_ctrl err %d\n", err); + + return err; +} + +static const struct v4l2_ctrl_ops s5k4ecgx_ctrl_ops = { + .s_ctrl = s5k4ecgx_s_ctrl, +}; + +/* + * Reading s5k4ecgx version information + */ +static int s5k4ecgx_registered(struct v4l2_subdev *sd) +{ + int ret; + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + + mutex_lock(&priv->lock); + ret = __s5k4ecgx_power_on(priv); + if (!ret) { + ret = s5k4ecgx_read_fw_ver(sd); + __s5k4ecgx_power_off(priv); + } + mutex_unlock(&priv->lock); + + return ret; +} + +/* + * V4L2 subdev internal operations + */ +static int s5k4ecgx_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + + struct v4l2_mbus_framefmt *mf = v4l2_subdev_get_try_format(fh, 0); + + mf->width = s5k4ecgx_sizes[0].width; + mf->height = s5k4ecgx_sizes[0].height; + mf->code = s5k4ecgx_formats[0].code; + mf->colorspace = V4L2_COLORSPACE_JPEG; + mf->field = V4L2_FIELD_NONE; + + return 0; +} + +static const struct v4l2_subdev_internal_ops s5k4ecgx_subdev_internal_ops = { + .registered = s5k4ecgx_registered, + .open = s5k4ecgx_open, +}; + +static int s5k4ecgx_s_power(struct v4l2_subdev *sd, int on) +{ + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + int ret; + + v4l2_dbg(1, debug, sd, "Switching %s\n", on ? "on" : "off"); + + if (on) { + ret = __s5k4ecgx_power_on(priv); + if (!ret) { + /* Time to stablize sensor */ + msleep(priv->msleep); + if (s5k4ecgx_init_sensor(sd) < 0) { + ret = __s5k4ecgx_power_off(priv); + return -EIO; + } + } + } else { + ret = __s5k4ecgx_power_off(priv); + } + + return 0; +} + +static int s5k4ecgx_log_status(struct v4l2_subdev *sd) +{ + v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name); + + return 0; +} + +static const struct v4l2_subdev_core_ops s5k4ecgx_core_ops = { + .s_power = s5k4ecgx_s_power, + .log_status = s5k4ecgx_log_status, +}; + +static int __s5k4ecgx_s_stream(struct v4l2_subdev *sd, int on) +{ + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + int err = 0; + + if (on) + err = s5k4ecgx_write_array(sd, prev_regs[priv->curr_win->idx]); + + return err; +} + +static int s5k4ecgx_s_stream(struct v4l2_subdev *sd, int on) +{ + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + int ret = 0; + + v4l2_dbg(1, debug, sd, "Turn streaming %s\n", on ? "on" : "off"); + + mutex_lock(&priv->lock); + if (on) { + /* Ignore if s_stream is called twice */ + if (!priv->streaming) { + ret = __s5k4ecgx_s_stream(sd, on); + if (!ret) + priv->streaming = 1; + } + } + mutex_unlock(&priv->lock); + + return ret; +} + +static const struct v4l2_subdev_video_ops s5k4ecgx_video_ops = { + .s_stream = s5k4ecgx_s_stream, +}; + +static const struct v4l2_subdev_ops s5k4ecgx_ops = { + .core = &s5k4ecgx_core_ops, + .pad = &s5k4ecgx_pad_ops, + .video = &s5k4ecgx_video_ops, +}; + +/* + * GPIO setup + */ +static int s5k4ecgx_config_gpio(int nr, int val, const char *name) +{ + unsigned long flags = val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + int ret; + + if (!gpio_is_valid(nr)) + return 0; + ret = gpio_request_one(nr, flags, name); + if (!ret) + gpio_export(nr, 0); + + return ret; +} + +static void s5k4ecgx_free_gpios(struct s5k4ecgx *priv) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(priv->gpio); i++) { + if (!gpio_is_valid(priv->gpio[i].gpio)) + continue; + gpio_free(priv->gpio[i].gpio); + priv->gpio[i].gpio = -EINVAL; + } +} + +static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv, + const struct s5k4ecgx_platform_data *pdata) +{ + const struct s5k4ecgx_gpio *gpio = &pdata->gpio_stby; + int ret; + + priv->gpio[STBY].gpio = -EINVAL; + priv->gpio[RST].gpio = -EINVAL; + + ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_STBY"); + + if (ret) { + s5k4ecgx_free_gpios(priv); + return ret; + } + priv->gpio[STBY] = *gpio; + if (gpio_is_valid(gpio->gpio)) + gpio_set_value(gpio->gpio, 0); + + gpio = &pdata->gpio_reset; + + ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_RST"); + if (ret) { + s5k4ecgx_free_gpios(priv); + return ret; + } + priv->gpio[RST] = *gpio; + if (gpio_is_valid(gpio->gpio)) + gpio_set_value(gpio->gpio, 0); + + return 0; +} + +static int s5k4ecgx_init_v4l2_ctrls(struct s5k4ecgx *priv) +{ + const struct v4l2_ctrl_ops *ops = &s5k4ecgx_ctrl_ops; + struct v4l2_ctrl_handler *hdl = &priv->handler; + int ret; + + ret = v4l2_ctrl_handler_init(hdl, 4); + if (ret) + return ret; + + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BRIGHTNESS, -208, 127, 1, 0); + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST, -127, 127, 1, 0); + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION, -127, 127, 1, 0); + + /* Sharpness default is 24612, and then (24612/SHARPNESS_DIV) = 2 */ + v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SHARPNESS, -32704/SHARPNESS_DIV, + 24612/SHARPNESS_DIV, 1, 2); + if (hdl->error) { + ret = hdl->error; + v4l2_ctrl_handler_free(hdl); + return ret; + } + priv->sd.ctrl_handler = hdl; + + return 0; +}; + +/* + * Fetching platform data is being done with s_config subdev call. + * In probe routine, we just register subdev device + */ +static int s5k4ecgx_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int ret, i; + struct v4l2_subdev *sd; + struct s5k4ecgx *priv; + struct s5k4ecgx_platform_data *pdata = client->dev.platform_data; + + if (pdata == NULL) { + dev_err(&client->dev, "platform data is missing!\n"); + return -EINVAL; + } + priv = kzalloc(sizeof(struct s5k4ecgx), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + mutex_init(&priv->lock); + priv->msleep = pdata->msleep; + priv->streaming = 0; + + sd = &priv->sd; + /* Registering subdev */ + v4l2_i2c_subdev_init(sd, client, &s5k4ecgx_ops); + strlcpy(sd->name, S5K4ECGX_DRIVER_NAME, sizeof(sd->name)); + + sd->internal_ops = &s5k4ecgx_subdev_internal_ops; + /* Support v4l2 sub-device userspace API */ + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + + priv->pad.flags = MEDIA_PAD_FL_SOURCE; + sd->entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR; + ret = media_entity_init(&sd->entity, 1, &priv->pad, 0); + if (ret) + goto out_err1; + + ret = s5k4ecgx_config_gpios(priv, pdata); + if (ret) { + dev_err(&client->dev, "Failed to set gpios\n"); + goto out_err2; + } + for (i = 0; i < S5K4ECGX_NUM_SUPPLIES; i++) + priv->supplies[i].supply = s5k4ecgx_supply_names[i]; + + ret = regulator_bulk_get(&client->dev, S5K4ECGX_NUM_SUPPLIES, + priv->supplies); + if (ret) { + dev_err(&client->dev, "Failed to get regulators\n"); + goto out_err3; + } + + ret = s5k4ecgx_init_v4l2_ctrls(priv); + + if (ret) + goto out_err4; + + return 0; + +out_err4: + regulator_bulk_free(S5K4ECGX_NUM_SUPPLIES, priv->supplies); +out_err3: + s5k4ecgx_free_gpios(priv); +out_err2: + media_entity_cleanup(&priv->sd.entity); +out_err1: + kfree(priv); + + return ret; +} + +static int s5k4ecgx_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct s5k4ecgx *priv = to_s5k4ecgx(sd); + + mutex_destroy(&priv->lock); + v4l2_device_unregister_subdev(sd); + v4l2_ctrl_handler_free(&priv->handler); + media_entity_cleanup(&sd->entity); + kfree(priv); + + return 0; +} + +static const struct i2c_device_id s5k4ecgx_id[] = { + { S5K4ECGX_DRIVER_NAME, 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, s5k4ecgx_id); + +static struct i2c_driver v4l2_i2c_driver = { + .driver = { + .owner = THIS_MODULE, + .name = S5K4ECGX_DRIVER_NAME, + }, + .probe = s5k4ecgx_probe, + .remove = s5k4ecgx_remove, + .id_table = s5k4ecgx_id, +}; + +module_i2c_driver(v4l2_i2c_driver); + +MODULE_DESCRIPTION("Samsung S5K4ECGX 5MP SOC camera"); +MODULE_AUTHOR("Sangwook Lee sangwook.lee@linaro.org"); +MODULE_AUTHOR("Seok-Young Jang quartz.jang@samsung.com"); +MODULE_LICENSE("GPL"); diff --git a/include/media/s5k4ecgx.h b/include/media/s5k4ecgx.h new file mode 100644 index 0000000..093d1b8 --- /dev/null +++ b/include/media/s5k4ecgx.h @@ -0,0 +1,39 @@ +/* + * S5K4ECGX image sensor header file + * + * Copyright (C) 2012, Linaro + * Copyright (C) 2011, Samsung Electronics Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef S5K4ECGX_H +#define S5K4ECGX_H + +/** + * struct s5k4ecgx_gpio - data structure describing a GPIO + * @gpio : GPIO number + * @level: indicates active state of the @gpio + */ +struct s5k4ecgx_gpio { + int gpio; + int level; +}; + +/** + * struct ss5k4ecgx_platform_data- s5k4ecgx driver platform data + * @gpio_reset: GPIO driving RESET pin + * @gpio_stby : GPIO driving STBY pin + * @msleep : delay (ms) needed after enabling power + */ + +struct s5k4ecgx_platform_data { + struct s5k4ecgx_gpio gpio_reset; + struct s5k4ecgx_gpio gpio_stby; + int msleep; +}; + +#endif /* S5K4ECGX_H */