TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.
camera_app/ov5642/ArduCAM.h@1:e448e81c416f, 2015-09-11 (annotated)
- Committer:
- dflet
- Date:
- Fri Sep 11 15:38:33 2015 +0000
- Revision:
- 1:e448e81c416f
- Parent:
- 0:400d8e75a8d0
Removed some debud.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:400d8e75a8d0 | 1 | /* |
dflet | 0:400d8e75a8d0 | 2 | ArduCAM.h - Arduino library support for CMOS Image Sensor |
dflet | 0:400d8e75a8d0 | 3 | Copyright (C)2011-2015 ArduCAM.com. All right reserved |
dflet | 0:400d8e75a8d0 | 4 | |
dflet | 0:400d8e75a8d0 | 5 | Basic functionality of this library are based on the demo-code provided by |
dflet | 0:400d8e75a8d0 | 6 | ArduCAM.com. You can find the latest version of the library at |
dflet | 0:400d8e75a8d0 | 7 | http://www.ArduCAM.com |
dflet | 0:400d8e75a8d0 | 8 | |
dflet | 0:400d8e75a8d0 | 9 | Now supported controllers: |
dflet | 0:400d8e75a8d0 | 10 | - OV7670 |
dflet | 0:400d8e75a8d0 | 11 | - MT9D111 |
dflet | 0:400d8e75a8d0 | 12 | - OV7675 |
dflet | 0:400d8e75a8d0 | 13 | - OV2640 |
dflet | 0:400d8e75a8d0 | 14 | - OV3640 |
dflet | 0:400d8e75a8d0 | 15 | - OV5642 |
dflet | 0:400d8e75a8d0 | 16 | - OV7660 |
dflet | 0:400d8e75a8d0 | 17 | - OV7725 |
dflet | 0:400d8e75a8d0 | 18 | - MT9M112 |
dflet | 0:400d8e75a8d0 | 19 | - MT9V111 |
dflet | 0:400d8e75a8d0 | 20 | - OV5640 |
dflet | 0:400d8e75a8d0 | 21 | - MT9M001 |
dflet | 0:400d8e75a8d0 | 22 | |
dflet | 0:400d8e75a8d0 | 23 | We will add support for many other sensors in next release. |
dflet | 0:400d8e75a8d0 | 24 | |
dflet | 0:400d8e75a8d0 | 25 | Supported MCU platform |
dflet | 0:400d8e75a8d0 | 26 | - Theoretically support all Arduino families |
dflet | 0:400d8e75a8d0 | 27 | - Arduino UNO R3 (Tested) |
dflet | 0:400d8e75a8d0 | 28 | - Arduino MEGA2560 R3 (Tested) |
dflet | 0:400d8e75a8d0 | 29 | - Arduino Leonardo R3 (Tested) |
dflet | 0:400d8e75a8d0 | 30 | - Arduino Nano (Tested) |
dflet | 0:400d8e75a8d0 | 31 | - Arduino DUE (Tested) |
dflet | 0:400d8e75a8d0 | 32 | - Arduino Yun (Tested) |
dflet | 0:400d8e75a8d0 | 33 | - Raspberry Pi (Tested) |
dflet | 0:400d8e75a8d0 | 34 | |
dflet | 0:400d8e75a8d0 | 35 | |
dflet | 0:400d8e75a8d0 | 36 | If you make any modifications or improvements to the code, I would appreciate |
dflet | 0:400d8e75a8d0 | 37 | that you share the code with me so that I might include it in the next release. |
dflet | 0:400d8e75a8d0 | 38 | I can be contacted through http://www.ArduCAM.com |
dflet | 0:400d8e75a8d0 | 39 | |
dflet | 0:400d8e75a8d0 | 40 | This library is free software; you can redistribute it and/or |
dflet | 0:400d8e75a8d0 | 41 | modify it under the terms of the GNU Lesser General Public |
dflet | 0:400d8e75a8d0 | 42 | License as published by the Free Software Foundation; either |
dflet | 0:400d8e75a8d0 | 43 | version 2.1 of the License, or (at your option) any later version. |
dflet | 0:400d8e75a8d0 | 44 | |
dflet | 0:400d8e75a8d0 | 45 | This library is distributed in the hope that it will be useful, |
dflet | 0:400d8e75a8d0 | 46 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
dflet | 0:400d8e75a8d0 | 47 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
dflet | 0:400d8e75a8d0 | 48 | Lesser General Public License for more details. |
dflet | 0:400d8e75a8d0 | 49 | |
dflet | 0:400d8e75a8d0 | 50 | You should have received a copy of the GNU Lesser General Public |
dflet | 0:400d8e75a8d0 | 51 | License along with this library; if not, write to the Free Software |
dflet | 0:400d8e75a8d0 | 52 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
dflet | 0:400d8e75a8d0 | 53 | */ |
dflet | 0:400d8e75a8d0 | 54 | |
dflet | 0:400d8e75a8d0 | 55 | /*------------------------------------ |
dflet | 0:400d8e75a8d0 | 56 | Revision History: |
dflet | 0:400d8e75a8d0 | 57 | 2012/09/20 V1.0.0 by Lee first release |
dflet | 0:400d8e75a8d0 | 58 | 2012/10/23 V1.0.1 by Lee Resolved some timing issue for the Read/Write Register |
dflet | 0:400d8e75a8d0 | 59 | 2012/11/29 V1.1.0 by Lee Add support for MT9D111 sensor |
dflet | 0:400d8e75a8d0 | 60 | 2012/12/13 V1.2.0 by Lee Add support for OV7675 sensor |
dflet | 0:400d8e75a8d0 | 61 | 2012/12/28 V1.3.0 by Lee Add support for OV2640,OV3640,OV5642 sensors |
dflet | 0:400d8e75a8d0 | 62 | 2013/02/26 V2.0.0 by Lee New Rev.B shield hardware, add support for FIFO control |
dflet | 0:400d8e75a8d0 | 63 | and support Mega1280/2560 boards |
dflet | 0:400d8e75a8d0 | 64 | 2013/05/28 V2.1.0 by Lee Add support all drawing functions derived from UTFT library |
dflet | 0:400d8e75a8d0 | 65 | 2013/08/24 V3.0.0 by Lee Support ArudCAM shield Rev.C hardware, features SPI interface and low power mode. |
dflet | 0:400d8e75a8d0 | 66 | Support almost all series of Arduino boards including DUE. |
dflet | 0:400d8e75a8d0 | 67 | 2014/03/09 V3.1.0 by Lee Add the more impressive example sketches. |
dflet | 0:400d8e75a8d0 | 68 | Optimise the OV5642 settings, improve image quality. |
dflet | 0:400d8e75a8d0 | 69 | Add live preview before JPEG capture. |
dflet | 0:400d8e75a8d0 | 70 | Add play back photos one by one after BMP capture. |
dflet | 0:400d8e75a8d0 | 71 | 2014/05/01 V3.1.1 by Lee Minor changes to add support Arduino IDE for linux distributions. |
dflet | 0:400d8e75a8d0 | 72 | 2014/09/30 V3.2.0 by Lee Improvement on OV5642 camera dirver. |
dflet | 0:400d8e75a8d0 | 73 | 2014/10/06 V3.3.0 by Lee Add OV7660,OV7725 camera support. |
dflet | 0:400d8e75a8d0 | 74 | 2015/02/27 V3.4.0 by Lee Add the support for Arduino Yun board, update the latest UTFT library for ArduCAM. |
dflet | 0:400d8e75a8d0 | 75 | 2015/06/09 V3.4.1 by Lee Minor changes and add some comments |
dflet | 0:400d8e75a8d0 | 76 | 2015/06/19 V3.4.2 by Lee Add support for MT9M112 camera. |
dflet | 0:400d8e75a8d0 | 77 | 2015/06/20 V3.4.3 by Lee Add support for MT9V111 camera. |
dflet | 0:400d8e75a8d0 | 78 | 2015/06/22 V3.4.4 by Lee Add support for OV5640 camera. |
dflet | 0:400d8e75a8d0 | 79 | 2015/06/22 V3.4.5 by Lee Add support for MT9M001 camera. |
dflet | 0:400d8e75a8d0 | 80 | --------------------------------------*/ |
dflet | 0:400d8e75a8d0 | 81 | |
dflet | 0:400d8e75a8d0 | 82 | |
dflet | 0:400d8e75a8d0 | 83 | #ifndef ArduCAM_H |
dflet | 0:400d8e75a8d0 | 84 | #define ArduCAM_H |
dflet | 0:400d8e75a8d0 | 85 | |
dflet | 0:400d8e75a8d0 | 86 | #include "mbed.h" |
dflet | 0:400d8e75a8d0 | 87 | |
dflet | 0:400d8e75a8d0 | 88 | /****************************************************/ |
dflet | 0:400d8e75a8d0 | 89 | /* Sensor related definition */ |
dflet | 0:400d8e75a8d0 | 90 | /****************************************************/ |
dflet | 0:400d8e75a8d0 | 91 | #define BMP 0 |
dflet | 0:400d8e75a8d0 | 92 | #define JPEG 1 |
dflet | 0:400d8e75a8d0 | 93 | |
dflet | 0:400d8e75a8d0 | 94 | #define OV7670 0 |
dflet | 0:400d8e75a8d0 | 95 | #define MT9D111_A 1 |
dflet | 0:400d8e75a8d0 | 96 | #define OV7675 2 |
dflet | 0:400d8e75a8d0 | 97 | #define OV5642 3 |
dflet | 0:400d8e75a8d0 | 98 | #define OV3640 4 |
dflet | 0:400d8e75a8d0 | 99 | #define OV2640 5 |
dflet | 0:400d8e75a8d0 | 100 | #define OV9655 6 |
dflet | 0:400d8e75a8d0 | 101 | #define MT9M112 7 |
dflet | 0:400d8e75a8d0 | 102 | #define OV7725 8 |
dflet | 0:400d8e75a8d0 | 103 | #define OV7660 9 |
dflet | 0:400d8e75a8d0 | 104 | #define MT9M001 10 |
dflet | 0:400d8e75a8d0 | 105 | #define OV5640 11 |
dflet | 0:400d8e75a8d0 | 106 | #define MT9D111_B 12 |
dflet | 0:400d8e75a8d0 | 107 | #define OV9650 13 |
dflet | 0:400d8e75a8d0 | 108 | #define MT9V111 14 |
dflet | 0:400d8e75a8d0 | 109 | |
dflet | 0:400d8e75a8d0 | 110 | #define OV2640_160x120 0 //160x120 |
dflet | 0:400d8e75a8d0 | 111 | #define OV2640_176x144 1 //176x144 |
dflet | 0:400d8e75a8d0 | 112 | #define OV2640_320x240 2 //320x240 |
dflet | 0:400d8e75a8d0 | 113 | #define OV2640_352x288 3 //352x288 |
dflet | 0:400d8e75a8d0 | 114 | #define OV2640_640x480 4 //640x480 |
dflet | 0:400d8e75a8d0 | 115 | #define OV2640_800x600 5 //800x600 |
dflet | 0:400d8e75a8d0 | 116 | #define OV2640_1024x768 6 //1024x768 |
dflet | 0:400d8e75a8d0 | 117 | #define OV2640_1280x1024 7 //1280x1024 |
dflet | 0:400d8e75a8d0 | 118 | #define OV2640_1600x1200 8 //1600x1200 |
dflet | 0:400d8e75a8d0 | 119 | |
dflet | 0:400d8e75a8d0 | 120 | #define OV5642_320x240 1 //320x240 |
dflet | 0:400d8e75a8d0 | 121 | #define OV5642_640x480 2 //640x480 |
dflet | 0:400d8e75a8d0 | 122 | #define OV5642_1280x720 3 //1280x720 |
dflet | 0:400d8e75a8d0 | 123 | #define OV5642_1920x1080 4 //1920x1080 |
dflet | 0:400d8e75a8d0 | 124 | #define OV5642_2048x1563 5 //2048x1563 |
dflet | 0:400d8e75a8d0 | 125 | #define OV5642_2592x1944 6 //2592x1944 |
dflet | 0:400d8e75a8d0 | 126 | |
dflet | 0:400d8e75a8d0 | 127 | /****************************************************/ |
dflet | 0:400d8e75a8d0 | 128 | /* ArduChip related definition */ |
dflet | 0:400d8e75a8d0 | 129 | /****************************************************/ |
dflet | 0:400d8e75a8d0 | 130 | #define RWBIT 0x80 //READ AND WRITE BIT IS BIT[7] |
dflet | 0:400d8e75a8d0 | 131 | |
dflet | 0:400d8e75a8d0 | 132 | #define ARDUCHIP_TEST1 0x00 //TEST register |
dflet | 0:400d8e75a8d0 | 133 | #define ARDUCHIP_TEST2 0x01 //TEST register |
dflet | 0:400d8e75a8d0 | 134 | |
dflet | 0:400d8e75a8d0 | 135 | #define ARDUCHIP_FRAMES 0x01 //Bit[2:0]Number of frames to be captured |
dflet | 0:400d8e75a8d0 | 136 | |
dflet | 0:400d8e75a8d0 | 137 | #define ARDUCHIP_MODE 0x02 //Mode register |
dflet | 0:400d8e75a8d0 | 138 | #define MCU2LCD_MODE 0x00 |
dflet | 0:400d8e75a8d0 | 139 | #define CAM2LCD_MODE 0x01 |
dflet | 0:400d8e75a8d0 | 140 | #define LCD2MCU_MODE 0x02 |
dflet | 0:400d8e75a8d0 | 141 | |
dflet | 0:400d8e75a8d0 | 142 | #define ARDUCHIP_TIM 0x03 //Timming control |
dflet | 0:400d8e75a8d0 | 143 | #define HREF_LEVEL_MASK 0x01 //0 = High active , 1 = Low active |
dflet | 0:400d8e75a8d0 | 144 | #define VSYNC_LEVEL_MASK 0x02 //0 = High active , 1 = Low active |
dflet | 0:400d8e75a8d0 | 145 | #define LCD_BKEN_MASK 0x04 //0 = Enable, 1 = Disable |
dflet | 0:400d8e75a8d0 | 146 | #define DELAY_MASK 0x08 //0 = no delay, 1 = delay one clock |
dflet | 0:400d8e75a8d0 | 147 | #define MODE_MASK 0x10 //0 = LCD mode, 1 = FIFO mode |
dflet | 0:400d8e75a8d0 | 148 | #define FIFO_PWRDN_MASK 0x20 //0 = Normal operation, 1 = FIFO power down |
dflet | 0:400d8e75a8d0 | 149 | #define LOW_POWER_MODE 0x40 //0 = Normal mode, 1 = Low power mode |
dflet | 0:400d8e75a8d0 | 150 | |
dflet | 0:400d8e75a8d0 | 151 | #define ARDUCHIP_FIFO 0x04 //FIFO and I2C control |
dflet | 0:400d8e75a8d0 | 152 | #define FIFO_CLEAR_MASK 0x01 |
dflet | 0:400d8e75a8d0 | 153 | #define FIFO_START_MASK 0x02 |
dflet | 0:400d8e75a8d0 | 154 | #define FIFO_RDPTR_RST_MASK 0x10 |
dflet | 0:400d8e75a8d0 | 155 | #define FIFO_WRPTR_RST_MASK 0x20 |
dflet | 0:400d8e75a8d0 | 156 | |
dflet | 0:400d8e75a8d0 | 157 | #define ARDUCHIP_GPIO 0x06 //GPIO Write Register |
dflet | 0:400d8e75a8d0 | 158 | #define GPIO_RESET_MASK 0x01 //0 = default state, 1 = Sensor reset IO value |
dflet | 0:400d8e75a8d0 | 159 | #define GPIO_PWDN_MASK 0x02 //0 = Sensor power down IO value, 1 = Sensor power enable IO value |
dflet | 0:400d8e75a8d0 | 160 | |
dflet | 0:400d8e75a8d0 | 161 | #define BURST_FIFO_READ 0x3C //Burst FIFO read operation |
dflet | 0:400d8e75a8d0 | 162 | #define SINGLE_FIFO_READ 0x3D //Single FIFO read operation |
dflet | 0:400d8e75a8d0 | 163 | |
dflet | 0:400d8e75a8d0 | 164 | #define ARDUCHIP_REV 0x40 //ArduCHIP revision |
dflet | 0:400d8e75a8d0 | 165 | #define VER_LOW_MASK 0x3F |
dflet | 0:400d8e75a8d0 | 166 | #define VER_HIGH_MASK 0xC0 |
dflet | 0:400d8e75a8d0 | 167 | |
dflet | 0:400d8e75a8d0 | 168 | #define ARDUCHIP_TRIG 0x41 //Trigger source |
dflet | 0:400d8e75a8d0 | 169 | #define VSYNC_MASK 0x01 |
dflet | 0:400d8e75a8d0 | 170 | #define SHUTTER_MASK 0x02 |
dflet | 0:400d8e75a8d0 | 171 | #define CAP_DONE_MASK 0x08 |
dflet | 0:400d8e75a8d0 | 172 | |
dflet | 0:400d8e75a8d0 | 173 | #define FIFO_SIZE1 0x42 //Camera write FIFO size[7:0] for burst to read |
dflet | 0:400d8e75a8d0 | 174 | #define FIFO_SIZE2 0x43 //Camera write FIFO size[15:8] |
dflet | 0:400d8e75a8d0 | 175 | #define FIFO_SIZE3 0x44 //Camera write FIFO size[18:16] |
dflet | 0:400d8e75a8d0 | 176 | |
dflet | 0:400d8e75a8d0 | 177 | |
dflet | 0:400d8e75a8d0 | 178 | /****************************************************/ |
dflet | 0:400d8e75a8d0 | 179 | |
dflet | 0:400d8e75a8d0 | 180 | |
dflet | 0:400d8e75a8d0 | 181 | /****************************************************************/ |
dflet | 0:400d8e75a8d0 | 182 | /* define a structure for sensor register initialization values */ |
dflet | 0:400d8e75a8d0 | 183 | /****************************************************************/ |
dflet | 0:400d8e75a8d0 | 184 | struct sensor_reg { |
dflet | 0:400d8e75a8d0 | 185 | uint16_t reg; |
dflet | 0:400d8e75a8d0 | 186 | uint16_t val; |
dflet | 0:400d8e75a8d0 | 187 | }; |
dflet | 0:400d8e75a8d0 | 188 | |
dflet | 0:400d8e75a8d0 | 189 | class ArduCAM |
dflet | 0:400d8e75a8d0 | 190 | { |
dflet | 0:400d8e75a8d0 | 191 | public: |
dflet | 0:400d8e75a8d0 | 192 | |
dflet | 0:400d8e75a8d0 | 193 | ArduCAM(uint8_t model,PinName cam_cs, SPI cam_spi, I2C cam_i2c); |
dflet | 0:400d8e75a8d0 | 194 | |
dflet | 0:400d8e75a8d0 | 195 | ~ArduCAM(); |
dflet | 0:400d8e75a8d0 | 196 | |
dflet | 0:400d8e75a8d0 | 197 | void InitCAM(); |
dflet | 0:400d8e75a8d0 | 198 | |
dflet | 0:400d8e75a8d0 | 199 | void cs_high(void); |
dflet | 0:400d8e75a8d0 | 200 | void cs_low(void); |
dflet | 0:400d8e75a8d0 | 201 | |
dflet | 0:400d8e75a8d0 | 202 | void flush_fifo(void); |
dflet | 0:400d8e75a8d0 | 203 | void start_capture(void); |
dflet | 0:400d8e75a8d0 | 204 | void clear_fifo_flag(void); |
dflet | 0:400d8e75a8d0 | 205 | uint8_t read_fifo(void); |
dflet | 0:400d8e75a8d0 | 206 | |
dflet | 0:400d8e75a8d0 | 207 | uint8_t read_reg(uint8_t addr); |
dflet | 0:400d8e75a8d0 | 208 | void write_reg(uint8_t addr, uint8_t data); |
dflet | 0:400d8e75a8d0 | 209 | |
dflet | 0:400d8e75a8d0 | 210 | uint32_t read_fifo_length(void); |
dflet | 0:400d8e75a8d0 | 211 | void set_fifo_burst(void); |
dflet | 0:400d8e75a8d0 | 212 | void set_bit(uint8_t addr, uint8_t bit); |
dflet | 0:400d8e75a8d0 | 213 | void clear_bit(uint8_t addr, uint8_t bit); |
dflet | 0:400d8e75a8d0 | 214 | uint8_t get_bit(uint8_t addr, uint8_t bit); |
dflet | 0:400d8e75a8d0 | 215 | void set_mode(uint8_t mode); |
dflet | 0:400d8e75a8d0 | 216 | |
dflet | 0:400d8e75a8d0 | 217 | int wrSensorRegs(const struct sensor_reg*); |
dflet | 0:400d8e75a8d0 | 218 | int wrSensorRegs8_8(const struct sensor_reg*); |
dflet | 0:400d8e75a8d0 | 219 | int wrSensorRegs8_16(const struct sensor_reg*); |
dflet | 0:400d8e75a8d0 | 220 | int wrSensorRegs16_8(const struct sensor_reg*); |
dflet | 0:400d8e75a8d0 | 221 | int wrSensorRegs16_16(const struct sensor_reg*); |
dflet | 0:400d8e75a8d0 | 222 | |
dflet | 0:400d8e75a8d0 | 223 | uint8_t wrSensorReg(int regID, int regDat); |
dflet | 0:400d8e75a8d0 | 224 | uint8_t wrSensorReg8_8(int regID, int regDat); |
dflet | 0:400d8e75a8d0 | 225 | uint8_t wrSensorReg8_16(int regID, int regDat); |
dflet | 0:400d8e75a8d0 | 226 | uint8_t wrSensorReg16_8(int regID, int regDat); |
dflet | 0:400d8e75a8d0 | 227 | uint8_t wrSensorReg16_16(int regID, int regDat); |
dflet | 0:400d8e75a8d0 | 228 | |
dflet | 0:400d8e75a8d0 | 229 | uint8_t rdSensorReg8_8(uint8_t regID, uint8_t* regDat); |
dflet | 0:400d8e75a8d0 | 230 | uint8_t rdSensorReg16_8(uint16_t regID, uint8_t* regDat); |
dflet | 0:400d8e75a8d0 | 231 | uint8_t rdSensorReg8_16(uint8_t regID, uint16_t* regDat); |
dflet | 0:400d8e75a8d0 | 232 | uint8_t rdSensorReg16_16(uint16_t regID, uint16_t* regDat); |
dflet | 0:400d8e75a8d0 | 233 | |
dflet | 0:400d8e75a8d0 | 234 | void OV5642_set_JPEG_size(uint8_t size); |
dflet | 0:400d8e75a8d0 | 235 | void set_format(uint8_t fmt); |
dflet | 0:400d8e75a8d0 | 236 | |
dflet | 0:400d8e75a8d0 | 237 | int bus_write(int address, int value); |
dflet | 0:400d8e75a8d0 | 238 | uint8_t bus_read(int address); |
dflet | 0:400d8e75a8d0 | 239 | |
dflet | 0:400d8e75a8d0 | 240 | protected: |
dflet | 0:400d8e75a8d0 | 241 | uint8_t m_fmt; |
dflet | 0:400d8e75a8d0 | 242 | uint8_t sensor_model; |
dflet | 0:400d8e75a8d0 | 243 | uint8_t sensor_addr; |
dflet | 0:400d8e75a8d0 | 244 | |
dflet | 0:400d8e75a8d0 | 245 | public: |
dflet | 0:400d8e75a8d0 | 246 | DigitalOut _cam_cs; |
dflet | 0:400d8e75a8d0 | 247 | SPI _cam_spi; |
dflet | 0:400d8e75a8d0 | 248 | I2C _cam_i2c; |
dflet | 0:400d8e75a8d0 | 249 | }; |
dflet | 0:400d8e75a8d0 | 250 | |
dflet | 0:400d8e75a8d0 | 251 | #endif |
dflet | 0:400d8e75a8d0 | 252 |