Merged in masayuki2009/nuttx.nuttx/lc823450_dvfs (pull request #566)
lc823450 dvfs Approved-by: Gregory Nutt <gnutt@nuttx.org>
This commit is contained in:
commit
70c7e04686
@ -246,5 +246,8 @@ config HRT_TIMER
|
|||||||
bool "High resolution timer"
|
bool "High resolution timer"
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config DVFS
|
||||||
|
bool "Dynamic Voltage and Frequencey Scaling"
|
||||||
|
default n
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -146,7 +146,8 @@ endif
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_DVFS),y)
|
ifeq ($(CONFIG_DVFS),y)
|
||||||
CHIP_CSRCS += lc823450_dvfs.c
|
CHIP_CSRCS += lc823450_dvfs2.c
|
||||||
|
CHIP_CSRCS += lc823450_procfs_dvfs.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_PM),y)
|
ifeq ($(CONFIG_PM),y)
|
||||||
|
429
arch/arm/src/lc823450/lc823450_dvfs2.c
Normal file
429
arch/arm/src/lc823450/lc823450_dvfs2.c
Normal file
@ -0,0 +1,429 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/lc823450/lc823450_dvfs2.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015-2017 Sony Corporation. All rights reserved.
|
||||||
|
* Author: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
|
||||||
|
* Author: Masatoshi Tateishi <Masatoshi.Tateishi@jp.sony.com>
|
||||||
|
*
|
||||||
|
* 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 <nuttx/arch.h>
|
||||||
|
#include <nuttx/clock.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#include "lc823450_clockconfig.h"
|
||||||
|
#include "lc823450_syscontrol.h"
|
||||||
|
#include "lc823450_intc.h"
|
||||||
|
#include "lc823450_sdc.h"
|
||||||
|
#include "lc823450_dvfs2.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define FREQ_160 0
|
||||||
|
#define FREQ_080 1
|
||||||
|
#define FREQ_040 2
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct freq_entry
|
||||||
|
{
|
||||||
|
uint16_t freq;
|
||||||
|
uint16_t pll1;
|
||||||
|
uint16_t mdiv;
|
||||||
|
uint16_t hdiv;
|
||||||
|
} t_freq_entry;
|
||||||
|
|
||||||
|
static struct freq_entry _dvfs_act_tbl[3] =
|
||||||
|
{
|
||||||
|
{ 160, OSCCNT_MCSEL, OSCCNT_MAINDIV_1, 3}, /* PLL1 */
|
||||||
|
{ 80, OSCCNT_MCSEL, OSCCNT_MAINDIV_2, 1}, /* PLL1 */
|
||||||
|
{ 40, OSCCNT_MCSEL, OSCCNT_MAINDIV_4, 0}, /* PLL1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct freq_entry _dvfs_idl_tbl[3] =
|
||||||
|
{
|
||||||
|
{ 24, 0, OSCCNT_MAINDIV_1, 0}, /* XT1 */
|
||||||
|
{ 12, 0, OSCCNT_MAINDIV_2, 0}, /* XT1 */
|
||||||
|
{ 6, 0, OSCCNT_MAINDIV_4, 0}, /* XT1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t _dvfs_cur_idx = 0; /* current speed index */
|
||||||
|
static uint16_t _dvfs_cur_hdiv = 3;
|
||||||
|
static uint16_t _dvfs_cur_mdiv = OSCCNT_MAINDIV_1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static uint16_t _dvfs_init_timeout = (5 * 100); /* in ticks */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMP) && (CONFIG_SMP_NCPUS == 2)
|
||||||
|
static uint8_t _dvfs_cpu_is_active[CONFIG_SMP_NCPUS];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void lc823450_dvfs_set_div(int idx, int tbl);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int8_t g_dvfs_enabled = 0;
|
||||||
|
uint16_t g_dvfs_cur_freq = 160;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_update_lpm
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void lc823450_dvfs_update_lpm(int freq)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMP) && (CONFIG_SMP_NCPUS == 2)
|
||||||
|
static int _dvfs_another_cpu_state(int me)
|
||||||
|
{
|
||||||
|
if (0 == me)
|
||||||
|
{
|
||||||
|
return _dvfs_cpu_is_active[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _dvfs_cpu_is_active[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_set_div
|
||||||
|
* Set dividers in the OSC block
|
||||||
|
* target tbl: 0=active, 1=idle
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void lc823450_dvfs_set_div(int idx, int tbl)
|
||||||
|
{
|
||||||
|
uint32_t target;
|
||||||
|
uint32_t t_hdiv;
|
||||||
|
uint32_t t_mdiv;
|
||||||
|
|
||||||
|
if (0 == tbl)
|
||||||
|
{
|
||||||
|
target = _dvfs_act_tbl[idx].freq;
|
||||||
|
t_hdiv = _dvfs_act_tbl[idx].hdiv;
|
||||||
|
t_mdiv = _dvfs_act_tbl[idx].mdiv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
target = _dvfs_idl_tbl[idx].freq;
|
||||||
|
t_hdiv = _dvfs_idl_tbl[idx].hdiv;
|
||||||
|
t_mdiv = _dvfs_idl_tbl[idx].mdiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (100 < target)
|
||||||
|
{
|
||||||
|
/* Set ROM wait cycle (CPU=1wait) */
|
||||||
|
|
||||||
|
modifyreg32(MEMEN4, 0, MEMEN4_HWAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adjust AHB */
|
||||||
|
|
||||||
|
if (t_hdiv > _dvfs_cur_hdiv)
|
||||||
|
{
|
||||||
|
uint32_t pclkdiv = t_hdiv;
|
||||||
|
#ifdef CONFIG_LC823450_SDRAM
|
||||||
|
pclkdiv += (t_hdiv << 16);
|
||||||
|
#endif
|
||||||
|
putreg32(pclkdiv, PERICLKDIV);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t regval = getreg32(OSCCNT);
|
||||||
|
|
||||||
|
/* NOTE: In LC823450, MCSEL is reflected first then MAINDIV */
|
||||||
|
/* To avoid spec violation, 2-step clock change is needed */
|
||||||
|
|
||||||
|
/* step 1 : change MAINDIV if needed */
|
||||||
|
|
||||||
|
if (t_mdiv > _dvfs_cur_mdiv)
|
||||||
|
{
|
||||||
|
regval &= ~OSCCNT_MAINDIV_MASK;
|
||||||
|
regval |= t_mdiv;
|
||||||
|
|
||||||
|
/* change the MAINDIV first */
|
||||||
|
|
||||||
|
putreg32(regval, OSCCNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* step 2 : change MCSEL and MAINDIV */
|
||||||
|
|
||||||
|
regval = getreg32(OSCCNT);
|
||||||
|
regval &= ~(OSCCNT_MCSEL | OSCCNT_MAINDIV_MASK);
|
||||||
|
|
||||||
|
if (0 == tbl)
|
||||||
|
{
|
||||||
|
regval |= _dvfs_act_tbl[idx].pll1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
regval |= _dvfs_idl_tbl[idx].pll1;
|
||||||
|
}
|
||||||
|
|
||||||
|
regval |= t_mdiv;
|
||||||
|
|
||||||
|
/* set MCSEL and MAINDIV again */
|
||||||
|
|
||||||
|
putreg32(regval, OSCCNT);
|
||||||
|
|
||||||
|
/* update loops_per_msec for up_udelay(), up_mdelay() */
|
||||||
|
|
||||||
|
if (0 == tbl)
|
||||||
|
{
|
||||||
|
lc823450_dvfs_update_lpm(_dvfs_act_tbl[idx].freq);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lc823450_dvfs_update_lpm(_dvfs_idl_tbl[idx].freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adjust AHB */
|
||||||
|
|
||||||
|
if (t_hdiv < _dvfs_cur_hdiv)
|
||||||
|
{
|
||||||
|
uint32_t pclkdiv = t_hdiv;
|
||||||
|
#ifdef CONFIG_LC823450_SDRAM
|
||||||
|
pclkdiv += (t_hdiv << 16);
|
||||||
|
#endif
|
||||||
|
putreg32(pclkdiv, PERICLKDIV);
|
||||||
|
}
|
||||||
|
|
||||||
|
_dvfs_cur_idx = idx;
|
||||||
|
_dvfs_cur_hdiv = t_hdiv;
|
||||||
|
_dvfs_cur_mdiv = t_mdiv;
|
||||||
|
g_dvfs_cur_freq = target;
|
||||||
|
|
||||||
|
if (100 > target)
|
||||||
|
{
|
||||||
|
/* Clear ROM wait cycle (CPU=0wait) */
|
||||||
|
|
||||||
|
modifyreg32(MEMEN4, MEMEN4_HWAIT, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_get_apb
|
||||||
|
* Assumption: CPU=APB
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uint32_t lc823450_get_apb(void)
|
||||||
|
{
|
||||||
|
return g_dvfs_cur_freq * 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_tick_callback
|
||||||
|
* This callback is called in the timer interupt
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void lc823450_dvfs_tick_callback(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (_dvfs_init_timeout)
|
||||||
|
{
|
||||||
|
_dvfs_init_timeout--;
|
||||||
|
|
||||||
|
if (0 == _dvfs_init_timeout)
|
||||||
|
{
|
||||||
|
g_dvfs_enabled = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_enter_idle
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void lc823450_dvfs_enter_idle(void)
|
||||||
|
{
|
||||||
|
irqstate_t flags = spin_lock_irqsave();
|
||||||
|
|
||||||
|
if (0 == g_dvfs_enabled)
|
||||||
|
{
|
||||||
|
goto exit_with_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMP) && (CONFIG_SMP_NCPUS == 2)
|
||||||
|
int me = up_cpu_index();
|
||||||
|
|
||||||
|
/* Update my state first : 0 (idle) */
|
||||||
|
|
||||||
|
_dvfs_cpu_is_active[me] = 0;
|
||||||
|
|
||||||
|
/* check if another core is still active */
|
||||||
|
|
||||||
|
if (_dvfs_another_cpu_state(me))
|
||||||
|
{
|
||||||
|
/* do not change to idle clock */
|
||||||
|
|
||||||
|
goto exit_with_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DVFS_CHECK_SDC
|
||||||
|
if (lc823450_sdc_locked())
|
||||||
|
{
|
||||||
|
goto exit_with_error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NOTE: set idle freq : idx=same, change:tbl */
|
||||||
|
|
||||||
|
lc823450_dvfs_set_div(_dvfs_cur_idx, 1);
|
||||||
|
|
||||||
|
exit_with_error:
|
||||||
|
spin_unlock_irqrestore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_exit_idle
|
||||||
|
* This API is called in up_ack_irq() (i.e. interrupt context)
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void lc823450_dvfs_exit_idle(int irq)
|
||||||
|
{
|
||||||
|
irqstate_t flags = spin_lock_irqsave();
|
||||||
|
|
||||||
|
if (0 == g_dvfs_enabled)
|
||||||
|
{
|
||||||
|
goto exit_with_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_SMP) && (CONFIG_SMP_NCPUS == 2)
|
||||||
|
int me = up_cpu_index();
|
||||||
|
|
||||||
|
/* Update my state first: 1 (active) */
|
||||||
|
|
||||||
|
_dvfs_cpu_is_active[me] = 1;
|
||||||
|
|
||||||
|
/* Check if another core is already active */
|
||||||
|
|
||||||
|
if (_dvfs_another_cpu_state(me))
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
|
||||||
|
goto exit_with_error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NOTE: set active freq : idx=same, change:tbl */
|
||||||
|
|
||||||
|
lc823450_dvfs_set_div(_dvfs_cur_idx, 0);
|
||||||
|
|
||||||
|
exit_with_error:
|
||||||
|
spin_unlock_irqrestore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_boost
|
||||||
|
* boost the sytem clock to MAX (i.e. 160M)
|
||||||
|
* timeout in msec
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int lc823450_dvfs_boost(int timeout)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lc823450_dvfs_set_freq
|
||||||
|
* NOTE: should be called from dvfs command only
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int lc823450_dvfs_set_freq(int freq)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
int idx;
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
if (0 == g_dvfs_enabled)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags = spin_lock_irqsave();
|
||||||
|
|
||||||
|
switch (freq)
|
||||||
|
{
|
||||||
|
case 160:
|
||||||
|
idx = FREQ_160;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 80:
|
||||||
|
idx = FREQ_080;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 40:
|
||||||
|
idx = FREQ_040;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == ret)
|
||||||
|
{
|
||||||
|
lc823450_dvfs_set_div(idx, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(flags);
|
||||||
|
return ret;
|
||||||
|
}
|
75
arch/arm/src/lc823450/lc823450_dvfs2.h
Normal file
75
arch/arm/src/lc823450/lc823450_dvfs2.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/lc823450/lc823450_dvfs2.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015-2017 Sony Corporation. All rights reserved.
|
||||||
|
* Author: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_ARM_SRC_LC823450_LC823450_DVFS2_H
|
||||||
|
#define __ARCH_ARM_SRC_LC823450_LC823450_DVFS2_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void lc823450_dvfs_set_min(uint8_t id, uint16_t mhz);
|
||||||
|
void lc823450_dvfs_enter_idle(void);
|
||||||
|
void lc823450_dvfs_exit_idle(int irq);
|
||||||
|
int lc823450_dvfs_set_freq(int freq);
|
||||||
|
void lc823450_dvfs_tick_callback(void);
|
||||||
|
|
||||||
|
int dvfs_procfs_register(void);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#undef EXTERN
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_ARM_SRC_LC823450_LC823450_DVFS2_H */
|
@ -50,7 +50,7 @@
|
|||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
|
|
||||||
#ifdef CONFIG_DVFS
|
#ifdef CONFIG_DVFS
|
||||||
# include "lc823450_dvfs.h"
|
# include "lc823450_dvfs2.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -62,6 +62,8 @@ static int32_t g_in_sleep;
|
|||||||
static uint64_t g_sleep_t0;
|
static uint64_t g_sleep_t0;
|
||||||
#endif /* CONFIG_LC823450_SLEEP_MODE */
|
#endif /* CONFIG_LC823450_SLEEP_MODE */
|
||||||
|
|
||||||
|
static uint32_t g_idle_counter[2];
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -124,18 +126,21 @@ void up_idle(void)
|
|||||||
regval &= ~NVIC_SYSCON_SLEEPDEEP;
|
regval &= ~NVIC_SYSCON_SLEEPDEEP;
|
||||||
putreg32(regval, NVIC_SYSCON);
|
putreg32(regval, NVIC_SYSCON);
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
#endif /* CONFIG_LC823450_SLEEP_MODE */
|
||||||
|
|
||||||
#ifdef CONFIG_DVFS
|
#ifdef CONFIG_DVFS
|
||||||
lc823450_dvfs_enter_idle();
|
lc823450_dvfs_enter_idle();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
leave_critical_section(flags);
|
|
||||||
#endif /* CONFIG_LC823450_SLEEP_MODE */
|
|
||||||
|
|
||||||
board_autoled_off(LED_CPU0 + up_cpu_index());
|
board_autoled_off(LED_CPU0 + up_cpu_index());
|
||||||
|
|
||||||
/* Sleep until an interrupt occurs to save power */
|
/* Sleep until an interrupt occurs to save power */
|
||||||
|
|
||||||
asm("WFI");
|
asm("WFI");
|
||||||
|
|
||||||
|
g_idle_counter[up_cpu_index()]++;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
#include "lc823450_intc.h"
|
#include "lc823450_intc.h"
|
||||||
|
|
||||||
#ifdef CONFIG_DVFS
|
#ifdef CONFIG_DVFS
|
||||||
# include "lc823450_dvfs.h"
|
# include "lc823450_dvfs2.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
354
arch/arm/src/lc823450/lc823450_procfs_dvfs.c
Normal file
354
arch/arm/src/lc823450/lc823450_procfs_dvfs.c
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/lc823450/lc823450_procfs_dvfs.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Sony Corporation. All rights reserved.
|
||||||
|
* Author: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sys/statfs.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/sched.h>
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
#include <nuttx/fs/procfs.h>
|
||||||
|
#include <nuttx/fs/dirent.h>
|
||||||
|
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include "lc823450_dvfs2.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define DVFS_LINELEN 64
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
# define MIN(a,b) (a < b ? a : b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct dvfs_file_s
|
||||||
|
{
|
||||||
|
struct procfs_file_s base; /* Base open file structure */
|
||||||
|
unsigned int linesize; /* Number of valid characters in line[] */
|
||||||
|
char line[DVFS_LINELEN]; /* Pre-allocated buffer for formatted lines */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int dvfs_open(FAR struct file *filep, FAR const char *relpath,
|
||||||
|
int oflags, mode_t mode);
|
||||||
|
static int dvfs_close(FAR struct file *filep);
|
||||||
|
static ssize_t dvfs_read(FAR struct file *filep, FAR char *buffer,
|
||||||
|
size_t buflen);
|
||||||
|
static ssize_t dvfs_write(FAR struct file *filep, FAR const char *buffer,
|
||||||
|
size_t buflen);
|
||||||
|
static int dvfs_dup(FAR const struct file *oldp,
|
||||||
|
FAR struct file *newp);
|
||||||
|
static int dvfs_stat(FAR const char *relpath, FAR struct stat *buf);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static const struct procfs_operations dvfs_procfsoperations =
|
||||||
|
{
|
||||||
|
dvfs_open, /* open */
|
||||||
|
dvfs_close, /* close */
|
||||||
|
dvfs_read, /* read */
|
||||||
|
dvfs_write, /* write */
|
||||||
|
dvfs_dup, /* dup */
|
||||||
|
NULL, /* opendir */
|
||||||
|
NULL, /* closedir */
|
||||||
|
NULL, /* readdir */
|
||||||
|
NULL, /* rewinddir */
|
||||||
|
dvfs_stat /* stat */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct procfs_entry_s g_procfs_dvfs =
|
||||||
|
{
|
||||||
|
"dvfs",
|
||||||
|
&dvfs_procfsoperations
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
extern int8_t g_dvfs_enabled;
|
||||||
|
extern uint16_t g_dvfs_cur_freq;
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_open
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int dvfs_open(FAR struct file *filep, FAR const char *relpath,
|
||||||
|
int oflags, mode_t mode)
|
||||||
|
{
|
||||||
|
FAR struct dvfs_file_s *priv;
|
||||||
|
|
||||||
|
finfo("Open '%s'\n", relpath);
|
||||||
|
|
||||||
|
/* "dvfs" is the only acceptable value for the relpath */
|
||||||
|
|
||||||
|
if (strcmp(relpath, "dvfs") != 0)
|
||||||
|
{
|
||||||
|
ferr("ERROR: relpath is '%s'\n", relpath);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate a container to hold the task and attribute selection */
|
||||||
|
|
||||||
|
priv = (FAR struct dvfs_file_s *)kmm_zalloc(sizeof(struct dvfs_file_s));
|
||||||
|
if (!priv)
|
||||||
|
{
|
||||||
|
ferr("ERROR: Failed to allocate file attributes\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save the index as the open-specific state in filep->f_priv */
|
||||||
|
|
||||||
|
filep->f_priv = (FAR void *)priv;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_close
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int dvfs_close(FAR struct file *filep)
|
||||||
|
{
|
||||||
|
FAR struct dvfs_file_s *priv;
|
||||||
|
|
||||||
|
/* Recover our private data from the struct file instance */
|
||||||
|
|
||||||
|
priv = (FAR struct dvfs_file_s *)filep->f_priv;
|
||||||
|
DEBUGASSERT(priv);
|
||||||
|
|
||||||
|
/* Release the file attributes structure */
|
||||||
|
|
||||||
|
kmm_free(priv);
|
||||||
|
filep->f_priv = NULL;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_read
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static ssize_t dvfs_read(FAR struct file *filep, FAR char *buffer,
|
||||||
|
size_t buflen)
|
||||||
|
{
|
||||||
|
FAR struct dvfs_file_s *priv;
|
||||||
|
size_t linesize;
|
||||||
|
size_t copysize;
|
||||||
|
size_t remaining;
|
||||||
|
size_t totalsize;
|
||||||
|
off_t offset = filep->f_pos;
|
||||||
|
|
||||||
|
finfo("buffer=%p buflen=%d\n", buffer, (int)buflen);
|
||||||
|
|
||||||
|
priv = (FAR struct dvfs_file_s *)filep->f_priv;
|
||||||
|
DEBUGASSERT(priv);
|
||||||
|
|
||||||
|
remaining = buflen;
|
||||||
|
totalsize = 0;
|
||||||
|
|
||||||
|
linesize = snprintf(priv->line,
|
||||||
|
DVFS_LINELEN,
|
||||||
|
"cur_freq %d \n", g_dvfs_cur_freq);
|
||||||
|
copysize = procfs_memcpy(priv->line, linesize, buffer, remaining, &offset);
|
||||||
|
totalsize += copysize;
|
||||||
|
buffer += copysize;
|
||||||
|
remaining -= copysize;
|
||||||
|
|
||||||
|
if (totalsize >= buflen)
|
||||||
|
{
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
linesize = snprintf(priv->line,
|
||||||
|
DVFS_LINELEN,
|
||||||
|
"enable %d \n", g_dvfs_enabled);
|
||||||
|
copysize = procfs_memcpy(priv->line, linesize, buffer, remaining, &offset);
|
||||||
|
totalsize += copysize;
|
||||||
|
|
||||||
|
/* Update the file offset */
|
||||||
|
|
||||||
|
if (totalsize > 0)
|
||||||
|
{
|
||||||
|
filep->f_pos += totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: procfs_write
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static ssize_t dvfs_write(FAR struct file *filep, FAR const char *buffer,
|
||||||
|
size_t buflen)
|
||||||
|
{
|
||||||
|
char line[DVFS_LINELEN];
|
||||||
|
char cmd[16];
|
||||||
|
int n;
|
||||||
|
int freq;
|
||||||
|
int enable;
|
||||||
|
|
||||||
|
n = MIN(buflen, DVFS_LINELEN - 1);
|
||||||
|
strncpy(line, buffer, n);
|
||||||
|
line[n] = '\0';
|
||||||
|
|
||||||
|
n = MIN(strcspn(line, " "), sizeof(cmd) - 1);
|
||||||
|
strncpy(cmd, line, n);
|
||||||
|
cmd[n] = '\0';
|
||||||
|
|
||||||
|
if (0 == strcmp(cmd, "cur_freq"))
|
||||||
|
{
|
||||||
|
freq = atoi(line + (n + 1));
|
||||||
|
(void)lc823450_dvfs_set_freq(freq);
|
||||||
|
}
|
||||||
|
else if (0 == strcmp(cmd, "enable"))
|
||||||
|
{
|
||||||
|
enable = atoi(line + (n + 1));
|
||||||
|
g_dvfs_enabled = enable;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s not supported.\n", cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buflen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_dup
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int dvfs_dup(FAR const struct file *oldp, FAR struct file *newp)
|
||||||
|
{
|
||||||
|
FAR struct dvfs_file_s *oldpriv;
|
||||||
|
FAR struct dvfs_file_s *newpriv;
|
||||||
|
|
||||||
|
finfo("Dup %p->%p\n", oldp, newp);
|
||||||
|
|
||||||
|
/* Recover our private data from the old struct file instance */
|
||||||
|
|
||||||
|
oldpriv = (FAR struct dvfs_file_s *)oldp->f_priv;
|
||||||
|
DEBUGASSERT(oldpriv);
|
||||||
|
|
||||||
|
/* Allocate a new container to hold the task and attribute selection */
|
||||||
|
|
||||||
|
newpriv = (FAR struct dvfs_file_s *)kmm_zalloc(sizeof(struct dvfs_file_s));
|
||||||
|
if (!newpriv)
|
||||||
|
{
|
||||||
|
ferr("ERROR: Failed to allocate file attributes\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The copy the file attributes from the old attributes to the new */
|
||||||
|
|
||||||
|
memcpy(newpriv, oldpriv, sizeof(struct dvfs_file_s));
|
||||||
|
|
||||||
|
/* Save the new attributes in the new file structure */
|
||||||
|
|
||||||
|
newp->f_priv = (FAR void *)newpriv;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_stat
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int dvfs_stat(const char *relpath, struct stat *buf)
|
||||||
|
{
|
||||||
|
if (strcmp(relpath, "dvfs") != 0)
|
||||||
|
{
|
||||||
|
ferr("ERROR: relpath is '%s'\n", relpath);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->st_mode =
|
||||||
|
S_IFREG |
|
||||||
|
S_IROTH | S_IWOTH |
|
||||||
|
S_IRGRP | S_IWGRP |
|
||||||
|
S_IRUSR | S_IWUSR;
|
||||||
|
|
||||||
|
buf->st_size = 0;
|
||||||
|
buf->st_blksize = 0;
|
||||||
|
buf->st_blocks = 0;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: dvfs_procfs_register
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int dvfs_procfs_register(void)
|
||||||
|
{
|
||||||
|
return procfs_register(&g_procfs_dvfs);
|
||||||
|
}
|
@ -62,6 +62,13 @@
|
|||||||
#include "lc823450_clockconfig.h"
|
#include "lc823450_clockconfig.h"
|
||||||
#include "lc823450_serial.h"
|
#include "lc823450_serial.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_DVFS
|
||||||
|
# include "lc823450_dvfs2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_LC823450_MTM0_TICK) && defined (CONFIG_DVFS)
|
||||||
|
# error "Use CONFIG_LC823450_MTM0_TICK=y"
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
|
@ -248,6 +248,26 @@ nsh> route
|
|||||||
SEQ TARGET NETMASK ROUTER
|
SEQ TARGET NETMASK ROUTER
|
||||||
1. 0.0.0.0 0.0.0.0 192.168.1.1
|
1. 0.0.0.0 0.0.0.0 192.168.1.1
|
||||||
|
|
||||||
|
12. DVFS (Dynamic Voltage and Frequency Scaling)
|
||||||
|
|
||||||
|
lc823450-xgevk/audio and rndis configurations support DVFS.
|
||||||
|
You can check the status via /proc/dvfs
|
||||||
|
|
||||||
|
nsh> cat /proc/dvfs
|
||||||
|
cur_freq 160
|
||||||
|
enable 0
|
||||||
|
|
||||||
|
By default, DVFS is disabled. To enable,
|
||||||
|
|
||||||
|
nsh> echo "enable 1" > /proc/dvfs
|
||||||
|
|
||||||
|
In addition, you can change CPU frequency to 160/80/40. To change the
|
||||||
|
frequency, enable the DVFS first then do the following.
|
||||||
|
|
||||||
|
nsh> echo "cur_freq 80" > /proc/dvfs.
|
||||||
|
|
||||||
|
Currently, DVFS works in manual mode and Vdd1 is fixed to 1.2V
|
||||||
|
which will be changed in the future version.
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
^^^^
|
^^^^
|
||||||
|
@ -28,6 +28,7 @@ CONFIG_DEBUG_WARN=y
|
|||||||
CONFIG_DEV_ZERO=y
|
CONFIG_DEV_ZERO=y
|
||||||
CONFIG_DISABLE_POSIX_TIMERS=y
|
CONFIG_DISABLE_POSIX_TIMERS=y
|
||||||
CONFIG_DRIVERS_AUDIO=y
|
CONFIG_DRIVERS_AUDIO=y
|
||||||
|
CONFIG_DVFS=y
|
||||||
CONFIG_EXAMPLES_HELLO=y
|
CONFIG_EXAMPLES_HELLO=y
|
||||||
CONFIG_EXAMPLES_NSH=y
|
CONFIG_EXAMPLES_NSH=y
|
||||||
CONFIG_EXAMPLES_NXHELLO_BPP=1
|
CONFIG_EXAMPLES_NXHELLO_BPP=1
|
||||||
@ -40,6 +41,7 @@ CONFIG_FAT_LCNAMES=y
|
|||||||
CONFIG_FAT_LFN=y
|
CONFIG_FAT_LFN=y
|
||||||
CONFIG_FS_FATTIME=y
|
CONFIG_FS_FATTIME=y
|
||||||
CONFIG_FS_FAT=y
|
CONFIG_FS_FAT=y
|
||||||
|
CONFIG_FS_PROCFS_REGISTER=y
|
||||||
CONFIG_FS_PROCFS=y
|
CONFIG_FS_PROCFS=y
|
||||||
CONFIG_HRT_TIMER=y
|
CONFIG_HRT_TIMER=y
|
||||||
CONFIG_I2C_RESET=y
|
CONFIG_I2C_RESET=y
|
||||||
|
@ -1,19 +1,15 @@
|
|||||||
# CONFIG_LC823450_SDIF is not set
|
|
||||||
# CONFIG_NSH_ARGCAT is not set
|
|
||||||
# CONFIG_NX_DISABLE_1BPP is not set
|
|
||||||
# CONFIG_SPI_EXCHANGE is not set
|
|
||||||
CONFIG_ADC=y
|
CONFIG_ADC=y
|
||||||
CONFIG_ANALOG=y
|
CONFIG_ANALOG=y
|
||||||
CONFIG_AQM_1248A=y
|
CONFIG_AQM_1248A=y
|
||||||
CONFIG_ARCH_BOARD_LC823450_XGEVK=y
|
CONFIG_ARCH="arm"
|
||||||
CONFIG_ARCH_BOARD="lc823450-xgevk"
|
CONFIG_ARCH_BOARD="lc823450-xgevk"
|
||||||
|
CONFIG_ARCH_BOARD_LC823450_XGEVK=y
|
||||||
CONFIG_ARCH_CHIP_LC823450=y
|
CONFIG_ARCH_CHIP_LC823450=y
|
||||||
CONFIG_ARCH_FLOAT_H=y
|
CONFIG_ARCH_FLOAT_H=y
|
||||||
CONFIG_ARCH_INTERRUPTSTACK=2048
|
CONFIG_ARCH_INTERRUPTSTACK=2048
|
||||||
CONFIG_ARCH_STDARG_H=y
|
CONFIG_ARCH_STDARG_H=y
|
||||||
CONFIG_ARCH="arm"
|
|
||||||
CONFIG_BOARD_LOOPSPERMSEC=12061
|
|
||||||
CONFIG_BOARDCTL_RESET=y
|
CONFIG_BOARDCTL_RESET=y
|
||||||
|
CONFIG_BOARD_LOOPSPERMSEC=12061
|
||||||
CONFIG_BUILTIN=y
|
CONFIG_BUILTIN=y
|
||||||
CONFIG_C99_BOOL8=y
|
CONFIG_C99_BOOL8=y
|
||||||
CONFIG_CODECS_HASH_MD5=y
|
CONFIG_CODECS_HASH_MD5=y
|
||||||
@ -41,12 +37,13 @@ CONFIG_FS_PROCFS=y
|
|||||||
CONFIG_FS_WRITABLE=y
|
CONFIG_FS_WRITABLE=y
|
||||||
CONFIG_HRT_TIMER=y
|
CONFIG_HRT_TIMER=y
|
||||||
CONFIG_I2C_RESET=y
|
CONFIG_I2C_RESET=y
|
||||||
CONFIG_I2C=y
|
|
||||||
CONFIG_I2CTOOL_MAXBUS=1
|
CONFIG_I2CTOOL_MAXBUS=1
|
||||||
|
CONFIG_I2C=y
|
||||||
CONFIG_INTELHEX_BINARY=y
|
CONFIG_INTELHEX_BINARY=y
|
||||||
CONFIG_LC823450_I2C0=y
|
CONFIG_LC823450_I2C0=y
|
||||||
CONFIG_LC823450_I2C1=y
|
CONFIG_LC823450_I2C1=y
|
||||||
CONFIG_LC823450_MTM0_TICK=y
|
CONFIG_LC823450_MTM0_TICK=y
|
||||||
|
# CONFIG_LC823450_SDIF is not set
|
||||||
CONFIG_LC823450_SPI_DMA=y
|
CONFIG_LC823450_SPI_DMA=y
|
||||||
CONFIG_LC823450_UART0=y
|
CONFIG_LC823450_UART0=y
|
||||||
CONFIG_LC823450_WDT=y
|
CONFIG_LC823450_WDT=y
|
||||||
@ -63,6 +60,7 @@ CONFIG_NETUTILS_CODECS=y
|
|||||||
CONFIG_NFILE_DESCRIPTORS=45
|
CONFIG_NFILE_DESCRIPTORS=45
|
||||||
CONFIG_NFILE_STREAMS=8
|
CONFIG_NFILE_STREAMS=8
|
||||||
CONFIG_NSH_ARCHINIT=y
|
CONFIG_NSH_ARCHINIT=y
|
||||||
|
# CONFIG_NSH_ARGCAT is not set
|
||||||
CONFIG_NSH_BUILTIN_APPS=y
|
CONFIG_NSH_BUILTIN_APPS=y
|
||||||
CONFIG_NSH_DISABLE_BASENAME=y
|
CONFIG_NSH_DISABLE_BASENAME=y
|
||||||
CONFIG_NSH_DISABLE_CP=y
|
CONFIG_NSH_DISABLE_CP=y
|
||||||
@ -81,8 +79,8 @@ CONFIG_NSH_DISABLE_MKFIFO=y
|
|||||||
CONFIG_NSH_DISABLE_MKRD=y
|
CONFIG_NSH_DISABLE_MKRD=y
|
||||||
CONFIG_NSH_DISABLE_MV=y
|
CONFIG_NSH_DISABLE_MV=y
|
||||||
CONFIG_NSH_DISABLE_PUT=y
|
CONFIG_NSH_DISABLE_PUT=y
|
||||||
CONFIG_NSH_DISABLE_RM=y
|
|
||||||
CONFIG_NSH_DISABLE_RMDIR=y
|
CONFIG_NSH_DISABLE_RMDIR=y
|
||||||
|
CONFIG_NSH_DISABLE_RM=y
|
||||||
CONFIG_NSH_DISABLE_SH=y
|
CONFIG_NSH_DISABLE_SH=y
|
||||||
CONFIG_NSH_DISABLE_WGET=y
|
CONFIG_NSH_DISABLE_WGET=y
|
||||||
CONFIG_NSH_DISABLE_XD=y
|
CONFIG_NSH_DISABLE_XD=y
|
||||||
@ -90,8 +88,9 @@ CONFIG_NSH_FILEIOSIZE=512
|
|||||||
CONFIG_NSH_MAXARGUMENTS=10
|
CONFIG_NSH_MAXARGUMENTS=10
|
||||||
CONFIG_NSH_READLINE=y
|
CONFIG_NSH_READLINE=y
|
||||||
CONFIG_NX_BLOCKING=y
|
CONFIG_NX_BLOCKING=y
|
||||||
CONFIG_NX=y
|
# CONFIG_NX_DISABLE_1BPP is not set
|
||||||
CONFIG_NXFONT_MONO5X8=y
|
CONFIG_NXFONT_MONO5X8=y
|
||||||
|
CONFIG_NX=y
|
||||||
CONFIG_PIPES=y
|
CONFIG_PIPES=y
|
||||||
CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=2048
|
CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=2048
|
||||||
CONFIG_PREALLOC_MQ_MSGS=4
|
CONFIG_PREALLOC_MQ_MSGS=4
|
||||||
@ -118,6 +117,7 @@ CONFIG_SDCLONE_DISABLE=y
|
|||||||
CONFIG_SERIAL_TERMIOS=y
|
CONFIG_SERIAL_TERMIOS=y
|
||||||
CONFIG_SMP_NCPUS=2
|
CONFIG_SMP_NCPUS=2
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
|
# CONFIG_SPI_EXCHANGE is not set
|
||||||
CONFIG_SPINLOCK_IRQ=y
|
CONFIG_SPINLOCK_IRQ=y
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
CONFIG_START_DAY=3
|
CONFIG_START_DAY=3
|
||||||
|
@ -30,6 +30,7 @@ CONFIG_DEBUG_WARN=y
|
|||||||
CONFIG_DEV_ZERO=y
|
CONFIG_DEV_ZERO=y
|
||||||
CONFIG_DISABLE_POSIX_TIMERS=y
|
CONFIG_DISABLE_POSIX_TIMERS=y
|
||||||
CONFIG_DRIVERS_AUDIO=y
|
CONFIG_DRIVERS_AUDIO=y
|
||||||
|
CONFIG_DVFS=y
|
||||||
CONFIG_EXAMPLES_HELLO=y
|
CONFIG_EXAMPLES_HELLO=y
|
||||||
CONFIG_EXAMPLES_NSH=y
|
CONFIG_EXAMPLES_NSH=y
|
||||||
CONFIG_EXAMPLES_NXHELLO_BPP=1
|
CONFIG_EXAMPLES_NXHELLO_BPP=1
|
||||||
@ -42,6 +43,7 @@ CONFIG_FAT_LCNAMES=y
|
|||||||
CONFIG_FAT_LFN=y
|
CONFIG_FAT_LFN=y
|
||||||
CONFIG_FS_FATTIME=y
|
CONFIG_FS_FATTIME=y
|
||||||
CONFIG_FS_FAT=y
|
CONFIG_FS_FAT=y
|
||||||
|
CONFIG_FS_PROCFS_REGISTER=y
|
||||||
CONFIG_FS_PROCFS=y
|
CONFIG_FS_PROCFS=y
|
||||||
CONFIG_HRT_TIMER=y
|
CONFIG_HRT_TIMER=y
|
||||||
CONFIG_I2C_RESET=y
|
CONFIG_I2C_RESET=y
|
||||||
@ -168,6 +170,7 @@ CONFIG_SYSTEM_I2CTOOL=y
|
|||||||
CONFIG_SYSTEM_NXPLAYER=y
|
CONFIG_SYSTEM_NXPLAYER=y
|
||||||
CONFIG_SYSTEM_PING=y
|
CONFIG_SYSTEM_PING=y
|
||||||
CONFIG_TASK_NAME_SIZE=24
|
CONFIG_TASK_NAME_SIZE=24
|
||||||
|
CONFIG_TELNET_CHARACTER_MODE=y
|
||||||
CONFIG_UART0_RXBUFSIZE=512
|
CONFIG_UART0_RXBUFSIZE=512
|
||||||
CONFIG_UART0_SERIAL_CONSOLE=y
|
CONFIG_UART0_SERIAL_CONSOLE=y
|
||||||
CONFIG_UART0_TXBUFSIZE=2048
|
CONFIG_UART0_TXBUFSIZE=2048
|
||||||
|
@ -57,6 +57,10 @@
|
|||||||
# include "lc823450_wdt.h"
|
# include "lc823450_wdt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DVFS
|
||||||
|
# include "lc823450_dvfs2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "lc823450-xgevk.h"
|
#include "lc823450-xgevk.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -80,6 +84,11 @@ int lc823450_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FS_PROCFS
|
#ifdef CONFIG_FS_PROCFS
|
||||||
|
|
||||||
|
#ifdef CONFIG_DVFS
|
||||||
|
(void)dvfs_procfs_register();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Mount the procfs file system */
|
/* Mount the procfs file system */
|
||||||
|
|
||||||
ret = mount(NULL, "/proc", "procfs", 0, NULL);
|
ret = mount(NULL, "/proc", "procfs", 0, NULL);
|
||||||
|
@ -1,18 +1,15 @@
|
|||||||
# CONFIG_NSH_ARGCAT is not set
|
|
||||||
# CONFIG_NX_DISABLE_1BPP is not set
|
|
||||||
# CONFIG_SPI_EXCHANGE is not set
|
|
||||||
CONFIG_ADC=y
|
CONFIG_ADC=y
|
||||||
CONFIG_ANALOG=y
|
CONFIG_ANALOG=y
|
||||||
CONFIG_AQM_1248A=y
|
CONFIG_AQM_1248A=y
|
||||||
CONFIG_ARCH_BOARD_LC823450_XGEVK=y
|
CONFIG_ARCH="arm"
|
||||||
CONFIG_ARCH_BOARD="lc823450-xgevk"
|
CONFIG_ARCH_BOARD="lc823450-xgevk"
|
||||||
|
CONFIG_ARCH_BOARD_LC823450_XGEVK=y
|
||||||
CONFIG_ARCH_CHIP_LC823450=y
|
CONFIG_ARCH_CHIP_LC823450=y
|
||||||
CONFIG_ARCH_FLOAT_H=y
|
CONFIG_ARCH_FLOAT_H=y
|
||||||
CONFIG_ARCH_INTERRUPTSTACK=2048
|
CONFIG_ARCH_INTERRUPTSTACK=2048
|
||||||
CONFIG_ARCH_STDARG_H=y
|
CONFIG_ARCH_STDARG_H=y
|
||||||
CONFIG_ARCH="arm"
|
|
||||||
CONFIG_BOARD_LOOPSPERMSEC=12061
|
|
||||||
CONFIG_BOARDCTL_RESET=y
|
CONFIG_BOARDCTL_RESET=y
|
||||||
|
CONFIG_BOARD_LOOPSPERMSEC=12061
|
||||||
CONFIG_BUILTIN=y
|
CONFIG_BUILTIN=y
|
||||||
CONFIG_C99_BOOL8=y
|
CONFIG_C99_BOOL8=y
|
||||||
CONFIG_CODECS_HASH_MD5=y
|
CONFIG_CODECS_HASH_MD5=y
|
||||||
@ -40,13 +37,13 @@ CONFIG_EXAMPLES_WATCHDOG=y
|
|||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_FAT_LCNAMES=y
|
CONFIG_FAT_LCNAMES=y
|
||||||
CONFIG_FAT_LFN=y
|
CONFIG_FAT_LFN=y
|
||||||
CONFIG_FS_FAT=y
|
|
||||||
CONFIG_FS_FATTIME=y
|
CONFIG_FS_FATTIME=y
|
||||||
|
CONFIG_FS_FAT=y
|
||||||
CONFIG_FS_PROCFS=y
|
CONFIG_FS_PROCFS=y
|
||||||
CONFIG_HRT_TIMER=y
|
CONFIG_HRT_TIMER=y
|
||||||
CONFIG_I2C_RESET=y
|
CONFIG_I2C_RESET=y
|
||||||
CONFIG_I2C=y
|
|
||||||
CONFIG_I2CTOOL_MAXBUS=1
|
CONFIG_I2CTOOL_MAXBUS=1
|
||||||
|
CONFIG_I2C=y
|
||||||
CONFIG_INTELHEX_BINARY=y
|
CONFIG_INTELHEX_BINARY=y
|
||||||
CONFIG_LC823450_I2C0=y
|
CONFIG_LC823450_I2C0=y
|
||||||
CONFIG_LC823450_I2C1=y
|
CONFIG_LC823450_I2C1=y
|
||||||
@ -71,6 +68,7 @@ CONFIG_NETUTILS_CODECS=y
|
|||||||
CONFIG_NFILE_DESCRIPTORS=45
|
CONFIG_NFILE_DESCRIPTORS=45
|
||||||
CONFIG_NFILE_STREAMS=8
|
CONFIG_NFILE_STREAMS=8
|
||||||
CONFIG_NSH_ARCHINIT=y
|
CONFIG_NSH_ARCHINIT=y
|
||||||
|
# CONFIG_NSH_ARGCAT is not set
|
||||||
CONFIG_NSH_BUILTIN_APPS=y
|
CONFIG_NSH_BUILTIN_APPS=y
|
||||||
CONFIG_NSH_CMDOPT_DD_STATS=y
|
CONFIG_NSH_CMDOPT_DD_STATS=y
|
||||||
CONFIG_NSH_DISABLE_EXEC=y
|
CONFIG_NSH_DISABLE_EXEC=y
|
||||||
@ -91,8 +89,9 @@ CONFIG_NSH_FILEIOSIZE=512
|
|||||||
CONFIG_NSH_MAXARGUMENTS=10
|
CONFIG_NSH_MAXARGUMENTS=10
|
||||||
CONFIG_NSH_READLINE=y
|
CONFIG_NSH_READLINE=y
|
||||||
CONFIG_NX_BLOCKING=y
|
CONFIG_NX_BLOCKING=y
|
||||||
CONFIG_NX=y
|
# CONFIG_NX_DISABLE_1BPP is not set
|
||||||
CONFIG_NXFONT_MONO5X8=y
|
CONFIG_NXFONT_MONO5X8=y
|
||||||
|
CONFIG_NX=y
|
||||||
CONFIG_PIPES=y
|
CONFIG_PIPES=y
|
||||||
CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=2048
|
CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=2048
|
||||||
CONFIG_PREALLOC_MQ_MSGS=4
|
CONFIG_PREALLOC_MQ_MSGS=4
|
||||||
@ -120,6 +119,7 @@ CONFIG_SENSORS=y
|
|||||||
CONFIG_SERIAL_TERMIOS=y
|
CONFIG_SERIAL_TERMIOS=y
|
||||||
CONFIG_SMP_NCPUS=2
|
CONFIG_SMP_NCPUS=2
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
|
# CONFIG_SPI_EXCHANGE is not set
|
||||||
CONFIG_SPINLOCK_IRQ=y
|
CONFIG_SPINLOCK_IRQ=y
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
CONFIG_START_DAY=3
|
CONFIG_START_DAY=3
|
||||||
|
Loading…
Reference in New Issue
Block a user