Fixed flash state machine, removed EXT remains.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12572 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
Giovanni Di Sirio 2019-01-21 20:03:19 +00:00
parent a3e9966359
commit d8af50ca0d
11 changed files with 43 additions and 682 deletions

View File

@ -18,5 +18,35 @@
* @defgroup HAL_FLASH Generic NOR Flash Interface
* @brief HAL Generic NOR Flash Driver Interface.
*
* @section flash_1 Driver State Machine
* The flash driver implements a state machine internally, not all the driver
* functionalities can be used in any moment, any transition not explicitly
* shown in the following diagram has to be considered an error and shall
* be captured by an assertion (if enabled).
* @dot
digraph example {
rankdir="LR";
node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"];
edge [fontname=Helvetica, fontsize=8];
stop [label="FLS_STOP\nLow Power"];
uninit [label="FLS_UNINIT", style="bold"];
ready [label="FLS_READY\nClock Enabled"];
read [label="FLS_READ\nReading"];
pgm [label="FLS_PGM\nProgramming"];
erase [label="FLS_ERASE\nErasing"];
uninit -> stop [label=" xxxInit()", constraint=false];
stop -> stop [label=" xxxStop()"];
stop -> ready [label=" xxxStart()"];
ready -> stop [label=" xStop()"];
ready -> read [label=" flashRead()\nflashVerifyErase()"];
read -> ready [label=" return"];
ready -> pgm [label=" flashProgram()"];
pgm -> ready [label=" return"];
ready -> erase [label=" \n\nflashEraseAll()\nflashEraseSector()"];
erase -> ready [label=" flashQueryErase()\nFLASH_NO_ERROR\nFLASH_ERROR_*"];
erase -> erase [label=" flashQueryErase()\nflashProgram()\nflashRead()\nFLASH_BUSY_ERASING"];
}
* @enddot
*
* @ingroup HAL_ABSTRACT_PERIPHERALS
*/

View File

@ -20,7 +20,7 @@
* @details This module implements a generic driver for serial NOR Flash
* devices.
*
* @section flash_1 Driver State Machine
* @section snorflash_1 Driver State Machine
* The flash driver implements a state machine internally, not all the driver
* functionalities can be used in any moment, any transition not explicitly
* shown in the following diagram has to be considered an error and shall
@ -34,23 +34,19 @@
uninit [label="FLS_UNINIT", style="bold"];
ready [label="FLS_READY\nClock Enabled"];
read [label="FLS_READ\nReading"];
program [label="FLS_PGM\nProgramming"];
erasea [label="FLS_ERASEA\nErasing All"];
erases [label="FLS_ERASES\nErasing Sector"];
uninit -> stop [label=" flashInit()", constraint=false];
stop -> stop [label=" flashStop()"];
stop -> ready [label=" flashStart()"];
ready -> stop [label=" flashStop()"];
pgm [label="FLS_PGM\nProgramming"];
erase [label="FLS_ERASE\nErasing"];
uninit -> stop [label=" snorInit()", constraint=false];
stop -> stop [label=" snorStop()"];
stop -> ready [label=" snorStart()"];
ready -> stop [label=" snorStop()"];
ready -> read [label=" flashRead()\nflashVerifyErase()"];
read -> ready [label=" return"];
ready -> program [label=" flashProgram()"];
program -> ready [label=" return"];
ready -> erasea [label=" flashEraseAll)"];
erasea -> ready [label=" flashQueryErase()\nFLASH_NO_ERROR\nFLASH_ERROR_*"];
erasea -> erasea [label=" flashQueryErase()\nflashProgram()\nflashRead()\nFLASH_BUSY_ERASE"];
ready -> erases [label=" flashEraseSector()"];
erases -> ready [label=" flashQueryErase()\nFLASH_NO_ERROR\nFLASH_ERROR_*"];
erases -> erases [label=" flashQueryErase()\nflashProgram()\nflashRead()\nFLASH_BUSY_ERASE"];
ready -> pgm [label=" flashProgram()"];
pgm -> ready [label=" return"];
ready -> erase [label=" \n\nflashEraseAll()\nflashEraseSector()"];
erase -> ready [label=" flashQueryErase()\nFLASH_NO_ERROR\nFLASH_ERROR_*"];
erase -> erase [label=" flashQueryErase()\nflashProgram()\nflashRead()\nFLASH_BUSY_ERASING"];
}
* @enddot
*

