Mercurial > flash_v2
changeset 108:ff3f181b64bd ecos-sw-2000-07-04
Merge from eCos master repository on 2000-07-04-20:42:44-BST
line wrap: on
line diff
--- a/host/libcdl/ChangeLog +++ b/host/libcdl/ChangeLog @@ -1,3 +1,16 @@ +2000-07-04 Bart Veer <bartv@redhat.com> + + * 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 <bartv@redhat.com> * transact.cxx, cdlcore.hxx:
--- 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);
--- 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
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/sa11x0/current/ChangeLog @@ -0,0 +1,43 @@ +2000-06-29 Jesper Skov <jskov@redhat.com> + + * src/sa11x0_serial.h: + * src/sa11x0_serial.c: + Registers renamed. + +2000-06-22 Hugo Tyson <hmt@cygnus.co.uk> + + * cdl/<yournamehere>.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 <gthomas@redhat.com> + + * 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#### +//===========================================================================
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 <pkgconf/io_serial_arm_sa11x0.h>" + 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
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 <pkgconf/system.h> +#include <pkgconf/io_serial.h> +#include <pkgconf/io.h> +#include <pkgconf/kernel.h> + +#include <cyg/io/io.h> +#include <cyg/hal/hal_intr.h> +#include <cyg/io/devtab.h> +#include <cyg/io/serial.h> +#include <cyg/infra/diag.h> + +#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
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 <cyg/hal/hal_sa11x0.h> // 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
--- 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
--- 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
--- a/packages/hal/arm/pid/current/ChangeLog +++ b/packages/hal/arm/pid/current/ChangeLog @@ -1,3 +1,13 @@ +2000-07-04 Jesper Skov <jskov@redhat.com> + + * 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 <gthomas@redhat.com> * include/pkgconf/mlt_arm_pid9_ram.ldi:
--- 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 <pkgconf/hal_arm.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." + } + }
--- 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 <cyg/infra/cyg_type.h> +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include <cyg/hal/hal_if.h> + +#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 */
--- 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 <cyg/hal/arm_stub.h> // 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
--- 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
--- 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 <cyg/hal/hal_intr.h> // interrupt macros #include <cyg/hal/hal_io.h> // IO macros #include <cyg/hal/hal_diag.h> -#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS #include <cyg/hal/drv_api.h> -#include <cyg/hal/hal_stub.h> // 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 <cyg/hal/hal_if.h> // interface API +#include <cyg/hal/hal_misc.h> // 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/hal_stub.h> // 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 */
--- 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 <cyg/hal/hal_arch.h> // Register state info #include <cyg/hal/hal_diag.h> #include <cyg/hal/hal_intr.h> // necessary? +#include <cyg/hal/hal_if.h> // 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(); } //
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/assabet/current/ChangeLog @@ -0,0 +1,115 @@ +2000-06-27 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_sa11x0_assabet.cdl: Changed PORT values. + +2000-06-26 Jesper Skov <jskov@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <hal/assabet.h>. 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 <gthomas@redhat.com> + + * 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 <jld@redhat.com> + + * cdl/hal_arm_sa11x0_assabet.cdl: + + Fix calculation of CYGHWR_MEMORY_LAYOUT. + +2000-05-10 Gary Thomas <gthomas@redhat.com> + + * 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#### +//===========================================================================
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 <pkgconf/hal_arm.h>" + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H <pkgconf/hal_arm_sa11x0.h>" + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H <pkgconf/hal_arm_sa11x0_assabet.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 { + <PREFIX>/bin/gdb_module.bin : <PREFIX>/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" ? "<pkgconf/mlt_arm_sa11x0_assabet_ram.ldi>" : \ + "<pkgconf/mlt_arm_sa11x0_assabet_rom.ldi>" } + } + + 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" ? "<pkgconf/mlt_arm_sa11x0_assabet_ram.h>" : \ + "<pkgconf/mlt_arm_sa11x0_assabet_rom.h>" } + } + } + + 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." + } + +}
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 <cyg/hal/assabet.h> +// +//####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 */
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 <cyg/hal/hal_platform_ints.h> +// ... +// +// +//####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
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 <cyg/hal/hal_platform_setup.h> +// Only used by "vectors.S" +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include <pkgconf/system.h> // System-wide configuration info +#include CYGBLD_HAL_VARIANT_H // Variant (SA11x0) specific configuration +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include <cyg/hal/hal_sa11x0.h> // Variant specific hardware definitions +#include <cyg/hal/hal_mmu.h> // MMU definitions +#include <cyg/hal/assabet.h> // 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 */
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 <cyg/infra/cyg_type.h> +#include <stddef.h> + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x2000000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
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 +}
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 !
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 <cyg/infra/cyg_type.h> +#include <stddef.h> + +#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)
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 +}
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 !
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 <pkgconf/kernel.h> // Configuration header +#include <cyg/kernel/kapi.h> +#include <cyg/infra/diag.h> + +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_arch.h> // Register state info +#include <cyg/hal/hal_intr.h> // HAL interrupt macros + +#include <cyg/hal/hal_sa11x0.h> // Board definitions +#include <cyg/hal/assabet.h> + +#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()
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 <furrer@mit.edu> +// Date: 2000-05-21 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include <pkgconf/hal.h> +#include <pkgconf/system.h> +#include CYGBLD_HAL_PLATFORM_H + +#include <cyg/infra/cyg_type.h> // base types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_arch.h> // Register state info +#include <cyg/hal/hal_diag.h> +#include <cyg/hal/hal_intr.h> // Interrupt names +#include <cyg/hal/hal_cache.h> +#include <cyg/hal/hal_sa11x0.h> // Hardware definitions +#include <cyg/hal/assabet.h> // Platform specifics + +#include <cyg/infra/diag.h> // 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 +}
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
new file mode 100644 index 0000000000000000000000000000000000000000..33d735abe42645bfcd50902e079b4806685a075a GIT binary patch literal 128673 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%0A8qtRmrw9J^?|y;vzhQ0WQ+SuwJiNmd#+36o zZ8Me~o->MP?^eCa@lAM!67&JraP%Cy4QyVPo_os;$cJ*0=c<wR7)JXGY#y6q`|~$J zcsHqQbYA?vujqUwo-Kv?TcrE%PvLpz6_Cc!R^M0GGTai7!*0+$aZFA)4>1VmTFF?Q zo<%wu=@8RT<M&GOkj6ZSg8^;p<W6uS6mUF;=gK_=;~TE^92l&d@w?_l9IuAD7*FW0 z`(il6gFMgh`c-G}J07r0#>?~gc+Li`hjm|&?=%1(&)6R~o8x1!{-)A8S~u(|GOrz@ z#dd`};n|S6xR02ur{MgnEME>}N6!3b_1YAU_BMTo>CGl-{i;h^0!yn2(!x0%Xmc$* z;q$OG{3F0=d;;o=_cYfw>Xbh{Y(LtnFR*<F!u5f$7TXthIu-3MZq+GH0jDB&BXHy# zfOi%2t03*2M*{iD=?U!2LBvI0L|uV)Ut^t0Zp+w)Wxgw`|L5B>*2j4`PoZB$#-Iyu zuOd8Ka6Kj!@=o3RMc>rwFL;38I|<8aLvvMK_38BN>eEr&J=hN&=fQ`1H;o6qx#f$e znzsNP5B$%8wox~Uo`0=^Hml*bO1!of{2?v8w(4wW-h>CXO4wdy-h>4-+_zKsnoi+? zox;8c8u43CQkJT!fF4!KUZ{Gac}~@u)Bn@*H-TPi1HB~I8?5tK$5U_~66)VgxaNa< z<A8@~vbNJGk^9OTaUbk1Nq;y{4@2=ev>SWpKU>FYo9B>wEy$U9Uu+;Y4&C28hO9-B zv(yL3?erkdQ5*-|BBDIhL>|fbtsKbXG`T|^_h`~}A#D4&Csz&f2nTtHA6#7?vEA4} z|4Df)VDi|YrMBOt7NraxBr-SzGI$MTpr{kFP4io}ju6Jq?3Lv<v@yW@ICg%=tt~!! zPYu+sry;!@$OP>V?Ekhxe}HEgA1UVez0enOu^czM1n+u<z7aB-1JBX*tX?ubsABsy zYauN?qkmEKs?%Rxw~Bs;!_7Sv#pMpUg6AgIXE)*eZXB*x0W9jy2LTWBz8U%-?Jdy% zf_oJlcPqz_i-&$+$MI7}L7xoI^&>g{AUto<b3C5_G=kG7a{LS6Qb%)qBe?h^j!yzN z5!_^OTfp()G~i;v4FWe5Tz}vRH#o$P0T^&ol7Vk<Ib$ImaO1{td>y!XDI9Ma&+%I) z0L(<74cwsHIDQQ{kO3#$&heGtI>6Q4f%EVj{|q>N8u;MEbf6d9ph=J~xOi|$;3k6G z1a9_Zj&BF|Oa{l}$35B@?rU<UU5u9aY2^!z7ICt%$hlC=ww9Y6R-0G~ZgP4;LV{i# z&+fq(l{qyR0@>O5qP09;oMb3A8SSF6+)!jOmO#WLi?w*MIBTidQEW1oF9e{d1YM$D z9G;e!Elzioh~g-5YPkclDm0lLMv-Q_BvC)MWQ17cG+P{iB2F`ui-`$hqF%2T4Gu9O zaeP9`_|b`Yc=~hTDxl7stE2S=f3-%AmmSy5?@@i^(s)C!uiwb+@%XiS%OW2+zo=r& zv&Ah>Z!CE-am}Z_p4oX~+4U_SHLdyN@ME`5-_c{&@|Raej@)_nm)E^hTcUmKx^Km; zi>BQ7`aeETd%JqYk>dke&wN&vyZy-deKjAt3N~5#)^Ax{a{r~G@6R1DuAMng75j-L zqPY0BnD71>EqM2f<rD7Jnx~&hTkw(XzJ<U0;7r)WtRwuL-`7MRUc5c(+3&V&A7k0{ zO8U_QZ+@D3>8%&OupCQt&O4cLDEjD$yKej7k1yyyxoJH2d2Uti$NT#m8sFJ|{?#Ej z?%h`K_{KL5#XP%f=aW0t!-X~B^I!Qy(=fE9=gSW*w~p#P-8AQq*BN%-HnMa_ZQ6+? z5%+zndP_XK=@#ur-?(dDzHjjM9TCr-dFQFoM|MiTI}ll!bcu_3cuS8*<2Lm=^=9;< z2S(mjCOl>-`K4-J@t5aw7cVX{SOy)_8*658Mc@8yV}#`w&#DIQJ}*32xHsmX4WDc^ z=Cr)l=c}D>dzP<xz2oF{pA}6VdA#30mVda;IQ_`wIfhrV|C+mfyn}n|>C^f*kEA_& za@xlmkKI<b_k(9HpFjHHq89U{j!(*yGS@8pQ{&DB$L%Be$<5b=jh;U}>JJB&M}Ic) zzVMtsq^WP#YJ0xDTGSjEw%t^?t;Q<$I8yrhQ)di+?RDw%dp8~UWW)`d8n?c><>P(V z+_vqmRnf2NCd}LQ+Mg_M)Qhg2f7`L`onLEC?+E+#;g=mLSs#7%($d3E^t<U(-qrtv zy-&~LFRCY$Y`A?<S@f2<i|+4vsMnb%d_C6R{2~|i@{^G(Ca;faJN&fpkm+01^;h;p znC~epy7-rc#;W_0E!UonSX{nj;E^j$w|?lJd;f9m!D*i@w4QwZ(xq?Set6Q`uU+%e z!&?_fPai$Ha{ULt-Mi=5xV&#q&iwnrH$PZd_||iuMQp$0&g5679KSXC*z|!>FI|`x zmb~D8KJDFa7M#pKxp2!j50@t_d)u73ZkypR16-wV)g87DOFnJN+qhJ7Ff6O*o3Hm* z-!ST?@cg$Yyz%GZJ$JqGtGTb<$}ieB?|I+HdlC*cZudO-N&Iy$et!4XJte=n>D%IS zo1b3fj9Oo&{(VG`&37dCYOPrqY3p0ag+Dm$osF^g?>znDtuOy#+`t{0-#mQySJ7{O z)co2vCzcO6`DxE1hd*4Me)`DY+qZpYDt8?p{C@wpSKWQn>laQf-D+K$^;+DQbA>e( zi(-85O^7I+*HhKo_oVR=^NU68ANm#>G7ee#SDucl`}%P7$Fp7hj6K`JQVcgOeEwqp z1&!HR=Bb}9Ex&!*q7Pm?G56>vr9DrkwoN!TcGin;{r=BSzWMnBhhE8Q@om=+`gYf@ zwR_%pPrrWKtmmG7b!d2U;~VQEK7M~h;pem8S@_9~y8BDF?VM)Vs~%{&XTz=5TgJZK z^VQ!zta*3f$?&<}Z`32fzSgRTxDxpEn!JeOhwMVNdqdQ-p6!|j@6ldoAGyeJ?%sWF z{7vG}%s&+-8{ctES-1O%xi5YAw&lI%Pgk~FY#(&pK#mLnxTtZ%|3G!j)*9-IYN}r< zeh+=h^Yk6=7sB=N_$N7j1Gu+9SG7Gs<C30*egxdP=b+!%gXe!kzo^E2z8n_^{yH&! z96V0O%P7FDs~xJJ2tEvJx!I`d<_N=+z=xp&HyzxZ>bRkL@MW0lxHcG*Ud7=Y!R(hg zKJFFhGqys%x0TXWc|G(s*LBsOKKON~Q?CZ6`Y}kV9|;FPBy9MIuI~pjziJr#xf9%@ z;BZv12U4!5eQ!HvQcq!qgUmPG3gri`9^8>z{WPen_WH<U)li?RYBIQ?z8_28&%ghJ zziFiwgWWVL&uAzqGwK|bj{k-{67>4y<Rp<3MR9B=AASk?G0BPWMxT_NoR~BwF&SPZ zCMAsJME!pQEnR+2yTf1;MXuajY`q%X55@l<{Y6L78XyL0Ky*}e)Tmqj^<Q*UCP^{d zSZ1{?6LW0Vg*HQ3nbF4bAU3tbWTZy$@VpV?EQifnz7Wh~2t-HCN*hV+?QC<g&01lz z78~t$w8D)`j23G}nX%j<rdtiRl6bK|uNxgNW*Upcq<CT}>!PC)$Br94I%%X{KRP<< zzre&TqfiXdQIn1KVw<@F@8}pG9VPzDzv!shCbL~!Y<7sn)^dlzTy7Va7;Sb)R|GCZ zYbg<l%zJkdjE<6p_hY4`LoTLePEVUPMFawjm4>nki&3;&OC3uMHd+`JECU>^VA|I5 zkwu8h$Z*;*!hlTVOuE@FRv2ssiv`9k6;_)=Tw*p5q-nF$vP6fW0tYV`E;8658wa`G zL^MIk1NqYu^g6#RoOT#CA*8X=Y<FN5#W;i#?Iv?Y1&pL%0A;!wtC&z%c13ZvNx`1Y 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
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/brutus/current/ChangeLog @@ -0,0 +1,83 @@ +2000-06-26 Jesper Skov <jskov@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * include/hal_platform_setup.h: Adding ROM startup support. + +2000-06-05 Gary Thomas <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * include/hal_platform_setup.h: 'sa1100' stuff renamed to 'sa11x0'. + +2000-06-01 Gary Thomas <gthomas@redhat.com> + + * cdl/hal_arm_sa11x0_brutus.cdl: Adding ROM startup support. + +2000-05-12 John Dallaway <jld@redhat.com> + + * cdl/hal_arm_sa11x0_brutus.cdl: + + Fix calculation of CYGHWR_MEMORY_LAYOUT. + +2000-05-10 Gary Thomas <gthomas@redhat.com> + + * 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#### +//===========================================================================
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 <pkgconf/hal_arm.h>" + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H <pkgconf/hal_arm_sa11x0.h>" + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H <pkgconf/hal_arm_sa11x0_brutus.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 { + <PREFIX>/bin/gdb_module.bin : <PREFIX>/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" ? "<pkgconf/mlt_arm_sa11x0_brutus_ram.ldi>" : \ + "<pkgconf/mlt_arm_sa11x0_brutus_rom.ldi>" } + } + + 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" ? "<pkgconf/mlt_arm_sa11x0_brutus_ram.h>" : \ + "<pkgconf/mlt_arm_sa11x0_brutus_rom.h>" } + } + } + + 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." + } + +}
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 <cyg/hal/brutus.h> +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +/*---------------------------------------------------------------------------*/ +/* end of brutus.h */ +#endif /* CYGONCE_BRUTUS_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 <cyg/hal/hal_platform_ints.h> +// ... +// +// +//####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
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: Intel SA1110/Assabet platform specific support routines +// Description: +// Usage: #include <cyg/hal/hal_platform_setup.h> +// This file should only be used by "vectors.S" +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include <pkgconf/system.h> // System-wide configuration info +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include <cyg/hal/hal_sa11x0.h> // Platform specific hardware definitions +#include <cyg/hal/hal_mmu.h> // 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 */
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 <cyg/infra/cyg_type.h> +#include <stddef.h> + +#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)
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 +}
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 !
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 <cyg/infra/cyg_type.h> +#include <stddef.h> + +#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)
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 +}
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 !
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 <furrer@mit.edu> +// Date: 2000-05-21 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include <pkgconf/hal.h> +#include <pkgconf/system.h> +#include CYGBLD_HAL_PLATFORM_H + +#include <cyg/infra/cyg_type.h> // base types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_arch.h> // Register state info +#include <cyg/hal/hal_diag.h> +#include <cyg/hal/hal_intr.h> // Interrupt names +#include <cyg/hal/hal_cache.h> +#include <cyg/hal/hal_sa11x0.h> // Hardware definitions +#include <cyg/hal/brutus.h> // Platform specifics + +#include <cyg/infra/diag.h> // 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) +{ +}
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/var/current/ChangeLog @@ -0,0 +1,113 @@ +2000-06-30 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: calling i/f macro changes. + +2000-06-28 Jesper Skov <jskov@redhat.com> + + * 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 <jskov@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * src/hal_diag.c: Fix baud rates for 960,19200. Take out "announce" + string in ROM mode. + +2000-06-05 Gary Thomas <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * 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 <gthomas@redhat.com> + + * src/sa11x0_misc.c: Enable caches. + + * include/hal_sa1100.h: Misc cleanups and additions necessary for + ROM startup mode. + +2000-05-10 Gary Thomas <gthomas@redhat.com> + + * 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#### +//===========================================================================
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 + } + } + +}
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include <cyg/hal/hal_cache.h> +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_sa11x0.h> +#include <cyg/hal/hal_mmu.h> + +//----------------------------------------------------------------------------- +// 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
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 <cyg/hal/hal_diag.h> +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include <pkgconf/hal.h> + +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_if.h> + +/*---------------------------------------------------------------------------*/ + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include <cyg/hal/hal_if.h> + +#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 */
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__ */
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: Platform HAL stub support for Intel SA11x0 boards. +// Usage: #include <cyg/hal/plf_stub.h> +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include <pkgconf/hal.h> +#include <cyg/infra/cyg_type.h> // CYG_UNUSED_PARAM + +#include <cyg/hal/hal_sa11x0.h> // registers +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_intr.h> // Interrupt macros +#include <cyg/hal/arm_stub.h> // 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
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: HAL diagnostic output +// Description: Implementations of HAL diagnostic output support. +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include <pkgconf/hal.h> +#include <pkgconf/system.h> +#include CYGBLD_HAL_PLATFORM_H + +#include <cyg/infra/cyg_type.h> // base types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <cyg/hal/hal_arch.h> // basic machine info +#include <cyg/hal/hal_intr.h> // interrupt macros +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_if.h> // Calling interface definitions +#include <cyg/hal/hal_diag.h> +#include <cyg/hal/drv_api.h> // cyg_drv_interrupt_acknowledge +#include <cyg/hal/hal_misc.h> // Helper functions +#include <cyg/hal/hal_sa11x0.h> // 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/hal_stub.h> // 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 */
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: Platform specific code for GDB stub support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include <pkgconf/hal.h> +#include <pkgconf/system.h> +#include CYGBLD_HAL_PLATFORM_H + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include <cyg/hal/hal_stub.h> + +#include <cyg/hal/hal_io.h> // HAL IO macros +#include <cyg/hal/hal_sa11x0.h> // Hardware definitions +#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT +#include <cyg/hal/hal_intr.h> // HAL interrupt macros +#include <cyg/hal/drv_api.h> // 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
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 <furrer@mit.edu> +// Date: 2000-05-08 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include <pkgconf/hal.h> +#include <pkgconf/system.h> +#include CYGBLD_HAL_PLATFORM_H + +#include <cyg/infra/cyg_type.h> // base types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <cyg/hal/hal_io.h> // IO macros +#include <cyg/hal/hal_arch.h> // Register state info +#include <cyg/hal/hal_diag.h> +#include <cyg/hal/hal_intr.h> // Interrupt names +#include <cyg/hal/hal_cache.h> +#include <cyg/hal/hal_sa11x0.h> // Hardware definitions + +#include <cyg/infra/diag.h> // 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
--- a/packages/hal/common/current/ChangeLog +++ b/packages/hal/common/current/ChangeLog @@ -697,6 +697,7 @@ 1999-04-27 Jesper Skov <jskov@cygnus.c * include/pkgconf/hal.h: GDB_BREAK support now available for ARM targets. + 1999-04-16 Bart Veer <bartv@cygnus.co.uk> * src/PKGconf.mak:
--- 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)
--- 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)
--- a/packages/language/c/libm/current/ChangeLog +++ b/packages/language/c/libm/current/ChangeLog @@ -155,6 +155,7 @@ 1999-04-06 Gary Thomas <gthomas@cygnus * src/PKGconf.mak: More brute-force fix for ARM compiler problems - PR 19772 + 1999-03-31 Jonathan Larmour <jlarmour@cygnus.co.uk> * include/pkgconf/libm.h: Remove unnecessary define
--- a/packages/net/tcpip/current/ChangeLog +++ b/packages/net/tcpip/current/ChangeLog @@ -1,3 +1,8 @@ +2000-07-04 Hugo Tyson <hmt@cygnus.co.uk> + + * include/bootp.h: Fix namespace pollution from "#define int32 + int" - it fights against application code too much. + 2000-06-26 Hugo Tyson <hmt@cygnus.co.uk> * tests/ping_test.c (net_test): Added use of the
--- 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 <machine/types.h> #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 };
