diff options
author | Damien Le Moal <damien.lemoal@wdc.com> | 2019-09-04 13:27:27 +0900 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2019-09-05 18:47:56 +0530 |
commit | fca8c3be0122d4b90cef572aefddd65c27fcaba6 (patch) | |
tree | e71068ed5e5d0d0e3f2f29a7760e20181556bd2e /platform | |
parent | 6ed2bc154f99d3c067775d8a83bcd42a44838dcf (diff) |
kendryte/k210: Use sifive UART driver
The Kendryte K210 UARTHS is compatible with SiFive UART. So use the
sifive uart driver and remove the k210 uarths platform code.
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/kendryte/k210/objects.mk | 2 | ||||
-rw-r--r-- | platform/kendryte/k210/platform.c | 25 | ||||
-rw-r--r-- | platform/kendryte/k210/uarths.c | 64 | ||||
-rw-r--r-- | platform/kendryte/k210/uarths.h | 171 |
4 files changed, 9 insertions, 253 deletions
diff --git a/platform/kendryte/k210/objects.mk b/platform/kendryte/k210/objects.mk index 1924d7a..58ba7c6 100644 --- a/platform/kendryte/k210/objects.mk +++ b/platform/kendryte/k210/objects.mk @@ -7,5 +7,5 @@ # Damien Le Moal <damien.lemoal@wdc.com> # -platform-objs-y += uarths.o sysctl.o platform.o +platform-objs-y += sysctl.o platform.o platform-dtb-y += k210.dtb diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c index 19c569c..a986651 100644 --- a/platform/kendryte/k210/platform.c +++ b/platform/kendryte/k210/platform.c @@ -14,26 +14,17 @@ #include <sbi/sbi_console.h> #include <sbi_utils/irqchip/plic.h> #include <sbi_utils/sys/clint.h> +#include <sbi_utils/serial/sifive-uart.h> #include "platform.h" -#include "uarths.h" +#include "sysctl.h" -#define K210_UART_BAUDRATE 115200 +#define K210_UART_BASE_ADDR 0x38000000U +#define K210_UART_BAUDRATE 115200 static int k210_console_init(void) { - uarths_init(K210_UART_BAUDRATE, UARTHS_STOP_1); - - return 0; -} - -static void k210_console_putc(char c) -{ - uarths_putc(c); -} - -static int k210_console_getc(void) -{ - return uarths_getc(); + return sifive_uart_init(K210_UART_BASE_ADDR, + sysctl_get_cpu_freq(), K210_UART_BAUDRATE); } static int k210_irqchip_init(bool cold_boot) @@ -95,8 +86,8 @@ static int k210_system_shutdown(u32 type) const struct sbi_platform_operations platform_ops = { .console_init = k210_console_init, - .console_putc = k210_console_putc, - .console_getc = k210_console_getc, + .console_putc = sifive_uart_putc, + .console_getc = sifive_uart_getc, .irqchip_init = k210_irqchip_init, diff --git a/platform/kendryte/k210/uarths.c b/platform/kendryte/k210/uarths.c deleted file mode 100644 index 67d5d1c..0000000 --- a/platform/kendryte/k210/uarths.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright 2018 Canaan Inc. - * Copyright (c) 2019 Western Digital Corporation or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "sysctl.h" -#include "uarths.h" - -static volatile struct uarths *const uarths = - (volatile struct uarths *)UARTHS_BASE_ADDR; - -void uarths_init(u32 baud_rate, enum uarths_stopbit stopbit) -{ - u32 freq = sysctl_get_cpu_freq(); - u16 div = freq / baud_rate - 1; - - /* Set UART registers */ - uarths->div.div = div; - uarths->txctrl.nstop = stopbit; - uarths->txctrl.txen = 1; - uarths->rxctrl.rxen = 1; - uarths->txctrl.txcnt = 0; - uarths->rxctrl.rxcnt = 0; - uarths->ip.txwm = 1; - uarths->ip.rxwm = 0; - uarths->ie.txwm = 1; - uarths->ie.rxwm = 0; - - /* Clear input */ - if (!uarths->rxdata.empty) - (void)uarths_getc(); -} - -void uarths_putc(char c) -{ - while (uarths->txdata.full) - ; - - uarths->txdata.data = (u8)c; -} - -int uarths_getc(void) -{ - struct uarths_rxdata rx = uarths->rxdata; - - if (rx.empty) - return -1; - - return rx.data; -} diff --git a/platform/kendryte/k210/uarths.h b/platform/kendryte/k210/uarths.h deleted file mode 100644 index 18b7e95..0000000 --- a/platform/kendryte/k210/uarths.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright 2018 Canaan Inc. - * Copyright (c) 2019 Western Digital Corporation or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Universal Asynchronous Receiver/Transmitter (UART) - * The UART peripheral supports the following features: - * - * - 8-N-1 and 8-N-2 formats: 8 data bits, no parity bit, 1 start - * bit, 1 or 2 stop bits - * - * - 8-entry transmit and receive FIFO buffers with programmable - * watermark interrupts - * - * - 16× Rx oversampling with 2/3 majority voting per bit - * - * The UART peripheral does not support hardware flow control or - * other modem control signals, or synchronous serial data - * tranfesrs. - * - * UART RAM Layout - * | Address | Name | Description | - * |-----------|----------|---------------------------------| - * | 0x000 | txdata | Transmit data register | - * | 0x004 | rxdata | Receive data register | - * | 0x008 | txctrl | Transmit control register | - * | 0x00C | rxctrl | Receive control register | - * | 0x010 | ie | UART interrupt enable | - * | 0x014 | ip | UART Interrupt pending | - * | 0x018 | div | Baud rate divisor | - */ - -#ifndef _K210_UARTHS_H_ -#define _K210_UARTHS_H_ - -#include <sbi/sbi_types.h> - -/* clang-format off */ - -/* Base register address */ -#define UARTHS_BASE_ADDR (0x38000000U) - -/* Register address offsets */ -#define UARTHS_REG_TXFIFO 0x00 -#define UARTHS_REG_RXFIFO 0x04 -#define UARTHS_REG_TXCTRL 0x08 -#define UARTHS_REG_RXCTRL 0x0c -#define UARTHS_REG_IE 0x10 -#define UARTHS_REG_IP 0x14 -#define UARTHS_REG_DIV 0x18 - -/* TXCTRL register */ -#define UARTHS_TXEN 0x01 -#define UARTHS_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UARTHS_RXEN 0x01 -#define UARTHS_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UARTHS_IP_TXWM 0x01 -#define UARTHS_IP_RXWM 0x02 - -/* clang-format on */ - -struct uarths_txdata { - /* Bits [7:0] is data */ - u32 data : 8; - /* Bits [30:8] is 0 */ - u32 zero : 23; - /* Bit 31 is full status */ - u32 full : 1; -} __attribute__((packed, aligned(4))); - -struct uarths_rxdata { - /* Bits [7:0] is data */ - u32 data : 8; - /* Bits [30:8] is 0 */ - u32 zero : 23; - /* Bit 31 is empty status */ - u32 empty : 1; -} __attribute__((packed, aligned(4))); - -struct uarths_txctrl { - /* Bit 0 is txen, controls whether the Tx channel is active. */ - u32 txen : 1; - /* Bit 1 is nstop, 0 for one stop bit and 1 for two stop bits */ - u32 nstop : 1; - /* Bits [15:2] is reserved */ - u32 resv0 : 14; - /* Bits [18:16] is threshold of interrupt triggers */ - u32 txcnt : 3; - /* Bits [31:19] is reserved */ - u32 resv1 : 13; -} __attribute__((packed, aligned(4))); - -struct uarths_rxctrl { - /* Bit 0 is txen, controls whether the Tx channel is active. */ - u32 rxen : 1; - /* Bits [15:1] is reserved */ - u32 resv0 : 15; - /* Bits [18:16] is threshold of interrupt triggers */ - u32 rxcnt : 3; - /* Bits [31:19] is reserved */ - u32 resv1 : 13; -} __attribute__((packed, aligned(4))); - -struct uarths_ip { - /* Bit 0 is txwm, raised less than txcnt */ - u32 txwm : 1; - /* Bit 1 is txwm, raised greater than rxcnt */ - u32 rxwm : 1; - /* Bits [31:2] is 0 */ - u32 zero : 30; -} __attribute__((packed, aligned(4))); - -struct uarths_ie { - /* Bit 0 is txwm, raised less than txcnt */ - u32 txwm : 1; - /* Bit 1 is txwm, raised greater than rxcnt */ - u32 rxwm : 1; - /* Bits [31:2] is 0 */ - u32 zero : 30; -} __attribute__((packed, aligned(4))); - -struct uarths_div { - /* Bits [31:2] is baud rate divisor register */ - u32 div : 16; - /* Bits [31:16] is 0 */ - u32 zero : 16; -} __attribute__((packed, aligned(4))); - -struct uarths { - /* Address offset 0x00 */ - struct uarths_txdata txdata; - /* Address offset 0x04 */ - struct uarths_rxdata rxdata; - /* Address offset 0x08 */ - struct uarths_txctrl txctrl; - /* Address offset 0x0c */ - struct uarths_rxctrl rxctrl; - /* Address offset 0x10 */ - struct uarths_ie ie; - /* Address offset 0x14 */ - struct uarths_ip ip; - /* Address offset 0x18 */ - struct uarths_div div; -} __attribute__((packed, aligned(4))); - -enum uarths_stopbit { UARTHS_STOP_1, UARTHS_STOP_2 }; - -void uarths_init(u32 baud_rate, enum uarths_stopbit stopbit); -void uarths_putc(char c); -int uarths_getc(void); - -#endif /* _K210_UARTHS_H_ */ |