Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Diff: lvds/lvds_pll_main.c
- Revision:
- 0:853f5b7408a7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lvds/lvds_pll_main.c Fri Jun 26 02:17:53 2015 +0000
@@ -0,0 +1,239 @@
+/*******************************************************************************
+* 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;
+}
