/**
 * rt_com
 * ======
 *
 * RT-Linux kernel module for communication across serial lines.
 *
 * Copyright (C) 1997 Jens Michaelsen
 * Copyright (C) 1997-2000 Jochen Kupper
 * Copyright (C) 1999 Hua Mao <hmao@nmt.edu>
 *
 * This program 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.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file License. if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307, USA.
 */



#ifndef RT_COM_P_H
#define RT_COM_P_H


#define RT_COM_NAME "rt_com"

/* input/ouput buffer (FIFO) sizes */
#define RT_COM_BUF_SIZ        256	// MUST BE ONLY POWER OF 2 !!
/* amount of free space on input buffer for RTS reset */
#define RT_COM_BUF_LOW        (RT_COM_BUF_SIZ / 3)
/* amount of free space on input buffer for RTS set */
#define RT_COM_BUF_HI         (RT_COM_BUF_SIZ * 2 / 3)
/* limit of free space on input buffer for buffer full error */
#define RT_COM_BUF_FULL       20


/* usage flags */
#define RT_COM_PORT_FREE      0x00
#define RT_COM_PORT_INUSE     0x01
#define RT_COM_PORT_SETUP     0x02


/* Some hardware description */
#define RT_COM_BASE_BAUD      115200

/** Interrupt Service Routines
 * These are private functions */
static void rt_com0_isr( void );
static void rt_com1_isr( void );




/** Interrupt handling
 *
 * Define internal convinience macros for interrupt handling, so we
 * get rid of the system dependencies.
 */
#define rt_com_irq_off( state )         rt_global_save_flags( &state ); rt_global_cli()
#define rt_com_irq_on(state)            rt_global_restore_flags( state )
#define rt_com_request_irq( irq, isr )  rt_request_global_irq( irq, isr ); rt_enable_irq( irq );
#define rt_com_free_irq( irq )          rt_free_global_irq( irq )


/* port register offsets */
#define RT_COM_RXB  0x00
#define RT_COM_TXB  0x00
#define RT_COM_IER  0x01
#define RT_COM_IIR  0x02
#define RT_COM_FCR  0x02
#define RT_COM_LCR  0x03
#define RT_COM_MCR  0x04
#define RT_COM_LSR  0x05
#define RT_COM_MSR  0x06
#define RT_COM_DLL  0x00
#define RT_COM_DLM  0x01

/** MCR Modem Control Register masks */
#define MCR_DTR               0x01 // Data Terminal Ready
#define MCR_RTS               0x02 // Request To Send 
#define MCR_OUT1              0x04
#define MCR_OUT2              0x08
#define MCR_LOOP              0x10
#define MCR_AFE               0x20 // AutoFlow Enable

/** IER Interrupt Enable Register masks */
#define IER_ERBI              0x01  // Enable Received Data Available Interrupt
#define IER_ETBEI             0x02  // Enable Transmitter Holding Register
                                    // Empty Interrupt
#define IER_ELSI              0x04  // Enable Receiver Line Status Interrupt
#define IER_EDSSI             0x08  // Enable Modem Status Interrupt

/** MSR Modem Status Register masks */
#define MSR_DELTA_CTS         0x01
#define MSR_DELTA_DSR         0x02
#define MSR_TERI              0x04
#define MSR_DELTA_DCD         0x08
#define MSR_CTS               0x10
#define MSR_DSR               0x20
#define MSR_RI                0x40
#define MSR_DCD               0x80

/** LSR Line Status Register masks */
#define LSR_DATA_READY        0x01
#define LSR_OVERRUN_ERR       0x02
#define LSR_PARITY_ERR        0x04
#define LSR_FRAMING_ERR       0x08
#define LSR_BREAK             0x10
#define LSR_THRE              0x20	// Transmitter Holding Register
#define LSR_TEMT              0x40	// Transmitter Empty

/** FCR FIFO Control Register masks */
#define FCR_FIFO_ENABLE       0x01
#define FCR_INPUT_FIFO_RESET  0x02
#define FCR_OUTPUT_FIFO_RESET 0x04

/** data buffer
 *
 * Used for buffering of input and output data. Two buffers per port
 * (one for input, one for output). Organized as a FIFO */
struct rt_buf_struct{
    unsigned int  head;
    unsigned int  tail;
    char buf[ RT_COM_BUF_SIZ ];
};



/** Port data
 *
 * Internal information structure containing all data for a port. One
 * structure for every port.
 *
 * Contains all current setup parameters and all data currently
 * buffered by rt_com.
 *
 * mode (functioning mode)
 *   possible values:
 *   - RT_COM_DSR_ON_TX     - for standard functioning mode (DSR needed on TX)
 *   - RT_COM_NO_HAND_SHAKE - for comunication without hand shake signals
 *                            (only RXD-TXD-GND)
 *   - RT_COM_HW_FLOW       - for hardware flow control (RTS-CTS)
 *   Of course RT_COM_DSR_ON_TX and RT_COM_NO_HAND_SHAKE cannot be
 *   sppecified at the same time.
 *
 *   NOTE: When you select a mode that uses hand shake signals pay
 *   attention that no input signals (CTS,DSR,RI,DCD) must be
 *   floating.
 *
 * used (usage flag)
 *   possible values:
 *   - RT_COM_PORT_INUSE - port region requested by init_module
 *   - RT_COM_PORT_FREE  - port region requested by rt_com_set_param
 *   - RT_COM_PORT_SETUP - port parameters are setup,
 *                         don't specify at compile time !
 *
 * error
 *   last error detected
 *
 * ier (interrupt enable register)
 *   copy of IER chip register, last value set by rt_com.
 *
 * mcr (modem control register)
 *   copy of the MCR internal register
 */
struct rt_com_struct{
    int baud_base;
    int port;
    int irq;
    void (*isr)(void);
	int baud;
	unsigned int wordlength;
	unsigned int parity;
	unsigned int stopbits;
    int mode;
	int fifotrig;
    int used;
	int error;
    int type;
    int ier;
    int mcr;
    struct rt_buf_struct ibuf;
    struct rt_buf_struct obuf;
};


#endif /* RT_COM_P_H */



/**
 * Local Variables:
 * mode: C
 * c-file-style: "Stroustrup"
 * End:
 */
