/*
* This file contains the Motorola IDP console IO package.
*
* Written by Doug McBride, Colorado Space Grant College
* Based off of the board support packages of RTEMS
*
* Updated to RTEMS 3.2.0 by Joel Sherrill.
*
* $Id$
*/
#define MIDP_INIT
#include "rtems.h"
#include "console.h"
#include "bsp.h"
#include "ringbuf.h"
Ring_buffer_t Buffer[ 2 ];
rtems_isr C_Receive_ISR(rtems_vector_number vector);
/* console_initialize
*
* This routine initializes the console IO driver.
*
* Input parameters: NONE
*
* Output parameters: NONE
*
* Return values:
*/
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
)
{
Ring_buffer_Initialize( &Buffer[ 0 ] );
Ring_buffer_Initialize( &Buffer[ 1 ] );
init_pit();
*status = RTEMS_SUCCESSFUL;
}
/* is_character_ready
*
* This routine returns TRUE if a character is available.
*
* Input parameters: NONE
*
* Output parameters: NONE
*
* Return values:
*/
rtems_boolean is_character_ready(
char *ch,
int port
)
{
if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
return FALSE;
Ring_buffer_Remove_character( &Buffer[ port ], *ch );
return TRUE;
}
/* quick_char_check
*
* This routine returns TRUE if a character is available.
* It is different from above because it does not disturb the ring buffer
*
* Input parameters: NONE
*
* Output parameters: NONE
*
* Return values:
*/
rtems_boolean quick_char_check(
int port
)
{
if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
return FALSE;
return TRUE;
}
/* inbyte
*
* This routine reads a character from the UART through a buffer.
*
* Input parameters: NONE
*
* Output parameters: NONE
*
* Return values:
* character read from UART
*/
char inbyte(
int port
)
{
unsigned char tmp_char;
/* If you come into this routine without checking is_character_ready() first
and you want nonblocking code, then it's your own fault */
while ( !is_character_ready( &tmp_char, port ) );
return tmp_char;
}
/* outbyte
*
* This routine transmits a character out the M68681. It supports
* XON/XOFF flow control.
*
* Input parameters:
* ch - character to be transmitted
*
* Output parameters: NONE
*/
void outbyte(
char ch,
int port
)
{
switch ( port ) {
case 0:
transmit_char( ch );
break;
case 1:
transmit_char_portb( ch );
break;
}
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
*/
int __read(
int fd,
char *buf,
int nbytes
)
{
int i = 0;
int port;
/*
* Map port A to stdin, stdout, and stderr.
* Map everything else to port B.
*/
if ( fd <= 2 ) port = 0;
else port = 1;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte( port );
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
*/
int __write(
int fd,
char *buf,
int nbytes
)
{
int i;
int port;
/*
* Map port A to stdin, stdout, and stderr.
* Map everything else to port B.
*/
if ( fd <= 2 ) port = 0;
else port = 1;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r', port );
}
outbyte (*(buf + i), port );
}
return (nbytes);
}