From 9edc73013bbf20d5ca7df67df46699ca32c3e371 Mon Sep 17 00:00:00 2001 From: Alexander Krutwig Date: Fri, 16 Sep 2016 15:21:26 +0200 Subject: dev: Add NXP SC16IS752 serial device driver Update #2841. --- cpukit/dev/include/dev/serial/sc16is752.h | 262 ++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 cpukit/dev/include/dev/serial/sc16is752.h (limited to 'cpukit/dev/include/dev/serial/sc16is752.h') diff --git a/cpukit/dev/include/dev/serial/sc16is752.h b/cpukit/dev/include/dev/serial/sc16is752.h new file mode 100644 index 0000000000..7e5b47aaa2 --- /dev/null +++ b/cpukit/dev/include/dev/serial/sc16is752.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef _DEV_SERIAL_SC16IS752_H +#define _DEV_SERIAL_SC16IS752_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup SC16IS752 SC16IS752 Serial Device Driver + * + * @ingroup TermiostypesSupport + */ + +typedef enum { + SC16IS752_MODE_RS232, + SC16IS752_MODE_RS485 +} sc16is752_mode; + +typedef struct sc16is752_context sc16is752_context; + +/** + * @brief SC16IS752 device context. + */ +struct sc16is752_context { + rtems_termios_device_context base; + + /** + * @brief Writes a register. + * + * Internal handler. + */ + int (*write_reg)( + sc16is752_context *ctx, + uint8_t addr, + const uint8_t *data, + size_t len + ); + + /** + * @brief Reads a register. + * + * Internal handler. + */ + int (*read_reg)( + sc16is752_context *ctx, + uint8_t addr, + uint8_t *data, + size_t len + ); + + /** + * @brief Reads two registers. + * + * Internal handler. + */ + int (*read_2_reg)( + sc16is752_context *ctx, + uint8_t addr_0, + uint8_t addr_1, + uint8_t data[2] + ); + + /** + * @brief First open. + * + * Internal handler. + */ + bool (*first_open)(sc16is752_context *ctx); + + /** + * @brief Last close. + * + * Internal handler. + */ + void (*last_close)(sc16is752_context *ctx); + + /** + * @brief Shall install the interrupt handler. + * + * Must be initialized by the user before the device creation. + */ + bool (*install_irq)(sc16is752_context *ctx); + + /** + * @brief Shall remove the interrupt handler. + * + * Must be initialized by the user before the device creation. + */ + void (*remove_irq)(sc16is752_context *ctx); + + /** + * @brief Device mode. + * + * Must be initialized by the user before the device creation. + */ + sc16is752_mode mode; + + /** + * @brief Input frequency in Hertz (dependent on crystal, see XTAL1 and XTAL2 + * pins). + * + * Must be initialized by the user before the device creation. + */ + uint32_t input_frequency; + + /** + * @brief Corresponding Termios structure. + * + * Internal variable. + */ + rtems_termios_tty *tty; + + /** + * @brief Shadow Interrupt Enable Register (IER). + * + * Internal variable. + */ + uint8_t ier; + + /** + * @brief Characters placed into transmit FIFO. + * + * Internal variable. + */ + uint8_t tx_in_progress; + + /** + * @brief Count of free characters in the transmit FIFO. + * + * Internal variable. + */ + uint8_t tx_fifo_free; + + /** + * @brief Shadow Line Control Register (LCR). + * + * Internal variable. + */ + uint8_t lcr; + + /** + * @brief Shadow Extra Features Control Register (EFCR). + * + * Internal variable. + */ + uint8_t efcr; +}; + +/** + * @brief SC16IS752 SPI context. + */ +typedef struct { + sc16is752_context base; + + /** + * @brief The SPI bus device file descriptor. + * + * Internal variable. + */ + int fd; + + /** + * @brief The SPI device chip select. + * + * Must be initialized by the user before the call to sc16is752_spi_create(). + */ + uint8_t cs; + + /** + * @brief The SPI bus speed in Hertz. + * + * Must be initialized by the user before the call to sc16is752_spi_create(). + */ + uint32_t speed_hz; + + /** + * @brief The SPI bus device path. + * + * Must be initialized by the user before the call to sc16is752_spi_create(). + */ + const char *spi_path; +} sc16is752_spi_context; + +/** + * @brief SC16IS752 I2C context. + */ +typedef struct { + sc16is752_context base; + + /** + * @brief The I2C bus device file descriptor. + * + * Internal variable. + */ + int fd; + + /** + * @brief The I2C bus device path. + * + * Must be initialized before the call to sc16is752_i2c_create(). + */ + const char *bus_path; +} sc16is752_i2c_context; + +const rtems_termios_device_handler sc16is752_termios_handler; + +/** + * @brief The interrupt handler for receive and transmit operations. + * + * @param[in] arg The device context. + */ +void sc16is752_interrupt_handler(void *arg); + +/** + * @brief Creates an SPI connected SC16IS752 device. + * + * @param[in] ctx The SPI SC16IS752 device context. + * @param[in] device_path The device file path for the new device. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval other See rtems_termios_device_install(). + */ +rtems_status_code sc16is752_spi_create( + sc16is752_spi_context *ctx, + const char *device_path +); + +/** + * @brief Enables the sleep mode if non-zero, otherwise disables it. + * + * The sleep mode is disabled by default. + */ +#define SC16IS752_SET_SLEEP_MODE _IOW('d', 0, int) + +/** + * @brief Returns non-zero in case the sleep mode is enabled, otherwise zero. + */ +#define SC16IS752_GET_SLEEP_MODE _IOR('d', 0, int) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _DEV_SERIAL_SC16IS752_H */ -- cgit v1.2.3