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:
Sun Jul 05 22:18:04 2015 +0000
Revision:
7:a069c1750fbc
Parent:
6:37fb696395d7
Child:
8:529a12812c53
WIP commit 8

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