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:
Wed Jun 24 09:54:16 2015 +0000
Revision:
0:50cedd586816
Child:
1:1a80c1529aa3
First commit work in progress

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