* [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
@ 2012-08-02 13:42 Sangwook Lee
2012-08-02 13:42 ` [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor Sangwook Lee
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Sangwook Lee @ 2012-08-02 13:42 UTC (permalink / raw)
To: linux-media
Cc: mchehab, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad, Sangwook Lee
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
--
1.7.9.5
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor
2012-08-02 13:42 [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sangwook Lee
@ 2012-08-02 13:42 ` Sangwook Lee
2012-08-02 20:50 ` Sylwester Nawrocki
2012-08-02 13:42 ` [PATH v3 2/2] v4l: Add v4l2 subdev driver for " Sangwook Lee
2012-08-02 20:11 ` [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sylwester Nawrocki
2 siblings, 1 reply; 14+ messages in thread
From: Sangwook Lee @ 2012-08-02 13:42 UTC (permalink / raw)
To: linux-media
Cc: mchehab, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad, Sangwook Lee
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__ */
--
1.7.9.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATH v3 2/2] v4l: Add v4l2 subdev driver for S5K4ECGX sensor
2012-08-02 13:42 [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sangwook Lee
2012-08-02 13:42 ` [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor Sangwook Lee
@ 2012-08-02 13:42 ` Sangwook Lee
2012-08-02 21:18 ` Sylwester Nawrocki
2012-08-02 20:11 ` [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sylwester Nawrocki
2 siblings, 1 reply; 14+ messages in thread
From: Sangwook Lee @ 2012-08-02 13:42 UTC (permalink / raw)
To: linux-media
Cc: mchehab, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad, Sangwook Lee
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 */
--
1.7.9.5
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-02 13:42 [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sangwook Lee
2012-08-02 13:42 ` [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor Sangwook Lee
2012-08-02 13:42 ` [PATH v3 2/2] v4l: Add v4l2 subdev driver for " Sangwook Lee
@ 2012-08-02 20:11 ` Sylwester Nawrocki
2012-08-03 14:24 ` Sangwook Lee
2 siblings, 1 reply; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-02 20:11 UTC (permalink / raw)
To: Sangwook Lee
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor
2012-08-02 13:42 ` [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor Sangwook Lee
@ 2012-08-02 20:50 ` Sylwester Nawrocki
2012-08-03 15:05 ` Sangwook Lee
0 siblings, 1 reply; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-02 20:50 UTC (permalink / raw)
To: Sangwook Lee
Cc: linux-media, mchehab, laurent.pinchart, sakari.ailus, suapapa,
quartz.jang, linaro-dev, patches, usman.ahmad
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 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[] = {
<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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 2/2] v4l: Add v4l2 subdev driver for S5K4ECGX sensor
2012-08-02 13:42 ` [PATH v3 2/2] v4l: Add v4l2 subdev driver for " Sangwook Lee
@ 2012-08-02 21:18 ` Sylwester Nawrocki
0 siblings, 0 replies; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-02 21:18 UTC (permalink / raw)
To: Sangwook Lee
Cc: LMML, quartz.jang, linaro-dev, patches, suapapa, Laurent Pinchart,
sakari.ailus
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.
> + /* 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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-02 20:11 ` [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sylwester Nawrocki
@ 2012-08-03 14:24 ` Sangwook Lee
2012-08-03 20:41 ` Sylwester Nawrocki
2012-08-19 21:29 ` Sylwester Nawrocki
0 siblings, 2 replies; 14+ messages in thread
From: Sangwook Lee @ 2012-08-03 14:24 UTC (permalink / raw)
To: Sylwester Nawrocki
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor
2012-08-02 20:50 ` Sylwester Nawrocki
@ 2012-08-03 15:05 ` Sangwook Lee
2012-08-03 20:57 ` Sylwester Nawrocki
0 siblings, 1 reply; 14+ messages in thread
From: Sangwook Lee @ 2012-08-03 15:05 UTC (permalink / raw)
To: Sylwester Nawrocki
Cc: linux-media, mchehab, laurent.pinchart, sakari.ailus, suapapa,
quartz.jang, linaro-dev, patches, usman.ahmad
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 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[] = {
>
> <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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-03 14:24 ` Sangwook Lee
@ 2012-08-03 20:41 ` Sylwester Nawrocki
2012-08-19 21:29 ` Sylwester Nawrocki
1 sibling, 0 replies; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-03 20:41 UTC (permalink / raw)
To: Sangwook Lee
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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 Nawrocki<sylvester.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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor
2012-08-03 15:05 ` Sangwook Lee
@ 2012-08-03 20:57 ` Sylwester Nawrocki
0 siblings, 0 replies; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-03 20:57 UTC (permalink / raw)
To: Sangwook Lee
Cc: linux-media, mchehab, laurent.pinchart, sakari.ailus, suapapa,
quartz.jang, linaro-dev, patches, usman.ahmad
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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-03 14:24 ` Sangwook Lee
2012-08-03 20:41 ` Sylwester Nawrocki
@ 2012-08-19 21:29 ` Sylwester Nawrocki
2012-08-20 8:12 ` Sangwook Lee
1 sibling, 1 reply; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-19 21:29 UTC (permalink / raw)
To: Sangwook Lee
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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/+/3b0c5d2887fca99cab7dd506817b1049d38198a1/drivers/media/video/s5k4ecgx.c
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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-19 21:29 ` Sylwester Nawrocki
@ 2012-08-20 8:12 ` Sangwook Lee
2012-08-20 10:43 ` Sangwook Lee
0 siblings, 1 reply; 14+ messages in thread
From: Sangwook Lee @ 2012-08-20 8:12 UTC (permalink / raw)
To: Sylwester Nawrocki
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-20 8:12 ` Sangwook Lee
@ 2012-08-20 10:43 ` Sangwook Lee
2012-08-20 11:33 ` Sylwester Nawrocki
0 siblings, 1 reply; 14+ messages in thread
From: Sangwook Lee @ 2012-08-20 10:43 UTC (permalink / raw)
To: Sylwester Nawrocki
Cc: linux-media, laurent.pinchart, sakari.ailus, suapapa, quartz.jang,
linaro-dev, patches, usman.ahmad
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
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP
2012-08-20 10:43 ` Sangwook Lee
@ 2012-08-20 11:33 ` Sylwester Nawrocki
0 siblings, 0 replies; 14+ messages in thread
From: Sylwester Nawrocki @ 2012-08-20 11:33 UTC (permalink / raw)
To: Sangwook Lee
Cc: Sylwester Nawrocki, linux-media, laurent.pinchart, sakari.ailus,
suapapa, quartz.jang, linaro-dev, patches, usman.ahmad
[-- Attachment #1: Type: text/plain, Size: 1631 bytes --]
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
[-- Attachment #2: 0001-s5k4ecgx-fix-register-definitions.patch --]
[-- Type: text/x-patch, Size: 1499 bytes --]
>From b53f1279a32808d696676b905d167bcd33c6e2dc Mon Sep 17 00:00:00 2001
From: Sylwester Nawrocki <s.nawrocki@samsung.com>
Date: Mon, 20 Aug 2012 13:27:03 +0200
Subject: [PATCH] s5k4ecgx: fix register definitions
---
drivers/media/video/s5k4ecgx.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/media/video/s5k4ecgx.c b/drivers/media/video/s5k4ecgx.c
index 8ad0fb1..836db2f 100644
--- a/drivers/media/video/s5k4ecgx.c
+++ b/drivers/media/video/s5k4ecgx.c
@@ -69,7 +69,7 @@ module_param(debug, int, 0644);
#define REG_G_PREV_OPEN_AFTER_CH 0x7000026a
/* Preview context register sets. n = 0...4. */
-#define PREG(n, x) ((n) * 0x26 + (x))
+#define PREG(n, x) ((n) * 0x30 + (x))
#define REG_P_OUT_WIDTH(n) PREG(n, 0x700002a6)
#define REG_P_OUT_HEIGHT(n) PREG(n, 0x700002a8)
#define REG_P_FMT(n) PREG(n, 0x700002aa)
@@ -93,10 +93,10 @@ module_param(debug, int, 0644);
#define REG_G_PREVZOOM_IN_HEIGHT 0x70000496
#define REG_G_PREVZOOM_IN_XOFFS 0x70000498
#define REG_G_PREVZOOM_IN_YOFFS 0x7000049a
-#define REG_G_CAPZOOM_IN_WIDTH 0x70000494
-#define REG_G_CAPZOOM_IN_HEIGHT 0x70000496
-#define REG_G_CAPZOOM_IN_XOFFS 0x70000498
-#define REG_G_CAPZOOM_IN_YOFFS 0x7000049a
+#define REG_G_CAPZOOM_IN_WIDTH 0x7000049c
+#define REG_G_CAPZOOM_IN_HEIGHT 0x7000049e
+#define REG_G_CAPZOOM_IN_XOFFS 0x700004a0
+#define REG_G_CAPZOOM_IN_YOFFS 0x700004a2
/* n = 0...4 */
#define REG_USER_SHARPNESS(n) (0x70000a28 + (n) * 0xb6)
--
1.7.11.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2012-08-20 11:33 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-02 13:42 [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sangwook Lee
2012-08-02 13:42 ` [PATH v3 1/2] v4l: Add factory register values form S5K4ECGX sensor Sangwook Lee
2012-08-02 20:50 ` Sylwester Nawrocki
2012-08-03 15:05 ` Sangwook Lee
2012-08-03 20:57 ` Sylwester Nawrocki
2012-08-02 13:42 ` [PATH v3 2/2] v4l: Add v4l2 subdev driver for " Sangwook Lee
2012-08-02 21:18 ` Sylwester Nawrocki
2012-08-02 20:11 ` [PATH v3 0/2] Add v4l2 subdev driver for S5K4ECGX sensor with embedded SoC ISP Sylwester Nawrocki
2012-08-03 14:24 ` Sangwook Lee
2012-08-03 20:41 ` Sylwester Nawrocki
2012-08-19 21:29 ` Sylwester Nawrocki
2012-08-20 8:12 ` Sangwook Lee
2012-08-20 10:43 ` Sangwook Lee
2012-08-20 11:33 ` Sylwester Nawrocki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).