mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
Merged nuttx/nuttx into master
This commit is contained in:
@@ -553,7 +553,7 @@ static inline int efm32_i2c_sem_waitdone(FAR struct efm32_i2c_priv_s *priv)
|
|||||||
|
|
||||||
#ifdef CONFIG_EFM32_I2C_DYNTIMEO
|
#ifdef CONFIG_EFM32_I2C_DYNTIMEO
|
||||||
abstime.tv_nsec += 1000 * efm32_i2c_tousecs(priv->msgc, priv->msgv);
|
abstime.tv_nsec += 1000 * efm32_i2c_tousecs(priv->msgc, priv->msgv);
|
||||||
if (abstime.tv_nsec > 1000 * 1000 * 1000)
|
if (abstime.tv_nsec >= 1000 * 1000 * 1000)
|
||||||
{
|
{
|
||||||
abstime.tv_sec++;
|
abstime.tv_sec++;
|
||||||
abstime.tv_nsec -= 1000 * 1000 * 1000;
|
abstime.tv_nsec -= 1000 * 1000 * 1000;
|
||||||
@@ -561,7 +561,7 @@ static inline int efm32_i2c_sem_waitdone(FAR struct efm32_i2c_priv_s *priv)
|
|||||||
|
|
||||||
#elif CONFIG_EFM32_I2CTIMEOMS > 0
|
#elif CONFIG_EFM32_I2CTIMEOMS > 0
|
||||||
abstime.tv_nsec += CONFIG_EFM32_I2CTIMEOMS * 1000 * 1000;
|
abstime.tv_nsec += CONFIG_EFM32_I2CTIMEOMS * 1000 * 1000;
|
||||||
if (abstime.tv_nsec > 1000 * 1000 * 1000)
|
if (abstime.tv_nsec >= 1000 * 1000 * 1000)
|
||||||
{
|
{
|
||||||
abstime.tv_sec++;
|
abstime.tv_sec++;
|
||||||
abstime.tv_nsec -= 1000 * 1000 * 1000;
|
abstime.tv_nsec -= 1000 * 1000 * 1000;
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ static const struct rtc_ops_s g_rtc_ops =
|
|||||||
{
|
{
|
||||||
.rdtime = kinetis_rdtime,
|
.rdtime = kinetis_rdtime,
|
||||||
.settime = kinetis_settime,
|
.settime = kinetis_settime,
|
||||||
|
.havesettime = NULL,
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
.setalarm = kinetis_setalarm,
|
.setalarm = kinetis_setalarm,
|
||||||
.setrelative = kinetis_setrelative,
|
.setrelative = kinetis_setrelative,
|
||||||
|
|||||||
@@ -495,9 +495,22 @@ static int sam_settimeout(FAR struct watchdog_lowerhalf_s *lower,
|
|||||||
* NOTE: The Watchdog Mode Register (WDT_MR) can be written only once. Only
|
* NOTE: The Watchdog Mode Register (WDT_MR) can be written only once. Only
|
||||||
* a processor reset resets it. Writing the WDT_MR register reloads the
|
* a processor reset resets it. Writing the WDT_MR register reloads the
|
||||||
* timer with the newly programmed mode parameters.
|
* timer with the newly programmed mode parameters.
|
||||||
|
*
|
||||||
|
* NOTE: The WDD Value is the lower bound of a so called Forbidden Window
|
||||||
|
* (see Datasheet for further Informations). To disable this Forbidden
|
||||||
|
* Window we have to set the WDD Value greater than or equal to WDV
|
||||||
|
* (according the Datasheet).
|
||||||
|
*
|
||||||
|
* When setting the WDD Value equal to WDV we have to wait at least one clock
|
||||||
|
* pulse of the (very slow) watchdog clock source between two resets (or the
|
||||||
|
* configuration and the first reset) of the watchdog.
|
||||||
|
*
|
||||||
|
* On fast systems this can lead to a direct hit of the WDD boundary and
|
||||||
|
* thus to a reset of the system. This is why we program the WDD Value toi
|
||||||
|
* WDT_MR_WDD_MAX to truly disable this Forbidden Window Feature.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
regval = WDT_MR_WDV(reload) | WDT_MR_WDD(reload);
|
regval = WDT_MR_WDV(reload) | WDT_MR_WDD(WDT_MR_WDD_MAX);
|
||||||
|
|
||||||
#ifdef CONFIG_SAMV7_WDT_INTERRUPT
|
#ifdef CONFIG_SAMV7_WDT_INTERRUPT
|
||||||
/* Generate an interrupt whent he watchdog timer expires */
|
/* Generate an interrupt whent he watchdog timer expires */
|
||||||
|
|||||||
@@ -6334,10 +6334,15 @@ config RTC_MAGIC_REG
|
|||||||
depends on RTC && !STM32_HAVE_RTC_COUNTER
|
depends on RTC && !STM32_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
config RTC_MAGIC
|
config RTC_MAGIC
|
||||||
hex "Value used as Magic to determine if RTC is set already"
|
hex "Value used as Magic to determine if RTC is already setup"
|
||||||
default 0xfacefeee
|
default 0xfacefeee
|
||||||
depends on RTC && !STM32_HAVE_RTC_COUNTER
|
depends on RTC && !STM32_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
|
config RTC_MAGIC_TIME_SET
|
||||||
|
hex "Value used as Magic to determine if RTC is setup and have time set"
|
||||||
|
default 0xfacefeef
|
||||||
|
depends on RTC && !STM32_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "RTC clock source"
|
prompt "RTC clock source"
|
||||||
default RTC_LSECLOCK
|
default RTC_LSECLOCK
|
||||||
|
|||||||
@@ -94,7 +94,7 @@
|
|||||||
#define SYSCFG_CFGR1_DAC1_DMARMP (1 << 13) /* Bit 13: DAC channel DMA remap */
|
#define SYSCFG_CFGR1_DAC1_DMARMP (1 << 13) /* Bit 13: DAC channel DMA remap */
|
||||||
#define SYSCFG_CFGR1_TIM7_DMARMP (1 << 14) /* Bit 14: TIM7 DMA remap */
|
#define SYSCFG_CFGR1_TIM7_DMARMP (1 << 14) /* Bit 14: TIM7 DMA remap */
|
||||||
#define SYSCFG_CFGR1_DAC2_DMARMP (1 << 14) /* Bit 14: DAC channel2 DMA remap */
|
#define SYSCFG_CFGR1_DAC2_DMARMP (1 << 14) /* Bit 14: DAC channel2 DMA remap */
|
||||||
#define SYSCFG_CFGR1_I2C_PBXFMP_SHIFT (0) /* Bits 16-19: Fast Mode Plus (FM+) driving capability */
|
#define SYSCFG_CFGR1_I2C_PBXFMP_SHIFT (16) /* Bits 16-19: Fast Mode Plus (FM+) driving capability */
|
||||||
#define SYSCFG_CFGR1_I2C_PBXFMP_MASK (15 << SYSCFG_CFGR1_I2C_PBXFMP_SHIFT)
|
#define SYSCFG_CFGR1_I2C_PBXFMP_MASK (15 << SYSCFG_CFGR1_I2C_PBXFMP_SHIFT)
|
||||||
#define SYSCFG_CFGR1_I2C1_FMP (1 << 20) /* Bit 20: I2C1 fast mode Plus driving capability */
|
#define SYSCFG_CFGR1_I2C1_FMP (1 << 20) /* Bit 20: I2C1 fast mode Plus driving capability */
|
||||||
#define SYSCFG_CFGR1_I2C2_FMP (1 << 21) /* Bit 21: I2C2 fast mode Plus driving capability */
|
#define SYSCFG_CFGR1_I2C2_FMP (1 << 21) /* Bit 21: I2C2 fast mode Plus driving capability */
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
#define SYSCFG_CFGR1_TIM7_DMARMP (1 << 14) /* Bit 14: TIM7 DMA remap */
|
#define SYSCFG_CFGR1_TIM7_DMARMP (1 << 14) /* Bit 14: TIM7 DMA remap */
|
||||||
#define SYSCFG_CFGR1_DAC2CH2_DMARMP (1 << 14) /* Bit 14: DAC channel2 DMA remap */
|
#define SYSCFG_CFGR1_DAC2CH2_DMARMP (1 << 14) /* Bit 14: DAC channel2 DMA remap */
|
||||||
#define SYSCFG_CFGR1_DAC2CH1_DMARMP (1 << 15) /* Bit 14: DAC channel1 DMA remap */
|
#define SYSCFG_CFGR1_DAC2CH1_DMARMP (1 << 15) /* Bit 14: DAC channel1 DMA remap */
|
||||||
#define SYSCFG_CFGR1_I2C_PBXFMP_SHIFT (0) /* Bits 16-19: Fast Mode Plus (FM+) driving capability */
|
#define SYSCFG_CFGR1_I2C_PBXFMP_SHIFT (16) /* Bits 16-19: Fast Mode Plus (FM+) driving capability */
|
||||||
#define SYSCFG_CFGR1_I2C_PBXFMP_MASK (15 << SYSCFG_CFGR1_I2C_PBXFMP_SHIFT)
|
#define SYSCFG_CFGR1_I2C_PBXFMP_MASK (15 << SYSCFG_CFGR1_I2C_PBXFMP_SHIFT)
|
||||||
#define SYSCFG_CFGR1_I2C1_FMP (1 << 20) /* Bit 20: I2C1 fast mode Plus driving capability */
|
#define SYSCFG_CFGR1_I2C1_FMP (1 << 20) /* Bit 20: I2C1 fast mode Plus driving capability */
|
||||||
#define SYSCFG_CFGR1_I2C2_FMP (1 << 21) /* Bit 21: I2C2 fast mode Plus driving capability */
|
#define SYSCFG_CFGR1_I2C2_FMP (1 << 21) /* Bit 21: I2C2 fast mode Plus driving capability */
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ static inline void rcc_resetbkp(void)
|
|||||||
stm32_pwr_initbkp(false);
|
stm32_pwr_initbkp(false);
|
||||||
|
|
||||||
regval = getreg32(RTC_MAGIC_REG);
|
regval = getreg32(RTC_MAGIC_REG);
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
stm32_pwr_enablebkp(true);
|
stm32_pwr_enablebkp(true);
|
||||||
|
|
||||||
|
|||||||
@@ -83,11 +83,16 @@
|
|||||||
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_RTC_MAGIC_TIME_SET)
|
||||||
|
# define CONFIG_RTC_MAGIC_TIME_SET (CONFIG_RTC_MAGIC + 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(CONFIG_RTC_MAGIC_REG)
|
#if !defined(CONFIG_RTC_MAGIC_REG)
|
||||||
# define CONFIG_RTC_MAGIC_REG (0)
|
# define CONFIG_RTC_MAGIC_REG (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RTC_MAGIC CONFIG_RTC_MAGIC
|
#define RTC_MAGIC CONFIG_RTC_MAGIC
|
||||||
|
#define RTC_MAGIC_TIME_SET CONFIG_RTC_MAGIC_TIME_SET
|
||||||
#define RTC_MAGIC_REG STM32_RTC_BKR(CONFIG_RTC_MAGIC_REG)
|
#define RTC_MAGIC_REG STM32_RTC_BKR(CONFIG_RTC_MAGIC_REG)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -49,6 +49,8 @@
|
|||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/timers/rtc.h>
|
#include <nuttx/timers/rtc.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include "stm32_rtc.h"
|
#include "stm32_rtc.h"
|
||||||
|
|
||||||
@@ -111,6 +113,7 @@ static int stm32_rdtime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
FAR struct rtc_time *rtctime);
|
FAR struct rtc_time *rtctime);
|
||||||
static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
||||||
FAR const struct rtc_time *rtctime);
|
FAR const struct rtc_time *rtctime);
|
||||||
|
static bool stm32_havesettime(FAR struct rtc_lowerhalf_s *lower);
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
static int stm32_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
||||||
@@ -130,6 +133,7 @@ static const struct rtc_ops_s g_rtc_ops =
|
|||||||
{
|
{
|
||||||
.rdtime = stm32_rdtime,
|
.rdtime = stm32_rdtime,
|
||||||
.settime = stm32_settime,
|
.settime = stm32_settime,
|
||||||
|
.havesettime = stm32_havesettime,
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
.setalarm = stm32_setalarm,
|
.setalarm = stm32_setalarm,
|
||||||
.setrelative = stm32_setrelative,
|
.setrelative = stm32_setrelative,
|
||||||
@@ -345,6 +349,25 @@ static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_havesettime
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Implements the havesettime() method of the RTC driver interface
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A reference to RTC lower half driver state structure
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Returns true if RTC date-time have been previously set.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static bool stm32_havesettime(FAR struct rtc_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
return getreg32(RTC_MAGIC_REG) == RTC_MAGIC_TIME_SET;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: stm32_setalarm
|
* Name: stm32_setalarm
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -600,7 +600,7 @@ int up_rtc_initialize(void)
|
|||||||
|
|
||||||
stm32_pwr_enablebkp(true);
|
stm32_pwr_enablebkp(true);
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
/* Some boards do not have the external 32khz oscillator installed, for those
|
/* Some boards do not have the external 32khz oscillator installed, for those
|
||||||
* boards we must fallback to the crummy internal RC clock or the external high
|
* boards we must fallback to the crummy internal RC clock or the external high
|
||||||
@@ -712,7 +712,7 @@ int up_rtc_initialize(void)
|
|||||||
* has been writing to to back-up date register DR0.
|
* has been writing to to back-up date register DR0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
rtcinfo("Do setup\n");
|
rtcinfo("Do setup\n");
|
||||||
|
|
||||||
@@ -1004,6 +1004,15 @@ int stm32_rtc_setdatetime(FAR const struct tm *tp)
|
|||||||
ret = rtc_synchwait();
|
ret = rtc_synchwait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remember that the RTC is initialized and had its time set. */
|
||||||
|
|
||||||
|
if (getreg32(RTC_MAGIC_REG) != RTC_MAGIC_TIME_SET)
|
||||||
|
{
|
||||||
|
stm32_pwr_enablebkp(true);
|
||||||
|
putreg32(RTC_MAGIC_TIME_SET, RTC_MAGIC_REG);
|
||||||
|
stm32_pwr_enablebkp(false);
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-enable the write protection for RTC registers */
|
/* Re-enable the write protection for RTC registers */
|
||||||
|
|
||||||
rtc_wprlock();
|
rtc_wprlock();
|
||||||
|
|||||||
@@ -894,7 +894,7 @@ int up_rtc_initialize(void)
|
|||||||
|
|
||||||
stm32_pwr_enablebkp(true);
|
stm32_pwr_enablebkp(true);
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
/* Some boards do not have the external 32khz oscillator installed,
|
/* Some boards do not have the external 32khz oscillator installed,
|
||||||
* for those boards we must fallback to the crummy internal RC clock
|
* for those boards we must fallback to the crummy internal RC clock
|
||||||
@@ -1011,7 +1011,7 @@ int up_rtc_initialize(void)
|
|||||||
* has been writing to to back-up date register DR0.
|
* has been writing to to back-up date register DR0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
rtcinfo("Do setup\n");
|
rtcinfo("Do setup\n");
|
||||||
|
|
||||||
@@ -1287,6 +1287,15 @@ int stm32_rtc_setdatetime(FAR const struct tm *tp)
|
|||||||
ret = rtc_synchwait();
|
ret = rtc_synchwait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remember that the RTC is initialized and had its time set. */
|
||||||
|
|
||||||
|
if (getreg32(RTC_MAGIC_REG) != RTC_MAGIC_TIME_SET)
|
||||||
|
{
|
||||||
|
stm32_pwr_enablebkp(true);
|
||||||
|
putreg32(RTC_MAGIC_TIME_SET, RTC_MAGIC_REG);
|
||||||
|
stm32_pwr_enablebkp(false);
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-enable the write protection for RTC registers */
|
/* Re-enable the write protection for RTC registers */
|
||||||
|
|
||||||
rtc_wprlock();
|
rtc_wprlock();
|
||||||
|
|||||||
@@ -1832,10 +1832,15 @@ config RTC_MAGIC_REG
|
|||||||
depends on RTC && !STM32F7_HAVE_RTC_COUNTER
|
depends on RTC && !STM32F7_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
config RTC_MAGIC
|
config RTC_MAGIC
|
||||||
hex "Value used as Magic to determine if RTC is set already"
|
hex "Value used as Magic to determine if RTC is already setup"
|
||||||
default 0xfacefeee
|
default 0xfacefeee
|
||||||
depends on RTC && !STM32F7_HAVE_RTC_COUNTER
|
depends on RTC && !STM32F7_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
|
config RTC_MAGIC_TIME_SET
|
||||||
|
hex "Value used as Magic to determine if RTC is setup and have time set"
|
||||||
|
default 0xfacefeef
|
||||||
|
depends on RTC && !STM32F7_HAVE_RTC_COUNTER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "RTC clock source"
|
prompt "RTC clock source"
|
||||||
default STM32F7_RTC_LSECLOCK
|
default STM32F7_RTC_LSECLOCK
|
||||||
@@ -1884,8 +1889,7 @@ config STM32F7_DTCM_PROCFS
|
|||||||
config STM32F7_DMACAPABLE
|
config STM32F7_DMACAPABLE
|
||||||
bool "Workaround non-DMA capable memory"
|
bool "Workaround non-DMA capable memory"
|
||||||
depends on ARCH_DMA
|
depends on ARCH_DMA
|
||||||
default y if !STM32F7_CCMEXCLUDE
|
default n
|
||||||
default n if STM32F7_CCMEXCLUDE
|
|
||||||
---help---
|
---help---
|
||||||
This option enables the DMA interface stm32_dmacapable that can be
|
This option enables the DMA interface stm32_dmacapable that can be
|
||||||
used to check if it is possible to do DMA from the selected address.
|
used to check if it is possible to do DMA from the selected address.
|
||||||
|
|||||||
@@ -635,8 +635,8 @@ struct stm32_ethmac_s
|
|||||||
* 1. Be a multiple of the D-Cache line size. This requirement is assured
|
* 1. Be a multiple of the D-Cache line size. This requirement is assured
|
||||||
* by the definition of RXDMA buffer size above.
|
* by the definition of RXDMA buffer size above.
|
||||||
* 2. Be aligned a D-Cache line boundaries, and
|
* 2. Be aligned a D-Cache line boundaries, and
|
||||||
* 3. Be positioned in DMA-able memory (*NOT* DTCM memory). This must
|
* 3. Be positioned in DMA-able memory. This must be managed by logic
|
||||||
* be managed by logic in the linker script file.
|
* in the linker script file.
|
||||||
*
|
*
|
||||||
* These DMA buffers are defined sequentially here to best assure optimal
|
* These DMA buffers are defined sequentially here to best assure optimal
|
||||||
* packing of the buffers.
|
* packing of the buffers.
|
||||||
|
|||||||
@@ -856,9 +856,13 @@ int up_rtc_initialize(void)
|
|||||||
|
|
||||||
regval = getreg32(RTC_MAGIC_REG);
|
regval = getreg32(RTC_MAGIC_REG);
|
||||||
|
|
||||||
|
/* Enable write access to the backup domain (RTC registers, RTC
|
||||||
|
* backup data registers and backup SRAM).
|
||||||
|
*/
|
||||||
|
|
||||||
stm32_pwr_enablebkp(true);
|
stm32_pwr_enablebkp(true);
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
/* Issue the Backup domain Reset Per Section 5.3.20 DocID028270 Rev 2
|
/* Issue the Backup domain Reset Per Section 5.3.20 DocID028270 Rev 2
|
||||||
* The LSEON, LSEBYP, RTCSEL and RTCEN bits in the RCC backup domain
|
* The LSEON, LSEBYP, RTCSEL and RTCEN bits in the RCC backup domain
|
||||||
@@ -949,8 +953,6 @@ int up_rtc_initialize(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stm32_pwr_enablebkp(false);
|
|
||||||
|
|
||||||
/* Loop, attempting to initialize/resume the RTC. This loop is necessary
|
/* Loop, attempting to initialize/resume the RTC. This loop is necessary
|
||||||
* because it seems that occasionally it takes longer to initialize the
|
* because it seems that occasionally it takes longer to initialize the
|
||||||
* RTC (the actual failure is in rtc_synchwait()).
|
* RTC (the actual failure is in rtc_synchwait()).
|
||||||
@@ -988,7 +990,7 @@ int up_rtc_initialize(void)
|
|||||||
* has been writing to to back-up date register DR0.
|
* has been writing to to back-up date register DR0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (regval != RTC_MAGIC)
|
if (regval != RTC_MAGIC && regval != RTC_MAGIC_TIME_SET)
|
||||||
{
|
{
|
||||||
rtcinfo("Do setup\n");
|
rtcinfo("Do setup\n");
|
||||||
|
|
||||||
@@ -996,12 +998,6 @@ int up_rtc_initialize(void)
|
|||||||
|
|
||||||
ret = rtc_setup();
|
ret = rtc_setup();
|
||||||
|
|
||||||
/* Enable write access to the backup domain (RTC registers, RTC
|
|
||||||
* backup data registers and backup SRAM).
|
|
||||||
*/
|
|
||||||
|
|
||||||
stm32_pwr_enablebkp(true);
|
|
||||||
|
|
||||||
/* Remember that the RTC is initialized */
|
/* Remember that the RTC is initialized */
|
||||||
|
|
||||||
putreg32(RTC_MAGIC, RTC_MAGIC_REG);
|
putreg32(RTC_MAGIC, RTC_MAGIC_REG);
|
||||||
@@ -1297,6 +1293,15 @@ int stm32_rtc_setdatetime(FAR const struct tm *tp)
|
|||||||
ret = rtc_synchwait();
|
ret = rtc_synchwait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remember that the RTC is initialized and had its time set. */
|
||||||
|
|
||||||
|
if (getreg32(RTC_MAGIC_REG) != RTC_MAGIC_TIME_SET)
|
||||||
|
{
|
||||||
|
stm32_pwr_enablebkp(true);
|
||||||
|
putreg32(RTC_MAGIC_TIME_SET, RTC_MAGIC_REG);
|
||||||
|
stm32_pwr_enablebkp(false);
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-enable the write protection for RTC registers */
|
/* Re-enable the write protection for RTC registers */
|
||||||
|
|
||||||
rtc_wprlock();
|
rtc_wprlock();
|
||||||
|
|||||||
@@ -66,11 +66,16 @@
|
|||||||
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_RTC_MAGIC_TIME_SET)
|
||||||
|
# define CONFIG_RTC_MAGIC_TIME_SET (CONFIG_RTC_MAGIC + 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(CONFIG_RTC_MAGIC_REG)
|
#if !defined(CONFIG_RTC_MAGIC_REG)
|
||||||
# define CONFIG_RTC_MAGIC_REG (0)
|
# define CONFIG_RTC_MAGIC_REG (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RTC_MAGIC CONFIG_RTC_MAGIC
|
#define RTC_MAGIC CONFIG_RTC_MAGIC
|
||||||
|
#define RTC_MAGIC_TIME_SET CONFIG_RTC_MAGIC_TIME_SET
|
||||||
#define RTC_MAGIC_REG STM32_RTC_BKR(CONFIG_RTC_MAGIC_REG)
|
#define RTC_MAGIC_REG STM32_RTC_BKR(CONFIG_RTC_MAGIC_REG)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -50,6 +50,8 @@
|
|||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/timers/rtc.h>
|
#include <nuttx/timers/rtc.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include "stm32_rtc.h"
|
#include "stm32_rtc.h"
|
||||||
|
|
||||||
@@ -106,6 +108,7 @@ static int stm32_rdtime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
FAR struct rtc_time *rtctime);
|
FAR struct rtc_time *rtctime);
|
||||||
static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
||||||
FAR const struct rtc_time *rtctime);
|
FAR const struct rtc_time *rtctime);
|
||||||
|
static bool stm32_havesettime(FAR struct rtc_lowerhalf_s *lower);
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
static int stm32_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
||||||
@@ -125,6 +128,7 @@ static const struct rtc_ops_s g_rtc_ops =
|
|||||||
{
|
{
|
||||||
.rdtime = stm32_rdtime,
|
.rdtime = stm32_rdtime,
|
||||||
.settime = stm32_settime,
|
.settime = stm32_settime,
|
||||||
|
.havesettime = stm32_havesettime,
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
.setalarm = stm32_setalarm,
|
.setalarm = stm32_setalarm,
|
||||||
.setrelative = stm32_setrelative,
|
.setrelative = stm32_setrelative,
|
||||||
@@ -314,6 +318,25 @@ static int stm32_settime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_havesettime
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Implements the havesettime() method of the RTC driver interface
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A reference to RTC lower half driver state structure
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Returns true if RTC date-time have been previously set.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static bool stm32_havesettime(FAR struct rtc_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
return getreg32(RTC_MAGIC_REG) == RTC_MAGIC_TIME_SET;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: stm32_setalarm
|
* Name: stm32_setalarm
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -218,6 +218,46 @@
|
|||||||
#ifdef USE_SERIALDRIVER
|
#ifdef USE_SERIALDRIVER
|
||||||
#ifdef HAVE_UART
|
#ifdef HAVE_UART
|
||||||
|
|
||||||
|
/* Warnings for potentially unsafe configuration combinations. */
|
||||||
|
|
||||||
|
/* Combination of RXDMA + IFLOWCONTROL does not work as one might expect.
|
||||||
|
* Since RXDMA uses circular DMA-buffer, DMA will always keep reading new
|
||||||
|
* data from USART peripheral even if DMA buffer underruns. Thus this
|
||||||
|
* combination only does following: RTS is asserted on USART setup and
|
||||||
|
* deasserted on shutdown and does not perform actual RTS flow-control.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_USART1_RXDMA) && defined(CONFIG_USART1_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for USART1. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USART2_RXDMA) && defined(CONFIG_USART2_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for USART2. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USART3_RXDMA) && defined(CONFIG_USART3_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for USART3. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_USART6_RXDMA) && defined(CONFIG_USART6_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for USART6. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_UART7_RXDMA) && defined(CONFIG_UART7_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for UART7. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_UART8_RXDMA) && defined(CONFIG_UART8_IFLOWCONTROL)
|
||||||
|
# warning "RXDMA and IFLOWCONTROL both enabled for UART8. \
|
||||||
|
This combination can lead to data loss."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -228,6 +268,10 @@ struct up_dev_s
|
|||||||
uint16_t ie; /* Saved interrupt mask bits value */
|
uint16_t ie; /* Saved interrupt mask bits value */
|
||||||
uint16_t sr; /* Saved status bits */
|
uint16_t sr; /* Saved status bits */
|
||||||
|
|
||||||
|
/* Has been initialized and HW is setup. */
|
||||||
|
|
||||||
|
bool initialized;
|
||||||
|
|
||||||
/* If termios are supported, then the following fields may vary at
|
/* If termios are supported, then the following fields may vary at
|
||||||
* runtime.
|
* runtime.
|
||||||
*/
|
*/
|
||||||
@@ -379,8 +423,7 @@ static const struct uart_ops_s g_uart_dma_ops =
|
|||||||
* 1. Be a multiple of the D-Cache line size. This requirement is assured
|
* 1. Be a multiple of the D-Cache line size. This requirement is assured
|
||||||
* by the definition of RXDMA buffer size above.
|
* by the definition of RXDMA buffer size above.
|
||||||
* 2. Be aligned a D-Cache line boundaries, and
|
* 2. Be aligned a D-Cache line boundaries, and
|
||||||
* 3. Be positioned in DMA-able memory (*NOT* DTCM memory). This must
|
* 3. Be positioned in DMA-able memory.
|
||||||
* be managed by logic in the linker script file.
|
|
||||||
*
|
*
|
||||||
* These DMA buffers are defined sequentially here to best assure optimal
|
* These DMA buffers are defined sequentially here to best assure optimal
|
||||||
* packing of the buffers.
|
* packing of the buffers.
|
||||||
@@ -879,11 +922,11 @@ static struct up_dev_s g_uart7priv =
|
|||||||
.usartbase = STM32_UART7_BASE,
|
.usartbase = STM32_UART7_BASE,
|
||||||
.tx_gpio = GPIO_UART7_TX,
|
.tx_gpio = GPIO_UART7_TX,
|
||||||
.rx_gpio = GPIO_UART7_RX,
|
.rx_gpio = GPIO_UART7_RX,
|
||||||
#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_USART7_OFLOWCONTROL)
|
#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_UART7_OFLOWCONTROL)
|
||||||
.oflow = true,
|
.oflow = true,
|
||||||
.cts_gpio = GPIO_UART7_CTS,
|
.cts_gpio = GPIO_UART7_CTS,
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_USART7_IFLOWCONTROL)
|
#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_UART7_IFLOWCONTROL)
|
||||||
.iflow = true,
|
.iflow = true,
|
||||||
.rts_gpio = GPIO_UART7_RTS,
|
.rts_gpio = GPIO_UART7_RTS,
|
||||||
#endif
|
#endif
|
||||||
@@ -940,11 +983,11 @@ static struct up_dev_s g_uart8priv =
|
|||||||
.usartbase = STM32_UART8_BASE,
|
.usartbase = STM32_UART8_BASE,
|
||||||
.tx_gpio = GPIO_UART8_TX,
|
.tx_gpio = GPIO_UART8_TX,
|
||||||
.rx_gpio = GPIO_UART8_RX,
|
.rx_gpio = GPIO_UART8_RX,
|
||||||
#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_USART8_OFLOWCONTROL)
|
#if defined(CONFIG_SERIAL_OFLOWCONTROL) && defined(CONFIG_UART8_OFLOWCONTROL)
|
||||||
.oflow = true,
|
.oflow = true,
|
||||||
.cts_gpio = GPIO_UART8_CTS,
|
.cts_gpio = GPIO_UART8_CTS,
|
||||||
#endif
|
#endif
|
||||||
#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_USART8_IFLOWCONTROL)
|
#if defined(CONFIG_SERIAL_IFLOWCONTROL) && defined(CONFIG_UART8_IFLOWCONTROL)
|
||||||
.iflow = true,
|
.iflow = true,
|
||||||
.rts_gpio = GPIO_UART8_RTS,
|
.rts_gpio = GPIO_UART8_RTS,
|
||||||
#endif
|
#endif
|
||||||
@@ -1460,6 +1503,11 @@ static int up_setup(struct uart_dev_s *dev)
|
|||||||
/* Set up the cached interrupt enables value */
|
/* Set up the cached interrupt enables value */
|
||||||
|
|
||||||
priv->ie = 0;
|
priv->ie = 0;
|
||||||
|
|
||||||
|
/* Mark device as initialized. */
|
||||||
|
|
||||||
|
priv->initialized = true;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1539,6 +1587,10 @@ static void up_shutdown(struct uart_dev_s *dev)
|
|||||||
struct up_dev_s *priv = (struct up_dev_s *)dev->priv;
|
struct up_dev_s *priv = (struct up_dev_s *)dev->priv;
|
||||||
uint32_t regval;
|
uint32_t regval;
|
||||||
|
|
||||||
|
/* Mark device as uninitialized. */
|
||||||
|
|
||||||
|
priv->initialized = false;
|
||||||
|
|
||||||
/* Disable all interrupts */
|
/* Disable all interrupts */
|
||||||
|
|
||||||
up_disableusartint(priv, NULL);
|
up_disableusartint(priv, NULL);
|
||||||
@@ -2529,6 +2581,31 @@ static int up_pm_prepare(struct pm_callback_s *cb, int domain,
|
|||||||
|
|
||||||
#ifdef USE_SERIALDRIVER
|
#ifdef USE_SERIALDRIVER
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_serial_get_uart
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get serial driver structure for STM32 USART
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
FAR uart_dev_t *stm32_serial_get_uart(int uart_num)
|
||||||
|
{
|
||||||
|
int uart_idx = uart_num - 1;
|
||||||
|
|
||||||
|
if (uart_idx < 0 || uart_idx >= STM32_NSERIAL || !uart_devs[uart_idx])
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uart_devs[uart_idx]->initialized)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &uart_devs[uart_idx]->dev;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_earlyserialinit
|
* Name: up_earlyserialinit
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
#include <nuttx/serial/serial.h>
|
||||||
|
|
||||||
#include "chip/stm32_uart.h"
|
#include "chip/stm32_uart.h"
|
||||||
|
|
||||||
@@ -319,6 +320,16 @@ extern "C"
|
|||||||
* Public Functions
|
* Public Functions
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: stm32_serial_get_uart
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get serial driver structure for STM32 USART
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
FAR uart_dev_t *stm32_serial_get_uart(int uart_num);
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Name: stm32_serial_dma_poll
|
* Name: stm32_serial_dma_poll
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -171,6 +171,19 @@ struct tm;
|
|||||||
int stm32l4_rtc_setdatetime(FAR const struct tm *tp);
|
int stm32l4_rtc_setdatetime(FAR const struct tm *tp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32l4_rtc_setdatetime
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if RTC time has been set.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Returns true if RTC date-time have been previously set.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
bool stm32l4_rtc_havesettime(void);
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: stm32l4_rtc_setalarm
|
* Name: stm32l4_rtc_setalarm
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ static int stm32l4_rdtime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
FAR struct rtc_time *rtctime);
|
FAR struct rtc_time *rtctime);
|
||||||
static int stm32l4_settime(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32l4_settime(FAR struct rtc_lowerhalf_s *lower,
|
||||||
FAR const struct rtc_time *rtctime);
|
FAR const struct rtc_time *rtctime);
|
||||||
|
static bool stm32l4_havesettime(FAR struct rtc_lowerhalf_s *lower);
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
static int stm32l4_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
static int stm32l4_setalarm(FAR struct rtc_lowerhalf_s *lower,
|
||||||
@@ -127,6 +128,7 @@ static const struct rtc_ops_s g_rtc_ops =
|
|||||||
{
|
{
|
||||||
.rdtime = stm32l4_rdtime,
|
.rdtime = stm32l4_rdtime,
|
||||||
.settime = stm32l4_settime,
|
.settime = stm32l4_settime,
|
||||||
|
.havesettime = stm32l4_havesettime,
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
.setalarm = stm32l4_setalarm,
|
.setalarm = stm32l4_setalarm,
|
||||||
.setrelative = stm32l4_setrelative,
|
.setrelative = stm32l4_setrelative,
|
||||||
@@ -279,6 +281,25 @@ static int stm32l4_settime(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32l4_havesettime
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Implements the havesettime() method of the RTC driver interface
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - A reference to RTC lower half driver state structure
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Returns true if RTC date-time have been previously set.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static bool stm32l4_havesettime(FAR struct rtc_lowerhalf_s *lower)
|
||||||
|
{
|
||||||
|
return stm32l4_rtc_havesettime();
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: stm32l4_setalarm
|
* Name: stm32l4_setalarm
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
# define CONFIG_RTC_MAGIC (0xfacefeee)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_RTC_MAGIC_TIME_SET)
|
||||||
|
# define CONFIG_RTC_MAGIC_TIME_SET (CONFIG_RTC_MAGIC + 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(CONFIG_RTC_MAGIC_REG)
|
#if !defined(CONFIG_RTC_MAGIC_REG)
|
||||||
# define CONFIG_RTC_MAGIC_REG (0)
|
# define CONFIG_RTC_MAGIC_REG (0)
|
||||||
#endif
|
#endif
|
||||||
@@ -865,7 +869,7 @@ int up_rtc_initialize(void)
|
|||||||
|
|
||||||
init_stat = rtc_is_inits();
|
init_stat = rtc_is_inits();
|
||||||
|
|
||||||
if(!init_stat)
|
if (!init_stat)
|
||||||
{
|
{
|
||||||
/* Enable write access to the backup domain (RTC registers, RTC
|
/* Enable write access to the backup domain (RTC registers, RTC
|
||||||
* backup data registers and backup SRAM).
|
* backup data registers and backup SRAM).
|
||||||
@@ -1210,6 +1214,15 @@ int stm32l4_rtc_setdatetime(FAR const struct tm *tp)
|
|||||||
ret = rtc_synchwait();
|
ret = rtc_synchwait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remember that the RTC is initialized and had its time set. */
|
||||||
|
|
||||||
|
if (getreg32(CONFIG_RTC_MAGIC_REG) != CONFIG_RTC_MAGIC_TIME_SET)
|
||||||
|
{
|
||||||
|
stm32l4_pwr_enablebkp(true);
|
||||||
|
putreg32(CONFIG_RTC_MAGIC_TIME_SET, CONFIG_RTC_MAGIC_REG);
|
||||||
|
stm32l4_pwr_enablebkp(false);
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-enable the write protection for RTC registers */
|
/* Re-enable the write protection for RTC registers */
|
||||||
|
|
||||||
rtc_wprlock();
|
rtc_wprlock();
|
||||||
@@ -1217,6 +1230,22 @@ int stm32l4_rtc_setdatetime(FAR const struct tm *tp)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: stm32l4_rtc_setdatetime
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if RTC time has been set.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Returns true if RTC date-time have been previously set.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
bool stm32l4_rtc_havesettime(void)
|
||||||
|
{
|
||||||
|
return getreg32(CONFIG_RTC_MAGIC_REG) == CONFIG_RTC_MAGIC_TIME_SET;
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Name: up_rtc_settime
|
* Name: up_rtc_settime
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -813,6 +813,12 @@ sixlowpan
|
|||||||
6loWPAN stack. It enables networking with 6loWPAN support and uses
|
6loWPAN stack. It enables networking with 6loWPAN support and uses
|
||||||
only a IEEE802.15.4 MAC loopback network device to supported testing.
|
only a IEEE802.15.4 MAC loopback network device to supported testing.
|
||||||
|
|
||||||
|
This configuration includes apps/examples/nettest and apps/examples/udpblaster.
|
||||||
|
Neither are truly functional. The only intent of this configuration
|
||||||
|
is to verify that the 6loWPAN stack correctly encodes IEEE802.15.4
|
||||||
|
packets on output to the loopback device and correct decodes the
|
||||||
|
returned packet.
|
||||||
|
|
||||||
touchscreen
|
touchscreen
|
||||||
|
|
||||||
This configuration uses the simple touchscreen test at
|
This configuration uses the simple touchscreen test at
|
||||||
|
|||||||
@@ -525,6 +525,10 @@ CONFIG_NETDEV_PHY_IOCTL=y
|
|||||||
# CONFIG_NET_IPv4 is not set
|
# CONFIG_NET_IPv4 is not set
|
||||||
CONFIG_NET_IPv6=y
|
CONFIG_NET_IPv6=y
|
||||||
CONFIG_NET_IPv6_NCONF_ENTRIES=8
|
CONFIG_NET_IPv6_NCONF_ENTRIES=8
|
||||||
|
|
||||||
|
#
|
||||||
|
# 6LoWPAN Configuration
|
||||||
|
#
|
||||||
CONFIG_NET_6LOWPAN_FRAG=y
|
CONFIG_NET_6LOWPAN_FRAG=y
|
||||||
CONFIG_NET_6LOWPAN_FRAMELEN=127
|
CONFIG_NET_6LOWPAN_FRAMELEN=127
|
||||||
# CONFIG_NET_6LOWPAN_COMPRESSION_IPv6 is not set
|
# CONFIG_NET_6LOWPAN_COMPRESSION_IPv6 is not set
|
||||||
@@ -882,6 +886,7 @@ CONFIG_EXAMPLES_NETTEST_IPv6=y
|
|||||||
#
|
#
|
||||||
# Target IPv6 address
|
# Target IPv6 address
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Client IPv6 address
|
# Client IPv6 address
|
||||||
#
|
#
|
||||||
@@ -922,7 +927,36 @@ CONFIG_EXAMPLES_NSH=y
|
|||||||
# CONFIG_EXAMPLES_TIFF is not set
|
# CONFIG_EXAMPLES_TIFF is not set
|
||||||
# CONFIG_EXAMPLES_TOUCHSCREEN is not set
|
# CONFIG_EXAMPLES_TOUCHSCREEN is not set
|
||||||
# CONFIG_EXAMPLES_UDP is not set
|
# CONFIG_EXAMPLES_UDP is not set
|
||||||
# CONFIG_EXAMPLES_UDPBLASTER is not set
|
CONFIG_EXAMPLES_UDPBLASTER=y
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_STACKSIZE=8192
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_PRIORITY=100
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTRATE=800000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_IPv6=y
|
||||||
|
# CONFIG_EXAMPLES_UDPBLASTER_INIT is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Target IPv6 address
|
||||||
|
#
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_1=0xfe80
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_2=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_3=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_4=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_5=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_6=0x00ff
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_7=0xfe00
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_8=0xa9cd
|
||||||
|
|
||||||
|
#
|
||||||
|
# Router IPv6 address
|
||||||
|
#
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_1=0xfe80
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_2=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_3=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_4=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_5=0x0000
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_6=0x00ff
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_7=0xfe00
|
||||||
|
CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_8=0x1034
|
||||||
# CONFIG_EXAMPLES_USBSERIAL is not set
|
# CONFIG_EXAMPLES_USBSERIAL is not set
|
||||||
# CONFIG_EXAMPLES_WATCHDOG is not set
|
# CONFIG_EXAMPLES_WATCHDOG is not set
|
||||||
# CONFIG_EXAMPLES_WEBSERVER is not set
|
# CONFIG_EXAMPLES_WEBSERVER is not set
|
||||||
|
|||||||
@@ -744,7 +744,7 @@ CONFIG_ARCH_HAVE_SPI_BITORDER=y
|
|||||||
# CONFIG_SENSORS is not set
|
# CONFIG_SENSORS is not set
|
||||||
CONFIG_SERIAL=y
|
CONFIG_SERIAL=y
|
||||||
CONFIG_SERIAL_REMOVABLE=y
|
CONFIG_SERIAL_REMOVABLE=y
|
||||||
CONFIG_SERIAL_CONSOLE=y
|
# CONFIG_SERIAL_CONSOLE is not set
|
||||||
# CONFIG_16550_UART is not set
|
# CONFIG_16550_UART is not set
|
||||||
# CONFIG_UART_SERIALDRIVER is not set
|
# CONFIG_UART_SERIALDRIVER is not set
|
||||||
# CONFIG_UART0_SERIALDRIVER is not set
|
# CONFIG_UART0_SERIALDRIVER is not set
|
||||||
@@ -774,9 +774,9 @@ CONFIG_STANDARD_SERIAL=y
|
|||||||
# CONFIG_SERIAL_OFLOWCONTROL is not set
|
# CONFIG_SERIAL_OFLOWCONTROL is not set
|
||||||
# CONFIG_SERIAL_DMA is not set
|
# CONFIG_SERIAL_DMA is not set
|
||||||
CONFIG_ARCH_HAVE_SERIAL_TERMIOS=y
|
CONFIG_ARCH_HAVE_SERIAL_TERMIOS=y
|
||||||
CONFIG_USART1_SERIAL_CONSOLE=y
|
# CONFIG_USART1_SERIAL_CONSOLE is not set
|
||||||
# CONFIG_OTHER_SERIAL_CONSOLE is not set
|
# CONFIG_OTHER_SERIAL_CONSOLE is not set
|
||||||
# CONFIG_NO_SERIAL_CONSOLE is not set
|
CONFIG_NO_SERIAL_CONSOLE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USART1 Configuration
|
# USART1 Configuration
|
||||||
|
|||||||
@@ -1577,7 +1577,7 @@ config USART6_2STOP
|
|||||||
1=Two stop bits
|
1=Two stop bits
|
||||||
|
|
||||||
config USART6_IFLOWCONTROL
|
config USART6_IFLOWCONTROL
|
||||||
bool "UART6 RTS flow control"
|
bool "USART6 RTS flow control"
|
||||||
default n
|
default n
|
||||||
select SERIAL_IFLOWCONTROL
|
select SERIAL_IFLOWCONTROL
|
||||||
---help---
|
---help---
|
||||||
|
|||||||
+19
-1
@@ -332,7 +332,7 @@ static int rtc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
/* RTC_SET_TIME sets the RTC's time
|
/* RTC_SET_TIME sets the RTC's time
|
||||||
*
|
*
|
||||||
* Argument: A read-only reference to a struct rtc_time containing the
|
* Argument: A read-only reference to a struct rtc_time containing
|
||||||
* the new time to be set.
|
* the new time to be set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -348,6 +348,24 @@ static int rtc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* RTC_HAVE_SET_TIME checks if RTC's time had been set
|
||||||
|
*
|
||||||
|
* Argument: A writable reference to a bool to receive true/false return
|
||||||
|
* value of the check.
|
||||||
|
*/
|
||||||
|
|
||||||
|
case RTC_HAVE_SET_TIME:
|
||||||
|
{
|
||||||
|
FAR bool *have_set_time = (FAR bool *)((uintptr_t)arg);
|
||||||
|
|
||||||
|
if (ops->havesettime)
|
||||||
|
{
|
||||||
|
*have_set_time = ops->havesettime(upper->lower);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
/* RTC_SET_ALARM sets the alarm time.
|
/* RTC_SET_ALARM sets the alarm time.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -145,13 +145,22 @@
|
|||||||
|
|
||||||
#define RTC_SET_TIME _RTCIOC(0x0002)
|
#define RTC_SET_TIME _RTCIOC(0x0002)
|
||||||
|
|
||||||
|
|
||||||
|
/* RTC_HAVE_SET_TIME checks if RTC's time had been set
|
||||||
|
*
|
||||||
|
* Argument: A writable reference to a bool to receive true/false return value
|
||||||
|
* of the check.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define RTC_HAVE_SET_TIME _RTCIOC(0x0003)
|
||||||
|
|
||||||
/* RTC_SET_ALARM sets the alarm time (for RTCs that support alarms).
|
/* RTC_SET_ALARM sets the alarm time (for RTCs that support alarms).
|
||||||
*
|
*
|
||||||
* Argument: A read-only reference to a struct rtc_setalarm_s containing the
|
* Argument: A read-only reference to a struct rtc_setalarm_s containing the
|
||||||
* new alarm time to be set.
|
* new alarm time to be set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_SET_ALARM _RTCIOC(0x0003)
|
#define RTC_SET_ALARM _RTCIOC(0x0004)
|
||||||
|
|
||||||
/* RTC_SET_RELATIVE sets the alarm time relative to the current time.
|
/* RTC_SET_RELATIVE sets the alarm time relative to the current time.
|
||||||
*
|
*
|
||||||
@@ -159,14 +168,14 @@
|
|||||||
* new relative alarm time to be set.
|
* new relative alarm time to be set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_SET_RELATIVE _RTCIOC(0x0004)
|
#define RTC_SET_RELATIVE _RTCIOC(0x0005)
|
||||||
|
|
||||||
/* RTC_SET_RELATIVE cancel the alarm.
|
/* RTC_SET_RELATIVE cancel the alarm.
|
||||||
*
|
*
|
||||||
* Argument: An ALARM ID value that indicates which alarm should be canceled.
|
* Argument: An ALARM ID value that indicates which alarm should be canceled.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_CANCEL_ALARM _RTCIOC(0x0005)
|
#define RTC_CANCEL_ALARM _RTCIOC(0x0006)
|
||||||
|
|
||||||
/* Architecture-specific RTC IOCTLS should begin at RTC_USER_IOCBASE. For
|
/* Architecture-specific RTC IOCTLS should begin at RTC_USER_IOCBASE. For
|
||||||
* example:
|
* example:
|
||||||
@@ -176,7 +185,7 @@
|
|||||||
* etc.
|
* etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_USER_IOCBASE 0x0006
|
#define RTC_USER_IOCBASE 0x0007
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
@@ -291,6 +300,10 @@ struct rtc_ops_s
|
|||||||
CODE int (*settime)(FAR struct rtc_lowerhalf_s *lower,
|
CODE int (*settime)(FAR struct rtc_lowerhalf_s *lower,
|
||||||
FAR const struct rtc_time *rtctime);
|
FAR const struct rtc_time *rtctime);
|
||||||
|
|
||||||
|
/* havesettime checks if RTC time have been set */
|
||||||
|
|
||||||
|
CODE bool (*havesettime)(FAR struct rtc_lowerhalf_s *lower);
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_ALARM
|
#ifdef CONFIG_RTC_ALARM
|
||||||
/* setalarm sets up a new alarm. */
|
/* setalarm sets up a new alarm. */
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,10 @@
|
|||||||
#include <nuttx/net/netdev.h>
|
#include <nuttx/net/netdev.h>
|
||||||
#include <nuttx/net/arp.h>
|
#include <nuttx/net/arp.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_6LOWPAN
|
||||||
|
# include <nuttx/net/sixlowpan.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NET_IGMP
|
#ifdef CONFIG_NET_IGMP
|
||||||
# include <sys/sockio.h>
|
# include <sys/sockio.h>
|
||||||
# include <nuttx/net/igmp.h>
|
# include <nuttx/net/igmp.h>
|
||||||
@@ -702,16 +706,47 @@ static int netdev_ifrioctl(FAR struct socket *psock, int cmd,
|
|||||||
|
|
||||||
/* MAC address operations only make sense if Ethernet is supported */
|
/* MAC address operations only make sense if Ethernet is supported */
|
||||||
|
|
||||||
#ifdef CONFIG_NET_ETHERNET
|
#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN)
|
||||||
case SIOCGIFHWADDR: /* Get hardware address */
|
case SIOCGIFHWADDR: /* Get hardware address */
|
||||||
{
|
{
|
||||||
dev = netdev_ifrdev(req);
|
dev = netdev_ifrdev(req);
|
||||||
if (dev)
|
if (dev)
|
||||||
{
|
{
|
||||||
req->ifr_hwaddr.sa_family = AF_INETX;
|
#ifdef CONFIG_NET_ETHERNET
|
||||||
memcpy(req->ifr_hwaddr.sa_data,
|
#ifdef CONFIG_NET_MULTILINK
|
||||||
dev->d_mac.ether_addr_octet, IFHWADDRLEN);
|
if (dev->d_lltype == NET_LL_ETHERNET)
|
||||||
ret = OK;
|
#else
|
||||||
|
if (true)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
req->ifr_hwaddr.sa_family = AF_INETX;
|
||||||
|
memcpy(req->ifr_hwaddr.sa_data,
|
||||||
|
dev->d_mac.ether_addr_octet, IFHWADDRLEN);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_6LOWPAN
|
||||||
|
#ifdef CONFIG_NET_MULTILINK
|
||||||
|
if (dev->d_lltype == NET_LL_IEEE802154)
|
||||||
|
#else
|
||||||
|
if (true)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FAR struct ieee802154_driver_s *ieee =
|
||||||
|
(FAR struct ieee802154_driver_s *)dev;
|
||||||
|
|
||||||
|
req->ifr_hwaddr.sa_family = AF_INETX;
|
||||||
|
memcpy(req->ifr_hwaddr.sa_data, ieee->i_nodeaddr.u8,
|
||||||
|
CONFIG_NET_6LOWPAN_RIMEADDR_SIZE);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
nerr("Unsupported link layer\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -721,9 +756,40 @@ static int netdev_ifrioctl(FAR struct socket *psock, int cmd,
|
|||||||
dev = netdev_ifrdev(req);
|
dev = netdev_ifrdev(req);
|
||||||
if (dev)
|
if (dev)
|
||||||
{
|
{
|
||||||
memcpy(dev->d_mac.ether_addr_octet,
|
#ifdef CONFIG_NET_ETHERNET
|
||||||
req->ifr_hwaddr.sa_data, IFHWADDRLEN);
|
#ifdef CONFIG_NET_MULTILINK
|
||||||
ret = OK;
|
if (dev->d_lltype == NET_LL_ETHERNET)
|
||||||
|
#else
|
||||||
|
if (true)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy(dev->d_mac.ether_addr_octet,
|
||||||
|
req->ifr_hwaddr.sa_data, IFHWADDRLEN);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_6LOWPAN
|
||||||
|
#ifdef CONFIG_NET_MULTILINK
|
||||||
|
if (dev->d_lltype == NET_LL_IEEE802154)
|
||||||
|
#else
|
||||||
|
if (true)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FAR struct ieee802154_driver_s *ieee =
|
||||||
|
(FAR struct ieee802154_driver_s *)dev;
|
||||||
|
|
||||||
|
req->ifr_hwaddr.sa_family = AF_INETX;
|
||||||
|
memcpy(ieee->i_nodeaddr.u8, req->ifr_hwaddr.sa_data,
|
||||||
|
CONFIG_NET_6LOWPAN_RIMEADDR_SIZE);
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
nerr("Unsupported link layer\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ static void sixlowpan_compress_ipv6hdr(FAR struct ieee802154_driver_s *ieee,
|
|||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* ieee - The IEEE802.15.4 MAC driver instance
|
* ieee - The IEEE802.15.4 MAC driver instance
|
||||||
* ipv6hdr - IPv6 header followed by TCP or UDP header.
|
* ipv6hdr - IPv6 header followed by TCP, UDP, or ICMPv6 header.
|
||||||
* buf - Beginning of the packet packet to send (with IPv6 + protocol
|
* buf - Beginning of the packet packet to send (with IPv6 + protocol
|
||||||
* headers)
|
* headers)
|
||||||
* buflen - Length of data to send (include IPv6 and protocol headers)
|
* buflen - Length of data to send (include IPv6 and protocol headers)
|
||||||
|
|||||||
@@ -116,7 +116,8 @@
|
|||||||
*
|
*
|
||||||
* Input Parmeters:
|
* Input Parmeters:
|
||||||
* ieee - A reference to the IEE802.15.4 network device state
|
* ieee - A reference to the IEE802.15.4 network device state
|
||||||
* ipv6 - The IPv6 header to be compressed
|
* ipv6 - The IPv6 header followd by TCP, UDP, or ICMPv6 header to be
|
||||||
|
* compressed
|
||||||
* destmac - L2 destination address, needed to compress the IP
|
* destmac - L2 destination address, needed to compress the IP
|
||||||
* destination field
|
* destination field
|
||||||
* fptr - Pointer to frame to be compressed.
|
* fptr - Pointer to frame to be compressed.
|
||||||
@@ -189,7 +190,8 @@ void sixlowpan_compresshdr_hc1(FAR struct ieee802154_driver_s *ieee,
|
|||||||
#if CONFIG_NET_UDP
|
#if CONFIG_NET_UDP
|
||||||
case IP_PROTO_UDP:
|
case IP_PROTO_UDP:
|
||||||
{
|
{
|
||||||
FAR struct udp_hdr_s *udp = UDPIPv6BUF(&ieee->i_dev);
|
FAR struct udp_hdr_s *udp =
|
||||||
|
&(((FAR struct ipv6udp_hdr_s *)ipv6)->udp);
|
||||||
|
|
||||||
/* Try to compress UDP header (we do only full compression).
|
/* Try to compress UDP header (we do only full compression).
|
||||||
* This is feasible if both src and dest ports are between
|
* This is feasible if both src and dest ports are between
|
||||||
@@ -199,10 +201,10 @@ void sixlowpan_compresshdr_hc1(FAR struct ieee802154_driver_s *ieee,
|
|||||||
|
|
||||||
ninfo("local/remote port %u/%u\n", udp->srcport, udp->destport);
|
ninfo("local/remote port %u/%u\n", udp->srcport, udp->destport);
|
||||||
|
|
||||||
if (htons(udp->srcport) >= CONFIG_NET_6LOWPAN_MINPORT &&
|
if (ntohs(udp->srcport) >= CONFIG_NET_6LOWPAN_MINPORT &&
|
||||||
htons(udp->srcport) < (CONFIG_NET_6LOWPAN_MINPORT + 16) &&
|
ntohs(udp->srcport) < (CONFIG_NET_6LOWPAN_MINPORT + 16) &&
|
||||||
htons(udp->destport) >= CONFIG_NET_6LOWPAN_MINPORT &&
|
ntohs(udp->destport) >= CONFIG_NET_6LOWPAN_MINPORT &&
|
||||||
htons(udp->destport) < (CONFIG_NET_6LOWPAN_MINPORT + 16))
|
ntohs(udp->destport) < (CONFIG_NET_6LOWPAN_MINPORT + 16))
|
||||||
{
|
{
|
||||||
FAR uint8_t *hcudp = fptr + g_frame_hdrlen;
|
FAR uint8_t *hcudp = fptr + g_frame_hdrlen;
|
||||||
|
|
||||||
@@ -215,8 +217,8 @@ void sixlowpan_compresshdr_hc1(FAR struct ieee802154_driver_s *ieee,
|
|||||||
hcudp[RIME_HC1_HC_UDP_UDP_ENCODING] = 0xe0;
|
hcudp[RIME_HC1_HC_UDP_UDP_ENCODING] = 0xe0;
|
||||||
hcudp[RIME_HC1_HC_UDP_TTL] = ipv6->ttl;
|
hcudp[RIME_HC1_HC_UDP_TTL] = ipv6->ttl;
|
||||||
hcudp[RIME_HC1_HC_UDP_PORTS] =
|
hcudp[RIME_HC1_HC_UDP_PORTS] =
|
||||||
(uint8_t)((htons(udp->srcport) - CONFIG_NET_6LOWPAN_MINPORT) << 4) +
|
(uint8_t)((ntohs(udp->srcport) - CONFIG_NET_6LOWPAN_MINPORT) << 4) +
|
||||||
(uint8_t)((htons(udp->destport) - CONFIG_NET_6LOWPAN_MINPORT));
|
(uint8_t)((ntohs(udp->destport) - CONFIG_NET_6LOWPAN_MINPORT));
|
||||||
|
|
||||||
memcpy(&hcudp[RIME_HC1_HC_UDP_CHKSUM], &udp->udpchksum, 2);
|
memcpy(&hcudp[RIME_HC1_HC_UDP_CHKSUM], &udp->udpchksum, 2);
|
||||||
|
|
||||||
|
|||||||
@@ -462,12 +462,21 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee,
|
|||||||
|
|
||||||
if (hc1[RIME_HC1_DISPATCH] == SIXLOWPAN_DISPATCH_IPV6)
|
if (hc1[RIME_HC1_DISPATCH] == SIXLOWPAN_DISPATCH_IPV6)
|
||||||
{
|
{
|
||||||
ninfo("IPV6 Dispatch\n");
|
FAR struct ipv6_hdr_s *ipv6 = IPv6BUF(&ieee->i_dev);
|
||||||
|
|
||||||
|
ninfo("IPv6 Dispatch\n");
|
||||||
g_frame_hdrlen += SIXLOWPAN_IPV6_HDR_LEN;
|
g_frame_hdrlen += SIXLOWPAN_IPV6_HDR_LEN;
|
||||||
|
|
||||||
|
/* payptr was set up to begin just after the IPHC bytes. However,
|
||||||
|
* those bytes are not present for the case of IPv6 dispatch. Just
|
||||||
|
* reset back to the begnning of the buffer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
payptr = iob->io_data;
|
||||||
|
|
||||||
/* Put uncompressed IP header in d_buf. */
|
/* Put uncompressed IP header in d_buf. */
|
||||||
|
|
||||||
memcpy(ieee->i_dev.d_buf, payptr + g_frame_hdrlen, IPv6_HDRLEN);
|
memcpy(ipv6, payptr + g_frame_hdrlen, IPv6_HDRLEN);
|
||||||
|
|
||||||
/* Update g_uncomp_hdrlen and g_frame_hdrlen. */
|
/* Update g_uncomp_hdrlen and g_frame_hdrlen. */
|
||||||
|
|
||||||
|
|||||||
@@ -446,6 +446,7 @@ extern struct rimeaddr_s g_pktaddrs[PACKETBUF_NUM_ADDRS];
|
|||||||
|
|
||||||
struct net_driver_s; /* Forward reference */
|
struct net_driver_s; /* Forward reference */
|
||||||
struct ieee802154_driver_s; /* Forward reference */
|
struct ieee802154_driver_s; /* Forward reference */
|
||||||
|
struct devif_callback_s; /* Forward reference */
|
||||||
struct ipv6_hdr_s; /* Forward reference */
|
struct ipv6_hdr_s; /* Forward reference */
|
||||||
struct rimeaddr_s; /* Forward reference */
|
struct rimeaddr_s; /* Forward reference */
|
||||||
struct iob_s; /* Forward reference */
|
struct iob_s; /* Forward reference */
|
||||||
@@ -466,7 +467,8 @@ struct iob_s; /* Forward reference */
|
|||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - The IEEE802.15.4 MAC network driver interface.
|
* dev - The IEEE802.15.4 MAC network driver interface.
|
||||||
* destip - IPv6 plus TCP or UDP headers.
|
* list - Head of callback list for send interrupt
|
||||||
|
* ipv6hdr - IPv6 plus TCP or UDP headers.
|
||||||
* buf - Data to send
|
* buf - Data to send
|
||||||
* buflen - Length of data to send
|
* buflen - Length of data to send
|
||||||
* raddr - The MAC address of the destination
|
* raddr - The MAC address of the destination
|
||||||
@@ -484,7 +486,8 @@ struct iob_s; /* Forward reference */
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int sixlowpan_send(FAR struct net_driver_s *dev,
|
int sixlowpan_send(FAR struct net_driver_s *dev,
|
||||||
FAR const struct ipv6_hdr_s *destip, FAR const void *buf,
|
FAR struct devif_callback_s **list,
|
||||||
|
FAR const struct ipv6_hdr_s *ipv6hdr, FAR const void *buf,
|
||||||
size_t buflen, FAR const struct rimeaddr_s *raddr,
|
size_t buflen, FAR const struct rimeaddr_s *raddr,
|
||||||
uint16_t timeout);
|
uint16_t timeout);
|
||||||
|
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ static uint16_t send_interrupt(FAR struct net_driver_s *dev,
|
|||||||
{
|
{
|
||||||
DEBUGASSERT((flags & WPAN_POLL) != 0);
|
DEBUGASSERT((flags & WPAN_POLL) != 0);
|
||||||
|
|
||||||
/* Transfer the frame listto the IEEE802.15.4 MAC device */
|
/* Transfer the frame list to the IEEE802.15.4 MAC device */
|
||||||
|
|
||||||
sinfo->s_result =
|
sinfo->s_result =
|
||||||
sixlowpan_queue_frames((FAR struct ieee802154_driver_s *)dev,
|
sixlowpan_queue_frames((FAR struct ieee802154_driver_s *)dev,
|
||||||
@@ -237,6 +237,7 @@ end_wait:
|
|||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - The IEEE802.15.4 MAC network driver interface.
|
* dev - The IEEE802.15.4 MAC network driver interface.
|
||||||
|
* list - Head of callback list for send interrupt
|
||||||
* ipv6hdr - IPv6 header followed by TCP or UDP header.
|
* ipv6hdr - IPv6 header followed by TCP or UDP header.
|
||||||
* buf - Data to send
|
* buf - Data to send
|
||||||
* len - Length of data to send
|
* len - Length of data to send
|
||||||
@@ -255,6 +256,7 @@ end_wait:
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int sixlowpan_send(FAR struct net_driver_s *dev,
|
int sixlowpan_send(FAR struct net_driver_s *dev,
|
||||||
|
FAR struct devif_callback_s **list,
|
||||||
FAR const struct ipv6_hdr_s *ipv6hdr, FAR const void *buf,
|
FAR const struct ipv6_hdr_s *ipv6hdr, FAR const void *buf,
|
||||||
size_t len, FAR const struct rimeaddr_s *destmac,
|
size_t len, FAR const struct rimeaddr_s *destmac,
|
||||||
uint16_t timeout)
|
uint16_t timeout)
|
||||||
@@ -283,7 +285,7 @@ int sixlowpan_send(FAR struct net_driver_s *dev,
|
|||||||
* device related events, no connect-related events.
|
* device related events, no connect-related events.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sinfo.s_cb = devif_callback_alloc(dev, NULL);
|
sinfo.s_cb = devif_callback_alloc(dev, list);
|
||||||
if (sinfo.s_cb != NULL)
|
if (sinfo.s_cb != NULL)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -312,7 +314,7 @@ int sixlowpan_send(FAR struct net_driver_s *dev,
|
|||||||
|
|
||||||
/* Make sure that no further interrupts are processed */
|
/* Make sure that no further interrupts are processed */
|
||||||
|
|
||||||
devif_dev_callback_free(dev, sinfo.s_cb);
|
devif_conn_callback_free(dev, sinfo.s_cb, list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -327,7 +327,8 @@ ssize_t psock_6lowpan_tcp_send(FAR struct socket *psock, FAR const void *buf,
|
|||||||
timeout = 0;
|
timeout = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = sixlowpan_send(dev, (FAR const struct ipv6_hdr_s *)&ipv6tcp,
|
ret = sixlowpan_send(dev, &conn->list,
|
||||||
|
(FAR const struct ipv6_hdr_s *)&ipv6tcp,
|
||||||
buf, buflen, &destmac, timeout);
|
buf, buflen, &destmac, timeout);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -191,8 +191,9 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock,
|
|||||||
|
|
||||||
if (to6->sin6_family != AF_INET6 || tolen < sizeof(struct sockaddr_in6))
|
if (to6->sin6_family != AF_INET6 || tolen < sizeof(struct sockaddr_in6))
|
||||||
{
|
{
|
||||||
nerr("ERROR: Invalid destination address\n");
|
nerr("ERROR: Invalid destination address: sin6_family=%u tolen = %u\n",
|
||||||
return (ssize_t)-EAFNOSUPPORT;
|
to6->sin6_family, tolen);
|
||||||
|
return (ssize_t)-EPROTOTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the underlying UDP "connection" structure */
|
/* Get the underlying UDP "connection" structure */
|
||||||
@@ -200,14 +201,6 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock,
|
|||||||
conn = (FAR struct udp_conn_s *)psock->s_conn;
|
conn = (FAR struct udp_conn_s *)psock->s_conn;
|
||||||
DEBUGASSERT(conn != NULL);
|
DEBUGASSERT(conn != NULL);
|
||||||
|
|
||||||
/* Ignore if not IPv6 domain */
|
|
||||||
|
|
||||||
if (conn->domain != PF_INET6)
|
|
||||||
{
|
|
||||||
nwarn("WARNING: Not IPv6\n");
|
|
||||||
return (ssize_t)-EPROTOTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Route outgoing message to the correct device */
|
/* Route outgoing message to the correct device */
|
||||||
|
|
||||||
#ifdef CONFIG_NETDEV_MULTINIC
|
#ifdef CONFIG_NETDEV_MULTINIC
|
||||||
@@ -264,8 +257,8 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock,
|
|||||||
|
|
||||||
/* Copy the source and destination addresses */
|
/* Copy the source and destination addresses */
|
||||||
|
|
||||||
net_ipv6addr_hdrcopy(ipv6udp.ipv6.srcipaddr, to6->sin6_addr.in6_u.u6_addr16);
|
net_ipv6addr_hdrcopy(ipv6udp.ipv6.destipaddr, to6->sin6_addr.in6_u.u6_addr16);
|
||||||
net_ipv6addr_hdrcopy(ipv6udp.ipv6.destipaddr, conn->u.ipv6.raddr);
|
net_ipv6addr_hdrcopy(ipv6udp.ipv6.srcipaddr, conn->u.ipv6.laddr);
|
||||||
|
|
||||||
ninfo("IPv6 length: %d\n",
|
ninfo("IPv6 length: %d\n",
|
||||||
((int)ipv6udp.ipv6.len[0] << 8) + ipv6udp.ipv6.len[1]);
|
((int)ipv6udp.ipv6.len[0] << 8) + ipv6udp.ipv6.len[1]);
|
||||||
@@ -315,7 +308,8 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock,
|
|||||||
timeout = 0;
|
timeout = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = sixlowpan_send(dev, (FAR const struct ipv6_hdr_s *)&ipv6udp,
|
ret = sixlowpan_send(dev, &conn->list,
|
||||||
|
(FAR const struct ipv6_hdr_s *)&ipv6udp,
|
||||||
buf, buflen, &destmac, timeout);
|
buf, buflen, &destmac, timeout);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user