Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Jun 24 09:54:16 2015 +0000
Revision:
0:50cedd586816
Child:
1:1a80c1529aa3
First commit work in progress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // MT9D111.c
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // Micron MT9D111 camera sensor driver
dflet 0:50cedd586816 5 //
dflet 0:50cedd586816 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 7 //
dflet 0:50cedd586816 8 //
dflet 0:50cedd586816 9 // Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 10 // modification, are permitted provided that the following conditions
dflet 0:50cedd586816 11 // are met:
dflet 0:50cedd586816 12 //
dflet 0:50cedd586816 13 // Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 14 // notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 15 //
dflet 0:50cedd586816 16 // Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 17 // notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 18 // documentation and/or other materials provided with the
dflet 0:50cedd586816 19 // distribution.
dflet 0:50cedd586816 20 //
dflet 0:50cedd586816 21 // Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 22 // its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 23 // from this software without specific prior written permission.
dflet 0:50cedd586816 24 //
dflet 0:50cedd586816 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 30 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 31 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 32 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 34 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 35 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 36 //
dflet 0:50cedd586816 37 //*****************************************************************************
dflet 0:50cedd586816 38 //*****************************************************************************
dflet 0:50cedd586816 39 //
dflet 0:50cedd586816 40 //! \addtogroup mt9d111
dflet 0:50cedd586816 41 //! @{
dflet 0:50cedd586816 42 //
dflet 0:50cedd586816 43 //*****************************************************************************
dflet 0:50cedd586816 44 #include <stdio.h>
dflet 0:50cedd586816 45 #include <stdbool.h>
dflet 0:50cedd586816 46 #include <stdint.h>
dflet 0:50cedd586816 47 #include "mt9d111.h"
dflet 0:50cedd586816 48
dflet 0:50cedd586816 49 #include "i2cconfig.h"
dflet 0:50cedd586816 50 #include "cc3100_sl_common.h"
dflet 0:50cedd586816 51 #include "cli_uart.h"
dflet 0:50cedd586816 52
dflet 0:50cedd586816 53 #define RET_OK 0
dflet 0:50cedd586816 54 #define RET_ERROR -1
dflet 0:50cedd586816 55 #define SENSOR_PAGE_REG 0xF0
dflet 0:50cedd586816 56 #define CAM_I2C_SLAVE_ADDR ((0xBA >> 1))
dflet 0:50cedd586816 57
dflet 0:50cedd586816 58 typedef struct MT9D111RegLst
dflet 0:50cedd586816 59 {
dflet 0:50cedd586816 60 unsigned char ucPageAddr;
dflet 0:50cedd586816 61 unsigned char ucRegAddr;
dflet 0:50cedd586816 62 unsigned short usValue;
dflet 0:50cedd586816 63 } s_RegList;
dflet 0:50cedd586816 64
dflet 0:50cedd586816 65 #ifndef ENABLE_JPEG
dflet 0:50cedd586816 66 static const s_RegList preview_on_cmd_list[]= {
dflet 0:50cedd586816 67 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 68 {1, 0xC8, 0x0001 }, // SEQ_CMD, Do Preview
dflet 0:50cedd586816 69 {1, 0xC6, 0xA104 }, // SEQ_CMD
dflet 0:50cedd586816 70 {111, 0xC8, 0x0003 }, // SEQ_CMD, Do Preview
dflet 0:50cedd586816 71 {1, 0xC6, 0xA103 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 72 {1, 0xC8, 0x0005 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 73 {1, 0xC6, 0xA103 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 74 {1, 0xC8, 0x0006 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 75 {1, 0xC6, 0xA104 }, // SEQ_CMD
dflet 0:50cedd586816 76 {111, 0xC8, 0x0003 }, // SEQ_CMD, Do Preview
dflet 0:50cedd586816 77 {100, 0x00, 0x01E0 }, // Delay = 500ms
dflet 0:50cedd586816 78 };
dflet 0:50cedd586816 79
dflet 0:50cedd586816 80 static const s_RegList freq_setup_cmd_List[]= {
dflet 0:50cedd586816 81 {1, 0xC6, 0x276D }, // MODE_FIFO_CONF1_A
dflet 0:50cedd586816 82 {1, 0xC8, 0xE4E2 }, // MODE_FIFO_CONF1_A
dflet 0:50cedd586816 83 {1, 0xC6, 0xA76F }, // MODE_FIFO_CONF2_A
dflet 0:50cedd586816 84 {1, 0xC8, 0x00E8 }, // MODE_FIFO_CONF2_A
dflet 0:50cedd586816 85 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 86 {1, 0xC8, 0x0005 }, // SEQ_CMD (Refresh)
dflet 0:50cedd586816 87 // Set maximum integration time to get a minimum of 15 fps at 45MHz
dflet 0:50cedd586816 88 {1, 0xC6, 0xA20E }, // AE_MAX_INDEX
dflet 0:50cedd586816 89 {1, 0xC8, 0x0004}, // AE_MAX_INDEX
dflet 0:50cedd586816 90 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 91 {1, 0xC8, 0x0001 }, // SEQ_MODE
dflet 0:50cedd586816 92 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 93 {1, 0xC8, 0x0005 }, // SEQ_MODE
dflet 0:50cedd586816 94 // Set minimum integration time to get a maximum of 15 fps at 45MHz
dflet 0:50cedd586816 95 {1, 0xC6, 0xA20D }, // AE_MAX_INDEX
dflet 0:50cedd586816 96 {1, 0xC8, 0x0004 }, // AE_MAX_INDEX
dflet 0:50cedd586816 97 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 98 {1, 0xC8, 0x0005 }, // SEQ_CMD (Refresh)
dflet 0:50cedd586816 99 };
dflet 0:50cedd586816 100
dflet 0:50cedd586816 101 static const s_RegList image_size_240_320_preview_cmds_list[]=
dflet 0:50cedd586816 102 {
dflet 0:50cedd586816 103 {0, 0x07, 0x00FE }, // HORZ_BLANK_A
dflet 0:50cedd586816 104 {0, 0x08, 0x02A0 }, // VERT_BLANK_A
dflet 0:50cedd586816 105 {0, 0x20, 0x0303 }, // READ_MODE_B (Image flip settings)
dflet 0:50cedd586816 106 {0, 0x21, 0x8400 }, // READ_MODE_A (1ADC)
dflet 0:50cedd586816 107 {1, 0xC6, 0x2703 }, // MODE_OUTPUT_WIDTH_A
dflet 0:50cedd586816 108 {1, 0xC8, 0x00F0 }, // MODE_OUTPUT_WIDTH_A
dflet 0:50cedd586816 109 {1, 0xC6, 0x2705 }, // MODE_OUTPUT_HEIGHT_A
dflet 0:50cedd586816 110 {1, 0xC8, 0x0140 }, // MODE_OUTPUT_HEIGHT_A
dflet 0:50cedd586816 111 {1, 0xC6, 0x2727 }, // MODE_CROP_X0_A
dflet 0:50cedd586816 112 {1, 0xC8, 0x0000 }, // MODE_CROP_X0_A
dflet 0:50cedd586816 113 {1, 0xC6, 0x2729 }, // MODE_CROP_X1_A
dflet 0:50cedd586816 114 {1, 0xC8, 0x00F0 }, // MODE_CROP_X1_A
dflet 0:50cedd586816 115 {1, 0xC6, 0x272B }, // MODE_CROP_Y0_A
dflet 0:50cedd586816 116 {1, 0xC8, 0x0000 }, // MODE_CROP_Y0_A
dflet 0:50cedd586816 117 {1, 0xC6, 0x272D }, // MODE_CROP_Y1_A
dflet 0:50cedd586816 118 {1, 0xC8, 0x0140 }, // MODE_CROP_Y1_A
dflet 0:50cedd586816 119 {1, 0xC6, 0x270F }, // MODE_SENSOR_ROW_START_A
dflet 0:50cedd586816 120 {1, 0xC8, 0x001C }, // MODE_SENSOR_ROW_START_A
dflet 0:50cedd586816 121 {1, 0xC6, 0x2711 }, // MODE_SENSOR_COL_START_A
dflet 0:50cedd586816 122 {1, 0xC8, 0x003C }, // MODE_SENSOR_COL_START_A
dflet 0:50cedd586816 123 {1, 0xC6, 0x2713 }, // MODE_SENSOR_ROW_HEIGHT_A
dflet 0:50cedd586816 124 {1, 0xC8, 0x0280 }, // MODE_SENSOR_ROW_HEIGHT_A
dflet 0:50cedd586816 125 {1, 0xC6, 0x2715 }, // MODE_SENSOR_COL_WIDTH_A
dflet 0:50cedd586816 126 {1, 0xC8, 0x03C0 }, // MODE_SENSOR_COL_WIDTH_A
dflet 0:50cedd586816 127 {1, 0xC6, 0x2717 }, // MODE_SENSOR_X_DELAY_A
dflet 0:50cedd586816 128 {1, 0xC8, 0x0088 }, // MODE_SENSOR_X_DELAY_A
dflet 0:50cedd586816 129 {1, 0xC6, 0x2719 }, // MODE_SENSOR_ROW_SPEED_A
dflet 0:50cedd586816 130 {1, 0xC8, 0x0011 }, // MODE_SENSOR_ROW_SPEED_A
dflet 0:50cedd586816 131 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 132 {1, 0xC8, 0x0005 }, // SEQ_CMD
dflet 0:50cedd586816 133 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 134 {1, 0xC8, 0x0006 }, // SEQ_CMD
dflet 0:50cedd586816 135 };
dflet 0:50cedd586816 136
dflet 0:50cedd586816 137 static const s_RegList preview_cmds_list[]= {
dflet 0:50cedd586816 138
dflet 0:50cedd586816 139 {1, 0xC6, 0xA77D }, // MODE_OUTPUT_FORMAT_A
dflet 0:50cedd586816 140 {1, 0xC8, 0x0020 }, // MODE_OUTPUT_FORMAT_A; RGB565
dflet 0:50cedd586816 141 {1, 0xC6, 0x270B }, // MODE_CONFIG
dflet 0:50cedd586816 142 {1, 0xC8, 0x0030 }, // MODE_CONFIG, JPEG disabled for A and B
dflet 0:50cedd586816 143 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 144 {1, 0xC8, 0x0005 } // SEQ_CMD, refresh
dflet 0:50cedd586816 145 };
dflet 0:50cedd586816 146 #else
dflet 0:50cedd586816 147 static const s_RegList capture_cmds_list[]= {
dflet 0:50cedd586816 148 {0, 0x65, 0xA000 }, // Disable PLL
dflet 0:50cedd586816 149 {0, 0x65, 0xE000 }, // Power DOWN PLL
dflet 0:50cedd586816 150 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 151 {0, 0x66, 0x500B },
dflet 0:50cedd586816 152 {0, 0x67, 0x0500 },
dflet 0:50cedd586816 153 {0, 0x65, 0xA000 }, // Disable PLL
dflet 0:50cedd586816 154 {0, 0x65, 0x2000 }, // Enable PLL
dflet 0:50cedd586816 155 {0, 0x20, 0x0000 }, // READ_MODE_B (Image flip settings)
dflet 0:50cedd586816 156 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 157 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 158 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 159 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 160 {1, 0xC8, 0x0001 }, // SEQ_MODE
dflet 0:50cedd586816 161 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 162 {1, 0xC8, 0x0005 }, // SEQ_MODE
dflet 0:50cedd586816 163 {1, 0xC6, 0xA120 }, // Enable Capture video
dflet 0:50cedd586816 164 {1, 0xC8, 0x0002 },
dflet 0:50cedd586816 165 {1, 0xC6, 0x270B }, // Mode config, disable JPEG bypass
dflet 0:50cedd586816 166 {1, 0xC8, 0x0000 },
dflet 0:50cedd586816 167 {1, 0xC6, 0x2702 }, // FIFO_config0b, no spoof, adaptive clock
dflet 0:50cedd586816 168 {1, 0xC8, 0x001E },
dflet 0:50cedd586816 169 {1, 0xC6, 0xA907 }, // JPEG mode config, video
dflet 0:50cedd586816 170 {1, 0xC8, 0x0035 },
dflet 0:50cedd586816 171 {1, 0xC6, 0xA906 }, // Format YCbCr422
dflet 0:50cedd586816 172 {1, 0xC8, 0x0000 },
dflet 0:50cedd586816 173 {1, 0xC6, 0xA90A }, // Set the qscale1
dflet 0:50cedd586816 174 {1, 0xC8, 0x0089 },
dflet 0:50cedd586816 175 {1, 0xC6, 0x2908 }, // Set the restartInt
dflet 0:50cedd586816 176 {1, 0xC8, 0x0020 },
dflet 0:50cedd586816 177 };
dflet 0:50cedd586816 178
dflet 0:50cedd586816 179 static s_RegList start_jpeg_capture_cmd_list[]={
dflet 0:50cedd586816 180 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 0:50cedd586816 181 {1, 0xC8, 0x0002 },
dflet 0:50cedd586816 182 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 183 };
dflet 0:50cedd586816 184
dflet 0:50cedd586816 185 static s_RegList stop_jpeg_capture_cmd_list[]={
dflet 0:50cedd586816 186 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 0:50cedd586816 187 {1, 0xC8, 0x0001 },
dflet 0:50cedd586816 188 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 189 };
dflet 0:50cedd586816 190
dflet 0:50cedd586816 191 #define INDEX_CROP_X0 1
dflet 0:50cedd586816 192 #define INDEX_CROP_X1 3
dflet 0:50cedd586816 193 #define INDEX_CROP_Y0 5
dflet 0:50cedd586816 194 #define INDEX_CROP_Y1 7
dflet 0:50cedd586816 195 #define INDEX_SIZE_WIDTH 12//9
dflet 0:50cedd586816 196 #define INDEX_SIZE_HEIGHT 14//11
dflet 0:50cedd586816 197 static s_RegList resolution_cmds_list[]= {
dflet 0:50cedd586816 198 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 199 {1, 0xC6, 0x2735 }, //MODE_CROP_X0_A
dflet 0:50cedd586816 200 {1, 0xC8, 0x0000 }, //MODE_CROP_X0_A
dflet 0:50cedd586816 201 {1, 0xC6, 0x2737 }, //MODE_CROP_X1_A
dflet 0:50cedd586816 202 {1, 0xC8, 1600 }, //MODE_CROP_X1_A
dflet 0:50cedd586816 203 {1, 0xC6, 0x2739 }, //MODE_CROP_Y0_A
dflet 0:50cedd586816 204 {1, 0xC8, 0x0000 }, //MODE_CROP_Y0_A
dflet 0:50cedd586816 205 {1, 0xC6, 0x273B }, //MODE_CROP_Y1_A
dflet 0:50cedd586816 206 {1, 0xC8, 1200 }, //MODE_CROP_Y1_A
dflet 0:50cedd586816 207 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 0:50cedd586816 208 {1, 0xC8, 0x0005 },
dflet 0:50cedd586816 209
dflet 0:50cedd586816 210 {1, 0xC6, 0x2707 }, //MODE_OUTPUT_WIDTH_B
dflet 0:50cedd586816 211 {1, 0xC8, 640 }, //MODE_OUTPUT_WIDTH_B
dflet 0:50cedd586816 212 {1, 0xC6, 0x2709 }, //MODE_OUTPUT_HEIGHT_B
dflet 0:50cedd586816 213 {1, 0xC8, 480 }, //MODE_OUTPUT_HEIGHT_B
dflet 0:50cedd586816 214 };
dflet 0:50cedd586816 215 #endif
dflet 0:50cedd586816 216
dflet 0:50cedd586816 217 static const s_RegList init_cmds_list[]= {
dflet 0:50cedd586816 218 {100,0x00,0x01F4 },
dflet 0:50cedd586816 219 {0, 0x33, 0x0343 }, // RESERVED_CORE_33
dflet 0:50cedd586816 220 {1, 0xC6, 0xA115 }, // SEQ_LLMODE
dflet 0:50cedd586816 221 {1, 0xC8, 0x0020 }, // SEQ_LLMODE
dflet 0:50cedd586816 222 {0, 0x38, 0x0866 }, // RESERVED_CORE_38
dflet 0:50cedd586816 223 {2, 0x80, 0x0168 }, // LENS_CORRECTION_CONTROL
dflet 0:50cedd586816 224 {2, 0x81, 0x6432 }, // ZONE_BOUNDS_X1_X2
dflet 0:50cedd586816 225 {2, 0x82, 0x3296 }, // ZONE_BOUNDS_X0_X3
dflet 0:50cedd586816 226 {2, 0x83, 0x9664 }, // ZONE_BOUNDS_X4_X5
dflet 0:50cedd586816 227 {2, 0x84, 0x5028 }, // ZONE_BOUNDS_Y1_Y2
dflet 0:50cedd586816 228 {2, 0x85, 0x2878 }, // ZONE_BOUNDS_Y0_Y3
dflet 0:50cedd586816 229 {2, 0x86, 0x7850 }, // ZONE_BOUNDS_Y4_Y5
dflet 0:50cedd586816 230 {2, 0x87, 0x0000 }, // CENTER_OFFSET
dflet 0:50cedd586816 231 {2, 0x88, 0x0152 }, // FX_RED
dflet 0:50cedd586816 232 {2, 0x89, 0x015C }, // FX_GREEN
dflet 0:50cedd586816 233 {2, 0x8A, 0x00F4 }, // FX_BLUE
dflet 0:50cedd586816 234 {2, 0x8B, 0x0108 }, // FY_RED
dflet 0:50cedd586816 235 {2, 0x8C, 0x00FA }, // FY_GREEN
dflet 0:50cedd586816 236 {2, 0x8D, 0x00CF }, // FY_BLUE
dflet 0:50cedd586816 237 {2, 0x8E, 0x09AD }, // DF_DX_RED
dflet 0:50cedd586816 238 {2, 0x8F, 0x091E }, // DF_DX_GREEN
dflet 0:50cedd586816 239 {2, 0x90, 0x0B3F }, // DF_DX_BLUE
dflet 0:50cedd586816 240 {2, 0x91, 0x0C85 }, // DF_DY_RED
dflet 0:50cedd586816 241 {2, 0x92, 0x0CFF }, // DF_DY_GREEN
dflet 0:50cedd586816 242 {2, 0x93, 0x0D86 }, // DF_DY_BLUE
dflet 0:50cedd586816 243 {2, 0x94, 0x163A }, // SECOND_DERIV_ZONE_0_RED
dflet 0:50cedd586816 244 {2, 0x95, 0x0E47 }, // SECOND_DERIV_ZONE_0_GREEN
dflet 0:50cedd586816 245 {2, 0x96, 0x103C }, // SECOND_DERIV_ZONE_0_BLUE
dflet 0:50cedd586816 246 {2, 0x97, 0x1D35 }, // SECOND_DERIV_ZONE_1_RED
dflet 0:50cedd586816 247 {2, 0x98, 0x173E }, // SECOND_DERIV_ZONE_1_GREEN
dflet 0:50cedd586816 248 {2, 0x99, 0x1119 }, // SECOND_DERIV_ZONE_1_BLUE
dflet 0:50cedd586816 249 {2, 0x9A, 0x1663 }, // SECOND_DERIV_ZONE_2_RED
dflet 0:50cedd586816 250 {2, 0x9B, 0x1569 }, // SECOND_DERIV_ZONE_2_GREEN
dflet 0:50cedd586816 251 {2, 0x9C, 0x104C }, // SECOND_DERIV_ZONE_2_BLUE
dflet 0:50cedd586816 252 {2, 0x9D, 0x1015 }, // SECOND_DERIV_ZONE_3_RED
dflet 0:50cedd586816 253 {2, 0x9E, 0x1010 }, // SECOND_DERIV_ZONE_3_GREEN
dflet 0:50cedd586816 254 {2, 0x9F, 0x0B0A }, // SECOND_DERIV_ZONE_3_BLUE
dflet 0:50cedd586816 255 {2, 0xA0, 0x0D53 }, // SECOND_DERIV_ZONE_4_RED
dflet 0:50cedd586816 256 {2, 0xA1, 0x0D51 }, // SECOND_DERIV_ZONE_4_GREEN
dflet 0:50cedd586816 257 {2, 0xA2, 0x0A44 }, // SECOND_DERIV_ZONE_4_BLUE
dflet 0:50cedd586816 258 {2, 0xA3, 0x1545 }, // SECOND_DERIV_ZONE_5_RED
dflet 0:50cedd586816 259 {2, 0xA4, 0x1643 }, // SECOND_DERIV_ZONE_5_GREEN
dflet 0:50cedd586816 260 {2, 0xA5, 0x1231 }, // SECOND_DERIV_ZONE_5_BLUE
dflet 0:50cedd586816 261 {2, 0xA6, 0x0047 }, // SECOND_DERIV_ZONE_6_RED
dflet 0:50cedd586816 262 {2, 0xA7, 0x035C }, // SECOND_DERIV_ZONE_6_GREEN
dflet 0:50cedd586816 263 {2, 0xA8, 0xFE30 }, // SECOND_DERIV_ZONE_6_BLUE
dflet 0:50cedd586816 264 {2, 0xA9, 0x4625 }, // SECOND_DERIV_ZONE_7_RED
dflet 0:50cedd586816 265 {2, 0xAA, 0x47F3 }, // SECOND_DERIV_ZONE_7_GREEN
dflet 0:50cedd586816 266 {2, 0xAB, 0x5859 }, // SECOND_DERIV_ZONE_7_BLUE
dflet 0:50cedd586816 267 {2, 0xAC, 0x0000 }, // X2_FACTORS
dflet 0:50cedd586816 268 {2, 0xAD, 0x0000 }, // GLOBAL_OFFSET_FXY_FUNCTION
dflet 0:50cedd586816 269 {2, 0xAE, 0x0000 }, // K_FACTOR_IN_K_FX_FY
dflet 0:50cedd586816 270 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 0:50cedd586816 271 {1, 0xC6, 0x2003 }, // MON_ARG1
dflet 0:50cedd586816 272 {1, 0xC8, 0x0748 }, // MON_ARG1
dflet 0:50cedd586816 273 {1, 0xC6, 0xA002 }, // MON_CMD
dflet 0:50cedd586816 274 {1, 0xC8, 0x0001 }, // MON_CMD
dflet 0:50cedd586816 275 {111, 0xC8,0x0000 },
dflet 0:50cedd586816 276 {1, 0xC6, 0xA361 }, // AWB_TG_MIN0
dflet 0:50cedd586816 277 {1, 0xC8, 0x00E2 }, // AWB_TG_MIN0
dflet 0:50cedd586816 278 {1, 0x1F, 0x0018 }, // RESERVED_SOC1_1F
dflet 0:50cedd586816 279 {1, 0x51, 0x7F40 }, // RESERVED_SOC1_51
dflet 0:50cedd586816 280 {0, 0x33, 0x0343 }, // RESERVED_CORE_33
dflet 0:50cedd586816 281 {0, 0x38, 0x0868 }, // RESERVED_CORE_38
dflet 0:50cedd586816 282 {1, 0xC6, 0xA10F }, // SEQ_RESET_LEVEL_TH
dflet 0:50cedd586816 283 {1, 0xC8, 0x0042 }, // SEQ_RESET_LEVEL_TH
dflet 0:50cedd586816 284 {1, 0x1F, 0x0020 }, // RESERVED_SOC1_1F
dflet 0:50cedd586816 285 {1, 0xC6, 0xAB04 }, // HG_MAX_DLEVEL
dflet 0:50cedd586816 286 {1, 0xC8, 0x0008 }, // HG_MAX_DLEVEL
dflet 0:50cedd586816 287 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 288 {1, 0xC8, 0x0005 }, // SEQ_CMD
dflet 0:50cedd586816 289 {1, 0xC6, 0xA104 }, // SEQ_CMD
dflet 0:50cedd586816 290 {111, 0xC8,0x0003 },
dflet 0:50cedd586816 291 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 0:50cedd586816 292 {1, 0x08, 0x01EC }, // COLOR_PIPELINE_CONTROL
dflet 0:50cedd586816 293 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 0:50cedd586816 294 {1, 0x36, 0x0F08 }, // APERTURE_PARAMETERS
dflet 0:50cedd586816 295 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 296 {1, 0xC8, 0x0005 }, // SEQ_CMD
dflet 0:50cedd586816 297 };
dflet 0:50cedd586816 298
dflet 0:50cedd586816 299 //*****************************************************************************
dflet 0:50cedd586816 300 // Static Function Declarations
dflet 0:50cedd586816 301 //*****************************************************************************
dflet 0:50cedd586816 302 static int RegLstWrite(s_RegList *pRegLst, unsigned int ulNofItems);
dflet 0:50cedd586816 303 extern void MT9D111Delay(unsigned int ucDelay);
dflet 0:50cedd586816 304
dflet 0:50cedd586816 305
dflet 0:50cedd586816 306 //*****************************************************************************
dflet 0:50cedd586816 307 //
dflet 0:50cedd586816 308 //! This function initilizes the camera sensor
dflet 0:50cedd586816 309 //!
dflet 0:50cedd586816 310 //! \param None
dflet 0:50cedd586816 311 //!
dflet 0:50cedd586816 312 //! \return 0 - Success
dflet 0:50cedd586816 313 //! -1 - Error
dflet 0:50cedd586816 314 //
dflet 0:50cedd586816 315 //*****************************************************************************
dflet 0:50cedd586816 316
dflet 0:50cedd586816 317 int CameraSensorInit()
dflet 0:50cedd586816 318 {
dflet 0:50cedd586816 319 Uart_Write((uint8_t*)"CameraSensorInit \n\r");
dflet 0:50cedd586816 320 int lRetVal = -1;
dflet 0:50cedd586816 321
dflet 0:50cedd586816 322 lRetVal = RegLstWrite((s_RegList *)init_cmds_list, \
dflet 0:50cedd586816 323 sizeof(init_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 324 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 325
dflet 0:50cedd586816 326 #ifndef ENABLE_JPEG
dflet 0:50cedd586816 327 lRetVal = RegLstWrite((s_RegList *)preview_cmds_list,
dflet 0:50cedd586816 328 sizeof(preview_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 329 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 330 lRetVal = RegLstWrite((s_RegList *)image_size_240_320_preview_cmds_list, \
dflet 0:50cedd586816 331 sizeof(image_size_240_320_preview_cmds_list)/ \
dflet 0:50cedd586816 332 sizeof(s_RegList));
dflet 0:50cedd586816 333 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 334 lRetVal = RegLstWrite((s_RegList *)freq_setup_cmd_List,
dflet 0:50cedd586816 335 sizeof(freq_setup_cmd_List)/sizeof(s_RegList));
dflet 0:50cedd586816 336 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 337 lRetVal = RegLstWrite((s_RegList *)preview_on_cmd_list,
dflet 0:50cedd586816 338 sizeof(preview_on_cmd_list)/sizeof(s_RegList));
dflet 0:50cedd586816 339 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 340 #endif
dflet 0:50cedd586816 341 return 0;
dflet 0:50cedd586816 342 }
dflet 0:50cedd586816 343
dflet 0:50cedd586816 344 //*****************************************************************************
dflet 0:50cedd586816 345 //
dflet 0:50cedd586816 346 //! This function configures the sensor in JPEG mode
dflet 0:50cedd586816 347 //!
dflet 0:50cedd586816 348 //! \param[in] width - X-Axis
dflet 0:50cedd586816 349 //! \param[in] height - Y-Axis
dflet 0:50cedd586816 350 //!
dflet 0:50cedd586816 351 //! \return 0 - Success
dflet 0:50cedd586816 352 //! -1 - Error
dflet 0:50cedd586816 353 //
dflet 0:50cedd586816 354 //*****************************************************************************
dflet 0:50cedd586816 355 int StartSensorInJpegMode(int width, int height)
dflet 0:50cedd586816 356 {
dflet 0:50cedd586816 357 Uart_Write((uint8_t*)"StartSensorInJpegMode \n\r");
dflet 0:50cedd586816 358 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 359 int lRetVal = -1;
dflet 0:50cedd586816 360
dflet 0:50cedd586816 361 lRetVal = RegLstWrite((s_RegList *)capture_cmds_list,
dflet 0:50cedd586816 362 sizeof(capture_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 363 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 364
dflet 0:50cedd586816 365 resolution_cmds_list[INDEX_SIZE_WIDTH].usValue = width;
dflet 0:50cedd586816 366 resolution_cmds_list[INDEX_SIZE_HEIGHT].usValue = height;
dflet 0:50cedd586816 367 lRetVal = RegLstWrite((s_RegList *)resolution_cmds_list,
dflet 0:50cedd586816 368 sizeof(resolution_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 369 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 370
dflet 0:50cedd586816 371 lRetVal = RegLstWrite((s_RegList *)start_jpeg_capture_cmd_list,
dflet 0:50cedd586816 372 sizeof(start_jpeg_capture_cmd_list)/sizeof(s_RegList));
dflet 0:50cedd586816 373 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 374 #endif
dflet 0:50cedd586816 375 return 0;
dflet 0:50cedd586816 376 }
dflet 0:50cedd586816 377
dflet 0:50cedd586816 378 //*****************************************************************************
dflet 0:50cedd586816 379 //
dflet 0:50cedd586816 380 //! This function configures the sensor ouput resolution
dflet 0:50cedd586816 381 //!
dflet 0:50cedd586816 382 //! \param[in] width - X-Axis
dflet 0:50cedd586816 383 //! \param[in] height - Y-Axis
dflet 0:50cedd586816 384 //!
dflet 0:50cedd586816 385 //! \return 0 - Success
dflet 0:50cedd586816 386 //! -1 - Error
dflet 0:50cedd586816 387 //
dflet 0:50cedd586816 388 //*****************************************************************************
dflet 0:50cedd586816 389 int CameraSensorResolution(int width, int height)
dflet 0:50cedd586816 390 {
dflet 0:50cedd586816 391 Uart_Write((uint8_t*)"CameraSensorResolution \n\r");
dflet 0:50cedd586816 392 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 393 int lRetVal = -1;
dflet 0:50cedd586816 394
dflet 0:50cedd586816 395 lRetVal = RegLstWrite((s_RegList *)stop_jpeg_capture_cmd_list,
dflet 0:50cedd586816 396 sizeof(stop_jpeg_capture_cmd_list)/sizeof(s_RegList));
dflet 0:50cedd586816 397 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 398
dflet 0:50cedd586816 399 resolution_cmds_list[INDEX_SIZE_WIDTH].usValue = width;
dflet 0:50cedd586816 400 resolution_cmds_list[INDEX_SIZE_HEIGHT].usValue = height;
dflet 0:50cedd586816 401 lRetVal = RegLstWrite((s_RegList *)resolution_cmds_list,
dflet 0:50cedd586816 402 sizeof(resolution_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 403 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 404
dflet 0:50cedd586816 405 lRetVal = RegLstWrite((s_RegList *)start_jpeg_capture_cmd_list,
dflet 0:50cedd586816 406 sizeof(start_jpeg_capture_cmd_list)/sizeof(s_RegList));
dflet 0:50cedd586816 407 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 408
dflet 0:50cedd586816 409
dflet 0:50cedd586816 410 #else
dflet 0:50cedd586816 411 if(width != 240 || height != 256)
dflet 0:50cedd586816 412 return -1;
dflet 0:50cedd586816 413 #endif
dflet 0:50cedd586816 414 return 0;
dflet 0:50cedd586816 415 }
dflet 0:50cedd586816 416
dflet 0:50cedd586816 417 //*****************************************************************************
dflet 0:50cedd586816 418 //
dflet 0:50cedd586816 419 //! This function implements the Register Write in MT9D111 sensor
dflet 0:50cedd586816 420 //!
dflet 0:50cedd586816 421 //! \param1 Register List
dflet 0:50cedd586816 422 //! \param2 No. Of Items
dflet 0:50cedd586816 423 //!
dflet 0:50cedd586816 424 //! \return 0 - Success
dflet 0:50cedd586816 425 //! -1 - Error
dflet 0:50cedd586816 426 //
dflet 0:50cedd586816 427 //*****************************************************************************
dflet 0:50cedd586816 428 static int RegLstWrite(s_RegList *pRegLst, unsigned int ulNofItems)
dflet 0:50cedd586816 429 {
dflet 0:50cedd586816 430 Uart_Write((uint8_t*)"RegLstWrite \n\r");
dflet 0:50cedd586816 431 unsigned int ulNdx;
dflet 0:50cedd586816 432 unsigned short usTemp;
dflet 0:50cedd586816 433 unsigned char i;
dflet 0:50cedd586816 434 char ucBuffer[20];
dflet 0:50cedd586816 435 unsigned int ulSize;
dflet 0:50cedd586816 436 int lRetVal = -1;
dflet 0:50cedd586816 437
dflet 0:50cedd586816 438 if(pRegLst == NULL)
dflet 0:50cedd586816 439 {
dflet 0:50cedd586816 440 return RET_ERROR;
dflet 0:50cedd586816 441 }
dflet 0:50cedd586816 442
dflet 0:50cedd586816 443 for(ulNdx = 0; ulNdx < ulNofItems; ulNdx++)
dflet 0:50cedd586816 444 {
dflet 0:50cedd586816 445 if(pRegLst->ucPageAddr == 100)
dflet 0:50cedd586816 446 {
dflet 0:50cedd586816 447 // PageAddr == 100, insret a delay equal to reg value
dflet 0:50cedd586816 448 wait_us(pRegLst->usValue * 80000/3);
dflet 0:50cedd586816 449 }
dflet 0:50cedd586816 450 else if(pRegLst->ucPageAddr == 111)
dflet 0:50cedd586816 451 {
dflet 0:50cedd586816 452 // PageAddr == 111, wait for specified register value
dflet 0:50cedd586816 453 do
dflet 0:50cedd586816 454 {
dflet 0:50cedd586816 455 ucBuffer[0] = pRegLst->ucRegAddr;
dflet 0:50cedd586816 456 lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,1);
dflet 0:50cedd586816 457 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 458 if(I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,1))
dflet 0:50cedd586816 459 {
dflet 0:50cedd586816 460 return RET_ERROR;
dflet 0:50cedd586816 461 }
dflet 0:50cedd586816 462
dflet 0:50cedd586816 463 usTemp = ucBuffer[0] << 8;
dflet 0:50cedd586816 464 usTemp |= ucBuffer[1];
dflet 0:50cedd586816 465 }while(usTemp != pRegLst->usValue);
dflet 0:50cedd586816 466 }
dflet 0:50cedd586816 467 else
dflet 0:50cedd586816 468 {
dflet 0:50cedd586816 469 // Set the page
dflet 0:50cedd586816 470 ucBuffer[0] = SENSOR_PAGE_REG;
dflet 0:50cedd586816 471 ucBuffer[1] = 0x00;
dflet 0:50cedd586816 472 ucBuffer[2] = (unsigned char)(pRegLst->ucPageAddr);
dflet 0:50cedd586816 473 if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,3,I2C_SEND_STOP))
dflet 0:50cedd586816 474 {
dflet 0:50cedd586816 475 return RET_ERROR;
dflet 0:50cedd586816 476 }
dflet 0:50cedd586816 477
dflet 0:50cedd586816 478 ucBuffer[0] = SENSOR_PAGE_REG;
dflet 0:50cedd586816 479 lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,I2C_SEND_STOP);
dflet 0:50cedd586816 480 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 481 lRetVal = I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,I2C_SEND_STOP);
dflet 0:50cedd586816 482 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 483
dflet 0:50cedd586816 484 ucBuffer[0] = pRegLst->ucRegAddr;
dflet 0:50cedd586816 485
dflet 0:50cedd586816 486 if(pRegLst->ucPageAddr == 0x1 && pRegLst->ucRegAddr == 0xC8)
dflet 0:50cedd586816 487 {
dflet 0:50cedd586816 488 usTemp = 0xC8;
dflet 0:50cedd586816 489 i=1;
dflet 0:50cedd586816 490 while(pRegLst->ucRegAddr == usTemp)
dflet 0:50cedd586816 491 {
dflet 0:50cedd586816 492 ucBuffer[i] = (unsigned char)(pRegLst->usValue >> 8);
dflet 0:50cedd586816 493 ucBuffer[i+1] = (unsigned char)(pRegLst->usValue & 0xFF);
dflet 0:50cedd586816 494 i += 2;
dflet 0:50cedd586816 495 usTemp++;
dflet 0:50cedd586816 496 pRegLst++;
dflet 0:50cedd586816 497 ulNdx++;
dflet 0:50cedd586816 498 }
dflet 0:50cedd586816 499
dflet 0:50cedd586816 500 ulSize = (i-2)*2 + 1;
dflet 0:50cedd586816 501 ulNdx--;
dflet 0:50cedd586816 502 pRegLst--;
dflet 0:50cedd586816 503 }
dflet 0:50cedd586816 504 else
dflet 0:50cedd586816 505 {
dflet 0:50cedd586816 506 ulSize = 3;
dflet 0:50cedd586816 507 ucBuffer[1] = (unsigned char)(pRegLst->usValue >> 8);
dflet 0:50cedd586816 508 ucBuffer[2] = (unsigned char)(pRegLst->usValue & 0xFF);
dflet 0:50cedd586816 509 }
dflet 0:50cedd586816 510
dflet 0:50cedd586816 511 if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,
dflet 0:50cedd586816 512 ulSize,I2C_SEND_STOP))
dflet 0:50cedd586816 513 {
dflet 0:50cedd586816 514 return RET_ERROR;
dflet 0:50cedd586816 515 }
dflet 0:50cedd586816 516 }
dflet 0:50cedd586816 517
dflet 0:50cedd586816 518 pRegLst++;
dflet 0:50cedd586816 519 wait_ms(10);
dflet 0:50cedd586816 520 }
dflet 0:50cedd586816 521
dflet 0:50cedd586816 522 return RET_OK;
dflet 0:50cedd586816 523 }
dflet 0:50cedd586816 524
dflet 0:50cedd586816 525 //*****************************************************************************
dflet 0:50cedd586816 526 //
dflet 0:50cedd586816 527 // Close the Doxygen group.
dflet 0:50cedd586816 528 //! @}
dflet 0:50cedd586816 529 //
dflet 0:50cedd586816 530 //*****************************************************************************
dflet 0:50cedd586816 531