You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.0 KiB
86 lines
2.0 KiB
/* |
|
* Copyright (c) 2022 Antmicro <www.antmicro.com> |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#define DT_DRV_COMPAT quicklogic_usbserialport_s3b |
|
|
|
#include <zephyr/kernel.h> |
|
#include <zephyr/drivers/uart.h> |
|
#include <eoss3_dev.h> |
|
|
|
#include "uart_ql_usbserialport_s3b.h" |
|
|
|
/* |
|
* code is a modified version of usbserial driver from https://github.com/QuickLogic-Corp/qorc-sdk |
|
* freertos_gateware/src/eoss3_hal_fpga_usbserial.c |
|
* freertos_gateware/inc/eoss3_hal_fpga_usbserial.h |
|
*/ |
|
|
|
volatile struct fpga_usbserial_regs *usbserial_regs |
|
= (struct fpga_usbserial_regs *)(FPGA_PERIPH_BASE); |
|
|
|
static uint32_t usbserial_tx_fifo_status(void) |
|
{ |
|
return usbserial_regs->m2u_fifo_flags; |
|
} |
|
|
|
static bool usbserial_tx_fifo_full(void) |
|
{ |
|
return usbserial_tx_fifo_status() == USBSERIAL_TX_FIFO_FULL; |
|
} |
|
|
|
static uint32_t usbserial_rx_fifo_status(void) |
|
{ |
|
return usbserial_regs->u2m_fifo_flags; |
|
} |
|
|
|
static bool usbserial_rx_fifo_empty(void) |
|
{ |
|
return usbserial_rx_fifo_status() == USBSERIAL_RX_FIFO_EMPTY; |
|
} |
|
|
|
/** |
|
* @brief Output a character in polled mode. |
|
* |
|
* Writes data to tx register. Waits for space if transmitter is full. |
|
* |
|
* @param dev UART device struct |
|
* @param c Character to send |
|
*/ |
|
static void uart_usbserial_poll_out(const struct device *dev, unsigned char c) |
|
{ |
|
/* Wait for room in Tx FIFO */ |
|
while (usbserial_tx_fifo_full()) { |
|
; |
|
} |
|
usbserial_regs->wdata = c; |
|
} |
|
|
|
/** |
|
* @brief Poll the device for input. |
|
* |
|
* @param dev UART device struct |
|
* @param c Pointer to character |
|
* |
|
* @return 0 if a character arrived, -1 if the input buffer if empty. |
|
*/ |
|
static int uart_usbserial_poll_in(const struct device *dev, unsigned char *c) |
|
{ |
|
if (usbserial_rx_fifo_empty()) { |
|
return -1; |
|
} |
|
|
|
*c = usbserial_regs->rdata; |
|
return 0; |
|
} |
|
|
|
static DEVICE_API(uart, uart_usbserial_driver_api) = { |
|
.poll_in = uart_usbserial_poll_in, |
|
.poll_out = uart_usbserial_poll_out, |
|
}; |
|
|
|
DEVICE_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, PRE_KERNEL_1, |
|
CONFIG_SERIAL_INIT_PRIORITY, |
|
(void *)&uart_usbserial_driver_api);
|
|
|