View File

@ -30,9 +30,6 @@ endif
ifneq ($(findstring HAL_USE_DAC TRUE,$(HALCONF)),)
HALSRC += $(CHIBIOS)/os/hal/src/hal_dac.c
endif
ifneq ($(findstring HAL_USE_EXT TRUE,$(HALCONF)),)
HALSRC += $(CHIBIOS)/os/hal/src/hal_ext.c
endif
ifneq ($(findstring HAL_USE_GPT TRUE,$(HALCONF)),)
HALSRC += $(CHIBIOS)/os/hal/src/hal_gpt.c
endif
@ -99,7 +96,6 @@ HALSRC = $(CHIBIOS)/os/hal/src/hal.c \
$(CHIBIOS)/os/hal/src/hal_can.c \
$(CHIBIOS)/os/hal/src/hal_crypto.c \
$(CHIBIOS)/os/hal/src/hal_dac.c \
$(CHIBIOS)/os/hal/src/hal_ext.c \
$(CHIBIOS)/os/hal/src/hal_gpt.c \
$(CHIBIOS)/os/hal/src/hal_i2c.c \
$(CHIBIOS)/os/hal/src/hal_i2s.c \

View File

@ -140,7 +140,6 @@
#include "hal_can.h"
#include "hal_crypto.h"
#include "hal_dac.h"
#include "hal_ext.h"
#include "hal_gpt.h"
#include "hal_i2c.h"
#include "hal_i2s.h"

View File

@ -1,151 +0,0 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file hal_ext.h
* @brief EXT Driver macros and structures.
*
* @addtogroup EXT
* @{
*/
#ifndef HAL_EXT_H
#define HAL_EXT_H
#if (HAL_USE_EXT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/**
* @name EXT channel modes
* @{
*/
#define EXT_CH_MODE_EDGES_MASK 3U /**< @brief Mask of edges field. */
#define EXT_CH_MODE_DISABLED 0U /**< @brief Channel disabled. */
#define EXT_CH_MODE_RISING_EDGE 1U /**< @brief Rising edge callback. */
#define EXT_CH_MODE_FALLING_EDGE 2U /**< @brief Falling edge callback. */
#define EXT_CH_MODE_BOTH_EDGES 3U /**< @brief Both edges callback. */
#define EXT_CH_MODE_LOW_LEVEL 5U /**< @brief low level callback. */
#define EXT_CH_MODE_AUTOSTART 4U /**< @brief Channel started
automatically on driver start. */
/** @} */
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @brief Driver state machine possible states.
*/
typedef enum {
EXT_UNINIT = 0, /**< Not initialized. */
EXT_STOP = 1, /**< Stopped. */
EXT_ACTIVE = 2 /**< Active. */
} extstate_t;
/**
* @brief Type of a structure representing a EXT driver.
*/
typedef struct EXTDriver EXTDriver;
#include "hal_ext_lld.h"
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/**
* @name Macro Functions
* @{
*/
/**
* @brief Enables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be enabled
*
* @iclass
*/
#define extChannelEnableI(extp, channel) ext_lld_channel_enable(extp, channel)
/**
* @brief Disables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be disabled
*
* @iclass
*/
#define extChannelDisableI(extp, channel) ext_lld_channel_disable(extp, channel)
/**
* @brief Changes the operation mode of a channel.
* @note This function attempts to write over the current configuration
* structure that must have been not declared constant. This
* violates the @p const qualifier in @p extStart() but it is
* intentional. This function cannot be used if the configuration
* structure is declared @p const.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be changed
* @param[in] extcp new configuration for the channel
*
* @api
*/
#define extSetChannelMode(extp, channel, extcp) { \
osalSysLock(); \
extSetChannelModeI(extp, channel, extcp); \
osalSysUnlock(); \
}
/** @} */
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void extInit(void);
void extObjectInit(EXTDriver *extp);
void extStart(EXTDriver *extp, const EXTConfig *config);
void extStop(EXTDriver *extp);
void extChannelEnable(EXTDriver *extp, expchannel_t channel);
void extChannelDisable(EXTDriver *extp, expchannel_t channel);
void extSetChannelModeI(EXTDriver *extp,
expchannel_t channel,
const EXTChannelConfig *extcp);
#ifdef __cplusplus
}
#endif
#endif /* HAL_USE_EXT == TRUE */
#endif /* HAL_EXT_H */
/** @} */

