TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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