# HG changeset patch # User jlarmour # Date 962741841 0 # Node ID ff3f181b64bd1f3393d19e0894da510187c07252 # Parent 7f461c3a372cc8316c5270f367108684f0aedacd Merge from eCos master repository on 2000-07-04-20:42:44-BST diff --git a/host/libcdl/ChangeLog b/host/libcdl/ChangeLog --- a/host/libcdl/ChangeLog +++ b/host/libcdl/ChangeLog @@ -1,3 +1,16 @@ +2000-07-04 Bart Veer + + * value.cxx (save): + The comment "# This value cannot be modified here." was being + added even for modifiable options, courtesy of some earlier + code rearrangement. + + * config.cxx (change_package_version): + Prevent assertion failure/crash when changing the version of a + package that has not been loaded (not uncommon when using + ecosconfig and confusing the order of the version and the + package(s)). + 2000-06-28 Bart Veer * transact.cxx, cdlcore.hxx: diff --git a/host/libcdl/config.cxx b/host/libcdl/config.cxx --- a/host/libcdl/config.cxx +++ b/host/libcdl/config.cxx @@ -395,6 +395,9 @@ CdlConfigurationBody::change_package_ver } // For now it is illegal to change the version of package that has // not been loaded yet + if (0 == package) { + throw CdlInputOutputException(std::string("Cannot change version of \"") + name + "\" , this package is not loaded"); + } CYG_ASSERT_CLASSC(package); this->change_package_version(transaction, package, new_version, error_fn, warn_fn, limbo); diff --git a/host/libcdl/value.cxx b/host/libcdl/value.cxx --- a/host/libcdl/value.cxx +++ b/host/libcdl/value.cxx @@ -3790,10 +3790,10 @@ CdlValuableBody::save(CdlInterpreter int data += indent_string + "# Calculated value: " + CdlInterpreterBody::extend_comment(expr->get_original_string(), indentation, 4) + '\n'; data += CdlInterpreterBody::multiline_comment(follow_expr_references(expr, expr), indentation, 4); - } else { + } else if (!modifiable) { data += indent_string + "# This value cannot be modified here.\n"; } - + // Output the flavor. This clutters up the savefile a bit. // However it is necessary so that the user can distinguish // between bool, booldata and data items diff --git a/packages/devs/serial/arm/sa11x0/current/ChangeLog b/packages/devs/serial/arm/sa11x0/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/sa11x0/current/ChangeLog @@ -0,0 +1,43 @@ +2000-06-29 Jesper Skov + + * src/sa11x0_serial.h: + * src/sa11x0_serial.c: + Registers renamed. + +2000-06-22 Hugo Tyson + + * cdl/.cdl: Remove the comment on the empty + include_files directive; the tools now support this correctly. + This keeps internal include files internal. + +2000-05-10 Gary Thomas + + * cdl/ser_arm_sa11x0.cdl: + * src/sa11x0_serial.h: + * src/sa11x0_serial.c: New file(s). + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/devs/serial/arm/sa11x0/current/cdl/ser_arm_sa11x0.cdl b/packages/devs/serial/arm/sa11x0/current/cdl/ser_arm_sa11x0.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/sa11x0/current/cdl/ser_arm_sa11x0.cdl @@ -0,0 +1,179 @@ +# ==================================================================== +# +# ser_arm_sa11x0.cdl +# +# eCos serial ARM/SA11x0 configuration data +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Contributors: +# Date: 2000-05-08 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + + +cdl_package CYGPKG_IO_SERIAL_ARM_SA11X0 { + display "ARM SA11X0 serial device drivers" + + parent CYGPKG_IO_SERIAL_DEVICES + active_if CYGPKG_IO_SERIAL + active_if CYGPKG_HAL_ARM_SA11X0 + + requires CYGPKG_ERROR + include_dir cyg/io + include_files ; # none _exported_ whatsoever + description " + This option enables the serial device drivers for the + StrongARM SA11X0." + doc redirect/ecos-device-drivers.html + + compile -library=libextras.a sa11x0_serial.c + + define_proc { + puts $::cdl_system_header "/***** serial driver proc output start *****/" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER " + puts $::cdl_system_header "/***** serial driver proc output end *****/" + } + +cdl_component CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL0 { + display "ARM SA11X0 serial port 0 driver" + flavor bool + default_value 0 + description " + This option includes the serial device driver for the ARM SA11X0 + port 0 (UART 3)." + + cdl_option CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL0_NAME { + display "Device name for ARM SA11X0 serial port 0 driver" + flavor data + default_value {"\"/dev/ser0\""} + description " + This option specifies the name of the serial device for the + ARM SA11X0 port 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BAUD { + display "Baud rate for the ARM SA11X0 serial port 0 driver" + flavor data + legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 + 4800 7200 9600 14400 19200 38400 57600 115200 234000 + } + default_value 38400 + description " + This option specifies the default baud rate (speed) for the + ARM SA11X0 port 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE { + display "Buffer size for the ARM SA11X0 serial port 0 driver" + flavor data + legal_values 0 to 8192 + default_value 128 + description " + This option specifies the size of the internal buffers used + for the ARM SA11X0 port 0." + } +} + +cdl_component CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1 { + display "ARM SA11X0 serial port 1 driver" + flavor bool + default_value 1 + description " + This option includes the serial device driver for the ARM SA11X0 + port 1 (UART 1)." + + cdl_option CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL1_NAME { + display "Device name for ARM SA11X0 serial port 1 driver" + flavor data + default_value {"\"/dev/ser1\""} + description " + This option specifies the name of the serial device for the + ARM SA11X0 port 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BAUD { + display "Baud rate for the ARM SA11X0 serial port 1 driver" + flavor data + legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 + 4800 7200 9600 14400 19200 38400 57600 115200 234000 + } + default_value 38400 + description " + This option specifies the default baud rate (speed) for the + ARM SA11X0 port 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE { + display "Buffer size for the ARM SA11X0 serial port 1 driver" + flavor data + legal_values 0 to 8192 + default_value 128 + description " + This option specifies the size of the internal buffers used + for the ARM SA11X0 port 1." + } +} + + cdl_component CYGPKG_IO_SERIAL_ARM_SA11X0_OPTIONS { + display "Serial device driver build options" + flavor none + description " + Package specific build options including control over + compiler flags used only in building this package, + and details of which tests are built." + + + cdl_option CYGPKG_IO_SERIAL_ARM_SA11X0_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building these serial device drivers. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_IO_SERIAL_ARM_SA11X0_CFLAGS_REMOVE { + display "Suppressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building these serial device drivers. These flags are removed from + the set of global flags if present." + } + } +} + +# EOF ser_arm_sa11x0.cdl diff --git a/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.c b/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.c new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.c @@ -0,0 +1,322 @@ +//========================================================================== +// +// io/serial/arm/sa11x0/sa11x0_serial.c +// +// StrongARM SA11x0 Serial I/O Interface Module (interrupt driven) +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: StrongARM SA11x0 Serial I/O module (interrupt driven version) +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef CYGPKG_IO_SERIAL_ARM_SA11X0 + +#include "sa11x0_serial.h" + +typedef struct sa11x0_serial_info { + CYG_ADDRWORD base; + CYG_WORD int_num; + cyg_interrupt serial_interrupt; + cyg_handle_t serial_interrupt_handle; +} sa11x0_serial_info; + +static bool sa11x0_serial_init(struct cyg_devtab_entry *tab); +static bool sa11x0_serial_putc(serial_channel *chan, unsigned char c); +static Cyg_ErrNo sa11x0_serial_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *sub_tab, + const char *name); +static unsigned char sa11x0_serial_getc(serial_channel *chan); +static bool sa11x0_serial_set_config(serial_channel *chan, cyg_serial_info_t *config); +static void sa11x0_serial_start_xmit(serial_channel *chan); +static void sa11x0_serial_stop_xmit(serial_channel *chan); + +static cyg_uint32 sa11x0_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); +static void sa11x0_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); + +static SERIAL_FUNS(sa11x0_serial_funs, + sa11x0_serial_putc, + sa11x0_serial_getc, + sa11x0_serial_set_config, + sa11x0_serial_start_xmit, + sa11x0_serial_stop_xmit + ); + +#ifdef CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL0 +static sa11x0_serial_info sa11x0_serial_info0 = {(CYG_ADDRWORD)SA11X0_UART3_CONTROL0, + CYGNUM_HAL_INTERRUPT_UART3}; +#if CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE > 0 +static unsigned char sa11x0_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE]; +static unsigned char sa11x0_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(sa11x0_serial_channel0, + sa11x0_serial_funs, + sa11x0_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &sa11x0_serial_out_buf0[0], sizeof(sa11x0_serial_out_buf0), + &sa11x0_serial_in_buf0[0], sizeof(sa11x0_serial_in_buf0) + ); +#else +static SERIAL_CHANNEL(sa11x0_serial_channel0, + sa11x0_serial_funs, + sa11x0_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(sa11x0_serial_io0, + CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL0_NAME, + 0, // Does not depend on a lower level interface + &cyg_io_serial_devio, + sa11x0_serial_init, + sa11x0_serial_lookup, // Serial driver may need initializing + &sa11x0_serial_channel0 + ); +#endif // CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1 + +#ifdef CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1 +static sa11x0_serial_info sa11x0_serial_info1 = {(CYG_ADDRWORD)SA11X0_UART1_CONTROL0, + CYGNUM_HAL_INTERRUPT_UART1}; +#if CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE > 0 +static unsigned char sa11x0_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE]; +static unsigned char sa11x0_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(sa11x0_serial_channel1, + sa11x0_serial_funs, + sa11x0_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &sa11x0_serial_out_buf1[0], sizeof(sa11x0_serial_out_buf1), + &sa11x0_serial_in_buf1[0], sizeof(sa11x0_serial_in_buf1) + ); +#else +static SERIAL_CHANNEL(sa11x0_serial_channel1, + sa11x0_serial_funs, + sa11x0_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_SA11X0_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(sa11x0_serial_io1, + CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL1_NAME, + 0, // Does not depend on a lower level interface + &cyg_io_serial_devio, + sa11x0_serial_init, + sa11x0_serial_lookup, // Serial driver may need initializing + &sa11x0_serial_channel1 + ); +#endif // CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1 + +// Internal function to actually configure the hardware to desired baud rate, etc. +static bool +sa11x0_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) +{ + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + unsigned char parity = select_parity[new_config->parity]; + unsigned char word_length = select_word_length[new_config->word_length-CYGNUM_SERIAL_WORD_LENGTH_5]; + unsigned char stop_bits = select_stop_bits[new_config->stop]; + int baud = SA11X0_UART_BAUD_RATE_DIVISOR(select_baud[new_config->baud]); + if ((word_length == 0xFF) || + (parity == 0xFF) || + (stop_bits == 0xFF)) { + return false; // Unsupported configuration + } + // Disable Receiver and Transmitter (clears FIFOs) + port->ctl3 = SA11X0_UART_RX_DISABLED | + SA11X0_UART_TX_DISABLED; + + // Clear sticky (writable) status bits. + port->stat0 = SA11X0_UART_RX_IDLE | + SA11X0_UART_RX_BEGIN_OF_BREAK | + SA11X0_UART_RX_END_OF_BREAK; + + // Set parity, word length, stop bits + port->ctl0 = parity | + word_length | + stop_bits; + + // Set the desired baud rate. + port->ctl1 = (baud >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK; + port->ctl2 = baud & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK; + + // Enable the receiver (with interrupts) and the transmitter. + port->ctl3 = SA11X0_UART_RX_ENABLED | + SA11X0_UART_TX_ENABLED | + SA11X0_UART_RX_FIFO_INT_ENABLED; + return true; +} + +// Function to initialize the device. Called at bootstrap time. +static bool +sa11x0_serial_init(struct cyg_devtab_entry *tab) +{ + serial_channel *chan = (serial_channel *)tab->priv; + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + int res; +#ifdef CYGDBG_IO_INIT + diag_printf("SA11X0 SERIAL init - dev: %x.%d\n", sa11x0_chan->base, sa11x0_chan->int_num); +#endif + (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices + if (chan->out_cbuf.len != 0) { + cyg_drv_interrupt_create(sa11x0_chan->int_num, + 99, // Priority - unused + (cyg_addrword_t)chan, // Data item passed to interrupt handler + sa11x0_serial_ISR, + sa11x0_serial_DSR, + &sa11x0_chan->serial_interrupt_handle, + &sa11x0_chan->serial_interrupt); + cyg_drv_interrupt_attach(sa11x0_chan->serial_interrupt_handle); + cyg_drv_interrupt_unmask(sa11x0_chan->int_num); + } + res = sa11x0_serial_config_port(chan, &chan->config, true); + return res; +} + +// This routine is called when the device is "looked" up (i.e. attached) +static Cyg_ErrNo +sa11x0_serial_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *sub_tab, + const char *name) +{ + serial_channel *chan = (serial_channel *)(*tab)->priv; + (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices + return ENOERR; +} + +// Send a character to the device output buffer. +// Return 'true' if character is sent to device +static bool +sa11x0_serial_putc(serial_channel *chan, unsigned char c) +{ + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + if (port->stat1 & SA11X0_UART_TX_FIFO_NOT_FULL) { + port->data = c; + return true; + } else { + return false; // Couldn't send, tx was busy + } +} + +// Fetch a character from the device input buffer, waiting if necessary +static unsigned char +sa11x0_serial_getc(serial_channel *chan) +{ + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + return port->data; +} + +// Set up the device characteristics; baud rate, etc. +static bool +sa11x0_serial_set_config(serial_channel *chan, cyg_serial_info_t *config) +{ + return sa11x0_serial_config_port(chan, config, false); +} + +// Enable the transmitter on the device +static void +sa11x0_serial_start_xmit(serial_channel *chan) +{ + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + (chan->callbacks->xmt_char)(chan); // Kick transmitter (if necessary) + port->ctl3 |= SA11X0_UART_TX_FIFO_INT_ENABLED; +} + +// Disable the transmitter on the device +static void +sa11x0_serial_stop_xmit(serial_channel *chan) +{ + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + port->ctl3 &= ~SA11X0_UART_TX_FIFO_INT_ENABLED; +} + +// Serial I/O - low level interrupt handler (ISR) +static cyg_uint32 +sa11x0_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) +{ + cyg_drv_interrupt_mask(vector); + cyg_drv_interrupt_acknowledge(vector); + return CYG_ISR_CALL_DSR; // Cause DSR to be run +} + +// Serial I/O - high level interrupt handler (DSR) +static void +sa11x0_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) +{ + serial_channel *chan = (serial_channel *)data; + sa11x0_serial_info *sa11x0_chan = (sa11x0_serial_info *)chan->dev_priv; + volatile struct serial_port *port = (volatile struct serial_port *)sa11x0_chan->base; + unsigned int stat0 = port->stat0; + if (stat0 & SA11X0_UART_TX_SERVICE_REQUEST) { + (chan->callbacks->xmt_char)(chan); + } + if (stat0 & SA11X0_UART_RX_INTS) { + while (port->stat1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) { + (chan->callbacks->rcv_char)(chan, port->data); + } + port->stat0 = SA11X0_UART_RX_IDLE; // Need to clear this manually + } + cyg_drv_interrupt_unmask(vector); +} +#endif diff --git a/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.h b/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.h new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/sa11x0/current/src/sa11x0_serial.h @@ -0,0 +1,114 @@ +#ifndef CYGONCE_ARM_SA11X0_SERIAL_H +#define CYGONCE_ARM_SA11X0_SERIAL_H + +// ==================================================================== +// +// sa11x0_serial.h +// +// Device I/O - Description of StrongARM SA11x0 serial hardware +// +// ==================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +// ==================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Internal interfaces for serial I/O drivers +// Description: +// +//####DESCRIPTIONEND#### +// +// ==================================================================== + +// Description of serial ports on StrongARM SA11x0 + +#include // Register definitions + +struct serial_port { + unsigned long ctl0; // 0x00 + unsigned long ctl1; // 0x04 + unsigned long ctl2; // 0x08 + unsigned long ctl3; // 0x0C + unsigned long _unused0; + unsigned long data; // 0x14 + unsigned long _unused1; + unsigned long stat0; // 0x1C + unsigned long stat1; // 0x20 +}; + +#define SA11X0_UART_RX_INTS (SA11X0_UART_RX_SERVICE_REQUEST|SA11X0_UART_RX_IDLE) + +static unsigned char select_word_length[] = { + 0xFF, // 5 bits / word (char) + 0xFF, + SA11X0_UART_DATA_BITS_7, + SA11X0_UART_DATA_BITS_8 +}; + +static unsigned char select_stop_bits[] = { + 0, + SA11X0_UART_STOP_BITS_1, // 1 stop bit + 0xFF, // 1.5 stop bit + SA11X0_UART_STOP_BITS_2 // 2 stop bits +}; + +static unsigned char select_parity[] = { + SA11X0_UART_PARITY_DISABLED, // No parity + SA11X0_UART_PARITY_ENABLED| // Even parity + SA11X0_UART_PARITY_EVEN, + SA11X0_UART_PARITY_ENABLED| // Odd parity + SA11X0_UART_PARITY_ODD, + 0xFF, // Mark parity + 0xFF, // Space parity +}; + +static cyg_int32 select_baud[] = { + 0, // Unused + 50, // 50 + 75, // 75 + 110, // 110 + 0, // 134.5 + 150, // 150 + 200, // 200 + 300, // 300 + 600, // 600 + 1200, // 1200 + 1800, // 1800 + 2400, // 2400 + 3600, // 3600 + 4800, // 4800 + 7200, // 7200 + 9600, // 9600 + 14400, // 14400 + 19200, // 19200 + 38400, // 38400 + 57600, // 57600 + 115200, // 115200 + 230400, // 230400 +}; + +#endif // CYGONCE_ARM_SA11X0_SERIAL_H diff --git a/packages/ecos.db b/packages/ecos.db --- a/packages/ecos.db +++ b/packages/ecos.db @@ -95,6 +95,15 @@ package CYGPKG_IO_SERIAL_ARM_EBSA285 { description "Intel StrongARM/EBSA285 serial device drivers" } +package CYGPKG_IO_SERIAL_ARM_SA11X0 { + alias { "Intel StrongARM SA11x0 serial driver" + devs_serial_arm_sa11x0 sa11x0_serial_driver } + hardware + directory devs/serial/arm/sa11x0 + script ser_arm_sa11x0.cdl + description "Intel StrongARM/SA11x0 serial device drivers" +} + package CYGPKG_IO_SERIAL_ARM_PID { alias { "ARM PID serial device drivers" devs_serial_arm_pid pid_serial_driver } @@ -475,6 +484,34 @@ package CYGPKG_HAL_ARM_EBSA285 { eCos on a Intel EBSA285 StrongARM eval board." } +package CYGPKG_HAL_ARM_SA11X0 { + alias { "Intel SA11X0 Chipset" hal_arm_sa11x0 } + directory hal/arm/sa11x0/var + script hal_arm_sa11x0.cdl + hardware + description " + The SA11X0 HAL package provides the support needed to run + eCos on a Intel StrongARM SA11X0 based systems." +} +package CYGPKG_HAL_ARM_SA11X0_ASSABET { + alias { "Intel SA1110 Assabet eval board" hal_arm_sa11x0_assabet } + directory hal/arm/sa11x0/assabet + script hal_arm_sa11x0_assabet.cdl + hardware + description " + The ASSABET HAL package provides the support needed to run + eCos on a Intel StrongARM SA1110 evaulation board (assabet)." +} +package CYGPKG_HAL_ARM_SA11X0_BRUTUS { + alias { "Intel SA1100 Brutus eval board" hal_arm_sa11x0_brutus } + directory hal/arm/sa11x0/brutus + script hal_arm_sa11x0_brutus.cdl + hardware + description " + The BRUTUS HAL package provides the support needed to run + eCos on a Intel StrongARM SA1110 evaulation board (brutus)." +} + package CYGPKG_HAL_ARM_EDB7XXX { alias { "Cirrus Logic development board" hal_arm_edb7xxx arm_edb7xxx_hal } directory hal/arm/edb7xxx @@ -907,6 +944,29 @@ target ebsa285 { eCos on an Intel EBSA285 StrongARM board." } +target assabet { + alias { "Intel StrongARM SA1110 board" assabet } + packages { CYGPKG_HAL_ARM + CYGPKG_HAL_ARM_SA11X0 + CYGPKG_HAL_ARM_SA11X0_ASSABET + CYGPKG_IO_SERIAL_ARM_SA11X0 + } + description " + The assabet target provides the packages needed to run + eCos on an Intel StrongARM SA1110 evaluation board." +} +target brutus { + alias { "Intel StrongARM SA1100 board" brutus } + packages { CYGPKG_HAL_ARM + CYGPKG_HAL_ARM_SA11X0 + CYGPKG_HAL_ARM_SA11X0_BRUTUS + CYGPKG_IO_SERIAL_ARM_SA11X0 + } + description " + The brutus target provides the packages needed to run + eCos on an Intel StrongARM SA1100 evaluation board." +} + target edb7xxx { alias { "Cirrus Logic development board" edb7211 eb7xxx eb7211 } packages { CYGPKG_HAL_ARM diff --git a/packages/hal/arm/arch/current/src/vectors.S b/packages/hal/arm/arch/current/src/vectors.S --- a/packages/hal/arm/arch/current/src/vectors.S +++ b/packages/hal/arm/arch/current/src/vectors.S @@ -231,9 +231,11 @@ warm_reset: mov r0,#0 // move vectors // We cannot perform a store until after PLATFORM_SETUP1 #ifndef CYGPKG_HAL_ARM_EBSA285 // EBSA285 sets the DRAM size above +#ifndef CYGPKG_HAL_ARM_SA11X0 // SA11x0 also uses this ldr r1,=hal_dram_size str r0, [r1] // DRAM size to zero => unknown #endif +#endif ldr r1,=__exception_handlers #ifndef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS diff --git a/packages/hal/arm/pid/current/ChangeLog b/packages/hal/arm/pid/current/ChangeLog --- a/packages/hal/arm/pid/current/ChangeLog +++ b/packages/hal/arm/pid/current/ChangeLog @@ -1,3 +1,13 @@ +2000-07-04 Jesper Skov + + * cdl/hal_arm_pid.cdl: + * include/hal_diag.h: + * include/plf_stub.h: + * src/hal_diag.c: + * src/pid_misc.c: + * src/plf_stub.c: [deleted] + Changed to use virtual vector table. + 2000-06-18 Gary Thomas * include/pkgconf/mlt_arm_pid9_ram.ldi: diff --git a/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl b/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl --- a/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl +++ b/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl @@ -50,10 +50,11 @@ cdl_package CYGPKG_HAL_ARM_PID { The pid HAL package provides the support needed to run eCos on an ARM PID evaluation board." - compile hal_diag.c plf_stub.c pid_misc.c + compile hal_diag.c pid_misc.c implements CYGINT_HAL_DEBUG_GDB_STUBS implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT define_proc { puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H " @@ -141,6 +142,34 @@ cdl_package CYGPKG_HAL_ARM_PID { point." } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS { + display "Number of communication channels on the board" + flavor data + calculated 2 + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { + display "Debug serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value CYGHWR_HAL_ARM_PID_GDB_PORT + description " + The PID board has only one serial port. This option + chooses which port will be used to connect to a host + running GDB." + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { + display "Diagnostic serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value CYGHWR_HAL_ARM_PID_DIAG_PORT + description " + The PID board has only one serial port. This option + chooses which port will be used for diagnostic output." + } + # Real-time clock/counter specifics cdl_component CYGNUM_HAL_RTC_CONSTANTS { display "Real-time clock constants" @@ -220,8 +249,8 @@ cdl_package CYGPKG_HAL_ARM_PID { requires { CYG_HAL_STARTUP == "ROM" } requires CYGSEM_HAL_ROM_MONITOR requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - requires ! CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT - requires ! CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM no_define @@ -373,4 +402,26 @@ cdl_package CYGPKG_HAL_ARM_PID { } } } + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "Generic" "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "RAM" } + description " + Support can be enabled for different varieties of ROM monitor. + This support changes various eCos semantics such as the encoding + of diagnostic output, or the overriding of hardware interrupt + vectors. + Firstly there is \"Generic\" support which prevents the HAL + from overriding the hardware vectors that it does not use, to + instead allow an installed ROM monitor to handle them. This is + the most basic support which is likely to be common to most + implementations of ROM monitor. + \"GDB_stubs\" provides support when GDB stubs are included in + the ROM monitor or boot ROM." + } + } diff --git a/packages/hal/arm/pid/current/include/hal_diag.h b/packages/hal/arm/pid/current/include/hal_diag.h --- a/packages/hal/arm/pid/current/include/hal_diag.h +++ b/packages/hal/arm/pid/current/include/hal_diag.h @@ -49,6 +49,16 @@ #include +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include + +#define HAL_DIAG_INIT() hal_if_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) + +#else // everything by steam + /*---------------------------------------------------------------------------*/ /* functions implemented in hal_diag.c */ @@ -56,8 +66,6 @@ externC void hal_diag_init(void); externC void hal_diag_write_char(char c); externC void hal_diag_read_char(char *c); -externC void hal_diag_led(int n); - /*---------------------------------------------------------------------------*/ #define HAL_DIAG_INIT() hal_diag_init() @@ -66,6 +74,13 @@ externC void hal_diag_led(int n); #define HAL_DIAG_READ_CHAR(_c_) hal_diag_read_char(&_c_) +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +/*---------------------------------------------------------------------------*/ +// LED + +externC void hal_diag_led(int n); + /*---------------------------------------------------------------------------*/ /* end of hal_diag.h */ #endif /* CYGONCE_HAL_DIAG_H */ diff --git a/packages/hal/arm/pid/current/include/plf_stub.h b/packages/hal/arm/pid/current/include/plf_stub.h --- a/packages/hal/arm/pid/current/include/plf_stub.h +++ b/packages/hal/arm/pid/current/include/plf_stub.h @@ -54,36 +54,30 @@ #include // architecture stub support //---------------------------------------------------------------------------- -// Define serial stuff. +// Define some platform specific communication details. This is mostly +// handled by hal_if now, but we need to make sure the comms tables are +// properly initialized. -extern void hal_pid_init_serial(void); -extern int hal_pid_get_char(void); -extern void hal_pid_put_char(int c); -extern int hal_pid_interruptible(int); +externC void cyg_hal_plf_comms_init(void); -#define HAL_STUB_PLATFORM_INIT_SERIAL() hal_pid_init_serial() -#define HAL_STUB_PLATFORM_GET_CHAR() hal_pid_get_char() -#define HAL_STUB_PLATFORM_PUT_CHAR(c) hal_pid_put_char((c)) +#define HAL_STUB_PLATFORM_INIT_SERIAL() cyg_hal_plf_comms_init() + #define HAL_STUB_PLATFORM_SET_BAUD_RATE(baud) CYG_UNUSED_PARAM(int, (baud)) -#define HAL_STUB_PLATFORM_INTERRUPTIBLE (&hal_pid_interruptible) +#define HAL_STUB_PLATFORM_INTERRUPTIBLE 0 #define HAL_STUB_PLATFORM_INIT_BREAK_IRQ() CYG_EMPTY_STATEMENT //---------------------------------------------------------------------------- // Stub initializer. #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + //---------------------------------------------------------------------------- // Reset. -#ifdef CYGSEM_HAL_ROM_MONITOR -// Just call the ROM's entry point. Not as safe as a reset, but the PID -// doesn't have a watchdog, so this'll have to do. -externC void reset_vector(void); -#define HAL_STUB_PLATFORM_RESET() reset_vector() -#else + #define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT -#endif -#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +#define HAL_STUB_PLATFORM_RESET_ENTRY 0x4000000 //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H diff --git a/packages/hal/arm/pid/current/src/Notes_GDB_stub b/packages/hal/arm/pid/current/src/Notes_GDB_stub --- a/packages/hal/arm/pid/current/src/Notes_GDB_stub +++ b/packages/hal/arm/pid/current/src/Notes_GDB_stub @@ -50,8 +50,6 @@ This will install some files in ./instal Make FLASH tool ~~~~~~~~~~~~~~~ -Make FLASH tool -~~~~~~~~~~~~~~~ Again, these are the necessary CLI instructions. It can also be done from the Configtool by selecting the appropriate templates, and diff --git a/packages/hal/arm/pid/current/src/hal_diag.c b/packages/hal/arm/pid/current/src/hal_diag.c --- a/packages/hal/arm/pid/current/src/hal_diag.c +++ b/packages/hal/arm/pid/current/src/hal_diag.c @@ -32,7 +32,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): nickg, gthomas -// Contributors: nickg, gthomas +// Contributors:nickg, gthomas // Date: 1998-03-02 // Purpose: HAL diagnostic output // Description: Implementations of HAL diagnostic output support. @@ -52,91 +52,51 @@ #include // interrupt macros #include // IO macros #include -#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS #include -#include // cyg_hal_gdb_interrupt -#endif - -// Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e. -// totally stand-alone) system. - -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) -#define HAL_DIAG_USES_HARDWARE -#endif - -#ifndef HAL_DIAG_USES_HARDWARE -#if (CYGHWR_HAL_ARM_PID_DIAG_PORT != CYGHWR_HAL_ARM_PID_GDB_PORT) -#define HAL_DIAG_USES_HARDWARE -#endif -#endif +#include // interface API +#include // Helper functions /*---------------------------------------------------------------------------*/ /* From serial_16550.h */ -#if CYGHWR_HAL_ARM_PID_DIAG_PORT==0 -// This is the base address of the A-channel -#define CYG_DEVICE_SERIAL_RS232_16550_BASE 0x0D800000 -#define CYG_DEVICE_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIALA -#else -// This is the base address of the B-channel -#define CYG_DEVICE_SERIAL_RS232_16550_BASE 0x0D800020 -#define CYG_DEVICE_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIALB +#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==9600 +#define CYG_DEVICE_SERIAL_BAUD_MSB 0x00 +#define CYG_DEVICE_SERIAL_BAUD_LSB 0x0C +#endif +#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==19200 +#define CYG_DEVICE_SERIAL_BAUD_MSB 0x00 +#define CYG_DEVICE_SERIAL_BAUD_LSB 0x06 +#endif +#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==38400 +#define CYG_DEVICE_SERIAL_BAUD_MSB 0x00 +#define CYG_DEVICE_SERIAL_BAUD_LSB 0x03 +#endif +#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==115200 +#define CYG_DEVICE_SERIAL_BAUD_MSB 0x00 +#define CYG_DEVICE_SERIAL_BAUD_LSB 0x01 #endif -#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==9600 -#define CYG_DEVICE_SERIAL_RS232_BAUD_MSB 0x00 -#define CYG_DEVICE_SERIAL_RS232_BAUD_LSB 0x0C -#endif -#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==19200 -#define CYG_DEVICE_SERIAL_RS232_BAUD_MSB 0x00 -#define CYG_DEVICE_SERIAL_RS232_BAUD_LSB 0x06 -#endif -#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==38400 -#define CYG_DEVICE_SERIAL_RS232_BAUD_MSB 0x00 -#define CYG_DEVICE_SERIAL_RS232_BAUD_LSB 0x03 -#endif -#if CYGHWR_HAL_ARM_PID_DIAG_BAUD==115200 -#define CYG_DEVICE_SERIAL_RS232_BAUD_MSB 0x00 -#define CYG_DEVICE_SERIAL_RS232_BAUD_LSB 0x01 -#endif - -#ifndef CYG_DEVICE_SERIAL_RS232_BAUD_MSB +#ifndef CYG_DEVICE_SERIAL_BAUD_MSB #error Missing/incorrect serial baud rate defined - CDL error? #endif // Define the serial registers. -#define CYG_DEVICE_SERIAL_RS232_16550_RBR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x00) - // receiver buffer register, read, dlab = 0 -#define CYG_DEVICE_SERIAL_RS232_16550_THR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x00) - // transmitter holding register, write, dlab = 0 -#define CYG_DEVICE_SERIAL_RS232_16550_DLL \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x00) - // divisor latch (LS), read/write, dlab = 1 -#define CYG_DEVICE_SERIAL_RS232_16550_IER \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x04) - // interrupt enable register, read/write, dlab = 0 -#define CYG_DEVICE_SERIAL_RS232_16550_DLM \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x04) - // divisor latch (MS), read/write, dlab = 1 -#define CYG_DEVICE_SERIAL_RS232_16550_IIR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x08) - // interrupt identification register, read, dlab = 0 -#define CYG_DEVICE_SERIAL_RS232_16550_FCR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x08) - // fifo control register, write, dlab = 0 -#define CYG_DEVICE_SERIAL_RS232_16550_LCR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x0C) - // line control register, read/write -#define CYG_DEVICE_SERIAL_RS232_16550_MCR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x10) - // modem control register, read/write -#define CYG_DEVICE_SERIAL_RS232_16550_LSR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x14) - // line status register, read -#define CYG_DEVICE_SERIAL_RS232_16550_MSR \ - ((volatile cyg_uint8 *) CYG_DEVICE_SERIAL_RS232_16550_BASE + 0x18) - // modem status register, read +#define CYG_DEV_RBR 0x00 // receiver buffer register, read, dlab = 0 +#define CYG_DEV_THR 0x00 // transmitter holding register, write, dlab = 0 +#define CYG_DEV_DLL 0x00 // divisor latch (LS), read/write, dlab = 1 +#define CYG_DEV_IER 0x04 // interrupt enable register, read/write, dlab = 0 +#define CYG_DEV_DLM 0x04 // divisor latch (MS), read/write, dlab = 1 +#define CYG_DEV_IIR 0x08 // interrupt identification register, read, dlab = 0 +#define CYG_DEV_FCR 0x08 // fifo control register, write, dlab = 0 +#define CYG_DEV_LCR 0x0C // line control register, read/write +#define CYG_DEV_MCR 0x10 // modem control register, read/write +#define CYG_DEV_LSR 0x14 // line status register, read +#define CYG_DEV_MSR 0x18 // modem status register, read + +// Interrupt Enable Register +#define SIO_IER_RCV 0x01 +#define SIO_IER_XMT 0x02 +#define SIO_IER_LS 0x04 +#define SIO_IER_MS 0x08 // The line status register bits. #define SIO_LSR_DR 0x01 // data ready @@ -168,6 +128,318 @@ #define SIO_LCR_SB 0x40 // set break #define SIO_LCR_DLAB 0x80 // divisor latch access bit +// Modem Control Register +#define SIO_MCR_DTR 0x01 +#define SIO_MCR_RTS 0x02 +#define SIO_MCR_INT 0x08 // Enable interrupts + +//----------------------------------------------------------------------------- +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +//----------------------------------------------------------------------------- + +static void +cyg_hal_plf_serial_init_channel(void* __ch_data) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 lcr; + + // 8-1-no parity. + HAL_WRITE_UINT8(base+CYG_DEV_LCR, SIO_LCR_WLS0 | SIO_LCR_WLS1); + + HAL_READ_UINT8(base+CYG_DEV_LCR, lcr); + lcr |= SIO_LCR_DLAB; + HAL_WRITE_UINT8(base+CYG_DEV_LCR, lcr); + HAL_WRITE_UINT8(base+CYG_DEV_DLL, CYG_DEVICE_SERIAL_BAUD_LSB); + HAL_WRITE_UINT8(base+CYG_DEV_DLM, CYG_DEVICE_SERIAL_BAUD_MSB); + lcr &= ~SIO_LCR_DLAB; + HAL_WRITE_UINT8(base+CYG_DEV_LCR, lcr); + HAL_WRITE_UINT8(base+CYG_DEV_FCR, 0x07); // Enable & clear FIFO +} + +void +cyg_hal_plf_serial_putc(void *__ch_data, char c) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 lsr; + CYGARC_HAL_SAVE_GP(); + + do { + HAL_READ_UINT8(base+CYG_DEV_LSR, lsr); + } while ((lsr & SIO_LSR_THRE) == 0); + + HAL_WRITE_UINT8(base+CYG_DEV_THR, c); + + CYGARC_HAL_RESTORE_GP(); +} + +static cyg_bool +cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 lsr; + + HAL_READ_UINT8(base+CYG_DEV_LSR, lsr); + if ((lsr & SIO_LSR_DR) == 0) + return false; + + HAL_READ_UINT8(base+CYG_DEV_RBR, *ch); + + return true; +} + +cyg_uint8 +cyg_hal_plf_serial_getc(void* __ch_data) +{ + cyg_uint8 ch; + CYGARC_HAL_SAVE_GP(); + + while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch)); + + CYGARC_HAL_RESTORE_GP(); + return ch; +} + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +static channel_data_t pid_ser_channels[2] = { + { (cyg_uint8*)0x0D800000, 1000, CYGNUM_HAL_INTERRUPT_SERIALA }, + { (cyg_uint8*)0x0D800020, 1000, CYGNUM_HAL_INTERRUPT_SERIALB } +}; + +static void +cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_plf_serial_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_plf_serial_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +cyg_bool +cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch) +{ + int delay_count; + channel_data_t* chan = (channel_data_t*)__ch_data; + cyg_bool res; + CYGARC_HAL_SAVE_GP(); + + delay_count = chan->msec_timeout * 10; // delay in .1 ms steps + + for(;;) { + res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch); + if (res || 0 == delay_count--) + break; + + CYGACC_CALL_IF_DELAY_US(100); + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +static int +cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...) +{ + static int irq_state = 0; + channel_data_t* chan = (channel_data_t*)__ch_data; + int ret = 0; + CYGARC_HAL_SAVE_GP(); + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + + HAL_WRITE_UINT8(chan->base+CYG_DEV_IER, SIO_IER_RCV); + HAL_WRITE_UINT8(chan->base+CYG_DEV_MCR, SIO_MCR_INT|SIO_MCR_DTR|SIO_MCR_RTS); + + HAL_INTERRUPT_UNMASK(chan->isr_vector); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + + HAL_WRITE_UINT8(chan->base+CYG_DEV_IER, 0); + + HAL_INTERRUPT_MASK(chan->isr_vector); + break; + case __COMMCTL_DBG_ISR_VECTOR: + ret = chan->isr_vector; + break; + case __COMMCTL_SET_TIMEOUT: + { + va_list ap; + + va_start(ap, __func); + + ret = chan->msec_timeout; + chan->msec_timeout = va_arg(ap, cyg_uint32); + + va_end(ap); + } + default: + break; + } + CYGARC_HAL_RESTORE_GP(); + return ret; +} + +static int +cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc, + CYG_ADDRWORD __vector, CYG_ADDRWORD __data) +{ + int res = 0; + channel_data_t* chan = (channel_data_t*)__ch_data; + char c; + cyg_uint8 lsr; + CYGARC_HAL_SAVE_GP(); + + cyg_drv_interrupt_acknowledge(chan->isr_vector); + + *__ctrlc = 0; + HAL_READ_UINT8(chan->base+CYG_DEV_LSR, lsr); + if ( (lsr & SIO_LSR_DR) != 0 ) { + + HAL_READ_UINT8(chan->base+CYG_DEV_RBR, c); + if( cyg_hal_is_break( &c , 1 ) ) + *__ctrlc = 1; + + res = CYG_ISR_HANDLED; + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +static void +cyg_hal_plf_serial_init(void) +{ + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Disable interrupts. + HAL_INTERRUPT_MASK(pid_ser_channels[0].isr_vector); + HAL_INTERRUPT_MASK(pid_ser_channels[1].isr_vector); + + // Init channels + cyg_hal_plf_serial_init_channel(&pid_ser_channels[0]); + cyg_hal_plf_serial_init_channel(&pid_ser_channels[1]); + + // Setup procs in the vector table + + // Set channel 0 + CYGACC_CALL_IF_SET_CONSOLE_COMM(0); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, &pid_ser_channels[0]); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout); + + // Set channel 1 + CYGACC_CALL_IF_SET_CONSOLE_COMM(1); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, &pid_ser_channels[1]); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout); + + // Restore original console + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +void +cyg_hal_plf_comms_init(void) +{ + static int initialized = 0; + + if (initialized) + return; + + initialized = 1; + + cyg_hal_plf_serial_init(); +} +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +/*---------------------------------------------------------------------------*/ + +#ifdef CYGHWR_HAL_ARM_PID_DIAG_LEDS +// Control the LEDs PP0-PP3. This requires the jumpers on pins 9-16 to +// be set on LK11, thus preventing the use of the parallel port. + +#define CYG_DEVICE_PARALLEL_DATA 0x0d800040 + +void +hal_diag_led(int n) +{ + HAL_WRITE_UINT8(CYG_DEVICE_PARALLEL_DATA, (n & 0xf) << 4); +} +#endif // CYGHWR_HAL_ARM_PID_DIAG_LEDS + + +//============================================================================= +// Compatibility with older stubs +//============================================================================= + +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +#include // cyg_hal_gdb_interrupt +#endif + +#if CYGHWR_HAL_ARM_PID_DIAG_PORT==0 +// This is the base address of the A-channel +#define CYG_DEV_SERIAL_BASE 0x0D800000 +#define CYG_DEVICE_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIALA +#else +// This is the base address of the B-channel +#define CYG_DEV_SERIAL_BASE 0x0D800020 +#define CYG_DEVICE_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIALB +#endif + +static channel_data_t pid_ser_channel = { + (cyg_uint8*)CYG_DEV_SERIAL_BASE, 0, 0 +}; + +// Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e. +// totally stand-alone) system. + +#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#define HAL_DIAG_USES_HARDWARE +#endif + +#ifndef HAL_DIAG_USES_HARDWARE +#if (CYGHWR_HAL_ARM_PID_DIAG_PORT != CYGHWR_HAL_ARM_PID_GDB_PORT) +#define HAL_DIAG_USES_HARDWARE +#endif +#endif #ifdef HAL_DIAG_USES_HARDWARE @@ -175,24 +447,12 @@ void hal_diag_init(void) { static int init = 0; char *msg = "\n\rARM eCos\n\r"; - cyg_uint8 lcr; if (init++) return; - // 8-1-no parity. - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LCR, - SIO_LCR_WLS0 | SIO_LCR_WLS1); - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LCR, lcr); - lcr |= SIO_LCR_DLAB; - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LCR, lcr); - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_DLL, - CYG_DEVICE_SERIAL_RS232_BAUD_LSB); - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_DLM, - CYG_DEVICE_SERIAL_RS232_BAUD_MSB); - lcr &= ~SIO_LCR_DLAB; - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LCR, lcr); - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_FCR, 0x07); // Enable & clear FIFO - while (*msg) hal_diag_write_char(*msg++); + cyg_hal_plf_serial_init_channel(&pid_ser_channel); + + while (*msg) cyg_hal_plf_serial_putc(&pid_ser_channel, *msg++); } #ifdef DEBUG_DIAG @@ -207,14 +467,10 @@ static int diag_bp = 0; void hal_diag_write_char(char c) { - cyg_uint8 lsr; + hal_diag_init(); - hal_diag_init(); - do { - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LSR, lsr); - } while ((lsr & SIO_LSR_THRE) == 0); + cyg_hal_plf_serial_putc(&pid_ser_channel, c); - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_THR, c); #ifdef DEBUG_DIAG diag_buffer[diag_bp++] = c; if (diag_bp == DIAG_BUFSIZE) diag_bp = 0; @@ -223,13 +479,7 @@ void hal_diag_write_char(char c) void hal_diag_read_char(char *c) { - cyg_uint8 lsr; - - do { - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LSR, lsr); - } while ((lsr & SIO_LSR_DR) == 0); - - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_RBR, *c); + *c = cyg_hal_plf_serial_getc(&pid_ser_channel); } #else // HAL_DIAG relies on GDB @@ -237,37 +487,25 @@ void hal_diag_read_char(char *c) // Initialize diag port - assume GDB channel is already set up void hal_diag_init(void) { + if (0) cyg_hal_plf_serial_init_channel(&pid_ser_channel); // avoid warning } // Actually send character down the wire static void hal_diag_write_char_serial(char c) { - cyg_uint8 lsr; + hal_diag_init(); - hal_diag_init(); - do { - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LSR, lsr); - } while ((lsr & SIO_LSR_THRE) == 0); - - HAL_WRITE_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_THR, c); - HAL_IO_BARRIER (); + cyg_hal_plf_serial_putc(&pid_ser_channel, c); } static bool hal_diag_read_serial(char *c) { long timeout = 1000000000; // A long time... - cyg_uint8 lsr; + while (!cyg_hal_plf_serial_getc_nonblock(&pid_ser_channel, c)) + if (0 == --timeout) return false; - do { - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_LSR, lsr); - if (--timeout == 0) return false; - } while ((lsr & SIO_LSR_DR) == 0); - HAL_IO_BARRIER (); // Prevent RBR preload. - - HAL_READ_UINT8 (CYG_DEVICE_SERIAL_RS232_16550_RBR, *c); - HAL_IO_BARRIER (); return true; } @@ -360,19 +598,7 @@ hal_diag_write_char(char c) } #endif -/*---------------------------------------------------------------------------*/ - -#ifdef CYGHWR_HAL_ARM_PID_DIAG_LEDS -// Control the LEDs PP0-PP3. This requires the jumpers on pins 9-16 to -// be set on LK11, thus preventing the use of the parallel port. +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG -#define CYG_DEVICE_PARALLEL_DATA 0x0d800040 - -void -hal_diag_led(int n) -{ - HAL_WRITE_UINT8(CYG_DEVICE_PARALLEL_DATA, (n & 0xf) << 4); -} -#endif // CYGHWR_HAL_ARM_PID_DIAG_LEDS /*---------------------------------------------------------------------------*/ /* End of hal_diag.c */ diff --git a/packages/hal/arm/pid/current/src/pid_misc.c b/packages/hal/arm/pid/current/src/pid_misc.c --- a/packages/hal/arm/pid/current/src/pid_misc.c +++ b/packages/hal/arm/pid/current/src/pid_misc.c @@ -51,6 +51,7 @@ #include // Register state info #include #include // necessary? +#include // calling interface /*------------------------------------------------------------------------*/ // On-board timer @@ -131,6 +132,9 @@ void hal_hardware_init(void) // Any hardware/platform initialization that needs to be done. HAL_WRITE_UINT32(CYG_DEVICE_IRQ_EnableClear, 0xFFFF); // Clear all // interrupt sources + + // Set up eCos/ROM interfaces + hal_if_init(); } // diff --git a/packages/hal/arm/sa11x0/assabet/current/ChangeLog b/packages/hal/arm/sa11x0/assabet/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/ChangeLog @@ -0,0 +1,115 @@ +2000-06-27 Jesper Skov + + * cdl/hal_arm_sa11x0_assabet.cdl: Changed PORT values. + +2000-06-26 Jesper Skov + + * include/hal_platform_ints.h: Removed Ctrl-c handling. + + * cdl/hal_arm_sa11x0_assabet.cdl: Removed ROM_DEBUG_CHANNEL option. + +2000-06-19 Gary Thomas + + * cdl/hal_arm_sa11x0_assabet.cdl: Adding virtual vector support. + + * include/assabet.h: Adding LCD registers. Update BCR register. + + * include/hal_platform_ints.h: Changes for virtual vector support. + + * include/hal_platform_setup.h: Updated vectors - fixed stuff + now handled elsewhere. + + * misc/cf_test.c: New program to experiment with Compact Flash + interface(s). + + * src/assabet_misc.c (plf_hardware_init): Added new function + to perform platform specific initializations. + +2000-06-18 Gary Thomas + + * include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt: + * include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi: + * include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi: + * include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt: + Incorporate new fixed vectors (used on all ARM platforms). + +2000-06-05 Gary Thomas + + * src/assabet_misc.c (assabet_BCR): New function used to + safely manipulate the board control register (write only). + + * include/assabet.h: Flush out board control register. + + * include/hal_platform_ints.h: Add missing GPIO interrupts. + +2000-06-04 Gary Thomas + + * include/hal_platform_setup.h: + * src/assabet_misc.c: 'sa1100' stuff renamed to 'sa11x0'. + + * include/hal_platform_setup.h: Set power supply to full on. Move + board control stuff to . Also define "fixed" vectors + which will contain board control shadow and other items potentially + shared by stubs, CygMon, etc. + + * cdl/hal_arm_sa11x0_assabet.cdl: Update build options for GDB stubs. + Necessary when 'fixed_vectors' are present. + + * include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt: + * include/pkgconf/mlt_arm_sa11x0_assabet_rom.h: + * include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi: + * include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt: + * include/pkgconf/mlt_arm_sa11x0_assabet_ram.h: + * include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi: Improve layout to + match real hardware. Add 'fixed_vectors' at 0x40. + +2000-06-01 Gary Thomas + + * cdl/hal_arm_sa11x0_assabet.cdl: + * include/hal_platform_setup.h: Add ROM startup code. + + * src/assabet_misc.c: New file. + +2000-05-12 John Dallaway + + * cdl/hal_arm_sa11x0_assabet.cdl: + + Fix calculation of CYGHWR_MEMORY_LAYOUT. + +2000-05-10 Gary Thomas + + * current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt: + * current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.h: + * current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi: + * current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.h: + * current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi: + * current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt: + * current/include/hal_platform_ints.h: + * current/include/hal_platform_setup.h: + * current/cdl/hal_arm_sa11x0_assabet.cdl: New file(s). + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/arm/sa11x0/assabet/current/cdl/hal_arm_sa11x0_assabet.cdl b/packages/hal/arm/sa11x0/assabet/current/cdl/hal_arm_sa11x0_assabet.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/cdl/hal_arm_sa11x0_assabet.cdl @@ -0,0 +1,324 @@ +# ==================================================================== +# +# hal_arm_sa11x0_assabet.cdl +# +# ARM SA1110/Assabet platform HAL package configuration data +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Original data: gthomas +# Contributors: +# Date: 2000-05-08 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== +cdl_package CYGPKG_HAL_ARM_SA11X0_ASSABET { + display "ARM SA1110/Assabet evaluation board" + parent CYGPKG_HAL_ARM_SA11X0 + hardware + include_dir cyg/hal + define_header hal_arm_sa11x0_assabet.h + description " + This HAL platform package provides generic + support for the Intel StrongARM SA1110 based evalation board, + known as 'assabet'." + + compile assabet_misc.c + + implements CYGINT_HAL_DEBUG_GDB_STUBS + implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H " + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + } + + cdl_component CYG_HAL_STARTUP { + display "Startup type" + flavor data + default_value {"RAM"} + legal_values {"RAM" "ROM"} + no_define + define -file system.h CYG_HAL_STARTUP + description " + When targetting the Assabet eval board it is possible to build + the system for either RAM bootstrap or ROM bootstrap(s). Select + 'ram' when building programs to load into RAM using eCos GDB + stubs. Select 'rom' when building a stand-alone application + which will be put into ROM, or for the special case of + building the eCos GDB stubs themselves." + } + + # Assabet board has only 1 serial port useable for diagnostic/GDB +## define CYGHWR_HAL_ARM_SA11X0_DIAG_PORT 1 +# FIXME - make this fixed. + cdl_option CYGHWR_HAL_ARM_SA11X0_DIAG_PORT { + display "Diagnostic serial port" + flavor data + legal_values 0 0 + default_value 0 + description " + The Assabet evaluation boards has only one serial port." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_DIAG_BAUD { + display "Diagnostic serial port baud rate" + flavor data + legal_values 9600 19200 38400 115200 + default_value 38400 + description " + This option selects the baud rate used for the diagnostic port. + Note: this should match the value chosen for the GDB port if the + diagnostic and GDB port are the same." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_GDB_PORT { + display "GDB serial port" + flavor data + legal_values 0 0 + default_value 0 + description " + The Assabet evaluation boards has only one serial port." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_GDB_BAUD { + display "GDB serial port baud rate" + flavor data + legal_values 9600 19200 38400 115200 + default_value 38400 + description " + This option selects the baud rate used for the diagnostic port. + Note: this should match the value chosen for the GDB port if the + diagnostic and GDB port are the same." + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS { + display "Number of communication channels on the board" + flavor data + calculated 1 + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { + display "Debug serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value 0 + description " + The assabet board has only one serial port. This option + chooses which port will be used to connect to a host + running GDB." + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { + display "Diagnostic serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value 0 + description " + The assabet board has only one serial port. This option + chooses which port will be used for diagnostic output." + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + no_define + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + parent CYGPKG_NONE + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "arm-elf" } + description " + This option specifies the command prefix used when + invoking the build tools." + } + + cdl_option CYGBLD_GLOBAL_CFLAGS { + display "Global compiler flags" + flavor data + no_define + default_value { "-mcpu=strongarm1100 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" } + description " + This option controls the global compiler flags which are used to + compile all packages by default. Individual packages may define + options which override these global flags." + } + + cdl_option CYGBLD_GLOBAL_LDFLAGS { + display "Global linker flags" + flavor data + no_define + default_value { "-Wl,--gc-sections -Wl,-static -Wl,-N -g -O2 -nostdlib" } + description " + This option controls the global linker flags. Individual + packages may define options which override these global flags." + } + + cdl_option CYGBLD_BUILD_GDB_STUBS { + display "Build GDB stub ROM image" + default_value 0 + requires { CYG_HAL_STARTUP == "ROM" } + requires CYGSEM_HAL_ROM_MONITOR + requires CYGBLD_BUILD_COMMON_GDB_STUBS + requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + no_define + description " + This option enables the building of the GDB stubs for the + board. The common HAL controls takes care of most of the + build process, but the final conversion from ELF image to + binary data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.bin : /bin/gdb_module.img + $(OBJCOPY) --remove-section=.fixed_vectors -O binary $< $@ + } + } + } + + cdl_component CYGPKG_HAL_ARM_SA11X0_ASSABET_OPTIONS { + display "StrongARM SA1110/ASSABET build options" + flavor none + no_define + description " + Package specific build options including control over + compiler flags used only in building this package, + and details of which tests are built." + + + cdl_option CYGPKG_HAL_ARM_SA11X0_ASSABET_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the StrongARM Assabet HAL. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_ASSABET_CFLAGS_REMOVE { + display "Supressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the StrongARM Assabet HAL. These flags are removed from + the set of global flags if present." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_ASSABET_TESTS { + display "StrongARM SA1110/Assabet tests" + flavor data + no_define +# calculated { "tests/dram-test" } + calculated { "" } + description " + This option specifies the set of tests for the StrongARM Assabet HAL." + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "arm_sa11x0_assabet_ram" : \ + "arm_sa11x0_assabet_rom" } + + cdl_option CYGHWR_MEMORY_LAYOUT_LDI { + display "Memory layout linker script fragment" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_LDI + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + + cdl_option CYGHWR_MEMORY_LAYOUT_H { + display "Memory layout header file" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_H + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "Generic" "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "RAM" } + description " + Support can be enabled for different varieties of ROM monitor. + This support changes various eCos semantics such as the encoding + of diagnostic output, or the overriding of hardware interrupt + vectors. + Firstly there is \"Generic\" support which prevents the HAL + from overriding the hardware vectors that it does not use, to + instead allow an installed ROM monitor to handle them. This is + the most basic support which is likely to be common to most + implementations of ROM monitor. + \"GDB_stubs\" provides support when GDB stubs are included in + the ROM monitor or boot ROM." + } + +} diff --git a/packages/hal/arm/sa11x0/assabet/current/include/assabet.h b/packages/hal/arm/sa11x0/assabet/current/include/assabet.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/assabet.h @@ -0,0 +1,143 @@ +#ifndef CYGONCE_ASSABET_H +#define CYGONCE_ASSABET_H + +/*============================================================================= +// +// assabet.h +// +// Platform specific support (register layout, etc) +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Intel SA1110/Assabet platform specific support routines +// Description: +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + + +#ifndef __ASSEMBLER__ +// +// Board Control Register +// Note: This register is write-only. Thus a shadow copy is provided so that +// it may be safely updated/shared by multiple threads. +// +extern unsigned long _assabet_BCR; // Shadow copy + +extern void assabet_BCR(unsigned long mask, unsigned long value); + +// +// Board Configuration data - read at RESET +// +extern unsigned long _assabet_CFG; +#endif + +// +// Signal assertion levels +// +#define SA1110_LOGIC_ONE(m) (m & 0xFFFFFFFF) +#define SA1110_LOGIC_ZERO(m) (m & 0x00000000) + +// +// SA1110/Assabet Board Control Register +// +#define SA1110_BOARD_CONTROL REG32_PTR(0x12000000) +#define SA1110_BCR_MIN 0x00A014E4 // Reset state + +#define SA1110_BCR_CF_POWER 0x00000001 // 1 = CompactFlash power on +#define SA1110_BCR_CF_POWER_ON SA1110_LOGIC_ONE(SA1110_BCR_CF_POWER) +#define SA1110_BCR_CF_POWER_OFF SA1110_LOGIC_ZERO(SA1110_BCR_CF_POWER) +#define SA1110_BCR_CF_RESET 0x00000002 // 1 = CompactFlash reset +#define SA1110_BCR_CF_RESET_ENABLE SA1110_LOGIC_ONE(SA1110_BCR_CF_RESET) +#define SA1110_BCR_CF_RESET_DISABLE SA1110_LOGIC_ZERO(SA1110_BCR_CF_RESET) +#define SA1110_BCR_SOFT_RESET 0x00000004 // 0 = resets UCB1300, ADI7171, UDA1341 +#define SA1110_BCR_IRDA_FREQ 0x00000008 // 0 = SIR, 1 = MIR/FIR +#define SA1110_BCR_IRDA_MD 0x00000030 // IrDA Mode & range +#define SA1110_BCR_IRDA_MD_MAX 0x00000000 // Max range and power +#define SA1110_BCR_IRDA_MD_OFF 0x00000010 // Shutdown +#define SA1110_BCR_IRDA_MD_23 0x00000020 // 2/3 power +#define SA1110_BCR_IRDA_MD_13 0x00000030 // 1/3 power +#define SA1110_BCR_STEREO_LB 0x00000040 // 1 = Stereo loopback on +#define SA1110_BCR_CF_BUS 0x00000080 // 0 = CompactFlash bus on +#define SA1110_BCR_CF_BUS_ON SA1110_LOGIC_ZERO(SA1110_BCR_CF_BUS) +#define SA1110_BCR_CF_BUS_OFF SA1110_LOGIC_ONE(SA1110_BCR_CF_BUS) +#define SA1110_BCR_AUDIO_ON 0x00000100 // 1 = UDA1341, MIC, DAA power on +#define SA1110_BCR_BACKLIGHT 0x00000200 // 1 = LCD backlight on +#define SA1110_BCR_LCD_BPP 0x00000400 // 0 = 16 RGB, 1 = 12 RGB +#define SA1110_BCR_LCD_16BPP SA1110_LOGIC_ZERO(SA1110_BCR_LCD_BPP) +#define SA1110_BCR_LCD_12BPP SA1110_LOGIC_ONE(SA1110_BCR_LCD_BPP) +#define SA1110_BCR_LCD 0x00000800 // 1 = LCD panel and controller on +#define SA1110_BCR_LCD_ON SA1110_LOGIC_ONE(SA1110_BCR_LCD) +#define SA1110_BCR_LCD_OFF SA1110_LOGIC_ZERO(SA1110_BCR_LCD) +#define SA1110_BCR_RS232_ENABLE 0x00001000 // 1 = Enable RD232 signals +#define SA1110_BCR_RED_LED 0x00002000 // 0 = Red LED on +#define SA1110_BCR_RED_LED_ON SA1110_LOGIC_ZERO(SA1110_BCR_RED_LED) +#define SA1110_BCR_RED_LED_OFF SA1110_LOGIC_ONE(SA1110_BCR_RED_LED) +#define SA1110_BCR_GREEN_LED 0x00004000 // 0 = Green LED on +#define SA1110_BCR_GREEN_LED_ON SA1110_LOGIC_ZERO(SA1110_BCR_GREEN_LED) +#define SA1110_BCR_GREEN_LED_OFF SA1110_LOGIC_ONE(SA1110_BCR_GREEN_LED) +#define SA1110_BCR_MOTOR 0x00008000 // 1 = Vibrator motor on +#define SA1110_BCR_COM_DTR 0x00010000 // COM port Data Terminal Ready +#define SA1110_BCR_COM_RTS 0x00020000 // COM port Request To Send +#define SA1110_BCR_RADIO_WAKE 0x00040000 // 1 = Wake up CPU with radio +#define SA1110_BCR_MUTE 0x00200000 // 1 = Audio muted + +// +// Special purpose GPIO interrupt mappings +// +#define SA1110_CF_IRQ CYGNUM_HAL_INTERRUPT_GPIO21 +#define SA1110_CF_DETECT CYGNUM_HAL_INTERRUPT_GPIO22 + +// +// GPIO layout +// +#define SA1110_GPIO_CF_DETECT 0x00400000 // 0 = Compact Flash detect +#define SA1110_GPIO_CF_PRESENT SA1110_LOGIC_ZERO(SA1110_GPIO_CF_DETECT) +#define SA1110_GPIO_CF_ABSENT SA1110_LOGIC_ONE(SA1110_GPIO_CF_DETECT) + +// +// LCD Controller +// +#define SA1110_LCCR0 SA11X0_REGISTER(0x30100000) +#define SA1110_LCSR SA11X0_REGISTER(0x30100004) +#define SA1110_DBAR1 SA11X0_REGISTER(0x30100010) +#define SA1110_DCAR1 SA11X0_REGISTER(0x30100014) +#define SA1110_DBAR2 SA11X0_REGISTER(0x30100018) +#define SA1110_DCAR2 SA11X0_REGISTER(0x3010001C) +#define SA1110_LCCR1 SA11X0_REGISTER(0x30100020) +#define SA1110_LCCR2 SA11X0_REGISTER(0x30100024) +#define SA1110_LCCR3 SA11X0_REGISTER(0x30100028) + +/*---------------------------------------------------------------------------*/ +/* end of assabet.h */ +#endif /* CYGONCE_ASSABET_H */ diff --git a/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_ints.h b/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_ints.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_ints.h @@ -0,0 +1,108 @@ +#ifndef CYGONCE_HAL_PLATFORM_INTS_H +#define CYGONCE_HAL_PLATFORM_INTS_H +//========================================================================== +// +// hal_platform_ints.h +// +// HAL Interrupt and clock support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Define Interrupt support +// Description: The interrupt details for the SA1110/Assabet are defined here. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#define CYGNUM_HAL_INTERRUPT_GPIO0 0 +#define CYGNUM_HAL_INTERRUPT_GPIO1 1 +#define CYGNUM_HAL_INTERRUPT_GPIO2 2 +#define CYGNUM_HAL_INTERRUPT_GPIO3 3 +#define CYGNUM_HAL_INTERRUPT_GPIO4 4 +#define CYGNUM_HAL_INTERRUPT_GPIO5 5 +#define CYGNUM_HAL_INTERRUPT_GPIO6 6 +#define CYGNUM_HAL_INTERRUPT_GPIO7 7 +#define CYGNUM_HAL_INTERRUPT_GPIO8 8 +#define CYGNUM_HAL_INTERRUPT_GPIO9 9 +#define CYGNUM_HAL_INTERRUPT_GPIO10 10 +#define CYGNUM_HAL_INTERRUPT_GPIO 11 // Don't use directly! +#define CYGNUM_HAL_INTERRUPT_LCD 12 +#define CYGNUM_HAL_INTERRUPT_UDC 13 +#define CYGNUM_HAL_INTERRUPT_UART1 15 +#define CYGNUM_HAL_INTERRUPT_UART2 16 +#define CYGNUM_HAL_INTERRUPT_UART3 17 +#define CYGNUM_HAL_INTERRUPT_MCP 18 +#define CYGNUM_HAL_INTERRUPT_SSP 19 +#define CYGNUM_HAL_INTERRUPT_TIMER0 26 +#define CYGNUM_HAL_INTERRUPT_TIMER1 27 +#define CYGNUM_HAL_INTERRUPT_TIMER2 28 +#define CYGNUM_HAL_INTERRUPT_TIMER3 29 +#define CYGNUM_HAL_INTERRUPT_HZ 30 +#define CYGNUM_HAL_INTERRUPT_ALARM 31 + +// GPIO bits 31..11 can generate interrupts as well, but they all +// end up clumped into interrupt signal #11. Using the symbols +// below allow for detection of these separately. + +#define CYGNUM_HAL_INTERRUPT_GPIO11 (32+11) +#define CYGNUM_HAL_INTERRUPT_GPIO12 (32+12) +#define CYGNUM_HAL_INTERRUPT_GPIO13 (32+13) +#define CYGNUM_HAL_INTERRUPT_GPIO14 (32+14) +#define CYGNUM_HAL_INTERRUPT_GPIO15 (32+15) +#define CYGNUM_HAL_INTERRUPT_GPIO16 (32+16) +#define CYGNUM_HAL_INTERRUPT_GPIO17 (32+17) +#define CYGNUM_HAL_INTERRUPT_GPIO18 (32+18) +#define CYGNUM_HAL_INTERRUPT_GPIO19 (32+19) +#define CYGNUM_HAL_INTERRUPT_GPIO20 (32+20) +#define CYGNUM_HAL_INTERRUPT_GPIO21 (32+21) +#define CYGNUM_HAL_INTERRUPT_GPIO22 (32+22) +#define CYGNUM_HAL_INTERRUPT_GPIO23 (32+23) +#define CYGNUM_HAL_INTERRUPT_GPIO24 (32+24) +#define CYGNUM_HAL_INTERRUPT_GPIO25 (32+25) +#define CYGNUM_HAL_INTERRUPT_GPIO26 (32+26) +#define CYGNUM_HAL_INTERRUPT_GPIO27 (32+27) + +#define CYGNUM_HAL_INTERRUPT_NONE -1 + +#define CYGNUM_HAL_ISR_MIN 0 +#define CYGNUM_HAL_ISR_MAX (27+32) + +#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX+1) + +// The vector used by the Real time clock +#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0 + +#endif // CYGONCE_HAL_PLATFORM_INTS_H diff --git a/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_setup.h b/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_setup.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/hal_platform_setup.h @@ -0,0 +1,271 @@ +#ifndef CYGONCE_HAL_PLATFORM_SETUP_H +#define CYGONCE_HAL_PLATFORM_SETUP_H + +/*============================================================================= +// +// hal_platform_setup.h +// +// Platform specific support for HAL (assembly code) +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Intel SA1110/Assabet platform specific support routines +// Description: +// Usage: #include +// Only used by "vectors.S" +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include // System-wide configuration info +#include CYGBLD_HAL_VARIANT_H // Variant (SA11x0) specific configuration +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include // Variant specific hardware definitions +#include // MMU definitions +#include // Platform specific hardware definitions + +#if defined(CYG_HAL_STARTUP_ROM) +#define PLATFORM_SETUP1 _platform_setup1 +#define CYGHWR_HAL_ARM_HAS_MMU + +#if (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 59000) +#define SA11X0_PLL_CLOCK 0x0 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 73700) +#define SA11X0_PLL_CLOCK 0x1 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 88500) +#define SA11X0_PLL_CLOCK 0x2 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 103200) +#define SA11X0_PLL_CLOCK 0x3 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 118000) +#define SA11X0_PLL_CLOCK 0x4 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 132700) +#define SA11X0_PLL_CLOCK 0x5 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 147500) +#define SA11X0_PLL_CLOCK 0x6 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 162200) +#define SA11X0_PLL_CLOCK 0x7 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 176900) +#define SA11X0_PLL_CLOCK 0x8 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 191700) +#define SA11X0_PLL_CLOCK 0x9 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 206400) +#define SA11X0_PLL_CLOCK 0xA +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 221200) +#define SA11X0_PLL_CLOCK 0xB +#else +#error Invalid processor clock speed +#endif + + +// This macro represents the initial startup code for the platform + .macro _platform_setup1 + + // Turn off LEDs + ldr r1,=SA1110_BOARD_CONTROL + ldr r2,=SA1110_BCR_MIN + orr r2,r2,#SA1110_BCR_RED_LED + orr r2,r2,#SA1110_BCR_GREEN_LED + str r2,[r1] + + // Set up GPIO to read hardware configuration + ldr r1,=SA11X0_GPIO_PIN_DIRECTION + ldr r2,=0x0807A7FC + str r2,[r1] + ldr r3,=SA11X0_GPIO_PIN_OUTPUT_SET + ldr r2,=0x2FC // Bits 2..9 + str r2,[r3] // Requests hardware configuration + ldr r2,=0x0807A400 // Reconfigure 2..9 as inputs + str r2,[r1] + ldr r3,=SA11X0_GPIO_PIN_LEVEL + mov r2,#100 +10: ldr r9,[r3] // Read multiple times to settle + subs r2,r2,#1 + bne 10b + ldr r2,=0x0807A7FC // Restore proper pin configuration + str r2,[r1] + ldr r3,=SA11X0_GPIO_PIN_OUTPUT_SET + ldr r2,=0x10000 // Enable high power mode + str r2,[r3] + + // Disable clock switching + mcr p15,0,r0,\ + SA11X0_TEST_CLOCK_AND_IDLE_REGISTER,\ + SA11X0_DISABLE_CLOCK_SWITCHING_RM,\ + SA11X0_DISABLE_CLOCK_SWITCHING_OPCODE + + // Set up processor clock + ldr r1,=SA11X0_PWR_MGR_PLL_CONFIG + ldr r2,=SA11X0_PLL_CLOCK + str r2,[r1] + + // Turn clock switching back on + mcr p15,0,r0,\ + SA11X0_TEST_CLOCK_AND_IDLE_REGISTER,\ + SA11X0_ENABLE_CLOCK_SWITCHING_RM,\ + SA11X0_ENABLE_CLOCK_SWITCHING_OPCODE + nop + nop + + // Turn on Red LED + ldr r1,=SA1110_BOARD_CONTROL + ldr r2,=SA1110_BCR_MIN + bic r2,r2,#SA1110_BCR_RED_LED + orr r2,r2,#SA1110_BCR_GREEN_LED + str r2,[r1] + + // Pause + ldr r1,=100000 +10: sub r1,r1,#1 + cmp r1,#0 + bne 10b + + // Initialize DRAM controller + ldr r1,=dram_table + ldr r2,=__exception_handlers + sub r1,r1,r2 + ldr r2,[r1],#4 // First control register +10: ldr r3,[r1],#4 + str r3,[r2] + ldr r2,[r1],#4 // Next control register + cmp r2,#0 + bne 10b + + ldr r1,=SA1110_BOARD_CONTROL + ldr r2,=SA1110_BCR_MIN + orr r2,r2,#SA1110_BCR_RED_LED + bic r2,r2,#SA1110_BCR_GREEN_LED + str r2,[r1] + + // Enable UART + ldr r1,=SA1110_GPCLK_CONTROL_0 + ldr r2,=SA1110_GPCLK_SUS_UART + str r2,[r1] + + // Release DRAM hold (set by RESET) + ldr r1,=SA11X0_PWR_MGR_SLEEP_STATUS + ldr r2,=SA11X0_DRAM_CONTROL_HOLD + str r2,[r1] + + // Perform 8 reads from unmapped/unenabled DRAM + ldr r1,=SA11X0_RAM_BANK0_BASE + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + + // Enable DRAM controller + ldr r1,=SA11X0_DRAM_CONFIGURATION + ldr r2,=0x72547255 + str r2,[r1] + + b 19f + +// DRAM controller initialization +dram_table: + .word SA11X0_DRAM0_CAS_0, 0xAAAAAA7F + .word SA11X0_DRAM0_CAS_1, 0xAAAAAAAA + .word SA11X0_DRAM0_CAS_2, 0xAAAAAAAA + .word SA11X0_STATIC_CONTROL_0, 0x4B384B38 + .word SA11X0_STATIC_CONTROL_1, 0x22212419 + .word SA11X0_EXP_BUS_CONFIGURATION, 0x994A994A + .word SA11X0_REFRESH_CONFIGURATION, 0x49FC0327 + .word SA11X0_DRAM2_CAS_0, 0xAAAAAA7F + .word SA11X0_DRAM2_CAS_1, 0xAAAAAAAA + .word SA11X0_DRAM2_CAS_2, 0xAAAAAAAA + .word SA11X0_STATIC_CONTROL_2, 0x42194449 + .word SA11X0_SMROM_CONFIGURATION, 0xAFCCAFCC + .word SA11X0_DRAM_CONFIGURATION, 0x72547254 // Disabled + .word 0, 0 +19: + + // Release peripheral hold (set by RESET) + ldr r1,=SA11X0_PWR_MGR_SLEEP_STATUS + ldr r2,=SA11X0_PERIPHERAL_CONTROL_HOLD + str r2,[r1] + + // Set up a stack [for calling C code] + ldr r1,=__startup_stack + ldr r2,=SA11X0_RAM_BANK0_BASE + orr sp,r1,r2 + + // Create MMU tables + bl hal_mmu_init + + // Turn on green LED + ldr r1,=SA1110_BOARD_CONTROL + ldr r2,=SA1110_BCR_MIN + orr r2,r2,#SA1110_BCR_RED_LED + bic r2,r2,#SA1110_BCR_GREEN_LED + str r2,[r1] + + // Enable MMU + ldr r2,=10f + ldr r1,=MMU_Control_Init|MMU_Control_M + mcr MMU_CP,0,r1,MMU_Control,c0 + mov pc,r2 /* Change address spaces */ + nop + nop + nop +10: + + // Turn on both LEDs + ldr r1,=SA1110_BOARD_CONTROL + ldr r2,=SA1110_BCR_MIN + bic r2,r2,#SA1110_BCR_RED_LED + bic r2,r2,#SA1110_BCR_GREEN_LED + str r2,[r1] + + // Save shadow copy of BCR, also hardware configuration + ldr r1,=_assabet_BCR + str r2,[r1] + ldr r1,=_assabet_CFG + str r9,[r1] // Saved far above... + .endm + +#else // defined(CYG_HAL_STARTUP_ROM) +#define PLATFORM_SETUP1 +#endif + +#define PLATFORM_VECTORS _platform_vectors + .macro _platform_vectors + .globl _assabet_BCR, _assabet_CFG +_assabet_BCR: .long 0 // Board Control register shadow +_assabet_CFG: .long 0 // Board Configuration (read at RESET) + .endm + +/*---------------------------------------------------------------------------*/ +/* end of hal_platform_setup.h */ +#endif /* CYGONCE_HAL_PLATFORM_SETUP_H */ diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.h b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.h @@ -0,0 +1,10 @@ +// eCos memory layout - Sun Jun 04 12:17:47 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x2000000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.ldi @@ -0,0 +1,24 @@ +// eCos memory layout - Sun Jun 04 12:17:47 2000 + +// This is a generated file - do not edit + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0x2000000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_rom_vectors (ram, 0x10000, LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_ram.mlt @@ -0,0 +1,12 @@ +version 0 +region ram 0 2000000 0 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section rom_vectors 0 1 0 1 1 1 1 1 10000 10000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 1 0 1 data data ! +section data 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 4 0 1 0 0 0 0 ! diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.h b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.h @@ -0,0 +1,13 @@ +// eCos memory layout - Sun Jun 04 12:19:07 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x2000000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0x50000000) +#define CYGMEM_REGION_rom_SIZE (0x40000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.ldi @@ -0,0 +1,25 @@ +// eCos memory layout - Sun Jun 04 12:19:07 2000 + +// This is a generated file - do not edit + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0x2000000 + rom : ORIGIN = 0x50000000, LENGTH = 0x40000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_rom_vectors (rom, 0x50000000, LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_data (ram, 0x8000, FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/include/pkgconf/mlt_arm_sa11x0_assabet_rom.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 0 2000000 0 ! +region rom 50000000 40000 1 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section data 0 1 1 1 1 1 0 0 8000 bss ! +section bss 0 4 0 1 0 0 0 0 ! +section rom_vectors 0 1 0 1 1 1 1 1 50000000 50000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 0 0 1 data ! diff --git a/packages/hal/arm/sa11x0/assabet/current/misc/cf_test.c b/packages/hal/arm/sa11x0/assabet/current/misc/cf_test.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/misc/cf_test.c @@ -0,0 +1,140 @@ +//========================================================================== +// +// cf_test.c +// +// SA1110/Assabet - Compact Flash test +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-06-05 +// Description: Tool used to test CF stuff +//####DESCRIPTIONEND#### + +#include // Configuration header +#include +#include + +#include // IO macros +#include // Register state info +#include // HAL interrupt macros + +#include // Board definitions +#include + +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +#define STACK_SIZE 4096 +static char stack[STACK_SIZE]; +static cyg_thread thread_data; +static cyg_handle_t thread_handle; + +static cyg_interrupt cf_interrupt; +static cyg_handle_t cf_interrupt_handle; + +// FUNCTIONS + +static void +cyg_test_exit(void) +{ + while (TRUE) ; +} + +// This ISR is called when a CompactFlash board is inserted +static int +cf_detect_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs) +{ + cyg_interrupt_mask(SA1110_CF_DETECT); + return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR); // Run the DSR +} + +// This DSR handles the board insertion +static void +cf_detect_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) +{ + unsigned long new_state = *SA11X0_GPIO_PIN_LEVEL; + diag_printf("CF card inserted, state: %x\n", new_state); + cyg_interrupt_acknowledge(SA1110_CF_DETECT); + cyg_interrupt_unmask(SA1110_CF_DETECT); +} + +static void +cf_test(cyg_addrword_t p) +{ + unsigned long cf_state; + diag_printf("CF test here\n"); + // Disable CF bus & power (idle/off) + assabet_BCR(SA1110_BCR_CF_POWER | + SA1110_BCR_CF_RESET | + SA1110_BCR_CF_BUS, + SA1110_BCR_CF_POWER_OFF | + SA1110_BCR_CF_RESET_DISABLE | + SA1110_BCR_CF_BUS_OFF); + while (1) { + cf_state = *SA11X0_GPIO_PIN_LEVEL; + if ((cf_state & SA1110_GPIO_CF_DETECT) == SA1110_GPIO_CF_PRESENT) { + diag_printf("Compact Flash card inserted!\n"); + diag_dump_buf(0x30000000, 0x100); + break; + } + } + cyg_test_exit(); +} + +externC void +cyg_start( void ) +{ + // Set up interrupts + cyg_interrupt_create(SA1110_CF_DETECT, + 99, // Priority - what goes here? + 0, // Data item passed to interrupt handler + (cyg_ISR_t *)cf_detect_isr, + (cyg_DSR_t *)cf_detect_dsr, + &cf_interrupt_handle, + &cf_interrupt); + cyg_interrupt_attach(cf_interrupt_handle); + cyg_interrupt_configure(SA1110_CF_DETECT, true, true); // Detect either edge + cyg_interrupt_acknowledge(SA1110_CF_DETECT); + cyg_interrupt_unmask(SA1110_CF_DETECT); + // Create a main thread, so we can run the scheduler and have time 'pass' + cyg_thread_create(10, // Priority - just a number + cf_test, // entry + 0, // entry parameter + "CompactFlash test", // Name + &stack[0], // Stack + STACK_SIZE, // Size + &thread_handle, // Handle + &thread_data // Thread data structure + ); + cyg_thread_resume(thread_handle); // Start it + cyg_scheduler_start(); +} // cyg_package_start() diff --git a/packages/hal/arm/sa11x0/assabet/current/src/assabet_misc.c b/packages/hal/arm/sa11x0/assabet/current/src/assabet_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/src/assabet_misc.c @@ -0,0 +1,246 @@ +//========================================================================== +// +// assabet_misc.c +// +// HAL misc board support code for StrongARM SA1110/Assabet +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: hmt +// Travis C. Furrer +// Date: 2000-05-21 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#include // base types +#include // tracing macros +#include // assertion macros + +#include // IO macros +#include // Register state info +#include +#include // Interrupt names +#include +#include // Hardware definitions +#include // Platform specifics + +#include // diag_printf + +// ------------------------------------------------------------------------- +// MMU initialization: +// +// These structures are laid down in memory to define the translation +// table. +// + +/* + * SA-1100 Translation Table Base Bit Masks */ +#define ARM_TRANSLATION_TABLE_MASK 0xFFFFC000 + +/* + * SA-1100 Domain Access Control Bit Masks + */ +#define ARM_ACCESS_TYPE_NO_ACCESS(domain_num) (0x0 << (domain_num)*2) +#define ARM_ACCESS_TYPE_CLIENT(domain_num) (0x1 << (domain_num)*2) +#define ARM_ACCESS_TYPE_MANAGER(domain_num) (0x3 << (domain_num)*2) + +struct ARM_MMU_FIRST_LEVEL_FAULT { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_FAULT_ID 0x0 + +struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE { + int id : 2; + int imp : 2; + int domain : 4; + int sbz : 1; + int base_address : 23; +}; +#define ARM_MMU_FIRST_LEVEL_PAGE_TABLE_ID 0x1 + +struct ARM_MMU_FIRST_LEVEL_SECTION { + int id : 2; + int b : 1; + int c : 1; + int imp : 1; + int domain : 4; + int sbz0 : 1; + int ap : 2; + int sbz1 : 8; + int base_address : 12; +}; +#define ARM_MMU_FIRST_LEVEL_SECTION_ID 0x2 + +struct ARM_MMU_FIRST_LEVEL_RESERVED { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_RESERVED_ID 0x3 + +#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \ + (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2)) + +#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE 0x4000 + +#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base, \ + cacheable, bufferable, perm) \ + CYG_MACRO_START \ + register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc; \ + \ + desc.word = 0; \ + desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID; \ + desc.section.domain = 0; \ + desc.section.c = (cacheable); \ + desc.section.b = (bufferable); \ + desc.section.ap = (perm); \ + desc.section.base_address = (actual_base); \ + *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) \ + = desc.word; \ + CYG_MACRO_END + +#define X_ARM_MMU_SECTION(abase,vbase,size,cache,buff,access) \ + { int i; int j = abase; int k = vbase; \ + for (i = size; i > 0 ; i--,j++,k++) \ + { \ + ARM_MMU_SECTION(ttb_base, j, k, cache, buff, access); \ + } \ + } + +union ARM_MMU_FIRST_LEVEL_DESCRIPTOR { + unsigned long word; + struct ARM_MMU_FIRST_LEVEL_FAULT fault; + struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE page_table; + struct ARM_MMU_FIRST_LEVEL_SECTION section; + struct ARM_MMU_FIRST_LEVEL_RESERVED reserved; +}; + +#define ARM_UNCACHEABLE 0 +#define ARM_CACHEABLE 1 +#define ARM_UNBUFFERABLE 0 +#define ARM_BUFFERABLE 1 + +#define ARM_ACCESS_PERM_NONE_NONE 0 +#define ARM_ACCESS_PERM_RO_NONE 0 +#define ARM_ACCESS_PERM_RO_RO 0 +#define ARM_ACCESS_PERM_RW_NONE 1 +#define ARM_ACCESS_PERM_RW_RO 2 +#define ARM_ACCESS_PERM_RW_RW 3 + +void +hal_mmu_init(void) +{ + unsigned long ttb_base = SA11X0_RAM_BANK0_BASE + 0x4000; + unsigned long i; + + /* + * Set the TTB register + */ + asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/); + + /* + * Set the Domain Access Control Register + */ + i = ARM_ACCESS_TYPE_MANAGER(0) | + ARM_ACCESS_TYPE_NO_ACCESS(1) | + ARM_ACCESS_TYPE_NO_ACCESS(2) | + ARM_ACCESS_TYPE_NO_ACCESS(3) | + ARM_ACCESS_TYPE_NO_ACCESS(4) | + ARM_ACCESS_TYPE_NO_ACCESS(5) | + ARM_ACCESS_TYPE_NO_ACCESS(6) | + ARM_ACCESS_TYPE_NO_ACCESS(7) | + ARM_ACCESS_TYPE_NO_ACCESS(8) | + ARM_ACCESS_TYPE_NO_ACCESS(9) | + ARM_ACCESS_TYPE_NO_ACCESS(10) | + ARM_ACCESS_TYPE_NO_ACCESS(11) | + ARM_ACCESS_TYPE_NO_ACCESS(12) | + ARM_ACCESS_TYPE_NO_ACCESS(13) | + ARM_ACCESS_TYPE_NO_ACCESS(14) | + ARM_ACCESS_TYPE_NO_ACCESS(15); + asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/); + + /* + * First clear all TT entries - ie Set them to Faulting + */ + memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE); + + /* Actual Virtual Size Attributes Function */ + /* Base Base MB cached? buffered? access permissions */ + /* xxx00000 xxx00000 */ + X_ARM_MMU_SECTION(0x000, 0x500, 1, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Boot flash ROMspace */ + X_ARM_MMU_SECTION(0x080, 0x080, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Application flash ROM */ + X_ARM_MMU_SECTION(0x100, 0x100, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SA-1101 Development Board Registers */ + X_ARM_MMU_SECTION(0x180, 0x180, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Ethernet Adaptor */ + X_ARM_MMU_SECTION(0x184, 0x184, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* XBusReg */ + X_ARM_MMU_SECTION(0x188, 0x188, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SysRegA */ + X_ARM_MMU_SECTION(0x18C, 0x18C, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SysRegB */ + X_ARM_MMU_SECTION(0x190, 0x190, 4, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* CPLD A */ + X_ARM_MMU_SECTION(0x194, 0x194, 4, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* CPLD B */ + X_ARM_MMU_SECTION(0x200, 0x200, 512, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* PCMCIA Socket A */ + X_ARM_MMU_SECTION(0x300, 0x300, 512, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* PCMCIA Sockets B */ + X_ARM_MMU_SECTION(0x400, 0x400, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SA1111 Daughter card */ + X_ARM_MMU_SECTION(0x480, 0x480, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Video Controller Daughter card */ + X_ARM_MMU_SECTION(0x800, 0x800, 0x400, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* StrongARM(R) Registers */ + X_ARM_MMU_SECTION(0xC00, 0, 32, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ + X_ARM_MMU_SECTION(0xC00, 0xC00, 32, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ + X_ARM_MMU_SECTION(0xE00, 0xE00, 128, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Zeros (Cache Clean) Bank */ + +} + +// +// Board control register support +// Update the board control register (write only). Only the bits +// specified by 'mask' are changed to 'value'. +// + +void +assabet_BCR(unsigned long mask, unsigned long value) +{ + _assabet_BCR = (_assabet_BCR & ~mask) | (mask & value); + *SA1110_BOARD_CONTROL = _assabet_BCR; +} + +// +// Platform specific initialization +// + +void +plf_hardware_init(void) +{ + // Force "alternate" use of GPIO pins used for LCD screen +// *SA11X0_GPIO_ALTERNATE_FUNCTION |= 0x000003FC; // Bits 2..9 +} diff --git a/packages/hal/arm/sa11x0/assabet/current/support/README b/packages/hal/arm/sa11x0/assabet/current/support/README new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/support/README @@ -0,0 +1,6 @@ +This directory contains programs/files obtained from the Intel +developer's website - http://developer.intel.com/ + +SA1110Jflash.tgz - A set of tools for updating the flash devices + on the Assabet board in place using a parallel + port on either Linux or Windows. \ No newline at end of file diff --git a/packages/hal/arm/sa11x0/assabet/current/support/SA1110Jflash.tgz b/packages/hal/arm/sa11x0/assabet/current/support/SA1110Jflash.tgz new file mode 100644 index 0000000000000000000000000000000000000000..33d735abe42645bfcd50902e079b4806685a075a GIT binary patch literal 128673 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 diff --git a/packages/hal/arm/sa11x0/brutus/current/ChangeLog b/packages/hal/arm/sa11x0/brutus/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/ChangeLog @@ -0,0 +1,83 @@ +2000-06-26 Jesper Skov + + * include/hal_platform_ints.h: Removed Ctrl-c handling. + + * cdl/hal_arm_sa11x0_brutus.cdl: Removed ROM_DEBUG_CHANNEL option. + +2000-06-19 Gary Thomas + + * src/brutus_misc.c: Define proper MMU initialization. + + * include/hal_platform_setup.h: Rework MMU initialization to + be closer to other SA1xx platforms (Assabet, EBSA285) + +2000-06-18 Gary Thomas + + * include/pkgconf/mlt_arm_sa11x0_brutus_rom.ldi: + * include/pkgconf/mlt_arm_sa11x0_brutus_rom.mlt: + * include/pkgconf/mlt_arm_sa11x0_brutus_ram.mlt: + * include/pkgconf/mlt_arm_sa11x0_brutus_ram.ldi: + Incorporate new fixed vectors (used on all ARM platforms). + +2000-06-08 Gary Thomas + + * include/hal_platform_setup.h: Adding ROM startup support. + +2000-06-05 Gary Thomas + + * cdl/hal_arm_sa11x0_brutus.cdl: Default serial port is 0 + (maps to UART 3 on J23). + + * include/hal_platform_ints.h: Add missing GPIO interrupts. + +2000-06-04 Gary Thomas + + * include/hal_platform_setup.h: 'sa1100' stuff renamed to 'sa11x0'. + +2000-06-01 Gary Thomas + + * cdl/hal_arm_sa11x0_brutus.cdl: Adding ROM startup support. + +2000-05-12 John Dallaway + + * cdl/hal_arm_sa11x0_brutus.cdl: + + Fix calculation of CYGHWR_MEMORY_LAYOUT. + +2000-05-10 Gary Thomas + + * current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.h: + * current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.ldi: + * current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.mlt: + * current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.mlt: + * current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.h: + * current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.ldi: + * current/include/hal_platform_ints.h: + * current/include/hal_platform_setup.h: + * current/cdl/hal_arm_sa11x0_brutus.cdl: New file(s). + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/arm/sa11x0/brutus/current/cdl/hal_arm_sa11x0_brutus.cdl b/packages/hal/arm/sa11x0/brutus/current/cdl/hal_arm_sa11x0_brutus.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/cdl/hal_arm_sa11x0_brutus.cdl @@ -0,0 +1,324 @@ +# ==================================================================== +# +# hal_arm_sa11x0_brutus.cdl +# +# ARM SA1100/Brutus platform HAL package configuration data +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Original data: gthomas +# Contributors: +# Date: 2000-05-08 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== +cdl_package CYGPKG_HAL_ARM_SA11X0_BRUTUS { + display "ARM SA1100/Brutus evaluation board" + parent CYGPKG_HAL_ARM_SA11X0 + hardware + include_dir cyg/hal + define_header hal_arm_sa11x0_brutus.h + description " + This HAL platform package provides generic + support for the Intel StrongARM SA1100 based evalation board, + known as 'brutus'." + + compile brutus_misc.c + + implements CYGINT_HAL_DEBUG_GDB_STUBS + implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H " + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + } + + cdl_component CYG_HAL_STARTUP { + display "Startup type" + flavor data + default_value {"RAM"} + legal_values {"RAM" "ROM"} + no_define + define -file system.h CYG_HAL_STARTUP + description " + When targetting the Brutus eval board it is possible to build + the system for either RAM bootstrap or ROM bootstrap(s). Select + 'ram' when building programs to load into RAM using eCos GDB + stubs. Select 'rom' when building a stand-alone application + which will be put into ROM, or for the special case of + building the eCos GDB stubs themselves." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_DIAG_PORT { + display "Diagnostic serial port" + flavor data + legal_values 0 1 + default_value 1 + description " + The Brutus evaluation boards have two separate serial ports. This option + chooses which of these ports will be used." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_DIAG_BAUD { + display "Diagnostic serial port baud rate" + flavor data + legal_values 9600 19200 38400 115200 + default_value 38400 + description " + This option selects the baud rate used for the diagnostic port. + Note: this should match the value chosen for the GDB port if the + diagnostic and GDB port are the same." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_GDB_PORT { + display "GDB serial port" + flavor data + legal_values 0 1 + default_value 1 + description " + The Brutus evaluation boards have two separate serial ports. This option + chooses which of these ports will be used." + } + + cdl_option CYGHWR_HAL_ARM_SA11X0_GDB_BAUD { + display "GDB serial port baud rate" + flavor data + legal_values 9600 19200 38400 115200 + default_value 38400 + description " + This option selects the baud rate used for the diagnostic port. + Note: this should match the value chosen for the GDB port if the + diagnostic and GDB port are the same." + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS { + display "Number of communication channels on the board" + flavor data + calculated 2 + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { + display "Debug serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value CYGHWR_HAL_ARM_SA11X0_GDB_PORT + description " + The brutus board has two serial ports. This option + chooses which port will be used to connect to a host + running GDB." + } + + cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { + display "Diagnostic serial port" + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + default_value CYGHWR_HAL_ARM_SA11X0_DIAG_PORT + description " + The brutus board has two serial ports. This option + chooses which port will be used for diagnostic output." + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + no_define + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + parent CYGPKG_NONE + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "arm-elf" } + description " + This option specifies the command prefix used when + invoking the build tools." + } + + cdl_option CYGBLD_GLOBAL_CFLAGS { + display "Global compiler flags" + flavor data + no_define + default_value { "-mcpu=strongarm1100 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" } + description " + This option controls the global compiler flags which are used to + compile all packages by default. Individual packages may define + options which override these global flags." + } + + cdl_option CYGBLD_GLOBAL_LDFLAGS { + display "Global linker flags" + flavor data + no_define + default_value { "-Wl,--gc-sections -Wl,-static -g -O2 -nostdlib" } + description " + This option controls the global linker flags. Individual + packages may define options which override these global flags." + } + + cdl_option CYGBLD_BUILD_GDB_STUBS { + display "Build GDB stub ROM image" + default_value 0 + requires { CYG_HAL_STARTUP == "ROM" } + requires CYGSEM_HAL_ROM_MONITOR + requires CYGBLD_BUILD_COMMON_GDB_STUBS + requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + no_define + description " + This option enables the building of the GDB stubs for the + board. The common HAL controls takes care of most of the + build process, but the final conversion from ELF image to + binary data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.bin : /bin/gdb_module.img + $(OBJCOPY) -O binary $< $@ + } + } + } + + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "Generic" "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "RAM" } + description " + Support can be enabled for different varieties of ROM monitor. + This support changes various eCos semantics such as the encoding + of diagnostic output, or the overriding of hardware interrupt + vectors. + Firstly there is \"Generic\" support which prevents the HAL + from overriding the hardware vectors that it does not use, to + instead allow an installed ROM monitor to handle them. This is + the most basic support which is likely to be common to most + implementations of ROM monitor. + \"GDB_stubs\" provides support when GDB stubs are included in + the ROM monitor or boot ROM." + } + + cdl_component CYGPKG_HAL_ARM_SA11X0_BRUTUS_OPTIONS { + display "StrongARM SA1100/BRUTUS build options" + flavor none + no_define + description " + Package specific build options including control over + compiler flags used only in building this package, + and details of which tests are built." + + + cdl_option CYGPKG_HAL_ARM_SA11X0_BRUTUS_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the StrongARM Brutus HAL. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_BRUTUS_CFLAGS_REMOVE { + display "Supressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the StrongARM Brutus HAL. These flags are removed from + the set of global flags if present." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_BRUTUS_TESTS { + display "StrongARM SA1100/Brutus tests" + flavor data + no_define +# calculated { "tests/dram-test" } + calculated { "" } + description " + This option specifies the set of tests for the StrongARM Brutus HAL." + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "arm_sa11x0_brutus_ram" : \ + "arm_sa11x0_brutus_rom" } + + cdl_option CYGHWR_MEMORY_LAYOUT_LDI { + display "Memory layout linker script fragment" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_LDI + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + + cdl_option CYGHWR_MEMORY_LAYOUT_H { + display "Memory layout header file" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_H + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } + +} diff --git a/packages/hal/arm/sa11x0/brutus/current/include/brutus.h b/packages/hal/arm/sa11x0/brutus/current/include/brutus.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/brutus.h @@ -0,0 +1,50 @@ +#ifndef CYGONCE_BRUTUS_H +#define CYGONCE_BRUTUS_H + +/*============================================================================= +// +// brutus.h +// +// Platform specific support (registers, etc) +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Intel SA1110/Brutus platform specific support routines +// Description: +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +/*---------------------------------------------------------------------------*/ +/* end of brutus.h */ +#endif /* CYGONCE_BRUTUS_H */ diff --git a/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_ints.h b/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_ints.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_ints.h @@ -0,0 +1,108 @@ +#ifndef CYGONCE_HAL_PLATFORM_INTS_H +#define CYGONCE_HAL_PLATFORM_INTS_H +//========================================================================== +// +// hal_platform_ints.h +// +// HAL Interrupt and clock support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-05-08 +// Purpose: Define Interrupt support +// Description: The interrupt details for the SA1100/Brutus are defined here. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#define CYGNUM_HAL_INTERRUPT_GPIO0 0 +#define CYGNUM_HAL_INTERRUPT_GPIO1 1 +#define CYGNUM_HAL_INTERRUPT_GPIO2 2 +#define CYGNUM_HAL_INTERRUPT_GPIO3 3 +#define CYGNUM_HAL_INTERRUPT_GPIO4 4 +#define CYGNUM_HAL_INTERRUPT_GPIO5 5 +#define CYGNUM_HAL_INTERRUPT_GPIO6 6 +#define CYGNUM_HAL_INTERRUPT_GPIO7 7 +#define CYGNUM_HAL_INTERRUPT_GPIO8 8 +#define CYGNUM_HAL_INTERRUPT_GPIO9 9 +#define CYGNUM_HAL_INTERRUPT_GPIO10 10 +#define CYGNUM_HAL_INTERRUPT_GPIO 11 // Don't use directly +#define CYGNUM_HAL_INTERRUPT_LCD 12 +#define CYGNUM_HAL_INTERRUPT_UDC 13 +#define CYGNUM_HAL_INTERRUPT_UART1 15 +#define CYGNUM_HAL_INTERRUPT_UART2 16 +#define CYGNUM_HAL_INTERRUPT_UART3 17 +#define CYGNUM_HAL_INTERRUPT_MCP 18 +#define CYGNUM_HAL_INTERRUPT_SSP 19 +#define CYGNUM_HAL_INTERRUPT_TIMER0 26 +#define CYGNUM_HAL_INTERRUPT_TIMER1 27 +#define CYGNUM_HAL_INTERRUPT_TIMER2 28 +#define CYGNUM_HAL_INTERRUPT_TIMER3 29 +#define CYGNUM_HAL_INTERRUPT_HZ 30 +#define CYGNUM_HAL_INTERRUPT_ALARM 31 + +// GPIO bits 31..11 can generate interrupts as well, but they all +// end up clumped into interrupt signal #11. Using the symbols +// below allow for detection of these separately. + +#define CYGNUM_HAL_INTERRUPT_GPIO11 (32+11) +#define CYGNUM_HAL_INTERRUPT_GPIO12 (32+12) +#define CYGNUM_HAL_INTERRUPT_GPIO13 (32+13) +#define CYGNUM_HAL_INTERRUPT_GPIO14 (32+14) +#define CYGNUM_HAL_INTERRUPT_GPIO15 (32+15) +#define CYGNUM_HAL_INTERRUPT_GPIO16 (32+16) +#define CYGNUM_HAL_INTERRUPT_GPIO17 (32+17) +#define CYGNUM_HAL_INTERRUPT_GPIO18 (32+18) +#define CYGNUM_HAL_INTERRUPT_GPIO19 (32+19) +#define CYGNUM_HAL_INTERRUPT_GPIO20 (32+20) +#define CYGNUM_HAL_INTERRUPT_GPIO21 (32+21) +#define CYGNUM_HAL_INTERRUPT_GPIO22 (32+22) +#define CYGNUM_HAL_INTERRUPT_GPIO23 (32+23) +#define CYGNUM_HAL_INTERRUPT_GPIO24 (32+24) +#define CYGNUM_HAL_INTERRUPT_GPIO25 (32+25) +#define CYGNUM_HAL_INTERRUPT_GPIO26 (32+26) +#define CYGNUM_HAL_INTERRUPT_GPIO27 (32+27) + +#define CYGNUM_HAL_INTERRUPT_NONE -1 + +#define CYGNUM_HAL_ISR_MIN 0 +#define CYGNUM_HAL_ISR_MAX (27+32) + +#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX+1) + +// The vector used by the Real time clock +#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0 + +#endif // CYGONCE_HAL_PLATFORM_INTS_H diff --git a/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_setup.h b/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_setup.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/hal_platform_setup.h @@ -0,0 +1,363 @@ +#ifndef CYGONCE_HAL_PLATFORM_SETUP_H +#define CYGONCE_HAL_PLATFORM_SETUP_H + +/*============================================================================= +// +// hal_platform_setup.h +// +// Platform specific support for HAL (assembly code) +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: Intel SA1110/Assabet platform specific support routines +// Description: +// Usage: #include +// This file should only be used by "vectors.S" +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include // System-wide configuration info +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include // Platform specific hardware definitions +#include // MMU definitions + +#if defined(CYG_HAL_STARTUP_ROM) +#define PLATFORM_SETUP1 _platform_setup1 +#define CYGHWR_HAL_ARM_HAS_MMU + +#if (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 59000) +#define SA11X0_PLL_CLOCK 0x0 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 73700) +#define SA11X0_PLL_CLOCK 0x1 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 88500) +#define SA11X0_PLL_CLOCK 0x2 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 103200) +#define SA11X0_PLL_CLOCK 0x3 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 118000) +#define SA11X0_PLL_CLOCK 0x4 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 132700) +#define SA11X0_PLL_CLOCK 0x5 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 147500) +#define SA11X0_PLL_CLOCK 0x6 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 162200) +#define SA11X0_PLL_CLOCK 0x7 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 176900) +#define SA11X0_PLL_CLOCK 0x8 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 191700) +#define SA11X0_PLL_CLOCK 0x9 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 206400) +#define SA11X0_PLL_CLOCK 0xA +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 221200) +#define SA11X0_PLL_CLOCK 0xB +#else +#error Invalid processor clock speed +#endif + +// This function is called very early on by the boot ROM (or by any ROM +// based startup). It's job is to initialize the hardware to a known state +// so that eCos applications can execute properly. + +// This version of the code is patterned after the contribution from +// Travis Furer (@MIT) + + +// Define macro used to diddle the LEDs during early initialization. +// Can use r0+r1. Argument in \x. + +#define CYGHWR_LED_MACRO _set_LEDS(\x) + +// Initialize GPIOs +#define GPIO_GRER (SA11X0_GPIO_RISING_EDGE_DETECT-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GFER (SA11X0_GPIO_FALLING_EDGE_DETECT-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GAFR (SA11X0_GPIO_ALTERNATE_FUNCTION-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GEDR (SA11X0_GPIO_EDGE_DETECT_STATUS-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GPDR (SA11X0_GPIO_PIN_DIRECTION-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GPCR (SA11X0_GPIO_PIN_OUTPUT_CLEAR-SA11X0_GPIO_PIN_LEVEL) + .macro _init_GPIO + ldr r1,=SA11X0_GPIO_PIN_LEVEL + mov r0,#0 + str r0,[r1,#GPIO_GRER] // Disable rising edge detects + str r0,[r1,#GPIO_GFER] // Disable falling edge detects + str r0,[r1,#GPIO_GAFR] // No alt. funcs. during init + sub r0,r0,#1 + str r0,[r1,#GPIO_GPCR] // Force all outputs to low + str r0,[r1,#GPIO_GEDR] // Clear edge detect status + ldr r0,=0x00100300 + str r0,[r1,#GPIO_GPDR] // Only LEDs outputs (for now) + .endm + +// Initialize HEX display. +#define MCP_STAT (SA11X0_MCP_STATUS-SA11X0_MCP_CONTROL_0) +#define MCP_CTRL0 (SA11X0_MCP_CONTROL_0-SA11X0_MCP_CONTROL_0) +#define MCP_DATA2 (SA11X0_MCP_DATA_2-SA11X0_MCP_CONTROL_0) + .macro _init_HEX_DISPLAY + ldr r1, =SA11X0_MCP_CONTROL_0 + ldr r2, =0xFFFFFFFF + str r2, [r1, #MCP_STAT] + ldr r2, =0x801F + orr r2, r2, #(3 << 16) + str r2, [r1, #MCP_DATA2] + ldr r2, =0x50000 + str r2, [r1, #MCP_CTRL0] + .endm + +// Display value on hex LED display + .macro _set_LEDS,val + mov r0,#\val + orr r0,r0,#(1<<16) + ldr r1,=SA11X0_MCP_DATA_2 + str r0,[r1] + .endm + +// Setup pin directions: +// inputs: all serial receive pins +// outputs: all LCD pins, all serial transmit pins + .macro _init_PERIPHERAL_PINS + ldr r0,=0x00355FFF + ldr r1,=SA11X0_PPC_PIN_DIRECTION + str r0,[r1] + mov r0,#0 // Force initial state + ldr r1,=SA11X0_PPC_PIN_STATE + str r0,[r1] + ldr r1,=SA11X0_PPC_PIN_ASSIGNMENT // Disable any reassignments + str r0,[r1] + .endm + +// Set core frequency (this can take up to 150us) + .macro _set_CLOCK_FREQUENCY + mov r0,#SA11X0_PLL_CLOCK + ldr r1,=SA11X0_PWR_MGR_PLL_CONFIG + str r0,[r1] + .endm + +// Enable clock switching (must be done after setting core frequency) + .macro _enable_CLOCK_SWITCHING + mcr p15,0,r1,c15,c1,2 + .endm + +// Initialize memory interfaces. (ROM, SRAM, Flash, DRAM, etc) +// +// Note: This code has hardcoded values (taken from the uHAL +// code for brutus provided at the Intel StrongARM +// website) that are specific to the memory devices +// used on the Brutus board. +// +// Brutus memory is as follows: +// ROM 256K (assuming 32 bit accesses) +// Flash 256K (assuming 32 bit accesses) +// SRAM 512K +// DRAM 16M (4M per bank) +// +// From SA11X0 Manual, Section 10.7.1: +// +// The following flow should be followed when coming out of +// reset, whether for sleep or power-up: +// +// - Read boot ROM and write to memory configuration +// registers, but do not enable DRAM banks. +// +// - If necessary, finish any DRAM power-up wait period +// (usually about 100us). +// +// - If coming out of sleep, see Section 9.5, Power +// Manager on page 9-26 on how to release the nCAS and +// nRAS pins from their self-refresh state. +// +// - If coming out of sleep, wait the DRAM-specific +// post-self-refresh precharge period before issuing +// a new DRAM transaction. +// +// - If power-on reset, perform the number of +// initialization refreshes required by the specific +// DRAM part by reading disabled banks. A read from +// any disabled bank will refresh all four banks. +// +// - Enable DRAM banks by setting MDCNFG:DE3:0. +// +// +// FIXME: Values for Brutus SRAM (NOT yet supported) are: +// MDCAS0 = 0xCCCCCCCF +// MDCAS1 = 0xFFFFFFFC +// MDCAS2 = 0xFFFFFFFF +// MDCNFG = 0 //DRAM not enabled +// +// +// Configure Bank 0 (ROM) and Bank 1 (Flash) in MSC0 as +// follows: +// +// Bank 0: +// ROM type = Nonburst ROM or Flash EPROM +// ROM bus width = as specified on ROM_SEL pin (s11) +// ROM delay first access = 17 MCLK cycles +// ROM delay next access = 0 (unused) +// ROM recovery time = 2 MCLK cycles +// +// Bank 1: +// ROM type = Nonburst ROM or SRAM +// ROM bus width = 32 bits +// ROM delay first access = 17 MCLK cycles +// ROM delay next access = 20 MCLK cycles +// ROM recovery time = 1 MCLK cycles +// +// +// Configure Bank 2 (SRAM) and Bank 3 (External Register) +// in MSC1 as follows: +// +// Bank 2: +// ROM type = Nonburst ROM or SRAM +// ROM bus width = 32 bits +// ROM delay first access = 4 MCLK cycles +// ROM delay next access = 2 MCLK cycles +// ROM recovery time = 2 MCLK cycles +// +// Bank 3: +// ROM type = Nonburst ROM or SRAM +// ROM bus width = 32 bits +// ROM delay first access = 5 MCLK cycles +// ROM delay next access = 3 MCLK cycles +// ROM recovery time = 4 MCLK cycles +// +// +// Enable DRAM banks 0-3 and configure for: +// 12 row address bits (brutus has 12x8 DRAMs) +// CAS waveform shifted on DCLK +// RAS precharges for 4 MCLK cycles +// RAS asserts for 6 MCLK cycles during CBR +// Data latched 3 DCLK cycles after CAS +// 0x400 * 4 = 4096 MCLK cycles between refreshes +// +#define MDCFG (SA11X0_DRAM_CONFIGURATION-SA11X0_DRAM_CONFIGURATION) +#define MDCAS0 (SA11X0_DRAM0_CAS_0-SA11X0_DRAM_CONFIGURATION) +#define MDCAS1 (SA11X0_DRAM0_CAS_1-SA11X0_DRAM_CONFIGURATION) +#define MDCAS2 (SA11X0_DRAM0_CAS_2-SA11X0_DRAM_CONFIGURATION) +#define MSCTL0 (SA11X0_STATIC_CONTROL_0-SA11X0_DRAM_CONFIGURATION) +#define MSCTL1 (SA11X0_STATIC_CONTROL_1-SA11X0_DRAM_CONFIGURATION) + .macro _init_MEM_INTERFACES + /* Do nothing if DRAM already configured */ + ldr r1,=SA11X0_DRAM_CONFIGURATION + ldr r1,[r1] + ands r1,r1,#0xF + bne 2003f + /* Configure Memory */ + /* Configure Waveform Registers */ + ldr r1,=SA11X0_DRAM_CONFIGURATION + ldr r0,=0x83C1E01F + str r0,[r1,#MDCAS0] + ldr r0,=0x3C1E0F07 + str r0,[r1,#MDCAS1] + ldr r0,=0xFFFFF078 + str r0,[r1,#MDCAS2] + /* Configure Static Memory Regs */ + /* FIXME: I think this is right? See note on page 10-11. */ + /* Value from uHAL was actually 13812080 */ + ldr r0,=0x13802080 + ldr r2,[r1,#MSCTL0] + and r2,r2,#4 /* Extract the ROM_SEL (s11) value */ + orr r0,r0,r2 /* Merge in the ROM_SEL value */ + str r0,[r1,#MSCTL0] + /* FIXME: I think this is right? See note on page 10-11. */ + /* Value from uHAL was actually 42210119 */ + ldr r0,=0x42200118 + str r0,[r1,#MSCTL1] + /* FIXME: According to the SA11X0 Manual, we need to force */ + /* a certain number of refreshes here by doing reads */ + /* to the disabled banks. However, the uHAL code */ + /* doesn't seem to do this, so we skip it here too */ + /* for now. */ + /* Configure DRAM Registers */ + ldr r0,=0x0801A9BF + str r0,[r1,#MDCFG] + /* Wait for DRAM to be ready for use (as in uHAL code) */ + /* FIXME: why do we need to do this? */ + mov r0,#0x200 +2002: subs r0,r0,#1 + bne 2002b +2003: + .endm + + .macro _platform_setup1 + nop + nop + nop + nop + nop + nop + nop + nop + nop + + _init_GPIO + _init_HEX_DISPLAY /* this is flaky sometimes */ + _init_HEX_DISPLAY /* so do it twice just in case */ + _set_LEDS(15) + + _init_PERIPHERAL_PINS + _set_LEDS(13) + + _set_CLOCK_FREQUENCY + _enable_CLOCK_SWITCHING + _set_LEDS(12) + + _init_MEM_INTERFACES + _set_LEDS(11) + + // Set up a stack [for calling C code] + ldr r1,=__startup_stack + ldr r2,=SA11X0_RAM_BANK0_BASE + orr sp,r1,r2 + + // Create MMU tables + bl hal_mmu_init + + _set_LEDS(9) + // Enable MMU + ldr r2,=10f + ldr r1,=MMU_Control_Init|MMU_Control_M + mcr MMU_CP,0,r1,MMU_Control,c0 + mov pc,r2 /* Change address spaces */ + nop + nop + nop +10: + _set_LEDS(8) + + .endm + +#else // STARTUP_ROM +#define PLATFORM_SETUP1 +#endif + +/*---------------------------------------------------------------------------*/ +/* end of hal_platform_setup.h */ +#endif /* CYGONCE_HAL_PLATFORM_SETUP_H */ diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.h b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.h @@ -0,0 +1,13 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0xBFFFFF) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +extern char CYG_LABEL_NAME (_reserved) []; +#define CYGMEM_SECTION_reserved (CYG_LABEL_NAME (_reserved)) +#define CYGMEM_SECTION_reserved_SIZE (0x10000) diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.ldi b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.ldi @@ -0,0 +1,24 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0xBFFFFF +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_rom_vectors (ram, 0x10000, LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.mlt b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_ram.mlt @@ -0,0 +1,12 @@ +version 0 +region ram 0 BFFFFF 0 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section rom_vectors 0 1 0 1 1 1 1 1 10000 10000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 1 0 1 data data ! +section data 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 4 0 1 0 0 0 0 ! diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.h b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.h @@ -0,0 +1,16 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0xBFFFFF) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0x40000000) +#define CYGMEM_REGION_rom_SIZE (0x40000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +extern char CYG_LABEL_NAME (_reserved) []; +#define CYGMEM_SECTION_reserved (CYG_LABEL_NAME (_reserved)) +#define CYGMEM_SECTION_reserved_SIZE (0x8000) diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.ldi b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.ldi @@ -0,0 +1,25 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +MEMORY +{ + ram : ORIGIN = 0, LENGTH = 0xBFFFFF + rom : ORIGIN = 0x40000000, LENGTH = 0x40000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_rom_vectors (rom, 0x40000000, LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_data (ram, 0x8000, FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.mlt b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/include/pkgconf/mlt_arm_sa11x0_brutus_rom.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 0 BFFFFF 0 ! +region rom 40000000 40000 1 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section data 0 1 1 1 1 1 0 0 8000 bss ! +section bss 0 4 0 1 0 0 0 0 ! +section rom_vectors 0 1 0 1 1 1 1 1 40000000 40000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 0 0 1 data ! diff --git a/packages/hal/arm/sa11x0/brutus/current/src/brutus_misc.c b/packages/hal/arm/sa11x0/brutus/current/src/brutus_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/src/brutus_misc.c @@ -0,0 +1,227 @@ +//========================================================================== +// +// brutus_misc.c +// +// HAL misc board support code for StrongARM SA1110/Brutus +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: hmt +// Travis C. Furrer +// Date: 2000-05-21 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#include // base types +#include // tracing macros +#include // assertion macros + +#include // IO macros +#include // Register state info +#include +#include // Interrupt names +#include +#include // Hardware definitions +#include // Platform specifics + +#include // diag_printf + +// ------------------------------------------------------------------------- +// MMU initialization: +// +// These structures are laid down in memory to define the translation +// table. +// + +/* + * SA-1100 Translation Table Base Bit Masks */ +#define ARM_TRANSLATION_TABLE_MASK 0xFFFFC000 + +/* + * SA-1100 Domain Access Control Bit Masks + */ +#define ARM_ACCESS_TYPE_NO_ACCESS(domain_num) (0x0 << (domain_num)*2) +#define ARM_ACCESS_TYPE_CLIENT(domain_num) (0x1 << (domain_num)*2) +#define ARM_ACCESS_TYPE_MANAGER(domain_num) (0x3 << (domain_num)*2) + +struct ARM_MMU_FIRST_LEVEL_FAULT { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_FAULT_ID 0x0 + +struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE { + int id : 2; + int imp : 2; + int domain : 4; + int sbz : 1; + int base_address : 23; +}; +#define ARM_MMU_FIRST_LEVEL_PAGE_TABLE_ID 0x1 + +struct ARM_MMU_FIRST_LEVEL_SECTION { + int id : 2; + int b : 1; + int c : 1; + int imp : 1; + int domain : 4; + int sbz0 : 1; + int ap : 2; + int sbz1 : 8; + int base_address : 12; +}; +#define ARM_MMU_FIRST_LEVEL_SECTION_ID 0x2 + +struct ARM_MMU_FIRST_LEVEL_RESERVED { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_RESERVED_ID 0x3 + +#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \ + (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2)) + +#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE 0x4000 + +#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base, \ + cacheable, bufferable, perm) \ + CYG_MACRO_START \ + register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc; \ + \ + desc.word = 0; \ + desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID; \ + desc.section.domain = 0; \ + desc.section.c = (cacheable); \ + desc.section.b = (bufferable); \ + desc.section.ap = (perm); \ + desc.section.base_address = (actual_base); \ + *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) \ + = desc.word; \ + CYG_MACRO_END + +#define X_ARM_MMU_SECTION(abase,vbase,size,cache,buff,access) \ + { int i; int j = abase; int k = vbase; \ + for (i = size; i > 0 ; i--,j++,k++) \ + { \ + ARM_MMU_SECTION(ttb_base, j, k, cache, buff, access); \ + } \ + } + +union ARM_MMU_FIRST_LEVEL_DESCRIPTOR { + unsigned long word; + struct ARM_MMU_FIRST_LEVEL_FAULT fault; + struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE page_table; + struct ARM_MMU_FIRST_LEVEL_SECTION section; + struct ARM_MMU_FIRST_LEVEL_RESERVED reserved; +}; + +#define ARM_UNCACHEABLE 0 +#define ARM_CACHEABLE 1 +#define ARM_UNBUFFERABLE 0 +#define ARM_BUFFERABLE 1 + +#define ARM_ACCESS_PERM_NONE_NONE 0 +#define ARM_ACCESS_PERM_RO_NONE 0 +#define ARM_ACCESS_PERM_RO_RO 0 +#define ARM_ACCESS_PERM_RW_NONE 1 +#define ARM_ACCESS_PERM_RW_RO 2 +#define ARM_ACCESS_PERM_RW_RW 3 + +void +hal_mmu_init(void) +{ + unsigned long ttb_base = SA11X0_RAM_BANK0_BASE + 0x4000; + unsigned long i; + + /* + * Set the TTB register + */ + asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/); + + /* + * Set the Domain Access Control Register + */ + i = ARM_ACCESS_TYPE_MANAGER(0) | + ARM_ACCESS_TYPE_NO_ACCESS(1) | + ARM_ACCESS_TYPE_NO_ACCESS(2) | + ARM_ACCESS_TYPE_NO_ACCESS(3) | + ARM_ACCESS_TYPE_NO_ACCESS(4) | + ARM_ACCESS_TYPE_NO_ACCESS(5) | + ARM_ACCESS_TYPE_NO_ACCESS(6) | + ARM_ACCESS_TYPE_NO_ACCESS(7) | + ARM_ACCESS_TYPE_NO_ACCESS(8) | + ARM_ACCESS_TYPE_NO_ACCESS(9) | + ARM_ACCESS_TYPE_NO_ACCESS(10) | + ARM_ACCESS_TYPE_NO_ACCESS(11) | + ARM_ACCESS_TYPE_NO_ACCESS(12) | + ARM_ACCESS_TYPE_NO_ACCESS(13) | + ARM_ACCESS_TYPE_NO_ACCESS(14) | + ARM_ACCESS_TYPE_NO_ACCESS(15); + asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/); + + /* + * First clear all TT entries - ie Set them to Faulting + */ + memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE); + + /* Actual Virtual Size Attributes Function */ + /* Base Base MB cached? buffered? access permissions */ + /* xxx00000 xxx00000 */ + X_ARM_MMU_SECTION(0x000, 0x400, 1, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Boot flash ROMspace */ + X_ARM_MMU_SECTION(0x080, 0x080, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Application flash ROM */ + X_ARM_MMU_SECTION(0x100, 0x100, 1, ARM_CACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Static RAM - 512K */ + X_ARM_MMU_SECTION(0x180, 0x180, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Static select 3 */ + X_ARM_MMU_SECTION(0x200, 0x200, 256, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* PCMCIA Socket 0 */ + X_ARM_MMU_SECTION(0x300, 0x300, 256, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* PCMCIA Sockets 1 */ + X_ARM_MMU_SECTION(0x800, 0x800, 0x400, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* StrongARM(R) Registers */ + X_ARM_MMU_SECTION(0xC00, 0x000, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ + X_ARM_MMU_SECTION(0xC80, 0x004, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ + X_ARM_MMU_SECTION(0xD00, 0x008, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 2 */ + X_ARM_MMU_SECTION(0xD80, 0x00C, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 3 */ + X_ARM_MMU_SECTION(0xC00, 0xC00, 256, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Banks - raw access */ + X_ARM_MMU_SECTION(0xE00, 0xE00, 128, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Zeros (Cache Clean) Bank */ + +} + +// +// Platform specific initialization +// + +void +plf_hardware_init(void) +{ +} diff --git a/packages/hal/arm/sa11x0/var/current/ChangeLog b/packages/hal/arm/sa11x0/var/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/ChangeLog @@ -0,0 +1,113 @@ +2000-06-30 Jesper Skov + + * src/hal_diag.c: calling i/f macro changes. + +2000-06-28 Jesper Skov + + * cdl/hal_arm_sa11x0.cdl: + * include/plf_stub.h: + * src/plf_stub.c: [deleted] + Stub uses vector table for all IO. + + * src/sa11x0_misc.c: Fix compiler warning. + +2000-06-27 Jesper Skov + + * src/hal_diag.c: Some fixes and code layout changes (Gary + Thomas). + + * src/hal_diag.c: + * include/hal_diag.h: + * include/hal_sa11x0.h: + Changed to initialize all procs tables. Added timeout getc, and + proper debug channel switch behavior. + +2000-06-24 Gary Thomas + + * src/sa11x0_misc.c (hal_clock_reset): Add code to compensate for + clock drift since this hardware does not reset on interrupts. + (hal_clock_read): Also adjust the value returned here for same reason. + +2000-06-22 Gary Thomas + + * src/hal_diag.c (hal_diag_write_char): + Fix typo: CYGINT_HAL_GDB_PORT_VECTOR to be CYGHWR_HAL_GDB_PORT_VECTOR + +2000-06-19 Gary Thomas + + * include/hal_diag.h: + * include/plf_stub.h: + * src/hal_diag.c: + * src/sa11x0_misc.c: Update for virtual vector (debug) support. + +2000-06-12 Gary Thomas + + * src/hal_diag.c: Fix baud rates for 960,19200. Take out "announce" + string in ROM mode. + +2000-06-05 Gary Thomas + + * src/plf_stub.c: + * include/plf_stub.h: 'sa1100' shared items renamed to 'sa11x0'. + + * src/sa11x0_misc.c (hal_IRQ_handler): + (hal_interrupt_mask): + (hal_interrupt_unmask): + (hal_interrupt_acknowledge): + (hal_interrupt_configure): Complete support for GPIO interrupts. + Some of these are direct, others are grouped and the code needs + to handle both. Also update support for GPIO edge detect interrupt + circuitry. + +2000-06-04 Gary Thomas + + * include/hal_cache.h: + * src/hal_diag.c: + * src/sa11x0_misc.c: Renaming of 'sa1100' shared stuff to be + 'sa11x0'. + + * include/hal_sa11x0.h: Renamed from 'hal_sa1100.h'. + +2000-06-01 Gary Thomas + + * src/sa11x0_misc.c: Enable caches. + + * include/hal_sa1100.h: Misc cleanups and additions necessary for + ROM startup mode. + +2000-05-10 Gary Thomas + + * current/src/plf_stub.c: + * current/src/hal_diag.c: + * current/src/sa11x0_misc.c: + * current/include/hal_diag.h: + * current/include/hal_sa1100.h: + * current/include/hal_cache.h: + * current/include/plf_stub.h: + * current/cdl/hal_arm_sa11x0.cdl: New file(s). + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/arm/sa11x0/var/current/cdl/hal_arm_sa11x0.cdl b/packages/hal/arm/sa11x0/var/current/cdl/hal_arm_sa11x0.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/cdl/hal_arm_sa11x0.cdl @@ -0,0 +1,93 @@ +# ==================================================================== +# +# hal_arm_sa11x0.cdl +# +# ARM SA11x0 architectural HAL package configuration data +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Original data: gthomas +# Contributors: +# Date: 2000-05-08 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== +cdl_package CYGPKG_HAL_ARM_SA11X0 { + display "ARM SA11X0 architecture" + parent CYGPKG_HAL_ARM + hardware + include_dir cyg/hal + define_header hal_arm_sa11x0.h + description " + This HAL variant package provides generic + support for the Intel StrongARM SA11x0 processors. It is also + necessary to select a specific target platform HAL + package." + + + compile hal_diag.c sa11x0_misc.c + + cdl_option CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK { + display "Processor clock rate" + flavor data + legal_values 59000 73700 88500 103200 118000 132700 147500 162200 176900 191700 206400 221200 + default_value 221200 + description " + The SA-1100 processor can run at various frequencies. + These values are expressed in KHz. Note that there are + several steppings of the SA-1100 rated to run at different + maximum frequencies. Check the specs to make sure that your + particular processor can run at the rate you select here." + } + + # Real-time clock/counter specifics + cdl_component CYGNUM_HAL_RTC_CONSTANTS { + display "Real-time clock constants" + flavor none + no_define + + cdl_option CYGNUM_HAL_RTC_NUMERATOR { + display "Real-time clock numerator" + flavor data + calculated 1000000000 + } + cdl_option CYGNUM_HAL_RTC_DENOMINATOR { + display "Real-time clock denominator" + flavor data + calculated 100 + } + cdl_option CYGNUM_HAL_RTC_PERIOD { + display "Real-time clock period" + flavor data + calculated 36864 ;# Clock for OS Timer is 3.6864MHz + } + } + +} diff --git a/packages/hal/arm/sa11x0/var/current/include/hal_cache.h b/packages/hal/arm/sa11x0/var/current/include/hal_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/include/hal_cache.h @@ -0,0 +1,355 @@ +#ifndef CYGONCE_HAL_CACHE_H +#define CYGONCE_HAL_CACHE_H + +//============================================================================= +// +// hal_cache.h +// +// HAL cache control API +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors:hmt +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include +#include + +//----------------------------------------------------------------------------- +// Cache dimensions + +#define HAL_ICACHE_SIZE SA11X0_ICACHE_SIZE +#define HAL_ICACHE_LINE_SIZE SA11X0_ICACHE_LINESIZE_BYTES +#define HAL_ICACHE_WAYS SA11X0_ICACHE_WAYS +#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) + +#define HAL_DCACHE_SIZE SA11X0_DCACHE_SIZE +#define HAL_DCACHE_LINE_SIZE SA11X0_DCACHE_LINESIZE_BYTES +#define HAL_DCACHE_WAYS SA11X0_DCACHE_WAYS +#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) + +// FIXME: much of the code below should make better use of +// the definitions from hal_mmu.h + +//----------------------------------------------------------------------------- +// Global control of Instruction cache + +// Enable the instruction cache +#define HAL_ICACHE_ENABLE() \ +CYG_MACRO_START \ + asm volatile ( \ + "mrc p15,0,r1,c1,c0,0;" \ + "orr r1,r1,#0x1000;" \ + "orr r1,r1,#0x0003;" /* enable ICache (also ensures */ \ + /* that MMU and alignment faults */ \ + /* are enabled) */ \ + "mcr p15,0,r1,c1,c0,0" \ + : \ + : \ + : "r1" /* Clobber list */ \ + ); \ +CYG_MACRO_END + +// Disable the instruction cache (and invalidate it, required semanitcs) +#define HAL_ICACHE_DISABLE() \ +CYG_MACRO_START \ + asm volatile ( \ + "mrc p15,0,r1,c1,c0,0;" \ + "bic r1,r1,#0x1000;" /* disable ICache (but not MMU, etc) */ \ + "mcr p15,0,r1,c1,c0,0;" \ + "mcr p15,0,r1,c7,c5,0;" /* flush ICache */ \ + "nop;" /* next few instructions may be via cache */ \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop" \ + : \ + : \ + : "r1" /* Clobber list */ \ + ); \ +CYG_MACRO_END + +// Query the state of the instruction cache +#define HAL_ICACHE_IS_ENABLED(_state_) \ +CYG_MACRO_START \ + register cyg_uint32 reg; \ + asm volatile ("mrc p15,0,%0,c1,c0,0" \ + : "=r"(reg) \ + : \ + ); \ + (_state_) = (0 != (0x1000 & reg)); /* Bit 12 is ICache enable */ \ +CYG_MACRO_END + +// Invalidate the entire cache +#define HAL_ICACHE_INVALIDATE_ALL() \ +CYG_MACRO_START \ + /* this macro can discard dirty cache lines (N/A for ICache) */ \ + asm volatile ( \ + "mcr p15,0,r1,c7,c5,0;" /* flush ICache */ \ + "mcr p15,0,r1,c8,c5,0;" /* flush ITLB only */ \ + "nop;" /* next few instructions may be via cache */ \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop;" \ + : \ + : \ + ); \ +CYG_MACRO_END + +// Synchronize the contents of the cache with memory. +// (which includes flushing out pending writes) +#define HAL_ICACHE_SYNC() \ +CYG_MACRO_START \ + HAL_DCACHE_SYNC(); /* ensure data gets to RAM */ \ + HAL_ICACHE_INVALIDATE_ALL(); /* forget all we know */ \ +CYG_MACRO_END + +// Set the instruction cache refill burst size +//#define HAL_ICACHE_BURST_SIZE(_size_) +// This feature is not available on the SA11X0. + +// Load the contents of the given address range into the instruction cache +// and then lock the cache so that it stays there. +//#define HAL_ICACHE_LOCK(_base_, _size_) +// This feature is not available on the SA11X0. + +// Undo a previous lock operation +//#define HAL_ICACHE_UNLOCK(_base_, _size_) +// This feature is not available on the SA11X0. + +// Unlock entire cache +//#define HAL_ICACHE_UNLOCK_ALL() +// This feature is not available on the SA11X0. + +//----------------------------------------------------------------------------- +// Instruction cache line control + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) +// This feature is not available on the SA11X0. + +//----------------------------------------------------------------------------- +// Global control of data cache + +// Enable the data cache +#define HAL_DCACHE_ENABLE() \ +CYG_MACRO_START \ + asm volatile ( \ + "mrc p15,0,r1,c1,c0,0;" \ + "orr r1,r1,#0x000F;" /* enable DCache (also ensures */ \ + /* the MMU, alignment faults, and */ \ + /* write buffer are enabled) */ \ + "mcr p15,0,r1,c1,c0,0" \ + : \ + : \ + : "r1" /* Clobber list */ \ + ); \ +CYG_MACRO_END + +// Disable the data cache (and invalidate it, required semanitcs) +#define HAL_DCACHE_DISABLE() \ +CYG_MACRO_START \ + asm volatile ( \ + "mrc p15,0,r1,c1,c0,0;" \ + "bic r1,r1,#0x000C;" /* disable DCache AND write buffer */ \ + /* but not MMU and alignment faults */ \ + "mcr p15,0,r1,c1,c0,0;" \ + "mcr p15,0,r1,c7,c6,0" /* clear data cache */ \ + : \ + : \ + : "r1" /* Clobber list */ \ + ); \ +CYG_MACRO_END + +// Query the state of the data cache +#define HAL_DCACHE_IS_ENABLED(_state_) \ +CYG_MACRO_START \ + register int reg; \ + asm volatile ("mrc p15,0,%0,c1,c0,0;" \ + : "=r"(reg) \ + : \ + ); \ + (_state_) = (0 != (4 & reg)); /* Bit 2 is DCache enable */ \ +CYG_MACRO_END + +// Flush the entire dcache (and then both TLBs, just in case) +#define HAL_DCACHE_INVALIDATE_ALL() \ +CYG_MACRO_START \ + /* this macro can discard dirty cache lines. */ \ + asm volatile ("mcr p15,0,r1,c7,c6,0;" \ + "mcr p15,0,r1,c8,c7,0;" \ + : : ); \ +CYG_MACRO_END + + +// Synchronize the contents of the cache with memory. +#define HAL_DCACHE_SYNC() \ +CYG_MACRO_START \ + /* This is slightly naff in that the only way to force a dirty */ \ + /* line out is by loading other data into its slot, so */ \ + /* invalidating that slot. */ \ + asm volatile ( \ + "mov r0, #0xE0000000;" /* SA11X0 zeros bank (128Mb) */ \ + "add r1, r0, #0x2000;" /* We read 8kB of it */ \ + "667: " \ + "ldr r2, [r0], #32;" \ + "teq r1, r0;" \ + "bne 667b;" \ + "mcr p15,0,r0,c7,c6,0;" /* flush DCache */ \ + "mcr p15,0,r0,c7,c10,4;" /* and drain the write buffer */ \ + "nop;" /* wait for the writebacks to occur... */ \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop;" \ + "nop;" \ + : \ + : \ + : "r0","r1","r2" /* Clobber list */ \ + ); \ +CYG_MACRO_END + +// Set the data cache refill burst size +//#define HAL_DCACHE_BURST_SIZE(_size_) +// This feature is not available on the SA11X0. + +// Set the data cache write mode +//#define HAL_DCACHE_WRITE_MODE( _mode_ ) +// This feature is not available on the SA11X0. + +#define HAL_DCACHE_WRITETHRU_MODE 0 +#define HAL_DCACHE_WRITEBACK_MODE 1 + +// Get the current writeback mode - or only writeback mode if fixed +#define HAL_DCACHE_QUERY_WRITE_MODE( _mode_ ) CYG_MACRO_START \ + _mode_ = HAL_DCACHE_WRITEBACK_MODE; \ +CYG_MACRO_END + +// Load the contents of the given address range into the data cache +// and then lock the cache so that it stays there. +//#define HAL_DCACHE_LOCK(_base_, _size_) +// This feature is not available on the SA11X0. + +// Undo a previous lock operation +//#define HAL_DCACHE_UNLOCK(_base_, _size_) +// This feature is not available on the SA11X0. + +// Unlock entire cache +//#define HAL_DCACHE_UNLOCK_ALL() +// This feature is not available on the SA11X0. + +//----------------------------------------------------------------------------- +// Data cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) +// This feature is not available on the SA11X0. + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +// ---- this seems not to work despite the documentation --- +//#define HAL_DCACHE_FLUSH( _base_ , _size_ ) +//CYG_MACRO_START +// HAL_DCACHE_STORE( _base_ , _size_ ); +// HAL_DCACHE_INVALIDATE( _base_ , _size_ ); +//CYG_MACRO_END + +// Invalidate cache lines in the given range without writing to memory. +// ---- this seems not to work despite the documentation --- +//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) +//CYG_MACRO_START +// register int addr, enda; +// for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_), +// enda = (int)(_base_) + (_size_); +// addr < enda ; +// addr += HAL_DCACHE_LINE_SIZE ) +// { +// asm volatile ( +// "mcr p15,0,%0,c7,c6,1;" /* flush entry away */ +// : +// : "r"(addr) +// : "memory" +// ); +// } +//CYG_MACRO_END + +// Write dirty cache lines to memory for the given address range. +// ---- this seems not to work despite the documentation --- +//#define HAL_DCACHE_STORE( _base_ , _size_ ) +//CYG_MACRO_START +// register int addr, enda; +// for ( addr = (~(HAL_DCACHE_LINE_SIZE - 1)) & (int)(_base_), +// enda = (int)(_base_) + (_size_); +// addr < enda ; +// addr += HAL_DCACHE_LINE_SIZE ) +// { +// asm volatile ("mcr p15,0,%0,c7,c10,1;" /* push entry to RAM */ +// : +// : "r"(addr) +// : "memory" +// ); +// } +//CYG_MACRO_END + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) +// This feature is available on the SA11X0, but due to tricky +// coherency issues with the read buffer (see SA11X0 developer's +// manual page 6-7) we don't bother to implement it here. + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) +// This feature is not available on the SA11X0. + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_DCACHE_ZERO( _base_ , _size_ ) +// This feature is not available on the SA11X0. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_CACHE_H +// End of hal_cache.h diff --git a/packages/hal/arm/sa11x0/var/current/include/hal_diag.h b/packages/hal/arm/sa11x0/var/current/include/hal_diag.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/include/hal_diag.h @@ -0,0 +1,80 @@ +#ifndef CYGONCE_HAL_DIAG_H +#define CYGONCE_HAL_DIAG_H + +/*============================================================================= +// +// hal_diag.h +// +// HAL Support for Kernel Diagnostic Routines +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg, gthomas +// Contributors: nickg, gthomas +// Date: 1998-09-11 +// Purpose: HAL Support for Kernel Diagnostic Routines +// Description: Diagnostic routines for use during kernel development. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include + +#include +#include + +/*---------------------------------------------------------------------------*/ + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include + +#define HAL_DIAG_INIT() hal_if_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) + +#else + +/*---------------------------------------------------------------------------*/ +/* functions implemented in hal_diag.c */ + +externC void hal_diag_init(void); +externC void hal_diag_write_char(char c); +externC void hal_diag_read_char(char *c); + +#define HAL_DIAG_INIT() hal_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_diag_read_char(&_c_) + +#endif + +/*---------------------------------------------------------------------------*/ +/* end of hal_diag.h */ +#endif /* CYGONCE_HAL_DIAG_H */ diff --git a/packages/hal/arm/sa11x0/var/current/include/hal_sa11x0.h b/packages/hal/arm/sa11x0/var/current/include/hal_sa11x0.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/include/hal_sa11x0.h @@ -0,0 +1,705 @@ +//========================================================================== +// +// hal_sa11x0.h +// +// HAL misc board support definitions for StrongARM SA11x0 +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-04-04 +// Purpose: Platform register definitions +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#ifndef __HAL_SA11X0_H__ +#define __HAL_SA11X0_H__ 1 + +#ifdef __ASSEMBLER__ + +#define REG8_VAL(a) (a) +#define REG16_VAL(a) (a) +#define REG32_VAL(a) (a) + +#define REG8_PTR(a) (a) +#define REG16_PTR(a) (a) +#define REG32_PTR(a) (a) + +#else /* __ASSEMBLER__ */ + +#define REG8_VAL(a) ((unsigned char)(a)) +#define REG16_VAL(a) ((unsigned short)(a)) +#define REG32_VAL(a) ((unsigned int)(a)) + +#define REG8_PTR(a) ((volatile unsigned char *)(a)) +#define REG16_PTR(a) ((volatile unsigned long *)(a)) +#define REG32_PTR(a) ((volatile unsigned long *)(a)) + +#endif /* __ASSEMBLER__ */ + +/* + * SA11X0 Default Memory Layout Definitions + */ +#define SA11X0_ROM_BANK0_BASE (0) +#define SA11X0_ROM_BANK1_BASE (SA11X0_ROM_BANK0_BASE + SZ_128M) +#define SA11X0_ROM_BANK2_BASE (SA11X0_ROM_BANK1_BASE + SZ_128M) +#define SA11X0_ROM_BANK3_BASE (SA11X0_ROM_BANK2_BASE + SZ_128M) + +#define SA11X0_RAM_BANK0_BASE (0xC0000000) +#define SA11X0_RAM_BANK1_BASE (SA11X0_RAM_BANK0_BASE + SZ_128M) +#define SA11X0_RAM_BANK2_BASE (SA11X0_RAM_BANK1_BASE + SZ_128M) +#define SA11X0_RAM_BANK3_BASE (SA11X0_RAM_BANK2_BASE + SZ_128M) + +#define SA11X0_ZEROS_BANK_BASE (SA11X0_RAM_BANK3_BASE + SZ_128M) + +/* + * SA11X0 Register Definitions + */ +#define SA11X0_REGISTER_BASE 0x80000000 +#define SA11X0_REGISTER(x) REG32_PTR(SA11X0_REGISTER_BASE + (x)) + +/* + * SA-1100 Cache and MMU Definitions + */ +#define SA11X0_ICACHE_SIZE 0x4000 // 16K +#define SA11X0_DCACHE_SIZE 0x2000 // 8K +#define SA11X0_ICACHE_LINESIZE_BYTES 32 +#define SA11X0_DCACHE_LINESIZE_BYTES 32 +#define SA11X0_ICACHE_LINESIZE_WORDS 8 +#define SA11X0_DCACHE_LINESIZE_WORDS 8 +#define SA11X0_ICACHE_WAYS 32 +#define SA11X0_DCACHE_WAYS 32 +#define SA11X0_ICACHE_LINE_BASE(p) REG32_PTR((unsigned long)(p) & \ + ~(SA11X0_ICACHE_LINESIZE_BYTES - 1)) +#define SA11X0_DCACHE_LINE_BASE(p) REG32_PTR((unsigned long)(p) & \ + ~(SA11X0_DCACHE_LINESIZE_BYTES - 1)) + +/* + * SA-1100 Coprocessor 15 Extensions Register Definitions + */ +#ifdef __ASSEMBLER__ +# define SA11X0_READ_PROCESS_ID_REGISTER c13 +# define SA11X0_WRITE_PROCESS_ID_REGISTER c13 +# define SA11X0_READ_BREAKPOINT_REGISTER c14 +# define SA11X0_WRITE_BREAKPOINT_REGISTER c14 +# define SA11X0_TEST_CLOCK_AND_IDLE_REGISTER c15 +#else /* __ASSEMBLER__ */ +# define SA11X0_READ_PROCESS_ID_REGISTER "c13" +# define SA11X0_WRITE_PROCESS_ID_REGISTER "c13" +# define SA11X0_READ_BREAKPOINT_REGISTER "c14" +# define SA11X0_WRITE_BREAKPOINT_REGISTER "c14" +# define SA11X0_TEST_CLOCK_AND_IDLE_REGISTER "c15" +#endif /* __ASSEMBLER__ */ + +/* + * SA-1100 Process ID Virtual Address Mapping Definitions + */ +#ifdef __ASSEMBLER__ +# define SA11X0_ACCESS_PROC_ID_REGISTER_OPCODE 0x0 +# define SA11X0_ACCESS_PROC_ID_REGISTER_RM c0 +#else /* __ASSEMBLER__ */ +# define SA11X0_ACCESS_PROC_ID_REGISTER_OPCODE "0x0" +# define SA11X0_ACCESS_PROC_ID_REGISTER_RM "c0" +#endif /* __ASSEMBLER__ */ + +#define SA11X0_PROCESS_ID_PID_MASK 0x7E000000 + +/* + * SA-1100 Debug Support Definitions + */ +#ifdef __ASSEMBLER__ +# define SA11X0_ACCESS_DBAR_OPCODE 0x0 +# define SA11X0_ACCESS_DBAR_RM c0 +# define SA11X0_ACCESS_DBVR_OPCODE 0x0 +# define SA11X0_ACCESS_DBVR_RM c1 +# define SA11X0_ACCESS_DBMR_OPCODE 0x0 +# define SA11X0_ACCESS_DBMR_RM c2 +# define SA11X0_LOAD_DBCR_OPCODE 0x0 +# define SA11X0_LOAD_DBCR_RM c3 +#else /* __ASSEMBLER__ */ +# define SA11X0_ACCESS_DBAR_OPCODE "0x0" +# define SA11X0_ACCESS_DBAR_RM "c0" +# define SA11X0_ACCESS_DBVR_OPCODE "0x0" +# define SA11X0_ACCESS_DBVR_RM "c1" +# define SA11X0_ACCESS_DBMR_OPCODE "0x0" +# define SA11X0_ACCESS_DBMR_RM "c2" +# define SA11X0_LOAD_DBCR_OPCODE "0x0" +# define SA11X0_LOAD_DBCR_RM "c3" +#endif /* __ASSEMBLER__ */ + +#define SA11X0_DBCR_LOAD_WATCH_DISABLED 0x00000000 +#define SA11X0_DBCR_LOAD_WATCH_ENABLED 0x00000001 +#define SA11X0_DBCR_LOAD_WATCH_MASK 0x00000001 +#define SA11X0_DBCR_STORE_ADDRESS_WATCH_DISABLED 0x00000000 +#define SA11X0_DBCR_STORE_ADDRESS_WATCH_ENABLED 0x00000002 +#define SA11X0_DBCR_STORE_ADDRESS_WATCH_MASK 0x00000002 +#define SA11X0_DBCR_STORE_DATA_WATCH_DISABLED 0x00000000 +#define SA11X0_DBCR_STORE_DATA_WATCH_ENABLED 0x00000004 +#define SA11X0_DBCR_STORE_DATA_WATCH_MASK 0x00000004 + +#define SA11X0_IBCR_INSTRUCTION_ADDRESS_MASK 0xFFFFFFFC +#define SA11X0_IBCR_BREAKPOINT_DISABLED 0x00000000 +#define SA11X0_IBCR_BREAKPOINT_ENABLED 0x00000001 +#define SA11X0_IBCR_BREAKPOINT_ENABLE_MASK 0x00000001 + +/* + * SA-1100 Test, Clock and Idle Control Definition + */ +#ifdef __ASSEMBLER__ +# define SA11X0_ICACHE_ODD_WORD_LOADING_OPCODE 0x1 +# define SA11X0_ICACHE_ODD_WORD_LOADING_RM c1 +# define SA11X0_ICACHE_EVEN_WORD_LOADING_OPCODE 0x1 +# define SA11X0_ICACHE_EVEN_WORD_LOADING_RM c2 +# define SA11X0_ICACHE_CLEAR_LFSR_OPCODE 0x1 +# define SA11X0_ICACHE_CLEAR_LFSR_RM c4 +# define SA11X0_MOVE_LFSR_TO_R14_ABORT_OPCODE 0x1 +# define SA11X0_MOVE_LFSR_TO_R14_ABORT_RM c8 +# define SA11X0_ENABLE_CLOCK_SWITCHING_OPCODE 0x2 +# define SA11X0_ENABLE_CLOCK_SWITCHING_RM c1 +# define SA11X0_DISABLE_CLOCK_SWITCHING_OPCODE 0x2 +# define SA11X0_DISABLE_CLOCK_SWITCHING_RM c2 +# define SA11X0_WAIT_FOR_INTERRUPT_OPCODE 0x2 +# define SA11X0_WAIT_FOR_INTERRUPT_RM c8 +#else /* __ASSEMBLER__ */ +# define SA11X0_ICACHE_ODD_WORD_LOADING_OPCODE "0x1" +# define SA11X0_ICACHE_ODD_WORD_LOADING_RM "c1" +# define SA11X0_ICACHE_EVEN_WORD_LOADING_OPCODE "0x1" +# define SA11X0_ICACHE_EVEN_WORD_LOADING_RM "c2" +# define SA11X0_ICACHE_CLEAR_LFSR_OPCODE "0x1" +# define SA11X0_ICACHE_CLEAR_LFSR_RM "c4" +# define SA11X0_MOVE_LFSR_TO_R14_ABORT_OPCODE "0x1" +# define SA11X0_MOVE_LFSR_TO_R14_ABORT_RM "c8" +# define SA11X0_ENABLE_CLOCK_SWITCHING_OPCODE "0x2" +# define SA11X0_ENABLE_CLOCK_SWITCHING_RM "c1" +# define SA11X0_DISABLE_CLOCK_SWITCHING_OPCODE "0x2" +# define SA11X0_DISABLE_CLOCK_SWITCHING_RM "c2" +# define SA11X0_WAIT_FOR_INTERRUPT_OPCODE "0x2" +# define SA11X0_WAIT_FOR_INTERRUPT_RM "c8" +#endif /* __ASSEMBLER__ */ + + +/* + * SA11X0 IRQ Controller IRQ Numbers + */ +#define SA11X0_IRQ_MIN 0 + +#define SA11X0_IRQ_GPIO_0_EDGE_DETECT 0 +#define SA11X0_IRQ_GPIO_1_EDGE_DETECT 1 +#define SA11X0_IRQ_GPIO_2_EDGE_DETECT 2 +#define SA11X0_IRQ_GPIO_3_EDGE_DETECT 3 +#define SA11X0_IRQ_GPIO_4_EDGE_DETECT 4 +#define SA11X0_IRQ_GPIO_5_EDGE_DETECT 5 +#define SA11X0_IRQ_GPIO_6_EDGE_DETECT 6 +#define SA11X0_IRQ_GPIO_7_EDGE_DETECT 7 +#define SA11X0_IRQ_GPIO_8_EDGE_DETECT 8 +#define SA11X0_IRQ_GPIO_9_EDGE_DETECT 0 +#define SA11X0_IRQ_GPIO_10_EDGE_DETECT 10 +#define SA11X0_IRQ_GPIO_ANY_EDGE_DETECT 11 +#define SA11X0_IRQ_LCD_CONT_SERVICE_REQUEST 12 +#define SA11X0_IRQ_USB_SERVICE_REQUEST 13 +#define SA11X0_IRQ_SDLC_SERVICE_REQUEST 14 +#define SA11X0_IRQ_UART1_SERVICE_REQUEST 15 +#define SA11X0_IRQ_ICP_SERVICE_REQUEST 16 +#define SA11X0_IRQ_UART3_SERVICE_REQUEST 17 +#define SA11X0_IRQ_MCP_SERVICE_REQUEST 18 +#define SA11X0_IRQ_SSP_SERVICE_REQUEST 19 +#define SA11X0_IRQ_CHANNEL_0_SERVICE_REQUEST 20 +#define SA11X0_IRQ_CHANNEL_1_SERVICE_REQUEST 21 +#define SA11X0_IRQ_CHANNEL_2_SERVICE_REQUEST 22 +#define SA11X0_IRQ_CHANNEL_3_SERVICE_REQUEST 23 +#define SA11X0_IRQ_CHANNEL_4_SERVICE_REQUEST 24 +#define SA11X0_IRQ_CHANNEL_5_SERVICE_REQUEST 25 +#define SA11X0_IRQ_OS_TIMER_MATCH_REG_0 26 +#define SA11X0_IRQ_OS_TIMER_MATCH_REG_1 27 +#define SA11X0_IRQ_OS_TIMER_MATCH_REG_2 28 +#define SA11X0_IRQ_OS_TIMER_MATCH_REG_3 29 +#define SA11X0_IRQ_ONE_HZ_CLOCK_TIC 30 +#define SA11X0_IRQ_RTC_EQUALS_ALARM 31 + +#define SA11X0_IRQ_MAX 31 +#define NUM_SA11X0_INTERRUPTS SA11X0_IRQ_MAX - SA11X0_IRQ_MIN + 1 +#define SA11X0_IRQ_INTSRC_MASK(irq_nr) (1 << (irq_nr)) + +/* + * SA11X0 UART 1 Registers + */ +#define SA11X0_UART1_BASE SA11X0_REGISTER(0x10000) +#define SA11X0_UART1_CONTROL0 SA11X0_REGISTER(0x10000) +#define SA11X0_UART1_CONTROL1 SA11X0_REGISTER(0x10004) +#define SA11X0_UART1_CONTROL2 SA11X0_REGISTER(0x10008) +#define SA11X0_UART1_CONTROL3 SA11X0_REGISTER(0x1000C) +#define SA11X0_UART1_DATA SA11X0_REGISTER(0x10014) +#define SA11X0_UART1_STATUS0 SA11X0_REGISTER(0x1001C) +#define SA11X0_UART1_STATUS1 SA11X0_REGISTER(0x10020) + +/* + * SA11X0 UART 3 Registers + */ +#define SA11X0_UART3_BASE SA11X0_REGISTER(0x50000) +#define SA11X0_UART3_CONTROL0 SA11X0_REGISTER(0x50000) +#define SA11X0_UART3_CONTROL1 SA11X0_REGISTER(0x50004) +#define SA11X0_UART3_CONTROL2 SA11X0_REGISTER(0x50008) +#define SA11X0_UART3_CONTROL3 SA11X0_REGISTER(0x5000C) +#define SA11X0_UART3_DATA SA11X0_REGISTER(0x50014) +#define SA11X0_UART3_STATUS0 SA11X0_REGISTER(0x5001C) +#define SA11X0_UART3_STATUS1 SA11X0_REGISTER(0x50020) + +/* + * SA11X0 UART Control Register 0 Bit Fields. + */ +#define SA11X0_UART_PARITY_DISABLED 0x00 +#define SA11X0_UART_PARITY_ENABLED 0x01 +#define SA11X0_UART_PARITY_ENABLE_MASK 0x01 +#define SA11X0_UART_PARITY_ODD 0x00 +#define SA11X0_UART_PARITY_EVEN 0x02 +#define SA11X0_UART_PARITY_MODE_MASK 0x02 +#define SA11X0_UART_STOP_BITS_1 0x00 +#define SA11X0_UART_STOP_BITS_2 0x04 +#define SA11X0_UART_STOP_BITS_MASK 0x04 +#define SA11X0_UART_DATA_BITS_7 0x00 +#define SA11X0_UART_DATA_BITS_8 0x08 +#define SA11X0_UART_DATA_BITS_MASK 0x08 +#define SA11X0_UART_SAMPLE_CLOCK_DISABLED 0x00 +#define SA11X0_UART_SAMPLE_CLOCK_ENABLED 0x10 +#define SA11X0_UART_SAMPLE_CLOCK_ENABLE_MASK 0x10 +#define SA11X0_UART_RX_RISING_EDGE_SELECT 0x00 +#define SA11X0_UART_RX_FALLING_EDGE_SELECT 0x20 +#define SA11X0_UART_RX_EDGE_SELECT_MASK 0x20 +#define SA11X0_UART_TX_RISING_EDGE_SELECT 0x00 +#define SA11X0_UART_TX_FALLING_EDGE_SELECT 0x40 +#define SA11X0_UART_TX_EDGE_SELECT_MASK 0x20 + +/* + * SA-1100 UART Baud Control Register bit masks + */ +#define SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK 0x0000000F +#define SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK 0x000000FF +#define SA11X0_UART_BAUD_RATE_DIVISOR(x) ((3686400/(16*(x)))-1) + +/* + * SA-1100 UART Control Register 3 Bit Fields. + */ +#define SA11X0_UART_RX_DISABLED 0x00 +#define SA11X0_UART_RX_ENABLED 0x01 +#define SA11X0_UART_RX_ENABLE_MASK 0x01 +#define SA11X0_UART_TX_DISABLED 0x00 +#define SA11X0_UART_TX_ENABLED 0x02 +#define SA11X0_UART_TX_ENABLE_MASK 0x02 +#define SA11X0_UART_BREAK_DISABLED 0x00 +#define SA11X0_UART_BREAK_ENABLED 0x04 +#define SA11X0_UART_BREAK_MASK 0x04 +#define SA11X0_UART_RX_FIFO_INT_DISABLED 0x00 +#define SA11X0_UART_RX_FIFO_INT_ENABLED 0x08 +#define SA11X0_UART_RX_FIFO_INT_ENABLE_MASK 0x08 +#define SA11X0_UART_TX_FIFO_INT_DISABLED 0x00 +#define SA11X0_UART_TX_FIFO_INT_ENABLED 0x10 +#define SA11X0_UART_TX_FIFO_INT_ENABLE_MASK 0x10 +#define SA11X0_UART_NORMAL_OPERATION 0x00 +#define SA11X0_UART_LOOPBACK_MODE 0x20 + +/* + * SA-1100 UART Data Register bit masks + */ +#define SA11X0_UART_DATA_MASK 0x000000FF + +/* + * SA-1100 UART Status Register 0 Bit Fields. + */ +#define SA11X0_UART_TX_SERVICE_REQUEST 0x01 +#define SA11X0_UART_RX_SERVICE_REQUEST 0x02 +#define SA11X0_UART_RX_IDLE 0x04 +#define SA11X0_UART_RX_BEGIN_OF_BREAK 0x08 +#define SA11X0_UART_RX_END_OF_BREAK 0x10 +#define SA11X0_UART_ERROR_IN_FIFO 0x20 + +/* + * SA-1100 UART Status Register 1 Bit Fields. + */ +#define SA11X0_UART_TX_BUSY 0x01 +#define SA11X0_UART_RX_FIFO_NOT_EMPTY 0x02 +#define SA11X0_UART_TX_FIFO_NOT_FULL 0x04 +#define SA11X0_UART_PARITY_ERROR 0x08 +#define SA11X0_UART_FRAMING_ERROR 0x10 +#define SA11X0_UART_RX_FIFO_OVERRUN 0x20 + +#define UART_BASE_0 SA11X0_UART_CONTROL_0 +#define UART_BASE_1 SA11X0_UART_1_CONTROL_0 + +/* + * SA11X0 IRQ Controller Register Definitions. + */ +#define SA11X0_ICIP SA11X0_REGISTER(0x10050000) +#define SA11X0_ICMR SA11X0_REGISTER(0x10050004) +#define SA11X0_ICLR SA11X0_REGISTER(0x10050008) +#define SA11X0_ICCR SA11X0_REGISTER(0x1005000C) +#define SA11X0_ICFP SA11X0_REGISTER(0x10050010) +#define SA11X0_ICPR SA11X0_REGISTER(0x10050020) + +/* + * SA11X0 IRQ Controller Control Register Bit Fields. + */ +#define SA11X0_ICCR_DISABLE_IDLE_MASK_ALL 0x0 +#define SA11X0_ICCR_DISABLE_IDLE_MASK_ENABLED 0x1 + +/* + * SA11X0 Timer/counter registers + */ +#define SA11X0_OSMR0 SA11X0_REGISTER(0x10000000) +#define SA11X0_OSMR1 SA11X0_REGISTER(0x10000004) +#define SA11X0_OSMR2 SA11X0_REGISTER(0x10000008) +#define SA11X0_OSMR3 SA11X0_REGISTER(0x1000000C) +#define SA11X0_OSCR SA11X0_REGISTER(0x10000010) +#define SA11X0_OSSR SA11X0_REGISTER(0x10000014) +#define SA11X0_OIER SA11X0_REGISTER(0x1000001C) +#define SA11X0_RCNR SA11X0_REGISTER(0x10010004) +#define SA11X0_RTTR SA11X0_REGISTER(0x10010008) +#define SA11X0_RTSR SA11X0_REGISTER(0x10010010) + +// Timer status register +#define SA11X0_OSSR_TIMER0 (1<<0) // Timer match register #0 +#define SA11X0_OSSR_TIMER1 (1<<1) +#define SA11X0_OSSR_TIMER2 (1<<2) +#define SA11X0_OSSR_TIMER3 (1<<3) + +// Timer interrupt enable register +#define SA11X0_OIER_TIMER0 (1<<0) +#define SA11X0_OIER_TIMER1 (1<<1) +#define SA11X0_OIER_TIMER2 (1<<2) +#define SA11X0_OIER_TIMER3 (1<<3) + +/* + * SA-1100 Reset Controller Register Definition + */ +#define SA11X0_RESET_SOFTWARE_RESET SA11X0_REGISTER(0x10030000) +#define SA11X0_RESET_STATUS SA11X0_REGISTER(0x10030004) +#define SA11X0_TUCR SA11X0_REGISTER(0x10030008) + +/* + * SA-1100 Reset Controller Bit Field Definitions + */ +#define SA11X0_INVOKE_SOFTWARE_RESET 0x1 + +#define SA11X0_HARDWARE_RESET 0x1 +#define SA11X0_SOFTWARE_RESET 0x2 +#define SA11X0_WATCHDOG_RESET 0x4 +#define SA11X0_SLEEP_MODE_RESET 0x8 + +/* + * SA-1100 Power Manager Registers + */ +#define SA11X0_PWR_MGR_CONTROL SA11X0_REGISTER(0x10020000) +#define SA11X0_PWR_MGR_SLEEP_STATUS SA11X0_REGISTER(0x10020004) +#define SA11X0_PWR_MGR_SCRATCHPAD SA11X0_REGISTER(0x10020008) +#define SA11X0_PWR_MGR_WAKEUP_ENABLE SA11X0_REGISTER(0x1002000C) +#define SA11X0_PWR_MGR_GENERAL_CONFIG SA11X0_REGISTER(0x10020010) +#define SA11X0_PWR_MGR_PLL_CONFIG SA11X0_REGISTER(0x10020014) +#define SA11X0_PWR_MGR_GPIO_SLEEP_STATE SA11X0_REGISTER(0x10020018) +#define SA11X0_PWR_MGR_OSC_STATUS SA11X0_REGISTER(0x1002001C) + +/* + * SA-1100 Control Register Bit Field Definitions + */ +#define SA11X0_NO_FORCE_SLEEP_MODE 0x00000000 +#define SA11X0_FORCE_SLEEP_MODE 0x00000001 +#define SA11X0_SLEEP_MODE_MASK 0x00000001 + +/* + * SA-1100 Power Management Configuration Register Bit Field Definitions + */ +#define SA11X0_NO_STOP_OSC_DURING_SLEEP 0x00000000 +#define SA11X0_STOP_OSC_DURING_SLEEP 0x00000001 +#define SA11X0_OSC_DURING_SLEEP_MASK 0x00000001 +#define SA11X0_DRIVE_PCMCIA_DURING_SLEEP 0x00000000 +#define SA11X0_FLOAT_PCMCIA_DURING_SLEEP 0x00000002 +#define SA11X0_PCMCIA_DURING_SLEEP_MASK 0x00000002 +#define SA11X0_DRIVE_CHIPSEL_DURING_SLEEP 0x00000000 +#define SA11X0_FLOAT_CHIPSEL_DURING_SLEEP 0x00000004 +#define SA11X0_CHIPSEL_DURING_SLEEP_MASK 0x00000004 +#define SA11X0_WAIT_OSC_STABLE 0x00000000 +#define SA11X0_FORCE_OSC_ENABLE_ON 0x00000008 +#define SA11X0_OSC_STABLE_MASK 0x00000008 + +/* + * SA-1100 PLL Configuration Register Bit Field Definitions + */ +#define SA11X0_CLOCK_SPEED_59_0_MHz 0x00000000 +#define SA11X0_CLOCK_SPEED_73_7_MHz 0x00000001 +#define SA11X0_CLOCK_SPEED_88_5_MHz 0x00000002 +#define SA11X0_CLOCK_SPEED_103_2_MHz 0x00000003 +#define SA11X0_CLOCK_SPEED_118_0_MHz 0x00000004 +#define SA11X0_CLOCK_SPEED_132_7_MHz 0x00000005 +#define SA11X0_CLOCK_SPEED_147_5_MHz 0x00000006 +#define SA11X0_CLOCK_SPEED_162_2_MHz 0x00000007 +#define SA11X0_CLOCK_SPEED_176_9_MHz 0x00000008 +#define SA11X0_CLOCK_SPEED_191_7_MHz 0x00000009 +#define SA11X0_CLOCK_SPEED_206_4_MHz 0x0000000A +#define SA11X0_CLOCK_SPEED_221_2_MHz 0x0000000B + +/* + * SA-1100 Power Manager Wakeup Register Bit Field Definitions + */ +#define SA11X0_WAKEUP_ENABLE(x) ((x) & 0x8FFFFFFF) + +/* + * SA-1100 Power Manager Sleep Status Bit Field Definitions + */ +#define SA11X0_SOFTWARE_SLEEP_STATUS 0x00000001 +#define SA11X0_BATTERY_FAULT_STATUS 0x00000002 +#define SA11X0_VDD_FAULT_STATUS 0x00000004 +#define SA11X0_DRAM_CONTROL_HOLD 0x00000008 +#define SA11X0_PERIPHERAL_CONTROL_HOLD 0x00000010 + +/* + * SA-1100 Power Manager Oscillator Status Register Bit Field Definitions + */ +#define SA11X0_OSCILLATOR_STATUS 0x00000001 + +/* + * SA-1110 GPCLK Register Definitions + */ +#define SA1110_GPCLK_CONTROL_0 SA11X0_REGISTER(0x00020060) +#define SA1110_GPCLK_CONTROL_1 SA11X0_REGISTER(0x0002006C) +#define SA1110_GPCLK_CONTROL_2 SA11X0_REGISTER(0x00020070) + +/* GPCLK Control Register 0 */ +#define SA1110_GPCLK_SUS_GPCLK 0 +#define SA1110_GPCLK_SUS_UART 1 +#define SA1110_GPCLK_SCE 2 +#define SA1110_GPCLK_SCD_IN 0 +#define SA1110_GPCLK_SCD_OUT 4 + +/* + * SA11X0 Peripheral Port Controller Register Definitions + */ +#define SA11X0_PPC_PIN_DIRECTION SA11X0_REGISTER(0x10060000) +#define SA11X0_PPC_PIN_STATE SA11X0_REGISTER(0x10060004) +#define SA11X0_PPC_PIN_ASSIGNMENT SA11X0_REGISTER(0x10060008) +#define SA11X0_PPC_PIN_SLEEP_MODE_DIR SA11X0_REGISTER(0x1006000C) +#define SA11X0_PPC_PIN_FLAG SA11X0_REGISTER(0x10060010) + +/* + * SA11X0 PPC Bit Field Definitions + */ +#define SA11X0_PPC_LCD_PIN_0_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_0_DIR_OUTPUT 0x00000001 +#define SA11X0_PPC_LCD_PIN_0_DIR_MASK 0x00000001 +#define SA11X0_PPC_LCD_PIN_1_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_1_DIR_OUTPUT 0x00000002 +#define SA11X0_PPC_LCD_PIN_1_DIR_MASK 0x00000002 +#define SA11X0_PPC_LCD_PIN_2_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_2_DIR_OUTPUT 0x00000004 +#define SA11X0_PPC_LCD_PIN_2_DIR_MASK 0x00000004 +#define SA11X0_PPC_LCD_PIN_3_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_3_DIR_OUTPUT 0x00000008 +#define SA11X0_PPC_LCD_PIN_3_DIR_MASK 0x00000008 +#define SA11X0_PPC_LCD_PIN_4_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_4_DIR_OUTPUT 0x00000010 +#define SA11X0_PPC_LCD_PIN_4_DIR_MASK 0x00000010 +#define SA11X0_PPC_LCD_PIN_5_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_5_DIR_OUTPUT 0x00000020 +#define SA11X0_PPC_LCD_PIN_5_DIR_MASK 0x00000020 +#define SA11X0_PPC_LCD_PIN_6_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_6_DIR_OUTPUT 0x00000040 +#define SA11X0_PPC_LCD_PIN_6_DIR_MASK 0x00000040 +#define SA11X0_PPC_LCD_PIN_7_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIN_7_DIR_OUTPUT 0x00000080 +#define SA11X0_PPC_LCD_PIN_7_DIR_MASK 0x00000080 +#define SA11X0_PPC_LCD_PIXCLK_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_PIXCLK_DIR_OUTPUT 0x00000100 +#define SA11X0_PPC_LCD_PIXCLK_DIR_MASK 0x00000100 +#define SA11X0_PPC_LCD_LINECLK_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_LINECLK_DIR_OUTPUT 0x00000200 +#define SA11X0_PPC_LCD_LINECLK_DIR_MASK 0x00000200 +#define SA11X0_PPC_LCD_FRAMECLK_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_FRAMECLK_DIR_OUTPUT 0x00000400 +#define SA11X0_PPC_LCD_FRAMECLK_DIR_MASK 0x00000400 +#define SA11X0_PPC_LCD_AC_BIAS_DIR_INPUT 0x00000000 +#define SA11X0_PPC_LCD_AC_BIAS_DIR_OUTPUT 0x00000800 +#define SA11X0_PPC_LCD_AC_BIAS_DIR_MASK 0x00000800 +#define SA11X0_PPC_SERIAL_PORT_1_TX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_1_TX_DIR_OUTPUT 0x00001000 +#define SA11X0_PPC_SERIAL_PORT_1_TX_DIR_MASK 0x00001000 +#define SA11X0_PPC_SERIAL_PORT_1_RX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_1_RX_DIR_OUTPUT 0x00002000 +#define SA11X0_PPC_SERIAL_PORT_1_RX_DIR_MASK 0x00002000 +#define SA11X0_PPC_SERIAL_PORT_2_TX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_2_TX_DIR_OUTPUT 0x00004000 +#define SA11X0_PPC_SERIAL_PORT_2_TX_DIR_MASK 0x00004000 +#define SA11X0_PPC_SERIAL_PORT_2_RX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_2_RX_DIR_OUTPUT 0x00008000 +#define SA11X0_PPC_SERIAL_PORT_2_RX_DIR_MASK 0x00008000 +#define SA11X0_PPC_SERIAL_PORT_3_TX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_3_TX_DIR_OUTPUT 0x00010000 +#define SA11X0_PPC_SERIAL_PORT_3_TX_DIR_MASK 0x00010000 +#define SA11X0_PPC_SERIAL_PORT_3_RX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_3_RX_DIR_OUTPUT 0x00020000 +#define SA11X0_PPC_SERIAL_PORT_3_RX_DIR_MASK 0x00020000 +#define SA11X0_PPC_SERIAL_PORT_4_TX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_4_TX_DIR_OUTPUT 0x00040000 +#define SA11X0_PPC_SERIAL_PORT_4_TX_DIR_MASK 0x00040000 +#define SA11X0_PPC_SERIAL_PORT_4_RX_DIR_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_4_RX_DIR_OUTPUT 0x00080000 +#define SA11X0_PPC_SERIAL_PORT_4_RX_DIR_MASK 0x00080000 +#define SA11X0_PPC_SERIAL_PORT_4_SERCLK_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_4_SERCLK_OUTPUT 0x00100000 +#define SA11X0_PPC_SERIAL_PORT_4_SERCLK_MASK 0x00100000 +#define SA11X0_PPC_SERIAL_PORT_4_SERFRM_INPUT 0x00000000 +#define SA11X0_PPC_SERIAL_PORT_4_SERFRM_OUTPUT 0x00200000 +#define SA11X0_PPC_SERIAL_PORT_4_SERFRM_MASK 0x00200000 + +#define SA11X0_PPC_UART_PIN_NOT_REASSIGNED 0x00000000 +#define SA11X0_PPC_UART_PIN_REASSIGNED 0x00001000 +#define SA11X0_PPC_UART_PIN_REASSIGNMENT_MASK 0x00001000 +#define SA11X0_PPC_SSP_PIN_NOT_REASSIGNED 0x00000000 +#define SA11X0_PPC_SSP_PIN_REASSIGNED 0x00040000 +#define SA11X0_PPC_SSP_PIN_REASSIGNMENT_MASK 0x00040000 + +/* + * SA-1100 MCP Registers + */ +#define SA11X0_MCP_CONTROL_0 SA11X0_REGISTER(0x00060000) +#define SA11X0_MCP_DATA_0 SA11X0_REGISTER(0x00060008) +#define SA11X0_MCP_DATA_1 SA11X0_REGISTER(0x0006000C) +#define SA11X0_MCP_DATA_2 SA11X0_REGISTER(0x00060010) +#define SA11X0_MCP_STATUS SA11X0_REGISTER(0x00060018) +#define SA11X0_MCP_CONTROL_1 SA11X0_REGISTER(0x00060030) + +/* + * SA-1100 Memory Configuration Registers + */ +#define SA11X0_DRAM_CONFIGURATION SA11X0_REGISTER(0x20000000) +#define SA11X0_DRAM0_CAS_0 SA11X0_REGISTER(0x20000004) +#define SA11X0_DRAM0_CAS_1 SA11X0_REGISTER(0x20000008) +#define SA11X0_DRAM0_CAS_2 SA11X0_REGISTER(0x2000000C) +#define SA11X0_STATIC_CONTROL_0 SA11X0_REGISTER(0x20000010) +#define SA11X0_STATIC_CONTROL_1 SA11X0_REGISTER(0x20000014) +#define SA11X0_EXP_BUS_CONFIGURATION SA11X0_REGISTER(0x20000018) +#define SA11X0_REFRESH_CONFIGURATION SA11X0_REGISTER(0x2000001C) +#define SA11X0_DRAM2_CAS_0 SA11X0_REGISTER(0x20000020) +#define SA11X0_DRAM2_CAS_1 SA11X0_REGISTER(0x20000024) +#define SA11X0_DRAM2_CAS_2 SA11X0_REGISTER(0x20000028) +#define SA11X0_STATIC_CONTROL_2 SA11X0_REGISTER(0x2000002C) +#define SA11X0_SMROM_CONFIGURATION SA11X0_REGISTER(0x20000030) + +/* + * SA-1100 DRAM Configuration Bit Field Definitions + */ +#define SA11X0_DRAM_BANK_0_DISABLED 0x00000000 +#define SA11X0_DRAM_BANK_0_ENABLED 0x00000001 +#define SA11X0_DRAM_BANK_0_ENABLE_MASK 0x00000001 +#define SA11X0_DRAM_BANK_1_DISABLED 0x00000000 +#define SA11X0_DRAM_BANK_1_ENABLED 0x00000002 +#define SA11X0_DRAM_BANK_1_ENABLE_MASK 0x00000002 +#define SA11X0_DRAM_BANK_2_DISABLED 0x00000000 +#define SA11X0_DRAM_BANK_2_ENABLED 0x00000004 +#define SA11X0_DRAM_BANK_2_ENABLE_MASK 0x00000004 +#define SA11X0_DRAM_BANK_3_DISABLED 0x00000000 +#define SA11X0_DRAM_BANK_3_ENABLED 0x00000008 +#define SA11X0_DRAM_BANK_3_ENABLE_MASK 0x00000008 +#define SA11X0_DRAM_ROW_ADDRESS_BITS_9 0x00000000 +#define SA11X0_DRAM_ROW_ADDRESS_BITS_10 0x00000010 +#define SA11X0_DRAM_ROW_ADDRESS_BITS_11 0x00000020 +#define SA11X0_DRAM_ROW_ADDRESS_BITS_12 0x00000030 +#define SA11X0_DRAM_ROW_ADDRESS_BITS_MASK 0x00000030 +#define SA11X0_DRAM_CLOCK_CPU_CLOCK 0x00000000 +#define SA11X0_DRAM_CLOCK_CPU_CLOCK_DIV_2 0x00000040 +#define SA11X0_DRAM_CLOCK_CPU_CLOCK_MASK 0x00000040 +#define SA11X0_DRAM_RAS_PRECHARGE(x) (((x) & 0xF) << 7) +#define SA11X0_DRAM_CAS_BEFORE_RAS(x) (((x) & 0xF) << 11) +#define SA11X0_DATA_INPUT_LATCH_WITH_CAS 0x00000000 +#define SA11X0_DATA_INPUT_LATCH_CAS_PLUS_ONE 0x00008000 +#define SA11X0_DATA_INPUT_LATCH_CAS_PLUS_TWO 0x00010000 +#define SA11X0_DATA_INPUT_LATCH_CAS_PLUS_THREE 0x00018000 +#define SA11X0_DRAM_REFRESH_INTERVAL(x) (((x) & 0x7FFF) << 17) + +/* + * SA-1100 Static Memory Control Register Bit Field Definitions + */ +#define SA11X0_STATIC_ROM_TYPE_FLASH 0x00000000 +#define SA11X0_STATIC_ROM_TYPE_SRAM 0x00000001 +#define SA11X0_STATIC_ROM_TYPE_BURST_OF_4_ROM 0x00000002 +#define SA11X0_STATIC_ROM_TYPE_BURST_OF_8_ROM 0x00000003 +#define SA11X0_STATIC_ROM_TYPE_MASK 0x00000003 +#define SA11X0_STATIC_ROM_BUS_WIDTH_32_BITS 0x00000000 +#define SA11X0_STATIC_ROM_BUS_WIDTH_16_BITS 0x00000004 +#define SA11X0_STATIC_ROM_BUS_WIDTH_MASK 0x00000004 +#define SA11X0_STATIC_ROM_DELAY_FIRST_ACCESS(x) (((x) & 0x1F) << 3) +#define SA11X0_STATIC_ROM_DELAY_NEXT_ACCESS(x) (((x) & 0x1F) << 8) +#define SA11X0_STATIC_ROM_RECOVERY(x) (((x) & 0x7) << 13) + +#define SA11X0_STATIC_ROM_BANK_0(x) (((x) & 0xFFFF) << 0) +#define SA11X0_STATIC_ROM_BANK_1(x) (((x) & 0xFFFF) << 16) +#define SA11X0_STATIC_ROM_BANK_2(x) (((x) & 0xFFFF) << 0) +#define SA11X0_STATIC_ROM_BANK_3(x) (((x) & 0xFFFF) << 16) + +/* + * SA-1100 GPIO Register Definitions + */ +#define SA11X0_GPIO_PIN_0 BIT0 +#define SA11X0_GPIO_PIN_1 BIT1 +#define SA11X0_GPIO_PIN_2 BIT2 +#define SA11X0_GPIO_PIN_3 BIT3 +#define SA11X0_GPIO_PIN_4 BIT4 +#define SA11X0_GPIO_PIN_5 BIT5 +#define SA11X0_GPIO_PIN_6 BIT6 +#define SA11X0_GPIO_PIN_7 BIT7 +#define SA11X0_GPIO_PIN_8 BIT8 +#define SA11X0_GPIO_PIN_9 BIT9 +#define SA11X0_GPIO_PIN_10 BIT10 +#define SA11X0_GPIO_PIN_11 BIT11 +#define SA11X0_GPIO_PIN_12 BIT12 +#define SA11X0_GPIO_PIN_13 BIT13 +#define SA11X0_GPIO_PIN_14 BIT14 +#define SA11X0_GPIO_PIN_15 BIT15 +#define SA11X0_GPIO_PIN_16 BIT16 +#define SA11X0_GPIO_PIN_17 BIT17 +#define SA11X0_GPIO_PIN_18 BIT18 +#define SA11X0_GPIO_PIN_19 BIT19 +#define SA11X0_GPIO_PIN_20 BIT20 +#define SA11X0_GPIO_PIN_21 BIT21 +#define SA11X0_GPIO_PIN_22 BIT22 +#define SA11X0_GPIO_PIN_23 BIT23 +#define SA11X0_GPIO_PIN_24 BIT24 +#define SA11X0_GPIO_PIN_25 BIT25 +#define SA11X0_GPIO_PIN_26 BIT26 +#define SA11X0_GPIO_PIN_27 BIT27 + +#define SA11X0_GPIO_PIN_LEVEL SA11X0_REGISTER(0x10040000) +#define SA11X0_GPIO_PIN_DIRECTION SA11X0_REGISTER(0x10040004) +#define SA11X0_GPIO_PIN_OUTPUT_SET SA11X0_REGISTER(0x10040008) +#define SA11X0_GPIO_PIN_OUTPUT_CLEAR SA11X0_REGISTER(0x1004000C) +#define SA11X0_GPIO_RISING_EDGE_DETECT SA11X0_REGISTER(0x10040010) +#define SA11X0_GPIO_FALLING_EDGE_DETECT SA11X0_REGISTER(0x10040014) +#define SA11X0_GPIO_EDGE_DETECT_STATUS SA11X0_REGISTER(0x10040018) +#define SA11X0_GPIO_ALTERNATE_FUNCTION SA11X0_REGISTER(0x1004001C) + +#endif /* __HAL_SA11X0_H__ */ diff --git a/packages/hal/arm/sa11x0/var/current/include/plf_stub.h b/packages/hal/arm/sa11x0/var/current/include/plf_stub.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/include/plf_stub.h @@ -0,0 +1,95 @@ +#ifndef CYGONCE_HAL_PLF_STUB_H +#define CYGONCE_HAL_PLF_STUB_H + +//============================================================================= +// +// plf_stub.h +// +// Platform header for GDB stub support. +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors:jskov +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: Platform HAL stub support for Intel SA11x0 boards. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include // CYG_UNUSED_PARAM + +#include // registers +#include // IO macros +#include // Interrupt macros +#include // architecture stub support + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +//---------------------------------------------------------------------------- +// Define some platform specific communication details. This is mostly +// handled by hal_if now, but we need to make sure the comms tables are +// properly initialized. + +externC void cyg_hal_plf_comms_init(void); + +#define HAL_STUB_PLATFORM_INIT_SERIAL() cyg_hal_plf_comms_init() +#define HAL_STUB_PLATFORM_SET_BAUD_RATE(baud) CYG_UNUSED_PARAM(int, (baud)) +#define HAL_STUB_PLATFORM_INTERRUPTIBLE 0 + +//---------------------------------------------------------------------------- +// Stub initializer. +#define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +//---------------------------------------------------------------------------- +// Reset. +#define HAL_STUB_PLATFORM_RESET() \ + CYG_MACRO_START \ + cyg_uint32 ctrl; \ + \ + /* By disabling interupts we will just hang in the loop below */ \ + /* if for some reason the software reset fails. */ \ + HAL_DISABLE_INTERRUPTS(ctrl); \ + \ + /* Software reset. */ \ + *SA11X0_RESET_SOFTWARE_RESET = SA11X0_INVOKE_SOFTWARE_RESET; \ + \ + for(;;); /* hang here forever if reset fails */ \ + CYG_MACRO_END + +// Fallback (never really used) +#define HAL_STUB_PLATFORM_RESET_ENTRY 0x00000000 + +//----------------------------------------------------------------------------- +#endif // CYGONCE_HAL_PLF_STUB_H +// End of plf_stub.h diff --git a/packages/hal/arm/sa11x0/var/current/src/hal_diag.c b/packages/hal/arm/sa11x0/var/current/src/hal_diag.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/src/hal_diag.c @@ -0,0 +1,542 @@ +/*============================================================================= +// +// hal_diag.c +// +// HAL diagnostic output code +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors:nickg, gthomas +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: HAL diagnostic output +// Description: Implementations of HAL diagnostic output support. +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#include // base types +#include // tracing macros +#include // assertion macros + +#include // basic machine info +#include // interrupt macros +#include // IO macros +#include // Calling interface definitions +#include +#include // cyg_drv_interrupt_acknowledge +#include // Helper functions +#include // Hardware definitions + +struct sa11x0_serial { + volatile cyg_uint32 utcr0; + volatile cyg_uint32 utcr1; + volatile cyg_uint32 utcr2; + volatile cyg_uint32 utcr3; + volatile cyg_uint32 pad0010; + volatile cyg_uint32 utdr; + volatile cyg_uint32 pad0018; + volatile cyg_uint32 utsr0; + volatile cyg_uint32 utsr1; +}; + +/*---------------------------------------------------------------------------*/ +// SA11x0 Serial Port (UARTx) for Debug + +static void +init_channel(void* __ch_data) +{ + volatile struct sa11x0_serial* base = (struct sa11x0_serial*)__ch_data; + cyg_uint32 brd; + + // Disable Receiver and Transmitter (clears FIFOs) + base->utcr3 = SA11X0_UART_RX_DISABLED | SA11X0_UART_TX_DISABLED; + + // Clear sticky (writable) status bits. + base->utsr0 = SA11X0_UART_RX_IDLE | SA11X0_UART_RX_BEGIN_OF_BREAK | + SA11X0_UART_RX_END_OF_BREAK; + +#if 0 // later + if (SA11X0_UART1_BASE == __ch_data) { + + //Set pin 14 as an output (Tx) and pin 15 as in input (Rx). + base->gpdr = (*SA11X0_REG_GPDR | SA11X0_GPIO_14) & ~SA11X0_GPIO_15; + + // Use GPIO 14 & 15 pins for serial port 1. + base->gafr |= SA11X0_GPIO_14 | SA11X0_GPIO_15; + + // Pin reassignment for serial port 1. + base->ppar |= SA11X0_UART_PIN_REASSIGNMENT_MASK; + } +#endif + + // Set UART to 8N1 (8 data bits, no partity, 1 stop bit) + base->utcr0 = SA11X0_UART_PARITY_DISABLED | SA11X0_UART_STOP_BITS_1 | + SA11X0_UART_DATA_BITS_8; + + // Set the desired baud rate. + brd = SA11X0_UART_BAUD_RATE_DIVISOR(CYGHWR_HAL_ARM_SA11X0_DIAG_BAUD); + base->utcr1 = (brd >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK; + base->utcr2 = brd & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK; + + // Enable the receiver and the transmitter. + base->utcr3 = SA11X0_UART_RX_ENABLED | SA11X0_UART_TX_ENABLED; + + // All done +} + +void +cyg_hal_plf_serial_putc(void *__ch_data, char c) +{ + volatile struct sa11x0_serial* base = (struct sa11x0_serial*)__ch_data; + CYGARC_HAL_SAVE_GP(); + + // Wait for Tx FIFO not full + while ((base->utsr1 & SA11X0_UART_TX_FIFO_NOT_FULL) == 0) + ; + base->utdr = c; + + CYGARC_HAL_RESTORE_GP(); +} + +// FIXME: shouldn't we check for PARITY_ERROR, FRAMING_ERROR, or +// RECEIVE_FIFO_OVERRUN_ERROR in the received data? This +// means check the appropriate bits in UTSR1. + +static cyg_bool +cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch) +{ + volatile struct sa11x0_serial* base = (struct sa11x0_serial*)__ch_data; + + // If receive fifo is empty, return false + if ((base->utsr1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) == 0) + return false; + + *ch = (char)base->utdr; + + // Clear receiver idle status bit, to allow another interrupt to + // occur in the case where the receive fifo is almost empty. + base->utsr0 = SA11X0_UART_RX_IDLE; + + return true; +} + +cyg_uint8 +cyg_hal_plf_serial_getc(void* __ch_data) +{ + cyg_uint8 ch; + CYGARC_HAL_SAVE_GP(); + + while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch)); + + CYGARC_HAL_RESTORE_GP(); + return ch; +} + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +static void +cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_plf_serial_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_plf_serial_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +cyg_int32 msec_timeout[2] = { 1000, 1000 }; + +cyg_bool +cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch) +{ + int delay_count; + int index; + cyg_bool res; + CYGARC_HAL_SAVE_GP(); + + if (SA11X0_UART1_BASE == __ch_data) + index = 0; + else + index = 1; + + delay_count = msec_timeout[index] * 10; // delay in .1 ms steps + + for(;;) { + res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch); + if (res || 0 == delay_count--) + break; + + CYGACC_CALL_IF_DELAY_US(100); + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +static int isr_vectors[2] = {CYGNUM_HAL_INTERRUPT_UART1, + CYGNUM_HAL_INTERRUPT_UART3}; + +static int +cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...) +{ + static int irq_state = 0; + volatile struct sa11x0_serial* base = (struct sa11x0_serial*)__ch_data; + int ret = 0; + int index; + CYGARC_HAL_SAVE_GP(); + + if (SA11X0_UART1_BASE == __ch_data) + index = 0; + else + index = 1; + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + + base->utcr3 |= SA11X0_UART_RX_FIFO_INT_ENABLED; + + HAL_INTERRUPT_UNMASK(isr_vectors[index]); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + + base->utcr3 &= ~SA11X0_UART_RX_FIFO_INT_ENABLED; + + HAL_INTERRUPT_MASK(isr_vectors[index]); + break; + case __COMMCTL_DBG_ISR_VECTOR: + ret = isr_vectors[index]; + break; + case __COMMCTL_SET_TIMEOUT: + { + va_list ap; + + va_start(ap, __func); + + ret = msec_timeout[index]; + msec_timeout[index] = va_arg(ap, cyg_uint32); + + va_end(ap); + } + default: + break; + } + CYGARC_HAL_RESTORE_GP(); + return ret; +} + +static int +cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc, + CYG_ADDRWORD __vector, CYG_ADDRWORD __data) +{ + int index, res = 0; + volatile struct sa11x0_serial* base = (struct sa11x0_serial*)__ch_data; + char c; + int reg; + CYGARC_HAL_SAVE_GP(); + + if (SA11X0_UART1_BASE == __ch_data) + index = 0; + else + index = 1; + + reg = base->utsr1; + + // read it anyway just in case - no harm done and we might prevent an + // interrupt loop + c = (char)base->utdr; + + //Clear receiver idle status bit, to allow another interrupt to + //occur in the case where the receive fifo is almost empty. + base->utsr0 = SA11X0_UART_RX_IDLE; + + cyg_drv_interrupt_acknowledge(isr_vectors[index]); + + *__ctrlc = 0; + if ( (reg & SA11X0_UART_RX_FIFO_NOT_EMPTY) != 0 ) { + if( cyg_hal_is_break( &c , 1 ) ) + *__ctrlc = 1; + + res = CYG_ISR_HANDLED; + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +static void +cyg_hal_plf_serial_init(void) +{ + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Init channels + init_channel((void*)SA11X0_UART1_BASE); +#if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS == 2) + init_channel((void*)SA11X0_UART3_BASE); +#endif + + // Setup procs in the vector table + + // Set channel 0 + CYGACC_CALL_IF_SET_CONSOLE_COMM(0); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, SA11X0_UART1_BASE); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout); + +#if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS == 2) + // Set channel 1 + CYGACC_CALL_IF_SET_CONSOLE_COMM(1); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, SA11X0_UART3_BASE); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout); +#endif + + // Restore original console + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +void +cyg_hal_plf_comms_init(void) +{ + static int initialized = 0; + + if (initialized) + return; + + initialized = 1; + + cyg_hal_plf_serial_init(); +} +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + + +//============================================================================= +// Compatibility with older stubs +//============================================================================= + +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +#include // cyg_hal_gdb_interrupt + +#if (CYGHWR_HAL_ARM_SA11X0_DIAG_PORT == 0) +# define __BASE ((void*)SA11X0_UART1_BASE) +#else +# define __BASE ((void*)SA11X0_UART3_BASE) +#endif + +#ifdef CYGSEM_HAL_ROM_MONITOR +#define CYG_HAL_STARTUP_ROM +#undef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +#endif + +#if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) +#define HAL_DIAG_USES_HARDWARE +#elif defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#define HAL_DIAG_USES_HARDWARE +#elif CYGHWR_HAL_ARM_SA11X0_DIAG_PORT != CYGHWR_HAL_ARM_SA11X0_GDB_PORT +#define HAL_DIAG_USES_HARDWARE +#endif + +void +hal_diag_init(void) +{ + // Init serial device + init_channel(__BASE); +} + +#ifdef HAL_DIAG_USES_HARDWARE + +#ifdef DEBUG_DIAG +#ifndef CYG_HAL_STARTUP_ROM +#define DIAG_BUFSIZE 2048 +static char diag_buffer[DIAG_BUFSIZE]; +static int diag_bp = 0; +#endif +#endif + +void hal_diag_read_char(char *c) +{ + *c = cyg_hal_plf_serial_getc(__BASE); +} + +void hal_diag_write_char(char c) +{ +#ifdef DEBUG_DIAG +#ifndef CYG_HAL_STARTUP_ROM + diag_buffer[diag_bp++] = c; + if (diag_bp == sizeof(diag_buffer)) diag_bp = 0; +#endif +#endif + cyg_hal_plf_serial_putc(__BASE, c); +} + +#else // not HAL_DIAG_USES_HARDWARE - it uses GDB protocol + +void +hal_diag_read_char(char *c) +{ + *c = cyg_hal_plf_serial_getc(__BASE); +} + +void +hal_diag_write_char(char c) +{ + static char line[100]; + static int pos = 0; + + // FIXME: Some LED blinking might be nice right here. + + // No need to send CRs + if( c == '\r' ) return; + + line[pos++] = c; + + if( c == '\n' || pos == sizeof(line) ) + { + + CYG_INTERRUPT_STATE old; + + // Disable interrupts. This prevents GDB trying to interrupt us + // while we are in the middle of sending a packet. The serial + // receive interrupt will be seen when we re-enable interrupts + // later. + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old); +#else + HAL_DISABLE_INTERRUPTS(old); +#endif + + while(1) + { + static char hex[] = "0123456789ABCDEF"; + cyg_uint8 csum = 0; + int i; +#ifndef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT + char c1; +#endif + cyg_hal_plf_serial_putc(__BASE, '$'); + cyg_hal_plf_serial_putc(__BASE, 'O'); + csum += 'O'; + for( i = 0; i < pos; i++ ) + { + char ch = line[i]; + char h = hex[(ch>>4)&0xF]; + char l = hex[ch&0xF]; + cyg_hal_plf_serial_putc(__BASE, h); + cyg_hal_plf_serial_putc(__BASE, l); + csum += h; + csum += l; + } + cyg_hal_plf_serial_putc(__BASE, '#'); + cyg_hal_plf_serial_putc(__BASE, hex[(csum>>4)&0xF]); + cyg_hal_plf_serial_putc(__BASE, hex[csum&0xF]); + +#ifdef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT + + break; // regardless + +#else // not CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT Ie. usually... + + // Wait for the ACK character '+' from GDB here and handle + // receiving a ^C instead. This is the reason for this clause + // being a loop. + c1 = cyg_hal_plf_serial_getc(__BASE); + + if( c1 == '+' ) + break; // a good acknowledge + +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + cyg_drv_interrupt_acknowledge(CYGHWR_HAL_GDB_PORT_VECTOR); + if( c1 == 3 ) { + // Ctrl-C: breakpoint. + cyg_hal_gdb_interrupt( + (target_register_t)__builtin_return_address(0) ); + break; + } +#endif // CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + +#endif // ! CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT + // otherwise, loop round again + } + + pos = 0; + + + // And re-enable interrupts +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old); +#else + HAL_RESTORE_INTERRUPTS(old); +#endif + + } +} +#endif + +#endif // !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + + +/*---------------------------------------------------------------------------*/ +/* End of hal_diag.c */ diff --git a/packages/hal/arm/sa11x0/var/current/src/plf_stub.c b/packages/hal/arm/sa11x0/var/current/src/plf_stub.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/src/plf_stub.c @@ -0,0 +1,212 @@ +//============================================================================= +// +// plf_stub.c +// +// Platform specific code for GDB stub support. +// +//============================================================================= +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors:gthomas, jskov +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: Platform specific code for GDB stub support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include + +#include // HAL IO macros +#include // Hardware definitions +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT +#include // HAL interrupt macros +#include // HAL ISR support +#endif + +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT +static cyg_interrupt gdb_interrupt; +static cyg_handle_t gdb_interrupt_handle; +#endif + +#if CYGHWR_HAL_ARM_SA11X0_GDB_PORT == 0 +#define CYG_GDB_DEV_UTCR0 SA11X0_UART1_CONTROL0 +#define CYG_GDB_DEV_UTCR1 SA11X0_UART1_CONTROL1 +#define CYG_GDB_DEV_UTCR2 SA11X0_UART1_CONTROL2 +#define CYG_GDB_DEV_UTCR3 SA11X0_UART1_CONTROL3 +#define CYG_GDB_DEV_UTDR SA11X0_UART1_DATA +#define CYG_GDB_DEV_UTSR0 SA11X0_UART1_STATUS0 +#define CYG_GDB_DEV_UTSR1 SA11X0_UART1_STATUS1 +#define CYG_GDB_DEV_INT CYGNUM_HAL_INTERRUPT_UART1 +#else +#define CYG_GDB_DEV_UTCR0 SA11X0_UART3_CONTROL0 +#define CYG_GDB_DEV_UTCR1 SA11X0_UART3_CONTROL1 +#define CYG_GDB_DEV_UTCR2 SA11X0_UART3_CONTROL2 +#define CYG_GDB_DEV_UTCR3 SA11X0_UART3_CONTROL3 +#define CYG_GDB_DEV_UTDR SA11X0_UART3_DATA +#define CYG_GDB_DEV_UTSR0 SA11X0_UART3_STATUS0 +#define CYG_GDB_DEV_UTSR1 SA11X0_UART3_STATUS1 +#define CYG_GDB_DEV_INT CYGNUM_HAL_INTERRUPT_UART3 +#endif + + +//----------------------------------------------------------------------------- +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + +// This ISR is called only for serial receive interrupts. This is true because +// we do not enable Tx FIFO interrupts (in hal_sa11x0_init_serial, below). +static int ISR_count, ISR_c; +int +cyg_hal_gdb_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs) +{ + cyg_uint8 c; + c = hal_sa11x0_get_char(); // Fetch the character + ISR_count++; ISR_c = c; + if( 3 == c ) { // ^C + // Ctrl-C: set a breakpoint at PC so GDB will display the + // correct program context when stopping rather than the + // interrupt handler. + cyg_hal_gdb_interrupt (regs->pc); + // Clear receiver idle status bit, to allow another interrupt to + // occur in the case where the receive fifo is almost empty. + *CYG_GDB_DEV_UTSR0 = SA11X0_UART_RX_IDLE; + } + cyg_drv_interrupt_acknowledge(CYG_GDB_DEV_INT); + return 0; // No need to run DSR +} + +int +hal_sa11x0_interruptible(int state) +{ + if (state) { + cyg_drv_interrupt_unmask(CYG_GDB_DEV_INT); + } else { + cyg_drv_interrupt_mask(CYG_GDB_DEV_INT); + } + return 0; +} +#endif + + +// Initialize the current serial port. +void hal_sa11x0_init_serial(unsigned long baudRate) +{ + cyg_uint32 brd; + + if (baudRate == 0) baudRate = CYGHWR_HAL_ARM_SA11X0_GDB_BAUD; + + // Disable Receiver and Transmitter (clears FIFOs) + *CYG_GDB_DEV_UTCR3 = SA11X0_UART_RX_DISABLED | + SA11X0_UART_TX_DISABLED; + + // Clear sticky (writable) status bits. + *CYG_GDB_DEV_UTSR0 = SA11X0_UART_RX_IDLE | + SA11X0_UART_RX_BEGIN_OF_BREAK | + SA11X0_UART_RX_END_OF_BREAK; + +#if 0 // later +#if CYGHWR_HAL_ARM_SA11X0_GDB_PORT == 1 + + //Set pin 14 as an output (Tx) and pin 15 as in input (Rx). + *SA11X0_REG_GPDR = (*SA11X0_REG_GPDR | SA11X0_GPIO_14) & ~SA11X0_GPIO_15; + + // Use GPIO 14 & 15 pins for serial port 1. + *SA11X0_REG_GAFR |= SA11X0_GPIO_14 | SA11X0_GPIO_15; + + // Pin reassignment for serial port 1. + *SA11X0_REG_PPAR |= SA11X0_UART_PIN_REASSIGNMENT_MASK; + +#endif +#endif + + // Set UART to 8N1 (8 data bits, no partity, 1 stop bit) + *CYG_GDB_DEV_UTCR0 = SA11X0_UART_PARITY_DISABLED | + SA11X0_UART_STOP_BITS_1 | + SA11X0_UART_DATA_BITS_8; + + // Set the desired baud rate. + brd = SA11X0_UART_BAUD_RATE_DIVISOR(baudRate); + *CYG_GDB_DEV_UTCR1 = (brd >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK; + *CYG_GDB_DEV_UTCR2 = brd & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK; + + // Enable the receiver (with interrupts) and the transmitter. + *CYG_GDB_DEV_UTCR3 = SA11X0_UART_RX_ENABLED | + SA11X0_UART_TX_ENABLED | + SA11X0_UART_RX_FIFO_INT_ENABLED; + +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + cyg_drv_interrupt_create(CYG_GDB_DEV_INT, + 99, // Priority - what goes here? + 0, // Data item passed to interrupt handler + cyg_hal_gdb_isr, + 0, + &gdb_interrupt_handle, + &gdb_interrupt); + cyg_drv_interrupt_attach(gdb_interrupt_handle); + cyg_drv_interrupt_unmask(CYG_GDB_DEV_INT); +#endif +} + +// Write C to the current serial port. +void hal_sa11x0_put_char(int c) +{ + // Wait for Tx FIFO not full + while ((*CYG_GDB_DEV_UTSR1 & SA11X0_UART_TX_FIFO_NOT_FULL) == 0) + ; + *CYG_GDB_DEV_UTDR = c; +} + +// Read one character from the current serial port. +// FIXME: shouldn't we check for PARITY_ERROR, FRAMING_ERROR, or +// RECEIVE_FIFO_OVERRUN_ERROR in the received data? This +// means check the appropriate bits in UTSR1. +int hal_sa11x0_get_char(void) +{ + long timeout = 1000000000; // A long time... + int c; + // If receive fifo is empty, block and wait for a new char. + while ((*CYG_GDB_DEV_UTSR1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) == 0) + if ( --timeout == 0 ) + return -1; + c = *CYG_GDB_DEV_UTDR; + // Clear receiver idle status bit, to allow another interrupt to + // occur in the case where the receive fifo is almost empty. + *CYG_GDB_DEV_UTSR0 = SA11X0_UART_RX_IDLE; + return c; +} + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +//----------------------------------------------------------------------------- +// End of plf_stub.c diff --git a/packages/hal/arm/sa11x0/var/current/src/sa11x0_misc.c b/packages/hal/arm/sa11x0/var/current/src/sa11x0_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/src/sa11x0_misc.c @@ -0,0 +1,299 @@ +//========================================================================== +// +// sa11x0_misc.c +// +// HAL misc board support code for StrongARM SA11x0 +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: hmt +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#include // base types +#include // tracing macros +#include // assertion macros + +#include // IO macros +#include // Register state info +#include +#include // Interrupt names +#include +#include // Hardware definitions + +#include // diag_printf + +// Most initialization has already been done before we get here. +// All we do here is set up the interrupt environment. +// FIXME: some of the stuff in hal_platform_setup could be moved here. + +externC void plf_hardware_init(void); + +void hal_hardware_init(void) +{ + // Mask all interrupts + *SA11X0_ICMR = 0; + + // Make all interrupts do IRQ and not FIQ + // FIXME: Change this if you use FIQs. + *SA11X0_ICLR = 0; + + // Prevent masked interrupts from bringing us out of idle mode + *SA11X0_ICCR = 1; + + // Disable all GPIO interrupt sources + *SA11X0_GPIO_RISING_EDGE_DETECT = 0; + *SA11X0_GPIO_FALLING_EDGE_DETECT = 0; + *SA11X0_GPIO_EDGE_DETECT_STATUS = 0x0FFFFFFF; + + // Perform any platform specific initializations + plf_hardware_init(); + + // Set up eCos/ROM interfaces + hal_if_init(); + + // Enable caches + HAL_DCACHE_ENABLE(); + HAL_ICACHE_ENABLE(); +} + + +// ------------------------------------------------------------------------- +static cyg_uint32 clock_period; + +void hal_clock_initialize(cyg_uint32 period) +{ + // Load match value + *SA11X0_OSMR0 = period; + clock_period = period; + + // Start the counter + *SA11X0_OSCR = 0; + + // Clear any pending interrupt + *SA11X0_OSSR = SA11X0_OSSR_TIMER0; + + // Enable timer 0 interrupt + *SA11X0_OIER |= SA11X0_OIER_TIMER0; + + // Unmask timer 0 interrupt + HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_TIMER0 ); + + // That's all. +} + +// This routine is called during a clock interrupt. + +// Define this if you want to ensure that the clock is perfect (i.e. does +// not drift). One reason to leave it turned off is that it costs some +// 1.5us per system clock interrupt for this maintenance. +#undef COMPENSATE_FOR_CLOCK_DRIFT + +void hal_clock_reset(cyg_uint32 vector, cyg_uint32 period) +{ +#ifdef COMPENSATE_FOR_CLOCK_DRIFT + cyg_int32 ctr = (cyg_int32)*SA11X0_OSCR; // Current value of the counter + ctr -= period; // Reset counter + if ((ctr < 0) || (ctr >= period)) ctr = 0; // Adjust for missed interrupts + *SA11X0_OSCR = ctr; + clock_period = period; +#else + *SA11X0_OSCR = 0; +#endif + *SA11X0_OSMR0 = period; // Load new match value + *SA11X0_OSSR = SA11X0_OSSR_TIMER0; // Clear any pending interrupt +} + +// Read the current value of the clock, returning the number of hardware +// "ticks" that have occurred (i.e. how far away the current value is from +// the start) + +// Note: The "contract" for this function is that the value is the number +// of hardware clocks that have happened since the last interrupt (i.e. +// when it was reset). This value is used to measure interrupt latencies. +// However, since the hardware counter does not automatically reset, as +// many do, the value may be larger than the system "tick" interval. +// If this turns out to be the case, the result will be adjusted to be +// within the interval [0..N-1], where N is the number of hardware clocks/tick. + +void hal_clock_read(cyg_uint32 *pvalue) +{ + cyg_uint32 ctr = *SA11X0_OSCR; + if (ctr > clock_period) ctr -= clock_period; + *pvalue = ctr; +} + +// ------------------------------------------------------------------------- + +// This routine is called to respond to a hardware interrupt (IRQ). It +// should interrogate the hardware and return the IRQ vector number. +int hal_IRQ_handler(void) +{ + cyg_uint32 sources, index; + +#if 0 // test FIQ and print alert if active - really for debugging + sources = *SA11X0_ICFP; + if ( 0 != sources ) + diag_printf( "FIQ source active!!! - fiqstatus %08x irqstatus %08x\n", + sources, *SA11X0_ICIP ); + else +#endif // Scan FIQ sources also + + sources = *SA11X0_ICIP; + +// FIXME +// if we come to support FIQ properly... +// if ( 0 == sources ) +// sources = *SA11X0_ICFP; + + // Nothing wrong with scanning them in any order we choose... + // So here we try to make the serial devices steal fewer cycles. + // So, knowing this is an ARM: + if ( sources & 0xff0000 ) + index = 16; + else if ( sources & 0xff00 ) + index = 8; + else if ( sources & 0xff ) + index = 0; + else // if ( sources & 0xff000000 ) + index = 24; + + do { + if ( (1 << index) & sources ) { + if (index == CYGNUM_HAL_INTERRUPT_GPIO) { + // Special case of GPIO cascade. Search for lowest set bit + sources = *SA11X0_GPIO_EDGE_DETECT_STATUS & 0x0FFFF800; + index = 11; + do { + if (sources & (1 << index)) { + index += 32; + break; + } + index++; + } while (index < 28); + } + return index; + } + index++; + } while ( index & 7 ); + + return CYGNUM_HAL_INTERRUPT_NONE; // This shouldn't happen! +} + +// +// Interrupt control +// + +void hal_interrupt_mask(int vector) +{ + // Non-GPIO interrupt sources can be masked separately. + // Note: masking any non-unique GPIO signal (31..11) results in + // all GPIO signals (31..11) being masked as only the "lump" + // source will be changed. + if (vector >= CYGNUM_HAL_INTERRUPT_GPIO11) { + vector = CYGNUM_HAL_INTERRUPT_GPIO; + } + *SA11X0_ICMR &= ~(1 << vector); +} + +void hal_interrupt_unmask(int vector) +{ + if (vector >= CYGNUM_HAL_INTERRUPT_GPIO11) { + vector = CYGNUM_HAL_INTERRUPT_GPIO; + } + *SA11X0_ICMR |= (1 << vector); +} + +void hal_interrupt_acknowledge(int vector) +{ + // GPIO interrupts are driven by an edge detection mechanism. This + // is latching so these interrupts must be acknowledged directly. + // All other interrupts simply go away when the interrupting unit + // has been serviced by the ISR. + if ((vector < CYGNUM_HAL_INTERRUPT_GPIO) || + (vector >= CYGNUM_HAL_INTERRUPT_GPIO11)) { + *SA11X0_GPIO_EDGE_DETECT_STATUS = (1 << (vector & 0x1F)); + } else { + // Not a GPIO interrupt + return; + } +} + +void hal_interrupt_configure(int vector, int level, int up) +{ + // This function can be used to configure the GPIO interrupts. All + // of these pins can potentially generate an interrupt, but only + // 0..10 are unique. Thus the discontinuity in the numbers. + // Also, if 'level' is true, then both edges are enabled if 'up' is + // true, otherwise they will be disabled. + // Non GPIO sources are ignored. + if ((vector < CYGNUM_HAL_INTERRUPT_GPIO) || + (vector >= CYGNUM_HAL_INTERRUPT_GPIO11)) { + if (level) { + if (up) { + // Enable both edges + *SA11X0_GPIO_RISING_EDGE_DETECT |= (1 << (vector & 0x1F)); + *SA11X0_GPIO_FALLING_EDGE_DETECT |= (1 << (vector & 0x1F)); + } else { + // Disable both edges + *SA11X0_GPIO_RISING_EDGE_DETECT &= ~(1 << (vector & 0x1F)); + *SA11X0_GPIO_FALLING_EDGE_DETECT &= ~(1 << (vector & 0x1F)); + } + } else { + // Only interested in one edge + if (up) { + // Set rising edge detect and clear falling edge detect. + *SA11X0_GPIO_RISING_EDGE_DETECT |= (1 << (vector & 0x1F)); + *SA11X0_GPIO_FALLING_EDGE_DETECT &= ~(1 << (vector & 0x1F)); + } else { + // Set falling edge detect and clear rising edge detect. + *SA11X0_GPIO_FALLING_EDGE_DETECT |= (1 << (vector & 0x1F)); + *SA11X0_GPIO_RISING_EDGE_DETECT &= ~(1 << (vector & 0x1F)); + } + } + } +} + +void hal_interrupt_set_level(int vector, int level) +{ + // Interrupt priorities are not configurable on the SA11X0. +} + +/*------------------------------------------------------------------------*/ +// EOF sa11x0_misc.c diff --git a/packages/hal/common/current/ChangeLog b/packages/hal/common/current/ChangeLog --- a/packages/hal/common/current/ChangeLog +++ b/packages/hal/common/current/ChangeLog @@ -697,6 +697,7 @@ 1999-04-27 Jesper Skov * src/PKGconf.mak: diff --git a/packages/io/serial/current/tests/ser_test_protocol.inl b/packages/io/serial/current/tests/ser_test_protocol.inl --- a/packages/io/serial/current/tests/ser_test_protocol.inl +++ b/packages/io/serial/current/tests/ser_test_protocol.inl @@ -131,6 +131,15 @@ # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV # endif #endif +#if defined(CYGPKG_HAL_ARM_SA11X0_ASSABET) \ + && defined(CYGPKG_IO_SERIAL_ARM_SA11X0) \ + && defined(CYGPKG_IO_SERIAL_ARM_SA11X0_SERIAL1) +# define TEST_CRASH_ID "assabet" +# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_SA11X0_SERIAL1_NAME +# if defined(CYGPKG_IO_SERIAL_TTY_TTY1) +# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV +# endif +#endif #if defined(CYGPKG_HAL_MIPS_TX39_JMR3904) \ && defined(CYGPKG_IO_SERIAL_TX39_JMR3904) \ && defined(CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0) diff --git a/packages/kernel/current/tests/dhrystone.c b/packages/kernel/current/tests/dhrystone.c --- a/packages/kernel/current/tests/dhrystone.c +++ b/packages/kernel/current/tests/dhrystone.c @@ -64,6 +64,8 @@ dtime(void) #define PASSES 100000 #elif defined(CYGPKG_HAL_ARM_EBSA285) #define PASSES 1000000 +#elif defined(CYGPKG_HAL_ARM_SA11X0) +#define PASSES 1000000 #elif defined(CYGPKG_HAL_ARM_CMA230) #define PASSES 100000 #elif defined(CYGPKG_HAL_V85X_V850_CEB) diff --git a/packages/language/c/libm/current/ChangeLog b/packages/language/c/libm/current/ChangeLog --- a/packages/language/c/libm/current/ChangeLog +++ b/packages/language/c/libm/current/ChangeLog @@ -155,6 +155,7 @@ 1999-04-06 Gary Thomas * include/pkgconf/libm.h: Remove unnecessary define diff --git a/packages/net/tcpip/current/ChangeLog b/packages/net/tcpip/current/ChangeLog --- a/packages/net/tcpip/current/ChangeLog +++ b/packages/net/tcpip/current/ChangeLog @@ -1,3 +1,8 @@ +2000-07-04 Hugo Tyson + + * include/bootp.h: Fix namespace pollution from "#define int32 + int" - it fights against application code too much. + 2000-06-26 Hugo Tyson * tests/ping_test.c (net_test): Added use of the diff --git a/packages/net/tcpip/current/include/bootp.h b/packages/net/tcpip/current/include/bootp.h --- a/packages/net/tcpip/current/include/bootp.h +++ b/packages/net/tcpip/current/include/bootp.h @@ -86,7 +86,7 @@ SOFTWARE. */ #ifdef __ECOS -#define int32 int +#include #else #include "bptypes.h" /* for int32, u_int32 */ #endif @@ -102,7 +102,11 @@ struct bootp { unsigned char bp_htype; /* hardware addr type */ unsigned char bp_hlen; /* hardware addr length */ unsigned char bp_hops; /* gateway hops */ - unsigned int32 bp_xid; /* transaction ID */ +#ifdef __ECOS + u_int32_t bp_xid; /* transaction ID */ +#else + unsigned int bp_xid; /* transaction ID */ +#endif unsigned short bp_secs; /* seconds since boot began */ unsigned short bp_flags; /* RFC1532 broadcast, etc. */ struct in_addr bp_ciaddr; /* client IP address */ @@ -295,13 +299,21 @@ struct bootp { struct cmu_vend { char v_magic[4]; /* magic number */ - unsigned int32 v_flags; /* flags/opcodes, etc. */ +#ifdef __ECOS + u_int32_t v_flags; /* flags/opcodes, etc. */ +#else + unsigned int32 v_flags; /* flags/opcodes, etc. */ +#endif struct in_addr v_smask; /* Subnet mask */ struct in_addr v_dgate; /* Default gateway */ struct in_addr v_dns1, v_dns2; /* Domain name servers */ struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */ struct in_addr v_ts1, v_ts2; /* Time servers */ - int32 v_unused[6]; /* currently unused */ +#ifdef __ECOS + int32_t v_unused[6]; /* currently unused */ +#else + int32 v_unused[6]; /* currently unused */ +#endif };