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.
camera_app/mt9d111/mt9d111.cpp@22:f9b5e0b80bf2, 2015-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 |