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:
Thu Sep 03 20:10:39 2015 +0000
Revision:
18:3f1b52616d00
Parent:
16:7e5aab2fabba
Child:
21:38c6b11aa348
Some debug removed still have some random  failures with SPI?? MT9D111 cam still not working.

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