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:
Fri Jun 26 16:49:04 2015 +0000
Revision:
2:b92db44a29b4
Parent:
1:1a80c1529aa3
Child:
4:c27adffcfec2
WIP commit 2

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