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__ */
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
Add factory default settings for S5K4ECGX sensor registers, which was copied from the reference code of Samsung S.LSI.
Signed-off-by: Sangwook Leesangwook.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[] = {
<sniiip>
+/* configure 30 fps */ +static const struct regval_list s5k4ecgx_fps_30[] = {
It really depends on sensor master clock frequency (as specified in FIMC driver platform data) and PLL setting what the resulting frame rate will be.
- { 0x700002b4, 0x0052 },
REG_0TC_PCFG_PVIMask
- { 0x700002be, 0x0000 },
REG_0TC_PCFG_usFrTimeType
- { 0x700002c0, 0x0001 },
REG_0TC_PCFG_FrRateQualityType
- { 0x700002c2, 0x014d },
REG_0TC_PCFG_usMaxFrTimeMsecMult10
- { 0x700002c4, 0x014d },
REG_0TC_PCFG_usMinFrTimeMsecMult10
- { 0x700002d0, 0x0000 },
REG_0TC_PCFG_uPrevMirror
Looks surprising! Are we really just disabling horizontal/vertical image mirror here ?
- { 0x700002d2, 0x0000 },
REG_0TC_PCFG_uCaptureMirror
- { 0x70000266, 0x0000 },
REG_TC_GP_ActivePrevConfig
- { 0x7000026a, 0x0001 },
REG_TC_GP_PrevOpenAfterChange
- { 0x7000024e, 0x0001 },
REG_TC_GP_NewConfigSync
- { 0x70000268, 0x0001 },
REG_TC_GP_PrevConfigChanged
Please have a look how it is handled in s5k6aa driver, it all looks pretty similar.
- { 0xffffffff, 0x0000 },
+};
+static const struct regval_list s5k4ecgx_effect_normal[] = {
- { 0x7000023c, 0x0000 },
Just one register, why do we need an array for it ? And of course 0x0000 is default value after reset, so it seems sort of pointless doing this I2C write to set the default image effect value (disabled).
These are possible values as found in the datasheet:
0x7000023C REG_TC_GP_SpecialEffects 0x0000 2 RW Special effect
0 : Normal 1 : MONOCHROME (BW) 2 : Negative Mono 3 : Negative Color 4 : Sepia 5 : AQUA 6 : Reddish 7 : Bluish 8 : Greenish 9 : Sketch 10 : Emboss color 11 : Emboss Mono
- { 0xffffffff, 0x0000 },
+};
+static const struct regval_list s5k4ecgx_wb_auto[] = {
- { 0x700004e6, 0x077f },
Ditto - register REG_TC_DBG_AutoAlgEnBits. And 0x077f is the default value after reset...
- { 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 },
No need for an array, it's REG_TC_UserContrast.
- { 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[] = {
...
+/* configure 640x480 preview size */ +static const struct regval_list s5k4ecgx_640_preview[] = {
...
+/* configure 352x288 preview size */ +static const struct regval_list s5k4ecgx_352_preview[] = {
...
+/* configure 176x144 preview size */ +static const struct regval_list s5k4ecgx_176_preview[] = {
...
+/* Default value for brightness */ +static const struct regval_list s5k4ecgx_ev_default[] = {
- { 0x70000230, 0x0000 },
REG_TC_UserBrightness
- { 0xffffffff, 0x0000 },
+};
+/* Default value for saturation */ +static const struct regval_list s5k4ecgx_saturation_default[] = {
- { 0x70000234, 0x0000 },
REG_TC_UserSaturation
- { 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 },
+};
You already use a sequence of i2c writes in s5k4ecgx_s_ctrl() function for V4L2_CID_SHARPNESS control. So why not just create e.g. s5k4ecgx_set_saturation() and send this array to /dev/null ? Also, invoking v4l2_ctrl_handler_setup() will cause a call to s5k4ecgx_s_ctrl() with default sharpness value (as specified during the control's creation).
So I would say this array is redundant in two ways... :)
--
Regards, Sylwester
Hi Sylwester
On 2 August 2012 21:50, Sylwester Nawrocki sylvester.nawrocki@gmail.com wrote:
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
Add factory default settings for S5K4ECGX sensor registers, which was copied from the reference code of Samsung S.LSI.
Signed-off-by: Sangwook Leesangwook.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[] = {
<sniiip>
+/* configure 30 fps */ +static const struct regval_list s5k4ecgx_fps_30[] = {
It really depends on sensor master clock frequency (as specified in FIMC driver platform data) and PLL setting what the resulting frame rate will be.
{ 0x700002b4, 0x0052 },
Looks surprising! Are we really just disabling horizontal/vertical image mirror here ?
I believe, this setting values are used still in Galaxy Nexus. It might be some reasons to set this values in the product, but I am not sure of this.
{ 0x700002d2, 0x0000 },
REG_0TC_PCFG_uCaptureMirror
{ 0x70000266, 0x0000 },
REG_TC_GP_ActivePrevConfig
{ 0x7000026a, 0x0001 },
REG_TC_GP_PrevOpenAfterChange
{ 0x7000024e, 0x0001 },
REG_TC_GP_NewConfigSync
{ 0x70000268, 0x0001 },
REG_TC_GP_PrevConfigChanged
Please have a look how it is handled in s5k6aa driver, it all looks pretty similar.
{ 0xffffffff, 0x0000 },
+};
+static const struct regval_list s5k4ecgx_effect_normal[] = {
{ 0x7000023c, 0x0000 },
Just one register, why do we need an array for it ? And of course 0x0000 is default value after reset, so it seems sort of pointless doing this I2C write to set the default image effect value (disabled).
These are possible values as found in the datasheet:
0x7000023C REG_TC_GP_SpecialEffects 0x0000 2 RW Special effect
0 : Normal 1 : MONOCHROME (BW) 2 : Negative Mono 3 : Negative Color 4 : Sepia 5 : AQUA 6 : Reddish 7 : Bluish 8 : Greenish 9 : Sketch 10 : Emboss color 11 : Emboss Mono
{ 0xffffffff, 0x0000 },
+};
+static const struct regval_list s5k4ecgx_wb_auto[] = {
{ 0x700004e6, 0x077f },
Ditto - register REG_TC_DBG_AutoAlgEnBits. And 0x077f is the default value after reset...
{ 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 },
No need for an array, it's REG_TC_UserContrast.
{ 0xffffffff, 0x0000 },
+};
[snip]
{ 0xffffffff, 0x0000 },
+};
You already use a sequence of i2c writes in s5k4ecgx_s_ctrl() function for V4L2_CID_SHARPNESS control. So why not just create e.g. s5k4ecgx_set_saturation() and send this array to /dev/null ? Also, invoking v4l2_ctrl_handler_setup() will cause a call to s5k4ecgx_s_ctrl() with default sharpness value (as specified during the control's creation).
So I would say this array is redundant in two ways... :)
Thanks, let me change this.
--
Regards, Sylwester
Hi Sangwook,
On 08/03/2012 05:05 PM, Sangwook Lee wrote:
+/* configure 30 fps */ +static const struct regval_list s5k4ecgx_fps_30[] = {
It really depends on sensor master clock frequency (as specified in FIMC driver platform data) and PLL setting what the resulting frame rate will be.
{ 0x700002b4, 0x0052 },
Looks surprising! Are we really just disabling horizontal/vertical image mirror here ?
I believe, this setting values are used still in Galaxy Nexus. It might be some reasons to set this values in the product, but I am not sure of this.
My point was that some entries in this table allegedly are setting image mirroring, even though the array name suggests it should be only setting frame rate to 30 fps. This is just bad practice. If you would have added HFLIP/VFLIP controls, the register values would have been trashed every time frame rate is set. Someone would have eventually have had to get rid of this s5k4ecgx_fps_30 array, in order to add new features.
[snip]
{ 0xffffffff, 0x0000 },
+};
You already use a sequence of i2c writes in s5k4ecgx_s_ctrl() function for V4L2_CID_SHARPNESS control. So why not just create e.g. s5k4ecgx_set_saturation() and send this array to /dev/null ? Also, invoking v4l2_ctrl_handler_setup() will cause a call to s5k4ecgx_s_ctrl() with default sharpness value (as specified during the control's creation).
So I would say this array is redundant in two ways... :)
Thanks, let me change this.
Thanks, please at least remove those single entry arrays, with the resolution arrays gone as well and the biggest array converted to firmware blob I don't see a reason why this driver couldn't be accepted upstream.
--
Regards, Sylwester
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 */
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
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 Leesangwook.lee-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org
...
+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",
Might be better to avoid voltage value in regulator supply names. Can you just make it on of: vdda, vddio, vddcore ? On some systems all 3 power pads might be used and all 3 voltage supply names might be needed. I guess it can be changed if there is a need for it. Also we could specify all 3 entries as above and add such regulator supply names at a corresponding regulator.
- /* vdd_1.8v is for regulator input */
- "vdd_1.8v",
I would suggest just using "vddreg".
+static int s5k4ecgx_write(struct i2c_client *client, u32 addr, u16 val) +{
- int ret = 0;
Unneeded initialization.
- 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;
Ditto.
- 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 */
avaialbe -> available
- ret = s5k4ecgx_i2c_write(client, 0x1030, 0x0000);
- if (ret)
return ret;
- /* Halt ARM CPU */
- ret = s5k4ecgx_i2c_write(client, 0x0014, 0x0001);
- return ret;
return s5k4ecgx_i2c_write(...); ?
+}
+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;
Unneeded initialization.
- 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_init_sensor(struct v4l2_subdev *sd) +{
- int ret = 0;
Ditto.
- 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_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;
Unneded initilization.
- 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_subdev_core_ops s5k4ecgx_core_ops = {
- .s_power = s5k4ecgx_s_power,
- .log_status = s5k4ecgx_log_status,
nit: inconsistent indentation.
+};
+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;
if (on) return s5k4ecgx_write_array(sd, prev_regs[priv->curr_win->idx]);
return 0;
+}
...
+/*
- Fetching platform data is being done with s_config subdev call.
This comment is false, care to remove it ?
- 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);
devm_kzalloc ?
- 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);
How about using devm_regulator_bulk_get() ?
- 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;
+}
...
+/**
- 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
Can't it be some default value hardcoded at the driver ?
- */
+struct s5k4ecgx_platform_data {
- struct s5k4ecgx_gpio gpio_reset;
- struct s5k4ecgx_gpio gpio_stby;
- int msleep;
+};
+#endif /* S5K4ECGX_H */
--
Regards, Sylwester
Hi Sylwester
On 2 August 2012 22:18, Sylwester Nawrocki sylvester.nawrocki@gmail.comwrote:
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
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-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
...
+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",
Might be better to avoid voltage value in regulator supply names. Can you just make it on of: vdda, vddio, vddcore ? On some systems all 3 power pads might be used and all 3 voltage supply names might be needed. I guess it can be changed if there is a need for it. Also we could specify all 3 entries as above and add such regulator supply names at a corresponding regulator.
Ok, I will change this.
/* vdd_1.8v is for regulator input */
"vdd_1.8v",
I would suggest just using "vddreg".
+static int s5k4ecgx_write(struct i2c_client *client, u32 addr, u16 val) +{
int ret = 0;
Unneeded initialization.
ditto
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;
Ditto.
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 */
avaialbe -> available
Oops!, I will change this.
ret = s5k4ecgx_i2c_write(client, 0x1030, 0x0000);
if (ret)
return ret;
/* Halt ARM CPU */
ret = s5k4ecgx_i2c_write(client, 0x0014, 0x0001);
return ret;
return s5k4ecgx_i2c_write(...); ?
+}
+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;
Unneeded initialization.
ditto
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_init_sensor(struct v4l2_subdev *sd) +{
int ret = 0;
Ditto.
ditto
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_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;
Unneded initilization.
Ok, I will change this.
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_subdev_core_ops s5k4ecgx_core_ops = {
.s_power = s5k4ecgx_s_power,
.log_status = s5k4ecgx_log_status,
nit: inconsistent indentation.
ditto
+};
+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;
if (on) return s5k4ecgx_write_array(sd,
prev_regs[priv->curr_win->idx]);
return 0;
+}
...
+/*
- Fetching platform data is being done with s_config subdev call.
This comment is false, care to remove it ?
Ok, I will fix this.
- 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);
devm_kzalloc ?
Ok, I wil apply this.
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);
How about using devm_regulator_bulk_get() ?
Ok, let me look into this.
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;
+}
...
+/**
- 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
Can't it be some default value hardcoded at the driver ?
Ok, let me look into this again.
- */
+struct s5k4ecgx_platform_data {
struct s5k4ecgx_gpio gpio_reset;
struct s5k4ecgx_gpio gpio_stby;
int msleep;
+};
+#endif /* S5K4ECGX_H */
Thanks a lot!
Regards Sangwook
--
Regards, Sylwester
Hi Sangwook,
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
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
It looks like a great improvement, well done! Thanks!
In the S5K4CAGX sensor datasheet, that can be found on the internet, there is 0x0000...0x002E registers description, which look very much same as in S5K6AAFX case and likely is also valid for S5K4CAGX.
My second thought was, if we won't be able to get rid of those hundreds of initial register values, to convert them to regular firmware blob. And add regular firmware handling at the driver. I know it may sound not standard but imagine dozens of such sensor drivers coexisting in the mainline kernel. The source code would have been mainly register address/value arrays...
What do you think about converting s5k4ecgx_img_regs arrays (it has over 2700 entries) to a firmware file and adding some simple parser to the driver ? Then we would have the problem solved in most part.
Regarding various preview resolution set up, the difference in all those s5k4ecgx_*_preview[] arrays is rather small, only register values differ, e.g. for 640x480 and 720x480 there is only 8 different entries:
$ diff -a s5k4ec_640.txt s5k4ec_720.txt 1c1 < static const struct regval_list s5k4ecgx_640_preview[] = { ---
static const struct regval_list s5k4ecgx_720_preview[] = {
3c3 < { 0x70000252, 0x0780 }, ---
{ 0x70000252, 0x06a8 },
5c5 < { 0x70000256, 0x000c }, ---
{ 0x70000256, 0x0078 },
7c7 < { 0x7000025a, 0x0780 }, ---
{ 0x7000025a, 0x06a8 },
9c9 < { 0x7000025e, 0x000c }, ---
{ 0x7000025e, 0x0078 },
11c11 < { 0x70000496, 0x0780 }, ---
{ 0x70000496, 0x06a8 },
15c15 < { 0x7000049e, 0x0780 }, ---
{ 0x7000049e, 0x06a8 },
21c21 < { 0x700002a6, 0x0280 }, ---
{ 0x700002a6, 0x02d0 },
28c28 < { 0x700002c4, 0x014a }, ---
{ 0x700002c4, 0x014d },
I've found S5K4ECGX sensor datasheet on internet (Rev 0.07), and on a quick look the description of most of registers from those tables could be found there.
Could you please try to implement a function that replaces those tables, based s5k6aa_set_prev_config() and s5k6aa_set_output_framefmt() ?
Regards, Sylwester
Hi Sylwester
Thank you for the review.
On 2 August 2012 21:11, Sylwester Nawrocki sylvester.nawrocki@gmail.com wrote:
Hi Sangwook,
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
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
It looks like a great improvement, well done! Thanks!
In the S5K4CAGX sensor datasheet, that can be found on the internet, there is 0x0000...0x002E registers description, which look very much same as in S5K6AAFX case and likely is also valid for S5K4CAGX.
[snip]
What do you think about converting s5k4ecgx_img_regs arrays (it has over 2700 entries) to a firmware file and adding some simple parser to the driver ? Then we would have the problem solved in most part.
Thanks, fair enough. let me try this.
Regarding various preview resolution set up, the difference in all those s5k4ecgx_*_preview[] arrays is rather small, only register values differ, e.g. for 640x480 and 720x480 there is only 8 different entries:
Ok, let me reduce table size again.
$ diff -a s5k4ec_640.txt s5k4ec_720.txt 1c1
< static const struct regval_list s5k4ecgx_640_preview[] = {
static const struct regval_list s5k4ecgx_720_preview[] = {
3c3
< { 0x70000252, 0x0780 },
{ 0x70000252, 0x06a8 },
5c5
[snip]
< { 0x70000256, 0x000c },
{ 0x700002a6, 0x02d
[snip]
Could you please try to implement a function that replaces those tables, based s5k6aa_set_prev_config() and s5k6aa_set_output_framefmt() ?
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
Thanks Sangwook
Regards, Sylwester
Hi Sangwook,
On 08/03/2012 04:24 PM, Sangwook Lee wrote:
Hi Sylwester
Thank you for the review.
On 2 August 2012 21:11, Sylwester Nawrockisylvester.nawrocki@gmail.com wrote:
On 08/02/2012 03:42 PM, Sangwook Lee wrote:
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
It looks like a great improvement, well done! Thanks!
In the S5K4CAGX sensor datasheet, that can be found on the internet, there is 0x0000...0x002E registers description, which look very much same as in S5K6AAFX case and likely is also valid for S5K4CAGX.
[snip]
What do you think about converting s5k4ecgx_img_regs arrays (it has over 2700 entries) to a firmware file and adding some simple parser to the driver ? Then we would have the problem solved in most part.
Thanks, fair enough. let me try this.
All right, thanks.
Regarding various preview resolution set up, the difference in all those s5k4ecgx_*_preview[] arrays is rather small, only register values differ, e.g. for 640x480 and 720x480 there is only 8 different entries:
Ok, let me reduce table size again.
I don't think it's worth the effort to work around those tables. They may just be removed entirely. I'll see if I can find time to prepare a function replacing them. All required information seems to be available in the datasheet.
$ diff -a s5k4ec_640.txt s5k4ec_720.txt 1c1
< static const struct regval_list s5k4ecgx_640_preview[] = {
static const struct regval_list s5k4ecgx_720_preview[] = {
3c3
< { 0x70000252, 0x0780 },
{ 0x70000252, 0x06a8 },
5c5
[snip]
< { 0x70000256, 0x000c },
{ 0x700002a6, 0x02d
[snip]
Could you please try to implement a function that replaces those tables, based s5k6aa_set_prev_config() and s5k6aa_set_output_framefmt() ?
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
Yes, I know it's not trivial and requires some work... Let me try to cook up something myself, as I have already some experience with S5K6AAFX. Those "firmware" arrays are evil, and no good driver shall rely on them.. :-)
And we have plenty time now, until v3.7 merge window.
--
Regards, Sylwester
Hi Sangwook,
On 08/03/2012 04:24 PM, Sangwook Lee wrote:
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
I've converted this driver to use function calls instead of the register arrays. It can be pulled, along with a couple of minor fixes/improvements, from following git tree:
git://linuxtv.org/snawrocki/media.git s5k4ecgx (gitweb: http://git.linuxtv.org/snawrocki/media.git/s5k4ecgx)
I don't own any Origen board thus it's untested. Could you give it a try ? The register write sequence should be identical as in the case of using the arrays.
Regarding support for still (JPEG) capture features of S5K4ECGX, it should be possible to make this work with the mainline s5p-fimc driver, it supports V4L2_PIX_FMT_JPEG/V4L2_MBUS_FMT_JPEG_1X8 formats. There is only missing an API for preallocating proper memory buffer for the snapshot frame. Currently s5p-fimc calculates buffer's size from pixel resolution, using some fixed coefficient.
I'm planning on adding new V4L2_CID_FRAMESIZE control that could be a replacement for V4L2_CID_CAM_JPEG_MEMSIZE, as found in this driver: https://android.googlesource.com/kernel/samsung.git/+/3b0c5d2887fca99cab7dd5...
Except that, there would be needed a new V4L2_CID_SNAPSHOT control in place of custom V4L2_CID_CAM_CAPTURE. I might try to add that and document in near future.
You won't find much regarding the face detection features in V4L2, unfortunately. _Maybe_ I'll try to address this as well on some day, for now private controls might be your only solution. Unless you feel like adding face detection features support to V4L2.. ;)
BTW, are your requirements to support both EVT1.0 and EVT1.1 S5K4ECGX revisions ?
--
Regards, Sylwester
Hi Sylwester
On 19 August 2012 22:29, Sylwester Nawrocki sylvester.nawrocki@gmail.com wrote:
Hi Sangwook,
On 08/03/2012 04:24 PM, Sangwook Lee wrote:
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
I've converted this driver to use function calls instead of the register arrays. It can be pulled, along with a couple of minor fixes/improvements, from following git tree:
git://linuxtv.org/snawrocki/media.git s5k4ecgx (gitweb: http://git.linuxtv.org/snawrocki/media.git/s5k4ecgx)
I don't own any Origen board thus it's untested. Could you give it a try ?
Wow! Great, let me download from this git and then test.
The register write sequence should be identical as in the case of using the arrays.
You won't find much regarding the face detection features in V4L2, unfortunately. _Maybe_ I'll try to address this as well on some day, for now private controls might be your only solution. Unless you feel like adding face detection features support to V4L2.. ;)
BTW, are your requirements to support both EVT1.0 and EVT1.1 S5K4ECGX revisions ?
I have only EVT 1.1. So I have no chance to run EVT 1.0 version.
Thanks Sangwook
--
Regards, Sylwester
Hi Sylwester
On 20 August 2012 09:12, Sangwook Lee sangwook.lee@linaro.org wrote:
Hi Sylwester
On 19 August 2012 22:29, Sylwester Nawrocki sylvester.nawrocki@gmail.com wrote:
Hi Sangwook,
On 08/03/2012 04:24 PM, Sangwook Lee wrote:
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
I've converted this driver to use function calls instead of the register arrays. It can be pulled, along with a couple of minor fixes/improvements, from following git tree:
git://linuxtv.org/snawrocki/media.git s5k4ecgx (gitweb: http://git.linuxtv.org/snawrocki/media.git/s5k4ecgx)
I don't own any Origen board thus it's untested. Could you give it a try ?
Sorry, It doesn't work. I will send pictures to you by another mail thread. Previously, I tested preview array and found out that + /* + * FIXME: according to the datasheet, + * 0x70000496~ 0x7000049c seems to be only for capture mode, + * but without these value, it doesn't work with preview mode. + */
Do we need to set those values ?
Thanks Sangwook
Wow! Great, let me download from this git and then test.
Thanks
Hi Sangwook,
On 08/20/2012 12:43 PM, Sangwook Lee wrote:
On 20 August 2012 09:12, Sangwook Lee sangwook.lee@linaro.org wrote:
On 19 August 2012 22:29, Sylwester Nawrocki sylvester.nawrocki@gmail.com wrote:
On 08/03/2012 04:24 PM, Sangwook Lee wrote:
I was thinking about this, but this seems to be is a bit time-consuming because I have to do this just due to lack of s5k4ecgx hardware information. let me try it later once this patch is accepted.
I've converted this driver to use function calls instead of the register arrays. It can be pulled, along with a couple of minor fixes/improvements, from following git tree:
git://linuxtv.org/snawrocki/media.git s5k4ecgx (gitweb: http://git.linuxtv.org/snawrocki/media.git/s5k4ecgx)
I don't own any Origen board thus it's untested. Could you give it a try ?
Sorry, It doesn't work. I will send pictures to you by another mail thread. Previously, I tested preview array and found out that
- /*
* FIXME: according to the datasheet,
* 0x70000496~ 0x7000049c seems to be only for capture mode,
* but without these value, it doesn't work with preview mode.
*/
Do we need to set those values ?
Yes, after my changes it should be set too. But there is a bug in the registers definitions. Attached patch should correct this, sorry about this oversight. Let me know if there are still any issues. To make sure the I2C write sequences are correct it might be useful to log all calls to s5k4ecgx_write() and compare the logs with original tables.
--
Regards, Sylwester
Hi Sylwester
On 20 August 2012 12:33, Sylwester Nawrocki s.nawrocki@samsung.com wrote:
Hi Sangwook,
[snip]
registers definitions. Attached patch should correct this, sorry about this oversight. Let me know if there are still any issues. To make sure the I2C write sequences are correct it might be useful to log all calls to s5k4ecgx_write() and compare the logs with original tables.
Yes, it is. I still need to compare both two revision after applying the new patch. let me compare logs in detail.
Thanks Sangwook
--
Regards, Sylwester