#include <media/v4l2-common.h>\r
#include <media/v4l2-chip-ident.h>\r
#include <media/soc_camera.h>\r
-#include <mach/rk29_camera.h>\r
+#include <plat/rk_camera.h>\r
\r
static int debug;\r
module_param(debug, int, S_IRUGO|S_IWUSR);\r
#define SENSOR_MIN_HEIGHT 144\r
#define SENSOR_MAX_WIDTH 1600\r
#define SENSOR_MAX_HEIGHT 1200\r
-#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */\r
-#define SENSOR_INIT_HEIGHT 480\r
-#define SENSOR_INIT_WINSEQADR sensor_vga\r
+#define SENSOR_INIT_WIDTH 800 /* Sensor pixel size for sensor_init_data array */\r
+#define SENSOR_INIT_HEIGHT 600\r
+#define SENSOR_INIT_WINSEQADR sensor_svga\r
#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8\r
\r
#define CONFIG_SENSOR_WhiteBalance 1\r
#define CONFIG_SENSOR_DigitalZoom 0\r
#define CONFIG_SENSOR_Focus 0\r
#define CONFIG_SENSOR_Exposure 0\r
-#define CONFIG_SENSOR_Flash 0\r
+#define CONFIG_SENSOR_Flash 1\r
#define CONFIG_SENSOR_Mirror 0\r
#define CONFIG_SENSOR_Flip 0\r
\r
#define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
#define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
\r
-#define SENSOR_AF_IS_ERR (0x00<<0)
-#define SENSOR_AF_IS_OK (0x01<<0)
-#define SENSOR_INIT_IS_ERR (0x00<<28)
+#define SENSOR_AF_IS_ERR (0x00<<0)\r
+#define SENSOR_AF_IS_OK (0x01<<0)\r
+#define SENSOR_INIT_IS_ERR (0x00<<28)\r
#define SENSOR_INIT_IS_OK (0x01<<28)\r
\r
struct reginfo\r
u8 val;\r
};\r
\r
+//flash off in fixed time to prevent from too hot , zyc\r
+struct flash_timer{\r
+ struct soc_camera_device *icd;\r
+ struct hrtimer timer;\r
+};\r
+static enum hrtimer_restart flash_off_func(struct hrtimer *timer);\r
+\r
+static struct flash_timer flash_off_timer;\r
+//for user defined if user want to customize the series , zyc\r
+#ifdef CONFIG_SID130B_USER_DEFINED_SERIES\r
+#include "sid130B_user_series.c"\r
+#else\r
/* init 352X288 SVGA */\r
static struct reginfo sensor_init_data[] =\r
{\r
- {0x00, 0x00}, \r
+#if 0\r
+ {0x00, 0x00}, \r
{0x04, 0x00}, //Group A 0x10\r
{0x05, 0x0F}, //UXGA Output\r
{0x06, 0x86}, \r
{0x00, 0x02}, \r
{0x10, 0xd3}, \r
{0xff, 0xff}, \r
+#else\r
+\r
+ {0x00, 0x00}, \r
+ {0x04, 0x00}, //Group A 0x10\r
+ {0x05, 0x0F}, //UXGA Output\r
+ {0x06, 0x86}, \r
+ {0x07, 0x08}, \r
+\r
+\r
+ {0x08, 0xa2}, //PLL on\r
+ {0x09, 0x12}, \r
+ {0x0A, 0x12}, \r
+ {0x10, 0x13},//17}, \r
+ {0x11, 0x01}, \r
+ {0x12, 0x8A}, \r
+\r
+ {0x13, 0x1a},//16}, \r
+ {0x15, 0x22},//16}, \r
+ {0x14, 0x27},//16}, \r
+ {0x17, 0xcb},//CF}, \r
+ {0x18, 0x38},//34}, \r
+ {0x41, 0x17}, \r
+ {0x42, 0x52}, \r
+ \r
+ //Flicker - 50Hz - Still mode \r
+ {0x00, 0x00}, \r
+ {0x20, 0x00}, \r
+ {0x21, 0x02}, \r
+ {0x23, 0x29},//15}, \r
+ {0x00, 0x01}, \r
+ {0x35, 0x50},//3c}, \r
\r
+ //Flicker - 50Hz - Preview mode 24MHz MCLK\r
+ {0x00, 0x00}, \r
+ {0x24, 0x00}, \r
+ {0x25, 0xe6},//10}, \r
+ {0x27, 0x0d},//4b}, \r
+ {0x00, 0x01}, \r
+ {0x34, 0x80},//64}, \r
+ \r
+ //AE Block \r
+ {0x00, 0x01}, \r
+ {0x10, 0x80}, \r
+ {0x11, 0x0A}, \r
+ {0x12, 0x74}, \r
+ {0x13, 0x74}, \r
+ {0x14, 0x70}, \r
+ {0x17, 0xC4}, \r
+ {0x1c, 0x02}, \r
+ \r
+ {0x19, 0x00},//0x\r
+ {0x1A, 0x00},//0x\r
+ {0x1c, 0x02}, \r
+ \r
+ {0x36, 0x26}, \r
+ \r
+ {0x40, 0x40}, //M\r
+#if 0 \r
+ {0x41, 0x28}, \r
+ {0x42, 0x28}, \r
+ {0x43, 0x08}, \r
+ {0x44, 0x08}, \r
+ {0x45, 0x09}, \r
+ {0x46, 0x17}, \r
+ {0x47, 0x1D}, \r
+ {0x48, 0x21}, \r
+ {0x49, 0x23}, \r
+ {0x4A, 0x24}, \r
+ {0x4B, 0x26}, \r
+ {0x4C, 0x27}, \r
+ {0x4D, 0x27}, \r
+ {0x4E, 0x1A}, \r
+ {0x4F, 0x14}, \r
+ {0x50, 0x11}, \r
+ {0x51, 0x0F}, \r
+ {0x52, 0x0D}, \r
+ {0x53, 0x0C}, \r
+ {0x54, 0x0A}, \r
+ {0x55, 0x09}, \r
+#else \r
+ {0x41, 0x20}, \r
+ {0x42, 0x20}, \r
+ {0x43, 0x00}, \r
+ {0x44, 0x00}, \r
+ {0x45, 0x01}, \r
+ {0x46, 0x0c}, \r
+ {0x47, 0x11}, \r
+ {0x48, 0x15}, \r
+ {0x49, 0x17}, \r
+ {0x4A, 0x1a}, \r
+ {0x4B, 0x1c}, \r
+ {0x4C, 0x1e}, \r
+ {0x4D, 0x1e}, \r
+ {0x4E, 0x0f}, \r
+ {0x4F, 0x09}, \r
+ {0x50, 0x07}, \r
+ {0x51, 0x05}, \r
+ {0x52, 0x04}, \r
+ {0x53, 0x03}, \r
+ {0x54, 0x02}, \r
+ {0x55, 0x01}, \r
+ {0x60, 0x7e}, \r
+ {0x61, 0xff}, \r
+ {0x62, 0xff}, \r
+ {0x63, 0xff}, \r
+ {0x64, 0xff}, \r
+ {0x65, 0x7e}, \r
+ {0x66, 0x50}, \r
+ {0x67, 0x50}, \r
+ {0x68, 0x50}, \r
+ {0x69, 0x50}, \r
+ {0x6A, 0x50}, \r
+ {0x6B, 0x00}, \r
+ {0x6C, 0x06}, \r
+ {0x9a, 0x80},\r
+ {0x6b, 0x80},\r
+\r
+\r
+#endif \r
+ \r
+ //AWB Block \r
+ {0x00, 0x02}, \r
+ {0x10, 0xD3}, \r
+ {0x11, 0x11}, \r
+ {0x13, 0x80}, \r
+ {0x14, 0x80}, \r
+ {0x15, 0xE0},//FE}, \r
+ {0x16, 0x88}, \r
+ {0x17, 0xD0}, \r
+ {0x18, 0x78}, \r
+ {0x19, 0x98}, \r
+ {0x1A, 0x68}, \r
+ {0x1B, 0x8d}, \r
+ {0x1C, 0x68}, \r
+ {0x1D, 0x8C}, \r
+ {0x1E, 0x74}, \r
+ {0x20, 0xF0}, \r
+ {0x21, 0x70}, \r
+ {0x22, 0xa8}, \r
+ {0x23, 0x10}, \r
+ {0x25, 0x20}, \r
+ {0x26, 0x05}, \r
+ {0x27, 0x63}, \r
+ {0x28, 0x63}, \r
+ {0x29, 0xA0}, \r
+ {0x2A, 0x89}, \r
+ {0x30, 0x00}, \r
+ {0x31, 0x10}, \r
+ {0x32, 0x00}, \r
+ {0x33, 0x10}, \r
+ {0x34, 0x06}, \r
+ {0x35, 0x30}, \r
+ {0x36, 0x04}, \r
+ {0x37, 0xA0}, \r
+ {0x40, 0x01}, \r
+ {0x41, 0x04}, \r
+ {0x42, 0x08}, \r
+ {0x43, 0x10}, \r
+ {0x44, 0x13}, \r
+ {0x45, 0x6B}, \r
+ {0x46, 0x82}, \r
+ {0x52, 0x82}, \r
+ \r
+\r
+\r
+ //CMA change -D65~A \r
+ {0x53, 0x86}, //A\r
+ {0x54, 0xA0}, //A\r
+ {0x55, 0x88}, //A\r
+ {0x56, 0x9F}, //A\r
+ {0x57, 0xA5}, //A\r
+ {0x58, 0x89}, //A\r
+ {0x59, 0xA6}, //A\r
+ {0x5A, 0x87}, //A\r
+ \r
+ {0x64, 0x00}, //T\r
+ {0x65, 0x00}, \r
+ {0x66, 0x00}, //T\r
+ {0x67, 0x00}, \r
+ {0x68, 0xA5}, //T\r
+ {0x69, 0xB4}, \r
+ {0x6A, 0xB3}, //T\r
+ {0x6B, 0xAC}, \r
+ {0x6C, 0xB7}, //T\r
+ {0x6D, 0x98}, \r
+ {0x6E, 0xBA}, //T\r
+ {0x6F, 0x90}, \r
+ {0x70, 0xBF}, //T\r
+ {0x71, 0x9B}, \r
+ {0x72, 0xCE}, //T\r
+ {0x73, 0x8C}, \r
+\r
+ \r
+ //IDP\r
+ \r
+\r
+ {0x74, 0x7F}, //T\r
+ {0x75, 0x8C}, //T\r
+ {0x76, 0xAD}, //T\r
+ {0x77, 0xBA}, //T\r
+ {0x78, 0x8F}, //T\r
+ {0x79, 0x9A}, //T\r
+ {0x7A, 0xA3}, //T\r
+ {0x7B, 0xAC}, //T\r
+ {0x7C, 0xA0}, //T\r
+ {0x7D, 0xA9}, //T\r
+ {0x7E, 0x95}, //T\r
+ {0x7F, 0xAC}, //T\r
+ {0x80, 0xAD}, //T\r
+ {0x81, 0xBC}, //T\r
+ {0x82, 0x98}, //T\r
+ {0x83, 0xA4}, //T\r
+ {0x84, 0x00}, //T\r
+ {0x85, 0x00}, //T\r
+ {0x86, 0x00}, //T\r
+ {0x87, 0x00}, //T\r
+ {0x88, 0xC9}, //T\r
+ {0x89, 0xD5}, //T\r
+ {0x8A, 0x70}, //T\r
+ {0x8B, 0x7B}, //T\r
+ {0x8C, 0xD0}, //T\r
+ {0x8D, 0xE5}, //T\r
+ {0x8E, 0x58}, //T\r
+ {0x8F, 0x70}, //T\r
+ \r
+ {0xB4, 0x05}, \r
+ {0xB5, 0x0F}, \r
+ {0xB6, 0x06}, \r
+ {0xB7, 0x06}, \r
+ {0xB8, 0x40}, \r
+ {0xB9, 0x10}, \r
+ {0xBA, 0x06}, \r
+ \r
+ //IDP \r
+ {0x00, 0x03}, \r
+ {0x10, 0xFF}, \r
+ {0x11, 0x1D}, \r
+ {0x12, 0x1D}, \r
+ {0x13, 0xFB}, \r
+ {0x14, 0x00}, \r
+ {0x15, 0xc0}, \r
+ \r
+ //DPC \r
+ {0x30, 0x88}, //D\r
+ {0x31, 0x14},//04}, //D\r
+ {0x32, 0x10}, //D\r
+ {0x33, 0x0C}, //D\r
+ {0x34, 0x08}, //D\r
+ {0x35, 0x04}, //D\r
+ {0x36, 0x44}, //D\r
+ {0x37, 0x66}, //D\r
+ {0x38, 0x00}, //0\r
+ {0x39, 0x08}, //0\r
+ {0x3A, 0x08}, //0\r
+ {0x3B, 0x20}, //0\r
+ {0x3C, 0x20}, // \r
+ {0x3D, 0x04}, //N\r
+ {0x3E, 0x08}, //N\r
+ {0x3F, 0x10}, //N\r
+ {0x40, 0x10}, //N\r
+ {0x41, 0x20}, //N\r
+ {0x42, 0xFF}, //N\r
+ {0x43, 0x40},//F0}, //N\r
+ {0x44, 0x40}, //B\r
+ {0x45, 0x06},//09}, //S\r
+ {0x46, 0x40}, //S\r
+ {0x47, 0x30}, //I\r
+\r
+ //DPC\r
+ #if 0 \r
+ //Shading \r
+ {0x50, 0x24}, //R\r
+ {0x51, 0x44}, //R\r
+ {0x52, 0x20}, //R\r
+ {0x53, 0x30}, //R\r
+ \r
+ {0x54, 0x20}, //G\r
+ {0x55, 0x20}, //G\r
+ {0x56, 0x00}, //G\r
+ {0x57, 0x10}, //G\r
+ \r
+ {0x58, 0x20}, //G\r
+ {0x59, 0x20}, //G\r
+ {0x5A, 0x00}, //G\r
+ {0x5B, 0x10}, //G\r
+ \r
+ {0x5C, 0x34}, //B\r
+ {0x5D, 0x48}, //B\r
+ {0x5E, 0x18}, //B\r
+ {0x5F, 0x2a}, //B\r
+ \r
+ {0x60, 0x32}, //#\r
+ {0x61, 0x00}, //#\r
+ {0x62, 0x67}, //#\r
+ \r
+ {0x6B, 0x23}, \r
+ {0x6C, 0x44}, \r
+ {0x6D, 0x45}, \r
+ {0x6E, 0x67}, \r
+ {0x6F, 0x8a}, \r
+ {0x70, 0x89}, \r
+ \r
+ {0x71, 0x34}, \r
+ {0x72, 0x45}, \r
+ {0x73, 0x56}, \r
+ {0x74, 0x77}, \r
+ {0x75, 0x78}, \r
+ {0x76, 0x89}, \r
+\r
+ {0x77, 0x34}, \r
+ {0x78, 0x45}, \r
+ {0x79, 0x56}, \r
+ {0x7A, 0x77}, \r
+ {0x7B, 0x78}, \r
+ {0x7C, 0x89}, \r
+\r
+ {0x7D, 0x22}, \r
+ {0x7E, 0x32}, \r
+ {0x7F, 0x34}, \r
+ {0x80, 0x45}, \r
+ {0x81, 0x56}, \r
+ {0x82, 0x67}, \r
+ {0x83, 0x1f}, \r
+ {0x84, 0x50}, \r
+#endif\r
+\r
+ //Shading \r
+ {0x50, 0x0b}, //R\r
+ {0x51, 0x0b}, //R\r
+ {0x52, 0x19}, //R\r
+ {0x53, 0x18}, //R\r
+ \r
+ {0x54, 0x10}, //G\r
+ {0x55, 0x00}, //G\r
+ {0x56, 0x08}, //G\r
+ {0x57, 0x00}, //G\r
+ \r
+ {0x58, 0x10}, //G\r
+ {0x59, 0x00}, //G\r
+ {0x5A, 0x08}, //G\r
+ {0x5B, 0x00}, //G\r
+ \r
+ {0x5C, 0x14}, //B\r
+ {0x5D, 0x0f}, //B\r
+ {0x5E, 0x24}, //B\r
+ {0x5F, 0x12}, //B\r
+ \r
+ {0x60, 0x32}, //#\r
+ {0x61, 0x00}, //#\r
+ {0x62, 0x67}, //#\r
+ \r
+ {0x6B, 0x23}, \r
+ {0x6C, 0x44}, \r
+ {0x6D, 0x44}, \r
+ {0x6E, 0x45}, \r
+ {0x6F, 0x44}, \r
+ {0x70, 0x00}, \r
+ \r
+ {0x71, 0x23}, \r
+ {0x72, 0x44}, \r
+ {0x73, 0x55}, \r
+ {0x74, 0x55}, \r
+ {0x75, 0x55}, \r
+ {0x76, 0x00}, \r
+\r
+ {0x77, 0x23}, \r
+ {0x78, 0x44}, \r
+ {0x79, 0x55}, \r
+ {0x7A, 0x55}, \r
+ {0x7B, 0x55}, \r
+ {0x7C, 0x00}, \r
+\r
+ {0x7D, 0x23}, \r
+ {0x7E, 0x44}, \r
+ {0x7F, 0x34}, \r
+ {0x80, 0x43}, \r
+ {0x81, 0x44}, \r
+ {0x82, 0x00}, \r
+ {0x83, 0x12}, \r
+ {0x84, 0x14},\r
+\r
+ \r
+ //Interpolation \r
+ {0xA0, 0x2F}, \r
+ {0xA1, 0xB7}, \r
+ {0xA2, 0xB7}, \r
+ {0xA3, 0xB7}, \r
+ {0xA4, 0x04}, \r
+ {0xA5, 0xFF}, \r
+ {0xA6, 0x06}, \r
+ {0xA7, 0xFF}, \r
+ {0xA8, 0x00}, \r
+ {0xA9, 0x00}, \r
+ {0xAA, 0x00}, \r
+ {0xAB, 0x00}, \r
+ {0xAC, 0x60}, \r
+ {0xAD, 0x18}, \r
+ {0xAE, 0x0c}, \r
+ {0xAF, 0x14}, \r
+ {0xB0, 0x08}, \r
+ {0xB1, 0x00}, \r
+\r
+\r
+ //Color Matrix for D65 \r
+ {0xC0, 0xAF},// C\r
+ {0xC1, 0x66}, \r
+ {0xC2, 0xd4}, \r
+ {0xC3, 0x06}, \r
+ {0xC4, 0xf0}, \r
+ {0xC5, 0x5a}, \r
+ {0xC6, 0xF6}, \r
+ {0xC7, 0xF9}, \r
+ {0xC8, 0xbf}, \r
+ {0xC9, 0x88}, \r
+ {0xCA, 0x00}, \r
+ {0xCB, 0x00}, \r
+ {0xCC, 0x00}, \r
+ {0xCD, 0x00}, \r
+ {0xCE, 0x00}, \r
+ //Color Matrix for CWF \r
+ {0xD0, 0x2F}, \r
+ {0xD1, 0x72}, \r
+ {0xD2, 0xC9}, \r
+ {0xD3, 0x04}, \r
+ {0xD4, 0xE3}, \r
+ {0xD5, 0x60}, \r
+ {0xD6, 0xFC}, \r
+ {0xD7, 0xF5}, \r
+ {0xD8, 0xb0}, \r
+ {0xD9, 0x99}, \r
+ {0xDA, 0xC3}, \r
+ {0xDB, 0x14}, \r
+ {0xDC, 0x3A}, \r
+ {0xDD, 0xAD}, \r
+ {0xDE, 0x09}, \r
+ \r
+ //Color Matrix for A \r
+ {0xE0, 0x2F}, \r
+ {0xE1, 0x5C}, \r
+ {0xE2, 0xDD}, \r
+ {0xE3, 0x06}, \r
+ {0xE4, 0xE0}, \r
+ {0xE5, 0x69}, \r
+ {0xE6, 0xF6}, \r
+ {0xE7, 0xE5}, \r
+ {0xE8, 0xAB}, \r
+ {0xE9, 0xAE}, \r
+ {0xEA, 0x6A}, \r
+ {0xEB, 0x01}, \r
+ {0xEC, 0x2D}, \r
+ {0xED, 0xEE}, \r
+ {0xEE, 0x04}, \r
+ \r
+ //IDP 2 \r
+ {0x00, 0x04}, \r
+ \r
+ //Gamma - R \r
+ {0x10, 0x00}, \r
+ {0x11, 0x06}, \r
+ {0x12, 0x0e}, \r
+ {0x13, 0x20}, \r
+ {0x14, 0x40}, \r
+ {0x15, 0x5e}, \r
+ {0x16, 0x74}, \r
+ {0x17, 0x87}, \r
+ {0x18, 0x98}, \r
+ {0x19, 0xa6}, \r
+ {0x1A, 0xb3}, \r
+ {0x1B, 0xca}, \r
+ {0x1C, 0xde}, \r
+ {0x1D, 0xf0}, \r
+ {0x1E, 0xf8}, \r
+ {0x1F, 0xff}, \r
+\r
+\r
+ //Gamma - G \r
+ {0x20, 0x00}, \r
+ {0x21, 0x06}, \r
+ {0x22, 0x0e}, \r
+ {0x23, 0x20}, \r
+ {0x24, 0x40}, \r
+ {0x25, 0x5e}, \r
+ {0x26, 0x74}, \r
+ {0x27, 0x87}, \r
+ {0x28, 0x98}, \r
+ {0x29, 0xa6}, \r
+ {0x2A, 0xb3}, \r
+ {0x2B, 0xca}, \r
+ {0x2C, 0xde}, \r
+ {0x2D, 0xf0}, \r
+ {0x2E, 0xf8}, \r
+ {0x2F, 0xff}, \r
+ \r
+ //Gamma - B \r
+ {0x30, 0x00}, \r
+ {0x31, 0x06}, \r
+ {0x32, 0x0e}, \r
+ {0x33, 0x20}, \r
+ {0x34, 0x40}, \r
+ {0x35, 0x5e}, \r
+ {0x36, 0x74}, \r
+ {0x37, 0x87}, \r
+ {0x38, 0x98}, \r
+ {0x39, 0xa6}, \r
+ {0x3A, 0xb3}, \r
+ {0x3B, 0xca}, \r
+ {0x3C, 0xde}, \r
+ {0x3D, 0xf0}, \r
+ {0x3E, 0xf8}, \r
+ {0x3F, 0xff}, \r
+ \r
+ //CSC \r
+ {0x60, 0x33}, \r
+ {0x61, 0x20}, \r
+ {0x62, 0xE4}, \r
+ {0x63, 0xFA}, \r
+ {0x64, 0x13}, \r
+ {0x65, 0x25}, \r
+ {0x66, 0x07}, \r
+ {0x67, 0xF5}, \r
+ {0x68, 0xEA}, \r
+ {0x69, 0x20}, \r
+ {0x6A, 0xC8}, \r
+ {0x6B, 0xC4}, \r
+ {0x6C, 0x84}, \r
+ {0x6D, 0x04}, \r
+ {0x6E, 0x0C}, \r
+ {0x6F, 0x00}, \r
+\r
+\r
+ //Edge \r
+ {0x80, 0xa2}, \r
+ {0x81, 0x10}, \r
+ {0x82, 0x10}, \r
+ {0x83, 0x04}, \r
+ {0x84, 0x0a}, \r
+ {0x85, 0x06}, \r
+ {0x86, 0x00}, \r
+ {0x87, 0x04}, \r
+ {0x88, 0x0a}, \r
+ {0x89, 0x06}, \r
+ {0x8a, 0x10}, \r
+ {0x8b, 0x30}, \r
+ {0x8c, 0x30}, \r
+ {0X90, 0x16}, \r
+ {0x91, 0x03}, \r
+ {0x93, 0xE0}, \r
+\r
+ //Cr/Cb Coring \r
+ {0x94, 0x00}, \r
+ {0x95, 0x00}, \r
+ {0x96, 0x4c}, \r
+ {0x97, 0x66}, \r
+ {0x9A, 0xf5}, \r
+ {0xA1, 0x08}, \r
+ {0xA2, 0x10}, \r
+ {0xA3, 0x16}, \r
+ {0xA4, 0x14}, \r
+ {0xA5, 0x18}, \r
+ {0xA6, 0xa0}, \r
+ {0xA7, 0x06}, \r
+ {0xA8, 0x40}, \r
+ \r
+ {0xA9, 0x20}, \r
+ {0xAA, 0x28}, \r
+ {0xAc, 0xff}, \r
+ {0xAd, 0x09}, \r
+ {0xAe, 0x18}, \r
+ {0xAf, 0x18}, \r
+ \r
+ {0xB2, 0x24}, \r
+ {0xB3, 0x54}, \r
+ {0xB6, 0x08}, \r
+ \r
+ //Color Saturation \r
+ {0xBC, 0x10}, \r
+ {0xBD, 0x10}, \r
+ {0xBE, 0x10}, \r
+ {0xBF, 0x10}, \r
+ {0xc2, 0x12}, \r
+ {0xc3, 0x12}, \r
+ \r
+ //IDP 3 \r
+ {0x00, 0x05}, \r
+ \r
+ //Memory \r
+ {0x40, 0x15}, \r
+ {0x41, 0x28}, \r
+ {0x42, 0x04}, \r
+ {0x43, 0x15}, \r
+ {0x44, 0x28}, \r
+ {0x45, 0x04}, \r
+ {0x46, 0x15}, \r
+ {0x47, 0x28}, \r
+ {0x48, 0x04}, \r
+ \r
+ //Knee \r
+ {0x90, 0x00}, // \r
+ {0x91, 0x00}, //k\r
+ {0x92, 0x00}, //k\r
+ {0x93, 0x00}, //K\r
+ {0x94, 0x00}, //[\r
+ {0x95, 0x00}, //k\r
+ {0x96, 0x00}, //k\r
+ \r
+ //ADG \r
+ #if 0 \r
+ {0x99, 0xC0}, \r
+ {0xA0, 0x10}, \r
+ {0xA1, 0x22}, \r
+ {0xA2, 0x36}, \r
+ {0xA3, 0x49}, \r
+ {0xA4, 0x5D}, \r
+ {0xA5, 0x70}, \r
+ {0xA6, 0x82}, \r
+ {0xA7, 0x94}, \r
+ {0xA8, 0xA5}, \r
+ {0xA9, 0xB5}, \r
+ {0xAA, 0xC3}, \r
+ {0xAB, 0xD1}, \r
+ {0xAC, 0xDE}, \r
+ {0xAD, 0xEA}, \r
+ {0xAE, 0xF5}, \r
+ {0xAF, 0xFF}, \r
+ //YXGMA \r
+ {0xB0, 0xc0}, //Y\r
+ {0xB1, 0x04}, //Y\r
+ {0xB8, 0x0f}, //D\r
+ {0xB9, 0x10}, //D\r
+ //{0xBA, 0x38}, /\r
+ //{0xBB, 0x39}, /\r
+ {0xC0, 0x03}, \r
+ {0xC1, 0x0E}, \r
+ {0xC2, 0x16}, \r
+ {0xC3, 0x24}, \r
+ {0xC4, 0x3F}, \r
+ {0xC5, 0x56}, \r
+ {0xC6, 0x6A}, \r
+ {0xC7, 0x7C}, \r
+ {0xC8, 0x8C}, \r
+ {0xC9, 0x98}, \r
+ {0xCA, 0xA2}, \r
+ {0xCB, 0xB8}, \r
+ {0xCC, 0xCD}, \r
+ {0xCD, 0xE2}, \r
+ {0xCE, 0xF0}, \r
+ {0xCF, 0xFF}, \r
+ #else \r
+ {0x99, 0x00}, \r
+ {0xA0, 0x00}, \r
+ {0xA1, 0x00}, \r
+ {0xA2, 0x00}, \r
+ {0xA3, 0x00}, \r
+ {0xA4, 0x00}, \r
+ {0xA5, 0x00}, \r
+ {0xA6, 0x00}, \r
+ {0xA7, 0x00}, \r
+ {0xA8, 0x00}, \r
+ {0xA9, 0x00}, \r
+ {0xAA, 0x00}, \r
+ {0xAB, 0x00}, \r
+ {0xAC, 0x00}, \r
+ {0xAD, 0x00}, \r
+ {0xAE, 0x00}, \r
+ {0xAF, 0x00}, \r
+ \r
+ //YXGMA \r
+ {0xB0, 0x00}, //Y\r
+ {0xB1, 0x00}, //Y\r
+ {0xB8, 0x00}, //D\r
+ {0xB9, 0x00}, //D\r
+ //{0xBA, 0x38}, /\r
+ //{0xBB, 0x39}, /\r
+ {0xC0, 0x00}, \r
+ {0xC1, 0x00}, \r
+ {0xC2, 0x00}, \r
+ {0xC3, 0x00}, \r
+ {0xC4, 0x00}, \r
+ {0xC5, 0x00}, \r
+ {0xC6, 0x00}, \r
+ {0xC7, 0x00}, \r
+ {0xC8, 0x00}, \r
+ {0xC9, 0x00}, \r
+ {0xCA, 0x00}, \r
+ {0xCB, 0x00}, \r
+ {0xCC, 0x00}, \r
+ {0xCD, 0x00}, \r
+ {0xCE, 0x00}, \r
+ {0xCF, 0x00}, \r
+ {0xe0, 0x01}, \r
+ {0xe1, 0x03}, \r
+ {0xe2, 0x04}, \r
+ {0xe3, 0x0c}, \r
+ {0xe4, 0x11}, \r
+ {0xe5, 0x16}, \r
+ {0xe6, 0x1b}, \r
+ {0xe7, 0x24}, \r
+ {0xe8, 0x30}, \r
+ #endif \r
+ //Sensor on \r
+ {0x00, 0x00}, \r
+ {0x03, 0xc5}, \r
+ {0x00, 0x01}, \r
+ {0x10, 0x84}, \r
+ {0x00, 0x02}, \r
+ {0x10, 0xd3}, \r
+ {0xff, 0xff}, \r
+ \r
\r
+#endif\r
};\r
\r
/* 1600X1200 UXGA */\r
{0x97,0x90}, \r
{0xff, 0xff},\r
};\r
-\r
+#endif\r
static struct reginfo sensor_ClrFmt_YUYV[]=\r
{\r
{0xff, 0xff}\r
};\r
static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
#endif\r
-static const struct v4l2_querymenu sensor_menus[] =\r
+static struct v4l2_querymenu sensor_menus[] =\r
{\r
#if CONFIG_SENSOR_WhiteBalance\r
{ .id = V4L2_CID_DO_WHITE_BALANCE, .index = 0, .name = "auto", .reserved = 0, }, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 1, .name = "incandescent", .reserved = 0,},\r
#endif\r
};\r
\r
-static const struct v4l2_queryctrl sensor_controls[] =\r
+static struct v4l2_queryctrl sensor_controls[] =\r
{\r
#if CONFIG_SENSOR_WhiteBalance\r
{\r
.num_menus = ARRAY_SIZE(sensor_menus),\r
};\r
\r
-/* only one fixed colorspace per pixelcode */
-struct sensor_datafmt {
- enum v4l2_mbus_pixelcode code;
- enum v4l2_colorspace colorspace;
-};
-
-/* Find a data format by a pixel code in an array */
-static const struct sensor_datafmt *sensor_find_datafmt(
- enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,
- int n)
-{
- int i;
- for (i = 0; i < n; i++)
- if (fmt[i].code == code)
- return fmt + i;
-
- return NULL;
-}
-
-static const struct sensor_datafmt sensor_colour_fmts[] = {
- {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
- {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}
+/* only one fixed colorspace per pixelcode */\r
+struct sensor_datafmt {\r
+ enum v4l2_mbus_pixelcode code;\r
+ enum v4l2_colorspace colorspace;\r
+};\r
+\r
+/* Find a data format by a pixel code in an array */\r
+static const struct sensor_datafmt *sensor_find_datafmt(\r
+ enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,\r
+ int n)\r
+{\r
+ int i;\r
+ for (i = 0; i < n; i++)\r
+ if (fmt[i].code == code)\r
+ return fmt + i;\r
+\r
+ return NULL;\r
+}\r
+\r
+static const struct sensor_datafmt sensor_colour_fmts[] = {\r
+ {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
+ {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} \r
};\r
\r
typedef struct sensor_info_priv_s\r
//buf[0] = reg >> 8;\r
buf[0] = reg & 0xFF;\r
buf[1] = val;\r
+ //printk("%s----%d-----\n",__func__,__LINE__);\r
\r
msg->addr = client->addr;\r
msg->flags = client->flags;\r
\r
return err;\r
}\r
-\r
+#if 0\r
/* sensor register read */\r
static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
{\r
\r
return err;\r
}\r
-\r
+#endif\r
/* write a array of registers */\r
static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
{\r
\r
if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {\r
sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
+ if(on){\r
+ //flash off after 2 secs\r
+ hrtimer_cancel(&(flash_off_timer.timer));\r
+ hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL);\r
+ }\r
}\r
break;\r
}\r
sensor_power_end:\r
return ret;\r
}\r
+\r
+static enum hrtimer_restart flash_off_func(struct hrtimer *timer){\r
+ struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer);\r
+ sensor_ioctrl(fps_timer->icd,Sensor_Flash,0);\r
+ SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__);\r
+ return 0;\r
+ \r
+}\r
static int sensor_init(struct v4l2_subdev *sd, u32 val)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct soc_camera_device *icd = client->dev.platform_data;\r
struct sensor *sensor = to_sensor(client);\r
const struct v4l2_queryctrl *qctrl;\r
const struct sensor_datafmt *fmt;\r
- char value;\r
- int ret,pid = 0;\r
+ int ret;\r
\r
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
\r
goto sensor_INIT_ERR;\r
}\r
#endif\r
+\r
ret = sensor_write_array(client, sensor_init_data);\r
if (ret != 0)\r
{\r
sensor_task_lock(client,0);\r
sensor->info_priv.winseqe_cur_addr = (int)SENSOR_INIT_WINSEQADR;\r
fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
- if (!fmt) {
- SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());
- ret = -EINVAL;
- goto sensor_INIT_ERR;
- }
+ if (!fmt) {\r
+ SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());\r
+ ret = -EINVAL;\r
+ goto sensor_INIT_ERR;\r
+ }\r
sensor->info_priv.fmt = *fmt;\r
\r
/* sensor sensor information for initialization */\r
#endif\r
\r
#if CONFIG_SENSOR_Flash\r
- sensor_set_flash();\r
qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
if (qctrl)\r
sensor->info_priv.flash = qctrl->default_value;\r
+ flash_off_timer.icd = icd;\r
+ flash_off_timer.timer.function = flash_off_func;\r
#endif\r
\r
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);\r
return soc_camera_apply_sensor_flags(icl, flags);\r
}\r
\r
-static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
- struct i2c_client *client = sd->priv;
- struct soc_camera_device *icd = client->dev.platform_data;
- struct sensor *sensor = to_sensor(client);
-
- mf->width = icd->user_width;
- mf->height = icd->user_height;
- mf->code = sensor->info_priv.fmt.code;
- mf->colorspace = sensor->info_priv.fmt.colorspace;
- mf->field = V4L2_FIELD_NONE;
-
- return 0;
-}
-static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
- bool ret = false;
-
- if ((mf->width == 1024) && (mf->height == 768)) {
- ret = true;
- } else if ((mf->width == 1280) && (mf->height == 1024)) {
- ret = true;
- } else if ((mf->width == 1600) && (mf->height == 1200)) {
- ret = true;
- } else if ((mf->width == 2048) && (mf->height == 1536)) {
- ret = true;
- } else if ((mf->width == 2592) && (mf->height == 1944)) {
- ret = true;
- }
-
- if (ret == true)
- SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);
- return ret;
-}
-
-static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
- bool ret = false;
-
- if ((mf->width == 1280) && (mf->height == 720)) {
- ret = true;
- } else if ((mf->width == 1920) && (mf->height == 1080)) {
- ret = true;
- }
-
- if (ret == true)
- SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);
- return ret;
-}
+static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+ struct soc_camera_device *icd = client->dev.platform_data;\r
+ struct sensor *sensor = to_sensor(client);\r
+\r
+ mf->width = icd->user_width;\r
+ mf->height = icd->user_height;\r
+ mf->code = sensor->info_priv.fmt.code;\r
+ mf->colorspace = sensor->info_priv.fmt.colorspace;\r
+ mf->field = V4L2_FIELD_NONE;\r
+\r
+ return 0;\r
+}\r
+static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+ bool ret = false;\r
+\r
+ if ((mf->width == 1024) && (mf->height == 768)) {\r
+ ret = true;\r
+ } else if ((mf->width == 1280) && (mf->height == 1024)) {\r
+ ret = true;\r
+ } else if ((mf->width == 1600) && (mf->height == 1200)) {\r
+ ret = true;\r
+ } else if ((mf->width == 2048) && (mf->height == 1536)) {\r
+ ret = true;\r
+ } else if ((mf->width == 2592) && (mf->height == 1944)) {\r
+ ret = true;\r
+ }\r
+\r
+ if (ret == true)\r
+ SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);\r
+ return ret;\r
+}\r
+\r
+static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+ bool ret = false;\r
+\r
+ if ((mf->width == 1280) && (mf->height == 720)) {\r
+ ret = true;\r
+ } else if ((mf->width == 1920) && (mf->height == 1080)) {\r
+ ret = true;\r
+ }\r
+\r
+ if (ret == true)\r
+ SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);\r
+ return ret;\r
+}\r
static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct sensor *sensor = to_sensor(client);\r
const struct sensor_datafmt *fmt;\r
const struct v4l2_queryctrl *qctrl;\r
struct reginfo *winseqe_set_addr=NULL;\r
int ret=0, set_w,set_h;\r
\r
- fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
- ARRAY_SIZE(sensor_colour_fmts));
- if (!fmt) {
- ret = -EINVAL;
- goto sensor_s_fmt_end;
- }
-
- if (sensor->info_priv.fmt.code != mf->code) {
- switch (mf->code)
- {
- case V4L2_MBUS_FMT_YUYV8_2X8:
- {
- winseqe_set_addr = sensor_ClrFmt_YUYV;
- break;
- }
- case V4L2_MBUS_FMT_UYVY8_2X8:
- {
- winseqe_set_addr = sensor_ClrFmt_UYVY;
- break;
- }
- default:
- break;
- }
- if (winseqe_set_addr != NULL) {
- sensor_write_array(client, winseqe_set_addr);
- sensor->info_priv.fmt.code = mf->code;
- sensor->info_priv.fmt.colorspace= mf->colorspace;
- SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);
- } else {
- SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);
- }
- }
-
- set_w = mf->width;
+ fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
+ ARRAY_SIZE(sensor_colour_fmts));\r
+ if (!fmt) {\r
+ ret = -EINVAL;\r
+ goto sensor_s_fmt_end;\r
+ }\r
+\r
+ if (sensor->info_priv.fmt.code != mf->code) {\r
+ switch (mf->code)\r
+ {\r
+ case V4L2_MBUS_FMT_YUYV8_2X8:\r
+ {\r
+ winseqe_set_addr = sensor_ClrFmt_YUYV;\r
+ break;\r
+ }\r
+ case V4L2_MBUS_FMT_UYVY8_2X8:\r
+ {\r
+ winseqe_set_addr = sensor_ClrFmt_UYVY;\r
+ break;\r
+ }\r
+ default:\r
+ break;\r
+ }\r
+ if (winseqe_set_addr != NULL) {\r
+ sensor_write_array(client, winseqe_set_addr);\r
+ sensor->info_priv.fmt.code = mf->code;\r
+ sensor->info_priv.fmt.colorspace= mf->colorspace; \r
+ SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);\r
+ } else {\r
+ SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);\r
+ }\r
+ }\r
+\r
+ set_w = mf->width;\r
set_h = mf->height;\r
\r
if (((set_w <= 176) && (set_h <= 144)) &&( sensor_qcif[0].reg!=0xff))\r
\r
if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) {\r
#if CONFIG_SENSOR_Flash\r
- if (sensor_fmt_capturechk(sd,f) == true) { /* ddl@rock-chips.com : Capture */\r
+ if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */\r
if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
sensor_ioctrl(icd, Sensor_Flash, Flash_On);\r
SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());\r
if (ret != 0) {\r
SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());\r
#if CONFIG_SENSOR_Flash\r
- if (sensor_fmt_capturechk(sd,f) == true) {\r
+ if (sensor_fmt_capturechk(sd,mf) == true) {\r
if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());\r
return ret;\r
}\r
\r
-static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
- struct i2c_client *client = sd->priv;
- struct sensor *sensor = to_sensor(client);
- const struct sensor_datafmt *fmt;
- int ret = 0;
-
- fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
- ARRAY_SIZE(sensor_colour_fmts));
- if (fmt == NULL) {
- fmt = &sensor->info_priv.fmt;
- mf->code = fmt->code;
- }
-
- if (mf->height > SENSOR_MAX_HEIGHT)
- mf->height = SENSOR_MAX_HEIGHT;
- else if (mf->height < SENSOR_MIN_HEIGHT)
- mf->height = SENSOR_MIN_HEIGHT;
-
- if (mf->width > SENSOR_MAX_WIDTH)
- mf->width = SENSOR_MAX_WIDTH;
- else if (mf->width < SENSOR_MIN_WIDTH)
- mf->width = SENSOR_MIN_WIDTH;
-
- mf->colorspace = fmt->colorspace;
-
- return ret;
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+ struct sensor *sensor = to_sensor(client);\r
+ const struct sensor_datafmt *fmt;\r
+ int ret = 0,set_w,set_h;\r
+ \r
+ fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
+ ARRAY_SIZE(sensor_colour_fmts));\r
+ if (fmt == NULL) {\r
+ fmt = &sensor->info_priv.fmt;\r
+ mf->code = fmt->code;\r
+ } \r
+\r
+ if (mf->height > SENSOR_MAX_HEIGHT)\r
+ mf->height = SENSOR_MAX_HEIGHT;\r
+ else if (mf->height < SENSOR_MIN_HEIGHT)\r
+ mf->height = SENSOR_MIN_HEIGHT;\r
+\r
+ if (mf->width > SENSOR_MAX_WIDTH)\r
+ mf->width = SENSOR_MAX_WIDTH;\r
+ else if (mf->width < SENSOR_MIN_WIDTH)\r
+ mf->width = SENSOR_MIN_WIDTH;\r
+\r
+ set_w = mf->width;\r
+ set_h = mf->height;\r
+\r
+ if (((set_w <= 176) && (set_h <= 144)) &&( sensor_qcif[0].reg!=0xff))\r
+ {\r
+ set_w = 176;\r
+ set_h = 144;\r
+ }\r
+ else if (((set_w <= 320) && (set_h <= 240)) && (sensor_qvga[0].reg!=0xff))\r
+ {\r
+ set_w = 320;\r
+ set_h = 240;\r
+ }\r
+ else if (((set_w <= 352) && (set_h<= 288)) && (sensor_cif[0].reg!=0xff))\r
+ {\r
+ set_w = 352;\r
+ set_h = 288;\r
+ }\r
+ else if (((set_w <= 640) && (set_h <= 480)) &&( sensor_vga[0].reg!=0xff))\r
+ {\r
+ set_w =640;\r
+ set_h = 480;\r
+ }\r
+ else if (((set_w <= 800) && (set_h <= 600)) && (sensor_svga[0].reg!=0xff))\r
+ {\r
+ set_w = 800;\r
+ set_h = 600;\r
+ }\r
+ else if (((set_w <= 1024) && (set_h <= 768)) &&( sensor_xga[0].reg!=0xff))\r
+ {\r
+ set_w = 1024;\r
+ set_h = 768;\r
+ }\r
+ else if (((set_w <= 1280) && (set_h <= 1024)) && (sensor_sxga[0].reg!=0xff))\r
+ {\r
+ set_w = 1280;\r
+ set_h = 1024;\r
+ }\r
+ else if (((set_w <= 1600) && (set_h <= 1200)) && (sensor_uxga[0].reg!=0xff))\r
+ {\r
+ set_w = 1600;\r
+ set_h = 1200;\r
+ }\r
+ else\r
+ {\r
+ set_w = SENSOR_INIT_WIDTH;\r
+ set_h = SENSOR_INIT_HEIGHT; \r
+ }\r
+ mf->width = set_w;\r
+ mf->height = set_h; \r
+ mf->colorspace = fmt->colorspace;\r
+ \r
+ return ret;\r
}\r
\r
static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
\r
if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
return -EINVAL;\r
\r
static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct sensor *sensor = to_sensor(client);\r
const struct v4l2_queryctrl *qctrl;\r
\r
\r
static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct sensor *sensor = to_sensor(client);\r
struct soc_camera_device *icd = client->dev.platform_data;\r
const struct v4l2_queryctrl *qctrl;\r
\r
static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct soc_camera_device *icd = client->dev.platform_data;\r
int i, error_cnt=0, error_idx=-1;\r
\r
\r
static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct soc_camera_device *icd = client->dev.platform_data;\r
int i, error_cnt=0, error_idx=-1;\r
\r
static int sensor_video_probe(struct soc_camera_device *icd,\r
struct i2c_client *client)\r
{\r
- char value;\r
- int ret,pid = 0;\r
- struct sensor *sensor = to_sensor(client);\r
+ int ret;\r
+ \r
\r
/* We must have a parent by now. And it cannot be a wrong one.\r
* So this entire test is completely redundant. */\r
}\r
static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\r
{\r
- struct i2c_client *client = sd->priv;\r
+ struct i2c_client *client = v4l2_get_subdevdata(sd);\r
struct soc_camera_device *icd = client->dev.platform_data;\r
struct sensor *sensor = to_sensor(client);\r
int ret = 0;\r
{\r
sensor->sensor_io_request = (struct rk29camera_platform_data*)arg; \r
if (sensor->sensor_io_request != NULL) { \r
- if (sensor->sensor_io_request->gpio_res[0].dev_name && \r
- (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) {\r
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[0];\r
- } else if (sensor->sensor_io_request->gpio_res[1].dev_name && \r
- (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) {\r
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[1];\r
+ sensor->sensor_gpio_res = NULL;\r
+ for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {\r
+ if (sensor->sensor_io_request->gpio_res[i].dev_name && \r
+ (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {\r
+ sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];\r
+ }\r
+ }\r
+ if (sensor->sensor_gpio_res == NULL) {\r
+ SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
+ ret = -EINVAL;\r
+ goto sensor_ioctl_end;\r
}\r
} else {\r
SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {\r
for (i = 0; i < icd->ops->num_controls; i++) {\r
if (V4L2_CID_FLASH == icd->ops->controls[i].id) {\r
- memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl)); \r
+ //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl)); \r
+ sensor_controls[i].id=0xffff; \r
}\r
}\r
sensor->info_priv.flash = 0xff;\r
SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
+ }else{ //two cameras are the same,need to deal diffrently ,zyc\r
+ for (i = 0; i < icd->ops->num_controls; i++) {\r
+ if(0xffff == icd->ops->controls[i].id){\r
+ sensor_controls[i].id=V4L2_CID_FLASH;\r
+ } \r
+ }\r
}\r
}\r
#endif\r
return ret;\r
\r
}\r
-static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
- enum v4l2_mbus_pixelcode *code)
-{
- if (index >= ARRAY_SIZE(sensor_colour_fmts))
- return -EINVAL;
-
- *code = sensor_colour_fmts[index].code;
- return 0;
+static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,\r
+ enum v4l2_mbus_pixelcode *code)\r
+{\r
+ if (index >= ARRAY_SIZE(sensor_colour_fmts))\r
+ return -EINVAL;\r
+\r
+ *code = sensor_colour_fmts[index].code;\r
+ return 0;\r
}\r
static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
.init = sensor_init,\r
.ioctl = sensor_ioctl,\r
};\r
\r
-static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
- .s_mbus_fmt = sensor_s_fmt,
- .g_mbus_fmt = sensor_g_fmt,
- .try_mbus_fmt = sensor_try_fmt,
- .enum_mbus_fmt = sensor_enum_fmt,
+static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
+ .s_mbus_fmt = sensor_s_fmt,\r
+ .g_mbus_fmt = sensor_g_fmt,\r
+ .try_mbus_fmt = sensor_try_fmt,\r
+ .enum_mbus_fmt = sensor_enum_fmt,\r
};\r
\r
static struct v4l2_subdev_ops sensor_subdev_ops = {\r
kfree(sensor);\r
sensor = NULL;\r
}\r
+ hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
SENSOR_DG("\n%s..%s..%d ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
return ret;\r
}\r
\r
MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
-MODULE_LICENSE("GPL");
\ No newline at end of file
+MODULE_LICENSE("GPL");\r