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

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
21:38c6b11aa348
Removed some debug.

Who changed what in which revision?

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