Video library for GR-PEACH
Dependents: Trace_Program2 GR-PEACH_Camera_in_barcode GR-PEACH_LCD_sample GR-PEACH_LCD_4_3inch_sample ... more
Video library for GR-PEACH.
Hello World!
Import programGR-PEACH_Camera_in
Camera in sample for GR-PEACH. This sample works on GR-LYCHEE besides GR-PEACH.
API
Import library
Interface
See the Pinout page for more details
lvds/lvds_pll_main.c
- Committer:
- dkato
- Date:
- 2016-06-30
- Revision:
- 4:aeefe5171463
- Parent:
- 0:853f5b7408a7
File content as of revision 4:aeefe5171463:
/******************************************************************************* * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only * intended for use with Renesas products. No other uses are authorized. This * software is owned by Renesas Electronics Corporation and is protected under * all applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software * and to discontinue the availability of this software. By using this software, * you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * Copyright (C) 2012 - 2015 Renesas Electronics Corporation. All rights reserved. *******************************************************************************/ /**************************************************************************//** * @file lvds_pll_main.c * @version 1.00 * $Rev: 199 $ * $Date:: 2014-05-23 16:33:52 +0900#$ * @brief lvds pll setting value ******************************************************************************/ /****************************************************************************** Includes <System Includes> , "Project Includes" ******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <math.h> #include "r_typedefs.h" #include "lvds_pll_calc.h" /****************************************************************************** Macro definitions ******************************************************************************/ /* FIN: LVDS PLL input frequency */ #define FIN_MIN (9.0) /*!< The lower limit of the FIN */ #define FIN_MAX (30.0) /*!< The upper limit of the FIN */ /* FREF */ #define FREF_MIN (2.5) /*!< The lower limit of the FREF */ #define FREF_MAX (30.0) /*!< The upper limit of the FREF */ /* FVCO: VCO output frequency */ #define FVCO_MIN (750.0) /*!< The lower limit of the FVCO */ #define FVCO_MAX (1630.0) /*!< The upper limit of the FVCO */ /* FOUT: LVDS PLL output frequency */ #define FOUT_MIN (0.0) /*!< The lower limit of the FOUT */ #define FOUT_MAX (609.0) /*!< The upper limit of the FOUT */ #define DIVIDER_3 (7.0) /*!< The frequency dividing value for frequency divider 3 */ /****************************************************************************** Typedef definitions ******************************************************************************/ /****************************************************************************** Variable Externs ******************************************************************************/ extern const double NIDIV_data[]; extern const double NRD_data[]; extern const double NFD_data[]; extern const double NOD_data[]; extern const double NODIV_data[]; /****************************************************************************** Private global variables and functions ******************************************************************************/ static double InputClock; static double OutputClock; static int LvdsUsed; /**************************************************************************//** * @brief * @param [in,out]param * @param [in]fout * @retval int *****************************************************************************/ static int compare_nodiv (pll_parameter_t * param, double fout) { int change; const double * nodiv_list; double diff_freq; change = 0; nodiv_list = NODIV_data; while (*nodiv_list != 0.0) { diff_freq = fabs(OutputClock - (fout / *nodiv_list)); if (param->comparison_freq > diff_freq) { param->comparison_freq = diff_freq; param->output_freq = fout / *nodiv_list; param->nodiv = *nodiv_list; change = 1; } nodiv_list++; } return change; } /**************************************************************************//** * @brief * @param [in,out]param * @param [in]fout * @retval int *****************************************************************************/ static int compare_div3 (pll_parameter_t * param, double fout) { double diff_freq; int change; change = 0; diff_freq = fabs(OutputClock - (fout / DIVIDER_3)); if (param->comparison_freq > diff_freq) { param->comparison_freq = diff_freq; param->output_freq = fout / DIVIDER_3; change = 1; } return change; } /**************************************************************************//** * @brief * @param [out]param * @retval None *****************************************************************************/ static void SeekValue (pll_parameter_t * param) { const double * nidiv_list; const double * nrd_list; const double * nfd_list; const double * nod_list; double fin; double fref; double fvco; double fout; int ret; nidiv_list = NIDIV_data; while (*nidiv_list != 0.0) { fin = InputClock / *nidiv_list; if ((fin < FIN_MIN) || (FIN_MAX < fin)) { nidiv_list++; continue; } nrd_list = NRD_data; while (*nrd_list != 0.0) { fref = fin / *nrd_list; if ((fref < FREF_MIN) || (FREF_MAX < fref)) { nrd_list++; continue; } nfd_list = NFD_data; while (*nfd_list != 0.0) { fvco = fref * (*nfd_list); if ((fvco < FVCO_MIN) || (FVCO_MAX < fvco)) { nfd_list++; continue; } nod_list = NOD_data; while (*nod_list != 0.0) { fout = fvco / *nod_list; if ((fout < FOUT_MIN) || (FOUT_MAX < fout)) { nod_list++; continue; } if (LvdsUsed == 0) { ret = compare_nodiv(param, fout); } else { ret = compare_div3(param, fout); } if (ret != 0) { param->nidiv = *nidiv_list; param->nrd = *nrd_list; param->nfd = *nfd_list; param->nod = *nod_list; } nod_list++; } nfd_list++; } nrd_list++; } nidiv_list++; } } /**************************************************************************//** * @brief PLL value Calculation function * @param[in] InClock : Input clock frequency [MHz] * @param[in] OuClock : Output clock frequency [MHz] * @param[in] Lvds : The LVDS output interface is used (=1) or not (=0) * @param[out] result : pll_parameter_t * @retval error (-1) ******************************************************************************/ int32_t lvds_pll_calc( const double InClock, const double OuClock, const uint32_t Lvds, pll_parameter_t * result ) { result->comparison_freq = 1000.0; result->output_freq = 0.0; result->nidiv = 0.0; result->nrd = 0.0; result->nfd = 0.0; result->nod = 0.0; result->nodiv = 0.0; InputClock = InClock; OutputClock = OuClock; LvdsUsed = Lvds; /* Calculation */ SeekValue(result); result->nidiv = result->nidiv/2; result->nodiv = result->nodiv/2; if( result->nod <= 4 ) { result->nod = result->nod/2; } else if( result->nod == 8 ) { result->nod = 3; } else { } result->nrd -=1; /* nrd-1 */ return 0; }