nuttx/configs/sama5d3x-ek/src/sam_ov2640.c
2013-12-10 15:53:32 -06:00

261 lines
8.6 KiB
C

/****************************************************************************
* configs/sama5d3x-ek/src/sam_ov2640.c
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdlib.h>
#include <debug.h>
#include <nuttx/i2c.h>
#include <nuttx/video/fb.h>
#include <nuttx/video/ov2640.h>
#include "up_arch.h"
#include "sam_periphclks.h"
#include "sam_lcd.h"
#include "sam_pck.h"
#include "sam_pio.h"
#include "chip/sam_pinmap.h"
#include "sama5d3x-ek.h"
#ifdef HAVE_CAMERA
/****************************************************************************
* Definitions
****************************************************************************/
/* Typical OV2640 XVCLK is 24MHz */
#define OV2640_FREQUENCY 24000000
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: ov2640_lcd_initialize
****************************************************************************/
static inline FAR struct fb_vtable_s *ov2640_lcd_initialize(void)
{
FAR struct fb_vtable_s *vplane;
int ret;
/* Initialize the frame buffer device */
ret = up_fbinitialize();
if (ret < 0)
{
gdbg("ERROR: up_fbinitialize failed: %d\n", -ret);
return NULL;
}
vplane = up_fbgetvplane(0);
if (!vplane)
{
gdbg("ERROR: up_fbgetvplane failed\n");
}
return vplane;
}
/****************************************************************************
* Name: ov2640_camera_initialize
*
* Description:
* Initialize the OV2640 camera in the correct mode of operation
*
* OV2640 Camera Interface
*
* SAMA5D3x PIN SAMA5D3x-EK OV2640
* PIO PER SIGNAL ISI Socket J11
* ---- --- ------------- --- ------------ ----------------------------------------
* --- 1 VDDISI ---
* --- 2 GND ---
* --- 3 VDDISI ---
* --- 4 GND ---
* PE28 ? ? 5 ZB_SLPTR ???
* PE29 ? ? 6 ZB_RST C6 RESETB Reset mode (?)
* PC27 B TWI1_CK 7 TWCK1 C2 SIO_C SCCB serial interface clock input
* PC26 B TWI1_D 8 TWD1 C1 SIO_D SCCB serial interface data I/O
* --- 9 GND ---
* PD31 B PCK1 (ISI_MCK) 10 ISI_MCK C4 XVCLK System clock input (?)
* --- 11 GND ---
* PA30 C ISI_VSYNC 12 ISI_VSYNC D2 VSYNC Vertical synchronization
* --- 13 GND ---
* PA31 C ISI_HSYNC 14 ISI_HSYNC C3 HREF Horizontal reference output (?)
* --- 15 GND ---
* PC30 C ISI_PCK 16 ISI_PCK E3 PCLK Pixel clock output
* --- 17 GND ---
* PA16 C ISI_D0 18 ISI_D0 E2 Y0 Video port output bit[0]
* PA17 C ISI_D1 19 ISI_D1 E1 Y1 Video port output bit[1]
* PA18 C ISI_D2 20 ISI_D2 F3 Y2 Video port output bit[2]
* PA19 C ISI_D3 21 ISI_D3 G3 Y3 Video port output bit[3]
* PA20 C ISI_D4 22 ISI_D4 F4 Y4 Video port output bit[4]
* PA21 C ISI_D5 23 ISI_D5 G4 Y5 Video port output bit[5]
* PA22 C ISI_D6 24 ISI_D6 E5 Y6 Video port output bit[6]
* PA23 C ISI_D7 25 ISI_D7 G5 Y7 Video port output bit[7]
* PC29 C ISI_D8 26 ISI_D8 F5 Y8 Video port output bit[8]
* PC28 C ISI_D9 27 ISI_D9 G6 Y9 Video port output bit[9]
* PC27 C ISI_D10 28 ISI_D10 ---
* PC26 C ISI_D11 29 ISI_D11 ---
* --- 30 GND ---
*
* ??? ?? A2 EXPST_B Snapshot exposure start trigger
* ??? ?? A6 STROBE Flash control output
* ??? ?? B2 FREX Snapshot trigger
* ??? ?? B6 PWDN Power-down mode enable
*
****************************************************************************/
static inline int ov2640_camera_initialize(void)
{
FAR struct i2c_dev_s *i2c;
uint32_t actual;
int ret;
/* Get the I2C driver that interfaces with the camers (OV2640_BUS)*/
i2c = up_i2cinitialize(OV2640_BUS);
if (!i2c)
{
gdbg("ERROR: Failed to initialize TWI%d\n", OV2640_BUS);
return EXIT_FAILURE;
}
/* Enable clocking to the ISI peripheral */
sam_isi_enableclk();
/* Configure OV2640 pins
*
* ISI:
* - HSYNC, VSYNC, PCK
* - 8 data bits for 8-bit color
* PCK
* - PCK1 provides OV2640 system clock
*/
sam_configpio(PIO_ISI_HSYNC);
sam_configpio(PIO_ISI_VSYNC);
sam_configpio(PIO_ISI_PCK);
sam_configpio(PIO_ISI_D0);
sam_configpio(PIO_ISI_D1);
sam_configpio(PIO_ISI_D2);
sam_configpio(PIO_ISI_D3);
sam_configpio(PIO_ISI_D4);
sam_configpio(PIO_ISI_D5);
sam_configpio(PIO_ISI_D6);
sam_configpio(PIO_ISI_D7);
sam_configpio(PIO_PMC_PCK1);
/* Configure and enable the PCK1 output */
actual = sam_pck_configure(PCK1, OV2640_FREQUENCY);
gvdbg("Desired PCK1 frequency: %ld Actual: %ld\n",
(long)OV2640_FREQUENCY, (long)actual);
sam_pck_enable(PCK1, true);
/* Configure the ISI peripheral */
#warning Missing Logic
/* Initialize the OV2640 camera */
ret = ov2640_initialize(i2c);
if (ret < 0)
{
gdbg("ERROR: Failed to initialize the OV2640: %d\n", ret);
return EXIT_FAILURE;
}
return EXIT_FAILURE;
}
/************************************************************************************
* Public Functions
************************************************************************************/
/************************************************************************************
* Name: ov2640_main
*
* Description:
* Entry point for the OV2640 Camera Demo
*
************************************************************************************/
int ov2640_main(int argc, char *argv[])
{
FAR struct fb_vtable_s *vplane;
int ret;
/* First, initialize the display */
vplane = ov2640_lcd_initialize();
if (!vplane)
{
gdbg("ERROR: ov2640_lcd_initialize failed\n");
return EXIT_FAILURE;
}
/* Then, initialize the camera */
ret = ov2640_camera_initialize();
if (ret != EXIT_SUCCESS)
{
gdbg("ERROR: ov2640_camera_initialize failed\n");
return EXIT_FAILURE;
}
/* Now if everything is set up properly, the camera output should be
* visible on the LCD.
*/
return EXIT_SUCCESS;
}
#endif /* HAVE_CAMERA */