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