Arducam_OV5642_Library

Dependents:   DigitalCamera_OV5642_WIZwiki-W7500 RFID-RC522_buffer Prelude_OV5642_dev

OV5642.h

Committer:
justinkim
Date:
2015-10-29
Revision:
3:ee782b77485e
Parent:
1:f2126346d524

File content as of revision 3:ee782b77485e:

#ifndef MBED_ARDUCAM_H
#define MBED_ARDUCAM_H 

#include "mbed.h"

//******************************************************************************
// Macros
//******************************************************************************
#define I2C_SEND_STOP      0x01
#define I2C_SEND_START     0x02
#define sensor_addr  0x78
#define SPAWN_TASK_PRIORITY            9//9
#define HTTP_SERVER_APP_TASK_PRIORITY  3//1
#define CAMERA_SERVICE_PRIORITY        3
#define OSI_STACK_SIZE                 8 * 1024

#define cport(port, data) port &= data
#define sport(port, data) port |= data

#define swap(type, i, j) {type t = i; i = j; j = t;}

#define fontbyte(x) cfont.font[x]  

#define regtype volatile uint32_t
#define regsize uint32_t
#define PROGMEM


    #define pgm_read_byte(x)        (*((char *)x))
//  #define pgm_read_word(x)        (*((short *)(x & 0xfffffffe)))
    #define pgm_read_word(x)        ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x)))
    #define pgm_read_byte_near(x)   (*((char *)x))
    #define pgm_read_byte_far(x)    (*((char *)x))
//  #define pgm_read_word_near(x)   (*((short *)(x & 0xfffffffe))
//  #define pgm_read_word_far(x)    (*((short *)(x & 0xfffffffe)))
    #define pgm_read_word_near(x)   ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x)))
    #define pgm_read_word_far(x)    ( ((*((unsigned char *)x + 1)) << 8) + (*((unsigned char *)x))))
    #define PSTR(x)  x
    #define F(X) (X)

#define BMP     0
#define JPEG    1

#define OV5642      3

#define OV5642_320x240      1   //320x240
#define OV5642_640x480      2   //640x480
#define OV5642_1280x720     3   //1280x720
#define OV5642_1920x1080    4   //1920x1080
#define OV5642_2048x1563    5   //2048x1563
#define OV5642_2592x1944    6   //2592x1944

/****************************************************/
/* I2C Control Definition                                                   */
/****************************************************/
#define I2C_ADDR_8BIT 0
#define I2C_ADDR_16BIT 1
#define I2C_REG_8BIT 0
#define I2C_REG_16BIT 1
#define I2C_DAT_8BIT 0
#define I2C_DAT_16BIT 1

/* Register initialization tables for SENSORs */
/* Terminating list entry for reg */
#define SENSOR_REG_TERM_8BIT                0xFF
#define SENSOR_REG_TERM_16BIT               0xFFFF
/* Terminating list entry for val */
#define SENSOR_VAL_TERM_8BIT                0xFF
#define SENSOR_VAL_TERM_16BIT               0xFFFF

/****************************************************/
/* ArduChip related definition                                          */
/****************************************************/
#define RWBIT                   0x80  //READ AND WRITE BIT IS BIT[7]

#define ARDUCHIP_TEST1          0x00  //TEST register
#define ARDUCHIP_TEST2          0x01  //TEST register

#define ARDUCHIP_FRAMES         0x01  //Bit[2:0]Number of frames to be captured

#define ARDUCHIP_MODE           0x02  //Mode register
#define MCU2LCD_MODE            0x00
#define CAM2LCD_MODE            0x01
#define LCD2MCU_MODE            0x02

#define ARDUCHIP_TIM            0x03  //Timming control
#define HREF_LEVEL_MASK         0x01  //0 = High active ,       1 = Low active
#define VSYNC_LEVEL_MASK        0x02  //0 = High active ,       1 = Low active
#define LCD_BKEN_MASK           0x04  //0 = Enable,             1 = Disable
#define DELAY_MASK              0x08  //0 = no delay,           1 = delay one clock
#define MODE_MASK               0x10  //0 = LCD mode,           1 = FIFO mode
#define FIFO_PWRDN_MASK         0x20  //0 = Normal operation,   1 = FIFO power down
#define LOW_POWER_MODE          0x40  //0 = Normal mode,        1 = Low power mode

