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

Dependencies:   mbed

Committer:
dflet
Date:
Fri Aug 28 21:04:44 2015 +0000
Revision:
15:5433f9d94cd7
Parent:
14:90603ea1e85b
Child:
16:7e5aab2fabba
Cam ov2640 working correctly, didnt know it also gave a jpeg header. App still not stable. Still a lot of work needed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // camera_app.c
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // camera application macro & APIs
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 camera_app
dflet 0:50cedd586816 41 //! @{
dflet 0:50cedd586816 42 //
dflet 0:50cedd586816 43 //*****************************************************************************
dflet 5:75fcfdb7cae7 44 #include "mbed.h"
dflet 0:50cedd586816 45 #include <stdio.h>
dflet 0:50cedd586816 46 #include <string.h>
dflet 0:50cedd586816 47 #include <stdlib.h>
dflet 0:50cedd586816 48
dflet 0:50cedd586816 49 // SimpleLink include
dflet 0:50cedd586816 50 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 51
dflet 6:37fb696395d7 52 #include "oslib/osi.h"
dflet 14:90603ea1e85b 53 #include "app_config.h"
dflet 0:50cedd586816 54 #include "camera_app.h"
dflet 0:50cedd586816 55 #include "mt9d111.h"
dflet 14:90603ea1e85b 56 #ifdef OV5642_CAM
dflet 14:90603ea1e85b 57 #include "ov5642.h"
dflet 14:90603ea1e85b 58 #endif
dflet 14:90603ea1e85b 59 #ifdef OV2640_CAM
dflet 14:90603ea1e85b 60 #include "ov2640.h"
dflet 14:90603ea1e85b 61 #include "ov5642.h"
dflet 14:90603ea1e85b 62 #endif
dflet 0:50cedd586816 63 #include "i2cconfig.h"
dflet 4:c27adffcfec2 64
dflet 0:50cedd586816 65 #include "cli_uart.h"
dflet 3:7643714ec664 66 #include "Led_config.h"
dflet 6:37fb696395d7 67 #include "HttpDebug.h"
dflet 0:50cedd586816 68
dflet 0:50cedd586816 69 using namespace mbed_cc3100;
dflet 0:50cedd586816 70
dflet 14:90603ea1e85b 71
dflet 0:50cedd586816 72
dflet 0:50cedd586816 73 //*****************************************************************************
dflet 0:50cedd586816 74 // Macros
dflet 0:50cedd586816 75 //*****************************************************************************
dflet 0:50cedd586816 76 #define USER_FILE_NAME "www/images/cc3200_camera_capture.jpg"
dflet 14:90603ea1e85b 77 //#define TOTAL_DMA_ELEMENTS 64
dflet 0:50cedd586816 78 #define AP_SSID_LEN_MAX (33)
dflet 0:50cedd586816 79 #define ROLE_INVALID (-5)
dflet 0:50cedd586816 80 //*****************************************************************************
dflet 0:50cedd586816 81 // GLOBAL VARIABLES
dflet 0:50cedd586816 82 //*****************************************************************************
dflet 5:75fcfdb7cae7 83
dflet 0:50cedd586816 84 unsigned int g_frame_size_in_bytes;
dflet 14:90603ea1e85b 85 //unsigned int g_uiDeviceModeConfig = ROLE_AP; //default is AP mode
dflet 0:50cedd586816 86 extern volatile unsigned char g_CaptureImage;
dflet 0:50cedd586816 87 extern int g_uiIpObtained = 0;
dflet 0:50cedd586816 88 extern int g_uiSimplelinkRole = ROLE_INVALID;
dflet 0:50cedd586816 89 unsigned int g_uiIpAddress = 0;
dflet 14:90603ea1e85b 90 //static unsigned char g_dma_txn_done;
dflet 0:50cedd586816 91 volatile static unsigned char g_frame_end;
dflet 14:90603ea1e85b 92 volatile static uint16_t g_lines;
dflet 14:90603ea1e85b 93 //static unsigned int g_total_dma_intrpts;
dflet 0:50cedd586816 94
dflet 14:90603ea1e85b 95 DCMI_HandleTypeDef phdcmi;
dflet 14:90603ea1e85b 96 DMA_HandleTypeDef phdma_dcmi;
dflet 14:90603ea1e85b 97
dflet 14:90603ea1e85b 98 #ifdef ENABLE_JPEG
dflet 14:90603ea1e85b 99 int PIXELS_IN_X_AXIS = 320;
dflet 14:90603ea1e85b 100 int PIXELS_IN_Y_AXIS = 240;
dflet 14:90603ea1e85b 101 int FRAME_SIZE_IN_BYTES = (320 * 240 * 2);
dflet 0:50cedd586816 102 #else
dflet 14:90603ea1e85b 103 int PIXELS_IN_X_AXIS = 176;
dflet 14:90603ea1e85b 104 int PIXELS_IN_Y_AXIS = 144;
dflet 14:90603ea1e85b 105 int FRAME_SIZE_IN_BYTES = (176 * 144 * 2);
dflet 14:90603ea1e85b 106 #endif
dflet 0:50cedd586816 107
dflet 14:90603ea1e85b 108 struct ImageBuffer {
dflet 12:7d75ba5deed1 109 #ifdef ENABLE_JPEG
dflet 14:90603ea1e85b 110 char g_header[SMTP_BUF_LEN] /*= {'\0'}*/;
dflet 12:7d75ba5deed1 111 #endif
dflet 12:7d75ba5deed1 112 // uint32_t g_image_buffer[NUM_OF_4B_CHUNKS];//60Kb 15360, 50Kb 12800
dflet 14:90603ea1e85b 113 uint32_t g_image_buffer[((IMAGE_BUF_SIZE)/(sizeof(unsigned int)))];//51Kb
dflet 0:50cedd586816 114 };
dflet 0:50cedd586816 115
dflet 0:50cedd586816 116 ImageBuffer g_image;
dflet 0:50cedd586816 117
dflet 14:90603ea1e85b 118 typedef enum pictureRequest {
dflet 0:50cedd586816 119 NO_PICTURE = 0x00,
dflet 0:50cedd586816 120 SINGLE_HIGH_RESOLUTION = 0x01,
dflet 0:50cedd586816 121 STREAM_LOW_RESOLUTION = 0x02
dflet 0:50cedd586816 122
dflet 14:90603ea1e85b 123 } e_pictureRequest;
dflet 14:90603ea1e85b 124
dflet 14:90603ea1e85b 125 typedef enum pictureFormat {
dflet 0:50cedd586816 126 RAW_10BIT = 0,
dflet 0:50cedd586816 127 ITU_R_BT601,
dflet 0:50cedd586816 128 YCbCr_4_2_2,
dflet 0:50cedd586816 129 YCbCr_4_2_0,
dflet 0:50cedd586816 130 RGB_565,
dflet 0:50cedd586816 131 RGB_555,
dflet 0:50cedd586816 132 RGB_444
dflet 0:50cedd586816 133
dflet 14:90603ea1e85b 134 } e_pictureFormat;
dflet 0:50cedd586816 135
dflet 14:90603ea1e85b 136 typedef enum pictureResolution {
dflet 0:50cedd586816 137 QVGA = 0,
dflet 0:50cedd586816 138 VGA,
dflet 0:50cedd586816 139 SVGA,
dflet 0:50cedd586816 140 XGA,
dflet 0:50cedd586816 141 uXGA
dflet 0:50cedd586816 142
dflet 14:90603ea1e85b 143 } e_pictureResolution;
dflet 0:50cedd586816 144
dflet 0:50cedd586816 145
dflet 0:50cedd586816 146 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 147 #define FORMAT_YCBCR422 0
dflet 0:50cedd586816 148 #define FORMAT_YCBCR420 1
dflet 0:50cedd586816 149 #define FORMAT_MONOCHROME 2
dflet 0:50cedd586816 150
dflet 14:90603ea1e85b 151 unsigned char JPEG_StdQuantTblY[64] = {
dflet 0:50cedd586816 152 16, 11, 10, 16, 24, 40, 51, 61,
dflet 0:50cedd586816 153 12, 12, 14, 19, 26, 58, 60, 55,
dflet 0:50cedd586816 154 14, 13, 16, 24, 40, 57, 69, 56,
dflet 0:50cedd586816 155 14, 17, 22, 29, 51, 87, 80, 62,
dflet 0:50cedd586816 156 18, 22, 37, 56, 68, 109, 103, 77,
dflet 0:50cedd586816 157 24, 35, 55, 64, 81, 104, 113, 92,
dflet 0:50cedd586816 158 49, 64, 78, 87, 103, 121, 120, 101,
dflet 0:50cedd586816 159 72, 92, 95, 98, 112, 100, 103, 99
dflet 0:50cedd586816 160 };
dflet 0:50cedd586816 161
dflet 14:90603ea1e85b 162 unsigned char JPEG_StdQuantTblC[64] = {
dflet 0:50cedd586816 163 17, 18, 24, 47, 99, 99, 99, 99,
dflet 0:50cedd586816 164 18, 21, 26, 66, 99, 99, 99, 99,
dflet 0:50cedd586816 165 24, 26, 56, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 166 47, 66, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 167 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 168 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 169 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 170 99, 99, 99, 99, 99, 99, 99, 99
dflet 0:50cedd586816 171 };
dflet 0:50cedd586816 172 //
dflet 0:50cedd586816 173 // This table is used for regular-position to zigzagged-position lookup
dflet 14:90603ea1e85b 174 // This is Figure A.6 from the ISO/IEC 10918-1 1993 specification
dflet 0:50cedd586816 175 //
dflet 14:90603ea1e85b 176 static unsigned char zigzag[64] = {
dflet 0:50cedd586816 177 0, 1, 5, 6,14,15,27,28,
dflet 0:50cedd586816 178 2, 4, 7,13,16,26,29,42,
dflet 0:50cedd586816 179 3, 8,12,17,25,30,41,43,
dflet 0:50cedd586816 180 9,11,18,24,31,40,44,53,
dflet 0:50cedd586816 181 10,19,23,32,39,45,52,54,
dflet 0:50cedd586816 182 20,22,33,38,46,51,55,60,
dflet 0:50cedd586816 183 21,34,37,47,50,56,59,61,
dflet 0:50cedd586816 184 35,36,48,49,57,58,62,63
dflet 0:50cedd586816 185 };
dflet 0:50cedd586816 186
dflet 14:90603ea1e85b 187 unsigned int JPEG_StdHuffmanTbl[384] = {
dflet 0:50cedd586816 188 0x100, 0x101, 0x204, 0x30b, 0x41a, 0x678, 0x7f8, 0x9f6,
dflet 0:50cedd586816 189 0xf82, 0xf83, 0x30c, 0x41b, 0x679, 0x8f6, 0xaf6, 0xf84,
dflet 0:50cedd586816 190 0xf85, 0xf86, 0xf87, 0xf88, 0x41c, 0x7f9, 0x9f7, 0xbf4,
dflet 0:50cedd586816 191 0xf89, 0xf8a, 0xf8b, 0xf8c, 0xf8d, 0xf8e, 0x53a, 0x8f7,
dflet 0:50cedd586816 192 0xbf5, 0xf8f, 0xf90, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95,
dflet 0:50cedd586816 193 0x53b, 0x9f8, 0xf96, 0xf97, 0xf98, 0xf99, 0xf9a, 0xf9b,
dflet 0:50cedd586816 194 0xf9c, 0xf9d, 0x67a, 0xaf7, 0xf9e, 0xf9f, 0xfa0, 0xfa1,
dflet 0:50cedd586816 195 0xfa2, 0xfa3, 0xfa4, 0xfa5, 0x67b, 0xbf6, 0xfa6, 0xfa7,
dflet 0:50cedd586816 196 0xfa8, 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0x7fa, 0xbf7,
dflet 0:50cedd586816 197 0xfae, 0xfaf, 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5,
dflet 0:50cedd586816 198 0x8f8, 0xec0, 0xfb6, 0xfb7, 0xfb8, 0xfb9, 0xfba, 0xfbb,
dflet 0:50cedd586816 199 0xfbc, 0xfbd, 0x8f9, 0xfbe, 0xfbf, 0xfc0, 0xfc1, 0xfc2,
dflet 0:50cedd586816 200 0xfc3, 0xfc4, 0xfc5, 0xfc6, 0x8fa, 0xfc7, 0xfc8, 0xfc9,
dflet 0:50cedd586816 201 0xfca, 0xfcb, 0xfcc, 0xfcd, 0xfce, 0xfcf, 0x9f9, 0xfd0,
dflet 0:50cedd586816 202 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7, 0xfd8,
dflet 0:50cedd586816 203 0x9fa, 0xfd9, 0xfda, 0xfdb, 0xfdc, 0xfdd, 0xfde, 0xfdf,
dflet 0:50cedd586816 204 0xfe0, 0xfe1, 0xaf8, 0xfe2, 0xfe3, 0xfe4, 0xfe5, 0xfe6,
dflet 0:50cedd586816 205 0xfe7, 0xfe8, 0xfe9, 0xfea, 0xfeb, 0xfec, 0xfed, 0xfee,
dflet 0:50cedd586816 206 0xfef, 0xff0, 0xff1, 0xff2, 0xff3, 0xff4, 0xff5, 0xff6,
dflet 0:50cedd586816 207 0xff7, 0xff8, 0xff9, 0xffa, 0xffb, 0xffc, 0xffd, 0xffe,
dflet 0:50cedd586816 208 0x30a, 0xaf9, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 209 0xfd0, 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7,
dflet 0:50cedd586816 210 0x101, 0x204, 0x30a, 0x418, 0x419, 0x538, 0x678, 0x8f4,
dflet 0:50cedd586816 211 0x9f6, 0xbf4, 0x30b, 0x539, 0x7f6, 0x8f5, 0xaf6, 0xbf5,
dflet 0:50cedd586816 212 0xf88, 0xf89, 0xf8a, 0xf8b, 0x41a, 0x7f7, 0x9f7, 0xbf6,
dflet 0:50cedd586816 213 0xec2, 0xf8c, 0xf8d, 0xf8e, 0xf8f, 0xf90, 0x41b, 0x7f8,
dflet 0:50cedd586816 214 0x9f8, 0xbf7, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95, 0xf96,
dflet 0:50cedd586816 215 0x53a, 0x8f6, 0xf97, 0xf98, 0xf99, 0xf9a, 0xf9b, 0xf9c,
dflet 0:50cedd586816 216 0xf9d, 0xf9e, 0x53b, 0x9f9, 0xf9f, 0xfa0, 0xfa1, 0xfa2,
dflet 0:50cedd586816 217 0xfa3, 0xfa4, 0xfa5, 0xfa6, 0x679, 0xaf7, 0xfa7, 0xfa8,
dflet 0:50cedd586816 218 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0xfae, 0x67a, 0xaf8,
dflet 0:50cedd586816 219 0xfaf, 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5, 0xfb6,
dflet 0:50cedd586816 220 0x7f9, 0xfb7, 0xfb8, 0xfb9, 0xfba, 0xfbb, 0xfbc, 0xfbd,
dflet 0:50cedd586816 221 0xfbe, 0xfbf, 0x8f7, 0xfc0, 0xfc1, 0xfc2, 0xfc3, 0xfc4,
dflet 0:50cedd586816 222 0xfc5, 0xfc6, 0xfc7, 0xfc8, 0x8f8, 0xfc9, 0xfca, 0xfcb,
dflet 0:50cedd586816 223 0xfcc, 0xfcd, 0xfce, 0xfcf, 0xfd0, 0xfd1, 0x8f9, 0xfd2,
dflet 0:50cedd586816 224 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7, 0xfd8, 0xfd9, 0xfda,
dflet 0:50cedd586816 225 0x8fa, 0xfdb, 0xfdc, 0xfdd, 0xfde, 0xfdf, 0xfe0, 0xfe1,
dflet 0:50cedd586816 226 0xfe2, 0xfe3, 0xaf9, 0xfe4, 0xfe5, 0xfe6, 0xfe7, 0xfe8,
dflet 0:50cedd586816 227 0xfe9, 0xfea, 0xfeb, 0xfec, 0xde0, 0xfed, 0xfee, 0xfef,
dflet 0:50cedd586816 228 0xff0, 0xff1, 0xff2, 0xff3, 0xff4, 0xff5, 0xec3, 0xff6,
dflet 0:50cedd586816 229 0xff7, 0xff8, 0xff9, 0xffa, 0xffb, 0xffc, 0xffd, 0xffe,
dflet 0:50cedd586816 230 0x100, 0x9fa, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 231 0xfd0, 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7,
dflet 0:50cedd586816 232 0x100, 0x202, 0x203, 0x204, 0x205, 0x206, 0x30e, 0x41e,
dflet 0:50cedd586816 233 0x53e, 0x67e, 0x7fe, 0x8fe, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 234 0x100, 0x101, 0x102, 0x206, 0x30e, 0x41e, 0x53e, 0x67e,
dflet 0:50cedd586816 235 0x7fe, 0x8fe, 0x9fe, 0xafe, 0xfff, 0xfff, 0xfff, 0xfff
dflet 0:50cedd586816 236 };
dflet 14:90603ea1e85b 237 #endif
dflet 0:50cedd586816 238
dflet 0:50cedd586816 239 //*****************************************************************************
dflet 0:50cedd586816 240 //
dflet 14:90603ea1e85b 241 //! Start Camera
dflet 0:50cedd586816 242 //! 1. Establishes connection w/ AP//
dflet 0:50cedd586816 243 //! 2. Initializes the camera sub-components//! GPIO Enable & Configuration
dflet 0:50cedd586816 244 //! 3. Listens and processes the image capture requests from user-applications
dflet 14:90603ea1e85b 245 //!
dflet 14:90603ea1e85b 246 //! \param[out] WriteBuffer - Pointer to the Frame Buffer
dflet 14:90603ea1e85b 247 //! \return None
dflet 0:50cedd586816 248 //
dflet 0:50cedd586816 249 //*****************************************************************************
dflet 0:50cedd586816 250
dflet 14:90603ea1e85b 251 uint32_t StartCamera(char **WriteBuffer)
dflet 0:50cedd586816 252 {
dflet 6:37fb696395d7 253 // Uart_Write((uint8_t*)"StartCamera \n\r");
dflet 14:90603ea1e85b 254 uint32_t Writelength;
dflet 0:50cedd586816 255 //
dflet 0:50cedd586816 256 // Waits in the below loop till Capture button is pressed
dflet 0:50cedd586816 257 //
dflet 0:50cedd586816 258 Writelength = CaptureImage(WriteBuffer);
dflet 0:50cedd586816 259
dflet 0:50cedd586816 260 return(Writelength);
dflet 0:50cedd586816 261
dflet 0:50cedd586816 262 }
dflet 0:50cedd586816 263 //*****************************************************************************
dflet 0:50cedd586816 264 //
dflet 14:90603ea1e85b 265 //! InitCameraComponents
dflet 14:90603ea1e85b 266 //! PinMux, Camera Initialization and Configuration
dflet 0:50cedd586816 267 //!
dflet 0:50cedd586816 268 //! \param[in] width - X-Axis
dflet 0:50cedd586816 269 //! \param[in] width - Y-Axis
dflet 0:50cedd586816 270 //! \return None
dflet 0:50cedd586816 271 //
dflet 0:50cedd586816 272 //*****************************************************************************
dflet 0:50cedd586816 273
dflet 0:50cedd586816 274 void InitCameraComponents(int width, int height)
dflet 0:50cedd586816 275 {
dflet 14:90603ea1e85b 276 Uart_Write((uint8_t*)"InitCameraComponents \n\r");
dflet 0:50cedd586816 277 //
dflet 0:50cedd586816 278 // Initialize I2C Interface
dflet 14:90603ea1e85b 279 //
dflet 0:50cedd586816 280 I2CInit();
dflet 14:90603ea1e85b 281 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 282 cam_power_on();
dflet 13:bf45f592c2b6 283 getCamId();
dflet 13:bf45f592c2b6 284
dflet 0:50cedd586816 285 //
dflet 0:50cedd586816 286 // Initialize camera sensor
dflet 0:50cedd586816 287 //
dflet 0:50cedd586816 288 CameraSensorInit();
dflet 0:50cedd586816 289 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 290 //
dflet 0:50cedd586816 291 // Configure Sensor in Capture Mode
dflet 0:50cedd586816 292 //
dflet 14:90603ea1e85b 293 PIXELS_IN_X_AXIS = width;
dflet 0:50cedd586816 294 PIXELS_IN_Y_AXIS = height;
dflet 0:50cedd586816 295 FRAME_SIZE_IN_BYTES = PIXELS_IN_X_AXIS * PIXELS_IN_Y_AXIS * BYTES_PER_PIXEL;
dflet 0:50cedd586816 296
dflet 0:50cedd586816 297 StartSensorInJpegMode(width, height);
dflet 0:50cedd586816 298
dflet 14:90603ea1e85b 299 #endif//ENABLE_JPEG
dflet 14:90603ea1e85b 300 #endif//MT9D111_CAM
dflet 14:90603ea1e85b 301
dflet 14:90603ea1e85b 302 #ifdef OV5642_CAM
dflet 14:90603ea1e85b 303 check_camId();
dflet 14:90603ea1e85b 304 init_cam();
dflet 14:90603ea1e85b 305 #endif//OV5642_CAM
dflet 14:90603ea1e85b 306
dflet 14:90603ea1e85b 307 #ifdef OV2640_CAM
dflet 14:90603ea1e85b 308 camId();
dflet 14:90603ea1e85b 309 initCam();
dflet 14:90603ea1e85b 310 #endif//OV2640_CAM
dflet 14:90603ea1e85b 311
dflet 14:90603ea1e85b 312
dflet 14:90603ea1e85b 313
dflet 0:50cedd586816 314 }
dflet 0:50cedd586816 315
dflet 0:50cedd586816 316 //*****************************************************************************
dflet 0:50cedd586816 317 //
dflet 0:50cedd586816 318 //! Set resolution of camera
dflet 0:50cedd586816 319 //!
dflet 0:50cedd586816 320 //! \param[in] width - X Axis
dflet 0:50cedd586816 321 //! \param[in] height - Y Axis
dflet 0:50cedd586816 322 //! \return 0 on success else -ve
dflet 0:50cedd586816 323 //
dflet 0:50cedd586816 324 //*****************************************************************************
dflet 0:50cedd586816 325
dflet 0:50cedd586816 326 int SetCameraResolution(int width, int height)
dflet 0:50cedd586816 327 {
dflet 14:90603ea1e85b 328 Uart_Write((uint8_t*)"SetCameraResolution \n\r");
dflet 14:90603ea1e85b 329 int lRetVal = 0;
dflet 0:50cedd586816 330
dflet 14:90603ea1e85b 331 PIXELS_IN_X_AXIS = width;
dflet 0:50cedd586816 332 PIXELS_IN_Y_AXIS = height;
dflet 0:50cedd586816 333 FRAME_SIZE_IN_BYTES = PIXELS_IN_X_AXIS * PIXELS_IN_Y_AXIS * BYTES_PER_PIXEL;
dflet 0:50cedd586816 334 lRetVal = CameraSensorResolution(width, height);
dflet 0:50cedd586816 335 return lRetVal;
dflet 0:50cedd586816 336 }
dflet 0:50cedd586816 337
dflet 0:50cedd586816 338 //*****************************************************************************
dflet 0:50cedd586816 339 //
dflet 14:90603ea1e85b 340 //! CaptureImage
dflet 14:90603ea1e85b 341 //! Configures DMA and starts the Capture. Post Capture writes to SFLASH
dflet 14:90603ea1e85b 342 //!
dflet 14:90603ea1e85b 343 //! \param None
dflet 0:50cedd586816 344 //! \return None
dflet 14:90603ea1e85b 345 //!
dflet 0:50cedd586816 346 //
dflet 0:50cedd586816 347 //*****************************************************************************
dflet 14:90603ea1e85b 348 uint32_t CaptureImage(char** WriteBuffer)
dflet 0:50cedd586816 349 {
dflet 12:7d75ba5deed1 350
dflet 12:7d75ba5deed1 351 uint32_t g_header_length = 0;
dflet 14:90603ea1e85b 352 uint32_t *pbuffer = &(g_image.g_image_buffer[0]);
dflet 14:90603ea1e85b 353 int32_t lRetVal= -1;
dflet 14:90603ea1e85b 354 int32_t err = 0;
dflet 10:f2447c682c0f 355
dflet 0:50cedd586816 356 DMAConfig();
dflet 14:90603ea1e85b 357
dflet 14:90603ea1e85b 358 wait(2);
dflet 14:90603ea1e85b 359
dflet 14:90603ea1e85b 360 /* Send cam capture request, value in frames */
dflet 14:90603ea1e85b 361 // Start_still_capture(1);// Switch to context b
dflet 11:404bd8bb7fa6 362
dflet 0:50cedd586816 363 //
dflet 14:90603ea1e85b 364 // DCMI Perform Image Capture
dflet 0:50cedd586816 365 //
dflet 11:404bd8bb7fa6 366 #ifdef ENABLE_JPEG
dflet 14:90603ea1e85b 367 HAL_DCMI_Start_DMA(&phdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)pbuffer, NUM_OF_4B_CHUNKS);
dflet 11:404bd8bb7fa6 368 #else
dflet 14:90603ea1e85b 369 HAL_DCMI_Start_DMA(&phdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)pbuffer, NUM_OF_4B_CHUNKS);
dflet 14:90603ea1e85b 370 #endif
dflet 14:90603ea1e85b 371
dflet 14:90603ea1e85b 372 while(g_frame_end == 0);//Set in the Frame complete callback function
dflet 14:90603ea1e85b 373 HttpDebug("lines %d\r\n",g_lines);
dflet 14:90603ea1e85b 374 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 375 Stop_still_capture();// Switch to context a
dflet 14:90603ea1e85b 376 #endif
dflet 14:90603ea1e85b 377 /* Read the number of data items transferred in bytes ((4x) uint = bytes) */
dflet 14:90603ea1e85b 378 g_frame_size_in_bytes = 4*(NUM_OF_4B_CHUNKS - phdma_dcmi.Instance->NDTR);//NDTR counts down!
dflet 14:90603ea1e85b 379 if(g_frame_size_in_bytes <= 0 || g_frame_size_in_bytes > (NUM_OF_4B_CHUNKS *4)) {
dflet 14:90603ea1e85b 380 err = HAL_DMA_GetState(&phdma_dcmi);
dflet 14:90603ea1e85b 381 HttpDebug("\r\nDMA error! 0x%x\r\n",err);
dflet 14:90603ea1e85b 382 HttpDebug("\r\nDMA error! 0x%x\r\n",phdma_dcmi.ErrorCode);
dflet 14:90603ea1e85b 383 HttpDebug("g_frame_size_in_bytes = 0x%x\n\r",g_frame_size_in_bytes);
dflet 14:90603ea1e85b 384 HttpDebug("\r\nFailed to capture data, check camera connections!\r\n");
dflet 14:90603ea1e85b 385 HAL_DMA_Abort(&phdma_dcmi);
dflet 14:90603ea1e85b 386 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 387 cam_power_off();
dflet 14:90603ea1e85b 388 #endif
dflet 14:90603ea1e85b 389 HAL_DCMI_MspDeInit(&phdcmi);
dflet 14:90603ea1e85b 390 HttpDebug("Image Capture failed\n\r");
dflet 14:90603ea1e85b 391 #if 1
dflet 14:90603ea1e85b 392 for(int i =0; i< 100; i++) {
dflet 14:90603ea1e85b 393 HttpDebug("0x%x ",(uint8_t*)*pbuffer++);
dflet 14:90603ea1e85b 394 }
dflet 14:90603ea1e85b 395 HttpDebug("\r\n");
dflet 14:90603ea1e85b 396 #endif//if 0
dflet 14:90603ea1e85b 397 while(1) {
dflet 14:90603ea1e85b 398 wait(0.5);
dflet 14:90603ea1e85b 399 }
dflet 14:90603ea1e85b 400 }
dflet 14:90603ea1e85b 401 err = HAL_DMA_GetState(&phdma_dcmi);
dflet 14:90603ea1e85b 402 if(0x11 != err || 0x31 != err){
dflet 14:90603ea1e85b 403 HttpDebug("\r\nDMA state! 0x%x\r\n",err);
dflet 14:90603ea1e85b 404 // while(1);
dflet 14:90603ea1e85b 405 }
dflet 14:90603ea1e85b 406 err = HAL_DMA_GetError(&phdma_dcmi);
dflet 14:90603ea1e85b 407 if(0x00 != err ){
dflet 14:90603ea1e85b 408 HttpDebug("\r\nDMA error! 0x%x\r\n",err);
dflet 14:90603ea1e85b 409 // while(1);
dflet 14:90603ea1e85b 410 }
dflet 14:90603ea1e85b 411 HttpDebug("g_frame_size_in_bytes %d\n\r",g_frame_size_in_bytes);
dflet 5:75fcfdb7cae7 412
dflet 14:90603ea1e85b 413 #if 0
dflet 14:90603ea1e85b 414 for(int i =0; i< 100; i++) {
dflet 14:90603ea1e85b 415 HttpDebug("0x%x ",(uint8_t*)*pbuffer++);
dflet 14:90603ea1e85b 416 }
dflet 14:90603ea1e85b 417 HttpDebug("\r\n");
dflet 14:90603ea1e85b 418 #endif//if 0
dflet 9:b7c6e7303df5 419
dflet 14:90603ea1e85b 420 uint8_t* Image = reinterpret_cast<uint8_t*>(pbuffer);
dflet 14:90603ea1e85b 421
dflet 14:90603ea1e85b 422 #if 0
dflet 14:90603ea1e85b 423 for(int i =0; i< 100; i++) {
dflet 14:90603ea1e85b 424 HttpDebug("0x%x ",*Image++);
dflet 8:529a12812c53 425 }
dflet 15:5433f9d94cd7 426 HttpDebug("\r\n");
dflet 14:90603ea1e85b 427 #endif//if 0
dflet 15:5433f9d94cd7 428
dflet 0:50cedd586816 429 //
dflet 0:50cedd586816 430 // Create JPEG Header
dflet 0:50cedd586816 431 //
dflet 15:5433f9d94cd7 432 #ifndef OV2640_CAM
dflet 0:50cedd586816 433 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 434 memset(g_image.g_header, '\0', sizeof(g_image.g_header));
dflet 14:90603ea1e85b 435 g_header_length = CreateJpegHeader((char *)&(g_image.g_header[0]), PIXELS_IN_X_AXIS, PIXELS_IN_Y_AXIS, 0, 0x0020, 9);
dflet 12:7d75ba5deed1 436 // HttpDebug("g_header_length = 0x%x \r\n",g_header_length);
dflet 8:529a12812c53 437 // This pushes the header to the start of the array so that the entire picture can be contiguous in memory
dflet 14:90603ea1e85b 438 memcpy(Image + g_header_length, Image, g_frame_size_in_bytes);
dflet 14:90603ea1e85b 439 memcpy(Image, g_image.g_header, g_header_length);
dflet 12:7d75ba5deed1 440 // This pushes the header to the end of the array so that the entire picture can be contiguous in memory
dflet 14:90603ea1e85b 441 // memcpy((Image + g_frame_size_in_bytes ), g_image.g_header, g_header_length);
dflet 14:90603ea1e85b 442 #if 0
dflet 14:90603ea1e85b 443 for(int i =0; i< g_header_length + 100 ; i++) {
dflet 14:90603ea1e85b 444 HttpDebug("0x%x ",*Image++);
dflet 14:90603ea1e85b 445 }
dflet 14:90603ea1e85b 446 HttpDebug("\r\n");
dflet 8:529a12812c53 447 #endif//if 0
dflet 0:50cedd586816 448
dflet 8:529a12812c53 449 #endif//ENABLE_JPEG
dflet 15:5433f9d94cd7 450 *WriteBuffer = (char*)Image;
dflet 15:5433f9d94cd7 451 return(g_header_length += g_frame_size_in_bytes);
dflet 15:5433f9d94cd7 452 #endif//OV2640_CAM
dflet 11:404bd8bb7fa6 453 *WriteBuffer = (char*)Image;
dflet 8:529a12812c53 454
dflet 15:5433f9d94cd7 455 return(g_frame_size_in_bytes);
dflet 0:50cedd586816 456 }
dflet 0:50cedd586816 457 //*****************************************************************************
dflet 0:50cedd586816 458 //
dflet 0:50cedd586816 459 //! DMA Config
dflet 6:37fb696395d7 460 //! Initialize the DMA\DCMI and Setup the DMA transfer
dflet 14:90603ea1e85b 461 //!
dflet 14:90603ea1e85b 462 //! \param None
dflet 14:90603ea1e85b 463 //! \return None
dflet 0:50cedd586816 464 //
dflet 0:50cedd586816 465 //*****************************************************************************
dflet 12:7d75ba5deed1 466 void DMAConfig()
dflet 0:50cedd586816 467 {
dflet 14:90603ea1e85b 468 HttpDebug("DMAConfig \n\r");
dflet 14:90603ea1e85b 469 // DCMI_HandleTypeDef phdcmi;
dflet 14:90603ea1e85b 470
dflet 5:75fcfdb7cae7 471 phdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
dflet 14:90603ea1e85b 472 #ifdef OV5642_CAM
dflet 14:90603ea1e85b 473 // phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;//Data clocked out on falling edge
dflet 14:90603ea1e85b 474 phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;//Data clocked out on rising edge
dflet 14:90603ea1e85b 475 phdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;//Active low
dflet 14:90603ea1e85b 476 // phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;//Active low
dflet 14:90603ea1e85b 477 phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;//Active high
dflet 14:90603ea1e85b 478 #endif
dflet 14:90603ea1e85b 479 #ifdef OV2640_CAM
dflet 14:90603ea1e85b 480 phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;//Data clocked out on rising edge
dflet 14:90603ea1e85b 481 phdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;//Active low
dflet 14:90603ea1e85b 482 phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;//Active low
dflet 14:90603ea1e85b 483 #endif
dflet 14:90603ea1e85b 484 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 485 phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;//Data clocked out on rising edge
dflet 14:90603ea1e85b 486 // phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;//Data clocked out on falling edge
dflet 14:90603ea1e85b 487 phdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;//Active high
dflet 14:90603ea1e85b 488 // phdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;//Active high
dflet 14:90603ea1e85b 489 // phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;//Active low
dflet 14:90603ea1e85b 490 phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;//Active high
dflet 14:90603ea1e85b 491 #endif
dflet 5:75fcfdb7cae7 492 phdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
dflet 14:90603ea1e85b 493 phdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;//8 bit data
dflet 14:90603ea1e85b 494 #ifdef ENABLE_JPEG
dflet 10:f2447c682c0f 495 phdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE;
dflet 5:75fcfdb7cae7 496 #else
dflet 10:f2447c682c0f 497 phdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
dflet 5:75fcfdb7cae7 498 #endif
dflet 10:f2447c682c0f 499 phdcmi.Instance = DCMI;
dflet 14:90603ea1e85b 500
dflet 14:90603ea1e85b 501 DCMI_MspInit(&phdcmi);
dflet 14:90603ea1e85b 502 HAL_DCMI_Init(&phdcmi);
dflet 14:90603ea1e85b 503
dflet 14:90603ea1e85b 504 }
dflet 14:90603ea1e85b 505 /*
dflet 14:90603ea1e85b 506 void DCMI_IRQHandler(void) {
dflet 14:90603ea1e85b 507
dflet 14:90603ea1e85b 508 HAL_DCMI_IRQHandler(&hdcmi);
dflet 14:90603ea1e85b 509 }
dflet 14:90603ea1e85b 510
dflet 14:90603ea1e85b 511 void DMA2_Stream1_IRQHandler(void){
dflet 14:90603ea1e85b 512
dflet 14:90603ea1e85b 513 HAL_DMA_IRQHandler(&hdma_dcmi);
dflet 14:90603ea1e85b 514 }
dflet 14:90603ea1e85b 515 */
dflet 14:90603ea1e85b 516 void DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
dflet 14:90603ea1e85b 517 {
dflet 14:90603ea1e85b 518
dflet 14:90603ea1e85b 519 // Uart_Write((uint8_t*)"DCMI_MspInit\n\r");
dflet 14:90603ea1e85b 520
dflet 14:90603ea1e85b 521 /* Peripheral DCMI init*/
dflet 14:90603ea1e85b 522
dflet 14:90603ea1e85b 523 GPIO_InitTypeDef GPIO_InitStruct;
dflet 14:90603ea1e85b 524 if(hdcmi->Instance==DCMI) {
dflet 14:90603ea1e85b 525 __GPIOA_CLK_ENABLE();
dflet 14:90603ea1e85b 526 __GPIOB_CLK_ENABLE();
dflet 14:90603ea1e85b 527 __GPIOC_CLK_ENABLE();
dflet 14:90603ea1e85b 528 __GPIOE_CLK_ENABLE();
dflet 14:90603ea1e85b 529
dflet 14:90603ea1e85b 530 /* Peripheral clock enable */
dflet 14:90603ea1e85b 531 __DCMI_CLK_ENABLE();
dflet 14:90603ea1e85b 532 /* DMA controller clock enable */
dflet 14:90603ea1e85b 533 __DMA2_CLK_ENABLE();
dflet 14:90603ea1e85b 534
dflet 14:90603ea1e85b 535 /**MCO1 GPIO Configuration
dflet 14:90603ea1e85b 536 PA8 ------> RCC_MCO_1
dflet 14:90603ea1e85b 537 */
dflet 14:90603ea1e85b 538
dflet 14:90603ea1e85b 539 /**DCMI GPIO Configuration
dflet 14:90603ea1e85b 540 PA9 ------> DCMI_D0
dflet 14:90603ea1e85b 541 PA10 ------> DCMI_D1
dflet 14:90603ea1e85b 542 PC8 ------> DCMI_D2
dflet 14:90603ea1e85b 543 PC9 ------> DCMI_D3
dflet 14:90603ea1e85b 544 PE4 ------> DCMI_D4
dflet 14:90603ea1e85b 545 PB6 ------> DCMI_D5
dflet 14:90603ea1e85b 546 PE5 ------> DCMI_D6
dflet 14:90603ea1e85b 547 PE6 ------> DCMI_D7
dflet 14:90603ea1e85b 548 PA6 ------> DCMI_PIXCK
dflet 14:90603ea1e85b 549 PA4 ------> DCMI_HSYNC
dflet 14:90603ea1e85b 550 PB7 ------> DCMI_VSYNC
dflet 5:75fcfdb7cae7 551
dflet 14:90603ea1e85b 552 */
dflet 14:90603ea1e85b 553 /* D4 D6 D7 */
dflet 14:90603ea1e85b 554 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
dflet 14:90603ea1e85b 555 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 14:90603ea1e85b 556 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 14:90603ea1e85b 557 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 14:90603ea1e85b 558 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 14:90603ea1e85b 559 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
dflet 14:90603ea1e85b 560
dflet 14:90603ea1e85b 561 /* HSYNC PIXCLK D0 D1 */
dflet 14:90603ea1e85b 562 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_9|GPIO_PIN_10;
dflet 14:90603ea1e85b 563 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 14:90603ea1e85b 564 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 14:90603ea1e85b 565 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 14:90603ea1e85b 566 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 14:90603ea1e85b 567 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
dflet 14:90603ea1e85b 568
dflet 14:90603ea1e85b 569 /* D2 D3 */
dflet 14:90603ea1e85b 570 GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
dflet 14:90603ea1e85b 571 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 14:90603ea1e85b 572 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 14:90603ea1e85b 573 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 14:90603ea1e85b 574 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 14:90603ea1e85b 575 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
dflet 5:75fcfdb7cae7 576
dflet 14:90603ea1e85b 577 /* D5 VSYNC */
dflet 14:90603ea1e85b 578 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
dflet 14:90603ea1e85b 579 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 14:90603ea1e85b 580 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 14:90603ea1e85b 581 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 14:90603ea1e85b 582 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 14:90603ea1e85b 583 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
dflet 14:90603ea1e85b 584
dflet 14:90603ea1e85b 585 phdma_dcmi.Instance = DMA2_Stream1;
dflet 14:90603ea1e85b 586 phdma_dcmi.Init.Channel = DMA_CHANNEL_1;
dflet 14:90603ea1e85b 587 phdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;
dflet 14:90603ea1e85b 588 phdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;
dflet 14:90603ea1e85b 589 phdma_dcmi.Init.MemInc = DMA_MINC_ENABLE;
dflet 14:90603ea1e85b 590 phdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;//Cam is 1 byte wide data (8 bits) should this be word?????
dflet 14:90603ea1e85b 591 phdma_dcmi.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;//Memory has been defined as uint (1 word)
dflet 14:90603ea1e85b 592 phdma_dcmi.Init.Mode = DMA_NORMAL;
dflet 14:90603ea1e85b 593 phdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH;
dflet 14:90603ea1e85b 594 phdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
dflet 14:90603ea1e85b 595 phdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
dflet 14:90603ea1e85b 596 phdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;
dflet 14:90603ea1e85b 597 phdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
dflet 14:90603ea1e85b 598
dflet 14:90603ea1e85b 599 __HAL_LINKDMA(hdcmi, DMA_Handle, phdma_dcmi);
dflet 14:90603ea1e85b 600
dflet 14:90603ea1e85b 601 /*** Configure the NVIC for DCMI and DMA ***/
dflet 14:90603ea1e85b 602 /* NVIC configuration for DCMI transfer complete interrupt */
dflet 14:90603ea1e85b 603 HAL_NVIC_SetPriority(DCMI_IRQn, 1, 0);
dflet 14:90603ea1e85b 604 HAL_NVIC_EnableIRQ(DCMI_IRQn);
dflet 14:90603ea1e85b 605
dflet 14:90603ea1e85b 606 /* NVIC configuration for DMA2 transfer complete interrupt */
dflet 14:90603ea1e85b 607 HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 1, 0);
dflet 14:90603ea1e85b 608 HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
dflet 14:90603ea1e85b 609
dflet 14:90603ea1e85b 610 HAL_DMA_Init(&phdma_dcmi);
dflet 5:75fcfdb7cae7 611 }
dflet 0:50cedd586816 612
dflet 0:50cedd586816 613 g_frame_size_in_bytes = 0;
dflet 0:50cedd586816 614 g_frame_end = 0;
dflet 14:90603ea1e85b 615 }
dflet 14:90603ea1e85b 616
dflet 14:90603ea1e85b 617 /******************************************************************************/
dflet 14:90603ea1e85b 618 /* STM32F4xx Peripheral Interrupt Handlers */
dflet 14:90603ea1e85b 619 /* Add here the Interrupt Handlers for the used peripherals. */
dflet 14:90603ea1e85b 620 /* For the available peripheral interrupt handler names, */
dflet 14:90603ea1e85b 621 /* please refer to the startup file (startup_stm32f4xx.s). */
dflet 14:90603ea1e85b 622 /******************************************************************************/
dflet 0:50cedd586816 623
dflet 14:90603ea1e85b 624 void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
dflet 14:90603ea1e85b 625 {
dflet 14:90603ea1e85b 626 int32_t dcmi_state;
dflet 14:90603ea1e85b 627 int32_t dcmi_error;
dflet 14:90603ea1e85b 628
dflet 14:90603ea1e85b 629 HAL_DMA_Abort(&phdma_dcmi);
dflet 14:90603ea1e85b 630
dflet 14:90603ea1e85b 631 HttpDebug("\r\nDCMI_ErrorCallback!\r\n");
dflet 14:90603ea1e85b 632
dflet 14:90603ea1e85b 633 dcmi_state = HAL_DCMI_GetState(&phdcmi);
dflet 14:90603ea1e85b 634 if(0 == dcmi_state){
dflet 14:90603ea1e85b 635 HttpDebug("\r\nDCMI not yet initialized or disabled\r\n");
dflet 14:90603ea1e85b 636 }else if(1 == dcmi_state){
dflet 14:90603ea1e85b 637 HttpDebug("\r\nDCMI initialized and ready for use\r\n");
dflet 14:90603ea1e85b 638 }else if(2 == dcmi_state){
dflet 14:90603ea1e85b 639 HttpDebug("\r\nDCMI internal processing is ongoing\r\n");
dflet 14:90603ea1e85b 640 }else if(3 == dcmi_state){
dflet 14:90603ea1e85b 641 HttpDebug("\r\nDCMI timeout state\r\n");
dflet 14:90603ea1e85b 642 }else if(4 == dcmi_state){
dflet 14:90603ea1e85b 643 HttpDebug("\r\nDCMI error state\r\n");
dflet 14:90603ea1e85b 644 dcmi_error = HAL_DCMI_GetError(&phdcmi);
dflet 14:90603ea1e85b 645 if(1 == dcmi_error){
dflet 14:90603ea1e85b 646 HttpDebug("\r\nDCMI Synchronisation error\r\n");
dflet 14:90603ea1e85b 647 }else if(2 == dcmi_error){
dflet 14:90603ea1e85b 648 HttpDebug("\r\nDCMI Overrun\r\n");
dflet 14:90603ea1e85b 649 }
dflet 14:90603ea1e85b 650 }
dflet 14:90603ea1e85b 651 HttpDebug("\r\nExtra info! \r\n");
dflet 14:90603ea1e85b 652 g_frame_size_in_bytes = 4*(NUM_OF_4B_CHUNKS - phdma_dcmi.Instance->NDTR);//NDTR counts down!
dflet 14:90603ea1e85b 653 if(g_frame_size_in_bytes >= 0xC800){
dflet 14:90603ea1e85b 654 HttpDebug("Bytes captured equals or exceeds buffer size! \r\n");
dflet 14:90603ea1e85b 655 HttpDebug("Bytes captured 0x%x\r\n",g_frame_size_in_bytes);
dflet 14:90603ea1e85b 656 }else{
dflet 14:90603ea1e85b 657 HttpDebug("Bytes captured 0x%x\r\n",g_frame_size_in_bytes);
dflet 14:90603ea1e85b 658 }
dflet 14:90603ea1e85b 659
dflet 14:90603ea1e85b 660 HAL_DMA_Abort(&phdma_dcmi);
dflet 14:90603ea1e85b 661 #ifdef MT9D111_CAM
dflet 14:90603ea1e85b 662 cam_power_off();
dflet 14:90603ea1e85b 663 #endif
dflet 14:90603ea1e85b 664 HAL_DCMI_MspDeInit(&phdcmi);
dflet 14:90603ea1e85b 665 }
dflet 5:75fcfdb7cae7 666
dflet 14:90603ea1e85b 667 void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
dflet 14:90603ea1e85b 668 {
dflet 14:90603ea1e85b 669 g_lines++;
dflet 14:90603ea1e85b 670 //HttpDebug("\r\nDCMI_LineEventCallback! 0x%x\r\n",hdcmi->ErrorCode);
dflet 14:90603ea1e85b 671
dflet 14:90603ea1e85b 672 }
dflet 0:50cedd586816 673
dflet 14:90603ea1e85b 674 void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
dflet 14:90603ea1e85b 675 {
dflet 14:90603ea1e85b 676 g_lines = 0;
dflet 14:90603ea1e85b 677 // printf("\r\nVsyncEventCallback\r\n");
dflet 14:90603ea1e85b 678
dflet 14:90603ea1e85b 679 }
dflet 14:90603ea1e85b 680
dflet 14:90603ea1e85b 681 void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
dflet 14:90603ea1e85b 682 {
dflet 14:90603ea1e85b 683 HAL_DMA_Abort(&phdma_dcmi);
dflet 14:90603ea1e85b 684 g_frame_end = 1;
dflet 5:75fcfdb7cae7 685
dflet 14:90603ea1e85b 686 HttpDebug("\r\nDCMI Frame Capture complete! \r\n");
dflet 14:90603ea1e85b 687
dflet 14:90603ea1e85b 688 }
dflet 14:90603ea1e85b 689
dflet 14:90603ea1e85b 690 void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
dflet 14:90603ea1e85b 691 {
dflet 14:90603ea1e85b 692 if(hdcmi->Instance==DCMI) {
dflet 14:90603ea1e85b 693
dflet 14:90603ea1e85b 694 /* Peripheral clock disable */
dflet 14:90603ea1e85b 695 __DCMI_CLK_DISABLE();
dflet 5:75fcfdb7cae7 696
dflet 14:90603ea1e85b 697 /**DCMI GPIO Configuration
dflet 14:90603ea1e85b 698 PE4 ------> DCMI_D4
dflet 14:90603ea1e85b 699 PE5 ------> DCMI_D6
dflet 14:90603ea1e85b 700 PE6 ------> DCMI_D7
dflet 14:90603ea1e85b 701 PA4 ------> DCMI_HSYNC
dflet 14:90603ea1e85b 702 PA6 ------> DCMI_PIXCK
dflet 14:90603ea1e85b 703 PC8 ------> DCMI_D2
dflet 14:90603ea1e85b 704 PC9 ------> DCMI_D3
dflet 14:90603ea1e85b 705 PA9 ------> DCMI_D0
dflet 14:90603ea1e85b 706 PA10 ------> DCMI_D1
dflet 14:90603ea1e85b 707 PB6 ------> DCMI_D5
dflet 14:90603ea1e85b 708 PB7 ------> DCMI_VSYNC
dflet 5:75fcfdb7cae7 709
dflet 14:90603ea1e85b 710 PA8 ------> MCO1
dflet 14:90603ea1e85b 711 */
dflet 14:90603ea1e85b 712
dflet 14:90603ea1e85b 713 HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
dflet 5:75fcfdb7cae7 714
dflet 14:90603ea1e85b 715 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
dflet 14:90603ea1e85b 716
dflet 14:90603ea1e85b 717 HAL_GPIO_DeInit(GPIOC, GPIO_PIN_9|GPIO_PIN_8);
dflet 14:90603ea1e85b 718
dflet 14:90603ea1e85b 719 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
dflet 5:75fcfdb7cae7 720
dflet 14:90603ea1e85b 721 /* Peripheral DMA DeInit*/
dflet 14:90603ea1e85b 722 HAL_DMA_DeInit(hdcmi->DMA_Handle);
dflet 14:90603ea1e85b 723
dflet 14:90603ea1e85b 724 /* Peripheral interrupt DeInit*/
dflet 14:90603ea1e85b 725 HAL_NVIC_DisableIRQ(DCMI_IRQn);
dflet 5:75fcfdb7cae7 726
dflet 14:90603ea1e85b 727 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8);
dflet 14:90603ea1e85b 728 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8 | GPIO_PIN_9);
dflet 14:90603ea1e85b 729 }
dflet 5:75fcfdb7cae7 730
dflet 14:90603ea1e85b 731
dflet 14:90603ea1e85b 732 }
dflet 0:50cedd586816 733
dflet 0:50cedd586816 734 //*****************************************************************************
dflet 0:50cedd586816 735 //
dflet 14:90603ea1e85b 736 //! JfifApp0Marker
dflet 14:90603ea1e85b 737 //!
dflet 14:90603ea1e85b 738 //! \param Pointer to the output buffer
dflet 14:90603ea1e85b 739 //! \return Length of the Marker
dflet 0:50cedd586816 740 //
dflet 0:50cedd586816 741 //*****************************************************************************
dflet 0:50cedd586816 742
dflet 0:50cedd586816 743 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 744 static int JfifApp0Marker(char *pbuf)
dflet 0:50cedd586816 745 {
dflet 7:a069c1750fbc 746 // Uart_Write((uint8_t*)"JfifApp0Marker \n\r");
dflet 14:90603ea1e85b 747 *pbuf++= 0xFF; // APP0 marker
dflet 0:50cedd586816 748 *pbuf++= 0xE0;
dflet 14:90603ea1e85b 749 *pbuf++= 0x00; // length
dflet 0:50cedd586816 750 *pbuf++= 0x10;
dflet 14:90603ea1e85b 751 *pbuf++= 0x4A; // JFIF identifier
dflet 0:50cedd586816 752 *pbuf++= 0x46;
dflet 0:50cedd586816 753 *pbuf++= 0x49;
dflet 0:50cedd586816 754 *pbuf++= 0x46;
dflet 0:50cedd586816 755 *pbuf++= 0x00;
dflet 14:90603ea1e85b 756 *pbuf++= 0x01; // version
dflet 0:50cedd586816 757 *pbuf++= 0x02;
dflet 14:90603ea1e85b 758 *pbuf++= 0x00; // units
dflet 14:90603ea1e85b 759 *pbuf++= 0x00; // X density
dflet 0:50cedd586816 760 *pbuf++= 0x01;
dflet 14:90603ea1e85b 761 *pbuf++= 0x00; // Y density
dflet 0:50cedd586816 762 *pbuf++= 0x01;
dflet 14:90603ea1e85b 763 *pbuf++= 0x00; // X thumbnail
dflet 14:90603ea1e85b 764 *pbuf++= 0x00; // Y thumbnail
dflet 0:50cedd586816 765 return 18;
dflet 0:50cedd586816 766 }
dflet 0:50cedd586816 767
dflet 0:50cedd586816 768
dflet 0:50cedd586816 769 //*****************************************************************************
dflet 0:50cedd586816 770 //
dflet 0:50cedd586816 771 //! FrameHeaderMarker
dflet 14:90603ea1e85b 772 //!
dflet 14:90603ea1e85b 773 //! \param1 pointer to the output buffer
dflet 14:90603ea1e85b 774 //! \param2 width
dflet 14:90603ea1e85b 775 //! \param3 height
dflet 0:50cedd586816 776 //! \param4 format
dflet 0:50cedd586816 777 //!
dflet 14:90603ea1e85b 778 //! \return Length of the header marker
dflet 0:50cedd586816 779 //
dflet 0:50cedd586816 780 //*****************************************************************************
dflet 0:50cedd586816 781 static int FrameHeaderMarker(char *pbuf, int width, int height, int format)
dflet 0:50cedd586816 782 {
dflet 7:a069c1750fbc 783 // Uart_Write((uint8_t*)"FrameHeaderMarker \n\r");
dflet 0:50cedd586816 784 int length;
dflet 0:50cedd586816 785 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 786 length = 11;
dflet 0:50cedd586816 787 else
dflet 0:50cedd586816 788 length = 17;
dflet 0:50cedd586816 789
dflet 14:90603ea1e85b 790 *pbuf++= 0xFF; // start of frame: baseline DCT
dflet 0:50cedd586816 791 *pbuf++= 0xC0;
dflet 14:90603ea1e85b 792 *pbuf++= length>>8; // length field
dflet 0:50cedd586816 793 *pbuf++= length&0xFF;
dflet 14:90603ea1e85b 794 *pbuf++= 0x08; // sample precision
dflet 14:90603ea1e85b 795 *pbuf++= height>>8; // number of lines
dflet 0:50cedd586816 796 *pbuf++= height&0xFF;
dflet 14:90603ea1e85b 797 *pbuf++= width>>8; // number of samples per line
dflet 0:50cedd586816 798 *pbuf++= width&0xFF;
dflet 0:50cedd586816 799
dflet 14:90603ea1e85b 800 if (format == FORMAT_MONOCHROME) { // monochrome
dflet 14:90603ea1e85b 801 *pbuf++= 0x01; // number of image components in frame
dflet 14:90603ea1e85b 802 *pbuf++= 0x00; // component identifier: Y
dflet 14:90603ea1e85b 803 *pbuf++= 0x11; // horizontal | vertical sampling factor: Y
dflet 14:90603ea1e85b 804 *pbuf++= 0x00; // quantization table selector: Y
dflet 14:90603ea1e85b 805 } else if (format == FORMAT_YCBCR422) { // YCbCr422
dflet 14:90603ea1e85b 806 *pbuf++= 0x03; // number of image components in frame
dflet 14:90603ea1e85b 807 *pbuf++= 0x00; // component identifier: Y
dflet 14:90603ea1e85b 808 *pbuf++= 0x21; // horizontal | vertical sampling factor: Y
dflet 14:90603ea1e85b 809 *pbuf++= 0x00; // quantization table selector: Y
dflet 14:90603ea1e85b 810 *pbuf++= 0x01; // component identifier: Cb
dflet 14:90603ea1e85b 811 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cb
dflet 14:90603ea1e85b 812 *pbuf++= 0x01; // quantization table selector: Cb
dflet 14:90603ea1e85b 813 *pbuf++= 0x02; // component identifier: Cr
dflet 14:90603ea1e85b 814 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cr
dflet 14:90603ea1e85b 815 *pbuf++= 0x01; // quantization table selector: Cr
dflet 14:90603ea1e85b 816 } else { // YCbCr420
dflet 14:90603ea1e85b 817 *pbuf++= 0x03; // number of image components in frame
dflet 14:90603ea1e85b 818 *pbuf++= 0x00; // component identifier: Y
dflet 14:90603ea1e85b 819 *pbuf++= 0x22; // horizontal | vertical sampling factor: Y
dflet 14:90603ea1e85b 820 *pbuf++= 0x00; // quantization table selector: Y
dflet 14:90603ea1e85b 821 *pbuf++= 0x01; // component identifier: Cb
dflet 14:90603ea1e85b 822 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cb
dflet 14:90603ea1e85b 823 *pbuf++= 0x01; // quantization table selector: Cb
dflet 14:90603ea1e85b 824 *pbuf++= 0x02; // component identifier: Cr
dflet 14:90603ea1e85b 825 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cr
dflet 14:90603ea1e85b 826 *pbuf++= 0x01; // quantization table selector: Cr
dflet 0:50cedd586816 827 }
dflet 0:50cedd586816 828
dflet 0:50cedd586816 829 return (length+2);
dflet 0:50cedd586816 830 }
dflet 0:50cedd586816 831
dflet 0:50cedd586816 832
dflet 0:50cedd586816 833 //*****************************************************************************
dflet 0:50cedd586816 834 //
dflet 0:50cedd586816 835 //! ScanHeaderMarker
dflet 0:50cedd586816 836 //!
dflet 14:90603ea1e85b 837 //! \param1 pointer to output buffer
dflet 14:90603ea1e85b 838 //! \param2 Format
dflet 0:50cedd586816 839 //!
dflet 14:90603ea1e85b 840 //! \return Length
dflet 0:50cedd586816 841 //
dflet 0:50cedd586816 842 //*****************************************************************************
dflet 0:50cedd586816 843 static int ScanHeaderMarker(char *pbuf, int format)
dflet 0:50cedd586816 844 {
dflet 0:50cedd586816 845 int length;
dflet 0:50cedd586816 846 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 847 length = 8;
dflet 0:50cedd586816 848 else
dflet 0:50cedd586816 849 length = 12;
dflet 0:50cedd586816 850
dflet 14:90603ea1e85b 851 *pbuf++= 0xFF; // start of scan
dflet 0:50cedd586816 852 *pbuf++= 0xDA;
dflet 14:90603ea1e85b 853 *pbuf++= length>>8; // length field
dflet 0:50cedd586816 854 *pbuf++= length&0xFF;
dflet 14:90603ea1e85b 855 if (format == FORMAT_MONOCHROME) { // monochrome
dflet 14:90603ea1e85b 856 *pbuf++= 0x01; // number of image components in scan
dflet 14:90603ea1e85b 857 *pbuf++= 0x00; // scan component selector: Y
dflet 14:90603ea1e85b 858 *pbuf++= 0x00; // DC | AC huffman table selector: Y
dflet 14:90603ea1e85b 859 } else { // YCbCr
dflet 14:90603ea1e85b 860 *pbuf++= 0x03; // number of image components in scan
dflet 14:90603ea1e85b 861 *pbuf++= 0x00; // scan component selector: Y
dflet 14:90603ea1e85b 862 *pbuf++= 0x00; // DC | AC huffman table selector: Y
dflet 14:90603ea1e85b 863 *pbuf++= 0x01; // scan component selector: Cb
dflet 14:90603ea1e85b 864 *pbuf++= 0x11; // DC | AC huffman table selector: Cb
dflet 14:90603ea1e85b 865 *pbuf++= 0x02; // scan component selector: Cr
dflet 14:90603ea1e85b 866 *pbuf++= 0x11; // DC | AC huffman table selector: Cr
dflet 0:50cedd586816 867 }
dflet 0:50cedd586816 868
dflet 14:90603ea1e85b 869 *pbuf++= 0x00; // Ss: start of predictor selector
dflet 14:90603ea1e85b 870 *pbuf++= 0x3F; // Se: end of spectral selector
dflet 14:90603ea1e85b 871 *pbuf++= 0x00; // Ah | Al: successive approximation bit position
dflet 0:50cedd586816 872
dflet 0:50cedd586816 873 return (length+2);
dflet 0:50cedd586816 874 }
dflet 0:50cedd586816 875
dflet 0:50cedd586816 876
dflet 0:50cedd586816 877 //*****************************************************************************
dflet 0:50cedd586816 878 //
dflet 14:90603ea1e85b 879 //! DefineQuantizationTableMarker
dflet 0:50cedd586816 880 //! Calculate and write the quantisation tables
dflet 14:90603ea1e85b 881 //! qscale is the customised scaling factor - see MT9D131 developer guide page 78
dflet 0:50cedd586816 882 //!
dflet 14:90603ea1e85b 883 //! \param1 pointer to the output buffer
dflet 14:90603ea1e85b 884 //! \param2 Quantization Scale
dflet 14:90603ea1e85b 885 //! \param3 Format
dflet 14:90603ea1e85b 886 //!
dflet 14:90603ea1e85b 887 //! \return Length of the Marker
dflet 0:50cedd586816 888 //
dflet 0:50cedd586816 889 //*****************************************************************************
dflet 0:50cedd586816 890 static int DefineQuantizationTableMarker (unsigned char *pbuf, int qscale, int format)
dflet 0:50cedd586816 891 {
dflet 7:a069c1750fbc 892 // Uart_Write((uint8_t*)"DefineQuantizationTableMarker \n\r");
dflet 0:50cedd586816 893 int i, length, temp;
dflet 14:90603ea1e85b 894 unsigned char newtbl[64]; // temporary array to store scaled zigzagged quant entries
dflet 0:50cedd586816 895
dflet 14:90603ea1e85b 896 if (format == FORMAT_MONOCHROME) // monochrome
dflet 0:50cedd586816 897 length = 67;
dflet 0:50cedd586816 898 else
dflet 0:50cedd586816 899 length = 132;
dflet 0:50cedd586816 900
dflet 14:90603ea1e85b 901 *pbuf++ = 0xFF; // define quantization table marker
dflet 0:50cedd586816 902 *pbuf++ = 0xDB;
dflet 14:90603ea1e85b 903 *pbuf++ = length>>8; // length field
dflet 0:50cedd586816 904 *pbuf++ = length&0xFF;
dflet 14:90603ea1e85b 905 *pbuf++ = 0; // quantization table precision | identifier for luminance
dflet 0:50cedd586816 906
dflet 14:90603ea1e85b 907 // calculate scaled zigzagged luminance quantisation table entries
dflet 0:50cedd586816 908 for (i=0; i<64; i++) {
dflet 0:50cedd586816 909 temp = (JPEG_StdQuantTblY[i] * qscale + 16) / 32;
dflet 14:90603ea1e85b 910 // limit the values to the valid range
dflet 0:50cedd586816 911 if (temp <= 0)
dflet 0:50cedd586816 912 temp = 1;
dflet 0:50cedd586816 913 if (temp > 255)
dflet 0:50cedd586816 914 temp = 255;
dflet 0:50cedd586816 915 newtbl[zigzag[i]] = (unsigned char) temp;
dflet 0:50cedd586816 916 }
dflet 0:50cedd586816 917
dflet 14:90603ea1e85b 918 // write the resulting luminance quant table to the output buffer
dflet 0:50cedd586816 919 for (i=0; i<64; i++)
dflet 0:50cedd586816 920 *pbuf++ = newtbl[i];
dflet 0:50cedd586816 921
dflet 14:90603ea1e85b 922 // if format is monochrome we're finished, otherwise continue on, to do chrominance quant table
dflet 0:50cedd586816 923 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 924 return (length+2);
dflet 0:50cedd586816 925
dflet 14:90603ea1e85b 926 *pbuf++ = 1; // quantization table precision | identifier for chrominance
dflet 0:50cedd586816 927
dflet 14:90603ea1e85b 928 // calculate scaled zigzagged chrominance quantisation table entries
dflet 0:50cedd586816 929 for (i=0; i<64; i++) {
dflet 0:50cedd586816 930 temp = (JPEG_StdQuantTblC[i] * qscale + 16) / 32;
dflet 14:90603ea1e85b 931 // limit the values to the valid range
dflet 0:50cedd586816 932 if (temp <= 0)
dflet 0:50cedd586816 933 temp = 1;
dflet 0:50cedd586816 934 if (temp > 255)
dflet 0:50cedd586816 935 temp = 255;
dflet 0:50cedd586816 936 newtbl[zigzag[i]] = (unsigned char) temp;
dflet 0:50cedd586816 937 }
dflet 0:50cedd586816 938
dflet 14:90603ea1e85b 939 // write the resulting chrominance quant table to the output buffer
dflet 0:50cedd586816 940 for (i=0; i<64; i++)
dflet 0:50cedd586816 941 *pbuf++ = newtbl[i];
dflet 0:50cedd586816 942
dflet 0:50cedd586816 943 return (length+2);
dflet 0:50cedd586816 944 }
dflet 0:50cedd586816 945
dflet 0:50cedd586816 946
dflet 0:50cedd586816 947 //*****************************************************************************
dflet 0:50cedd586816 948 //
dflet 14:90603ea1e85b 949 //! DefineHuffmanTableMarkerDC
dflet 14:90603ea1e85b 950 //!
dflet 14:90603ea1e85b 951 //! \param1 pointer to Marker buffer
dflet 14:90603ea1e85b 952 //! \param2 Huffman table
dflet 14:90603ea1e85b 953 //! \param3 Class Identifier
dflet 14:90603ea1e85b 954 //!
dflet 14:90603ea1e85b 955 //! \return Length of the marker
dflet 0:50cedd586816 956 //
dflet 0:50cedd586816 957 //*****************************************************************************
dflet 0:50cedd586816 958 static int DefineHuffmanTableMarkerDC(char *pbuf, unsigned int *htable, int class_id)
dflet 0:50cedd586816 959 {
dflet 7:a069c1750fbc 960 // Uart_Write((uint8_t*)"DefineHuffmanTableMarkerDC \n\r");
dflet 0:50cedd586816 961 int i, l, count;
dflet 0:50cedd586816 962 int length;
dflet 0:50cedd586816 963 char *plength;
dflet 0:50cedd586816 964
dflet 14:90603ea1e85b 965 *pbuf++= 0xFF; // define huffman table marker
dflet 0:50cedd586816 966 *pbuf++= 0xC4;
dflet 14:90603ea1e85b 967 plength = pbuf; // place holder for length field
dflet 0:50cedd586816 968 *pbuf++;
dflet 0:50cedd586816 969 *pbuf++;
dflet 14:90603ea1e85b 970 *pbuf++= class_id; // huffman table class | identifier
dflet 0:50cedd586816 971
dflet 14:90603ea1e85b 972 for (l = 0; l < 16; l++) {
dflet 0:50cedd586816 973 count = 0;
dflet 14:90603ea1e85b 974 for (i = 0; i < 12; i++) {
dflet 0:50cedd586816 975 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 976 count++;
dflet 0:50cedd586816 977 }
dflet 14:90603ea1e85b 978 *pbuf++= count; // number of huffman codes of length l+1
dflet 0:50cedd586816 979 }
dflet 0:50cedd586816 980
dflet 0:50cedd586816 981 length = 19;
dflet 14:90603ea1e85b 982 for (l = 0; l < 16; l++) {
dflet 14:90603ea1e85b 983 for (i = 0; i < 12; i++) {
dflet 14:90603ea1e85b 984 if ((htable[i] >> 8) == l) {
dflet 14:90603ea1e85b 985 *pbuf++= i; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 986 length++;
dflet 0:50cedd586816 987 }
dflet 0:50cedd586816 988 }
dflet 0:50cedd586816 989 }
dflet 0:50cedd586816 990
dflet 14:90603ea1e85b 991 *plength++= length>>8; // length field
dflet 0:50cedd586816 992 *plength = length&0xFF;
dflet 0:50cedd586816 993
dflet 0:50cedd586816 994 return (length + 2);
dflet 0:50cedd586816 995 }
dflet 0:50cedd586816 996
dflet 0:50cedd586816 997
dflet 0:50cedd586816 998 //*****************************************************************************
dflet 0:50cedd586816 999 //
dflet 14:90603ea1e85b 1000 //! DefineHuffmanTableMarkerAC
dflet 0:50cedd586816 1001 //! 1. Establishes connection w/ AP//
dflet 0:50cedd586816 1002 //! 2. Initializes the camera sub-components//! GPIO Enable & Configuration
dflet 0:50cedd586816 1003 //! 3. Listens and processes the image capture requests from user-applications
dflet 14:90603ea1e85b 1004 //!
dflet 14:90603ea1e85b 1005 //! \param1 pointer to Marker buffer
dflet 14:90603ea1e85b 1006 //! \param2 Huffman table
dflet 14:90603ea1e85b 1007 //! \param3 Class Identifier
dflet 0:50cedd586816 1008 //!
dflet 0:50cedd586816 1009 //! \return Length of the Marker
dflet 14:90603ea1e85b 1010 //!
dflet 0:50cedd586816 1011 //
dflet 0:50cedd586816 1012 //*****************************************************************************
dflet 0:50cedd586816 1013 static int DefineHuffmanTableMarkerAC(char *pbuf, unsigned int *htable, int class_id)
dflet 0:50cedd586816 1014 {
dflet 7:a069c1750fbc 1015 // Uart_Write((uint8_t*)"DefineHuffmanTableMarkerAC \n\r");
dflet 0:50cedd586816 1016 int i, l, a, b, count;
dflet 0:50cedd586816 1017 char *plength;
dflet 0:50cedd586816 1018 int length;
dflet 0:50cedd586816 1019
dflet 14:90603ea1e85b 1020 *pbuf++= 0xFF; // define huffman table marker
dflet 0:50cedd586816 1021 *pbuf++= 0xC4;
dflet 14:90603ea1e85b 1022 plength = pbuf; // place holder for length field
dflet 0:50cedd586816 1023 *pbuf++;
dflet 0:50cedd586816 1024 *pbuf++;
dflet 14:90603ea1e85b 1025 *pbuf++= class_id; // huffman table class | identifier
dflet 0:50cedd586816 1026
dflet 14:90603ea1e85b 1027 for (l = 0; l < 16; l++) {
dflet 0:50cedd586816 1028 count = 0;
dflet 14:90603ea1e85b 1029 for (i = 0; i < 162; i++) {
dflet 0:50cedd586816 1030 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 1031 count++;
dflet 0:50cedd586816 1032 }
dflet 0:50cedd586816 1033
dflet 14:90603ea1e85b 1034 *pbuf++= count; // number of huffman codes of length l+1
dflet 0:50cedd586816 1035 }
dflet 0:50cedd586816 1036
dflet 0:50cedd586816 1037 length = 19;
dflet 14:90603ea1e85b 1038 for (l = 0; l < 16; l++) {
dflet 14:90603ea1e85b 1039 // check EOB: 0|0
dflet 14:90603ea1e85b 1040 if ((htable[160] >> 8) == l) {
dflet 14:90603ea1e85b 1041 *pbuf++= 0; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 1042 length++;
dflet 0:50cedd586816 1043 }
dflet 0:50cedd586816 1044
dflet 14:90603ea1e85b 1045 // check HUFFVAL: 0|1 to E|A
dflet 14:90603ea1e85b 1046 for (i = 0; i < 150; i++) {
dflet 14:90603ea1e85b 1047 if ((htable[i] >> 8) == l) {
dflet 0:50cedd586816 1048 a = i/10;
dflet 0:50cedd586816 1049 b = i%10;
dflet 14:90603ea1e85b 1050 *pbuf++= (a<<4)|(b+1); // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 1051 length++;
dflet 0:50cedd586816 1052 }
dflet 0:50cedd586816 1053 }
dflet 0:50cedd586816 1054
dflet 14:90603ea1e85b 1055 // check ZRL: F|0
dflet 14:90603ea1e85b 1056 if ((htable[161] >> 8) == l) {
dflet 14:90603ea1e85b 1057 *pbuf++= 0xF0; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 1058 length++;
dflet 0:50cedd586816 1059 }
dflet 0:50cedd586816 1060
dflet 14:90603ea1e85b 1061 // check HUFFVAL: F|1 to F|A
dflet 14:90603ea1e85b 1062 for (i = 150; i < 160; i++) {
dflet 14:90603ea1e85b 1063 if ((htable[i] >> 8) == l) {
dflet 0:50cedd586816 1064 a = i/10;
dflet 0:50cedd586816 1065 b = i%10;
dflet 14:90603ea1e85b 1066 *pbuf++= (a<<4)|(b+1); // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 1067 length++;
dflet 0:50cedd586816 1068 }
dflet 0:50cedd586816 1069 }
dflet 0:50cedd586816 1070 }
dflet 0:50cedd586816 1071
dflet 14:90603ea1e85b 1072 *plength++= length>>8; // length field
dflet 0:50cedd586816 1073 *plength = length&0xFF;
dflet 0:50cedd586816 1074 return (length + 2);
dflet 0:50cedd586816 1075 }
dflet 0:50cedd586816 1076
dflet 0:50cedd586816 1077
dflet 0:50cedd586816 1078 //*****************************************************************************
dflet 0:50cedd586816 1079 //
dflet 0:50cedd586816 1080 //! DefineRestartIntervalMarker
dflet 14:90603ea1e85b 1081 //!
dflet 14:90603ea1e85b 1082 //! \param1 pointer to Marker buffer
dflet 0:50cedd586816 1083 //! \param2 return interval
dflet 0:50cedd586816 1084 //!
dflet 14:90603ea1e85b 1085 //! \return Length
dflet 0:50cedd586816 1086 //
dflet 0:50cedd586816 1087 //*****************************************************************************
dflet 0:50cedd586816 1088 static int DefineRestartIntervalMarker(char *pbuf, int ri)
dflet 0:50cedd586816 1089 {
dflet 7:a069c1750fbc 1090 // Uart_Write((uint8_t*)"DefineRestartIntervalMarker \n\r");
dflet 14:90603ea1e85b 1091 *pbuf++= 0xFF; // define restart interval marker
dflet 0:50cedd586816 1092 *pbuf++= 0xDD;
dflet 14:90603ea1e85b 1093 *pbuf++= 0x00; // length
dflet 0:50cedd586816 1094 *pbuf++= 0x04;
dflet 14:90603ea1e85b 1095 *pbuf++= ri >> 8; // restart interval
dflet 0:50cedd586816 1096 *pbuf++= ri & 0xFF;
dflet 0:50cedd586816 1097 return 6;
dflet 0:50cedd586816 1098 }
dflet 0:50cedd586816 1099 //*****************************************************************************
dflet 0:50cedd586816 1100 //
dflet 0:50cedd586816 1101 //! CreateJpegHeader
dflet 0:50cedd586816 1102 //! Create JPEG Header in JFIF format
dflet 14:90603ea1e85b 1103 //!
dflet 14:90603ea1e85b 1104 //! \param1 header - pointer to JPEG header buffer
dflet 14:90603ea1e85b 1105 //! \param2 width - image width
dflet 14:90603ea1e85b 1106 //! \param3 height - image height
dflet 14:90603ea1e85b 1107 //! \param4 format - color format (0 = YCbCr422, 1 = YCbCr420, 2 = monochrome)
dflet 14:90603ea1e85b 1108 //! \param5 restart_int - restart marker interval
dflet 0:50cedd586816 1109 //! \param6 qscale - quantization table scaling factor
dflet 0:50cedd586816 1110 //!
dflet 14:90603ea1e85b 1111 //! \return length of JPEG header (bytes)
dflet 0:50cedd586816 1112 //
dflet 0:50cedd586816 1113 //*****************************************************************************
dflet 0:50cedd586816 1114
dflet 0:50cedd586816 1115 static int CreateJpegHeader(char *header, int width, int height,
dflet 0:50cedd586816 1116 int format, int restart_int, int qscale)
dflet 0:50cedd586816 1117 {
dflet 7:a069c1750fbc 1118 // Uart_Write((uint8_t*)"CreateJpegHeader \n\r");
dflet 0:50cedd586816 1119 char *pbuf = header;
dflet 0:50cedd586816 1120 int length;
dflet 0:50cedd586816 1121
dflet 14:90603ea1e85b 1122 // SOI
dflet 0:50cedd586816 1123 *pbuf++= 0xFF;
dflet 0:50cedd586816 1124 *pbuf++= 0xD8;
dflet 0:50cedd586816 1125 length = 2;
dflet 0:50cedd586816 1126
dflet 14:90603ea1e85b 1127 // JFIF APP0
dflet 0:50cedd586816 1128 length += JfifApp0Marker(pbuf);
dflet 0:50cedd586816 1129
dflet 14:90603ea1e85b 1130 // Quantization Tables
dflet 0:50cedd586816 1131 pbuf = header + length;
dflet 0:50cedd586816 1132 length += DefineQuantizationTableMarker((unsigned char *)pbuf, qscale, format);
dflet 0:50cedd586816 1133
dflet 14:90603ea1e85b 1134 // Frame Header
dflet 0:50cedd586816 1135 pbuf = header + length;
dflet 0:50cedd586816 1136 length += FrameHeaderMarker(pbuf, width, height, format);
dflet 0:50cedd586816 1137
dflet 14:90603ea1e85b 1138 // Huffman Table DC 0 for Luma
dflet 0:50cedd586816 1139 pbuf = header + length;
dflet 0:50cedd586816 1140 length += DefineHuffmanTableMarkerDC(pbuf, &JPEG_StdHuffmanTbl[352], 0x00);
dflet 0:50cedd586816 1141
dflet 14:90603ea1e85b 1142 // Huffman Table AC 0 for Luma
dflet 0:50cedd586816 1143 pbuf = header + length;
dflet 0:50cedd586816 1144 length += DefineHuffmanTableMarkerAC(pbuf, &JPEG_StdHuffmanTbl[0], 0x10);
dflet 0:50cedd586816 1145
dflet 14:90603ea1e85b 1146 if (format != FORMAT_MONOCHROME) { // YCbCr
dflet 14:90603ea1e85b 1147 // Huffman Table DC 1 for Chroma
dflet 0:50cedd586816 1148 pbuf = header + length;
dflet 0:50cedd586816 1149 length += DefineHuffmanTableMarkerDC(pbuf, &JPEG_StdHuffmanTbl[368], 0x01);
dflet 0:50cedd586816 1150
dflet 14:90603ea1e85b 1151 // Huffman Table AC 1 for Chroma
dflet 0:50cedd586816 1152 pbuf = header + length;
dflet 0:50cedd586816 1153 length += DefineHuffmanTableMarkerAC(pbuf, &JPEG_StdHuffmanTbl[176], 0x11);
dflet 0:50cedd586816 1154 }
dflet 0:50cedd586816 1155
dflet 14:90603ea1e85b 1156 // Restart Interval
dflet 14:90603ea1e85b 1157 if (restart_int > 0) {
dflet 0:50cedd586816 1158 pbuf = header + length;
dflet 0:50cedd586816 1159 length += DefineRestartIntervalMarker(pbuf, restart_int);
dflet 0:50cedd586816 1160 }
dflet 0:50cedd586816 1161
dflet 14:90603ea1e85b 1162 // Scan Header
dflet 0:50cedd586816 1163 pbuf = header + length;
dflet 0:50cedd586816 1164 length += ScanHeaderMarker(pbuf, format);
dflet 0:50cedd586816 1165
dflet 0:50cedd586816 1166 return length;
dflet 0:50cedd586816 1167 }
dflet 6:37fb696395d7 1168 #endif// jpeg defined
dflet 0:50cedd586816 1169
dflet 0:50cedd586816 1170
dflet 0:50cedd586816 1171
dflet 0:50cedd586816 1172 //*****************************************************************************
dflet 0:50cedd586816 1173 //
dflet 0:50cedd586816 1174 // Close the Doxygen group.
dflet 0:50cedd586816 1175 //! @}
dflet 0:50cedd586816 1176 //
dflet 0:50cedd586816 1177 //*****************************************************************************
dflet 0:50cedd586816 1178
dflet 14:90603ea1e85b 1179
dflet 14:90603ea1e85b 1180
dflet 14:90603ea1e85b 1181
dflet 14:90603ea1e85b 1182
dflet 14:90603ea1e85b 1183