summaryrefslogblamecommitdiff
path: root/nuttx/configs/sama5d3x-ek/src/sam_ov2640.c
blob: 876b60dd5d54efe95519cee5e0f52161c56b3250 (plain) (tree)
1
                                                                             































                                                                        
                                                                              
 
                                                                             
                 
                                                                              





                         
                      
                           
                               





                           


                            

                        
                  
 
                                                                             
              
                                                                              


                                   
 
                                                                             
               
                                                                              
 
                                                                             
                    





                                                                              
                                                                 
 
                                 



                                          



                                                        
                  

     

                             

                                             

     
                
 
 

                                                                             












































                                                                                       


                                                                              
 
                            
                  

          
                                                                      
 

                                     
     
                                                              


                          
                                             
 
                      
 

























                                            
                                                                 





                                                    
                      
 
                                    
 

                               
     
                                                                


                          

                      














                                                                                      
                                 



                                     

                                   










                                                       
                           

     



                                                                      


                      
                        
/****************************************************************************
 * 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, PCKSRC_MCK, 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 */