#define ARDUCHIP_FIFO           0x04  //FIFO and I2C control
#define FIFO_CLEAR_MASK         0x01
#define FIFO_START_MASK         0x02
#define FIFO_RDPTR_RST_MASK     0x10
#define FIFO_WRPTR_RST_MASK     0x20

#define ARDUCHIP_GPIO           0x06  //GPIO Write Register
#define GPIO_RESET_MASK         0x01  //0 = default state,      1 =  Sensor reset IO value
#define GPIO_PWDN_MASK          0x02  //0 = Sensor power down IO value, 1 = Sensor power enable IO value

#define BURST_FIFO_READ         0x3C  //Burst FIFO read operation
#define SINGLE_FIFO_READ        0x3D  //Single FIFO read operation

#define ARDUCHIP_REV            0x40  //ArduCHIP revision
#define VER_LOW_MASK            0x3F
#define VER_HIGH_MASK           0xC0

#define ARDUCHIP_TRIG           0x41  //Trigger source
#define VSYNC_MASK              0x01
#define SHUTTER_MASK            0x02
#define CAP_DONE_MASK           0x08

#define FIFO_SIZE1              0x42  //Camera write FIFO size[7:0] for burst to read
#define FIFO_SIZE2              0x43  //Camera write FIFO size[15:8]
#define FIFO_SIZE3              0x44  //Camera write FIFO size[18:16

class ArduCAM
{
    public:
        ArduCAM(PinName mosi, PinName miso, PinName sck, PinName cs, PinName sda, PinName scl);
        void InitCAM(void);
        
        void CS_HIGH(void);
        void CS_LOW(void);
        
        void flush_fifo(void);
        void start_capture(void);
        void clear_fifo_flag(void);
        uint8_t read_fifo(void);
        
        uint8_t read_reg(uint8_t addr);
        void write_reg(uint8_t addr, uint8_t data);
        
        uint32_t read_fifo_length(void);
        void set_fifo_burst(void);
        void set_bit(uint8_t addr, uint8_t bit);
        void clear_bit(uint8_t addr, uint8_t bit);
        uint8_t get_bit(uint8_t addr, uint8_t bit);
        void set_mode(uint8_t mode);
        
        int wrSensorRegs(const struct sensor_reg*);
        int wrSensorRegs8_8(const struct sensor_reg*);
        int wrSensorRegs8_16(const struct sensor_reg*);
        int wrSensorRegs16_8(const struct sensor_reg*);
        int wrSensorRegs16_16(const struct sensor_reg*);
            
        uint8_t wrSensorReg(int regID, int regDat);
        uint8_t wrSensorReg8_8(int regID, int regDat);
        uint8_t wrSensorReg8_16(int regID, int regDat);
        uint8_t wrSensorReg16_8(int regID, int regDat);
        uint8_t wrSensorReg16_16(int regID, int regDat);
            
        uint8_t rdSensorReg8_8(uint8_t regID, uint8_t* regDat);
        uint8_t rdSensorReg16_8(uint16_t regID, uint8_t* regDat);
        uint8_t rdSensorReg8_16(uint8_t regID, uint16_t* regDat);
        uint8_t rdSensorReg16_16(uint16_t regID, uint16_t* regDat);
        
        void OV5642_set_JPEG_size(uint8_t size);
        void set_format(uint8_t fmt);
        
        int bus_write(int address, int value);
        uint8_t bus_read(int address);  
        
    protected:
        SPI spi;                // does SPI MOSI, MISO and SCK        
        DigitalOut _cs;         // does SPI CE
        I2C i2c;                // does I2C SDA, SCL
        regtype *P_CS;
        regsize B_CS;
        uint8_t m_fmt;
        uint8_t sensor_model;
        
        uint32_t I2CInit(void);
        int32_t I2CBufferRead(int32_t ucDevAddr, uint8_t *ucBuffer, int32_t ulSize,unsigned char ucFlags);
        int32_t I2CBufferWrite(int32_t ucDevAddr, uint8_t *ucBuffer, int32_t ulSize,unsigned char ucFlags);
};        

#endif