drivers/serial: Extend Altera Jtag Uart driver support
Extend Altera Jtag Uart driver support without Altera HAL driver by default. uart_altera_jtag_hal.c renamed to uart_altera_jtag.c and new config, CONFIG_UART_ALTERA_JTAG_HAL is introduced to allow driver to use Altera HAL driver when needed. Signed-off-by: Khor Swee Aun <swee.aun.khor@intel.com>
This commit is contained in:
parent
ad25e77698
commit
0431d10b10
5 changed files with 127 additions and 54 deletions
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
zephyr_library()
|
zephyr_library()
|
||||||
zephyr_library_sources_ifdef(CONFIG_UART_ALTERA_JTAG uart_altera_jtag_hal.c)
|
zephyr_library_sources_ifdef(CONFIG_UART_ALTERA_JTAG uart_altera_jtag.c)
|
||||||
zephyr_library_sources_ifdef(CONFIG_UART_TELINK_B91 uart_b91.c)
|
zephyr_library_sources_ifdef(CONFIG_UART_TELINK_B91 uart_b91.c)
|
||||||
zephyr_library_sources_ifdef(CONFIG_UART_IMX uart_imx.c)
|
zephyr_library_sources_ifdef(CONFIG_UART_IMX uart_imx.c)
|
||||||
zephyr_library_sources_ifdef(CONFIG_UART_ITE_IT8XXX2 uart_ite_it8xxx2.c)
|
zephyr_library_sources_ifdef(CONFIG_UART_ITE_IT8XXX2 uart_ite_it8xxx2.c)
|
||||||
|
|
|
@ -9,3 +9,7 @@ config UART_ALTERA_JTAG
|
||||||
help
|
help
|
||||||
Enable the Altera JTAG UART driver, built in to many Nios II CPU
|
Enable the Altera JTAG UART driver, built in to many Nios II CPU
|
||||||
designs.
|
designs.
|
||||||
|
|
||||||
|
config UART_ALTERA_JTAG_HAL
|
||||||
|
bool "JTAG UART driver using Altera HAL API"
|
||||||
|
depends on UART_ALTERA_JTAG
|
||||||
|
|
114
drivers/serial/uart_altera_jtag.c
Normal file
114
drivers/serial/uart_altera_jtag.c
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017 Intel Corporation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <kernel.h>
|
||||||
|
#include <arch/cpu.h>
|
||||||
|
#include <drivers/uart.h>
|
||||||
|
#include <sys/sys_io.h>
|
||||||
|
|
||||||
|
#define DT_DRV_COMPAT altr_jtag_uart
|
||||||
|
|
||||||
|
#define UART_ALTERA_JTAG_DATA_OFFSET 0x00 /* DATA : Register offset */
|
||||||
|
#define UART_ALTERA_JTAG_CTRL_OFFSET 0x04 /* CTRL : Register offset */
|
||||||
|
#define UART_IE_TX (1 << 0) /* CTRL : TX Interrupt Enable */
|
||||||
|
#define UART_IE_RX (1 << 1) /* CTRL : RX Interrupt Enable */
|
||||||
|
#define UART_DATA_MASK 0xFF /* DATA : Data Mask */
|
||||||
|
#define UART_WFIFO_MASK 0xFFFF0000 /* CTRL : Transmit FIFO Mask */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_ALTERA_JTAG_HAL
|
||||||
|
#include "altera_avalon_jtag_uart.h"
|
||||||
|
#include "altera_avalon_jtag_uart_regs.h"
|
||||||
|
|
||||||
|
extern int altera_avalon_jtag_uart_read(altera_avalon_jtag_uart_state *sp,
|
||||||
|
char *buffer, int space, int flags);
|
||||||
|
extern int altera_avalon_jtag_uart_write(altera_avalon_jtag_uart_state *sp,
|
||||||
|
const char *ptr, int count, int flags);
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* device data */
|
||||||
|
struct uart_altera_jtag_device_data {
|
||||||
|
struct k_spinlock lock;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* device config */
|
||||||
|
struct uart_altera_jtag_device_config {
|
||||||
|
mm_reg_t base;
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_UART_ALTERA_JTAG_HAL */
|
||||||
|
|
||||||
|
static void uart_altera_jtag_poll_out(const struct device *dev,
|
||||||
|
unsigned char c)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_UART_ALTERA_JTAG_HAL
|
||||||
|
altera_avalon_jtag_uart_state ustate;
|
||||||
|
|
||||||
|
ustate.base = JTAG_UART_0_BASE;
|
||||||
|
altera_avalon_jtag_uart_write(&ustate, &c, 1, 0);
|
||||||
|
#else
|
||||||
|
const struct uart_altera_jtag_device_config *config = dev->config;
|
||||||
|
struct uart_altera_jtag_device_data *data = dev->data;
|
||||||
|
|
||||||
|
k_spinlock_key_t key = k_spin_lock(&data->lock);
|
||||||
|
|
||||||
|
/* While TX FIFO full */
|
||||||
|
while (!(sys_read32(config->base + UART_ALTERA_JTAG_CTRL_OFFSET) & UART_WFIFO_MASK)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t data_val = sys_read32(config->base + UART_ALTERA_JTAG_DATA_OFFSET);
|
||||||
|
|
||||||
|
data_val &= ~UART_DATA_MASK;
|
||||||
|
data_val |= c;
|
||||||
|
sys_write32(data_val, config->base + UART_ALTERA_JTAG_DATA_OFFSET);
|
||||||
|
|
||||||
|
k_spin_unlock(&data->lock, key);
|
||||||
|
#endif /* CONFIG_UART_ALTERA_JTAG_HAL */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_altera_jtag_init(const struct device *dev)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Work around to clear interrupt enable bits
|
||||||
|
* as it is not being done by HAL driver explicitly.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_UART_ALTERA_JTAG_HAL
|
||||||
|
IOWR_ALTERA_AVALON_JTAG_UART_CONTROL(JTAG_UART_0_BASE, 0);
|
||||||
|
#else
|
||||||
|
const struct uart_altera_jtag_device_config *config = dev->config;
|
||||||
|
uint32_t ctrl_val = sys_read32(config->base + UART_ALTERA_JTAG_CTRL_OFFSET);
|
||||||
|
|
||||||
|
ctrl_val &= ~(UART_IE_TX | UART_IE_RX);
|
||||||
|
sys_write32(ctrl_val, sys_read32(config->base + UART_ALTERA_JTAG_CTRL_OFFSET));
|
||||||
|
#endif /* CONFIG_UART_ALTERA_JTAG_HAL */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct uart_driver_api uart_altera_jtag_driver_api = {
|
||||||
|
.poll_in = NULL,
|
||||||
|
.poll_out = &uart_altera_jtag_poll_out,
|
||||||
|
.err_check = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_ALTERA_JTAG_HAL
|
||||||
|
DEVICE_DT_INST_DEFINE(0, uart_altera_jtag_init, NULL, NULL, NULL, PRE_KERNEL_1,
|
||||||
|
CONFIG_SERIAL_INIT_PRIORITY,
|
||||||
|
&uart_altera_jtag_driver_api);
|
||||||
|
#else
|
||||||
|
static struct uart_altera_jtag_device_data uart_altera_jtag_dev_data_0 = {
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct uart_altera_jtag_device_config uart_altera_jtag_dev_cfg_0 = {
|
||||||
|
.base = DT_INST_REG_ADDR(0),
|
||||||
|
};
|
||||||
|
DEVICE_DT_INST_DEFINE(0,
|
||||||
|
uart_altera_jtag_init,
|
||||||
|
NULL,
|
||||||
|
&uart_altera_jtag_dev_data_0,
|
||||||
|
&uart_altera_jtag_dev_cfg_0,
|
||||||
|
PRE_KERNEL_1,
|
||||||
|
CONFIG_SERIAL_INIT_PRIORITY,
|
||||||
|
&uart_altera_jtag_driver_api);
|
||||||
|
#endif /* CONFIG_UART_ALTERA_JTAG_HAL */
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2017 Intel Corporation
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <kernel.h>
|
|
||||||
#include <arch/cpu.h>
|
|
||||||
#include <drivers/uart.h>
|
|
||||||
#include <sys/sys_io.h>
|
|
||||||
|
|
||||||
#include "altera_avalon_jtag_uart.h"
|
|
||||||
#include "altera_avalon_jtag_uart_regs.h"
|
|
||||||
|
|
||||||
#define DT_DRV_COMPAT altr_jtag_uart
|
|
||||||
|
|
||||||
#define UART_ALTERA_JTAG_DATA_REG 0
|
|
||||||
#define UART_ALTERA_JTAG_CONTROL_REG 1
|
|
||||||
|
|
||||||
extern int altera_avalon_jtag_uart_read(altera_avalon_jtag_uart_state *sp,
|
|
||||||
char *buffer, int space, int flags);
|
|
||||||
extern int altera_avalon_jtag_uart_write(altera_avalon_jtag_uart_state *sp,
|
|
||||||
const char *ptr, int count, int flags);
|
|
||||||
|
|
||||||
static void uart_altera_jtag_poll_out(const struct device *dev,
|
|
||||||
unsigned char c)
|
|
||||||
{
|
|
||||||
altera_avalon_jtag_uart_state ustate;
|
|
||||||
|
|
||||||
ustate.base = JTAG_UART_0_BASE;
|
|
||||||
altera_avalon_jtag_uart_write(&ustate, &c, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uart_altera_jtag_init(const struct device *dev)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Work around to clear interrupt enable bits
|
|
||||||
* as it is not being done by HAL driver explicitly.
|
|
||||||
*/
|
|
||||||
IOWR_ALTERA_AVALON_JTAG_UART_CONTROL(JTAG_UART_0_BASE, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct uart_driver_api uart_altera_jtag_driver_api = {
|
|
||||||
.poll_in = NULL,
|
|
||||||
.poll_out = &uart_altera_jtag_poll_out,
|
|
||||||
.err_check = NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
DEVICE_DT_INST_DEFINE(0, uart_altera_jtag_init, NULL, NULL, NULL, PRE_KERNEL_1,
|
|
||||||
CONFIG_SERIAL_INIT_PRIORITY,
|
|
||||||
&uart_altera_jtag_driver_api);
|
|
|
@ -44,6 +44,14 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jtag_uart: uart@201000 {
|
||||||
|
compatible = "altr,jtag-uart";
|
||||||
|
reg = <0x201000 0x8>;
|
||||||
|
label = "JTAG_UART";
|
||||||
|
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
i2c0: i2c@100200 {
|
i2c0: i2c@100200 {
|
||||||
compatible = "altr,nios2-i2c";
|
compatible = "altr,nios2-i2c";
|
||||||
clock-frequency = <I2C_BITRATE_ULTRA>;
|
clock-frequency = <I2C_BITRATE_ULTRA>;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue