| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| |
| #include <kernel.h> |
| #include <arch/cpu.h> |
| #include <uart.h> |
| #include <sys_io.h> |
| |
| #define UART_ALTERA_JTAG_DATA_REG 0 |
| #define UART_ALTERA_JTAG_DATA_DATA_MSK (0x000000FF) |
| #define UART_ALTERA_JTAG_DATA_DATA_OFST (0) |
| #define UART_ALTERA_JTAG_DATA_RVALID_MSK (0x00008000) |
| #define UART_ALTERA_JTAG_DATA_RVALID_OFST (15) |
| #define UART_ALTERA_JTAG_DATA_RAVAIL_MSK (0xFFFF0000) |
| #define UART_ALTERA_JTAG_DATA_RAVAIL_OFST (16) |
| |
| |
| #define UART_ALTERA_JTAG_CONTROL_REG 1 |
| #define UART_ALTERA_JTAG_CONTROL_RE_MSK (0x00000001) |
| #define UART_ALTERA_JTAG_CONTROL_RE_OFST (0) |
| #define UART_ALTERA_JTAG_CONTROL_WE_MSK (0x00000002) |
| #define UART_ALTERA_JTAG_CONTROL_WE_OFST (1) |
| #define UART_ALTERA_JTAG_CONTROL_RI_MSK (0x00000100) |
| #define UART_ALTERA_JTAG_CONTROL_RI_OFST (8) |
| #define UART_ALTERA_JTAG_CONTROL_WI_MSK (0x00000200) |
| #define UART_ALTERA_JTAG_CONTROL_WI_OFST (9) |
| #define UART_ALTERA_JTAG_CONTROL_AC_MSK (0x00000400) |
| #define UART_ALTERA_JTAG_CONTROL_AC_OFST (10) |
| #define UART_ALTERA_JTAG_CONTROL_WSPACE_MSK (0xFFFF0000) |
| #define UART_ALTERA_JTAG_CONTROL_WSPACE_OFST (16) |
| |
| #define DEV_CFG(dev) \ |
| ((const struct uart_device_config * const)(dev)->config->config_info) |
| |
| static u32_t control_reg_read(void *base) |
| { |
| return _nios2_reg_read(base, UART_ALTERA_JTAG_CONTROL_REG); |
| } |
| |
| |
| static void control_reg_write(void *base, u32_t data) |
| { |
| return _nios2_reg_write(base, UART_ALTERA_JTAG_CONTROL_REG, data); |
| } |
| |
| |
| static void data_reg_write(void *base, u32_t data) |
| { |
| return _nios2_reg_write(base, UART_ALTERA_JTAG_DATA_REG, data); |
| } |
| |
| |
| static unsigned char uart_altera_jtag_poll_out(struct device *dev, |
| unsigned char c) |
| { |
| const struct uart_device_config *config; |
| |
| config = DEV_CFG(dev); |
| |
| while (!(control_reg_read(config->base) & |
| UART_ALTERA_JTAG_CONTROL_WSPACE_MSK)) { |
| /* Busy loop until FIFO space frees up */ |
| } |
| data_reg_write(config->base, c); |
| return 0; |
| } |
| |
| |
| static int uart_altera_jtag_init(struct device *dev) |
| { |
| const struct uart_device_config *config; |
| |
| config = DEV_CFG(dev); |
| /* Clear interrupt enable bits */ |
| control_reg_write(config->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, |
| }; |
| |
| static const struct uart_device_config uart_altera_jtag_dev_cfg_0 = { |
| .base = (void *)JTAG_UART_0_BASE, |
| .sys_clk_freq = 0, /* Unused */ |
| }; |
| |
| DEVICE_AND_API_INIT(uart_altera_jtag_0, "jtag_uart0", |
| uart_altera_jtag_init, NULL, |
| &uart_altera_jtag_dev_cfg_0, |
| PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, |
| &uart_altera_jtag_driver_api); |