2 * Driver for OV5642 CMOS Image Sensor from OmniVision
4 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/videodev2.h>
12 #include <linux/slab.h>
13 #include <linux/i2c.h>
14 #include <linux/log2.h>
15 #include <linux/platform_device.h>
16 #include <linux/delay.h>
17 #include <linux/circ_buf.h>
18 #include <linux/miscdevice.h>
19 #include <media/v4l2-common.h>
20 #include <media/v4l2-chip-ident.h>
21 #include <media/soc_camera.h>
22 #include <plat/rk_camera.h>
23 #include <linux/delay.h>
26 module_param(debug, int, S_IRUGO|S_IWUSR);
28 #define dprintk(level, fmt, arg...) do { \
30 printk(KERN_WARNING fmt , ## arg); } while (0)
32 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
33 #define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
36 #define _CONS(a,b) a##b
37 #define CONS(a,b) _CONS(a,b)
40 #define _STR(x) __STR(x)
41 #define STR(x) _STR(x)
43 #define MIN(x,y) ((x<y) ? x: y)
44 #define MAX(x,y) ((x>y) ? x: y)
46 /* Sensor Driver Configuration */
47 #define SENSOR_NAME RK29_CAM_SENSOR_S5K6AA
48 #define SENSOR_V4L2_IDENT V4L2_IDENT_S5K66A
49 #define SENSOR_ID 0x06aa
50 #define SENSOR_ID_REG SEQUENCE_END//0x015a
51 #define SENSOR_RESET_REG SEQUENCE_END
52 #define SENSOR_RESET_VAL 0x00
53 #define SENSOR_MIN_WIDTH 640
54 #define SENSOR_MIN_HEIGHT 480
55 #define SENSOR_MAX_WIDTH 1280
56 #define SENSOR_MAX_HEIGHT 1024
57 #define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
58 #define SENSOR_INIT_HEIGHT 480
59 #define SENSOR_INIT_WINSEQADR sensor_vga
60 #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
62 #define CONFIG_SENSOR_WhiteBalance 0
63 #define CONFIG_SENSOR_Brightness 0
64 #define CONFIG_SENSOR_Contrast 0
65 #define CONFIG_SENSOR_Saturation 0
66 #define CONFIG_SENSOR_Effect 0
67 #define CONFIG_SENSOR_Scene 0
68 #define CONFIG_SENSOR_DigitalZoom 0
69 #define CONFIG_SENSOR_Focus 0
70 #define CONFIG_SENSOR_Exposure 0
71 #define CONFIG_SENSOR_Flash 0
72 #define CONFIG_SENSOR_Mirror 1
73 #define CONFIG_SENSOR_Flip 0
74 #define CONFIG_SENSOR_Focus 0
77 #define CONFIG_SENSOR_I2C_SPEED 250000 /* Hz */
78 /* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */
79 #define CONFIG_SENSOR_I2C_NOSCHED 0
80 #define CONFIG_SENSOR_I2C_RDWRCHK 0
83 #define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\
84 SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |\
85 SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
87 #define COLOR_TEMPERATURE_CLOUDY_DN 6500
88 #define COLOR_TEMPERATURE_CLOUDY_UP 8000
89 #define COLOR_TEMPERATURE_CLEARDAY_DN 5000
90 #define COLOR_TEMPERATURE_CLEARDAY_UP 6500
91 #define COLOR_TEMPERATURE_OFFICE_DN 3500
92 #define COLOR_TEMPERATURE_OFFICE_UP 5000
93 #define COLOR_TEMPERATURE_HOME_DN 2500
94 #define COLOR_TEMPERATURE_HOME_UP 3500
96 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))
97 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)
99 #define SENSOR_AF_IS_ERR (0x00<<0)
100 #define SENSOR_AF_IS_OK (0x01<<0)
101 #define SENSOR_INIT_IS_ERR (0x00<<28)
102 #define SENSOR_INIT_IS_OK (0x01<<28)
104 #if CONFIG_SENSOR_Focus
105 #define SENSOR_AF_MODE_INFINITY 0
106 #define SENSOR_AF_MODE_MACRO 1
107 #define SENSOR_AF_MODE_FIXED 2
108 #define SENSOR_AF_MODE_AUTO 3
109 #define SENSOR_AF_MODE_CONTINUOUS 4
110 #define SENSOR_AF_MODE_CLOSE 5
113 //flash off in fixed time to prevent from too hot , zyc
115 struct soc_camera_device *icd;
116 struct hrtimer timer;
118 #if CONFIG_SENSOR_Flash
119 static enum hrtimer_restart flash_off_func(struct hrtimer *timer);
121 static struct flash_timer flash_off_timer;
122 //for user defined if user want to customize the series , zyc
123 #ifdef CONFIG_S5K6AA_USER_DEFINED_SERIES
124 #include "s5k6aa_user_series.c"
127 /* init 640X480 SVGA */
128 static struct reginfo sensor_init_data[] =
130 {0x0010,0x0001}, // Reset
131 {0x1030,0x0000}, // Clear host interrupt so main will wait
132 {0x0014,0x0001}, // ARM go
134 {SEQUENCE_WAIT_MS,50},
136 {0x0028,0x7000}, // start add MSW
137 {0x002A,0x1d60}, // start add LSW
533 // Write memory example:
535 // Write HW register example:
538 {0x002A,0x0e3a}, // #awbb_Alpha_Comp_Mode
542 {0x002A,0x112a}, //#senHal_SenRegsModes3_pSenModesRegsArray3[8]
544 {0x002A,0x1132}, //#senHal_SenRegsModes3_pSenModesRegsArray3[12]
546 {0x002A,0x113e}, //#senHal_SenRegsModes3_pSenModesRegsArray3[18]
548 {0x002A,0x115c}, //#senHal_SenRegsModes3_pSenModesRegsArray3[33]
550 {0x002A,0x1164}, //#senHal_SenRegsModes3_pSenModesRegsArray3[37]
552 {0x002A,0x1174}, //#senHal_SenRegsModes3_pSenModesRegsArray3[45]
554 {0x002A,0x1178}, //#senHal_SenRegsModes3_pSenModesRegsArray3[47]
557 {0x002A,0x077a}, //#msm_uOffsetNoBin[0][0]
558 {0x0F12,0x0000}, //#msm_uOffsetNoBin[0][1]
559 {0x0F12,0x0000}, //#msm_uOffsetNoBin[1][0]
560 {0x0F12,0x0000}, //#msm_uOffsetNoBin[1][1]
561 {0x0F12,0x0000}, //#msm_uOffsetNoBin[2][0]
562 {0x0F12,0x0000}, //#msm_uOffsetNoBin[2][1]
563 {0x0F12,0x0000}, //#msm_uOffsetNoBin[3][0]
564 {0x0F12,0x0000}, //#msm_uOffsetNoBin[3][1]
567 {0x002A,0x07a2}, //#msm_sAnalogOffset[0]
568 {0x0F12,0x0000}, //#msm_sAnalogOffset[1]
569 {0x0F12,0x0000}, //#msm_sAnalogOffset[2]
570 {0x0F12,0x0000}, //#msm_sAnalogOffset[3]
573 {0x002A,0x07b6}, //#msm_NonLinearOfsOutput[0]
574 {0x0F12,0x0000}, //#msm_NonLinearOfsOutput[1]
575 {0x0F12,0x0002}, //#msm_NonLinearOfsOutput[2]
576 {0x0F12,0x0004}, //#msm_NonLinearOfsOutput[3]
577 {0x0F12,0x0004}, //#msm_NonLinearOfsOutput[4]
578 {0x0F12,0x0005}, //#msm_NonLinearOfsOutput[5]
581 // param_start TVAR_ash_GASAlpha
607 {0x0F12,0x0100}, //0x00BE
612 // param_end TVAR_ash_GASAlpha
613 // param_start TVAR_ash_GASOutdoorAlpha
618 // param_end TVAR_ash_GASOutdoorAlpha
625 // param_start TVAR_ash_pGAS
627 {0x0F12,0x0164}, //TVAR_ash_pGAS[0] 0128 //018C
628 {0x0F12,0x0122}, //TVAR_ash_pGAS[1] 00F6 //0147
629 {0x0F12,0x00E4}, //TVAR_ash_pGAS[2] 00C7 //010E
630 {0x0F12,0x00B8}, //TVAR_ash_pGAS[3] 00B7 //00E5
631 {0x0F12,0x009D}, //TVAR_ash_pGAS[4] 00AA //00C5
632 {0x0F12,0x008D}, //TVAR_ash_pGAS[5] 009D //00B0
633 {0x0F12,0x0083}, //TVAR_ash_pGAS[6] 0097 //00A7
634 {0x0F12,0x0088}, //TVAR_ash_pGAS[7] 0097 //00AA
635 {0x0F12,0x009C}, //TVAR_ash_pGAS[8] 009E //00B8
636 {0x0F12,0x00BB}, //TVAR_ash_pGAS[9] 00A9 //00D1
637 {0x0F12,0x00E5}, //TVAR_ash_pGAS[10] 00B4 //00F7
638 {0x0F12,0x0121}, //TVAR_ash_pGAS[11] 00CA //0130
639 {0x0F12,0x0169}, //TVAR_ash_pGAS[12] 0105 //016F
640 {0x0F12,0x0138}, //TVAR_ash_pGAS[13] 00DA //0148
641 {0x0F12,0x00FB}, //TVAR_ash_pGAS[14] 00B4 //010A
642 {0x0F12,0x00B9}, //TVAR_ash_pGAS[15] 0099 //00D2
643 {0x0F12,0x008C}, //TVAR_ash_pGAS[16] 0089 //00AB
644 {0x0F12,0x006E}, //TVAR_ash_pGAS[17] 0077 //008F
645 {0x0F12,0x005B}, //TVAR_ash_pGAS[18] 006A //007B
646 {0x0F12,0x0053}, //TVAR_ash_pGAS[19] 0063 //0073
647 {0x0F12,0x0059}, //TVAR_ash_pGAS[20] 0064 //0075
648 {0x0F12,0x006B}, //TVAR_ash_pGAS[21] 006D //0085
649 {0x0F12,0x0086}, //TVAR_ash_pGAS[22] 007B //009D
650 {0x0F12,0x00B1}, //TVAR_ash_pGAS[23] 008B //00C1
651 {0x0F12,0x00E9}, //TVAR_ash_pGAS[24] 009C //00F7
652 {0x0F12,0x012F}, //TVAR_ash_pGAS[25] 00BD //0134
653 {0x0F12,0x0111}, //TVAR_ash_pGAS[26] 00A4 //0111
654 {0x0F12,0x00D1}, //TVAR_ash_pGAS[27] 0093 //00D5
655 {0x0F12,0x0094}, //TVAR_ash_pGAS[28] 0079 //00A1
656 {0x0F12,0x0069}, //TVAR_ash_pGAS[29] 0063 //007B
657 {0x0F12,0x004A}, //TVAR_ash_pGAS[30] 004F //005F
658 {0x0F12,0x0036}, //TVAR_ash_pGAS[31] 0040 //004B
659 {0x0F12,0x002C}, //TVAR_ash_pGAS[32] 0039 //0043
660 {0x0F12,0x0032}, //TVAR_ash_pGAS[33] 003B //0046
661 {0x0F12,0x0042}, //TVAR_ash_pGAS[34] 0044 //0057
662 {0x0F12,0x0060}, //TVAR_ash_pGAS[35] 0054 //0072
663 {0x0F12,0x008A}, //TVAR_ash_pGAS[36] 006A //0093
664 {0x0F12,0x00C0}, //TVAR_ash_pGAS[37] 0081 //00C7
665 {0x0F12,0x0103}, //TVAR_ash_pGAS[38] 009B //00FD
666 {0x0F12,0x00F9}, //TVAR_ash_pGAS[39] 008D //00EA
667 {0x0F12,0x00B7}, //TVAR_ash_pGAS[40] 007E //00B1
668 {0x0F12,0x007E}, //TVAR_ash_pGAS[41] 005F //0080
669 {0x0F12,0x0054}, //TVAR_ash_pGAS[42] 0046 //005A
670 {0x0F12,0x0033}, //TVAR_ash_pGAS[43] 0032 //003D
671 {0x0F12,0x001B}, //TVAR_ash_pGAS[44] 0023 //0029
672 {0x0F12,0x0013}, //TVAR_ash_pGAS[45] 001C //0021
673 {0x0F12,0x0018}, //TVAR_ash_pGAS[46] 001E //0025
674 {0x0F12,0x002A}, //TVAR_ash_pGAS[47] 0026 //0036
675 {0x0F12,0x004A}, //TVAR_ash_pGAS[48] 0038 //0051
676 {0x0F12,0x0075}, //TVAR_ash_pGAS[49] 004F //0074
677 {0x0F12,0x00AC}, //TVAR_ash_pGAS[50] 006A //00A3
678 {0x0F12,0x00F0}, //TVAR_ash_pGAS[51] 0088 //00DA
679 {0x0F12,0x00EF}, //TVAR_ash_pGAS[52] 0081 //00D2
680 {0x0F12,0x00AE}, //TVAR_ash_pGAS[53] 0070 //009B
681 {0x0F12,0x0076}, //TVAR_ash_pGAS[54] 004F //006B
682 {0x0F12,0x004A}, //TVAR_ash_pGAS[55] 0034 //0043
683 {0x0F12,0x0025}, //TVAR_ash_pGAS[56] 001F //0027
684 {0x0F12,0x000D}, //TVAR_ash_pGAS[57] 0010 //0013
685 {0x0F12,0x0004}, //TVAR_ash_pGAS[58] 0009 //000A
686 {0x0F12,0x000A}, //TVAR_ash_pGAS[59] 000B //000F
687 {0x0F12,0x001E}, //TVAR_ash_pGAS[60] 0015 //0021
688 {0x0F12,0x003F}, //TVAR_ash_pGAS[61] 0026 //003D
689 {0x0F12,0x006C}, //TVAR_ash_pGAS[62] 0040 //0060
690 {0x0F12,0x00A7}, //TVAR_ash_pGAS[63] 005D //0091
691 {0x0F12,0x00EA}, //TVAR_ash_pGAS[64] 007E //00C2
692 {0x0F12,0x00F6}, //TVAR_ash_pGAS[65] 007C //00C6
693 {0x0F12,0x00B3}, //TVAR_ash_pGAS[66] 0068 //0094
694 {0x0F12,0x007B}, //TVAR_ash_pGAS[67] 0047 //0063
695 {0x0F12,0x004C}, //TVAR_ash_pGAS[68] 002C //003B
696 {0x0F12,0x0024}, //TVAR_ash_pGAS[69] 0017 //001E
697 {0x0F12,0x000B}, //TVAR_ash_pGAS[70] 0007 //0009
698 {0x0F12,0x0000}, //TVAR_ash_pGAS[71] 0000 //0000
699 {0x0F12,0x0007}, //TVAR_ash_pGAS[72] 0002 //0006
700 {0x0F12,0x001E}, //TVAR_ash_pGAS[73] 000D //0019
701 {0x0F12,0x0041}, //TVAR_ash_pGAS[74] 0020 //0035
702 {0x0F12,0x0071}, //TVAR_ash_pGAS[75] 003A //005A
703 {0x0F12,0x00AD}, //TVAR_ash_pGAS[76] 0059 //0089
704 {0x0F12,0x00F3}, //TVAR_ash_pGAS[77] 007E //00BA
705 {0x0F12,0x010B}, //TVAR_ash_pGAS[78] 007E //00C8
706 {0x0F12,0x00C6}, //TVAR_ash_pGAS[79] 006A //0095
707 {0x0F12,0x0089}, //TVAR_ash_pGAS[80] 0048 //0063
708 {0x0F12,0x0058}, //TVAR_ash_pGAS[81] 002D //003D
709 {0x0F12,0x0032}, //TVAR_ash_pGAS[82] 0018 //0020
710 {0x0F12,0x0017}, //TVAR_ash_pGAS[83] 0008 //000D
711 {0x0F12,0x000D}, //TVAR_ash_pGAS[84] 0001 //0004
712 {0x0F12,0x0015}, //TVAR_ash_pGAS[85] 0003 //0009
713 {0x0F12,0x002D}, //TVAR_ash_pGAS[86] 000E //001C
714 {0x0F12,0x0053}, //TVAR_ash_pGAS[87] 0021 //0038
715 {0x0F12,0x0085}, //TVAR_ash_pGAS[88] 003D //005F
716 {0x0F12,0x00C4}, //TVAR_ash_pGAS[89] 0060 //008E
717 {0x0F12,0x010B}, //TVAR_ash_pGAS[90] 0086 //00BE
718 {0x0F12,0x012F}, //TVAR_ash_pGAS[91] 0087 //00D7
719 {0x0F12,0x00E7}, //TVAR_ash_pGAS[92] 0073 //00A1
720 {0x0F12,0x00A7}, //TVAR_ash_pGAS[93] 0051 //006E
721 {0x0F12,0x0073}, //TVAR_ash_pGAS[94] 0036 //0049
722 {0x0F12,0x004E}, //TVAR_ash_pGAS[95] 0022 //002D
723 {0x0F12,0x0033}, //TVAR_ash_pGAS[96] 0013 //001B
724 {0x0F12,0x002A}, //TVAR_ash_pGAS[97] 000B //0014
725 {0x0F12,0x0032}, //TVAR_ash_pGAS[98] 000D //001A
726 {0x0F12,0x004B}, //TVAR_ash_pGAS[99] 0019 //002C
727 {0x0F12,0x0072}, //TVAR_ash_pGAS[100] 002C //0048
728 {0x0F12,0x00A7}, //TVAR_ash_pGAS[101] 004A //006C
729 {0x0F12,0x00E9}, //TVAR_ash_pGAS[102] 006F //009D
730 {0x0F12,0x0133}, //TVAR_ash_pGAS[103] 0093 //00D1
731 {0x0F12,0x0162}, //TVAR_ash_pGAS[104] 0099 //00F3
732 {0x0F12,0x0110}, //TVAR_ash_pGAS[105] 0086 //00B9
733 {0x0F12,0x00CE}, //TVAR_ash_pGAS[106] 0066 //0086
734 {0x0F12,0x009B}, //TVAR_ash_pGAS[107] 004A //0063
735 {0x0F12,0x0078}, //TVAR_ash_pGAS[108] 0035 //0047
736 {0x0F12,0x0060}, //TVAR_ash_pGAS[109] 0025 //0034
737 {0x0F12,0x0057}, //TVAR_ash_pGAS[110] 001E //002E
738 {0x0F12,0x0061}, //TVAR_ash_pGAS[111] 0021 //0034
739 {0x0F12,0x0079}, //TVAR_ash_pGAS[112] 002C //0046
740 {0x0F12,0x00A2}, //TVAR_ash_pGAS[113] 0041 //0062
741 {0x0F12,0x00D8}, //TVAR_ash_pGAS[114] 0061 //0087
742 {0x0F12,0x011E}, //TVAR_ash_pGAS[115] 0087 //00B8
743 {0x0F12,0x016E}, //TVAR_ash_pGAS[116] 00A8 //00F2
744 {0x0F12,0x01A8}, //TVAR_ash_pGAS[117] 00B8 //011D
745 {0x0F12,0x014D}, //TVAR_ash_pGAS[118] 00A1 //00E5
746 {0x0F12,0x0104}, //TVAR_ash_pGAS[119] 0084 //00B0
747 {0x0F12,0x00D5}, //TVAR_ash_pGAS[120] 0069 //0089
748 {0x0F12,0x00B3}, //TVAR_ash_pGAS[121] 0054 //006F
749 {0x0F12,0x009B}, //TVAR_ash_pGAS[122] 0044 //005D
750 {0x0F12,0x0095}, //TVAR_ash_pGAS[123] 003E //0057
751 {0x0F12,0x009E}, //TVAR_ash_pGAS[124] 0040 //005D
752 {0x0F12,0x00B7}, //TVAR_ash_pGAS[125] 004C //006E
753 {0x0F12,0x00E1}, //TVAR_ash_pGAS[126] 0063 //008B
754 {0x0F12,0x0119}, //TVAR_ash_pGAS[127] 0083 //00B3
755 {0x0F12,0x0166}, //TVAR_ash_pGAS[128] 00A8 //00E6
756 {0x0F12,0x01C6}, //TVAR_ash_pGAS[129] 00C9 //0129
757 {0x0F12,0x01F1}, //TVAR_ash_pGAS[130] 00EE //013E
758 {0x0F12,0x0199}, //TVAR_ash_pGAS[131] 00C4 //010D
759 {0x0F12,0x014D}, //TVAR_ash_pGAS[132] 00AB //00D8
760 {0x0F12,0x011A}, //TVAR_ash_pGAS[133] 0091 //00B2
761 {0x0F12,0x00F5}, //TVAR_ash_pGAS[134] 007B //0096
762 {0x0F12,0x00DD}, //TVAR_ash_pGAS[135] 006D //0084
763 {0x0F12,0x00D8}, //TVAR_ash_pGAS[136] 0066 //007E
764 {0x0F12,0x00E4}, //TVAR_ash_pGAS[137] 0068 //0083
765 {0x0F12,0x00FB}, //TVAR_ash_pGAS[138] 0075 //0096
766 {0x0F12,0x0128}, //TVAR_ash_pGAS[139] 008E //00B3
767 {0x0F12,0x0166}, //TVAR_ash_pGAS[140] 00AF //00DB
768 {0x0F12,0x01BC}, //TVAR_ash_pGAS[141] 00D0 //0117
769 {0x0F12,0x0228}, //TVAR_ash_pGAS[142] 00F7 //0151
770 {0x0F12,0x0133}, //TVAR_ash_pGAS[143] 00E3 //014A
771 {0x0F12,0x00F7}, //TVAR_ash_pGAS[144] 00AB //0108
772 {0x0F12,0x00BF}, //TVAR_ash_pGAS[145] 0086 //00D7
773 {0x0F12,0x0097}, //TVAR_ash_pGAS[146] 0081 //00B5
774 {0x0F12,0x0081}, //TVAR_ash_pGAS[147] 0078 //009E
775 {0x0F12,0x0074}, //TVAR_ash_pGAS[148] 0071 //0090
776 {0x0F12,0x006A}, //TVAR_ash_pGAS[149] 006B //0089
777 {0x0F12,0x006B}, //TVAR_ash_pGAS[150] 0069 //0089
778 {0x0F12,0x007B}, //TVAR_ash_pGAS[151] 006A //0090
779 {0x0F12,0x008F}, //TVAR_ash_pGAS[152] 006E //00A0
780 {0x0F12,0x00B1}, //TVAR_ash_pGAS[153] 0071 //00B8
781 {0x0F12,0x00E4}, //TVAR_ash_pGAS[154] 007D //00E6
782 {0x0F12,0x0128}, //TVAR_ash_pGAS[155] 00B0 //011F
783 {0x0F12,0x010B}, //TVAR_ash_pGAS[156] 0096 //010B
784 {0x0F12,0x00D4}, //TVAR_ash_pGAS[157] 0071 //00CE
785 {0x0F12,0x0098}, //TVAR_ash_pGAS[158] 0061 //00A4
786 {0x0F12,0x006F}, //TVAR_ash_pGAS[159] 005B //0085
787 {0x0F12,0x0056}, //TVAR_ash_pGAS[160] 0051 //0073
788 {0x0F12,0x0045}, //TVAR_ash_pGAS[161] 0049 //0064
789 {0x0F12,0x003D}, //TVAR_ash_pGAS[162] 0043 //005D
790 {0x0F12,0x0040}, //TVAR_ash_pGAS[163] 0042 //005E
791 {0x0F12,0x004D}, //TVAR_ash_pGAS[164] 0044 //0066
792 {0x0F12,0x0060}, //TVAR_ash_pGAS[165] 004C //0076
793 {0x0F12,0x0081}, //TVAR_ash_pGAS[166] 0051 //008F
794 {0x0F12,0x00B0}, //TVAR_ash_pGAS[167] 0056 //00B7
795 {0x0F12,0x00EB}, //TVAR_ash_pGAS[168] 006F //00EB
796 {0x0F12,0x00EC}, //TVAR_ash_pGAS[169] 006B //00D7
797 {0x0F12,0x00B0}, //TVAR_ash_pGAS[170] 005B //00A3
798 {0x0F12,0x007C}, //TVAR_ash_pGAS[171] 004E //007C
799 {0x0F12,0x0054}, //TVAR_ash_pGAS[172] 0043 //0061
800 {0x0F12,0x0039}, //TVAR_ash_pGAS[173] 0037 //004C
801 {0x0F12,0x0029}, //TVAR_ash_pGAS[174] 002E //003F
802 {0x0F12,0x001E}, //TVAR_ash_pGAS[175] 0029 //0038
803 {0x0F12,0x0021}, //TVAR_ash_pGAS[176] 0028 //003A
804 {0x0F12,0x002D}, //TVAR_ash_pGAS[177] 002B //0044
805 {0x0F12,0x0044}, //TVAR_ash_pGAS[178] 0033 //0056
806 {0x0F12,0x0064}, //TVAR_ash_pGAS[179] 003D //006D
807 {0x0F12,0x008F}, //TVAR_ash_pGAS[180] 0046 //0091
808 {0x0F12,0x00C8}, //TVAR_ash_pGAS[181] 0056 //00BD
809 {0x0F12,0x00D6}, //TVAR_ash_pGAS[182] 0058 //00B7
810 {0x0F12,0x009B}, //TVAR_ash_pGAS[183] 004C //0086
811 {0x0F12,0x0068}, //TVAR_ash_pGAS[184] 003B //0062
812 {0x0F12,0x0043}, //TVAR_ash_pGAS[185] 002E //0046
813 {0x0F12,0x0026}, //TVAR_ash_pGAS[186] 0022 //0031
814 {0x0F12,0x0013}, //TVAR_ash_pGAS[187] 0019 //0022
815 {0x0F12,0x000B}, //TVAR_ash_pGAS[188] 0014 //001C
816 {0x0F12,0x000E}, //TVAR_ash_pGAS[189] 0014 //001E
817 {0x0F12,0x001C}, //TVAR_ash_pGAS[190] 0017 //0029
818 {0x0F12,0x0033}, //TVAR_ash_pGAS[191] 0020 //003B
819 {0x0F12,0x0054}, //TVAR_ash_pGAS[192] 002C //0055
820 {0x0F12,0x0080}, //TVAR_ash_pGAS[193] 0039 //0076
821 {0x0F12,0x00B9}, //TVAR_ash_pGAS[194] 004A //00A0
822 {0x0F12,0x00D1}, //TVAR_ash_pGAS[195] 004F //00A1
823 {0x0F12,0x0094}, //TVAR_ash_pGAS[196] 0043 //0074
824 {0x0F12,0x0061}, //TVAR_ash_pGAS[197] 002F //0050
825 {0x0F12,0x003B}, //TVAR_ash_pGAS[198] 0022 //0033
826 {0x0F12,0x001C}, //TVAR_ash_pGAS[199] 0015 //001E
827 {0x0F12,0x0008}, //TVAR_ash_pGAS[200] 000C //000F
828 {0x0F12,0x0001}, //TVAR_ash_pGAS[201] 0007 //0009
829 {0x0F12,0x0004}, //TVAR_ash_pGAS[202] 0007 //000B
830 {0x0F12,0x0012}, //TVAR_ash_pGAS[203] 000B //0017
831 {0x0F12,0x002B}, //TVAR_ash_pGAS[204] 0016 //002A
832 {0x0F12,0x0050}, //TVAR_ash_pGAS[205] 0023 //0044
833 {0x0F12,0x007E}, //TVAR_ash_pGAS[206] 0032 //0066
834 {0x0F12,0x00B6}, //TVAR_ash_pGAS[207] 0046 //008C
835 {0x0F12,0x00D6}, //TVAR_ash_pGAS[208] 004C //0098
836 {0x0F12,0x0098}, //TVAR_ash_pGAS[209] 003E //006D
837 {0x0F12,0x0067}, //TVAR_ash_pGAS[210] 002a //0049
838 {0x0F12,0x003D}, //TVAR_ash_pGAS[211] 001C //002B
839 {0x0F12,0x001D}, //TVAR_ash_pGAS[212] 000F //0016
840 {0x0F12,0x0009}, //TVAR_ash_pGAS[213] 0006 //0006
841 {0x0F12,0x0000}, //TVAR_ash_pGAS[214] 0001 //0000
842 {0x0F12,0x0004}, //TVAR_ash_pGAS[215] 0002 //0004
843 {0x0F12,0x0014}, //TVAR_ash_pGAS[216] 0007 //0010
844 {0x0F12,0x002F}, //TVAR_ash_pGAS[217] 0013 //0023
845 {0x0F12,0x0057}, //TVAR_ash_pGAS[218] 0021 //003E
846 {0x0F12,0x0085}, //TVAR_ash_pGAS[219] 0032 //0060
847 {0x0F12,0x00C1}, //TVAR_ash_pGAS[220] 0048 //0085
848 {0x0F12,0x00EA}, //TVAR_ash_pGAS[221] 004D //0098
849 {0x0F12,0x00AA}, //TVAR_ash_pGAS[222] 0040 //006E
850 {0x0F12,0x0076}, //TVAR_ash_pGAS[223] 002C //0048
851 {0x0F12,0x004B}, //TVAR_ash_pGAS[224] 001E //002C
852 {0x0F12,0x002A}, //TVAR_ash_pGAS[225] 0011 //0018
853 {0x0F12,0x0015}, //TVAR_ash_pGAS[226] 0008 //0009
854 {0x0F12,0x000C}, //TVAR_ash_pGAS[227] 0004 //0003
855 {0x0F12,0x0012}, //TVAR_ash_pGAS[228] 0004 //0006
856 {0x0F12,0x0024}, //TVAR_ash_pGAS[229] 000A //0012
857 {0x0F12,0x0041}, //TVAR_ash_pGAS[230] 0017 //0026
858 {0x0F12,0x006A}, //TVAR_ash_pGAS[231] 0026 //0042
859 {0x0F12,0x009C}, //TVAR_ash_pGAS[232] 0039 //0063
860 {0x0F12,0x00D9}, //TVAR_ash_pGAS[233] 0051 //0089
861 {0x0F12,0x010A}, //TVAR_ash_pGAS[234] 0054 //00A3
862 {0x0F12,0x00C9}, //TVAR_ash_pGAS[235] 0048 //0076
863 {0x0F12,0x0092}, //TVAR_ash_pGAS[236] 0034 //0051
864 {0x0F12,0x0065}, //TVAR_ash_pGAS[237] 0026 //0035
865 {0x0F12,0x0045}, //TVAR_ash_pGAS[238] 001A //0021
866 {0x0F12,0x002E}, //TVAR_ash_pGAS[239] 0012 //0013
867 {0x0F12,0x0027}, //TVAR_ash_pGAS[240] 000D //000E
868 {0x0F12,0x002E}, //TVAR_ash_pGAS[241] 000E //0012
869 {0x0F12,0x0041}, //TVAR_ash_pGAS[242] 0014 //001E
870 {0x0F12,0x005F}, //TVAR_ash_pGAS[243] 0021 //0032
871 {0x0F12,0x008A}, //TVAR_ash_pGAS[244] 0033 //004D
872 {0x0F12,0x00BF}, //TVAR_ash_pGAS[245] 0048 //006F
873 {0x0F12,0x00FE}, //TVAR_ash_pGAS[246] 005C //0097
874 {0x0F12,0x0137}, //TVAR_ash_pGAS[247] 0063 //00B7
875 {0x0F12,0x00EF}, //TVAR_ash_pGAS[248] 0057 //0089
876 {0x0F12,0x00B4}, //TVAR_ash_pGAS[249] 0045 //0062
877 {0x0F12,0x0089}, //TVAR_ash_pGAS[250] 0036 //0048
878 {0x0F12,0x006C}, //TVAR_ash_pGAS[251] 002B //0034
879 {0x0F12,0x0058}, //TVAR_ash_pGAS[252] 0022 //0028
880 {0x0F12,0x0051}, //TVAR_ash_pGAS[253] 001E //0023
881 {0x0F12,0x0059}, //TVAR_ash_pGAS[254] 001F //0027
882 {0x0F12,0x006B}, //TVAR_ash_pGAS[255] 0026 //0033
883 {0x0F12,0x008B}, //TVAR_ash_pGAS[256] 0034 //0047
884 {0x0F12,0x00B7}, //TVAR_ash_pGAS[257] 0047 //0061
885 {0x0F12,0x00EE}, //TVAR_ash_pGAS[258] 005D //0085
886 {0x0F12,0x0135}, //TVAR_ash_pGAS[259] 0070 //00B1
887 {0x0F12,0x0175}, //TVAR_ash_pGAS[260] 007C //00DE
888 {0x0F12,0x0123}, //TVAR_ash_pGAS[261] 006B //00AA
889 {0x0F12,0x00E3}, //TVAR_ash_pGAS[262] 005C //0082
890 {0x0F12,0x00BB}, //TVAR_ash_pGAS[263] 004E //0067
891 {0x0F12,0x00A0}, //TVAR_ash_pGAS[264] 0043 //0055
892 {0x0F12,0x008E}, //TVAR_ash_pGAS[265] 003B //0049
893 {0x0F12,0x008A}, //TVAR_ash_pGAS[266] 0037 //0044
894 {0x0F12,0x0091}, //TVAR_ash_pGAS[267] 0039 //0048
895 {0x0F12,0x00A5}, //TVAR_ash_pGAS[268] 0040 //0054
896 {0x0F12,0x00C4}, //TVAR_ash_pGAS[269] 0050 //0066
897 {0x0F12,0x00F1}, //TVAR_ash_pGAS[270] 0064 //0083
898 {0x0F12,0x012F}, //TVAR_ash_pGAS[271] 007A //00A8
899 {0x0F12,0x0183}, //TVAR_ash_pGAS[272] 008D //00E0
900 {0x0F12,0x01B5}, //TVAR_ash_pGAS[273] 00AD //00FE
901 {0x0F12,0x0163}, //TVAR_ash_pGAS[274] 0088 //00CC
902 {0x0F12,0x0124}, //TVAR_ash_pGAS[275] 007B //00A2
903 {0x0F12,0x00F8}, //TVAR_ash_pGAS[276] 006D //0085
904 {0x0F12,0x00DA}, //TVAR_ash_pGAS[277] 0062 //0072
905 {0x0F12,0x00C9}, //TVAR_ash_pGAS[278] 005B //0066
906 {0x0F12,0x00C4}, //TVAR_ash_pGAS[279] 0057 //0062
907 {0x0F12,0x00CE}, //TVAR_ash_pGAS[280] 005A //0065
908 {0x0F12,0x00E1}, //TVAR_ash_pGAS[281] 0061 //0072
909 {0x0F12,0x0103}, //TVAR_ash_pGAS[282] 0073 //0085
910 {0x0F12,0x0136}, //TVAR_ash_pGAS[283] 0088 //00A2
911 {0x0F12,0x017F}, //TVAR_ash_pGAS[284] 009E //00D0
912 {0x0F12,0x01E0}, //TVAR_ash_pGAS[285] 00BB //0103
913 {0x0F12,0x0148}, //TVAR_ash_pGAS[286] 00F3 //0153
914 {0x0F12,0x0108}, //TVAR_ash_pGAS[287] 00B8 //010D
915 {0x0F12,0x00C8}, //TVAR_ash_pGAS[288] 008D //00D8
916 {0x0F12,0x009F}, //TVAR_ash_pGAS[289] 0082 //00B3
917 {0x0F12,0x0082}, //TVAR_ash_pGAS[290] 0077 //009A
918 {0x0F12,0x0073}, //TVAR_ash_pGAS[291] 006E //008A
919 {0x0F12,0x0068}, //TVAR_ash_pGAS[292] 0069 //0083
920 {0x0F12,0x006C}, //TVAR_ash_pGAS[293] 006A //0087
921 {0x0F12,0x007E}, //TVAR_ash_pGAS[294] 0071 //0095
922 {0x0F12,0x009B}, //TVAR_ash_pGAS[295] 007B //00AC
923 {0x0F12,0x00C2}, //TVAR_ash_pGAS[296] 0086 //00CF
924 {0x0F12,0x0100}, //TVAR_ash_pGAS[297] 0098 //0106
925 {0x0F12,0x014D}, //TVAR_ash_pGAS[298] 00D3 //0149
926 {0x0F12,0x0121}, //TVAR_ash_pGAS[299] 00A4 //0116
927 {0x0F12,0x00E6}, //TVAR_ash_pGAS[300] 007E //00D6
928 {0x0F12,0x00A4}, //TVAR_ash_pGAS[301] 006A //00A8
929 {0x0F12,0x0078}, //TVAR_ash_pGAS[302] 0060 //0087
930 {0x0F12,0x005A}, //TVAR_ash_pGAS[303] 0053 //0071
931 {0x0F12,0x0046}, //TVAR_ash_pGAS[304] 0048 //0061
932 {0x0F12,0x003E}, //TVAR_ash_pGAS[305] 0044 //005B
933 {0x0F12,0x0043}, //TVAR_ash_pGAS[306] 0045 //005E
934 {0x0F12,0x0052}, //TVAR_ash_pGAS[307] 004C //006D
935 {0x0F12,0x006B}, //TVAR_ash_pGAS[308] 0059 //0083
936 {0x0F12,0x0093}, //TVAR_ash_pGAS[309] 0066 //00A4
937 {0x0F12,0x00C9}, //TVAR_ash_pGAS[310] 006F //00D5
938 {0x0F12,0x010D}, //TVAR_ash_pGAS[311] 008C //0113
939 {0x0F12,0x0103}, //TVAR_ash_pGAS[312] 007A //00E6
940 {0x0F12,0x00C3}, //TVAR_ash_pGAS[313] 0069 //00AE
941 {0x0F12,0x0089}, //TVAR_ash_pGAS[314] 0058 //0084
942 {0x0F12,0x005E}, //TVAR_ash_pGAS[315] 004A //0065
943 {0x0F12,0x003E}, //TVAR_ash_pGAS[316] 003A //004D
944 {0x0F12,0x002A}, //TVAR_ash_pGAS[317] 002F //003D
945 {0x0F12,0x001F}, //TVAR_ash_pGAS[318] 0029 //0037
946 {0x0F12,0x0023}, //TVAR_ash_pGAS[319] 002a //003B
947 {0x0F12,0x0032}, //TVAR_ash_pGAS[320] 0031 //004B
948 {0x0F12,0x004E}, //TVAR_ash_pGAS[321] 003F //0063
949 {0x0F12,0x0074}, //TVAR_ash_pGAS[322] 004F //0080
950 {0x0F12,0x00A5}, //TVAR_ash_pGAS[323] 005C //00AB
951 {0x0F12,0x00E6}, //TVAR_ash_pGAS[324] 006F //00DF
952 {0x0F12,0x00EF}, //TVAR_ash_pGAS[325] 0068 //00C5
953 {0x0F12,0x00AD}, //TVAR_ash_pGAS[326] 005C //0092
954 {0x0F12,0x0076}, //TVAR_ash_pGAS[327] 0047 //006B
955 {0x0F12,0x004D}, //TVAR_ash_pGAS[328] 0037 //004B
956 {0x0F12,0x002C}, //TVAR_ash_pGAS[329] 0027 //0034
957 {0x0F12,0x0015}, //TVAR_ash_pGAS[330] 001B //0023
958 {0x0F12,0x000C}, //TVAR_ash_pGAS[331] 0015 //001C
959 {0x0F12,0x0010}, //TVAR_ash_pGAS[332] 0016 //0020
960 {0x0F12,0x001F}, //TVAR_ash_pGAS[333] 001C //002E
961 {0x0F12,0x003B}, //TVAR_ash_pGAS[334] 0029 //0047
962 {0x0F12,0x0061}, //TVAR_ash_pGAS[335] 003A //0066
963 {0x0F12,0x0092}, //TVAR_ash_pGAS[336] 004B //008C
964 {0x0F12,0x00D2}, //TVAR_ash_pGAS[337] 005E //00BB
965 {0x0F12,0x00E8}, //TVAR_ash_pGAS[338] 0060 //00B0
966 {0x0F12,0x00A8}, //TVAR_ash_pGAS[339] 0053 //0081
967 {0x0F12,0x0071}, //TVAR_ash_pGAS[340] 003B //005A
968 {0x0F12,0x0046}, //TVAR_ash_pGAS[341] 002a //0039
969 {0x0F12,0x0023}, //TVAR_ash_pGAS[342] 001A //0021
970 {0x0F12,0x000B}, //TVAR_ash_pGAS[343] 000D //0010
971 {0x0F12,0x0002}, //TVAR_ash_pGAS[344] 0007 //0009
972 {0x0F12,0x0005}, //TVAR_ash_pGAS[345] 0007 //000C
973 {0x0F12,0x0014}, //TVAR_ash_pGAS[346] 000D //001B
974 {0x0F12,0x0030}, //TVAR_ash_pGAS[347] 001A //0033
975 {0x0F12,0x0058}, //TVAR_ash_pGAS[348] 002B //0050
976 {0x0F12,0x008A}, //TVAR_ash_pGAS[349] 003D //0078
977 {0x0F12,0x00C8}, //TVAR_ash_pGAS[350] 0053 //00A1
978 {0x0F12,0x00EF}, //TVAR_ash_pGAS[351] 005C //00A8
979 {0x0F12,0x00AD}, //TVAR_ash_pGAS[352] 004E //007B
980 {0x0F12,0x0077}, //TVAR_ash_pGAS[353] 0036 //0054
981 {0x0F12,0x0048}, //TVAR_ash_pGAS[354] 0023 //0032
982 {0x0F12,0x0023}, //TVAR_ash_pGAS[355] 0014 //0019
983 {0x0F12,0x000B}, //TVAR_ash_pGAS[356] 0007 //0008
984 {0x0F12,0x0000}, //TVAR_ash_pGAS[357] 0000 //0000
985 {0x0F12,0x0003}, //TVAR_ash_pGAS[358] 0000 //0004
986 {0x0F12,0x0013}, //TVAR_ash_pGAS[359] 0006 //0012
987 {0x0F12,0x0030}, //TVAR_ash_pGAS[360] 0012 //0028
988 {0x0F12,0x0059}, //TVAR_ash_pGAS[361] 0023 //0046
989 {0x0F12,0x008A}, //TVAR_ash_pGAS[362] 0034 //006B
990 {0x0F12,0x00CA}, //TVAR_ash_pGAS[363] 004C //0093
991 {0x0F12,0x0104}, //TVAR_ash_pGAS[364] 005E //00A9
992 {0x0F12,0x00C0}, //TVAR_ash_pGAS[365] 004F //007C
993 {0x0F12,0x0087}, //TVAR_ash_pGAS[366] 0037 //0054
994 {0x0F12,0x0057}, //TVAR_ash_pGAS[367] 0024 //0034
995 {0x0F12,0x0031}, //TVAR_ash_pGAS[368] 0015 //001B
996 {0x0F12,0x0018}, //TVAR_ash_pGAS[369] 0008 //000A
997 {0x0F12,0x000C}, //TVAR_ash_pGAS[370] 0001 //0002
998 {0x0F12,0x0010}, //TVAR_ash_pGAS[371] 0000 //0004
999 {0x0F12,0x0020}, //TVAR_ash_pGAS[372] 0005 //0012
1000 {0x0F12,0x003D}, //TVAR_ash_pGAS[373] 0010 //0027
1001 {0x0F12,0x0067}, //TVAR_ash_pGAS[374] 0021 //0045
1002 {0x0F12,0x009A}, //TVAR_ash_pGAS[375] 0033 //0069
1003 {0x0F12,0x00D9}, //TVAR_ash_pGAS[376] 004A //0090
1004 {0x0F12,0x0126}, //TVAR_ash_pGAS[377] 0064 //00B4
1005 {0x0F12,0x00E1}, //TVAR_ash_pGAS[378] 0056 //0086
1006 {0x0F12,0x00A3}, //TVAR_ash_pGAS[379] 003F //005C
1007 {0x0F12,0x0071}, //TVAR_ash_pGAS[380] 002C //003C
1008 {0x0F12,0x004C}, //TVAR_ash_pGAS[381] 001D //0024
1009 {0x0F12,0x0031}, //TVAR_ash_pGAS[382] 0011 //0014
1010 {0x0F12,0x0025}, //TVAR_ash_pGAS[383] 0008 //000D
1011 {0x0F12,0x0029}, //TVAR_ash_pGAS[384] 0006 //000F
1012 {0x0F12,0x003A}, //TVAR_ash_pGAS[385] 000B //001B
1013 {0x0F12,0x0057}, //TVAR_ash_pGAS[386] 0015 //002F
1014 {0x0F12,0x0081}, //TVAR_ash_pGAS[387] 0025 //004B
1015 {0x0F12,0x00B4}, //TVAR_ash_pGAS[388] 0038 //006E
1016 {0x0F12,0x00F4}, //TVAR_ash_pGAS[389] 004B //0097
1017 {0x0F12,0x0154}, //TVAR_ash_pGAS[390] 0072 //00CA
1018 {0x0F12,0x0107}, //TVAR_ash_pGAS[391] 0064 //0098
1019 {0x0F12,0x00C6}, //TVAR_ash_pGAS[392] 004E //006E
1020 {0x0F12,0x0095}, //TVAR_ash_pGAS[393] 003B //0050
1021 {0x0F12,0x0074}, //TVAR_ash_pGAS[394] 002C //0037
1022 {0x0F12,0x005A}, //TVAR_ash_pGAS[395] 001F //0027
1023 {0x0F12,0x004F}, //TVAR_ash_pGAS[396] 0018 //0020
1024 {0x0F12,0x0053}, //TVAR_ash_pGAS[397] 0015 //0022
1025 {0x0F12,0x0062}, //TVAR_ash_pGAS[398] 0018 //002D
1026 {0x0F12,0x007F}, //TVAR_ash_pGAS[399] 0022 //0042
1027 {0x0F12,0x00A8}, //TVAR_ash_pGAS[400] 0032 //005B
1028 {0x0F12,0x00DC}, //TVAR_ash_pGAS[401] 0044 //0080
1029 {0x0F12,0x0120}, //TVAR_ash_pGAS[402] 0054 //00AA
1030 {0x0F12,0x0193}, //TVAR_ash_pGAS[403] 0089 //00F0
1031 {0x0F12,0x013B}, //TVAR_ash_pGAS[404] 0077 //00BA
1032 {0x0F12,0x00F6}, //TVAR_ash_pGAS[405] 0065 //008E
1033 {0x0F12,0x00C9}, //TVAR_ash_pGAS[406] 0052 //006F
1034 {0x0F12,0x00A8}, //TVAR_ash_pGAS[407] 0043 //0058
1035 {0x0F12,0x0090}, //TVAR_ash_pGAS[408] 0037 //0048
1036 {0x0F12,0x0086}, //TVAR_ash_pGAS[409] 002F //0041
1037 {0x0F12,0x008A}, //TVAR_ash_pGAS[410] 002C //0042
1038 {0x0F12,0x0099}, //TVAR_ash_pGAS[411] 002F //004C
1039 {0x0F12,0x00B5}, //TVAR_ash_pGAS[412] 0038 //005F
1040 {0x0F12,0x00DD}, //TVAR_ash_pGAS[413] 0048 //007A
1041 {0x0F12,0x0117}, //TVAR_ash_pGAS[414] 0058 //009D
1042 {0x0F12,0x0166}, //TVAR_ash_pGAS[415] 0068 //00D2
1043 {0x0F12,0x01D6}, //TVAR_ash_pGAS[416] 00BC //0112
1044 {0x0F12,0x017D}, //TVAR_ash_pGAS[417] 0092 //00DD
1045 {0x0F12,0x0138}, //TVAR_ash_pGAS[418] 0082 //00AF
1046 {0x0F12,0x0108}, //TVAR_ash_pGAS[419] 006F //008F
1047 {0x0F12,0x00E3}, //TVAR_ash_pGAS[420] 0061 //0077
1048 {0x0F12,0x00CD}, //TVAR_ash_pGAS[421] 0055 //0066
1049 {0x0F12,0x00C2}, //TVAR_ash_pGAS[422] 004E //005F
1050 {0x0F12,0x00C7}, //TVAR_ash_pGAS[423] 004A //005F
1051 {0x0F12,0x00D4}, //TVAR_ash_pGAS[424] 004C //006A
1052 {0x0F12,0x00F1}, //TVAR_ash_pGAS[425] 0056 //007C
1053 {0x0F12,0x011F}, //TVAR_ash_pGAS[426] 0066 //0097
1054 {0x0F12,0x015F}, //TVAR_ash_pGAS[427] 0073 //00C2
1055 {0x0F12,0x01B7}, //TVAR_ash_pGAS[428] 008B //00F2
1056 {0x0F12,0x00D1}, //TVAR_ash_pGAS[429] 0087 //00EE
1057 {0x0F12,0x00A9}, //TVAR_ash_pGAS[430] 0069 //00C2
1058 {0x0F12,0x0080}, //TVAR_ash_pGAS[431] 0053 //009B
1059 {0x0F12,0x0064}, //TVAR_ash_pGAS[432] 0052 //0085
1060 {0x0F12,0x0055}, //TVAR_ash_pGAS[433] 0050 //0074
1061 {0x0F12,0x004E}, //TVAR_ash_pGAS[434] 0050 //006A
1062 {0x0F12,0x0047}, //TVAR_ash_pGAS[435] 004F //0067
1063 {0x0F12,0x004B}, //TVAR_ash_pGAS[436] 0052 //006B
1064 {0x0F12,0x005E}, //TVAR_ash_pGAS[437] 0057 //0076
1065 {0x0F12,0x0077}, //TVAR_ash_pGAS[438] 005D //0089
1066 {0x0F12,0x0094}, //TVAR_ash_pGAS[439] 0060 //00A3
1067 {0x0F12,0x00BF}, //TVAR_ash_pGAS[440] 0068 //00CE
1068 {0x0F12,0x00F1}, //TVAR_ash_pGAS[441] 0090 //0102
1069 {0x0F12,0x00BB}, //TVAR_ash_pGAS[442] 0050 //00C2
1070 {0x0F12,0x0095}, //TVAR_ash_pGAS[443] 003F //0097
1071 {0x0F12,0x0067}, //TVAR_ash_pGAS[444] 003A //0076
1072 {0x0F12,0x0049}, //TVAR_ash_pGAS[445] 003A //0062
1073 {0x0F12,0x0036}, //TVAR_ash_pGAS[446] 0035 //0054
1074 {0x0F12,0x002C}, //TVAR_ash_pGAS[447] 0033 //004B
1075 {0x0F12,0x0027}, //TVAR_ash_pGAS[448] 0033 //0047
1076 {0x0F12,0x002E}, //TVAR_ash_pGAS[449] 0036 //004C
1077 {0x0F12,0x003C}, //TVAR_ash_pGAS[450] 003B //0057
1078 {0x0F12,0x004F}, //TVAR_ash_pGAS[451] 0043 //006A
1079 {0x0F12,0x006F}, //TVAR_ash_pGAS[452] 0048 //0084
1080 {0x0F12,0x0097}, //TVAR_ash_pGAS[453] 004A //00AE
1081 {0x0F12,0x00C7}, //TVAR_ash_pGAS[454] 005D //00DF
1082 {0x0F12,0x00A5}, //TVAR_ash_pGAS[455] 002D //009A
1083 {0x0F12,0x0079}, //TVAR_ash_pGAS[456] 002D //0075
1084 {0x0F12,0x0052}, //TVAR_ash_pGAS[457] 002B //0058
1085 {0x0F12,0x0036}, //TVAR_ash_pGAS[458] 0029 //0045
1086 {0x0F12,0x0023}, //TVAR_ash_pGAS[459] 0023 //0039
1087 {0x0F12,0x0017}, //TVAR_ash_pGAS[460] 0020 //002F
1088 {0x0F12,0x0012}, //TVAR_ash_pGAS[461] 001F //002C
1089 {0x0F12,0x0017}, //TVAR_ash_pGAS[462] 0023 //0030
1090 {0x0F12,0x0024}, //TVAR_ash_pGAS[463] 0027 //003D
1091 {0x0F12,0x0039}, //TVAR_ash_pGAS[464] 002F //0050
1092 {0x0F12,0x0055}, //TVAR_ash_pGAS[465] 0036 //0067
1093 {0x0F12,0x007A}, //TVAR_ash_pGAS[466] 003A //008B
1094 {0x0F12,0x00A8}, //TVAR_ash_pGAS[467] 0043 //00B4
1095 {0x0F12,0x0097}, //TVAR_ash_pGAS[468] 001F //0080
1096 {0x0F12,0x0069}, //TVAR_ash_pGAS[469] 0023 //005E
1097 {0x0F12,0x0045}, //TVAR_ash_pGAS[470] 001D //0044
1098 {0x0F12,0x002B}, //TVAR_ash_pGAS[471] 001A //0032
1099 {0x0F12,0x0018}, //TVAR_ash_pGAS[472] 0015 //0024
1100 {0x0F12,0x000B}, //TVAR_ash_pGAS[473] 0012 //001A
1101 {0x0F12,0x0006}, //TVAR_ash_pGAS[474] 0010 //0017
1102 {0x0F12,0x000A}, //TVAR_ash_pGAS[475] 0013 //001B
1103 {0x0F12,0x0017}, //TVAR_ash_pGAS[476] 0017 //0027
1104 {0x0F12,0x002B}, //TVAR_ash_pGAS[477] 001E //0039
1105 {0x0F12,0x0047}, //TVAR_ash_pGAS[478] 0025 //004F
1106 {0x0F12,0x006B}, //TVAR_ash_pGAS[479] 002B //006E
1107 {0x0F12,0x0097}, //TVAR_ash_pGAS[480] 0034 //0092
1108 {0x0F12,0x0092}, //TVAR_ash_pGAS[481] 0017 //006E
1109 {0x0F12,0x0065}, //TVAR_ash_pGAS[482] 001B //004F
1110 {0x0F12,0x0042}, //TVAR_ash_pGAS[483] 0015 //0037
1111 {0x0F12,0x0028}, //TVAR_ash_pGAS[484] 0011 //0023
1112 {0x0F12,0x0013}, //TVAR_ash_pGAS[485] 000B //0016
1113 {0x0F12,0x0005}, //TVAR_ash_pGAS[486] 0008 //000C
1114 {0x0F12,0x0000}, //TVAR_ash_pGAS[487] 0006 //0008
1115 {0x0F12,0x0004}, //TVAR_ash_pGAS[488] 0008 //000C
1116 {0x0F12,0x000F}, //TVAR_ash_pGAS[489] 000B //0017
1117 {0x0F12,0x0025}, //TVAR_ash_pGAS[490] 0012 //0028
1118 {0x0F12,0x0040}, //TVAR_ash_pGAS[491] 0018 //003D
1119 {0x0F12,0x0064}, //TVAR_ash_pGAS[492] 001E //005B
1120 {0x0F12,0x008F}, //TVAR_ash_pGAS[493] 0028 //007A
1121 {0x0F12,0x0098}, //TVAR_ash_pGAS[494] 0014 //0068
1122 {0x0F12,0x006A}, //TVAR_ash_pGAS[495] 0016 //004A
1123 {0x0F12,0x004A}, //TVAR_ash_pGAS[496] 0011 //0032
1124 {0x0F12,0x002E}, //TVAR_ash_pGAS[497] 000C //001D
1125 {0x0F12,0x0016}, //TVAR_ash_pGAS[498] 0007 //0011
1126 {0x0F12,0x0007}, //TVAR_ash_pGAS[499] 0002 //0005
1127 {0x0F12,0x0000}, //TVAR_ash_pGAS[500] 0000 //0000
1128 {0x0F12,0x0004}, //TVAR_ash_pGAS[501] 0001 //0005
1129 {0x0F12,0x0011}, //TVAR_ash_pGAS[502] 0005 //000F
1130 {0x0F12,0x0026}, //TVAR_ash_pGAS[503] 000A //001E
1131 {0x0F12,0x0042}, //TVAR_ash_pGAS[504] 000F //0033
1132 {0x0F12,0x0064}, //TVAR_ash_pGAS[505] 0014 //004E
1133 {0x0F12,0x008F}, //TVAR_ash_pGAS[506] 001E //006C
1134 {0x0F12,0x00A9}, //TVAR_ash_pGAS[507] 0015 //006C
1135 {0x0F12,0x007B}, //TVAR_ash_pGAS[508] 0016 //004C
1136 {0x0F12,0x0057}, //TVAR_ash_pGAS[509] 0011 //0033
1137 {0x0F12,0x0039}, //TVAR_ash_pGAS[510] 000D //0020
1138 {0x0F12,0x0021}, //TVAR_ash_pGAS[511] 0007 //0013
1139 {0x0F12,0x0012}, //TVAR_ash_pGAS[512] 0003 //0008
1140 {0x0F12,0x000C}, //TVAR_ash_pGAS[513] 0000 //0003
1141 {0x0F12,0x0010}, //TVAR_ash_pGAS[514] 0000 //0006
1142 {0x0F12,0x001D}, //TVAR_ash_pGAS[515] 0002 //000E
1143 {0x0F12,0x0031}, //TVAR_ash_pGAS[516] 0007 //001C
1144 {0x0F12,0x004E}, //TVAR_ash_pGAS[517] 000C //0032
1145 {0x0F12,0x0071}, //TVAR_ash_pGAS[518] 0010 //004B
1146 {0x0F12,0x009C}, //TVAR_ash_pGAS[519] 0019 //0067
1147 {0x0F12,0x00C6}, //TVAR_ash_pGAS[520] 0019 //0076
1148 {0x0F12,0x0097}, //TVAR_ash_pGAS[521] 001C //0055
1149 {0x0F12,0x006E}, //TVAR_ash_pGAS[522] 0016 //003A
1150 {0x0F12,0x004E}, //TVAR_ash_pGAS[523] 0012 //0028
1151 {0x0F12,0x0038}, //TVAR_ash_pGAS[524] 000D //001A
1152 {0x0F12,0x0028}, //TVAR_ash_pGAS[525] 0009 //0010
1153 {0x0F12,0x0022}, //TVAR_ash_pGAS[526] 0005 //000C
1154 {0x0F12,0x0027}, //TVAR_ash_pGAS[527] 0003 //000E
1155 {0x0F12,0x0034}, //TVAR_ash_pGAS[528] 0005 //0016
1156 {0x0F12,0x0047}, //TVAR_ash_pGAS[529] 0009 //0022
1157 {0x0F12,0x0064}, //TVAR_ash_pGAS[530] 000D //0035
1158 {0x0F12,0x0088}, //TVAR_ash_pGAS[531] 0011 //004F
1159 {0x0F12,0x00B3}, //TVAR_ash_pGAS[532] 0017 //006C
1160 {0x0F12,0x00EB}, //TVAR_ash_pGAS[533] 0024 //0089
1161 {0x0F12,0x00B3}, //TVAR_ash_pGAS[534] 0026 //0066
1162 {0x0F12,0x008A}, //TVAR_ash_pGAS[535] 0021 //0049
1163 {0x0F12,0x006C}, //TVAR_ash_pGAS[536] 001D //0037
1164 {0x0F12,0x005A}, //TVAR_ash_pGAS[537] 0018 //002A
1165 {0x0F12,0x004B}, //TVAR_ash_pGAS[538] 0014 //0020
1166 {0x0F12,0x0047}, //TVAR_ash_pGAS[539] 000F //001C
1167 {0x0F12,0x004C}, //TVAR_ash_pGAS[540] 000D //001E
1168 {0x0F12,0x0057}, //TVAR_ash_pGAS[541] 000E //0024
1169 {0x0F12,0x006A}, //TVAR_ash_pGAS[542] 0012 //0030
1170 {0x0F12,0x0086}, //TVAR_ash_pGAS[543] 0016 //0042
1171 {0x0F12,0x00A9}, //TVAR_ash_pGAS[544] 0019 //005D
1172 {0x0F12,0x00D9}, //TVAR_ash_pGAS[545] 001B //007D
1173 {0x0F12,0x011D}, //TVAR_ash_pGAS[546] 0036 //00A9
1174 {0x0F12,0x00DE}, //TVAR_ash_pGAS[547] 0035 //0084
1175 {0x0F12,0x00B2}, //TVAR_ash_pGAS[548] 0032 //0066
1176 {0x0F12,0x0097}, //TVAR_ash_pGAS[549] 002E //0052
1177 {0x0F12,0x0087}, //TVAR_ash_pGAS[550] 002a //0045
1178 {0x0F12,0x007A}, //TVAR_ash_pGAS[551] 0026 //003B
1179 {0x0F12,0x0077}, //TVAR_ash_pGAS[552] 0021 //0036
1180 {0x0F12,0x007A}, //TVAR_ash_pGAS[553] 001F //0038
1181 {0x0F12,0x0086}, //TVAR_ash_pGAS[554] 001F //003E
1182 {0x0F12,0x0098}, //TVAR_ash_pGAS[555] 0024 //004A
1183 {0x0F12,0x00B3}, //TVAR_ash_pGAS[556] 0027 //005E
1184 {0x0F12,0x00DA}, //TVAR_ash_pGAS[557] 002a //0077
1185 {0x0F12,0x0112}, //TVAR_ash_pGAS[558] 0028 //009E
1186 {0x0F12,0x0149}, //TVAR_ash_pGAS[559] 005C //00BC
1187 {0x0F12,0x0114}, //TVAR_ash_pGAS[560] 004A //009C
1188 {0x0F12,0x00EB}, //TVAR_ash_pGAS[561] 0049 //007D
1189 {0x0F12,0x00CE}, //TVAR_ash_pGAS[562] 0046 //0069
1190 {0x0F12,0x00B9}, //TVAR_ash_pGAS[563] 0041 //005A
1191 {0x0F12,0x00AD}, //TVAR_ash_pGAS[564] 003E //0052
1192 {0x0F12,0x00A8}, //TVAR_ash_pGAS[565] 003A //004C
1193 {0x0F12,0x00AF}, //TVAR_ash_pGAS[566] 0037 //004D
1194 {0x0F12,0x00B8}, //TVAR_ash_pGAS[567] 0037 //0054
1195 {0x0F12,0x00CB}, //TVAR_ash_pGAS[568] 003B //0060
1196 {0x0F12,0x00EC}, //TVAR_ash_pGAS[569] 003F //0072
1197 {0x0F12,0x0119}, //TVAR_ash_pGAS[570] 0040 //0093
1198 {0x0F12,0x0153}, //TVAR_ash_pGAS[571] 0041 //00B6
1199 // param_end TVAR_ash_pGAS
1203 // param_start TVAR_ash_AwbAshCord
1212 // param_end TVAR_ash_AwbAshCord
1214 {0x002A,0x0754}, //#TVAR_ash_pGAS
1219 // param_start awbb_IndoorGrZones_m_BGrid
1221 {0x0F12,0x03AE}, //03BE //awbb_IndoorGrZones_m_BGrid[0] 03C6
1222 {0x0F12,0x03DB}, //03EB //awbb_IndoorGrZones_m_BGrid[1] 03F3
1223 {0x0F12,0x0399}, //03A9 //awbb_IndoorGrZones_m_BGrid[2] 03B1
1224 {0x0F12,0x03DB}, //03EB //awbb_IndoorGrZones_m_BGrid[3] 03F3
1225 {0x0F12,0x0382}, //0392 //awbb_IndoorGrZones_m_BGrid[4] 039A
1226 {0x0F12,0x03DB}, //03EB //awbb_IndoorGrZones_m_BGrid[5] 03F3
1227 {0x0F12,0x036B}, //037B //awbb_IndoorGrZones_m_BGrid[6] 0383
1228 {0x0F12,0x03CE}, //03DE //awbb_IndoorGrZones_m_BGrid[7] 03E6
1229 {0x0F12,0x034E}, //035E //awbb_IndoorGrZones_m_BGrid[8] 0366
1230 {0x0F12,0x03BD}, //03CD //awbb_IndoorGrZones_m_BGrid[9] 03D5
1231 {0x0F12,0x0330}, //0340 //awbb_IndoorGrZones_m_BGrid[10] 0348
1232 {0x0F12,0x03A8}, //03B8 //awbb_IndoorGrZones_m_BGrid[11] 03C0
1233 {0x0F12,0x0316}, //0326 //awbb_IndoorGrZones_m_BGrid[12] 032E
1234 {0x0F12,0x0391}, //03A1 //awbb_IndoorGrZones_m_BGrid[13] 03A9
1235 {0x0F12,0x02FA}, //030A //awbb_IndoorGrZones_m_BGrid[14] 0312
1236 {0x0F12,0x0376}, //0386 //awbb_IndoorGrZones_m_BGrid[15] 038E
1237 {0x0F12,0x02E0}, //02F0 //awbb_IndoorGrZones_m_BGrid[16] 02F8
1238 {0x0F12,0x035D}, //036D //awbb_IndoorGrZones_m_BGrid[17] 0375
1239 {0x0F12,0x02CC}, //02DC //awbb_IndoorGrZones_m_BGrid[18] 02E4
1240 {0x0F12,0x0344}, //0354 //awbb_IndoorGrZones_m_BGrid[19] 035C
1241 {0x0F12,0x02B7}, //02C7 //awbb_IndoorGrZones_m_BGrid[20] 02CF
1242 {0x0F12,0x032F}, //033F //awbb_IndoorGrZones_m_BGrid[21] 0347
1243 {0x0F12,0x02A7}, //02B7 //awbb_IndoorGrZones_m_BGrid[22] 02BF
1244 {0x0F12,0x0318}, //0328 //awbb_IndoorGrZones_m_BGrid[23] 0330
1245 {0x0F12,0x0296}, //02A6 //awbb_IndoorGrZones_m_BGrid[24] 02AE
1246 {0x0F12,0x0301}, //0311 //awbb_IndoorGrZones_m_BGrid[25] 0319
1247 {0x0F12,0x0286}, //0296 //awbb_IndoorGrZones_m_BGrid[26] 029E
1248 {0x0F12,0x02ED}, //02FD //awbb_IndoorGrZones_m_BGrid[27] 0305
1249 {0x0F12,0x0279}, //0289 //awbb_IndoorGrZones_m_BGrid[28] 0291
1250 {0x0F12,0x02DB}, //02EB //awbb_IndoorGrZones_m_BGrid[29] 02F3
1251 {0x0F12,0x026C}, //027C //awbb_IndoorGrZones_m_BGrid[30] 0284
1252 {0x0F12,0x02CD}, //02DD //awbb_IndoorGrZones_m_BGrid[31] 02E5
1253 {0x0F12,0x025E}, //026E //awbb_IndoorGrZones_m_BGrid[32] 0276
1254 {0x0F12,0x02BF}, //02CF //awbb_IndoorGrZones_m_BGrid[33] 02D7
1255 {0x0F12,0x0252}, //0262 //awbb_IndoorGrZones_m_BGrid[34] 026A
1256 {0x0F12,0x02B2}, //02C2 //awbb_IndoorGrZones_m_BGrid[35] 02CA
1257 {0x0F12,0x0249}, //0259 //awbb_IndoorGrZones_m_BGrid[36] 0261
1258 {0x0F12,0x02A7}, //02B7 //awbb_IndoorGrZones_m_BGrid[37] 02BF
1259 {0x0F12,0x023B}, //024B //awbb_IndoorGrZones_m_BGrid[38] 0253
1260 {0x0F12,0x029B}, //02AB //awbb_IndoorGrZones_m_BGrid[39] 02B3
1261 {0x0F12,0x0231}, //0241 //awbb_IndoorGrZones_m_BGrid[40] 0249
1262 {0x0F12,0x028D}, //029D //awbb_IndoorGrZones_m_BGrid[41] 02A5
1263 {0x0F12,0x0227}, //0237 //awbb_IndoorGrZones_m_BGrid[42] 023F
1264 {0x0F12,0x0281}, //0291 //awbb_IndoorGrZones_m_BGrid[43] 0299
1265 {0x0F12,0x021D}, //022D //awbb_IndoorGrZones_m_BGrid[44] 0235
1266 {0x0F12,0x0277}, //0287 //awbb_IndoorGrZones_m_BGrid[45] 028F
1267 {0x0F12,0x0216}, //0226 //awbb_IndoorGrZones_m_BGrid[46] 022E
1268 {0x0F12,0x026E}, //027E //awbb_IndoorGrZones_m_BGrid[47] 0286
1269 {0x0F12,0x020C}, //021C //awbb_IndoorGrZones_m_BGrid[48] 0224
1270 {0x0F12,0x0263}, //0273 //awbb_IndoorGrZones_m_BGrid[49] 027B
1271 {0x0F12,0x0204}, //0214 //awbb_IndoorGrZones_m_BGrid[50] 021C
1272 {0x0F12,0x0257}, //0267 //awbb_IndoorGrZones_m_BGrid[51] 026F
1273 {0x0F12,0x01F7}, //0207 //awbb_IndoorGrZones_m_BGrid[52] 020F
1274 {0x0F12,0x024A}, //025A //awbb_IndoorGrZones_m_BGrid[53] 0262
1275 {0x0F12,0x01E4}, //01F4 //awbb_IndoorGrZones_m_BGrid[54] 01FC
1276 {0x0F12,0x023D}, //024D //awbb_IndoorGrZones_m_BGrid[55] 0255
1277 {0x0F12,0x01CC}, //01DC //awbb_IndoorGrZones_m_BGrid[56] 01F3
1278 {0x0F12,0x022A}, //023A //awbb_IndoorGrZones_m_BGrid[57] 0242
1279 {0x0F12,0x01E5}, //01F5 //awbb_IndoorGrZones_m_BGrid[58] 01FD
1280 {0x0F12,0x020E}, //021E //awbb_IndoorGrZones_m_BGrid[59] 0226
1281 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[60] 0000
1282 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[61] 0000
1283 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[62] 0000
1284 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[63] 0000
1285 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[64] 0000
1286 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[65] 0000
1287 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[66] 0000
1288 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[67] 0000
1289 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[68] 0000
1290 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[69] 0000
1291 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[70] 0000
1292 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[71] 0000
1293 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[72] 0000
1294 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[73] 0000
1295 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[74] 0000
1296 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[75] 0000
1297 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[76] 0000
1298 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[77] 0000
1299 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[78] 0000
1300 {0x0F12,0x0000}, //0000 //awbb_IndoorGrZones_m_BGrid[79] 0000
1301 // param_end awbb_IndoorGrZones_m_BGrid 0cf0 //#awbb_IndoorGrZones_m_GridStep
1305 {0x002A,0x0cf8}, //#awbb_IndoorGrZones_m_Boffs
1306 {0x0F12,0x00f7}, //EC
1308 // param_start awbb_LowBrGrZones_m_BGrid
1310 {0x0F12,0x0406}, //0406 //awbb_LowBrGrZones_m_BGrid[0] 0406
1311 {0x0F12,0x0467}, //0467 //awbb_LowBrGrZones_m_BGrid[1] 0467
1312 {0x0F12,0x0371}, //0371 //awbb_LowBrGrZones_m_BGrid[2] 0371
1313 {0x0F12,0x04B0}, //04B0 //awbb_LowBrGrZones_m_BGrid[3] 04B0
1314 {0x0F12,0x02E5}, //02E5 //awbb_LowBrGrZones_m_BGrid[4] 02E5
1315 {0x0F12,0x0481}, //0481 //awbb_LowBrGrZones_m_BGrid[5] 0481
1316 {0x0F12,0x0298}, //0298 //awbb_LowBrGrZones_m_BGrid[6] 0298
1317 {0x0F12,0x042E}, //042E //awbb_LowBrGrZones_m_BGrid[7] 042E
1318 {0x0F12,0x0260}, //0260 //awbb_LowBrGrZones_m_BGrid[8] 0260
1319 {0x0F12,0x03DE}, //03DE //awbb_LowBrGrZones_m_BGrid[9] 03DE
1320 {0x0F12,0x022F}, //022F //awbb_LowBrGrZones_m_BGrid[10]022F
1321 {0x0F12,0x0391}, //0391 //awbb_LowBrGrZones_m_BGrid[11]0391
1322 {0x0F12,0x0201}, //0201 //awbb_LowBrGrZones_m_BGrid[12]0201
1323 {0x0F12,0x034D}, //034D //awbb_LowBrGrZones_m_BGrid[13]034D
1324 {0x0F12,0x01DA}, //01DA //awbb_LowBrGrZones_m_BGrid[14]01DA
1325 {0x0F12,0x0310}, //0310 //awbb_LowBrGrZones_m_BGrid[15]0310
1326 {0x0F12,0x01B3}, //01B3 //awbb_LowBrGrZones_m_BGrid[16]01B3
1327 {0x0F12,0x02D4}, //02D4 //awbb_LowBrGrZones_m_BGrid[17]02D4
1328 {0x0F12,0x018F}, //018F //awbb_LowBrGrZones_m_BGrid[18]018F
1329 {0x0F12,0x0297}, //0297 //awbb_LowBrGrZones_m_BGrid[19]0297
1330 {0x0F12,0x0181}, //0181 //awbb_LowBrGrZones_m_BGrid[20]0181
1331 {0x0F12,0x0271}, //0271 //awbb_LowBrGrZones_m_BGrid[21]0271
1332 {0x0F12,0x0181}, //0181 //awbb_LowBrGrZones_m_BGrid[22]0181
1333 {0x0F12,0x022A}, //022A //awbb_LowBrGrZones_m_BGrid[23]022A
1334 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[24]0000
1335 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[25]0000
1336 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[26]0000
1337 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[27]0000
1338 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[28]0000
1339 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[29]0000
1340 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[30]0000
1341 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[31]0000
1342 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[32]0000
1343 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[33]0000
1344 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[34]0000
1345 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[35]0000
1346 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[36]0000
1347 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[37]0000
1348 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[38]0000
1349 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[39]0000
1350 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[40]0000
1351 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[41]0000
1352 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[42]0000
1353 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[43]0000
1354 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[44]0000
1355 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[45]0000
1356 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[46]0000
1357 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[47]0000
1358 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[48]0000
1359 {0x0F12,0x0000}, //0000 //awbb_LowBrGrZones_m_BGrid[49]0000
1360 // param_end awbb_LowBrGrZones_m_BGrid
1361 {0x002A,0x0de8}, //#awbb_LowBrGrZones_m_GridStep
1364 {0x002A,0x0df0}, //#awbb_LowBrGrZones_m_Boffs
1367 // param_start awbb_OutdoorGrZones_m_BGrid
1369 {0x0F12,0x0257}, //02C5 //0349 //035E //awbb_OutdoorGrZones_m_BGrid[0] 036B
1370 {0x0F12,0x0287}, //032D //0363 //0378 //awbb_OutdoorGrZones_m_BGrid[1] 0385
1371 {0x0F12,0x0245}, //02B2 //032C //0341 //awbb_OutdoorGrZones_m_BGrid[2] 034E
1372 {0x0F12,0x0287}, //0315 //036E //0383 //awbb_OutdoorGrZones_m_BGrid[3] 0390
1373 {0x0F12,0x0237}, //02A0 //030F //0324 //awbb_OutdoorGrZones_m_BGrid[4] 0331
1374 {0x0F12,0x027D}, //02FE //036E //0383 //awbb_OutdoorGrZones_m_BGrid[5] 0390
1375 {0x0F12,0x022A}, //0290 //02F3 //0308 //awbb_OutdoorGrZones_m_BGrid[6] 0315
1376 {0x0F12,0x0270}, //02E9 //035C //0371 //awbb_OutdoorGrZones_m_BGrid[7] 037E
1377 {0x0F12,0x0220}, //0280 //02D8 //02ED //awbb_OutdoorGrZones_m_BGrid[8] 02FA
1378 {0x0F12,0x0263}, //02D7 //0343 //0358 //awbb_OutdoorGrZones_m_BGrid[9] 0365
1379 {0x0F12,0x0217}, //0274 //02C5 //02DA //awbb_OutdoorGrZones_m_BGrid[10]02E7
1380 {0x0F12,0x0256}, //02C7 //032D //0342 //awbb_OutdoorGrZones_m_BGrid[11]034F
1381 {0x0F12,0x020F}, //0266 //02B2 //02C7 //awbb_OutdoorGrZones_m_BGrid[12]02D4
1382 {0x0F12,0x024A}, //02B9 //0315 //032A //awbb_OutdoorGrZones_m_BGrid[13]0337
1383 {0x0F12,0x020F}, //0259 //02A0 //02B5 //awbb_OutdoorGrZones_m_BGrid[14]02C2
1384 {0x0F12,0x023E}, //02AF //02FE //0313 //awbb_OutdoorGrZones_m_BGrid[15]0320
1385 {0x0F12,0x0000}, //024F //0290 //02A5 //awbb_OutdoorGrZones_m_BGrid[16]02B2
1386 {0x0F12,0x0000}, //02A3 //02E9 //02FB //awbb_OutdoorGrZones_m_BGrid[17]0308
1387 {0x0F12,0x0000}, //0241 //0280 //0295 //awbb_OutdoorGrZones_m_BGrid[18]02A2
1388 {0x0F12,0x0000}, //0297 //02D7 //02EB //awbb_OutdoorGrZones_m_BGrid[19]02F8
1389 {0x0F12,0x0000}, //0235 //0274 //0289 //awbb_OutdoorGrZones_m_BGrid[20]0296
1390 {0x0F12,0x0000}, //0287 //02C7 //02DB //awbb_OutdoorGrZones_m_BGrid[21]02E8
1391 {0x0F12,0x0000}, //022C //0266 //027B //awbb_OutdoorGrZones_m_BGrid[22]0288
1392 {0x0F12,0x0000}, //027C //02B9 //02CC //awbb_OutdoorGrZones_m_BGrid[23]02D9
1393 {0x0F12,0x0000}, //0222 //0259 //026E //awbb_OutdoorGrZones_m_BGrid[24]027B
1394 {0x0F12,0x0000}, //0271 //02AF //02C0 //awbb_OutdoorGrZones_m_BGrid[25]02CD
1395 {0x0F12,0x0000}, //021A //024F //0260 //awbb_OutdoorGrZones_m_BGrid[26]026D
1396 {0x0F12,0x0000}, //026A //02A3 //02B3 //awbb_OutdoorGrZones_m_BGrid[27]02C0
1397 {0x0F12,0x0000}, //0213 //0241 //0256 //awbb_OutdoorGrZones_m_BGrid[28]0263
1398 {0x0F12,0x0000}, //0261 //0297 //02A7 //awbb_OutdoorGrZones_m_BGrid[29]02B4
1399 {0x0F12,0x0000}, //0209 //0235 //024A //awbb_OutdoorGrZones_m_BGrid[30]0257
1400 {0x0F12,0x0000}, //0254 //0287 //029C //awbb_OutdoorGrZones_m_BGrid[31]02A9
1401 {0x0F12,0x0000}, //01FE //022C //023F //awbb_OutdoorGrZones_m_BGrid[32]024C
1402 {0x0F12,0x0000}, //0248 //027C //028D //awbb_OutdoorGrZones_m_BGrid[33]029A
1403 {0x0F12,0x0000}, //01F0 //0222 //0234 //awbb_OutdoorGrZones_m_BGrid[34]0241
1404 {0x0F12,0x0000}, //023A //0271 //0283 //awbb_OutdoorGrZones_m_BGrid[35]0290
1405 {0x0F12,0x0000}, //01D4 //021A //022C //awbb_OutdoorGrZones_m_BGrid[36]0239
1406 {0x0F12,0x0000}, //0228 //026A //0279 //awbb_OutdoorGrZones_m_BGrid[37]0286
1407 {0x0F12,0x0000}, //01EB //0213 //0225 //awbb_OutdoorGrZones_m_BGrid[38]0232
1408 {0x0F12,0x0000}, //0209 //0261 //0271 //awbb_OutdoorGrZones_m_BGrid[39]027E
1409 {0x0F12,0x0000}, //0000 //0209 //021A //awbb_OutdoorGrZones_m_BGrid[40]0227
1410 {0x0F12,0x0000}, //0000 //0254 //0266 //awbb_OutdoorGrZones_m_BGrid[41]0273
1411 {0x0F12,0x0000}, //0000 //01FE //0210 //awbb_OutdoorGrZones_m_BGrid[42]021D
1412 {0x0F12,0x0000}, //0000 //0248 //0259 //awbb_OutdoorGrZones_m_BGrid[43]0266
1413 {0x0F12,0x0000}, //0000 //01F0 //0205 //awbb_OutdoorGrZones_m_BGrid[44]0212
1414 {0x0F12,0x0000}, //0000 //023A //024A //awbb_OutdoorGrZones_m_BGrid[45]0257
1415 {0x0F12,0x0000}, //0000 //01D4 //01E9 //awbb_OutdoorGrZones_m_BGrid[46]0202
1416 {0x0F12,0x0000}, //0000 //0228 //0239 //awbb_OutdoorGrZones_m_BGrid[47]0246
1417 {0x0F12,0x0000}, //0000 //01EB //01F8 //awbb_OutdoorGrZones_m_BGrid[48]0209
1418 {0x0F12,0x0000}, //0000 //0209 //021E //awbb_OutdoorGrZones_m_BGrid[49]022B
1419 // param_end awbb_OutdoorGrZones_m_BGrid
1420 {0x002A,0x0d6c}, //#awbb_OutdoorGrZones_m_GridStep
1423 {0x002A,0x0d74}, //#awbb_OutdoorGrZones_m_Boffs
1424 {0x0F12,0x0222}, //0195 //0145 //013d //0131
1426 {0x002A,0x0e00}, //#awbb_CrclLowT_R_c
1427 {0x0F12,0x03cf}, //034A
1429 {0x002A,0x0e04}, //#awbb_CrclLowT_B_c
1430 {0x0F12,0x012e}, //0176
1432 {0x002A,0x0e08}, //#awbb_CrclLowT_Rad_c
1433 {0x0F12,0xdf21}, //67C3 //6fc3 //71B8
1436 {0x0F12,0x0135}, //012F
1443 // param_start SARR_usGammaLutRGBIndoor
1493 // param_end SARR_usGammaLutRGBIndoor
1497 {0x0F12,0x003e}, // AE Target
1507 {0x0F12,0x01B8}, //SAAR_IllumF
1517 {0x0F12,0x0000}, // param_start TVAR_wbt_pBaseCcms
1627 // param_end TVAR_wbt_pBaseCcms
1628 // param_start TVAR_wbt_pOutdoorCcm
1647 {0x0F12,0x013C}, // param_end TVAR_wbt_pOutdoorCcm
1655 {0x0F12,0x01A3}, // param_start SARR_uNormBrInDoor
1662 // param_end SARR_uNormBrInDoor
1663 // param_start afit_uNoiseIndInDoor
1670 // param_end afit_uNoiseIndInDoor
1673 // param_start TVAR_afit_pBaseVals
1675 {0x0F12,0x000B}, //TVAR_afit_pBaseVals[0]
1676 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[1]
1677 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[2]
1678 {0x0F12,0xFFAA}, //TVAR_afit_pBaseVals[3]
1679 {0x0F12,0x0019}, //TVAR_afit_pBaseVals[4]
1680 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[5]
1681 {0x0F12,0x0032}, //TVAR_afit_pBaseVals[6]
1682 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[7]
1683 {0x0F12,0x00FF}, //TVAR_afit_pBaseVals[8]
1684 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[9]
1685 {0x0F12,0x0004}, //TVAR_afit_pBaseVals[10]
1686 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[11]
1687 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[12]
1688 {0x0F12,0x0064}, //TVAR_afit_pBaseVals[13]
1689 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[14]
1690 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[15]
1691 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[16]
1692 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[17]
1693 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[18]
1694 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[19]
1695 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[20]
1696 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[21]
1697 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[22]
1698 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[23]
1699 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[24]
1700 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[25]
1701 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[26]
1702 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[27]
1703 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[28]
1704 {0x0F12,0x0106}, //TVAR_afit_pBaseVals[29]
1705 {0x0F12,0x006F}, //TVAR_afit_pBaseVals[30]
1706 {0x0F12,0x054C}, //TVAR_afit_pBaseVals[31]
1707 {0x0F12,0x0A4C}, //TVAR_afit_pBaseVals[32]
1708 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[33]
1709 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[34]
1710 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[35]
1711 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[36]
1712 {0x0F12,0x2828}, //TVAR_afit_pBaseVals[37]
1713 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[38]
1714 {0x0F12,0x0230}, //TVAR_afit_pBaseVals[39]
1715 {0x0F12,0x0480}, //TVAR_afit_pBaseVals[40]
1716 {0x0F12,0x0804}, //TVAR_afit_pBaseVals[41]
1717 {0x0F12,0x030A}, //TVAR_afit_pBaseVals[42]
1718 {0x0F12,0x1403}, //TVAR_afit_pBaseVals[43]
1719 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[44]
1720 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[45]
1721 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[46]
1722 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[47]
1723 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[48]
1724 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[49]
1725 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[50]
1726 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[51]
1727 {0x0F12,0x0400}, //TVAR_afit_pBaseVals[52]
1728 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[53]
1729 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[54]
1730 {0x0F12,0x0A00}, //TVAR_afit_pBaseVals[55]
1731 {0x0F12,0x100A}, //TVAR_afit_pBaseVals[56]
1732 {0x0F12,0x0150}, //TVAR_afit_pBaseVals[57]
1733 {0x0F12,0x0130}, //TVAR_afit_pBaseVals[58]
1734 {0x0F12,0x0100}, //TVAR_afit_pBaseVals[59]
1735 {0x0F12,0x8032}, //805A //TVAR_afit_pBaseVals[60]
1736 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[61]
1737 {0x0F12,0x001C}, //TVAR_afit_pBaseVals[62]
1738 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[63]
1739 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[64]
1740 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[65]
1741 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[66]
1742 {0x0F12,0x000C}, //TVAR_afit_pBaseVals[67]
1743 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[68]
1744 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[69]
1745 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[70]
1746 {0x0F12,0x00A0}, //TVAR_afit_pBaseVals[71]
1747 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[72]
1748 {0x0F12,0x0004}, //TVAR_afit_pBaseVals[73]
1749 {0x0F12,0x0012}, //TVAR_afit_pBaseVals[74]
1750 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[75]
1751 {0x0F12,0x0064}, //TVAR_afit_pBaseVals[76]
1752 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[77]
1753 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[78]
1754 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[79]
1755 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[80]
1756 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[81]
1757 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[82]
1758 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[83]
1759 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[84]
1760 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[85]
1761 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[86]
1762 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[87]
1763 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[88]
1764 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[89]
1765 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[90]
1766 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[91]
1767 {0x0F12,0x0106}, //TVAR_afit_pBaseVals[92]
1768 {0x0F12,0x006F}, //TVAR_afit_pBaseVals[93]
1769 {0x0F12,0x053D}, //TVAR_afit_pBaseVals[94]
1770 {0x0F12,0x0A3D}, //TVAR_afit_pBaseVals[95]
1771 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[96]
1772 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[97]
1773 {0x0F12,0x0C23}, //TVAR_afit_pBaseVals[98]
1774 {0x0F12,0x230C}, //TVAR_afit_pBaseVals[99]
1775 {0x0F12,0x1919}, //TVAR_afit_pBaseVals[100]
1776 {0x0F12,0x0303}, //TVAR_afit_pBaseVals[101]
1777 {0x0F12,0x0220}, //TVAR_afit_pBaseVals[102]
1778 {0x0F12,0x0480}, //TVAR_afit_pBaseVals[103]
1779 {0x0F12,0x0804}, //TVAR_afit_pBaseVals[104]
1780 {0x0F12,0x030A}, //TVAR_afit_pBaseVals[105]
1781 {0x0F12,0x1403}, //TVAR_afit_pBaseVals[106]
1782 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[107]
1783 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[108]
1784 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[109]
1785 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[110]
1786 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[111]
1787 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[112]
1788 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[113]
1789 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[114]
1790 {0x0F12,0x0400}, //TVAR_afit_pBaseVals[115]
1791 {0x0F12,0x0200}, //TVAR_afit_pBaseVals[116]
1792 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[117]
1793 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[118]
1794 {0x0F12,0x1008}, //TVAR_afit_pBaseVals[119]
1795 {0x0F12,0x0160}, //TVAR_afit_pBaseVals[120]
1796 {0x0F12,0x0150}, //TVAR_afit_pBaseVals[121]
1797 {0x0F12,0x0100}, //TVAR_afit_pBaseVals[122]
1798 {0x0F12,0x803C}, //8064 //TVAR_afit_pBaseVals[123]
1799 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[124]
1800 {0x0F12,0x0016}, //TVAR_afit_pBaseVals[125]
1801 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[126]
1802 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[127]
1803 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[128]
1804 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[129]
1805 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[130]
1806 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[131]
1807 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[132]
1808 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[133]
1809 {0x0F12,0x0050}, //TVAR_afit_pBaseVals[134]
1810 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[135]
1811 {0x0F12,0x0003}, //TVAR_afit_pBaseVals[136]
1812 {0x0F12,0x0019}, //TVAR_afit_pBaseVals[137]
1813 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[138]
1814 {0x0F12,0x0064}, //TVAR_afit_pBaseVals[139]
1815 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[140]
1816 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[141]
1817 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[142]
1818 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[143]
1819 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[144]
1820 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[145]
1821 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[146]
1822 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[147]
1823 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[148]
1824 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[149]
1825 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[150]
1826 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[151]
1827 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[152]
1828 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[153]
1829 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[154]
1830 {0x0F12,0x0106}, //TVAR_afit_pBaseVals[155]
1831 {0x0F12,0x006F}, //TVAR_afit_pBaseVals[156]
1832 {0x0F12,0x050A}, //TVAR_afit_pBaseVals[157]
1833 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[158]
1834 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[159]
1835 {0x0F12,0x0203}, //TVAR_afit_pBaseVals[160]
1836 {0x0F12,0x1946}, //TVAR_afit_pBaseVals[161]
1837 {0x0F12,0x4619}, //TVAR_afit_pBaseVals[162]
1838 {0x0F12,0x0F0F}, //TVAR_afit_pBaseVals[163]
1839 {0x0F12,0x0606}, //TVAR_afit_pBaseVals[164]
1840 {0x0F12,0x020F}, //TVAR_afit_pBaseVals[165]
1841 {0x0F12,0x0480}, //TVAR_afit_pBaseVals[166]
1842 {0x0F12,0x0804}, //TVAR_afit_pBaseVals[167]
1843 {0x0F12,0x030A}, //TVAR_afit_pBaseVals[168]
1844 {0x0F12,0x1403}, //TVAR_afit_pBaseVals[169]
1845 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[170]
1846 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[171]
1847 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[172]
1848 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[173]
1849 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[174]
1850 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[175]
1851 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[176]
1852 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[177]
1853 {0x0F12,0x0404}, //TVAR_afit_pBaseVals[178]
1854 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[179]
1855 {0x0F12,0x0402}, //TVAR_afit_pBaseVals[180]
1856 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[181]
1857 {0x0F12,0x1006}, //TVAR_afit_pBaseVals[182]
1858 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[183]
1859 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[184]
1860 {0x0F12,0x0100}, //TVAR_afit_pBaseVals[185]
1861 {0x0F12,0x8046}, //0x8067 //TVAR_afit_pBaseVals[186]
1862 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[187]
1863 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[188]
1864 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[189]
1865 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[190]
1866 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[191]
1867 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[192]
1868 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[193]
1869 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[194]
1870 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[195]
1871 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[196]
1872 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[197]
1873 {0x0F12,0x000A}, //TVAR_afit_pBaseVals[198]
1874 {0x0F12,0x0003}, //TVAR_afit_pBaseVals[199]
1875 {0x0F12,0x0019}, //TVAR_afit_pBaseVals[200]
1876 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[201]
1877 {0x0F12,0x0064}, //TVAR_afit_pBaseVals[202]
1878 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[203]
1879 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[204]
1880 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[205]
1881 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[206]
1882 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[207]
1883 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[208]
1884 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[209]
1885 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[210]
1886 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[211]
1887 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[212]
1888 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[213]
1889 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[214]
1890 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[215]
1891 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[216]
1892 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[217]
1893 {0x0F12,0x0106}, //TVAR_afit_pBaseVals[218]
1894 {0x0F12,0x006F}, //TVAR_afit_pBaseVals[219]
1895 {0x0F12,0x0505}, //TVAR_afit_pBaseVals[220]
1896 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[221]
1897 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[222]
1898 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[223]
1899 {0x0F12,0x1946}, //TVAR_afit_pBaseVals[224]
1900 {0x0F12,0x4619}, //TVAR_afit_pBaseVals[225]
1901 {0x0F12,0x0F0F}, //TVAR_afit_pBaseVals[226]
1902 {0x0F12,0x0606}, //TVAR_afit_pBaseVals[227]
1903 {0x0F12,0x020F}, //TVAR_afit_pBaseVals[228]
1904 {0x0F12,0x0480}, //TVAR_afit_pBaseVals[229]
1905 {0x0F12,0x0804}, //TVAR_afit_pBaseVals[230]
1906 {0x0F12,0x030A}, //TVAR_afit_pBaseVals[231]
1907 {0x0F12,0x1403}, //TVAR_afit_pBaseVals[232]
1908 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[233]
1909 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[234]
1910 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[235]
1911 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[236]
1912 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[237]
1913 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[238]
1914 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[239]
1915 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[240]
1916 {0x0F12,0x0404}, //TVAR_afit_pBaseVals[241]
1917 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[242]
1918 {0x0F12,0x0402}, //TVAR_afit_pBaseVals[243]
1919 {0x0F12,0x0002}, //TVAR_afit_pBaseVals[244]
1920 {0x0F12,0x1006}, //TVAR_afit_pBaseVals[245]
1921 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[246]
1922 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[247]
1923 {0x0F12,0x0100}, //TVAR_afit_pBaseVals[248]
1924 {0x0F12,0x8046}, //5A //0x806B //TVAR_afit_pBaseVals[249]
1925 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[250]
1926 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[251]
1927 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[252]
1928 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[253]
1929 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[254]
1930 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[255]
1931 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[256]
1932 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[257]
1933 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[258]
1934 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[259]
1935 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[260]
1936 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[261]
1937 {0x0F12,0x0003}, //TVAR_afit_pBaseVals[262]
1938 {0x0F12,0x0019}, //TVAR_afit_pBaseVals[263]
1939 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[264]
1940 {0x0F12,0x0064}, //TVAR_afit_pBaseVals[265]
1941 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[266]
1942 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[267]
1943 {0x0F12,0x0000}, //TVAR_afit_pBaseVals[268]
1944 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[269]
1945 {0x0F12,0x000F}, //TVAR_afit_pBaseVals[270]
1946 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[271]
1947 {0x0F12,0x03FF}, //TVAR_afit_pBaseVals[272]
1948 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[273]
1949 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[274]
1950 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[275]
1951 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[276]
1952 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[277]
1953 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[278]
1954 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[279]
1955 {0x0F12,0x0028}, //TVAR_afit_pBaseVals[280]
1956 {0x0F12,0x0106}, //TVAR_afit_pBaseVals[281]
1957 {0x0F12,0x006F}, //TVAR_afit_pBaseVals[282]
1958 {0x0F12,0x0505}, //TVAR_afit_pBaseVals[283]
1959 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[284]
1960 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[285]
1961 {0x0F12,0x0202}, //TVAR_afit_pBaseVals[286]
1962 {0x0F12,0x1946}, //TVAR_afit_pBaseVals[287]
1963 {0x0F12,0x4619}, //TVAR_afit_pBaseVals[288]
1964 {0x0F12,0x0F0F}, //TVAR_afit_pBaseVals[289]
1965 {0x0F12,0x0606}, //TVAR_afit_pBaseVals[290]
1966 {0x0F12,0x020F}, //TVAR_afit_pBaseVals[291]
1967 {0x0F12,0x0480}, //TVAR_afit_pBaseVals[292]
1968 {0x0F12,0x0804}, //TVAR_afit_pBaseVals[293]
1969 {0x0F12,0x030A}, //TVAR_afit_pBaseVals[294]
1970 {0x0F12,0x1403}, //TVAR_afit_pBaseVals[295]
1971 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[296]
1972 {0x0F12,0x0014}, //TVAR_afit_pBaseVals[297]
1973 {0x0F12,0x0500}, //TVAR_afit_pBaseVals[298]
1974 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[299]
1975 {0x0F12,0x1414}, //TVAR_afit_pBaseVals[300]
1976 {0x0F12,0x0A0A}, //TVAR_afit_pBaseVals[301]
1977 {0x0F12,0x0005}, //TVAR_afit_pBaseVals[302]
1978 {0x0F12,0x0303}, //TVAR_afit_pBaseVals[303]
1979 {0x0F12,0x0707}, //TVAR_afit_pBaseVals[304]
1980 {0x0F12,0x0303}, //TVAR_afit_pBaseVals[305]
1981 {0x0F12,0x0806}, //TVAR_afit_pBaseVals[306]
1982 {0x0F12,0x0004}, //TVAR_afit_pBaseVals[307]
1983 {0x0F12,0x1006}, //TVAR_afit_pBaseVals[308]
1984 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[309]
1985 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[310]
1986 {0x0F12,0x0100}, //TVAR_afit_pBaseVals[311]
1987 {0x0F12,0x8046}, //5A //0x806B //TVAR_afit_pBaseVals[312]
1988 {0x0F12,0x0180}, //TVAR_afit_pBaseVals[313]
1989 {0x0F12,0x0000}, ////TVAR_afit_pBaseVals[314] param_end TVAR_afit_pBaseVals
1990 // param_sta afit_pConstBaseVals
2009 {0x0F12,0x0001}, // param_end afit_pConstBaseVals
2011 {0x002A,0x06d4}, //#TVAR_wbt_pOutdoorCcm
2014 {0x002A,0x06cc}, //#TVAR_wbt_pBaseCcms
2017 {0x002A,0x06e8}, //#TVAR_wbt_pBaseCcmsAddr[0]
2020 {0x002A,0x06EC}, //#TVAR_wbt_pBaseCcmsAddr[1]
2023 {0x002A,0x06f0}, //#TVAR_wbt_pBaseCcmsAddr[2]
2026 {0x002A,0x06f4}, //#TVAR_wbt_pBaseCcmsAddr[3]
2029 {0x002A,0x06f8}, //#TVAR_wbt_pBaseCcmsAddr[4]
2032 {0x002A,0x06fc}, //#TVAR_wbt_pBaseCcmsAddr[5]
2034 {0x0F12,0x7000}, // End tuning part
2036 //1000 0001 // Set host interrupt so main start run
2038 {SEQUENCE_WAIT_MS,20},
2044 //=================================================================================================
2046 //=================================================================================================
2048 ////1. Auto Flicker 60Hz Start
2049 //{0x002A, AFC_Default60Hz},
2050 //{0x0F12, 0x0001}, // #AFC_Default60Hz 1: Auto Flicker 60Hz start 0: Auto Flicker 50Hz start
2051 //{0x002A, REG_TC_DBG_AutoAlgEnBits},
2052 //{0x0F12, 0x007F}, // #REG_TC_DBG_AutoAlgEnBits //default : 007F
2054 ////2. Auto Flicker 50Hz Start
2055 //{0x002A, 0xAFC_Default60Hz},
2056 //{0x0F12, 0x0000}, //1: Auto Flicker 60Hz start 0: Auto Flicker 50Hz start
2057 //{0x002A, 0xREG_TC_DBG_AutoAlgEnBits},
2058 //{0x0F12, 0x007F}, //default : 007F
2060 //3. Manual Flicker 60Hz
2061 //{0x002A, 0xREG_TC_DBG_AutoAlgEnBits}, //default : 007F
2063 //{0x002A, 0xREG_SF_USER_FlickerQuant}, //Flicker 50Hz:0001/60Hz:0002/off:0000
2065 //{0x002A, 0xREG_SF_USER_FlickerQuantChanged}, //if change 0001 write
2068 //4. Manual Flicker 50Hz
2069 {0x002A, REG_TC_DBG_AutoAlgEnBits}, //default : 007F
2071 {0x002A, REG_SF_USER_FlickerQuant}, //Flicker 50Hz:0001/60Hz:0002/off:0000
2073 {0x002A, REG_SF_USER_FlickerQuantChanged}, //if change 0001 write
2077 //{0x002A, 0xREG_TC_DBG_AutoAlgEnBits}, //default : 007F
2079 //{0x002A, 0xREG_SF_USER_FlickerQuant}, //Flicker 50Hz:0001/60Hz:0002/off:0000
2081 //{0x002A, 0xREG_SF_USER_FlickerQuantChanged}, //if change 0001 write
2084 //{0x002A, 0xAFC_ManualQuant},
2088 {0x002A,lt_uMaxExp1},
2089 {0x0F12,0xC350}, // #lt_uMaxExp1 : 66.6ms //30fps: 30fps-> 33.3ms->410A
2091 {0x002A,lt_uMaxExp2},
2092 {0x0F12,0x8488}, // #lt_uMaxExp2 : 250ms
2094 {0x002A,lt_uCapMaxExp1},
2095 {0x0F12,0xE848}, // #lt_uCapMaxExp1 : 133.3ms = 0x1045a //edison : 10fps = 100ms=0xc350
2097 {0x002A,lt_uCapMaxExp2},
2098 {0x0F12,0x8488}, // #lt_uCapMaxExp2 : 250ms
2100 {0x002A,lt_uMaxAnGain1},
2101 {0x0F12,0x0280}, //0280 // #lt_uMaxAnGain1 : X 2.51¡§¡§
2102 {0x002A,lt_uMaxAnGain2},
2103 {0x0F12,0x0600}, //0500 // #lt_uMaxAnGain2 : X 6.01¡§¡§
2104 {0x002A,lt_uMaxDigGain},
2105 {0x0F12,0x0100}, //0200 // #lt_uMaxDigGain
2106 //{0x0F12 0007 // #ae_StatMode
2109 {0x002A,0x01b8}, // input=24MHz
2110 {0x0F12,0x5dc0}, // #REG_TC_IPRM_InClockLSBs
2113 {0x002A,0x01c6}, // #REG_TC_IPRM_UseNPviClocks 1 PLL configurations
2115 {0x002A,0x01cc}, // 1st system CLK
2116 {0x0F12,0x0bb8}, //1964 //#REG_TC_IPRM_sysClocks[0]
2117 {0x0F12,0x0bb8}, //#REG_TC_IPRM_MinOutRate4KHz_0
2118 {0x0F12,0x0bb8}, //#REG_TC_IPRM_MaxOutRate4KHz_0
2120 {0x0F12,0x1770}, //#REG_TC_IPRM_sysClocks[1]
2121 {0x0F12,0x1770}, //2ee0 //#REG_TC_IPRM_MinOutRate4KHz_1
2122 {0x0F12,0x1770}, //2ee0 //#REG_TC_IPRM_MaxOutRate4KHz_1
2123 {0x002A,0x01e0}, //#REG_TC_IPRM_InitParamsUpdated
2128 //PREVIEW CONFIGURATION 0 (VGA, YUV, 6.5~12fps)
2130 {0x0F12,0x0280}, //0500 //Width
2131 {0x0F12,0x01e0}, //0400 //Height
2132 {0x0F12,0x0005}, //Format, 5:YUV422
2133 {0x0F12,0x1770}, //MaxOut4KHzRate, 1770 = 24M
2134 {0x0F12,0x1770}, //MinOut4KHzRate, 1770 = 24M
2135 {0x0F12,0x0052}, //PVIMask, default = 42
2136 {0x0F12,0x0001}, //ClockInd, 0-2
2137 {0x0F12,0x0000}, //FrTimeType, 0:Dynamic, 1:Fix for not accuarte, 2:Fix for accuarte
2138 {0x0F12,0x0000}, //FrRateQualityType, 1:Binning enable, 2:Binning disable
2139 {0x0F12,0x0600}, //0535 //04E2 //MaxFrTime, 14d = 33.3ms(333-6500) //7.5FPS
2140 {0x0F12,0x0320}, //03E8 //04E2 //MinFrTime, 14d = 33.3ms(333-6500) //15 FPS
2142 //=================================================================================================
2143 // Set Preview Config 1 --- For Night Mode // 4~12fps
2144 //=================================================================================================
2145 {0x002A, REG_1TC_PCFG_usWidth},
2146 {0x0F12, 0x0280}, // #REG_0TC_PCFG_usWidth
2147 {0x002A, REG_1TC_PCFG_usHeight},
2148 {0x0F12, 0x01e0}, // #REG_0TC_PCFG_usHeight
2149 {0x002A, REG_1TC_PCFG_Format},
2150 {0x0F12, 0x0005}, // #REG_0TC_PCFG_Format : YUV
2151 {0x002A, REG_1TC_PCFG_usMaxOut4KHzRate},
2152 {0x0F12, 0x1770}, // #REG_0TC_PCFG_usMaxOut4KHzRate
2153 {0x002A, REG_1TC_PCFG_usMinOut4KHzRate},
2154 {0x0F12, 0x1770}, // #REG_0TC_PCFG_usMinOut4KHzRate
2155 {0x002A, REG_1TC_PCFG_PVIMask},
2156 {0x0F12, 0x0052}, // #REG_0TC_PCFG_PVIMask (x2: PCLK rising # x0: PCLK Falling)
2157 {0x002A, REG_1TC_PCFG_uClockInd},
2158 {0x0F12, 0x0001}, // #REG_0TC_PCFG_uClockInd
2159 {0x002A, REG_1TC_PCFG_usFrTimeType},
2160 {0x0F12, 0x0000}, // #REG_0TC_PCFG_usFrTimeType
2161 {0x002A, REG_1TC_PCFG_FrRateQualityType},
2162 {0x0F12, 0x0000}, // #REG_0TC_PCFG_FrRateQualityType
2163 {0x002A, REG_1TC_PCFG_usMaxFrTimeMsecMult10},
2164 {0x0F12, 0x0CE4}, //09C4 // 4FPS 029A // #REG_0TC_PCFG_usMaxFrTimeMsecMult10 : 5fps
2165 {0x002A, REG_1TC_PCFG_usMinFrTimeMsecMult10},
2166 {0x0F12, 0x0320}, // // #REG_0TC_PCFG_usMinFrTimeMsecMult10 : 10fps
2167 //WRITE 70000262 0003 // #REG_0TC_PCFG_uPrevMirror
2168 //WRITE 70000264 0003 // #REG_0TC_PCFG_uCaptureMirror
2169 /*lzg@rock-chips.com, FIH:image to be mirrored*/
2170 #if CONFIG_SENSOR_NONE_FLIP_MIRROR
2175 #elif CONFIG_SENSOR_MIRROR
2180 #elif CONFIG_SENSOR_FLIPE
2185 #elif CONFIG_SENSOR_NONE_FLIP_MIRROR
2191 //=================================================================================================
2192 // Set Preview Config 2 --- For Video record(normal) // 12fps
2193 //=================================================================================================
2194 {0x002A, REG_2TC_PCFG_usWidth},
2195 {0x0F12, 0x0280}, // #REG_0TC_PCFG_usWidth
2196 {0x002A, REG_2TC_PCFG_usHeight},
2197 {0x0F12, 0x01e0}, // #REG_0TC_PCFG_usHeight
2198 {0x002A, REG_2TC_PCFG_Format},
2199 {0x0F12, 0x0005}, // #REG_0TC_PCFG_Format : YUV
2200 {0x002A, REG_2TC_PCFG_usMaxOut4KHzRate},
2201 {0x0F12, 0x0BB8}, //1770 // #REG_0TC_PCFG_usMaxOut4KHzRate
2202 {0x002A, REG_2TC_PCFG_usMinOut4KHzRate},
2203 {0x0F12, 0x0BB8}, //1770 // #REG_0TC_PCFG_usMinOut4KHzRate
2204 {0x002A, REG_2TC_PCFG_PVIMask},
2205 {0x0F12, 0x0052}, // #REG_0TC_PCFG_PVIMask (x2: PCLK rising # x0: PCLK Falling)
2206 {0x002A, REG_2TC_PCFG_uClockInd},
2207 {0x0F12, 0x0001}, // #REG_0TC_PCFG_uClockInd
2208 {0x002A, REG_2TC_PCFG_usFrTimeType},
2209 {0x0F12, 0x0002}, //0 // #REG_0TC_PCFG_usFrTimeType
2210 {0x002A, REG_2TC_PCFG_FrRateQualityType},
2211 {0x0F12, 0x0000}, // #REG_0TC_PCFG_FrRateQualityType
2212 {0x002A, REG_2TC_PCFG_usMaxFrTimeMsecMult10},
2213 {0x0F12, 0x0320}, //07D0 //029A // #REG_0TC_PCFG_usMaxFrTimeMsecMult10 : 5fps
2214 {0x002A, REG_2TC_PCFG_usMinFrTimeMsecMult10},
2215 {0x0F12, 0x0000},//0320 //03E8 // #REG_0TC_PCFG_usMinFrTimeMsecMult10 : 10fps
2218 //=================================================================================================
2219 // Set Preview Config 3 --- For Video Record(Night Mode) // 12fps
2220 //=================================================================================================
2221 {0x002A, REG_3TC_PCFG_usWidth},
2222 {0x0F12, 0x0280}, // #REG_0TC_PCFG_usWidth
2223 {0x002A, REG_3TC_PCFG_usHeight},
2224 {0x0F12, 0x01e0}, // #REG_0TC_PCFG_usHeight
2225 {0x002A, REG_3TC_PCFG_Format},
2226 {0x0F12, 0x0005}, // #REG_0TC_PCFG_Format : YUV
2227 {0x002A, REG_3TC_PCFG_usMaxOut4KHzRate},
2228 {0x0F12, 0x0BB8}, //1770 // #REG_0TC_PCFG_usMaxOut4KHzRate
2229 {0x002A, REG_3TC_PCFG_usMinOut4KHzRate},
2230 {0x0F12, 0x0BB8}, //1770 // #REG_0TC_PCFG_usMinOut4KHzRate
2231 {0x002A, REG_3TC_PCFG_PVIMask},
2232 {0x0F12, 0x0052}, // #REG_0TC_PCFG_PVIMask (x2: PCLK rising # x0: PCLK Falling)
2233 {0x002A, REG_3TC_PCFG_uClockInd},
2234 {0x0F12, 0x0001}, // #REG_0TC_PCFG_uClockInd
2235 {0x002A, REG_3TC_PCFG_usFrTimeType},
2236 {0x0F12, 0x0002}, //0 // #REG_0TC_PCFG_usFrTimeType
2237 {0x002A, REG_3TC_PCFG_FrRateQualityType},
2238 {0x0F12, 0x0000}, // #REG_0TC_PCFG_FrRateQualityType
2239 {0x002A, REG_3TC_PCFG_usMaxFrTimeMsecMult10},
2240 {0x0F12, 0x03e8}, //029A // #REG_0TC_PCFG_usMaxFrTimeMsecMult10 : 5fps
2241 {0x002A, REG_3TC_PCFG_usMinFrTimeMsecMult10},
2242 {0x0F12, 0x0000},//0320 //03E8 // #REG_0TC_PCFG_usMinFrTimeMsecMult10 : 10fps
2245 {0x002A,0x021c}, //REG_TC_GP_ActivePrevConfig
2247 {0x002A,0x0220}, //REG_TC_GP_PrevOpenAfterChange
2249 {0x002A,0x01f8}, //REG_TC_GP_NewConfigSync
2251 {0x002A,0x021e}, //REG_TC_GP_PrevConfigChanged
2253 {0x002A,0x01f0}, //REG_TC_GP_EnablePreview
2255 {0x002A,0x01f2}, //REG_TC_GP_EnablePreviewChanged
2259 //=================================================================================================
2260 // Set Capture Config // normal mode
2261 //=================================================================================================
2262 {0x002A,REG_0TC_CCFG_uCaptureMode},
2263 {0x0F12,0x0000}, // #REG_0TC_CCFG_uCaptureMode : AE/AWB off when caputre
2264 {0x002A,REG_0TC_CCFG_usWidth},
2266 {0x002A,REG_0TC_CCFG_usHeight},
2268 {0x002A,REG_0TC_CCFG_Format},
2269 {0x0F12,0x0005}, // #REG_0TC_CCFG_Format : YUV
2270 {0x002A,REG_0TC_CCFG_usMaxOut4KHzRate},
2271 {0x0F12,0x0bb8}, //05DC //0BC8 //1964 //0BB8 // #REG_0TC_CCFG_usMaxOut4KHzRate
2272 {0x002A,REG_0TC_CCFG_usMinOut4KHzRate},
2273 {0x0F12,0x0bb8}, //05DC //0BA8 //1964 //0BB8 // #REG_0TC_CCFG_usMinOut4KHzRate
2274 {0x002A,REG_0TC_CCFG_PVIMask},
2275 {0x0F12,0x0052}, // #REG_0TC_CCFG_PVIMask (x2: PCLK rising # x0: PCLK Falling)
2276 {0x002A,REG_0TC_CCFG_uClockInd},
2277 {0x0F12,0x0000}, // #REG_0TC_CCFG_uClockInd
2278 {0x002A,REG_0TC_CCFG_usFrTimeType},
2279 {0x0F12,0x0002}, //0 // #REG_0TC_CCFG_usFrTimeType
2280 {0x002A,REG_0TC_CCFG_FrRateQualityType},
2281 {0x0F12,0x0002}, // #REG_0TC_CCFG_FrRateQualityType
2282 {0x002A,REG_0TC_CCFG_usMaxFrTimeMsecMult10},
2283 {0x0F12,0x09C4}, //0x09C4 // #REG_0TC_CCFG_usMaxFrTimeMsecMult10 : 4fps
2284 {0x002A,REG_0TC_CCFG_usMinFrTimeMsecMult10},
2285 {0x0F12,0x0000}, //03e8 // #REG_0TC_CCFG_usMinFrTimeMsecMult10 :
2286 {SEQUENCE_END, 0x00}
2292 static struct reginfo sensor_720p[]=
2294 {SEQUENCE_END, 0x00}
2297 static struct reginfo sensor_1080p[]=
2299 {SEQUENCE_END, 0x00}
2303 /* 2592X1944 QSXGA */
2304 static struct reginfo sensor_qsxga[] =
2306 {SEQUENCE_END, 0x00}
2308 /* 2048*1536 QXGA */
2309 static struct reginfo sensor_qxga[] =
2311 {SEQUENCE_END, 0x00}
2314 /* 1600X1200 UXGA */
2315 static struct reginfo sensor_uxga[] =
2317 {SEQUENCE_END, 0x00}
2320 /* 1280X1024 SXGA */
2321 static struct reginfo sensor_sxga[] =
2325 ////0F12 0079 // #REG_TC_DBG_AutoAlgEnBits, default : 007F0028 7000
2327 //0F12 0300 //0220 //0330 // #lt_uMaxAnGain2
2328 {0x002A, REG_TC_GP_ActiveCapConfig},
2330 {0x002A, REG_TC_GP_NewConfigSync},
2332 {0x002A, REG_TC_GP_CapConfigChanged},
2334 {0x002A, REG_TC_GP_EnableCapture},
2336 {0x002A, REG_TC_GP_EnableCaptureChanged},
2338 {SEQUENCE_END, 0x00}
2341 static struct reginfo sensor_xga[] =
2343 {SEQUENCE_END, 0x00}
2347 static struct reginfo sensor_svga[] =
2349 {SEQUENCE_END, 0x0},
2353 static struct reginfo sensor_vga[] =
2356 {0x002A, REG_TC_GP_ActivePrevConfig},
2359 {0x002A, REG_TC_GP_PrevOpenAfterChange},
2361 {0x002A, REG_TC_GP_NewConfigSync},
2363 {0x002A, REG_TC_GP_PrevConfigChanged},
2365 {SEQUENCE_END, 0x0},
2369 static struct reginfo sensor_cif[] =
2371 {SEQUENCE_END, 0x0},
2375 static struct reginfo sensor_qvga[] =
2377 {SEQUENCE_END, 0x0},
2381 static struct reginfo sensor_qcif[] =
2383 {SEQUENCE_END, 0x0},
2388 static struct reginfo s5k6aa_qqvga[] =
2427 {SEQUENCE_END, 0x0},
2432 static struct reginfo s5k6aa_Sharpness_auto[] =
2434 {SEQUENCE_END, 0x00},
2437 static struct reginfo s5k6aa_Sharpness1[] =
2443 static struct reginfo s5k6aa_Sharpness2[][3] =
2450 static struct reginfo s5k6aa_Sharpness3[] =
2456 static struct reginfo s5k6aa_Sharpness4[]=
2463 static struct reginfo s5k6aa_Sharpness5[] =
2471 static struct reginfo sensor_ClrFmt_YUYV[]=
2473 {SEQUENCE_END, 0x00}
2476 static struct reginfo sensor_ClrFmt_UYVY[]=
2478 {SEQUENCE_END, 0x00}
2481 #if CONFIG_SENSOR_WhiteBalance
2482 static struct reginfo sensor_WhiteB_Auto[]=
2484 {SEQUENCE_END, 0x00}
2486 /* Cloudy Colour Temperature : 6500K - 8000K */
2487 static struct reginfo sensor_WhiteB_Cloudy[]=
2489 {SEQUENCE_END, 0x00}
2491 /* ClearDay Colour Temperature : 5000K - 6500K */
2492 static struct reginfo sensor_WhiteB_ClearDay[]=
2494 {SEQUENCE_END, 0x00}
2496 /* Office Colour Temperature : 3500K - 5000K */
2497 static struct reginfo sensor_WhiteB_TungstenLamp1[]=
2499 {SEQUENCE_END, 0x00}
2502 /* Home Colour Temperature : 2500K - 3500K */
2503 static struct reginfo sensor_WhiteB_TungstenLamp2[]=
2505 {SEQUENCE_END, 0x00}
2507 static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,
2508 sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,
2512 #if CONFIG_SENSOR_Brightness
2513 static struct reginfo sensor_Brightness0[]=
2515 {SEQUENCE_END, 0x00}
2518 static struct reginfo sensor_Brightness1[]=
2520 {SEQUENCE_END, 0x00}
2523 static struct reginfo sensor_Brightness2[]=
2525 {SEQUENCE_END, 0x00}
2528 static struct reginfo sensor_Brightness3[]=
2530 {SEQUENCE_END, 0x00}
2533 static struct reginfo sensor_Brightness4[]=
2535 {SEQUENCE_END, 0x00}
2538 static struct reginfo sensor_Brightness5[]=
2540 {SEQUENCE_END, 0x00}
2542 static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,
2543 sensor_Brightness4, sensor_Brightness5,NULL,
2548 #if CONFIG_SENSOR_Effect
2549 static struct reginfo sensor_Effect_Normal[] =
2551 {SEQUENCE_END, 0x00}
2554 static struct reginfo sensor_Effect_WandB[] =
2556 {SEQUENCE_END, 0x00}
2559 static struct reginfo sensor_Effect_Sepia[] =
2561 {SEQUENCE_END, 0x00}
2564 static struct reginfo sensor_Effect_Negative[] =
2566 {SEQUENCE_END, 0x00}
2568 static struct reginfo sensor_Effect_Bluish[] =
2570 {SEQUENCE_END, 0x00}
2573 static struct reginfo sensor_Effect_Green[] =
2575 {SEQUENCE_END, 0x00}
2577 static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
2578 sensor_Effect_Bluish, sensor_Effect_Green,NULL,
2581 #if CONFIG_SENSOR_Exposure
2582 static struct reginfo sensor_Exposure0[]=
2584 {SEQUENCE_END, 0x00}
2587 static struct reginfo sensor_Exposure1[]=
2589 {SEQUENCE_END, 0x00}
2592 static struct reginfo sensor_Exposure2[]=
2594 {SEQUENCE_END, 0x00}
2597 static struct reginfo sensor_Exposure3[]=
2599 {SEQUENCE_END, 0x00}
2602 static struct reginfo sensor_Exposure4[]=
2604 {SEQUENCE_END, 0x00}
2607 static struct reginfo sensor_Exposure5[]=
2609 {SEQUENCE_END, 0x00}
2612 static struct reginfo sensor_Exposure6[]=
2614 {SEQUENCE_END, 0x00}
2617 static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,
2618 sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,
2621 #if CONFIG_SENSOR_Saturation
2622 static struct reginfo sensor_Saturation0[]=
2624 {SEQUENCE_END, 0x00}
2627 static struct reginfo sensor_Saturation1[]=
2629 {SEQUENCE_END, 0x00}
2632 static struct reginfo sensor_Saturation2[]=
2634 {SEQUENCE_END, 0x00}
2636 static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};
2639 #if CONFIG_SENSOR_Contrast
2640 static struct reginfo sensor_Contrast0[]=
2642 {SEQUENCE_END, 0x00}
2645 static struct reginfo sensor_Contrast1[]=
2647 {SEQUENCE_END, 0x00}
2650 static struct reginfo sensor_Contrast2[]=
2652 {SEQUENCE_END, 0x00}
2655 static struct reginfo sensor_Contrast3[]=
2657 {SEQUENCE_END, 0x00}
2660 static struct reginfo sensor_Contrast4[]=
2662 {SEQUENCE_END, 0x00}
2666 static struct reginfo sensor_Contrast5[]=
2668 {SEQUENCE_END, 0x00}
2671 static struct reginfo sensor_Contrast6[]=
2673 {SEQUENCE_END, 0x00}
2675 static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,
2676 sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,
2680 #if CONFIG_SENSOR_Mirror
2681 static struct reginfo sensor_MirrorOn[]=
2683 {SEQUENCE_END, 0x00}
2686 static struct reginfo sensor_MirrorOff[]=
2688 {SEQUENCE_END, 0x00}
2690 static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,};
2692 #if CONFIG_SENSOR_Flip
2693 static struct reginfo sensor_FlipOn[]=
2695 {SEQUENCE_END, 0x00}
2698 static struct reginfo sensor_FlipOff[]=
2700 {SEQUENCE_END, 0x00}
2702 static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,};
2705 #if CONFIG_SENSOR_Scene
2706 static struct reginfo sensor_SceneAuto[] =
2708 {SEQUENCE_END, 0x00}
2711 static struct reginfo sensor_SceneNight[] =
2713 {SEQUENCE_END, 0x00}
2715 static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};
2718 #if CONFIG_SENSOR_DigitalZoom
2719 static struct reginfo sensor_Zoom0[] =
2721 {SEQUENCE_END, 0x0},
2724 static struct reginfo sensor_Zoom1[] =
2726 {SEQUENCE_END, 0x0},
2729 static struct reginfo sensor_Zoom2[] =
2731 {SEQUENCE_END, 0x0},
2735 static struct reginfo sensor_Zoom3[] =
2737 {SEQUENCE_END, 0x0},
2739 static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};
2741 static struct v4l2_querymenu sensor_menus[] =
2743 #if CONFIG_SENSOR_WhiteBalance
2744 { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 0, .name = "auto", .reserved = 0, }, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 1, .name = "incandescent", .reserved = 0,},
2745 { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 2, .name = "fluorescent", .reserved = 0,}, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 3, .name = "daylight", .reserved = 0,},
2746 { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 4, .name = "cloudy-daylight", .reserved = 0,},
2749 #if CONFIG_SENSOR_Effect
2750 { .id = V4L2_CID_EFFECT, .index = 0, .name = "none", .reserved = 0, }, { .id = V4L2_CID_EFFECT, .index = 1, .name = "mono", .reserved = 0,},
2751 { .id = V4L2_CID_EFFECT, .index = 2, .name = "negative", .reserved = 0,}, { .id = V4L2_CID_EFFECT, .index = 3, .name = "sepia", .reserved = 0,},
2752 { .id = V4L2_CID_EFFECT, .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT, .index = 5, .name = "aqua", .reserved = 0,},
2755 #if CONFIG_SENSOR_Scene
2756 { .id = V4L2_CID_SCENE, .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE, .index = 1, .name = "night", .reserved = 0,},
2759 #if CONFIG_SENSOR_Flash
2760 { .id = V4L2_CID_FLASH, .index = 0, .name = "off", .reserved = 0, }, { .id = V4L2_CID_FLASH, .index = 1, .name = "auto", .reserved = 0,},
2761 { .id = V4L2_CID_FLASH, .index = 2, .name = "on", .reserved = 0,}, { .id = V4L2_CID_FLASH, .index = 3, .name = "torch", .reserved = 0,},
2765 static struct v4l2_queryctrl sensor_controls[] =
2767 #if CONFIG_SENSOR_WhiteBalance
2769 .id = V4L2_CID_DO_WHITE_BALANCE,
2770 .type = V4L2_CTRL_TYPE_MENU,
2771 .name = "White Balance Control",
2779 #if CONFIG_SENSOR_Brightness
2781 .id = V4L2_CID_BRIGHTNESS,
2782 .type = V4L2_CTRL_TYPE_INTEGER,
2783 .name = "Brightness Control",
2791 #if CONFIG_SENSOR_Effect
2793 .id = V4L2_CID_EFFECT,
2794 .type = V4L2_CTRL_TYPE_MENU,
2795 .name = "Effect Control",
2803 #if CONFIG_SENSOR_Exposure
2805 .id = V4L2_CID_EXPOSURE,
2806 .type = V4L2_CTRL_TYPE_INTEGER,
2807 .name = "Exposure Control",
2815 #if CONFIG_SENSOR_Saturation
2817 .id = V4L2_CID_SATURATION,
2818 .type = V4L2_CTRL_TYPE_INTEGER,
2819 .name = "Saturation Control",
2827 #if CONFIG_SENSOR_Contrast
2829 .id = V4L2_CID_CONTRAST,
2830 .type = V4L2_CTRL_TYPE_INTEGER,
2831 .name = "Contrast Control",
2839 #if CONFIG_SENSOR_Mirror
2841 .id = V4L2_CID_HFLIP,
2842 .type = V4L2_CTRL_TYPE_BOOLEAN,
2843 .name = "Mirror Control",
2851 #if CONFIG_SENSOR_Flip
2853 .id = V4L2_CID_VFLIP,
2854 .type = V4L2_CTRL_TYPE_BOOLEAN,
2855 .name = "Flip Control",
2863 #if CONFIG_SENSOR_Scene
2865 .id = V4L2_CID_SCENE,
2866 .type = V4L2_CTRL_TYPE_MENU,
2867 .name = "Scene Control",
2875 #if CONFIG_SENSOR_DigitalZoom
2877 .id = V4L2_CID_ZOOM_RELATIVE,
2878 .type = V4L2_CTRL_TYPE_INTEGER,
2879 .name = "DigitalZoom Control",
2885 .id = V4L2_CID_ZOOM_ABSOLUTE,
2886 .type = V4L2_CTRL_TYPE_INTEGER,
2887 .name = "DigitalZoom Control",
2895 #if CONFIG_SENSOR_Focus
2897 .id = V4L2_CID_FOCUS_RELATIVE,
2898 .type = V4L2_CTRL_TYPE_INTEGER,
2899 .name = "Focus Control",
2905 .id = V4L2_CID_FOCUS_ABSOLUTE,
2906 .type = V4L2_CTRL_TYPE_INTEGER,
2907 .name = "Focus Control",
2911 .default_value = 125,
2915 #if CONFIG_SENSOR_Flash
2917 .id = V4L2_CID_FLASH,
2918 .type = V4L2_CTRL_TYPE_MENU,
2919 .name = "Flash Control",
2928 static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did);
2929 static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client);
2930 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
2931 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
2932 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);
2933 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl);
2934 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg);
2935 static int sensor_resume(struct soc_camera_device *icd);
2936 static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);
2937 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);
2938 //static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
2939 //static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);
2940 static int sensor_deactivate(struct i2c_client *client);
2942 static struct soc_camera_ops sensor_ops =
2944 .suspend = sensor_suspend,
2945 .resume = sensor_resume,
2946 .set_bus_param = sensor_set_bus_param,
2947 .query_bus_param = sensor_query_bus_param,
2948 .controls = sensor_controls,
2949 .menus = sensor_menus,
2950 .num_controls = ARRAY_SIZE(sensor_controls),
2951 .num_menus = ARRAY_SIZE(sensor_menus),
2955 /* only one fixed colorspace per pixelcode */
2956 struct sensor_datafmt {
2957 enum v4l2_mbus_pixelcode code;
2958 enum v4l2_colorspace colorspace;
2961 /* Find a data format by a pixel code in an array */
2962 static const struct sensor_datafmt *sensor_find_datafmt(
2963 enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,
2967 for (i = 0; i < n; i++)
2968 if (fmt[i].code == code)
2974 static const struct sensor_datafmt sensor_colour_fmts[] = {
2975 {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG}
2977 enum sensor_work_state
2979 sensor_work_ready = 0,
2984 struct i2c_client *client;
2985 struct delayed_work dwork;
2986 enum sensor_work_state state;
2989 typedef struct sensor_info_priv_s
3003 unsigned char mirror; /* HFLIP */
3004 unsigned char flip; /* VFLIP */
3011 struct reginfo *winseqe_cur_addr;
3012 struct sensor_datafmt fmt;
3013 unsigned int enable;
3014 unsigned int funmodule_state;
3015 } sensor_info_priv_t;
3019 struct sensor_parameter
3021 unsigned short int preview_maxlines;
3022 unsigned short int preview_exposure;
3023 unsigned short int preview_line_width;
3024 unsigned short int preview_gain;
3026 unsigned short int capture_framerate;
3027 unsigned short int preview_framerate;
3032 struct v4l2_subdev subdev;
3033 struct i2c_client *client;
3034 sensor_info_priv_t info_priv;
3035 struct sensor_parameter parameter;
3036 struct workqueue_struct *sensor_wq;
3037 struct sensor_work sensor_wk;
3038 struct mutex wq_lock;
3039 int model; /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */
3040 #if CONFIG_SENSOR_I2C_NOSCHED
3041 atomic_t tasklock_cnt;
3043 struct rk29camera_platform_data *sensor_io_request;
3044 struct rk29camera_gpio_res *sensor_gpio_res;
3047 static struct sensor* to_sensor(const struct i2c_client *client)
3049 return container_of(i2c_get_clientdata(client), struct sensor, subdev);
3052 static int sensor_task_lock(struct i2c_client *client, int lock)
3054 #if CONFIG_SENSOR_I2C_NOSCHED
3056 struct sensor *sensor = to_sensor(client);
3059 if (atomic_read(&sensor->tasklock_cnt) == 0) {
3060 while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) {
3061 SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING());
3065 if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) {
3066 SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING());
3067 goto sensor_task_lock_err;
3072 atomic_add(1, &sensor->tasklock_cnt);
3074 if (atomic_read(&sensor->tasklock_cnt) > 0) {
3075 atomic_sub(1, &sensor->tasklock_cnt);
3077 if (atomic_read(&sensor->tasklock_cnt) == 0)
3082 sensor_task_lock_err:
3090 /* sensor register write */
3091 static int sensor_write(struct i2c_client *client, u16 reg, u16 val)
3095 struct i2c_msg msg[1];
3099 case SEQUENCE_WAIT_MS:
3105 case SEQUENCE_WAIT_US:
3111 case SEQUENCE_PROPERTY:
3118 buf[1] = reg & 0xFF;
3120 buf[3] = val & 0xFF;
3122 msg->addr = client->addr;
3123 msg->flags = client->flags;
3125 msg->len = sizeof(buf);
3126 msg->scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */
3127 msg->read_type = 0; /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */
3132 while ((cnt-- > 0) && (err < 0)) { /* ddl@rock-chips.com : Transfer again if transent is failed */
3133 err = i2c_transfer(client->adapter, msg, 1);
3138 SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val);
3147 /* sensor register read */
3148 static int sensor_read(struct i2c_client *client, u16 reg, u16 *val)
3151 struct i2c_msg msg[2];
3154 buf[0] = (u8)reg >> 8;
3155 buf[1] = (u8)reg & 0xFF;
3157 msg[0].addr = client->addr;
3158 msg[0].flags = client->flags;
3160 msg[0].len = sizeof(buf);
3161 msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */
3162 msg[0].read_type = 2; /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */
3164 msg[1].addr = client->addr;
3165 msg[1].flags = client->flags|I2C_M_RD;
3167 msg[1].len = sizeof(buf);
3168 msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */
3169 msg[1].read_type = 2; /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */
3171 err = i2c_transfer(client->adapter, msg, 2);
3174 *val = (buf[0] << 8)|(buf[1] & 0xFF);
3175 SENSOR_DG("%s read reg(0x%x val:0x%x) success\n",SENSOR_NAME_STRING(),reg,*val);
3178 SENSOR_TR("%s read reg(0x%x) failed!",SENSOR_NAME_STRING(),reg);
3184 /* write a array of registers */
3185 static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)
3189 #if CONFIG_SENSOR_I2C_RDWRCHK
3194 if (sensor_task_lock(client, 1) < 0)
3195 goto sensor_write_array_end;
3196 while (regarray[i].reg != SEQUENCE_END)
3199 err = sensor_write(client, regarray[i].reg, regarray[i].val);
3203 SENSOR_TR("%s..write failed current reg:0x%x, Write array again !\n", SENSOR_NAME_STRING(),regarray[i].reg);
3207 SENSOR_TR("%s..write array failed!!!\n", SENSOR_NAME_STRING());
3209 goto sensor_write_array_end;
3212 #if CONFIG_SENSOR_I2C_RDWRCHK
3213 sensor_read(client, regarray[i].reg, &valchk);
3214 if (valchk != regarray[i].val)
3215 SENSOR_TR("%s Reg:0x%x write(0x%x, 0x%x) fail\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);
3222 sensor_write_array_end:
3223 sensor_task_lock(client,0);
3227 #if CONFIG_SENSOR_I2C_RDWRCHK
3228 static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regarray)
3236 while (regarray[i].reg != SEQUENCE_END)
3238 sensor_read(client, regarray[i].reg, &valchk);
3239 if (valchk != regarray[i].val)
3240 SENSOR_TR("%s Reg:0x%x read(0x%x, 0x%x) error\n",SENSOR_NAME_STRING(), regarray[i].reg, regarray[i].val, valchk);
3247 #if CONFIG_SENSOR_Focus
3249 static int sensor_af_single(struct i2c_client *client)
3254 sensor_af_single_end:
3258 static int sensor_af_const(struct i2c_client *client)
3262 sensor_af_const_end:
3266 static int sensor_af_zoneupdate(struct i2c_client *client)
3270 sensor_af_zoneupdate_end:
3274 static int sensor_af_init(struct i2c_client *client)
3282 static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)
3284 struct soc_camera_link *icl = to_soc_camera_link(icd);
3285 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3286 struct sensor *sensor = to_sensor(client);
3293 if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {
3294 sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Reset, on);
3298 case Sensor_PowerDown:
3300 if (icl->powerdown) {
3301 ret = icl->powerdown(icd->pdev, on);
3302 if (ret == RK29_CAM_IO_SUCCESS) {
3306 icl->reset(icd->pdev);
3308 } else if (ret == RK29_CAM_EIO_REQUESTFAIL) {
3310 goto sensor_power_end;
3317 if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {
3318 sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);
3320 //flash off after 2 secs
3321 hrtimer_cancel(&(flash_off_timer.timer));
3322 hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL);
3329 SENSOR_TR("%s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),cmd);
3337 #if CONFIG_SENSOR_Flash
3338 static enum hrtimer_restart flash_off_func(struct hrtimer *timer){
3339 struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer);
3340 sensor_ioctrl(fps_timer->icd,Sensor_Flash,0);
3341 SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__);
3346 static int sensor_init(struct v4l2_subdev *sd, u32 val)
3348 struct i2c_client *client = v4l2_get_subdevdata(sd);
3349 struct soc_camera_device *icd = client->dev.platform_data;
3350 struct sensor *sensor = to_sensor(client);
3351 const struct v4l2_queryctrl *qctrl;
3352 const struct sensor_datafmt *fmt;
3356 SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
3358 sensor_ioctrl(icd,Sensor_Reset, 1);
3359 if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
3361 goto sensor_INIT_ERR;
3365 sensor_ioctrl(icd,Sensor_Reset, 0);
3368 if (sensor_task_lock(client,1)<0)
3369 goto sensor_INIT_ERR;
3371 #if (SENSOR_RESET_REG != SEQUENCE_END)
3372 ret = sensor_write(client, SENSOR_RESET_REG, SENSOR_RESET_VAL);
3374 SENSOR_TR("%s soft reset sensor failed\n",SENSOR_NAME_STRING());
3376 goto sensor_INIT_ERR;
3379 mdelay(5); //delay 5 microseconds
3382 /* check if it is an sensor sensor */
3383 #if (SENSOR_ID_REG != SEQUENCE_END)
3384 ret = sensor_read(client, SENSOR_ID_REG, &pid);
3386 SENSOR_TR("read chip id failed\n");
3388 goto sensor_INIT_ERR;
3391 SENSOR_DG("\n %s pid = 0x%x \n", SENSOR_NAME_STRING(), pid);
3395 if (pid == SENSOR_ID) {
3396 sensor->model = SENSOR_V4L2_IDENT;
3398 SENSOR_TR("error: %s mismatched pid = 0x%x\n", SENSOR_NAME_STRING(), pid);
3400 goto sensor_INIT_ERR;
3403 ret = sensor_write_array(client, sensor_init_data);
3406 SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
3407 goto sensor_INIT_ERR;
3409 sensor_task_lock(client,0);
3410 sensor->info_priv.winseqe_cur_addr = SENSOR_INIT_WINSEQADR;
3411 fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));
3413 SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());
3415 goto sensor_INIT_ERR;
3417 sensor->info_priv.fmt = *fmt;
3419 /* sensor sensor information for initialization */
3420 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);
3422 sensor->info_priv.whiteBalance = qctrl->default_value;
3423 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS);
3425 sensor->info_priv.brightness = qctrl->default_value;
3426 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);
3428 sensor->info_priv.effect = qctrl->default_value;
3429 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE);
3431 sensor->info_priv.exposure = qctrl->default_value;
3433 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION);
3435 sensor->info_priv.saturation = qctrl->default_value;
3436 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST);
3438 sensor->info_priv.contrast = qctrl->default_value;
3439 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP);
3441 sensor->info_priv.mirror = qctrl->default_value;
3442 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP);
3444 sensor->info_priv.flip = qctrl->default_value;
3445 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE);
3447 sensor->info_priv.scene = qctrl->default_value;
3448 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);
3450 sensor->info_priv.digitalzoom = qctrl->default_value;
3452 /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code */
3453 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);
3455 sensor->info_priv.focus = qctrl->default_value;
3457 #if CONFIG_SENSOR_Flash
3458 qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);
3460 sensor->info_priv.flash = qctrl->default_value;
3462 flash_off_timer.icd = icd;
3463 flash_off_timer.timer.function = flash_off_func;
3466 SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),((val == 0)?__FUNCTION__:"sensor_reinit"),icd->user_width,icd->user_height);
3467 sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;
3470 sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;
3471 sensor_task_lock(client,0);
3472 sensor_deactivate(client);
3476 static int sensor_deactivate(struct i2c_client *client)
3478 struct soc_camera_device *icd = client->dev.platform_data;
3479 struct sensor *sensor = to_sensor(client);
3481 SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);
3483 /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */
3484 //sensor_task_lock(client, 1);
3485 sensor_ioctrl(icd, Sensor_PowerDown, 1);
3488 /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */
3489 icd->user_width = SENSOR_INIT_WIDTH;
3490 icd->user_height = SENSOR_INIT_HEIGHT;
3491 sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;
3496 static struct reginfo sensor_suspend_sequence[]=
3499 {0x002A, setot_usForceClocksSettings},
3501 {0x002A, setot_usConfigClocksSettings},
3503 {0x002A, REG_TC_GP_EnablePreview},
3505 {0x002A, REG_TC_GP_EnablePreviewChanged},
3507 {SEQUENCE_WAIT_MS, 100},
3511 {SEQUENCE_WAIT_MS, 100},
3521 {0x002A, REG_TC_GP_SleepMode},
3523 {0x002A, REG_TC_GP_SleepModeChanged},
3529 static struct reginfo sensor_resume_sequence[]=
3532 {0x002A, REG_TC_GP_SleepMode},
3534 {0x002A, REG_TC_GP_SleepModeChanged},
3541 {SEQUENCE_WAIT_MS, 200},
3548 {SEQUENCE_WAIT_MS, 10},
3550 {0x002A, REG_TC_GP_EnablePreview},
3552 {0x002A, REG_TC_GP_EnablePreviewChanged},
3557 static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)
3560 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3562 if (pm_msg.event == PM_EVENT_SUSPEND) {
3563 SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING());
3564 ret = sensor_write_array(client, sensor_suspend_sequence) ;
3566 SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);
3570 ret = sensor_ioctrl(icd, Sensor_PowerDown, 1);
3572 SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING());
3577 SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING());
3584 static int sensor_resume(struct soc_camera_device *icd)
3587 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3589 ret = sensor_ioctrl(icd, Sensor_PowerDown, 0);
3591 SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING());
3595 ret = sensor_write_array(client, sensor_resume_sequence) ;
3597 SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);
3602 SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING());
3607 static int sensor_set_bus_param(struct soc_camera_device *icd,
3608 unsigned long flags)
3613 static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)
3615 struct soc_camera_link *icl = to_soc_camera_link(icd);
3616 unsigned long flags = SENSOR_BUS_PARAM;
3618 return soc_camera_apply_sensor_flags(icl, flags);
3621 static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
3623 struct i2c_client *client = v4l2_get_subdevdata(sd);
3624 struct soc_camera_device *icd = client->dev.platform_data;
3625 struct sensor *sensor = to_sensor(client);
3627 mf->width = icd->user_width;
3628 mf->height = icd->user_height;
3629 mf->code = sensor->info_priv.fmt.code;
3630 mf->colorspace = sensor->info_priv.fmt.colorspace;
3631 mf->field = V4L2_FIELD_NONE;
3636 static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
3640 if ((mf->width == 1024) && (mf->height == 768)) {
3642 } else if ((mf->width == 1280) && (mf->height == 1024)) {
3644 } else if ((mf->width == 1600) && (mf->height == 1200)) {
3646 } else if ((mf->width == 2048) && (mf->height == 1536)) {
3648 } else if ((mf->width == 2592) && (mf->height == 1944)) {
3653 SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);
3657 static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
3661 if ((mf->width == 1280) && (mf->height == 720)) {
3663 } else if ((mf->width == 1920) && (mf->height == 1080)) {
3668 SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);
3672 static struct reginfo* sensor_fmt_catch(int set_w, int set_h, int *ret_w, int *ret_h)
3674 struct reginfo *winseqe_set_addr = NULL;
3676 if (((set_w <= 176) && (set_h <= 144)) && (sensor_qcif[0].reg!=SEQUENCE_END)) {
3677 winseqe_set_addr = sensor_qcif;
3680 } else if (((set_w <= 320) && (set_h <= 240)) && (sensor_qvga[0].reg!=SEQUENCE_END)) {
3681 winseqe_set_addr = sensor_qvga;
3684 } else if (((set_w <= 352) && (set_h<= 288)) && (sensor_cif[0].reg!=SEQUENCE_END)) {
3685 winseqe_set_addr = sensor_cif;
3688 } else if (((set_w <= 640) && (set_h <= 480)) && (sensor_vga[0].reg!=SEQUENCE_END)) {
3689 winseqe_set_addr = sensor_vga;
3693 #if CONFIG_SENSOR_FOR_CTS
3694 /**lzg@rockchip.com: forbid to preview with resolution 1280*1024*/
3695 else if (((set_w <= 800) && (set_h <= 600)) && (sensor_vga[0].reg!=SEQUENCE_END)) {
3696 winseqe_set_addr = sensor_vga;
3701 else if (((set_w <= 800) && (set_h <= 600)) && (sensor_svga[0].reg!=SEQUENCE_END)) {
3702 winseqe_set_addr = sensor_svga;
3707 else if (((set_w <= 1024) && (set_h <= 768)) && (sensor_xga[0].reg!=SEQUENCE_END)) {
3708 winseqe_set_addr = sensor_xga;
3711 } else if (((set_w <= 1280) && (set_h <= 720)) && (sensor_720p[0].reg!=SEQUENCE_END)) {
3712 winseqe_set_addr = sensor_720p;
3715 } else if (((set_w <= 1280) && (set_h <= 1024)) && (sensor_sxga[0].reg!=SEQUENCE_END)) {
3716 winseqe_set_addr = sensor_sxga;
3719 } else if (((set_w <= 1600) && (set_h <= 1200)) && (sensor_uxga[0].reg!=SEQUENCE_END)) {
3720 winseqe_set_addr = sensor_uxga;
3724 #if CONFIG_SENSOR_FOR_CTS
3725 /**lzg@rockchip.com: forbid to preview with resolution 1280*1024*/
3726 else if (((set_w <= 1920) && (set_h <= 1080)) && (sensor_vga[0].reg!=SEQUENCE_END)) {
3727 winseqe_set_addr = sensor_vga;
3732 else if (((set_w <= 1920) && (set_h <= 1080)) && (sensor_1080p[0].reg!=SEQUENCE_END)) {
3733 winseqe_set_addr = sensor_1080p;
3738 else if (((set_w <= 2048) && (set_h <= 1536)) && (sensor_qxga[0].reg!=SEQUENCE_END)) {
3739 winseqe_set_addr = sensor_qxga;
3742 } else if (((set_w <= 2592) && (set_h <= 1944)) && (sensor_qsxga[0].reg!=SEQUENCE_END)) {
3743 winseqe_set_addr = sensor_qsxga;
3748 return winseqe_set_addr;
3751 static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
3753 struct i2c_client *client = v4l2_get_subdevdata(sd);
3754 const struct sensor_datafmt *fmt;
3755 struct sensor *sensor = to_sensor(client);
3756 struct reginfo *winseqe_set_addr=NULL;
3757 int ret=0, set_w,set_h;
3759 fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
3760 ARRAY_SIZE(sensor_colour_fmts));
3763 goto sensor_s_fmt_end;
3766 if (sensor->info_priv.fmt.code != mf->code) {
3769 case V4L2_MBUS_FMT_YUYV8_2X8:
3771 winseqe_set_addr = sensor_ClrFmt_YUYV;
3774 case V4L2_MBUS_FMT_UYVY8_2X8:
3776 winseqe_set_addr = sensor_ClrFmt_UYVY;
3782 if (winseqe_set_addr != NULL) {
3783 sensor_write_array(client, winseqe_set_addr);
3784 sensor->info_priv.fmt.code = mf->code;
3785 sensor->info_priv.fmt.colorspace= mf->colorspace;
3786 SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);
3788 SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);
3795 winseqe_set_addr = sensor_fmt_catch(set_w, set_h, &set_w, &set_h);
3797 if ((winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) && winseqe_set_addr) {
3798 #if CONFIG_SENSOR_Flash
3799 if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */
3800 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
3801 sensor_ioctrl(icd, Sensor_Flash, Flash_On);
3802 SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());
3804 } else { /* ddl@rock-chips.com : Video */
3805 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
3806 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);
3807 SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());
3811 ret |= sensor_write_array(client, winseqe_set_addr);
3813 SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());
3814 #if CONFIG_SENSOR_Flash
3815 if (sensor_fmt_capturechk(sd,mf) == true) {
3816 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {
3817 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);
3818 SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());
3822 goto sensor_s_fmt_end;
3825 sensor->info_priv.winseqe_cur_addr = (struct reginfo*)winseqe_set_addr;
3828 SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);
3830 SENSOR_TR("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);
3840 static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
3842 struct i2c_client *client = v4l2_get_subdevdata(sd);
3843 struct sensor *sensor = to_sensor(client);
3844 const struct sensor_datafmt *fmt;
3847 fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
3848 ARRAY_SIZE(sensor_colour_fmts));
3850 fmt = &sensor->info_priv.fmt;
3851 mf->code = fmt->code;
3854 if (mf->height > SENSOR_MAX_HEIGHT)
3855 mf->height = SENSOR_MAX_HEIGHT;
3856 else if (mf->height < SENSOR_MIN_HEIGHT)
3857 mf->height = SENSOR_MIN_HEIGHT;
3859 if (mf->width > SENSOR_MAX_WIDTH)
3860 mf->width = SENSOR_MAX_WIDTH;
3861 else if (mf->width < SENSOR_MIN_WIDTH)
3862 mf->width = SENSOR_MIN_WIDTH;
3864 mf->colorspace = fmt->colorspace;
3869 static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)
3871 struct i2c_client *client = v4l2_get_subdevdata(sd);
3873 if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
3876 if (id->match.addr != client->addr)
3879 id->ident = SENSOR_V4L2_IDENT; /* ddl@rock-chips.com : Return s5k6aa identifier */
3884 #if CONFIG_SENSOR_Brightness
3885 static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3887 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3889 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
3891 if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL)
3893 if (sensor_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0)
3895 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
3898 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
3902 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
3906 #if CONFIG_SENSOR_Effect
3907 static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3909 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3911 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
3913 if (sensor_EffectSeqe[value - qctrl->minimum] != NULL)
3915 if (sensor_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0)
3917 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
3920 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
3924 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
3928 #if CONFIG_SENSOR_Exposure
3929 static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3931 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3933 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
3935 if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL)
3937 if (sensor_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0)
3939 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
3942 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
3946 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
3950 #if CONFIG_SENSOR_Saturation
3951 static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3953 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3955 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
3957 if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL)
3959 if (sensor_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0)
3961 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
3964 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
3968 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
3972 #if CONFIG_SENSOR_Contrast
3973 static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3975 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3977 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
3979 if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL)
3981 if (sensor_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0)
3983 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
3986 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
3990 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
3994 #if CONFIG_SENSOR_Mirror
3995 static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
3997 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
3999 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
4001 if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL)
4003 if (sensor_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0)
4005 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
4008 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
4012 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
4016 #if CONFIG_SENSOR_Flip
4017 static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
4019 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4021 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
4023 if (sensor_FlipSeqe[value - qctrl->minimum] != NULL)
4025 if (sensor_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0)
4027 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
4030 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
4034 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
4038 #if CONFIG_SENSOR_Scene
4039 static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
4041 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4043 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
4045 if (sensor_SceneSeqe[value - qctrl->minimum] != NULL)
4047 if (sensor_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0)
4049 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
4052 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
4056 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
4060 #if CONFIG_SENSOR_WhiteBalance
4061 static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
4063 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4065 if ((value >= qctrl->minimum) && (value <= qctrl->maximum))
4067 if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL)
4069 if (sensor_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0)
4071 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
4074 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
4078 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
4082 #if CONFIG_SENSOR_DigitalZoom
4083 static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)
4085 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4086 struct sensor *sensor = to_sensor(client);
4087 const struct v4l2_queryctrl *qctrl_info;
4088 int digitalzoom_cur, digitalzoom_total;
4090 qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);
4094 digitalzoom_cur = sensor->info_priv.digitalzoom;
4095 digitalzoom_total = qctrl_info->maximum;
4097 if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total))
4099 SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);
4103 if ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum))
4105 SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);
4109 if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total))
4111 *value = digitalzoom_total - digitalzoom_cur;
4114 if ((*value < 0) && ((digitalzoom_cur + *value) < 0))
4116 *value = 0 - digitalzoom_cur;
4119 digitalzoom_cur += *value;
4121 if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)
4123 if (sensor_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0)
4125 SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);
4128 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value);
4135 #if CONFIG_SENSOR_Flash
4136 static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
4138 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4139 struct sensor *sensor = to_sensor(client);
4140 const struct v4l2_queryctrl *qctrl_info;
4142 if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {
4143 if (value == 3) { /* ddl@rock-chips.com: torch */
4144 sensor_ioctrl(icd, Sensor_Flash, Flash_Torch); /* Flash On */
4146 sensor_ioctrl(icd, Sensor_Flash, Flash_Off);
4148 SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
4152 SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
4156 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
4158 struct i2c_client *client = v4l2_get_subdevdata(sd);
4159 struct sensor *sensor = to_sensor(client);
4160 const struct v4l2_queryctrl *qctrl;
4162 qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);
4166 SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
4172 case V4L2_CID_BRIGHTNESS:
4174 ctrl->value = sensor->info_priv.brightness;
4177 case V4L2_CID_SATURATION:
4179 ctrl->value = sensor->info_priv.saturation;
4182 case V4L2_CID_CONTRAST:
4184 ctrl->value = sensor->info_priv.contrast;
4187 case V4L2_CID_DO_WHITE_BALANCE:
4189 ctrl->value = sensor->info_priv.whiteBalance;
4192 case V4L2_CID_EXPOSURE:
4194 ctrl->value = sensor->info_priv.exposure;
4197 case V4L2_CID_HFLIP:
4199 ctrl->value = sensor->info_priv.mirror;
4202 case V4L2_CID_VFLIP:
4204 ctrl->value = sensor->info_priv.flip;
4215 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
4217 struct i2c_client *client = v4l2_get_subdevdata(sd);
4218 struct sensor *sensor = to_sensor(client);
4219 struct soc_camera_device *icd = client->dev.platform_data;
4220 const struct v4l2_queryctrl *qctrl;
4223 qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);
4227 SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
4233 #if CONFIG_SENSOR_Brightness
4234 case V4L2_CID_BRIGHTNESS:
4236 if (ctrl->value != sensor->info_priv.brightness)
4238 if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0)
4242 sensor->info_priv.brightness = ctrl->value;
4247 #if CONFIG_SENSOR_Exposure
4248 case V4L2_CID_EXPOSURE:
4250 if (ctrl->value != sensor->info_priv.exposure)
4252 if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0)
4256 sensor->info_priv.exposure = ctrl->value;
4261 #if CONFIG_SENSOR_Saturation
4262 case V4L2_CID_SATURATION:
4264 if (ctrl->value != sensor->info_priv.saturation)
4266 if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0)
4270 sensor->info_priv.saturation = ctrl->value;
4275 #if CONFIG_SENSOR_Contrast
4276 case V4L2_CID_CONTRAST:
4278 if (ctrl->value != sensor->info_priv.contrast)
4280 if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0)
4284 sensor->info_priv.contrast = ctrl->value;
4289 #if CONFIG_SENSOR_WhiteBalance
4290 case V4L2_CID_DO_WHITE_BALANCE:
4292 if (ctrl->value != sensor->info_priv.whiteBalance)
4294 if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0)
4298 sensor->info_priv.whiteBalance = ctrl->value;
4303 #if CONFIG_SENSOR_Mirror
4304 case V4L2_CID_HFLIP:
4306 if (ctrl->value != sensor->info_priv.mirror)
4308 if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0)
4310 sensor->info_priv.mirror = ctrl->value;
4315 #if CONFIG_SENSOR_Flip
4316 case V4L2_CID_VFLIP:
4318 if (ctrl->value != sensor->info_priv.flip)
4320 if (sensor_set_flip(icd, qctrl,ctrl->value) != 0)
4322 sensor->info_priv.flip = ctrl->value;
4333 static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl)
4335 const struct v4l2_queryctrl *qctrl;
4336 struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4337 struct sensor *sensor = to_sensor(client);
4339 qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);
4343 SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
4347 switch (ext_ctrl->id)
4349 case V4L2_CID_SCENE:
4351 ext_ctrl->value = sensor->info_priv.scene;
4354 case V4L2_CID_EFFECT:
4356 ext_ctrl->value = sensor->info_priv.effect;
4359 case V4L2_CID_ZOOM_ABSOLUTE:
4361 ext_ctrl->value = sensor->info_priv.digitalzoom;
4364 case V4L2_CID_ZOOM_RELATIVE:
4368 case V4L2_CID_FOCUS_ABSOLUTE:
4370 ext_ctrl->value = sensor->info_priv.focus;
4373 case V4L2_CID_FOCUS_RELATIVE:
4377 case V4L2_CID_FLASH:
4379 ext_ctrl->value = sensor->info_priv.flash;
4387 static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)
4389 const struct v4l2_queryctrl *qctrl;
4390 //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
4391 //struct sensor *sensor = to_sensor(client);
4394 qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);
4398 SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
4403 switch (ext_ctrl->id)
4405 #if CONFIG_SENSOR_Scene
4406 case V4L2_CID_SCENE:
4408 if (ext_ctrl->value != sensor->info_priv.scene)
4410 if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0)
4412 sensor->info_priv.scene = ext_ctrl->value;
4417 #if CONFIG_SENSOR_Effect
4418 case V4L2_CID_EFFECT:
4420 if (ext_ctrl->value != sensor->info_priv.effect)
4422 if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0)
4424 sensor->info_priv.effect= ext_ctrl->value;
4429 #if CONFIG_SENSOR_DigitalZoom
4430 case V4L2_CID_ZOOM_ABSOLUTE:
4432 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))
4435 if (ext_ctrl->value != sensor->info_priv.digitalzoom)
4437 val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom;
4439 if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0)
4441 sensor->info_priv.digitalzoom += val_offset;
4443 SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);
4448 case V4L2_CID_ZOOM_RELATIVE:
4450 if (ext_ctrl->value)
4452 if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0)
4454 sensor->info_priv.digitalzoom += ext_ctrl->value;
4456 SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);
4461 #if CONFIG_SENSOR_Focus
4462 case V4L2_CID_FOCUS_ABSOLUTE:
4464 if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))
4467 if (ext_ctrl->value != sensor->info_priv.focus)
4469 val_offset = ext_ctrl->value -sensor->info_priv.focus;
4471 sensor->info_priv.focus += val_offset;
4476 case V4L2_CID_FOCUS_RELATIVE:
4478 if (ext_ctrl->value)
4480 sensor->info_priv.focus += ext_ctrl->value;
4482 SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);
4487 #if CONFIG_SENSOR_Flash
4488 case V4L2_CID_FLASH:
4490 if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0)
4492 sensor->info_priv.flash = ext_ctrl->value;
4494 SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash);
4505 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)
4507 struct i2c_client *client = v4l2_get_subdevdata(sd);
4508 struct soc_camera_device *icd = client->dev.platform_data;
4509 int i, error_cnt=0, error_idx=-1;
4512 for (i=0; i<ext_ctrl->count; i++) {
4513 if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) {
4520 error_idx = ext_ctrl->count;
4522 if (error_idx != -1) {
4523 ext_ctrl->error_idx = error_idx;
4530 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)
4532 struct i2c_client *client = v4l2_get_subdevdata(sd);
4533 struct soc_camera_device *icd = client->dev.platform_data;
4534 int i, error_cnt=0, error_idx=-1;
4537 for (i=0; i<ext_ctrl->count; i++) {
4538 if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {
4545 error_idx = ext_ctrl->count;
4547 if (error_idx != -1) {
4548 ext_ctrl->error_idx = error_idx;
4554 static int sensor_s_stream(struct v4l2_subdev *sd, int enable)
4556 struct i2c_client *client = v4l2_get_subdevdata(sd);
4557 struct sensor *sensor = to_sensor(client);
4560 sensor->info_priv.enable = 1;
4561 } else if (enable == 0) {
4562 sensor->info_priv.enable = 0;
4567 /* Interface active, can use i2c. If it fails, it can indeed mean, that
4568 * this wasn't our capture interface, so, we wait for the right one */
4569 static int sensor_video_probe(struct soc_camera_device *icd,
4570 struct i2c_client *client)
4573 struct sensor *sensor = to_sensor(client);
4575 /* We must have a parent by now. And it cannot be a wrong one.
4576 * So this entire test is completely redundant. */
4577 if (!icd->dev.parent ||
4578 to_soc_camera_host(icd->dev.parent)->nr != icd->iface)
4581 if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
4583 goto sensor_video_probe_err;
4587 #if (SENSOR_RESET_REG != SEQUENCE_END)
4588 ret = sensor_write(client, SENSOR_RESET_REG, SENSOR_RESET_VAL);
4590 SENSOR_TR("%s soft reset sensor failed\n",SENSOR_NAME_STRING());
4592 goto sensor_video_probe_err;
4595 mdelay(5); //delay 5 microseconds
4598 /* check if it is an sensor sensor */
4599 #if (SENSOR_ID_REG != SEQUENCE_END)
4600 ret = sensor_read(client, SENSOR_ID_REG, &pid);
4602 SENSOR_TR("read chip id failed\n");
4604 goto sensor_video_probe_err;
4607 SENSOR_DG("\n %s pid = 0x%x \n", SENSOR_NAME_STRING(), pid);
4612 if (pid == SENSOR_ID) {
4613 sensor->model = SENSOR_V4L2_IDENT;
4615 SENSOR_TR("error: %s mismatched pid = 0x%x\n", SENSOR_NAME_STRING(), pid);
4617 goto sensor_video_probe_err;
4622 sensor_video_probe_err:
4626 static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
4628 struct i2c_client *client = v4l2_get_subdevdata(sd);
4629 struct soc_camera_device *icd = client->dev.platform_data;
4630 struct sensor *sensor = to_sensor(client);
4632 #if CONFIG_SENSOR_Flash
4636 SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
4639 case RK29_CAM_SUBDEV_DEACTIVATE:
4641 sensor_deactivate(client);
4644 case RK29_CAM_SUBDEV_IOREQUEST:
4646 sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
4647 if (sensor->sensor_io_request != NULL) {
4648 if (sensor->sensor_io_request->gpio_res[0].dev_name &&
4649 (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) {
4650 sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[0];
4651 } else if (sensor->sensor_io_request->gpio_res[1].dev_name &&
4652 (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) {
4653 sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[1];
4656 SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
4658 goto sensor_ioctl_end;
4660 /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control
4662 #if CONFIG_SENSOR_Flash
4663 if (sensor->sensor_gpio_res) {
4664 if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {
4665 for (i = 0; i < icd->ops->num_controls; i++) {
4666 if (V4L2_CID_FLASH == icd->ops->controls[i].id) {
4667 //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));
4668 sensor_controls[i].id=0xffff;
4671 sensor->info_priv.flash = 0xff;
4672 SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());
4673 }else{ //two cameras are the same,need to deal diffrently ,zyc
4674 for (i = 0; i < icd->ops->num_controls; i++) {
4675 if(0xffff == icd->ops->controls[i].id){
4676 sensor_controls[i].id=V4L2_CID_FLASH;
4686 SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
4694 static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
4695 enum v4l2_mbus_pixelcode *code)
4697 if (index >= ARRAY_SIZE(sensor_colour_fmts))
4700 *code = sensor_colour_fmts[index].code;
4703 static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
4704 .init = sensor_init,
4705 .g_ctrl = sensor_g_control,
4706 .s_ctrl = sensor_s_control,
4707 .g_ext_ctrls = sensor_g_ext_controls,
4708 .s_ext_ctrls = sensor_s_ext_controls,
4709 .g_chip_ident = sensor_g_chip_ident,
4710 .ioctl = sensor_ioctl,
4713 static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
4714 .s_mbus_fmt = sensor_s_fmt,
4715 .g_mbus_fmt = sensor_g_fmt,
4716 .try_mbus_fmt = sensor_try_fmt,
4717 .enum_mbus_fmt = sensor_enum_fmt,
4718 .s_stream = sensor_s_stream,
4720 static struct v4l2_subdev_ops sensor_subdev_ops = {
4721 .core = &sensor_subdev_core_ops,
4722 .video = &sensor_subdev_video_ops,
4725 static int sensor_probe(struct i2c_client *client,
4726 const struct i2c_device_id *did)
4728 struct sensor *sensor;
4729 struct soc_camera_device *icd = client->dev.platform_data;
4730 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
4731 struct soc_camera_link *icl;
4734 SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__);
4736 dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());
4740 icl = to_soc_camera_link(icd);
4742 dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING());
4746 if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
4747 dev_warn(&adapter->dev,
4748 "I2C-Adapter doesn't support I2C_FUNC_I2C\n");
4752 sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL);
4756 v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops);
4758 /* Second stage probe - when a capture adapter is there */
4759 icd->ops = &sensor_ops;
4760 sensor->info_priv.fmt = sensor_colour_fmts[0];
4762 ret = sensor_video_probe(icd, client);
4765 i2c_set_clientdata(client, NULL);
4768 hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);
4769 SENSOR_DG("\n%s..%s..%d ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);
4773 static int sensor_remove(struct i2c_client *client)
4775 struct sensor *sensor = to_sensor(client);
4776 struct soc_camera_device *icd = client->dev.platform_data;
4779 i2c_set_clientdata(client, NULL);
4780 client->driver = NULL;
4786 static const struct i2c_device_id sensor_id[] = {
4787 {SENSOR_NAME_STRING(), 0 },
4790 MODULE_DEVICE_TABLE(i2c, sensor_id);
4792 static struct i2c_driver sensor_i2c_driver = {
4794 .name = SENSOR_NAME_STRING(),
4796 .probe = sensor_probe,
4797 .remove = sensor_remove,
4798 .id_table = sensor_id,
4801 static int __init sensor_mod_init(void)
4803 SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());
4804 return i2c_add_driver(&sensor_i2c_driver);
4807 static void __exit sensor_mod_exit(void)
4809 i2c_del_driver(&sensor_i2c_driver);
4812 device_initcall_sync(sensor_mod_init);
4813 module_exit(sensor_mod_exit);
4815 MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));
4816 MODULE_AUTHOR("ddl <kernel@rock-chips>");
4817 MODULE_LICENSE("GPL");