blob: a9074dd76c14d3ba60393d9277d08a9d8efb7bfe (
plain) (
tree)
|
|
/****************************************************************************
*
* FTK_POKE.C
*
* Part of the FastMAC Toolkit.
* Copyright (c) Madge Networks Ltd 1995
*
* This module provides some functions that will send tracing information
* to either serial port (COM1 or COM2) on a standard IBM PC clone.
*
*****************************************************************************/
#include "ftk_defs.h"
#include "ftk_intr.h"
#include "ftk_extr.h"
#ifdef FTK_POKEOUTS
/*---------------------------------------------------------------------------
|
| Private constants.
|
---------------------------------------------------------------------------*/
#ifdef USE_COM2
#define COM_BASE 0x0200 /* Base address for COM2. */
#else
#define COM_BASE 0x0300 /* Base address for COM1. */
#endif
#define THR (COM_BASE + 0x0f8) /* Transmit holding register. */
#define IER (COM_BASE + 0x0f9) /* IRQ enable register. */
#define IDR (COM_BASE + 0x0fa) /* IRQ identification register. */
#define LCR (COM_BASE + 0x0fb) /* Line control register. */
#define MCR (COM_BASE + 0x0fc) /* Modem control register. */
#define LSR (COM_BASE + 0x0fd) /* Line status register. */
#define MSR (COM_BASE + 0x0fe) /* Modem status register. */
#define TX_RDY 0x020 /* THR empty flag bit in LSR. */
#define BAUD_MASK 0x080 /* Baud rate mask in LCR. */
#define PARAMS_MASK 0x07f /* Parameter mask in LCR. */
#define EOUT2 0x008 /* EOUT2 flag in MCR. */
#define CMCR 0x0f0 /* Clear MCR command. */
#define DTR 0x001 /* DTR flag in MCR. */
#define PARITY_TYPE 0
#define STOP_BITS 1
#define DATA_BITS 8
#define BAUD_RATE 9600
/*----------------------------------------------------------------------------
|
| Private global variables.
|
----------------------------------------------------------------------------*/
int ftk_poke_initialised = FALSE;
char ftk_hex_chars[16] = "0123456789abcdef";
/*----------------------------------------------------------------------------
|
| Function - ftk_poke_init
|
| Parameters - Node.
|
| Purpose - Initialise the serial port.
|
| Returns - Nothing.
|
----------------------------------------------------------------------------*/
void
ftk_poke_init(void)
{
unsigned t;
unsigned v;
/*
* Data, stop and parity bits.
*/
t = DATA_BITS - 5;
if (STOP_BITS == 2)
{
t |= 0x04;
}
if (PARITY_TYPE > 0)
{
t |= ((PARITY_TYPE << 1) - 1) << 3;
}
OUTB(LCR, (BYTE) (INB(LCR) & PARAMS_MASK));
OUTB(LCR, (BYTE) t);
/*
* Set up the baud rate.
*/
t = 115200L / BAUD_RATE;
v = INB(LCR) | BAUD_MASK;
OUTB(LCR, (BYTE) v);
OUTB(THR, (BYTE) (t & 0xff));
OUTB(IER, (BYTE) ((t >> 8) & 0xff));
OUTB(LCR, (BYTE) (v & PARAMS_MASK));
/*
* Empty the transmit buffer.
*/
INB(THR);
/*
* Clear the modem control register and enable OUT2.
*/
OUTB(MCR, (BYTE) ((INB(MCR) & CMCR) | EOUT2));
/*
* Turn DTR on.
*/
OUTB(MCR, (BYTE) (INB(MCR) | DTR));
}
/*****************************************************************************
*
* Function - _ftk_poke_char
*
* Parameters - ch -> Character to poke out.
*
* Purpose - Poke a single character to the serial port.
*
* Returns - Nothing.
*
*****************************************************************************/
void
_ftk_poke_char(int ch)
{
/*
* Initialise the serial port if this is the first access.
*/
if (!ftk_poke_initialised)
{
ftk_poke_init();
ftk_poke_initialised = TRUE;
}
/*
* Wait until the transmit holding register is empty.
*/
while ((INB(LSR) & TX_RDY) == 0);
/*
* And transmit the character.
*/
OUTB(THR, (unsigned char) ch);
}
/*****************************************************************************
*
* Function - _ftk_poke_string
*
* Parameters - str -> String to poke out.
*
* Purpose - Poke a string to the serial port.
*
* Returns - Nothing.
*
*****************************************************************************/
void
_ftk_poke_string(char *str)
{
while (*str != '\0')
{
if (*str == '\n')
{
_ftk_poke_char('\n');
_ftk_poke_char('\r');
}
else
{
_ftk_poke_char(*str);
}
str++;
}
}
/*****************************************************************************
*
* Function - _ftk_poke_byte
*
* Parameters - byte -> The byte to poke out.
*
* Purpose - Poke the hex string for a byte to the serial port.
*
* Returns - Nothing.
*
*****************************************************************************/
void
_ftk_poke_byte(int byte)
{
_ftk_poke_char(ftk_hex_chars[(byte >> 4) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(byte ) & 0x000f]);
}
/*****************************************************************************
*
* Function - _ftk_poke_word
*
* Parameters - word -> The word to poke out.
*
* Purpose - Poke the hex string for a word to the serial port.
*
* Returns - Nothing.
*
*****************************************************************************/
void
_ftk_poke_word(int word)
{
_ftk_poke_char(ftk_hex_chars[(word >> 12) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(word >> 8) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(word >> 4) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(word ) & 0x000f]);
}
/*****************************************************************************
*
* Function - _ftk_poke_dword
*
* Parameters - dword -> The dword to poke out.
*
* Purpose - Poke the hex string for a dword to the serial port.
*
* Returns - Nothing.
*
*****************************************************************************/
void
_ftk_poke_dword(long dword)
{
_ftk_poke_char(ftk_hex_chars[(dword >> 28) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 24) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 20) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 16) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 12) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 8) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword >> 4) & 0x000f]);
_ftk_poke_char(ftk_hex_chars[(dword ) & 0x000f]);
}
#endif
|