mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 14:53:47 +08:00
arch/arm/src/samd2l2: Add RS485 support to SAMD2L2 serial
This commit is contained in:
committed by
Gregory Nutt
parent
bb2391358c
commit
a34c9733bc
@@ -616,6 +616,27 @@ config SAMD2L2_SERCOM0_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART0_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART0_RS485MODE
|
||||||
|
bool "RS-485 on USART0"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART0. Your board config will have to
|
||||||
|
provide GPIO_USART0_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART0_RXDMA.
|
||||||
|
|
||||||
|
config USART0_RS485_DIR_POLARITY
|
||||||
|
int "USART0 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART0_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART0. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART0_SERIALDRIVER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "SERCOM1 mode"
|
prompt "SERCOM1 mode"
|
||||||
default SAMD2L2_SERCOM1_ISUSART
|
default SAMD2L2_SERCOM1_ISUSART
|
||||||
@@ -636,6 +657,27 @@ config SAMD2L2_SERCOM1_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART1_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART1_RS485MODE
|
||||||
|
bool "RS-485 on USART1"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART1. Your board config will have to
|
||||||
|
provide GPIO_USART1_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART1_RXDMA.
|
||||||
|
|
||||||
|
config USART1_RS485_DIR_POLARITY
|
||||||
|
int "USART1 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART1_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART1. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART1_SERIALDRIVER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "SERCOM2 mode"
|
prompt "SERCOM2 mode"
|
||||||
default SAMD2L2_SERCOM2_ISUSART
|
default SAMD2L2_SERCOM2_ISUSART
|
||||||
@@ -656,6 +698,27 @@ config SAMD2L2_SERCOM2_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART2_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART2_RS485MODE
|
||||||
|
bool "RS-485 on USART2"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART2. Your board config will have to
|
||||||
|
provide GPIO_USART2_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART2_RXDMA.
|
||||||
|
|
||||||
|
config USART2_RS485_DIR_POLARITY
|
||||||
|
int "USART2 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART2_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART2. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART2_SERIALDRIVER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "SERCOM3 mode"
|
prompt "SERCOM3 mode"
|
||||||
default SAMD2L2_SERCOM3_ISUSART
|
default SAMD2L2_SERCOM3_ISUSART
|
||||||
@@ -676,6 +739,27 @@ config SAMD2L2_SERCOM3_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART3_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART3_RS485MODE
|
||||||
|
bool "RS-485 on USART3"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART3. Your board config will have to
|
||||||
|
provide GPIO_USART3_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART3_RXDMA.
|
||||||
|
|
||||||
|
config USART3_RS485_DIR_POLARITY
|
||||||
|
int "USART3 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART3_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART3. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART3_SERIALDRIVER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "SERCOM4 mode"
|
prompt "SERCOM4 mode"
|
||||||
default SAMD2L2_SERCOM4_ISUSART
|
default SAMD2L2_SERCOM4_ISUSART
|
||||||
@@ -696,6 +780,27 @@ config SAMD2L2_SERCOM4_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART4_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART4_RS485MODE
|
||||||
|
bool "RS-485 on USART4"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART4. Your board config will have to
|
||||||
|
provide GPIO_USART4_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART4_RXDMA.
|
||||||
|
|
||||||
|
config USART4_RS485_DIR_POLARITY
|
||||||
|
int "USART4 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART4_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART4. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART4_SERIALDRIVER
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "SERCOM5 mode"
|
prompt "SERCOM5 mode"
|
||||||
default SAMD2L2_SERCOM5_ISUSART
|
default SAMD2L2_SERCOM5_ISUSART
|
||||||
@@ -716,6 +821,27 @@ config SAMD2L2_SERCOM5_ISUSART
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
if USART5_SERIALDRIVER
|
||||||
|
|
||||||
|
config USART5_RS485MODE
|
||||||
|
bool "RS-485 on USART5"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable RS-485 interface on USART5. Your board config will have to
|
||||||
|
provide GPIO_USART5_RS485_DIR pin definition. Currently it cannot be
|
||||||
|
used with USART5_RXDMA.
|
||||||
|
|
||||||
|
config USART5_RS485_DIR_POLARITY
|
||||||
|
int "USART5 RS-485 DIR pin polarity"
|
||||||
|
default 1
|
||||||
|
range 0 1
|
||||||
|
depends on USART5_RS485MODE
|
||||||
|
---help---
|
||||||
|
Polarity of DIR pin for RS-485 on USART5. Set to state on DIR pin which
|
||||||
|
enables TX (0 - low / nTXEN, 1 - high / TXEN).
|
||||||
|
|
||||||
|
endif # USART5_SERIALDRIVER
|
||||||
|
|
||||||
config SAMD2L2_HAVE_SPI
|
config SAMD2L2_HAVE_SPI
|
||||||
bool
|
bool
|
||||||
select SPI
|
select SPI
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/samd2l2/sam_config.h
|
* arch/arm/src/samd2l2/sam_config.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014, 2019 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -135,6 +135,14 @@
|
|||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART0_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART0_RS485_DIR
|
||||||
|
# if (CONFIG_USART0_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#elif defined(CONFIG_USART1_SERIAL_CONSOLE)
|
#elif defined(CONFIG_USART1_SERIAL_CONSOLE)
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART2_SERIAL_CONSOLE
|
# undef CONFIG_USART2_SERIAL_CONSOLE
|
||||||
@@ -142,6 +150,14 @@
|
|||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART1_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART1_RS485_DIR
|
||||||
|
# if (CONFIG_USART1_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#elif defined(CONFIG_USART2_SERIAL_CONSOLE)
|
#elif defined(CONFIG_USART2_SERIAL_CONSOLE)
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART1_SERIAL_CONSOLE
|
# undef CONFIG_USART1_SERIAL_CONSOLE
|
||||||
@@ -149,6 +165,14 @@
|
|||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART2_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART2_RS485_DIR
|
||||||
|
# if (CONFIG_USART2_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#elif defined(CONFIG_USART3_SERIAL_CONSOLE)
|
#elif defined(CONFIG_USART3_SERIAL_CONSOLE)
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART1_SERIAL_CONSOLE
|
# undef CONFIG_USART1_SERIAL_CONSOLE
|
||||||
@@ -156,6 +180,14 @@
|
|||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART3_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART3_RS485_DIR
|
||||||
|
# if (CONFIG_USART3_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#elif defined(CONFIG_USART4_SERIAL_CONSOLE)
|
#elif defined(CONFIG_USART4_SERIAL_CONSOLE)
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART1_SERIAL_CONSOLE
|
# undef CONFIG_USART1_SERIAL_CONSOLE
|
||||||
@@ -163,6 +195,14 @@
|
|||||||
# undef CONFIG_USART3_SERIAL_CONSOLE
|
# undef CONFIG_USART3_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART4_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART4_RS485_DIR
|
||||||
|
# if (CONFIG_USART4_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#elif defined(CONFIG_USART5_SERIAL_CONSOLE)
|
#elif defined(CONFIG_USART5_SERIAL_CONSOLE)
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART1_SERIAL_CONSOLE
|
# undef CONFIG_USART1_SERIAL_CONSOLE
|
||||||
@@ -170,6 +210,14 @@
|
|||||||
# undef CONFIG_USART3_SERIAL_CONSOLE
|
# undef CONFIG_USART3_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# define HAVE_SERIAL_CONSOLE 1
|
# define HAVE_SERIAL_CONSOLE 1
|
||||||
|
# ifdef CONFIG_USART5_RS485MODE
|
||||||
|
# define SAM_CONSOLE_RS485_DIR GPIO_USART5_RS485_DIR
|
||||||
|
# if (CONFIG_USART5_RS485_DIR_POLARITY == 0)
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY false
|
||||||
|
# else
|
||||||
|
# define SAM_CONSOLE_RS485_DIR_POLARITY true
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
# undef CONFIG_USART0_SERIAL_CONSOLE
|
# undef CONFIG_USART0_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART1_SERIAL_CONSOLE
|
# undef CONFIG_USART1_SERIAL_CONSOLE
|
||||||
@@ -178,6 +226,7 @@
|
|||||||
# undef CONFIG_USART4_SERIAL_CONSOLE
|
# undef CONFIG_USART4_SERIAL_CONSOLE
|
||||||
# undef CONFIG_USART5_SERIAL_CONSOLE
|
# undef CONFIG_USART5_SERIAL_CONSOLE
|
||||||
# undef HAVE_SERIAL_CONSOLE
|
# undef HAVE_SERIAL_CONSOLE
|
||||||
|
# undef SAM_CONSOLE_RS485_DIR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Are any SERCOM peripherals are configured as SPI peripherals? */
|
/* Are any SERCOM peripherals are configured as SPI peripherals? */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/samd2l2/sam_lowputc.c
|
* arch/arm/src/samd2l2/sam_lowputc.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2016 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014-2016, 2019 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* References:
|
* References:
|
||||||
@@ -467,7 +467,13 @@ void sam_lowputc(uint32_t ch)
|
|||||||
|
|
||||||
/* Wait for the USART to be ready for new TX data */
|
/* Wait for the USART to be ready for new TX data */
|
||||||
|
|
||||||
while ((getreg8(intflag) & USART_INT_DRE) == 0);
|
while ((getreg8(intflag) & USART_INT_DRE) == 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SAM_CONSOLE_RS485_DIR
|
||||||
|
sam_portwrite(SAM_CONSOLE_RS485_DIR, SAM_CONSOLE_RS485_DIR_POLARITY);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Wait until synchronization is complete */
|
/* Wait until synchronization is complete */
|
||||||
|
|
||||||
@@ -479,6 +485,12 @@ void sam_lowputc(uint32_t ch)
|
|||||||
|
|
||||||
/* Wait until data is sent */
|
/* Wait until data is sent */
|
||||||
|
|
||||||
while ((getreg8(intflag) & USART_INT_TXC) == 0);
|
while ((getreg8(intflag) & USART_INT_TXC) == 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SAM_CONSOLE_RS485_DIR
|
||||||
|
sam_portwrite(SAM_CONSOLE_RS485_DIR, !SAM_CONSOLE_RS485_DIR_POLARITY);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/samd2l2/sam_serial.c
|
* arch/arm/src/samd2l2/sam_serial.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014-2015, 2019 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -229,6 +229,11 @@ struct sam_dev_s
|
|||||||
const struct sam_usart_config_s * const config;
|
const struct sam_usart_config_s * const config;
|
||||||
|
|
||||||
/* Information unique to the serial driver */
|
/* Information unique to the serial driver */
|
||||||
|
|
||||||
|
#ifdef HAVE_RS485
|
||||||
|
const uint32_t rs485_dir_gpio; /* USART RS-485 DIR GPIO pin configuration */
|
||||||
|
const bool rs485_dir_polarity; /* USART RS-485 DIR pin state for TX enabled */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -319,7 +324,15 @@ static char g_usart5txbuffer[CONFIG_USART5_TXBUFSIZE];
|
|||||||
#ifdef SAMD2L2_HAVE_USART0
|
#ifdef SAMD2L2_HAVE_USART0
|
||||||
static struct sam_dev_s g_usart0priv =
|
static struct sam_dev_s g_usart0priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart0config,
|
.config = &g_usart0config,
|
||||||
|
#ifdef CONFIG_USART0_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART0_RS485_DIR,
|
||||||
|
# if (CONFIG_USART0_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart0port =
|
static uart_dev_t g_usart0port =
|
||||||
@@ -344,7 +357,15 @@ static uart_dev_t g_usart0port =
|
|||||||
#ifdef SAMD2L2_HAVE_USART1
|
#ifdef SAMD2L2_HAVE_USART1
|
||||||
static struct sam_dev_s g_usart1priv =
|
static struct sam_dev_s g_usart1priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart1config,
|
.config = &g_usart1config,
|
||||||
|
#ifdef CONFIG_USART1_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART1_RS485_DIR,
|
||||||
|
# if (CONFIG_USART1_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart1port =
|
static uart_dev_t g_usart1port =
|
||||||
@@ -369,7 +390,15 @@ static uart_dev_t g_usart1port =
|
|||||||
#ifdef SAMD2L2_HAVE_USART2
|
#ifdef SAMD2L2_HAVE_USART2
|
||||||
static struct sam_dev_s g_usart2priv =
|
static struct sam_dev_s g_usart2priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart2config,
|
.config = &g_usart2config,
|
||||||
|
#ifdef CONFIG_USART2_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART2_RS485_DIR,
|
||||||
|
# if (CONFIG_USART2_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart2port =
|
static uart_dev_t g_usart2port =
|
||||||
@@ -394,7 +423,15 @@ static uart_dev_t g_usart2port =
|
|||||||
#ifdef SAMD2L2_HAVE_USART3
|
#ifdef SAMD2L2_HAVE_USART3
|
||||||
static struct sam_dev_s g_usart3priv =
|
static struct sam_dev_s g_usart3priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart3config,
|
.config = &g_usart3config,
|
||||||
|
#ifdef CONFIG_USART3_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART3_RS485_DIR,
|
||||||
|
# if (CONFIG_USART3_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart3port =
|
static uart_dev_t g_usart3port =
|
||||||
@@ -419,7 +456,15 @@ static uart_dev_t g_usart3port =
|
|||||||
#ifdef SAMD2L2_HAVE_USART4
|
#ifdef SAMD2L2_HAVE_USART4
|
||||||
static struct sam_dev_s g_usart4priv =
|
static struct sam_dev_s g_usart4priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart4config,
|
.config = &g_usart4config,
|
||||||
|
#ifdef CONFIG_USART4_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART4_RS485_DIR,
|
||||||
|
# if (CONFIG_USART4_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart4port =
|
static uart_dev_t g_usart4port =
|
||||||
@@ -444,7 +489,15 @@ static uart_dev_t g_usart4port =
|
|||||||
#ifdef SAMD2L2_HAVE_USART5
|
#ifdef SAMD2L2_HAVE_USART5
|
||||||
static struct sam_dev_s g_usart5priv =
|
static struct sam_dev_s g_usart5priv =
|
||||||
{
|
{
|
||||||
.config = &g_usart5config,
|
.config = &g_usart5config,
|
||||||
|
#ifdef CONFIG_USART5_RS485MODE
|
||||||
|
.rs485_dir_gpio = GPIO_USART5_RS485_DIR,
|
||||||
|
# if (CONFIG_USART5_RS485_DIR_POLARITY == 0)
|
||||||
|
.rs485_dir_polarity = false,
|
||||||
|
# else
|
||||||
|
.rs485_dir_polarity = true,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static uart_dev_t g_usart5port =
|
static uart_dev_t g_usart5port =
|
||||||
@@ -546,7 +599,21 @@ static int sam_interrupt(int irq, void *context, FAR void *arg)
|
|||||||
|
|
||||||
intflag = sam_serialin8(priv, SAM_USART_INTFLAG_OFFSET);
|
intflag = sam_serialin8(priv, SAM_USART_INTFLAG_OFFSET);
|
||||||
inten = sam_serialin8(priv, SAM_USART_INTENCLR_OFFSET);
|
inten = sam_serialin8(priv, SAM_USART_INTENCLR_OFFSET);
|
||||||
pending = intflag & inten;
|
pending = intflag & inten;
|
||||||
|
|
||||||
|
#ifdef HAVE_RS485
|
||||||
|
/* Transmission of whole buffer is over - TXC is set.
|
||||||
|
* Note - this should be first, to have the most recent TC bit value from
|
||||||
|
* SR register - sending data affects TXC, but without refresh we will not
|
||||||
|
* know that...
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((pending & USART_INT_TXC) != 0)
|
||||||
|
{
|
||||||
|
sam_portwrite(priv->rs485_dir_gpio, !priv->rs485_dir_polarity);
|
||||||
|
sam_serialout8(priv, SAM_USART_INTENCLR_OFFSET, USART_INT_TXC);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Handle an incoming, receive byte. The RXC flag is set when there is
|
/* Handle an incoming, receive byte. The RXC flag is set when there is
|
||||||
* unread data in DATA register. This flag is cleared by reading the DATA
|
* unread data in DATA register. This flag is cleared by reading the DATA
|
||||||
@@ -602,6 +669,14 @@ static int sam_setup(struct uart_dev_s *dev)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_RS485
|
||||||
|
if (priv->rs485_dir_gpio != 0)
|
||||||
|
{
|
||||||
|
(void)sam_configport(priv->rs485_dir_gpio);
|
||||||
|
sam_portwrite(priv->rs485_dir_gpio, !priv->rs485_dir_polarity);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -831,7 +906,7 @@ static void sam_txint(struct uart_dev_s *dev, bool enable)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
|
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
|
||||||
sam_serialout8(priv, SAM_USART_INTENSET_OFFSET, USART_INT_DRE);
|
sam_serialout8(priv, SAM_USART_INTENSET_OFFSET, USART_TX_INTS);
|
||||||
|
|
||||||
/* Fake a TX interrupt here by just calling uart_xmitchars() with
|
/* Fake a TX interrupt here by just calling uart_xmitchars() with
|
||||||
* interrupts disabled (note this may recurse).
|
* interrupts disabled (note this may recurse).
|
||||||
@@ -843,7 +918,7 @@ static void sam_txint(struct uart_dev_s *dev, bool enable)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Disable the TX interrupt */
|
/* Disable the TX interrupt. Only disable DRE, TXC will disable itself! */
|
||||||
|
|
||||||
sam_serialout8(priv, SAM_USART_INTENCLR_OFFSET, USART_INT_DRE);
|
sam_serialout8(priv, SAM_USART_INTENCLR_OFFSET, USART_INT_DRE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,20 @@
|
|||||||
# undef g_consoleconfig
|
# undef g_consoleconfig
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Is RS-485 used? */
|
||||||
|
|
||||||
|
#if defined(CONFIG_USART0_RS485MODE) || defined(CONFIG_USART1_RS485MODE) || \
|
||||||
|
defined(CONFIG_USART2_RS485MODE) || defined(CONFIG_USART3_RS485MODE) || \
|
||||||
|
defined(CONFIG_USART4_RS485MODE) || defined(CONFIG_USART5_RS485MODE)
|
||||||
|
# define HAVE_RS485 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_RS485
|
||||||
|
# define USART_TX_INTS (USART_INT_DRE | USART_INT_TXC)
|
||||||
|
#else
|
||||||
|
# define USART_TX_INTS (USART_INT_DRE)
|
||||||
|
#endif
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user