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