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:
Mon Jul 13 08:20:40 2015 +0000
Revision:
13:bf45f592c2b6
Parent:
12:7d75ba5deed1
Child:
14:90603ea1e85b
WIP commit 14 i2c not working correctly.

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