URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/rtos/rtems/c/src/lib/libbsp/i960/rxgen960/console
- from Rev 30 to Rev 173
- ↔ Reverse comparison
Rev 30 → Rev 173
/serial.c
0,0 → 1,363
/* |
* $Id: serial.c,v 1.2 2001-09-27 11:59:58 chris Exp $ |
*/ |
|
#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); |
} |
|
|
|
|
/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: console.c,v 1.2 2001-09-27 11:59:58 chris Exp $ |
*/ |
|
#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" XXX JRS */ |
|
#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; |
} |
/serial.h
0,0 → 1,8
/* |
* $Id: serial.h,v 1.2 2001-09-27 11:59:58 chris Exp $ |
*/ |
|
int console_uartinit(unsigned int BAUDRate); |
int console_sps_putc(int ch); |
int console_sps_getc(); |
int console_sps_kbhit(); |
/concntl.h
0,0 → 1,16
/* |
* $Id: concntl.h,v 1.2 2001-09-27 11:59:58 chris Exp $ |
*/ |
|
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; |
/Makefile.am
0,0 → 1,32
## |
## $Id: Makefile.am,v 1.2 2001-09-27 11:59:58 chris Exp $ |
## |
|
AUTOMAKE_OPTIONS = foreign 1.4 |
|
PGM = $(ARCH)/console.rel |
|
C_FILES = console.c |
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) |
|
OBJS = $(C_O_FILES) |
|
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg |
include $(top_srcdir)/../../../../../../automake/lib.am |
|
# |
# (OPTIONAL) Add local stuff here using += |
# |
|
$(PGM): $(OBJS) |
$(make-rel) |
|
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile |
|
all-local: $(ARCH) $(OBJS) $(PGM) |
|
.PRECIOUS: $(PGM) |
|
EXTRA_DIST = concntl.h console.c serial.c serial.h |
|
include $(top_srcdir)/../../../../../../automake/local.am |