summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Hatch <jhatch@multitech.com>2022-01-14 08:44:58 -0600
committerJeff Hatch <jhatch@multitech.com>2022-01-14 08:44:58 -0600
commite4e1c1ad52397d5807b18349cb6990c3e8364d6d (patch)
treea04b5a0ded6766ec4cc2357759f0cd318e8f5cb9
parentd001624362056286af537f98f57228f32ca50581 (diff)
parent740faaaeb030cee2583488378bd13827ad070fd9 (diff)
downloadmeta-multitech-atmel-e4e1c1ad52397d5807b18349cb6990c3e8364d6d.tar.gz
meta-multitech-atmel-e4e1c1ad52397d5807b18349cb6990c3e8364d6d.tar.bz2
meta-multitech-atmel-e4e1c1ad52397d5807b18349cb6990c3e8364d6d.zip
Merge branch 'vs/mtx-4338' into '6'
Merge all the changes from R.5.3.7 to R.6.0 See merge request !19
-rw-r--r--recipes-bsp/at91bootstrap/at91bootstrap-3.8.12/0005-at91bootstrap-3.8-mtcdt.patch5
-rw-r--r--recipes-bsp/at91bootstrap/at91bootstrap_3.8.12.bb2
-rw-r--r--recipes-kernel/linux/linux-at91-4.9.87/defconfig6
-rw-r--r--recipes-kernel/linux/linux-at91-4.9.87/mtcdt/linux-4.9-rs485-atmel-crtscts.patch125
-rw-r--r--recipes-kernel/linux/linux-at91-4.9.87/mtcdt/mtcdt.dts21
-rw-r--r--recipes-kernel/linux/linux-at91-5.4.81/defconfig6
-rw-r--r--recipes-kernel/linux/linux-at91-5.4.81/mtcdt/linux-5.4-rs485-atmel-crtscts.patch132
-rw-r--r--recipes-kernel/linux/linux-at91-5.4.81/mts-dts/mtcdt.dts13
-rw-r--r--recipes-kernel/linux/linux-at91_4.9.87.bb3
-rw-r--r--recipes-kernel/linux/linux-at91_5.4.81.bb1
-rwxr-xr-xrecipes-kernel/rs9113/files/rs9113/rs9113.init96
-rwxr-xr-xrecipes-kernel/rs9113/files/rs9113/rs9113.reset25
-rw-r--r--recipes-kernel/rs9113/rs9113-from-src_1.6.5.bb5
-rw-r--r--recipes-kernel/rs9113/rs9113.inc13
-rw-r--r--recipes-kernel/rs9113/rs9113_1.6.5.bb8
15 files changed, 394 insertions, 67 deletions
diff --git a/recipes-bsp/at91bootstrap/at91bootstrap-3.8.12/0005-at91bootstrap-3.8-mtcdt.patch b/recipes-bsp/at91bootstrap/at91bootstrap-3.8.12/0005-at91bootstrap-3.8-mtcdt.patch
index 117f4be..eb8d60d 100644
--- a/recipes-bsp/at91bootstrap/at91bootstrap-3.8.12/0005-at91bootstrap-3.8-mtcdt.patch
+++ b/recipes-bsp/at91bootstrap/at91bootstrap-3.8.12/0005-at91bootstrap-3.8-mtcdt.patch
@@ -1,7 +1,7 @@
diff -Naru orig/board/at91sam9x5ek/at91sam9x5ek.c new/board/at91sam9x5ek/at91sam9x5ek.c
--- orig/board/at91sam9x5ek/at91sam9x5ek.c 2020-09-10 16:30:43.653327254 -0500
+++ new/board/at91sam9x5ek/at91sam9x5ek.c 2020-09-10 16:16:38.597352272 -0500
-@@ -56,6 +56,47 @@
+@@ -56,6 +56,48 @@
writel(0xFF, RTC_SCCR + AT91C_BASE_RTC);
}
@@ -30,11 +30,12 @@ diff -Naru orig/board/at91sam9x5ek/at91sam9x5ek.c new/board/at91sam9x5ek/at91sam
+ * For the PCA9557, tw(rst) is listed as 6nS on page
+ * 16 of Product Data Sheet Revision 7, 10 December 2013.
+ */
++ {"WIFI_BT_RESET",AT91C_PIN_PD(14), 0, PIO_DEFAULT, PIO_OUTPUT},
+ {"N_GPIO_EXP1_RESET",AT91C_PIN_PD(16), 0, PIO_DEFAULT, PIO_OUTPUT},
+ {"N_GPIO_EXP2_RESET",AT91C_PIN_PC(26), 0, PIO_DEFAULT, PIO_OUTPUT},
+ {"GNSS-RESET",AT91C_PIN_PD(15), 0, PIO_PULLUP, PIO_OUTPUT},
+ {"MTQ-RESET",AT91C_PIN_PD(17), 1, PIO_PULLUP, PIO_OUTPUT},
-+ {"USBHUB-RESET",AT91C_PIN_PD(18), 1, PIO_PULLUP, PIO_OUTPUT},
++ {"USBHUB-RESET",AT91C_PIN_PD(18), 0, PIO_PULLUP, PIO_OUTPUT},
+ {"GNSS-INT",AT91C_PIN_PD(19), 1, PIO_PULLUP, PIO_OUTPUT},
+ {"WIFI-BT-LPMODE",AT91C_PIN_PD(20), 0, PIO_PULLUP, PIO_INPUT},
+ {"N_GPIO_EXP1_RESET",AT91C_PIN_PD(16), 1, PIO_DEFAULT, PIO_OUTPUT},
diff --git a/recipes-bsp/at91bootstrap/at91bootstrap_3.8.12.bb b/recipes-bsp/at91bootstrap/at91bootstrap_3.8.12.bb
index b8e5ba9..a92f928 100644
--- a/recipes-bsp/at91bootstrap/at91bootstrap_3.8.12.bb
+++ b/recipes-bsp/at91bootstrap/at91bootstrap_3.8.12.bb
@@ -1,5 +1,5 @@
require at91bootstrap.inc
-PR = "m5"
+PR = "m7"
LIC_FILES_CHKSUM = "file://main.c;endline=27;md5=a2a70db58191379e2550cbed95449fbd"
diff --git a/recipes-kernel/linux/linux-at91-4.9.87/defconfig b/recipes-kernel/linux/linux-at91-4.9.87/defconfig
index 05971d9..bd91c7e 100644
--- a/recipes-kernel/linux/linux-at91-4.9.87/defconfig
+++ b/recipes-kernel/linux/linux-at91-4.9.87/defconfig
@@ -1885,9 +1885,9 @@ CONFIG_I2C_GPIO=m
# CONFIG_I2C_STUB is not set
CONFIG_I2C_SLAVE=y
CONFIG_I2C_SLAVE_EEPROM=m
-CONFIG_I2C_DEBUG_CORE=y
-CONFIG_I2C_DEBUG_ALGO=y
-CONFIG_I2C_DEBUG_BUS=y
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y
diff --git a/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/linux-4.9-rs485-atmel-crtscts.patch b/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/linux-4.9-rs485-atmel-crtscts.patch
new file mode 100644
index 0000000..5642aee
--- /dev/null
+++ b/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/linux-4.9-rs485-atmel-crtscts.patch
@@ -0,0 +1,125 @@
+This patch allows RS485 Half Duplex (ATMEL_US_USMODE_RS485 is half duplex) to
+work even if handshaking is turned on. This mimics the behavior of the EXAR
+USB/Serial driver known as Vizzini. It is impossible to use handshaking when
+using ATMEL_US_USMODE_RS485. This provides compatibility between MTCDT-0.1 and
+MTCDT-0.2. Note that frequently the state of the driver will be stopped if
+handshaking was turned on before RS485 was set. We need to take steps to enable
+transmit and receive when we go to RS485 mode, or the driver will be blocked.
+=======================================================================================
+diff -Naru orig/drivers/tty/serial/atmel_serial.c new/drivers/tty/serial/atmel_serial.c
+--- orig/drivers/tty/serial/atmel_serial.c 2021-11-30 14:54:49.313993839 -0600
++++ new/drivers/tty/serial/atmel_serial.c 2021-11-30 16:14:58.430090773 -0600
+@@ -74,6 +74,7 @@
+
+ static void atmel_start_rx(struct uart_port *port);
+ static void atmel_stop_rx(struct uart_port *port);
++static void atmel_start_tx(struct uart_port *port);
+
+ #ifdef CONFIG_SERIAL_ATMEL_TTYAT
+
+@@ -357,6 +358,7 @@
+ {
+ struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+ unsigned int mode;
++ unsigned int sav_c_cflag = 0;
+
+ /* Disable interrupts */
+ atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask);
+@@ -369,11 +371,33 @@
+ port->rs485 = *rs485conf;
+
+ if (rs485conf->flags & SER_RS485_ENABLED) {
+- dev_dbg(port->dev, "Setting UART to RS485\n");
+- atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
+- atmel_uart_writel(port, ATMEL_US_TTGR,
++ struct uart_state *state_p = port->state;
++ struct tty_struct *tty_struct_p = NULL;
++
++ dev_dbg(port->dev, "Setting UART to RS485\n");
++ if (state_p)
++ tty_struct_p = state_p->port.tty;
++
++ if(tty_struct_p) {
++ struct ktermios *termios = &(tty_struct_p->termios);
++ sav_c_cflag = termios->c_cflag;
++ termios->c_cflag &= ~CRTSCTS;
++ }
++
++ atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
++ atmel_uart_writel(port, ATMEL_US_TTGR,
+ rs485conf->delay_rts_after_send);
++ dev_dbg(port->dev,
++ "atmel_config_rs485: orig: c_cflag 0x%x port status 0x%x, hw_stopped %d\n",
++ sav_c_cflag,port->status,port->hw_stopped
++ );
++
++ port->status &= ~UPSTAT_CTS_ENABLE;
+ mode |= ATMEL_US_USMODE_RS485;
++ port->hw_stopped = 0; // No longer possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ } else {
+ dev_dbg(port->dev, "Setting UART to RS232\n");
+ if (atmel_use_pdc_tx(port))
+@@ -413,13 +437,36 @@
+ unsigned int mode = atmel_uart_readl(port, ATMEL_US_MR);
+ unsigned int rts_paused, rts_ready;
+ struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
++ unsigned int sav_c_cflag = 0;
+
+ /* override mode to RS485 if needed, otherwise keep the current mode */
+ if (port->rs485.flags & SER_RS485_ENABLED) {
+- atmel_uart_writel(port, ATMEL_US_TTGR,
+- port->rs485.delay_rts_after_send);
+- mode &= ~ATMEL_US_USMODE;
+- mode |= ATMEL_US_USMODE_RS485;
++ struct uart_state *state_p = port->state;
++ struct tty_struct *tty_struct_p = NULL;
++
++ if (state_p)
++ tty_struct_p = state_p->port.tty;
++
++ if(tty_struct_p) {
++ struct ktermios *termios = &(tty_struct_p->termios);
++
++ sav_c_cflag = termios->c_cflag;
++ termios->c_cflag &= ~CRTSCTS;
++ }
++
++ atmel_uart_writel(port, ATMEL_US_TTGR,
++ port->rs485.delay_rts_after_send);
++ mode &= ~ATMEL_US_USMODE;
++ mode |= ATMEL_US_USMODE_RS485;
++ dev_dbg(port->dev,
++ "atmel_set_mctrl: SER_RS485_ENABLED: c_cflag 0x%x port status 0x%x, hw_stopped %d\n",
++ sav_c_cflag,port->status,port->hw_stopped
++ );
++ port->status &= ~UPSTAT_CTS_ENABLE;
++ port->hw_stopped = 0; // No longer possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ }
+
+ /* set the RTS line state according to the mode */
+@@ -2168,6 +2215,19 @@
+ atmel_uart_writel(port, ATMEL_US_TTGR,
+ port->rs485.delay_rts_after_send);
+ mode |= ATMEL_US_USMODE_RS485;
++ /* CRTSCTS is impossible in RS485 mode, and breaks the driver
++ * so we cannot do a send. */
++ dev_dbg(port->dev,
++ "atmel_set_termios: SER_RS485_ENABLED: original: c_cflag 0x%x status 0x%x, hw_stopped %d\n",
++ termios->c_cflag,port->status,port->hw_stopped
++ );
++
++ termios->c_cflag &= ~CRTSCTS;
++ port->status &= ~UPSTAT_CTS_ENABLE;
++ port->hw_stopped = 0; // Not possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ } else if (termios->c_cflag & CRTSCTS) {
+ /* RS232 with hardware handshake (RTS/CTS) */
+ if (atmel_use_fifo(port) &&
diff --git a/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/mtcdt.dts b/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/mtcdt.dts
index f485baa..79e8fef 100644
--- a/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/mtcdt.dts
+++ b/recipes-kernel/linux/linux-at91-4.9.87/mtcdt/mtcdt.dts
@@ -8,6 +8,7 @@
#include <dt-bindings/gpio/mt-at91.h>
+
/ {
model = "Multi-Tech Systems MTCDT";
compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
@@ -71,7 +72,6 @@
atmel,pins =
<AT91_PIOA 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PA1 gpio SD card pin pull up and deglitch */
};
- /* /delete-property/ cd-gpios; */
};
/delete-node/ mmc@f000c000;
@@ -100,22 +100,21 @@
pinctrl_mts_io_out: mts_io-0 {
// gpio4 and gpio5 are reset in at91bootstrap. They should not be touched in Linux.
atmel,pins =
- <AT91_PIOD 14 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD14 WiFi BT reset */
- AT91_PIOD 16 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD16 Secure reset or gpio4 reset */
- AT91_PIOD 17 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD17 MTQ reset */
- AT91_PIOD 18 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1))>; /* PD18 USB Hub reset */
+ <AT91_PIOD 17 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD17 MTQ reset */
+ AT91_PIOD 20 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD20 WiFi_BT_LPMode Output */
output-high; // ignored by at91_pinctrl
};
pinctrl_mts_io_in: mts_io-1 {
atmel,pins =
- <AT91_PIOD 19 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP /* PD19 GNSS Int */
- AT91_PIOD 20 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD20 WiFi_BT_LPMode Input */
+ <AT91_PIOD 19 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD19 GNSS Int */
};
// GNSS kept in reset to prevent EXAR from hanging
pinctrl_mts_io_gnss: mts_io-2 {
atmel,pins =
<AT91_PIOC 4 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PC16 ETH_NRST */
- AT91_PIOD 15 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0))>; /* PD15 N_GNSS_RESET */
+ AT91_PIOD 14 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PD14 WiFi BT reset */
+ AT91_PIOD 15 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PD15 N_GNSS_RESET */
+ AT91_PIOD 18 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0))>; /* PD18 USB Hub reset */
output-low; // ignored by at91_pinctrl
};
};
@@ -439,3 +438,9 @@
phandle,linux = <GPIO5_PCA9557_PH>;
// gpio-base = <136>;
};
+&mmc0 {
+ slot@0 {
+ cd-gpios = <&pioA 1 GPIO_ACTIVE_HIGH>;
+ };
+};
+
diff --git a/recipes-kernel/linux/linux-at91-5.4.81/defconfig b/recipes-kernel/linux/linux-at91-5.4.81/defconfig
index 022b72d..3b6613b 100644
--- a/recipes-kernel/linux/linux-at91-5.4.81/defconfig
+++ b/recipes-kernel/linux/linux-at91-5.4.81/defconfig
@@ -2090,9 +2090,9 @@ CONFIG_I2C_GPIO=m
# CONFIG_I2C_STUB is not set
CONFIG_I2C_SLAVE=y
CONFIG_I2C_SLAVE_EEPROM=m
-CONFIG_I2C_DEBUG_CORE=y
-CONFIG_I2C_DEBUG_ALGO=y
-CONFIG_I2C_DEBUG_BUS=y
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
# end of I2C support
# CONFIG_I3C is not set
diff --git a/recipes-kernel/linux/linux-at91-5.4.81/mtcdt/linux-5.4-rs485-atmel-crtscts.patch b/recipes-kernel/linux/linux-at91-5.4.81/mtcdt/linux-5.4-rs485-atmel-crtscts.patch
new file mode 100644
index 0000000..30cc7d5
--- /dev/null
+++ b/recipes-kernel/linux/linux-at91-5.4.81/mtcdt/linux-5.4-rs485-atmel-crtscts.patch
@@ -0,0 +1,132 @@
+This patch allows RS485 Half Duplex (ATMEL_US_USMODE_RS485 is half duplex) to
+work even if handshaking is turned on. This mimics the behavior of the EXAR
+USB/Serial driver known as Vizzini. It is impossible to use handshaking when
+using ATMEL_US_USMODE_RS485. This provides compatibility between MTCDT-0.1 and
+MTCDT-0.2. Note that frequently the state of the driver will be stopped if
+handshaking was turned on before RS485 was set. We need to take steps to enable
+transmit and receive when we go to RS485 mode, or the driver will be blocked.
+=======================================================================================
+diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
+index 2d17558a807d..e721e2028b4a 100644
+--- a/drivers/tty/serial/atmel_serial.c
++++ b/drivers/tty/serial/atmel_serial.c
+@@ -62,6 +62,7 @@
+
+ static void atmel_start_rx(struct uart_port *port);
+ static void atmel_stop_rx(struct uart_port *port);
++static void atmel_start_tx(struct uart_port *port);
+
+ #ifdef CONFIG_SERIAL_ATMEL_TTYAT
+
+@@ -300,6 +301,7 @@ static int atmel_config_rs485(struct uart_port *port,
+ {
+ struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+ unsigned int mode;
++ unsigned int sav_c_cflag = 0;
+
+ /* Disable interrupts */
+ atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask);
+@@ -312,15 +314,33 @@ static int atmel_config_rs485(struct uart_port *port,
+ port->rs485 = *rs485conf;
+
+ if (rs485conf->flags & SER_RS485_ENABLED) {
+- dev_dbg(port->dev, "Setting UART to RS485\n");
+- if (port->rs485.flags & SER_RS485_RX_DURING_TX)
+- atmel_port->tx_done_mask = ATMEL_US_TXRDY;
+- else
+- atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
++ struct uart_state *state_p = port->state;
++ struct tty_struct *tty_struct_p = NULL;
+
+- atmel_uart_writel(port, ATMEL_US_TTGR,
++ dev_dbg(port->dev, "Setting UART to RS485\n");
++ if (state_p)
++ tty_struct_p = state_p->port.tty;
++
++ if(tty_struct_p) {
++ struct ktermios *termios = &(tty_struct_p->termios);
++ sav_c_cflag = termios->c_cflag;
++ termios->c_cflag &= ~CRTSCTS;
++ }
++
++ atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
++ atmel_uart_writel(port, ATMEL_US_TTGR,
+ rs485conf->delay_rts_after_send);
++ dev_dbg(port->dev,
++ "atmel_config_rs485: orig: c_cflag 0x%x port status 0x%x, hw_stopped %d\n",
++ sav_c_cflag,port->status,port->hw_stopped
++ );
++
++ port->status &= ~UPSTAT_CTS_ENABLE;
+ mode |= ATMEL_US_USMODE_RS485;
++ port->hw_stopped = 0; // No longer possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ } else {
+ dev_dbg(port->dev, "Setting UART to RS232\n");
+ if (atmel_use_pdc_tx(port))
+@@ -481,13 +501,36 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
+ unsigned int mode = atmel_uart_readl(port, ATMEL_US_MR);
+ unsigned int rts_paused, rts_ready;
+ struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
++ unsigned int sav_c_cflag = 0;
+
+ /* override mode to RS485 if needed, otherwise keep the current mode */
+ if (port->rs485.flags & SER_RS485_ENABLED) {
+- atmel_uart_writel(port, ATMEL_US_TTGR,
+- port->rs485.delay_rts_after_send);
+- mode &= ~ATMEL_US_USMODE;
+- mode |= ATMEL_US_USMODE_RS485;
++ struct uart_state *state_p = port->state;
++ struct tty_struct *tty_struct_p = NULL;
++
++ if (state_p)
++ tty_struct_p = state_p->port.tty;
++
++ if(tty_struct_p) {
++ struct ktermios *termios = &(tty_struct_p->termios);
++
++ sav_c_cflag = termios->c_cflag;
++ termios->c_cflag &= ~CRTSCTS;
++ }
++
++ atmel_uart_writel(port, ATMEL_US_TTGR,
++ port->rs485.delay_rts_after_send);
++ mode &= ~ATMEL_US_USMODE;
++ mode |= ATMEL_US_USMODE_RS485;
++ dev_dbg(port->dev,
++ "atmel_set_mctrl: SER_RS485_ENABLED: c_cflag 0x%x port status 0x%x, hw_stopped %d\n",
++ sav_c_cflag,port->status,port->hw_stopped
++ );
++ port->status &= ~UPSTAT_CTS_ENABLE;
++ port->hw_stopped = 0; // No longer possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ }
+
+ /* set the RTS line state according to the mode */
+@ -2250,6 +2250,19 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
+ atmel_uart_writel(port, ATMEL_US_TTGR,
+ port->rs485.delay_rts_after_send);
+ mode |= ATMEL_US_USMODE_RS485;
++ /* CRTSCTS is impossible in RS485 mode, and breaks the driver
++ * so we cannot do a send. */
++ dev_dbg(port->dev,
++ "atmel_set_termios: SER_RS485_ENABLED: original: c_cflag 0x%x status 0x%x, hw_stopped %d\n",
++ termios->c_cflag,port->status,port->hw_stopped
++ );
++
++ termios->c_cflag &= ~CRTSCTS;
++ port->status &= ~UPSTAT_CTS_ENABLE;
++ port->hw_stopped = 0; // Not possible
++ if (atmel_port->tx_stopped == true)
++ atmel_start_tx(port);
++ atmel_start_rx(port);
+ } else if (port->iso7816.flags & SER_ISO7816_ENABLED) {
+ atmel_uart_writel(port, ATMEL_US_TTGR, port->iso7816.tg);
+ /* select mck clock, and output */
+--
+2.25.1
+
diff --git a/recipes-kernel/linux/linux-at91-5.4.81/mts-dts/mtcdt.dts b/recipes-kernel/linux/linux-at91-5.4.81/mts-dts/mtcdt.dts
index b7f05c4..a33b936 100644
--- a/recipes-kernel/linux/linux-at91-5.4.81/mts-dts/mtcdt.dts
+++ b/recipes-kernel/linux/linux-at91-5.4.81/mts-dts/mtcdt.dts
@@ -488,22 +488,21 @@
pinctrl_mts_io_out: mts_io-0 {
// gpio4 and gpio5 are reset in at91bootstrap. They should not be touched in Linux.
atmel,pins =
- <AT91_PIOD 14 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD14 WiFi BT reset */
- AT91_PIOD 16 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD16 Secure reset or gpio4 reset */
- AT91_PIOD 17 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD17 MTQ reset */
- AT91_PIOD 18 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1))>; /* PD18 USB Hub reset */
+ <AT91_PIOD 17 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(1)) /* PD17 MTQ reset */
+ AT91_PIOD 20 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD20 WiFi_BT_LPMode Output */
output-high; // ignored by at91_pinctrl
};
pinctrl_mts_io_in: mts_io-1 {
atmel,pins =
- <AT91_PIOD 19 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP /* PD19 GNSS Int */
- AT91_PIOD 20 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD20 WiFi_BT_LPMode Input */
+ <AT91_PIOD 19 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>; /* PD19 GNSS Int */
};
// GNSS kept in reset to prevent EXAR from hanging
pinctrl_mts_io_gnss: mts_io-2 {
atmel,pins =
<AT91_PIOC 4 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PC16 ETH_NRST */
- AT91_PIOD 15 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0))>; /* PD15 N_GNSS_RESET */
+ AT91_PIOD 14 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PD14 WiFi BT reset */
+ AT91_PIOD 15 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0)) /* PD15 N_GNSS_RESET */
+ AT91_PIOD 18 AT91_PERIPH_GPIO (AT91_PINCTRL_OUTPUT|AT91_PINCTRL_OUTPUT_VAL(0))>; /* PD18 USB Hub reset */
output-low; // ignored by at91_pinctrl
};
};
diff --git a/recipes-kernel/linux/linux-at91_4.9.87.bb b/recipes-kernel/linux/linux-at91_4.9.87.bb
index 7fc0e5d..3b10efd 100644
--- a/recipes-kernel/linux/linux-at91_4.9.87.bb
+++ b/recipes-kernel/linux/linux-at91_4.9.87.bb
@@ -19,7 +19,7 @@ RDEPENDS_kernel-modules_remove = "kernel-module-softdog"
FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"
KERNEL_EXTRA_ARGS ="LOADADDR=0x20008000"
-PR = "r15"
+PR = "r16"
PKGR_kernel-module-i2c-at91 = "${PR}a${EXTENDPRAUTO}"
PKGR_kernel-module-atmel-mci = "${PR}a${EXTENDPRAUTO}"
KERNEL_VERSION = "${PV}"
@@ -64,6 +64,7 @@ SRC_URI_append_mtcdt = "\
file://mt-at91.h \
file://linux-4.9-mtcdt-device-tree.patch \
file://linux-4.9-mtcdt-atmel-multidrop.patch \
+ file://linux-4.9-rs485-atmel-crtscts.patch \
"
SRC_URI_append_mtrv1 = "\
${COMMON_PATCHES} \
diff --git a/recipes-kernel/linux/linux-at91_5.4.81.bb b/recipes-kernel/linux/linux-at91_5.4.81.bb
index 25839a9..6d0d9cb 100644
--- a/recipes-kernel/linux/linux-at91_5.4.81.bb
+++ b/recipes-kernel/linux/linux-at91_5.4.81.bb
@@ -45,6 +45,7 @@ COMMON_PATCHES = " \
file://linux-5.4-OF-DT-Overlay-configfs-interface.patch \
file://linux-5.4-revert-net-macb-Properly-handle-phylink-on-at91rm9200.patch \
file://linux-5.4-bring-back-PAE-bit-and-fix-NCFGR-values-applicable-f.patch \
+ file://linux-5.4-rs485-atmel-crtscts.patch \
file://mt-at91.h \
"
diff --git a/recipes-kernel/rs9113/files/rs9113/rs9113.init b/recipes-kernel/rs9113/files/rs9113/rs9113.init
index 4ef6f4b..6adeb5a 100755
--- a/recipes-kernel/rs9113/files/rs9113/rs9113.init
+++ b/recipes-kernel/rs9113/files/rs9113/rs9113.init
@@ -21,41 +21,70 @@ RS9113_WKUP=${MTS_IODIR}/wifi-bt-lpwkup
. $CONFIG
+pid=$$
+LOG_ERR=3
+LOG_INFO=6
+name=rs9113
+format="%s[%d] %12.2fs: %s"
+
+function syslog {
+ pr=$1
+ shift
+ [[ $(cat /proc/uptime) =~ ([^[:space:]]+) ]]
+ s=$(printf "${format}" $name $pid ${BASH_REMATCH[1]} "$@")
+ echo "<${pr}>${s}" >/dev/kmsg
+}
+
+function logpipe {
+ OIFS="${IFS}"
+ IFS=$'\n'
+ while read ln ; do
+ syslog $1 $ln
+ done
+ IFS="${OIFS}"
+}
+
+function rs9113_reset {
+ for i in {1..5} ; do
+ if [[ -f $RS9113_RESET ]] ; then
+ break
+ fi
+ done
+
+ # Reset the RS9113 chip is ready, and
+ # wait for it to settle.
+ for i in {1..5} ; do
+ if [[ -f $RS9113_RESET ]] ; then
+ echo 0 >$RS9113_RESET
+ usleep $SLEEPTIME
+ echo 1 >$RS9113_RESET
+ else
+ # No WiFi BT, so exit quietly
+ exit 0
+ fi
+ syslog $LOG_INFO "After reset $i complete"
+ for j in {0..250} ; do
+ if /usr/bin/lsusb -d 1618:9113 ; then
+ syslog $LOG_INFO "lsusb found 1618:9113 after reset $i"
+ break 2
+ fi
+ usleep 100000
+ done
+ if ((i > 1)) ; then
+ syslog $LOG_ERR "RS9113 not found after $i resets"
+ /usr/bin/lsusb | logpipe $LOG_ERR
+ fi
+ done
+}
+
case "$1" in
start)
if ((RS9113_LOAD == 0)) ; then
# We don't want the driver loaded.
exit 0
fi
- # Reset the RS9113 chip is ready, and
- # wait for it to settle.
- if [ -f "$RS9113_RESET" ] ; then
- echo 1 >$RS9113_RESET
- usleep $SLEEPTIME
- echo 0 >$RS9113_RESET
- usleep $SLEEPTIME
- echo 1 >$RS9113_RESET
- N=1
- while [ $N -lt 20 ] ; do
- INT=$(cat $RS9113_INT)
- WKUP=$(cat $RS9113_WKUP)
- if [ $INT -ne 1 -o $WKUP -ne 1 ] ; then
- usleep $INTSLEEPTIME
- else
- break
- fi
- done
- if [ $INT -ne 1 ] ; then
- logger -t rs9113 -p error -s "$RS9113_INT is $INT"
- fi
- if [ $WKUP -ne 1 ] ; then
- logger -t rs9113 -p error -s "$RS9113_WKUP is $WKUP"
- fi
- else
- # No WiFi BT, so exit quietly
- exit 0
- fi
- /usr/bin/logger -t "rs9113" -p info -s "Loading rs9113 modules with COEX=$COEX_MODE and Country=$SET_COUNTRY_CODE"
+ rs9113_reset
+ syslog $LOG_INFO "Loading rs9113 modules with COEX=$COEX_MODE and Country=$SET_COUNTRY_CODE"
/usr/sbin/rs9113_load_modules.sh $CONFIG
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
@@ -66,7 +95,7 @@ case "$1" in
;;
stop)
- /usr/bin/logger -t "rs9113" -p info -s "Unloading rs9113 modules"
+ syslog $LOG_INFO "Unloading rs9113 modules"
/usr/sbin/rs9113_remove_modules.sh
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
@@ -79,7 +108,7 @@ case "$1" in
$0 stop
sleep 1
$0 start
- ;;
+ ;;
status)
for dir in /sys/class/net/rpine[0-9]* ; do
if [[ -d ${dir} ]] ; then
@@ -90,8 +119,11 @@ case "$1" in
echo Driver is not loaded
exit 3
;;
+ reset)
+ rs9113_reset
+ ;;
*)
- "Usage: $0 {start|stop|status|restart}"
+ echo "Usage: $0 {start|stop|status|restart|reset}"
exit 2
;;
esac
diff --git a/recipes-kernel/rs9113/files/rs9113/rs9113.reset b/recipes-kernel/rs9113/files/rs9113/rs9113.reset
new file mode 100755
index 0000000..7992f7d
--- /dev/null
+++ b/recipes-kernel/rs9113/files/rs9113/rs9113.reset
@@ -0,0 +1,25 @@
+#!/bin/sh
+# Reset rs9113
+# Must be done after /etc/init.d/mts-io executes, and
+# before any code that probes the USB bus.
+function do_reset {
+ if ! [[ -w /sys/devices/platform/mts-io/wifi-bt-reset ]] ; then
+ exit 0
+ fi
+ /etc/init.d/rs9113 reset
+}
+
+case $1 in
+ start)
+ do_reset
+ ;;
+ stop)
+ ;;
+ reload)
+ do_reset
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|reload}"
+ exit 2
+ ;;
+esac
diff --git a/recipes-kernel/rs9113/rs9113-from-src_1.6.5.bb b/recipes-kernel/rs9113/rs9113-from-src_1.6.5.bb
index b9ddf80..8dac47e 100644
--- a/recipes-kernel/rs9113/rs9113-from-src_1.6.5.bb
+++ b/recipes-kernel/rs9113/rs9113-from-src_1.6.5.bb
@@ -2,14 +2,11 @@ DESCRIPTION = "USB Driver for Redpine RS9113"
LICENSE = "Proprietary"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Proprietary;md5=0557f9d92cf58f2ccdd50f62f8ac0b28"
PROVIDES = "rs9113-from-src"
-PR = "r10"
-PKGR = "${PR}${KERNEL_MODULE_PACKAGE_SUFFIX}${EXTENDPRAUTO}"
-do_fetch[depends] += "virtual/kernel:do_shared_workdir"
+PR = "r12${KERNEL_MODULE_PACKAGE_SUFFIX}"
INHIBIT_PACKAGE_STRIP = "1"
BB_STRICT_CHECKSUM = "0"
inherit module
SRCREV = "${PV}"
-ERROR_QA_remove = "debug-files"
# AUTOREV breaks mLinux source tarballs in Thud
# SRCREV = "${AUTOREV}"
diff --git a/recipes-kernel/rs9113/rs9113.inc b/recipes-kernel/rs9113/rs9113.inc
index 3f0eb66..9365a3e 100644
--- a/recipes-kernel/rs9113/rs9113.inc
+++ b/recipes-kernel/rs9113/rs9113.inc
@@ -17,6 +17,7 @@ PACKAGES = " \
${PN}-dbg \
${PN}-autostart \
${PN}-btclonly \
+ ${PN}-reset \
${PN}-noarch \
"
@@ -40,10 +41,15 @@ ALLOW_EMPTY_${PN}-btclonly = "1"
DR = "${DL_DIR}/rs9113-ipk"
FILESEXTRAPATHS_append := "${DR}:"
-INITSCRIPT_PACKAGES = "${PN}-autostart ${PN}-rm"
+INITSCRIPT_PACKAGES = "${PN}-autostart ${PN}-rm ${PN}-reset"
INITSCRIPT_NAME_${PN}-autostart = "rs9113"
INITSCRIPT_PARAMS_${PN}-autostart = "start 50 S ."
+
+INITSCRIPT_NAME_${PN}-reset = "rs9113-reset"
+INITSCRIPT_PARAMS_${PN}-reset = "start 40 S ."
+
+
# ${PN}-rm must start after mts-io driver is loaded.
INITSCRIPT_NAME_${PN}-rm = "mts-rm-rs9113"
INITSCRIPT_PARAMS_${PN}-rm = "start 39 S ."
@@ -168,6 +174,10 @@ FILES_${PN}-misc = " \
CONFFILES_${PN}-noarch = "${sysconfdir}/default/"
+FILES_${PN}-reset = " \
+ ${sysconfdir}/init.d/rs9113-reset \
+ "
+
# noarch gets what is left to package.
FILES_${PN}-noarch = " \
/opt/ \
@@ -192,6 +202,7 @@ do_install () {
install -d ${D}${sysconfdir}/default/
install -m 0755 ${MR}/wpa_supplicant ${D}/opt/rs9113/init.d
install -m 0755 ${MR}/rs9113.init ${D}${sysconfdir}/init.d/rs9113
+ install -m 0755 ${MR}/rs9113.reset ${D}${sysconfdir}/init.d/rs9113-reset
install -m 0644 ${MR}/rs9113.default ${D}${sysconfdir}/default/rs9113
install -m 0755 ${MR}/mts-rm-rs9113 ${D}${sysconfdir}/init.d/mts-rm-rs9113
}
diff --git a/recipes-kernel/rs9113/rs9113_1.6.5.bb b/recipes-kernel/rs9113/rs9113_1.6.5.bb
index edab39c..46578c9 100644
--- a/recipes-kernel/rs9113/rs9113_1.6.5.bb
+++ b/recipes-kernel/rs9113/rs9113_1.6.5.bb
@@ -17,16 +17,14 @@ COMPATIBLE_MACHINE = "(mtcdt|mtrv1)"
# To update this, manually copy ipk from Jenkin's job to
# git://git@${MTS_INTERNAL_GIT}/mlinux/ipk.git;protocol=ssh;branch=${PV}
#
-PR = "r10"
-
-PKGR = "${PR}${KERNEL_MODULE_PACKAGE_SUFFIX}${EXTENDPRAUTO}"
-
+PR = "r10${KERNEL_MODULE_PACKAGE_SUFFIX}"
SRC_URI = " \
file://rs9113/rs9113.init \
file://rs9113/rs9113.default \
+ file://rs9113/rs9113.reset \
file://rs9113/mts-rm-rs9113 \
file://rs9113/wpa_supplicant \
- file://rs9113-ipk/rs9113-from-src_${PV}-${PR}${KERNEL_MODULE_PACKAGE_SUFFIX}.0_${MACHINE}.ipk;name=binaries \
+ file://rs9113-ipk/rs9113-from-src_${PV}-${PR}.0_${MACHINE}.ipk;name=binaries \
"
SRCREV = "${PV}"