diff options
Diffstat (limited to 'c/src/lib/libbsp/i960/rxgen960/console')
-rw-r--r-- | c/src/lib/libbsp/i960/rxgen960/console/Makefile.in | 59 | ||||
-rw-r--r-- | c/src/lib/libbsp/i960/rxgen960/console/concntl.h | 16 | ||||
-rw-r--r-- | c/src/lib/libbsp/i960/rxgen960/console/console.c | 264 | ||||
-rw-r--r-- | c/src/lib/libbsp/i960/rxgen960/console/serial.c | 363 | ||||
-rw-r--r-- | c/src/lib/libbsp/i960/rxgen960/console/serial.h | 8 |
5 files changed, 710 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i960/rxgen960/console/Makefile.in b/c/src/lib/libbsp/i960/rxgen960/console/Makefile.in new file mode 100644 index 0000000000..9efdd1c2ec --- /dev/null +++ b/c/src/lib/libbsp/i960/rxgen960/console/Makefile.in @@ -0,0 +1,59 @@ +# +# $Id$ +# + +@SET_MAKE@ +srcdir = @srcdir@ +VPATH = @srcdir@ +RTEMS_ROOT = @top_srcdir@ +PROJECT_ROOT = @PROJECT_ROOT@ + +PGM=${ARCH}/console.rel + +# C source names, if any, go here -- minus the .c +C_PIECES=console pcimsgreg +C_FILES=$(C_PIECES:%=%.c) +C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) + +H_FILES=$(srcdir)/concntl.h + +# Assembly source names, if any, go here -- minus the .s +S_PIECES= +S_FILES=$(S_PIECES:%=%.s) +S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o) + +SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) +OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg +include $(RTEMS_ROOT)/make/leaf.cfg + +# +# (OPTIONAL) Add local stuff here using += +# + +DEFINES += +CPPFLAGS += +CFLAGS += + +LD_PATHS += +LD_LIBS += +LDFLAGS += + +# +# Add your list of files to delete here. The config files +# already know how to delete some stuff, so you may want +# to just run 'make clean' first to see what gets missed. +# 'make clobber' already includes 'make clean' +# + +CLEAN_ADDITIONS += +CLOBBER_ADDITIONS += + +${PGM}: ${SRCS} ${OBJS} + $(make-rel) + +all: ${ARCH} $(SRCS) $(PGM) + $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile diff --git a/c/src/lib/libbsp/i960/rxgen960/console/concntl.h b/c/src/lib/libbsp/i960/rxgen960/console/concntl.h new file mode 100644 index 0000000000..f3b3f5e4d7 --- /dev/null +++ b/c/src/lib/libbsp/i960/rxgen960/console/concntl.h @@ -0,0 +1,16 @@ +/* + * $Id$ + */ + +typedef enum +{ + CON_KBHIT, + CON_GET_RAW_BYTE, + CON_SEND_RAW_BYTE +} console_ioctl_t; + +typedef struct +{ + console_ioctl_t ioctl_type; + unsigned32 param; +} console_ioctl_request_t; diff --git a/c/src/lib/libbsp/i960/rxgen960/console/console.c b/c/src/lib/libbsp/i960/rxgen960/console/console.c new file mode 100644 index 0000000000..d62e96869d --- /dev/null +++ b/c/src/lib/libbsp/i960/rxgen960/console/console.c @@ -0,0 +1,264 @@ +/* + * This file contains the template for a console IO package. + * + * COPYRIGHT (c) 1989-1997. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may in + * the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#define NO_BSP_INIT + + +/* only one of the following can be defined */ +#define SERIAL_INPUT /* use serial input */ + +#include <bsp.h> +#include <rtems/libio.h> +#include "concntl.h" +#include "pcimsgreg.h" + +#ifndef lint +static char _sccsid[] = "@(#)console.c 09/12/96 1.13\n"; +#endif + +/* 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_status_code status; + + if ( console_pmr_init(*(unsigned32*)arg) ) + return RTEMS_INVALID_NUMBER; + + + status = rtems_io_register_name( + "/dev/console", + major, + (rtems_device_minor_number) 0 + ); + + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return 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 +) +{ + *ch = '\0'; /* return NULL for no particular reason */ + return(console_pmr_kbhit()); +} + +/* inbyte + * + * This routine reads a character from the SOURCE. + * + * Input parameters: NONE + * + * Output parameters: NONE + * + * Return values: + * character read from SOURCE + */ + +char inbyte( unsigned int minor ) +{ + /* + * If polling, wait until a character is available. + */ + return console_pmr_getc(); +} + +/* outbyte + * + * This routine transmits a character out the SOURCE. It may support + * XON/XOFF flow control. + * + * Input parameters: + * ch - character to be transmitted + * + * Output parameters: NONE + */ + +void outbyte( unsigned int minor, + char ch +) +{ + console_pmr_putc( ch ); + + /* + * Carriage Return/New line translation. + */ + + if ( ch == '\n' ) + outbyte( minor, '\r' ); +} + + +/* + * Open entry point + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * Close entry point + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return RTEMS_SUCCESSFUL; +} + +/* + * read bytes from the serial port. We only have stdin. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_rw_args_t *rw_args; + unsigned8 *buffer; + unsigned32 maximum; + unsigned32 count = 0; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = inbyte(minor); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + buffer[ count ] = 0; + outbyte( minor, '\n' ); /* newline */ + break; + } + else if (buffer[ count ] == '\b' && count > 0 ) + { + outbyte( minor, '\b' ); /* move back one space */ + outbyte( minor, ' ' ); /* erase the character */ + outbyte( minor, '\b' ); /* move back one space */ + count-=2; + } + else + outbyte( minor, buffer[ count ] ); /* echo the character */ + } + + rw_args->bytes_moved = count; + return (count > 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; +} + +/* + * write bytes to the serial port. Stdout and stderr are the same. + */ + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + int count; + int maximum; + rtems_libio_rw_args_t *rw_args; + unsigned8 *buffer; + + rw_args = (rtems_libio_rw_args_t *) arg; + + buffer = rw_args->buffer; + maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + if ( buffer[ count ] == '\n') { + outbyte(minor,'\r'); + } + outbyte( minor,buffer[ count ] ); + } + + rw_args->bytes_moved = maximum; + return 0; +} + +/* + * IO Control entry point + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + if (!arg) + return RTEMS_INVALID_ADDRESS; + + switch( ((console_ioctl_request_t *)arg)->ioctl_type ) + { + case CON_KBHIT: + /* check if keyboard was hit */ + ((console_ioctl_request_t *)arg)->param = console_pmr_kbhit(); + break; + + case CON_GET_RAW_BYTE: + ((console_ioctl_request_t *)arg)->param = inbyte(minor); + break; + + case CON_SEND_RAW_BYTE: + outbyte(minor, ((console_ioctl_request_t *)arg)->param); + break; + + default: + break; + } + + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/i960/rxgen960/console/serial.c b/c/src/lib/libbsp/i960/rxgen960/console/serial.c new file mode 100644 index 0000000000..a9e9dd2dd9 --- /dev/null +++ b/c/src/lib/libbsp/i960/rxgen960/console/serial.c @@ -0,0 +1,363 @@ +/* + * $Id$ + */ + +#include "serial.h" +#include "rtems.h" + + +typedef unsigned char uchar ; /* Abbreviations */ +typedef unsigned short ushort ; +typedef unsigned long ulong ; +int DBGConsole_make_sync = 0; +#define CONSOLE_CHANNELS 1 + +#define MAX_CONSOLE 4 +static int consoles[MAX_CONSOLE]; +static int active_consoles = 0; +static struct{ + rtems_id sem; + int rx; + int cnt; + char in_line[128]; +}cons_input[MAX_CONSOLE]; + + + +/* This uses the message out and in buffers as serial emulator. + Pretty stupid eh? +*/ + +#define uart1 ((volatile unsigned char *)0x1318) +#define uart1_rx ((volatile unsigned int *)0x1310) + +#define NUM_UARTS 1 +static volatile unsigned int * uart = { uart1 }; +static volatile unsigned int * uart_rx = { uart1_rx }; + + +extern void display_msg(void); +/*extern int sprintf();*/ + + + +int +console_uartinit(unsigned int BAUDRate) +{ +#ifdef CONSOLE_CHANNELS + void cons_isr(); + rpmu_attach_inmsg0(cons_isr); +#endif + return(0); +} + + +/* Introduce a new console channel */ +console_new(char * name) +{ +#ifdef CONSOLE_CHANNELS + unsigned int x, stat; + x = 0xfe000000 | (name[0] << 16) | (name[1] << 8) | name[2]; + do { + stat = *uart; + } while (DBGConsole_make_sync && (stat != 0)); + *uart = x; + x = ( name[3] << 24) | ( name[4] << 16) | ( name[5] << 8) | name[6] ; + do { + stat = *uart; + } while (DBGConsole_make_sync && (stat != 0)); + *uart = x; + active_consoles += 1; + rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &consoles[active_consoles] ); +#endif +} + + + + /*********************************************************************** + *** Transmit character to host. + *** put the console ID in upper byte + *** + ***********************************************************************/ + +int console_sps_putc(int cc) +{ + register unsigned char stat; + int rtid, i; + unsigned int ch; + unsigned int level; +#ifdef CONSOLE_CHANNELS + rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &rtid ); + ch = cc & 0xff; + for(i=1; i <= active_consoles; i++){ + if( rtid == consoles[i]){ + ch |= (i ) << 24 ; + break; + } + } +#else + ch = cc; +#endif + + /* + * Pause until there is room in the UART transmit + * buffer. + */ + + if (ch == -1) + return ch; + +wait: + do { + stat = *uart; + } while (DBGConsole_make_sync && (stat != 0)); + rtems_interrupt_disable(level); + if( (*uart != 0) && DBGConsole_make_sync){ + rtems_interrupt_enable(level); + goto wait; + } + + /* + * Transmit data. (Junk) + */ + + *uart = ch; + rtems_interrupt_enable(level); + return cc; + +} + + + /* + * putnum -- print a 32 bit number in hex + */ + int + putnum (num) + unsigned int num; + { + char buffer[9]; + int count; + int digit; + + for (count = 7 ; count >= 0 ; count--) { + digit = (num >> (count * 4)) & 0xf; + + if (digit <= 9) + console_sps_putc( (char) ('0' + digit)); + else + console_sps_putc( (char) ('A' - 10 + digit)); + } + } + + /* + * putmem -- print the specified memory block + */ + void + putmem (addr, num) + char *addr; + unsigned int num; + { + int i = 0; + int j = 0; + int val = 0; + int digit = 0; + + console_sps_putc(13); + console_sps_putc(10); + putnum((unsigned int) addr); + console_sps_putc(':'); + console_sps_putc(' '); + while(num) + { + val = *addr; + + for (j = 0; j < 2; j++) + { + digit = (val & 0xf0) >> 4; + val <<= 4; + + if (digit < 10) + { + console_sps_putc(digit + '0'); + } + else + { + console_sps_putc(digit - 10 + 'A'); + } + } + console_sps_putc(' '); + + num--; + addr++; + if (++i == 16) + { + console_sps_putc(13); + console_sps_putc(10); + putnum((unsigned int) addr); + console_sps_putc(':'); + console_sps_putc(' '); + i = 0; + } + } + console_sps_putc(13); + console_sps_putc(10); + } + + /* + * putcmem -- print the specified pci config memory block + */ + void + putcmem (addr, num) + unsigned char *addr; + unsigned int num; + { + int i = 0; + int j = 0; + unsigned short val = 0; + int digit = 0; + unsigned int *satucmd = (unsigned int *) 0x1298; + unsigned int *soccar = (unsigned int *) 0x12a8; + unsigned int *soccdp = (unsigned int *) 0x12b0; + + *satucmd = 4; + + console_sps_putc(13); + console_sps_putc(10); + putnum((unsigned int) addr); + console_sps_putc(':'); + console_sps_putc(' '); + while(num) + { + *soccar = (unsigned int) addr; + val = *soccdp; + + for (j = 0; j < 4; j++) + { + digit = (val & 0xf000) >> 12; + val <<= 4; + + if (digit < 10) + { + console_sps_putc(digit + '0'); + } + else + { + console_sps_putc(digit - 10 + 'A'); + } + } + console_sps_putc(' '); + + num -= 2; + addr += 2; + if (++i == 8) + { + console_sps_putc(13); + console_sps_putc(10); + putnum((unsigned int) addr); + console_sps_putc(':'); + console_sps_putc(' '); + i = 0; + } + } + console_sps_putc(13); + console_sps_putc(10); + } + + /*********************************************************************** + *** Read character from host. + ***********************************************************************/ +#ifdef CONSOLE_CHANNELS +int console_sps_getc() +{ + + int consinx; + int rtid, i; + unsigned int level, level2; + char ch; + consinx = 0; + rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &rtid ); + for(i=1; i <= active_consoles; i++){ + if( rtid == consoles[i]){ + consinx = i ; + break; + } + } + if( i > active_consoles) + consinx = 0; + if( cons_input[consinx].sem == 0){ + rtems_name sname; + sname = rtems_build_name('S','U','X',(char)(consinx + '0')); + rtems_semaphore_create(sname, 0, RTEMS_DEFAULT_ATTRIBUTES, 0, &cons_input[consinx].sem); + cons_input[consinx].rx = 0; + } + while( cons_input[consinx].cnt == cons_input[consinx].rx){ + rtems_semaphore_obtain(cons_input[consinx].sem, RTEMS_WAIT, 0); +/* rtems_task_wake_after( RTEMS_YIELD_PROCESSOR);*/ +} + rtems_interrupt_disable(level); + i = cons_input[consinx].rx; + ch = cons_input[consinx].in_line[i]; + i++; + if( i >= sizeof( cons_input[consinx].in_line)) + i = 0; + cons_input[consinx].rx = i; + rtems_interrupt_enable(level); + return ch; +} + + +void cons_isr() +{ + unsigned int i, chin, consinx, st; + chin = *uart_rx; + consinx = chin >> 24; + if( consinx > active_consoles) + goto release; + i = cons_input[consinx].cnt; + cons_input[consinx].in_line[i] = chin & 0xff; + i++; + if( i >= sizeof( cons_input[consinx].in_line)) + i = 0; + cons_input[consinx].cnt = i; + st = rtems_semaphore_release( cons_input[consinx].sem); +release: + *uart_rx = 0; +} + +#else +volatile int console_foo = 0; +int console_sps_getc() +{ + volatile unsigned int stat; + register int ch; + + stat = *uart_rx; + while (stat == 0) + { + rtems_task_wake_after( RTEMS_YIELD_PROCESSOR ); + stat = *uart_rx; + console_foo++; + } + *uart_rx = 0; + + ch = stat; + + return ch; +} +#endif + + /*********************************************************************** + *** check character from host. + ***********************************************************************/ + +int console_sps_kbhit() +{ + register unsigned short stat; + + stat = *uart; + return ( stat != 0); +} + + + + diff --git a/c/src/lib/libbsp/i960/rxgen960/console/serial.h b/c/src/lib/libbsp/i960/rxgen960/console/serial.h new file mode 100644 index 0000000000..55f13ccb6f --- /dev/null +++ b/c/src/lib/libbsp/i960/rxgen960/console/serial.h @@ -0,0 +1,8 @@ +/* + * $Id$ + */ + +int console_uartinit(unsigned int BAUDRate); +int console_sps_putc(int ch); +int console_sps_getc(); +int console_sps_kbhit(); |