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:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
21:38c6b11aa348
Removed some debug.

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 14:90603ea1e85b 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 14:90603ea1e85b 7 //
dflet 14:90603ea1e85b 8 //
dflet 14:90603ea1e85b 9 // Redistribution and use in source and binary forms, with or without
dflet 14:90603ea1e85b 10 // modification, are permitted provided that the following conditions
dflet 0:50cedd586816 11 // are met:
dflet 0:50cedd586816 12 //
dflet 14:90603ea1e85b 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 14:90603ea1e85b 17 // notice, this list of conditions and the following disclaimer in the
dflet 14:90603ea1e85b 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 14:90603ea1e85b 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 14:90603ea1e85b 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 14:90603ea1e85b 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 14:90603ea1e85b 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 14:90603ea1e85b 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 14:90603ea1e85b 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 14:90603ea1e85b 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 13:bf45f592c2b6 47 #include "mbed.h"
dflet 14:90603ea1e85b 48 #include "cc3100_sl_common.h"
dflet 0:50cedd586816 49 #include "mt9d111.h"
dflet 0:50cedd586816 50
dflet 0:50cedd586816 51 #include "i2cconfig.h"
dflet 0:50cedd586816 52 #include "cli_uart.h"
dflet 13:bf45f592c2b6 53 #include "HttpDebug.h"
dflet 14:90603ea1e85b 54 #include "app_config.h"
dflet 0:50cedd586816 55
dflet 0:50cedd586816 56 #define RET_OK 0
dflet 0:50cedd586816 57 #define RET_ERROR -1
dflet 0:50cedd586816 58 #define SENSOR_PAGE_REG 0xF0
dflet 14:90603ea1e85b 59 #define CAM_I2C_SLAVE_WRITE 0xBA//Write
dflet 14:90603ea1e85b 60 #define CAM_I2C_SLAVE_READ 0xBB//Read
dflet 14:90603ea1e85b 61
dflet 14:90603ea1e85b 62 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 63 DigitalOut standby(PA_3);
dflet 14:90603ea1e85b 64 #endif
dflet 14:90603ea1e85b 65
dflet 14:90603ea1e85b 66 extern DCMI_HandleTypeDef phdcmi;
dflet 14:90603ea1e85b 67
dflet 14:90603ea1e85b 68 /* Soft Reset Sequence */
dflet 14:90603ea1e85b 69 static const s_RegList soft_reset_cmd_list[]= {
dflet 14:90603ea1e85b 70 {0, 0x65, 0xA000 }, // Bypass the PLL
dflet 14:90603ea1e85b 71 {1, 0xC3, 0x0501 }, // Perform MCU reset
dflet 14:90603ea1e85b 72 {0, 0x0D, 0x0021 }, // Enable soft reset
dflet 21:38c6b11aa348 73 {100, 0x00, 0x0032 }, // Delay = 50ms
dflet 14:90603ea1e85b 74 {0, 0x0D, 0x0000 }, // Disable soft reset
dflet 14:90603ea1e85b 75 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 14:90603ea1e85b 76 };
dflet 0:50cedd586816 77
dflet 0:50cedd586816 78 #ifndef ENABLE_JPEG
dflet 0:50cedd586816 79 static const s_RegList preview_on_cmd_list[]= {
dflet 0:50cedd586816 80 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 81 {1, 0xC8, 0x0001 }, // SEQ_CMD, Do Preview
dflet 0:50cedd586816 82 {1, 0xC6, 0xA104 }, // SEQ_CMD
dflet 0:50cedd586816 83 {111, 0xC8, 0x0003 }, // SEQ_CMD, Do Preview
dflet 0:50cedd586816 84 {1, 0xC6, 0xA103 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 85 {1, 0xC8, 0x0005 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 86 {1, 0xC6, 0xA103 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 87 {1, 0xC8, 0x0006 }, // SEQ_CMD-refresh
dflet 0:50cedd586816 88 {1, 0xC6, 0xA104 }, // SEQ_CMD
dflet 0:50cedd586816 89 {111, 0xC8, 0x0003 }, // SEQ_CMD, Do Preview
dflet 14:90603ea1e85b 90 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 0:50cedd586816 91 };
dflet 0:50cedd586816 92
dflet 0:50cedd586816 93 static const s_RegList freq_setup_cmd_List[]= {
dflet 0:50cedd586816 94 {1, 0xC6, 0x276D }, // MODE_FIFO_CONF1_A
dflet 14:90603ea1e85b 95 {1, 0xC8, 0xE4E2 }, // MODE_FIFO_CONF1_A =(58594)
dflet 0:50cedd586816 96 {1, 0xC6, 0xA76F }, // MODE_FIFO_CONF2_A
dflet 14:90603ea1e85b 97 {1, 0xC8, 0x00E8 }, // MODE_FIFO_CONF2_A =(232)
dflet 14:90603ea1e85b 98 (1, 0xC6, 0x2774 ), // MODE_FIFO_CONF1_B **
dflet 14:90603ea1e85b 99 (1, 0xC8, 0xE4E2 ), // MODE_FIFO_CONF1_B ** =(58594)
dflet 14:90603ea1e85b 100 (1, 0xC6, 0xA776 ), // MODE_FIFO_CONF2_B **
dflet 14:90603ea1e85b 101 (1, 0xC8, 0x00E8 ), // MODE_FIFO_CONF2_B ** =(232)
dflet 0:50cedd586816 102 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 103 {1, 0xC8, 0x0005 }, // SEQ_CMD (Refresh)
dflet 14:90603ea1e85b 104 // Set maximum integration time to get a minimum of 15 fps at 45MHz
dflet 0:50cedd586816 105 {1, 0xC6, 0xA20E }, // AE_MAX_INDEX
dflet 21:38c6b11aa348 106 {1, 0xC8, 0x0004 }, // AE_MAX_INDEX
dflet 0:50cedd586816 107 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 108 {1, 0xC8, 0x0001 }, // SEQ_MODE
dflet 0:50cedd586816 109 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 0:50cedd586816 110 {1, 0xC8, 0x0005 }, // SEQ_MODE
dflet 14:90603ea1e85b 111 // Set minimum integration time to get a maximum of 15 fps at 45MHz
dflet 0:50cedd586816 112 {1, 0xC6, 0xA20D }, // AE_MAX_INDEX
dflet 0:50cedd586816 113 {1, 0xC8, 0x0004 }, // AE_MAX_INDEX
dflet 0:50cedd586816 114 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 0:50cedd586816 115 {1, 0xC8, 0x0005 }, // SEQ_CMD (Refresh)
dflet 14:90603ea1e85b 116 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 0:50cedd586816 117 };
dflet 0:50cedd586816 118
dflet 14:90603ea1e85b 119 static const s_RegList image_size_240_320_preview_cmds_list[]= {
dflet 0:50cedd586816 120 {0, 0x07, 0x00FE }, // HORZ_BLANK_A
dflet 0:50cedd586816 121 {0, 0x08, 0x02A0 }, // VERT_BLANK_A
dflet 0:50cedd586816 122 {0, 0x20, 0x0303 }, // READ_MODE_B (Image flip settings)
dflet 0:50cedd586816 123 {0, 0x21, 0x8400 }, // READ_MODE_A (1ADC)
dflet 0:50cedd586816 124 {1, 0xC6, 0x2703 }, // MODE_OUTPUT_WIDTH_A
dflet 14:90603ea1e85b 125 {1, 0xC8, 0x00F0 }, // MODE_OUTPUT_WIDTH_A = 0xF0 (240)
dflet 0:50cedd586816 126 {1, 0xC6, 0x2705 }, // MODE_OUTPUT_HEIGHT_A
dflet 14:90603ea1e85b 127 {1, 0xC8, 0x0140 }, // MODE_OUTPUT_HEIGHT_A = 0x0140 (320)
dflet 0:50cedd586816 128 {1, 0xC6, 0x2727 }, // MODE_CROP_X0_A
dflet 14:90603ea1e85b 129 {1, 0xC8, 0x0000 }, // MODE_CROP_X0_A = 0x00
dflet 0:50cedd586816 130 {1, 0xC6, 0x2729 }, // MODE_CROP_X1_A
dflet 14:90603ea1e85b 131 {1, 0xC8, 0x00F0 }, // MODE_CROP_X1_A = 0xF0
dflet 0:50cedd586816 132 {1, 0xC6, 0x272B }, // MODE_CROP_Y0_A
dflet 14:90603ea1e85b 133 {1, 0xC8, 0x0000 }, // MODE_CROP_Y0_A = 0xF0
dflet 0:50cedd586816 134 {1, 0xC6, 0x272D }, // MODE_CROP_Y1_A
dflet 14:90603ea1e85b 135 {1, 0xC8, 0x0140 }, // MODE_CROP_Y1_A = 0x0140
dflet 0:50cedd586816 136 {1, 0xC6, 0x270F }, // MODE_SENSOR_ROW_START_A
dflet 14:90603ea1e85b 137 {1, 0xC8, 0x001C }, // MODE_SENSOR_ROW_START_A = 0x001C (28)
dflet 0:50cedd586816 138 {1, 0xC6, 0x2711 }, // MODE_SENSOR_COL_START_A
dflet 14:90603ea1e85b 139 {1, 0xC8, 0x003C }, // MODE_SENSOR_COL_START_A = 0x003C (60)
dflet 0:50cedd586816 140 {1, 0xC6, 0x2713 }, // MODE_SENSOR_ROW_HEIGHT_A
dflet 14:90603ea1e85b 141 {1, 0xC8, 0x0280 }, // MODE_SENSOR_ROW_HEIGHT_A = 0x0280 (640)
dflet 0:50cedd586816 142 {1, 0xC6, 0x2715 }, // MODE_SENSOR_COL_WIDTH_A
dflet 14:90603ea1e85b 143 {1, 0xC8, 0x03C0 }, // MODE_SENSOR_COL_WIDTH_A = 0x03C0 (960)
dflet 0:50cedd586816 144 {1, 0xC6, 0x2717 }, // MODE_SENSOR_X_DELAY_A
dflet 14:90603ea1e85b 145 {1, 0xC8, 0x0088 }, // MODE_SENSOR_X_DELAY_A = 0x0088
dflet 0:50cedd586816 146 {1, 0xC6, 0x2719 }, // MODE_SENSOR_ROW_SPEED_A
dflet 14:90603ea1e85b 147 {1, 0xC8, 0x0011 }, // MODE_SENSOR_ROW_SPEED_A = 0x0011
dflet 0:50cedd586816 148 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 14:90603ea1e85b 149 {1, 0xC8, 0x0005 }, // SEQ_CMD = 0x0005
dflet 0:50cedd586816 150 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 14:90603ea1e85b 151 {1, 0xC8, 0x0006 }, // SEQ_CMD = 0x0006
dflet 14:90603ea1e85b 152 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 0:50cedd586816 153 };
dflet 0:50cedd586816 154
dflet 0:50cedd586816 155 static const s_RegList preview_cmds_list[]= {
dflet 0:50cedd586816 156
dflet 0:50cedd586816 157 {1, 0xC6, 0xA77D }, // MODE_OUTPUT_FORMAT_A
dflet 14:90603ea1e85b 158 {1, 0xC8, 0x0020 }, // MODE_OUTPUT_FORMAT_A; RGB565 = 0x0020
dflet 0:50cedd586816 159 {1, 0xC6, 0x270B }, // MODE_CONFIG
dflet 14:90603ea1e85b 160 {1, 0xC8, 0x0030 }, // MODE_CONFIG, JPEG disabled for A and B = 0x0030
dflet 0:50cedd586816 161 {1, 0xC6, 0xA103 }, // SEQ_CMD
dflet 21:38c6b11aa348 162 {1, 0xC8, 0x0005 }, // SEQ_CMD, refresh = 0x0005
dflet 14:90603ea1e85b 163 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 0:50cedd586816 164 };
dflet 14:90603ea1e85b 165 #else
dflet 14:90603ea1e85b 166 static const s_RegList pll_cmds_list[]= {
dflet 0:50cedd586816 167 {0, 0x65, 0xA000 }, // Disable PLL
dflet 14:90603ea1e85b 168 // {100, 0x00, 0x0064 }, // Delay =100ms
dflet 0:50cedd586816 169 {0, 0x65, 0xE000 }, // Power DOWN PLL
dflet 0:50cedd586816 170 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 21:38c6b11aa348 171 {0, 0x66, 0x3003 }, // M = 48 N = 3 PLL fIN = 8MHz fOUT = 24MHz
dflet 21:38c6b11aa348 172 // {0, 0x66, 0x7801 }, // M = 120 N = 1 PLL fIN = 8MHz fOUT = 60MHz
dflet 14:90603ea1e85b 173 {0, 0x67, 0x0501 }, // P = 1
dflet 0:50cedd586816 174 {0, 0x65, 0xA000 }, // Disable PLL
dflet 14:90603ea1e85b 175 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 176 {0, 0x65, 0x2000 }, // Enable PLL
dflet 14:90603ea1e85b 177 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 14:90603ea1e85b 178 };
dflet 14:90603ea1e85b 179
dflet 14:90603ea1e85b 180 static const s_RegList capture_cmds_list[]= {
dflet 21:38c6b11aa348 181
dflet 0:50cedd586816 182 {0, 0x20, 0x0000 }, // READ_MODE_B (Image flip settings)
dflet 21:38c6b11aa348 183 {100, 0x00, 0x00FA }, // Delay =250ms
dflet 14:90603ea1e85b 184 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 14:90603ea1e85b 185 {1, 0xC8, 0x0001 }, // SEQ_MODE
dflet 14:90603ea1e85b 186 {1, 0xC6, 0xA102 }, // SEQ_MODE
dflet 14:90603ea1e85b 187 {1, 0xC8, 0x0005 }, // SEQ_MODE
dflet 14:90603ea1e85b 188 {1, 0xC6, 0xA120 }, // Enable Capture video
dflet 14:90603ea1e85b 189 {1, 0xC8, 0x0002 },
dflet 14:90603ea1e85b 190 {1, 0xC6, 0x270B }, // Mode config, disable JPEG bypass
dflet 14:90603ea1e85b 191 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 192 {1, 0xC6, 0x2702 }, // FIFO_config0b, no spoof, adaptive clock
dflet 14:90603ea1e85b 193 {1, 0xC8, 0x001E },
dflet 14:90603ea1e85b 194 {1, 0xC6, 0xA907 }, // JPEG mode config, video
dflet 14:90603ea1e85b 195 {1, 0xC8, 0x0035 },
dflet 14:90603ea1e85b 196 {1, 0xC6, 0xA906 }, // Format YCbCr422
dflet 14:90603ea1e85b 197 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 198 {1, 0xC6, 0xA90A }, // Set the qscale1
dflet 21:38c6b11aa348 199 {1, 0xC8, 0x0088 },
dflet 14:90603ea1e85b 200 {1, 0xC6, 0x2908 }, // Set the restartInt
dflet 14:90603ea1e85b 201 {1, 0xC8, 0x0020 },
dflet 21:38c6b11aa348 202 {100, 0x00, 0x00FA }, // Delay =250ms
dflet 14:90603ea1e85b 203 {1, 0xC6, 0x2707 }, // MODE_OUTPUT_WIDTH_B
dflet 14:90603ea1e85b 204 #ifdef XGA_FRAME
dflet 14:90603ea1e85b 205 {1, 0xC8, 1024 },
dflet 14:90603ea1e85b 206 #endif
dflet 14:90603ea1e85b 207 #ifdef VGA_FRAME
dflet 14:90603ea1e85b 208 {1, 0xC8, 640 },
dflet 14:90603ea1e85b 209 #endif
dflet 14:90603ea1e85b 210 #ifdef QVGA_FRAME
dflet 21:38c6b11aa348 211 {1, 0xC8, 320 },
dflet 14:90603ea1e85b 212 #endif
dflet 14:90603ea1e85b 213 {1, 0xC6, 0x2709 }, // MODE_OUTPUT_HEIGHT_B
dflet 14:90603ea1e85b 214 #ifdef XGA_FRAME
dflet 14:90603ea1e85b 215 {1, 0xC8, 768 },
dflet 14:90603ea1e85b 216 #endif
dflet 14:90603ea1e85b 217 #ifdef VGA_FRAME
dflet 14:90603ea1e85b 218 {1, 0xC8, 480 },
dflet 14:90603ea1e85b 219 #endif
dflet 14:90603ea1e85b 220 #ifdef QVGA_FRAME
dflet 21:38c6b11aa348 221 {1, 0xC8, 240 },
dflet 14:90603ea1e85b 222 #endif
dflet 14:90603ea1e85b 223 {1, 0xC6, 0x2735 }, // MODE_CROP_X0_B
dflet 21:38c6b11aa348 224 {1, 0xC8, 640 },
dflet 14:90603ea1e85b 225 {1, 0xC6, 0x2737 }, // MODE_CROP_X1_B
dflet 14:90603ea1e85b 226 {1, 0xC8, 1600 },
dflet 14:90603ea1e85b 227 {1, 0xC6, 0x2739 }, // MODE_CROP_Y0_B
dflet 21:38c6b11aa348 228 {1, 0xC8, 480 },
dflet 14:90603ea1e85b 229 {1, 0xC6, 0x273B }, // MODE_CROP_Y1_B
dflet 14:90603ea1e85b 230 {1, 0xC8, 1200 },
dflet 21:38c6b11aa348 231 {1, 0xC6, 0xA103 }, //SEQ_CMD
dflet 21:38c6b11aa348 232 {1, 0xC8, 0x0005 }, //SEQ_CMD, refresh
dflet 21:38c6b11aa348 233 {100, 0x00, 0x00FA }, // Delay = 250ms
dflet 14:90603ea1e85b 234 // {111, 0xC8,0x0002 }, //Wait for sequencer change
dflet 14:90603ea1e85b 235 };
dflet 14:90603ea1e85b 236
dflet 14:90603ea1e85b 237 static const s_RegList bypass_pll_list[]= {
dflet 14:90603ea1e85b 238 {0, 0x65, 0xA000 }, // Disable PLL
dflet 14:90603ea1e85b 239 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 14:90603ea1e85b 240 };
dflet 14:90603ea1e85b 241
dflet 14:90603ea1e85b 242 static const s_RegList enable_pll_list[]= {
dflet 14:90603ea1e85b 243 {0, 0x65, 0x2000 }, // Enable PLL
dflet 14:90603ea1e85b 244 {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 14:90603ea1e85b 245 };
dflet 14:90603ea1e85b 246
dflet 14:90603ea1e85b 247 static const s_RegList context_a_list[]= {
dflet 14:90603ea1e85b 248 {1, 0xC6, 0xA103 }, //SEQ_CMD
dflet 14:90603ea1e85b 249 {1, 0xC8, 0x0001 }, //SEQ_CMD, Do Preview
dflet 0:50cedd586816 250 };
dflet 0:50cedd586816 251
dflet 14:90603ea1e85b 252 static const s_RegList enter_standby_list[]= {
dflet 14:90603ea1e85b 253 {1, 0xC6, 0xA103 }, //SEQ_CMD
dflet 14:90603ea1e85b 254 {1, 0xC8, 0x0003 }, //SEQ_CMD, standby
dflet 0:50cedd586816 255 };
dflet 0:50cedd586816 256
dflet 14:90603ea1e85b 257 static const s_RegList context_b_list[]= {
dflet 14:90603ea1e85b 258 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 14:90603ea1e85b 259 {1, 0xC8, 0x0002 }, // Start capture
dflet 14:90603ea1e85b 260 };
dflet 14:90603ea1e85b 261
dflet 14:90603ea1e85b 262 static const s_RegList start_capture_cmd_list[]= {
dflet 0:50cedd586816 263 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 14:90603ea1e85b 264 {1, 0xC8, 0x0002 }, // Start capture
dflet 14:90603ea1e85b 265 };
dflet 14:90603ea1e85b 266
dflet 14:90603ea1e85b 267 static const s_RegList stop_capture_cmd_list[]= {
dflet 14:90603ea1e85b 268 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 14:90603ea1e85b 269 {1, 0xC8, 0x0001 }, // Stop capture
dflet 0:50cedd586816 270 };
dflet 0:50cedd586816 271
dflet 0:50cedd586816 272 #define INDEX_CROP_X0 1
dflet 0:50cedd586816 273 #define INDEX_CROP_X1 3
dflet 0:50cedd586816 274 #define INDEX_CROP_Y0 5
dflet 0:50cedd586816 275 #define INDEX_CROP_Y1 7
dflet 0:50cedd586816 276 #define INDEX_SIZE_WIDTH 12//9
dflet 0:50cedd586816 277 #define INDEX_SIZE_HEIGHT 14//11
dflet 14:90603ea1e85b 278 static s_RegList resolution_cmds_list[]= {
dflet 14:90603ea1e85b 279 // {100, 0x00, 0x01F4 }, // Delay =500ms
dflet 0:50cedd586816 280 {1, 0xC6, 0x2735 }, //MODE_CROP_X0_A
dflet 0:50cedd586816 281 {1, 0xC8, 0x0000 }, //MODE_CROP_X0_A
dflet 0:50cedd586816 282 {1, 0xC6, 0x2737 }, //MODE_CROP_X1_A
dflet 0:50cedd586816 283 {1, 0xC8, 1600 }, //MODE_CROP_X1_A
dflet 0:50cedd586816 284 {1, 0xC6, 0x2739 }, //MODE_CROP_Y0_A
dflet 0:50cedd586816 285 {1, 0xC8, 0x0000 }, //MODE_CROP_Y0_A
dflet 0:50cedd586816 286 {1, 0xC6, 0x273B }, //MODE_CROP_Y1_A
dflet 14:90603ea1e85b 287 {1, 0xC8, 1200 }, //MODE_CROP_Y1_A
dflet 14:90603ea1e85b 288 {1, 0xC6, 0xA103 }, // SEQ_CMD, Do capture
dflet 0:50cedd586816 289 {1, 0xC8, 0x0005 },
dflet 14:90603ea1e85b 290
dflet 0:50cedd586816 291 {1, 0xC6, 0x2707 }, //MODE_OUTPUT_WIDTH_B
dflet 0:50cedd586816 292 {1, 0xC8, 640 }, //MODE_OUTPUT_WIDTH_B
dflet 0:50cedd586816 293 {1, 0xC6, 0x2709 }, //MODE_OUTPUT_HEIGHT_B
dflet 14:90603ea1e85b 294 {1, 0xC8, 480 }, //MODE_OUTPUT_HEIGHT_B
dflet 14:90603ea1e85b 295 {100, 0x00, 0x01f4 }, // Delay = 500ms
dflet 0:50cedd586816 296 };
dflet 14:90603ea1e85b 297 #endif
dflet 14:90603ea1e85b 298 static const s_RegList init_cmds_list[]= {
dflet 14:90603ea1e85b 299 {0, 0x33, 0x0343 }, // RESERVED_CORE_33
dflet 14:90603ea1e85b 300 {1, 0xC6, 0xA115 }, //SEQ_LLMODE
dflet 14:90603ea1e85b 301 {1, 0xC8, 0x0020 }, //SEQ_LLMODE
dflet 14:90603ea1e85b 302 {0, 0x38, 0x0866 }, // RESERVED_CORE_38
dflet 14:90603ea1e85b 303 {100, 0x00, 0x0064 }, // Delay =100ms
dflet 14:90603ea1e85b 304 {2, 0x80, 0x0168 }, // LENS_CORRECTION_CONTROL
dflet 14:90603ea1e85b 305 {2, 0x81, 0x6432 }, // ZONE_BOUNDS_X1_X2
dflet 14:90603ea1e85b 306 {2, 0x82, 0x3296 }, // ZONE_BOUNDS_X0_X3
dflet 14:90603ea1e85b 307 {2, 0x83, 0x9664 }, // ZONE_BOUNDS_X4_X5
dflet 14:90603ea1e85b 308 {2, 0x84, 0x5028 }, // ZONE_BOUNDS_Y1_Y2
dflet 14:90603ea1e85b 309 {2, 0x85, 0x2878 }, // ZONE_BOUNDS_Y0_Y3
dflet 14:90603ea1e85b 310 {2, 0x86, 0x7850 }, // ZONE_BOUNDS_Y4_Y5
dflet 14:90603ea1e85b 311 {2, 0x87, 0x0000 }, // CENTER_OFFSET
dflet 14:90603ea1e85b 312 {2, 0x88, 0x0152 }, // FX_RED
dflet 14:90603ea1e85b 313 {2, 0x89, 0x015C }, // FX_GREEN
dflet 14:90603ea1e85b 314 {2, 0x8A, 0x00F4 }, // FX_BLUE
dflet 14:90603ea1e85b 315 {2, 0x8B, 0x0108 }, // FY_RED
dflet 14:90603ea1e85b 316 {2, 0x8C, 0x00FA }, // FY_GREEN
dflet 14:90603ea1e85b 317 {2, 0x8D, 0x00CF }, // FY_BLUE
dflet 14:90603ea1e85b 318 {2, 0x8E, 0x09AD }, // DF_DX_RED
dflet 14:90603ea1e85b 319 {2, 0x8F, 0x091E }, // DF_DX_GREEN
dflet 14:90603ea1e85b 320 {2, 0x90, 0x0B3F }, // DF_DX_BLUE
dflet 14:90603ea1e85b 321 {2, 0x91, 0x0C85 }, // DF_DY_RED
dflet 14:90603ea1e85b 322 {2, 0x92, 0x0CFF }, // DF_DY_GREEN
dflet 14:90603ea1e85b 323 {2, 0x93, 0x0D86 }, // DF_DY_BLUE
dflet 14:90603ea1e85b 324 {2, 0x94, 0x163A }, // SECOND_DERIV_ZONE_0_RED
dflet 14:90603ea1e85b 325 {2, 0x95, 0x0E47 }, // SECOND_DERIV_ZONE_0_GREEN
dflet 14:90603ea1e85b 326 {2, 0x96, 0x103C }, // SECOND_DERIV_ZONE_0_BLUE
dflet 14:90603ea1e85b 327 {2, 0x97, 0x1D35 }, // SECOND_DERIV_ZONE_1_RED
dflet 14:90603ea1e85b 328 {2, 0x98, 0x173E }, // SECOND_DERIV_ZONE_1_GREEN
dflet 14:90603ea1e85b 329 {2, 0x99, 0x1119 }, // SECOND_DERIV_ZONE_1_BLUE
dflet 14:90603ea1e85b 330 {2, 0x9A, 0x1663 }, // SECOND_DERIV_ZONE_2_RED
dflet 14:90603ea1e85b 331 {2, 0x9B, 0x1569 }, // SECOND_DERIV_ZONE_2_GREEN
dflet 14:90603ea1e85b 332 {2, 0x9C, 0x104C }, // SECOND_DERIV_ZONE_2_BLUE
dflet 14:90603ea1e85b 333 {2, 0x9D, 0x1015 }, // SECOND_DERIV_ZONE_3_RED
dflet 14:90603ea1e85b 334 {2, 0x9E, 0x1010 }, // SECOND_DERIV_ZONE_3_GREEN
dflet 14:90603ea1e85b 335 {2, 0x9F, 0x0B0A }, // SECOND_DERIV_ZONE_3_BLUE
dflet 14:90603ea1e85b 336 {2, 0xA0, 0x0D53 }, // SECOND_DERIV_ZONE_4_RED
dflet 14:90603ea1e85b 337 {2, 0xA1, 0x0D51 }, // SECOND_DERIV_ZONE_4_GREEN
dflet 14:90603ea1e85b 338 {2, 0xA2, 0x0A44 }, // SECOND_DERIV_ZONE_4_BLUE
dflet 14:90603ea1e85b 339 {2, 0xA3, 0x1545 }, // SECOND_DERIV_ZONE_5_RED
dflet 14:90603ea1e85b 340 {2, 0xA4, 0x1643 }, // SECOND_DERIV_ZONE_5_GREEN
dflet 14:90603ea1e85b 341 {2, 0xA5, 0x1231 }, // SECOND_DERIV_ZONE_5_BLUE
dflet 14:90603ea1e85b 342 {2, 0xA6, 0x0047 }, // SECOND_DERIV_ZONE_6_RED
dflet 14:90603ea1e85b 343 {2, 0xA7, 0x035C }, // SECOND_DERIV_ZONE_6_GREEN
dflet 14:90603ea1e85b 344 {2, 0xA8, 0xFE30 }, // SECOND_DERIV_ZONE_6_BLUE
dflet 14:90603ea1e85b 345 {2, 0xA9, 0x4625 }, // SECOND_DERIV_ZONE_7_RED
dflet 14:90603ea1e85b 346 {2, 0xAA, 0x47F3 }, // SECOND_DERIV_ZONE_7_GREEN
dflet 14:90603ea1e85b 347 {2, 0xAB, 0x5859 }, // SECOND_DERIV_ZONE_7_BLUE
dflet 14:90603ea1e85b 348 {2, 0xAC, 0x0000 }, // X2_FACTORS
dflet 14:90603ea1e85b 349 {2, 0xAD, 0x0000 }, // GLOBAL_OFFSET_FXY_FUNCTION
dflet 14:90603ea1e85b 350 {2, 0xAE, 0x0000 }, // K_FACTOR_IN_K_FX_FY
dflet 14:90603ea1e85b 351 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 21:38c6b11aa348 352 {100, 0x00, 0x00C8 }, // Delay =200ms
dflet 14:90603ea1e85b 353 {1, 0xBE, 0x0004 }, // YUV_YCBCR_CONTROL
dflet 21:38c6b11aa348 354 {0, 0x65, 0xA000 }, // PLL CLOCK_ENABLING
dflet 21:38c6b11aa348 355 {100, 0x00, 0x00C8 }, // Delay =200ms
dflet 14:90603ea1e85b 356 {1, 0xC6, 0x2003 }, //MON_ARG1
dflet 14:90603ea1e85b 357 {1, 0xC8, 0x0748 }, //MON_ARG1
dflet 14:90603ea1e85b 358 {1, 0xC6, 0xA002 }, //MON_CMD
dflet 14:90603ea1e85b 359 {1, 0xC8, 0x0001 }, //MON_CMD
dflet 14:90603ea1e85b 360 {100, 0x00, 0x01F4 }, //Delay = 500ms
dflet 14:90603ea1e85b 361 {1, 0xC6, 0xA361 }, //AWB_TG_MIN0
dflet 14:90603ea1e85b 362 {1, 0xC8, 0x00E2 }, //AWB_TG_MIN0
dflet 14:90603ea1e85b 363 {1, 0x1F, 0x0018 }, // RESERVED_SOC1_1F
dflet 14:90603ea1e85b 364 {1, 0x51, 0x7F40 }, // RESERVED_SOC1_51
dflet 21:38c6b11aa348 365 {100, 0x00, 0x01F4 }, //Delay = 500ms
dflet 14:90603ea1e85b 366 {0, 0x33, 0x0343 }, // RESERVED_CORE_33
dflet 14:90603ea1e85b 367 {0, 0x38, 0x0868 }, // RESERVED_CORE_38
dflet 14:90603ea1e85b 368 {1, 0xC6, 0xA10F }, //SEQ_RESET_LEVEL_TH
dflet 14:90603ea1e85b 369 {1, 0xC8, 0x0042 }, //SEQ_RESET_LEVEL_TH
dflet 14:90603ea1e85b 370 {1, 0x1F, 0x0020 }, // RESERVED_SOC1_1F
dflet 14:90603ea1e85b 371 {1, 0xC6, 0xAB04 }, //HG_MAX_DLEVEL
dflet 14:90603ea1e85b 372 {1, 0xC8, 0x0008 }, //HG_MAX_DLEVEL
dflet 14:90603ea1e85b 373 {1, 0xC6, 0xA120 }, //SEQ_CAP_MODE
dflet 14:90603ea1e85b 374 {1, 0xC8, 0x0002 }, //SEQ_CAP_MODE
dflet 14:90603ea1e85b 375 {1, 0xC6, 0xA103 }, //SEQ_CMD
dflet 14:90603ea1e85b 376 {1, 0xC8, 0x0001 }, //SEQ_CMD
dflet 14:90603ea1e85b 377 {100, 0x00, 0x01F4 }, // Delay =1000ms
dflet 14:90603ea1e85b 378 {1, 0xC6, 0xA102 }, //SEQ_MODE
dflet 14:90603ea1e85b 379 {1, 0xC8, 0x001F }, //SEQ_MODE
dflet 14:90603ea1e85b 380 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 14:90603ea1e85b 381 {1, 0x08, 0x01EC }, // COLOR_PIPELINE_CONTROL
dflet 14:90603ea1e85b 382 {1, 0x08, 0x01FC }, // COLOR_PIPELINE_CONTROL
dflet 14:90603ea1e85b 383 {1, 0x36, 0x0F08 }, // APERTURE_PARAMETERS
dflet 14:90603ea1e85b 384 {1, 0xC6, 0x270B }, //MODE_CONFIG
dflet 14:90603ea1e85b 385 {1, 0xC8, 0x0030 }, //MODE_CONFIG, JPEG disabled for A and B
dflet 14:90603ea1e85b 386 {1, 0xC6, 0xA121 }, //SEQ_CAP_MODE
dflet 14:90603ea1e85b 387 {1, 0xC8, 0x007f }, //SEQ_CAP_MODE (127 frames before switching to Preview)
dflet 14:90603ea1e85b 388 {0, 0x05, 0x011E }, // HORZ_BLANK_B
dflet 14:90603ea1e85b 389 {0, 0x06, 0x006F }, // VERT_BLANK_B
dflet 14:90603ea1e85b 390 {0, 0x07, 0xFE }, // HORZ_BLANK_A
dflet 14:90603ea1e85b 391 {0, 0x08, 19 }, // VERT_BLANK_A
dflet 14:90603ea1e85b 392 {0, 0x20, 0x0303 }, // READ_MODE_B (Image flip settings)
dflet 14:90603ea1e85b 393 {0, 0x21, 0x8400 }, // READ_MODE_A (1ADC)
dflet 14:90603ea1e85b 394 {1, 0xC6, 0x2717 }, //MODE_SENSOR_X_DELAY_A
dflet 14:90603ea1e85b 395 {1, 0xC8, 792 }, //MODE_SENSOR_X_DELAY_A
dflet 14:90603ea1e85b 396 {1, 0xC6, 0x270F }, //MODE_SENSOR_ROW_START_A
dflet 14:90603ea1e85b 397 {1, 0xC8, 0x001C }, //MODE_SENSOR_ROW_START_A
dflet 14:90603ea1e85b 398 {1, 0xC6, 0x2711 }, //MODE_SENSOR_COL_START_A
dflet 14:90603ea1e85b 399 {1, 0xC8, 0x003C }, //MODE_SENSOR_COL_START_A
dflet 14:90603ea1e85b 400 {1, 0xC6, 0x2713 }, //MODE_SENSOR_ROW_HEIGHT_A
dflet 14:90603ea1e85b 401 {1, 0xC8, 0x04B0 }, //MODE_SENSOR_ROW_HEIGHT_A
dflet 14:90603ea1e85b 402 {1, 0xC6, 0x2715 }, //MODE_SENSOR_COL_WIDTH_A
dflet 14:90603ea1e85b 403 {1, 0xC8, 0x0640 }, //MODE_SENSOR_COL_WIDTH_A
dflet 14:90603ea1e85b 404 {1, 0xC6, 0x2719 }, //MODE_SENSOR_ROW_SPEED_A
dflet 14:90603ea1e85b 405 {1, 0xC8, 0x0011 }, //MODE_SENSOR_ROW_SPEED_A
dflet 14:90603ea1e85b 406 {1, 0xC6, 0x2707 }, //MODE_OUTPUT_WIDTH_B
dflet 14:90603ea1e85b 407 {1, 0xC8, 0x0640 }, //MODE_OUTPUT_WIDTH_B
dflet 14:90603ea1e85b 408 {1, 0xC6, 0x2709 }, //MODE_OUTPUT_HEIGHT_B
dflet 14:90603ea1e85b 409 {1, 0xC8, 0x04B0 }, //MODE_OUTPUT_HEIGHT_B
dflet 14:90603ea1e85b 410 {1, 0xC6, 0x271B }, //MODE_SENSOR_ROW_START_B
dflet 14:90603ea1e85b 411 {1, 0xC8, 0x001C }, //MODE_SENSOR_ROW_START_B
dflet 14:90603ea1e85b 412 {1, 0xC6, 0x271D }, //MODE_SENSOR_COL_START_B
dflet 14:90603ea1e85b 413 {1, 0xC8, 0x003C }, //MODE_SENSOR_COL_START_B
dflet 14:90603ea1e85b 414 {1, 0xC6, 0x271F }, //MODE_SENSOR_ROW_HEIGHT_B
dflet 14:90603ea1e85b 415 {1, 0xC8, 0x04B0 }, //MODE_SENSOR_ROW_HEIGHT_B
dflet 14:90603ea1e85b 416 {1, 0xC6, 0x2721 }, //MODE_SENSOR_COL_WIDTH_B
dflet 14:90603ea1e85b 417 {1, 0xC8, 0x0640 }, //MODE_SENSOR_COL_WIDTH_B
dflet 14:90603ea1e85b 418 {1, 0xC6, 0x2723 }, //MODE_SENSOR_X_DELAY_B
dflet 14:90603ea1e85b 419 {1, 0xC8, 0x0716 }, //MODE_SENSOR_X_DELAY_B
dflet 14:90603ea1e85b 420 {1, 0xC6, 0x2725 }, //MODE_SENSOR_ROW_SPEED_B
dflet 14:90603ea1e85b 421 {1, 0xC8, 0x0011 }, //MODE_SENSOR_ROW_SPEED_B
dflet 14:90603ea1e85b 422 //Maximum Slew-Rate on IO-Pads (for Mode A)
dflet 14:90603ea1e85b 423 {1, 0xC6, 0x276B }, //MODE_FIFO_CONF0_A
dflet 14:90603ea1e85b 424 {1, 0xC8, 0x0027 }, //MODE_FIFO_CONF0_A
dflet 14:90603ea1e85b 425 {1, 0xC6, 0x276D }, //MODE_FIFO_CONF1_A
dflet 14:90603ea1e85b 426 {1, 0xC8, 0xE1E1 }, //MODE_FIFO_CONF1_A
dflet 14:90603ea1e85b 427 {1, 0xC6, 0xA76F }, //MODE_FIFO_CONF2_A
dflet 14:90603ea1e85b 428 {1, 0xC8, 0x00E1 }, //MODE_FIFO_CONF2_A
dflet 14:90603ea1e85b 429 //Maximum Slew-Rate on IO-Pads (for Mode B)
dflet 14:90603ea1e85b 430 {1, 0xC6, 0x2772 }, //MODE_FIFO_CONF0_B
dflet 14:90603ea1e85b 431 {1, 0xC8, 0x0027 }, //MODE_FIFO_CONF0_B
dflet 14:90603ea1e85b 432 {1, 0xC6, 0x2774 }, //MODE_FIFO_CONF1_B
dflet 14:90603ea1e85b 433 {1, 0xC8, 0xE1E1 }, //MODE_FIFO_CONF1_B
dflet 14:90603ea1e85b 434 {1, 0xC6, 0xA776 }, //MODE_FIFO_CONF2_B
dflet 14:90603ea1e85b 435 {1, 0xC8, 0x00E1 }, //MODE_FIFO_CONF2_B
dflet 14:90603ea1e85b 436 //Set maximum integration time to get a minimum of 15 fps at 45MHz
dflet 14:90603ea1e85b 437 {1, 0xC6, 0xA20E }, //AE_MAX_INDEX
dflet 14:90603ea1e85b 438 {1, 0xC8, 0x0004 }, //AE_MAX_INDEX
dflet 14:90603ea1e85b 439 //Set minimum integration time to get a maximum of 15 fps at 45MHz
dflet 14:90603ea1e85b 440 {1, 0xC6, 0xA20D }, //AE_MAX_INDEX
dflet 14:90603ea1e85b 441 {1, 0xC8, 0x0004 }, //AE_MAX_INDEX
dflet 14:90603ea1e85b 442 // Configue all GPIO for output and set low to save power
dflet 14:90603ea1e85b 443 {1, 0xC6, 0x9078 },
dflet 14:90603ea1e85b 444 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 445 {1, 0xC6, 0x9079 },
dflet 14:90603ea1e85b 446 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 447 {1, 0xC6, 0x9070 },
dflet 14:90603ea1e85b 448 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 449 {1, 0xC6, 0x9071 },
dflet 14:90603ea1e85b 450 {1, 0xC8, 0x0000 },
dflet 14:90603ea1e85b 451 // gamma and contrast
dflet 14:90603ea1e85b 452 {1, 0xC6, 0xA743 }, // MODE_GAM_CONT_A
dflet 14:90603ea1e85b 453 {1, 0xC8, 0x0003 }, // MODE_GAM_CONT_A
dflet 14:90603ea1e85b 454 {1, 0xC6, 0xA744 }, // MODE_GAM_CONT_B
dflet 14:90603ea1e85b 455 {1, 0xC8, 0x0003 }, // MODE_GAM_CONT_B
dflet 14:90603ea1e85b 456 {100, 0x00, 0x01f4 }, // Delay =500ms
dflet 0:50cedd586816 457
dflet 14:90603ea1e85b 458 };
dflet 21:38c6b11aa348 459
dflet 14:90603ea1e85b 460 void getCamId()
dflet 14:90603ea1e85b 461 {
dflet 0:50cedd586816 462
dflet 13:bf45f592c2b6 463 uint16_t Id = 0;
dflet 13:bf45f592c2b6 464 uint8_t ucBuffer[20];
dflet 14:90603ea1e85b 465
dflet 13:bf45f592c2b6 466 ucBuffer[0] = 0x00;
dflet 13:bf45f592c2b6 467 ucBuffer[1] = 0x00;
dflet 14:90603ea1e85b 468
dflet 14:90603ea1e85b 469 int lRetVal = -1;
dflet 14:90603ea1e85b 470
dflet 14:90603ea1e85b 471 lRetVal = RegLstWrite((s_RegList *)soft_reset_cmd_list, sizeof(soft_reset_cmd_list)/sizeof(s_RegList));
dflet 21:38c6b11aa348 472 wait_ms(1);
dflet 14:90603ea1e85b 473 I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,1,I2C_SEND_STOP);
dflet 14:90603ea1e85b 474 I2CBufferRead(CAM_I2C_SLAVE_READ,ucBuffer,2,I2C_SEND_STOP);
dflet 14:90603ea1e85b 475
dflet 13:bf45f592c2b6 476 Id = (uint16_t)ucBuffer[0] << 8 | (uint16_t)ucBuffer[1];
dflet 13:bf45f592c2b6 477
dflet 13:bf45f592c2b6 478 HttpDebug("\r\nCamera ID = 0x%x\r\n",Id);
dflet 14:90603ea1e85b 479
dflet 14:90603ea1e85b 480 if(Id != 0x1519) {
dflet 14:90603ea1e85b 481 HttpDebug("MT9D111 Camera not found! I2C read/write failed. \n\r");
dflet 14:90603ea1e85b 482 HAL_DCMI_MspDeInit(&phdcmi);
dflet 14:90603ea1e85b 483 while(1);
dflet 14:90603ea1e85b 484 }
dflet 14:90603ea1e85b 485
dflet 14:90603ea1e85b 486
dflet 14:90603ea1e85b 487 }
dflet 13:bf45f592c2b6 488
dflet 0:50cedd586816 489 //*****************************************************************************
dflet 0:50cedd586816 490 //
dflet 0:50cedd586816 491 //! This function initilizes the camera sensor
dflet 0:50cedd586816 492 //!
dflet 0:50cedd586816 493 //! \param None
dflet 0:50cedd586816 494 //!
dflet 0:50cedd586816 495 //! \return 0 - Success
dflet 0:50cedd586816 496 //! -1 - Error
dflet 0:50cedd586816 497 //
dflet 0:50cedd586816 498 //*****************************************************************************
dflet 0:50cedd586816 499
dflet 0:50cedd586816 500 int CameraSensorInit()
dflet 0:50cedd586816 501 {
dflet 14:90603ea1e85b 502 HttpDebug("CameraSensorInit \n\r");
dflet 0:50cedd586816 503 int lRetVal = -1;
dflet 14:90603ea1e85b 504
dflet 0:50cedd586816 505 lRetVal = RegLstWrite((s_RegList *)init_cmds_list, \
dflet 14:90603ea1e85b 506 sizeof(init_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 507 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 508
dflet 14:90603ea1e85b 509 lRetVal = RegLstWrite((s_RegList *)pll_cmds_list, \
dflet 14:90603ea1e85b 510 sizeof(pll_cmds_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 511 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 512
dflet 0:50cedd586816 513 #ifndef ENABLE_JPEG
dflet 14:90603ea1e85b 514
dflet 0:50cedd586816 515 lRetVal = RegLstWrite((s_RegList *)preview_cmds_list,
dflet 14:90603ea1e85b 516 sizeof(preview_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 517 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 518 lRetVal = RegLstWrite((s_RegList *)image_size_240_320_preview_cmds_list, \
dflet 14:90603ea1e85b 519 sizeof(image_size_240_320_preview_cmds_list)/ \
dflet 14:90603ea1e85b 520 sizeof(s_RegList));
dflet 0:50cedd586816 521 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 522 lRetVal = RegLstWrite((s_RegList *)freq_setup_cmd_List,
dflet 14:90603ea1e85b 523 sizeof(freq_setup_cmd_List)/sizeof(s_RegList));
dflet 0:50cedd586816 524 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 525 lRetVal = RegLstWrite((s_RegList *)preview_on_cmd_list,
dflet 14:90603ea1e85b 526 sizeof(preview_on_cmd_list)/sizeof(s_RegList));
dflet 0:50cedd586816 527 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 528 #endif
dflet 0:50cedd586816 529 return 0;
dflet 0:50cedd586816 530 }
dflet 0:50cedd586816 531
dflet 0:50cedd586816 532 //*****************************************************************************
dflet 0:50cedd586816 533 //
dflet 0:50cedd586816 534 //! This function configures the sensor in JPEG mode
dflet 0:50cedd586816 535 //!
dflet 0:50cedd586816 536 //! \param[in] width - X-Axis
dflet 0:50cedd586816 537 //! \param[in] height - Y-Axis
dflet 0:50cedd586816 538 //!
dflet 0:50cedd586816 539 //! \return 0 - Success
dflet 0:50cedd586816 540 //! -1 - Error
dflet 0:50cedd586816 541 //
dflet 0:50cedd586816 542 //*****************************************************************************
dflet 0:50cedd586816 543 int StartSensorInJpegMode(int width, int height)
dflet 0:50cedd586816 544 {
dflet 14:90603ea1e85b 545
dflet 0:50cedd586816 546 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 547 int lRetVal = -1;
dflet 14:90603ea1e85b 548 HttpDebug("\n\rStartSensorInJpegMode \n\r");
dflet 0:50cedd586816 549 lRetVal = RegLstWrite((s_RegList *)capture_cmds_list,
dflet 14:90603ea1e85b 550 sizeof(capture_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 551 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 552 #endif
dflet 14:90603ea1e85b 553 return 0;
dflet 14:90603ea1e85b 554 }
dflet 14:90603ea1e85b 555
dflet 14:90603ea1e85b 556 int StartCaptureCmd()
dflet 14:90603ea1e85b 557 {
dflet 14:90603ea1e85b 558
dflet 14:90603ea1e85b 559 int32_t lRetVal= -1;
dflet 14:90603ea1e85b 560
dflet 14:90603ea1e85b 561 #ifdef ENABLE_JPEG
dflet 14:90603ea1e85b 562 lRetVal = RegLstWrite((s_RegList *)start_capture_cmd_list,
dflet 14:90603ea1e85b 563 sizeof(start_capture_cmd_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 564 #endif
dflet 14:90603ea1e85b 565 return 0;
dflet 14:90603ea1e85b 566 }
dflet 14:90603ea1e85b 567
dflet 14:90603ea1e85b 568 int StopCaptureCmd()
dflet 14:90603ea1e85b 569 {
dflet 14:90603ea1e85b 570
dflet 14:90603ea1e85b 571 int32_t lRetVal= -1;
dflet 14:90603ea1e85b 572
dflet 14:90603ea1e85b 573 #ifdef ENABLE_JPEG
dflet 14:90603ea1e85b 574 lRetVal = RegLstWrite((s_RegList *)stop_capture_cmd_list,
dflet 14:90603ea1e85b 575 sizeof(stop_capture_cmd_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 576 #endif
dflet 0:50cedd586816 577 return 0;
dflet 0:50cedd586816 578 }
dflet 0:50cedd586816 579
dflet 0:50cedd586816 580 //*****************************************************************************
dflet 0:50cedd586816 581 //
dflet 0:50cedd586816 582 //! This function configures the sensor ouput resolution
dflet 0:50cedd586816 583 //!
dflet 0:50cedd586816 584 //! \param[in] width - X-Axis
dflet 0:50cedd586816 585 //! \param[in] height - Y-Axis
dflet 0:50cedd586816 586 //!
dflet 0:50cedd586816 587 //! \return 0 - Success
dflet 0:50cedd586816 588 //! -1 - Error
dflet 0:50cedd586816 589 //
dflet 0:50cedd586816 590 //*****************************************************************************
dflet 0:50cedd586816 591 int CameraSensorResolution(int width, int height)
dflet 0:50cedd586816 592 {
dflet 14:90603ea1e85b 593 HttpDebug("CameraSensorResolution \n\r");
dflet 0:50cedd586816 594 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 595 int lRetVal = -1;
dflet 0:50cedd586816 596
dflet 14:90603ea1e85b 597 lRetVal = RegLstWrite((s_RegList *)stop_capture_cmd_list,
dflet 14:90603ea1e85b 598 sizeof(stop_capture_cmd_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 599 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 600
dflet 0:50cedd586816 601 resolution_cmds_list[INDEX_SIZE_WIDTH].usValue = width;
dflet 0:50cedd586816 602 resolution_cmds_list[INDEX_SIZE_HEIGHT].usValue = height;
dflet 0:50cedd586816 603 lRetVal = RegLstWrite((s_RegList *)resolution_cmds_list,
dflet 14:90603ea1e85b 604 sizeof(resolution_cmds_list)/sizeof(s_RegList));
dflet 0:50cedd586816 605 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 606
dflet 14:90603ea1e85b 607 lRetVal = RegLstWrite((s_RegList *)start_capture_cmd_list,
dflet 14:90603ea1e85b 608 sizeof(start_capture_cmd_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 609 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 610
dflet 0:50cedd586816 611
dflet 0:50cedd586816 612 #else
dflet 0:50cedd586816 613 if(width != 240 || height != 256)
dflet 0:50cedd586816 614 return -1;
dflet 14:90603ea1e85b 615 #endif
dflet 0:50cedd586816 616 return 0;
dflet 0:50cedd586816 617 }
dflet 0:50cedd586816 618
dflet 0:50cedd586816 619 //*****************************************************************************
dflet 0:50cedd586816 620 //
dflet 0:50cedd586816 621 //! This function implements the Register Write in MT9D111 sensor
dflet 0:50cedd586816 622 //!
dflet 0:50cedd586816 623 //! \param1 Register List
dflet 0:50cedd586816 624 //! \param2 No. Of Items
dflet 0:50cedd586816 625 //!
dflet 0:50cedd586816 626 //! \return 0 - Success
dflet 0:50cedd586816 627 //! -1 - Error
dflet 0:50cedd586816 628 //
dflet 0:50cedd586816 629 //*****************************************************************************
dflet 0:50cedd586816 630 static int RegLstWrite(s_RegList *pRegLst, unsigned int ulNofItems)
dflet 0:50cedd586816 631 {
dflet 21:38c6b11aa348 632
dflet 0:50cedd586816 633 unsigned int ulNdx;
dflet 0:50cedd586816 634 unsigned short usTemp;
dflet 0:50cedd586816 635 unsigned char i;
dflet 13:bf45f592c2b6 636 uint8_t ucBuffer[20];
dflet 0:50cedd586816 637 unsigned int ulSize;
dflet 0:50cedd586816 638 int lRetVal = -1;
dflet 14:90603ea1e85b 639 int l = 0;
dflet 0:50cedd586816 640
dflet 14:90603ea1e85b 641 if(pRegLst == NULL) {
dflet 0:50cedd586816 642 return RET_ERROR;
dflet 0:50cedd586816 643 }
dflet 0:50cedd586816 644
dflet 14:90603ea1e85b 645 for(ulNdx = 0; ulNdx < ulNofItems; ulNdx++) {
dflet 14:90603ea1e85b 646 if(pRegLst->ucPageAddr == 100) {
dflet 14:90603ea1e85b 647 // PageAddr == 100, insret a delay equal to reg value
dflet 14:90603ea1e85b 648 wait_ms(pRegLst->usValue);
dflet 14:90603ea1e85b 649 } else {
dflet 14:90603ea1e85b 650 // Set the page
dflet 13:bf45f592c2b6 651 ucBuffer[0] = SENSOR_PAGE_REG;//0xF0
dflet 0:50cedd586816 652 ucBuffer[1] = 0x00;
dflet 13:bf45f592c2b6 653 ucBuffer[2] = pRegLst->ucPageAddr;
dflet 14:90603ea1e85b 654
dflet 14:90603ea1e85b 655 if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 3, I2C_SEND_STOP)) {
dflet 14:90603ea1e85b 656 HttpDebug("\n\rError writing SENSOR_PAGE_REG \n\r");
dflet 0:50cedd586816 657 return RET_ERROR;
dflet 0:50cedd586816 658 }
dflet 0:50cedd586816 659
dflet 0:50cedd586816 660 ucBuffer[0] = SENSOR_PAGE_REG;
dflet 14:90603ea1e85b 661 lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 1, 0);
dflet 0:50cedd586816 662 ASSERT_ON_ERROR(lRetVal);
dflet 14:90603ea1e85b 663 lRetVal = I2CBufferRead(CAM_I2C_SLAVE_READ, ucBuffer, 2, I2C_SEND_STOP);
dflet 0:50cedd586816 664 ASSERT_ON_ERROR(lRetVal);
dflet 0:50cedd586816 665
dflet 0:50cedd586816 666 ucBuffer[0] = pRegLst->ucRegAddr;
dflet 0:50cedd586816 667
dflet 14:90603ea1e85b 668 if(pRegLst->ucPageAddr == 0x1 && pRegLst->ucRegAddr == 0xC8) {
dflet 0:50cedd586816 669 usTemp = 0xC8;
dflet 0:50cedd586816 670 i=1;
dflet 14:90603ea1e85b 671 while(pRegLst->ucRegAddr == usTemp) {
dflet 0:50cedd586816 672 ucBuffer[i] = (unsigned char)(pRegLst->usValue >> 8);
dflet 0:50cedd586816 673 ucBuffer[i+1] = (unsigned char)(pRegLst->usValue & 0xFF);
dflet 0:50cedd586816 674 i += 2;
dflet 0:50cedd586816 675 usTemp++;
dflet 0:50cedd586816 676 pRegLst++;
dflet 0:50cedd586816 677 ulNdx++;
dflet 0:50cedd586816 678 }
dflet 0:50cedd586816 679
dflet 0:50cedd586816 680 ulSize = (i-2)*2 + 1;
dflet 0:50cedd586816 681 ulNdx--;
dflet 0:50cedd586816 682 pRegLst--;
dflet 14:90603ea1e85b 683 } else {
dflet 0:50cedd586816 684 ulSize = 3;
dflet 0:50cedd586816 685 ucBuffer[1] = (unsigned char)(pRegLst->usValue >> 8);
dflet 0:50cedd586816 686 ucBuffer[2] = (unsigned char)(pRegLst->usValue & 0xFF);
dflet 0:50cedd586816 687 }
dflet 0:50cedd586816 688
dflet 14:90603ea1e85b 689 if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer, ulSize,I2C_SEND_STOP)) {
dflet 14:90603ea1e85b 690 HttpDebug("\n\rError i2c write \n\r");
dflet 0:50cedd586816 691 return RET_ERROR;
dflet 0:50cedd586816 692 }
dflet 0:50cedd586816 693 }
dflet 0:50cedd586816 694
dflet 0:50cedd586816 695 pRegLst++;
dflet 0:50cedd586816 696 wait_ms(10);
dflet 0:50cedd586816 697 }
dflet 0:50cedd586816 698
dflet 0:50cedd586816 699 return RET_OK;
dflet 0:50cedd586816 700 }
dflet 0:50cedd586816 701
dflet 14:90603ea1e85b 702 static int wait_for_seq_state(int state)
dflet 14:90603ea1e85b 703 {
dflet 14:90603ea1e85b 704 int i, new_state;
dflet 14:90603ea1e85b 705
dflet 14:90603ea1e85b 706 for (i = 0; i < 1000; i++) {
dflet 14:90603ea1e85b 707 new_state = read_firmware_var(SEQ_DRV_ID, SEQ_STATE_OFFSET, 1);
dflet 14:90603ea1e85b 708 // HttpDebug("seq state %d\r\n", new_state);
dflet 14:90603ea1e85b 709 if (new_state == state){
dflet 14:90603ea1e85b 710 return 0;
dflet 14:90603ea1e85b 711 }
dflet 14:90603ea1e85b 712 wait_ms(2);
dflet 14:90603ea1e85b 713 }
dflet 14:90603ea1e85b 714 HttpDebug("Timeout waiting for seq_state %d\r\n", state);
dflet 14:90603ea1e85b 715 return 1;
dflet 14:90603ea1e85b 716 }
dflet 14:90603ea1e85b 717
dflet 14:90603ea1e85b 718 /*
dflet 14:90603ea1e85b 719 * Read a 8/16-bit value from a firmware driver given the driver ID and the
dflet 14:90603ea1e85b 720 * var offset. It assumes logic address.
dflet 14:90603ea1e85b 721 * The value is returned if successful, or 1 otherwise.
dflet 14:90603ea1e85b 722 */
dflet 14:90603ea1e85b 723 static uint16_t read_firmware_var(int id, int offset, int byte)
dflet 14:90603ea1e85b 724 {
dflet 14:90603ea1e85b 725 uint16_t val;
dflet 14:90603ea1e85b 726 uint8_t ucBuffer[20];
dflet 14:90603ea1e85b 727 /* always use logical address */
dflet 14:90603ea1e85b 728 val = VAR_ADDRESS_TYPE_LOGIC << VAR_ADDRESS_TYPE_SHIFT;
dflet 14:90603ea1e85b 729 val |= (byte << VAR_LENGTH_SHIFT);
dflet 14:90603ea1e85b 730 val |= (id << VAR_DRV_ID_SHIFT);
dflet 14:90603ea1e85b 731 val |= (offset << VAR_ADDRESS_SHIFT);
dflet 14:90603ea1e85b 732
dflet 14:90603ea1e85b 733 ucBuffer[0] = REG_PAGE;//0xF0
dflet 14:90603ea1e85b 734 ucBuffer[1] = 0x00;
dflet 14:90603ea1e85b 735 ucBuffer[2] = PAGE_IFP1;//1
dflet 14:90603ea1e85b 736
dflet 14:90603ea1e85b 737 /* setup page pointer */
dflet 14:90603ea1e85b 738 if (I2CBufferWrite(CAM_I2C_SLAVE_WRITE, (uint8_t*)ucBuffer, 3, I2C_SEND_STOP)){
dflet 14:90603ea1e85b 739 return 1;
dflet 14:90603ea1e85b 740 }
dflet 14:90603ea1e85b 741 ucBuffer[0] = REG_VAR_ADDR;//0xC6
dflet 14:90603ea1e85b 742 ucBuffer[1] = val >> 8;
dflet 14:90603ea1e85b 743 ucBuffer[2] = val & 0x00FF;
dflet 14:90603ea1e85b 744
dflet 14:90603ea1e85b 745 /* setup var pointer */
dflet 14:90603ea1e85b 746 if (I2CBufferWrite(CAM_I2C_SLAVE_WRITE, (uint8_t*)ucBuffer, 3, I2C_SEND_STOP)){
dflet 14:90603ea1e85b 747 return 1;
dflet 14:90603ea1e85b 748 }
dflet 14:90603ea1e85b 749 ucBuffer[0] = REG_VAR_DATA;//0xC8
dflet 14:90603ea1e85b 750 if (I2CBufferWrite(CAM_I2C_SLAVE_WRITE, (uint8_t*)ucBuffer, 1, I2C_SEND_STOP)){
dflet 14:90603ea1e85b 751 return 1;
dflet 14:90603ea1e85b 752 }
dflet 14:90603ea1e85b 753
dflet 14:90603ea1e85b 754 /* read the var */
dflet 14:90603ea1e85b 755 if (I2CBufferRead(CAM_I2C_SLAVE_READ, ucBuffer, 2, I2C_SEND_STOP)){
dflet 14:90603ea1e85b 756 return 1;
dflet 14:90603ea1e85b 757 }
dflet 14:90603ea1e85b 758 val = ucBuffer[0] << 8;
dflet 14:90603ea1e85b 759 val |= ucBuffer[1];
dflet 14:90603ea1e85b 760
dflet 14:90603ea1e85b 761 return val;
dflet 14:90603ea1e85b 762 }
dflet 14:90603ea1e85b 763
dflet 14:90603ea1e85b 764 int Start_still_capture(int frames)
dflet 14:90603ea1e85b 765 {
dflet 14:90603ea1e85b 766 int err = 1;
dflet 14:90603ea1e85b 767
dflet 14:90603ea1e85b 768 // HttpDebug("Context B comamnd sequence ...");
dflet 14:90603ea1e85b 769 err = RegLstWrite((s_RegList *)context_b_list, sizeof(context_b_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 770 if (err){
dflet 14:90603ea1e85b 771 return err;
dflet 14:90603ea1e85b 772 }
dflet 14:90603ea1e85b 773 /* wait until the seq driver state change */
dflet 14:90603ea1e85b 774 err = wait_for_seq_state(SEQ_STATE_CAPTURE);
dflet 14:90603ea1e85b 775 if (err == 1){
dflet 14:90603ea1e85b 776 return err;
dflet 14:90603ea1e85b 777 }
dflet 14:90603ea1e85b 778 /* need a few frames delay to stablize the output */
dflet 18:3f1b52616d00 779 // wait_ms(500);
dflet 14:90603ea1e85b 780
dflet 14:90603ea1e85b 781 return 0;
dflet 14:90603ea1e85b 782 }
dflet 14:90603ea1e85b 783
dflet 14:90603ea1e85b 784 int Stop_still_capture(){
dflet 14:90603ea1e85b 785 int err = 1;
dflet 14:90603ea1e85b 786
dflet 14:90603ea1e85b 787 // HttpDebug("Context A comamnd sequence ...");
dflet 14:90603ea1e85b 788
dflet 14:90603ea1e85b 789 err = RegLstWrite((s_RegList *)context_a_list, sizeof(context_a_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 790 if (err){
dflet 14:90603ea1e85b 791 return err;
dflet 14:90603ea1e85b 792 }
dflet 14:90603ea1e85b 793 /* wait until the seq driver state change */
dflet 14:90603ea1e85b 794 err = wait_for_seq_state(SEQ_STATE_PREVIEW);
dflet 14:90603ea1e85b 795 if (err == 1){
dflet 14:90603ea1e85b 796 return err;
dflet 14:90603ea1e85b 797 }
dflet 14:90603ea1e85b 798 return 0;
dflet 14:90603ea1e85b 799 }
dflet 14:90603ea1e85b 800
dflet 14:90603ea1e85b 801 int cam_power_on(void)
dflet 14:90603ea1e85b 802 {
dflet 14:90603ea1e85b 803
dflet 14:90603ea1e85b 804 int err;
dflet 14:90603ea1e85b 805 HttpDebug("cam_power_on \r\n");
dflet 14:90603ea1e85b 806 /* the caller already enabled our XCLK, wait to make sure it is stable */
dflet 14:90603ea1e85b 807 wait_us(100);
dflet 14:90603ea1e85b 808 /* release STANDBY line */
dflet 14:90603ea1e85b 809 cam_exit_standby();
dflet 14:90603ea1e85b 810 /* wait 1ms before enable PLL per Micron Tech. Note */
dflet 14:90603ea1e85b 811 wait_ms(1);
dflet 14:90603ea1e85b 812
dflet 14:90603ea1e85b 813 err = RegLstWrite((s_RegList *)pll_cmds_list, sizeof(pll_cmds_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 814 if (err){
dflet 14:90603ea1e85b 815 return err;
dflet 14:90603ea1e85b 816 }
dflet 14:90603ea1e85b 817 err = RegLstWrite((s_RegList *)context_a_list, sizeof(context_a_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 818 if (err){
dflet 14:90603ea1e85b 819 return err;
dflet 14:90603ea1e85b 820 }
dflet 14:90603ea1e85b 821 err = wait_for_seq_state(SEQ_STATE_PREVIEW);
dflet 14:90603ea1e85b 822 return err;
dflet 14:90603ea1e85b 823 }
dflet 14:90603ea1e85b 824
dflet 14:90603ea1e85b 825 int cam_power_off(void)
dflet 14:90603ea1e85b 826 {
dflet 14:90603ea1e85b 827
dflet 14:90603ea1e85b 828 int err;
dflet 14:90603ea1e85b 829
dflet 14:90603ea1e85b 830 /* have to check sequencer is in preview mode */
dflet 14:90603ea1e85b 831 if (read_firmware_var(SEQ_DRV_ID, SEQ_STATE_OFFSET, 1) != SEQ_STATE_PREVIEW) {
dflet 14:90603ea1e85b 832 // printf("Calling power_off while not in preview state!\r\n");
dflet 14:90603ea1e85b 833 /* Put sequencer in preview mode */
dflet 14:90603ea1e85b 834 err = RegLstWrite((s_RegList *)context_a_list, sizeof(context_a_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 835 if (err){
dflet 14:90603ea1e85b 836 HttpDebug("Error writing context_a_list!\r\n");
dflet 14:90603ea1e85b 837 return err;
dflet 14:90603ea1e85b 838 }
dflet 14:90603ea1e85b 839 err = wait_for_seq_state(SEQ_STATE_PREVIEW);
dflet 14:90603ea1e85b 840 if (err){
dflet 14:90603ea1e85b 841 HttpDebug("Cannot place cam in preview state!\r\n");
dflet 14:90603ea1e85b 842 return err;
dflet 14:90603ea1e85b 843 }
dflet 14:90603ea1e85b 844 }
dflet 14:90603ea1e85b 845
dflet 14:90603ea1e85b 846 /* Issue standby command to sequencer */
dflet 14:90603ea1e85b 847 err = RegLstWrite((s_RegList *)enter_standby_list, sizeof(enter_standby_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 848 if (err){
dflet 14:90603ea1e85b 849 return err;
dflet 14:90603ea1e85b 850 }
dflet 14:90603ea1e85b 851 /* Poll the sequencer until it enters standby state */
dflet 14:90603ea1e85b 852 err = wait_for_seq_state(SEQ_STATE_STANDBY);
dflet 14:90603ea1e85b 853 if (err){
dflet 14:90603ea1e85b 854 return err;
dflet 14:90603ea1e85b 855 }
dflet 14:90603ea1e85b 856 /* bypass PLL */
dflet 14:90603ea1e85b 857 err = RegLstWrite((s_RegList *)bypass_pll_list, sizeof(bypass_pll_list)/sizeof(s_RegList));
dflet 14:90603ea1e85b 858 if (err){
dflet 14:90603ea1e85b 859 return err;
dflet 14:90603ea1e85b 860 }
dflet 14:90603ea1e85b 861 /* assert STANDBY line */
dflet 14:90603ea1e85b 862 cam_enter_standby();
dflet 14:90603ea1e85b 863 /* the caller can cut off XCLK now */
dflet 14:90603ea1e85b 864 return 0;
dflet 14:90603ea1e85b 865 }
dflet 14:90603ea1e85b 866
dflet 14:90603ea1e85b 867 void cam_exit_standby(void)
dflet 14:90603ea1e85b 868 {
dflet 14:90603ea1e85b 869 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 870 HttpDebug("cam_exit_standby \r\n");
dflet 14:90603ea1e85b 871 standby = 0;
dflet 14:90603ea1e85b 872 #endif
dflet 14:90603ea1e85b 873 }
dflet 14:90603ea1e85b 874
dflet 14:90603ea1e85b 875 void cam_enter_standby(void)
dflet 14:90603ea1e85b 876 {
dflet 14:90603ea1e85b 877 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 878 HttpDebug("cam_enter_standby \r\n");
dflet 14:90603ea1e85b 879 standby = 1;
dflet 14:90603ea1e85b 880 wait(1);
dflet 14:90603ea1e85b 881 #endif
dflet 14:90603ea1e85b 882 }
dflet 14:90603ea1e85b 883
dflet 0:50cedd586816 884 //*****************************************************************************
dflet 0:50cedd586816 885 //
dflet 0:50cedd586816 886 // Close the Doxygen group.
dflet 0:50cedd586816 887 //! @}
dflet 0:50cedd586816 888 //
dflet 0:50cedd586816 889 //*****************************************************************************
dflet 0:50cedd586816 890