X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Fser.h;h=4f69a2af780c00c6d121ece2fc1647771bd790ee;hb=941529ddc4cddd04f69d38c0929ec00fe93aadef;hp=ad643e356c2443418dcf4de1e73c38e0db18d6e3;hpb=0375780817109b6ab5cd4f36ccf80650b2fe77d5;p=bertos.git diff --git a/drv/ser.h b/drv/ser.h old mode 100755 new mode 100644 index ad643e35..4f69a2af --- a/drv/ser.h +++ b/drv/ser.h @@ -1,196 +1,164 @@ -/*! +/** * \file * + * This file is part of BeRTOS. * - * \brief High level serial I/O API + * Bertos is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * \version $Id$ - * \author Bernardo Innocenti - */ - -/* - * $Log$ - * Revision 1.1 2004/05/23 18:10:11 bernie - * Import drv/ modules. - * - * Revision 1.2 2004/04/21 17:38:24 rasky - * New application + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * Revision 1.16 2004/04/03 18:30:49 aleph - * Move timeout defines in config, private define in .c + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * - * Revision 1.15 2004/03/29 17:01:02 aleph - * Add function to set serial parity, fix it when ser_open is used + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. * - * Revision 1.14 2004/03/29 16:19:33 aleph - * Add ser_cleanup function; Various code improvements - * - * Revision 1.13 2004/03/24 15:22:27 aleph - * Removed subdirs -I, fix header inclusion, move config.h in board_kf, kctrl - * - * Revision 1.12 2004/03/17 17:30:30 bernie - * Add GCC format checks to printf()-like functions. + * Copyright 2003,2004 Develer S.r.l. (http://www.develer.com/) + * Copyright 2000 Bernardo Innocenti * - * Revision 1.11 2004/03/16 23:06:42 aleph - * Doc fix + * --> * - * Revision 1.10 2004/03/12 18:46:53 bernie - * ser_read(): New function. + * \brief High level serial I/O API * - * Revision 1.9 2004/03/11 18:11:51 bernie - * Cosmetic fixes + * \version $Id$ + * \author Bernardo Innocenti */ -#ifndef SER_H -#define SER_H -#include "compiler.h" +#ifndef DRV_SER_H +#define DRV_SER_H + + #include -#include "config.h" +#include -/*! - * \name Serial Error/status flags - * - * Some of these flags map directly to the flags - * in AVR UART Status Register(USR). - * \todo flags of DSP56k aren't mapped to these flags. Luckily - * these flags doesn't collide with the DSP56k ones, - * which are from 0x0100 to 0x8000 +#include CPU_HEADER(ser) + +#include + + + +/** + * \name Masks to group TX/RX errors. + * \{ */ -/*\{*/ -#if defined(__AVR__) - /* Software errors */ - #define SERRF_RXFIFOOVERRUN BV(0) /*!< Rx FIFO buffer overrun */ - #define SERRF_RXTIMEOUT BV(5) /*!< Receive timeout */ - #define SERRF_TXTIMEOUT BV(6) /*!< Transmit timeout */ - - /* Hardware errors */ - #define SERRF_RXSROVERRUN BV(3) /*!< Rx shift register overrun */ - #define SERRF_FRAMEERROR BV(4) /*!< Stop bit missing */ - #define SERRF_PARITYERROR BV(7) /*!< Parity error */ -#elif defined(__m56800__) - /* Software errors */ - #define SERRF_RXFIFOOVERRUN BV(0) /*!< Rx FIFO buffer overrun */ - #define SERRF_RXTIMEOUT BV(1) /*!< Receive timeout */ - #define SERRF_TXTIMEOUT BV(2) /*!< Transmit timeout */ - - /* Hardware errors */ - #define SERRF_PARITYERROR BV(8) /*!< Parity error */ - #define SERRF_FRAMEERROR BV(9) /*!< Stop bit missing */ - #define SERRF_NOISEERROR BV(10) /*!< Noise error */ - #define SERRF_RXSROVERRUN BV(11) /*!< Rx shift register overrun */ -#else - #error unknown architecture -#endif +#define SERRF_RX \ + ( SERRF_RXFIFOOVERRUN \ + | SERRF_RXTIMEOUT \ + | SERRF_RXSROVERRUN \ + | SERRF_PARITYERROR \ + | SERRF_FRAMEERROR \ + | SERRF_NOISEERROR) +#define SERRF_TX (SERRF_TXTIMEOUT) /*\}*/ -/*! \name Parity settings for ser_setparity() */ -/*\{*/ -#define SER_PARITY_NONE 0 -#define SER_PARITY_EVEN 2 -#define SER_PARITY_ODD 3 +/** + * \name LSB or MSB first data order for SPI driver. + * \{ + */ +#define SER_MSB_FIRST 0 +#define SER_LSB_FIRST 1 /*\}*/ -/*! - * \name Serial hw numbers +/** + * \name Parity settings for ser_setparity(). * + * \note Values are AVR-specific for performance reasons. + * Other processors should either decode them or + * redefine these macros. * \{ */ -enum -{ - #if defined(__AVR_ATmega64__) - SER_UART0, - SER_UART1, - SER_SPI, - - #elif defined(__AVR_ATmega103__) - SER_UART0, - SER_SPI, - - #elif defined (__m56800__) - SER_UART0, - SER_UART1, - - #else - #error unknown architecture - #endif - - SER_CNT /**< Number of serial ports */ -}; -/* @} */ +#define SER_PARITY_NONE 0 +#define SER_PARITY_EVEN 2 +#define SER_PARITY_ODD 3 +/*\}*/ struct SerialHardware; -/*! Human-readable serial error descriptions */ +/** Human-readable serial error descriptions */ extern const char * const serial_errors[8]; -/*! Serial handle structure */ -struct Serial +/** Serial handle structure */ +typedef struct Serial { - /*! Physical port number */ + /** Physical port number */ unsigned int unit; +#ifdef _DEBUG bool is_open; +#endif - /*! - * \name FIFO transmit and receive buffers. + /** + * \name Transmit and receive FIFOs. * * Declared volatile because handled asinchronously by interrupts. * * \{ */ - volatile FIFOBuffer txfifo; - volatile FIFOBuffer rxfifo; - unsigned char txbuffer[CONFIG_SER_TXBUFSIZE]; - unsigned char rxbuffer[CONFIG_SER_RXBUFSIZE]; + FIFOBuffer txfifo; + FIFOBuffer rxfifo; /* \} */ -#ifdef CONFIG_SER_RXTIMEOUT - time_t rxtimeout; +#if CONFIG_SER_RXTIMEOUT != -1 + ticks_t rxtimeout; #endif -#ifdef CONFIG_SER_TXTIMEOUT - time_t txtimeout; +#if CONFIG_SER_TXTIMEOUT != -1 + ticks_t txtimeout; #endif - /*! Holds the flags defined above. Will be 0 when no errors have occurred. */ - REGISTER uint16_t status; - - /*! Low-level interface to hardware. */ + /** Holds the flags defined above. Will be 0 when no errors have occurred. */ + volatile serstatus_t status; + + /** Low-level interface to hardware. */ struct SerialHardware* hw; - -}; +} Serial; /* Function prototypes */ extern int ser_putchar(int c, struct Serial *port); extern int ser_getchar(struct Serial *port); extern int ser_getchar_nowait(struct Serial *port); + extern int ser_write(struct Serial *port, const void *buf, size_t len); -extern int ser_read(struct Serial *port, char *buf, size_t size); +extern int ser_read(struct Serial *port, void *buf, size_t size); + extern int ser_print(struct Serial *port, const char *s); +extern int ser_printf(struct Serial *port, const char *format, ...) FORMAT(__printf__, 2, 3); + extern int ser_gets(struct Serial *port, char *buf, int size); extern int ser_gets_echo(struct Serial *port, char *buf, int size, bool echo); -extern int ser_printf(struct Serial *port, const char *format, ...) FORMAT(__printf__, 2, 3); +extern void ser_clearstatus(struct Serial *port); + extern void ser_setbaudrate(struct Serial *port, unsigned long rate); extern void ser_setparity(struct Serial *port, int parity); +extern void ser_settimeouts(struct Serial *port, mtime_t rxtimeout, mtime_t txtimeout); +extern void ser_resync(struct Serial *port, mtime_t delay); extern void ser_purge(struct Serial *port); +extern void ser_drain(struct Serial *port); + extern struct Serial *ser_open(unsigned int unit); extern void ser_close(struct Serial *port); -#if defined(CONFIG_SER_RXTIMEOUT) || defined(CONFIG_SER_TXTIMEOUT) - extern void ser_settimeouts(struct Serial *port, time_t rxtimeout, time_t txtimeout); -#endif /** - * @name Additional functions implemented as macros + * \name Additional functions implemented as macros * - * @{ + * \{ */ #define ser_getstatus(h) ((h)->status) #define ser_setstatus(h, x) ((h)->status = (x)) -/* @} */ +/* \} */ -#endif /* SER_H */ +#endif /* DRV_SER_H */