MARMEX-VB : "Mary Camera module" library

Dependents:   MARMEX_VB_test MARMEX_VB_Hello

MARMEX-VB (MARY-VB) camera module library for mbed. (This module may be available in Japan only.)

Kown problem / 既知の問題

The read data may have contouring. In this case, it may require reset or changing order of data reading. The order change API is available as "read_order_change()" function.
カメラから読み出したデータに擬似輪郭が発生することがあります.この問題にはシステム全体のリセットを行うか,または読み出し順の変更を行うことで対処して下さい.読み出し順の変更はAPIの"read_order_change()"関数を使うことができます.

Committer:
nxpfan
Date:
Fri Jun 20 09:05:19 2014 +0000
Revision:
5:84e6c89a9a6d
Parent:
4:8ef31b67c0ab
SPI-FIFO operation option added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nxpfan 0:c4d14dd5d479 1 /** MARMEX_VB Camera control library
nxpfan 0:c4d14dd5d479 2 *
nxpfan 0:c4d14dd5d479 3 * @class MARMEX_VB
nxpfan 3:7f26004cfbce 4 * @version 0.3
nxpfan 3:7f26004cfbce 5 * @date 16-Jun-2014
nxpfan 0:c4d14dd5d479 6 *
nxpfan 0:c4d14dd5d479 7 * Released under the Apache License, Version 2.0 : http://mbed.org/handbook/Apache-Licence
nxpfan 0:c4d14dd5d479 8 *
nxpfan 0:c4d14dd5d479 9 * MARMEX_VB Camera control library for mbed
nxpfan 0:c4d14dd5d479 10 */
nxpfan 4:8ef31b67c0ab 11
nxpfan 0:c4d14dd5d479 12 #ifndef MBED_MARMEX_VB
nxpfan 0:c4d14dd5d479 13 #define MBED_MARMEX_VB
nxpfan 0:c4d14dd5d479 14
nxpfan 0:c4d14dd5d479 15 /** MARMEX_VB class
nxpfan 0:c4d14dd5d479 16 *
nxpfan 0:c4d14dd5d479 17 * MARMEX_VB camera control library
nxpfan 0:c4d14dd5d479 18 * This driver provide controls and data transfer interface for MARMEX_VB
nxpfan 0:c4d14dd5d479 19 *
nxpfan 0:c4d14dd5d479 20 * Example:
nxpfan 0:c4d14dd5d479 21 * @code
nxpfan 0:c4d14dd5d479 22 *
nxpfan 0:c4d14dd5d479 23 * #include "mbed.h"
nxpfan 0:c4d14dd5d479 24 * #include "MARMEX_OB_oled.h"
nxpfan 0:c4d14dd5d479 25 * #include "MARMEX_VB.h"
nxpfan 0:c4d14dd5d479 26 *
nxpfan 0:c4d14dd5d479 27 * MARMEX_OB_oled oled1( p5, p7, p20, p16, p15 ); // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-board-slot1
nxpfan 0:c4d14dd5d479 28 * MARMEX_VB camera( p5, p6, p7, p22, p26, p28, p27 ); // mosi, miso, sclk, cs, reset, I2C_SDA, I2C_SCL -- maple-mini-type-b-board-slot2
nxpfan 0:c4d14dd5d479 29 * BusOut led( LED3, LED4 );
nxpfan 0:c4d14dd5d479 30 *
nxpfan 0:c4d14dd5d479 31 * #define X_OFFSET ((MARMEX_VB::PIXEL_PER_LINE - MARMEX_OB_oled::WIDTH ) / 2)
nxpfan 0:c4d14dd5d479 32 * #define Y_OFFSET ((MARMEX_VB::LINE_PER_FRAME - MARMEX_OB_oled::HEIGHT) / 2)
nxpfan 0:c4d14dd5d479 33 *
nxpfan 0:c4d14dd5d479 34 * int main()
nxpfan 0:c4d14dd5d479 35 * {
nxpfan 0:c4d14dd5d479 36 * led = 0x3;
nxpfan 0:c4d14dd5d479 37 *
nxpfan 0:c4d14dd5d479 38 * oled1.cls();
nxpfan 0:c4d14dd5d479 39 *
nxpfan 0:c4d14dd5d479 40 * short buf[ MARMEX_OB_oled::WIDTH ];
nxpfan 0:c4d14dd5d479 41 *
nxpfan 0:c4d14dd5d479 42 * while ( 1 ) {
nxpfan 0:c4d14dd5d479 43 *
nxpfan 0:c4d14dd5d479 44 * led = 0x1;
nxpfan 0:c4d14dd5d479 45 * camera.open_transfer();
nxpfan 0:c4d14dd5d479 46 *
nxpfan 0:c4d14dd5d479 47 * for ( int line = 0; line < 128; line++ ) {
nxpfan 0:c4d14dd5d479 48 * camera.read_a_line( buf, line + Y_OFFSET, X_OFFSET, 128 );
nxpfan 0:c4d14dd5d479 49 * oled1.blit565( 0, line, 128, 1, buf );
nxpfan 0:c4d14dd5d479 50 * }
nxpfan 0:c4d14dd5d479 51 *
nxpfan 0:c4d14dd5d479 52 * camera.close_transfer();
nxpfan 0:c4d14dd5d479 53 * led = 0x2;
nxpfan 0:c4d14dd5d479 54 * }
nxpfan 0:c4d14dd5d479 55 * }
nxpfan 0:c4d14dd5d479 56 * @endcode
nxpfan 0:c4d14dd5d479 57 */
nxpfan 0:c4d14dd5d479 58
nxpfan 4:8ef31b67c0ab 59 #define OPTIMIZATION_ENABLED
nxpfan 4:8ef31b67c0ab 60
nxpfan 0:c4d14dd5d479 61 #define DEFAULT_PICTURE_SIZE QCIF
nxpfan 0:c4d14dd5d479 62 //#define DEFAULT_PICTURE_SIZE VGA
nxpfan 0:c4d14dd5d479 63 //#define DEFAULT_PICTURE_SIZE QVGA
nxpfan 0:c4d14dd5d479 64 //#define DEFAULT_PICTURE_SIZE QQVGA
nxpfan 0:c4d14dd5d479 65
nxpfan 0:c4d14dd5d479 66 class MARMEX_VB
nxpfan 0:c4d14dd5d479 67 {
nxpfan 0:c4d14dd5d479 68 public:
nxpfan 0:c4d14dd5d479 69 typedef enum {
nxpfan 0:c4d14dd5d479 70 QCIF = 1, /**< QCIF */
nxpfan 0:c4d14dd5d479 71 VGA, /**< VGA */
nxpfan 0:c4d14dd5d479 72 QVGA, /**< QVGA */
nxpfan 0:c4d14dd5d479 73 QQVGA, /**< QQVGA */
nxpfan 0:c4d14dd5d479 74 } CameraResolution;
nxpfan 0:c4d14dd5d479 75
nxpfan 0:c4d14dd5d479 76 typedef enum {
nxpfan 0:c4d14dd5d479 77 OFF = 0, /**< ON */
nxpfan 0:c4d14dd5d479 78 ON, /**< OFF */
nxpfan 0:c4d14dd5d479 79 } SwitchState;
nxpfan 0:c4d14dd5d479 80
nxpfan 0:c4d14dd5d479 81 /** General parameters for MARMEX_VB */
nxpfan 0:c4d14dd5d479 82 enum {
nxpfan 0:c4d14dd5d479 83 BYTE_PER_PIXEL = 2, /**< bytes per pixel */
nxpfan 0:c4d14dd5d479 84
nxpfan 0:c4d14dd5d479 85 QCIF_PIXEL_PER_LINE = 176, /**< pixels in a line (QCIF horizontal size) */
nxpfan 0:c4d14dd5d479 86 QCIF_LINE_PER_FRAME = 144, /**< lines in a frame (QCIF vertical size) */
nxpfan 0:c4d14dd5d479 87 VGA_PIXEL_PER_LINE = 640, /**< pixels in a line (VGA horizontal size) */
nxpfan 0:c4d14dd5d479 88 VGA_LINE_PER_FRAME = 480, /**< lines in a frame (VGA vertical size) */
nxpfan 0:c4d14dd5d479 89 };
nxpfan 0:c4d14dd5d479 90
nxpfan 0:c4d14dd5d479 91 /** General parameters for MARMEX_OB_oled */
nxpfan 0:c4d14dd5d479 92 enum {
nxpfan 0:c4d14dd5d479 93 NO_ERROR = 0 /**< zero */
nxpfan 0:c4d14dd5d479 94 };
nxpfan 0:c4d14dd5d479 95
nxpfan 0:c4d14dd5d479 96 /** Create a MARMEX_VB instance connected to specified SPI, DigitalOut and I2C pins
nxpfan 0:c4d14dd5d479 97 *
nxpfan 0:c4d14dd5d479 98 * @param SPI_mosi SPI-bus MOSI pin
nxpfan 0:c4d14dd5d479 99 * @param SPI_miso SPI-bus MISO pin
nxpfan 0:c4d14dd5d479 100 * @param SPI_sclk SPI-bus SCLK pin
nxpfan 0:c4d14dd5d479 101 * @param SPI_cs SPI-bus Chip Select pin
nxpfan 0:c4d14dd5d479 102 * @param cam_reset Camera reset pin
nxpfan 0:c4d14dd5d479 103 * @param I2C_sda I2C-bus SDA pin
nxpfan 0:c4d14dd5d479 104 * @param I2C_scl I2C-bus SCL pin
nxpfan 0:c4d14dd5d479 105 */
nxpfan 0:c4d14dd5d479 106
nxpfan 0:c4d14dd5d479 107 MARMEX_VB(
nxpfan 0:c4d14dd5d479 108 PinName SPI_mosi,
nxpfan 0:c4d14dd5d479 109 PinName SPI_miso,
nxpfan 0:c4d14dd5d479 110 PinName SPI_sck,
nxpfan 0:c4d14dd5d479 111 PinName SPI_cs,
nxpfan 0:c4d14dd5d479 112 PinName cam_reset,
nxpfan 0:c4d14dd5d479 113 PinName I2C_sda,
nxpfan 0:c4d14dd5d479 114 PinName I2C_scl
nxpfan 0:c4d14dd5d479 115 );
nxpfan 0:c4d14dd5d479 116
nxpfan 0:c4d14dd5d479 117 /** Initialization
nxpfan 0:c4d14dd5d479 118 *
nxpfan 0:c4d14dd5d479 119 * Performs MARMEX_VB reset and initializations
nxpfan 0:c4d14dd5d479 120 * This function is called from MARMEX_VB constoructor. So user don't have to call in the user code.
nxpfan 0:c4d14dd5d479 121 *
nxpfan 0:c4d14dd5d479 122 * This function takes about 2 seconds because there is 99 times I2C access with 20ms interval.
nxpfan 0:c4d14dd5d479 123 *
nxpfan 0:c4d14dd5d479 124 * @param res select camera resolution : QCIF(default), VGA, QVGA or QQVGA
nxpfan 0:c4d14dd5d479 125 */
nxpfan 0:c4d14dd5d479 126 int init( CameraResolution res = QCIF );
nxpfan 0:c4d14dd5d479 127
nxpfan 0:c4d14dd5d479 128 /** Color bar ON/OFF
nxpfan 0:c4d14dd5d479 129 *
nxpfan 0:c4d14dd5d479 130 * Set colorbar ON/OFF
nxpfan 0:c4d14dd5d479 131 *
nxpfan 0:c4d14dd5d479 132 * @param sw turn-ON or -OFF colorbar : ON or OFF
nxpfan 0:c4d14dd5d479 133 */
nxpfan 0:c4d14dd5d479 134 void colorbar( SwitchState sw );
nxpfan 0:c4d14dd5d479 135
nxpfan 0:c4d14dd5d479 136 /** Get holizontal size
nxpfan 0:c4d14dd5d479 137 *
nxpfan 0:c4d14dd5d479 138 * Returns horizontal image size (pixels)
nxpfan 0:c4d14dd5d479 139 *
nxpfan 0:c4d14dd5d479 140 * @return holizontal size
nxpfan 0:c4d14dd5d479 141 */
nxpfan 0:c4d14dd5d479 142 int get_horizontal_size( void );
nxpfan 0:c4d14dd5d479 143
nxpfan 0:c4d14dd5d479 144 /** Get vertical size
nxpfan 0:c4d14dd5d479 145 *
nxpfan 0:c4d14dd5d479 146 * Returns vertical image size (pixels)
nxpfan 0:c4d14dd5d479 147 *
nxpfan 0:c4d14dd5d479 148 * @return vertical size
nxpfan 0:c4d14dd5d479 149 */
nxpfan 0:c4d14dd5d479 150 int get_vertical_size( void );
nxpfan 0:c4d14dd5d479 151
nxpfan 0:c4d14dd5d479 152 /** Check camera availability
nxpfan 0:c4d14dd5d479 153 *
nxpfan 0:c4d14dd5d479 154 * Returns last I2C access result
nxpfan 0:c4d14dd5d479 155 * This returns non-zero value if the camera initialization failed
nxpfan 0:c4d14dd5d479 156 *
nxpfan 0:c4d14dd5d479 157 * @return error code in init function (I2C API return value)
nxpfan 0:c4d14dd5d479 158 */
nxpfan 0:c4d14dd5d479 159 int ready( void );
nxpfan 0:c4d14dd5d479 160
nxpfan 0:c4d14dd5d479 161 /** Open transfer
nxpfan 0:c4d14dd5d479 162 *
nxpfan 0:c4d14dd5d479 163 * Let the MARMEX_VB get ready to transfer the data.
nxpfan 0:c4d14dd5d479 164 * When this function is called, the camera will stop updating buffer (on camera board) at end of frame.
nxpfan 0:c4d14dd5d479 165 *
nxpfan 0:c4d14dd5d479 166 * @return error code in init function (I2C API return value)
nxpfan 0:c4d14dd5d479 167 */
nxpfan 0:c4d14dd5d479 168 void open_transfer( void );
nxpfan 0:c4d14dd5d479 169
nxpfan 0:c4d14dd5d479 170 /** Close transfer
nxpfan 0:c4d14dd5d479 171 *
nxpfan 0:c4d14dd5d479 172 * Letting the MARMEX_VB to know the data transfer done.
nxpfan 0:c4d14dd5d479 173 * This function should be called when the data transfer done to resume the buffer update by camera
nxpfan 0:c4d14dd5d479 174 */
nxpfan 0:c4d14dd5d479 175 void close_transfer( void );
nxpfan 0:c4d14dd5d479 176
nxpfan 0:c4d14dd5d479 177 /** Read one line data
nxpfan 0:c4d14dd5d479 178 *
nxpfan 0:c4d14dd5d479 179 * Reads 1 line data from MARMEX_VB
nxpfan 0:c4d14dd5d479 180 * This function should be called when the data transfer done to resume the buffer update by camera
nxpfan 0:c4d14dd5d479 181 *
nxpfan 0:c4d14dd5d479 182 * @param *p pointer to array of short
nxpfan 0:c4d14dd5d479 183 * @param line_number to select which line want to read
nxpfan 0:c4d14dd5d479 184 * @param x_offset holizontal offset (from left) to start the read
nxpfan 0:c4d14dd5d479 185 * @param n_of_pixels pixels to be read
nxpfan 0:c4d14dd5d479 186 */
nxpfan 0:c4d14dd5d479 187 void read_a_line( short *p, int line_number, int x_offset, int n_of_pixels );
nxpfan 0:c4d14dd5d479 188
nxpfan 0:c4d14dd5d479 189 /** Read order change
nxpfan 0:c4d14dd5d479 190 *
nxpfan 0:c4d14dd5d479 191 * Toggles flag for read order of 2 byte data.
nxpfan 0:c4d14dd5d479 192 *
nxpfan 0:c4d14dd5d479 193 * @return new status of the read order flag (false = normal / true = swapped)
nxpfan 0:c4d14dd5d479 194 */
nxpfan 0:c4d14dd5d479 195 int read_order_change( void );
nxpfan 0:c4d14dd5d479 196
nxpfan 0:c4d14dd5d479 197 private:
nxpfan 0:c4d14dd5d479 198 int send_spi( char data );
nxpfan 0:c4d14dd5d479 199 void write_register( char reg, char value );
nxpfan 0:c4d14dd5d479 200 int read_register( char reg );
nxpfan 0:c4d14dd5d479 201 void set_address( int address );
nxpfan 0:c4d14dd5d479 202
nxpfan 0:c4d14dd5d479 203 SPI _spi;
nxpfan 0:c4d14dd5d479 204 DigitalOut _cs;
nxpfan 0:c4d14dd5d479 205 DigitalOut _reset;
nxpfan 0:c4d14dd5d479 206 I2C _i2c;
nxpfan 0:c4d14dd5d479 207 int _error_state;
nxpfan 0:c4d14dd5d479 208 int _horizontal_size;
nxpfan 0:c4d14dd5d479 209 int _vertical_size;
nxpfan 0:c4d14dd5d479 210 int _read_order_change;
nxpfan 0:c4d14dd5d479 211
nxpfan 0:c4d14dd5d479 212 };
nxpfan 0:c4d14dd5d479 213
nxpfan 0:c4d14dd5d479 214 #endif // MBED_MARMEX_VB