View File

@ -80,9 +80,6 @@ void halInit(void) {
#if (HAL_USE_DAC == TRUE) || defined(__DOXYGEN__)
dacInit();
#endif
#if (HAL_USE_EXT == TRUE) || defined(__DOXYGEN__)
extInit();
#endif
#if (HAL_USE_GPT == TRUE) || defined(__DOXYGEN__)
gptInit();
#endif

View File

@ -1,206 +0,0 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file hal_ext.c
* @brief EXT Driver code.
*
* @addtogroup EXT
* @{
*/
#include "hal.h"
#if (HAL_USE_EXT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief EXT Driver initialization.
* @note This function is implicitly invoked by @p halInit(), there is
* no need to explicitly initialize the driver.
*
* @init
*/
void extInit(void) {
ext_lld_init();
}
/**
* @brief Initializes the standard part of a @p EXTDriver structure.
*
* @param[out] extp pointer to the @p EXTDriver object
*
* @init
*/
void extObjectInit(EXTDriver *extp) {
extp->state = EXT_STOP;
extp->config = NULL;
}
/**
* @brief Configures and activates the EXT peripheral.
* @post After activation all EXT channels are in the disabled state,
* use @p extChannelEnable() in order to activate them.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] config pointer to the @p EXTConfig object
*
* @api
*/
void extStart(EXTDriver *extp, const EXTConfig *config) {
osalDbgCheck((extp != NULL) && (config != NULL));
osalSysLock();
osalDbgAssert((extp->state == EXT_STOP) || (extp->state == EXT_ACTIVE),
"invalid state");
extp->config = config;
ext_lld_start(extp);
extp->state = EXT_ACTIVE;
osalSysUnlock();
}
/**
* @brief Deactivates the EXT peripheral.
*
* @param[in] extp pointer to the @p EXTDriver object
*
* @api
*/
void extStop(EXTDriver *extp) {
osalDbgCheck(extp != NULL);
osalSysLock();
osalDbgAssert((extp->state == EXT_STOP) || (extp->state == EXT_ACTIVE),
"invalid state");
ext_lld_stop(extp);
extp->config = NULL;
extp->state = EXT_STOP;
osalSysUnlock();
}
/**
* @brief Enables an EXT channel.
* @pre The channel must not be in @p EXT_CH_MODE_DISABLED mode.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be enabled
*
* @api
*/
void extChannelEnable(EXTDriver *extp, expchannel_t channel) {
osalDbgCheck((extp != NULL) && (channel < (expchannel_t)EXT_MAX_CHANNELS));
osalSysLock();
osalDbgAssert((extp->state == EXT_ACTIVE) &&
((extp->config->channels[channel].mode &
EXT_CH_MODE_EDGES_MASK) != EXT_CH_MODE_DISABLED),
"invalid state");
extChannelEnableI(extp, channel);
osalSysUnlock();
}
/**
* @brief Disables an EXT channel.
* @pre The channel must not be in @p EXT_CH_MODE_DISABLED mode.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be disabled
*
* @api
*/
void extChannelDisable(EXTDriver *extp, expchannel_t channel) {
osalDbgCheck((extp != NULL) && (channel < (expchannel_t)EXT_MAX_CHANNELS));
osalSysLock();
osalDbgAssert((extp->state == EXT_ACTIVE) &&
((extp->config->channels[channel].mode &
EXT_CH_MODE_EDGES_MASK) != EXT_CH_MODE_DISABLED),
"invalid state");
extChannelDisableI(extp, channel);
osalSysUnlock();
}
/**
* @brief Changes the operation mode of a channel.
* @note This function attempts to write over the current configuration
* structure that must have been not declared constant. This
* violates the @p const qualifier in @p extStart() but it is
* intentional.
* @note This function cannot be used if the configuration structure is
* declared @p const.
* @note The effect of this function on constant configuration structures
* is not defined.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be changed
* @param[in] extcp new configuration for the channel
*
* @iclass
*/
void extSetChannelModeI(EXTDriver *extp,
expchannel_t channel,
const EXTChannelConfig *extcp) {
EXTChannelConfig *oldcp;
osalDbgCheck((extp != NULL) &&
(channel < (expchannel_t)EXT_MAX_CHANNELS) &&
(extcp != NULL));
osalDbgAssert(extp->state == EXT_ACTIVE, "invalid state");
/* Note that here the access is enforced as non-const, known access
violation.*/
/*lint -save -e9005 [11.8] Known issue, the driver needs rework here.*/
oldcp = (EXTChannelConfig *)&extp->config->channels[channel];
/*lint -restore*/
/* Overwriting the old channels configuration then the channel is
reconfigured by the low level driver.*/
*oldcp = *extcp;
ext_lld_channel_enable(extp, channel);
}
#endif /* HAL_USE_EXT == TRUE */
/** @} */

View File

@ -1,147 +0,0 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file hal_ext_lld.c
* @brief PLATFORM EXT subsystem low level driver source.
*
* @addtogroup EXT
* @{
*/
#include "hal.h"
#if (HAL_USE_EXT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/**
* @brief EXT1 driver identifier.
*/
#if (PLATFORM_EXT_USE_EXT1 == TRUE) || defined(__DOXYGEN__)
EXTDriver EXTD1;
#endif
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Low level EXT driver initialization.
*
* @notapi
*/
void ext_lld_init(void) {
#if PLATFORM_EXT_USE_EXT1 == TRUE
/* Driver initialization.*/
extObjectInit(&EXTD1);
#endif
}
/**
* @brief Configures and activates the EXT peripheral.
*
* @param[in] extp pointer to the @p EXTDriver object
*
* @notapi
*/
void ext_lld_start(EXTDriver *extp) {
if (extp->state == EXT_STOP) {
/* Enables the peripheral.*/
#if PLATFORM_EXT_USE_EXT1 == TRUE
if (&EXTD1 == extp) {
}
#endif
}
/* Configures the peripheral.*/
}
/**
* @brief Deactivates the EXT peripheral.
*
* @param[in] extp pointer to the @p EXTDriver object
*
* @notapi
*/
void ext_lld_stop(EXTDriver *extp) {
if (extp->state == EXT_ACTIVE) {
/* Resets the peripheral.*/
/* Disables the peripheral.*/
#if PLATFORM_EXT_USE_EXT1 == TRUE
if (&EXTD1 == extp) {
}
#endif
}
}
/**
* @brief Enables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be enabled
*
* @notapi
*/
void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) {
(void)extp;
(void)channel;
}
/**
* @brief Disables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be disabled
*
* @notapi
*/
void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) {
(void)extp;
(void)channel;
}
#endif /* HAL_USE_EXT == TRUE */
/** @} */

View File

@ -1,150 +0,0 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file hal_ext_lld.h
* @brief PLATFORM EXT subsystem low level driver header.
*
* @addtogroup EXT
* @{
*/
#ifndef HAL_EXT_LLD_H
#define HAL_EXT_LLD_H
#if (HAL_USE_EXT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/**
* @brief Available number of EXT channels.
*/
#define EXT_MAX_CHANNELS 20
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/**
* @name PLATFORM configuration options
* @{
*/
/**
* @brief EXT driver enable switch.
* @details If set to @p TRUE the support for EXT1 is included.
* @note The default is @p FALSE.
*/
#if !defined(PLATFORM_EXT_USE_EXT1) || defined(__DOXYGEN__)
#define PLATFORM_EXT_USE_EXT1 FALSE
#endif
/** @} */
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @brief EXT channel identifier.
*/
typedef uint32_t expchannel_t;
/**
* @brief Type of an EXT generic notification callback.
*
* @param[in] extp pointer to the @p EXPDriver object triggering the
* callback
*/
typedef void (*extcallback_t)(EXTDriver *extp, expchannel_t channel);
/**
* @brief Channel configuration structure.
*/
typedef struct {
/**
* @brief Channel mode.
*/
uint32_t mode;
/**
* @brief Channel callback.
* @details In the STM32 implementation a @p NULL callback pointer is
* valid and configures the channel as an event sources instead
* of an interrupt source.
*/
extcallback_t cb;
} EXTChannelConfig;
/**
* @brief Driver configuration structure.
* @note It could be empty on some architectures.
*/
typedef struct {
/**
* @brief Channel configurations.
*/
EXTChannelConfig channels[EXT_MAX_CHANNELS];
/* End of the mandatory fields.*/
} EXTConfig;
/**
* @brief Structure representing an EXT driver.
*/
struct EXTDriver {
/**
* @brief Driver state.
*/
extstate_t state;
/**
* @brief Current configuration data.
*/
const EXTConfig *config;
/* End of the mandatory fields.*/
};
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#if (PLATFORM_EXT_USE_EXT1 == TRUE) && !defined(__DOXYGEN__)
extern EXTDriver EXTD1;
#endif
#ifdef __cplusplus
extern "C" {
#endif
void ext_lld_init(void);
void ext_lld_start(EXTDriver *extp);
void ext_lld_stop(EXTDriver *extp);
void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel);
void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel);
#ifdef __cplusplus
}
#endif
#endif /* HAL_USE_EXT == TRUE */
#endif /* HAL_EXT_LLD_H */
/** @} */

View File

@ -22,9 +22,6 @@ endif
ifneq ($(findstring HAL_USE_DAC TRUE,$(HALCONF)),)
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_dac_lld.c
endif
ifneq ($(findstring HAL_USE_EXT TRUE,$(HALCONF)),)
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_ext_lld.c
endif
ifneq ($(findstring HAL_USE_GPT TRUE,$(HALCONF)),)
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_gpt_lld.c
endif
@ -82,7 +79,6 @@ PLATFORMSRC = ${CHIBIOS}/os/hal/templates/hal_lld.c \
${CHIBIOS}/os/hal/templates/hal_can_lld.c \
${CHIBIOS}/os/hal/templates/hal_crypto_lld.c \
${CHIBIOS}/os/hal/templates/hal_dac_lld.c \
${CHIBIOS}/os/hal/templates/hal_ext_lld.c \
${CHIBIOS}/os/hal/templates/hal_gpt_lld.c \
${CHIBIOS}/os/hal/templates/hal_i2c_lld.c \
${CHIBIOS}/os/hal/templates/hal_i2s_lld.c \

View File

@ -75,6 +75,7 @@
*****************************************************************************
*** Next ***
- NEW: Removed deprecated EXT driver.
- NEW: Added a new function chMtxGetOwnerI() to RT mutexes subsystem.
- NEW: STM32L433 added to STM32L4xx HAL.
- CHG: chFifoObjectInit() renamed to chFifoObjectInitAligned(). Added a new