# HG changeset patch # User jlarmour # Date 973286260 0 # Node ID d2f49caf9e38c23d4e1af4e1d91b1a0e49e767d2 # Parent 98d71f4d8243d02e59b0d32aa69d38e7e200f12a Merge from eCos master repository on 2000-11-03-09:00:49-GMT diff --git a/packages/ChangeLog b/packages/ChangeLog --- a/packages/ChangeLog +++ b/packages/ChangeLog @@ -1,7 +1,20 @@ +2000-11-01 Jesper Skov + + * ecos.db: Added cq7750 target and SH3/SH4 variant packages. Moved + EDK7708 package. + +2000-10-25 Drew Moseley + + * ecos.db: Add support for SA1100 Multimedia + 2000-10-20 Gary Thomas * ecos.db: Add FLASH drivers for PowerPC/MBX. +2000-10-20 Gary Thomas + + * ecos.db: Include FLASH drivers for all Cirrus Logic targets. + 2000-09-15 Jesper Skov * ecos.db: Made PID use generic 16x5x driver. @@ -9,6 +22,7 @@ 2000-09-15 Jesper Skov * ecos.db: Added generic 16x5x driver package. + * ecos.db: Use generic 16x5x driver for REF4955. 2000-09-06 Jesper Skov @@ -98,6 +112,10 @@ 2000-06-22 Jesper Skov + + * ecos.db: Removed REF4955 watchdog. Isn't supported on the board. + 2000-06-05 John Dallaway * ecos.db: @@ -128,10 +146,19 @@ 2000-05-25 John Dallaway + + * ecos.db: Added REF4955 serial driver package. + Added wallclock driver package. + 2000-05-16 Nick Garnett * ecos.db: Fixed naming bug in CYGPKG_LIBC_SETJMP entry. +2000-05-10 Jesper Skov + + * ecos.db: Added tx49 related packages. + 2000-04-26 Jesper Skov * ecos.db: ceb_v850 - include serial driver. diff --git a/packages/NEWS b/packages/NEWS --- a/packages/NEWS +++ b/packages/NEWS @@ -1,3 +1,11 @@ +* Added a port to the Toshiba MIPS TX49 chip, with the REF4955 reference + platform. This includes serial device driver and wallclock device driver + support. +* PowerPC 40x variant support added. +* Added SH4 support. Split SH architecture HAL into variants in the process. +* Added SH4/CQ7750 platform support [still untested] +* Port to Intel SA1100 Multimedia evalulation board added, including FLASH + driver and RedBoot support * FLASH driver added for PowerPC/MBX * sigsetjmp() and siglongjmp() added * A choice of getcwd() implementations have been added diff --git a/packages/compat/posix/current/ChangeLog b/packages/compat/posix/current/ChangeLog --- a/packages/compat/posix/current/ChangeLog +++ b/packages/compat/posix/current/ChangeLog @@ -1,3 +1,25 @@ +2000-11-02 Jonathan Larmour + + * src/signal.cxx (sigtimedwait): return signal number on success, + not 0 + (SIGNAL_RETURN_VALUE): New macro for returning from functions with + valid non-zero returns + (sigwaitinfo): Pass on sigtimedwait result with SIGNAL_RETURN_VALUE + macro as it may return the signal number. + +2000-11-01 Jonathan Larmour + + * src/signal.cxx (sigtimedwait): Check for SIGALRMs as a special + case when looping as it won't have been set pending if it was + masked. + (check_sigalarm): New function extracted from the posix signal ASR + (sigalrm_action): Unconditionally wake up threads waiting in sigwait + so that they can check for pending SIGALRMs even if they were + masked. + (cyg_deliver_signals): Handle SIG_DFL signals properly, and check + for bad signal handlers. + (cyg_posix_signal_start): Initialize default signal actions to SIG_DFL + 2000-10-27 Jesper Skov * tests/signal2.c (cause_illegal_access): Don't loop forever. diff --git a/packages/compat/posix/current/src/signal.cxx b/packages/compat/posix/current/src/signal.cxx --- a/packages/compat/posix/current/src/signal.cxx +++ b/packages/compat/posix/current/src/signal.cxx @@ -47,6 +47,7 @@ #include #include #include +#include #include // base kernel types #include // tracing macros @@ -80,6 +81,13 @@ CYG_MACRO_START return __retval; \ CYG_MACRO_END +// Similarly for functions that have valid non-zero returns +#define SIGNAL_RETURN_VALUE(val) \ +CYG_MACRO_START \ + CYG_REPORT_RETVAL( val ); \ + return val; \ +CYG_MACRO_END + // Range check on a signal value. #define SIGNAL_VALID(_sig_) (((_sig_) > 0) && ((_sig_) < ((int)sizeof(sigset_t)*8))) @@ -149,6 +157,12 @@ externC void cyg_posix_signal_start() siginfo[i].next = siginfo_next; siginfo_next = &siginfo[i]; } + + // initialize all signal actions to SIG_DFL + for ( unsigned int i=0; i<(sizeof(sigstate)/sizeof(signal_state)); i++ ) + { + sigstate[i].sa.sa_handler = SIG_DFL; + } // Clear the pending signal set sigemptyset( &sig_pending ); @@ -283,8 +297,7 @@ cyg_bool cyg_deliver_signals() signal_state *ss = &sigstate[signo]; sigset_t sigbit = 1L<sa.sa_handler != SIG_DFL && - ss->sa.sa_handler != SIG_IGN ) + if( ss->sa.sa_handler != SIG_IGN ) { sigset_t oldmask = self->sigmask; siginfo_t lsi; @@ -348,12 +361,23 @@ cyg_bool cyg_deliver_signals() if( ss->sa.sa_flags & SA_SIGINFO ) { // A sigaction delivery - + CYG_CHECK_FUNC_PTR( ss->sa.sa_sigaction, + "Bad sa_sigaction signal handler" ); ss->sa.sa_sigaction( signo, &lsi, NULL ); } + if ( ss->sa.sa_handler == SIG_DFL ) + { + // FIXME: should do something better here +#if CYGINT_ISO_EXIT + _exit( -signo ); +#endif + CYG_FAIL("Unhandled POSIX signal"); + } else { // This is a standard signal delivery. + CYG_CHECK_FUNC_PTR( ss->sa.sa_handler, + "Bad sa_handler signal handler" ); ss->sa.sa_handler( signo ); } @@ -386,14 +410,18 @@ static void sigalrm_action( Cyg_Alarm *a sigalrm_pending = true; sigemptyset( &mask ); sigaddset( &mask, SIGALRM ); + // Wake up any threads in sigsuspend() and sigwait() in case they + // are waiting for an alarm, and would have SIGALRM masked + signal_sigwait.broadcast(); + cyg_posix_pthread_release_thread( &mask ); } // ------------------------------------------------------------------------- -// signal ASR function. This is called from the general POSIX ASR to -// deal with any signal related issues. +// Check for SIGALRMs. This is called from the ASR and sigtimedwait() +// as alarms need to be handled as a special case. -externC void cyg_posix_signal_asr(pthread_info *self) +static __inline__ void check_sigalarm(void) { // If there is a pending SIGALRM, generate it if( sigalrm_pending ) @@ -409,12 +437,20 @@ externC void cyg_posix_signal_asr(pthrea // generate the signal cyg_sigqueue( &sev, SI_USER ); } +} + +// ------------------------------------------------------------------------- +// signal ASR function. This is called from the general POSIX ASR to +// deal with any signal related issues. + +externC void cyg_posix_signal_asr(pthread_info *self) +{ + check_sigalarm(); // Now call cyg_deliver_signals() to see if we can // handle any signals now. cyg_deliver_signals(); - } //========================================================================== @@ -560,7 +596,7 @@ externC int sigaction (int sig, const s // ------------------------------------------------------------------------- // Queue signal to process with value. -externC int sigqueue (pid_t pid, int sig, const union sigval value) +externC int sigqueue (pid_t pid, int sig, const union sigval value) { SIGNAL_ENTRY(); @@ -715,7 +751,7 @@ externC int sigwaitinfo (const sigset_t int ret = sigtimedwait( set, info, NULL ); - SIGNAL_RETURN(ret); + SIGNAL_RETURN_VALUE(ret); } // ------------------------------------------------------------------------- @@ -757,6 +793,10 @@ externC int sigtimedwait (const sigset_ } } else signal_sigwait.wait(); + + // Special case check for SIGALRM since the fact SIGALRM is masked + // would have prevented it being set pending in the alarm handler. + check_sigalarm(); } if( err == 0 ) @@ -821,7 +861,10 @@ externC int sigtimedwait (const sigset_ signal_mutex.unlock(); - SIGNAL_RETURN(err); + if (err) + SIGNAL_RETURN(err); + else + SIGNAL_RETURN_VALUE( info->si_signo ); } //========================================================================== diff --git a/packages/compat/uitron/current/ChangeLog b/packages/compat/uitron/current/ChangeLog --- a/packages/compat/uitron/current/ChangeLog +++ b/packages/compat/uitron/current/ChangeLog @@ -1,3 +1,8 @@ +2000-11-01 Jesper Skov + + * include/uit_func.inl: CYG_SCHED_UNIQUE_PRIORITIES changed to + CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES + 2000-09-13 Jonathan Larmour * include/uit_objs.hxx (CYG_UITRON_OBJS_INIT_PRIORITY): Define diff --git a/packages/compat/uitron/current/include/uit_func.inl b/packages/compat/uitron/current/include/uit_func.inl --- a/packages/compat/uitron/current/include/uit_func.inl +++ b/packages/compat/uitron/current/include/uit_func.inl @@ -463,7 +463,7 @@ ter_tsk ( ID tskid ) p->force_resume(); // let it run p->kill(); // and set prio high so it runs RIGHT NOW!! #ifdef CYGIMP_THREAD_PRIORITY -#if CYG_SCHED_UNIQUE_PRIORITIES != 0 +#if CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES != 0 // see if we are already at prio 0: if ( 0 == cyg_uitron_dis_dsp_old_priority ) // then dispatch is enabled, we are not at prio 0 @@ -475,7 +475,7 @@ ter_tsk ( ID tskid ) } Cyg_Scheduler::unlock(); #ifdef CYGIMP_THREAD_PRIORITY -#if CYG_SCHED_UNIQUE_PRIORITIES == 0 +#if CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES == 0 if ( (E_OK == ret) && (0 != cyg_uitron_dis_dsp_old_priority) ) { // then dispatching is disabled, so our prio is 0 too Cyg_Thread::yield(); // so let the dying thread run; diff --git a/packages/cygmon/current/ChangeLog b/packages/cygmon/current/ChangeLog --- a/packages/cygmon/current/ChangeLog +++ b/packages/cygmon/current/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * cdl/cygmon.cdl: Improve cygmon.elf make dependencies + 2000-10-17 Drew Moseley * misc/utils.c: Fix a typo. Also make sure we are ignoring the diff --git a/packages/cygmon/current/cdl/cygmon.cdl b/packages/cygmon/current/cdl/cygmon.cdl --- a/packages/cygmon/current/cdl/cygmon.cdl +++ b/packages/cygmon/current/cdl/cygmon.cdl @@ -96,7 +96,7 @@ cdl_package CYGPKG_CYGMON { This is handled by a rule in the target CDL." make -priority 320 { - /bin/cygmon.elf : /misc/ecos_bsp.c /misc/ecos_dummy.c /misc/cpu-mon.c /misc/monitor.c /misc/monitor_cmd.c /misc/ledit.c /misc/breakpoints.c /misc/bplist-dynamic.c /misc/utils.c /misc/generic_fmt32.c /misc/generic_mem.c /misc/bsp/common/bsp.c /misc/bsp/common/bsp_if.c /misc/bsp/common/shared-data.c /misc/bsp/common/sysinfo.c /misc/bsp/common/console-io.c /misc/bsp/common/debug-io.c /misc/bsp/common/sprintf.c /misc/bsp/common/syscall.c /misc/bsp/common/printf.c /misc/bsp/common/vprintf.c /misc/bsp/common/breakpoint.c /misc/bsp/common/singlestep.c /misc/bsp/common/generic-mem.c /misc/bsp/common/bsp_cache.c /misc/bsp/common/gdb-cpu.c /misc/bsp/common/hex-utils.c + /bin/cygmon.elf : $(PREFIX)/lib/target.ld $(PREFIX)/lib/vectors.o $(PREFIX)/lib/libtarget.a $(PREFIX)/lib/libextras.a /misc/ecos_bsp.c /misc/ecos_dummy.c /misc/cpu-mon.c /misc/monitor.c /misc/monitor_cmd.c /misc/ledit.c /misc/breakpoints.c /misc/bplist-dynamic.c /misc/utils.c /misc/generic_fmt32.c /misc/generic_mem.c /misc/bsp/common/bsp.c /misc/bsp/common/bsp_if.c /misc/bsp/common/shared-data.c /misc/bsp/common/sysinfo.c /misc/bsp/common/console-io.c /misc/bsp/common/debug-io.c /misc/bsp/common/sprintf.c /misc/bsp/common/syscall.c /misc/bsp/common/printf.c /misc/bsp/common/vprintf.c /misc/bsp/common/breakpoint.c /misc/bsp/common/singlestep.c /misc/bsp/common/generic-mem.c /misc/bsp/common/bsp_cache.c /misc/bsp/common/gdb-cpu.c /misc/bsp/common/hex-utils.c @sh -c "mkdir -p misc/bsp/common $(dir $@)" $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/ecos_bsp.o $(REPOSITORY)/$(PACKAGE)/misc/ecos_bsp.c $(CC) -c -I$(REPOSITORY)/$(PACKAGE)/misc $(INCLUDE_PATH) $(CFLAGS) -DHAVE_BSP -D__ECOS__ -o misc/ecos_dummy.o $(REPOSITORY)/$(PACKAGE)/misc/ecos_dummy.c diff --git a/packages/devs/flash/arm/sa1100mm/current/ChangeLog b/packages/devs/flash/arm/sa1100mm/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/ChangeLog @@ -0,0 +1,36 @@ +2000-10-25 Drew Moseley + + * src/sa1100mm_flash.c: New file. Support for SA1100 Multimedia + board. + * src/flash_query.c: Ditto. + * src/flash_program_buf.c: Ditto. + * src/flash_erase_block.c: Ditto. + * src/flash.h: Ditto. + * cdl/flash_sa1100mm.cdl: Ditto. + * ChangeLog: Ditto. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/devs/flash/arm/sa1100mm/current/cdl/flash_sa1100mm.cdl b/packages/devs/flash/arm/sa1100mm/current/cdl/flash_sa1100mm.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/cdl/flash_sa1100mm.cdl @@ -0,0 +1,82 @@ +# ==================================================================== +# +# flash_sa1100mm.cdl +# +# FLASH memory - Hardware support on StrongARM SA1100 Multimedia +# +# ==================================================================== +#####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): dmoseley +# Original data: gthomas +# Contributors: +# Date: 2000-10-25 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVS_FLASH_SA1100MM { + display "StrongARM SA1100 Multimedia FLASH memory support" + + parent CYGPKG_IO_FLASH + active_if CYGPKG_IO_FLASH + requires CYGPKG_HAL_ARM_SA11X0 + + implements CYGHWR_IO_FLASH_DEVICE + + include_dir . + include_files ; # none _exported_ whatsoever + description "FLASH memory device support for StrongARM SA1100 Multimedia" + compile sa1100mm_flash.c + + make -priority 1 { + flash_erase_block.o: $(REPOSITORY)/$(PACKAGE)/src/flash_erase_block.c + $(CC) -S $(INCLUDE_PATH) $(CFLAGS) -g0 -fno-function-sections $(REPOSITORY)/$(PACKAGE)/src/flash_erase_block.c + echo " .globl flash_erase_block_end" >>flash_erase_block.s + echo "flash_erase_block_end:" >>flash_erase_block.s + $(CC) -c -o flash_erase_block.o flash_erase_block.s + $(AR) rcs $(PREFIX)/lib/libtarget.a flash_erase_block.o + } + make -priority 1 { + flash_program_buf.o: $(REPOSITORY)/$(PACKAGE)/src/flash_program_buf.c + $(CC) -S $(INCLUDE_PATH) $(CFLAGS) -g0 -fno-function-sections $(REPOSITORY)/$(PACKAGE)/src/flash_program_buf.c + echo " .globl flash_program_buf_end" >>flash_program_buf.s + echo "flash_program_buf_end:" >>flash_program_buf.s + $(CC) -c -o flash_program_buf.o flash_program_buf.s + $(AR) rcs $(PREFIX)/lib/libtarget.a flash_program_buf.o + } + make -priority 1 { + flash_query.o: $(REPOSITORY)/$(PACKAGE)/src/flash_query.c + $(CC) -S $(INCLUDE_PATH) $(CFLAGS) -g0 -fno-function-sections $(REPOSITORY)/$(PACKAGE)/src/flash_query.c + echo " .globl flash_query_end" >>flash_query.s + echo "flash_query_end:" >>flash_query.s + $(CC) -c -o flash_query.o flash_query.s + $(AR) rcs $(PREFIX)/lib/libtarget.a flash_query.o + } +} + diff --git a/packages/devs/flash/arm/sa1100mm/current/src/flash.h b/packages/devs/flash/arm/sa1100mm/current/src/flash.h new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/src/flash.h @@ -0,0 +1,66 @@ +//========================================================================== +// +// flash.h +// +// Flash programming - device constants, 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, dmoseley +// Date: 2000-10-25 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#ifndef _FLASH_HWR_H_ +#define _FLASH_HWR_H_ + +// SA1100 Multimedia FLASH layout +// 2x 28F016SV +// each device is 16x1M organized as 32x128K blocks + +#define FLASH_Read_ID 0x00900090 +#define FLASH_Read_Status 0x00700070 +#define FLASH_Clear_Status 0x00500050 +#define FLASH_Status_Ready 0x00800080 +#define FLASH_Program 0x00100010 +#define FLASH_Block_Erase 0x00200020 +#define FLASH_Confirm 0x00D000D0 +#define FLASH_Reset 0xFFFFFFFF + +#define FLASH_BLOCK_SIZE 0x40000 + +#define FLASH_Intel_code 0x89 +#define FLASH_28F016SV_low 0xA0 +#define FLASH_28F016SV_hi 0x66 + +#endif // _FLASH_HWR_H_ diff --git a/packages/devs/flash/arm/sa1100mm/current/src/flash_erase_block.c b/packages/devs/flash/arm/sa1100mm/current/src/flash_erase_block.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/src/flash_erase_block.c @@ -0,0 +1,86 @@ +//========================================================================== +// +// flash_erase_block.c +// +// Flash programming +// +//========================================================================== +//####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, dmoseley +// Date: 2000-07-14 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include "flash.h" + +#include +#include +#include + +// +// CAUTION! This code must be copied to RAM before execution. Therefore, +// it must not contain any code which might be position dependent! +// + +int +flash_erase_block(volatile unsigned long *block) +{ + unsigned long stat; + int timeout = 5000000; + int cache_on; + + HAL_DCACHE_IS_ENABLED(cache_on); + if (cache_on) { + HAL_DCACHE_SYNC(); + HAL_DCACHE_DISABLE(); + } + + // Clear any error conditions + *block = FLASH_Clear_Status; + + // Set to erase + *block = FLASH_Block_Erase; + *block = FLASH_Confirm; + while(((stat = *block) & FLASH_Status_Ready) != FLASH_Status_Ready) { + if (--timeout == 0) break; + } + + // Restore ROM to "normal" mode + *block = FLASH_Reset; + + if (cache_on) { + HAL_DCACHE_ENABLE(); + } + + return stat; +} diff --git a/packages/devs/flash/arm/sa1100mm/current/src/flash_program_buf.c b/packages/devs/flash/arm/sa1100mm/current/src/flash_program_buf.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/src/flash_program_buf.c @@ -0,0 +1,94 @@ +//========================================================================== +// +// flash_program_buf.c +// +// Flash programming +// +//========================================================================== +//####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, dmoseley +// Date: 2000-07-14 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include "flash.h" + +#include +#include +#include + +// +// CAUTION! This code must be copied to RAM before execution. Therefore, +// it must not contain any code which might be position dependent! +// + +int +flash_program_buf(volatile unsigned long *addr, unsigned long *data, int len) +{ + unsigned long stat = 0; + int timeout = 5000000; + int cache_on; + volatile unsigned long *orig_addr = addr; + + HAL_DCACHE_IS_ENABLED(cache_on); + if (cache_on) { + HAL_DCACHE_SYNC(); + HAL_DCACHE_DISABLE(); + } + + // Clear any error conditions + *addr = FLASH_Clear_Status; + + while (len > 0) { + *addr = FLASH_Program; + *addr = *data++; + timeout = 5000000; + while (((stat = *addr) & FLASH_Status_Ready) != FLASH_Status_Ready) { + if (--timeout == 0) { + goto bad; + } + } + addr++; + len -= sizeof(unsigned long); + } + + // Restore ROM to "normal" mode + bad: + *orig_addr = FLASH_Reset; + + if (cache_on) { + HAL_DCACHE_ENABLE(); + } + + return stat; +} diff --git a/packages/devs/flash/arm/sa1100mm/current/src/flash_query.c b/packages/devs/flash/arm/sa1100mm/current/src/flash_query.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/src/flash_query.c @@ -0,0 +1,86 @@ +//========================================================================== +// +// flash_query.c +// +// Flash programming - query device +// +//========================================================================== +//####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, dmoseley +// Date: 2000-07-26 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include "flash.h" + +#include +#include +#include + +// +// CAUTION! This code must be copied to RAM before execution. Therefore, +// it must not contain any code which might be position dependent! +// + +#define CNT 20*1000*10 // Approx 200ms + +int +flash_query(unsigned char *data) +{ + volatile unsigned long *lROM; + volatile unsigned char *cROM; + int i, cnt; + int cache_on; + + HAL_DCACHE_IS_ENABLED(cache_on); + if (cache_on) { + HAL_DCACHE_SYNC(); + HAL_DCACHE_DISABLE(); + } + + lROM = (unsigned long *)0x08000000; + cROM = (unsigned char *)0x08000000; + + lROM[0] = FLASH_Read_ID; + for (cnt = CNT; cnt > 0; cnt--) ; + for (i = 0; i < 8; i++) { + *data++ = cROM[i]; + } + lROM[0] = FLASH_Reset; + + if (cache_on) { + HAL_DCACHE_ENABLE(); + } + + return 0; +} diff --git a/packages/devs/flash/arm/sa1100mm/current/src/sa1100mm_flash.c b/packages/devs/flash/arm/sa1100mm/current/src/sa1100mm_flash.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/arm/sa1100mm/current/src/sa1100mm_flash.c @@ -0,0 +1,117 @@ +//========================================================================== +// +// sa1100mm_flash.c +// +// Flash programming +// +//========================================================================== +//####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, dmoseley +// Date: 2000-07-26 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include +#include + +#define _FLASH_PRIVATE_ +#include + +#include "flash.h" + +int +flash_hwr_init(void) +{ + unsigned char data[96]; + extern char flash_query, flash_query_end; + typedef int code_fun(unsigned char *); + code_fun *_flash_query; + int code_len, stat, num_regions, region_size; + + // Copy 'program' code to RAM for execution + code_len = (unsigned long)&flash_query_end - (unsigned long)&flash_query; + _flash_query = (code_fun *)flash_info.work_space; + memcpy(_flash_query, &flash_query, code_len); + HAL_DCACHE_SYNC(); // Should guarantee this code will run + HAL_ICACHE_DISABLE(); // is also required to avoid old contents + + stat = (*_flash_query)(data); + + HAL_ICACHE_ENABLE(); + + if ((data[0] == FLASH_Intel_code) && + (data[4] == FLASH_28F016SV_low) && + (data[5] == FLASH_28F016SV_hi)) { + num_regions = 32; + region_size = 0x20000; + flash_info.block_size = region_size; + flash_info.blocks = num_regions; + flash_info.start = (void *)0x08000000; + flash_info.end = (void *)(0x08000000+(num_regions*region_size)); + return FLASH_ERR_OK; + } else { + printf("Can't identify FLASH, sorry\n"); + diag_dump_buf(data, sizeof(data)); + return FLASH_ERR_HWR; + } +} + +// Map a hardware status to a package error +int +flash_hwr_map_error(int err) +{ + if (err & 0x7E) { + if (err & 0x10) { + return FLASH_ERR_PROGRAM; + } else + if (err & 0x20) { + return FLASH_ERR_ERASE; + } else + return FLASH_ERR_HWR; // FIXME + } else { + return FLASH_ERR_OK; + } +} + +// See if a range of FLASH addresses overlaps currently running code +bool +flash_code_overlaps(void *start, void *end) +{ + extern char _stext, _etext; + + return ((((unsigned long)&_stext >= (unsigned long)start) && + ((unsigned long)&_stext < (unsigned long)end)) || + (((unsigned long)&_etext >= (unsigned long)start) && + ((unsigned long)&_etext < (unsigned long)end))); +} diff --git a/packages/devs/serial/mips/ref4955/current/ChangeLog b/packages/devs/serial/mips/ref4955/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/serial/mips/ref4955/current/ChangeLog @@ -0,0 +1,58 @@ +2000-09-18 Jesper Skov + + * cdl/ser_mips_ref4955.cdl: Use CDL to specify testing parameters. + + * include/mips_tx49_ref4955_ser.inl: Follow type naming changes in + generic driver. + +2000-09-14 Jesper Skov + + * include/mips_tx49_ref4955_ser.inl: Use with generic 16x5x serial + driver. + * src/ref4955_serial.c: Deleted. + * src/ref4955_serial.h: Deleted. + * cdl/ser_mips_ref4955.cdl: Changed accordingly. + +2000-08-01 Jonathan Larmour + + * src/ref4955_serial.c (pc_serial_set_config): Now use keys to make + more flexible. + +2000-06-22 Hugo Tyson + + * cdl/.cdl: Remove the comment on the empty + include_files directive; the tools now support this correctly. + This keeps internal include files internal. + +2000-05-25 Jesper Skov + + * cdl/ser_mips_ref4955.cdl: + * src/ref4955_serial.h: + * src/ref4955_serial.c: + REF4955 serial driver. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/devs/serial/mips/ref4955/current/cdl/ser_mips_ref4955.cdl b/packages/devs/serial/mips/ref4955/current/cdl/ser_mips_ref4955.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/serial/mips/ref4955/current/cdl/ser_mips_ref4955.cdl @@ -0,0 +1,175 @@ +# ==================================================================== +# +# ser_mips_ref4955.cdl +# +# eCos serial MIPS/REF4955 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): jskov +# Original data: gthomas +# Contributors: +# Date: 2000-05-24 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + + +cdl_package CYGPKG_IO_SERIAL_MIPS_REF4955 { + display "REF4955 serial device drivers" + + parent CYGPKG_IO_SERIAL_DEVICES + active_if CYGPKG_IO_SERIAL + active_if CYGPKG_HAL_MIPS_TX49_REF4955 + + requires CYGPKG_ERROR + include_dir cyg/io + + description " + This option enables the serial device drivers for the + REF4955." + doc redirect/ecos-device-drivers.html + + # FIXME: This really belongs in the GENERIC_16X5X package + cdl_interface CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED { + display "Generic 16x5x serial driver required" + } + + define_proc { + puts $::cdl_system_header "/***** serial driver proc output start *****/" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_INL " + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG " + puts $::cdl_system_header "/***** serial driver proc output end *****/" + } + + cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 { + display "REF4955 serial port 0 driver" + flavor bool + default_value 1 + description " + This option includes the serial device driver for the + REF4955 port 0." + + implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED +# implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW +# implements CYGINT_IO_SERIAL_LINE_STATUS_HW + + cdl_option CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME { + display "Device name for the REF4955 serial port 0 driver" + flavor data + default_value {"\"/dev/ser0\""} + description " + This option sets the name of the serial device for the + REF4955 port 0." + } + + cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD { + display "Baud rate for the REF4955 serial port 0 driver" + flavor data + legal_values { 1200 2400 4800 9600 14400 19200 38400 57600 115200} + default_value 38400 + description " + This option specifies the default baud rate (speed) + for the REF4955 port 0." + } + + cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE { + display "Buffer size for the REF4955 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 REF4955 port 0." + } + } + + cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL1 { + display "REF4955 serial port 1 driver" + flavor bool + default_value 1 + description " + This option includes the serial device driver for the + REF4955 port 1." + + implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED +# implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW +# implements CYGINT_IO_SERIAL_LINE_STATUS_HW + + cdl_option CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL1_NAME { + display "Device name for the REF4955 serial port 1 driver" + flavor data + default_value {"\"/dev/ser1\""} + description " + This option specifies the name of serial device for + the REF4955 port 1." + } + + cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD { + display "Baud rate for the REF4955 serial port 1 driver" + flavor data + legal_values { 1200 2400 4800 9600 14400 19200 38400 57600 115200} + default_value 38400 + description " + This option specifies the default baud rate (speed) + for the REF4955 port 1." + } + + cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE { + display "Buffer size for the REF4955 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 REF4955 port 1." + } + } + + + cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_TESTING { + display "Testing parameters" + flavor bool + calculated 1 + active_if CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 + + cdl_option CYGPRI_SER_TEST_SER_DEV { + display "Serial device used for testing" + flavor data + default_value { CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME } + } + + define_proc { + puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"ref4955\"" + puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" + } + } +} + +# EOF ser_mips_ref4955.cdl diff --git a/packages/devs/serial/mips/ref4955/current/include/mips_tx49_ref4955_ser.inl b/packages/devs/serial/mips/ref4955/current/include/mips_tx49_ref4955_ser.inl new file mode 100644 --- /dev/null +++ b/packages/devs/serial/mips/ref4955/current/include/mips_tx49_ref4955_ser.inl @@ -0,0 +1,168 @@ +//========================================================================== +// +// devs/serial/mips/ref4955/src/mips_tx49_ref4955_ser.inl +// +// REF4955 Serial I/O definitions. +// +//========================================================================== +//####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): jskov +// Contributors:gthomas, jskov +// Date: 2000-05-24 +// Purpose: REF4955 Serial definitions +//####DESCRIPTIONEND#### +//========================================================================== + +#include + +//----------------------------------------------------------------------------- +// There are two serial ports. +#define CYG_DEVICE_SERIAL_SCC1 0xb40003f8 // port 1 +#define CYG_DEVICE_SERIAL_SCC2 0xb40002f8 // port 2 + +//----------------------------------------------------------------------------- +// The REF4955 board has a 14.318 MHz crystal, but the PC87338 part +// uses a 24MHz internal clock for baud rate calculation. +#define BAUD_DIVISOR(_x_) 24000000/13/16/(_x_) + +static unsigned short select_baud[] = { + 0, // Unused + 0, // 50 + 0, // 75 + 0, // 110 + 0, // 134.5 + 0, // 150 + 0, // 200 + 0, // 300 + 0, // 600 + BAUD_DIVISOR(1200), + 0, // 1800 + BAUD_DIVISOR(2400), + 0, // 3600 + BAUD_DIVISOR(4800), + 0 , // 7200 + BAUD_DIVISOR(9600), + BAUD_DIVISOR(14400), + BAUD_DIVISOR(19200), + BAUD_DIVISOR(38400), + BAUD_DIVISOR(57600), + BAUD_DIVISOR(115200), + 0, // 230400 +}; + +//----------------------------------------------------------------------------- +// Port 0 descriptors + +#ifdef CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 +static pc_serial_info pc_serial_info0 = {CYG_DEVICE_SERIAL_SCC1, + CYGNUM_HAL_INTERRUPT_DEBUG_UART}; +#if CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE > 0 +static unsigned char pc_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE]; +static unsigned char pc_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(pc_serial_channel0, + pc_serial_funs, + pc_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &pc_serial_out_buf0[0], + sizeof(pc_serial_out_buf0), + &pc_serial_in_buf0[0], + sizeof(pc_serial_in_buf0) + ); +#else +static SERIAL_CHANNEL(pc_serial_channel0, + pc_serial_funs, + pc_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(pc_serial_io0, + CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME, + 0, // Does not depend on a lower level interface + &cyg_io_serial_devio, + pc_serial_init, + pc_serial_lookup, // Serial driver may need initializing + &pc_serial_channel0 + ); +#endif + +//----------------------------------------------------------------------------- +// Port 1 descriptors + +#ifdef CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL1 +static pc_serial_info pc_serial_info1 = {CYG_DEVICE_SERIAL_SCC2, + CYGNUM_HAL_INTERRUPT_USER_UART}; +#if CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE > 0 +static unsigned char pc_serial_out_buf1[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE]; +static unsigned char pc_serial_in_buf1[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(pc_serial_channel1, + pc_serial_funs, + pc_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &pc_serial_out_buf1[0], + sizeof(pc_serial_out_buf1), + &pc_serial_in_buf1[0], + sizeof(pc_serial_in_buf1) + ); +#else +static SERIAL_CHANNEL(pc_serial_channel1, + pc_serial_funs, + pc_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(pc_serial_io1, + CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL1_NAME, + 0, // Does not depend on a lower level interface + &cyg_io_serial_devio, + pc_serial_init, + pc_serial_lookup, // Serial driver may need initializing + &pc_serial_channel1 + ); +#endif + +// EOF mips_tx49_ref4955_ser.inl diff --git a/packages/devs/wallclock/mips/ref4955/current/ChangeLog b/packages/devs/wallclock/mips/ref4955/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/wallclock/mips/ref4955/current/ChangeLog @@ -0,0 +1,40 @@ +2000-05-26 Jesper Skov + + * cdl/wallclock_ref4955.cdl: + * src/wallclock_ref4955.cxx: + * src/ds1742.inl: [deleted] + Added set-get mode. Moved Dallas driver to its own package. + +2000-05-25 Jesper Skov + + * cdl/wallclock_ref4955.cdl: + * src/wallclock_ref4955.cxx: + * src/ds1742.inl: + Added wallclock driver REF4955 (Dallas 1742) + (set_ds_hwclock): Clear frequency test bit. + +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### + + diff --git a/packages/devs/wallclock/mips/ref4955/current/cdl/wallclock_ref4955.cdl b/packages/devs/wallclock/mips/ref4955/current/cdl/wallclock_ref4955.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/wallclock/mips/ref4955/current/cdl/wallclock_ref4955.cdl @@ -0,0 +1,93 @@ +# ==================================================================== +# +# wallclock_ref4955.cdl +# +# eCos wallclock for REF4955 driver 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): jskov +# Contributors: jskov +# Date: 2000-05-25 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVICES_WALLCLOCK_MIPS_REF4955 { + parent CYGPKG_IO_WALLCLOCK + active_if CYGPKG_IO_WALLCLOCK + display "REF4955 wallclock driver" + requires CYGPKG_DEVICES_WALLCLOCK_DALLAS_DS1742 + requires CYGPKG_HAL_MIPS_TX49_REF4955 + hardware + compile wallclock_ref4955.cxx + implements CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS + implements CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED + active_if CYGIMP_WALLCLOCK_HARDWARE + + cdl_option CYGIMP_WALLCLOCK_HARDWARE { + parent CYGPKG_IO_WALLCLOCK_IMPLEMENTATION + display "Hardware wallclock" + default_value 1 + implements CYGINT_WALLCLOCK_IMPLEMENTATIONS + } + + cdl_component CYGPKG_DEVICES_WALLCLOCK_MIPS_REF4955_OPTIONS { + display "REF4955 wallclock 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_DEVICES_WALLCLOCK_MIPS_REF4955_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the wallclock device. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_DEVICES_WALLCLOCK_MIPS_REF4955_CFLAGS_REMOVE { + display "Suppressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the wallclock device. These flags are removed from + the set of global flags if present." + } + + } +} diff --git a/packages/devs/wallclock/mips/ref4955/current/src/wallclock_ref4955.cxx b/packages/devs/wallclock/mips/ref4955/current/src/wallclock_ref4955.cxx new file mode 100644 --- /dev/null +++ b/packages/devs/wallclock/mips/ref4955/current/src/wallclock_ref4955.cxx @@ -0,0 +1,114 @@ +//========================================================================== +// +// devs/wallclock/mips/ref4955/ref4955.cxx +// +// Wallclock implementation +// +//========================================================================== +//####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): jskov +// Contributors: jskov +// Date: 2000-05-25 +// Purpose: Wallclock driver for REF4955 +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include // Kernel config +#include // Wallclock device config + +#include // IO macros +#include // Common type definitions and support + +#include // The WallClock API +#include // Helpers + +#include // For debugging + +// REF4955 has a Dallas 1742W part. +#define DS_BASE 0xb5000000 +#include + +//----------------------------------------------------------------------------- +// Functions required for the hardware-driver API. + +// Returns the number of seconds elapsed since 1970-01-01 00:00:00. +cyg_uint32 +Cyg_WallClock::get_hw_seconds(void) +{ + cyg_uint32 year, month, mday, hour, minute, second; + + get_ds_hwclock(&year, &month, &mday, &hour, &minute, &second); + +#if 0 + // This will cause the test to eventually fail due to these printouts + // causing timer interrupts to be lost... + diag_printf("year %02d\n", year); + diag_printf("month %02d\n", month); + diag_printf("mday %02d\n", mday); + diag_printf("hour %02d\n", hour); + diag_printf("minute %02d\n", minute); + diag_printf("second %02d\n", second); +#endif + + cyg_uint32 now = _simple_mktime(year, month, mday, hour, minute, second); + return now; +} + +#ifdef CYGSEM_WALLCLOCK_SET_GET_MODE + +// Sets the clock. Argument is seconds elapsed since 1970-01-01 00:00:00. +void +Cyg_WallClock::set_hw_seconds( cyg_uint32 secs ) +{ + cyg_uint32 year, month, mday, hour, minute, second; + + _simple_mkdate(secs, &year, &month, &mday, &hour, &minute, &second); + + set_ds_hwclock(year, month, mday, hour, minute, second); +} + +#endif + +void +Cyg_WallClock::init_hw_seconds(void) +{ +#ifdef CYGSEM_WALLCLOCK_SET_GET_MODE + init_ds_hwclock(); +#else + // This is our base: 1970-01-01 00:00:00 + // Set the HW clock - if for nothing else, just to be sure it's in a + // legal range. Any arbitrary base could be used. + // After this the hardware clock is only read. + set_ds_hwclock(1970,1,1,0,0,0); +#endif +} + +//----------------------------------------------------------------------------- +// End of devs/wallclock/mips/ref4955/wallclock_ref4955.cxx diff --git a/packages/ecos.db b/packages/ecos.db --- a/packages/ecos.db +++ b/packages/ecos.db @@ -124,6 +124,16 @@ package CYGPKG_DEVS_FLASH_EBSA285 { on the StrongARM EBSA-285 platform." } +package CYGPKG_DEVS_FLASH_SA1100MM { + alias { "FLASH memory support for StrongARM SA1100 Multimedia" flash_sa1100mm } + directory devs/flash/arm/sa1100mm + script flash_sa1100mm.cdl + hardware + description " + This package contains hardware support for FLASH memory + on the StrongARM SA1100 Multimedia platform." +} + package CYGPKG_DEVS_FLASH_EDB7XXX { alias { "FLASH memory support for Cirrus Logic EDB7xxx" flash_edb7xxx } directory devs/flash/arm/edb7xxx @@ -250,6 +260,15 @@ package CYGPKG_IO_SERIAL_TX39_JMR3904 { } +package CYGPKG_IO_SERIAL_MIPS_REF4955 { + alias { "TX49 REF4955 serial device drivers" + devs_serial_mips_ref4955 ref4955_serial_driver } + hardware + directory devs/serial/mips/ref4955 + script ser_mips_ref4955.cdl + description "TX49 REF4955 serial device drivers" +} + package CYGPKG_IO_SERIAL_MIPS_VRC4373 { alias { "VRC4373 serial device drivers" devs_serial_mips_vrc4373 vrc4373_serial_driver } @@ -460,6 +479,15 @@ package CYGPKG_DEVICES_WALLCLOCK_DALLAS_ the Dallas 1742 wallclock." } +package CYGPKG_DEVICES_WALLCLOCK_MIPS_REF4955 { + alias { "Wallclock driver for REF4955 board" devices_wallclock_ref4955 device_wallclock_ref4955 } + directory devs/wallclock/mips/ref4955 + script wallclock_ref4955.cdl + hardware + description " + This package provides a wallclock driver implementation for the + Toshiba REF4955 board." +} package CYGPKG_DEVICES_WATCHDOG_ARM_AEB { @@ -768,6 +796,17 @@ package CYGPKG_HAL_ARM_SA11X0_BRUTUS { The BRUTUS HAL package provides the support needed to run eCos on a Intel StrongARM SA1110 evaulation board (brutus)." } + +package CYGPKG_HAL_ARM_SA11X0_SA1100MM { + alias { "Intel SA1100 Multimedia eval board" hal_arm_sa11x0_sa1100mm } + directory hal/arm/sa11x0/sa1100mm + script hal_arm_sa11x0_sa1100mm.cdl + hardware + description " + The MULTIMEDIA HAL package provides the support needed to run + eCos on a Intel StrongARM SA1110 Multimedia evaluation board." +} + package CYGPKG_HAL_ARM_EDB7XXX { alias { "Cirrus Logic development board" hal_arm_edb7xxx arm_edb7xxx_hal } directory hal/arm/edb7xxx @@ -798,17 +837,37 @@ package CYGPKG_HAL_SH { description " The SH (SuperH) architecture HAL package provides generic support for this processor architecture. It is also - necessary to select a specific target platform HAL - package." + necessary to select variant and target platform HAL + packages." +} + +package CYGPKG_HAL_SH_SH3 { + alias { "SH3 architecture" hal_sh_sh3 } + directory hal/sh/sh3 + script hal_sh_sh3.cdl + hardware + description " + The SH3 (SuperH 3) variant HAL package provides generic + support for SH3 variant CPUs." +} + +package CYGPKG_HAL_SH_SH4 { + alias { "SH4 architecture" hal_sh_sh4 } + directory hal/sh/sh4 + script hal_sh_sh4.cdl + hardware + description " + The SH4 (SuperH 4) variant HAL package provides generic + support for SH4 variant CPUs." } package CYGPKG_HAL_SH_EDK7708 { alias { "Hitachi SH7708 board" hal_sh_edk sh_edk_hal } - directory hal/sh/edk + directory hal/sh/edk7708 script hal_sh_edk7708.cdl hardware description " - The edk HAL package provides the support needed to run + This SH HAL package provides the support needed to run eCos on a Hitachi SH3 EDK7708 board." } package CYGPKG_HAL_SH_SH7708_CQ7708 { @@ -817,10 +876,19 @@ package CYGPKG_HAL_SH_SH7708_CQ7708 { script hal_sh_sh7708_cq7708.cdl hardware description " - The cq HAL package provides the support needed to run + This SH HAL package provides the support needed to run eCos on a CqREEK SH7708 board." } +package CYGPKG_HAL_SH_SH7750_CQ7750 { + alias { "CqREEK SH7750 board" hal_sh_cqsh4 sh_cqsh4_hal } + directory hal/sh/cq7750 + script hal_sh_sh7750_cq7750.cdl + hardware + description " + This SH HAL package provides the support needed to run + eCos on a CqREEK SH7750 board." +} # -------------------------------------------------------------------------- # i386 packages @@ -926,6 +994,17 @@ package CYGPKG_HAL_POWERPC_PPC60x { select a specific target platform HAL package." } +package CYGPKG_HAL_POWERPC_PPC40x { + alias { "PowerPC 40x variant HAL" hal_ppc40x ppc40x_hal ppc40x_arch_hal } + directory hal/powerpc/ppc40x/ + script hal_powerpc_ppc40x.cdl + hardware + description " + The PowerPC 40x variant HAL package provides generic support + for this processor variant. It is also necessary to + select a specific target platform HAL package." +} + package CYGPKG_HAL_POWERPC_COGENT { alias { "Cogent CMA286/287 board" hal_powerpc_cogent powerpc_cogent_hal } directory hal/powerpc/cogent @@ -1037,6 +1116,27 @@ package CYGPKG_HAL_MIPS_TX39_JMR3904 { } +package CYGPKG_HAL_MIPS_TX49 { + alias { "TX49 chip HAL" hal_tx49 tx49_hal tx49_arch_hal } + directory hal/mips/tx49/ + script hal_mips_tx49.cdl + hardware + description " + The TX49 architecture HAL package provides generic support + for this processor architecture. It is also necessary to + select a specific target platform HAL package." +} + +package CYGPKG_HAL_MIPS_TX49_REF4955 { + alias { "Toshiba TX4955 reference platform" hal_tx49_ref4955 tx49_ref4955_hal } + directory hal/mips/ref4955 + script hal_mips_tx49_ref4955.cdl + hardware + description " + The REF4955 HAL package should be used when targetting the + actual hardware." +} + package CYGPKG_HAL_MIPS_VR4300 { alias { "VR4300 chip HAL" hal_vr4300 vr4300_hal vr4300_arch_hal } @@ -1231,6 +1331,19 @@ target brutus { eCos on an Intel StrongARM SA1100 evaluation board." } +target sa1100mm { + alias { "Intel StrongARM SA1100 Multimedia board" sa1100mm } + packages { CYGPKG_HAL_ARM + CYGPKG_HAL_ARM_SA11X0 + CYGPKG_HAL_ARM_SA11X0_SA1100MM + CYGPKG_IO_SERIAL_ARM_SA11X0 + } + description " + The sa1100mm target provides the packages needed to run + eCos on an Intel StrongARM SA1100 Multimedia evaluation board." +} + + target edb7xxx { alias { "Cirrus Logic development board" edb7211 eb7xxx eb7211 } packages { CYGPKG_HAL_ARM @@ -1259,6 +1372,7 @@ CMA230 (ARM7TDMI) or CMA222 (ARM710T) bo target sh7708 { alias { "Hitachi EDK/SH7708 board" edk7708 } packages { CYGPKG_HAL_SH + CYGPKG_HAL_SH_SH3 CYGPKG_HAL_SH_EDK7708 CYGPKG_DEVICES_WALLCLOCK_SH3 CYGPKG_IO_SERIAL_SH_SCI @@ -1273,6 +1387,7 @@ target sh7708 { target cq7708 { alias { "CqREEK SH7708 board" cq7708 } packages { CYGPKG_HAL_SH + CYGPKG_HAL_SH_SH3 CYGPKG_HAL_SH_SH7708_CQ7708 CYGPKG_IO_SERIAL_SH_SCI CYGPKG_IO_SERIAL_SH_CQ7708 @@ -1282,6 +1397,17 @@ target cq7708 { eCos on a CqREEK SH7708 board." } +target cq7750 { + alias { "CqREEK SH7750 board" cqsh4 } + packages { CYGPKG_HAL_SH + CYGPKG_HAL_SH_SH4 + CYGPKG_HAL_SH_SH7750_CQ7750 + CYGPKG_IO_SERIAL_SH_SCIF } + description " + The sh7750 target provides the packages needed to run + eCos on a CqREEK SH7750 board." +} + # -------------------------------------------------------------------------- # i386 targets target linux { @@ -1414,6 +1540,21 @@ target tx39_sim { use any of the eCos device drivers when the simulator is running in this mode." } +target ref4955 { + alias { "Toshiba TX4955 reference platform" tx49 } + packages { CYGPKG_HAL_MIPS + CYGPKG_HAL_MIPS_TX49 + CYGPKG_HAL_MIPS_TX49_REF4955 + CYGPKG_IO_SERIAL_GENERIC_16X5X + CYGPKG_IO_SERIAL_MIPS_REF4955 + CYGPKG_DEVICES_WALLCLOCK_MIPS_REF4955 + CYGPKG_DEVICES_WALLCLOCK_DALLAS_DS1742 + } + description " + The ref4955 target provides the packages needed to run + eCos on a Toshiba TX4955 reference platform." +} + target vrc4373 { alias { "NEC VRC4373 board" } packages { CYGPKG_HAL_MIPS diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog b/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog @@ -0,0 +1,41 @@ +2000-10-25 Drew Moseley + + * src/sa1100mm_misc.c: New file. Support for SA1100 Multimedia + board. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.mlt: Ditto. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.ldi: Ditto. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.h: Ditto. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.mlt: Ditto. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.ldi: Ditto. + * include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.h: Ditto. + * include/sa1100mm.h: Ditto. + * include/hal_platform_setup.h: Ditto. + * include/hal_platform_ints.h: Ditto. + * cdl/hal_arm_sa11x0_sa1100mm.cdl: Ditto. + * Changelog: Ditto. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl b/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl @@ -0,0 +1,329 @@ +# ==================================================================== +# +# hal_arm_sa11x0_sa1100mm.cdl +# +# ARM SA1100/Multimedia 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): dmoseley +# Original data: gthomas +# Contributors: +# Date: 2000-10-25 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== +cdl_package CYGPKG_HAL_ARM_SA11X0_SA1100MM { + display "ARM SA1100/Multimedia evaluation board" + parent CYGPKG_HAL_ARM_SA11X0 + hardware + include_dir cyg/hal + define_header hal_arm_sa11x0_sa1100mm.h + description " + This HAL platform package provides generic + support for the Intel StrongARM SA1100 based evalation board, + known as 'SA1100 Multimedia'." + + compile sa1100mm_misc.c + + implements CYGINT_HAL_DEBUG_GDB_STUBS + implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H " + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + puts $::cdl_header "#define HAL_PLATFORM_CPU \"StrongARM 1100\"" + puts $::cdl_header "#define HAL_PLATFORM_BOARD \"Multimedia development system\"" + puts $::cdl_header "#define HAL_PLATFORM_EXTRA \"\"" + } + + 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 SA1100 Multimedia 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 CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_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 CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_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_CONSOLE_CHANNEL_DEFAULT { + display "Default console channel." + flavor data + legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 + 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 1 + description " + The multimedia 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 1 + description " + The multimedia board has two serial ports. This option + chooses which port will be used for diagnostic output." + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + no_define + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + parent CYGPKG_NONE + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "arm-elf" } + description " + This option specifies the command prefix used when + invoking the build tools." + } + + cdl_option CYGBLD_GLOBAL_CFLAGS { + display "Global compiler flags" + flavor data + no_define + default_value { "-mcpu=strongarm1100 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" } + description " + This option controls the global compiler flags which are used to + compile all packages by default. Individual packages may define + options which override these global flags." + } + + cdl_option CYGBLD_GLOBAL_LDFLAGS { + display "Global linker flags" + flavor data + no_define + default_value { "-Wl,--gc-sections -Wl,-static -g -O2 -nostdlib" } + description " + This option controls the global linker flags. Individual + packages may define options which override these global flags." + } + + cdl_option CYGBLD_BUILD_GDB_STUBS { + display "Build GDB stub ROM image" + default_value 0 + requires { CYG_HAL_STARTUP == "ROM" } + requires CYGSEM_HAL_ROM_MONITOR + requires CYGBLD_BUILD_COMMON_GDB_STUBS + requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + no_define + description " + This option enables the building of the GDB stubs for the + board. The common HAL controls takes care of most of the + build process, but the final conversion from ELF image to + binary data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.bin : /bin/gdb_module.img + $(OBJCOPY) -O binary $< $@ + } + } + } + + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "Generic" "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "RAM" } + description " + Support can be enabled for different varieties of ROM monitor. + This support changes various eCos semantics such as the encoding + of diagnostic output, or the overriding of hardware interrupt + vectors. + Firstly there is \"Generic\" support which prevents the HAL + from overriding the hardware vectors that it does not use, to + instead allow an installed ROM monitor to handle them. This is + the most basic support which is likely to be common to most + implementations of ROM monitor. + \"GDB_stubs\" provides support when GDB stubs are included in + the ROM monitor or boot ROM." + } + + cdl_component CYGPKG_HAL_ARM_SA11X0_SA1100MM_OPTIONS { + display "StrongARM SA1100/Multimedia 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_SA1100MM_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 SA1100 Multimedia HAL. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_SA1100MM_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 SA1100 Multimedia HAL. These flags are removed from + the set of global flags if present." + } + + cdl_option CYGPKG_HAL_ARM_SA11X0_SA1100MM_TESTS { + display "StrongARM SA1100/Multimedia tests" + flavor data + no_define +# calculated { "tests/dram-test" } + calculated { "" } + description " + This option specifies the set of tests for the StrongARM SA1100 Multimedia HAL." + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "arm_sa11x0_sa1100mm_ram" : \ + "arm_sa11x0_sa1100mm_rom" } + + cdl_option CYGHWR_MEMORY_LAYOUT_LDI { + display "Memory layout linker script fragment" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_LDI + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + + cdl_option CYGHWR_MEMORY_LAYOUT_H { + display "Memory layout header file" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_H + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } + + cdl_option CYGBLD_BUILD_REDBOOT_BIN { + display "Build Redboot ROM binary image" + active_if CYGBLD_BUILD_REDBOOT + default_value 1 + no_define + description "This option enables the conversion of the Redboot ELF + image to a binary image suitable for ROM programming." + + make -priority 325 { + /bin/redboot.bin : /bin/redboot.elf + $(OBJCOPY) --strip-debug $< $(@:.bin=.img) + $(OBJCOPY) -O srec $< $(@:.bin=.srec) + $(OBJCOPY) -O binary $< $@ + } + } +} diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/hal_platform_ints.h b/packages/hal/arm/sa11x0/sa1100mm/current/include/hal_platform_ints.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/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, dmoseley +// Date: 2000-05-08 +// Purpose: Define Interrupt support +// Description: The interrupt details for the SA1100/Multimedia are defined here. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#define CYGNUM_HAL_INTERRUPT_GPIO0 0 +#define CYGNUM_HAL_INTERRUPT_GPIO1 1 +#define CYGNUM_HAL_INTERRUPT_GPIO2 2 +#define CYGNUM_HAL_INTERRUPT_GPIO3 3 +#define CYGNUM_HAL_INTERRUPT_GPIO4 4 +#define CYGNUM_HAL_INTERRUPT_GPIO5 5 +#define CYGNUM_HAL_INTERRUPT_GPIO6 6 +#define CYGNUM_HAL_INTERRUPT_GPIO7 7 +#define CYGNUM_HAL_INTERRUPT_GPIO8 8 +#define CYGNUM_HAL_INTERRUPT_GPIO9 9 +#define CYGNUM_HAL_INTERRUPT_GPIO10 10 +#define CYGNUM_HAL_INTERRUPT_GPIO 11 // Don't use directly +#define CYGNUM_HAL_INTERRUPT_LCD 12 +#define CYGNUM_HAL_INTERRUPT_UDC 13 +#define CYGNUM_HAL_INTERRUPT_UART1 15 +#define CYGNUM_HAL_INTERRUPT_UART2 16 +#define CYGNUM_HAL_INTERRUPT_UART3 17 +#define CYGNUM_HAL_INTERRUPT_MCP 18 +#define CYGNUM_HAL_INTERRUPT_SSP 19 +#define CYGNUM_HAL_INTERRUPT_TIMER0 26 +#define CYGNUM_HAL_INTERRUPT_TIMER1 27 +#define CYGNUM_HAL_INTERRUPT_TIMER2 28 +#define CYGNUM_HAL_INTERRUPT_TIMER3 29 +#define CYGNUM_HAL_INTERRUPT_HZ 30 +#define CYGNUM_HAL_INTERRUPT_ALARM 31 + +// GPIO bits 31..11 can generate interrupts as well, but they all +// end up clumped into interrupt signal #11. Using the symbols +// below allow for detection of these separately. + +#define CYGNUM_HAL_INTERRUPT_GPIO11 (32+11) +#define CYGNUM_HAL_INTERRUPT_GPIO12 (32+12) +#define CYGNUM_HAL_INTERRUPT_GPIO13 (32+13) +#define CYGNUM_HAL_INTERRUPT_GPIO14 (32+14) +#define CYGNUM_HAL_INTERRUPT_GPIO15 (32+15) +#define CYGNUM_HAL_INTERRUPT_GPIO16 (32+16) +#define CYGNUM_HAL_INTERRUPT_GPIO17 (32+17) +#define CYGNUM_HAL_INTERRUPT_GPIO18 (32+18) +#define CYGNUM_HAL_INTERRUPT_GPIO19 (32+19) +#define CYGNUM_HAL_INTERRUPT_GPIO20 (32+20) +#define CYGNUM_HAL_INTERRUPT_GPIO21 (32+21) +#define CYGNUM_HAL_INTERRUPT_GPIO22 (32+22) +#define CYGNUM_HAL_INTERRUPT_GPIO23 (32+23) +#define CYGNUM_HAL_INTERRUPT_GPIO24 (32+24) +#define CYGNUM_HAL_INTERRUPT_GPIO25 (32+25) +#define CYGNUM_HAL_INTERRUPT_GPIO26 (32+26) +#define CYGNUM_HAL_INTERRUPT_GPIO27 (32+27) + +#define CYGNUM_HAL_INTERRUPT_NONE -1 + +#define CYGNUM_HAL_ISR_MIN 0 +#define CYGNUM_HAL_ISR_MAX (27+32) + +#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX+1) + +// The vector used by the Real time clock +#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0 + +#endif // CYGONCE_HAL_PLATFORM_INTS_H diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/hal_platform_setup.h b/packages/hal/arm/sa11x0/sa1100mm/current/include/hal_platform_setup.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/hal_platform_setup.h @@ -0,0 +1,370 @@ +#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, dmoseley +// Travis C. Furrer +// Date: 2000-05-08 +// Purpose: Intel SA1100 Multimedia platform specific support routines +// Description: +// Usage: #include +// This file should only be used by "vectors.S" +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +#include // System-wide configuration info +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include // Platform specific hardware definitions +#include // MMU definitions + +#if defined(CYG_HAL_STARTUP_ROM) +#define PLATFORM_SETUP1 _platform_setup1 +#define CYGHWR_HAL_ARM_HAS_MMU + +#if (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 59000) +#define SA11X0_PLL_CLOCK 0x0 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 73700) +#define SA11X0_PLL_CLOCK 0x1 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 88500) +#define SA11X0_PLL_CLOCK 0x2 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 103200) +#define SA11X0_PLL_CLOCK 0x3 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 118000) +#define SA11X0_PLL_CLOCK 0x4 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 132700) +#define SA11X0_PLL_CLOCK 0x5 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 147500) +#define SA11X0_PLL_CLOCK 0x6 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 162200) +#define SA11X0_PLL_CLOCK 0x7 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 176900) +#define SA11X0_PLL_CLOCK 0x8 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 191700) +#define SA11X0_PLL_CLOCK 0x9 +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 206400) +#define SA11X0_PLL_CLOCK 0xA +#elif (CYGHWR_HAL_ARM_SA11X0_PROCESSOR_CLOCK == 221200) +#define SA11X0_PLL_CLOCK 0xB +#else +#error Invalid processor clock speed +#endif + +// This function is called very early on by the boot ROM (or by any ROM +// based startup). It's job is to initialize the hardware to a known state +// so that eCos applications can execute properly. + +// This version of the code is patterned after the contribution from +// Travis Furer (@MIT) + + +// Define macro used to diddle the LEDs during early initialization. +// Can use r0+r1. Argument in \x. + +#define CYGHWR_LED_MACRO _set_LEDS \x + +// Initialize GPIOs +#define GPIO_GRER (SA11X0_GPIO_RISING_EDGE_DETECT-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GFER (SA11X0_GPIO_FALLING_EDGE_DETECT-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GAFR (SA11X0_GPIO_ALTERNATE_FUNCTION-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GEDR (SA11X0_GPIO_EDGE_DETECT_STATUS-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GPDR (SA11X0_GPIO_PIN_DIRECTION-SA11X0_GPIO_PIN_LEVEL) +#define GPIO_GPCR (SA11X0_GPIO_PIN_OUTPUT_CLEAR-SA11X0_GPIO_PIN_LEVEL) + .macro _init_GPIO + ldr r1,=SA11X0_GPIO_PIN_LEVEL + mov r0,#0 + str r0,[r1,#GPIO_GRER] // Disable rising edge detects + str r0,[r1,#GPIO_GFER] // Disable falling edge detects + str r0,[r1,#GPIO_GAFR] // No alt. funcs. during init + sub r0,r0,#1 + str r0,[r1,#GPIO_GPCR] // Force all outputs to low + str r0,[r1,#GPIO_GEDR] // Clear edge detect status + ldr r0,=0x00100300 + str r0,[r1,#GPIO_GPDR] // Only LEDs outputs (for now) + .endm + +#define DISCRETE_LED_REG_BASE 0x18800000 +#define KEYPAD_IO_O 0x4 +#define DISCRETE_LED_O 0x6 +#define HEX_LED_REG_BASE 0x18c00000 +#define HEX_LED_O 0x0 +#define HEX_DATA_MASK 0x0F +#define HEX_LED_0_STROBE 0x10 +#define HEX_LED_1_STROBE 0x20 +#define HEX_LED_BOTH_STROBES (HEX_LED_0_STROBE | HEX_LED_1_STROBE) + +// Display value on hex LED display + .macro _set_LEDS,val + ldr r1, =HEX_LED_REG_BASE + + ldr r2, =\val + and r2, r2, #0xf + orr r0, r2, #HEX_LED_0_STROBE + str r0, [r1, #HEX_LED_O] + + ldr r2, =\val + mov r2, r2, LSR #4 + orr r0, r2, #HEX_LED_1_STROBE + str r0, [r1, #HEX_LED_O] + + nop + .endm + +// Initialize HEX display. + .macro _init_HEX_DISPLAY + ldr r1, =DISCRETE_LED_REG_BASE + ldr r2, =~0 + str r2, [r1, #KEYPAD_IO_O] + str r2, [r1, #DISCRETE_LED_O] + _set_LEDS 0x23 + .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) +// +// SA1100 Multimedia memory is as follows: +// ROM 128K (assuming 32 bit accesses) +// Flash 4M (assuming 32 bit accesses) +// RAM 8M +// +// 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. +// +#define DRAM_CONFIG_VALUE (SA11X0_DRAM_REFRESH_INTERVAL(312) | \ + SA11X0_DATA_INPUT_LATCH_CAS_PLUS_THREE | \ + SA11X0_DRAM_CAS_BEFORE_RAS(5) | \ + SA11X0_DRAM_RAS_PRECHARGE(4) | \ + SA11X0_DRAM_CLOCK_CPU_CLOCK | \ + SA11X0_DRAM_ROW_ADDRESS_BITS_11 | \ + SA11X0_DRAM_BANK_0_ENABLED | \ + SA11X0_DRAM_BANK_1_DISABLED | \ + SA11X0_DRAM_BANK_2_DISABLED | \ + SA11X0_DRAM_BANK_3_DISABLED) + +#define DRAM_CAS0_WAVEFORM 0xF0F0F00F +#define DRAM_CAS1_WAVEFORM 0XF0F0F0F0 +#define DRAM_CAS2_WAVEFORM 0xFFFFFFF0 + +#define BANK_0_CONTROL_VALUE SA11X0_STATIC_ROM_TYPE_FLASH | \ + SA11X0_STATIC_ROM_BUS_WIDTH_16_BITS | \ + SA11X0_STATIC_ROM_DELAY_FIRST_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_DELAY_NEXT_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_RECOVERY(0x7) +#define BANK_1_CONTROL_VALUE SA11X0_STATIC_ROM_TYPE_FLASH | \ + SA11X0_STATIC_ROM_BUS_WIDTH_32_BITS | \ + SA11X0_STATIC_ROM_DELAY_FIRST_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_DELAY_NEXT_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_RECOVERY(0x7) +#define STATIC_CONTROL_0_VALUE (SA11X0_STATIC_ROM_BANK_0(BANK_0_CONTROL_VALUE) | \ + SA11X0_STATIC_ROM_BANK_1(BANK_1_CONTROL_VALUE)) + +#define BANK_2_CONTROL_VALUE SA11X0_STATIC_ROM_TYPE_FLASH | \ + SA11X0_STATIC_ROM_BUS_WIDTH_16_BITS | \ + SA11X0_STATIC_ROM_DELAY_FIRST_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_DELAY_NEXT_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_RECOVERY(0x7) +#define BANK_3_CONTROL_VALUE SA11X0_STATIC_ROM_TYPE_FLASH | \ + SA11X0_STATIC_ROM_BUS_WIDTH_32_BITS | \ + SA11X0_STATIC_ROM_DELAY_FIRST_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_DELAY_NEXT_ACCESS(0x1F) | \ + SA11X0_STATIC_ROM_RECOVERY(0x7) +#define STATIC_CONTROL_1_VALUE (SA11X0_STATIC_ROM_BANK_2(BANK_2_CONTROL_VALUE) | \ + SA11X0_STATIC_ROM_BANK_3(BANK_3_CONTROL_VALUE)) + + .macro _init_MEM_INTERFACES + /* + * Initialize the DRAM Controller + */ + ldr r0, =SA11X0_DRAM_CONFIGURATION + ldr r1, =DRAM_CONFIG_VALUE + str r1, [r0] + + ldr r0, =SA11X0_DRAM0_CAS_0 + ldr r1, =DRAM_CAS0_WAVEFORM + str r1, [r0] + + ldr r0, =SA11X0_DRAM0_CAS_1 + ldr r1, =DRAM_CAS1_WAVEFORM + str r1, [r0] + + ldr r0, =SA11X0_DRAM0_CAS_2 + ldr r1, =DRAM_CAS2_WAVEFORM + str r1, [r0] + + ldr r0, =SA11X0_STATIC_CONTROL_0 + + /* + * Get the reset ROM setup + */ + ldr r1, [r0] + + /* + * Get the 16/32 bit setting to merge into the appropriate + * register values later on. + */ + and r1, r1, #SA11X0_STATIC_ROM_BUS_WIDTH_MASK + + /* + * MSC0 - bank 0 ROM, bank 1 FLASH + */ + ldr r2, =STATIC_CONTROL_0_VALUE + orr r1, r1, r2 + + str r1, [r0] + + /* + * MSC1 - bank 2 SRAM, bank 3 REG + */ + ldr r0, =SA11X0_STATIC_CONTROL_1 + ldr r1, =STATIC_CONTROL_1_VALUE + str r1, [r0] + + /* + * Delay to let the DRAM warm up + */ + ldr r0, =0x200 +0: subs r0, r0, #1 + bne 0b + + .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 0x15 + + _init_PERIPHERAL_PINS + _set_LEDS 0x13 + + _set_CLOCK_FREQUENCY + _enable_CLOCK_SWITCHING + _set_LEDS 0x12 + + _init_MEM_INTERFACES + _set_LEDS 0x11 + + // 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 0x09 + // 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 0x08 + + .endm + +#else // STARTUP_ROM +#define PLATFORM_SETUP1 +#endif + +/*---------------------------------------------------------------------------*/ +/* end of hal_platform_setup.h */ +#endif /* CYGONCE_HAL_PLATFORM_SETUP_H */ diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.h b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.h @@ -0,0 +1,10 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x800000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.ldi b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_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 = 0x800000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_rom_vectors (ram, 0x10000, LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.mlt b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_ram.mlt @@ -0,0 +1,12 @@ +version 0 +region ram 0 800000 0 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section rom_vectors 0 1 0 1 1 1 1 1 10000 10000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 1 0 1 data data ! +section data 0 4 0 1 0 1 0 1 bss bss ! +section bss 0 4 0 1 0 0 0 0 ! diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.h b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.h @@ -0,0 +1,16 @@ +// eCos memory layout - Tue Apr 04 20:19:06 2000 + +// This is a generated file - do not edit + +#include +#include + +#define CYGMEM_REGION_ram (0) +#define CYGMEM_REGION_ram_SIZE (0x800000) +#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) +extern char CYG_LABEL_NAME (_reserved) []; +#define CYGMEM_SECTION_reserved (CYG_LABEL_NAME (_reserved)) +#define CYGMEM_SECTION_reserved_SIZE (0x8000) diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.ldi b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_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 = 0x800000 + rom : ORIGIN = 0x50000000, LENGTH = 0x40000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_rom_vectors (rom, 0x50000000, LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA) + SECTION_data (ram, 0x8000, FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTIONS_END +} diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.mlt b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/pkgconf/mlt_arm_sa11x0_sa1100mm_rom.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 0 800000 0 ! +region rom 50000000 40000 1 ! +section fixed_vectors 0 1 0 1 1 0 1 0 20 20 ! +section data 0 1 1 1 1 1 0 0 8000 bss ! +section bss 0 4 0 1 0 0 0 0 ! +section rom_vectors 0 1 0 1 1 1 1 1 50000000 50000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata rodata ! +section rodata 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 4 0 1 0 1 0 1 fixup fixup ! +section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 4 0 1 0 0 0 1 data ! diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/include/sa1100mm.h b/packages/hal/arm/sa11x0/sa1100mm/current/include/sa1100mm.h new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/include/sa1100mm.h @@ -0,0 +1,50 @@ +#ifndef CYGONCE_SA1100MM_H +#define CYGONCE_SA1100MM_H + +/*============================================================================= +// +// sa1100mm.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): dmoseley +// Contributors: dmoseley +// Date: 2000-10-25 +// Purpose: Intel SA1110/Multimedia platform specific support routines +// Description: +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//===========================================================================*/ + +/*---------------------------------------------------------------------------*/ +/* end of sa1100mm.h */ +#endif /* CYGONCE_SA1100MM_H */ diff --git a/packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c b/packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/arm/sa11x0/sa1100mm/current/src/sa1100mm_misc.c @@ -0,0 +1,227 @@ +//========================================================================== +// +// sa1100mm_misc.c +// +// HAL misc board support code for StrongARM SA1110/Multimedia +// +//========================================================================== +//####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, dmoseley +// Travis C. Furrer +// Date: 2000-05-21 +// Purpose: HAL board support +// Description: Implementations of HAL board interfaces +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include +#include +#include CYGBLD_HAL_PLATFORM_H + +#include // base types +#include // tracing macros +#include // assertion macros + +#include // IO macros +#include // Register state info +#include +#include // Interrupt names +#include +#include // Hardware definitions +#include // Platform specifics + +#include // diag_printf + +// ------------------------------------------------------------------------- +// MMU initialization: +// +// These structures are laid down in memory to define the translation +// table. +// + +/* + * SA-1100 Translation Table Base Bit Masks */ +#define ARM_TRANSLATION_TABLE_MASK 0xFFFFC000 + +/* + * SA-1100 Domain Access Control Bit Masks + */ +#define ARM_ACCESS_TYPE_NO_ACCESS(domain_num) (0x0 << (domain_num)*2) +#define ARM_ACCESS_TYPE_CLIENT(domain_num) (0x1 << (domain_num)*2) +#define ARM_ACCESS_TYPE_MANAGER(domain_num) (0x3 << (domain_num)*2) + +struct ARM_MMU_FIRST_LEVEL_FAULT { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_FAULT_ID 0x0 + +struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE { + int id : 2; + int imp : 2; + int domain : 4; + int sbz : 1; + int base_address : 23; +}; +#define ARM_MMU_FIRST_LEVEL_PAGE_TABLE_ID 0x1 + +struct ARM_MMU_FIRST_LEVEL_SECTION { + int id : 2; + int b : 1; + int c : 1; + int imp : 1; + int domain : 4; + int sbz0 : 1; + int ap : 2; + int sbz1 : 8; + int base_address : 12; +}; +#define ARM_MMU_FIRST_LEVEL_SECTION_ID 0x2 + +struct ARM_MMU_FIRST_LEVEL_RESERVED { + int id : 2; + int sbz : 30; +}; +#define ARM_MMU_FIRST_LEVEL_RESERVED_ID 0x3 + +#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \ + (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2)) + +#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE 0x4000 + +#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base, \ + cacheable, bufferable, perm) \ + CYG_MACRO_START \ + register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc; \ + \ + desc.word = 0; \ + desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID; \ + desc.section.domain = 0; \ + desc.section.c = (cacheable); \ + desc.section.b = (bufferable); \ + desc.section.ap = (perm); \ + desc.section.base_address = (actual_base); \ + *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) \ + = desc.word; \ + CYG_MACRO_END + +#define X_ARM_MMU_SECTION(abase,vbase,size,cache,buff,access) \ + { int i; int j = abase; int k = vbase; \ + for (i = size; i > 0 ; i--,j++,k++) \ + { \ + ARM_MMU_SECTION(ttb_base, j, k, cache, buff, access); \ + } \ + } + +union ARM_MMU_FIRST_LEVEL_DESCRIPTOR { + unsigned long word; + struct ARM_MMU_FIRST_LEVEL_FAULT fault; + struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE page_table; + struct ARM_MMU_FIRST_LEVEL_SECTION section; + struct ARM_MMU_FIRST_LEVEL_RESERVED reserved; +}; + +#define ARM_UNCACHEABLE 0 +#define ARM_CACHEABLE 1 +#define ARM_UNBUFFERABLE 0 +#define ARM_BUFFERABLE 1 + +#define ARM_ACCESS_PERM_NONE_NONE 0 +#define ARM_ACCESS_PERM_RO_NONE 0 +#define ARM_ACCESS_PERM_RO_RO 0 +#define ARM_ACCESS_PERM_RW_NONE 1 +#define ARM_ACCESS_PERM_RW_RO 2 +#define ARM_ACCESS_PERM_RW_RW 3 + +void +hal_mmu_init(void) +{ + unsigned long ttb_base = SA11X0_RAM_BANK0_BASE + 0x4000; + unsigned long i; + + /* + * Set the TTB register + */ + asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/); + + /* + * Set the Domain Access Control Register + */ + i = ARM_ACCESS_TYPE_MANAGER(0) | + ARM_ACCESS_TYPE_NO_ACCESS(1) | + ARM_ACCESS_TYPE_NO_ACCESS(2) | + ARM_ACCESS_TYPE_NO_ACCESS(3) | + ARM_ACCESS_TYPE_NO_ACCESS(4) | + ARM_ACCESS_TYPE_NO_ACCESS(5) | + ARM_ACCESS_TYPE_NO_ACCESS(6) | + ARM_ACCESS_TYPE_NO_ACCESS(7) | + ARM_ACCESS_TYPE_NO_ACCESS(8) | + ARM_ACCESS_TYPE_NO_ACCESS(9) | + ARM_ACCESS_TYPE_NO_ACCESS(10) | + ARM_ACCESS_TYPE_NO_ACCESS(11) | + ARM_ACCESS_TYPE_NO_ACCESS(12) | + ARM_ACCESS_TYPE_NO_ACCESS(13) | + ARM_ACCESS_TYPE_NO_ACCESS(14) | + ARM_ACCESS_TYPE_NO_ACCESS(15); + asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/); + + /* + * First clear all TT entries - ie Set them to Faulting + */ + memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE); + + /* Actual Virtual Size Attributes Function */ + /* Base Base MB cached? buffered? access permissions */ + /* xxx00000 xxx00000 */ + X_ARM_MMU_SECTION(0x000, 0x500, 1, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Boot flash ROMspace */ + X_ARM_MMU_SECTION(0x080, 0x080, 4, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Application flash ROM */ + X_ARM_MMU_SECTION(0x100, 0x100, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SA-1101 Development Board Registers */ + X_ARM_MMU_SECTION(0x180, 0x180, 1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Ct8020 DSP */ + 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 Sockets */ + X_ARM_MMU_SECTION(0xC00, 0, 8, ARM_CACHEABLE, 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 */ + X_ARM_MMU_SECTION(0x800, 0x800, 1024, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* StrongARM(R) Registers */ + +} + +// +// Platform specific initialization +// + +void +plf_hardware_init(void) +{ +} diff --git a/packages/hal/i386/arch/current/ChangeLog b/packages/hal/i386/arch/current/ChangeLog --- a/packages/hal/i386/arch/current/ChangeLog +++ b/packages/hal/i386/arch/current/ChangeLog @@ -1,3 +1,9 @@ +2000-11-01 Jonathan Larmour + + * src/vectors.S (hal_pc_irq): Use correct register for ISR return value + when calling interrupt_end() + Thanks to Phil Hinton for reporting. + 2000-10-20 Jonathan Larmour * src/vectors.S (_start): call constructors after initializing diff --git a/packages/hal/i386/arch/current/src/vectors.S b/packages/hal/i386/arch/current/src/vectors.S --- a/packages/hal/i386/arch/current/src/vectors.S +++ b/packages/hal/i386/arch/current/src/vectors.S @@ -232,7 +232,7 @@ hal_pc_irq: movl (%ebx, %ecx, 4), %edx # regs is left from the push of ebp above; pushl %edx - pushl %eax + pushl %esi # the old eax was saved in esi before hal_intc_ack call interrupt_end addl $8, %esp #endif /* CYGFUN_HAL_COMMON_KERNEL_SUPPORT */ diff --git a/packages/hal/i386/linux/current/ChangeLog b/packages/hal/i386/linux/current/ChangeLog --- a/packages/hal/i386/linux/current/ChangeLog +++ b/packages/hal/i386/linux/current/ChangeLog @@ -1,3 +1,10 @@ +2000-11-02 Jonathan Larmour + + * src/entry.c (_linux_entry): Extend memory using brk() syscall to + match memory layout + + * src/syscall-i386-linux-1.0.S: Add brk syscall + 2000-10-20 Jonathan Larmour * include/pkgconf/mlt_i386_linux_ram.mlt: diff --git a/packages/hal/i386/linux/current/src/entry.c b/packages/hal/i386/linux/current/src/entry.c --- a/packages/hal/i386/linux/current/src/entry.c +++ b/packages/hal/i386/linux/current/src/entry.c @@ -32,7 +32,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): proven -// Contributors:proven, jskov +// Contributors:proven, jskov, jlarmour // Date: 1999-01-06 // Purpose: Entry point for Linux synthetic target. // @@ -40,18 +40,29 @@ // //========================================================================= +#include #include +#include +#include CYGHWR_MEMORY_LAYOUT_H externC void cyg_hal_isr_init( void ); externC void cyg_hal_invoke_constructors( void ); externC void cyg_start( void ); externC void cyg_hal_hardware_init( void ); +externC void *cyg_hal_sys_brk(void *newbrk); void _linux_entry( void ) { + void *oldbrk=NULL; + void *newbrk=(void *)(CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE); // Should get argc argv cyg_hal_hardware_init(); cyg_hal_isr_init(); + // unconditionally set memory regino to the size specified in the + // memory layout + oldbrk = cyg_hal_sys_brk(newbrk); + // should check + CYG_ASSERT( oldbrk>=newbrk, "brk() failed" ); cyg_hal_invoke_constructors(); cyg_start(); } diff --git a/packages/hal/i386/linux/current/src/syscall-i386-linux-1.0.S b/packages/hal/i386/linux/current/src/syscall-i386-linux-1.0.S --- a/packages/hal/i386/linux/current/src/syscall-i386-linux-1.0.S +++ b/packages/hal/i386/linux/current/src/syscall-i386-linux-1.0.S @@ -583,3 +583,7 @@ SYSCALL5(_newselect) //========================================================================== // machdep_sys_fdatasync() SYSCALL1(fdatasync) + +//========================================================================== +// machdep_sys_brk() +SYSCALL1(brk) diff --git a/packages/hal/i386/pc/current/ChangeLog b/packages/hal/i386/pc/current/ChangeLog --- a/packages/hal/i386/pc/current/ChangeLog +++ b/packages/hal/i386/pc/current/ChangeLog @@ -1,3 +1,8 @@ +2000-11-02 Fabrice Gautier + + * src/platform.inc (hal_cpu_init): Load image from floppy one + sector at a time to avoid "DMA access across 64k boundary" error. + 2000-10-20 Jonathan Larmour * include/pkgconf/mlt_i386_pc_floppy.mlt: diff --git a/packages/hal/i386/pc/current/include/platform.inc b/packages/hal/i386/pc/current/include/platform.inc --- a/packages/hal/i386/pc/current/include/platform.inc +++ b/packages/hal/i386/pc/current/include/platform.inc @@ -65,8 +65,7 @@ sectorsPerTrack = 18 bytesPerSector = 512 - bytesPerTrack = sectorsPerTrack * bytesPerSector - dptLength = 3 /* words. */ + esPerSector = 32 /* = 512/16 */ cld /* always count up. */ @@ -78,9 +77,9 @@ andl $0xF000, %eax movw %ax, %ss - /* Ask the BIOS for info about the amount of RAM available. We push these - onto the stack for later use. - */ + /* Ask the BIOS for info about the amount of RAM available. We push + * these onto the stack for later use. + */ xorl %eax, %eax movb $0x88, %ah /* Get the amount of extended memory. */ @@ -93,35 +92,63 @@ shl $10, %eax pushl %eax - - /* Read the rest of the image to _start. This code works by reading a track - at a time... + /* reset floppy */ + movb $0,%ah + movb $0,%dl + int $0x13 + jc _error + + /* Read the rest of the image to _start. This code works by reading + only one sector at a time to avoid "buffer cross 64k boundary" fatal + problem... This is slow but should work in almost all situations. + _start should be aligned on a 512 bytes boundary to be sure. */ - movl $_edata, %eax - movl $_start, %ebx /* Our destination address. */ - subl %ebx, %eax /* Number of bytes in the image. */ - movl $1, %ecx /* Track/sector to read from (starts at 1). */ + /* destination pointer es:bx */ + /* With correct alignement, bx should be 0 and es should be a multiple + * of 32. If not it may cause the "buffer cross 64k boundary" problem + * (cf above) + */ + movl $_start,%eax + movw %ax,%bx + andw $0xF,%bx + shrl $4,%eax + movw %ax, %es -0: - cmpl $0, %eax - jle 1f + /* initials head/track/sector */ + movw $0,%dx + movw $1,%cx + + xorl %edi,%edi + jmp _loadsector - pushl %eax /* Save the number of bytes we want. */ - pushl %ebx /* Save our current address. */ - pushl %ecx /* Save our disk location. */ +_nextsector: + addw $esPerSector, %di /* advance buffer pointer */ + shll $4,%edi + cmpl $_edata,%edi + jg _endload /* next sector ? */ + shrl $4,%edi + movw %di,%es + incb %cl + cmpb $sectorsPerTrack, %cl + jbe _loadsector /* next head ?*/ + movb $1, %cl + incb %dh + cmpb $1, %dh + je _loadsector /* next track ? */ + movb $0, %dh + incb %ch - /* Read in a track with head 0. */ - - movl %ebx, %eax /* Put our address into ES:BX. */ - shr $4, %eax - movw %ax, %es - andl $0xF, %ebx - movw $0, %dx /* Disk 0, head 0 */ - movb $0x02, %ah - movb $sectorsPerTrack, %al /* Read the entire track. */ - movb $1, %cl - int $0x13 /* CX points to our track/sector. */ +_loadsector: + + pushw %es + movw $0x0201, %ax + int $0x13 + popw %di + jc _error + + movw $(0x0E*256+'.'), %ax /* print a dot */ + int $0x10 /* So go ahead and resume execution at the real starting address. This only serves to move us quickly to the real starting location; and has @@ -129,52 +156,13 @@ 0: reading the first track, then we limit ourselves to reading images of 30k bytes max before overwriting ourselves at 0x7C00. */ - - ljmp $0, $2f - hlt - .align 4 -2: - - popl %ecx - popl %ebx - popl %eax - - /* Add our length to the address. */ - addl $bytesPerTrack, %ebx - subl $bytesPerTrack, %eax - - /* Maybe read in a track with head 1. */ - cmpl $0, %eax - jle 1f - - pushl %eax /* Save the number of bytes we want. */ - pushl %ebx /* Save our current address. */ - pushl %ecx + ljmp $0,$_nextsector - movl %ebx, %eax /* Put our address into ES:BX. */ - shr $4, %eax - movw %ax, %es - andl $0xF, %ebx - movw $0x0100, %dx /* Disk 0, head 1 */ - movb $0x02, %ah - movb $sectorsPerTrack, %al /* Read the entire track. */ - movb $1, %cl - int $0x13 /* CX points to our track/sector. */ - - popl %ecx - popl %ebx - popl %eax - - /* Add our length to the address. */ - addl $bytesPerTrack, %ebx - subl $bytesPerTrack, %eax - - /* Move to the next track. */ - addb $0x1, %ch - - jmp 0b - +_error: /* halt on error */ + cli + hlt + jmp _start /* Write the 0x55/0xAA signature at the end of the first block. Without this signature the BIOS won't consider this block to be bootable. @@ -184,10 +172,11 @@ 2: .byte 0x55 .byte 0xAA - +_endload: 1: - /* Lets be nice and wait for the diskette drive motor to go off before continuing. */ + /* Lets be nice and wait for the diskette drive motor to go off + * before continuing. */ movw $0x40, %ax movw %ax, %es @@ -250,7 +239,9 @@ gdtStart: .byte 0xCF .byte 0x00 - /* Selector 0x18 == shorter code: faults any code access 0xF0000000-0xFFFFFFFF. */ + /* Selector 0x18 == shorter code: faults any code + * access 0xF0000000-0xFFFFFFFF. + */ .word 0xFFFF .word 0x0000 .byte 0x00 @@ -292,8 +283,8 @@ 3: popfl /* Save the standard and extended memory lengths into some static variables... - I'm predicting that someone is going to break our way of passing a pointer - to this structure... may as well avoid that problem now. + I'm predicting that someone is going to break our way of passing a + pointer to this structure... may as well avoid that problem now. */ .data .align 4 @@ -312,7 +303,7 @@ pc_extended_memory_size: /* _pc_entry() takes a pointer to our startup array (which only has standard and extended memory sizes in it, on the stack). */ - movl %esp, %ebx /* They are the last parameters on the stack. */ + movl %esp, %ebx /* They are the last parameters on the stack. */ pushl %ebx #endif /* CYG_HAL_STARTUP_FLOPPY */ @@ -323,8 +314,9 @@ pc_extended_memory_size: vector 15. */ - /* Save the standard and extended memory lengths into some static variables... - */ + /* Save the standard and extended memory lengths into some static + * variables... + */ .data .align 4 .globl pc_standard_memory_size diff --git a/packages/hal/mips/arch/current/ChangeLog b/packages/hal/mips/arch/current/ChangeLog --- a/packages/hal/mips/arch/current/ChangeLog +++ b/packages/hal/mips/arch/current/ChangeLog @@ -54,6 +54,7 @@ 2000-09-01 Jonathan Larmour + + * include/mips-stub.h: Added register size for TX49. + 2000-05-10 Jesper Skov * include/arch.inc: Force assembler into MIPS3 mode before using diff --git a/packages/hal/mips/arch/current/include/mips-stub.h b/packages/hal/mips/arch/current/include/mips-stub.h --- a/packages/hal/mips/arch/current/include/mips-stub.h +++ b/packages/hal/mips/arch/current/include/mips-stub.h @@ -62,6 +62,13 @@ extern "C" { typedef unsigned long target_register_t; // We need to sign-extend the registers so GDB doesn't get confused. #define CYGARC_SIGN_EXTEND_REGISTERS +#elif defined(CYGPKG_HAL_MIPS_TX49) + // Even though we are only working with 32 bit registers, GDB expects 64 bits + #define REGSIZE(X) 8 + typedef unsigned long target_register_t; + + // We need to sign-extend the registers so GDB doesn't get confused. + #define CYGARC_SIGN_EXTEND_REGISTERS #else #define REGSIZE(X) 4 typedef unsigned long target_register_t; diff --git a/packages/hal/mips/ref4955/current/ChangeLog b/packages/hal/mips/ref4955/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/ChangeLog @@ -0,0 +1,320 @@ +2000-10-20 Jonathan Larmour + + * include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt: + Add heap1 section + + * include/pkgconf/mlt_mips_tx49_ref4955_ram.h: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.h: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi: + Regenerated + +2000-09-06 Jesper Skov + + * include/platform.inc: Flush cache after copying vectors. + + * src/plf_misc.c (hal_platform_init): Removed cache-enabling + code. This is now done earlier in the variant init code. + +2000-07-21 Jesper Skov + + * include/platform.inc: Moved vector copying code to + hal_mon_init so it comes after cache initialization. + +2000-06-30 Jesper Skov + + * src/pc87338.c: calling i/f macro changes. + + * src/hal_diag.c: Fix warning. + + * cdl/hal_mips_tx49_ref4955.cdl: Endian options next to each + other. + + * include/platform.inc: Only define hal_memc_setup if it will have + a content - otherwise the assembler emits a (harmless) warning. + +2000-06-29 Jesper Skov + + * src/hal_diag.c: Changed to match the below. + + * src/pc87338.c: Use per-channel data struct instead of crufty code. + +2000-06-28 Jesper Skov + + * src/hal_diag.c: Cleanup. + +2000-06-26 Jesper Skov + + * src/plf_misc.c: + * src/pc87338.c: + * include/plf_intr.h: + Moved Ctrl-c handling to driver file. Added timeout and proper + channel changing services. + + * cdl/hal_mips_tx49_ref4955.cdl: Removed ROM_DEBUG_CHANNEL option. + +2000-06-21 Jonathan Larmour + + * misc/slow_cat.tcl: Fix quoting when invoking TCL interpreter + * misc/swap4.tcl: Likewise + +2000-06-21 Jesper Skov + + * src/plf_stub.c: + * src/pc87338.c: [added] + * src/pc87338.inl: [deleted] + * src/hal_diag.c: + * include/plf_stub.h: + * include/hal_diag.h: + * cdl/hal_mips_tx49_ref4955.cdl: + Whenever a serial driver is included, use it to service both ports + via the vector table, both for diag and stub use. Configurations + which rely on the vector table then do not need any serial driver, + regardless of which port is configured for use. + +2000-06-15 Jesper Skov + + * include/hal_diag.h: Only define HAL_PLF_DIAG functions when + required. + + * src/plf_misc.c: Comment fix. + + * src/plf_stub.c: Config option renamed. + + * src/hal_diag.c: + * include/hal_diag.h: + Use common HAL console wrappers for virtual vector diag. + + * cdl/hal_mips_tx49_ref4955.cdl: Added final console/debug comm + config options. Cleaned up USE_ROM_MONITOR option. + +2000-06-13 Jesper Skov + + * src/plf_misc.c (hal_ctrlc_isr): Only return handled when the irq + was indeed handled. + + * cdl/hal_mips_tx49_ref4955.cdl: Added some virtual vector config + variables. + +2000-06-09 Jesper Skov + + * src/hal_diag.c: Only use table diag if so configured. + +2000-06-08 Jesper Skov + + * src/plf_stub.c: init code moved to common HAL. + + * src/plf_misc.c: Moved some code and init responsibilities to + common HAL. + + * src/hal_diag.c: Allow use of ROM interface for diag IO. + + * include/plf_stub.h (HAL_STUB_PLATFORM_RESET_ENTRY): defined + (mostly for testing, as the board has reset). + + * include/hal_diag.h: Use diag_init to allow for configuration. + + * cdl/hal_mips_tx49_ref4955.cdl: Tweaks for + CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT. + +2000-06-06 Jonathan Larmour + + * misc/slow_cat.tcl: Use more correct runes to restart with tclsh + * misc/swap4.tcl: likewise + +2000-05-30 Jesper Skov + + * include/plf_intr.h: + Handle V320USC sources in mask/unmask/ack macros. + + * src/plf_misc.c: + * include/plf_intr.h: + Set VSC320 interrupt controller as per spec. + + * include/plf_stub.h (HAL_STUB_PLATFORM_RESET): Memory access to + reset board. + + * src/platform.S: + * src/plf_mk_defs.c: + Mask request bits with enable bits on VSC320. + +2000-05-26 Jesper Skov + + * include/pkgconf/mlt_mips_tx49_ref4955_rom.h: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.h: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt: + Updated MLT files. + +2000-05-25 Jesper Skov + + * src/plf_misc.c: Set up thread debug ptr. + + * cdl/hal_mips_tx49_ref4955.cdl: Include thread support in stub. + +2000-05-24 Jesper Skov + + * include/platform.inc: Don't use k0/k1 in init code (not a + problem per se, but for consistency). + +2000-05-23 Jesper Skov + + * src/plf_mk_defs.c: + * src/platform.S: + * include/plf_intr.h: + * include/platform.inc (hal_intc_translate): Use vectors 0-5 even + when chaining is enabled. + + * misc/slow_cat.tcl: Removed the regexp magic. gets handles the + conversion. + +2000-05-22 Jesper Skov + + * misc/slow_cat.tcl: Comments and minor tweaks. + + * src/platform.S: + * include/platform.inc: + * src/plf_mk_defs.c: + * cdl/hal_mips_tx49_ref4955.cdl: + Use mk_defs definitions instead of magic constants. + + * cdl/hal_mips_tx49_ref4955.cdl: Generate swapped srec file. + + * src/pc87338.inl: + * src/hal_diag.c: + Cleanup. + +2000-05-18 Jesper Skov + + * include/plf_io.h: Define endian-safe IO macros. + + * src/plf_stub.c: + * src/hal_diag.c: + Use specified ports. + + * cdl/hal_mips_tx49_ref4955.cdl: Change default endianess to + big. Add options to control debug/diag ports. + + * src/platform.S: Set V320SC to big-endian mode when required. + +2000-05-17 Jesper Skov + + * src/plf_stub.c: + * src/plf_misc.c: + * src/pc87338.inl: + Ctrl-c code uses local stub if available. + + * src/hal_diag.c: Fixed for running under stub. + + * include/plf_intr.h: Fix warnings. + + * include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi: + Leave gap for virtual table. + + * src/plf_misc.c: Support ctrl-c. + + * src/platform.S: Springboard code must use mask since sources are + set to interrupt when disabled. + + * src/pc87338.inl: Added interrupt definitions and interrupt init. + + * src/plf_stub.c: + * include/plf_stub.h: + Platform stub init of virtual vector table. + + * include/plf_intr.h: Added control macros. Only handles on-board + interrupt controller, not the V320USC one. + + * include/platform.inc: Use VSR/break springboard. + +2000-05-16 Jesper Skov + + * include/platform.inc: + Use FPU in 32 bit mode. + +2000-05-15 Jesper Skov + + * cdl/hal_mips_tx49_ref4955.cdl: Require warm-starts to be treated + like cold-starts. + + * src/plf_stub.c: + * include/plf_stub.h: + * include/plf_io.h: + * include/hal_diag.h: + Cleanup. + + * src/platform.S: Adjust springboard code for the three interrupt + controllers. + * include/plf_intr.h: Change vectors to match decoding. + * include/platform.inc: Cleanup. Enable FPU. + * cdl/hal_mips_tx49_ref4955.cdl: Cleanup. Fix incrementer rate. + +2000-05-12 Jesper Skov + + * src/plf_misc.c (hal_platform_init): Initialize SuperIO chip. + + * src/platform.S: Added magic assembler operand. + + * src/hal_diag.c: Cleaned up. + + * include/platform.inc (hal_memc_init): Added configury. + + * cdl/hal_mips_tx49_ref4955.cdl: Default to GDB_stubs ROM monitor. + +2000-05-11 Jesper Skov + + * include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi: + More space for vectors and VSR table [need to update .h&.ldi] + + * include/platform.inc: Move memory setup into a function. Fix + register typos. + + * include/platform.inc: Re-added the magic debug exception VSR + pointers. Copy VSRs to vector space [needs configury]. + + * include/pkgconf/mlt_mips_tx49_ref4955_ram.h: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.h: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi: + * include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt: + Updated for platform. + + * include/platform.inc: Some definitions added. + + * cdl/hal_mips_tx49_ref4955.cdl: don't move srec image. + +2000-05-10 Jesper Skov + + * Cloned from jmr3904. Still stuff to clean out and stuff to add. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/mips/ref4955/current/cdl/hal_mips_tx49_ref4955.cdl b/packages/hal/mips/ref4955/current/cdl/hal_mips_tx49_ref4955.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/cdl/hal_mips_tx49_ref4955.cdl @@ -0,0 +1,296 @@ +# ==================================================================== +# +# hal_mips_tx49_ref4955.cdl +# +# TX49/REF4955 board 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): jskov +# Original data: bartv +# Contributors: +# Date: 2000-05-15 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_MIPS_TX49_REF4955 { + display "REF4955 evaluation board" + parent CYGPKG_HAL_MIPS + requires CYGPKG_HAL_MIPS_TX49 + define_header hal_mips_tx49_ref4955.h + include_dir cyg/hal + description " + The REF4955 HAL package should be used when targetting the + actual hardware." + + compile hal_diag.c platform.S plf_misc.c plf_stub.c pc87338.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 " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + + puts $::cdl_header "#define CYGHWR_HAL_MIPS_WARMSTART_COLDSTART" + } + + cdl_component CYG_HAL_STARTUP { + display "Startup type" + flavor data + legal_values {"RAM" "ROM"} + default_value {"RAM"} + no_define + define -file system.h CYG_HAL_STARTUP + description " + When targetting the REF4955 board it is possible to build + the system for either RAM bootstrap or ROM bootstrap. RAM + bootstrap generally requires that the board + is equipped with ROMs containing a suitable ROM monitor or + equivalent software that allows GDB to download the eCos + application on to the board. The ROM bootstrap typically + requires that the eCos application be blown into EPROMs or + equivalent technology." + } + + cdl_option CYGHWR_HAL_MIPS_TX49_REF4955_ENDIAN { + display "Board endian mode" + flavor data + legal_values {"big" "little"} + default_value {"big"} + no_define + description " + The TX4955 Reference Platform can be used in either big or + little endian mode. This option select which. The board + will also need to be reconfigured if this option changes." + } + cdl_option CYGHWR_HAL_MIPS_TX49_REF4955_ENDIAN_SET { + display "Communicate endian setting to variant HAL" + active_if {CYGHWR_HAL_MIPS_TX49_REF4955_ENDIAN == "big"} + calculated 1 + implements CYGINT_HAL_MIPS_MSBFIRST + } + + 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 0 + description " + The REF4955 board has two separate serial ports. This option + chooses which of these ports 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 REF4955 board has two separate serial ports. This option + chooses which of these ports will be used for diagnostic output." + } + + # The "-o file" is a workaround for CR100958 - without it the + # output file would end up in the source directory under CygWin. + # n.b. grep does not behave itself under win32 + make -priority 1 { + /include/cyg/hal/plf_defs.inc : /src/plf_mk_defs.c + $(CC) $(CFLAGS) $(INCLUDE_PATH) -Wp,-MD,plf_defs.tmp -o plf_mk_defs.tmp -S $< + fgrep .equ plf_mk_defs.tmp | sed s/#// > $@ + @echo $@ ": \\" > $(notdir $@).deps + @tail +2 plf_defs.tmp >> $(notdir $@).deps + @echo >> $(notdir $@).deps + @rm plf_defs.tmp plf_mk_defs.tmp + } + + # Real-time clock/counter specifics + cdl_component CYGNUM_HAL_RTC_CONSTANTS { + display "Real-time clock constants." + flavor none + + 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 { 660000 } + description " + The count and compare registers of the TX49 are used + to drive the eCos kernel RTC. The count register + increments at 66MHz on the REF4955." + } + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + parent CYGPKG_NONE + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "mips-tx49-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 { CYGPKG_HAL_MIPS_MSBFIRST ? "-mips2 -EB -mabi=eabi -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" : "-mips2 -EL -mabi=eabi -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 { CYGPKG_HAL_MIPS_MSBFIRST ? "-g -mips2 -EB -mabi=eabi -nostdlib -Wl,--gc-sections -Wl,-static" : "-g -mips2 -EL -mabi=eabi -nostdlib -Wl,--gc-sections -Wl,-static" } + 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_CTRLC_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 + SREC data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.srec : /bin/gdb_module.img + $(OBJCOPY) --strip-unneeded -O srec $< pre-swap.srec + $(OBJCOPY) --strip-unneeded --change-addresses 0x40400000 $< be-swap.img + $(OBJCOPY) -O binary be-swap.img be-swap.bin + $(REPOSITORY)/$(PACKAGE)/misc/swap4.tcl be-swap.bin be.bin + $(OBJCOPY) --change-address 0xbfc00000 -I binary -O srec be.bin $@ + } + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "mips_tx49_ref4955_ram" : \ + "mips_tx49_ref4955_rom" } + + cdl_option CYGHWR_MEMORY_LAYOUT_LDI { + display "Memory layout linker script fragment" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_LDI + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + + cdl_option CYGHWR_MEMORY_LAYOUT_H { + display "Memory layout header file" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_H + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "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 GDB stubs. + This support changes various eCos semantics such as the encoding + of diagnostic output, or the overriding of hardware interrupt + vectors. + \"GDB_stubs\" provides support when GDB stubs are + included in the ROM monitor or boot ROM, allowing debugging + via GDB." + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } +} diff --git a/packages/hal/mips/ref4955/current/include/hal_diag.h b/packages/hal/mips/ref4955/current/include/hal_diag.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/hal_diag.h @@ -0,0 +1,83 @@ +#ifndef CYGONCE_HAL_HAL_DIAG_H +#define CYGONCE_HAL_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): jskov +// Contributors:jskov, nickg +// Date: 2000-05-15 +// Purpose: HAL Support for Kernel Diagnostic Routines +// Description: Diagnostic routines for use during kernel development. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include + +#define HAL_DIAG_INIT() hal_if_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) + +#else // everything by steam + +//----------------------------------------------------------------------------- +// 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 // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// end of hal_diag.h +#endif // CYGONCE_HAL_HAL_DIAG_H diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.h b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.h @@ -0,0 +1,37 @@ +// eCos memory layout - Fri Oct 20 06:22:02 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x80000000) +#define CYGMEM_REGION_ram_SIZE (0x4000000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vectors) []; +#endif +#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) +#define CYGMEM_SECTION_reserved_vectors_SIZE (0x200) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vsr_table) []; +#endif +#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) +#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_virtual_table) []; +#endif +#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) +#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_for_rom) []; +#endif +#define CYGMEM_SECTION_reserved_for_rom (CYG_LABEL_NAME (__reserved_for_rom)) +#define CYGMEM_SECTION_reserved_for_rom_SIZE (0x7c00) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x84000000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.ldi @@ -0,0 +1,43 @@ +// eCos memory layout - Fri Oct 20 06:22:02 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x80000000, LENGTH = 0x4000000 +} + +SECTIONS +{ + SECTIONS_BEGIN + CYG_LABEL_DEFN(__reserved_vectors) = 0x80000000; . = CYG_LABEL_DEFN(__reserved_vectors) + 0x200; + CYG_LABEL_DEFN(__reserved_vsr_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_vsr_table) + 0x100; + CYG_LABEL_DEFN(__reserved_virtual_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_virtual_table) + 0x100; + CYG_LABEL_DEFN(__reserved_for_rom) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_for_rom) + 0x7c00; + SECTION_rom_vectors (ram, ALIGN (0x10), LMA_EQ_VMA) + SECTION_ROMISC (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_RELOCS (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_init (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_data1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_eh_frame (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_ctors (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_dtors (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_devtab (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_got (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_dynamic (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_sdata (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_lit8 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_lit4 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_sbss (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt @@ -0,0 +1,29 @@ +version 0 +region ram 80000000 4000000 0 ! +section reserved_vectors 200 1 0 0 1 1 1 1 80000000 80000000 reserved_vsr_table reserved_vsr_table ! +section reserved_vsr_table 100 10 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! +section reserved_virtual_table 100 10 0 0 0 1 0 1 reserved_for_rom reserved_for_rom ! +section reserved_for_rom 7c00 10 0 0 0 1 0 1 rom_vectors rom_vectors ! +section rom_vectors 0 10 0 1 0 1 0 1 ROMISC ROMISC ! +section ROMISC 0 4 0 1 0 1 0 1 RELOCS RELOCS ! +section RELOCS 0 4 0 1 0 1 0 1 init init ! +section init 0 4 0 1 0 1 0 1 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 8 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 data data ! +section data 0 8 0 1 0 1 0 1 data1 data1 ! +section data1 0 8 0 1 0 1 0 1 eh_frame eh_frame ! +section eh_frame 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 ctors ctors ! +section ctors 0 4 0 1 0 1 0 1 dtors dtors ! +section dtors 0 4 0 1 0 1 0 1 devtab devtab ! +section devtab 0 4 0 1 0 1 0 1 got got ! +section got 0 4 0 1 0 1 0 1 dynamic dynamic ! +section dynamic 0 4 0 1 0 1 0 1 sdata sdata ! +section sdata 0 4 0 1 0 1 0 1 lit8 lit8 ! +section lit8 0 8 0 1 0 1 0 1 lit4 lit4 ! +section lit4 0 8 0 1 0 1 0 1 sbss sbss ! +section sbss 0 8 0 1 0 1 0 1 bss bss ! +section bss 0 8 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.h b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.h @@ -0,0 +1,35 @@ +// eCos memory layout - Fri Oct 20 06:22:57 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x80000000) +#define CYGMEM_REGION_ram_SIZE (0x4000000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0xbfc00000) +#define CYGMEM_REGION_rom_SIZE (0x1000000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vectors) []; +#endif +#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors)) +#define CYGMEM_SECTION_reserved_vectors_SIZE (0x200) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_vsr_table) []; +#endif +#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table)) +#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__reserved_virtual_table) []; +#endif +#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table)) +#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x84000000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.ldi @@ -0,0 +1,43 @@ +// eCos memory layout - Fri Oct 20 06:22:57 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x80000000, LENGTH = 0x4000000 + rom : ORIGIN = 0xbfc00000, LENGTH = 0x1000000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_rom_vectors (rom, 0xbfc00000, LMA_EQ_VMA) + SECTION_ROMISC (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_RELOCS (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_init (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA) + CYG_LABEL_DEFN(__reserved_vectors) = 0x80000000; . = CYG_LABEL_DEFN(__reserved_vectors) + 0x200; + CYG_LABEL_DEFN(__reserved_vsr_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_vsr_table) + 0x100; + CYG_LABEL_DEFN(__reserved_virtual_table) = ALIGN (0x10); . = CYG_LABEL_DEFN(__reserved_virtual_table) + 0x100; + SECTION_data (ram, ALIGN (0x10), FOLLOWING (.rodata1)) + SECTION_data1 (ram, ALIGN (0x8), FOLLOWING (.data)) + SECTION_eh_frame (ram, ALIGN (0x8), FOLLOWING (.data1)) + SECTION_gcc_except_table (ram, ALIGN (0x8), FOLLOWING (.eh_frame)) + SECTION_ctors (ram, ALIGN (0x8), FOLLOWING (.gcc_except_table)) + SECTION_dtors (ram, ALIGN (0x8), FOLLOWING (.ctors)) + SECTION_devtab (ram, ALIGN (0x8), FOLLOWING (.dtors)) + SECTION_got (ram, ALIGN (0x8), FOLLOWING (.devtab)) + SECTION_dynamic (ram, ALIGN (0x8), FOLLOWING (.got)) + SECTION_sdata (ram, ALIGN (0x8), FOLLOWING (.dynamic)) + SECTION_lit8 (ram, ALIGN (0x8), FOLLOWING (.sdata)) + SECTION_lit4 (ram, ALIGN (0x8), FOLLOWING (.lit8)) + SECTION_sbss (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/pkgconf/mlt_mips_tx49_ref4955_rom.mlt @@ -0,0 +1,29 @@ +version 0 +region ram 80000000 4000000 0 ! +region rom bfc00000 1000000 1 ! +section reserved_vectors 200 1 0 0 1 1 1 1 80000000 80000000 reserved_vsr_table reserved_vsr_table ! +section reserved_vsr_table 100 10 0 0 0 1 0 1 reserved_virtual_table reserved_virtual_table ! +section reserved_virtual_table 100 10 0 0 0 1 0 0 data ! +section data 0 10 1 1 0 1 0 1 data1 data1 ! +section data1 0 8 1 1 0 1 0 1 eh_frame eh_frame ! +section eh_frame 0 8 1 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 8 1 1 0 1 0 1 ctors ctors ! +section ctors 0 8 1 1 0 1 0 1 dtors dtors ! +section dtors 0 8 1 1 0 1 0 1 devtab devtab ! +section devtab 0 8 1 1 0 1 0 1 got got ! +section got 0 8 1 1 0 1 0 1 dynamic dynamic ! +section dynamic 0 8 1 1 0 1 0 1 sdata sdata ! +section sdata 0 8 1 1 0 1 0 1 lit8 lit8 ! +section lit8 0 8 1 1 0 1 0 1 lit4 lit4 ! +section lit4 0 8 1 1 0 1 0 0 sbss ! +section sbss 0 8 0 1 0 1 0 1 bss bss ! +section bss 0 8 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! +section rom_vectors 0 1 0 1 1 1 1 1 bfc00000 bfc00000 ROMISC ROMISC ! +section ROMISC 0 8 0 1 0 1 0 1 RELOCS RELOCS ! +section RELOCS 0 8 0 1 0 1 0 1 init init ! +section init 0 8 0 1 0 1 0 1 text text ! +section text 0 8 0 1 0 1 0 1 fini fini ! +section fini 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 0 0 1 data ! diff --git a/packages/hal/mips/ref4955/current/include/platform.inc b/packages/hal/mips/ref4955/current/include/platform.inc new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/platform.inc @@ -0,0 +1,234 @@ +#ifndef CYGONCE_HAL_PLATFORM_INC +#define CYGONCE_HAL_PLATFORM_INC +##============================================================================= +## +## platform.inc +## +## REF4955/TX4955 board assembler header file +## +##============================================================================= +#####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 +## Contributors:nickg,jskov +## Date: 2000-05-15 +## Purpose: REF4955/TX4955 board definitions. +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the REF4955/TX4955 board. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include +#include + + +#------------------------------------------------------------------------------ +# Macro for copying vectors to RAM if necessary. +#if !defined(CYGSEM_HAL_USE_ROM_MONITOR) + + .macro hal_vectors_init + # If we don~t play nice with a ROM monitor, copy the required + # vectors into the proper location. + la t0,0x80000000 # dest addr + la t1,utlb_vector # source addr + la t3,utlb_vector_end # end dest addr +1: + lw v0,0(t1) # get word + addi t1,t1,4 + sw v0,0(t0) # write word + addi t0,t0,4 + bne t1,t3,1b + nop + + la t0,0x80000180 # dest addr + la t1,other_vector # source addr + la t3,other_vector_end # end dest addr +1: + lw v0,0(t1) # get word + addi t1,t1,4 + sw v0,0(t0) # write word + addi t0,t0,4 + bne t1,t3,1b + nop + + .set mips3 # Set ISA to MIPS 3 to allow cache insns + # Now clear the region in the caches + la t0,0x80000000 # dest addr + ori t1,t0,0x200 # source addr +1: cache 0x01,0(t0) # Flush word from data cache + cache 0x01,1(t0) + cache 0x01,2(t0) + cache 0x01,3(t0) + nop + cache 0x00,0(t0) # Invalidate icache for word + cache 0x00,1(t0) + cache 0x00,2(t0) + cache 0x00,3(t0) + nop + addi t0,t0,0x20 + bne t0,t1,1b + nop + .set mips0 # reset ISA to default + + .endm + +#else + + .macro hal_vectors_init + .endm + +#endif + +#------------------------------------------------------------------------------ +# Monitor initialization. + +#ifndef CYGPKG_HAL_MIPS_MON_DEFINED + +#if defined(CYG_HAL_STARTUP_ROM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + + # If we are starting up from ROM, or we are starting in + # RAM and NOT using a ROM monitor, initialize the VSR table. + + .macro hal_mon_init + hal_vectors_init + # Set default exception VSR for all vectors + ori a0,zero,CYGNUM_HAL_VSR_COUNT + la a1,__default_exception_vsr + la a2,hal_vsr_table +1: sw a1,0(a2) + addi a2,a2,4 + addi a0,a0,-1 + bne a0,zero,1b + nop + + # Now set special VSRs + la a0,hal_vsr_table + # Set interrupt VSR + la a1,__default_interrupt_vsr + sw a1,CYGNUM_HAL_VECTOR_INTERRUPT*4(a0) + # Add special handler on breakpoint vector to allow GDB and + # GCC to both use 'break' without conflicts. + la a1,__break_vsr_springboard + sw a1,CYGNUM_HAL_VECTOR_BREAKPOINT*4(a0) + # Set exception handler on special vectors + # FIXME: Should use proper definitions + la a1,__default_exception_vsr + sw a1,32*4(a0) # debug + sw a1,33*4(a0) # utlb + sw a1,34*4(a0) # nmi + .endm + +#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) + + # Initialize the VSR table entries + # We only take control of the interrupt vector, + # the rest are left to the ROM for now... + + .macro hal_mon_init + hal_vectors_init + # Set interrupt VSR + la a0,hal_vsr_table + la a1,__default_interrupt_vsr + sw a1,CYGNUM_HAL_VECTOR_INTERRUPT*4(a0) + .endm + +#else + + .macro hal_mon_init + hal_vectors_init + .endm + +#endif + +#define CYGPKG_HAL_MIPS_MON_DEFINED +#endif + +#------------------------------------------------------------------------------ + +#if !defined(CYG_HAL_STARTUP_RAM) + .macro hal_memc_init + // Only initialize the SDRAM controller when running in ROM + .extern hal_memc_setup + lar t0,hal_memc_setup + jalr t0 + nop + .endm +#define CYGPKG_HAL_MIPS_MEMC_DEFINED +#endif + +#------------------------------------------------------------------------------ +# Decide whether the VSR table is defined externally, or is to be defined +# here. + +## ISR tables are defined in platform.S +#define CYG_HAL_MIPS_ISR_TABLES_DEFINED + +## VSR table is at a fixed RAM address defined by the linker script +#define CYG_HAL_MIPS_VSR_TABLE_DEFINED + +##----------------------------------------------------------------------------- +## For chaining, use the calculated cause vector number. + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + .macro hal_intc_translate inum,vnum + move \vnum,\inum # Vector == interrupt number + .endm +#define CYGPKG_HAL_MIPS_INTC_TRANSLATE_DEFINED +#endif + +##----------------------------------------------------------------------------- +#ifdef CYG_STARTUP_ROM + +## Initial SR value for use in ROM: +## CP0 usable +## Vectors in RAM +## FP registers are 32 bit +## All hw ints disabled +#define INITIAL_SR 0x30000000 + +#else + +## Initial SR value for use standalone: +## CP0 usable +## Vectors to RAM +## FP registers are 32 bit +## All hw ints disabled +#define INITIAL_SR 0x30000000 + +#endif + +#------------------------------------------------------------------------------ +#endif // ifndef CYGONCE_HAL_PLATFORM_INC +# end of platform.inc diff --git a/packages/hal/mips/ref4955/current/include/plf_cache.h b/packages/hal/mips/ref4955/current/include/plf_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/plf_cache.h @@ -0,0 +1,59 @@ +#ifndef CYGONCE_PLF_CACHE_H +#define CYGONCE_PLF_CACHE_H + +//============================================================================= +// +// plf_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): nickg +// Contributors: nickg +// Date: 1998-02-17 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//============================================================================= + +// Nothing here at present. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_PLF_CACHE_H +// End of plf_cache.h + diff --git a/packages/hal/mips/ref4955/current/include/plf_intr.h b/packages/hal/mips/ref4955/current/include/plf_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/plf_intr.h @@ -0,0 +1,302 @@ +#ifndef CYGONCE_HAL_PLF_INTR_H +#define CYGONCE_HAL_PLF_INTR_H + +//========================================================================== +// +// plf_intr.h +// +// REF4955 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): jskov +// Contributors: jskov, nickg +// Date: 2000-05-09 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock for the REF4955 board. +// +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include + +//-------------------------------------------------------------------------- +// Interrupt vectors. + +#ifndef CYGHWR_HAL_INTERRUPT_VECTORS_DEFINED + + +// The first 6 correspond to the interrupt lines in the status/cause regs +#define CYGNUM_HAL_INTERRUPT_V320USC_INT0 0 +#define CYGNUM_HAL_INTERRUPT_V320USC_INT1 1 +#define CYGNUM_HAL_INTERRUPT_EXT 2 +#define CYGNUM_HAL_INTERRUPT_LAN 3 +#define CYGNUM_HAL_INTERRUPT_IO 4 +#define CYGNUM_HAL_INTERRUPT_COMPARE 5 + + +#if defined(CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN) + +// This overlaps with LB_MBI below but it doesn't matter. It's only used +// by the HAL to access the special chaining entry in the ISR tables. +// All other attempted access to the ISR table will be redirected to this +// entry (curtsey of HAL_TRANSLATE_VECTOR). The other vector definitions +// are still valid, but only for enable/disable/config etc. (i.e., in +// chaining mode they have associated entries in the ISR tables). +#define CYGNUM_HAL_INTERRUPT_CHAINING 6 + +#define HAL_TRANSLATE_VECTOR(_vector_,_index_) \ + (_index_) = CYGNUM_HAL_INTERRUPT_CHAINING + +#endif + + +// The next 32 correspond to the interrupt lines in the V320USC's interrupt +// controller. These are decoded from the controller when an interrupt +// enters via CYGNUM_HAL_INTERRUPT_V320USC_INT0. +#define CYGNUM_HAL_INTERRUPT_INTC_V320USC_base 6 +#define CYGNUM_HAL_INTERRUPT_LB_MBI 6 +#define CYGNUM_HAL_INTERRUPT_PCI_MBI 7 +#define CYGNUM_HAL_INTERRUPT_RESERVED_2 8 +#define CYGNUM_HAL_INTERRUPT_I2O_OP_NE 9 +#define CYGNUM_HAL_INTERRUPT_I2O_IF_NF 10 +#define CYGNUM_HAL_INTERRUPT_I2O_IP_NE 11 +#define CYGNUM_HAL_INTERRUPT_I2O_OP_NF 12 +#define CYGNUM_HAL_INTERRUPT_I2O_OF_NE 13 +#define CYGNUM_HAL_INTERRUPT_RESERVED_8 14 +#define CYGNUM_HAL_INTERRUPT_RESERVED_9 15 +#define CYGNUM_HAL_INTERRUPT_RESERVED_10 16 +#define CYGNUM_HAL_INTERRUPT_RESERVED_11 17 +#define CYGNUM_HAL_INTERRUPT_TIMER0 18 +#define CYGNUM_HAL_INTERRUPT_TIMER1 19 +#define CYGNUM_HAL_INTERRUPT_RESERVED_14 20 +#define CYGNUM_HAL_INTERRUPT_ENUM 21 +#define CYGNUM_HAL_INTERRUPT_DMA0 22 +#define CYGNUM_HAL_INTERRUPT_DMA1 23 +#define CYGNUM_HAL_INTERRUPT_RESERVED_18 24 +#define CYGNUM_HAL_INTERRUPT_RESERVED_19 25 +#define CYGNUM_HAL_INTERRUPT_PWR_STATE 26 +#define CYGNUM_HAL_INTERRUPT_HBI 27 +#define CYGNUM_HAL_INTERRUPT_WDI 28 +#define CYGNUM_HAL_INTERRUPT_BWI 29 +#define CYGNUM_HAL_INTERRUPT_PSLAVE_PI 30 +#define CYGNUM_HAL_INTERRUPT_PMASTER_PI 31 +#define CYGNUM_HAL_INTERRUPT_PCI_T_ABORT 32 +#define CYGNUM_HAL_INTERRUPT_PCI_M_ABORT 33 +#define CYGNUM_HAL_INTERRUPT_DRAM_PI 34 +#define CYGNUM_HAL_INTERRUPT_RESERVED_29 35 +#define CYGNUM_HAL_INTERRUPT_DI0 36 +#define CYGNUM_HAL_INTERRUPT_DI1 37 + +// The next 6 correspond to the interrupt lines specific to the PCI +// connector (decoded from CYGNUM_HAL_INTERRUPT_V320USC_INT1) +#define CYGNUM_HAL_INTERRUPT_INTC_PCI_base 38 +#define CYGNUM_HAL_INTERRUPT_SERR 38 +#define CYGNUM_HAL_INTERRUPT_PERR 39 +#define CYGNUM_HAL_INTERRUPT_INTD 40 +#define CYGNUM_HAL_INTERRUPT_INTC 41 +#define CYGNUM_HAL_INTERRUPT_INTB 42 +#define CYGNUM_HAL_INTERRUPT_INTA 43 + +// The next 5 correspond to the interrupt lines specific to the REF4955 +// board (decoded from CYGNUM_HAL_INTERRUPT_IO) +#define CYGNUM_HAL_INTERRUPT_INTC_IO_base 44 +#define CYGNUM_HAL_INTERRUPT_SOFTWARE 44 +#define CYGNUM_HAL_INTERRUPT_INT_SWITCH 45 +#define CYGNUM_HAL_INTERRUPT_PARALLEL 46 +#define CYGNUM_HAL_INTERRUPT_DEBUG_UART 47 +#define CYGNUM_HAL_INTERRUPT_USER_UART 48 + + +// Min/Max ISR numbers and how many there are +#define CYGNUM_HAL_ISR_MIN CYGNUM_HAL_INTERRUPT_V320USC_INT0 +#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_USER_UART +#define CYGNUM_HAL_ISR_COUNT (CYGNUM_HAL_ISR_MAX - CYGNUM_HAL_ISR_MIN + 1) + +// The vector used by the Real time clock +#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_COMPARE + +#define CYGHWR_HAL_INTERRUPT_VECTORS_DEFINED + +#endif + +//-------------------------------------------------------------------------- +// Interrupt controler information + +// V320USC +#define CYGARC_REG_INT_STAT 0xb80000ec + +#define CYGARC_REG_INT_CFG0 0xb80000e0 +#define CYGARC_REG_INT_CFG1 0xb80000e4 +#define CYGARC_REG_INT_CFG2 0xb80000e8 +#define CYGARC_REG_INT_CFG3 0xb8000158 + +#define CYGARC_REG_INT_CFG_INT0 0x00000100 +#define CYGARC_REG_INT_CFG_INT1 0x00000200 +#define CYGARC_REG_INT_CFG_INT2 0x00000400 +#define CYGARC_REG_INT_CFG_INT3 0x00000800 + + +// FPGA +#define CYGARC_REG_PCI_STAT 0xb5300000 +#define CYGARC_REG_PCI_MASK 0xb5300030 + +#define CYGARC_REG_IO_STAT 0xb5300010 +#define CYGARC_REG_IO_MASK 0xb5300040 + + +#define HAL_INTERRUPT_MASK( _vector_ ) \ + CYG_MACRO_START \ + if( (_vector_) <= CYGNUM_HAL_INTERRUPT_COMPARE ) \ + { \ + asm volatile ( \ + "mfc0 $3,$12\n" \ + "la $2,0x00000400\n" \ + "sllv $2,$2,%0\n" \ + "nor $2,$2,$0\n" \ + "and $3,$3,$2\n" \ + "mtc0 $3,$12\n" \ + "nop; nop; nop\n" \ + : \ + : "r"(_vector_) \ + : "$2", "$3" \ + ); \ + } \ + else if ((_vector_) >= CYGNUM_HAL_INTERRUPT_INTC_IO_base) \ + { \ + cyg_uint8 _mask_; \ + cyg_uint32 _shift_ = (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_IO_base; \ + HAL_READ_UINT8(CYGARC_REG_IO_MASK, _mask_ ); \ + _mask_ &= ~(1<<_shift_); \ + HAL_WRITE_UINT8(CYGARC_REG_IO_MASK, _mask_ ); \ + } \ + else if (_vector_ >= CYGNUM_HAL_INTERRUPT_INTC_PCI_base) \ + { \ + cyg_uint8 _mask_; \ + cyg_uint32 _shift_ = (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_PCI_base; \ + HAL_READ_UINT8(CYGARC_REG_PCI_MASK, _mask_ ); \ + _mask_ &= ~(1<<_shift_); \ + HAL_WRITE_UINT8(CYGARC_REG_PCI_MASK, _mask_ ); \ + } else { /* V320USC */ \ + cyg_uint32 _mask_; \ + cyg_uint32 _shift_ = \ + (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_V320USC_base; \ + HAL_READ_UINT32(CYGARC_REG_INT_CFG0, _mask_ ); \ + _mask_ &= !(1<<_shift_); \ + HAL_WRITE_UINT32(CYGARC_REG_INT_CFG0, _mask_ ); \ + } \ + CYG_MACRO_END + +#define HAL_INTERRUPT_UNMASK( _vector_ ) \ + CYG_MACRO_START \ + if( (_vector_) <= CYGNUM_HAL_INTERRUPT_COMPARE ) \ + { \ + asm volatile ( \ + "mfc0 $3,$12\n" \ + "la $2,0x00000400\n" \ + "sllv $2,$2,%0\n" \ + "or $3,$3,$2\n" \ + "mtc0 $3,$12\n" \ + "nop; nop; nop\n" \ + : \ + : "r"(_vector_) \ + : "$2", "$3" \ + ); \ + } \ + else if ((_vector_) >= CYGNUM_HAL_INTERRUPT_INTC_IO_base) \ + { \ + cyg_uint8 _mask_; \ + cyg_uint32 _shift_ = (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_IO_base; \ + HAL_READ_UINT8(CYGARC_REG_IO_MASK, _mask_ ); \ + _mask_ |= (1<<_shift_); \ + HAL_WRITE_UINT8(CYGARC_REG_IO_MASK, _mask_ ); \ + } \ + else if (_vector_ >= CYGNUM_HAL_INTERRUPT_INTC_PCI_base) \ + { \ + cyg_uint8 _mask_; \ + cyg_uint32 _shift_ = (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_PCI_base; \ + HAL_READ_UINT8(CYGARC_REG_PCI_MASK, _mask_ ); \ + _mask_ |= (1<<_shift_); \ + HAL_WRITE_UINT8(CYGARC_REG_PCI_MASK, _mask_ ); \ + } else { /* V320USC */ \ + cyg_uint32 _mask_; \ + cyg_uint32 _shift_ = \ + (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_V320USC_base; \ + HAL_READ_UINT32(CYGARC_REG_INT_CFG0, _mask_ ); \ + _mask_ |= (1<<_shift_); \ + HAL_WRITE_UINT32(CYGARC_REG_INT_CFG0, _mask_ ); \ + } \ + CYG_MACRO_END + +#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \ + CYG_MACRO_START \ + cyg_uint32 _srvector_ = _vector_; \ + if ((_vector_) >= CYGNUM_HAL_INTERRUPT_INTC_IO_base) { \ + _srvector_ = CYGNUM_HAL_INTERRUPT_IO; \ + } else if (_vector_ >= CYGNUM_HAL_INTERRUPT_INTC_PCI_base) { \ + _srvector_ = CYGNUM_HAL_INTERRUPT_V320USC_INT1; \ + } else if (_vector_ >= CYGNUM_HAL_INTERRUPT_INTC_V320USC_base) { \ + cyg_uint32 _mask_; \ + cyg_uint32 _shift_ = \ + (_vector_)-CYGNUM_HAL_INTERRUPT_INTC_V320USC_base; \ + _mask_ = (1<<_shift_); \ + HAL_WRITE_UINT32(CYGARC_REG_INT_STAT, _mask_ ); \ + _srvector_ = CYGNUM_HAL_INTERRUPT_V320USC_INT0; \ + } \ + asm volatile ( \ + "mfc0 $3,$13\n" \ + "la $2,0x00000400\n" \ + "sllv $2,$2,%0\n" \ + "nor $2,$2,$0\n" \ + "and $3,$3,$2\n" \ + "mtc0 $3,$13\n" \ + "nop; nop; nop\n" \ + : \ + : "r"(_srvector_) \ + : "$2", "$3" \ + ); \ + CYG_MACRO_END + +#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) + +#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) + +#define CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_PLF_INTR_H +// End of plf_intr.h diff --git a/packages/hal/mips/ref4955/current/include/plf_io.h b/packages/hal/mips/ref4955/current/include/plf_io.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/plf_io.h @@ -0,0 +1,191 @@ +#ifndef CYGONCE_PLF_IO_H +#define CYGONCE_PLF_IO_H + +//============================================================================= +// +// plf_io.h +// +// HAL platform device IO register 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): nickg +// Contributors:nickg, jskov +// Date: 2000-05-18 +// Purpose: Define IO register support +// Description: The macros defined here provide the HAL APIs for handling +// device IO control registers. +// +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +//----------------------------------------------------------------------------- +// BYTE Register access. +// Individual and vectorized access to 8 bit registers. + +// Little-endian version +#if (CYG_BYTEORDER == CYG_LSBFIRST) + +#define HAL_READ_UINT8( _register_, _value_ ) \ + ((_value_) = *((volatile CYG_BYTE *)(_register_))) + +#define HAL_WRITE_UINT8( _register_, _value_ ) \ + (*((volatile CYG_BYTE *)(_register_)) = (_value_)) + +#define HAL_READ_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + (_buf_)[_i_] = ((volatile CYG_BYTE *)(_register_))[_j_]; \ + CYG_MACRO_END + +#define HAL_WRITE_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + ((volatile CYG_BYTE *)(_register_))[_j_] = (_buf_)[_i_]; \ + CYG_MACRO_END + +#else // Big-endian version + +#define HAL_READ_UINT8( _register_, _value_ ) \ + ((_value_) = *((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3))) + +#define HAL_WRITE_UINT8( _register_, _value_ ) \ + (*((volatile CYG_BYTE *)((CYG_ADDRWORD)(_register_)^3)) = (_value_)) + +#define HAL_READ_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + volatile CYG_BYTE* _r_ = ((CYG_ADDRWORD)(_register_)^3); \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + (_buf_)[_i_] = _r_[_j_]; \ + CYG_MACRO_END + +#define HAL_WRITE_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + volatile CYG_BYTE* _r_ = ((CYG_ADDRWORD)(_register_)^3); \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + _r_[_j_] = (_buf_)[_i_]; \ + CYG_MACRO_END + +#endif // Big-endian + +//----------------------------------------------------------------------------- +// 16 bit access. +// Individual and vectorized access to 16 bit registers. + +// Little-endian version +#if (CYG_BYTEORDER == CYG_LSBFIRST) + +#define HAL_READ_UINT16( _register_, _value_ ) \ + ((_value_) = *((volatile CYG_WORD16 *)(_register_))) + +#define HAL_WRITE_UINT16( _register_, _value_ ) \ + (*((volatile CYG_WORD16 *)(_register_)) = (_value_)) + +#define HAL_READ_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + (_buf_)[_i_] = ((volatile CYG_WORD16 *)(_register_))[_j_]; \ + CYG_MACRO_END + +#define HAL_WRITE_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + ((volatile CYG_WORD16 *)(_register_))[_j_] = (_buf_)[_i_]; \ + CYG_MACRO_END + +#else // Big-endian version + +#define HAL_READ_UINT16( _register_, _value_ ) \ + ((_value_) = *((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3))) + +#define HAL_WRITE_UINT16( _register_, _value_ ) \ + (*((volatile CYG_WORD16 *)((CYG_ADDRWORD)(_register_)^3)) = (_value_)) + +#define HAL_READ_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + volatile CYG_WORD16* _r_ = ((CYG_ADDRWORD)(_register_)^3); \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + (_buf_)[_i_] = _r_[_j_]; \ + CYG_MACRO_END + +#define HAL_WRITE_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \ + CYG_MACRO_START \ + cyg_count32 _i_,_j_; \ + volatile CYG_WORD16* _r_ = ((CYG_ADDRWORD)(_register_)^3); \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + _r_[_j_] = (_buf_)[_i_]; \ + CYG_MACRO_END + +#endif // Big-endian + +//----------------------------------------------------------------------------- +// 32 bit access. +// Individual and vectorized access to 32 bit registers. + +// Note: same macros for little- and big-endian systems. + +#define HAL_READ_UINT32( _register_, _value_ ) \ + ((_value_) = *((volatile CYG_WORD32 *)(_register_))) + +#define HAL_WRITE_UINT32( _register_, _value_ ) \ + (*((volatile CYG_WORD32 *)(_register_)) = (_value_)) + +#define HAL_READ_UINT32_VECTOR( _register_, _buf_, _count_, _step_ ) \ +{ \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + (_buf_)[_i_] = ((volatile CYG_WORD32 *)(_register_))[_j_]; \ +} + +#define HAL_WRITE_UINT32_VECTOR( _register_, _buf_, _count_, _step_ ) \ +{ \ + cyg_count32 _i_,_j_; \ + for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \ + ((volatile CYG_WORD32 *)(_register_))[_j_] = (_buf_)[_i_]; \ +} + +#define HAL_IO_MACROS_DEFINED + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_PLF_IO_H +// End of plf_io.h diff --git a/packages/hal/mips/ref4955/current/include/plf_stub.h b/packages/hal/mips/ref4955/current/include/plf_stub.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/include/plf_stub.h @@ -0,0 +1,85 @@ +#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): jskov +// Contributors:jskov +// Date: 2000-05-15 +// Purpose: Platform HAL stub support for MIPS/REF4955 boards. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include // CYG_UNUSED_PARAM + +#include // architecture stub support + +//---------------------------------------------------------------------------- +// 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 +#define HAL_STUB_PLATFORM_INIT_BREAK_IRQ() CYG_EMPTY_STATEMENT + +//---------------------------------------------------------------------------- +// Stub initializer. +extern void hal_plf_stub_init( void ); +#define HAL_STUB_PLATFORM_INIT() hal_plf_stub_init(); + +//---------------------------------------------------------------------------- +// Reset. +#define CYGARC_REG_BOARD_RESET 0xb5400000 + +#define HAL_STUB_PLATFORM_RESET() HAL_WRITE_UINT8(CYGARC_REG_BOARD_RESET,0) + +#define HAL_STUB_PLATFORM_RESET_ENTRY 0xbfc00000 + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +//----------------------------------------------------------------------------- +#endif // CYGONCE_HAL_PLF_STUB_H +// End of plf_stub.h diff --git a/packages/hal/mips/ref4955/current/misc/slow_cat.tcl b/packages/hal/mips/ref4955/current/misc/slow_cat.tcl new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/misc/slow_cat.tcl @@ -0,0 +1,25 @@ +#!/bin/sh +# these lines restart using the tcl shell \ + exec sh -c "if ( echo | tclsh ) 2>/dev/null ; then \ + exec tclsh \"${0}\" ${1+${*}} ; \ + elif ( echo | cygtclsh80 ) 2>/dev/null ; then \ + exec cygtclsh80 \"${0}\" ${1+${*}} ; \ + else \ + echo Could not find TCL interpreter ; \ + exit 1 ; \ + fi" + +# Can be used like this: +# Get flash ready for programming using Minicom or similar +# [o (Option menu), a (flAsh menu), b (Boot write)] +# Then execute the following +# slow_cat.tcl < install/bin/gdb_module.srec >/dev/ttyS0 + +# Delay lines by 1/10 of a second to allow the flash to recover The +# gets also strips off the broken (DOS) new-lines that objcopy is +# generating. The puts replace them with 0x0a which the firmware +# requires. +while { 0 <= [gets stdin line] } { + puts $line + after 100 +} diff --git a/packages/hal/mips/ref4955/current/misc/swap4.tcl b/packages/hal/mips/ref4955/current/misc/swap4.tcl new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/misc/swap4.tcl @@ -0,0 +1,30 @@ +#!/bin/sh +# these lines restart using the tcl shell \ + exec sh -c "if ( echo | tclsh ) 2>/dev/null ; then \ + exec tclsh \"${0}\" ${1+${*}} ; \ + elif ( echo | cygtclsh80 ) 2>/dev/null ; then \ + exec cygtclsh80 \"${0}\" ${1+${*}} ; \ + else \ + echo Could not find TCL interpreter ; \ + exit 1 ; \ + fi" + +proc filter { input_file output_file } { + set input_fd [open $input_file "r"] + set output_fd [open $output_file "w"] + + fconfigure $input_fd -translation binary + fconfigure $output_fd -translation binary + while { 1 } { + set data [read $input_fd 4] + if { [eof $input_fd] } { + break + } + binary scan $data "i" var + puts -nonewline $output_fd [binary format "I" $var] + } + close $input_fd + close $output_fd +} + +filter [lindex $argv 0] [lindex $argv 1] diff --git a/packages/hal/mips/ref4955/current/src/hal_diag.c b/packages/hal/mips/ref4955/current/src/hal_diag.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/hal_diag.c @@ -0,0 +1,209 @@ +//============================================================================= +// +// 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): jskov +// Contributors:nickg, jskov +// Date: 2000-05-10 +// Purpose: HAL diagnostic output +// Description: Implementations of HAL diagnostic output support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include // base types +#include // tracing macros +#include // assertion macros + +#include +#include + +#include +#include // Helper functions + +#include + +#include // ROM calling interface + +#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) +#include // CYG_HAL_GDB_x_CRITICAL_IO_REGION +#endif + +externC void cyg_hal_plf_serial_init_channel(void* __ch_data); +externC void cyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 __ch); +externC cyg_uint8 cyg_hal_plf_serial_getc(void* __ch_data); + +//----------------------------------------------------------------------------- +// Hit the hardware directly. Either wrap in GDB O-packets, or write +// data raw to device. + +// Decide when to wrap text output as GDB O-packets +#if (CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL \ + == CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL) + +#if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) \ + || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) + +#define CYG_DIAG_GDB + +#endif + +#endif + +//----------------------------------------------------------------------------- +// There are two serial ports. Hardwire to use one of them. +#define CYG_DEVICE_SERIAL_SCC1 0xb40003f8 // port 1 +#define CYG_DEVICE_SERIAL_SCC2 0xb40002f8 // port 2 + +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +#if (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL == 0) +#define BASE ((cyg_uint8*)CYG_DEVICE_SERIAL_SCC1) +#else +#define BASE ((cyg_uint8*)CYG_DEVICE_SERIAL_SCC2) +#endif + +static channel_data_t channel = { BASE, 0, 0}; + +#ifdef CYG_DIAG_GDB + +void +hal_diag_write_char(char c) +{ + static char line[100]; + static int pos = 0; + + // 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; + char c1; + + cyg_hal_plf_serial_putc(&channel, '$'); + cyg_hal_plf_serial_putc(&channel, '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(&channel, h); + cyg_hal_plf_serial_putc(&channel, l); + csum += h; + csum += l; + } + cyg_hal_plf_serial_putc(&channel, '#'); + cyg_hal_plf_serial_putc(&channel, hex[(csum>>4)&0xF]); + cyg_hal_plf_serial_putc(&channel, hex[csum&0xF]); + + c1 = cyg_hal_plf_serial_getc(&channel); + + if( c1 == '+' ) break; + } + + 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 + } +} + +void +hal_diag_read_char(char *c) +{ + *c = cyg_hal_plf_serial_getc(&channel); +} + +#else // CYG_DIAG_GDB + +// Hit the hardware directly, no GDB translation + +void +hal_diag_read_char(char *c) +{ + *c = cyg_hal_plf_serial_getc(&channel); +} + +void +hal_diag_write_char(char c) +{ + cyg_hal_plf_serial_putc(&channel, c); +} + + +#endif + +// Reagardless whether encoding or not we alway initialize the device. + +void +hal_diag_init(void) +{ + // Init serial device + cyg_hal_plf_serial_init_channel((void*)&channel); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// End of hal_diag.c diff --git a/packages/hal/mips/ref4955/current/src/pc87338.c b/packages/hal/mips/ref4955/current/src/pc87338.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/pc87338.c @@ -0,0 +1,413 @@ +#ifndef CYGONCE_HAL_PC_SER_H +#define CYGONCE_HAL_PC_SER_H +//============================================================================= +// +// pc87338.c +// +// Simple driver for the serial controllers in the PC87338 SuperIO chip +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-06-20 +// Description: Simple driver for the PC87338 serial controllers +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include // SAVE/RESTORE GP macros +#include // IO macros +#include // interface API +#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS +#include // Helper functions +#include // CYG_ISR_HANDLED + +//----------------------------------------------------------------------------- +// Controller definitions. + +//----------------------------------------------------------------------------- +// There are two serial ports. +#define CYG_DEVICE_SERIAL_SCC1 0xb40003f8 // port 1 +#define CYG_DEVICE_SERIAL_SCC2 0xb40002f8 // port 2 + +//----------------------------------------------------------------------------- +// Serial registers (shared by all banks) +#define CYG_DEVICE_BSR (0x03) +#define CYG_DEVICE_LCR (0x03) + +#define CYG_DEVICE_BSR_BANK0 0x00 +#define CYG_DEVICE_BSR_BANK2 0xe0 + +#define CYG_DEVICE_LCR_LEN_5BIT 0x00 +#define CYG_DEVICE_LCR_LEN_6BIT 0x01 +#define CYG_DEVICE_LCR_LEN_7BIT 0x02 +#define CYG_DEVICE_LCR_LEN_8BIT 0x03 +#define CYG_DEVICE_LCR_STOP_1 0x00 +#define CYG_DEVICE_LCR_STOP_2 0x04 +#define CYG_DEVICE_LCR_PARITY_NONE 0x00 +#define CYG_DEVICE_LCR_PARITY_ODD 0x08 +#define CYG_DEVICE_LCR_PARITY_EVEN 0x18 +#define CYG_DEVICE_LCR_PARITY_LOGIC1 0x28 +#define CYG_DEVICE_LCR_PARITY_LOGIC0 0x38 +#define CYG_DEVICE_LCR_SBRK 0x40 + +// Bank 0 (control/status) +#define CYG_DEVICE_BK0_TXD (0x00) +#define CYG_DEVICE_BK0_RXD (0x00) +#define CYG_DEVICE_BK0_IER (0x01) +#define CYG_DEVICE_BK0_EIR (0x02) +#define CYG_DEVICE_BK0_FCR (0x02) +#define CYG_DEVICE_BK0_MCR (0x04) +#define CYG_DEVICE_BK0_LSR (0x05) +#define CYG_DEVICE_BK0_MSR (0x06) +#define CYG_DEVICE_BK0_SPR (0x07) +#define CYG_DEVICE_BK0_ASCR (0x07) + +#define CYG_DEVICE_BK0_LSR_RXDA 0x01 +#define CYG_DEVICE_BK0_LSR_OE 0x02 +#define CYG_DEVICE_BK0_LSR_PE 0x04 +#define CYG_DEVICE_BK0_LSR_FE 0x08 +#define CYG_DEVICE_BK0_LSR_BRK 0x10 +#define CYG_DEVICE_BK0_LSR_TXRDY 0x20 +#define CYG_DEVICE_BK0_LSR_TXEMP 0x40 +#define CYG_DEVICE_BK0_LSR_ER_INF 0x80 + +#define CYG_DEVICE_BK0_IER_TMR_IE 0x80 +#define CYG_DEVICE_BK0_IER_SFIF_IE 0x40 +#define CYG_DEVICE_BK0_IER_TXEMP_IE 0x20 +#define CYG_DEVICE_BK0_IER_DMA_IE 0x10 +#define CYG_DEVICE_BK0_IER_MS_IE 0x08 +#define CYG_DEVICE_BK0_IER_LS_IE 0x04 +#define CYG_DEVICE_BK0_IER_TXLDL_IE 0x02 +#define CYG_DEVICE_BK0_IER_RXHDL_IE 0x01 + +#define CYG_DEVICE_BK0_EIR_FEN1 0x80 +#define CYG_DEVICE_BK0_EIR_FEN0 0x40 +#define CYG_DEVICE_BK0_EIR_RXFT 0x08 +#define CYG_DEVICE_BK0_EIR_IPR1 0x04 +#define CYG_DEVICE_BK0_EIR_IPR0 0x02 +#define CYG_DEVICE_BK0_EIR_IPF 0x01 + +#define CYG_DEVICE_BK0_EIR_mask 0x07 +#define CYG_DEVICE_BK0_EIR_IRQ_ERR 0x06 +#define CYG_DEVICE_BK0_EIR_IRQ_RX 0x04 +#define CYG_DEVICE_BK0_EIR_IRQ_TX 0x02 + +#define CYG_DEVICE_BK0_MCR_ISEN 0x08 // interrupt signal enable + + +// Bank 2 (baud generator) +#define CYG_DEVICE_BK2_BGDL (0x00) +#define CYG_DEVICE_BK2_BGDH (0x01) +#define CYG_DEVICE_BK2_EXCR1 (0x02) +#define CYG_DEVICE_BK2_EXCR2 (0x04) +#define CYG_DEVICE_BK2_TXFLV (0x06) +#define CYG_DEVICE_BK2_RXFLV (0x07) + + +//----------------------------------------------------------------------------- +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +//----------------------------------------------------------------------------- +// The minimal init, get and put functions. All by polling. + +void +cyg_hal_plf_serial_init_channel(void* __ch_data) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 lcr; + + HAL_WRITE_UINT8(base+CYG_DEVICE_BSR, CYG_DEVICE_BSR_BANK0); + HAL_WRITE_UINT8(base+CYG_DEVICE_BK0_IER, 0); + HAL_WRITE_UINT8(base+CYG_DEVICE_BK0_MCR, CYG_DEVICE_BK0_MCR_ISEN); + + // Disable FIFOs + HAL_WRITE_UINT8(base+CYG_DEVICE_BK0_FCR, 0); + + // 8-1-no parity. + HAL_WRITE_UINT8(base+CYG_DEVICE_LCR, + CYG_DEVICE_LCR_LEN_8BIT | CYG_DEVICE_LCR_STOP_1 | CYG_DEVICE_LCR_PARITY_NONE); + + // Set speed to 38400 (switch bank, remember old LCR setting) + HAL_READ_UINT8(base+CYG_DEVICE_LCR, lcr); + HAL_WRITE_UINT8(base+CYG_DEVICE_BSR, CYG_DEVICE_BSR_BANK2); + HAL_WRITE_UINT8(base+CYG_DEVICE_BK2_BGDL, 3); + HAL_WRITE_UINT8(base+CYG_DEVICE_BK2_BGDH, 0); + HAL_WRITE_UINT8(base+CYG_DEVICE_LCR, lcr); +} + +void +cyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 __ch) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 lsr; + CYGARC_HAL_SAVE_GP(); + + do { + HAL_READ_UINT8(base+CYG_DEVICE_BK0_LSR, lsr); + } while ((lsr & CYG_DEVICE_BK0_LSR_TXRDY) == 0); + + HAL_WRITE_UINT8(base+CYG_DEVICE_BK0_TXD, __ch); + + // Hang around until the character has been safely sent. + do { + HAL_READ_UINT8(base+CYG_DEVICE_BK0_LSR, lsr); + } while ((lsr & CYG_DEVICE_BK0_LSR_TXRDY) == 0); + + 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_DEVICE_BK0_LSR, lsr); + if ((lsr & CYG_DEVICE_BK0_LSR_RXDA) == 0) + return false; + + HAL_READ_UINT8 (base+CYG_DEVICE_BK0_RXD, *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 const channel_data_t channels[2] = { + { (cyg_uint8*)CYG_DEVICE_SERIAL_SCC1, 1000, CYGNUM_HAL_INTERRUPT_DEBUG_UART}, + { (cyg_uint8*)CYG_DEVICE_SERIAL_SCC2, 1000, CYGNUM_HAL_INTERRUPT_USER_UART} +}; + +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; + cyg_uint8 ier; + int ret = 0; + CYGARC_HAL_SAVE_GP(); + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + + HAL_READ_UINT8(chan->base+CYG_DEVICE_BK0_IER, ier); + ier |= CYG_DEVICE_BK0_IER_RXHDL_IE; + HAL_WRITE_UINT8(chan->base+CYG_DEVICE_BK0_IER, ier); + + HAL_INTERRUPT_SET_LEVEL(chan->isr_vector, 1); + HAL_INTERRUPT_UNMASK(chan->isr_vector); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + + HAL_READ_UINT8(chan->base+CYG_DEVICE_BK0_IER, ier); + ier &= ~CYG_DEVICE_BK0_IER_RXHDL_IE; + HAL_WRITE_UINT8(chan->base+CYG_DEVICE_BK0_IER, ier); + + 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; + cyg_uint8 eir, c; + channel_data_t* chan = (channel_data_t*)__ch_data; + CYGARC_HAL_SAVE_GP(); + + HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector); + + HAL_READ_UINT8(chan->base+CYG_DEVICE_BK0_EIR, eir); + + *__ctrlc = 0; + if( (eir & CYG_DEVICE_BK0_EIR_mask) == CYG_DEVICE_BK0_EIR_IRQ_RX ) { + + HAL_READ_UINT8(chan->base+CYG_DEVICE_BK0_RXD, 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(channels[0].isr_vector); + HAL_INTERRUPT_MASK(channels[1].isr_vector); + + // Init channels + cyg_hal_plf_serial_init_channel((void*)&channels[0]); + cyg_hal_plf_serial_init_channel((void*)&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, &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, &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 + +//----------------------------------------------------------------------------- +// end of pc87338.c +#endif // CYGONCE_HAL_PC_SER_INL diff --git a/packages/hal/mips/ref4955/current/src/platform.S b/packages/hal/mips/ref4955/current/src/platform.S new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/platform.S @@ -0,0 +1,338 @@ +##============================================================================= +## +## platform.S +## +## MIPS REF4955-TX4955 platform 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): nickg +## Contributors:nickg, jskov +## Date: 2000-05-09 +## Purpose: MIPS REF4955-TX4955 platform code +## Description: Platform specific code for REF4955-TX4955 board. +## +######DESCRIPTIONEND#### +## +##============================================================================= + + .set noreorder + +#include +#include + +#ifdef CYGPKG_KERNEL +# include +#endif + +#include +#include + +##----------------------------------------------------------------------------- +## ISR springboard. +## This routine decodes the interrupt from the various interrupt controllers +## and vectors to it. + + # On entry: + # a0 = MIPS status register interrupt number (1,2 or 3) + # a1 = ISR data value (= interrupt controller reg address) + # a2 = saved reg dump ptr + # s0 = saved reg dump ptr + # s1 = vector table offset + # s2 = interrupt number + # a3,v0,v1 etc available for use + + .text + +FUNC_START(hal_isr_springboard_pci) + lbu v0,0(a1) + nor v0,v0,v0 + la a1,CYGARC_REG_PCI_MASK + lbu a2,0(a1) + and v0,v0,a2 + addi a2,$0,CYGNUM_HAL_INTERRUPT_INTC_PCI_base + b hal_isr_springboard + nop +FUNC_END(hal_isr_springboard_pci) + +FUNC_START(hal_isr_springboard_io) + lbu v0,0(a1) + nor v0,v0,v0 + la a1,CYGARC_REG_IO_MASK + lbu a2,0(a1) + and v0,v0,a2 + addi a2,$0,CYGNUM_HAL_INTERRUPT_INTC_IO_base + b hal_isr_springboard + nop +FUNC_END(hal_isr_springboard_io) + +hal_isr_springboard_v320usc: + lw v0,0(a1) + la a1,CYGARC_REG_INT_CFG0 + lw v1,0(a1) + lw a2,4(a1) # CFG1 + or v1,v1,a2 + lw a2,8(a1) # CFG2 + or v1,v1,a2 + la a1,CYGARC_REG_INT_CFG3 + lw a2,0(a1) + or v1,v1,a2 + and v0,v0,v1 + addi a2,$0,CYGNUM_HAL_INTERRUPT_INTC_V320USC_base + +FUNC_START(hal_isr_springboard) + + # The following code implements an ls bit index algorithm similar + # to that in hal_lsbit_index() in hal_misc.c. + negu v1,v0 # v1 = -v0 + and v1,v1,v0 # v1 &= v0 [isolate ls bit] + sll v0,v1,16 # v0 = v1<<16 + subu v1,v0,v1 # v1 = v0 - v1 + sll a0,v1,6 # a0 = v1<<6 + addu v1,v1,a0 # v1 += a0 + sll a1,v1,4 # a1 = v1<<4 + addu v1,v1,a1 # v1 += a1 + la v0,hal_isr_springboard_table # v0 = table address + srl v1,v1,26 # v1 = v1>>26 + addu v1,v1,v0 # v1 = table entry address + lb a0,0(v1) # a0 = intc isr number + + add s2,a0,a2 # s2 = eCos isr number +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN +hal_isr_springboard_chaining: + # This serves as the __default_interrupt_isr entry-point in + # chaning mode, thus ensuring that all interrupts from + # vectors 0-5 eventually end up on the special CHAINING vector. + # (See the hal_interrupt_handlers table) + ori s1,zero,CYGNUM_HAL_INTERRUPT_CHAINING*4 # s1 = chaining isr ix +#else + sll s1,s2,2 # s1 = isr table index +#endif + + la v1,hal_interrupt_handlers + add v1,v1,s1 # v1 = isr handler address + lw v1,0(v1) # v1 = isr handler + + la a1,hal_interrupt_data + add a1,a1,s1 # a1 = address of data ptr + lw a1,0(a1) # a1 = data pointer + + move a0,s2 # pass interrupt number + + jr v1 # jump to handler, return is to + # default vsr already in ra + nop + +FUNC_END(hal_isr_springboard) + + +hal_isr_springboard_table: + .byte -1, 0, 1, 12, 2, 6, 0, 13 + .byte 3, 0, 7, 0, 0, 0, 0, 14 + .byte 10, 4, 0, 0, 8, 0, 0, 25 + .byte 0, 0, 0, 0, 0, 21, 27, 15 + .byte 31, 11, 5, 0, 0, 0, 0, 0 + .byte 9, 0, 0, 24, 0, 0, 20, 26 + .byte 30, 0, 0, 0, 0, 23, 0, 19 + .byte 29, 0, 22, 18, 28, 17, 16, 0 + + +##----------------------------------------------------------------------------- +## MEMC initialization. +## This also initializes the PCI bus and ISA bus bridge, so at the end of this +## we should have full access to all the memory and devices we need. +## This code is table driven, which is somewhat more compact that coding it all. +## Table entries consist of an address and a value to store in that address. +## A zero address terminates the table. Two special address values modify the +## behaviour: +## DELAY_LOOP loops for the number of iterations in the value field. +## WRITE16 treats the next 2 words as an address and value to be written +## with a 16 bit write cycle. + +#if !defined(CYG_HAL_STARTUP_RAM) + +#define DELAY_LOOP 1 +#define WRITE16 2 + +FUNC_START(hal_memc_setup) + + lar t0,hal_memc_setup_table + la t1,0xbfc00000 + la t2,DELAY_LOOP + la t3,WRITE16 +1: + lw a0,0(t0) # next table entry + lw a1,4(t0) # value to write + addiu t0,8 # go to next entry + beq a0,t2,2f # Check for delay + nop + beq a0,t3,3f # Check for 16 bit write + nop + beqz a0,9f # zero terminates loop + nop + sw a1,0(a0) # write it + lw zero,0(t1) # uncached read to flush write buffer + b 1b + nop +2: + lw zero,0(t1) # uncached read to flush write buffer + bnez a1,2b # count down by value in a1 + addiu a1,-1 # decrement in delay slot + b 1b # go back to loop + nop +3: + lw a3,0(t0) # get next word + addiu t0,4 # skip it + sh a3,0(a1) # store halfword + lw zero,0(t1) # uncached read to flush write buffer + b 1b + nop +9: + jr ra + nop + +FUNC_END(hal_memc_setup) + + +##----------------------------------------------------------------------------- +## The initialization table + +#define USC_LB_BUS_CFG 0xb800007c +#define USC_SDRAM_MA_CMD 0xb8000088 + +hal_memc_setup_table: + + .long DELAY_LOOP, 10000 # Wait for HW to settle + +#ifdef CYGPKG_HAL_MIPS_MSBFIRST + # V320SC : big-endian, max bus watch timer + .long USC_LB_BUS_CFG, 0x04010ff0 +#else + .long USC_LB_BUS_CFG, 0x04000ff0 +#endif + .long USC_SDRAM_MA_CMD, 0x00a70000 + .long USC_SDRAM_MA_CMD, 0x00e70220 + + .long 0, 0 + +#endif // !CYG_HAL_STARTUP_RAM + +##----------------------------------------------------------------------------- +## ISR tables. + + .extern hal_default_isr + + .data + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + .globl hal_interrupt_handlers +hal_interrupt_handlers: + # These first 6 vectors all go through a springboard for further + # interrupt controller vector decoding before ending up on the + # special chaining vector below. + .long hal_isr_springboard_v320usc + .long hal_isr_springboard_pci + .long hal_isr_springboard_chaining + .long hal_isr_springboard_chaining + .long hal_isr_springboard_io + .long hal_isr_springboard_chaining + + .long hal_default_isr # chaining vector + + .globl hal_interrupt_data +hal_interrupt_data: + .long CYGARC_REG_INT_STAT + .long CYGARC_REG_PCI_STAT + .long 0 + .long 0 + .long CYGARC_REG_IO_STAT + .long 0 + + .long 0 # chaining vector data + + .globl hal_interrupt_objects +hal_interrupt_objects: + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + + .long 0 # chaining vector object + + .globl cyg_hal_interrupt_level +cyg_hal_interrupt_level: + .rept CYGNUM_HAL_ISR_COUNT + .byte 0 + .endr + +#else // CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + + .globl hal_interrupt_handlers +hal_interrupt_handlers: + .long hal_isr_springboard_v320usc + .long hal_isr_springboard_pci + .long hal_default_isr + .long hal_default_isr + .long hal_isr_springboard_io + .long hal_default_isr + + .rept CYGNUM_HAL_ISR_COUNT-6 + .long hal_default_isr + .endr + + .globl hal_interrupt_data +hal_interrupt_data: + .long CYGARC_REG_INT_STAT + .long CYGARC_REG_PCI_STAT + .long 0 + .long 0 + .long CYGARC_REG_IO_STAT + .long 0 + + .rept CYGNUM_HAL_ISR_COUNT-6 + .long 0 + .endr + + .globl hal_interrupt_objects +hal_interrupt_objects: + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr + + .globl cyg_hal_interrupt_level +cyg_hal_interrupt_level: + .rept CYGNUM_HAL_ISR_COUNT + .byte 0 + .endr + +#endif // CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + +##----------------------------------------------------------------------------- +## end of platform.S diff --git a/packages/hal/mips/ref4955/current/src/plf_misc.c b/packages/hal/mips/ref4955/current/src/plf_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/plf_misc.c @@ -0,0 +1,114 @@ +//========================================================================== +// +// plf_misc.c +// +// HAL platform miscellaneous functions +// +//========================================================================== +//####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 +// Contributors: nickg, jlarmour, jskov +// Date: 2000-05-15 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // Base types +#include // tracing macros +#include // assertion macros + +#include // architectural definitions + +#include // Interrupt handling + +#include // Cache handling +#include // CYG_ISR_HANDLED + +#include // Calling interface definitions +#include // Helper functions + +//-------------------------------------------------------------------------- + +#define CYGARC_REG_SUPERIO_IREG 0xb4000398 +#define CYGARC_REG_SUPERIO_DREG 0xb4000399 + +#define CYGARC_REG_SUPERIO_FER 0x00 // function enable +#define CYGARC_REG_SUPERIO_FAR 0x01 // function address +#define CYGARC_REG_SUPERIO_PTR 0x02 // power and test +#define CYGARC_REG_SUPERIO_CLK 0x51 // clock controller + + +#define CYGARC_REG_SUPERIO_FER_PAR 0x01 +#define CYGARC_REG_SUPERIO_FER_SCC1 0x02 +#define CYGARC_REG_SUPERIO_FER_SCC2 0x04 + +#define CYGARC_REG_SUPERIO_CLK_14M 0x00 // 14MHz source +#define CYGARC_REG_SUPERIO_CLK_CME 0x04 // clock multiplier enabled + +#define CYGARC_REG_SUPERIO_PTR_PPEXT 0x80 // extended + + + + +static void write_super_io(cyg_uint8 offset, cyg_uint8 data) +{ + HAL_WRITE_UINT8(CYGARC_REG_SUPERIO_IREG, offset); + HAL_WRITE_UINT8(CYGARC_REG_SUPERIO_DREG, data); + HAL_WRITE_UINT8(CYGARC_REG_SUPERIO_DREG, data); +} + +void hal_platform_init(void) +{ + hal_if_init(); + + // Configure the SuperIO chip + write_super_io(CYGARC_REG_SUPERIO_FER, + CYGARC_REG_SUPERIO_FER_SCC1|CYGARC_REG_SUPERIO_FER_SCC2); + write_super_io(CYGARC_REG_SUPERIO_FAR, 0x10); + write_super_io(CYGARC_REG_SUPERIO_CLK, + CYGARC_REG_SUPERIO_CLK_14M|CYGARC_REG_SUPERIO_CLK_CME); + + // Set up VSC320 interrupt controller. INT1 must merge INT2 and + // INT3 according to the platform specification. + HAL_WRITE_UINT32(CYGARC_REG_INT_CFG1, + CYGARC_REG_INT_CFG_INT2|CYGARC_REG_INT_CFG_INT3); + + // Unmask vectors which are entry points for interrupt controllers + HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_V320USC_INT0); + HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_V320USC_INT1); + HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_IO); +} + +//-------------------------------------------------------------------------- +// End of plf_misc.c diff --git a/packages/hal/mips/ref4955/current/src/plf_mk_defs.c b/packages/hal/mips/ref4955/current/src/plf_mk_defs.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/plf_mk_defs.c @@ -0,0 +1,97 @@ +//========================================================================== +// +// plf_mk_defs.c +// +// HAL (platform) "make defs" program +// +//========================================================================== +//####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 +// Date: 2000-05-11 +// Purpose: Platform dependent definition generator +// Description: This file contains code that can be compiled by the target +// compiler and used to generate machine specific definitions +// suitable for use in assembly code. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // HAL header +#include // HAL header +#include // HAL header +#ifdef CYGPKG_KERNEL +# include +# include +#endif + +/* + * This program is used to generate definitions needed by + * assembly language modules. + * + * This technique was first used in the OSF Mach kernel code: + * generate asm statements containing #defines, + * compile this file to assembler, and then extract the + * #defines from the assembly-language output. + */ + +#define DEFINE(sym, val) \ + asm volatile("\n\t.equ\t" #sym ",%0" : : "i" (val)) + +int +main(void) +{ + // Some other exception related definitions + DEFINE(CYGNUM_HAL_ISR_COUNT, CYGNUM_HAL_ISR_COUNT); + DEFINE(CYGNUM_HAL_VSR_COUNT, CYGNUM_HAL_VSR_COUNT); + DEFINE(CYGNUM_HAL_VECTOR_INTERRUPT, CYGNUM_HAL_VECTOR_INTERRUPT); + DEFINE(CYGNUM_HAL_VECTOR_BREAKPOINT, CYGNUM_HAL_VECTOR_BREAKPOINT); + + // Interrupt details + DEFINE(CYGNUM_HAL_INTERRUPT_INTC_V320USC_base, CYGNUM_HAL_INTERRUPT_INTC_V320USC_base); + DEFINE(CYGNUM_HAL_INTERRUPT_INTC_PCI_base, CYGNUM_HAL_INTERRUPT_INTC_PCI_base); + DEFINE(CYGNUM_HAL_INTERRUPT_INTC_IO_base, CYGNUM_HAL_INTERRUPT_INTC_IO_base); + DEFINE(CYGARC_REG_INT_STAT, CYGARC_REG_INT_STAT); + DEFINE(CYGARC_REG_PCI_STAT, CYGARC_REG_PCI_STAT); + DEFINE(CYGARC_REG_IO_STAT, CYGARC_REG_IO_STAT); + DEFINE(CYGARC_REG_PCI_MASK, CYGARC_REG_PCI_MASK); + DEFINE(CYGARC_REG_IO_MASK, CYGARC_REG_IO_MASK); + DEFINE(CYGARC_REG_INT_CFG0, CYGARC_REG_INT_CFG0); + DEFINE(CYGARC_REG_INT_CFG3, CYGARC_REG_INT_CFG3); +#if defined(CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN) + DEFINE(CYGNUM_HAL_INTERRUPT_CHAINING, CYGNUM_HAL_INTERRUPT_CHAINING); +#endif + + return 0; +} + +//-------------------------------------------------------------------------- +// EOF plf_mk_defs.c diff --git a/packages/hal/mips/ref4955/current/src/plf_stub.c b/packages/hal/mips/ref4955/current/src/plf_stub.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/ref4955/current/src/plf_stub.c @@ -0,0 +1,61 @@ +//============================================================================= +// +// 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): jskov +// Contributors:jskov +// Date: 2000-05-15 +// Purpose: Platform specific code for GDB stub support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include + +#include // HAL IO macros + +//----------------------------------------------------------------------------- +// Stub init + +void +hal_plf_stub_init(void) +{ +} + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +//----------------------------------------------------------------------------- +// End of plf_stub.c diff --git a/packages/hal/mips/tx49/current/ChangeLog b/packages/hal/mips/tx49/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/ChangeLog @@ -0,0 +1,117 @@ +2000-09-12 Jesper Skov + + * include/variant.inc: Enable div-by-zero FPU exceptions. + +2000-09-06 Jesper Skov + + * include/variant.inc: Enable the cache after clearing it. + +2000-09-01 Jonathan Larmour + + * include/var_arch.h: tx49 GDB stubs now use 32-bits internally to + represent registers + +2000-08-31 Jonathan Larmour + + * src/mips_tx49.ld: Use HAL table sections instead of devtab sections + +2000-06-06 Jesper Skov + + * include/var_cache.h: Define HAL_ICACHE_INVALIDATE_ALL which + disables cache during operation. + +2000-05-25 Jesper Skov + + * cdl/hal_mips_tx49.cdl: Use FPU double-LE layout in 32bit mode. + +2000-05-24 Jesper Skov + + * src/mips_tx49.ld: Application contructors run after eCos + constructors. + +2000-05-22 Jesper Skov + + * include/variant.inc: Flush all ways of cache on startup. + + * include/var_cache.h: + * cdl/hal_mips_tx49.cdl: Comment cleanups. + + * include/var_cache.h: Cleaned up. Use arch macros. + +2000-05-18 Jesper Skov + + * src/mips_tx49.ld: Exclude libgcc constructors from CTOR list. + + * cdl/hal_mips_tx49.cdl: Set cache size to 32kB. + +2000-05-17 Jesper Skov + + * src/mips_tx49.ld (hal_virtual_vector_table): Added. + +2000-05-16 Jesper Skov + + * cdl/hal_mips_tx49.cdl: Platform can select FPU mode. + +2000-05-15 Jesper Skov + + * include/variant.inc: + * include/var_cache.h: + The cache-enable bits must be 0 to enable. Enable + caching/writeback for kseg0. + + * src/variant.S: + * include/var_arch.h: + Cleanup. + + * include/variant.inc: Copied in various stuff from VR4300 file. + + * include/var_cache.h: Cleanup. Added enabled macros. + + * cdl/hal_mips_tx49.cdl: Cleanup. Enable FPU. + +2000-05-11 Jesper Skov + + * src/mips_tx49.ld: Workaround minor tool problem. + + * src/variant.S: Emptied. + + * src/mips_tx49.ld: Move vsr to avoid conflict with 'other' + exception entry having vectors in RAM. + + * include/var_arch.h: GDB expects 64 bit registers. + + * cdl/hal_mips_tx49.cdl: Add (disabled) 64 bit related options. + + * src/mips_tx49.ld: Workaround for linker buglet. + + * include/var_cache.h: Minor tweaks. + +2000-05-09 Jesper Skov + + * Cloned from hal/mips/tx39 + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/mips/tx49/current/cdl/hal_mips_tx49.cdl b/packages/hal/mips/tx49/current/cdl/hal_mips_tx49.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/cdl/hal_mips_tx49.cdl @@ -0,0 +1,142 @@ +# ==================================================================== +# +# hal_mips_tx49.cdl +# +# MIPS/TX49 variant 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): jskov +# Original data: bartv, nickg +# Contributors: +# Date: 2000-05-15 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_MIPS_TX49 { + display "TX49 variant" + parent CYGPKG_HAL_MIPS + hardware + include_dir cyg/hal + define_header hal_mips_tx49.h + description " + The TX49 architecture HAL package provides generic support + for this processor architecture. It is also necessary to + select a specific target platform HAL package." + + cdl_component CYGPKG_HAL_MIPS_TX4955 { + display "TX4955 microprocessor" + default_value 1 + implements CYGINT_HAL_MIPS_VARIANT + description " + The TMPR4955F microprocessor. This is an embedded part that in + addition to the TX49 processor core has built in peripherals + such as memory controllers, DMA controllers, serial ports and + timers/counters." + + define_proc { + # Sizes are configurable (on the core). Should be configurable. + puts $::cdl_header "#define CYGHWR_HAL_DCACHE_SIZE 32768" + puts $::cdl_header "#define CYGHWR_HAL_ICACHE_SIZE 32768" + } + + cdl_option CYGHWR_HAL_MIPS_64BIT { + display "Variant 64 bit architecture support" + description " + While the TX49 is a 64bit CPU, only its 32bit mode is + currently supported in eCos." + calculated 0 + } + + # This is optional (on the core). Should be configurable. + cdl_option CYGHWR_HAL_MIPS_FPU { + display "Variant FPU support" + calculated 1 + } + + cdl_interface CYGINT_HAL_MIPS_FPU_64BIT { + display "Variant 64 bit FPU support interface" + } + + cdl_option CYGHWR_HAL_MIPS_FPU_64BIT { + display "Variant 64 bit FPU support" + calculated { CYGINT_HAL_MIPS_FPU_64BIT == 1 ? 1 : 0 } + } + + cdl_option CYGHWR_HAL_MIPS_FPU_32BIT { + display "Variant 32 bit FPU support" + calculated { CYGINT_HAL_MIPS_FPU_64BIT == 0 ? 1 : 0 } + } + + # FGRn+1 is most significant part of the FGRn&FGRn+1 pair of FPRn/2 + # This is true for BE mips2 mode at least. Not sure about fp64 mode + cdl_option CYGPKG_HAL_MIPS_DOUBLE_LSBFIRST { + active_if CYGHWR_HAL_MIPS_FPU_32BIT + calculated 1 + } + + cdl_interface CYGINT_HAL_MIPS_MSBFIRST { + no_define + display "CPU Variant big-endian interface" + } + + cdl_option CYGPKG_HAL_MIPS_MSBFIRST { + display "CPU Variant big-endian" + calculated { CYGINT_HAL_MIPS_MSBFIRST == 0 ? 0 : 1 } + } + + cdl_option CYGPKG_HAL_MIPS_LSBFIRST { + display "CPU Variant little-endian" + calculated { CYGINT_HAL_MIPS_MSBFIRST != 0 ? 0 : 1 } + } + } + + define_proc { + puts $::cdl_header "#include " + } + + compile var_misc.c variant.S + + make { + /lib/target.ld: /src/mips_tx49.ld + $(CC) -E -P -Wp,-MD,target.tmp -DEXTRAS=1 -xc $(INCLUDE_PATH) $(CFLAGS) -o $@ $< + @echo $@ ": \\" > $(notdir $@).deps + @tail +2 target.tmp >> $(notdir $@).deps + @echo >> $(notdir $@).deps + @rm target.tmp + } + + cdl_option CYGBLD_LINKER_SCRIPT { + display "Linker script" + flavor data + no_define + calculated { "src/mips_tx49.ld" } + } +} diff --git a/packages/hal/mips/tx49/current/include/var_arch.h b/packages/hal/mips/tx49/current/include/var_arch.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/include/var_arch.h @@ -0,0 +1,62 @@ +#ifndef CYGONCE_HAL_VAR_ARCH_H +#define CYGONCE_HAL_VAR_ARCH_H + +//========================================================================== +// +// var_arch.h +// +// Architecture specific abstractions +// +//========================================================================== +//####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 +// Contributors: nickg, jskov +// Date: 2000-05-15 +// Purpose: Define architecture abstractions +// Description: This file contains any extra or modified definitions for +// this variant of the architecture. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include + +// ------------------------------------------------------------------------- +// Although the TX49 is really a 64 bit CPU, we have defined +// target_register_t elsewhere to be 32-bits because we only support +// 32-bit mode. Registers will still be sent to GDB as 64-bit, but that's +// not relevant for CYG_HAL_GDB_REG. + +#define CYG_HAL_GDB_REG CYG_WORD32 + +//-------------------------------------------------------------------------- +#endif // CYGONCE_HAL_VAR_ARCH_H +// End of var_arch.h diff --git a/packages/hal/mips/tx49/current/include/var_cache.h b/packages/hal/mips/tx49/current/include/var_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/include/var_cache.h @@ -0,0 +1,202 @@ +#ifndef CYGONCE_VAR_CACHE_H +#define CYGONCE_VAR_CACHE_H + +//============================================================================= +// +// var_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): nickg +// Contributors:nickg, jskov +// Date: 2000-05-09 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include + +#include + +#include + +//============================================================================= +// Toshiba TX4955 + +#ifdef CYGPKG_HAL_MIPS_TX4955 + +//----------------------------------------------------------------------------- +// Cache dimensions + +// Data cache +#define HAL_DCACHE_SIZE CYGHWR_HAL_DCACHE_SIZE // size in bytes +#define HAL_DCACHE_LINE_SIZE 32 // Size of a data cache line +#define HAL_DCACHE_WAYS 4 // Associativity of the cache + +// Instruction cache +#define HAL_ICACHE_SIZE CYGHWR_HAL_ICACHE_SIZE // size in bytes +#define HAL_ICACHE_LINE_SIZE 32 // Size of a cache line +#define HAL_ICACHE_WAYS 4 // Associativity of the cache + +#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) +#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) + +//----------------------------------------------------------------------------- +// Cache controls + +// Register $16 is Config register (controls cache state) + +// Config Register fields +#define CYGARC_REG_CONFIG_ICE 0x00020000 // Instruction cache enable +#define CYGARC_REG_CONFIG_DCE 0x00010000 // Data cache enable + + +//----------------------------------------------------------------------------- +// Global control of data cache + +// Enable the data cache +// This uses a bit in the config register, which is TX49 specific. +#define HAL_DCACHE_ENABLE_DEFINED +#define HAL_DCACHE_ENABLE() \ + CYG_MACRO_START \ + cyg_uint32 tmp; \ + asm volatile ("mfc0 %0,$16;" \ + "and %0,%0,%1;" \ + "mtc0 %0,$16;" \ + : "=&r" (tmp) \ + : "r" (~CYGARC_REG_CONFIG_DCE) \ + ); \ + CYG_MACRO_END + +// Disable the data cache +#define HAL_DCACHE_DISABLE_DEFINED +#define HAL_DCACHE_DISABLE() \ + CYG_MACRO_START \ + cyg_uint32 tmp; \ + asm volatile ("mfc0 %0,$16;" \ + "or %0,%0,%1;" \ + "mtc0 %0,$16;" \ + : "=&r" (tmp) \ + : "r" (CYGARC_REG_CONFIG_DCE) \ + ); \ + CYG_MACRO_END + +#define HAL_DCACHE_IS_ENABLED_DEFINED +#define HAL_DCACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + cyg_uint32 _cstate_; \ + asm volatile ( "mfc0 %0,$16\n" \ + : "=r"(_cstate_) \ + ); \ + if( _cstate_ & CYGARC_REG_CONFIG_DCE) \ + _state_ = 0; \ + else \ + _state_ = 1; \ + CYG_MACRO_END + +// Architecture HAL defines other operations + + +//----------------------------------------------------------------------------- +// Global control of Instruction cache + +// Enable the instruction cache +#define HAL_ICACHE_ENABLE_DEFINED +#define HAL_ICACHE_ENABLE() \ + CYG_MACRO_START \ + cyg_uint32 tmp; \ + asm volatile ("mfc0 %0,$16;" \ + "and %0,%0,%1;" \ + "mtc0 %0,$16;" \ + : "=&r" (tmp) \ + : "r" (~CYGARC_REG_CONFIG_ICE) \ + ); \ + CYG_MACRO_END + +// Disable the instruction cache +#define HAL_ICACHE_DISABLE_DEFINED +#define HAL_ICACHE_DISABLE() \ + CYG_MACRO_START \ + cyg_uint32 tmp; \ + asm volatile ("mfc0 %0,$16;" \ + "or %0,%0,%1;" \ + "mtc0 %0,$16;" \ + : "=&r" (tmp) \ + : "r" (CYGARC_REG_CONFIG_ICE) \ + ); \ + CYG_MACRO_END + +#define HAL_ICACHE_IS_ENABLED_DEFINED +#define HAL_ICACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + cyg_uint32 _cstate_; \ + asm volatile ( "mfc0 %0,$16\n" \ + : "=r"(_cstate_) \ + ); \ + if( _cstate_ & CYGARC_REG_CONFIG_ICE) \ + _state_ = 0; \ + else \ + _state_ = 1; \ + CYG_MACRO_END + +// TX49 cache instruction must not affect the line it executes out of, +// so disable instruction cache before invalidating it. +#define HAL_ICACHE_INVALIDATE_ALL_DEFINED +#define HAL_ICACHE_INVALIDATE_ALL() \ + CYG_MACRO_START \ + register CYG_ADDRESS _baddr_ = 0x80000000; \ + register CYG_ADDRESS _addr_ = 0x80000000; \ + register CYG_WORD _state_; \ + _HAL_ASM_SET_MIPS_ISA(3); \ + HAL_ICACHE_IS_ENABLED( _state_ ); \ + HAL_ICACHE_DISABLE(); \ + for( ; _addr_ < _baddr_+HAL_ICACHE_SIZE; _addr_ += HAL_ICACHE_LINE_SIZE ) \ + { _HAL_ASM_ICACHE_ALL_WAYS(0x00, _addr_); } \ + if( _state_ ) HAL_ICACHE_ENABLE(); \ + _HAL_ASM_SET_MIPS_ISA(0); \ + CYG_MACRO_END + +// Architecture HAL defines other operations + +#endif // CYGPKG_HAL_MIPS_TX4955 + + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_CACHE_H +// End of var_cache.h diff --git a/packages/hal/mips/tx49/current/include/var_intr.h b/packages/hal/mips/tx49/current/include/var_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/include/var_intr.h @@ -0,0 +1,72 @@ +#ifndef CYGONCE_HAL_VAR_INTR_H +#define CYGONCE_HAL_VAR_INTR_H + +//========================================================================== +// +// imp_intr.h +// +// TX49 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): jskov +// Contributors: jskov +// Date: 2000-05-09 +// Purpose: TX49 Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock for variants of the TX49 MIPS +// architecture. +// +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include + + +//-------------------------------------------------------------------------- +// Interrupt vectors. + +// Vectors and handling of these are defined in platform HALs since the +// CPU itself does not have a builtin interrupt controller. + +//-------------------------------------------------------------------------- +// Clock control + +// This is handled by the default code + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_VAR_INTR_H +// End of var_intr.h diff --git a/packages/hal/mips/tx49/current/include/variant.inc b/packages/hal/mips/tx49/current/include/variant.inc new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/include/variant.inc @@ -0,0 +1,160 @@ +#ifndef CYGONCE_HAL_VARIANT_INC +#define CYGONCE_HAL_VARIANT_INC +##============================================================================= +## +## variant.inc +## +## TX49 family assembler header file +## +##============================================================================= +#####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 +## Contributors:nickg, jskov +## Date: 2000-05-10 +## Purpose: TX49 family definitions. +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the TX49 CPU family. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#include + +##----------------------------------------------------------------------------- +## Define CPU variant for architecture HAL. + +#define CYG_HAL_MIPS_R4900 + +#------------------------------------------------------------------------------ +# Set up initial value for config register. Sets endian mode and +# enable the cache on kseg0. + +#if defined(CYGPKG_HAL_MIPS_MSBFIRST) +# define INITIAL_CONFIG0 0x00008000 +#elif defined(CYGPKG_HAL_MIPS_LSBFIRST) +# define INITIAL_CONFIG0 0x00000000 +#else +# error MIPS endianness not set by configuration +#endif + +#------------------------------------------------------------------------------ +# Set up initial value for FPU FCR31 register. We set the FS bit to flush +# denormalized results to zero and enable div-by-zero exceptions. + +#ifndef CYG_HAL_MIPS_FCSR_INIT +#define CYG_HAL_MIPS_FCSR_INIT 0x01000400 +#endif + +#------------------------------------------------------------------------------ +# Cache macros. + +#ifndef CYGPKG_HAL_MIPS_CACHE_DEFINED + + .macro hal_cache_init + + mfc0 v0,config0 # disable caches, but allow caching + nop # on kseg0 so cache macros can just + nop # fiddle ICE/IDE later on. + la v1,0xfffffff8 + and v0,v0,v1 + ori v0,v0,3 # kseg0 is writeback cache enabled + lui v1,3 + or v0,v0,v1 # set ICE&IDE (disables caches) + mtc0 v0,config0 + nop + nop + nop + + .set mips3 # Set ISA to MIPS 3 to allow cache insns + + # Now ensure the caches are invalidated. The caches are NOT cleared or + # invalidated on non-power-up resets and may come up in a random state + # on power-up. Hence they may contain stale or randomly bogus data. + # Here we use the index-store-tag cache operation to clear all the + # cache tags and states to zero. This will render them all invalid on + # the TX49. + + # D-cache: + la t0,0x80000000 + ori t1,t0,0x8000 +1: + mtc0 zero,$28 + mtc0 zero,$29 + cache 0x09,0(t0) + cache 0x09,1(t0) + cache 0x09,2(t0) + cache 0x09,3(t0) + addi t0,t0,0x20 + sub v0,t1,t0 + bgez v0,1b + nop # delay slot + + # I-cache: + la a0,0x80000000 + ori a1,a0,0x8000 +1: + mtc0 zero,$28 + mtc0 zero,$29 + cache 0x08,0(a0) + cache 0x08,1(a0) + cache 0x08,2(a0) + cache 0x08,3(a0) + addi a0,a0,0x20 + sub v0,a1,a0 + bgez v0,1b + nop # delay slot + + .set mips0 # reset ISA to default + + # Now enable caches + mfc0 v0,config0 + nop + nop + la v1,0xfffcffff # clear ICE&IDE (enables caches) + and v0,v0,v1 + mtc0 v0,config0 + nop + nop + nop + + .endm + +#define CYGPKG_HAL_MIPS_CACHE_DEFINED + +#endif + +#------------------------------------------------------------------------------ +#endif // ifndef CYGONCE_HAL_VARIANT_INC +# end of variant.inc diff --git a/packages/hal/mips/tx49/current/src/mips_tx49.ld b/packages/hal/mips/tx49/current/src/mips_tx49.ld new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/src/mips_tx49.ld @@ -0,0 +1,359 @@ +//=========================================================================== +// +// MLT linker script for MIPS TX49 +// +//=========================================================================== +//####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#### +//=========================================================================== + +#include + +OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", + "elf32-littlemips") +/* The preprocessor defines mips, but we know we're mips :-) */ +#undef mips +OUTPUT_ARCH(mips:4900) + +STARTUP(vectors.o) +ENTRY(reset_vector) +#if defined(EXTRAS) && defined(CYGPKG_IO) +INPUT(extras.o) +#endif +GROUP(libtarget.a libgcc.a) + +/* FIXME: The MLT should pass in the required alignment since it must be + * the same as the VMA's alignment. As a result of this bug, all the REF4955 + * ROM mlt files have alignment 8, when some should have alignment 4 + * (902557-CR) + */ +#define ALIGN_LMA 8 +#define FOLLOWING(_section_) AT ((LOADADDR (_section_) + SIZEOF (_section_) + ALIGN_LMA - 1) & ~ (ALIGN_LMA - 1)) +#define LMA_EQ_VMA +#define FORCE_OUTPUT . = . + +#define SECTIONS_BEGIN + +#if defined(CYG_HAL_STARTUP_RAM) + +/* this version for RAM startup */ +#define SECTION_rom_vectors(_region_, _vma_, _lma_) \ + .rom_vectors _vma_ : _lma_ \ + { KEEP (*(.utlb_vector)) \ + . = ALIGN(0x80); KEEP(*(.other_vector)) \ + /* debug and reset vector not used in RAM version */ \ + KEEP(*(.debug_vector)) \ + KEEP (*(.reset_vector)) } \ + > _region_ + +#elif defined(CYG_HAL_STARTUP_ROM) + +/* this version for ROM startup */ +#define SECTION_rom_vectors(_region_, _vma_, _lma_) \ + .rom_vectors _vma_ : _lma_ \ + { KEEP (*(.reset_vector)) \ + . = ALIGN(0x100); KEEP (*(.utlb_vector)) \ + . = ALIGN(0x80); KEEP(*(.other_vector)) \ + . = ALIGN(0x100); KEEP(*(.debug_vector)) } \ + > _region_ + +#endif /* ROM startup version of ROM vectors */ + +#define SECTION_ROMISC(_region_, _vma_, _lma_) \ + .interp _vma_ : _lma_ { *(.interp) } > _region_ \ + .hash : FOLLOWING(.interp) { *(.hash) } > _region_ \ + .dynsym : FOLLOWING(.hash) { *(.dynsym) } > _region_ \ + .dynstr : FOLLOWING(.dynsym) { *(.dynstr) } > _region_ \ + .gnu.version : FOLLOWING(.dynstr) { *(.gnu.version) } > _region_ \ + .gnu.version_d : FOLLOWING(.gnu.version) { *(.gnu.version_d) } > _region_ \ + .gnu.version_r : FOLLOWING(.gnu.version_d) { *(.gnu.version_r) } > _region_ \ + .plt : FOLLOWING(.gnu.version_r) { *(.plt) } > _region_ + +#define SECTION_RELOCS(_region_, _vma_, _lma_) \ + .rel.text : \ + { \ + *(.rel.text) \ + *(.rel.text.*) \ + *(.rel.gnu.linkonce.t*) \ + } > _region_ \ + .rela.text : \ + { \ + *(.rela.text) \ + *(.rela.text.*) \ + *(.rela.gnu.linkonce.t*) \ + } > _region_ \ + .rel.data : \ + { \ + *(.rel.data) \ + *(.rel.data.*) \ + *(.rel.gnu.linkonce.d*) \ + } > _region_ \ + .rela.data : \ + { \ + *(.rela.data) \ + *(.rela.data.*) \ + *(.rela.gnu.linkonce.d*) \ + } > _region_ \ + .rel.rodata : \ + { \ + *(.rel.rodata) \ + *(.rel.rodata.*) \ + *(.rel.gnu.linkonce.r*) \ + } > _region_ \ + .rela.rodata : \ + { \ + *(.rela.rodata) \ + *(.rela.rodata.*) \ + *(.rela.gnu.linkonce.r*) \ + } > _region_ \ + .rel.got : { *(.rel.got) } > _region_ \ + .rela.got : { *(.rela.got) } > _region_ \ + .rel.ctors : { *(.rel.ctors) } > _region_ \ + .rela.ctors : { *(.rela.ctors) } > _region_ \ + .rel.dtors : { *(.rel.dtors) } > _region_ \ + .rela.dtors : { *(.rela.dtors) } > _region_ \ + .rel.init : { *(.rel.init) } > _region_ \ + .rela.init : { *(.rela.init) } > _region_ \ + .rel.fini : { *(.rel.fini) } > _region_ \ + .rela.fini : { *(.rela.fini) } > _region_ \ + .rel.bss : { *(.rel.bss) } > _region_ \ + .rela.bss : { *(.rela.bss) } > _region_ \ + .rel.plt : { *(.rel.plt) } > _region_ \ + .rela.plt : { *(.rela.plt) } > _region_ \ + .rel.dyn : { *(.rel.dyn) } > _region_ + +#define SECTION_init(_region_, _vma_, _lma_) \ + .init _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; KEEP (*(.init)) \ + } > _region_ =0 + +#define SECTION_text(_region_, _vma_, _lma_) \ + .text _vma_ : _lma_ \ + { \ + _stext = .; _ftext = . ; \ + *(.text) \ + *(.text.*) \ + *(.stub) \ + *(.gnu.warning) \ + *(.gnu.linkonce.t*) \ + *(.mips16.fn.*) *(.mips16.call.*) \ + } > _region_ =0 \ + _etext = .; PROVIDE (etext = .); + +#define SECTION_fini(_region_, _vma_, _lma_) \ + .fini _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; KEEP (*(.fini)) \ + } > _region_ =0 + +#define SECTION_rodata(_region_, _vma_, _lma_) \ + .rodata _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) \ + } > _region_ + +#define SECTION_rodata1(_region_, _vma_, _lma_) \ + .rodata1 _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.rodata1) *(.rodata1.*) \ + } > _region_ + +#define SECTION_vsr_table(_region_, _vma_, _lma_) \ + .vsr_table _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.vsr_table) \ + } > _region_ + +#define SECTION_data(_region_, _vma_, _lma_) \ + .data _vma_ : _lma_ \ + { \ + __ram_data_start = ABSOLUTE (.); _fdata = . ; \ + *(.data) *(.data.*) *(.gnu.linkonce.d*) \ + . = ALIGN (8); \ + SORT(CONSTRUCTORS) \ + } > _region_ \ + __rom_data_start = LOADADDR(.data); + +#define SECTION_data1(_region_, _vma_, _lma_) \ + .data1 _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.data1) *(.data1.*) \ + } > _region_ + +#define SECTION_eh_frame(_region_, _vma_, _lma_) \ + .eh_frame _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.eh_frame) \ + } > _region_ + +#define SECTION_gcc_except_table(_region_, _vma_, _lma_) \ + .gcc_except_table _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.gcc_except_table) \ + } > _region_ + + +/* FIXME: We shouldn't need to define __CTOR_LIST__/__CTOR_END__ + and __DTOR_LIST__/__DTOR_END__ except by the PROVIDE lines. + However this doesn't work for old (99r1-era) toolchains, so + leave it for now. */ + +/* The KEEP(*_ctors.o(.ctors)) rule is included to prevent + constructors from libgcc.a from turning up in the image. + They are NULL anyway. */ + +#define SECTION_ctors(_region_, _vma_, _lma_) \ + .ctors _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; \ + KEEP (*crtbegin.o(.ctors)) \ + KEEP (*_ctors.o(.ctors)) \ + __CTOR_LIST__ = .; \ + PROVIDE (__CTOR_LIST__ = .); \ + KEEP (*(.ctors)); \ + KEEP (*(SORT(.ctors.*))) \ + __CTOR_END__ = .; \ + PROVIDE (__CTOR_END__ = .); \ + } > _region_ + +#define SECTION_dtors(_region_, _vma_, _lma_) \ + .dtors _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; \ + KEEP (*crtbegin.o(.dtors)) \ + __DTOR_LIST__ = .; \ + PROVIDE (__DTOR_LIST__ = .); \ + KEEP (*(SORT(.dtors.*))) \ + __DTOR_END__ = .; \ + KEEP (*(.dtors)); \ + PROVIDE (__DTOR_END__ = .); \ + } > _region_ + +#define SECTION_devtab(_region_, _vma_, _lma_) \ + .devtab _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; \ + KEEP(*( SORT (.ecos.table.*))) ; \ + } > _region_ + +#define SECTION_got(_region_, _vma_, _lma_) \ + _gp = ALIGN(16) + 0x7ff0; \ + .got _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.got.plt) *(.got) \ + } > _region_ + +#define SECTION_dynamic(_region_, _vma_, _lma_) \ + .dynamic _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.dynamic) \ + } > _region_ + + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + +#define SECTION_sdata(_region_, _vma_, _lma_) \ + .sdata _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.sdata) *(.sdata.*) *(.gnulinkonce.s*) \ + } > _region_ + +#define SECTION_lit8(_region_, _vma_, _lma_) \ + .lit8 _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.lit8) \ + } > _region_ + +#define SECTION_lit4(_region_, _vma_, _lma_) \ + .lit4 : FOLLOWING(.lit8) \ + { \ + FORCE_OUTPUT; *(.lit4) \ + } > _region_ \ + __ram_data_end = .; _edata = . ; \ + PROVIDE (edata = .); + +#define SECTION_sbss(_region_, _vma_, _lma_) \ + __bss_start = .; _fbss = .; \ + .sbss _vma_ : _lma_ \ + { \ + FORCE_OUTPUT; *(.dynsbss) *(.sbss) *(.sbss.*) *(.scommon) \ + } > _region_ + +#define SECTION_bss(_region_, _vma_, _lma_) \ + .bss _vma_ : _lma_ \ + { \ + *(.dynbss) *(.bss) *(.bss.*) *(COMMON) \ + } > _region_ \ + __bss_end = .; + +/* The /DISCARD/ section ensures that the output will not contain a + * .mdebug section as it confuses GDB. This is a workaround for CR 100804. + */ + +#define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .); \ + /* Stabs debugging sections. */ \ + .stab 0 : { *(.stab) } \ + .stabstr 0 : { *(.stabstr) } \ + .stab.excl 0 : { *(.stab.excl) } \ + .stab.exclstr 0 : { *(.stab.exclstr) } \ + .stab.index 0 : { *(.stab.index) } \ + .stab.indexstr 0 : { *(.stab.indexstr) } \ + .comment 0 : { *(.comment) } \ + /* DWARF debug sections. \ + Symbols in the DWARF debugging sections are relative to \ + the beginning of the section so we begin them at 0. */ \ + /* DWARF 1 */ \ + .debug 0 : { *(.debug) } \ + .line 0 : { *(.line) } \ + /* GNU DWARF 1 extensions */ \ + .debug_srcinfo 0 : { *(.debug_srcinfo) } \ + .debug_sfnames 0 : { *(.debug_sfnames) } \ + /* DWARF 1.1 and DWARF 2 */ \ + .debug_aranges 0 : { *(.debug_aranges) } \ + .debug_pubnames 0 : { *(.debug_pubnames) } \ + /* DWARF 2 */ \ + .debug_info 0 : { *(.debug_info) } \ + .debug_abbrev 0 : { *(.debug_abbrev) } \ + .debug_line 0 : { *(.debug_line) } \ + .debug_frame 0 : { *(.debug_frame) } \ + .debug_str 0 : { *(.debug_str) } \ + .debug_loc 0 : { *(.debug_loc) } \ + .debug_macinfo 0 : { *(.debug_macinfo) } \ + /* SGI/MIPS DWARF 2 extensions */ \ + .debug_weaknames 0 : { *(.debug_weaknames) } \ + .debug_funcnames 0 : { *(.debug_funcnames) } \ + .debug_typenames 0 : { *(.debug_typenames) } \ + .debug_varnames 0 : { *(.debug_varnames) } \ + /* These must appear regardless of . */ \ + .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } \ + .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } \ + /DISCARD/ 0 : { *(.mdebug) } + +#include CYGHWR_MEMORY_LAYOUT_LDI + +// 0-0x200 reserved for vectors +hal_vsr_table = 0x80000200; +hal_virtual_vector_table = 0x80000300; diff --git a/packages/hal/mips/tx49/current/src/var_misc.c b/packages/hal/mips/tx49/current/src/var_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/src/var_misc.c @@ -0,0 +1,66 @@ +//========================================================================== +// +// var_misc.c +// +// HAL implementation miscellaneous functions +// +//========================================================================== +//####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 +// Contributors: nickg, jlarmour +// Date: 1999-01-21 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include + +#include // Base types +#include // tracing macros +#include // assertion macros + +#include + +/*------------------------------------------------------------------------*/ +// Array which stores the configured priority levels for the configured +// interrupts. + +volatile CYG_BYTE hal_interrupt_level[CYGNUM_HAL_ISR_COUNT]; + +/*------------------------------------------------------------------------*/ + +void hal_variant_init(void) +{ +} + +/*------------------------------------------------------------------------*/ +/* End of var_misc.c */ diff --git a/packages/hal/mips/tx49/current/src/variant.S b/packages/hal/mips/tx49/current/src/variant.S new file mode 100644 --- /dev/null +++ b/packages/hal/mips/tx49/current/src/variant.S @@ -0,0 +1,48 @@ +##============================================================================= +## +## variant.S +## +## MIPS REF4955/TX4955 variant 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): nickg +## Contributors:nickg +## Date: 2000-05-15 +## Purpose: MIPS REF4955/TX4955 variant code +## Description: Variant specific code for REF4955 board. +## +######DESCRIPTIONEND#### +## +##============================================================================= + +# Nothing at the moment. + +##----------------------------------------------------------------------------- +## end of variant.S + diff --git a/packages/hal/powerpc/arch/current/ChangeLog b/packages/hal/powerpc/arch/current/ChangeLog --- a/packages/hal/powerpc/arch/current/ChangeLog +++ b/packages/hal/powerpc/arch/current/ChangeLog @@ -1,3 +1,9 @@ +2000-10-31 Jonathan Larmour + + * src/powerpc.ld: Use .sdata.* rather than .sdata* so that .sdata2 + doesn't get matched so that the linker script symbols are still valid. + Ditto for .sbss*. + 2000-10-24 Jonathan Larmour * src/powerpc.ld: Match multiple sections where relevant (.bss*, diff --git a/packages/hal/powerpc/arch/current/src/powerpc.ld b/packages/hal/powerpc/arch/current/src/powerpc.ld --- a/packages/hal/powerpc/arch/current/src/powerpc.ld +++ b/packages/hal/powerpc/arch/current/src/powerpc.ld @@ -111,7 +111,7 @@ GROUP(libtarget.a libgcc.a) /* We want the small data sections together, so single-instruction */ \ /* offsets can access them all, and initialized data all before */ \ /* uninitialized, so we can shorten the on-disk segment size. */ \ - __SDATA_START__ = ABSOLUTE(.); *(.sdata*) \ + __SDATA_START__ = ABSOLUTE(.); *(.sdata.*) \ __SDATA2_START__ = ABSOLUTE(.); *(.sdata2*) } \ > _region_ \ __rom_data_start = LOADADDR(.data); \ @@ -121,7 +121,7 @@ GROUP(libtarget.a libgcc.a) #define SECTION_sbss(_region_, _vma_, _lma_) \ .sbss _vma_ : _lma_ \ { __sbss_start = ABSOLUTE (.); \ - __SBSS_START__ = ABSOLUTE(.); *(.sbss*) __SBSS_END__ = ABSOLUTE(.); \ + __SBSS_START__ = ABSOLUTE(.); *(.sbss.*) __SBSS_END__ = ABSOLUTE(.); \ __SBSS2_START__ = ABSOLUTE(.); *(.sbss2*) __SBSS2_END__ = ABSOLUTE(.);\ *(.scommon*) \ __sbss_end = ABSOLUTE (.); } \ diff --git a/packages/hal/powerpc/mbx/current/images/redboot_RAM.bin b/packages/hal/powerpc/mbx/current/images/redboot_RAM.bin index 9463a5c92321e18b78aa1c8fa38f51581ae69523..0e60bac1b9919d448f90b7164af93297bb4c5c59 GIT binary patch literal 83808 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 qzANo1^=S12E-Rxa)X$0!iR&#CVvRRolMPur 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

RxRPmSu(x zAwv!J5dL4OeiRqlrW^l#rB+#ax@8g>-f1uo*AelxG}cS2Cp+q0%XFHE_DTK-vDez% zCguFh>7HL60PlLwmD5$6afqlzqy^+r96 zX^E5Bup-0er@e@~!{%o`#9}hx*&sbE zMoVmLs9!Ibc$aLLKD?x-)c<4D z>z{`Z(Tf0fNV@-a|9)81M78x;jp*;3&vi=rx5oe9tnrDGZ2F@(TBM7-yD5k zEPDHOd{wnmwly|i<`@6Y7p`ah7mTozy^kR7Mf?C|rXn`Q#2m!3e`m~}cJ6u8&%a=X zub^sGbxmNkH4e-3r-@5Sp?l41Y%vxVUkK*iwyMQgCi##a`70tWI_8ZtrW*M(W}a6t zbNVzXBT>%${PPgc6&K<;9G+7V4lmq|zv%Y`py}eh3bx|hjrhGR`ZtOfhNAP#IiQ~D z{RK5Kd4tElKVU3T@6YMAf17hCI?sX}{mtI!-{-uHv|@Un+Bpy&?ce5JIInpA0>vlR zWPGu>dZ~_}uhn~0JTA{iU;H~?xSo5zV6@ucN329dpRYL_6L%uM@NbSKUoe6Xtm#Gs zPh9h|YFF*jn3#r`|L={meqSW+N5q(~MW5FCbi4Wni0%L0xaKJS7X9mg|Ifr&8vC4a zO|Om^tF=PM*nHE!_;1WHe$M=e%?5)r21qZWdVF!&tk&oRW3hE-MdRSng!l3H4u zX_g^H%w4w%3T|Uti)A=T?HER0ZDUhb$;phCjZ357HgKtp1+z%PQ2zo zRn2;%r72Kdx4KUG;;eK_Uv6kyw+iNswr88Qv;6pctLv-QAXoJy%kQDn8yXGtTUA?q z>r}EjWVVP!7&Y;8@%)Opm(N?Yh~B?sUd8+hYD2@?hQ@0elo}uL`82jF(^`nC>T2>~ zTwN!P8EL+dJ-ybD&P!Ccs^0QM8-e!fK%gcd?aewpd#5HdngW*b)26@I+FaGpvKsAP zRII*f;YvF>(5jZU>RNJNNZ(qd2x)!R7-UyU7h?-eufaana}-uXEUZObQz)aUxv{me zy0M9pqzxf~{bk&=|r?*`xTmr-qJy;Ek zwj$|Onz$(g^6S}*4}C|btz5T$WnGgfR-|D7jpTfY%Bb?G6v{iXC2u0p3Du>paU~h3 z(pJ|n^^fKQ-5bAPgzW2vT<^x1?g2h~AWOGaM8}?T#HN39^nAex`se}A?Sbyy13BLF zTsZvA`smmL-TIrJe`mb7F+yZ@p;O0Q})qn%7wJU3yuU=Wx(rmQUHn!E* zSThNr`+9P`T`lJZjEOZl%7JwSKgXqM52{!gXb3ddRY&-9 zv7B<5s-3f7Tym7=5^Dn<6z^5_X=z)Pt0sdCHMMR{0LeVDd|!?0Z@-O*G5KxiZTEmS z?ny_4Ouh&9-aS6lktX*e_+5YsQgtmPt*T#3zN@M7ANiawn-@u=?v!5AbII8k?Kzcs zqy0(t3&&^G^r$71T=gKt<&DkF>vN227t>s~Y;a_*)L0*A6%`SwLH@)VIk!e{&LbUw z2#NLQYSk{P|I}zdmk<|HZ-H2^Y75{+8+`-g^AU{uN5DrOfi3oqT>_d3r2kN3AE!0 z*q~2@5W(A?I2setjwcTOn`8MGjOe>3Zbd}jJaHf#eiChevNtA9KrH@uM)I#S|87-e zIgaMNG-g(=Y^xzz-%!)qNVG{14Kd00a*dki#-=7YlUKbqAoZzH`gUsF_N9w;|9jSK6cyPY48*<6JERTDdYn>O)gweZ5pw*EK>3k6FJI z4)4Wy*t;bh{w3&q??Dy!Z9;q@9R3By&M$T%9uiJ)f)kwJ1SdGb2~Kc=6P(}#Cpf_g zPH=(~oZti}IKc@{aDo$@-~=Z)!3j=qf)kwJ1SdGb2~Kc=6P(}#Cpf_gPH=(~oZti} zIKc@{aDo$@-~=Z)!3j=qf)kwJ1SdGb2~Kc=6P(}#Cpf_gPH=(~oZti}IKc@{aDo$@ z-~=Z)!3j=qf)kwJ1SdGb2~Kc=6P(}#Cpf_gPH=(~oZti}IKc@{aDo$@-~=Z)!3j=q zf)kwJ1SdGb2~Kc=6P(}#Cpf_gPH=(~oZti}IKc@{aDo$@-~=Z)!3j=qf)kwJ1SdGb z2~Kc=6P(}#Cpf_gPH=(~oZti}IKc@{aDo$@-~=Z)!3j=qf)kwJ1SdGb2~Kc=6P(}# zCpf_gPH=(~oZti}IKc@{aDo$@-~=Z)!3qB#2*Ihj%Y(T>EX!?PVJyqNn*OUb{I!iO zt+VNQo$87Dlks z|I;qPHNJeHGLYS*sGzawD!M)z_JQ^{Q*x=MwK_tH~z)Ful?oS|M=v) zn@hIUJ(%)?DPQ@=MXz4_GtZkm?Db+cVK zz3lDf&*z-&k58@4ocovW9Q($;5B{+4(aBE_x~2BcMc3Wl@WfYtbMZ&Bhv%I;_R=9u z;k*C(<2U~B%cIYn_1&3wU-6Cho=sg3?s{p*`@c$kHuuAe|J0Zk5{=D+z>wY%ocm8u;x!`Y! zJtO;9fBEXG7mWDQ^w-K>T=&V4cc*T9Ve`8`xaq-%mll@<+7oLhW$f|%$#=c?o}YKT zzWn_;pN+lwlRNf5{G%Uz>!P-=R9rdZ+L0+Ap84|R$7X)>Sl(aG_(T1^#ZN!<=*@Q? zy5+^-IrT})Ys%*Pzn!xo^I+<;f6WTd{^g1{g5SO4nIC@RwY!frjJocEi4=$#pg%wIPCbJ7 zIAXsk<|A!tEh6$yMgE1i;_ptxcEl!AETD4sBi@S$nd3uR_IAXLi0!8E*5GdwVhLi7 zDJEB#uDqj&hY(Sp8R;m8zTrW{_oq@`FJh|c@yqTWdXC9jIz_JJ&9+e9uYBD>==4U$MT6{zU7}qfha? z9^K|j{fvB67Dd;D0r0Zg&gTyyA86!VFUyyv{|;4othZ(T)(%j=2z{!2vmlo$sXqn- zSf;;AWhO_Lch_@5oO@t^@?wL_eh7bvKf|oHXn4GCj|HEPn9AUVR+}_@1!6jbsZALS z?m*0B@Hd1eL=Eo{iUuwCF+?wepGVAL@b848F$;bdaXN!PL-g6O3wRTL24@Mam1uYx z9*Y?~PbgZl;3ar0WAGY0mNR%g9xE7p6CRf`_>O3NyS^i|mZRZk@VJq|zry1t2EU2N zEes|-rQ3$%67hH|gGb@9m%&qGU~21j27fggUvbyQq;JDxA%m&@2@HNoC|a~&;+Pg zh#LR#kK=I+gJJQCu?*fFLmzu$`uis~z0kk-Uz#FoI)mT9a1Ch~{Sr?+!C>$I(-aee zIvsT5b}PPZ<#(S&`i+J`CvJmu9R^R7^2&xMlYYeDsiZ40csl7#3@#x3i@~!=7h~`| z(#sf3dfIjdFD6}%!IzU>$KWdf-^<{YfL~>B0PsNuuLaE8dzI;$>}K#afYTY=0oY*h z2EY>-ycsZW&o=;9F!(mWy$rqsFt6_pz|S%G0l+UX_))-n8T=UFw;B8cz=s+94D>g_ z;O7CSG5F_zGZ_3U!1)aR9pEAc{{b*>&s)$VXpAJfB%g4O%gKL)^nMMmBwrHXd<|bkekH&m4Rmom5q@Nx!k1I)fp{3yr6+6R7=Go8WUM>$Iw41Sao!;f+p zzKI_xd&uTTxorF-e%ln6VLZfZ`bzwsDJu4|`aOyKZ2TndM*7<<9r(Pwguy>W`mGH9 zIr@|MQIhUY@W0$zRv+-c+fJkD>x|MEEh1pmv+WH9(&UNM8g|MGbMfdA$3_JaTAg%}L}m&f@h z_+K8cKloqX9)|x{OmVTr?+CvK0B17z9l!>I{|E4N8>aD;cQkrD<#GC$NPYwcPbPmt zG(Aq`^hv%3j;{jpZ$#7MRF0o{aAKYKr!d@_JE|0a6M=k2|Ud^yqdl+W6mG>m*afcES6JIEgt zO<(!E{hP^8#NN*&pAlYl>-WDw{-0=i%jfiQ2l<8A`;*8=1n6=7{tog_MbqE3@@V?Y zXZ@R$Pd+U4gHOGmRA`Da;=e^2z7YJM#lUg{_GiNy3S|g%QFcu`@Sa^ zFypVD^8hn_+5`S`K9hf*Ie?k|>6s6hwbxT>x-Kvnd?{c?Kb|iGu3_*Bz>J2 z1A3gn_@@W-IHQljkD6iz)$fR+C(n)4vw)fY<@uTR^IGse%U7)7SIAGy;Md4! z%-}c3U(Dcl$alk!b40~a^!QcSk90spN{-+oWef2!1UnWC-6|nJ@++m9I znZBC50dOUQp}$_h-~R^S2@Jjs`I$YQdRky_5=+=VRq9Q}ZXTBHLbC#q5EUb;!^3uap*~Gkm4M z9;)^*81`$mm%%pxX8o6PGvHbV!#=9!_`Mx4ukW3JcQW`Mz%SS^*>gNU*>h3vKWMrN znfyrkt|@A|S^D<@^ZNe?FdJVfz(-9vgMS9Nm3^-+x;(NMqsj-r^cS)3L!YmCgr&a* znB)5mz`Xv@?*pj}ejhNe--m$Ncus+S9boou$}zz8HasXE@D^6z_0jnUL8rNZ^f4_@ z2Bn)~O&U!!+4Qj{-Of+=U&HK?L1zmQY9&bVJNhFuJv#Fj!kNEt<}aN2i~mFO7lY0- zMZM+EC;kR`yN<(`fM3!(7Qb9ZYn}jW{cq4Zz5Yqt`-9p|*DT^ULzO%j)MbhWYOi0X zL*Htk^0ho3w9OP(8Tgv^pALEm!=q0`?9V|@0KS*Os7v7^4E`nHoeYM&X(9hZsxI$6 z)c+tgN7w%t;6K@LD*Ez*x9#?&jx)tI#GiJn_fuz>qMhiqH!k9DnpLFnqy0^@n0-a^ z<7-TRB>C|*Cf`YZ2bq3H@-@ih7x}AZ@%f6$fVqEgDqv^oW<;gRP^7? zZfcs6SEX@pml{BRW>2I--wrbQoCH~m742C_p;W-9B zhWhdRKR|w_ucbbN{0D59^qmgoZzO%9gZCfkyTi|5w6}xf<9SnT2L4?yYkGoybQ9Sh zWeO($c?Z+4$$#F#=>_>am_9}R(GF(6q(YziI??ArT^{tQ>zKYn{?h9nXZfK|UB~qI z)K393d=7^GbRE-w2d4sN^e}h?U^ag+cr5VA`g8Ckz! z2E!iSa>T|D$>Z5X?^+(8vD_556tVKJ1WfqZq~U8#@gJ0bsfNMN|AXjR`_s+W0sFO^#;5kTpMmkvP4Y|6|DFMTypYC+N8#%X(0>ofhkBjEH#0uQK>= zfZt{?@G1R?8sBN7P0>sIrB9WY2L7|H-L6mCEFo^E@@f?R)8^y-qwM`M;Af+apR~*I zKKegyf_@+J`3`zt&v&PVOtHO~!T$-E=qE?Ru)ntxf7A0PX)l=KPNJ7B8vdgYGX(oS z#`CwyUeo+L?K8k^zM864XwetiKNM{!Jj&qVrnravEm}Vr3SF@92ulb3+{fpKp`YBl zo0UHU?Pv0TDCp~6#;=CX!~4uXHgpkSHvc>H62Q#fCVhv0kMy1UnS2H|VemeAKz9E;>KS z{|6X99NJ^Lir9S6(A$yD+B+2E;Q=P^hTa31@%y0K1I+M4`U%fZ`pHh_e;K;Zbj@Y+8$(|;#e;&SL;gI-@$)8NhM%GD0%r1b z=wZOjzcut@z)XJ`Y652TG%NuylaHh?@pRIM9%A(wmTI~#Wd6Kip!bKEyc-7j^$^1c z=}%EG^rwed{f3P*UGof9p4Su)v;4!RB0tlQhFt)d=|96TJ{~q0Tnw1$)1;q8l~)SW z$8C?tVaqU7sXeKR9}NS&KT7(#p~mkp@Z(2`pXmA9VNHOEe`^i{2ul4$dVK;%F zctnJs41>P>DDdgh{BIbL*-QMYQhyI^lk+cDevH@eQh)E%`F{_X_=&dXhW#1vs|^0g z6yIa=Y8dp#$7%d(`9bzkF`rL|eN@cX8^FFPX7ee-pszfR@)NYY8V-HsDW=~HAB_A( zcK+eROz}jBrH?YjlT7~_4*TMXN(RH8dy8O zMK(snPYBZ$#H;evG|4zbv{w^UI^_Ge2g%(EOU{`pn-L zU7z`U{ZI*Dh7aoReKGd>KJM>EfA8b=82Wo3Ur&Vo-uE(t(ck-+{X+e{kMlS5_b(X# z8V=qxBi$a4gs%mH)ff0$!0yv=b1suPN0rT|^mjmYOQ?CHb>1U;<^`3kcSi66Ye{13w)2h7IvaM=5=aQy!mFdN^)e*&24Bg3J;y~6p& zKETYr9}fHN6{ar?{~cgPPs1S(USaZw`gb8;Ph(hnf$Z_Hkgupj2*gOOLx*IO|7_bVj7K2ZE99ewvL z*n5e^iXPKp&m5ro26g&*LhPXOLOOjW_^($)_;31!rg)XwyHV$dJ@XstZ@u0#9rANW zAJtaBUyb*3*!!See;R|o1~{F;=nH=agQ36whVb>OmS3RX5+j;^OPIV$|F$W9OZ2V% zpG40kOg~8nJ^n7kPEUva_B-nDZVmqu`19KMOMeY;4uk*O6#L!e*VXy|VT#w8KbH8_ zex~oGe}?a~@jJqWbjF`XBmrjn=ZL|kc#X-M5zwbzWBTU^*i)}DdLNMmnCUYkCIV*P zA29_m)0c>UzIM=tiGTi{jn@&=OxGedo=40;I{!ZOtKYNnH3Ig>@7een0sG_k%>OU~ z_Q&rT{~fUeFteXVz`l5$w-@z!J;wj~dL>JTz41D=r(NNHL^J5cqJPlKh)%#07<`i{ z{y_M@SLX+9&d9g>bHq-hgWtKdKY9doJAbDAKJmYc_fzl#_>(fYlMxO}?`Fyqfe z4}W6vhVcIB}J_f4+9Kz_Z+?H|amHyJ)ie!a=`eUe{qGI==SheCWCZ5DtZFe&8xI7`|YS{FRO8kyis|^ffXFn91Lf z*8^tq7yL^6mC0Y?SAQ*HF!zqQA#BcacH!u-J_-vrF$!N^0V_|zQ(_eH~>@$Y?Xieq~i zd<^Yj^I4=`N0dHjKlK}Jjx{{*ht1F57AA0~Z`b^vgnAf+)ba@zkWRSkH zR7B)e#y0g>__09?ah(r;=R z40=3+_?ezh&-gXcNq>pc>8}GHwKhI7-b8v6d;bIB@<2Zx)vx$>#z(@HMEthg=I7(C7evRomlg6W-j~N{TO!(L9 zB}Q)nO#SzWf)jU}t}I3`uwPx}%w8Xj@tVo#d-QhGHHM9+(K`S$eSh@*rfaOh;D-UT z@dW$ZHJ0g{u(w@VZ2ZBVc4dXw`{3RFcGlh>2v-*Mr}l@Aeirx-vi{hMbm9knI{g)- zhwOAJRt0DMowNQ_cL*5B!K$y6u16l_?qqyuYzf4rsx2D@Y61O=Dx(Qsl6 zoTR>Vo>jg_!D{_@yru)|{DFAIZ=vsZQ=b~cbbWLHO!XiAzJA|5RPpnprr1F^4XONR zLSO%cXllELGfZ(0$>)mb^5WA}d1q#u;zuM8rtAFRjdFhjm5=(KITPQbF_ora@b5z6 zuO1Drp);S5{Z{>cqp8S=hz$5WbF(Q95KZLk^xI7FP>_-|{3x9%1-MtkkD1~y^b#*3?)n8{peic?S_%2htOf;RY z^Y@$L+M_l;&ibh-Zj|doH2fR9U&G#iL%1f=7&eAV`Z?=8Q|u=Ewd?#JnL?8Nehr6( z%b@%rl|K_SU07?EmkHkD532T3`!dh6#*1oy<^`Z9qHj+OeU>PEWR?ms!)@a;bEPS+ z?zibN^Ge`*zfDh>K~oK9t9;m7BZ}?*&3sshnbdz7I{z}X7V-KxH0!0Tp~*!3AR0s1rf4>R@q(@e3I<^xMKTw;oe(tgx% z1I8=WZ(~gPUS0n6rnsAUs!!*?3H2#s_4}5^4~A;~WYtf>V;(RSd)N3G^MWZJDYEHd z%YuLaKNj}=|4@Hv zdK`PUDQ+Qp(fnrYbW^c!UB9uHfZq1o{XKS>kmoSEG8Mgzh5Rc#Y}aROt0^jX+x&sPq5Y6yGCy-G8=%Ujx4+ zeXdrg|HTwHQ~$^E+ugeTpP89BwBD^;!;?+%FwNgC*D&~pN%FQx!{C={ zf0*i@tP0T2K_qE<$%6h=u+y%8)>Wua$gY1@m*u}18eKolzq4*PMUGrgt=gBh-4w@O zwegkp9aB^hews84esY-fUCrOJes78fH_QK~snikOpIOID(MldH$V?B z`fd6*a!he=t&LBk%oKTEd;AzHz|TmY@xt9D^^gV8Y=}MyZ9oFxE75MLE<*hZvzUg-R#$U`GF{%sXwOG> zd(KAY!X|rsosIGD9_W3okDLwruCSHmpQF$9)%7|165*OqZ;$`8S0I0hJs!?RTERvJ zuZKL_$>0sq{PFB>n&Lf5*ZltMJHh{Hyleh(_C3ON_H_GuvE$|JN6}yOeUGm1Gp1`8 zeP8ppv-d^g|Liw0{z)F`@qYFvbS5SqyA?b>*>sUT=$a5ie_B5nKMwNGYmc|_IoA19 zs($04U#zC_rS-G%mjNGS1Et0Ezm`|yYfvBJheve&X3hU}eaGJ@)P7stpW|;e)p`d# zKE~ex`BN++@_YREOxKVcTVEOftmQve{AT>GEPYnte?08Tf*Mx-``~w^-}z$NpQ`FR z0mL&i!*0(6)TOZ9rk4rh^tqaP{7ry9HuE5ZF9uv|w{OB~ydPxmLw?*y<5% zBN~RheURvBQw%=*G4yWLXE*GF7g+sYjpp~0-Y{Ln6NFVh?6>!c|LXDTb-{ii`BSE0 z*t55Rf4H>1<~7v0ye=(Yz1isB7wrCx1kEqKe(1-fe`|T~U8wP^@#($H6mJo%^)2rj zG_Bn3UoZ5r7pZ@=J>dNs^u3_nKJOM&{FUnaTnv7e>hFW!j$-ubeFEiIu=1ggJ-o%H zNAK@V*Pyp;`@{Q=Dc(l?;?gwyci6AgPHq2qk44MJ>{N`O>2`awhtrwQC{MR9dkn@8 z@juPavM1qvIiIiampwaLo@8H+`faq^n+^O-ztv8UgypKe+1Kj(3{s=hU9t3{?ThTM zWBm7vha3Rf(D)bubJ{Of(9FU=n( zmumT@^G{w)XL5^(e4pF^`hL!)@5zwwg$HcsM1sA+L7Y_?mK=(obC4zMWD7{hIVEEl;Lg9aH{BQ@Jm# z`rNJE|5iHLkCs1efc~2DTr@pQA^*!p8~;J_%0c56|H`>5THZv0=HEGxf0s_c_jP~e`~dXnvByi!OQv%7TJ?Pg>7fDWy;hZ% zo1pa{jgQ>3OgZL+_BZ5?kM57$Y0>f`7yM}E5xe}{FKK^dEdSBtJGT+z^(mWPb8j@o z?KIxBe97HviokRB_{s%8`6HFzuVLuJF2Z+F^muVu<)i)26aMzcj3=wT`@w%+w&^kV z{b>6p_fu23!!`c$MnE3++xBrD@Ns^~ZeL!3db$jz}G3At(#V_)}U+zz1G4NLf-#~(Z^KSo9p`R_D;Ptnx9Pl zlIe;kI@vOCd6A&~ms7z%E+Btd`8bLHsW+M~W24=lk)Zj*)Ne-X&r=_crq8KA0ROvH zMC9AlUz(zc^v~S`%e$$so34pRZ2c?}HtO_up>GmD)%yHY*cWGipuZPKY!><*@juNk z@~43QDOu~^`99FU-0z~{MW$<9CBA2+SC~Ssf7A8LUulZJxA=X}$ zSx_b-{4w7&#h(q^UpH-#De8#f9MJHYkbnE_{+X7G`Vju~c$hZJ6pu20^0Z4({tI^f zreVD8e9q>V(>hIkEWfJXwBBfXpSBb7?GX{NccwjQ>S-dK|L2e=IW|4V;xiI7KbrOj z;LFSE1AA&LEALz|n+x{a_&9ew>^mAiTArSJfhkt~zrL<5xp5uIGJ5u-koeGJ{#>%F zu4imlwe7l5-9HGLf+V*2x*+K)->=!oEMs;t`Dx)iV|d!Jh|YTAv!3LvXL;7MI_p`V^=!_T zGe7HDob{ZoIXqi)c(&&7Y|Y`>n!~d-hi7XJ&(<8BtvNbf^WEb~$9CxW_HFxk^F`7B zr<1O;F+Xljd+ts9U>FJoL(Xr=-3>Xo30V$}Beyl=sD@nAkTV)` zKSK^@$i)mfl_583n}C+1+@Hnqu9dEKfl_(ZX=D1PQ*D=KuYof95E$Lk5Y1hkJ|Cp` zZ}SDSyX~Am7W@(NN5mg7eGN7MQfatOcemFmHj03(Q<#>H>2^ z%njvvm>Xhlh`Ax=hL{^-Ziu-d=0=zsVQwUg#oQkZqlwBubI_VXX?W5Nh{T|hP^q{rqS7(*WBqMf79MFSn1Q2wVc1wyxP~3LHT4( zYiN)Bmyj0rJDf_iMm?t0uF#im`Ro1l((iqpbf+DUzi!_2WYN#Ir*G4P4vIS6DP8PU zUUE|%^{>#bE3)6Q{Z8!n(tfY(_u77M+`i@_wIyv@v9r4+k6!Z7n6DDv{BlX5kXN(N zX<{*4xHT-?BFGo_c`M4~iz093VsEs@g*F@jd_`u{om}!laFH2}u*qKAz6@T9nj)sn z|D;hx+8z;iJnUy}D3bUtnxZ3iNjP!@M~>jg5ga+%h^*Gi5ufCUgKx+1?HIltOC%yL z;zZV-S3B7N_dz(cvyCA9`LP z*O0h|#5E+YF>eitYe6WiW(`RjtY(9`8_eBc?gn!=n7hH;4d!kH-YmWez|9xIL3a!c z`}`2tui4!K^A_0G0()6t6$`9lv0CGkC53Q+aGu~(dT z9eD_h5W-v`j1$5*;nJ>CFnBH?JQoy}hhmW-R2Z(L2TQ`TLo791TPcFrbKHUYB8ZBh zjS#Ad@Qi3K&_7>G;EKHl{lu6YL-#RsA4B&sbRR?aF?1M1Z!s(o!vae@Ab|~+*uoO) zT4GttImW;Pmx2&W>A`q-;1V9Vga+AQ>t&u?xnB+Iy5=%c~+hl1O~f+W@Nf;?O&kF>x%uis=H%e9Rk9}?3i-K*6HqA zzx0PKHQA>cO2C@MmbwgS7{O@KP~xD=dtGkpp72(#pG+2%>ATveebK41-f4T|y5;!{ zza+!W-{m_cP?a6^t}krYE^qly%J?#RpZX7<(Pexu8*F2DBOr+&ZJ zoSh;dLj=2o$mbz4a|8^FkiA1-NCbonk;5b4T!=`CfI=a%dKAfcxGQpgMCj-={YS6O z`_O8kMaun(dJaUiIbc-$z)Y#OsZ4XR%FziXV$hm|fsdSjSYmG3$EG-H}t(J^x27JtT5D;yJpkE>QRtUHi zqHTpxTOrQYOZklO8RIj-=MtYQd~$59fo^MLsWr0H2AOXI#;^fz*&yd_kUKZXog3uN z4Vcdc8FYgTx{%zykc_>MjJ;SOH`3PzU#QXOYayNT1;Vii0eXuNkVh>Di)3E7k(SJh zz^myilCL<}y&P2g-a>tdHNFanKvRn9Ingm7zvguJg#(IPRoxIwo3}jUDzqi8ol%&p zd^aP#(g330lo?6)B{QG0RFpHTN*C?PXo9p>*jQV`Ry2NJ^vo2ql#-Ke?4&`2g7l)Y zH_8uh4aHrzX9bGB*)3o@5RWA+8mJaNOkWs{?Um$Y2szH<)0X;~bN!T;y6!vN;?<3} z-5uapcAQc2U^3a%rkh3M!4jL$bL1x2zL!_yT`b1j?p(w5m*$d zVf&(aBzicb@Hq-iq!^n~7+E<`y1f>-7*<3e;ji6oQYvWRm-$1EH)fQB>`;dyWLVfZ z21$+q`SDVEz(x_VF(Nib#Kuc;2e=3BCb*m6Zi2gsy~}1v5XlMnWY-5ZfEeHxQ-Mi|n5fvV_doB6 z#+KHDs5y3VSR8i-U?or&3UCRE@u%RFfSn+pz#w7bAg(fd37w|)Y)-ljJ27brD z@)(#GgAT?ZYH=iYF%m>A2H%P)dkkJSNj1dyP(HBQx#7}TQ|uY;a?Wg%h`TUgnjXCy z@cq%diI-g%{)8;BJDu36LfM)Fi-~1Yna8 z+FV!wdpdlVto>5g1Y?q+iPtr9s@3lr$+uKM(ItDxo@*>OZs=gQ85#^)LxWQXjm#Tn z`9_s#mmRs4@7N{r_$XixmIsj_6mZRJN0-u9^`*)ie5FRdNxUW!wL_ybY1Nj(K7or| zQ?iG(HJ6JR_KkXOCXUbz}cz9R5s4{N} zT1b5k^w^&S)7%MWK`E$UDTg|6f_GZgWd0&;+JL?9^t_V@9B^t7t0wf2Hq>Xh9@d~h zCyfF{ZfX+9eb!w7u<#RX-|_}uW=V=9Mobx9lL-l8$GZMfgs{dep9#25Vb5walk;Dz zx9QBw|JLJBlJpJfPJ2a(Qs7m#;tBdzD+FEOj>{hlY$S(0rteg9!9tzMt$*I|3ghZwd>1<@j?h#z2D2atOdnz&d4p*TO19YZU7a(rDpdt zHF{hqxf`FI@Fqt1f&oY%Be=vC_A+%qd5a=Un3hgYQrAz9?KnB>jgi?TU64RQ2RwxU zr2)fz;ZqEI$TX^IPm$D-NN9-p0sw``x2+r5*h+H=OGvqcnviYaz)pv+vX*^q2sJ%V zqLJ?Wnf5|S-_@;esUhs;a`pqqSX_}~uxnWx1fF{yk+)ovTle?hWkE_YK#Fr8^tcp8 zr?aCeb*yRSzJUNPLm1z7Bb(Bou)|lB<~u*wa^K+P-=k zw$AH2kW$zDu22GpMOd@>J})m7B!I_*1E=eh*N;Or_VpKe1S^ESK@sk}@EIU!E;TPX z^-0uFftod?6>|K^Ij|WJysJO9);vWR+cUp)XUsPBVF=as&M~>Wjxs_jm z!>kiL#e*$T)Y-9~zBa!cSVF@&xX$+`#wI#W%VUda&@514|1fu=em=fwod?KoLk1rj zAsjzukQ|A9Tio{%q$YTp+QTY>3qj(_PgbM8$9}$j;u)>842k9JEJR}x8H8Sks?^po zTr@$!0}%<{2A(*;>RWEQo<_^5vn!K#?KE7cS-!8*w=^#>^9ihk3(c7jjIId-pc#$tSXVcYms#w2gqI$~0T{3vO zzEYpAo^E(6OpT2^Va(4$H2kvQ0Mp92$rP!v@av&2-@N#DhIbD$&aA(Qc;MJoShj# zNE0Kg9NwXN_3eiKc}khUg>xUvDZQ;t%L7#VZc+Fpk`TM>I7y~C(p*OlIuz$VunkPc zqWaVi?GINZ%{s58{Oc`}lr@z17UskRgy#AF-DcP++Kh%Ay{X8{obCBxea0%a3Ht1% zI6MhRb>O_rxF~fIc3*Whzi`jVE-FBwPpd=F6>Yg6JRKcesJ58a;@XV>HH8{XP z`8zIRAWs(^?GqfWea##AwZ$T*zN1c?#SmWtuKa*=LXTDHO5P$l$GY}#?c$+`BXDEd zAg(VdLk;lYNDu}5^VLYSaI#)$al58SJ1+BV{b!xVY00w#l=*P;e0}r#=*;bfa}G~O zoB3RP+n$ebL^qj#6d=`*Lw&hIDgc~&b?~HCHTq|c02L&bwfG|@q{aHy#T72uiXWdG zAQaCE2xU+CQ2z7&eC31FS~r*q_6}0ch^X_M6UdfYW|H)riMW&_HP&?Bp8j{b?LIn8 z4qVU*r*orv8sgwV==aFRFY0RzuV*sh$J>Zq^~*nW2J{|SyF-_kJ}B0jBP)rIr(K-09b3)d=RtN?U&wqY!#`joFIe_?i#SQ9&j!;fwfu(1R@T{giY8|Z zlfuY@@j!jK`}*nXPJR9S`RN8Gy}MDv?!<$zKX#pu4*cCY)nH)>y59hL49~(9tseCt0!2{r)aKG%es(+HN z9P~N#yAs=Cx)-gIXtK1*^mLO>yS(6|J;b!@^$R<{*qux#|7?!PydGg8B3^e=1B`DN zhhHfB*1vuH>v-5PH2g=~BACeswlm3U_J`}I496agdfFM&`Q_6Q6}aPTr?Y61g= diff --git a/packages/hal/powerpc/mbx/current/images/redboot_ROM.srec b/packages/hal/powerpc/mbx/current/images/redboot_ROM.srec --- a/packages/hal/powerpc/mbx/current/images/redboot_ROM.srec +++ b/packages/hal/powerpc/mbx/current/images/redboot_ROM.srec @@ -395,24 +395,24 @@ S31AFE002015600400606300007C0004AC7C788B S31AFE00202A00004C00012C7C708BA64C00012C7C70C2A664632053 S31AFE00203F007C70C3A67C78C2A6646320007C78C3A63C600000F7 S31AFE002054606330027C0004AC7C6001247C0004AC3C4000006049 -S31AFE00206942B8F87C631A787C7C43A67C8422787C9D43A6480036 -S31AFE00207E46F93C20000060214A307C3043A63C60FE00606300C1 +S31AFE00206942BB487C631A787C7C43A67C8422787C9D43A64800E3 +S31AFE00207E49B13C20000060214C807C3043A63C60FE00606300B4 S31AFE002093003C800000608400003CA0FE0060A51F347C0328407B S31AFE0020A8418200203863FFFC3884FFFC38A5FFFC8403000494F8 S31AFE0020BD0400047C0328404180FFF43C60FE00606321E43C8049 S31AFE0020D20000608430003884FFFC38A000209464000438A5FF5A S31AFE0020E7FF2C0500004082FFF43C60FE00606322EC3C800000D4 -S31AFE0020FC6084300090640014906400243C60FE01606343E03CDA -S31AFE002111800000608433003CA0000060A539087C042840418251 +S31AFE0020FC6084300090640014906400243C60FE01606350C03CED +S31AFE002111800000608433003CA0000060A53B587C0428404182FF S31AFE002126001C800300009004000038630004388400047C042866 -S31AFE00213B404180FFEC3C60000060633A303C80000160841F3CDA +S31AFE00213B404180FFEC3C60000060633C803C800001608425A816 S31AFE002150380000007C0320404182001490030000386300047CDA -S31AFE0021650320404180FFF43C600000606339083C80000060840A -S31AFE00217A3A2C7C0320404182001490030000386300047C03205F +S31AFE0021650320404180FFF43C60000060633B583C8000006084B8 +S31AFE00217A3C7C7C0320404182001490030000386300047C03200D S31AFE00218F404180FFF43821FFF438000000900100009001000895 -S31AFE0021A49421FFC848004155480045A948003C553C60000060BD -S31AFE0021B96330327C0004AC7C6001247C0004AC48003CA948007A -S31AFE0021CE3B7948003CE9480061D948008B814800040548000068 +S31AFE0021A49421FFC84800440D4800486148003F0D3C600000608C +S31AFE0021B96330327C0004AC7C6001247C0004AC48003F614800BF +S31AFE0021CE3E2D48003FA14800646548008E0148000405480000E4 S31AFE0021E3003821FF64906100989081008090A100883C600000B8 S31AFE0021F8606330327C0004AC7C6001247C0004AC7C7142A690EB S31AFE00220D61000C7C9242A6908100107CB342A690A10014900147 @@ -425,7 +425,7 @@ S31AFE00228B6C9381007093A1007493C1007893 S31AFE0022A091E1003C7C6102A67C8902A67CBA02A67CDB02A690D8 S31AFE0022B56100849081008C90A1009490C100907C230B7838216D S31AFE0022CAFFC83800000090010000900100089421FFC83CA0FE7C -S31AFE0022DF0060A5247C7CA803A648003ABC3821FF6490610098F1 +S31AFE0022DF0060A5247C7CA803A648003D703821FF64906100983A S31AFE0022F49081008090A100883C600000606330327C0004AC7C1E S31AFE0023096001247C0004AC7C7142A69061000C7C9242A6908131 S31AFE00231E00107CB342A690A1001490010000904100087C230B26 @@ -436,13 +436,13 @@ S31AFE002372004C9281005092A1005492C10058 S31AFE0023876093210064934100689361006C9381007093A10074FD S31AFE00239C93C1007893E1007C91C1003891E1003C7C6102A67C33 S31AFE0023B18902A67CBA02A67CDB02A6906100849081008C90A1C2 -S31AFE0023C6009490C100907C2E0B783C60000060634A303C8000C7 -S31AFE0023DB0060843A307CA408514180000C7CA118514181000805 +S31AFE0023C6009490C100907C2E0B783C60000060634C803C800075 +S31AFE0023DB0060843C807CA408514180000C7CA1185141810008B3 S31AFE0023F07C611B7895C1FFFC3821FFC83800000090010000909A S31AFE0024050100089421FFC881EE009855EFB7FF418200183DE040 S31AFE00241AFF0061EF001C89EF000055EFF0BE39EF000191EE002C -S31AFE00242F9855EF103A3C600000606339B891C30000806E009844 -S31AFE0024443CC0000060C633587CC6782E3C800000608434447C56 +S31AFE00242F9855EF103A3C60000060633C0891C30000806E0098F1 +S31AFE0024443CC0000060C633A87CC6782E3C800000608434947CB6 S31AFE00245984782E7CC903A64E800421802100703821FFC83800F6 S31AFE00246E000090010000900100089421FFC83821007080610005 S31AFE002483848081008880A1008C7C6103A67C8803A67CA903A685 @@ -455,11 +455,11 @@ S31AFE002501C1007883E1007C7C0000A6386000 S31AFE00251604AC7C0001247C0004AC800100008041000880610004 S31AFE00252B808081009480A100907C6FF1207C9A03A67CBB03A636 S31AFE0025408061000C8081001080A10014802100047C0004AC4C32 -S31AFE00255500012C4C0000647C230B783C80000060844A30388498 +S31AFE00255500012C4C0000647C230B783C80000060844C80388446 S31AFE00256AFFE87C8123789061000C7C6000A6906100107C680273 S31AFE00257FA6906100143800000090010000900100087C0000A614 S31AFE00259460638000506004207C0004AC7C0001247C0004AC948A -S31AFE0025A921FFC848007C3D38210038806100147C6803A680A1FC +S31AFE0025A921FFC848007EBD38210038806100147C6803A680A17A S31AFE0025BE000C806100107C0000A6506004207C0004AC7C000168 S31AFE0025D3247C0004AC7CA12B784E8000209421FED87C0802A63A S31AFE0025E89321010C93410110936101149381011893A1011C931A @@ -467,3560 +467,3745 @@ S31AFE0025FDC1012093E101249001012C3FA000 S31AFE00261200343860FFFF7D2803A63B8000003BE000013F400041 S31AFE002627004E800021813D00347C7E1B78386000007D2803A646 S31AFE00263C3F6000003F2000004E800021801D00483C60000360B4 -S31AFE002651630D407C0803A63D2000003D6000009389390893EBBE -S31AFE00266639284E8000213C0000403C60FE013C80FE013CA0FE5F -S31AFE00267B01901B390C38631E2438841E5438A51E60939A392465 -S31AFE002690480091B53C60FE013C80FE013CA0FE013CC0FE01383F -S31AFE0026A5C61EA038631E6C38841E8438A51E94480091913C6080 -S31AFE0026BAFE0138631EA448009185809A392480BB390C3C60FEBC -S31AFE0026CF0138631EC8480091713D2000003D600000380938E8CB -S31AFE0026E43BAB38D87C1D00003D2000009389391C418200207C21 -S31AFE0026F91C0378813D00003BBD00087D2803A64E8000217C1D9D -S31AFE00270EE0004082FFEC3F800000837C39302C1B0000418200F4 -S31AFE0027234C3FA00000809D39103C60FE0138631ED448009111FA -S31AFE00273880BD39103D2000003BA000001CA503E893A939303841 -S31AFE00274D61000838800100480097612C03FFFE4082000C93BCC8 -S31AFE002762393048000008937C39307FFDFB787F3CCB787FDBF3F3 -S31AFE002777782C1D0000418200143C60FE0138631F10480090BDB7 -S31AFE00278C3BA00000386100083880010038A000FA480097192C09 -S31AFE0027A10300004080001C3D200000800939342C0000004182FE -S31AFE0027B6FFC44800B4C14BFFFFBC40820020393C320080090073 -S31AFE0027CB347F63DB787C0803A64E800021480075614BFFFF9C6D -S31AFE0027E0386100084800911D2C0300004081004C3FA000003FEF -S31AFE0027F540000138610008389D392038BA1A1C48009C157C63BB -S31AFE00280A1B794182001C8003000C807D3920389A1A1C7C0803CE -S31AFE00281FA64E800021480000143C60FE0138631F1C388100087D -S31AFE002834480090113BA000014BFFFF3C9421FFF07C0802A693DE -S31AFE002849E1000C900100142C0300027C9F237840820144807FF7 -S31AFE00285E00043C80FE0138841F3C480091292C03000040820098 -S31AFE002873447D6000A67D605B7839200000512004207C00012446 -S31AFE0028883C0002004C00012C7C108BA64C00012C3D4002007C4F -S31AFE00289D0004AC7D588BA67C0000A6516004207C00012448008C -S31AFE0028B200F8807F00043C80FE0138841F40480090D12C030064 -S31AFE0028C700408200C07D6000A67D605B78392000005120042055 -S31AFE0028DC7C00012439200000380000807C0903A6612010003D35 -S31AFE0028F1400E007C0004AC7D398BA67D588BA67C198BA67D58CC -S31AFE0029068BA6392900104200FFE03C0004004C00012C7C108B24 -S31AFE00291BA64C00012C3D4004007C0004AC7D588BA63920000078 -S31AFE002930380000807C0903A6612010003D400E007C0004AC7DE3 -S31AFE002945398BA67D588BA67C198BA67D588BA639290010420089 -S31AFE00295AFFE03C000C004C00012C7C108BA64C00012C3D400C05 -S31AFE00296F007C0004AC7D588BA67C0000A6516004207C00012485 -S31AFE002984480000243C60FE01809F000438631F4448008EB14843 -S31AFE0029990000103C60FE0138631F5C48008EA1800100147C08D4 -S31AFE0029AE03A683E1000C382100104E8000209421FFE87C08027E -S31AFE0029C3A693A1000C93C1001093E100149001001C3D600000DF -S31AFE0029D83D200000392938183BEB37A87C1F48004182002C7D83 -S31AFE0029ED3D4B783FC0FE01809F000480BF000080DF0008387E54 -S31AFE002A021F6848008E413BFF00107C1FE8004082FFE48001002A -S31AFE002A171C7C0803A683A1000C83C1001083E1001438210018F0 -S31AFE002A2C4E8000209421FFA87C0802A69381004893A1004C93AC -S31AFE002A41C1005093E100549001005C7C7D1B787C9C23783D201A -S31AFE002A56FE0139291F78386100083880006238A0000138C000E3 -S31AFE002A6B0038E100383901003C48009CCD3D20FE0139291F8875 -S31AFE002A80386100203880006C38A0000138C0000038E1004039FD -S31AFE002A9501004448009CA93D40FE017FA3EB787F84E378394A74 -S31AFE002AAA1EA038A0000138C1000838E0000239000000392000CF -S31AFE002ABF0048009C9D2C030000418200408001003C2C00000062 -S31AFE002AD4408200143C60FE0138631F9048008D65480000248008 -S31AFE002AE90100442C0000004082000C380000209001004080618B -S31AFE002AFE003880810040480098198001005C7C0803A68381003F -S31AFE002B134883A1004C83C1005083E10054382100584E80002006 -S31AFE002B289421FFB87C0802A69381003893A1003C93C100409319 -S31AFE002B3DE100449001004C3D2000008009392C7C7D1B787C9C8E -S31AFE002B5223783D20FE019001002839291FA83861000838800038 -S31AFE002B677738A0000138C0000038E100203901002448009BC9CA -S31AFE002B7C3D40FE017FA3EB787F84E378394A1FB838A000013876 -S31AFE002B91C1000838E00001390100283920000048009BBD2C03BF -S31AFE002BA60000418200F8800100242C000000418200343C60FEF9 -S31AFE002BBB018081002880A1002038631FCC48008C7D80A100207E -S31AFE002BD0386100301CA503E838800008480092D92C03FFFE4197 -S31AFE002BE58200BC814100287D6000A67D605B78392000005120B2 -S31AFE002BFA04207C00012439200000380000807C0903A66120102D -S31AFE002C0F003D600E007C0004AC7D398BA67D788BA67C198BA602 -S31AFE002C247D788BA6392900104200FFE03C0004004C00012C7CA9 -S31AFE002C39108BA64C00012C3D6004007C0004AC7D788BA639207C -S31AFE002C4E0000380000807C0903A6612010003D600E007C0004CB -S31AFE002C63AC7D398BA67D788BA67C198BA67D788BA63929001041 -S31AFE002C784200FFE03C000C004C00012C7C108BA64C00012C3DEE -S31AFE002C8D600C007C0004AC7D788BA67D4803A64E800021800192 -S31AFE002CA2004C7C0803A68381003883A1003C83C1004083E1001C -S31AFE002CB744382100484E8000209421FFE07C0802A693A1001429 -S31AFE002CCC93C1001893E1001C90010024380000003D2000003F6A -S31AFE002CE1C000003BA9393090093930901E391C48000A992C03AE -S31AFE002CF60000418200EC3D200000808939443D600000800B39D2 -S31AFE002D0B403D2000003BE97A247C8422147C8400507FE3FB78F5 -S31AFE002D2038A004004800831D7FE3FB78388003FC480004F98085 -S31AFE002D351F03FC7C030000408200303D20000081697A243C00D5 -S31AFE002D4A0BAD6000FACE7C0B000040820018813F03F83C00DE5A -S31AFE002D5FAD6000DEAD7C090000418200283C60FE0138632E806F -S31AFE002D7448008AD13C60000038637A243880000038A0040048F2 -S31AFE002D89008391480000583C60FE0138632C683881000838A01A -S31AFE002D9E000148000061800100082C000000418200303C60FE30 -S31AFE002DB30138632C807FA4EB7838A00004480000413C60FE0139 -S31AFE002DC83C80000038632CA83884391038A0000248000029383F -S31AFE002DDD000001901E391C800100247C0803A683A1001483C18B -S31AFE002DF2001883E1001C382100204E8000209421FFD87C0802B7 -S31AFE002E07A69321000C93410010936100149381001893A1001CE4 -S31AFE002E1C93C1002093E100249001002C3D2000003D6000003B9F -S31AFE002E314938D87C7B1B787C9D23787CB92B783BCB381848007B -S31AFE002E4609452C0300003B800004418200CC7C1ED0004182007B -S31AFE002E5BB43D20000039297A24807E00007FFC4A147F64DB7840 -S31AFE002E7048008AB92C0300004082007C807E00107C03C80040BC -S31AFE002E8582005C3803FFFF280000054181008C3D60FE01396B62 -S31AFE002E9A2E685400103A7D4B002E3D20FE0139292E687D4A4A90 -S31AFE002EAF147D4903A64E800420801F0000901D00004800005CA5 -S31AFE002EC4A01F0004813F0000B01D0004913D00004800004893B0 -S31AFE002ED9FD0000480000403C60FE0138632E187F64DB78480061 -S31AFE002EEE89594800002C807E00103BDE0018480002DD7C1ED0A5 -S31AFE002F03007F9C1A144082FF543C60FE0138632E447F64DB7879 -S31AFE002F184800892D8001002C7C0803A68321000C8341001083C1 -S31AFE002F2D6100148381001883A1001C83C1002083E10024382175 -S31AFE002F4200284E8000209421FBB87C0802A69301042893210454 -S31AFE002F572C93410430936104349381043893A1043C93C10440A5 -S31AFE002F6C93E104449001044C3D2000003D6000003B0938183BE6 -S31AFE002F812B38D87C7C1B787C9B2378480007FD2C0300003B40C9 -S31AFE002F9600007F1FC3783BC00004418202083C80000038847A8B -S31AFE002FAB243861000838A004004800808D3BA104083D60000092 -S31AFE002FC03D20FE01934B393039292D787FA3EB783880006C386D -S31AFE002FD5A0000038C0000238E10420390000004800975D3D401A -S31AFE002FEAFE017F83E3787F64DB787FA6EB78394A24A838A0008D -S31AFE002FFF0138E000013900000039200000480097512C030000AE -S31AFE003014418201947C1FC800418200A480A104207FE3FB787FE8 -S31AFE003029C4F3784800026538030001280000054181FFE03D6009 -S31AFE00303EFE01396B2E005400103A7D4B002E3D20FE0139292E28 -S31AFE003053007D4A4A147D4903A64E8004203C60000038637A2409 -S31AFE0030683881000838A0040048007FD1480001343B40000180A1 -S31AFE00307D7F00103BFF0018480001557FDE1A144BFFFF8C7FE9F3 -S31AFE003092C2783129FFFF7D294910381FFFE87C0048787FE9486A -S31AFE0030A7387D3F03784BFFFF6C3C60FE0138632D904800878D9D -S31AFE0030BC4BFFFF5C2C1A0000418200E43C000BAD3D6000006078 -S31AFE0030D100FACE3D20DEAD3B8B7A246129DEAD900B7A24913CB7 -S31AFE0030E603F87F83E378388003FC480001393D2000003FE000C4 -S31AFE0030FB00801F394481693940907C03FC7C0002143C60FE0105 -S31AFE0031107FC0585038632DA4480092292C030000418200888056 -S31AFE0031259F39443BA104247FC3F3787FA5EB784800B8097C7F39 -S31AFE00313A1B794182002C83A104247FE3FB784800BB117C661BC7 -S31AFE00314F783C60FE01386327247FA4EB787FE5FB78480086E55E -S31AFE003164480000447FC3F3787F84E3787FA6EB7838A00400480F -S31AFE00317900B9357C7F1B794182002883A104247FE3FB7848006C -S31AFE00318EBACD7C661B783C60FE0138632DD07FA4EB787FE5FB14 -S31AFE0031A378480086A18001044C7C0803A6830104288321042CAA -S31AFE0031B883410430836104348381043883A1043C83C10440833B -S31AFE0031CDE10444382104484E8000203803FFFF280000054D81F9 -S31AFE0031E200203D60FE01396B2D605400103A7D4B002E3D20FEF8 -S31AFE0031F70139292D607D4A4A147D4903A64E80042038600004AD -S31AFE00320C4E800020386000084E800020386000004E800020386F -S31AFE0032216002004E800020388400035484F0BE7C8023782C003C -S31AFE003236000038C0000038E000003884FFFF40810044816300CC -S31AFE00324B007C8A23787D68383038E7000168E900102C0A0000C5 -S31AFE0032607D2AFE707D404A787C0050507D6B43787C00FE707C9C -S31AFE003275C65A78386300047CE700383884FFFF4181FFC47CC3F0 -S31AFE00328A33784E8000209421FF707C0802A6930100709321008A -S31AFE00329F74934100789361007C9381008093A1008493C10088BE -S31AFE0032B493E1008C900100947C7B1B78807B00087C9F23782C6D -S31AFE0032C90300007CB82B78418200383881006038A000014BFFDB -S31AFE0032DEFB25801B000C2C00000041820014800100602C000000 -S31AFE0032F3004182019848000010800100602C00000040820188B6 -S31AFE0033083D20000039297A243C60FE01809B00047FBF4A1438C1 -S31AFE00331D632CBC48008525813B00103809FFFF28000005418160 -S31AFE00333201483D60FE01396B2D305400103A7D4B002E3D20FEAD -S31AFE0033470139292D307D4A4A147D4903A64E800420801D00008A -S31AFE00335C2C000000418200103D20FE0138892CC8480000303D93 -S31AFE00337120FE0138892CD0480000243C60FE01809D00003863A8 -S31AFE0033862CD8480084BD480000EC7FA3EB784800ACED7C641B0C -S31AFE00339B783C60FE0138632CC4480084A1480000D07FBEEB7856 -S31AFE0033B03BE000003F80FE013FA0FE017C9EF8AE387C2CDC4889 -S31AFE0033C5008481281F00044181000C387D2CE4480084713BFF95 -S31AFE0033DA0001281F00054081FFDC3C60FE017FDDF37838632CC8 -S31AFE0033EFE848008455480000843C60FE0138632CEC48000088D2 -S31AFE0034043C60FE0138632CF048008439881D00007FBEEB782CE7 -S31AFE0034190000007FBFEB78418200583F20FE013B4000003B804A -S31AFE00342E000A881E00002C00000A418200187FEBFB788C0B0050 -S31AFE003443012C00000A4082FFF87D7F5B787FC4F3789B5F000009 -S31AFE00345838792CF4480083E93BDF00019B9F0000881E00007F5C -S31AFE00346DDFF3782C0000004082FFBC2C180000418200183C6098 -S31AFE003482FE0138632CF0480083BD386000024800022C801B0048 -S31AFE003497102C00000441820054386100083880005038A0000044 -S31AFE0034AC48008A092C0300003860FFFF418002043861000848B7 -S31AFE0034C10084412C0300004182FFC4880100082C00002E4082CB -S31AFE0034D6000C38600000480001E02C00005E4082000C38600020 -S31AFE0034EB03480001D0813B00103809FFFF28000005418101BCF5 -S31AFE0035003D60FE01396B2D485400103A7D4B002E3D20FE0139D4 -S31AFE003515292D487D4A4A147D4903A64E80042083FD0000386160 -S31AFE00352A00087FA4EB78480096F54800003083FD000038610096 -S31AFE00353F087FA4EB7838A0000038C00000480095694800001473 -S31AFE00355483FD0000386100087FA4EB784800A9B92C030000419D -S31AFE00356982013C801D00007FE002787C09FE707D2302787C6328 -S31AFE00357E48507C63FE707C6018F8546307FE540007BC7C6303AE -S31AFE0035937848000128801D0000A17D00049001005839210058DC -S31AFE0035A8B1690004380100087D3A4B78900100683BC000003FFE -S31AFE0035BD60FE013BE100643B810068806100687FE4FB787F85CF -S31AFE0035D2E37838DB2CE4480094DD2C030000418200B4881F005C -S31AFE0035E7037C1DF1AE3BDE0001281E00054081FFD4480000C08F -S31AFE0035FC3C60FE017FBEEB7838632CFC4800823D48000044889D -S31AFE0036110100083BE100082C000000418200287FC4F3787FEB44 -S31AFE003626FB78880B0000980400008D2B0001388400012C09003E -S31AFE00363B004082FFEC7C9E23783800000A981E00003BDE000102 -S31AFE003650380000003C60FE01981E000038632D28480081E53802 -S31AFE0036656100083880005038A00000480088452C030000386027 -S31AFE00367AFFFF41800040386100084800827D2C0300004082FF60 -S31AFE00368F8448000028A01A000481210058B01D0004913D0000D7 -S31AFE0036A438600004480000143C60FE0138632CEC480081913835 -S31AFE0036B9600001800100947C0803A68301007083210074834185 -S31AFE0036CE00788361007C8381008083A1008483C1008883E100AF -S31AFE0036E38C382100904E8000209421FFF07C0802A693C100083F -S31AFE0036F893E1000C900100147C7E1B782C1E00017C9F237841C5 -S31AFE00370D8100143C60FE0138632C28480012B548000054480091 -S31AFE00372200692C030000418200483C6000003C80000080BF0054 -S31AFE0037370438633738388437A848008E3D7C631B794182001C6B -S31AFE00374C8003000C7FC3F3787FE4FB787C0803A64E80002148EE -S31AFE0037610000103C60FE0138632C3C48001261800100147C08CD -S31AFE00377603A683C1000883E1000C382100104E8000209421FFCA -S31AFE00378BE07C0802A6934100089361000C9381001093A10014D1 -S31AFE0037A093C1001893E1001C900100243D200000800933002C1A -S31AFE0037B50000004082009C3FE00000807F390C38000001900968 -S31AFE0037CA33003C63FFFF3C8000014800B0557C641B79418200D5 -S31AFE0037DF183C60FE0138632BD44800805D386000004800006817 -S31AFE0037F43F6000003F40000038600000389B393C38BA3940480B -S31AFE00380900B0C93FA000003F800000387D3944389C39484800C0 -S31AFE00381EB0E9809B393C80BA394080DC39483C60FE0180FD3987 -S31AFE0038334438632BFC4800800D813D3944801F390C3D2900011B -S31AFE0038487C0900503D600000900B394C38600001800100247C1B -S31AFE00385D0803A6834100088361000C8381001083A1001483C155 -S31AFE003872001883E1001C382100204E8000209421FFE07C080224 -S31AFE003887A693A1001493C1001893E1001C900100243D40FE010D -S31AFE00389C394A2B8438A0000238C0000038E0000039010008397C -S31AFE0038B120000148008EA92C030000408200143C60FE01386323 -S31AFE0038C6291C48001105480000E03D6000003D20000080A939C2 -S31AFE0038DB44808B39403FA00000807D394C7C8520504800775526 -S31AFE0038F083BD394C3BC000003BE000004800000C3BFF00013B1A -S31AFE003905BD01003D200000800939445400C23E7C1F0040408099 -S31AFE00391A0028881D00002C0000FF4182FFDC806100087FA4EB07 -S31AFE00392F7848007FF92C0300004082FFC83BC000012C1E000049 -S31AFE003944408200183C60FE018081000838632BA448007EF14883 -S31AFE0039590000543D20000080093924807D00147C03004041802D -S31AFE00396E001C80BD00183D2000008169390C7C032A147C0058B2 -S31AFE00398340418000143C60FE0138632BBC48007EB5480000181E -S31AFE003998809D0010480076A5801D001C3D2000009009392C80F2 -S31AFE0039AD0100247C0803A683A1001483C1001883E1001C382142 -S31AFE0039C200204E8000209421FFD87C0802A6934100109361004E -S31AFE0039D7149381001893A1001C93C1002093E100249001002C7E -S31AFE0039EC3D40FE01394A2B8438A0000238C0000038E0000039F1 -S31AFE003A010100083920000148008D552C030000408200143C607E -S31AFE003A16FE013863291C48000FB1480001843D6000003D2000E9 -S31AFE003A2B0080A93944800B39403FA000007F650050807D394C43 -S31AFE003A407F64DB78480075FD83DD394C3BA000003BDE02003B67 -S31AFE003A55E000024800000C3BFF00013BDE01003F400000801AB4 -S31AFE003A6A39445400C23E7C1F004040800040881E00002C0000C5 -S31AFE003A7FFF4182FFDC806100087FC4F37848007E9D2C03000068 -S31AFE003A944082FFC83C60FE018081000838632B904800889D2CFD -S31AFE003AA9030000418200F83BA000012C1D0000408200183C60AB -S31AFE003ABEFE018081000838632BA448007D7D480000D83B81005F -S31AFE003AD30C807E0010809E00187F85E3784800AE5D7C7F1B7949 -S31AFE003AE84182002883A1000C7FE3FB784800B1657C661B783CC6 -S31AFE003AFD60FE0138632B247FA4EB787FE5FB7848007D397FC3CA -S31AFE003B12F378388000FF38A00100480075FD809A39447F63DB91 -S31AFE003B27787F85E3784800AE117C7F1B794182002C83A1000CF9 -S31AFE003B3C7FE3FB784800B1197C661B783C60FE0138632B247F10 -S31AFE003B51A4EB787FE5FB7848007CED480000483D2000008089D6 -S31AFE003B66394C80BA39447F63DB787F86E3784800AF397C7F1B2F -S31AFE003B7B794182002883A1000C7FE3FB784800B0D17C661B788A -S31AFE003B903C60FE0138632B447FA4EB787FE5FB7848007CA58031 -S31AFE003BA501002C7C0803A683410010836100148381001883A1A1 -S31AFE003BBA001C83C1002083E10024382100284E8000209421FFC7 -S31AFE003BCFA07C0802A69381005093A1005493C1005893E1005CA9 -S31AFE003BE490010064380000007C7D1B787C9C23783D20FE019070 -S31AFE003BF9010044392928C09001003C386100083880006638A0C0 -S31AFE003C0E000138C0000038E100383901003C48008B253D20FE8A -S31AFE003C230139292B68386100203880006C38A0000138C00000E4 -S31AFE003C3838E100403901004448008B013D40FE017FA3EB787F48 -S31AFE003C4D84E378394A24A838A0000238C1000838E00002390002 -S31AFE003C6200003920000048008AF52C030000408200143C60FE8A -S31AFE003C77013863291C48000D51480001048001003C2C00000077 -S31AFE003C8C41820010800100442C000000408200143C60FE0138B2 -S31AFE003CA1632B7048000D29480000DC806100384800ABDD7C7C89 -S31AFE003CB61B794082002080610038800100407C6302143863FF16 -S31AFE003CCBFF4800ABC17C7C1B794182004483A100387F83E378E1 -S31AFE003CE04800AF797C651B783C60FE01386329787FA4EB784842 -S31AFE003CF5007B513D2000003D6000003C60FE018089393C80ABAC -S31AFE003D0A39403863299848007B35480000708081003880010061 -S31AFE003D1F407C8323787C8402143884FFFF4800B1112C030000A8 -S31AFE003D34418200143C60FE0138632AA848007B054800004080C7 -S31AFE003D496100388081004038A100484800ABE97C7C1B7941823B -S31AFE003D5E002883A100487F83E3784800AEF17C661B783C60FE65 -S31AFE003D730138632B247FA4EB787F85E37848007AC580010064FB -S31AFE003D887C0803A68381005083A1005483C1005883E1005C3895 -S31AFE003D9D2100604E8000209421FF187C0802A6934100D093610E -S31AFE003DB200D4938100D893A100DC93C100E093E100E49001000B -S31AFE003DC7EC380000007C7D1B787C9C23783D20FE01900100C4CF -S31AFE003DDC392928849001009C900100A4900100AC900100B4904C -S31AFE003DF10100BC386100083880006238A0000138C0000038E157 -S31AFE003E0600983901009C480089353D20FE013929289838610018 -S31AFE003E1B203880007238A0000138C0000038E100A0390100A4DC -S31AFE003E30480089113D20FE01392928AC386100383880006538DF -S31AFE003E45A0000138C0000038E100A8390100AC480088ED38E14E -S31AFE003E5A00B03D20FE017CFE3B78392928C0386100503880002B -S31AFE003E6F6638A0000138C00000390100B4480088C53D20FE0124 -S31AFE003E84392928DC386100683880006C38A0000138C000003891 -S31AFE003E99E100B8390100BC480088A13D20FE01392928F438619D -S31AFE003EAE00803880007338A0000138C0000038E100C03901006C -S31AFE003EC3C44800887D3D40FE017FA3EB787F84E378394A2910BA -S31AFE003ED838A0000238C1000838E00006390100C8392000014834 -S31AFE003EED0088712C030000408200143C60FE013863291C4800FB -S31AFE003F020ACD480004988001009C2C0000004182001C80010042 -S31AFE003F17BC2C00000041820010800100C82C000000408200148B -S31AFE003F2C3C60FE013863293048000A9948000464800100C4818C -S31AFE003F414100B82C00000040820008914100C03D200000800900 -S31AFE003F563944816100C07D2A02143929FFFF7D2903963F400058 -S31AFE003F6B007D2901D67C095840912100B8408000143C60FE01CA -S31AFE003F803863294C480078C148000414800100B42C0000004195 -S31AFE003F95820070806100B04800A8F17C7C1B7940820020806160 -S31AFE003FAA00B0800100C07C6302143863FFFF4800A8D57C7C1BA7 -S31AFE003FBF794182004483A100B07F83E3784800AC8D7C651B7843 -S31AFE003FD43C60FE01386329787FA4EB78480078653D2000003DB8 -S31AFE003FE96000003C60FE018089393C80AB3940386329984800FE -S31AFE003FFE78494800039C3FE0000080810098801F39247C0400CE -S31AFE004013404180001C800100C03D2000008169390C7C04021414 -S31AFE0040287C005840418000283C60FE01386329B44800780D3D65 -S31AFE00403D2000003C60FE01809F392480A9390C38632998480021 -S31AFE00405277F5806100C8480078A92803000F408100183C60FE2A -S31AFE00406701386329E038800010480077D548000328800100B497 -S31AFE00407C2C0000004082002C808100B87FC3F378480003392CFB -S31AFE004091030000408200183C60FE01808100B838632A104800C8 -S31AFE0040A677A1480002F43F8000003D20000080BC394480093914 -S31AFE0040BB403FA000007F650050807D394C7F64DB7848006F75B5 -S31AFE0040D0801C394483FD394C5409C23F3BA000003B8000004184 -S31AFE0040E58200883FC0FE01881F00002C0000FF418200608061E4 -S31AFE0040FA00C87FE4FB78480078292C0300004082004C80010068 -S31AFE00410FB42C00000041820014813F0010800100B07C0900005A -S31AFE00412440820214813F0018800100B87C0900004082021480BC -S31AFE0041398100C8387E2A8C480082012C030000418202543B80EA -S31AFE00414E00014800001C801A39443BBD00015400C23E7C1D00F6 -S31AFE004163403BFF01004180FF842C1C0000814100C0806100B029 -S31AFE0041784082004C3D200000800939443D6000005400C23E7C50 -S31AFE00418D1C004083EB394C3BA000004800001C3D2000008009A5 -S31AFE0041A239443BBD00015400C23E7C1D00403BFF010040800066 -S31AFE0041B710881F00002C0000FF4082FFDC7C8352143884FFFF51 -S31AFE0041CC4800AC712C030000418200143C60FE0138632AA8481F -S31AFE0041E1007665480001B838A100CC806100B0808100B87CBEC0 -S31AFE0041F62B784800A7457C7C1B793BA000014182002C83A1005E -S31AFE00420BCC7F83E3784800AA497C661B783C60FE017FA4EB78A0 -S31AFE00422038632ADC7F85E3784800761D3BA000002C1D00004145 -S31AFE004235820044806100B08081009880A100C07FC6F3784800A7 -S31AFE00424AA8657C7C1B794182002883A100CC7F83E3784800A999 -S31AFE00425FFD7C661B783C60FE0138632B007FA4EB787F85E3788E -S31AFE004274480075D17FE3FB783880000038A0010048006E958072 -S31AFE0042898100C87FE3FB78480076CD800100A4812100B02C00D0 -S31AFE00429E0000913F001040820020800100B42C00000041820021 -S31AFE0042B30C812100B0480000108121009848000008812100A070 -S31AFE0042C8800100AC913F00142C000000408200103D20000080F1 -S31AFE0042DD09392C48000008800100A8901F001C800100B83D2080 -S31AFE0042F2000080893944901F00187F63DB787FC5F3784800A694 -S31AFE004307397C7C1B794182004C83A100CC7F83E3784800A9414A -S31AFE00431C7C661B783C60FE0138632B247FA4EB787F85E3784861 -S31AFE004331007515480000683C60FE0138632A3848007505480097 -S31AFE00434600583C60FE0138632A64480074F5480000483D2000A4 -S31AFE00435B008089394C80BA39447F63DB787FC6F3784800A741EF -S31AFE0043707C7C1B794182002883A100CC7F83E3784800A8D97C2B -S31AFE004385661B783C60FE0138632B447FA4EB787F85E378480054 -S31AFE00439A74AD800100EC7C0803A6834100D0836100D4838100FF -S31AFE0043AFD883A100DC83C100E083E100E4382100E84E80002082 -S31AFE0043C43D20000080E939443D600000814B393C3D2000007CE6 -S31AFE0043D9073A14810939407D4A02147D4953787C094040408040 -S31AFE0043EE007054E0F0BE7C0603785407103A800A00002C00FF0D -S31AFE004403FF4182004C7C095000418200147C0950507C001670BF -S31AFE0044187C002040408000587D4953787C0940404080002054CD -S31AFE00442DCB103A7D295A147C09404040800010800900002C00C3 -S31AFE004442FFFF4082FFEC7D2A4B78480000087D4A3A147C0A4021 -S31AFE004457404180FFA47C095000418200207C0950507C001670C9 -S31AFE00446C7C0020404180001091230000386000014E8000203817 -S31AFE0044816000004E8000209421FFE07C0802A69361000C938100 -S31AFE004496001093A1001493C1001893E1001C900100243D2000A7 -S31AFE0044AB00800939443D600000814B393C3D20000083C93940F2 -S31AFE0044C07C0002147FEA02147C1FF0407FE4FB783F6000004052 -S31AFE0044D58000883F80FE013FA00000801F00002C00FFFF41829D -S31AFE0044EA005C7C04F80041820010387C286C7FE5FB7848007338 -S31AFE0044FF497C1FF0407FE4FB7840800034801F00002C00FFFFFD -S31AFE00451441820028801D39445400F0BE5409103A7C844A147C06 -S31AFE00452904F04040800010800400002C00FFFF4082FFEC7C9FFF -S31AFE00453E237848000014801B39445400F0BE5400103A7FFF0235 -S31AFE004553147C1FF0404180FF887C04F800418200143C60FE013E -S31AFE0045683863286C7FE5FB78480072D5800100247C0803A68350 -S31AFE00457D61000C8381001083A1001483C1001883E1001C382137 -S31AFE00459200204E8000209421FFE87C0802A69381000893A100EA -S31AFE0045A70C93C1001093E100149001001C3FA000003D2000001A -S31AFE0045BC81693940801D39443C60FE017FE05850386327FC48C1 -S31AFE0045D1007275801D39443BC000005409C23F3F8000004182F5 -S31AFE0045E600547FFDFB787FDFF3787F9EE3783F80FE01881D00D5 -S31AFE0045FB002C0000FF4182002080BD001080DD001480FD001846 -S31AFE004610811D001C387C28407FA4EB7848007229801E39443BFC -S31AFE004625FF00015400C23E7C1F00403BBD01004180FFC480014F -S31AFE00463A001C7C0803A68381000883A1000C83C1001083E1002A -S31AFE00464F14382100184E8000209421FFB87C0802A69321002C67 -S31AFE00466493410030936100349381003893A1003C93C10040932E -S31AFE004679E100449001004C7C7D1B787C9C23783BE000003D206F -S31AFE00468EFE013929269893E10020386100083880006638A000C9 -S31AFE0046A30038C0000238E1002039000000480080913D40FE01BD -S31AFE0046B87FA3EB787F84E378394A24A838A0000238C1000838A4 -S31AFE0046CDE000013900000039200000480080852C030000418222 -S31AFE0046E202C03C60FE01386326C448007C552C030000408200D3 -S31AFE0046F7143C60FE01386326F4480071454800029C3C60FE01C7 -S31AFE00470C3863270048007135800100202C0000004182006C3DAB -S31AFE004721200000808939483D600000800B39443D200000388417 -S31AFE004736FFFC8069393C7C8401D63BA100247C0002147C6302C7 -S31AFE00474B147FA5EB784800A1ED7C7C1B797FBEEB784182003CB9 -S31AFE00476083A100247F83E3784800A4F17C661B783C60FE013876 -S31AFE0047756327247FA4EB787F85E378480070C5480000143C6023 -S31AFE00478AFE013863274C480070B53BC100243F400000839A39A7 -S31AFE00479F443C0000027F9C00003F20000083B9394C4FFEEB828A -S31AFE0047B47C000026540007FE7C0000D07C0900F87F9C00385580 -S31AFE0047C929039C7F9C4B787FA3EB783880000038A001004800D3 -S31AFE0047DE693D3D20FE013F60000039692794801B393C814927C3 -S31AFE0047F394810B0004939D0018915D0000911D0004901D0014E0 -S31AFE004808901D00103BBD01007FA3EB783880000038A001004883 -S31AFE00481D0068FD3D60FE01801B393C810B279C392B279C80E992 -S31AFE004832000C81690004814900087C00E214939D0018911D0039 -S31AFE00484700917D0004915D000890FD000C901D0014901D001039 -S31AFE00485C3BBD01007FA3EB783880000038A00100480068AD3D9A -S31AFE00487120FE01800927AC396927AC812B0008814B0004A10B0E -S31AFE004886000C913D0008901D0000915D0004B11D000C880B002B -S31AFE00489B0E3F800000981D000E817A3944801C39407D2B5A14D1 -S31AFE0048B07C090050901D0014917D0018901D00103BBD01007FFE -S31AFE0048C5A3EB783880000038A0010048006849801C3940809A1B -S31AFE0048DA39443D60FE01814B27BC7F640050392B27BCA10900D9 -S31AFE0048EF0C8009000481690008915D0000901D0004917D000870 -S31AFE004904B11D000C909D0018937D0010937D00147F63DB787F83 -S31AFE004919C5F3784800A0213BFF00013BFF00017C7C1B793BFF10 -S31AFE00492E00013BFF00014182002C83A100247F83E3784800A3B5 -S31AFE004943197C661B783C60FE01386327247FA4EB787F85E37867 -S31AFE00495848006EED480000448099394C7F63DB7857E5402E7F1B -S31AFE00496DC6F3784800A13D7C7C1B794182002883A100247F8319 -S31AFE004982E3784800A2D57C661B783C60FE01386327CC7FA4EB56 -S31AFE004997787F85E37848006EA98001004C7C0803A68321002C07 -S31AFE0049AC83410030836100348381003883A1003C83C100408343 -S31AFE0049C1E10044382100484E8000209421FFF87C0802A69001C0 -S31AFE0049D6000C7C641B783C60FE013863267048006E613C6000CA -S31AFE0049EB003C8000003CA0FE0138633738388437A838A52690E4 -S31AFE004A0048007CBD8001000C7C0803A6382100084E800020947F -S31AFE004A1521FF207C0802A67D800026934100C8936100CC938189 -S31AFE004A2A00D093A100D493C100D893E100DC900100E491810098 -S31AFE004A3FC43BA000007C7B1B787C9A23783D20FE013BC92210F2 -S31AFE004A5493A1009893A100B0386100083880000038A0000C4814 -S31AFE004A690066B13D20000181491AB03B8100183800000C39607A -S31AFE004A7E00013D20FE01B0010010B161000E91410008B3A100B3 -S31AFE004A930C392922687F83E3783880007638A0000038C00002B5 -S31AFE004AA838E100903900000048007C913D20FE01392922703836 -S31AFE004ABD6100303880007238A0000038C0000238E1009439006D -S31AFE004AD2000048007C6D3D20FE013929228038610048388000A1 -S31AFE004AE76238A0000138C0000038E100983901009C48007C49EF -S31AFE004AFC3D20FE0139292290386100603880006D38A000013802 -S31AFE004B11C0000138E100A0390100A448007C253D20FE0139298C -S31AFE004B2622B0386100783880006838A0000138C0000138E10088 -S31AFE004B3BA8390100AC48007C013D40FE017F63DB787F44D3784F -S31AFE004B507F86E378394A22C838A0000138E00005390100B03966 -S31AFE004B6520000148007BF52C0300003BE0000041820288800146 -S31AFE004B7A00AC2C0000004182002C806100A83881000848009336 -S31AFE004B8F8D2C030000408200183C60FE01808100A8386322D4A2 -S31AFE004BA448006CA148000254800100A42C0000004182007480FD -S31AFE004BB96100A03C80FE01388422EC48006DCD2C0300004082EA -S31AFE004BCE000C3BE0000148000054806100A03C80FE01388422F0 -S31AFE004BE3F448006DAD2C030000408200283D20000080093934F7 -S31AFE004BF83BE000002C000000408200283C60FE01386322FC48D7 -S31AFE004C0D006C39480001EC3C60FE01808100A03863232448004E -S31AFE004C226C25480001D82E1F0000409200DC806100B02C03000C -S31AFE004C37004082001C3C60FE013863233848006C017FC3F37893 -S31AFE004C4C48006BF9480001AC38C100B47CDE3378388100083803 -S31AFE004C61A000014800803D7C7C1B7940800028806100B483A167 -S31AFE004C7600B0480083D57C651B783C60FE013863234C7FA4EBAE -S31AFE004C8B7848006BB94800016C3C60FE01808100903863CE489A -S31AFE004CA0480001A93D2000013B491BC83BA000003B6100B848CD -S31AFE004CB500000C7F9DD9AE3BBD0001281D0003418100184800D4 -S31AFE004CCA01A97C7C1B794080FFE8801A0110900100B42C1C00BC -S31AFE004CDF0040800028806100B4480083657C641B783C60FE0101 -S31AFE004CF43863236448006B4D7FC3F37848008135480000F82C6E -S31AFE004D091F0001408200143C60FE013863238848006B2D480092 -S31AFE004D1E00E04800010D800100942C000000418200548001006D -S31AFE004D339C2C000000408200143C60FE01386323B448006B0108 -S31AFE004D48480000A883A100984800000C987D00003BBD000148FC -S31AFE004D5D0001157C631B794080FFF03C60FE0180810098386336 -S31AFE004D7223D87FA5EB7848006ACD480000743C80FE01388423D1 -S31AFE004D87F0386100B938A0000348006C612C0300003BA100B81E -S31AFE004D9C408200143C60FE0038634E70480006DD4800004488F6 -S31AFE004DB10100B82C00005340820028893D00013929FFD028099E -S31AFE004DC60009418100183C60FE008081009838634E704800011C -S31AFE004DDBC9480000143C60FE01808100B8386323F448006A5989 -S31AFE004DF04092000C386100B44800803D800100E4818100C47CD3 -S31AFE004E050803A6834100C8836100CC838100D083A100D483C197 -S31AFE004E1A00D883E100DC7D808120382100E04E8000203D200045 -S31AFE004E2F0139291BC88009010C39690004900901089169010447 -S31AFE004E444E8000203D600001392B1BC839400000380001009040 -S31AFE004E596B1BC8914901189009010C90890114914901084E807A -S31AFE004E6E00209421FFF07C0802A693C1000893E1000C900100CE -S31AFE004E83143D2000013BE91BC883DF01082C1E00004080000C1C -S31AFE004E983860FFFF480000EC408200C4801F01142C0000004190 -S31AFE004EAD820038817F01183D200000392933047C8958AE396B74 -S31AFE004EC200013C60FE01917F01183863220848006975801F0187 -S31AFE004ED718280000064081000893DF01183D2000013BE91BC8C3 -S31AFE004EEC801F010C2C0000FF41810020801F01142C00000041D3 -S31AFE004F0182FF983C60FE013863220C480069394BFFFF883D2002 -S31AFE004F16000181291BC8381F00047C0303783880010038BF01EE -S31AFE004F2B107D2803A6901F01044E8000212C030000907F010C21 -S31AFE004F40907F010841810020801F01142C0000004182FF483C38 -S31AFE004F5560FE013863220C480068E94BFFFF383D400001394A00 -S31AFE004F6A1BC8812A0108816A01043929FFFF912A0108886B0090 -S31AFE004F7F00396B0001916A0104800100147C0803A683C1000866 -S31AFE004F9483E1000C382100104E8000209421FF707C0802A6925B -S31AFE004FA981006092A1006492C1006892E1006C93010070932125 -S31AFE004FBE0074934100789361007C9381008093A1008493C1000A -S31AFE004FD38893E1008C900100947C7D1B787C9523783B60000045 -S31AFE004FE83A8000013B2000003AC000003AE0FFFF480002602CB2 -S31AFE004FFD050053418200183C60FE01386320A87F64DB784800EC -S31AFE0050126835480002547FA803A63B7B00024E80002138A100FA -S31AFE0050275838000000547C063E7CBA2B78900100587FA3EB7885 -S31AFE00503C38800001480002697C7F1B79408000183C60FE0138B5 -S31AFE0050516320D47F64DB78480067ED4800020C381CFFD028007C -S31AFE00506600093B7B0001418101AC3D60FE01396B21E05400105D -S31AFE00507B3A7D4B002E3D20FE01392921E07D4A4A147D4903A699 -S31AFE0050904E8004207FA3EB78389CFFD17F45D378480002092C5E -S31AFE0050A51400007C7E1B78381BFFD17FD8F3787F60E2144182D4 -S31AFE0050BA002C2C1500004182001C7F3EA8503C60FE0138632086 -S31AFE0050CFF87F24CB7848006771480000083B2000003A80000065 -S31AFE0050E43D200000816939247FDECA147D39F0507C1748107C77 -S31AFE0050F90001107C0003B87D2900787C1E58407EE000387C17DD -S31AFE00510E4B78418000143D2000008009390C7C1E00404081002A -S31AFE005123183C60FE01386321107FC4F378480067154800013405 -S31AFE005138381F002E7FFC00507FE9FB782C0900007F7BFA143BBB -S31AFE00514DFFFFFF408100307F5CD3787FA3EB78388000017F85F3 -S31AFE005162E378480001457FE0FB782C000000987E00003BDE001E -S31AFE005177013BFFFFFF4181FFDC7FA3EB783880000138A0000033 -S31AFE00518C4800011D88A1005B7C6318F85466063E7C0628003B4E -S31AFE0051A17B000190A10058418200183C60FE013863214C7F04EF -S31AFE0051B6C3784800668D480000AC7D39F0507C09B0107C0001BE -S31AFE0051CB107C0003B87D2900787EC000387C164B7848000054FF -S31AFE0051E07FA3EB78209C003B7F45D378480000BD7C7E1B783D5C -S31AFE0051F52000003C60FE0193C9392C386321887FC4F3787EE5D0 -S31AFE00520ABB787EC6B37848006635480000543C60FE0138632113 -S31AFE00521FB07F64DB787F85E3784800661D4800003C7F7FDB7891 -S31AFE0052347FBEEB78480000083BFF00017FC803A64E8000212C2B -S31AFE00524903000A4082FFF07FDDF3787FFBFB787FA803A64E803C -S31AFE00525E00217C651B794181FD98800100947C0803A682810005 -S31AFE0052736082A1006482C1006882E1006C8301007083210074B5 -S31AFE005288834100788361007C8381008083A1008483C1008883F6 -S31AFE00529DE1008C382100904E8000209421FFE07C0802A6936100 -S31AFE0052B2000C9381001093A1001493C1001893E1001C900100DE -S31AFE0052C7247C9E23787FC0F3782C0000007C7B1B787CBC2B78BA -S31AFE0052DC3BA000003BDEFFFF408101787F6803A64E8000217F8F -S31AFE0052F16803A6547F063E4E800021393FFFD0381FFFBF2129E7 -S31AFE0053060009392000007D29491420000005380000007C00014F -S31AFE00531B147D270379546B063E3920000040820010381FFF9F22 -S31AFE0053302800000541810008392000012C0900004182010439DD -S31AFE0053452BFFD0380BFFBF7D2A4B787C0803785529063E5400D5 -S31AFE00535A063E21290009392000007D29491420000005380000EA -S31AFE00536F007C0001147D2703793920000040820010380BFF9F68 -S31AFE0053842800000541810008392000012C090000418200B039DE -S31AFE0053993FFFD05520063E2800000957BD402E4181000C7D2313 -S31AFE0053AE4B7848000030381FFF9F280000054181000C387FFF05 -S31AFE0053C3A94800001C381FFFBF393FFFC9200000057C000110BD -S31AFE0053D87C0003B87C0348385540063E280000094181000C7D31 -S31AFE0053ED49537848000030380BFF9F280000054181000C392BDB -S31AFE005402FFA94800001C5500063E392BFFC9200000057C00011E -S31AFE005417107C0003B87C094838546020362C1C00007C034B789C -S31AFE00542C7FBD1B784182001C801C00007C001A14901C0000487F -S31AFE00544100000C3860FFFF480000187FC0F3782C0000003BDE61 -S31AFE005456FFFF4181FE907FA3EB78800100247C0803A6836100B4 -S31AFE00546B0C8381001083A1001483C1001883E1001C382100207B -S31AFE0054804E8000209421FFF87C0802A69001000C3C60FE0138DD -S31AFE00549563208C480063AD8001000C7C0803A6382100084E80AE -S31AFE0054AA00203860001C4E8000209421FFE87C0802A693A1002B -S31AFE0054BF0C93C1001093E100149001001C7C7D1B78813D0004E1 -S31AFE0054D483C900044800002C73E00012418200107FA3EB787FBF -S31AFE0054E9E4FB784800004973E000084182000C7FA3EB784800CB -S31AFE0054FE01A9B3FE0010A01E00107000001A541F043E2C1F00D2 -S31AFE005513004082FFC88001001C7C0803A683A1000C83C10010A8 -S31AFE00552883E10014382100184E8000209421FFE87C0802A69338 -S31AFE00553D81000893A1000C93C1001093E100149001001C7C7DFA -S31AFE0055521B7883DD000483FE0018A01F0000700090002C0010B5 -S31AFE00556700408200683B9E0028813D0000801E00108169002486 -S31AFE00557C7C00F850816B00085400F87AA13F00007C9C002E7FF3 -S31AFE005591A3EB7838A000007D6803A67129EFFFB13F00004E804F -S31AFE0055A60021A01F0000700920004182000C83FE0010480000CB -S31AFE0055BB083BFF0008A01F0000700090002C0010004182FFA42C -S31AFE0055D093FE00188001001C7C0803A68381000883A1000C8390 -S31AFE0055E5C1001083E10014382100184E8000209421FFE87C08E5 -S31AFE0055FA02A693A1000C93C1001093E100149001001C81230073 -S31AFE00560F048169000C83EB00047C188AA654000FFE2C000000C5 -S31AFE00562441820028812B0004A00B00022C000000408100187CA4 -S31AFE005639004BAC7C0004AC3400FFF0392900104181FFF02C05BE -S31AFE00564E0000408100387C9E23787CBD2B78807E00002C03008C -S31AFE005663004182001880BE00047FE4FB78480059D1801E000427 -S31AFE0056787FFF021437BDFFFF3BDE00084082FFD88001001C7CC0 -S31AFE00568D0803A683A1000C83C1001083E10014382100184E8018 -S31AFE0056A200209421FFE87C0802A693A1000C93C1001093E100EF -S31AFE0056B7149001001C7C7D1B7883DD000483FE001C48000048FC -S31AFE0056CC813D000093FE000C816900247FA3EB78800B0004A0A8 -S31AFE0056E19F00027C0803A64E800021A01F000060008000B01F85 -S31AFE0056F60000A13F0000712020004182000C83FE00144800005E -S31AFE00570B083BFF0008A01F0000700090002C0010004182FFB0CE -S31AFE00572093FE001C8001001C7C0803A683A1000C83C1001083F2 -S31AFE005735E10014382100184E8000209421FFD87C0802A69301BB -S31AFE00574A00089321000C93410010936100149381001893A10032 -S31AFE00575F1C93C1002093E100249001002C83C300047C98237853 -S31AFE00577483BE00087CBB2B78A01D00007CD93378700980007CC7 -S31AFE005789FA3B78418200447FBFEB783F80FE01A01F00007009BC -S31AFE00579E20004182000C83FE0010480000083BFF00087C1FE85D -S31AFE0057B3004082000C387C202448006089A01F0000700980002E -S31AFE0057C84082FFD07FFDFB78A01D00007009200041820010809F -S31AFE0057DD1E00107C0903784800000C381D0008813E0010901E57 -S31AFE0057F200087C09E8502C1B00005400F87A393E0028B33D003D -S31AFE005807027F49012E83FD0004408100307F1EC3787F7CDB78F4 -S31AFE00581C809E000080BE00047FE3FB7848005819801E000437AC -S31AFE0058319CFFFF3BDE00087FFF02144082FFE07C188AA6540056 -S31AFE0058460FFE2C00000041820028813D0004A01D00022C000078 -S31AFE00585B00408100187C004BAC7C0004AC3400FFF03929001027 -S31AFE0058704181FFF0A01D00006000DC00B01D00008001002C7C7F -S31AFE0058850803A6830100088321000C834100108361001483814D -S31AFE00589A001883A1001C83C1002083E10024382100284E800062 -S31AFE0058AF208123000481690008A06B000054638BFE686300010F -S31AFE0058C44E800020688401003004FFFF7C6021104E8000208142 -S31AFE0058D923000481690004800B000060000030900B00004E801D -S31AFE0058EE00208123000481690004800B000054000732900B0038 -S31AFE005903004E8000209421FFD87C0802A69321000C9341001041 -S31AFE005918936100149381001893A1001C93C1002093E100249056 -S31AFE00592D01002C83230008839900047FDE9AA677DEFFFF3C80BA -S31AFE0059420000388433503860000838A0000648000D297F788A90 -S31AFE005957A6577B0FFE39200000380000807C0903A661201000E2 -S31AFE00596C3CC00E007C0004AC7D398BA67CD88BA67C198BA67C3E -S31AFE005981D88BA6392900104200FFE03D2004007C0004AC7D382F -S31AFE0059968BA63FA000003CC0FE003CE0FE013D20000038C65D1B -S31AFE0059AB1C38E7E7FC391D393839297A083860001C38800000AE -S31AFE0059C07F25CB7848004845807D39383BFE3C00480048613806 -S31AFE0059D560001C48004C6D3860001C48004B15801E0A003B5E9F -S31AFE0059EA0A005400073293FC0000901E0A00935C00047FE3FB76 -S31AFE0059FF783880000038A000A44800571138C000047CC903A649 -S31AFE005A142F9B0000391E2C00395E2C203D2000003D6000003817 -S31AFE005A29E0000038009000915C001C39294A50396B6210911CF4 -S31AFE005A3E0010911C0008911C0018915C0014915C000CB0EA0031 -S31AFE005A5302912A0004B00A0000392905F0394A00084200FFECB0 -S31AFE005A68A40AFFF87D09437860002000B00A0000394000047D0B -S31AFE005A7D4903A6399F007238000000B009000291690004B0092A -S31AFE005A920000396B05F0392900084200FFEC7D284B78A408FFB8 -S31AFE005AA7F83B60000160002000B0080000A13E09523BA00010F5 -S31AFE005ABC61290003B13E0952A01E0950390005F05400043AB073 -S31AFE005AD11E0950A13E09543B80FFFF7129FFFDB13E0954A01EB0 -S31AFE005AE609623D40DEBB7000FFCFB01E0962A13E0960614A209C -S31AFE005AFBE37129FFCFB13E0960A01E096439600000600000309B -S31AFE005B10B01E0964A13E09523860888861290A00B13E0952A0E1 -S31AFE005B251E09503880000F7000F5FFB01E0950813E0AEC38C0F1 -S31AFE005B3A05EE5529002E913E0AEC801E0AEC38E00040600000A2 -S31AFE005B4F3D901E0AEC813E0AEC38002C20552906B0913E0AEC2A -S31AFE005B64937E0030B01F000039202C00B13F00029BBF00049BA8 -S31AFE005B79BF0005B11F0006939F0030915F0034917F0038917F9B -S31AFE005B8E003C917F0040B07F0044B17F0044B09F0046B17F00C6 -S31AFE005BA348B0DF004AB0FF004CB11F004EB11F00503800000651 -S31AFE005BB8B17F00587C0903A6B17F005A3CA00000B17F005CB17B -S31AFE005BCD7F005E38A533567D8963788C05FFFF98090000392909 -S31AFE005BE200014200FFF438000000B01F0078B01F0094B01F00C3 -S31AFE005BF796B01F0098B01F009AB01F009EB01F00A0B01F00A2E2 -S31AFE005C0C39200001B13E09C0A01E09C070060001418200187F15 -S31AFE005C21C9F378A00909C0700A00014082FFF87D3E4B783800DA -S31AFE005C36FFFFB01A00103920001AB13A0014396000003C001026 -S31AFE005C4B88917A00046000000C901A00003920D555B13A000E17 -S31AFE005C603800280AB01A0008392000903D60FA10992B0000A0FB -S31AFE005C751E096260000001B01E0962A13E09605529043CB13EFE -S31AFE005C8A0960419E00103D6002007C0004AC7D788BA6813900FE -S31AFE005C9F003C800000816900247F23CB78800B00003884335073 -S31AFE005CB47C0803A64E800021386000018001002C7C0803A683C5 -S31AFE005CC921000C83410010836100148381001883A1001C83C129 -S31AFE005CDE002083E10024382100284E8000209421FFF87C080264 -S31AFE005CF3A69001000C4BFFF7BD3860001C480049453860001C19 -S31AFE005D08480047ED8001000C7C0803A6382100084E8000209469 -S31AFE005D1D21FFF87C0802A69001000C3860001C4800466538604D -S31AFE005D3200038001000C7C0803A6382100084E8000209421FF98 -S31AFE005D47F07C0802A693C1000893E1000C900100143D60000009 -S31AFE005D5C3D200000392937383BEB37347C1F4840418000207DEE -S31AFE005D713E4B78813F00003BFFFFFC7D2803A64E8000217C1F4B -S31AFE005D86F0404080FFEC800100147C0803A683C1000883E100B7 -S31AFE005D9B0C382100104E8000209421FFF87C0802A69001000C17 -S31AFE005DB03D200000800936B42C0000004182000C9003009448A0 -S31AFE005DC50000243D200000906939A0480018197C1602A6280097 -S31AFE005DDA7A124081000C38007A127C1603A68001000C7C080344 -S31AFE005DEFA6382100084E8000204E800020386000004E80002032 -S31AFE005E049421FFF07C0802A693E1000C90010014480005F13D15 -S31AFE005E192000003889361C800400083BE000002C0000004182A7 -S31AFE005E2E00307FE3FB787C9F2378809F000080BF000480DF00DF -S31AFE005E430888FF000C3BFF0010480004C1801F00082C00000081 -S31AFE005E584082FFE0800100147C0803A683E1000C382100104EA7 -S31AFE005E6D8000203C000A007C0004AC7C108BA67C0004AC7C188D -S31AFE005E828BA63C000C004C00012C7C108BA64C00012C7C00045F -S31AFE005E97AC7C188BA63C0002004C00012C7C108BA64C00012C94 -S31AFE005EAC7C0004AC7C188BA64E8000209421FFF87C0802A69096 -S31AFE005EC101000C480000ED38007A127C1603A68001000C7C0876 -S31AFE005ED603A6382100084E8000203D20002F6129AF087C6349C6 -S31AFE005EEBD63C00431B6000DE837C0300967C63FE707C00967089 -S31AFE005F007D6300507D3602A67D605B782C000000396BFFFF4C33 -S31AFE005F15810020394BFFFF7C1602A67C0900004182FFF87C0952 -S31AFE005F2A03787D605B782C0000007D4B53784181FFE04E800005 -S31AFE005F3F209421FFF87C0802A69001000C3D20FF006129093095 -S31AFE005F5438000001B00900007C0006ACA00900007C0006AC54E9 -S31AFE005F6900AAFF38600000418200302060003A3D6000005460E0 -S31AFE005F7E103A396B33587D6B002E3D200000392934447C89003F -S31AFE005F932E7D6803A64E800021546307FA8001000C7C0803A6D8 -S31AFE005FA8382100084E8000203D20000039493358390000407C32 -S31AFE005FBD0A402E3D20FE0039295DFC7C00480041820018800A14 -S31AFE005FD200403D20FE013929AF987C004800408200343D20FE5C -S31AFE005FE70039295F403D600000380000007D2A412E6000DEADCA -S31AFE005FFC396B34447C0B412E3D20000039293530380000007CA2 -S31AFE00601109412E3D60FE01800B2EF43D20FE0139292EB87D296B -S31AFE00602602147D2903A64E8004203D20FF006129001480090087 -S31AFE00603B007C0006AC64000001900900007C0006AC480000E8C2 -S31AFE0060503D20FF0061290200A00900007C0006AC60000008B060 -S31AFE0060650900007C0006AC480000C83D20FF0061290200A0094A -S31AFE00607A00007C0006AC60000004B00900007C0006AC4800004C -S31AFE00608FA83D20FF0061290240A00900007C0006AC60000004ED -S31AFE0060A4B00900007C0006AC480000883D20FF0061290220A084 -S31AFE0060B90900007C0006AC60000008B00900007C0006AC480000 -S31AFE0060CE00683D20FF0061290220A00900007C0006AC60000012 -S31AFE0060E304B00900007C0006AC480000483D20FF0061290940FA -S31AFE0060F8800900007C0006AC60000080900900007C0006AC48E9 -S31AFE00610D0000283D20FF0061290948816900007C0006AC3C00C6 -S31AFE006122800054005D7E7D6B0378916900007C0006AC3D60FE8F -S31AFE00613701800B30043D20FE0139292FA07D2902147D2903A6F7 -S31AFE00614C4E8004203D20FF0061290200A00900007C0006AC5435 -S31AFE00616100063E60000100B00900007C0006AC480000683D208C -S31AFE006176FF0061290240A00900007C0006AC5400063E60000175 -S31AFE00618B00B00900007C0006AC480000443D20FF006129022080 -S31AFE0061A0A00900007C0006AC5400063E60000100B00900007CE1 -S31AFE0061B50006AC480000203D20FF0061290940800900007C0083 -S31AFE0061CA06AC6000E000900900007C0006AC3D60FE01800B30AC -S31AFE0061DFEC3D20FE01392930887D2902147D2903A64E80042048 -S31AFE0061F43D20FF0061290014800900007C0006AC6000004090B1 -S31AFE0062090900007C0006AC4E8000203D20FF0061290200A009C6 -S31AFE00621E00007C0006AC60000008B00900007C0006AC4E80001C -S31AFE006233203D20FF0061290200A00900007C0006AC600000040F -S31AFE006248B00900007C0006AC4E8000203D20FF0061290240A0A0 -S31AFE00625D0900007C0006AC60000004B00900007C0006AC4E80D8 -S31AFE00627200203D20FF0061290220A00900007C0006AC600000B4 -S31AFE00628708B00900007C0006AC4E8000203D20FF006129022019 -S31AFE00629CA00900007C0006AC60000004B00900007C0006AC4E79 -S31AFE0062B18000203D20FF0061290940800900007C0006AC6000EE -S31AFE0062C60080900900007C0006AC4E8000203D20FF006129099B -S31AFE0062DB48816900007C0006AC3C00800054000FFE7D6B0378CA -S31AFE0062F0916900007C0006AC4E8000207C1E22A6600000077C3A -S31AFE0063051E23A64E8000209421FFF093E1000C54E0FFFE70FFE6 -S31AFE00631A00012F0000002F8300207CC0FE707D600026556B1FDC -S31AFE00632FFE54A500267D400026554ADFFE7C0600507D4A00D070 -S31AFE0063447CE0002654E7EFFE7D6B00D060A808FF54000FFE7DF1 -S31AFE0063590858787D4950F860A508FD7CFF00387CAB5838714A16 -S31AFE00636E000D2F9F00007D654378548400267129001D7D4A4BD7 -S31AFE00638378608402003960000039000020419E005C546B402E49 -S31AFE0063987D55C3A67D70C3A67C93C3A67CB6C3A660A001007DCA -S31AFE0063AD5DC3A67D78C3A67C9BC3A67C1EC3A6386300013CC692 -S31AFE0063C2FF807F8340007CC0FE707C0600507D2000265529EF55 -S31AFE0063D7FE54000FFE7D2700393C8400803CA500804082FFAC63 -S31AFE0063EC656020007C10C3A67C18C3A683E1000C382100104E9A -S31AFE006401800020380000007C19C3A6380000207C0903A63920CD -S31AFE0064160000380000007C15C3A67D30C3A67C13C3A67C16C3D8 -S31AFE00642BA67C1DC3A67D38C3A67C1BC3A67C1EC3A6392901002C -S31AFE0064404200FFD83C00200060001F007C10C3A67C18C3A64E0F -S31AFE0064558000209421FDE87CDE9AA674C6FFFF3D600000812BD9 -S31AFE00646A366C2C0900004082020039400030380000017D4903D3 -S31AFE00647FA6900B366CB12609C43800000039263C807D284B78C2 -S31AFE0064949806086038E62E0838A1000838862E003861000939ED -S31AFE0064A981021198090000392900014200FFF839202E00B128A9 -S31AFE0064BE0002396000103940020938002E089968000599680021 -S31AFE0064D304B0080000B14800063920A800B1262E0838000101AD -S31AFE0064E8B007000290A700047C8B2378B14B0002380000A59892 -S31AFE0064FD01000890AB0004B1262E00380000009806086439209E -S31AFE006512005099260868380000019806086039200111B1260967 -S31AFE006527C0A00609C070090001418200187CC93378A00909C075 -S31AFE00653C700A00014082FFF87D264B7838000211B00609C0A141 -S31AFE0065512609C071200001418200187CC93378A00909C0700AF9 -S31AFE00656600014082FFF87D264B78392000007D2903A63800001C -S31AFE00657B819806086C7D4902A6614AC3517D4903A6A00B00002D -S31AFE00659070098000418200084200FFF4394001007D4903A63DD3 -S31AFE0065A520000039297E2439600000380000FF7C0959AE396BB9 -S31AFE0065BA00014200FFF87D8763787C6B1B787C0B3800418200B3 -S31AFE0065CF9C3CA00000880B00002C00004D40820080880B000159 -S31AFE0065E42C00004F40820074880B00022C000054408200688C22 -S31AFE0065F90B000839400000892B00015400402E7C084B787C0AB9 -S31AFE00660E4000396B00024080005438857E247C651B78880B0013 -S31AFE00662300396B00017D693A787D23FE707C0451AE7C604A78F6 -S31AFE0066387C0018507C00FE70394A00017CA900787C0A40007D17 -S31AFE00664D6000387C0B4B784180FFCC48000010396B00017C0B42 -S31AFE00666238004082FF703800000098060860382102184E800037 -S31AFE006677209421FFE87C0802A693A1000C93C1001093E10014F6 -S31AFE00668C9001001C7C7D1B787C9F23787CBE2B784BFFFDBD3DE8 -S31AFE0066A120000039697E24394B01007C0B50404080008457A89D -S31AFE0066B6063E880B00007C00400040820054886B0001396B008A -S31AFE0066CB027F83F0004FFEE3827C000026540007FE7C0000D0C9 -S31AFE0066E07FC900787C6000387C034B794081004C7C6903A67D72 -S31AFE0066F5695B787FE4FB7888090000392900019804000038842E -S31AFE00670A00014200FFF048000028886B0001380300027D2B00FB -S31AFE00671FEE5529063E2C0900FF4182000C7C0B50404180FF884F -S31AFE006734386000008001001C7C0803A683A1000C83C1001083E3 -S31AFE006749E10014382100184E8000209421FFF87C0802A690017A -S31AFE00675E000C480046758001000C7C0803A6382100084E80002A -S31AFE006773203C80FF00608400007C9E9BA63CA0FA1060A5000107 -S31AFE0067883C60000060630000986500007C788AA63C600A007C56 -S31AFE00679D0004AC7C788BA63C600C007C0004AC7C788BA63C6079 -S31AFE0067B204007C0004AC7C788BA63C6001007C0004AC7C788B31 -S31AFE0067C7A63C6007007C0004AC7C788BA67C708AA63C600A005D -S31AFE0067DC7C708BA64C00012C3C600C007C708BA64C00012C3C94 -S31AFE0067F16004007C708BA64C00012C7C0004AC3C6000606063AA -S31AFE0068062400906400003C60FFFF6063FF88906400043C6000E9 -S31AFE00681B00606300C2B06402003C6055CC6063AA339064032055 -S31AFE00683090640324906403289064032C386000C3B06402203829 -S31AFE006845600083B06402403CA0FE0060A569E43CC0FE0060C6B5 -S31AFE00685A6AE47CE530507CE7167038C00000806500009064013B -S31AFE00686F7C90C4016838A5000438C600017C0638004180FFE895 -S31AFE00688438600200B064017A3C60188060631000906401703C2A -S31AFE00689960FE00606304013CA0FF8060A509609064010090A4CE -S31AFE0068AE01043C600000606300813CA0FFC060A5040090640153 -S31AFE0068C30890A4010C3C600000606300803CA0000060A50400AF -S31AFE0068D89064011090A401143C600000606300803CA00000603E -S31AFE0068EDA504009064011890A4011C3C60FA00606304013CA051 -S31AFE006902FFE060A509309064012090A401243C60800060630012 -S31AFE006917013CA0A00060A501089064012890A4012C3C60FA21A7 -S31AFE00692C606300013CA0FFFF60A501089064013090A401343CDC -S31AFE00694160FC00606300013CA0FF8060A509409064013890A413 -S31AFE006956013C3C6002006063000090640280806402845463658E -S31AFE00696B3E2C030000418200103C605F506063D0004800000CA1 -S31AFE0069803C6000006063D000906402843C4000003C60FF0060DE -S31AFE006995630014904300003C400000604200007C4210F87C56E9 -S31AFE0069AA03A6384000013C60FF0060630200B04300003CA0FA89 -S31AFE0069BF1060A500013C60000060630008986500007C6802A6B9 -S31AFE0069D47063FFFF6463FE007C6803A64E800020CFAFC0040F48 -S31AFE0069E9AFC4040CAF8C0410AF0C04F0AF0C00F3BF4805FFFF5C -S31AFE0069FEC005FFFFC005CFAFC0040FAFC4040CAF8C0400AF0C2A -S31AFE006A130407AF0C080CAF0C0401AF0C040FAF0C080CAF0C0474 -S31AFE006A2801AF0C040FAF0C080CAF0C0410AF0C04F0AFC000F3D7 -S31AFE006A3DBF4805FFFFC005CFFF00040FFF04040CFF0C0013FF60 -S31AFE006A524804FFFFC004FFFFC005FFFFC005FFFFC005CFFF0006 -S31AFE006A67040FFF04040CFF0C0003FF0C0C0CFF0C0003FF0C0C9A -S31AFE006A7C0CFF0C0003FF0C0C0CFF0C0013FF4804FFFFC004FF9A -S31AFE006A91FFC005FFFFC005FFFFC005FFFFC005FFFFC005FCFF21 -S31AFE006AA6C004C0FFC00401FFC0040FFFC0041FFFC004FFFFC05A -S31AFE006ABB04FFFFC005FFFFC005FFFFC005FFFFC005FFFFC005EF -S31AFE006AD0FFFFC005FFFFC007FFFFC007FFFFC007FFFFC0077066 -S31AFE006AE563000E3C80FA1060840001986400004E8000203C80D6 -S31AFE006AFAFA106084000138A0000A98A400003CA0000A7CA90368 -S31AFE006B0FA64200000038A0000C98A400003CA0000A7CA903A6B1 -S31AFE006B24420000003863FFFF2C0300004080FFD038A000069849 -S31AFE006B39A400003CA000147CA903A6420000004E8000203D2054 -S31AFE006B4EFE01392931705463073E7C6918AE4E8000209421FFE3 -S31AFE006B63F87C0802A69001000C3D200000806936882C03000025 -S31AFE006B784181000C480029494800000C3800FFFF90093688801B -S31AFE006B8D01000C7C0803A6382100084E8000203803FF9F280065 -S31AFE006BA200054181000C3863FFA94E8000203923FFD055200630 -S31AFE006BB73E280000094181000C7D234B784E8000203803FFBF3E -S31AFE006BCC280000054081000C3860FFFF4E8000203863FFC94E81 -S31AFE006BE18000209421FFE07C0802A690010024380000009801B5 -S31AFE006BF60018906100104BFFFF655463063E38810008480000BB -S31AFE006C0B1D2C0300014082FFEC800100247C0803A6382100202B -S31AFE006C204E8000209421FFF07C0802A693C1000893E1000C9031 -S31AFE006C350100147C9F2378897F00102C0B0000408200282C0313 -S31AFE006C4A002440820098392000013800FFFF901F0004993F0098 -S31AFE006C5F10917F0000917F000C4800007C2C0B000140820054CE -S31AFE006C742C03002340820020815F0008817F000C380000007C2B -S31AFE006C890A59AE39200002993F001048000050817F000C2C0BC3 -S31AFE006C9E0800418200E8801F0000813F00087C001A14901F006A -S31AFE006CB3007C6959AE380B0001901F000C480000242C0B000238 -S31AFE006CC8408200245463063E4BFFFECD546320363800000390E5 -S31AFE006CDD7F0004981F001038600000480000AC2C0B00034082CC -S31AFE006CF200985463063E4BFFFEA5801F0004893F00037C001B04 -S31AFE006D07787C090000901F0004418200103860002D480027714B -S31AFE006D1C4800006C3860002B48002765813F0008880900022C8C -S31AFE006D3100003A4082004C8869000083DF000C48002749813F2A -S31AFE006D460008886900014800273D396000037C0BF04041810079 -S31AFE006D5B287FCAF3787FE4FB78812400087C0958AE7D2B4A142F -S31AFE006D70396B00017C0B50409809FFFD4081FFE8386000014828 -S31AFE006D8500001038000000981F00103860FFFF800100147C0837 -S31AFE006D9A03A683C1000883E1000C382100104E8000209421FF70 -S31AFE006DAFE07C0802A69361000C9381001093A1001493C10018E7 -S31AFE006DC493E1001C900100243D20FE013B6931707C7C1B78380D -S31AFE006DD9600024480026AD8BFC00003BC000002C1F00003BA05A -S31AFE006DEE0000418200247FE3FB78480026917C1DFA143BDE0011 -S31AFE006E03017FFCF0AE541D063E2C1F00004082FFE438600023FC -S31AFE006E184800267157A0E13E7C7B00AE4800266557A0073E7C3C -S31AFE006E2D7B00AE480026594BFFFD2D5463067E2C03002B408291 -S31AFE006E42FF98800100247C0803A68361000C8381001083A100A6 -S31AFE006E571483C1001883E1001C382100204E8000209421FFD83F -S31AFE006E6C7C0802A6936100149381001893A1001C93C100209356 -S31AFE006E81E100249001002C3D200000816939503D4000002C0BB2 -S31AFE006E96000038000000900A368C3F6000003F8000004081012F -S31AFE006EAB383FC000003FA000003D2000008009395C2C00000011 -S31AFE006EC04182006C801C39503D60000028000003408100188044 -S31AFE006ED51E3954700900034082000C3BE0000448000034801C78 -S31AFE006EEA39503BE000012800000140810024800B395454000769 -S31AFE006EFFFE7C0000D07C00FE707C0900F8540007FE552907BC2F -S31AFE006F147C1F4B78808B3954386100087FE5FB784800316148D4 -S31AFE006F29000014813E39543BE0000188090000980100083D2044 -S31AFE006F3E00008009368C2C00000040820098390000007C08F8B4 -S31AFE006F53004080006C3D20FE0138C9317038A100083CE00000FE -S31AFE006F683C8000007D6828AE814739585560E13E7D2600AE9982 -S31AFE006F7D2A00008004368C394A00012C000000914739584082B0 -S31AFE006F9200505560073E7D2600AE396A0001992A0000801B3613 -S31AFE006FA78C916739582C00000040820030390800017C08F800E0 -S31AFE006FBC4180FFB0813D3950801E39547D3F48502C0900007CD5 -S31AFE006FD100FA14901E3954913D39504181FED88001002C7C083E -S31AFE006FE603A6836100148381001883A1001C83C1002083E100CD -S31AFE006FFB24382100284E8000209421FFE87C0802A693A1000CE2 -S31AFE00701093C1001093E100149001001C2C0600003D2000003D02 -S31AFE0070256000003D4000003D00000090893958906B395490AACC -S31AFE00703A395090C8395C418200303FA0000038000000901D36DA -S31AFE00704F8C813D368C4BFFFE15813D368C801D368C2C000000B4 -S31AFE00706441820010386000004800001C4BFFFDF93D60000081E6 -S31AFE0070792B39583800000098090000806B39588001001C7C08CC -S31AFE00708E03A683A1000C83C1001083E10014382100184E800005 -S31AFE0070A3209421FFC07C0802A69281001092A1001492C100183F -S31AFE0070B892E1001C9301002093210024934100289361002C93F5 -S31AFE0070CD81003093A1003493C1003893E1003C900100443D2023 -S31AFE0070E20000800939503B6000002C0000003D2000009369362D -S31AFE0070F78C3E8000003EA00000408101703D2000008169395452 -S31AFE00710C3F000000880B00002C000000418201583EC000003F13 -S31AFE0071214000003EE000008016395C2C000000418200588015F0 -S31AFE00713639502800000340810018801A3958700900034082004A -S31AFE00714B0C3BC000044800003C801539503BC000012800000159 -S31AFE0071604081002C801A3958540007FE7C0000D07C00FE707CF3 -S31AFE0071750900F8540007FE552907BC7C1E4B78480000083BC0BE -S31AFE00718A00013BE000007C1FF000408000743FA000003F2000D3 -S31AFE00719F003B810008813D39548869000039290001913D395419 -S31AFE0071B45463063E4BFFF9E58019368C547B26362C00000040AD -S31AFE0071C98200A8813839548869000039290001913839545463DC -S31AFE0071DE063E4BFFF9BD8014368C7F631B782C000000547B0688 -S31AFE0071F33E4082007C7F7FE1AE3BFF00017C1FF0004180FFA054 -S31AFE0072088016395C2C00000041820018809A3958386100087F70 -S31AFE00721DC5F37848002EC54800000C813A39589B6900003D20EC -S31AFE00723200008009368C2C0000004082003481373950801A39C2 -S31AFE007247587D3E48502C0900007C00F214901A39589137395040 -S31AFE00725C4081001481383954880900002C0000004082FEBC8045 -S31AFE0072710100447C0803A68281001082A1001482C1001882E18A -S31AFE007286001C8301002083210024834100288361002C83810067 -S31AFE00729B3083A1003483C1003883E1003C382100404E800020AF -S31AFE0072B09421FFE87C0802A693A1000C93C1001093E100149041 -S31AFE0072C501001C2C0600003D2000003D6000003D4000003D00AD -S31AFE0072DA000090693954908B395890AA395090C8395C418200F6 -S31AFE0072EF303FA0000038000000901D368C813D368C4BFFFDA564 -S31AFE007304813D368C801D368C2C000000418200103860000048B2 -S31AFE0073190000104BFFFD893D200000806939588001001C7C0883 -S31AFE00732E03A683A1000C83C1001083E10014382100184E800062 -S31AFE007343209421FFF87C0802A69001000C480028713D2000005E -S31AFE00735838000001900936708001000C7C0803A6382100084E3B -S31AFE00736D8000209421FFE87C0802A693A1000C93C1001093E187 -S31AFE00738200149001001C7C9E23783BA000007C7F1B7893BE00C2 -S31AFE0073970048000024801E0000813F0000540020367C001B785A -S31AFE0073AC39290001901E0000913F00003BBD0001813F000088A6 -S31AFE0073C16900002C030000418200104BFFF7D17C631B79408003 -S31AFE0073D6FFC87FA3EB788001001C7C0803A683A1000C83C10014 -S31AFE0073EB1083E10014382100184E8000207C842379394000008D -S31AFE00740040820018380000309803000198030000386000024E12 -S31AFE007415800020392500077D20FE7054001F7E7D2902147D25FF -S31AFE00742A1E71418200603D20FE0138C9317038E5FFFF54E01832 -S31AFE00743F387C88043068A90001200900007D2049143168FFFFF8 -S31AFE0074547C0B41107C0B4B79418200285508063E5500E13E7D7F -S31AFE0074696600AE5509073E7C0648AE996300009C0300013863A4 -S31AFE00747E0001394A00027CE53B794082FFB07D4353784E800090 -S31AFE007493209421FFF07C0802A693E1000C900100143D2000006E -S31AFE0074A880A939907C641B782C05000038600000408100843F19 -S31AFE0074BDE00000801F36942C00000041820010386000017C0851 -S31AFE0074D203A64E8000212C030001408200103D20000098693673 -S31AFE0074E79048000054801F36942123FFFF216900007D2B491426 -S31AFE0074FC216000007C0B01147C0B4B79418200343D200000803B -S31AFE00751109396C2C00000041820024386000017C0803A64E800C -S31AFE00752600212C030000418200103D20000038000001980936BC -S31AFE00753B91800100147C0803A683E1000C382100104E8000201D -S31AFE0075509421FFF07C0802A693E1000C900100143FE000008886 -S31AFE0075651F36902C000000418200343D200000800936942C0029 -S31AFE00757A0000418200243D20000080A939903860000038800072 -S31AFE00758F007C0803A64E80002138000000981F36903FE00000F3 -S31AFE0075A4881F36912C000000418200283D2000008009396C2C92 -S31AFE0075B900000041820018386000007C0803A64E8000213800F2 -S31AFE0075CE0000981F3691800100147C0803A683E1000C3821009B -S31AFE0075E3104E8000209421FFF07C0802A693C1000893E1000CE5 -S31AFE0075F8900100143D200000800936842C0000004182001080B6 -S31AFE00760D0936847C0803A64E8000213D200000800939A42C0096 -S31AFE00762200004182001438000000900939A43BE0000248000065 -S31AFE0076371048007C1948007B4D7C7F1B7848007CD52C030000E7 -S31AFE00764C4182000848007D0148007CC14BFFFEF948007C713861 -S31AFE007661600003480028B538600003480028452C1F000041822A -S31AFE00767600203FC00000813E36747FE3FB787D2803A64E800082 -S31AFE00768B212C0300004082FFEC48007C7D3D200000800936800C -S31AFE0076A02C00000041820010800936807C0803A64E80002180F7 -S31AFE0076B50100147C0803A683C1000883E1000C382100104E8087 -S31AFE0076CA00209421FFB87C0802A6936100349381003893A10047 -S31AFE0076DF3C93C1004093E100449001004C7C7E1B783BE0000085 -S31AFE0076F43F6000003B810028801B39703BA000012C000000416D -S31AFE00770982001C7FE3FB787F84E3787C0803A64E8000217C7D81 -S31AFE00771E1B78480000107FE3FB7848001D3990610028381FFF85 -S31AFE007733E02800001F7C0A03782F9D00003BFF00017F83E378B1 -S31AFE0077484181004C390000047D0903A6386100087C6B1B78385B -S31AFE00775D000000392000007C0B49AE392900014200FFF8380068 -S31AFE00777200047C0903A67C6943787F8BE378880B0000396B0090 -S31AFE0077870198090000392900014200FFF0419E0030200A001F5B -S31AFE00779C7C0001107C0500F85400077A54A507387FC4F3787C97 -S31AFE0077B1052B7838C000004BFFF84D7C7E1B7848000058212A18 -S31AFE0077C6001F7D2949107D2048F8540006F6552907387D2903F9 -S31AFE0077DB782C0900007FCBF378380000783929FFFF4182001848 -S31AFE0077F02C090000980B0000396B00013929FFFF4082FFF028CA -S31AFE0078050A001F4181000C3BDE0010480000083BDE00082C1F8E -S31AFE00781A00464081FEE08001004C7C0803A6836100348381005A -S31AFE00782F3883A1003C83C1004083E10044382100484E800020ED -S31AFE0078449421FFD07C0802A67D8000269381002093A100249339 -S31AFE007859C1002893E1002C900100349181001C88030000386374 -S31AFE00786E00012C0000507C9D237890610008392000003BC00083 -S31AFE0078834740820070386100083881000C4BFFFAE12C030000B9 -S31AFE007898418200288121000888090000392900012C00003D9154 -S31AFE0078AD210008408200108121000C3BC90001480000383D2037 -S31AFE0078C2FE01880931887FA4EB782C0000003969318841820094 -S31AFE0078D7D8880B0000980400008D2B0001388400012C090000E6 -S31AFE0078EC4082FFEC480000BC7D3F4B787C1FF000408000803B4D -S31AFE007901800000397FFFE020AB001F7CA52910392100103881EF -S31AFE007916000C7CA028F87C8428787CA9483854A5077A540007F6 -S31AFE00792B38806100082A0B001F7CA503787D24237893810010D2 -S31AFE00794038C000004BFFF96D808100107FE3FB7848001B2541D7 -S31AFE00795591001081210008392900104800000C812100083929FC -S31AFE00796A0008912100083BFF00017C1FF0004180FF8C3D20FED5 -S31AFE00797F018809318C7FA4EB782C0000003969318C4182001CB0 -S31AFE007994880B0000980400008D2B0001388400012C09000040C0 -S31AFE0079A982FFEC3800000098040000800100348181001C7C082D -S31AFE0079BE03A68381002083A1002483C1002883E1002C7D808121 -S31AFE0079D320382100304E8000209421FF287C0802A693A100CCFC -S31AFE0079E893C100D093E100D4900100DC3BC000003D6000017C98 -S31AFE0079FD7D1B789BCB88B4893D00003809FFC12800003B4181D3 -S31AFE007A1208B43D60FE01396B31E05400103A7D4B002E3D20FE5F -S31AFE007A2701392931E07D4A4A147D4903A64E8004204800781973 -S31AFE007A3C4800774D3D20FE01392931705460E73E7D0900AE5465 -S31AFE007A5163073E7CE918AE3D40000138000053392A88B4980AFF -S31AFE007A6688B439600000996900039909000198E90002480008B7 -S31AFE007A7B603FA00001387D88B43880080038A000204BFFF96D59 -S31AFE007A903BBD88B4380000007C1D19AE4800083C3D20FE0188A1 -S31AFE007AA50931903D6000012C000000396B88B43949319041824E -S31AFE007ABA07E8880A00008D2A0001980B00002C090000396B00FE -S31AFE007ACF014082FFEC480007CC387D000148000B9D480007F8E8 -S31AFE007AE4387D000148000D61480007EC3C600001386388B44B23 -S31AFE007AF9FFFBD5480007DC881D00012C0000004082004048005E -S31AFE007B0E09313D20FE018809318C3D6000012C000000396B8884 -S31AFE007B23B43949318C41820778880A00008D2A0001980B000027 -S31AFE007B382C090000396B00014082FFEC4800075C381D0001901C -S31AFE007B4D0100883BC1008C3BE100887FE3FB787FC4F3784BFF9D -S31AFE007B62F8112C030000418200A481210088880900003929004E -S31AFE007B77012C00002C912100884082008C7FE3FB7838810090F6 -S31AFE007B8C4BFFF7E52C030000418200788121008888090000395C -S31AFE007BA12900012C00002C91210088408200608081008C2C0430 -S31AFE007BB600004182003880610090480008BD7C641B7941820006 -S31AFE007BCB148061008880A1008C38C000004BFFF6D98001008C59 -S31AFE007BE0812100887C0002147D29021491210088812100888828 -S31AFE007BF50900002C00002C4082001038090001900100884BFF9F -S31AFE007C0AFF5081210088880900002C0000004082003C3D20FED2 -S31AFE007C1F018809318C3D6000012C000000396B88B43949318C14 -S31AFE007C344182066C880A00008D2A0001980B00002C09000039A7 -S31AFE007C496B00014082FFEC480006503D20FE01880931D03D60E0 -S31AFE007C5E00012C000000396B88B4394931D041820634880A00EE -S31AFE007C73008D2A0001980B00002C090000396B00014082FFEC16 -S31AFE007C88480006183C8000017FA3EB78388488B44BFFFBAD4809 -S31AFE007C9D00063C381D00013BE10094900100947FE3FB783881D3 -S31AFE007CB200984BFFF6BD2C0300004182009081210094880900DB -S31AFE007CC700392900012C00002C91210094408200787FE3FB7894 -S31AFE007CDC3881009C4BFFF6912C03000041820064806100983C5E -S31AFE007CF180000180A1009C388488B438C000014BFFF3052C03DA -S31AFE007D060000408205D03D60FE01880B31D43D2000012C00000F -S31AFE007D1B00394988B4396B31D44182001C880B00008D2B0001BD -S31AFE007D30980A00002C090000394A00014082FFEC380000009862 -S31AFE007D450A0000480005903D20FE01880931D03D6000012C0086 -S31AFE007D5A0000396B88B4394931D04182053C880A00008D2A0060 -S31AFE007D6F01980B00002C090000396B00014082FFEC4800052063 -S31AFE007D843BC00001381D00013BE100A0900100A07FE3FB78389A -S31AFE007D998100A44BFFF5D52C030000418201F8812100A08809DA -S31AFE007DAE0000392900012C00002C912100A0408201E07FE3FBAF -S31AFE007DC378388100A84BFFF5A92C030000418201CC806100A0A6 -S31AFE007DD888030000386300012C00003A906100A0408201B42CD1 -S31AFE007DED1E000041820124800100A82C000000418200A8800136 -S31AFE007E0200A83BA000007C1D0040408000543941000881610093 -S31AFE007E17A0892B0000396B00017D204B782C00007D7D2AE9AE12 -S31AFE007E2C916100A040820018880B0000392B0001600000207CDD -S31AFE007E410AE9AE912100A03BBD0001281D007F41810010800125 -S31AFE007E5600A87C1D00404180FFB8808100A4386100087FA5EBC5 -S31AFE007E6B78480022797C03E80040820024812100A8800100A4E7 -S31AFE007E807D3D48502C0900007C00EA14900100A4912100A84019 -S31AFE007E9582FF6C800100A82C0000004082003C3D20FE018809A7 -S31AFE007EAA318C3D6000012C000000396B88B43949318C41820353 -S31AFE007EBFE4880A00008D2A0001980B00002C090000396B0001FF -S31AFE007ED44082FFEC480003C83D20FE01880931D43D6000012C19 -S31AFE007EE9000000396B88B4394931D4418203AC880A00008D2A5E -S31AFE007EFE0001980B00002C090000396B00014082FFEC480003F5 -S31AFE007F1390808100A480A100A838C000014BFFF3912C03000061 -S31AFE007F284182003C3D20FE018809318C3D6000012C0000003994 -S31AFE007F3D6B88B43949318C4182035C880A00008D2A0001980B36 -S31AFE007F5200002C090000396B00014082FFEC480003403D20FEA9 -S31AFE007F6701880931D43D6000012C000000396B88B4394931D439 -S31AFE007F7C41820324880A00008D2A0001980B00002C09000039A7 -S31AFE007F916B00014082FFEC480003083D20FE01880931D83D60D8 -S31AFE007FA600012C000000396B88B4394931D8418202EC880A00E7 -S31AFE007FBB008D2A0001980B00002C090000396B00014082FFECCB -S31AFE007FD0480002D0881D0000395D000168090053216900007D77 -S31AFE007FE52B491468000043216000007C0B01147C0B4B7939604F -S31AFE007FFA0000914100AC916100B03BE100AC418200287FE3FB3E -S31AFE00800F78388100B04BFFF35D812100AC880900002C00003B97 -S31AFE0080244082000C38090001900100AC7FE3FB78388100B44B69 -S31AFE008039FFF3392C0300004182000C806100B44800721D386001 -S31AFE00804E000348001EC93860000348001E59806100B02C0300CD -S31AFE008063004182004C3D2000008009367C2C0000004182001C52 -S31AFE0080788009367C7C0803A64E8000217C631B794082000890CB -S31AFE00808D6100B0800100B02C00000041820018380000099001BF -S31AFE0080A200B0386000094800033D48000238480015892C030055 -S31AFE0080B7004182001838000063981D00003D20000038000001EF -S31AFE0080CC900936A4881D000068090053216900007D2B491468C8 -S31AFE0080E1000073216000007C0B01147C0B4B794182002438602C -S31AFE0080F600004BFFF39D3D20000139291CE43D600000912B3648 -S31AFE00810BA0480071814800000C386000014BFFF37D386000033F -S31AFE00812048001DF93860000348001D893860FFFF480001B83D8B -S31AFE008135200000800936787C0803A64E800021386000014800DD -S31AFE00814A01A048001BB5480001883C800001387D0001388488DB -S31AFE00815FB438A0012C48000E11480001703C800001387D0001BB -S31AFE008174388488B438A0012C48000D8148000158381D00019098 -S31AFE0081890100B8386100B8388100BC4BFFF1DD2C030000418254 -S31AFE00819E007C812100B888090000392900012C00002C912100F4 -S31AFE0081B3B84082006488090000392900012C000043912100B808 -S31AFE0081C840820010806100BC480027354800000C806100BC4852 -S31AFE0081DD0027213D20FE018809318C3D6000012C000000396B29 -S31AFE0081F288B43949318C418200A8880A00008D2A0001980B00A1 -S31AFE008207002C090000396B00014082FFEC4800008C3D20FE01A7 -S31AFE00821C880931D03D6000012C000000396B88B4394931D04149 -S31AFE008231820070880A00008D2A0001980B00002C090000396B7C -S31AFE00824600014082FFEC48000054381D0001900100C038610095 -S31AFE00825BC0388100C44BFFF1112C030000408200443D20FE01F0 -S31AFE008270880931DC3D6000012C000000396B88B4394931DC41DD -S31AFE00828582001C880A00008D2A0001980B00002C090000396B7C -S31AFE00829A00014082FFEC38000000980B0000480000303C60FE30 -S31AFE0082AF013863318C4BFFEAF9806100C4480012414800001890 -S31AFE0082C43C8000017FA3EB78388488B438A0012C48001E753C4B -S31AFE0082D9600001386388B44BFFEACD38600000800100DC7C08DA -S31AFE0082EE03A683A100CC83C100D083E100D4382100D84E800093 -S31AFE008303209421FFE87C0802A693A1000C93C1001093E100144D -S31AFE0083189001001C3FA00001389D88B448001A1D387D88B44BF3 -S31AFE00832DFFEA818001001C7C0803A683A1000C83C1001083E11B -S31AFE0083420014382100184E8000209421FFF07C0802A693E1006B -S31AFE0083570C900100143D200000800936882C00000040800008C4 -S31AFE00836C4BFFFF993FE00001387F80B44BFFE86D387F80B44B36 -S31AFE008381FFF65D7C631B794182FFEC7C6318F854630FFE80013C -S31AFE00839600147C0803A683E1000C382100104E8000204E8000F8 -S31AFE0083AB209421FFF87C0802A69001000C4BFFEF8D48001849B5 -S31AFE0083C03860002B480010C58001000C7C0803A6382100084E5B -S31AFE0083D58000203D200000906936884E8000209421FFF87C08BD -S31AFE0083EA02A69001000C3D20FE01392931705460E73E7D490037 -S31AFE0083FFAE5463073E7D0918AE3D60000138000058386B88B462 -S31AFE008414980B88B4392000009943000199030002992300034B92 -S31AFE008429FFE9858001000C7C0803A6382100084E8000203D2067 -S31AFE00843E000138A00000392991043CC0000038E0FFFF3C800087 -S31AFE008453003D6000013D4000003D0000003800000190E639646C -S31AFE00846890AB90B4912A39689008369890A439604E800020946B -S31AFE00847D21FFF07C0802A693C1000893E1000C900100143D20CC -S31AFE0084920000800936987C7F1B782C0000007C9E237840820049 -S31AFE0084A7084BFFFF952C1F0012418100243D600000800B3968CA -S31AFE0084BC3D200001392991047C0900507C00F214280000804013 -S31AFE0084D181000C386000004800006C3CE00000800739647C1FDE -S31AFE0084E600004182004C3D000000800839607C1F0000418000B4 -S31AFE0084FB20395F00013D200001392990B4554B103A3800000089 -S31AFE0085107C09592E914839603D600000814B39683D2000013933 -S31AFE0085252990B457E0103A7D49012E93E739643D2000008069FD -S31AFE00853A39687C03F21490093968800100147C0803A683C100C2 -S31AFE00854F0883E1000C382100104E8000209421FFD87C0802A68C -S31AFE008564936100149381001893A1001C93C1002093E1002490DE -S31AFE00857901002C3D600000800B369C7C7D1B782C0000007C9EF0 -S31AFE00858E23787CBF2B7840820058380000013D200001392991B7 -S31AFE0085A384900B369C39400000380000087C0903A6390A0001A3 -S31AFE0085B8554BC00E5547103A2C0B00005560083C4080000C6CEE -S31AFE0085CD0004C168001DB77C0B03784200FFE87D0A4378280AF5 -S31AFE0085E200FF7C09392E4081FFC43D600000380000003D2000DF -S31AFE0085F7013B699184900B368C3F800000480000248921000877 -S31AFE00860C57E0463E7C004A785400103A7D7B002E57E9402E7D6D -S31AFE0086213F5A783BBD00012C1E00003BDEFFFF41820020386159 -S31AFE00863600087FA4EB7838A0000148001A45801C368C2C000093 -S31AFE00864B004182FFBC7FE3FB788001002C7C0803A683610014F1 -S31AFE0086608381001883A1001C83C1002083E10024382100284EEA -S31AFE0086758000209421FFD87C0802A693A1001C93C1002093E15C -S31AFE00868A00249001002C3D20000138000000980988B43BA98817 -S31AFE00869FB47C691B7890610008880900002C000043408200F4E7 -S31AFE0086B4880900012C000052408200E88BC900022C1E004340D0 -S31AFE0086C98200DC880900032C00003A408200D0380900043BE14D -S31AFE0086DE0008900100087FE3FB783881000C4BFFEC852C03005E -S31AFE0086F300418201388121000888090000392900012C00002C7C -S31AFE00870891210008408201207FE3FB78388100104BFFEC592C62 -S31AFE00871D0300004182010C8061000C8081001038A0FFFF4BFF52 -S31AFE008732FE2D3D20000083E9368C2C1F0000418200403D20FECF -S31AFE00874701880931D07FA3EB782C000000396931D04182001C53 -S31AFE00875C880B00008D2B0001980300002C09000038630001400C -S31AFE00877182FFEC3800000098030000480000B07C641B78387D8F -S31AFE008786000138A000204BFFEC6D3D2000019BC988B4386300A5 -S31AFE00879B017FFD19AE4800008C81210008880900007D2B4B7807 -S31AFE0087B02C00004C386900017C09037841820020418100102CB5 -S31AFE0087C50000434182003C4800004C2C0900504182001C480019 -S31AFE0087DA00403C800001388488B438A0012C4800095D48000096 -S31AFE0087EF403C800001388488B438A0012C48000A914800002C20 -S31AFE0088043C800001388488B438A00800480005FD480000183CE0 -S31AFE0088198000017D635B78388488B438A0012C48001911800122 -S31AFE00882E002C7C0803A683A1001C83C1002083E1002438210053 -S31AFE008843284E8000209421FFF87C0802A69001000C8803000006 -S31AFE0088582C000070408200183C800001388488B438A0012C488F -S31AFE00886D000709480000143C800001388488B438A0012C480084 -S31AFE00888218C18001000C7C0803A6382100084E8000203923019E -S31AFE0088971C7C0348404C800020800400003884000490030000E2 -S31AFE0088AC386300047C0348404180FFEC4E80002038000045985E -S31AFE0088C1030000392000309D230001380000329C0300013863AC -S31AFE0088D600014E8000203800004F980300003920004B9D230014 -S31AFE0088EB01386300014E8000209421FFE87C0802A693A1000CE1 -S31AFE00890093C1001093E100149001001C7C9E23797C7D1B783B48 -S31AFE008915E0000041820038887D00003BBD00014BFFE27937DEB6 -S31AFE00892AFFFF7FFF1B7857E920367C00002654001FFE7C000000 -S31AFE00893FD07D2900787FE000387C1F4B784082FFD07FE3FB78D6 -S31AFE0089548001001C7C0803A683A1000C83C1001083E10014380C -S31AFE0089692100184E8000209421FFE87C0802A69381000893A1B6 -S31AFE00897E000C93C1001093E100149001001C7C7D1B787C9C2374 -S31AFE00899378388000024BFFFF5D907C0000387D00028001001C93 -S31AFE0089A87C0803A68381000883A1000C83C1001083E100143849 -S31AFE0089BD2100184E8000209421FFE87C0802A69381000893A162 -S31AFE0089D2000C93C1001093E100149001001C7C7D1B787C9C2320 -S31AFE0089E778388000084BFFFF09907C0000387D00088001001C87 -S31AFE0089FC7C0803A68381000883A1000C83C1001083E1001438F5 -S31AFE008A112100184E8000203803FF9F280000054181001438030E -S31AFE008A26FFA990040000386000014E8000203803FFBF28000053 -S31AFE008A3B054181000C3803FFC94BFFFFE43863FFD05460063EBD -S31AFE008A50280000094081000C386000004E80002090640000385D -S31AFE008A656000014E8000209421FFE87C0802A693A1000C93C14D -S31AFE008A7A001093E100149001001C7C7D1B78887D00003BBD0015 -S31AFE008A8F014BFFFF897FA3EB788001001C7C0803A683A1000C7C -S31AFE008AA483C1001083E10014382100184E8000203D20FE0154DE -S31AFE008AB980E13E392932D07D6900AE5484073E7C0920AE9963A1 -S31AFE008ACE00009C030001386300014E8000209421FFE07C08024B -S31AFE008AE3A69381001093A1001493C1001893E1001C90010024B7 -S31AFE008AF87C7F1B787C9C23783BC000003BA10008480000188065 -S31AFE008B0D01000857DE20365400073E7FDE03783BFF0001887F08 -S31AFE008B2200007FA4EB784BFFFEF12C0300004082FFDC93DC0040 -S31AFE008B37007FE3FB78800100247C0803A68381001083A1001432 -S31AFE008B4C83C1001883E1001C382100204E8000209421FFE87CB5 -S31AFE008B610802A69381000893A1000C93C1001093E10014900172 -S31AFE008B76001C7C7F1B783B9F00107C1FE0407C9E237840800022 -S31AFE008B8B38887F00004BFFE00D8C1F00017C7D1B787C03037829 -S31AFE008BA04BFFDFFD57BD20363BFF00017FBD1B787C1FE0409BCC -S31AFE008BB5BE00003BDE00014180FFD07FE3FB788001001C7C0849 -S31AFE008BCA03A68381000883A1000C83C1001083E1001438210088 -S31AFE008BDF184E8000209421FFE87C0802A693A1000C93C100100B -S31AFE008BF493E100149001001C7C9D237857A4463E4BFFFEB157B0 -S31AFE008C09A4863E4BFFFEA957A4C63E4BFFFEA157A4063E4BFF88 -S31AFE008C1EFE998001001C7C0803A683A1000C83C1001083E100F4 -S31AFE008C3314382100184E8000209421FFE87C0802A693A1000CAD -S31AFE008C4893C1001093E100149001001C7C9E2378881E00003BE4 -S31AFE008C5DE000002C000000393E0001418200207FFDFB78880917 -S31AFE008C7200003BBD00012C000000392900014082FFF07FBFEB87 -S31AFE008C87782F9F00C97C0000265400EFFE7C0000D07C0900F819 -S31AFE008C9C7FE00038712900C87C1F4B7857E4063E7FFDFB784BAF -S31AFE008CB1FFFE052C1D00003BFFFFFF4081005C7FFDFB787FC4D8 -S31AFE008CC6F378896400007FAAEB78210B00007C085914696900C2 -S31AFE008CDB23210900007D2849147C004B783000FFFF7C00011037 -S31AFE008CF07C0900F87129002A7D6B00387D6B4B782C0A00009990 -S31AFE008D0563000038840001386300013BBDFFFF4181FFB48001AD -S31AFE008D1A001C7C0803A683A1000C83C1001083E10014382100A2 -S31AFE008D2F184E8000209421FFF07C0802A693C1000893E1000C79 -S31AFE008D44900100143BC300107C03F0407C9F237840800018889E -S31AFE008D599F00003BFF00014BFFFD557C03F0404180FFF08001AB -S31AFE008D6E00147C0803A683C1000883E1000C382100104E8000B8 -S31AFE008D8320392000047D2903A63800000098030000386300019C -S31AFE008D984200FFF87C80C670980300007C8986709D2300017C84 -S31AFE008DAD8046709C030001988300014E80002039630004386095 -S31AFE008DC20000394000037D405378892B00002C000000546040C0 -S31AFE008DD72E7C034B78396B0001394AFFFF4181FFE44E8000205A -S31AFE008DEC380000087C0903A688040000388400019803000038E4 -S31AFE008E016300014200FFF04E8000209421FFE87C0802A693C1B9 -S31AFE008E16001093E100149001001C3BC100087C9F23787FC3F30F -S31AFE008E2B7848001AED2C0300004182003038000051981F000005 -S31AFE008E40392000439D3F00017FC3F3784BFFFF717C641B783B8B -S31AFE008E55FF00017FE3FB784BFFFD894800000C7FE3FB784BFFEC -S31AFE008E6AFA557C7F1B7838000000981F00008001001C7C0803FF -S31AFE008E7FA683C1001083E10014382100184E8000209421FFC88D -S31AFE008E947C0802A693A1002C93C1003093E100349001003C3B05 -S31AFE008EA9A100207C641B787FA3EB784BFFFED17FA3EB783881A0 -S31AFE008EBE000848001B012C030000418200148001001038600000 -S31AFE008ED3012C00000040820008386000008001003C7C0803A60D -S31AFE008EE883A1002C83C1003083E10034382100384E8000209402 -S31AFE008EFD21FFE07C0802A693A1001493C1001893E1001C90015B -S31AFE008F1200247C7D1B787C9F2378388100084BFFFBBD7C1D186C -S31AFE008F270041820020806100084BFFFF612C03000041820010B9 -S31AFE008F3C7FE3FB784BFFF99D4800000C7FE3FB784BFFF9713852 -S31AFE008F5100000098030000800100247C0803A683A1001483C11E -S31AFE008F66001883E1001C382100204E8000209421FFD87C0802E1 -S31AFE008F7BA693A1001C93C1002093E100249001002C8923000072 -S31AFE008F903800FFFF2C0900677C9F2378900100083863000141CA -S31AFE008FA582008C418100102C09006341820024480000C02C0917 -S31AFE008FBA0070408200B8388100084BFFFAA9388100104BFFFBF8 -S31AFE008FCF91480000B0880300002C00002D4082002088030001AE -S31AFE008FE42C000031408200143D20000038000000900939904802 -S31AFE008FF90000103C800000388439904BFFFAD93D2000008069AB -S31AFE00900E39902C030000418200104BFFFE792C030000418200CB -S31AFE009023547FE3FB784BFFF8B5480000503FA00000389D398C03 -S31AFE0090384BFFFAA5809D398C386100104BFFFD41801D398C2C95 -S31AFE00904D00FFFF4182000C2C0000004082001038000002900174 -S31AFE00906200084800001C3800000190010008480000107FE3FB02 -S31AFE009077784BFFF8457C7F1B78800100082C00000041820028B3 -S31AFE00908C418100102C00FFFF4182008C4800007C2C000001414E -S31AFE0090A18200242C00000241820060480000683D20000139294F -S31AFE0090B61CE43D600000912B36A0480000603FA000013C80002E -S31AFE0090CB0138841CE4387D1E004BFFF7C1386100103880004752 -S31AFE0090E038BD1E00480019352C03000041820028381D1E003D04 -S31AFE0090F52000007FE3FB78900936A04BFFF7DD480000187FE31E -S31AFE00910AFB784BFFF7D14800000C7FE3FB784BFFF7A57C7F1BA2 -S31AFE00911F7838000000981F00008001002C7C0803A683A1001CB6 -S31AFE00913483C1002083E10024382100284E8000209421FFD07CC7 -S31AFE0091490802A693210014934100189361001C9381002093A131 -S31AFE00915E002493C1002893E1002C900100347C9F23787CBD2BD9 -S31AFE00917378388100084BFFF8F53881000C3F8000004BFFF7EDC1 -S31AFE009188389C397C4BFFF9D1380000513BBDFFE67F3FEA149877 -S31AFE00919D1F00003920004D9D3F00013BFF00017FFAFB787F432E -S31AFE0091B2D378388000004BFFF8FD7C7F1B787FFEFB78380000AC -S31AFE0091C730389C397C981E0000387E00014BFFFB617C7F1B7835 -S31AFE0091DC3B8000003F600000480000247FE3FB78389D39844B02 -S31AFE0091F1FFFB457C7F1B78389D39843B9C0001387B397C4BFF7C -S31AFE009206FBE97C1FC840408000408001000C7C1C0000408000E3 -S31AFE00921B34806100083C8000003FA000003884397C38BD39845F -S31AFE009230480017352C03000038000000900100084082FFA838F0 -S31AFE009245000031981E00007F43D3785784063E4BFFF861380022 -S31AFE00925A0000981F0000800100347C0803A683210014834100E6 -S31AFE00926F188361001C8381002083A1002483C1002883E1002C66 -S31AFE009284382100304E8000209421FFC07C0802A693A1003493BF -S31AFE009299C1003893E1003C90010044380000007C9F23789001BF -S31AFE0092AE001C900100109001001490010018388100204BFFF782 -S31AFE0092C3053BA100287FA4EB784BFFF8917FA3EB7838810008EA -S31AFE0092D8480016E92C030000418200E438000071981F000039C7 -S31AFE0092ED2000709D3F000180810020387F00014BFFF8E938813E -S31AFE00930200084BFFFA31800100207C7F1B787009000241820068 -S31AFE00931720388000024BFFF8C9388000024BFFF79188810013B0 -S31AFE00932C4BFFF7897C7F1B788001002070090004418200288047 -S31AFE0093410100142C0000004182001C7FE3FB78388000044BFF18 -S31AFE009356F891808100144BFFF8E17C7F1B788001002070090095 -S31AFE00936B0841820028800100182C0000004182001C7FE3FB787D -S31AFE009380388000084BFFF861808100184BFFF8B17C7F1B788057 -S31AFE00939501002070090010418200348001001C2C000000418292 -S31AFE0093AA00287FE3FB78388000104BFFF8318081001C4BFFF813 -S31AFE0093BF814800000C7FE3FB784BFFF4F57C7F1B7838000000F2 -S31AFE0093D4981F0000800100447C0803A683A1003483C100388380 -S31AFE0093E9E1003C382100404E8000209421FFD87C0802A693611B -S31AFE0093FE00149381001893A1001C93C1002093E1002490010029 -S31AFE0094132C3B8100087C7D1B787C9B23787CA42B787F83E378F2 -S31AFE0094284BFFF95D7F83E3787FA4EB787F65DB784800163D8056 -S31AFE00943D01002C7C0803A6836100148381001883A1001C83C124 -S31AFE009452002083E10024382100284E8000203D2000008169366D -S31AFE009467A05463103A7C63582E4E8000203D200000816936A0DB -S31AFE00947C5463103A7C83592E4E8000209421FFF87C0802A690FA -S31AFE00949101000C3D20000039293200816900185464063E806BDB -S31AFE0094A60000800B000C7C0803A64E8000218001000C7C0803E6 -S31AFE0094BBA6382100084E8000209421FFF87C0802A69001000C2E -S31AFE0094D03D2000003929320081690018806B0000800B00107C8E -S31AFE0094E50803A64E8000218001000C7C0803A6382100084E80E5 -S31AFE0094FA00209421FFF87C0802A69001000C3D200000392932D3 -S31AFE00950F00816900187C651B78806B0000800B0014388000008B -S31AFE0095247C0803A64E8000218001000C7C0803A6382100084EA9 -S31AFE0095398000209421FFE87C0802A693A1000C93C1001093E199 -S31AFE00954E00149001001C3FC00000817E39943D2000002C0B00E4 -S31AFE00956300380000003BBE3994900936A47C7F1B784182001815 -S31AFE0095787D635B7848000055801E39942C0000004082002C8184 -S31AFE00958D3F00003C007D82913D000460001008901F000093FEC1 -S31AFE0095A239943860000348000971386000034800090180010018 -S31AFE0095B71C7C0803A683A1000C83C1001083E1001438210018E5 -S31AFE0095CC4E8000209421FFF87C0802A69001000C3D2000008145 -S31AFE0095E16936A42C0B0000408200183D200000800939943949E8 -S31AFE0095F639947C0300004182000C3860000048000024800A00B3 -S31AFE00960B04916939949003000038600003480009013860000360 -S31AFE00962048000891386000018001000C7C0803A6382100084E4E -S31AFE0096358000203D200000800939943120FFFF7C6901104E80B6 -S31AFE00964A00209421FFF87C0802A69001000C2C03000041820080 -S31AFE00965F483D400000812A36A83929FFFF2C090000912A36A876 -S31AFE009674418100683D20000039293200816900183800000090F8 -S31AFE0096890A36A8806B0000800B0014388000057C0803A64E809E -S31AFE00969E00214800003C3D600000812B36A8392900012C09004F -S31AFE0096B301912B36A8408200243D20000039293200816900182A -S31AFE0096C838800004806B0000800B00147C0803A64E80002180A7 -S31AFE0096DD01000C7C0803A6382100084E8000209421FFF87C08BB -S31AFE0096F202A69001000C3D2000003929320081690018806B003C -S31AFE00970700800B00107C0803A64E8000218001000C7C0803A6D8 -S31AFE00971C382100084E8000209421FFC87C0802A692C100109248 -S31AFE009731E10014930100189321001C934100209361002493818E -S31AFE009746002893A1002C93C1003093E100349001003C2C040059 -S31AFE00975B0D418201B43D600000814B36AC3D200001392995844C -S31AFE0097707C8951AE2C04000A394A0001914B36AC3F40000041A0 -S31AFE00978582000C2C0A0064408201843D2000003929320083C91F -S31AFE00979A00187EE000A67EE0BB7839600000516004207C00011E -S31AFE0097AF243D20FE013AC932E4807E0000813E000C3880002463 -S31AFE0097C47D2803A63B6000003BE0004F4E800021807E000081CB -S31AFE0097D93E000C3880004F7D2803A64E800021801A36AC7C1BD6 -S31AFE0097EE0000408000703D2000013D60FE013B0995843B2B3243 -S31AFE009803E47D38D8AE807E00005520E13E7F9900AE817E000CCA -S31AFE0098187F84E3787D6803A65529073E7FB948AE3B7B00014E55 -S31AFE00982D800021807E0000813E000C7FA4EB787D2803A64E8016 -S31AFE0098420021801A36AC7F9FE214579F063E7C1B00007FBFEA63 -S31AFE0098571457BF063E4180FFA8807E0000813E000C388000237E -S31AFE00986C7D2803A64E800021807E0000813E000C57E0E13E7C0B -S31AFE0098819600AE7D2803A64E800021807E0000813E000C57E04D -S31AFE009896073E7C9600AE7D2803A64E800021807E0000813E00BA -S31AFE0098AB107D2803A64E8000215460063E2C00002B9861000807 -S31AFE0098C0418200383861000838800001480016552C0300004018 -S31AFE0098D5820014880100082C00002D4082FFC44BFFFED43D20FC -S31AFE0098EA00003929320038000001900900443D600000392000C5 -S31AFE0098FF00912B36AC7C0000A652E004207C0001248001003CDC -S31AFE0099147C0803A682C1001082E10014830100188321001C8364 -S31AFE009929410020836100248381002883A1002C83C1003083E168 -S31AFE00993E0034382100384E8000209421FFE87C0802A693A10061 -S31AFE0099530C93C1001093E100149001001C7CBF2B787FE0FB78A6 -S31AFE0099682C0000007C7D1B787C9E23783BFFFFFF4182002488D2 -S31AFE00997D9E00007FA3EB784BFFFDA17FE0FB782C0000003BDEAF -S31AFE00999200013BFFFFFF4082FFE48001001C7C0803A683A100F0 -S31AFE0099A70C83C1001083E10014382100184E8000209421FFE8D4 -S31AFE0099BC7C0802A693A1000C93C1001093E100149001001C7C11 -S31AFE0099D1BF2B787FE0FB782C0000007C7D1B787C9E23783BFFA2 -S31AFE0099E6FFFF418200247FA3EB784BFFFCFD7FE0FB782C0000BD -S31AFE0099FB00987E00003BDE00013BFFFFFF4082FFE48001001CA9 -S31AFE009A107C0803A683A1000C83C1001083E10014382100184E55 -S31AFE009A258000209421FF909081000C90A1001090C1001490E110 -S31AFE009A3A00189101001C91210020914100243860000038210094 -S31AFE009A4F704E8000209421FFF87C0802A69001000C3860000093 -S31AFE009A644BFFFBE93D600001380000207C0903A63D20000081B9 -S31AFE009A794939A0396B1CE43D000000392000007C09502E7C09F0 -S31AFE009A8E592E392900044200FFF47D6A5B783D20000081693963 -S31AFE009AA3A0800B0094900A0100812B0090912A0104800B008049 -S31AFE009AB8900A0108812B0088912A010C800B008C900A011081B3 -S31AFE009ACD2B0084912A01143D4000003D600000800B36A43D2025 -S31AFE009AE200012C00000039291CE4912A36A04182001838000038 -S31AFE009AF700900836A4386000404BFFF9614BFFFACD386000407F -S31AFE009B0C4BFFF9554BFFFAC13D200000906939A48001000C7C67 -S31AFE009B210803A6382100084E8000209421FFF87C0802A69001C2 -S31AFE009B36000C380000207C0903A63D200000814939A03D6000E7 -S31AFE009B4B01396B1CE4392000007C09582E7C09512E392900048E -S31AFE009B604200FFF47D6A5B783D200000816939A0800A010090C2 -S31AFE009B750B0094812A0104912B0090800A0108900B0080812AE3 -S31AFE009B8A010C912B0088800A0110900B008C812A0114912B0033 -S31AFE009B9F84386000014BFFFAA98001000C7C0803A63821000888 -S31AFE009BB44E800020386000004E8000203D20FE0139299BB83DD6 -S31AFE009BC9400000912A367C3D60FE01396B9D003D2000009169A2 -S31AFE009BDE36783D40FE013D600000394A9A54914B36843D20FE45 -S31AFE009BF30139299B2C3D600000912B36804E8000209421FFF08E -S31AFE009C087C0802A693C1000893E1000C900100143D20000080B9 -S31AFE009C1D0936B02C000000408200C438000001900936B048008D -S31AFE009C3257513D2000003BC93200813E00343860FFFF7D2803AD -S31AFE009C47A64E800021813E00347C7F1B783860FFFD7D2803A60C -S31AFE009C5C4E800021815E00143D20FE0139299948912A00043D72 -S31AFE009C7160FE016FE0FFFF396B99B86800FFFE3D20FE01916A7D -S31AFE009C860008392997243100FFFF7CE80110912A000C3D60FE9A -S31AFE009C9B01301FFFFF7D00F910396B96EC3D20FE017CE0403985 -S31AFE009CB0916A001039299A28912A001441820014813E00347F54 -S31AFE009CC5E3FB787D2803A64E800021801E0030386000007C0809 -S31AFE009CDA03A64E800021386000044BFFCE01800100147C080308 -S31AFE009CEFA683C1000883E1000C382100104E8000209421FFF8F7 -S31AFE009D047C0802A69001000C3D20000039293200800900402C97 -S31AFE009D190000004182000C7C0803A64E8000218001000C7C0835 -S31AFE009D2E03A6382100084E8000207FE000084E8000209421FF1B -S31AFE009D43D87C0802A6936100149381001893A1001C93C100200B -S31AFE009D5893E100249001002C7C9D23787C7C1B7838000054983A -S31AFE009D6D1D00007F8326704BFFCDD99C7D00017F83E3784BFF77 -S31AFE009D82CDCD7FBFEB789C7F0001380000749C1F0001392000B0 -S31AFE009D97689D3F0001380000729C1F0001392000659D3F00016D -S31AFE009DAC380000619C1F0001392000643BA0003A9D3F00019FFB -S31AFE009DC1BF000148000D0D906100083BFF00017FE4FB783861C4 -S31AFE009DD6000838A0000438C000004BFFD2257C7F1B783B80000E -S31AFE009DEB3B9B9F0000386000044BFFCD599C7F000138600040EA -S31AFE009E004BFFCD4D9C7F00019FBF0001386000404BFFF6513BC6 -S31AFE009E1561000C9061000C3BFF00017FE4FB787F63DB7838A0AC -S31AFE009E2A000438C000004BFFD1D57C7F1B789B9F0000386000D3 -S31AFE009E3F004BFFCD0D9C7F0001386000014BFFCD019C7F0001FD -S31AFE009E549FBF0001386000014BFFF6059061000C3BFF00017F01 -S31AFE009E69E4FB787F63DB7838A0000438C000004BFFD18D7C7FDD -S31AFE009E7E1B7838000000981F00019B9F00008001002C7C0803DA -S31AFE009E93A6836100148381001883A1001C83C1002083E10024D0 -S31AFE009EA8382100284E8000202C030001418200202803000141B2 -S31AFE009EBD8000502C030002418200242C03000341820030480037 -S31AFE009ED2003C3C0002004C00012C7C108BA64C00012C48000006 -S31AFE009EE7283C0004004C00012C7C108BA64C00012C48000014EF -S31AFE009EFC3C000C004C00012C7C108BA64C00012C7C708AA654E6 -S31AFE009F11630FFE4E8000202C03000141820020280300014180D9 -S31AFE009F2600682C030002418200202C0300034182002848000041 -S31AFE009F3B543C0002007C0004AC7C188BA6480000443D6004005D -S31AFE009F507C0004AC7D788BA648000034380000807C0903A6390B -S31AFE009F65200000612010003D600E007C0004AC7D398BA67D787F -S31AFE009F7A8BA67C198BA67D788BA6392900104200FFE07C788AA0 -S31AFE009F8FA654630FFE4E8000203D60000038000001900B368C2E -S31AFE009FA43D2000008009399C3D60FE012C000000396BA0743D2C -S31AFE009FB9200000916936B4418200A83D400000800A399C28001C -S31AFE009FCE00034081003070800003408200287060000340820014 -S31AFE009FE320800300003863000490040000812A399C388400044F -S31AFE009FF83929FFFC4800005C3D600000800B399C2800000140E9 -S31AFE00A00D810034708000014082002C7060000140820024A0034C -S31AFE00A022000038630002B0040000812B399C388400023929FF34 -S31AFE00A037FE912B399C4800002088030000386300019804000056 -S31AFE00A04C812A399C388400013929FFFF912A399C800A399C2C43 -S31AFE00A0610000004082FF643D200000380000009009368C3D2074 -S31AFE00A076000038000000900936B44E8000209421FFE87C080206 -S31AFE00A08BA69381000893A1000C93C1001093E100149001001C21 -S31AFE00A0A07C601B787CBC2B787C8323783FA000007C0403789356 -S31AFE00A0B59D399C4BFFFEE1807D399C7C63E0508001001C7C08F5 -S31AFE00A0CA03A68381000883A1000C83C1001083E1001438210073 -S31AFE00A0DF184E8000209421FFE87C0802A69381000893A1000C3E -S31AFE00A0F493C1001093E100149001001C7CBC2B783FA00000936D -S31AFE00A1099D399C4BFFFE8D807D399C7C63E0508001001C7C08F4 -S31AFE00A11E03A68381000883A1000C83C1001083E100143821001E -S31AFE00A133184E800020386000004E800020386000004E80002001 -S31AFE00A148386000004E8000209421FFF07C0802A693C1000893B9 -S31AFE00A15DE1000C900100143D200000800939AC2C00000041829D -S31AFE00A17200603FE000003BC000007D4000A67D40537839200016 -S31AFE00A18700512004207C000124817F39AC800B0014808B0018E2 -S31AFE00A19C901F39AC93CB00187C0000A6514004207C00012481A7 -S31AFE00A1B12B000C80AB0010806B00007D2803A64E800021801F5C -S31AFE00A1C639AC2C0000004082FFB0800100147C0803A683C100F8 -S31AFE00A1DB0883E1000C382100104E8000209421FFF87C0802A6C4 -S31AFE00A1F09001000C4BFFFF5D8001000C7C0803A6382100084EAA -S31AFE00A20580002090690000380000009089000490A90010900970 -S31AFE00A21A00189128000090C9000890E9000C900900144E8000F9 -S31AFE00A22F20812300002C090000418200F8810300043809FFFF9B -S31AFE00A24428000039418100E83D60FE01396B32F85400103A7D71 -S31AFE00A2594B002E3D20FE01392932F87D4A4A147D4903A64E8029 -S31AFE00A26E04203D20FF0061290200A16900007C0006AC556B06CD -S31AFE00A2833E38000000600080007C0046307D600378540B043E81 -S31AFE00A298B16900007C0006AC480000903D20FF0061290240A1C4 -S31AFE00A2AD6900007C0006AC556B063E38000000600080007C0069 -S31AFE00A2C246307D600378540B043EB16900007C0006AC48000084 -S31AFE00A2D75C3D20FF0061290220A16900007C0006AC556B063ECE -S31AFE00A2EC38000000600080007C0046307D600378540B043EB1A5 -S31AFE00A3016900007C0006AC480000283D20FF0061290940800984 -S31AFE00A31600007C0006AC540004DE550B68247C005B78900900F6 -S31AFE00A32B007C0006AC800300003D200000394933585408103A58 -S31AFE00A3407C0A402E3D20FE0039295DFC7C004800418200187CDF -S31AFE00A3550A402E3D20FE013929AF987C0048004C82002080033D -S31AFE00A36A00083D6000007C0A412E81430010396B34443D2000F3 -S31AFE00A37F007D4B412E392935307C69412E4E8000207C631B7912 -S31AFE00A3944D8200203803FFFF280000397C0803784D8100203DFD -S31AFE00A3A960FE01396B33E05500103A7D4B002E3D20FE01392932 -S31AFE00A3BE33E07D4A4A147D4903A64E8004203D20FF0061290007 -S31AFE00A3D314816900007C0006AC3C0080007C0044307D6B007839 -S31AFE00A3E8916900007C0006AC4E8000203D20FF0061290200A0BE -S31AFE00A3FD0900007C0006AC7000FFF75400043EB00900007C00DF -S31AFE00A41206AC4E8000203D20FF0061290200A00900007C00067E -S31AFE00A427AC7000FFFB5400043EB00900007C0006AC4E8000209B -S31AFE00A43C3D20FF0061290240A00900007C0006AC7000FFFB544A -S31AFE00A45100043EB00900007C0006AC4E8000203D20FF006129F5 -S31AFE00A4660220A00900007C0006AC7000FFF75400043EB009002F -S31AFE00A47B007C0006AC4E8000203D20FF0061290220A0090000FB -S31AFE00A4907C0006AC7000FFFB5400043EB00900007C0006AC4E50 -S31AFE00A4A58000203D20FF0061290940800900007C0006AC5400C4 -S31AFE00A4BA066E900900007C0006AC4E8000203D20FF0061290971 -S31AFE00A4CF48816900007C0006AC3943FFE53C0080007C005430F8 -S31AFE00A4E47D6B0078916900007C0006AC4E8000207C631B794D29 -S31AFE00A4F98200203803FFFF280000397C0803784D8100203D6084 -S31AFE00A50EFE01396B34C85500103A7D4B002E3D20FE013929340E -S31AFE00A523C87D4A4A147D4903A64E8004203D20FF0061290014D7 -S31AFE00A538816900007C0006AC3C0080007C0044307D6B03789152 -S31AFE00A54D6900007C0006AC4E8000203D20FF0061290200A009DF -S31AFE00A56200007C0006AC60000008B00900007C0006AC4E800095 -S31AFE00A577203D20FF0061290200A00900007C0006AC6000000488 -S31AFE00A58CB00900007C0006AC4E8000203D20FF0061290240A019 -S31AFE00A5A10900007C0006AC60000004B00900007C0006AC4E8051 -S31AFE00A5B600203D20FF0061290220A00900007C0006AC6000002D -S31AFE00A5CB08B00900007C0006AC4E8000203D20FF006129022092 -S31AFE00A5E0A00900007C0006AC60000004B00900007C0006AC4EF2 -S31AFE00A5F58000203D20FF0061290940800900007C0006AC600067 -S31AFE00A60A0080900900007C0006AC4E8000203D20FF0061290913 -S31AFE00A61F48816900007C0006AC3943FFE53C0080007C005430A6 -S31AFE00A6347D6B0378916900007C0006AC4E8000207C631B794DD4 -S31AFE00A6498200203803FFFF280000397C0803784D8100203D6032 -S31AFE00A65EFE01396B35B05500103A7D4B002E3D20FE01392935D3 -S31AFE00A673B07D4A4A147D4903A64E8004203D20FF0061290010A2 -S31AFE00A688816900007C0006AC3C0080007C0044307D6B03789101 -S31AFE00A69D6900007C0006AC4E8000203D20FF0061290200A0098E -S31AFE00A6B200007C0006AC60000080B00900007C0006AC4E8000CC -S31AFE00A6C7203D20FF0061290200A00900007C0006AC60000040FB -S31AFE00A6DCB00900007C0006AC4E8000203D20FF0061290240A0C8 -S31AFE00A6F10900007C0006AC60000080B00900007C0006AC4E8084 -S31AFE00A70600203D20FF0061290220A00900007C0006AC600000DB -S31AFE00A71B80B00900007C0006AC4E8000203D20FF0061290220C8 -S31AFE00A730A00900007C0006AC60000040B00900007C0006AC4E64 -S31AFE00A7458000203D20FF006129094C816900007C0006AC39438C -S31AFE00A75AFFE53C0080007C0054307D6B0378916900007C000667 -S31AFE00A76FAC4E8000207C8723787C631B794D8200203803FFFFFE -S31AFE00A784280000397C0803784D8100203D60FE01396B3698550B -S31AFE00A79900103A7D4B002E3D20FE01392936987D4A4A147D49F0 -S31AFE00A7AE03A64E8004203C0080007C0044303D60FF00616B00E3 -S31AFE00A7C318808B00007C0006AC7C8400787CEAFE707D493A7868 -S31AFE00A7D87D2950507D29FE707C8003787C0048787C8948387D59 -S31AFE00A7ED240378908B00007C0006AC4E8000207C8823787C63FF -S31AFE00A8021B794D8200203803FFFF280000394D8100203D60FE97 -S31AFE00A81701396B37805400103A7D4B002E3D20FE0139293780C3 -S31AFE00A82C7D4A4A147D4903A64E8004203D20FF0061290200A005 -S31AFE00A8418900007C0006AC5484063E38000000600080007C0097 -S31AFE00A85646307C8003785404043EB08900007C0006AC4E80002D -S31AFE00A86B203D20FF0061290240A08900007C0006AC5484063E19 -S31AFE00A88038000000600080007C0046307C8003785404043EB0F4 -S31AFE00A8958900007C0006AC4E8000203D20FF0061290220A089D4 -S31AFE00A8AA00007C0006AC5484063E38000000600080007C004671 -S31AFE00A8BF307C8003785404043EB08900007C0006AC4E800020EA -S31AFE00A8D43D20FF0061290940800900007C0006AC540004DE55FA -S31AFE00A8E90B68247C005B78900900007C0006AC4E800020386023 -S31AFE00A8FE00014E800020386000014E8000203D2000009069393C -S31AFE00A913B44E8000209421FFF87C0802A69001000C3D200000B7 -S31AFE00A9283D600001814939B4906B95E8814A0000388B95E82C12 -S31AFE00A93D0A00003860000041820010386000027D4803A64E80B6 -S31AFE00A95200218001000C7C0803A6382100084E8000209421FF0E -S31AFE00A967F87C0802A69001000C3D2000013D600000814B39B462 -S31AFE00A97C906995E8390995E89088000490A80008814A00002C3A -S31AFE00A9910A00004082000C38600000480000147D04437838600D -S31AFE00A9A600037D4803A64E8000218001000C7C0803A638210025 -S31AFE00A9BB084E8000209421FFF87C0802A69001000C3D200001BA -S31AFE00A9D03D600000814B39B4906995E8390995E8908800048146 -S31AFE00A9E54A00002C0A00004082000C38600000480000147D0496 -S31AFE00A9FA4378386000047D4803A64E8000218001000C7C08037C -S31AFE00AA0FA6382100084E8000209421FFF87C0802A69001000CC4 -S31AFE00AA243D2000013D600000814B39B4906995E8390995E890A0 -S31AFE00AA3988000490A80008814A00002C0A00004082000C3860D1 -S31AFE00AA4E0000480000147D044378386000057D4803A64E80007E -S31AFE00AA63218001000C7C0803A6382100084E8000209421FFF804 -S31AFE00AA787C0802A69001000C3D2000013D600000814B39B490B8 -S31AFE00AA8D6995E8390995E89088000490A80008814A00002C0AAE -S31AFE00AAA200004082000C38600000480000147D04437838600005 -S31AFE00AAB7077D4803A64E8000218001000C7C0803A63821000807 -S31AFE00AACC4E8000209421FFE87C0802A693E100149001001C3B4B -S31AFE00AAE1E100087FE3FB784BFFFE312C0300004082000C386090 -S31AFE00AAF6000048000008A07F00068001001C7C0803A683E100A4 -S31AFE00AB0B14382100184E8000209421FFF87C0802A69001000C49 -S31AFE00AB204BFFB3C18001000C7C0803A6382100084E8000203C19 -S31AFE00AB3500FE00600001007C0903A64E8004209421FFF87C0858 -S31AFE00AB4A02A69001000C4BFFFFE5386000008001000C7C0803D3 -S31AFE00AB5FA6382100084E800020386000004E8000209421FFE8C6 -S31AFE00AB747C0802A693A1000C93C1001093E100149001001C7C47 -S31AFE00AB897F1B78386000003BA00001380000002C1FFFFE4182EA -S31AFE00AB9E0040418100102C1FFFFD4182004C480000502C1FFF54 -S31AFE00ABB3FF408200483D200000812936B82C0900003BA9FFFF74 -S31AFE00ABC84181003C7D3D4B78408200343BA0FFFD4800002C3D7B -S31AFE00ABDD200000392932003D6000009069001893EB36B8480049 -S31AFE00ABF200143BE00000480000083BFF0001380000012C00002B -S31AFE00AC0700418200803D2000003BC93200813E00182C09000052 -S31AFE00AC1C418200188069000080090014388000047C0803A64E87 -S31AFE00AC318000213D200001392995F457E028347C004A143D2056 -S31AFE00AC4600002C030000901E001893E936B8813E0018418200FC -S31AFE00AC5B1C8069000080090014388000057C0803A64E80002165 -S31AFE00AC70480000188069000080090014388000047C0803A64EAE -S31AFE00AC858000217FA3EB788001001C7C0803A683A1000C83C152 -S31AFE00AC9A001083E10014382100184E8000203940000138000008 -S31AFE00ACAF002C03FFFE41820040418100102C03FFFD4182004C51 -S31AFE00ACC4480000502C03FFFF408200483D200000812936BC2C83 -S31AFE00ACD90900003949FFFF4181003C7D2A4B7840820034394002 -S31AFE00ACEEFFFD4800002C3D200000392932003D600000900900B6 -S31AFE00AD0314906B36BC4800001438600000480000083863000156 -S31AFE00AD18380000012C000000418200283D200001392995F45435 -S31AFE00AD2D6028343D6000007C004A14396B32003D200000900B0C -S31AFE00AD420014906936BC7D4353784E8000204E8000204E8000C4 -S31AFE00AD57204E8000209421FFE87C0802A693E100149001001CD8 -S31AFE00AD6C3D200000392932008169001838000000900100088189 -S31AFE00AD812B0000800B00187C651B787C8623787D234B783881BE -S31AFE00AD9600087C0803A64E800021800100087C7F1B782C00003D -S31AFE00ADAB00418200103D200000806939B8480001997FE3FB78CE -S31AFE00ADC08001001C7C0803A683E10014382100184E8000209445 -S31AFE00ADD521FFE87C0802A693A1000C93C1001093E10014900174 -S31AFE00ADEA001C380000407C0903A63D2000003D60FE0139293201 -S31AFE00ADFF00396BAB68394000007D69512E394A00044200FFF8E6 -S31AFE00AE143D2000013D60FE01392995F4396BAB683900000055FB -S31AFE00AE290A283438080001390000087D0903A67D69512E394A11 -S31AFE00AE3E00044200FFF87C0803782C0800024081FFDC3FA0000E -S31AFE00AE530038000013901D32003D6000003BBD3200396B3358C6 -S31AFE00AE68917D00043D200000392930003D60FE01913D00083925 -S31AFE00AE7D6BAB34917D00403D20FE013929AB443D60FE01913D0D -S31AFE00AE920010396BAB14917D00483D20FE013929AB703D60FE6A -S31AFE00AEA701913D0030396BACA83D40FE01917D0034394AAD505D -S31AFE00AEBC3D20FE01915D00203929AD54913D001C3860FFFE4BE6 -S31AFE00AED1FFFCA13860FFFE4BFFFDD138000000901D0024901D69 -S31AFE00AEE60028901D004C901D0044387D003C4BFFFA193D20FE98 -S31AFE00AEFB013929953C913D008C8001001C7C0803A683A1000CB6 -S31AFE00AF1083C1001083E10014382100184E8000207C8423794120 -S31AFE00AF258200243884FFFF7C0320AE2C0000034082000C3860D1 -S31AFE00AF3A00014E8000202C0400004082FFE4386000004E8000D4 -S31AFE00AF4F209421FFF87C0802A69001000C7C631B793D20FE0185 -S31AFE00AF643809AF8841820008800300943D200000392932008108 -S31AFE00AF7929008C7C0303787D2803A64E8000218001000C7C08C2 -S31AFE00AF8E03A6382100084E8000209421FFF07C0802A693C1008E -S31AFE00AFA30893E1000C900100143D200000800932007C7F1B78C2 -S31AFE00AFB82C000014396932007C9E23783860FFFF4082001C81C2 -S31AFE00AFCD2B00183880000680690000800900147C0803A64E80E9 -S31AFE00AFE200217C1F18004082001C7FE3FB787FC4F3784BFFFDDA -S31AFE00AFF7697C601B797C030378408200287FE3FB787FC4F37801 -S31AFE00B00C4BFFADED7C601B787C09FE707D2302787C6348507CD8 -S31AFE00B02163FE707C031838800100147C0803A683C1000883E104 -S31AFE00B036000C382100104E800020280500037C691B7840810035 -S31AFE00B04B107C801B78700B0003418200302C05000038A5FFFFD0 -S31AFE00B0604D820020880400002C05000098090000388400013994 -S31AFE00B07529000138A5FFFF4082FFE84E8000202805000F7C6B03 -S31AFE00B08A1B78408100388004000038A5FFF0900B00008524008D -S31AFE00B09F042805000F952B000484040004940B000485240004B8 -S31AFE00B0B4952B000438840004396B00044181FFD0280500034056 -S31AFE00B0C98100208004000038A5FFFC28050003900B00003884EA -S31AFE00B0DE0004396B00044181FFE82C0500007D695B7838A5FF3E -S31AFE00B0F3FF4D820020880400002C05000098090000388400013B -S31AFE00B1083929000138A5FFFF4082FFE84E800020280500037CAD -S31AFE00B11D691B784081000C70600003418200282C05000038A584 -S31AFE00B132FFFF4D8200202C050000988900003929000138A5FF86 -S31AFE00B147FF4082FFF04E8000205484063E5480402E7C002378DC -S31AFE00B15C5409801E7C004B787C6B1B782805000F408100249075 -S31AFE00B1710B0000940B000438A5FFF0940B00042805000F940BCD -S31AFE00B1860004396B00044181FFE4280500034081001838A5FF7A -S31AFE00B19BFC28050003900B0000396B00044181FFF02C0500004A -S31AFE00B1B07D695B784D8200207CA903A69889000039290001424A -S31AFE00B1C500FFF84E8000209421FFA87C631B79394100087D4777 -S31AFE00B1DA537839000000408200143800003098010008394100FF -S31AFE00B1EF09480000247C032B967D2029D67D2918507D6648AE0F -S31AFE00B2047C030379996A0000394A00014082FFE47C0A3800410B -S31AFE00B2198200287D0343787CE93B788C0AFFFF386300017C0A69 -S31AFE00B22E480098040000388400014082FFEC7C681B783800000A -S31AFE00B24300980400007D034378382100584E8000209421FF9830 -S31AFE00B2587C0802A67D8000269241003092610034928100389287 -S31AFE00B26DA1003C92C1004092E10044930100489321004C9341F1 -S31AFE00B2820050936100549381005893A1005C93C1006093E100F7 -S31AFE00B297649001006C9181002C7C9923788BB900003AE10008E8 -S31AFE00B2AC2C1D00007EF2BB787C7B1B787CB82B783BC000003A07 -S31AFE00B2C1A000003B390001418204802C1D00254082043C8BB964 -S31AFE00B2D600003B3900012C1D002D3AC000003BE000004082009D -S31AFE00B2EB108BB900003B3900013AC000012C1D00304082001437 -S31AFE00B3008BB900003B8000013B390001480000083B800000387C -S31AFE00B3151DFFD0280000094181003C7FA3EB787F24CB787FE931 -S31AFE00B32AFB781D29000A3929FFD07D291A14886400003884009A -S31AFE00B33F013803FFD0280000094081FFE47D3F4B787C992378E6 -S31AFE00B3547C7D1B782C1D002E4082003C8BB900003B39000138EE -S31AFE00B3691DFFD0280000093B9C0001418100247F24CB7888641E -S31AFE00B37E0000388400013803FFD0280000094081FFF07C7D1BFA -S31AFE00B393787C9923782C1D006C3A8000004082000C8BB90000F8 -S31AFE00B3A83B390001381DFFA8280000203A790001418101F83D27 -S31AFE00B3BD60FE01396B38A05400103A7D4B002E3D20FE0139294A -S31AFE00B3D238A07D4A4A147D4903A64E800420386000307F680352 -S31AFE00B3E7A63B8000013BE000084E800021386000787F6803A639 -S31AFE00B3FC4E800021897800005569063E38090001280000084193 -S31AFE00B41181001C801800085529103A396B00017C604A1499782D -S31AFE00B426000048000030280900074181001C807800043800004B -S31AFE00B43B083923000498180000913800044800001080780004BF -S31AFE00B45038030004901800042C1D00648063000041820028413C -S31AFE00B4658100102C1D00584182004C480000602C1D0070418269 -S31AFE00B47A00342C1D00784182002C4800004C2C03000040800052 -S31AFE00B48F0C3A80002D7C6300D03CC0FE0138C6386838810008A8 -S31AFE00B4A438A0000A480000203CC0FE0138C638744800000C3C10 -S31AFE00B4B9C0FE0138C638883881000838A000104BFFFD057C7517 -S31AFE00B4CE1B787E579378480000EC897800005569063E3809007A -S31AFE00B4E301280000084181001C801800085529103A396B000134 -S31AFE00B4F87C604A149978000048000030280900074181001C80E2 -S31AFE00B50D78000438000008392300049818000091380004480044 -S31AFE00B522001080780004380300049018000482E300007EE3BB98 -S31AFE00B53778480003C97C751B7848000080897800005569063E20 -S31AFE00B54C38090001280000084181001C801800085529103A39F5 -S31AFE00B5616B00017D404A149978000048000030280900074181C7 -S31AFE00B576001C8158000438000008392A000498180000913800A3 -S31AFE00B58B044800001081580004380A000490180004886A000387 -S31AFE00B5A07F6803A63BDE00014E8000214800018C3860003F7FCE -S31AFE00B5B56803A63BDE00014E8000217F55F8503134FFFF7D293E -S31AFE00B5CA4910381AFFFF7C0048782F9C00007F4948387D3A03B6 -S31AFE00B5DF782C140000419E00243BA00030418200207E83A3788E -S31AFE00B5F47F6803A63BDE00013A8000004E800021480000083B60 -S31AFE00B609A000202C1400002E1600003AD5FFFF7F8000264092E0 -S31AFE00B61E003C7F40D3782C0000003B5AFFFF4081002C7F5FD370 -S31AFE00B633787FA3EB787F6803A63BDE00014E8000217FE0FB7896 -S31AFE00B6482C0000003BFFFFFF4181FFE47FFAFB787F880120418B -S31AFE00B65D8200147E83A3787F6803A63BDE00014E8000217EA06B -S31AFE00B672AB782C0000007ED5B378408100547EBDAB787EFCBB4A -S31AFE00B687788BFC00007F6803A67FE3FB783B9C00013BDE000154 -S31AFE00B69C4E8000212C1F000A408200143860000D7F6803A63B0B -S31AFE00B6B1DE00014E8000217FA0EB782C0000003BBDFFFF41814C -S31AFE00B6C6FFC47F97E3787FB5EB78419200687F40D3782C00002F -S31AFE00B6DB003B5AFFFF408100587F5FD378386000207F6803A639 -S31AFE00B6F03BDE00014E8000217FE0FB782C0000003BFFFFFF41C1 -S31AFE00B70581FFE4480000307FA3EB787F6803A63BDE00013A796D -S31AFE00B71A00014E8000212C1D000A408200143860000D7F68036E -S31AFE00B72FA63BDE00014E8000218BB900007E799B782C1D0000BB -S31AFE00B7444082FB887FC3F3788001006C8181002C7C0803A68230 -S31AFE00B759410030826100348281003882A1003C82C1004082E1CF -S31AFE00B76E0044830100488321004C834100508361005483810072 -S31AFE00B7835883A1005C83C1006083E100647D808120382100680A -S31AFE00B7984E8000203D200000816939BC38000000986B000039FA -S31AFE00B7AD6B0001916939BC980B00004E8000209421FF707C08EF -S31AFE00B7C202A693A1008493C1008893E1008C900100943D600070 -S31AFE00B7D70090A10010906B39BC38A100083BA100983800000299 -S31AFE00B7EC396000003C60FE0190A100789081000C90C100149055 -S31AFE00B801E100189101001C9121002091410024980100709961BC -S31AFE00B816007193A100743863B79C38A100704BFFFA31800100D3 -S31AFE00B82B947C0803A683A1008483C1008883E1008C38210090F6 -S31AFE00B8404E8000209421FF707C0802A693A1008493C10088938A -S31AFE00B855E1008C9001009490A100109081000C7C641B78906186 -S31AFE00B86A000838A100083BA1009838000001396000003C60FEFC -S31AFE00B87F0190A1007890C1001490E100189101001C9121002098 -S31AFE00B89491410024980100709961007193A100743863BAF83804 -S31AFE00B8A9A100704BFFF9A9800100947C0803A683A1008483C15B -S31AFE00B8BE008883E1008C382100904E8000209421FFF87C0802F0 -S31AFE00B8D3A69001000C7C601B787C8523783C60FE013863BAF826 -S31AFE00B8E87C0403784BFFF9698001000C7C0803A6382100084E37 -S31AFE00B8FD80002088030000392000004800000C8803000039296D -S31AFE00B91200012C000000386300014082FFF07D234B784E800071 -S31AFE00B927207C691B78480000102C030000386000004D82002061 -S31AFE00B93C8869000088040000388400017C030000392900014195 -S31AFE00B95182FFE07C6018504E800020880400007C691B784800FE -S31AFE00B96600109803000088040000386300012C0000003884000D -S31AFE00B97B014082FFEC38000000980300007D234B784E800020E1 -S31AFE00B9907C6B1B78480000102C030000386000004D820020888E -S31AFE00B9A56B0000396B00013803FFBF280000194181000C380336 -S31AFE00B9BA00205403063E89240000388400013809FFBF28000028 -S31AFE00B9CF194181000C380900205409063E7D204B787C03000097 -S31AFE00B9E44182FFB47C6018504E8000207CA02B797C691B787CEE -S31AFE00B9F90903A640820014386000004E8000207C6018504E8015 -S31AFE00BA0E00208869000088040000388400017C030000392900E4 -S31AFE00BA23014082FFE42C030000418200084200FFE038600000B1 -S31AFE00BA384E8000207CA02B797C6B1B787C0903A640820018388D -S31AFE00BA4D6000004E8000207C6018504E80002042400050886B9B -S31AFE00BA620000396B00013803FFBF280000194181000C380300E3 -S31AFE00BA77205403063E89240000388400013809FFBF2800001951 -S31AFE00BA8C4181000C380900205409063E7D204B787C03000040B2 -S31AFE00BAA182FFB42C0300004082FFB4386000004E8000204800E5 -S31AFE00BAB6002C8923000088040000388400017C09000038630036 -S31AFE00BACB01418200148803FFFF8864FFFF7C6300504E800020FA -S31AFE00BAE07CA02B782C00000038A5FFFF4082FFCC386000004E14 -S31AFE00BAF58000209421FFE87C0802A69381000893A1000C93C120 -S31AFE00BB0A001093E100149001001C3D200000800939087C7D1BA2 -S31AFE00BB1F782C000000408200743D200000392932008009003485 -S31AFE00BB343860FFFF7C0803A67D3E4B783BE000004E8000217C31 -S31AFE00BB497C1B78813E00347FE3FB787D2803A64E800021813E10 -S31AFE00BB5E00147FA4EB78806900008009000C7C0803A64E8000BB -S31AFE00BB732137FF00014081FFD43D20000039293200800900341F -S31AFE00BB887F83E3787C0803A64E800021480000483D2000003905 -S31AFE00BB9D293200816900142C0B00004182001C806B0000800BAA -S31AFE00BBB2000C7FA4EB787C0803A64E8000214800001C8169007E -S31AFE00BBC7187FA4EB78806B0000800B000C7C0803A64E80002129 -S31AFE00BBDC8001001C7C0803A68381000883A1000C83C100108373 -S31AFE00BBF1E10014382100184E8000209421FFF07C0802A693E1A3 -S31AFE00BC06000C900100143D20000039293200816900147C7F1B6F -S31AFE00BC1B782C0B00004082000881690018806B0000800B00100F -S31AFE00BC307C0803A64E800021987F0000800100147C0803A68383 -S31AFE00BC45E1000C382100104E8000209421FFE07C0802A69361EE -S31AFE00BC5A000C9381001093A1001493C1001893E1001C900100CC -S31AFE00BC6F243D200000800939087C7D1B782C000000408200886F -S31AFE00BC843D20000039293200800900343860FFFF7C0803A67DB9 -S31AFE00BC993C4B783BE000004E8000217C7B1B78813C00347FE3AC -S31AFE00BCAEFB787D2803A64E800021817C00147FA4EB78806B004B -S31AFE00BCC300800B001C7C0803A64E8000217C7E1B794182001044 -S31AFE00BCD8881D00002C0000004082004C37FF00014081FFC03D80 -S31AFE00BCED20000039293200800900347F63DB787C0803A64E809D -S31AFE00BD020021480000643D20000039293200816900142C0B0035 -S31AFE00BD170041820034806B0000800B001C7FA4EB784800003488 -S31AFE00BD2C817C00307FE3FB787D6803A63D200000380000019048 -S31AFE00BD410939084E80002148000020816900187FA4EB78806BD5 -S31AFE00BD560000800B001C7C0803A64E8000217C7E1B787FC3F34F -S31AFE00BD6B78800100247C0803A68361000C8381001083A1001439 -S31AFE00BD8083C1001883E1001C382100204E8000209421FFE87C4F -S31AFE00BD950802A69381000893A1000C93C1001093E1001490010C -S31AFE00BDAA001C3D200000800939087C7D1B782C000000408200C3 -S31AFE00BDBF803D20000039293200800900343860FFFF7C0803A67A -S31AFE00BDD47D3E4B783BE000004E8000217C7C1B78813E00347FD1 -S31AFE00BDE9E3FB787D2803A64E800021813E00142C0900004182E3 -S31AFE00BDFE001C8069000080090014388000077FA5EB787C0803BD -S31AFE00BE13A64E80002137FF00014081FFC83D20000039293200D1 -S31AFE00BE28800900347F83E3787C0803A64E800021480000303D16 -S31AFE00BE3D20000039293200812900142C0900004182001C80697D -S31AFE00BE52000080090014388000077FA5EB787C0803A64E8000F9 -S31AFE00BE67213D20000039293200812900182C0900004182001CDA -S31AFE00BE7C80690000800900147FA5EB78388000077C0803A64E66 -S31AFE00BE918000218001001C7C0803A68381000883A1000C83C1AD -S31AFE00BEA6001083E10014382100184E8000209421FFD07C080292 -S31AFE00BEBBA69301001093210014934100189361001C938100202C -S31AFE00BED093A1002493C1002893E1002C900100347C7D1B787C18 -S31AFE00BEE5BE2B787FBFEB783B6000003F2000003F8000003B400E -S31AFE00BEFA0000813939302C09000041820020896900002C0B00CB -S31AFE00BF0F00418200143809000199610008901939304800006440 -S31AFE00BF247FC0FE707C1E005054000FFE7FE9EA78216900007D3B -S31AFE00BF392B49147C0B48394182003C386000324BFFFE494800BD -S31AFE00BF4E00083BDEFFCE2C1E000040810014386100084BFFFCE6 -S31AFE00BF63F17C7B1B794182FFE82C1B0000408200143860FFFFEC -S31AFE00BF7848000180386100084BFFFC7D880100089B5F00007C7C -S31AFE00BF8D0303785400063E2C00000D4182007C418100282C00F7 -S31AFE00BFA20008418200D4418100102C00000341820038480001A2 -S31AFE00BFB7142C00000A41820058480001082C00002B418200E8B9 -S31AFE00BFCC418100102C000024418200DC480000F02C00007F4177 -S31AFE00BFE1820098480000E47C1FE800408200183C60FE0138636E -S31AFE00BFF639284BFFF84D3860FFFE480000F8987F00003BFF001C -S31AFE00C00B013F000000480000DC892100083F0000002C09000A88 -S31AFE00C02040820010881836C02C00000D418200182C09000D4009 -S31AFE00C035820018881836C02C00000A4082000C9B410008480092 -S31AFE00C04A00A4801C39282C000000418200143860000D4BFFFA50 -S31AFE00C05F9D3860000A4BFFFA958801000838600001981836C0E0 -S31AFE00C074480000847C1FE8003F0000004182006C801C39282CCD -S31AFE00C0890000004182001C386000084BFFFA65386000204BFF74 -S31AFE00C09EFA5D386000084BFFFA553BFFFFFF480000407C1FE8B6 -S31AFE00C0B300408200145463063E4BFFC31D386000004800003465 -S31AFE00C0C8801C39282C0000004182000C886100084BFFFA218889 -S31AFE00C0DD0100083F000000981F00003BFF0001880100089818CF -S31AFE00C0F236C04BFFFE08800100347C0803A683010010832100D5 -S31AFE00C10714834100188361001C8381002083A1002483C1002857 -S31AFE00C11C83E1002C382100304E8000209421FFC07C0802A692D1 -S31AFE00C1314100089261000C9281001092A1001492C1001892E165 -S31AFE00C146001C9301002093210024934100289361002C93810008 -S31AFE00C15B3093A1003493C1003893E1003C900100447C9D23786E -S31AFE00C1707C7C1B787D3DE0107D2949107D294BB87C1CE8507C8D -S31AFE00C1850048787FA948387D3D03797CB62B78408101403E40AE -S31AFE00C19AFE012C160000418200143872392C7C96E0504BFFF6E3 -S31AFE00C1AF99480000103872392C7F84E3784BFFF6897FBEEB78B0 -S31AFE00C1C47F9DE3783BE000003E80FE013EA0FE013E60FE013B5E -S31AFE00C1D95EFFF03AFD00103F00FE013F60FE013F20FE017C1FE4 -S31AFE00C1EEF000408000147C9DF8AE387839384BFFF649480000C3 -S31AFE00C2030C387939404BFFF63D7FFCFE707C1CF8507C000E70AC -S31AFE00C2187C0002147C00F8502C0000014082000C387B39444B41 -S31AFE00C22DFFF61957801F7E7C1F02147C001E70540018387C009B -S31AFE00C242F8502C0000074082000C387B39444BFFF5F53BFF00FC -S31AFE00C257012C1F000F4081FF907FBCEB787FDDF3783874394891 -S31AFE00C26C4BFFF5D97EBEAB783BE000007C1FE8004080002C7C3C -S31AFE00C2819CF8AE3804FFE02000005E7C0001107C0003B87C0980 -S31AFE00C29600F87C8000387129002E7C044B784800000838800050 -S31AFE00C2AB20387E394C4BFFF5953BFF00012C1F000F4081FFBC3A -S31AFE00C2C0387339504BFFF5817F5DD3797EFCBB784181FECC8090 -S31AFE00C2D50100447C0803A6824100088261000C8281001082A1EE -S31AFE00C2EA001482C1001882E1001C83010020832100248341001D -S31AFE00C2FF288361002C8381003083A1003483C1003883E1003C46 -S31AFE00C314382100404E8000209421FFF87C0802A69001000C38DC -S31AFE00C329A000004BFFFDFD8001000C7C0803A6382100084E802E -S31AFE00C33E00209421FF607C0802A69361008C9381009093A1002E -S31AFE00C3539493C1009893E1009C900100A49081000C388100A88E -S31AFE00C3683FA000003B800000380000013961000890810074833F -S31AFE00C37D7D39309061000890A1001090C1001490E10018910107 -S31AFE00C392001C912100209141002498010070916100789B81001F -S31AFE00C3A771388100704BFFF5213C60FE01386339544BFFF48DF5 -S31AFE00C3BC939D3930386100803880000838A000004BFFFAE98869 -S31AFE00C3D1610080937D393068600059212000007C090114686332 -S31AFE00C3E60079212300007C6919147C630378800100A47C080369 -S31AFE00C3FBA68361008C8381009083A1009483C1009883E1009CEB -S31AFE00C410382100A04E8000209421FFE87C0802A69381000893B5 -S31AFE00C425A1000C93C1001093E100149001001C7C9C23787CBDCC -S31AFE00C43A2B787C7F1B783BC00000480000C857C0103A7FFD01CF -S31AFE00C44F2E881F00003BDE000148000098881F00002C00002210 -S31AFE00C4644082008457C0103A7D60EA14812BFFFC7C09F80040D9 -S31AFE00C47982000C3BFF000193EBFFFC893F0000692000227C0079 -S31AFE00C48E00D07D2900D055290FFE54000FFE7D2B0039418200BF -S31AFE00C4A32C7FE3FB788D230001692000227C0000D07D2900D061 -S31AFE00C4B855290FFE54000FFE7D2B00394082FFE47C7F1B7888E3 -S31AFE00C4CD1F00002C0000004082002C3C60FE013863396C4BFFF8 -S31AFE00C4E2F365480000083BFF0001881F00002C000000418200C8 -S31AFE00C4F74C2C0000204082FF6038000000981F00003BFF000149 -S31AFE00C50C881F00002C0000004182002C2C000020408200187FAF -S31AFE00C521E3FB788C0300012C0000204182FFF87C7F1B78881FE0 -S31AFE00C53600002C0000004082FF0C3C6000003C80000080BD005E -S31AFE00C54B0093DC0000386337A838843818480000258001001CD8 -S31AFE00C5607C0803A68381000883A1000C83C1001083E100143855 -S31AFE00C5752100184E8000209421FFD87C0802A69301000893217E -S31AFE00C58A000C93410010936100149381001893A1001C93C100D0 -S31AFE00C59F2093E100249001002C7C7F1B787CBC2B787C9A2378F4 -S31AFE00C5B47F83E3784BFFF3497FFDFB787C1DD0007C7B1B784168 -S31AFE00C5C98200C0809D00007F83E3787F65DB784BFFF4652C0394 -S31AFE00C5DE00004082009C807D00004BFFF3197C03D8004081007B -S31AFE00C5F3847C1FD0003BC00001418200603F00FE013F20FE0185 -S31AFE00C6087C1DF80041820044809F00007F83E3787F65DB784B83 -S31AFE00C61DFFF4212C0300004082002C2C1E00004182001880BD71 -S31AFE00C6320000387839807F84E3784BFFF2093BC00000809F00C9 -S31AFE00C64700387939A84BFFF1F93BFF00107C1FD0004082FFB0EE -S31AFE00C65C2C1E0000408200143C60FE01386339AC4BFFF1D9482E -S31AFE00C6710000187FA3EB78480000143BBD00107C1DD000408284 -S31AFE00C686FF48386000008001002C7C0803A683010008832100B2 -S31AFE00C69B0C83410010836100148381001883A1001C83C10020EE -S31AFE00C6B083E10024382100284E8000209421FFE87C0802A6931F -S31AFE00C6C581000893A1000C93C1001093E100149001001C7C601E -S31AFE00C6DA1B783C60FE017C9D23787C1F03787CBE2B783863399E -S31AFE00C6EFB04BFFF1557C1FE800418200283F80FE0180BF000087 -S31AFE00C70480DF0008387C39B87FC4F3784BFFF1353BFF00107C2C -S31AFE00C7191FE8004082FFE48001001C7C0803A68381000883A161 -S31AFE00C72E000C83C1001083E10014382100184E80002091230007 -S31AFE00C743149883000090A3000490C3000890E3000C91030010F9 -S31AFE00C7584E8000209421FFB07C0802A691C1000891E1000C92E0 -S31AFE00C76D01001092210014924100189261001C9281002092A17B -S31AFE00C782002492C1002892E1002C9301003093210034934100E0 -S31AFE00C797389361003C9381004093A1004493C1004893E1004CF9 -S31AFE00C7AC900100547D344B787D1643783016FFFF7D20B1106AC1 -S31AFE00C7C1800001216000007C0B01147D2B00397C701B787C984D -S31AFE00C7D623787CD133787CF53B787D5353783B4000013A400002 -S31AFE00C7EB0041820008925600007C12A8007E3F8B78408000507C -S31AFE00C8007EA903A67FEBFB7839000000812B00102C0900004107 -S31AFE00C81582000891090000814B00042C0A000040820020800B73 -S31AFE00C82A00082C0000004182000C2C0000024082000C812B004A -S31AFE00C83F0C91490000396B00184200FFC47CBD2B787C1D800044 -S31AFE00C854408002043DC0FE013DE0FE0157BE103A7C9EC02E88FE -S31AFE00C8690400002C00002D4082014C396000007C0BA8008AE414 -S31AFE00C87E00017E3F8B78392000003B7D0001408001147F9EC21A -S31AFE00C893143B200001881F00007C170000408200F0813F001060 -S31AFE00C8A82C09000041820020800900002C000000418200148053 -S31AFE00C8BD9F0014386E39C44BFFEF813B400000801F00042C0008 -S31AFE00C8D2000041820080813C0000880900023BC900032C000087 -S31AFE00C8E73D4182000C83DC00043BBD0001801F00082C000000FD -S31AFE00C8FC418200102C0000014182003C48000040809F000C7FF2 -S31AFE00C911C3F37838A0000038C00000480001992C03000040823C -S31AFE00C926002480BF00147FC4F378386F39E44BFFEF113B40004A -S31AFE00C93B004800000C813F000C93C90000813F00103B7D0001DE -S31AFE00C95048000034801F00082C000000418200102C000002413D -S31AFE00C96582001C48000020817F000C812B000039290001912BDC -S31AFE00C97A00004800000C813F000C9329000039600001480000E6 -S31AFE00C98F14392900017C09A8003BFF00184180FEFC2C0B0000A7 -S31AFE00C9A4408200A83C60FE0138633A0C7EE4BB784BFFEE9148EE -S31AFE00C9B90000902C160000418200782C12000041820014386E9D -S31AFE00C9CE39C47E649B784BFFEE713B4000002C14000041820037 -S31AFE00C9E3102C1400014182003C480000407C7EC02E7EC4B3780E -S31AFE00C9F838A0000038C00000480000B52C030000408200247CC8 -S31AFE00CA0D9EC02E386F39E47E659B784BFFEE2D3B4000004800A2 -S31AFE00CA22000C7C1EC02E901600003B7D00013A40000148000045 -S31AFE00CA37183C60FE0138633A2C3B7D00014BFFEE013B400000C5 -S31AFE00CA4C7F7DDB787C1D80004180FE0C7F43D378800100547C40 -S31AFE00CA610803A681C1000881E1000C8201001082210014824146 -S31AFE00CA7600188261001C8281002082A1002482C1002882E10058 -S31AFE00CA8B2C8301003083210034834100388361003C838100407A -S31AFE00CAA083A1004483C1004883E1004C382100504E80002088BA -S31AFE00CAB503000038E000012C0000203900000A39800000408242 -S31AFE00CACA00108C0300012C0000204182FFF8880300002C0000F6 -S31AFE00CADF004182012C2C07000041820038880300002C00003039 -S31AFE00CAF44082002C892300013809FFBF280000194181000C3848 -S31AFE00CB090900205409063E2C0900784082000C390000103863EA -S31AFE00CB1E00028943000038E00000392AFFD0380AFFBF2129009C -S31AFE00CB3309392000007D29491420000005380000007C00011496 -S31AFE00CB487D2B0379386300013920000040820010380AFF9F28E1 -S31AFE00CB5D00000541810008392000012C09000041820068392AD3 -S31AFE00CB72FFD05520063E280000094181000C7D2B4B7848000070 -S31AFE00CB8730380AFF9F280000054181000C396AFFA94800001CDB -S31AFE00CB9C380AFFBF200000057C0001107C0003B8392AFFC97CF0 -S31AFE00CBB10B48387C0B40004080001C880300007D2C41D62C00C6 -S31AFE00CBC600007D895A144082FF184800003C2C06000041820090 -S31AFE00CBDB2C88060000480000088C0600012C000000418200189D -S31AFE00CBF07C0A00004082FFF0880600002C0000004082000C3835 -S31AFE00CC056000004E8000202C05000091840000418200089065C2 -S31AFE00CC1A0000386000014E800020880300002C000020408200E1 -S31AFE00CC2F108C0300012C0000204182FFF8886300006869007416 -S31AFE00CC44200900007D20491468600054214000007C0A01147D1F -S31AFE00CC592B037941820010380000019004000048000030686932 -S31AFE00CC6E0046200900007D20491468600066214000007C0A012E -S31AFE00CC83147C0A4B794082000C386000004E80002091640000F1 -S31AFE00CC98386000014E8000209421FFE07C0802A69361000C93A9 -S31AFE00CCAD81001093A1001493C1001893E1001C900100243D2087 -S31AFE00CCC2000139699680800BFFD47C9C23782C0000007CDB33D9 -S31AFE00CCD7784182000C3800000A4800012838000001B009968042 -S31AFE00CCEC88030000396B00022C0000002F8500004182001898AB -S31AFE00CD010B00008C030001396B00012C0000004082FFF03800C4 -S31AFE00CD160000980B0000396B0001409E00103D20FE0138693A97 -S31AFE00CD2B604800001C2C0500014182000C3800000A480000CCD4 -S31AFE00CD403D20FE0138693A6C880300002C00000041820018980D -S31AFE00CD550B00008C030001396B00012C0000004082FFF03D204B -S31AFE00CD6A00013BA9966838000000980B00007FA3EB78388000B5 -S31AFE00CD7F0038A0000C4BFFE3953D600000812B36C83BFDFFEC8B -S31AFE00CD9438000001B13F0018B01F001AA01C0004392900012C0D -S31AFE00CDA90000003BC00000912B36C893DF00144082000C380030 -S31AFE00CDBE0045B01C00047F85E378387D0018388002057FA6EB4C -S31AFE00CDD378480033A92C0300004180002838000001901DFFECC2 -S31AFE00CDE83920FFFF93DF0004913F001093DF000C93DF00083855 -S31AFE00CDFD6000004800001038000009901B00003860FFFF800162 -S31AFE00CE1200247C0803A68361000C8381001083A1001483C10036 -S31AFE00CE271883E1001C382100204E8000203D200001380000005D -S31AFE00CE3C90099654386000004E8000209421FFC87C0802A6929A -S31AFE00CE51C1001092E10014930100189321001C9341002093610C -S31AFE00CE6600249381002893A1002C93C1003093E1003490010036 -S31AFE00CE7B3C7C9923783B6000007C1BC8003D2000013BC9968040 -S31AFE00CE907C7A1B787CBC2B78408001783BFEFFD43B0100083A62 -S31AFE00CEA5E000043AC00009813F000C2C0900004081005C7C1BD8 -S31AFE00CEBAC8507F890000809F02347F43D3784FFEE3827FA0000C -S31AFE00CECF2657BD07FE7FBD00D07C00E8787D3DE8387FBD037892 -S31AFE00CEE47FA5EB784BFFE159801F0234813F000C7C00EA147D92 -S31AFE00CEF93D4850901F0234913F000C7F7BEA147F5AEA14480073 -S31AFE00CF0E00FC801F0010280001FF408100F838000001900100B4 -S31AFE00CF23083920000091380004387F002C3880020538BF00200E -S31AFE00CF3838DF00147F07C378480033697C631B794080002C8130 -S31AFE00CF4D3F0004392900012C09000F913F000441810010801F9C -S31AFE00CF6200082C00000040820044380000084800008CA81E00A2 -S31AFE00CF77002C00000340820064813F0008A97E000239290001F8 -S31AFE00CF8C7C0B48004082001C3863FFFC381E0004907F000C9044 -S31AFE00CFA11F0234917F0008907F0010A01F000AB2FE0000B01EA4 -S31AFE00CFB60002387F002C3880000438BF002038DF001448003106 -S31AFE00CFCBB52C0300004080003892DC00003860FFFF48000038ED -S31AFE00CFE02C00000540820014A81E00023860FFFF901C000048DF -S31AFE00CFF50000203800000B901C00003860FFFF480000107C1B8F -S31AFE00D00AC8004180FEA07F63DB788001003C7C0803A682C10084 -S31AFE00D01F1082E10014830100188321001C834100208361002429 -S31AFE00D0348381002883A1002C83C1003083E10034382100384E7C -S31AFE00D0498000203803FFFF2800000B3D20FE0138693A744D8149 -S31AFE00D05E00203D60FE01396B3B905400103A7D4B002E3D20FE9F -S31AFE00D0730139293B907D4A4A147D4903A64E8004203C60FE0155 -S31AFE00D08838633A844E8000203C60FE0138633A944E8000203C1A -S31AFE00D09D60FE0138633AA84E8000203C60FE0138633ACC4E80A6 -S31AFE00D0B200203C60FE0138633AE44E8000203C60FE0138633A93 -S31AFE00D0C7F84E8000203C60FE0138633B0C4E8000203C60FE0164 -S31AFE00D0DC38633B1C4E8000203C60FE0138633B304E8000203C90 -S31AFE00D0F160FE0138633B4C4E8000203C60FE0138633B604E8018 -S31AFE00D10600203C60FE0138633B744E8000209421FFE87C0802FB -S31AFE00D11BA693A1000C93C1001093E100149001001C3D2000001F -S31AFE00D130800936D07C9F23782C0000004082007C480043113D5E -S31AFE00D1452000013869988C800300042C00000540820018A003B6 -S31AFE00D15A00162C00000040820050480043E5480000482C00003C -S31AFE00D16F0040820014480008D93800000A981F00004800006007 -S31AFE00D1843FA00001389D9ED038A000804800444D2C0300003BD4 -S31AFE00D199BD9ED03D2000003D60000093A939D8906B36D0408248 -S31AFE00D1AE000C38600000480000303D400000816A39D83D000096 -S31AFE00D1C300880B0000396B0001981F0000812836D0916A39D8A9 -S31AFE00D1D83929FFFF912836D0386000018001001C7C0803A68339 -S31AFE00D1EDA1000C83C1001083E10014382100184E80002094219C -S31AFE00D202FFE07C0802A693A1001493C1001893E1001C90010033 -S31AFE00D217243D2000003BA932007C7E1B783BE0006448000028EB -S31AFE00D22C37FFFFFF40820010480000513BE000644800001481EE -S31AFE00D2413D0048386000647D2803A64E8000217FC3F3783881B0 -S31AFE00D25600084BFFFEBD2C0300004182FFCC8861000880010083 -S31AFE00D26B247C0803A683A1001483C1001883E1001C38210020CC -S31AFE00D2804E8000209421FFE87C0802A693A1000C93C1001093A8 -S31AFE00D295E100149001001C3D2000013BA99F504800003080BEF7 -S31AFE00D2AA36D47FE3FB787FA4EB784800443D7C631B7940810009 -S31AFE00D2BF14801E36D47FBD1A147C030050901E36D4480041819F -S31AFE00D2D43FC00000801E36D42C000000418200303D2000013BE2 -S31AFE00D2E9E9988C801F00042C0000054082000C7FE3FB78480060 -S31AFE00D2FE424D801F00042C0000004082FFA0480007413D20006B -S31AFE00D313003BC93200801E00443D2000012C00000039299F500E -S31AFE00D3283D6000003D4000003BE00000912B39DC93EA36D4411E -S31AFE00D33D820010386000004BFFDC0D93FE00448001001C7C0884 -S31AFE00D35203A683A1000C83C1001083E10014382100184E8000DE -S31AFE00D367209421FFF07C0802A693E1000C900100143D600000FB -S31AFE00D37C812B39DC2C0400249889000039290001912B39DC40EE -S31AFE00D391820010380000013D200000900939C03FE00000801F0B -S31AFE00D3A639C0688B0023212B00007D6959143140FFFF7D2A01A9 -S31AFE00D3BB107D2058394182001C3D400000392000013D600000C8 -S31AFE00D3D038000000912A39C4900B39C83D600000812B36D4392C -S31AFE00D3E52900012C090100912B36D44182002C3D200000800934 -S31AFE00D3FA39C42C000000418200283D600000812B39C83929005A -S31AFE00D40F012C090003912B39C8408200104BFFFE693800000053 -S31AFE00D424901F39C0800100147C0803A683E1000C382100104E5E -S31AFE00D4398000209421FFE87C0802A693A1000C93C1001093E15A -S31AFE00D44E00149001001C4800055D7C7D1B783C60FE013C80FE79 -S31AFE00D4630138A000EC38843C8838633C804BFFE3D57FA3EB788D -S31AFE00D478480005A58001001C7C0803A683A1000C83C1001083D8 -S31AFE00D48DE10014382100184E8000209421FFE87C0802A693A136 -S31AFE00D4A2000C93C1001093E100149001001C480005017C7D1B6A -S31AFE00D4B7783C60FE013C80FE0138A000FE38843C9838633C80D1 -S31AFE00D4CC4BFFE3797FA3EB78480005498001001C7C0803A68339 -S31AFE00D4E1A1000C83C1001083E10014382100184E8000209421A5 -S31AFE00D4F6FFE87C0802A69381000893A1000C93C1001093E100D6 -S31AFE00D50B149001001C7C7D1B787C9E23784BFFFD6D3D200000F4 -S31AFE00D520800936CC3D6000001FE0000A3B8B32004800001481EC -S31AFE00D5353C0048386000647D2803A64E8000217FA3EB787FC458 -S31AFE00D54AF3784BFFFBC97C631B79408200102C1F00003BFFFF86 -S31AFE00D55FFF4082FFD48001001C7C0803A68381000883A1000C19 -S31AFE00D57483C1001083E10014382100184E8000209421FF787CCB -S31AFE00D5890802A693C1008093E100849001008C7C8023782C002D -S31AFE00D59E000590A1001090C1001490E100189101001C912100E0 -S31AFE00D5B320914100249081000C3BC000004182002C2800000515 -S31AFE00D5C8418100102C00000441820194480003482C00000641EA -S31AFE00D5DD8203082C0000074182030C480003343FE00000801F66 -S31AFE00D5F236D83D6000002C00000039200001912B36DC4082005F -S31AFE00D60714480011C1907F36D82C03000041820308811F36D814 -S31AFE00D61C3808FFFF28000039418102F83D60FE01396B3CA85422 -S31AFE00D63100103A7D4B002E3D20FE0139293CA87D4A4A147D4913 -S31AFE00D64603A64E8004203D20FF0061290014816900007C0006CA -S31AFE00D65BAC3948FFFF3C0080007C0054307D6B03789169000072 -S31AFE00D6707C0006AC480002A83D20FF0061290200A00900007C74 -S31AFE00D6850006AC60000008B00900007C0006AC480002883D205C -S31AFE00D69AFF0061290200A00900007C0006AC60000004B00900F8 -S31AFE00D6AF007C0006AC480002683D20FF0061290240A0090000B1 -S31AFE00D6C47C0006AC60000004B00900007C0006AC480002483D05 -S31AFE00D6D920FF0061290220A00900007C0006AC60000008B00975 -S31AFE00D6EE00007C0006AC480002283D20FF0061290220A00900D2 -S31AFE00D703007C0006AC60000004B00900007C0006AC4800020842 -S31AFE00D7183D20FF0061290940800900007C0006AC6000008090A2 -S31AFE00D72D0900007C0006AC480001E83D20FF006129094881695A -S31AFE00D74200007C0006AC3948FFE53C0080007C0054307D6B0394 -S31AFE00D75778916900007C0006AC480001BC3D60000083CB36DC17 -S31AFE00D76C38000000900B36DC3D200000814936D82C0A00004113 -S31AFE00D78182019C7D4853783808FFFF280000394181018C3D6055 -S31AFE00D796FE01396B3D905400103A7D4B002E3D20FE0139293D7B -S31AFE00D7AB907D4A4A147D4903A64E8004203D20FF006129001455 -S31AFE00D7C0816900007C0006AC3948FFFF3C0080007C0054307D80 -S31AFE00D7D56B0078916900007C0006AC4800013C3D20FF006129C5 -S31AFE00D7EA0200A00900007C0006AC7000FFF75400043EB0090098 -S31AFE00D7FF007C0006AC480001183D20FF0061290200A0090000F1 -S31AFE00D8147C0006AC7000FFFB5400043EB00900007C0006AC489E -S31AFE00D8290000F43D20FF0061290240A00900007C0006AC700083 -S31AFE00D83EFFFB5400043EB00900007C0006AC480000D03D20FFE6 -S31AFE00D8530061290220A00900007C0006AC7000FFF75400043E3D -S31AFE00D868B00900007C0006AC480000AC3D20FF0061290220A024 -S31AFE00D87D0900007C0006AC7000FFFB5400043EB00900007C0026 -S31AFE00D89206AC480000883D20FF0061290940800900007C0006C1 -S31AFE00D8A7AC5400066E900900007C0006AC480000683D20FF0021 -S31AFE00D8BC61290948816900007C0006AC3948FFE53C0080007CC3 -S31AFE00D8D10054307D6B0078916900007C0006AC4800003C3D2051 -S31AFE00D8E6000083C936D848000030396100083801009039200093 -S31AFE00D8FB039BC100719921007090010074916100783D2000004E -S31AFE00D910800B000883C936CC900936CC7FC3F3788001008C7C4C -S31AFE00D9250803A683C1008083E10084382100884E800020942108 -S31AFE00D93AFFE07C0802A693A1001493C1001893E1001C900100F4 -S31AFE00D94F247C7D1B787C9F23787CA32B784BFFCCE93800000060 -S31AFE00D964901F00007FA3EB78388100084BFFF7A52C030000415F -S31AFE00D979820018880100082C0000034082000C38000001901F85 -S31AFE00D98E000038600001800100247C0803A683A1001483C10099 -S31AFE00D9A31883E1001C382100204E8000209421FFE87C0802A6A4 -S31AFE00D9B89381000893A1000C93C1001093E100149001001C3F22 -S31AFE00D9CDA000003BBD3200813D00343860FFFF7D2803A64E80D3 -S31AFE00D9E20021801D00347C7C1B78386000007C0803A64E80001C -S31AFE00D9F7217F83E3788001001C7C0803A68381000883A1000C93 -S31AFE00DA0C83C1001083E10014382100184E8000209421FFF87CAE -S31AFE00DA210802A69001000C3D20000039293200800900347C086D -S31AFE00DA3603A64E8000218001000C7C0803A6382100084E800056 -S31AFE00DA4B209421FFE87C0802A693A1000C93C1001093E10014AE -S31AFE00DA609001001C3FA000003BBD3200817D00343D20000080E8 -S31AFE00DA756939D07D6803A63D20000038000000900939084E805B -S31AFE00DA8A0021801D00303D200000806939D47C0803A64E800047 -S31AFE00DA9F213D20000038000001900939288001001C7C0803A6F3 -S31AFE00DAB483A1000C83C1001083E10014382100184E800020946A -S31AFE00DAC921FFE87C0802A693A1000C93C1001093E10014900153 -S31AFE00DADE001C3FA000003BBD3200811D00343860FFFF7D08031A -S31AFE00DAF3A63D400000392000013D60000038000000912A3908CC -S31AFE00DB08900B39284E8000213D200000906939D0813D00343890 -S31AFE00DB1D6000017D2803A64E800021813D00303860FFFF7D2828 -S31AFE00DB3203A64E8000213D200000801D0030906939D43860007A -S31AFE00DB47017C0803A64E8000218001001C7C0803A683A1000CAE -S31AFE00DB5C83C1001083E10014382100184E8000209421FFE87C6D -S31AFE00DB710802A69381000893A1000C93C1001093E10014900112 -S31AFE00DB86001C3FE00000801F36E02C000000408200A03FA00029 -S31AFE00DB9B003BBD3200813D00343860FFFF7D2803A64E80002182 -S31AFE00DBB0813D00347C7C1B78386000017D2803A64E8000218188 -S31AFE00DBC55D00143D20FE013929D43C912A00043D60FE01396B09 -S31AFE00DBDAD4983D20FE01916A00083929D368912A000C3D60FE68 -S31AFE00DBEF01396BD2003D20FE01916A00103929D584912A0014B5 -S31AFE00DC043D60FE01396BD9383D20FE01916A00183929D4F4918C -S31AFE00DC192A001C801D00347F83E3787C0803A64E80002138002A -S31AFE00DC2E0001901F36E03D2000003FA00001A089391A387D9811 -S31AFE00DC438C480038313BBD988C801D00043D200000900939CCD3 -S31AFE00DC588001001C7C0803A68381000883A1000C83C1001083D6 -S31AFE00DC6DE10014382100184E8000209421FFF07C0802A693E106 -S31AFE00DC82000C90010014480037C93D2000013BE9988C3D20008D -S31AFE00DC9700817F0004800939CC7C005800418200602C0B0004B0 -S31AFE00DCAC408200484BFFFE193C6000013D20000139299F503C6C -S31AFE00DCC180000038C39ED03CA00000396000013940000D3D0028 -S31AFE00DCD600003CE000003800000090C439D8916536D099439E06 -S31AFE00DCEBD0912839DC900736D4801F00042C0000004082000848 -S31AFE00DD004BFFFE6D3D200001800998903D600000900B39CC8089 -S31AFE00DD150100147C0803A683E1000C382100104E800020942137 -S31AFE00DD2AFFE87C0802A693A1000C93C1001093E1001490010010 -S31AFE00DD3F1C3D20000080E9391C2C070000408200283D0000003A -S31AFE00DD54392000013D6000003D40000038002328912839149029 -S31AFE00DD69EB3A00900A39184800007C3C60FE013C8000003863DB -S31AFE00DD7E3BFC38843A0038A000014BFF50793C60FE013C80001C -S31AFE00DD930038633BD43884391838A000024BFF50613C60FE0150 -S31AFE00DDA83C80000038633C2C3884391438A000014BFF50493CA2 -S31AFE00DDBD60FE013C80000038633C483884370838A000054BFFF1 -S31AFE00DDD250313C60FE013C80000138633C7038841AB038A000BA -S31AFE00DDE7054BFF50193D20000038000000900939344800034D38 -S31AFE00DDFC4800287D3D6000003D200000392938F83BEB38E87CD3 -S31AFE00DE111F48004182003C7D3D4B783BC00001813F00047FE3F3 -S31AFE00DE26FB787D2803A64E8000217C631B794182000C93DF007F -S31AFE00DE3B0C48000008907F000C3BFF00107C1FE8004082FFD4F5 -S31AFE00DE503D20000080093A042C000000408200143C60FE0138C0 -S31AFE00DE65633E784BFFD9DD480000903D200000800939142C0054 -S31AFE00DE7A0000418200283C60000138631A9C48001E8D2C030094 -S31AFE00DE8F00418200143C60FE0138633E984BFFD9A94800001073 -S31AFE00DEA43D20000038000001900939343D200000800939342C4A -S31AFE00DEB9000000418200403C60000038633708480001B97C64F5 -S31AFE00DECE1B783C60FE0138633EC44BFFD96D3C60000138631A8E -S31AFE00DEE3B04800019D7C641B783C60FE0138633ECC4BFFD95169 -S31AFE00DEF84BFFFC758001001C7C0803A683A1000C83C100108385 -S31AFE00DF0DE10014382100184E8000209421FFF093E1000C38004B -S31AFE00DF2200047C0903A67C9F2378388000003980001889630089 -S31AFE00DF370038E000012C0B000038A0000038C0000A386300010B -S31AFE00DF4C4182011069600030212000007C0901147CE900394135 -S31AFE00DF61820030892300003809FFBF280000194181000C3809FA -S31AFE00DF7600205409063E2C090078408200108D63000138C00069 -S31AFE00DF8B1038630001392BFFD0380BFFBF7D2A4B787C08037834 -S31AFE00DFA05529063E5400063E21290009392000007D294914203F -S31AFE00DFB5000005380000007C0001147D27037938E000003920F4 -S31AFE00DFCA000040820010380BFF9F28000005418100083920003B -S31AFE00DFDF012C090000418200685540063E280000094181000CF0 -S31AFE00DFF47D49537848000030380BFF9F280000054181000C39F6 -S31AFE00E0092BFFA94800001C5500063E200000057C0001107C0000 -S31AFE00E01E03B8392BFFC97C0948387C093000408000208963007C -S31AFE00E033007C0531D62C0B00007CA04A14386300014082FF0C32 -S31AFE00E048480000142C0B002E4182000C386000004800001C7CB7 -S31AFE00E05DA060307C840378398CFFF84200FECC909F0000386070 -S31AFE00E072000183E1000C382100104E8000209421FFE87C0802AB -S31AFE00E087A693A1000C93C1001093E100149001001C8903000372 -S31AFE00E09C3FA0000188A3000088C3000188E300023C80FE0138B4 -S31AFE00E0B1843EE8387DA0504BFFD705387DA0508001001C7C081B -S31AFE00E0C603A683A1000C83C1001083E10014382100184E80005D -S31AFE00E0DB20812300007C09180041820020812300049089000027 -S31AFE00E0F0800300049064000090040004908300044E800020906F -S31AFE00E1058900049089000091240000912400044E8000207C6B18 -S31AFE00E11A1B78806B00007C0358004182001880030000900B009E -S31AFE00E12F0081230000916900044E800020386000004E800020C1 -S31AFE00E1449421FFE87C0802A693A1000C93C1001093E10014903E -S31AFE00E15901001C3D0000003CE00000392839E8396739E0912843 -S31AFE00E16E39E8916739E03D400001912900043BCAA070916B0019 -S31AFE00E183043FA000003BE000107FC4F378387D39E04BFFFF4967 -S31AFE00E19837FFFFFF3BDE06104082FFEC8001001C7C0803A68311 -S31AFE00E1ADA1000C83C1001083E10014382100184E8000209421CC -S31AFE00E1C2FFF87C0802A69001000C80040000A1240004900300A4 -S31AFE00E1D710B123001480040000A10400043D200000396939F8DA -S31AFE00E1EC900939F83D400000B10B0004906A3A044800001580FE -S31AFE00E20101000C7C0803A6382100084E8000209421FFF87C084B -S31AFE00E21602A69001000C81230000388300108009000038A000DA -S31AFE00E22B007C0803A64E8000218001000C7C0803A638210008A3 -S31AFE00E2404E8000209421FF587C0802A67D800026934100909385 -S31AFE00E2556100949381009893A1009C93C100A093E100A49001A2 -S31AFE00E26A00AC9181008C3D2000003929320083A9004C3D60004B -S31AFE00E27F002C1D00007C7B1B787C9A23787CBC2B7883EB3A047B -S31AFE00E2943BC00005418200547FBFEB78815F0000801F000C81AD -S31AFE00E2A96A00243D2000002C000000392936E4916A0028912AEB -S31AFE00E2BE00244082002C800A00003C800000388439F87FE3FBA5 -S31AFE00E2D37838A000007C0803A64E800021801F000C60000001BA -S31AFE00E2E8901F000C2E1D00004800003C813F00007FE3FB78807E -S31AFE00E2FD09001C7C0803A64E8000213D2000003929320080094D -S31AFE00E31200483C60000360630D407C0803A64E80002137DEFFCB -S31AFE00E327FF408100E4813F00007FE3FB788009000C7C0803A6E2 -S31AFE00E33C4E8000212C0300004182FFB0813F00003D600000815A -S31AFE00E35149001038A0000238EB39F09361000893410010938140 -S31AFE00E36600147FE3FB783881000838DC000E7D4803A63800002C -S31AFE00E37B0E392000009001000C912B39F04E8000213D20000054 -S31AFE00E39080093A003FC000002C000000418200384BFFF6117CBE -S31AFE00E3A57D1B783C60FE0138633EF44BFFD4957F63DB78388047 -S31AFE00E3BA000E4BFFDF617F43D3787F84E3784BFFDF557FA3EBBC -S31AFE00E3CF784BFFF64D801E39F02C000000408200307FFDFB785C -S31AFE00E3E47FDFF378813D00007FA3EB788009001C7C0803A64EF4 -S31AFE00E3F9800021801F39F02C0000004182FFE47FBFEB7841925C -S31AFE00E40E0018813F000038000000816900289009002891690018 -S31AFE00E42324800100AC8181008C7C0803A6834100908361009408 -S31AFE00E4388381009883A1009C83C100A083E100A47D80812038AD -S31AFE00E44D2100A84E8000209421FFF87C0802A69001000C3D202D -S31AFE00E4620000380939F07C0400004082001038000001900939DA -S31AFE00E477F0480000188123000081690028800B00087C0803A6C6 -S31AFE00E48C4E8000218001000C7C0803A6382100084E80002094EB -S31AFE00E4A121FFE07C0802A69361000C9381001093A1001493C176 -S31AFE00E4B6001893E1001C900100243D20000039293200838900F3 -S31AFE00E4CB4C3D6000002C1C00007C7D1B787C9B237883CB3A043D -S31AFE00E4E0418200547F9EE378815E0000801E000C816A00243DBF -S31AFE00E4F52000002C000000392936E4916A0028912A0024408282 -S31AFE00E50A002C800A00003C800000388439F87FC3F37838A00014 -S31AFE00E51F007C0803A64E800021801E000C60000001901E000C02 -S31AFE00E534813E00007FC3F3788009001C7C0803A64E8000213C65 -S31AFE00E549600000386339E84BFFFBC97C7F1B7941820054393F71 -S31AFE00E55E000CA009000C817F000C8149000481090008B01D00AA -S31AFE00E5730C917D0000915D0004911D000880BF00087F63DB7851 -S31AFE00E58838A5FFF2389F001A4BFFCAB13C600000386339E07F27 -S31AFE00E59DE4FB784BFFFB3D807F000848000008386000002C1C55 -S31AFE00E5B2000041820018813E00003800000081690028900900D3 -S31AFE00E5C72891690024800100247C0803A68361000C838100101F -S31AFE00E5DC83A1001483C1001883E1001C382100204E8000209417 -S31AFE00E5F121FFE87C0802A693A1000C93C1001093E10014900120 -S31AFE00E606001C7CA02B797C0903A64081003C7C9F23787FC902F4 -S31AFE00E61BA63FA00000807F000080BF0004809D39F44BFFCA15AC -S31AFE00E630801D39F4813F000437DEFFFF7C004A143BFF00089084 -S31AFE00E6451D39F44082FFD88001001C7C0803A683A1000C83C19B -S31AFE00E65A001083E10014382100184E8000209421FF607C080226 -S31AFE00E66FA69361008C9381009093A1009493C1009893E1009C04 -S31AFE00E684900100A47C7E1B783C6000007C9B2378386339E04B6E -S31AFE00E699FFFA817C7C1B787F89FE707D20E2787C004850817EE3 -S31AFE00E6AE00007C00FE70393C000C7D3F0038800B001493E100E1 -S31AFE00E6C3089361000C7FC3F3783881000838A000017C0803A6C2 -S31AFE00E6D84E8000213D20000080093A002C000000418200384BA8 -S31AFE00E6EDFFF2C57C7D1B783C60FE0138633F044BFFD1497FE393 -S31AFE00E702FB783880000E4BFFDC15387F000E389BFFF24BFFDCDB -S31AFE00E717097FA3EB784BFFF301813E0000800900282C00000081 -S31AFE00E72C4182005C3C60000038633708389F001E38A000044B23 -S31AFE00E741FFD3752C03000041820040815E00007FC3F378812A0F -S31AFE00E75600287F64DB78800900043D60FE017C0803A683AA00C9 -S31AFE00E76B14396BE5F03D20000093E939F4916A00144E80002104 -S31AFE00E780813E000093A900142C1C0000418200183C600000931F -S31AFE00E7957C0008386339E87F84E3784BFFF93D800100A47C08A4 -S31AFE00E7AA03A68361008C8381009083A1009483C1009883E100B1 -S31AFE00E7BF9C382100A04E8000209421FFF87C0802A69001000C49 -S31AFE00E7D43D20000080693A0481630000800B00207C0803A64E9E -S31AFE00E7E98000218001000C7C0803A6382100084E8000209421B8 -S31AFE00E7FEFFF87C0802A69001000C7C641B783C60FE0138633F5A -S31AFE00E813144BFFD0318001000C7C0803A6382100084E80002084 -S31AFE00E8289421FFF07C0802A693E1000C900100143D2000013B49 -S31AFE00E83DE91F1C801F001C2C0000004082002C90691F1C909F66 -S31AFE00E85200044800049D7C631B794082001C801F00083920006F -S31AFE00E867017C0000D0913F001C901F0010386000008001001473 -S31AFE00E87C7C0803A683E1000C382100104E8000203D20000139F8 -S31AFE00E891291F1C8009001C7C6B1B782C0000004082000C386059 -S31AFE00E8A600074E800020800900147C0B004041800014800900A2 -S31AFE00E8BB18386000007C0B00404D800020386000014E80002059 -S31AFE00E8D03D20000139691F1C800B001C2C0000004182001C81C1 -S31AFE00E8E52B00143860000091240000800B0018900500004E8088 -S31AFE00E8FA0020386000074E8000203D20000139691F1C800B0092 -S31AFE00E90F1C7C6A1B782C0000004182001C812B00083860000003 -S31AFE00E924912A0000800B000C900400004E800020386000074E19 -S31AFE00E9398000209421FFD87C0802A69321000C934100109361D5 -S31AFE00E94E00149381001893A1001C93C1002093E1002490010083 -S31AFE00E9632C3D20000180091F387C7F1B782C0000007C9E2378C2 -S31AFE00E9787CBA2B783B8000004082000C38600007480000F83D08 -S31AFE00E98D20000183A91F1C3C80FE013CA0FE013884EF1C38A5AF -S31AFE00E9A2F0447CA428507FA3EB784BFFC6957CBFF214380000ED -S31AFE00E9B7807C0903A639200000612010003D600E007C0004ACD8 -S31AFE00E9CC7D398BA67D788BA67C198BA67D788BA6392900104285 -S31AFE00E9E100FFE03C0004004C00012C7C108BA64C00012C3D20F2 -S31AFE00E9F6000139291F1C800900107CBE2B783C60FE017FFF00DB -S31AFE00EA0B383F20FE017D3B4B7838633F507FE4FB784BFFCE29A0 -S31AFE00EA204800001C801B000838793F685400F87E7C0002147FA3 -S31AFE00EA35FF02144BFFCE0D7C1FF040408000207FE3FB787FA8E7 -S31AFE00EA4A03A64E800021480003657C7C1B794182FFCC93FA00C4 -S31AFE00EA5F003C0002004C00012C7C108BA64C00012C3C60FE0116 -S31AFE00EA7438633F6C4BFFCDCD7F83E3788001002C7C0803A683A5 -S31AFE00EA8921000C83410010836100148381001883A1001C83C1DB -S31AFE00EA9E002083E10024382100284E8000209421FFD07C08023E -S31AFE00EAB3A692E1000C9301001093210014934100189361001CBD -S31AFE00EAC89381002093A1002493C1002893E1002C900100343D8B -S31AFE00EADD600001392B1F1C8009001C7CBE2B782C0000007CD81E -S31AFE00EAF233787C7C1B787C9D23783B4000004082000C38600040 -S31AFE00EB07074800011C836B1F1C3C80FE013CA0FE013884F044DA -S31AFE00EB1C38A5F1887CA428507F63DB784BFFC5197CBDF214381E -S31AFE00EB310000807C0903A639200000612010003D600E007C000C -S31AFE00EB4604AC7D398BA67D788BA67C198BA67D788BA6392900AB -S31AFE00EB5B104200FFE03C0004004C00012C7C108BA64C00012C81 -S31AFE00EB703C60FE0138633F707FA4EB787F86E3784BFFCCC53DA9 -S31AFE00EB852000013EE0FE013B291F1C4800002038773F684BFF92 -S31AFE00EB9ACCAD57E0F87E7C0002147FBD02147FDFF0507F9C029D -S31AFE00EBAF142C1E000040810050801900087FC5F3787F8500008A -S31AFE00EBC47F83E3787FA4EB784FFEE3827D200026552907FE7DE0 -S31AFE00EBD92900D07C0048787CA948387D2503787F6803A67CBF61 -S31AFE00EBEE2B784E800021480001C17C7A1B794182FF9893980063 -S31AFE00EC03003C0002004C00012C7C108BA64C00012C3C60FE0170 -S31AFE00EC1838633F6C4BFFCC297F43D378800100347C0803A682ED -S31AFE00EC2DE1000C8301001083210014834100188361001C8381B5 -S31AFE00EC42002083A1002483C1002883E1002C382100304E8000FE -S31AFE00EC572028030007418100883D60FE01396B40805460103A0A -S31AFE00EC6C7D4B002E3D20FE01392940807D4A4A147D4903A64E39 -S31AFE00EC818004203C60FE0138633F904E8000203C60FE013863AD -S31AFE00EC963FB04E8000203C60FE0138633FC84E8000203C60FEC3 -S31AFE00ECAB0138633FE04E8000203C60FE0138633FFC4E80002048 -S31AFE00ECC03C60FE01386340144E8000203C60FE01386340244EDB -S31AFE00ECD58000203C60FE01386340484E8000203C60FE013863A4 -S31AFE00ECEA406C4E8000209421FFE07C0802A693A1001493C1001B -S31AFE00ECFF1893E1001C900100243D20000183E91F1C3C80FE01DF -S31AFE00ED143CA0FE013884EE8038A5EF1C7CA428507FE3FB784B41 -S31AFE00ED29FFC3193FC000013BA0000838610008380000807C0935 -S31AFE00ED3E03A639200000612010003D600E007C0004AC7D398B11 -S31AFE00ED53A67D788BA67C198BA67D788BA6392900104200FFE05C -S31AFE00ED687FE803A64E8000217D3DF1D63D600001396B1F1C3D58 -S31AFE00ED7D29FE003C00FE00912B0018900B001493CB000893ABF5 -S31AFE00ED92000C38600000800100247C0803A683A1001483C10076 -S31AFE00EDA71883E1001C382100204E8000209421FFF07C0802A684 -S31AFE00EDBC93E1000C900100143C00007E7C7F1B786000007E7F74 -S31AFE00EDD1E90039418200503C60FE01386340A07FE4FB784BFFBE -S31AFE00EDE6CA613C000010600000107FE90039386000044082002E -S31AFE00EDFB303C600020606300207FE318387C6300D07C63FE7082 -S31AFE00EE107C6018F8546307BC540007387C63037848000008380E -S31AFE00EE25600000800100147C0803A683E1000C382100104E800B -S31AFE00EE3A00203D20FE00392920007C0348407C8023783960008B -S31AFE00EE4F004181000C7C0048404181001C3D20FE0138891D4C74 -S31AFE00EE647C032040418100107C00204040810008396000017D28 -S31AFE00EE79635B784E8000207D588AA6554A0FFE2C0A00004182B2 -S31AFE00EE8E0040380000807C0903A639200000612010003D600EB0 -S31AFE00EEA3007C0004AC7D398BA67D788BA67C198BA67D788BA631 -S31AFE00EEB8392900104200FFE03C0004007C0004AC7C188BA63D40 -S31AFE00EECD60FE00380000AA980B055539200055992B02AA380099 -S31AFE00EEE20090980B0555892B00002C0A000099230000880B0051 -S31AFE00EEF701392000FF98030001992B0000418200103D600200D7 -S31AFE00EF0C7C0004AC7D788BA6386000004E8000207C6A1B787C1F -S31AFE00EF21F88AA654E70FFE2C07000041820040380000807C09F4 -S31AFE00EF3603A639200000612010003D600E007C0004AC7D398B17 -S31AFE00EF4BA67D788BA67C198BA67D788BA6392900104200FFE062 -S31AFE00EF603C0004007C0004AC7C188BA655480010396000AA99DE -S31AFE00EF7568055539200055992802AA38000080980805559968F3 -S31AFE00EF8A0555992802AA392000327D2903A62F870000380000DF -S31AFE00EF9F30980A0000396A0001420000003D20004C7D2903A6A9 -S31AFE00EFB4880A00005400067261294B407D2903A65400063E8862 -S31AFE00EFC96A0000546906727C09000041820014706000207D20A7 -S31AFE00EFDE4B78408200084200FFE4380000FF98080000892A00DE -S31AFE00EFF3007D6A5B782C0900FF3D2000014082001C3529FFFF7F -S31AFE00F00840810014880A0000394A00012C0000FF4182FFEC7DAE -S31AFE00F01D2BFE707D604A787C0058507C00FE707C6300384D9E92 -S31AFE00F03200203C0002007C0004AC7C188BA64E8000209421FFD4 -S31AFE00F047F093C1000893E1000C7D588AA6554A0FFE2C0A0000FD -S31AFE00F05C41820040380000807C0903A639200000612010003D8B -S31AFE00F071000E007C0004AC7D398BA67D188BA67C198BA67D1844 -S31AFE00F0868BA6392900104200FFE03D2004007C0004AC7D388BE0 -S31AFE00F09BA62C0500002F8A0000546A0010408100A03BC000AAF8 -S31AFE00F0B03BE00055398000A038C000FF9BCA05559BEA02AA99FE -S31AFE00F0C58A0555880400003920003198030000380000327C09AE -S31AFE00F0DA03A63904000138E300013929FFFF4200FFFC880300F2 -S31AFE00F0EF007D2903A6540006725400063E896300005569067233 -S31AFE00F1047C09000041820014716000207D204B78408200084239 -S31AFE00F11900FFE498CA000089230000880400007D0443787C099F -S31AFE00F12E00007CE33B784182000C396000FF4800000C34A5FF23 -S31AFE00F143FF4181FF787CA8FE707D002A787C0040507C00FE70D4 -S31AFE00F158392000FF992A00007D6B0038419E00103D2002007C99 -S31AFE00F16D0004AC7D388BA67D635B7883C1000883E1000C38212B -S31AFE00F18200104E8000209421FFF87C0802A69001000C3803FFC7 -S31AFE00F197FE2800001D418100A03D60FE01396B40B05400103AEC -S31AFE00F1AC7D4B002E3D20FE01392940B07D4A4A147D4903A64EC4 -S31AFE00F1C18004203860000248000078386000414BFFA29154632A -S31AFE00F1D67F3E2C0300024182004028030002418100102C030001 -S31AFE00F1EB01418200384800004C2C030004418200242C0300082A -S31AFE00F2004082003C38600008480000383860000E480000303881 -S31AFE00F21560000C4800002838600004480000203860000548001B -S31AFE00F22A00183860000A480000103860000B480000083860002E -S31AFE00F23F0F8001000C7C0803A6382100084E8000203D20000041 -S31AFE00F254816939A0806B00985463C23E4E8000209421FFF87C8E -S31AFE00F2690802A69001000C7C641B78386000404BFFA1FD80018B -S31AFE00F27E000C7C0803A6382100084E8000209421FFF87C0802BD -S31AFE00F293A69001000C386000414BFFA1C56064060054800420D4 -S31AFE00F2A83D2000005484045E900936F0386000414BFFA1BD80F6 -S31AFE00F2BD01000C7C0803A6382100084E8000209421FFF87C087F -S31AFE00F2D202A69001000C386000414BFFA1853D200000808936F9 -S31AFE00F2E7F0546305E8380000007C642378900936F0386000412F -S31AFE00F2FC4BFFA1798001000C7C0803A6382100084E8000204E3E -S31AFE00F3118000204E8000209421FFF87C0802A69001000C386048 -S31AFE00F32600404BFFA1393D20FE0139299D387C634A7820030013 -S31AFE00F33B007C6019148001000C7C0803A6382100084E800020A7 -S31AFE00F3509421FFF87C0802A69001000C386000404BFFA1013833 -S31AFE00F365830004386000404BFFA1098001000C7C0803A6382129 -S31AFE00F37A00084E8000209421FFF87C0802A69001000C3D2000B2 -S31AFE00F38F00800936F42C0000004082001038000001900936F4B8 -S31AFE00F3A4480008118001000C7C0803A6382100084E8000203DA9 -S31AFE00F3B9200000800936F82C0000004C82002038000001900978 -S31AFE00F3CE36F87D1E9AA67508FFFF3D2000017D2903A63800803D -S31AFE00F3E301B00809C07C0902A6600086A07C0903A6420000006C -S31AFE00F3F880080ABC3D600001600000C090080ABC81280AB861C6 -S31AFE00F40D6B00A2552906AE91280AB8916809F07CE902A690E8B5 -S31AFE00F4220AE038002800B0083E8039683E8038002808B00B008F -S31AFE00F4370239200091B12809C03940000191480030380000185B -S31AFE00F44C980B0004980B0005B14B0006B0EB0028B0EB002CB01C -S31AFE00F461EB002EB14B003039282800B0E900023800B000B00889 -S31AFE00F476280038082810900900043968280838082820B14B00EB -S31AFE00F48B02900B000439202000B1282808380000FF98080A86DE -S31AFE00F4A03920000599280A8A38004820B0080A8239204823B147 -S31AFE00F4B5280A824E80002039233E80A00900207D4302147D4B1B -S31AFE00F4CA5378A00A00007008800041820028A00A00007008208F -S31AFE00F4DF0041820010A00900027D43021448000008394A0008E5 -S31AFE00F4F47C0A58004082FFD47D495378A0090000700080004022 -S31AFE00F50982FFF87D2A4B787C090378A00A0000700B100041820E -S31AFE00F51E0014A00A00007000EFFFB00A0000B12A0002A12A0056 -S31AFE00F533023900000038090001B00A0002816A00045529043ED7 -S31AFE00F5487C8B49AEA00A000060008000B00A0000A12A0000712C -S31AFE00F55D208000418200647D4B53787D0A43783D00000761084C -S31AFE00F572FFFF394A00017C0A400040820038A1230A8239400075 -S31AFE00F587007129FFFDB1230A82A00B00005400047EB00B000039 -S31AFE00F59CA1230A8261290002B1230A82A00B000060008000B0DF -S31AFE00F5B10B0000A00B0000700980004082FFB87D6A5B787D4999 -S31AFE00F5C65378A0090000700080004082FFF87D2A4B78B00A00EB -S31AFE00F5DB024E80002038E33E80A10700107C03422E7D43421491 -S31AFE00F5F0700680004182000C386000004E800020812A000439CF -S31AFE00F6056000008809000098040000B0CA0002812A0004996932 -S31AFE00F61A00007C03422E600080007C03432E7D388AA655290FA6 -S31AFE00F62FFE2C09000041820028812A0004A00700062C0000001C -S31AFE00F644408100187C004BAC7C0004AC3400FFF039290010415F -S31AFE00F65981FFF0386000014E8000209421FFE87C0802A693E165 -S31AFE00F66E00149001001C7C7F1B787FE3FB78388100084BFFFF55 -S31AFE00F683612C0300004182FFF0886100088001001C7C0803A671 -S31AFE00F69883E10014382100184E8000209421FFE87C0802A69327 -S31AFE00F6ADA1000C93C1001093E100149001001C7CBF2B787FE0C1 -S31AFE00F6C2FB782C0000007C7D1B787C9E23783BFFFFFF41820054 -S31AFE00F6D724889E00007FA3EB784BFFFDDD7FE0FB782C00000029 -S31AFE00F6EC3BDE00013BFFFFFF4082FFE48001001C7C0803A683C1 -S31AFE00F701A1000C83C1001083E10014382100184E800020942162 -S31AFE00F716FFE87C0802A693A1000C93C1001093E100149001000A -S31AFE00F72B1C7CBF2B787FE0FB782C0000007C7D1B787C9E23788C -S31AFE00F7403BFFFFFF418200247FA3EB784BFFFF197FE0FB782CAC -S31AFE00F755000000987E00003BDE00013BFFFFFF4082FFE480010D -S31AFE00F76A001C7C0803A683A1000C83C1001083E10014382100E8 -S31AFE00F77F184E8000209421FFE87C0802A69381000893A1000C47 -S31AFE00F79493C1001093E100149001001C3D200000800936FC3D6E -S31AFE00F7A96000001FE0000A3B8B32007C7D1B787C9E237848005D -S31AFE00F7BE0014813C0048386000647D2803A64E8000217FA3EBD3 -S31AFE00F7D3787FC4F3784BFFFE097C631B79408200102C1F000016 -S31AFE00F7E83BFFFFFF4082FFD48001001C7C0803A68381000883E2 -S31AFE00F7FDA1000C83C1001083E10014382100184E800020942166 -S31AFE00F812FF807C8023782C00000590A1001090C1001490E1007F -S31AFE00F827189101001C91210020914100249081000C3860000085 -S31AFE00F83C4182002C28000005418100102C000004418201444845 -S31AFE00F8510002B42C000006418202782C000007418202784800C1 -S31AFE00F86602A03D60FE01800B41FC3D20FE01392941287D2902B4 -S31AFE00F87B147D2903A64E8004203D20FF0061290014800900009C -S31AFE00F8907C0006AC60000400900900007C0006AC480000E03DA1 -S31AFE00F8A520FF0061290200A00900007C0006AC60000008B009A7 -S31AFE00F8BA00007C0006AC480000C03D20FF0061290200A009006E -S31AFE00F8CF007C0006AC60000004B00900007C0006AC480000A0BF -S31AFE00F8E43D20FF0061290240A00900007C0006AC60000004B0F8 -S31AFE00F8F90900007C0006AC480000803D20FF0061290220A00946 -S31AFE00F90E00007C0006AC60000008B00900007C0006AC4800001B -S31AFE00F923603D20FF0061290220A00900007C0006AC6000000428 -S31AFE00F938B00900007C0006AC480000403D20FF00612909408098 -S31AFE00F94D0900007C0006AC60000080900900007C0006AC48007B -S31AFE00F96200203D20FF0061290948800900007C0006AC6000001E -S31AFE00F97710900900007C0006AC3D20000038000001900937003A -S31AFE00F98C480001783D2000008069370038000000900937003DDF -S31AFE00F9A160FE01800B42E43D20FE01392942107D2902147D29CB -S31AFE00F9B603A64E8004203D20FF0061290014800900007C000698 -S31AFE00F9CBAC540005A8900900007C0006AC4800012C3D20FF00DE -S31AFE00F9E061290200A00900007C0006AC7000FFF75400043EB0FF -S31AFE00F9F50900007C0006AC480001083D20FF0061290200A009E0 -S31AFE00FA0A00007C0006AC7000FFFB5400043EB00900007C00067A -S31AFE00FA1FAC480000E43D20FF0061290240A00900007C0006ACF7 -S31AFE00FA347000FFFB5400043EB00900007C0006AC480000C03D8D -S31AFE00FA4920FF0061290220A00900007C0006AC7000FFF7540048 -S31AFE00FA5E043EB00900007C0006AC4800009C3D20FF006129029A -S31AFE00FA7320A00900007C0006AC7000FFFB5400043EB0090000CA -S31AFE00FA887C0006AC480000783D20FF0061290940800900007C43 -S31AFE00FA9D0006AC5400066E900900007C0006AC480000583D2012 -S31AFE00FAB2FF0061290948800900007C0006AC5400073490090082 -S31AFE00FAC7007C0006AC4800003838600036480000303961000890 -S31AFE00FADC380100883920000398610071992100709001007491CA -S31AFE00FAF16100783D200000800B0008806936FC900936FC3821F4 -S31AFE00FB0600804E8000209421FFE87C0802A693C1001093E100D8 -S31AFE00FB1B149001001C7C9E2378392000007C7F1B78913E0000A5 -S31AFE00FB30881F0A86700B00014182006038000001981F0A86A1C5 -S31AFE00FB453F2800391F2800712080004082003C8128000439408B -S31AFE00FB5A0001880900003960B00098010008B1480002B17F28C3 -S31AFE00FB6F0038610008388000014BFFB3A92C0300004182000C7F -S31AFE00FB8438000001901E000038000010901F094C392000017D5E -S31AFE00FB99234B788001001C7C0803A683C1001083E1001438217E -S31AFE00FBAE00184E8000209421FFF07C0802A693C1000893E10098 -S31AFE00FBC30C900100143D2000003BE93200813F00343860FFFF3B -S31AFE00FBD87D2803A64E8000217C7E1B787C1E9AA67400FFFF3DC1 -S31AFE00FBED200000800937042C00000040820094380000019009C7 -S31AFE00FC0237044BFFF7B5813F0034386000007D2803A64E800010 -S31AFE00FC1721815F00147C1E9AA67400FFFF3D20FE01900A00007D -S31AFE00FC2C3929F6A4912A00043D60FE01396BF7143D20FE0191CC -S31AFE00FC416A00083929F4BC912A000C3D60FE01396BF6643D2068 -S31AFE00FC56FE01916A00103929F810912A00143D60FE01396BFB17 -S31AFE00FC6B0C3D20FE01916A00183929F784912A001C801F00347E -S31AFE00FC807FC3F3787C0803A64E800021800100147C0803A6835D -S31AFE00FC95C1000883E1000C382100104E8000209421FFF07C089E -S31AFE00FCAA02A693E1000C900100143D20000080693A087C9F23AE -S31AFE00FCBF782C030000418200084BFFB379881F00002C0000026F -S31AFE00FCD44082002C3C800000388439F8387F001C38A000064B84 -S31AFE00FCE9FFBDCD2C03000040820010801F00103D2000009009D3 -S31AFE00FCFE3708800100147C0803A683E1000C382100104E800045 -S31AFE00FD13209421FE887C0802A69321015C9341016093610164B1 -S31AFE00FD289381016893A1016C93C1017093E101749001017C3DAB -S31AFE00FD3D20000090693A08386100187C791B783880000038A089 -S31AFE00FD52012C4BFFB3C53D200000808939F8396939F8A06B0034 -S31AFE00FD67043D201234394000003CE0000038C00001612955551A -S31AFE00FD7C396000063907370898C100199961001A9121001C9963 -S31AFE00FD9147370899480003380000FF90810034B0610038980191 -S31AFE00FDA6015198C1001899480001994800023CA0FE017D1D4304 -S31AFE00FDBB7838A5FCA498010148980101499801014A9801014BAC -S31AFE00FDD09801014C9801014D9801014E9801014F98010150385A -S31AFE00FDE561000838800044480000D53B8000023B4101483F6062 -S31AFE00FDFA000048001F0D7C7E1B787F23CB783880012C7F45D38E -S31AFE00FE0F7838C0004338E000444800024948000AA1881B370863 -S31AFE00FE242C00000040820028881D00012C0000004082001C8877 -S31AFE00FE391D00022C000000408200108BFD00032C1F00004182FA -S31AFE00FE4E001438600044480000BD386000004800003848001E28 -S31AFE00FE63A97C7E1850280307CF4081FFB07F80E3782C00000084 -S31AFE00FE783B9CFFFF4181FF80386000444800008D3D20000093BA -S31AFE00FE8DE93A003860FFFF8001017C7C0803A68321015C8341B3 -S31AFE00FEA20160836101648381016883A1016C83C1017083E10185 -S31AFE00FEB774382101784E8000203D20000081293A0C2C0900007C -S31AFE00FECC41820024A00900047C0020004082000C3860FFFF4E3B -S31AFE00FEE1800020812900002C0900004082FFE43D2000008009FE -S31AFE00FEF63A0C90693A0CB083000490A3000890030000386000D1 -S31AFE00FF0B004E8000203D20000081293A0C396000002C090000D4 -S31AFE00FF204D8200207D2A4B78A00900047C0018004082001C2C24 -S31AFE00FF350B00004182001080090000900B000048000008814997 -S31AFE00FF4A00007D2B4B78812900002C0900004082FFD03D200066 -S31AFE00FF5F0091493A0C4E8000209421FFE87C0802A69381000897 -S31AFE00FF7493A1000C93C1001093E100149001001C7C7E1B78838B -S31AFE00FF89FE000838000000A13F00066000FFFF7C090000817E59 -S31AFE00FF9E00047C9C23784082000C38000000B01F0006A01F00F9 -S31AFE00FFB3047D635B78B00B0002A3BF0004480008CD7C651B78CA -S31AFE00FFC87FA4EB787FE3FB78480008512C030000408200603D96 -S31AFE00FFDD20000081693A0C2C0B000041820050A12B0004A01FE2 -S31AFE00FFF200027C09000040820034A0BF0004800B00087D635B48 -S31AFE0100077838A5FFF87F86E378A0FF0000389F00087C0803A688 -S31AFE01001C4E8000217FC3F378480007D948000018816B00002C8E -S31AFE0100310B00004082FFB87FC3F378480007C18001001C7C0853 -S31AFE01004603A68381000883A1000C83C1001083E1001438210096 -S31AFE01005B184E8000209421FFD87C0802A6930100089321000C71 -S31AFE01007093410010936100149381001893A1001C93C100209307 -S31AFE010085E100249001002C7C9C2378281C05C07C791B787CB827 -S31AFE01009A2B787CDA33787CFE3B78418100A8386005EA4800063C -S31AFE0100AFED7C7F1B794182009883BF0008381C0008837F0004B4 -S31AFE0100C4B01F000CB3DD0000B35D0002A01F000C392000007F02 -S31AFE0100D985E378B01D0004B13D00067F24CB78387D00084BFF7B -S31AFE0100EEAF553D2000008009370839600011901B000C813800B5 -S31AFE01010300997B0009913B0010A01D00047F63DB78B01B000226 -S31AFE010118A39F000C480007717C651B787F84E3787FA3EB784820 -S31AFE01012D0006F5B07D00067F05C3787FE3FB78388000114800E5 -S31AFE01014204457FE3FB78480006B58001002C7C0803A683010024 -S31AFE010157088321000C83410010836100148381001883A1001CAE -S31AFE01016C83C1002083E10024382100284E8000209421FFD87C16 -S31AFE0101810802A69381001893A1001C93C1002093E1002490019B -S31AFE010196002C7CBF2B787C7D1B787C9C23787CDE33787FE3FBA4 -S31AFE0101AB783881000848001A252C03000041800024A0DF0004E3 -S31AFE0101C0A0FE00047FA3EB787F84E37838A100084BFFFE9138AE -S31AFE0101D56000004800001C3C60FE013C80FE01386342F8388465 -S31AFE0101EA431C4BFFB6593860FFFF8001002C7C0803A6838100CF -S31AFE0101FF1883A1001C83C1002083E10024382100284E80002033 -S31AFE0102149421FFE87C0802A69381000893A1000C93C1001093B5 -S31AFE010229E100149001001C3F8000007CBF2B783D200000807C23 -S31AFE01023E3A107CDD33787CFE3B7893E93A144BFFADF53D200018 -S31AFE0102530081693A182C0B00004182001CB3CB0004801D000020 -S31AFE01026839200000900B0000913C3A10480000143C60FE013842 -S31AFE01027D63432C7FE4FB784BFFB5C18001001C7C0803A6838131 -S31AFE010292000883A1000C83C1001083E10014382100184E80000F -S31AFE0102A7209421FFD07C0802A6934100189361001C938100203D -S31AFE0102BC93A1002493C1002893E1002C90010034A3A600047C26 -S31AFE0102D1BA2B787C7E1B787C9C23783CA0FE017CFF3B7838A590 -S31AFE0102E60214386100087FA4EB784BFFFBD12C030000408000BC -S31AFE0102FB0C3860FFFF48000084813F00043C001062817F000009 -S31AFE01031060004DD37D2900161D6B03E85529D1BE7F6B4A143D92 -S31AFE0103254000003D2000003D60000093CA3A1093893A14934B95 -S31AFE01033A3A18480019CD7FBAEB787C7E1B783BE0FFFF3FA00008 -S31AFE01034F003F800000480019B57C7E18507C03D84040800018EE -S31AFE01036448000559801D3A102C0000004082FFE483FC3A147FD5 -S31AFE01037943D3784BFFFB957FE3FB78800100347C0803A6834187 -S31AFE01038E00188361001C8381002083A1002483C1002883E10001 -S31AFE0103A32C382100304E8000209421FFF07C0802A693E1000C4D -S31AFE0103B8900100147C691B78880900002C0000FF4082002C88DC -S31AFE0103CD0900012C0000FF40820020880900022C0000FF40827F -S31AFE0103E2001488090003386000012C0000FF418200643FE0004F -S31AFE0103F7007D234B78389F370838A000044BFFB6B12C030000B7 -S31AFE01040C4082000C3860000148000040881F3708389F37082CBF -S31AFE0104210000004082002C880400012C000000408200208804AC -S31AFE01043600022C0000004082001488040003386000012C000054 -S31AFE01044B004182000838600000800100147C0803A683E1000C02 -S31AFE010460382100104E8000209421FFD87C0802A693A1001C9390 -S31AFE010475C1002093E100249001002C7C7E1B7883FE00047C9D0C -S31AFE01048A2378387F00104BFFFF1D2C03000041820020A09F003F -S31AFE01049F007FE3FB785484D6BA38A00000480003752C0300003F -S31AFE0104B4418200107FC3F37848000341480000A8801F000C8106 -S31AFE0104C93D0000A17D0004900100089121000CB1610010A13F61 -S31AFE0104DE0000A01F00025523D6BA7C030050B01E000C881F00EB -S31AFE0104F3092C00000641820038418100102C00000141820014E3 -S31AFE010508480000582C000011418200384800004C7C1F1A149014 -S31AFE01051D1E00087FC3F37838810008480005054800003C7C1FBF -S31AFE0105321A14901E00087FC3F3783881000848000AE5480000DE -S31AFE010547247C1F1A14901E00087FC3F378388100084BFFFA1134 -S31AFE01055C4800000C7FC3F378480002998001002C7C0803A68344 -S31AFE010571A1001C83C1002083E10024382100284E8000209421A3 -S31AFE010586FFE07C0802A69361000C9381001093A1001493C10090 -S31AFE01059B1893E1001C900100247C7C1B7883BC000480FC000897 -S31AFE0105B0A13C000C7CFD38507D293A14B13C000CA01D00005449 -S31AFE0105C5E9352E5400053E600040007000F0FF7C004B78B01D2E -S31AFE0105DA000039200000993D00013D000000A1283A1CA01C00BF -S31AFE0105EF0CB13D0004B01D000239690001B1683A1C394000009A -S31AFE01060438000040989D0009981D0008B15D000AB15D00063D00 -S31AFE010619200000800937087CBB2B78901D000C813B00007CE430 -S31AFE01062E3B78913D00107FA3EB7838A00000480001E5B07D0069 -S31AFE0106430A7F83E378389B000438A0080048000371800100241E -S31AFE0106587C0803A68361000C8381001083A1001483C100188340 -S31AFE01066DE1001C382100204E8000203D000000800837182C00CF -S31AFE01068200004C8200203800000190083718380000047C09038C -S31AFE010697A63C8000003D2000013D60000181443A2038A901C02A -S31AFE0106AC390B017038C005EA38E000007D272A147120000239D2 -S31AFE0106C1690002914800007C00002654001FFE7C0000D07D6B94 -S31AFE0106D600787D2900387D295B78912800107D0A4378B0C800B8 -S31AFE0106EB0E390A001438E705EC4200FFC491443A204E8000205E -S31AFE0107009421FFE87C0802A69381000893A1000C93C1001093C4 -S31AFE010715E100149001001C3D2000013BE901703BC000003F807B -S31AFE01072AFE017FFDFB7880DF0010A0FF000EA11F000C813F001F -S31AFE01073F007FC4F3787FA5EB78387C43584BFFB0F93BDE00010F -S31AFE0107542C1E00033BFF00143BBD00144081FFD03D2000003CBB -S31AFE01076960FE0180893A20386343844BFFB0D18001001C7C0866 -S31AFE01077E03A68381000883A1000C83C1001083E1001438210057 -S31AFE010793184E8000203CA0000080653A202C0300004D8200200D -S31AFE0107A83CE00000814737103D20000080093714394A00017CDB -S31AFE0107BDC050503C8000008164370C8103001080030000392866 -S31AFE0107D2001490053A207C0658009123000891030004380000A4 -S31AFE0107E700B003000C914737104C81002090C4370C4E800020A8 -S31AFE0107FC3D400000812A37103D600000800B3A203929FFFF9101 -S31AFE0108112A3710906B3A20900300004E8000203484FFFE418010 -S31AFE0108260018A00300003484FFFE7CA50214386300024080FFB5 -S31AFE01083BF02C04FFFF40820010880300005400402E7CA502142F -S31AFE01085054AB043E54A9843E380000007CA95A146000FFFF7CE9 -S31AFE0108650500004081000C3D25FFFF38A900017CA928F85523A8 -S31AFE01087AC63E5463402E5520063E7C031B784E800020A12300BE -S31AFE01088F0EA003000CA16300107C004A14A143001289230009F9 -S31AFE0108A47C005A147C005214A06300027C004A147C601A144E37 -S31AFE0108B98000209421FFD87C0802A69381001893A1001C93C1FD -S31AFE0108CE002093E100249001002C3F8000003FA000003FC000FE -S31AFE0108E300386005EA4BFFFEB17C7F1B79408200183C60FE0177 -S31AFE0108F8386343944BFFAF494BFFFE0148000000809F0010383A -S31AFE01090D61000838A005EA4BFFDB8D5460043E2C000000B07F9D -S31AFE010922000C41820074A0010014813C37242C00080039290015 -S31AFE01093701913C3724418200182C000806418200347FE3FB789C -S31AFE01094C4BFFFEB14BFFFF94813D371C801F0010392900019107 -S31AFE0109613D371C901F00047FE3FB783881000E4BFFFAF94BFF16 -S31AFE010976FF70813E3720801F001039290001913E3720901F00FB -S31AFE01098B047FE3FB7848000F9D4BFFFF507FE3FB784BFFFE616E -S31AFE0109A08001002C7C0803A68381001883A1001C83C100208320 -S31AFE0109B5E10024382100284E8000209421FFE87C0802A690015B -S31AFE0109CA001C80040000A144000490010008390100083D200052 -S31AFE0109DF00B1480004396939F8A14B0004B0A10014800939F81F -S31AFE0109F4A0A3000C808300109001000EB14100127D0343784B5E -S31AFE010A09FFD83D3D600000812B372839290001912B3728800118 -S31AFE010A1E001C7C0803A6382100184E8000209421FFF07C0802EC -S31AFE010A33A693C1000893E1000C900100147C7F1B78807F0008ED -S31AFE010A487C9E2378A00300002C00080040820050A09F000C3873 -S31AFE010A5DA000004BFFFDC17C631B794082003C813F000838A0C6 -S31AFE010A72000098690000817F0008B06B0002807F0008A09F00FE -S31AFE010A870C4BFFFD99813F00087FC5F378B06900027FE3FB7802 -S31AFE010A9C388000014BFFFAE57FE3FB784BFFFD55800100147CDC -S31AFE010AB10803A683C1000883E1000C382100104E8000209421B2 -S31AFE010AC6FFD87C0802A693410010936100149381001893A100C7 -S31AFE010ADB1C93C1002093E100249001002C7C9B23787C7E1B78DD -S31AFE010AF0736000023B9E002C83BC000483FC00087CBA2B78412E -S31AFE010B0582004438000018B01C000C813F000C396000065169C3 -S31AFE010B1AE0063C000204913F000C600005B490010008387F0054 -S31AFE010B2F143881000838A000044BFFA50938000000B01E0016E7 -S31AFE010B4448000020A13E00163960000539290014B13C000C80AD -S31AFE010B591F000C5160E006901F000C801F000C39600000516010 -S31AFE010B6EC10E901F000C813E00542C1A0000913F0004801E0018 -S31AFE010B8350B17F0010901F000840820054A01E0012B01F00005C -S31AFE010B98A13E00149B7F000DB13F0002A01E00162C00000041F6 -S31AFE010BAD82000C63600008981F000D380005B4B01F000EB35F31 -S31AFE010BC200123D2000008009370839600006901D000C813E00CB -S31AFE010BD708997D0009913D0010A01C000C7FA3EB78B01D0002E3 -S31AFE010BECA3BC000C4BFFFC9D7C651B787FA4EB787FE3FB784B87 -S31AFE010C01FFFC21B07F00107F83E3783880000638BE00084BFF1B -S31AFE010C16F971801E00042C00000A408200243C8000013CA0FE05 -S31AFE010C2B0138A50E187FC6F378387E00186084D4C048000B5D05 -S31AFE010C4048000034881F000D7009000340820010A01E00162C1C -S31AFE010C550000004182001C3CA0FE0138A50DF07FC6F378387E8B -S31AFE010C6A0018388003E848000B298001002C7C0803A68341009B -S31AFE010C7F10836100148381001883A1001C83C1002083E100240B -S31AFE010C94382100284E8000209421FFE07C0802A69361000C9384 -S31AFE010CA981001093A1001493C1001893E1001C900100247C7CAF -S31AFE010CBE1B7883FC0008815C0004A0DF0000A0FF0002807F0002 -S31AFE010CD30480BF000839000014B11C000C3BEA0014801F000CB2 -S31AFE010CE839200005396000005120E0065160C10E901F000C3930 -S31AFE010CFD200400B13F000EB17F0010B17F0012B0EA0014B0DFFC -S31AFE010D120002991F000D907F000890BF00043D20000080093779 -S31AFE010D27087C9B2378900A000C813B000038000006912A00108D -S31AFE010D3C980A0009A13C000C7D435378B12A0002A3BC000C4BEB -S31AFE010D51FFFB3D7C651B787FA4EB787FE3FB784BFFFAC1B07F4E -S31AFE010D6600107F83E3787F65DB78388000064BFFF8118001003D -S31AFE010D7B247C0803A68361000C8381001083A1001483C1001875 -S31AFE010D9083E1001C382100204E8000203D20000081293A2439C4 -S31AFE010DA56000002C0900004D8200207D2A4B787C0918004082E7 -S31AFE010DBA001C2C0B00004182001080090000900B00004800008D -S31AFE010DCF08814900007D2B4B78812900002C0900004082FFD459 -S31AFE010DE43D20000091493A244E8000209421FFF87C0802A6900A -S31AFE010DF901000C3880000038A000014BFFFCC18001000C7C082A -S31AFE010E0E03A6382100084E8000209421FFF87C0802A690010069 -S31AFE010E230C38000000900300044BFFFF718001000C7C0803A666 -S31AFE010E38382100084E8000209421FFF07C0802A693E1000C9071 -S31AFE010E4D0100147C7F1B784800001080030000901F00404BFFD4 -S31AFE010E62F99D807F00402C0300004082FFEC800100147C0803A9 -S31AFE010E77A683E1000C382100104E8000209421FFE87C0802A62C -S31AFE010E8C93A1000C93C1001093E100149001001C7C7D1B7838AF -S31AFE010EA1000000901D0004387D00184800097D7FA3EB784BFF1C -S31AFE010EB6FF8D7FA3EB784BFFFEE18001001C7C0803A683A100FA -S31AFE010ECB0C83C1001083E10014382100184E8000208124000829 -S31AFE010EE080E30050814900048009000CA164000C7D0750515458 -S31AFE010EF50036BA7D6058507D090214418100707C0A38507D60B5 -S31AFE010F0A58517D08021440810060814300407D275A142C0A001C -S31AFE010F1F0038000000912300509004000041820030800A00006B -S31AFE010F342C0000004182001C7D49537881290000800900002CA8 -S31AFE010F490000004082FFF47D2A4B78908A000048000010910369 -S31AFE010F5E00449083004091630048386000014E80002038600087 -S31AFE010F73004E8000209421FFF07C0802A693C1000893E1000CCA -S31AFE010F8890010014812400087C7F1B7883C90008801F00547DAB -S31AFE010F9D20F0514081006C387F001848000881811F0054A15F18 -S31AFE010FB200167D68F0505549043E7F8B48004FFEE3827C00008A -S31AFE010FC726540007FE7C0000D07D2900787D6B00387D6B4B795B -S31AFE010FDC408100307D2B50505525043E2C0500007C085A149053 -S31AFE010FF11F0054B13F001641820014807F0034386300147C83B5 -S31AFE0110065A144BFFA039800100147C0803A683C1000883E100CD -S31AFE01101B0C382100104E8000209421FFE07C0802A69361000C98 -S31AFE0110309381001093A1001493C1001893E1001C900100247C0D -S31AFE0110457C1B78807C0004A01C000C83FC0008B0030002A3BC1F -S31AFE01105A000C7C9E23784BFFF82D7C651B787FA4EB787FE3FBF5 -S31AFE01106F784BFFF7B12C0300003B600000408203A03D20000071 -S31AFE01108483A93A244800000883BD00002C1D00004182037CA10C -S31AFE0110993D0012A01F00027C0900004082FFE8A13D00142C09D8 -S31AFE0110AE000041820028A01F00007C0900004082FFD07FC3F333 -S31AFE0110C378389D000838A000044BFFA9E92C0300004082FFB85E -S31AFE0110D8801D0004817E0004A13E00082C000002917D000CB17A -S31AFE0110ED3D001041820024881F000D70090004418200187FA387 -S31AFE011102EB784BFFFD817F83E3784BFFF6F14800031C813D00F5 -S31AFE011117043809FFFF28000009418102FC3D60FE01396B43B84F -S31AFE01112C5400103A7D4B002E3D20FE01392943B87D4A4A147DBA -S31AFE0111414903A64E800420881F000D7009000241820040380046 -S31AFE0111560002901D0004813F0004A17F000039290001913D00B7 -S31AFE01116B50B17D0014801E000039200000901D0008B13D004CF2 -S31AFE0111807FA3EB78B13D001638800012480002247FC4F3787F67 -S31AFE01119583E3784BFFFB0548000280387D001848000685881F07 -S31AFE0111AA000D700900044182001038000001901D00044800029A -S31AFE0111BF6070090002408202387009001041820250813D00548F -S31AFE0111D4807F0008392900017C0348004082023C380000049004 -S31AFE0111E97D0054901D00044800022C881F000D83DD0050700917 -S31AFE0111FE0010418200107FA3EB787F84E3784BFFFD6D7FA3EB50 -S31AFE011213787F84E3784BFFFCC5881F000D7C7B1B787009000128 -S31AFE01122841820024807F0004801D00507C030000408200143848 -S31AFE01123D03000139200005901D0050913D0004801D00507C00FD -S31AFE011252F00040820010A01D004C2C000000418201BCA3FD006B -S31AFE011267162C1F000040820024387D0018480005B57FA3EB78D2 -S31AFE01127C3880001038A000004BFFF841B3FD004C480001903828 -S31AFE011291000001B01D004C48000184881F000D7009001041825C -S31AFE0112A601787FA3EB787F84E3784BFFFCC9813D0054801F0012 -S31AFE0112BB08392900017C0048004082015838000000901D0004E6 -S31AFE0112D07FA3EB784BFFFAC948000144881F000D700900104167 -S31AFE0112E58200607FA3EB787F84E3784BFFFC89813D0054801FAA -S31AFE0112FA0008392900017C00480040820040881F000D7009007C -S31AFE01130F014182002C813D00503800000A39290001913D005003 -S31AFE011324901D00047FA3EB783880001038A000004BFFF79148BF -S31AFE01133900000C38000008901D0004881F000D700900014182AC -S31AFE01134E00D0387D0018480004D5813D00503800000939290016 -S31AFE01136301913D0050901D00047FA3EB78388000114800003CCE -S31AFE0113787FA3EB787F84E3784BFFFB5D881F000D7C7B1B787028 -S31AFE01138D0900014182008C813D00503800000A39290001913D6C -S31AFE0113A20050901D00047FA3EB783880001038A000004BFFF7CA -S31AFE0113B71148000064881F000D70090010418200587FA3EB7882 -S31AFE0113CC7F84E3784BFFFBA9813D0054801F0008392900017C23 -S31AFE0113E100480040820038387D00184800043D3800000A901D6B -S31AFE0113F60004480000247FA3EB783880000038A000014BFFF617 -S31AFE01140BBD480000107FC4F3787F83E3784BFFF8852C1B000099 -S31AFE0114204082000C7F83E3784BFFF3D5800100247C0803A68320 -S31AFE01143561000C8381001083A1001483C1001883E1001C3821AF -S31AFE01144A00204E8000209421FFF87C0802A69001000C4BFFF4C7 -S31AFE01145F61480004218001000C7C0803A6382100084E8000209C -S31AFE0114749421FFE87C0802A69381000893A1000C93C100109343 -S31AFE011489E100149001001C7C7D1B787C9C23783880000038A0D8 -S31AFE01149E06444BFF9C793D600000810B3A24381D006C395D00AD -S31AFE0114B358901D0034915D003039200001380005EA93AB3A24AB -S31AFE0114C8913D0004B39D0012B01D003A911D0000915D003C38BF -S31AFE0114DD6000008001001C7C0803A68381000883A1000C83C14B -S31AFE0114F2001083E10014382100184E8000209421FFF07C0802CF -S31AFE011507A693E1000C900100147C7F1B78480000084BFFFF399F -S31AFE01151C801F00042C00000041820010A01F00162C00000040D2 -S31AFE01153182FFE8800100147C0803A683E1000C382100104E80CE -S31AFE01154600209421FFF07C0802A693E1000C900100147C7F1B60 -S31AFE01155B784BFFFFA5817F000469690004200900007D20491413 -S31AFE01157069600002214000007C0A01147D2A037941820020385C -S31AFE011585000007901F00047FE3FB783880001138A000004BFFD2 -S31AFE01159AF52D480000242C0B00054082001C38000006901F00A2 -S31AFE0115AF047FE3FB783880001138A000004BFFF5097FE3FB788B -S31AFE0115C44BFFF87D800100147C0803A683E1000C382100104E65 -S31AFE0115D98000209421FFE87C0802A69381000893A1000C93C1E0 -S31AFE0115EE001093E100149001001C7CBE2B797C7F1B787C9D23F6 -S31AFE0116037840810010801F00482C000000408200143860000003 -S31AFE011618480000B8907F0048480000AC3B800000480000648086 -S31AFE01162D9F00447FA3EB784BFF9A0D807F0040801F0048812380 -S31AFE01164200007FC0F050913F00407F9C02147FBD02144BFFF141 -S31AFE011657A9807F00402C0300004182FFBC81630008A123000C28 -S31AFE01166C800B000C540036BA7D204850913F0048800B000C5451 -S31AFE0116810036BA7D6B0214917F00442C1E00004182003C80BF85 -S31AFE01169600487C1E28004080FF90809F00447FA3EB787FC5F3C2 -S31AFE0116AB784BFF9995813F0044801F00487D29F2147C1E0050B4 -S31AFE0116C0901F0048913F00447F9CF2147F83E3788001001C7C6E -S31AFE0116D50803A68381000883A1000C83C1001083E100143821E9 -S31AFE0116EA00184E8000209421FFF07C0802A693C1000893E10040 -S31AFE0116FF0C900100147CBE2B797C7F1B78807F00344081006C54 -S31AFE011714813F00043929FFFC280900014081000C3860FFFF48BD -S31AFE011729000058A01F00162C00000040820048213E05B47D2985 -S31AFE01173E49107D294BB87D2048F87FC94838700005B47D3E0303 -S31AFE01175378386300147FC5F3784BFF98E57FE3FB78B3DF001662 -S31AFE0117683880001038A000004BFFF3557FC3F378480000083800 -S31AFE01177D600000800100147C0803A683C1000883E1000C38211B -S31AFE01179200104E8000209421FFE87C0802A69381000893A10027 -S31AFE0117A70C93C1001093E100149001001C7C7F1B787CBD2B7819 -S31AFE0117BC7CDC3378909F0004480005453D20000081293A289052 -S31AFE0117D17F00082C09000093BF000C939F0010418200187C0942 -S31AFE0117E6F80041820020812900002C0900004082FFF03D200021 -S31AFE0117FB0080093A2893E93A28901F00008001001C7C0803A692 -S31AFE0118108381000883A1000C83C1001083E10014382100184EF7 -S31AFE0118258000203D20000081293A28394000002C0900004D8223 -S31AFE01183A00207D2B4B787C091800408200202C0A000041820091 -S31AFE01184F1080090000900A00004800001C8169000048000014A2 -S31AFE0118647D2A4B78812900002C0900004082FFD03D20000091A2 -S31AFE011879693A284E8000209421FFE87C0802A693A1000C93C140 -S31AFE01188E001093E100149001001C3D20000083E93A283BC000D5 -S31AFE0118A3002C1F00003FA000004182006448000459801F00088E -S31AFE0118B8813F00047C6018507C0348404180003C2C1E0000417F -S31AFE0118CD820010801F0000901E00004800000C801F0000901D82 -S31AFE0118E23A28801F000C807F00107C0803A63BC000004E8000DA -S31AFE0118F72183FD3A284800000C7FFEFB7883FF00002C1F0000C3 -S31AFE01190C4082FFA48001001C7C0803A683A1000C83C10010838B -S31AFE011921E10014382100184E8000209421FFE87C0802A693817C -S31AFE011936000893A1000C93C1001093E100149001001C7C7D1BA2 -S31AFE01194B7883FD0004A13F0002A01F00006929080021690000C1 -S31AFE0119607D2B491468000001216000007C0B01147C0B48394199 -S31AFE0119758200D83FC00000387F0018389E370838A000044BFFF5 -S31AFE01198AA12D2C030000408200BCA01F00062C00000140820014 -S31AFE01199F64813F000E38000002B01F0006913F0018801F00085E -S31AFE0119B4391F0008A1280004901F0012389F0012B124000480E9 -S31AFE0119C91E37083D200000901F000E814939F8392939F8A169F5 -S31AFE0119DE0004915F0008B16800043800001CB01D000C7FA3EB9C -S31AFE0119F37838A008064BFFEFC9480000502C00000240820048AA -S31AFE011A083FC00001801E19703B9E19702C000000418200348098 -S31AFE011A1D7C0008389F000E38A000044BFFA08D7C631B794082BE -S31AFE011A32001CA01F000C817F0008813C0004B009000491690033 -S31AFE011A4700907E19707FA3EB784BFFEDAD8001001C7C0803A6BB -S31AFE011A5C8381000883A1000C83C1001083E10014382100184EA9 -S31AFE011A718000209421FFD87C0802A6936100149381001893A19B -S31AFE011A86001C93C1002093E100249001002C7C7F1B787C9D2397 -S31AFE011A9B783860002A4BFFECF97C7E1B79408200184800010017 -S31AFE011AB07FC3F3784BFFED4938600000480000F4817E000439DF -S31AFE011AC5200004992B0005394000013900080038000006980B7E -S31AFE011ADA0004B14B0000B14B0006B10B00023D20000080093715 -S31AFE011AEF083D400000900B000E392A39F8A1090004800A39F8B2 -S31AFE011B04B10B000C900B0008813F00003D400001912B00183911 -S31AFE011B196A1970380000FF93EB00089801000D93AB00043920C1 -S31AFE011B2E0001912A197098010008980100099801000A980100D9 -S31AFE011B430B9801000C3BA000073F8000013B60001CB37E000C42 -S31AFE011B587FC3F3783881000838A008064BFFEE5D480001A17C24 -S31AFE011B6D7F1B78480000144BFFED49801C19702C00000041825C -S31AFE011B82FF30480001857C7F1850280300F94081FFE47FA0EB17 -S31AFE011B97782C0000003BBDFFFF4181FFB47FC3F3784BFFEC55ED -S31AFE011BAC3860FFFF8001002C7C0803A683610014838100188318 -S31AFE011BC1A1001C83C1002083E10024382100284E80002094213D -S31AFE011BD6FFD87C0802A6930100089321000C93410010936100BE -S31AFE011BEB149381001893A1001C93C1002093E100249001002C87 -S31AFE011C003D2000013B29197C3B1900967C7B1B787C9C23787FCD -S31AFE011C153DCB783B4000007FBEEB787F63DB787FC4F37838A05F -S31AFE011C2A00044BFF9E892C0300007F5FD378418200383BBE00DF -S31AFE011C3F0A7C1DC0003B5F000A4081FFD4801B00007F63DB7820 -S31AFE011C54901C0000389C00044BFFFE192C030000408000283842 -S31AFE011C6960FFFF4800006C7C1AC82EA13D0008817D0004B13CEE -S31AFE011C7E0008901C0000917C00044800004C3CC0000081263719 -S31AFE011C932C80FC0000390900011D29000A3D600001A15C000859 -S31AFE011CA8801C0004396B197C7CE9592E7D295A142C080010B154 -S31AFE011CBD490008900900049106372C4082000C38000000900689 -S31AFE011CD2372C386000008001002C7C0803A683010008832100F3 -S31AFE011CE70C83410010836100148381001883A1001C83C100204B -S31AFE011CFC83E10024382100284E8000209421FFF87C0802A6906F -S31AFE011D1101000C3D2000003929320080090048386003E87C08E2 -S31AFE011D2603A64E8000213D200000806937303863000190693792 -S316FE011D3B308001000C7C0803A6382100084E80002059 -S31AFE011D503C746F7069633E0048656C702061626F75742068652F -S31AFE011D656C703F0000000068656C70000000005B2D77203C74D1 -S31AFE011D7A696D656F75743E5D205B656E7472795D0000457865F5 -S31AFE011D8F6375746520636F64652061742061206C6F63617469BC -S31AFE011DA46F6E0000676F00002D62203C6C6F636174696F6E3EF0 -S31AFE011DB9205B2D6C203C6C656E6774683E5D00446973706C6126 -S31AFE011DCE7920286865782064756D702920612072616E67652028 -S31AFE011DE36F66206D656D6F72790000000064756D7000000000A2 -S31AFE011DF85B4F4E207C204F46465D00004D616E616765206D61AE -S31AFE011E0D6368696E652063616368657300000063616368650039 -S31AFE011E2200000A526564426F6F7428746D292064656275672074 -S31AFE011E37656E7669726F6E6D656E74202D206275696C7420250A -S31AFE011E4C732C2025730A000031323A33373A3138000000004F22 -S31AFE011E616374203230203230303000506C6174666F726D3A208D -S31AFE011E76257320282573292025730A0000004D6F746F726F6C03 -S31AFE011E8B61204D425800000000506F7765725043203836300077 -S31AFE011EA000000000436F70797269676874202843292032303009 -S31AFE011EB5302C20526564204861742C20496E632E0A0A00524104 -S31AFE011ECA4D3A2025702D25700A003D3D20457865637574696E17 -S31AFE011EDF6720626F6F742073637269707420696E2025642073C6 -S31AFE011EF465636F6E6473202D20656E746572205E4320746F20E9 -S31AFE011F0961626F72740A00526564426F6F743E200000002A2A3B -S31AFE011F1E204572726F723A20496C6C6567616C20636F6D6D613E -S31AFE011F336E643A2025730A00006F6E00006F666600496E766120 -S31AFE011F486C6964206361636865206D6F64653A2025730A00630E -S31AFE011F5D6163686573203F0A00000025730A202020257320251E -S31AFE011F72730A0000000062617365206164647265737300000037 -S31AFE011F87006C656E677468000044756D702077686174205B6C6D -S31AFE011F9C6F636174696F6E5D3F0A0000776169742074696D6514 -S31AFE011FB16F7574000000007374617274696E6720616464726532 -S31AFE011FC673730000000041626F757420746F20737461727420AF -S31AFE011FDB657865637574696F6E206174202570202D2061626FCF -S31AFE011FF072742077697468205E432077697468696E20256420D8 -S31AFE0120057365636F6E64730A0000006574683000000000717571 -S31AFE01201A6963635F657468000000515549434320457468657250 -S31AFE01202F6E65743A204E6F206672656520786D69742062756638 -S31AFE012044666572730A000000000000005B2D765D205B2D725DF6 -S31AFE012059205B2D62203C6D656D5F616464723E5D203C66696C9C -S31AFE01206E655F6E616D653E0000004C6F616420612066696C65F4 -S31AFE012083006C6F616400000000454C4620696D61676573206EA8 -S31AFE0120986F7420737570706F727465640A000000496E76616C41 -S31AFE0120AD696420532D7265636F7264206174206F666673657491 -S31AFE0120C22025702C20696E7075743A2025630A000000426164E0 -S31AFE0120D720532D7265636F726420636F756E74206174206F669D -S31AFE0120EC667365742025700A0000000041646472657373206F14 -S31AFE0121016666736574203D2025700A00000000417474656D7025 -S31AFE0121167420746F206C6F616420532D7265636F726420646174 -S31AFE01212B746120746F20616464726573733A202570205B6E6F75 -S31AFE0121407420696E2052414D5D0A00002A2A2A205761726E6914 -S31AFE0121556E672120436865636B73756D206661696C75726520FF -S31AFE01216A2D20416464723A20256C782C202530326C58203C3EFF -S31AFE01217F202530326C580A0000456E74727920706F696E743A3B -S31AFE0121942025702C20616464726573732072616E67653A20259E -S31AFE0121A9702D25700A0000496E76616C696420532D7265636FD0 -S31AFE0121BE7264206174206F6666736574203078256C782C207404 -S31AFE0121D37970653A2025780A0000000000FFFF3050FFFF2EB445 -S31AFE0121E8FFFF2EB4FFFF2EB4FFFF3038FFFF3038FFFF3038FFEC -S31AFE0121FDFF3000FFFF3000FFFF3000256308000A0000007573BB -S31AFE0122126167653A206C6F6164203C66696C655F6E616D653E51 -S31AFE012227205B2D725D205B2D765D205B2D68203C686F73743E43 -S31AFE01223C5D205B2D6D207B54465450207C205A4D4F44454D7D38 -S31AFE0122515D205B2D62203C626173655F616464726573733E5D35 -S31AFE0122660A00766572626F7365006C6F6164207261772064616F -S31AFE01227B74610000006C6F6164206164647265737300000000CE -S31AFE012290646F776E6C6F6164206D6F6465202854465450206F02 -S31AFE0122A572205A4D4F44454D290000686F7374206E616D6520F9 -S31AFE0122BA284950206164647265737329000066696C65206E618B -S31AFE0122CF6D65000000496E76616C696420495020616464726583 -S31AFE0122E473733A2025730A007A6D6F64656D00007466747000B4 -S31AFE0122F900000054465450206D6F646520726571756972657338 -S31AFE01230E206120776F726B696E67206E6574776F726B0A0000DF -S31AFE01232300496E76616C696420276D6F6465273A2025730A00CA -S31AFE01233846696C65206E616D65206D697373696E670A000043E3 -S31AFE01234D616E2774206C6F616420272573273A2025730A00004A -S31AFE01236200004572726F722072656164696E6720686561646546 -S31AFE012377722076696120544654503A2025730A0000536F72727A -S31AFE01238C792C207A6D6F64656D20646F776E6C6F6164206E6F71 -S31AFE0123A1742079657420617661696C61626C650A0000005261BE -S31AFE0123B677206C6F61642072657175697265732061206D656D66 -S31AFE0123CB6F727920616464726573730A005261772066696C65A4 -S31AFE0123E0206C6F616465642025702D25700A0000454C460055AD -S31AFE0123F56E7265636F676E697A656420696D6167652074797096 -S31AFE01240A653A20256C780A000000000000007B636D64737D0047 -S31AFE01241F004D616E61676520464C41534820696D616765730036 -S31AFE012434666973005B2D6C5D000000004D616E61676520636FC0 -S31AFE0124496E66696775726174696F6E206B65707420696E2046A2 -S31AFE01245E4C415348206D656D6F727900000066636F6E666967A7 -S31AFE012473005B2D665D00000000496E697469616C697A6520468C -S31AFE0124884C41534820496D6167652053797374656D205B464960 -S31AFE01249D535D00696E69740000000000000000446973706C6164 -S31AFE0124B27920636F6E74656E7473206F6620464C41534820491D -S31AFE0124C76D6167652053797374656D205B4649535D0000000002 -S31AFE0124DC6C69737400000000446973706C617920667265652072 -S31AFE0124F15B617661696C61626C655D206C6F636174696F6E738C -S31AFE0125062077697468696E20464C41534820496D616765205304 -S31AFE01251B797374656D205B4649535D0000667265650000000018 -S31AFE0125302D66203C666C6173685F616464723E202D6C203C6CDB -S31AFE012545656E6774683E00457261736520464C41534820636FB8 -S31AFE01255A6E74656E74730000000065726173650000006E616D7F -S31AFE01256F6500000000446973706C617920616E20696D61676505 -S31AFE0125842066726F6D20464C41534820496D6167652053797379 -S31AFE01259974656D205B4649535D000064656C65746500004C6FFA -S31AFE0125AE616420696D6167652066726F6D20464C415348204960 -S31AFE0125C36D6167652053797374656D205B4649535D20696E749A -S31AFE0125D86F2052414D0000006C6F6164000000002D62203C6D82 -S31AFE0125ED656D5F626173653E202D6C203C696D6167655F6C6582 -S31AFE0126026E6774683E205B2D73203C646174615F6C656E677445 -S31AFE012617683E5D205B2D66203C666C6173685F616464723E5D99 -S31AFE01262C205B2D65203C656E7472795F706F696E743E5D205B5A -S31AFE0126412D72203C72616D5F616464723E5D203C6E616D653E74 -S31AFE012656000043726561746520616E20696D61676500637265CA -S31AFE01266B61746500002A2A2A20696E76616C696420276669730D -S31AFE0126802720636F6D6D616E643A2025730A00006669732000BC -S31AFE01269500000066756C6C20696E697469616C697A6174696FDE -S31AFE0126AA6E2C2065726173657320616C6C206F6620666C6173C5 -S31AFE0126BF680000000041626F757420746F20696E697469616C91 -S31AFE0126D4697A65205B666F726D61745D20464C41534820696DBF -S31AFE0126E96167652073797374656D002A2A2041626F72746564B0 -S31AFE0126FE0A002A2A2A20496E697469616C697A6520464C4153C2 -S31AFE0127134820496D6167652053797374656D0A000020202069E9 -S31AFE0127286E697469616C697A6174696F6E206661696C65642073 -S31AFE01273D25703A202578282573290A00000000202020205761CB -S31AFE012752726E696E673A2064657669636520636F6E74656E746A -S31AFE01276773206E6F74206572617365642C20736F6D6520626CF2 -S31AFE01277C6F636B73206D6179206E6F7420626520757361626C9D -S31AFE012791650A00526564426F6F7400526564426F6F745B626143 -S31AFE0127A6636B75705D00526564426F6F7420636F6E66696700C4 -S31AFE0127BB00464953206469726563746F72790000004572726F95 -S31AFE0127D0722077726974696E6720696D61676520646573637205 -S31AFE0127E56970746F72732061742025703A202578282573290AA5 -S31AFE0127FA00004E616D652020202020202020202020202020463E -S31AFE01280F4C41534820616464722020204D656D20616464722072 -S31AFE0128242020204C656E67746820202020456E74727920706F47 -S31AFE012839696E740A000000252D313673202030782530386C58CB -S31AFE01284E20202030782530386C58202030782530366C582020A0 -S31AFE01286330782530386C580A00202030782530386C58202E2EA3 -S31AFE0128782030782530386C580A0000006D656D6F7279206261A7 -S31AFE01288D736520616464726573730072616D20626173652061D7 -S31AFE0128A264647265737300000000656E74727920706F696E741B -S31AFE0128B7206164647265737300464C415348206D656D6F7279DA -S31AFE0128CC20626173652061646472657373000000696D6167652E -S31AFE0128E1206C656E677468205B696E20464C4153485D00696D28 -S31AFE0128F66167652073697A65205B61637475616C206461746111 -S31AFE01290B5D0000000066696C65206E616D65000000696E766146 -S31AFE0129206C696420617267756D656E7473000000726571756948 -S31AFE01293572656420706172616D65746572206D697373696E6752 -S31AFE01294A0000496E76616C696420464C41534820696D616765FB -S31AFE01295F2073697A652F6C656E67746820636F6D62696E617465 -S31AFE012974696F6E00496E76616C696420464C4153482061646465 -S31AFE012989726573733A20257020282573290A0020202076616CD2 -S31AFE01299E69642072616E67652069732025702D25700A000000A8 -S31AFE0129B3002A2A205741524E494E473A2052414D20616464728B -S31AFE0129C86573733A202570206D617920626520696E76616C69CA -S31AFE0129DD640A004E616D6520697320746F6F206C6F6E672C2067 -S31AFE0129F26D757374206265206C657373207468616E20256420B0 -S31AFE012A0763686172730A00000043616E2774206C6F6361746555 -S31AFE012A1C20256C64206279746573206672656520696E20464CD9 -S31AFE012A314153480A000000496D61676520666F756E642C2062D8 -S31AFE012A46757420464C415348206164647265737320696E636F30 -S31AFE012A5B72726563740A000000496D61676520666F756E642CEC -S31AFE012A7020627574204C454E47544820697320696E636F727256 -S31AFE012A856563740A000000416E20696D616765206E616D6564FA -S31AFE012A9A202725732720657869737473000043616E277420701F -S31AFE012AAF726F6772616D207468697320726567696F6E202D209C -S31AFE012AC4636F6E7461696E7320636F646520696E207573652159 -S31AFE012AD90A000043616E277420657261736520726567696F6E58 -S31AFE012AEE2061742025703A202578282573290A00000043616E28 -S31AFE012B0327742070726F6772616D20726567696F6E206174204C -S31AFE012B1825703A202578282573290A004572726F7220657261C2 -S31AFE012B2D73696E672061742025703A202578282573290A000049 -S31AFE012B4200004572726F722070726F6772616D6D696E6720612B -S31AFE012B57742025703A202578282573290A000000006C656E67AB -S31AFE012B6C746800006D697373696E6720617267756D656E7400F6 -S31AFE012B81000000696D616765206E616D65000044656C65746523 -S31AFE012B9620696D61676520272573270000004E6F20696D616781 -S31AFE012BAB65202725732720666F756E640A000000004E6F74200E -S31AFE012BC061206C6F616461626C6520696D6167650A00000046D3 -S31AFE012BD54C4153483A2064726976657220696E697420666169B4 -S31AFE012BEA6C6564212C207374617475733A2025780A00464C41B7 -S31AFE012BFF53483A202570202D2025702C20256420626C6F636B30 -S31AFE012C1473206F662025702062797465732065612E0A000074B0 -S31AFE012C296F6F2066657720617267756D656E7473000000756E78 -S31AFE012C3E7265636F676E697A656420636F6D6D616E6400000053 -S31AFE012C530052756E2073637269707420617420626F6F740000B4 -S31AFE012C68626F6F745F73637269707400426F6F74207363726945 -S31AFE012C7D707400626F6F745F7363726970745F646174610000B8 -S31AFE012C920000426F6F74207363726970742074696D656F7574B8 -S31AFE012CA700626F6F745F7363726970745F74696D656F75740005 -S31AFE012CBC25733A2000000000257320007472756500000000662E -S31AFE012CD1616C73650000002564200030782530325800003A00DA -S31AFE012CE60000200000003F3F00000A0000002E2E2025730A000E -S31AFE012CFB00456E746572207363726970742C207465726D696E31 -S31AFE012D10617465207769746820656D707479206C696E650A0072 -S31AFE012D250000003E3E200000000000FFFF0628FFFF064CFFFF7E -S31AFE012D3A06C8FFFF06D4FFFF0660FFFF067CFFFF07DCFFFF070F -S31AFE012D4FF0FFFF0964FFFF08B4FFFF080CFFFF0850FFFF04A843 -S31AFE012D64FFFF04A8FFFF04B8FFFF04C0FFFF04A8FFFF04B06C67 -S31AFE012D7969737420636F6E66696775726174696F6E206F6E6CEF -S31AFE012D8E79002A2A20696E76616C696420656E7472790A0000FB -S31AFE012DA30055706461746520526564426F6F74206E6F6E2D76D6 -S31AFE012DB86F6C6174696C6520636F6E66696775726174696F6E7F -S31AFE012DCD0000004572726F722077726974696E6720636F6E66F8 -S31AFE012DE2696720646174612061742025703A20257828257329C3 -S31AFE012DF70A0000000000000000FFFF0260FFFF02C0FFFF027820 -S31AFE012E0CFFFF027CFFFF0290FFFF02B052657175657374206681 -S31AFE012E216F7220636F6E6669672076616C7565202725732720BD -S31AFE012E362D2077726F6E6720747970650A0043616E27742066E9 -S31AFE012E4B696E6420636F6E6669672076616C7565202725732759 -S31AFE012E600A00000000000000FFFF0050FFFF0050FFFF00B4FF01 -S31AFE012E75FF0070FFFF0050FFFF005C464C41534820636F6E66F8 -S31AFE012E8A696775726174696F6E20636865636B73756D206572F2 -S31AFE012E9F726F72206F7220696E76616C6964206B65790A00004B -S31AFE012EB400000000FFFF3178FFFF3178FFFF3178FFFF3178FF69 -S31AFE012EC9FF3178FFFF3178FFFF3178FFFF3178FFFF3178FFFFAD -S31AFE012EDE3178FFFF3178FFFF3178FFFF3178FFFF3178FFFF3166 -S31AFE012EF378FFFF3178FFFF3198FFFF31B8FFFF31D8FFFF31F8CA -S31AFE012F08FFFF3218FFFF327CFFFF327CFFFF327CFFFF327CFFB8 -S31AFE012F1DFF3238FFFF3258FFFF3258FFFF3258FFFF3258FFFF13 -S31AFE012F323258FFFF3258FFFF3258FFFF3258FFFF3258FFFF32AB -S31AFE012F4758FFFF3258FFFF3258FFFF3258FFFF3258FFFF325870 -S31AFE012F5CFFFF3258FFFF3258FFFF3258FFFF3258FFFF3258FFB4 -S31AFE012F71FF3258FFFF3258FFFF3258FFFF3258FFFF3258FFFF9F -S31AFE012F863258FFFF3258FFFF3258FFFF3258FFFF3258FFFF3257 -S31AFE012F9B58FFFF3258FFFF3238FFFF3238FFFF3238FFFF32389C -S31AFE012FB0FFFF3238FFFF3238FFFF3238FFFF3238FFFF3238FF00 -S31AFE012FC5FF3238FFFF3238FFFF3238FFFF3238FFFF3238FFFFEB -S31AFE012FDA3238FFFF3238FFFF31B0FFFF31B0FFFF31D4FFFF311B -S31AFE012FEFF8FFFF31F8FFFF3238FFFF3238FFFF3238FFFF323809 -S31AFE013004FFFF321CFFFF3238FFFF3238FFFF3238FFFF3238FFC7 -S31AFE013019FF3238FFFF3238FFFF3238FFFF3238FFFF3238FFFF96 -S31AFE01302E3238FFFF3238FFFF3238FFFF3238FFFF3238FFFF324E -S31AFE01304338FFFF3238FFFF3238FFFF3238FFFF3238FFFF323833 -S31AFE013058FFFF3238FFFF3238FFFF3238FFFF3238FFFF3238FF57 -S31AFE01306DFF3238FFFF3238FFFF3238FFFF3238FFFF3238FFFF42 -S31AFE0130823238FFFF3238FFFF316CFFFF316CFFFF316CFFFF3162 -S31AFE0130976CFFFF316CFFFF316CFFFF316CFFFF316CFFFF316CAC -S31AFE0130ACFFFF316CFFFF316CFFFF316CFFFF316CFFFF316CFF04 -S31AFE0130C1FF316CFFFF316CFFFF318CFFFF31ACFFFF31CCFFFF2F -S31AFE0130D631ECFFFF320CFFFF3270FFFF3270FFFF3270FFFF3277 -S31AFE0130EB70FFFF322CFFFF324CFFFF324CFFFF324CFFFF324C0F -S31AFE013100FFFF324CFFFF324CFFFF324CFFFF324CFFFF324CFF4A -S31AFE013115FF324CFFFF324CFFFF324CFFFF324CFFFF324CFFFF35 -S31AFE01312A324CFFFF324CFFFF324CFFFF324CFFFF324CFFFF32ED -S31AFE01313F4CFFFF324CFFFF324CFFFF324CFFFF324CFFFF324CBE -S31AFE013154FFFF324CFFFF324CFFFF324CFFFF324CFFFF324CFFF6 -S31AFE013169FF324CFFFF324C3031323334353637383961626364BC -S31AFE01317E65660000000000000000503031004F4B000065436F0A -S31AFE0131937320474442207374756273205B7769746820526564FF -S31AFE0131A8426F6F745D202D206275696C74204F637420323020A7 -S31AFE0131BD32303030202F2031313A31343A3530000000004530B2 -S31AFE0131D23100453033004530320042303100FFFF4858FFFF50D4 -S31AFE0131E7E4FFFF4920FFFF4FA4FFFF4DF4FFFF50E4FFFF50E4EF -S31AFE0131FCFFFF50E4FFFF4AACFFFF4F74FFFF50E4FFFF50E4FF6F -S31AFE013211FF50E4FFFF50E4FFFF4BA8FFFF50E4FFFF50E4FFFFEB -S31AFE0132264AACFFFF4904FFFF50E4FFFF4DF4FFFF4F8CFFFF50B5 -S31AFE01323BE4FFFF50E4FFFF50E4FFFF4BA4FFFF50E4FFFF50E4E0 -S31AFE013250FFFF50E4FFFF50E4FFFF50E4FFFF50E4FFFF50E4FF6B -S31AFE013265FF50E4FFFF50E4FFFF5070FFFF4DF4FFFF48C0FFFFE9 -S31AFE01327A50E4FFFF50E4FFFF4910FFFF50E4FFFF50E4FFFF50CB -S31AFE01328FE4FFFF4F54FFFF50E4FFFF4AC0FFFF50E4FFFF50E402 -S31AFE0132A4FFFF50E4FFFF48F8FFFF4F6CFFFF4DF4FFFF50E4FF77 -S31AFE0132B9FF50E4FFFF50E4FFFF50E4FFFF50E4FFFF50E4FFFF02 -S31AFE0132CE489C30313233343536373839616263646566000000A0 -S31AFE0132E30030313233343536373839414243444546000000002F -S31AFE0132F8FFFF7038FFFF7038FFFF7038FFFF7038FFFF7038FF7F -S31AFE01330DFF7038FFFF7038FFFF7038FFFF7038FFFF7038FFFF69 -S31AFE0133227038FFFF7038FFFF7038FFFF7038FFFF7038FFFF70E3 -S31AFE01333738FFFF6F78FFFF6F78FFFF6FACFFFF6FE0FFFF6FE0C7 -S31AFE01334CFFFF7038FFFF7038FFFF7038FFFF7038FFFF7014FF4E -S31AFE013361FF7038FFFF7038FFFF7038FFFF7038FFFF7038FFFF15 -S31AFE0133767038FFFF7038FFFF7038FFFF7038FFFF7038FFFF708F -S31AFE01338B38FFFF7038FFFF7038FFFF7038FFFF7038FFFF7038B2 -S31AFE0133A0FFFF7038FFFF7038FFFF7038FFFF7038FFFF7038FFD6 -S31AFE0133B5FF7038FFFF7038FFFF7038FFFF7038FFFF7038FFFFC1 -S31AFE0133CA7038FFFF7038FFFF7038FFFF7038FFFF7038FFFF703B -S31AFE0133DF38FFFF6FECFFFF6FECFFFF6FECFFFF6FECFFFF6FECDF -S31AFE0133F4FFFF6FECFFFF6FECFFFF6FECFFFF6FECFFFF6FECFF03 -S31AFE013409FF6FECFFFF6FECFFFF6FECFFFF6FECFFFF6FECFFFFED -S31AFE01341E6FECFFFF7014FFFF7038FFFF705CFFFF7080FFFF70EB -S31AFE013433A4FFFF7110FFFF7110FFFF7110FFFF7110FFFF70C8A9 -S31AFE013448FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFBD -S31AFE01345DFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFFA8 -S31AFE01347270E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF7022 -S31AFE013487E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF70E895 -S31AFE01349CFFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FF69 -S31AFE0134B1FF70E8FFFF70E8FFFF70E8FFFF70E8FFFF70E8FFFF54 -S31AFE0134C670E8FFFF7068FFFF7068FFFF7068FFFF7068FFFF70CE -S31AFE0134DB68FFFF7068FFFF7068FFFF7068FFFF7068FFFF706841 -S31AFE0134F0FFFF7068FFFF7068FFFF7068FFFF7068FFFF7068FF95 -S31AFE013505FF7068FFFF7090FFFF70B0FFFF70D0FFFF70F0FFFF1F -S31AFE01351A7110FFFF7178FFFF7178FFFF7178FFFF7178FFFF710B -S31AFE01352F30FFFF7150FFFF7150FFFF7150FFFF7150FFFF715097 -S31AFE013544FFFF7150FFFF7150FFFF7150FFFF7150FFFF7150FFB3 -S31AFE013559FF7150FFFF7150FFFF7150FFFF7150FFFF7150FFFF9E -S31AFE01356E7150FFFF7150FFFF7150FFFF7150FFFF7150FFFF7117 -S31AFE01358350FFFF7150FFFF7150FFFF7150FFFF7150FFFF715023 -S31AFE013598FFFF7150FFFF7150FFFF7150FFFF7150FFFF7150FF5F -S31AFE0135ADFF7150FFFF70D0FFFF70D0FFFF70D0FFFF70D0FFFF4E -S31AFE0135C270D0FFFF70D0FFFF70D0FFFF70D0FFFF70D0FFFF7049 -S31AFE0135D7D0FFFF70D0FFFF70D0FFFF70D0FFFF70D0FFFF70D0D4 -S31AFE0135ECFFFF70D0FFFF70F8FFFF7118FFFF7138FFFF7158FF2D -S31AFE013601FF7178FFFF71C0FFFF71C0FFFF71C0FFFF71C0FFFF0D -S31AFE01361671C0FFFF7198FFFF7198FFFF7198FFFF7198FFFF71DE -S31AFE01362B98FFFF7198FFFF7198FFFF7198FFFF7198FFFF7198CA -S31AFE013640FFFF7198FFFF7198FFFF7198FFFF7198FFFF7198FF4E -S31AFE013655FF7198FFFF7198FFFF7198FFFF7198FFFF7198FFFF39 -S31AFE01366A7198FFFF7198FFFF7198FFFF7198FFFF7198FFFF71B2 -S31AFE01367F98FFFF7198FFFF7198FFFF7198FFFF7198FFFF719876 -S31AFE013694FFFF7198FFFF711CFFFF7160FFFF711CFFFF7160FF62 -S31AFE0136A9FF711CFFFF7160FFFF711CFFFF7160FFFF711CFFFFC9 -S31AFE0136BE7160FFFF711CFFFF7160FFFF711CFFFF7160FFFF71FE -S31AFE0136D31CFFFF7160FFFF7160FFFF7160FFFF7160FFFF7160B6 -S31AFE0136E8FFFF7160FFFF7160FFFF7160FFFF7160FFFF7160FFBE -S31AFE0136FDFF7160FFFF7160FFFF7160FFFF7160FFFF7160FFFFA9 -S31AFE0137127160FFFF7160FFFF7160FFFF7160FFFF7160FFFF7121 -S31AFE01372760FFFF7160FFFF7160FFFF7160FFFF7160FFFF71601D -S31AFE01373CFFFF7160FFFF7160FFFF7160FFFF7160FFFF7160FF69 -S31AFE013751FF7160FFFF7160FFFF7160FFFF7160FFFF7160FFFF54 -S31AFE0137667160FFFF7160FFFF7160FFFF7160FFFF7160FFFF71CD -S31AFE01377B60FFFF7160FFFF7178FFFF7178FFFF7178FFFF717869 -S31AFE013790FFFF7178FFFF7178FFFF7178FFFF7178FFFF7178FF9D -S31AFE0137A5FF7178FFFF7178FFFF7178FFFF7178FFFF7178FFFF88 -S31AFE0137BA7178FFFF7178FFFF70B8FFFF70B8FFFF70ECFFFF7110 -S31AFE0137CF20FFFF7120FFFF7178FFFF7178FFFF7178FFFF717895 -S31AFE0137E4FFFF7154FFFF7178FFFF7178FFFF7178FFFF7178FF6D -S31AFE0137F9FF7178FFFF7178FFFF7178FFFF7178FFFF7178FFFF34 -S31AFE01380E7178FFFF7178FFFF7178FFFF7178FFFF7178FFFF71AC -S31AFE01382378FFFF7178FFFF7178FFFF7178FFFF7178FFFF717890 -S31AFE013838FFFF7178FFFF7178FFFF7178FFFF7178FFFF7178FFF4 -S31AFE01384DFF7178FFFF7178FFFF7178FFFF7178FFFF7178FFFFDF -S31AFE0138627178FFFF7178303132333435363738390000303132DC -S31AFE013877333435363738396162636465660000000030313233A2 -S31AFE01388C3435363738394142434445460000000000000000FF47 -S31AFE0138A1FF7B60FFFF7D10FFFF7D10FFFF7D10FFFF7D10FFFF09 -S31AFE0138B67D10FFFF7D10FFFF7D10FFFF7D10FFFF7D10FFFF7DC4 -S31AFE0138CB10FFFF7CA4FFFF7B60FFFF7D10FFFF7D10FFFF7D103B -S31AFE0138E0FFFF7D10FFFF7D10FFFF7D10FFFF7D10FFFF7D10FF18 -S31AFE0138F5FF7D10FFFF7D10FFFF7D10FFFF7B40FFFF7D10FFFFD5 -S31AFE01390A7D10FFFF7C38FFFF7D10FFFF7D10FFFF7D10FFFF7D48 -S31AFE01391F10FFFF7B60000000005E430A003078253038583A2013 -S31AFE0139340000000025303258000000002020000020000000201A -S31AFE0139497C0000256300007C0A0000202D2061726520796F75B8 -S31AFE01395E20737572652028792F6E293F2000556E62616C616EC9 -S31AFE01397363656420737472696E67210A00416D626967756F75F3 -S31AFE0139887320636F6D6D616E6420272573272C2063686F69635B -S31AFE01399D6573206172653A20257300202573000A000000557364 -S31AFE0139B26167653A0A002020257325732025730A00002A2A20E4 -S31AFE0139C74572726F723A20257320616C72656164792073706580 -S31AFE0139DC6369666965640A002A2A204572726F723A20696E763E -S31AFE0139F1616C6964206E756D626572202725732720666F7220EC -S31AFE013A0625730A0000002A2A204572726F723A20696E76616C12 -S31AFE013A1B696420666C616720272563270A000000002A2A204551 -S31AFE013A3072726F723A206E6F2064656661756C742F6E6F6E2DD4 -S31AFE013A45666C616720617267756D656E747320737570706F720E -S31AFE013A5A7465640A00004E45544153434949000000004F4354D5 -S31AFE013A6F4554000000556E6B6E6F776E206572726F720000006A -S31AFE013A8466696C65206E6F7420666F756E6400006163636573DC -S31AFE013A99732076696F6C6174696F6E000000006469736B20667A -S31AFE013AAE756C6C206F7220616C6C6F636174696F6E206578630A -S31AFE013AC3656564656400000000696C6C6567616C2054465450BA -S31AFE013AD8206F7065726174696F6E0000756E6B6E6F776E20743F -S31AFE013AED72616E736665722049440066696C6520616C7265615C -S31AFE013B02647920657869737473006E6F207375636820757365EF -S31AFE013B1772000000006F7065726174696F6E2074696D656420FE -S31AFE013B2C6F757400736F6D6520736F7274206F66206E657477B8 -S31AFE013B416F726B206572726F720000696E76616C6964207061FC -S31AFE013B5672616D6574657200000070726F746F636F6C207669F4 -S31AFE013B6B6F6C6174696F6E000066696C65206973206C617267E8 -S31AFE013B806572207468616E206275666665720000FFFF94F4FF6A -S31AFE013B95FF9500FFFF950CFFFF9518FFFF9524FFFF9530FFFFC0 -S31AFE013BAA953CFFFF9548FFFF9554FFFF9560FFFF956CFFFF95E9 -S31AFE013BBF7847444220636F6E6E656374696F6E20706F72740072 -S31AFE013BD46764625F706F7274000000004E6574776F726B206418 -S31AFE013BE96562756720617420626F6F742074696D6500006E65B4 -S31AFE013BFE745F646562756700000055736520424F4F545020667C -S31AFE013C136F72206E6574776F726B20636F6E666967757261743A -S31AFE013C28696F6E00626F6F74700000004C6F63616C2049502054 -S31AFE013C3D6164647265737300000000626F6F74705F6D795F6956 -S31AFE013C52700044656661756C7420736572766572204950206132 -S31AFE013C67646472657373000000626F6F74705F736572766572A4 -S31AFE013C7C5F69700025732E25640A00006E65745F696F5F7772D7 -S31AFE013C91697465000000006E65745F696F5F726561640000005E -S31AFE013CA60000FFFF99A4FFFF99A4FFFF99A4FFFF99A4FFFF9981 -S31AFE013CBBA4FFFF99A4FFFF99A4FFFF99A4FFFF99A4FFFF99A424 -S31AFE013CD0FFFF99A4FFFF99A4FFFF99A4FFFF99A4FFFF99A4FFB4 -S31AFE013CE5FF99A4FFFF99D0FFFF99F0FFFF9A10FFFF9A30FFFF2D -S31AFE013CFA9A50FFFF9C74FFFF9C74FFFF9C74FFFF9C74FFFF9AF6 -S31AFE013D0F70FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A9062 -S31AFE013D24FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFBE -S31AFE013D39FF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFFA9 -S31AFE013D4E9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9AF9 -S31AFE013D6390FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A90EE -S31AFE013D78FFFF9A90FFFF9A90FFFF9A90FFFF9A90FFFF9A90FF6A -S31AFE013D8DFF9A90FFFF9A28FFFF9A28FFFF9A28FFFF9A28FFFFF5 -S31AFE013DA29A28FFFF9A28FFFF9A28FFFF9A28FFFF9A28FFFF9AAD -S31AFE013DB728FFFF9A28FFFF9A28FFFF9A28FFFF9A28FFFF9A280A -S31AFE013DCCFFFF9A28FFFF9A54FFFF9A78FFFF9A9CFFFF9AC0FF96 -S31AFE013DE1FF9AE4FFFF9B8CFFFF9B8CFFFF9B8CFFFF9B8CFFFFB9 -S31AFE013DF69B08FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B73 -S31AFE013E0B28FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B28B0 -S31AFE013E20FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFC4 -S31AFE013E35FF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFFAF -S31AFE013E4A9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9BFE -S31AFE013E5F28FFFF9B28FFFF9B28FFFF9B28FFFF9B28FFFF9B285C -S31AFE013E74FFFF9B284E6F206E6574776F726B20696E74657266E4 -S31AFE013E896163657320666F756E640A0000000043616E27742070 -S31AFE013E9E67657420424F4F545020696E666F202D206E6574772F -S31AFE013EB36F726B2064697361626C6564210A00000049503A2033 -S31AFE013EC8257300002C2044656661756C74207365727665723A46 -S31AFE013EDD2025730A0000000000000025642E25642E25642E25BF -S31AFE013EF2640045746865726E65742073656E643A0A00457468E4 -S31AFE013F0765726E657420726563763A0A006574685F6472765F23 -S31AFE013F1C6473722073686F756C64206E6F742062652063616CEB -S31AFE013F316C65643A20766563746F722025642C206461746120A5 -S31AFE013F4625780A000000000000002E2E2E20457261736520669A -S31AFE013F5B726F6D2025702D25703A2000002E0000000A000000F5 -S31AFE013F702E2E2E2050726F6772616D2066726F6D2025702D25DA -S31AFE013F85702061742025703A2000004E6F206572726F72202D5A -S31AFE013F9A206F7065726174696F6E20636F6D706C6574650000A3 -S31AFE013FAF00496E76616C696420464C4153482061646472657310 -S31AFE013FC4730000004572726F7220747279696E6720746F206521 -S31AFE013FD9726173650000004572726F7220747279696E672074C8 -S31AFE013FEE6F206C6F636B2F756E6C6F636B004572726F72207428 -S31AFE0140037279696E6720746F2070726F6772616D0047656E65E0 -S31AFE014018726963206572726F720000004465766963652F7265B0 -S31AFE01402D67696F6E2069732077726974652D70726F7465637457 -S31AFE014042656400000000464C415348207375622D73797374655E -S31AFE0140576D206E6F7420696E697469616C697A656400000000BB -S31AFE01406C556E6B6E6F776E206572726F7200000000000000FF01 -S31AFE014081FFAC04FFFFAC10FFFFAC1CFFFFAC28FFFFAC34FFFF48 -S31AFE014096AC40FFFFAC4CFFFFAC58457272203D2025780A0000DF -S31AFE0140AB0000000000FFFFB184FFFFB184FFFFB17CFFFFB114A7 -S31AFE0140C0FFFFB17CFFFFB11CFFFFB154FFFFB15CFFFFB16CFFC8 -S31AFE0140D5FFB16CFFFFB164FFFFB174FFFFB154FFFFB18CFFFF43 -S31AFE0140EAB16CFFFFB174FFFFB174FFFFB17CFFFFB184FFFFB14C -S31AFE0140FF8CFFFFB18CFFFFB18CFFFFB18CFFFFB18CFFFFB18CF4 -S31AFE014114FFFFB18CFFFFB174FFFFB174FFFFB174FFFFB174FFCB -S31AFE014129FFB75CFFFFB75CFFFFB75CFFFFB75CFFFFB75CFFFF28 -S31AFE01413EB75CFFFFB75CFFFFB75CFFFFB75CFFFFB75CFFFFB75B -S31AFE0141535CFFFFB75CFFFFB75CFFFFB75CFFFFB75CFFFFB75CA1 -S31AFE014168FFFFB77CFFFFB79CFFFFB7BCFFFFB7DCFFFFB7FCFF09 -S31AFE01417DFFB858FFFFB858FFFFB858FFFFB858FFFFB81CFFFF1F -S31AFE014192B83CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB8A1 -S31AFE0141A73CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB83C08 -S31AFE0141BCFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFF30 -S31AFE0141D1FFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFF1B -S31AFE0141E6B83CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB84D -S31AFE0141FB3CFFFFB83CFFFFB83CFFFFB83CFFFFB83CFFFFB83CB4 -S31AFE014210FFFFB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFB0 -S31AFE014225FFB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFFF9B -S31AFE01423AB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFFFB7ACFFFFB7CE -S31AFE01424FACFFFFB7CCFFFFB7F0FFFFB814FFFFB838FFFFB85CB9 -S31AFE014264FFFFB8F4FFFFB8F4FFFFB8F4FFFFB8F4FFFFB880FF63 -S31AFE014279FFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFF7E -S31AFE01428EB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8B0 -S31AFE0142A3A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0B3 -S31AFE0142B8FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FF3F -S31AFE0142CDFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFF2A -S31AFE0142E2B8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB8A0FFFFB85C -S31AFE0142F7A025733A2043616E27742066696E642061646472658D -S31AFE01430C7373206F66207365727665720A0000005F5F756470F4 -S31AFE0143215F73656E64746F000000007564705F72656376667266 -S31AFE0143366F6D202D2064726F70706564207061636B6574206F0F -S31AFE01434B662025642062797465730A00004275665B25645D2F6B -S31AFE01436025703A206275663A2025702C206C656E3A2025642F8B -S31AFE01437525642C206E6578743A2025700A000046726565206C93 -S31AFE01438A697374203D2025700A005F5F656E65745F706F6C6C2D -S31AFE01439F3A206E6F206D6F726520627566666572730A000000E3 -S31AFE0143B400000000FFFFCD90FFFFCDE8FFFFD064FFFFCE3CFFA8 -S31AFE0143C9FFCE3CFFFFCEE4FFFFCF24FFFFCFC0FFFFD004FFFFD3 -S307FE0143DED044C4 -S31AFE0143E0000000007C2F2D5C7C2D000000003324000079D0FE48 -S31AFE0143F5012010000000000000000000000000FE0058D8FE0051 -S31AFE01440A58F0FE0058C8FE0058B0FE005740FE0055F4FE005CF6 -S31AFE01441FECFE0054B4FE0054AC000036E40000000008003E280B -S31AFE01443479B80000FE005DFCFE00AF98FE00AF98FE00AF98FE19 -S31AFE01444900AF98FE00AF98FE00AF98FE00AF98FE00AF98FE0000 -S31AFE01445EAF98FE00AF98FE00AF98FE00AF98FE00AF98FE00AF3C -S31AFE01447398FE00AF98FE00AF98FE00AF98FE00AF98FE00AF983E -S31AFE014488FE00AF98FE00AF98FE00AF98FE00AF98FE00AF98FEC3 -S31AFE01449D00AF98FE00AF98FE00AF98FE00AF98FE00AF98FE00AC -S31AFE0144B2AF98FE00AF98FE00AF98FE00AF98FE00AF98FE00AFE8 -S31AFE0144C798FE00AF98FE00AF98FE00AF98FE00AF98FE00AF98EA -S31AFE0144DCFE00AF98FE00AF98FE00AF98FE00AF98FE00AF98FE6F -S31AFE0144F100AF98FE00AF98FE00AF98FE00AF98FE00AF98FE0058 -S31AFE014506AF98FE00AF98FE00AF98FE00AF98FE00AF98FE00AF93 -S31AFE01451B98FE00AF98FE00AF9800000000000000000000000064 -S31AFE01453000000000000000000000000000000000000000000071 -S31AFE0145450000000000000000000000000000000000000000005C -S31AFE01455A00000000000000000000000000000000000000000047 -S31AFE01456F00000000000000000000000000000000000000000032 -S31AFE0145840000000000000000000000000000000000000000001D -S31AFE01459900000000000000000000000000000000000000000008 -S31AFE0145AE000000000000000000000000000000000000000000F3 -S31AFE0145C3000000000000000000000000000000000000000000DE -S31AFE0145D8000000000000000000000000000000000000000000C9 -S31AFE0145ED000000000000000000000000000000000000000000B4 -S31AFE0146020000000000000000000000000000000000000000009E -S31AFE01461700000000000000000000000000000000000000000089 -S31AFE01462C00000000000000000000000000000000000000000074 -S31AFE0146410000000000000000000000000000000000000000005F -S31AFE0146560000000000000000000000000000000000000000004A -S31AFE01466B00000000000000000000000000000000000000000035 -S31AFE01468000000000000000000000000000000000000000000020 -S31AFE0146950000000000000000000000000000000000000000000B -S31AFE0146AA000000000000000000000000000000000000000000F6 -S31AFE0146BF000000000000000000000000000000000000000000E1 -S31AFE0146D4000000000000000000000000000000000000000000CC -S31AFE0146E900000000000000000000000000000000000000FE00B9 -S31AFE0146FE0000FE0000000040000000000000FF000000FF000066 -S31AFE014713000010000001000000FA100000FA1000000000000463 -S31AFE014728010000000000000000000000008000000000000000F6 -S31AFE01473D00000000000000000000000000000000000000000062 -S31AFE0147520000FE00834CFE0083A8000000000000000000000057 -S31AFE01476700FFFFFFFF0000000000000000FE0093F400000000B7 -S31AFE01477C0000000000011CE40000000000000000000000000022 -S31AFE01479100000000000000FFFFFFFEFFFFFFFE00000000000018 -S31AFE0147A61E1400001E14000001F40000000000000000000000A0 -S31AFE0147BB000000000000000000FE00E1C0FE00E668FE00E454C3 -S31AFE0147D0000000000000000000000000000003E80000000000E4 -S31AFE0147E5000000000000000000000000000000000000000000BA -S31AFE0147FA000000000000000000000000000000000000000000A5 -S31AFE01480F000000000000000000FE012668FE012658FE0125E879 -S31AFE014824FE003DA4FE0125A4FE012574FE01256CFE0039C8FEAE -S31AFE014839012564FE01254CFE012530FE003BCCFE012528FE01C7 -S31AFE01484E24E4FE0124A8FE004488FE0124A0FE01247CFE01242E -S31AFE01486374FE004658FE0124DCFE0124ACFE0124A8FE004598B7 -S31AFE014878FE0125E0FE0125ACFE01256CFE003880FE011E1CFED5 -S31AFE01488D011E04FE011DF8FE002840FE011DF0FE011DC8FE0185 -S31AFE0148A21DACFE002A30FE012434FE012420FE012418FE0036D2 -S31AFE0148B7ECFE01246CFE012440FE012438FE002F48FE011DA875 -S31AFE0148CCFE011D8CFE011D74FE002B28FE011D6CFE011D58FE4F -S31AFE0148E1011D50FE0029BCFE012084FE012078FE012050FE00C5 -S31AFE0148F64A14FE012C68FE012C54000000000000000100000037 -S31AFE01490B0100000000FE012C80FE012C74FE012C6800000001B3 -S31AFE0149200000000400000000FE012CA8FE012C94FE012C680054 -S31AFE0149350000010000000200000000FE013C2CFE013C080000BB -S31AFE01494A0000000000010000000100000000FE013C48FE013C93 -S31AFE01495F34FE013C2C000000000000000500000000FE013C70F3 -S31AFE014974FE013C54FE013C2C000000000000000500000000FE30 -S31AFE014989013BD4FE013BC0000000000000000100000002000007 -S31AFE01499E0000FE013BFCFE013BE00000000000000001000000AE -S31AFE0149B30100000000FE002CC000000000FE00DD2800000000FC -S31AFE0149C8FE012018FE0059080000330C000000004E8000210011 -S310FE0149DD0000000000000000000000CA +S31AFE002651630D407C0803A63D2000003D60000093893B5893EB6C +S31AFE0026663B784E8000213C000040901B3B5C939A3B74480006D1 +S31AFE00267B6D3C60FE013C80FE013CA0FE01386329A4388429D487 +S31AFE00269038A529E0480094313C60FE013C80FE013CA0FE013CD1 +S31AFE0026A5C0FE0138C62A20386329EC38842A0438A52A14480018 +S31AFE0026BA940D3C60FE0138632A2448009401809A3B7480BB3BC6 +S31AFE0026CF5C3C60FE0138632A48480093ED3D2000003D6000002C +S31AFE0026E438093B383BAB3B287C1D00003D20000093893B6C41E6 +S31AFE0026F98200207C1C0378813D00003BBD00087D2803A64E8039 +S31AFE00270E00217C1DE0004082FFEC3F600000835B3B802C1A00ED +S31AFE002723004182006C3D20000083A93B603C8010621FBD03E855 +S31AFE00273860844DD37C9D20967FA0FE707C8436707C8020501CFA +S31AFE00274DA403E83C60FE0138632A547CA5E850480093693D2036 +S31AFE00276200003B80000093893B807FA5EB7838610008388001EB +S31AFE00277700480099BD2C03FFFE4082000C939B3B804800000878 +S31AFE00278C935B3B807FFDFB787F3CCB787FDBF3782C1D0000414F +S31AFE0027A18200143C60FE0138632A98480093193BA00000386129 +S31AFE0027B600083880010038A000FA480099752C03000040800032 +S31AFE0027CB1C3D20000080093B842C0000004182FFC44800B71D66 +S31AFE0027E04BFFFFBC40820020393C3200800900347F63DB787CE4 +S31AFE0027F50803A64E800021480077C94BFFFF9C386100084800D5 +S31AFE00280A93792C0300004081004C3FA000003F40000138610075 +S31AFE00281F08389D3B7038BA208848009E717C631B794182001CD5 +S31AFE0028348003000C807D3B70389A20887C0803A64E8000214876 +S31AFE0028490000143C60FE0138632AA4388100084800926D3BA07B +S31AFE00285E00014BFFFF3C9421FFF07C0802A693E1000C900100FA +S31AFE002873142C0300027C9F237840820144807F00043C80FE018C +S31AFE00288838842AC4480093852C030000408200447D6000A67DF8 +S31AFE00289D605B7839200000512004207C0001243C0002004C00D6 +S31AFE0028B2012C7C108BA64C00012C3D4002007C0004AC7D588B9F +S31AFE0028C7A67C0000A6516004207C000124480000F8807F000477 +S31AFE0028DC3C80FE0138842AC84800932D2C030000408200C07D44 +S31AFE0028F16000A67D605B7839200000512004207C000124392030 +S31AFE0029060000380000807C0903A6612010003D400E007C000436 +S31AFE00291BAC7D398BA67D588BA67C198BA67D588BA639290010CC +S31AFE0029304200FFE03C0004004C00012C7C108BA64C00012C3D41 +S31AFE0029454004007C0004AC7D588BA639200000380000807C096D +S31AFE00295A03A6612010003D400E007C0004AC7D398BA67D588B2C +S31AFE00296FA67C198BA67D588BA6392900104200FFE03C000C0002 +S31AFE0029844C00012C7C108BA64C00012C3D400C007C0004AC7D59 +S31AFE002999588BA67C0000A6516004207C000124480000243C60FC +S31AFE0029AEFE01809F000438632ACC4800910D480000103C60FE85 +S31AFE0029C30138632AE4480090FD800100147C0803A683E1000C4A +S31AFE0029D8382100104E8000209421FFE87C0802A693A1000C93F4 +S31AFE0029EDC1001093E100149001001C3D6000003D20000039296F +S31AFE002A023A683BEB39F87C1F48004182002C7D3D4B783FC0FE76 +S31AFE002A1701809F000480BF000080DF0008387E2AF04800909D97 +S31AFE002A2C3BFF00107C1FE8004082FFE48001001C7C0803A683D2 +S31AFE002A41A1000C83C1001083E10014382100184E8000209421EF +S31AFE002A56FFA87C0802A69381004893A1004C93C1005093E100A0 +S31AFE002A6B549001005C7C7D1B787C9C23783D20FE0139292B00E9 +S31AFE002A80386100083880006238A0000138C0000038E100383927 +S31AFE002A9501003C48009F293D20FE0139292B1038610020388071 +S31AFE002AAA006C38A0000138C0000038E100403901004448009F18 +S31AFE002ABF053D40FE017FA3EB787F84E378394A2A2038A00001F4 +S31AFE002AD438C1000838E00002390000003920000048009EF92C31 +S31AFE002AE9030000418200408001003C2C000000408200143C6073 +S31AFE002AFEFE0138632B1848008FC148000024800100442C0000ED +S31AFE002B13004082000C3800002090010040806100388081004058 +S31AFE002B2848009A758001005C7C0803A68381004883A1004C83F4 +S31AFE002B3DC1005083E10054382100584E8000209421FFB87C0827 +S31AFE002B5202A69381003893A1003C93C1004093E1004490010029 +S31AFE002B674C3D20000080093B7C7C7D1B787C9C23783D20FE01D1 +S31AFE002B7C9001002839292B30386100083880007738A0000138E9 +S31AFE002B91C0000038E100203901002448009E253D40FE017FA32B +S31AFE002BA6EB787F84E378394A2B4038A0000138C1000838E00075 +S31AFE002BBB01390100283920000048009E192C030000418200F85C +S31AFE002BD0800100242C000000418200343C60FE018081002880E0 +S31AFE002BE5A1002038632B5448008ED980A10020386100301CA582 +S31AFE002BFA03E838800008480095352C03FFFE418200BC81410098 +S31AFE002C0F287D6000A67D605B7839200000512004207C000124C2 +S31AFE002C2439200000380000807C0903A6612010003D600E007CA0 +S31AFE002C390004AC7D398BA67D788BA67C198BA67D788BA6392977 +S31AFE002C4E00104200FFE03C0004004C00012C7C108BA64C000179 +S31AFE002C632C3D6004007C0004AC7D788BA6392000003800008028 +S31AFE002C787C0903A6612010003D600E007C0004AC7D398BA67D49 +S31AFE002C8D788BA67C198BA67D788BA6392900104200FFE03C00CA +S31AFE002CA20C004C00012C7C108BA64C00012C3D600C007C000435 +S31AFE002CB7AC7D788BA67D4803A64E8000218001004C7C0803A6DB +S31AFE002CCC8381003883A1003C83C1004083E10044382100484E38 +S31AFE002CE18000204E8000209421FFE07C0802A693A1001493C1F0 +S31AFE002CF6001893E1001C90010024380000003D2000003FC000D4 +S31AFE002D0B003BA93B8090093B80901E3B6C48000A992C0300004D +S31AFE002D20418200EC3D20000080893B943D600000800B3B903D86 +S31AFE002D352000003BE97C747C8422147C8400507FE3FB7838A01E +S31AFE002D4A0400480085757FE3FB78388003FC480004F9801F03B7 +S31AFE002D5FFC7C030000408200303D20000081697C743C000BADC3 +S31AFE002D746000FACE7C0B000040820018813F03F83C00DEAD60DB +S31AFE002D8900DEAD7C090000418200283C60FE0138633A38480046 +S31AFE002D9E8D293C60000038637C743880000038A00400480085DE +S31AFE002DB3E9480000583C60FE01386338103881000838A0000166 +S31AFE002DC848000061800100082C000000418200303C60FE0138CE +S31AFE002DDD6338287FA4EB7838A00004480000413C60FE013C80D8 +S31AFE002DF200003863386438843B6038A0000248000029380000B7 +S31AFE002E0701901E3B6C800100247C0803A683A1001483C10018F6 +S31AFE002E1C83E1001C382100204E8000209421FFD87C0802A6936B +S31AFE002E3121000C93410010936100149381001893A1001C93C19F +S31AFE002E46002093E100249001002C3D2000003D6000003B493B45 +S31AFE002E5B287C7B1B787C9D23787CB92B783BCB3A6848000945E2 +S31AFE002E702C0300003B800004418200CC7C1ED000418200B43DAE +S31AFE002E8520000039297C74807E00007FFC4A147F64DB7848006D +S31AFE002E9A8D112C0300004082007C807E00107C03C800408200FD +S31AFE002EAF5C3803FFFF280000054181008C3D60FE01396B3A2060 +S31AFE002EC45400103A7D4B002E3D20FE0139293A207D4A4A147DA7 +S31AFE002ED94903A64E800420801F0000901D00004800005CA01F4D +S31AFE002EEE0004813F0000B01D0004913D00004800004893FD0048 +S31AFE002F0300480000403C60FE01386339D07F64DB7848008BB134 +S31AFE002F184800002C807E00103BDE0018480002DD7C1ED0007FDD +S31AFE002F2D9C1A144082FF543C60FE01386339FC7F64DB784800C3 +S31AFE002F428B858001002C7C0803A68321000C8341001083610024 +S31AFE002F57148381001883A1001C83C1002083E100243821002884 +S31AFE002F6C4E8000209421FBB87C0802A6930104289321042C9393 +S31AFE002F81410430936104349381043893A1043C93C1044093E1C6 +S31AFE002F9604449001044C3D2000003D6000003B093A683B2B3B78 +S31AFE002FAB287C7C1B787C9B2378480007FD2C0300003B400000B2 +S31AFE002FC07F1FC3783BC00004418202083C80000038847C7438B3 +S31AFE002FD561000838A00400480082E53BA104083D6000003D200D +S31AFE002FEAFE01934B3B80392939307FA3EB783880006C38A000EA +S31AFE002FFF0038C0000238E1042039000000480099B53D40FE0137 +S31AFE0030147F83E3787F64DB787FA6EB78394A2FB038A000013815 +S31AFE003029E000013900000039200000480099A92C03000041829F +S31AFE00303E01947C1FC800418200A480A104207FE3FB787FC4F3CA +S31AFE003053784800026538030001280000054181FFE03D60FE0197 +S31AFE003068396B39B85400103A7D4B002E3D20FE01392939B87DFA +S31AFE00307D4A4A147D4903A64E8004203C60000038637C74388151 +S31AFE003092000838A0040048008229480001343B400001807F0056 +S31AFE0030A7103BFF0018480001557FDE1A144BFFFF8C7FE9C2780E +S31AFE0030BC3129FFFF7D294910381FFFE87C0048787FE948387DC5 +S31AFE0030D13F03784BFFFF6C3C60FE0138633948480089E54BFFC0 +S31AFE0030E6FF5C2C1A0000418200E43C000BAD3D6000006000FA9E +S31AFE0030FBCE3D20DEAD3B8B7C746129DEAD900B7C74913C03F8E8 +S31AFE0031107F83E378388003FC480001393D2000003FE000008014 +S31AFE0031251F3B9481693B90907C03FC7C0002143C60FE017FC077 +S31AFE00313A58503863395C480094812C03000041820088809F3B73 +S31AFE00314F943BA104247FC3F3787FA5EB784800BA617C7F1B79A9 +S31AFE0031644182002C83A104247FE3FB784800BD697C661B783C23 +S31AFE00317960FE013863321C7FA4EB787FE5FB784800893D480042 +S31AFE00318E00447FC3F3787F84E3787FA6EB7838A004004800BB72 +S31AFE0031A38D7C7F1B794182002883A104247FE3FB784800BD25C1 +S31AFE0031B87C661B783C60FE01386339887FA4EB787FE5FB7848ED +S31AFE0031CD0088F98001044C7C0803A6830104288321042C834122 +S31AFE0031E20430836104348381043883A1043C83C1044083E104F0 +S31AFE0031F744382104484E8000203803FFFF280000054D81002094 +S31AFE00320C3D60FE01396B39185400103A7D4B002E3D20FE0139EF +S31AFE0032212939187D4A4A147D4903A64E800420386000044E802A +S31AFE0032360020386000084E800020386000004E800020386002B1 +S31AFE00324B004E800020388400035484F0BE7C8023782C00000074 +S31AFE00326038C0000038E000003884FFFF40810044816300007C26 +S31AFE0032758A23787D68383038E7000168E900102C0A00007D2A70 +S31AFE00328AFE707D404A787C0050507D6B43787C00FE707CC65AF9 +S31AFE00329F78386300047CE700383884FFFF4181FFC47CC333783B +S31AFE0032B44E8000209421FF707C0802A693010070932100749304 +S31AFE0032C94100789361007C9381008093A1008493C1008893E127 +S31AFE0032DE008C900100947C7B1B78807B00087C9F23782C0300B4 +S31AFE0032F3007CB82B78418200383881006038A000014BFFFB2594 +S31AFE003308801B000C2C00000041820014800100602C00000041B4 +S31AFE00331D82019848000010800100602C000000408201883D206F +S31AFE003332000039297C743C60FE01809B00047FBF4A1438633807 +S31AFE003347784800877D813B00103809FFFF280000054181014866 +S31AFE00335C3D60FE01396B38E85400103A7D4B002E3D20FE0139CF +S31AFE0033712938E87D4A4A147D4903A64E800420801D00002C00AB +S31AFE0033860000418200103D20FE0138893884480000303D20FEAF +S31AFE00339B013889388C480000243C60FE01809D00003863389408 +S31AFE0033B048008715480000EC7FA3EB784800AF457C641B783C7C +S31AFE0033C560FE0138633880480086F9480000D07FBEEB783BE0A3 +S31AFE0033DA00003F80FE013FA0FE017C9EF8AE387C38984800862C +S31AFE0033EFD9281F00044181000C387D38A0480086C93BFF000174 +S31AFE003404281F00054081FFDC3C60FE017FDDF378386338A448A6 +S31AFE0034190086AD480000843C60FE01386338A8480000883C6019 +S31AFE00342EFE01386338AC48008691881D00007FBEEB782C000037 +S31AFE003443007FBFEB78418200583F20FE013B4000003B80000A16 +S31AFE003458881E00002C00000A418200187FEBFB788C0B00012C03 +S31AFE00346D00000A4082FFF87D7F5B787FC4F3789B5F000038795B +S31AFE00348238B0480086413BDF00019B9F0000881E00007FDFF3EE +S31AFE003497782C0000004082FFBC2C180000418200183C60FE0141 +S31AFE0034AC386338AC48008615386000024800022C801B00102CBE +S31AFE0034C100000441820054386100083880005038A0000048000E +S31AFE0034D68C612C0300003860FFFF4180020438610008480086F5 +S31AFE0034EB992C0300004182FFC4880100082C00002E4082000CC1 +S31AFE00350038600000480001E02C00005E4082000C3860000348B6 +S31AFE0035150001D0813B00103809FFFF28000005418101BC3D6078 +S31AFE00352AFE01396B39005400103A7D4B002E3D20FE0139293921 +S31AFE00353F007D4A4A147D4903A64E80042083FD000038610008CC +S31AFE0035547FA4EB784800994D4800003083FD0000386100087F92 +S31AFE003569A4EB7838A0000038C00000480097C14800001483FDF6 +S31AFE00357E0000386100087FA4EB784800AC112C03000041820115 +S31AFE0035933C801D00007FE002787C09FE707D2302787C634850E9 +S31AFE0035A87C63FE707C6018F8546307FE540007BC7C630378485C +S31AFE0035BD000128801D0000A17D00049001005839210058B16958 +S31AFE0035D20004380100087D3A4B78900100683BC000003F60FE90 +S31AFE0035E7013BE100643B810068806100687FE4FB787F85E378A8 +S31AFE0035FC38DB38A0480097352C030000418200B4881F00037CEB +S31AFE0036111DF1AE3BDE0001281E00054081FFD4480000C03C6047 +S31AFE003626FE017FBEEB78386338B84800849548000044880100EB +S31AFE00363B083BE100082C000000418200287FC4F3787FEBFB78A8 +S31AFE003650880B0000980400008D2B0001388400012C0900004047 +S31AFE00366582FFEC7C9E23783800000A981E00003BDE00013800E0 +S31AFE00367A00003C60FE01981E0000386338E44800843D3861008D +S31AFE00368F083880005038A0000048008A9D2C0300003860FFFF06 +S31AFE0036A44180004038610008480084D52C0300004082FF84480E +S31AFE0036B9000028A01A000481210058B01D0004913D00003860E1 +S31AFE0036CE0004480000143C60FE01386338A8480083E938600021 +S31AFE0036E301800100947C0803A683010070832100748341007843 +S31AFE0036F88361007C8381008083A1008483C1008883E1008C3839 +S31AFE00370D2100904E8000209421FFF07C0802A693C1000893E164 +S31AFE003722000C900100147C7E1B782C1E00017C9F23784181008D +S31AFE003737143C60FE01386337D0480013C94800005448000069B7 +S31AFE00374C2C030000418200483C6000003C80000080BF00043857 +S31AFE003761633988388439F8480090957C631B794182001C8003FC +S31AFE003776000C7FC3F3787FE4FB787C0803A64E80002148000047 +S31AFE00378B103C60FE01386337E448001375800100147C0803A632 +S31AFE0037A083C1000883E1000C382100104E8000209421FFE07CED +S31AFE0037B50802A6934100089361000C9381001093A1001493C1AF +S31AFE0037CA001893E1001C900100243D200000800933002C000044 +S31AFE0037DF004082009C3FE00000807F3B5C3800000190093300B9 +S31AFE0037F43C63FFFF3C8000014800B2AD7C641B79418200183C30 +S31AFE00380960FE0138633778480082B538600000480000683F6097 +S31AFE00381E00003F40000038600000389B3B8C38BA3B904800B328 +S31AFE003833213FA000003F800000387D3B94389C3B984800B34156 +S31AFE003848809B3B8C80BA3B9080DC3B983C60FE0180FD3B943832 +S31AFE00385D6337A048008265813D3B94801F3B5C3D2900017C093A +S31AFE00387200503D600000900B3B9C38600001800100247C080319 +S31AFE003887A6834100088361000C8381001083A1001483C100181E +S31AFE00389C83E1001C382100204E8000209421FFA87C0802A69311 +S31AFE0038B181004893A1004C93C1005093E100549001005C380024 +S31AFE0038C600007C7D1B787C9C23783D20FE0190010040392936E5 +S31AFE0038DBDC9001003C386100083880006238A0000138C000009F +S31AFE0038F038E100383901003C480090C93D20FE01392936F83833 +S31AFE0039056100203880006338A0000038C0000238E100403900A9 +S31AFE00391A0000480090A53D40FE017FA3EB787F84E378394A36FF +S31AFE00392FA438A0000238C1000838E0000239010044392000010E +S31AFE003944480090992C030000408200143C60FE013863343C4806 +S31AFE0039590011B1480000E080610044480011ED7C7D1B794082B1 +S31AFE00396E00183C60FE0180810044386336C44800814948000059 +S31AFE003983BC8001003C2C0000004082000C801D0014900100383E +S31AFE0039983D20000080093B74806100387C0300404180001C804C +S31AFE0039ADBD00183D20000081693B5C7C032A147C0058404180BC +S31AFE0039C200143C60FE013863370C480080F94800006C809D00CD +S31AFE0039D710480078E9801D00FC817D001C2C0000003D200000E2 +S31AFE0039EC91693B7C4182004C80610038809D00204800121180C1 +S31AFE003A019D00FC7C7C1B787C1C2000418200143C60FE013863C3 +S31AFE003A1637247F85E378480080A9800100402C000000418200BC +S31AFE003A2B143C60FE01386337647F84E3784800808D8001005C0D +S31AFE003A407C0803A68381004883A1004C83C1005083E100543800 +S31AFE003A552100584E8000209421FFD87C0802A693410010936161 +S31AFE003A6A00149381001893A1001C93C1002093E1002490010016 +S31AFE003A7F2C3D40FE01394A36A438A0000238C0000038E000003F +S31AFE003A94390100083920000148008F412C030000408200143C24 +S31AFE003AA960FE013863343C48001059480001843D6000003D2022 +S31AFE003ABE000080A93B94800B3B903FA000007F650050807D3B56 +S31AFE003AD39C7F64DB78480077E983DD3B9C3BA000003BDE020033 +S31AFE003AE83BE000024800000C3BFF00013BDE01003F4000008000 +S31AFE003AFD1A3B945400C23E7C1F004040800040881E00002C00C6 +S31AFE003B1200FF4182FFDC806100087FC4F378480080892C0300E6 +S31AFE003B27004082FFC83C60FE0180810008386336B048008A897C +S31AFE003B3C2C030000418200F83BA000012C1D0000408200183C4B +S31AFE003B5160FE0180810008386336C448007F69480000D83B8152 +S31AFE003B66000C807E0010809E00187F85E3784800B0497C7F1B40 +S31AFE003B7B794182002883A1000C7FE3FB784800B3517C661B7807 +S31AFE003B903C60FE01386336447FA4EB787FE5FB7848007F257FA4 +S31AFE003BA5C3F378388000FF38A00100480077E9809A3B947F63D6 +S31AFE003BBADB787F85E3784800AFFD7C7F1B794182002C83A100AA +S31AFE003BCF0C7FE3FB784800B3057C661B783C60FE0138633644D7 +S31AFE003BE47FA4EB787FE5FB7848007ED9480000483D200000805F +S31AFE003BF9893B9C80BA3B947F63DB787F86E3784800B1257C7F9C +S31AFE003C0E1B794182002883A1000C7FE3FB784800B2BD7C661B65 +S31AFE003C23783C60FE01386336647FA4EB787FE5FB7848007E918C +S31AFE003C388001002C7C0803A6834100108361001483810018832E +S31AFE003C4DA1001C83C1002083E10024382100284E800020942191 +S31AFE003C62FFA07C0802A69381005093A1005493C1005893E10072 +S31AFE003C775C90010064380000007C7D1B787C9C23783D20FE0110 +S31AFE003C8C90010044392933E09001003C38610008388000663811 +S31AFE003CA1A0000138C0000038E100383901003C48008D113D2067 +S31AFE003CB6FE0139293688386100203880006C38A0000138C00028 +S31AFE003CCB0038E100403901004448008CED3D40FE017FA3EB7847 +S31AFE003CE07F84E378394A2FB038A0000238C1000838E0000239DD +S31AFE003CF50000003920000048008CE12C030000408200143C6007 +S31AFE003D0AFE013863343C48000DF9480001048001003C2C000012 +S31AFE003D1F0041820010800100442C000000408200143C60FE0156 +S31AFE003D343863369048000DD1480000DC806100384800ADC97C78 +S31AFE003D497C1B794082002080610038800100407C630214386305 +S31AFE003D5EFFFF4800ADAD7C7C1B794182004483A100387F83E3D8 +S31AFE003D73784800B1657C651B783C60FE01386334987FA4EB7865 +S31AFE003D8848007D3D3D2000003D6000003C60FE0180893B8C803B +S31AFE003D9DAB3B90386334B848007D2148000070808100388001B8 +S31AFE003DB200407C8323787C8402143884FFFF4800B2FD2C030028 +S31AFE003DC700418200143C60FE01386335C848007CF1480000409C +S31AFE003DDC806100388081004038A100484800ADD57C7C1B7941BC +S31AFE003DF182002883A100487F83E3784800B0DD7C661B783C6060 +S31AFE003E06FE01386336447FA4EB787F85E37848007CB1800100B4 +S31AFE003E1B647C0803A68381005083A1005483C1005883E1005CD5 +S31AFE003E30382100604E8000209421FF187C0802A6934100D093A3 +S31AFE003E456100D4938100D893A100DC93C100E093E100E4900116 +S31AFE003E5A00EC380000007C7D1B787C9C23783D20FE01900100FF +S31AFE003E6FC4392933A49001009C900100A4900100AC900100B459 +S31AFE003E84900100BC386100083880006238A0000138C000003814 +S31AFE003E99E100983901009C48008B213D20FE01392933B838618B +S31AFE003EAE00203880007238A0000138C0000038E100A0390100ED +S31AFE003EC3A448008AFD3D20FE01392933CC3861003838800065C8 +S31AFE003ED838A0000138C0000038E100A8390100AC48008AD93876 +S31AFE003EEDE100B03D20FE017CFE3B78392933E03861005038808C +S31AFE003F02006638A0000138C00000390100B448008AB13D20FEA3 +S31AFE003F1701392933FC386100683880006C38A0000138C0000009 +S31AFE003F2C38E100B8390100BC48008A8D3D20FE01392934143818 +S31AFE003F416100803880007338A0000138C0000038E100C0390177 +S31AFE003F5600C448008A693D40FE017FA3EB787F84E378394A343D +S31AFE003F6B3038A0000238C1000838E00006390100C839200001B8 +S31AFE003F8048008A5D2C030000408200143C60FE013863343C4806 +S31AFE003F95000B75480004B08001009C2C0000004182001C8001EE +S31AFE003FAA00BC2C00000041820010800100C82C0000004082000C +S31AFE003FBF143C60FE013863345048000B414800047C800100C47A +S31AFE003FD4814100B82C00000040820008914100C03D20000080F5 +S31AFE003FE9093B94816100C07D2A02143929FFFF7D2903963F406A +S31AFE003FFE00007D2901D67C095840912100B8408000143C60FE38 +S31AFE004013013863346C48007AAD4800042C800100B42C00000010 +S31AFE00402841820070806100B04800AADD7C7C1B794082002080FE +S31AFE00403D6100B0800100C07C6302143863FFFF4800AAC17C7CDF +S31AFE0040521B794182004483A100B07F83E3784800AE797C651B1E +S31AFE004067783C60FE01386334987FA4EB7848007A513D200000D0 +S31AFE00407C3D6000003C60FE0180893B8C80AB3B90386334B8485E +S31AFE004091007A35480003B43FE0000080810098801F3B747C04E2 +S31AFE0040A600404180001C800100C03D20000081693B5C7C040243 +S31AFE0040BB147C005840418000283C60FE01386334D4480079F9E3 +S31AFE0040D03D2000003C60FE01809F3B7480A93B5C386334B84882 +S31AFE0040E50079E1806100C848007A952803000F408100183C60B9 +S31AFE0040FAFE013863350038800010480079C14800034080010088 +S31AFE00410FB42C0000004082002C808100B87FC3F37848000351C7 +S31AFE0041242C030000408200183C60FE01808100B83863353048DD +S31AFE00413900798D4800030C3F8000003D20000080BC3B94800960 +S31AFE00414E3B903FA000007F650050807D3B9C7F64DB78480071B7 +S31AFE00416361801C3B9483FD3B9C5409C23F3BA000003B8000002C +S31AFE004178418200883FC0FE01881F00002C0000FF418200608070 +S31AFE00418D6100C87FE4FB7848007A152C0300004082004C800185 +S31AFE0041A200B42C00000041820014813F0010800100B07C0900C7 +S31AFE0041B7004082022C813F0018800100B87C0900004082022C79 +S31AFE0041CC808100C8387E35AC480083ED2C0300004182026C3B27 +S31AFE0041E18000014800001C801A3B943BBD00015400C23E7C1D91 +S31AFE0041F600403BFF01004180FF842C1C0000814100C080610046 +S31AFE00420BB04082004C3D20000080093B943D6000005400C23E36 +S31AFE0042207C1C004083EB3B9C3BA000004800001C3D200000804C +S31AFE004235093B943BBD00015400C23E7C1D00403BFF0100408077 +S31AFE00424A0010881F00002C0000FF4082FFDC7C8352143884FFBC +S31AFE00425FFF4800AE5D2C030000418200143C60FE01386335C8BB +S31AFE00427448007851480001D038A100CC806100B0808100B87C9C +S31AFE004289BE2B784800A9317C7C1B793BA000014182002C83A11E +S31AFE00429E00CC7F83E3784800AC357C661B783C60FE017FA4EB97 +S31AFE0042B378386335FC7F85E378480078093BA000002C1D000062 +S31AFE0042C841820044806100B08081009880A100C07FC6F37848D3 +S31AFE0042DD00AA517C7C1B794182002883A100CC7F83E3784800C1 +S31AFE0042F2ABE97C661B783C60FE01386336207FA4EB787F85E3B1 +S31AFE00430778480077BD7FE3FB783880000038A00100480070810A +S31AFE00431C808100C87FE3FB78480078B9800100A4812100B02CCE +S31AFE004331000000913F001040820020800100B42C00000041828D +S31AFE004346000C812100B04800001081210098480000088121007C +S31AFE00435BA0800100AC913F00142C000000408200103D2000003D +S31AFE00437080093B7C48000008800100A8901F001C800100B890E7 +S31AFE0043851F0018812100C0913F002080610098808100C0480014 +S31AFE00439A08753D200000907F00FC80893B947F63DB787FC5F3E1 +S31AFE0043AF784800A80D7C7C1B794182004C83A100CC7F83E37898 +S31AFE0043C44800AB157C661B783C60FE01386336447FA4EB787FAE +S31AFE0043D985E378480076E9480000683C60FE0138633558480089 +S31AFE0043EE76D9480000583C60FE0138633584480076C948000009 +S31AFE004403483D20000080893B9C80BA3B947F63DB787FC6F3782D +S31AFE0044184800A9157C7C1B794182002883A100CC7F83E3784879 +S31AFE00442D00AAAD7C661B783C60FE01386336647FA4EB787F8550 +S31AFE004442E37848007681800100EC7C0803A6834100D0836100B5 +S31AFE004457D4838100D883A100DC83C100E083E100E4382100E8EF +S31AFE00446C4E8000203D20000080E93B943D600000814B3B8C3D47 +S31AFE0044812000007C073A1481093B907D4A02147D4953787C09E9 +S31AFE00449640404080007054E0F0BE7C0603785407103A800A004F +S31AFE0044AB002C00FFFF4182004C7C095000418200147C095050EE +S31AFE0044C07C0016707C002040408000587D4953787C0940404017 +S31AFE0044D580002054CB103A7D295A147C09404040800010800953 +S31AFE0044EA00002C00FFFF4082FFEC7D2A4B78480000087D4A3A27 +S31AFE0044FF147C0A40404180FFA47C095000418200207C09505049 +S31AFE0045147C0016707C0020404180001091230000386000014E44 +S31AFE004529800020386000004E8000209421FFE07C0802A693619F +S31AFE00453E000C9381001093A1001493C1001893E1001C9001005F +S31AFE004553243D20000080093B943D600000814B3B8C3D200000E9 +S31AFE00456883C93B907C0002147FEA02147C1FF0407FE4FB783F32 +S31AFE00457D600000408000883F80FE013FA00000801F00002C0015 +S31AFE004592FFFF4182005C7C04F80041820010387C338C7FE5FBD6 +S31AFE0045A7784800751D7C1FF0407FE4FB7840800034801F000075 +S31AFE0045BC2C00FFFF41820028801D3B945400F0BE5409103A7C40 +S31AFE0045D1844A147C04F04040800010800400002C00FFFF4082FF +S31AFE0045E6FFEC7C9F237848000014801B3B945400F0BE540010EF +S31AFE0045FB3A7FFF02147C1FF0404180FF887C04F8004182001477 +S31AFE0046103C60FE013863338C7FE5FB78480074A9800100247C3F +S31AFE0046250803A68361000C8381001083A1001483C1001883E1CF +S31AFE00463A001C382100204E8000209421FFC87C0802A693810028 +S31AFE00464F2893A1002C93C1003093E100349001003C7C7D1B7845 +S31AFE0046647C9C2378380000003D20FE0190010020392932F43885 +S31AFE0046796100083880006338A0000038C0000238E10020390060 +S31AFE00468E0000480083313D40FE017FA3EB787F84E378394A2F06 +S31AFE0046A3B038A0000238C1000838E000013900000039200000C8 +S31AFE0046B8480083252C030000418200B4810100203D2000003D17 +S31AFE0046CD60000081493B90800B3B942C0800007FA050503FE073 +S31AFE0046E20000418200103D20FE01388933484800000C3D20FEA5 +S31AFE0046F701388933543C60FE0138633308480073C13D20000017 +S31AFE00470C80093B943B8000005409C23F4182005C3FC0FE01887E +S31AFE0047211D00002C0000FF418200348001002080BD00102C0026 +S31AFE00473600004182000C80DD00FC4800000880DD001480FD0004 +S31AFE00474B18811D001C387E33607FA4EB784800736D801F3B941E +S31AFE0047603B9C00015400C23E7C1C00403BBD01004180FFB08053 +S31AFE00477501003C7C0803A68381002883A1002C83C1003083E16D +S31AFE00478A0034382100384E8000209421FFB87C0802A693210017 +S31AFE00479F2C93410030936100349381003893A1003C93C1004059 +S31AFE0047B493E100449001004C7C7D1B787C9C23783BE000003DC0 +S31AFE0047C920FE013929319093E10020386100083880006638A06A +S31AFE0047DE000038C0000238E1002039000000480081D53D40FE3D +S31AFE0047F3017FA3EB787F84E378394A2FB038A0000238C100088C +S31AFE00480838E000013900000039200000480081C92C03000041EA +S31AFE00481D8202C03C60FE01386331BC48007D992C0300004082CC +S31AFE00483200143C60FE01386331EC480072894800029C3C60FE43 +S31AFE00484701386331F848007279800100202C0000004182006C64 +S31AFE00485C3D20000080893B983D600000800B3B943D200000387E +S31AFE00487184FFFC80693B8C7C8401D63BA100247C0002147C63B7 +S31AFE00488602147FA5EB784800A3317C7C1B797FBEEB7841820071 +S31AFE00489B3C83A100247F83E3784800A6357C661B783C60FE01F0 +S31AFE0048B03863321C7FA4EB787F85E37848007209480000143CC6 +S31AFE0048C560FE0138633244480071F93BC100243F400000839AFC +S31AFE0048DA3B943C0000027F9C00003F20000083B93B9C4FFEEBF3 +S31AFE0048EF827C000026540007FE7C0000D07C0900F87F9C003817 +S31AFE0049045529039C7F9C4B787FA3EB783880000038A001004841 +S31AFE004919006A813D20FE013F6000003969328C801B3B8C814913 +S31AFE00492E328C810B0004939D0018915D0000911D0004901D008D +S31AFE00494314901D00103BBD01007FA3EB783880000038A001007B +S31AFE00495848006A413D60FE01801B3B8C810B3294392B32948059 +S31AFE00496DE9000C81690004814900087C00E214939D0018911D14 +S31AFE0049820000917D0004915D000890FD000C901D0014901D000D +S31AFE004997103BBD01007FA3EB783880000038A00100480069F146 +S31AFE0049AC3D20FE01800932A4396932A4812B0008814B0004A19A +S31AFE0049C10B000C913D0008901D0000915D0004B11D000C880BE4 +S31AFE0049D6000E3F800000981D000E817A3B94801C3B907D2B5A05 +S31AFE0049EB147C090050901D0014917D0018901D00103BBD01002D +S31AFE004A007FA3EB783880000038A001004800698D801C3B908062 +S31AFE004A159A3B943D60FE01814B32B47F640050392B32B4A109AA +S31AFE004A2A000C8009000481690008915D0000901D0004917D003B +S31AFE004A3F08B11D000C909D0018937D0010937D00147F63DB78BE +S31AFE004A547FC5F3784800A1653BFF00013BFF00017C7C1B793B0F +S31AFE004A69FF00013BFF00014182002C83A100247F83E37848001D +S31AFE004A7EA45D7C661B783C60FE013863321C7FA4EB787F85E3B8 +S31AFE004A9378480070314800004480993B9C7F63DB7857E5402E4E +S31AFE004AA87FC6F3784800A2817C7C1B794182002883A100247F9C +S31AFE004ABD83E3784800A4197C661B783C60FE01386332C47FA439 +S31AFE004AD2EB787F85E37848006FED8001004C7C0803A6832100C7 +S31AFE004AE72C83410030836100348381003883A1003C83C100405E +S31AFE004AFC83E10044382100484E8000209421FFF87C0802A69002 +S31AFE004B1101000C7C641B783C60FE013863316848006FA53C6044 +S31AFE004B2600003C8000003CA0FE0138633988388439F838A53188 +S31AFE004B3B8848007E018001000C7C0803A6382100084E80002009 +S31AFE004B509421FFE87C0802A69381000893A1000C93C100109331 +S31AFE004B65E100149001001C3F8000003D20000080BC3B94808965 +S31AFE004B7A3B903FA000007C7F1B78807D3B9C7C852050480067F6 +S31AFE004B8F35801C3B9483BD3B9C5409C23F3B8000003FC000003E +S31AFE004BA441820044881D00002C0000FF418200207FE3FB787FEA +S31AFE004BB9A4EB7848006FED2C0300004082000C7FA3EB7848006E +S31AFE004BCE0020801E3B943B9C00015400C23E7C1C00403BBD0144 +S31AFE004BE3004180FFC4386000008001001C7C0803A683810008C7 +S31AFE004BF883A1000C83C1001083E10014382100184E8000203811 +S31AFE004C0D8400035484F0BE7C8023782C00000039600000388469 +S31AFE004C22FFFF408100207C802378812300002C00000038630098 +S31AFE004C37047D6B4A783884FFFF4181FFE87D635B784E800020B2 +S31AFE004C4C9421FF207C0802A67D800026934100C8936100CC933D +S31AFE004C618100D093A100D493C100D893E100DC900100E49181DE +S31AFE004C7600C43BA000007C7B1B787C9A237893A1009893A1004B +S31AFE004C8BB0386100083880000038A0000C480067013D20000115 +S31AFE004CA08149211C3B8100183800000C396000013D20FE017F67 +S31AFE004CB583E378B0010010B161000E91410008B3A1000C39298B +S31AFE004CCA2D703880007638A0000038C0000238E1009039000052 +S31AFE004CDF0048007CE13D20FE0139292D783861003038800072C1 +S31AFE004CF438A0000038C0000238E100943900000048007CBD3D31 +S31AFE004D0920FE0139292D88386100483880006238A0000138C08F +S31AFE004D1E000038E100983901009C48007C993D20FE0139292DAD +S31AFE004D3398386100603880006D38A0000138C0000138E100A026 +S31AFE004D48390100A448007C753D20FE0139292DBC38610078384B +S31AFE004D5D80006838A0000138C0000138E100A8390100AC480094 +S31AFE004D727C513D40FE017F86E3787F63DB787F44D378394A2D8C +S31AFE004D87D438A0000138E00005390100B03920000148007C45FC +S31AFE004D9C2C0300003B8000004182030C800100AC2C00000041A8 +S31AFE004DB182002C806100A838810008480093DD2C030000408248 +S31AFE004DC600183C60FE01808100A838632DE048006CF1480002E1 +S31AFE004DDBD8800100A42C000000418200E883A100A03BBD00012E +S31AFE004DF07FA3EB7848006D8D7C651B783C80FE017FA3EB7838F7 +S31AFE004E05842DF848006EB52C0300004082006C812100A07D2440 +S31AFE004E1A4B78892900003809FFBF280000194181000C380900BB +S31AFE004E2F205409063E7D204B782C0000794182002841810010E7 +S31AFE004E442C00007841820014480000282C00007A4182001848A1 +S31AFE004E5900001C3B8000014800006C3B800002480000643B8090 +S31AFE004E6E00034800005C3C60FE0148000048806100A03C80FE1E +S31AFE004E830138842E1448006D892C030000408200283D20000063 +S31AFE004E9880093B843B8000002C000000408200283C60FE013815 +S31AFE004EAD632E1C48006C15480001FC3C60FE01808100A038635A +S31AFE004EC22E0048006C01480001E82E1C00004092007480610052 +S31AFE004ED7B02C030000408200283C60FE0138632E4448006BDDC1 +S31AFE004EEC3C60FE013C80000038632E583884330C48006BC94876 +S31AFE004F010001B03BA100B43881000838A000017FA6EB784800EC +S31AFE004F16800D7C7B1B7940800014806100B483A100B048008362 +S31AFE004F2BA5480000403C60FE01808100903863D0C8480001C1D7 +S31AFE004F40480000543BA100B4806100B07F84E3787FA5EB78486E +S31AFE004F5500A6797C7B1B7940800028806100B483A100B0480000 +S31AFE004F6AAA017C651B783C60FE0138632E687FA4EB7848006B0A +S31AFE004F7F49480001303C60FE01808100903863F7504800016D93 +S31AFE004F943D2000013BE922343B8000003B4100B84800000C7F6A +S31AFE004FA97CD1AE3B9C0001281C0003418100184800016D7C7B4E +S31AFE004FBE1B794080FFE8801F0110900100B42C1B0000418000A2 +S31AFE004FD3D44800010D800100942C000000418200548001009C26 +S31AFE004FE82C000000408200143C60FE0138632E8048006ACD4803 +S31AFE004FFD0000A8838100984800000C987C00003B9C00014800CF +S31AFE00501201157C631B794080FFF03C60FE018081009838632E50 +S31AFE005027A47F85E37848006A99480000743C80FE0138842EBC05 +S31AFE00503C386100B938A0000348006C2D2C0300003B8100B8406A +S31AFE0050518200143C60FE0038635124480006DD480000448801C6 +S31AFE00506600B82C00005340820028893C00013929FFD0280900E8 +S31AFE00507B09418100183C60FE008081009838635124480001C9E4 +S31AFE005090480000143C60FE01808100B838632EC048006A2540B7 +S31AFE0050A592000C7FA3EB7848008009800100E4818100C47C084F +S31AFE0050BA03A6834100C8836100CC838100D083A100D483C100E8 +S31AFE0050CFD883E100DC7D808120382100E04E8000203D2000018D +S31AFE0050E4392922348009010C3969000490090108916901044ED0 +S31AFE0050F98000203D600001392B22343940000038000100906BF9 +S31AFE00510E2234914901189009010C90890114914901084E8000BA +S31AFE005123209421FFF07C0802A693C1000893E1000C9001001402 +S31AFE0051383D2000013BE9223483DF01082C1E00004080000C38CD +S31AFE00514D60FFFF480000EC408200C4801F01142C00000041828E +S31AFE0051620038817F01183D200000392933047C8958AE396B003E +S31AFE005177013C60FE01917F011838632D6848006941801F011880 +S31AFE00518C280000064081000893DF01183D2000013BE922348030 +S31AFE0051A11F010C2C0000FF41810020801F01142C000000418219 +S31AFE0051B6FF983C60FE0138632D6C480069054BFFFF883D200096 +S31AFE0051CB0181292234381F00047C0303783880010038BF0110B4 +S31AFE0051E07D2803A6901F01044E8000212C030000907F010C90EA +S31AFE0051F57F010841810020801F01142C0000004182FF483C60B1 +S31AFE00520AFE0138632D6C480068B54BFFFF383D400001394A224F +S31AFE00521F34812A0108816A01043929FFFF912A0108886B000087 +S31AFE005234396B0001916A0104800100147C0803A683C10008832B +S31AFE005249E1000C382100104E8000209421FF707C0802A69281A5 +S31AFE00525E006092A1006492C1006892E1006C93010070932100EE +S31AFE00527374934100789361007C9381008093A1008493C10088CA +S31AFE00528893E1008C900100947C7D1B787C9523783B6000003ADB +S31AFE00529D8000013B2000003AC000003AE0FFFF480002602C052F +S31AFE0052B20053418200183C60FE0138632C087F64DB7848006865 +S31AFE0052C701480002547FA803A63B7B00024E80002138A1005887 +S31AFE0052DC38000000547C063E7CBA2B78900100587FA3EB7838EE +S31AFE0052F1800001480002697C7F1B79408000183C60FE013863D3 +S31AFE0053062C347F64DB78480067B94800020C381CFFD0280000EF +S31AFE00531B093B7B0001418101AC3D60FE01396B2D405400103AFF +S31AFE0053307D4B002E3D20FE0139292D407D4A4A147D4903A64E61 +S31AFE0053458004207FA3EB78389CFFD17F45D378480002092C14E0 +S31AFE00535A00007C7E1B78381BFFD17FD8F3787F60E21441820030 +S31AFE00536F2C2C1500004182001C7F3EA8503C60FE0138632C586A +S31AFE0053847F24CB784800673D480000083B2000003A8000003D9C +S31AFE00539920000081693B747FDECA147D39F0507C1748107C00AA +S31AFE0053AE01107C0003B87D2900787C1E58407EE000387C174BDA +S31AFE0053C378418000143D20000080093B5C7C1E00404081001854 +S31AFE0053D83C60FE0138632C707FC4F378480066E14800013438F8 +S31AFE0053ED1F002E7FFC00507FE9FB782C0900007F7BFA143BFF3D +S31AFE005402FFFF408100307F5CD3787FA3EB78388000017F85E357 +S31AFE00541778480001457FE0FB782C000000987E00003BDE000148 +S31AFE00542C3BFFFFFF4181FFDC7FA3EB783880000138A000004834 +S31AFE00544100011D88A1005B7C6318F85466063E7C0628003B7B63 +S31AFE005456000190A10058418200183C60FE0138632CAC7F04C384 +S31AFE00546B7848006659480000AC7D39F0507C09B0107C000110ED +S31AFE0054807C0003B87D2900787EC000387C164B78480000547FD8 +S31AFE005495A3EB78209C003B7F45D378480000BD7C7E1B783D2003 +S31AFE0054AA00003C60FE0193C93B7C38632CE87FC4F3787EE5BBC0 +S31AFE0054BF787EC6B37848006601480000543C60FE0138632D102F +S31AFE0054D47F64DB787F85E378480065E94800003C7F7FDB787F40 +S31AFE0054E9BEEB78480000083BFF00017FC803A64E8000212C03F0 +S31AFE0054FE000A4082FFF07FDDF3787FFBFB787FA803A64E800088 +S31AFE005513217C651B794181FD98800100947C0803A682810060ED +S31AFE00552882A1006482C1006882E1006C830100708321007483DA +S31AFE00553D4100788361007C8381008083A1008483C1008883E1E0 +S31AFE005552008C382100904E8000209421FFE07C0802A693610029 +S31AFE0055670C9381001093A1001493C1001893E1001C9001002402 +S31AFE00557C7C9E23787FC0F3782C0000007C7B1B787CBC2B783BEB +S31AFE005591A000003BDEFFFF408101787F6803A64E8000217F68AA +S31AFE0055A603A6547F063E4E800021393FFFD0381FFFBF21290097 +S31AFE0055BB09392000007D29491420000005380000007C00011484 +S31AFE0055D07D270379546B063E3920000040820010381FFF9F2857 +S31AFE0055E500000541810008392000012C09000041820104392B23 +S31AFE0055FAFFD0380BFFBF7D2A4B787C0803785529063E54000643 +S31AFE00560F3E21290009392000007D294914200000053800000038 +S31AFE0056247C0001147D2703793920000040820010380BFF9F2888 +S31AFE00563900000541810008392000012C090000418200B0393F0F +S31AFE00564EFFD05520063E2800000957BD402E4181000C7D234B4F +S31AFE0056637848000030381FFF9F280000054181000C387FFFA9EF +S31AFE0056784800001C381FFFBF393FFFC9200000057C0001107C32 +S31AFE00568D0003B87C0348385540063E280000094181000C7D49AC +S31AFE0056A2537848000030380BFF9F280000054181000C392BFF6D +S31AFE0056B7A94800001C5500063E392BFFC9200000057C00011056 +S31AFE0056CC7C0003B87C094838546020362C1C00007C034B787F76 +S31AFE0056E1BD1B784182001C801C00007C001A14901C0000480047 +S31AFE0056F6000C3860FFFF480000187FC0F3782C0000003BDEFFAB +S31AFE00570BFF4181FE907FA3EB78800100247C0803A68361000CEF +S31AFE0057208381001083A1001483C1001883E1001C382100204E81 +S31AFE0057358000209421FFF87C0802A69001000C3C60FE01386310 +S31AFE00574A2BEC480063798001000C7C0803A6382100084E800022 +S31AFE00575F203860001C4E8000209421FFE87C0802A693A1000C67 +S31AFE00577493C1001093E100149001001C7C7D1B78813D000483B2 +S31AFE005789C900044800002C73E00012418200107FA3EB787FE4A6 +S31AFE00579EFB784800004973E000084182000C7FA3EB78480001F6 +S31AFE0057B3A9B3FE0010A01E00107000001A541F043E2C1F00001B +S31AFE0057C84082FFC88001001C7C0803A683A1000C83C10010836E +S31AFE0057DDE10014382100184E8000209421FFE87C0802A6938183 +S31AFE0057F2000893A1000C93C1001093E100149001001C7C7D1BA9 +S31AFE0058077883DD000483FE0018A01F0000700090002C00100018 +S31AFE00581C408200683B9E0028813D0000801E0010816900247C52 +S31AFE00583100F850816B00085400F87AA13F00007C9C002E7FA314 +S31AFE005846EB7838A000007D6803A67129EFFFB13F00004E80003A +S31AFE00585B21A01F0000700920004182000C83FE0010480000080B +S31AFE0058703BFF0008A01F0000700090002C0010004182FFA493E9 +S31AFE005885FE00188001001C7C0803A68381000883A1000C83C1AA +S31AFE00589A001083E10014382100184E8000209421FFE87C0802EC +S31AFE0058AFA693A1000C93C1001093E100149001001C81230004B9 +S31AFE0058C48169000C83EB00047C188AA654000FFE2C00000041D1 +S31AFE0058D9820028812B0004A00B00022C000000408100187C002E +S31AFE0058EE4BAC7C0004AC3400FFF0392900104181FFF02C050007 +S31AFE00590300408100387C9E23787CBD2B78807E00002C030000D4 +S31AFE0059184182001880BE00047FE4FB784800599D801E00047F24 +S31AFE00592DFF021437BDFFFF3BDE00084082FFD88001001C7C087F +S31AFE00594203A683A1000C83C1001083E10014382100184E800068 +S31AFE005957209421FFE87C0802A693A1000C93C1001093E1001423 +S31AFE00596C9001001C7C7D1B7883DD000483FE001C4800004881D7 +S31AFE0059813D000093FE000C816900247FA3EB78800B0004A09FD2 +S31AFE00599600027C0803A64E800021A01F000060008000B01F006C +S31AFE0059AB00A13F0000712020004182000C83FE0014480000089E +S31AFE0059C03BFF0008A01F0000700090002C0010004182FFB0938C +S31AFE0059D5FE001C8001001C7C0803A683A1000C83C1001083E1ED +S31AFE0059EA0014382100184E8000209421FFD87C0802A6930100E5 +S31AFE0059FF089321000C93410010936100149381001893A1001C5F +S31AFE005A1493C1002093E100249001002C83C300047C9823788334 +S31AFE005A29BE00087CBB2B78A01D00007CD93378700980007CFA98 +S31AFE005A3E3B78418200447FBFEB783F80FE01A01F0000700920DE +S31AFE005A53004182000C83FE0010480000083BFF00087C1FE800C5 +S31AFE005A684082000C387C2BAC48006055A01F00007009800040D7 +S31AFE005A7D82FFD07FFDFB78A01D00007009200041820010801E09 +S31AFE005A9200107C0903784800000C381D0008813E0010901E00BD +S31AFE005AA7087C09E8502C1B00005400F87A393E0028B33D000283 +S31AFE005ABC7F49012E83FD0004408100307F1EC3787F7CDB7880BF +S31AFE005AD19E000080BE00047FE3FB78480057E5801E0004379C0E +S31AFE005AE6FFFF3BDE00087FFF02144082FFE07C188AA654000F2C +S31AFE005AFBFE2C00000041820028813D0004A01D00022C000000D0 +S31AFE005B10408100187C004BAC7C0004AC3400FFF039290010412E +S31AFE005B2581FFF0A01D00006000DC00B01D00008001002C7C0800 +S31AFE005B3A03A6830100088321000C83410010836100148381009D +S31AFE005B4F1883A1001C83C1002083E10024382100284E8000208A +S31AFE005B648123000481690008A06B000054638BFE686300014E29 +S31AFE005B79800020688401003004FFFF7C6021104E8000208123B5 +S31AFE005B8E000481690004800B000060000030900B00004E800088 +S31AFE005BA3208123000481690004800B000054000732900B000080 +S31AFE005BB84E8000209421FFD87C0802A69321000C9341001093F7 +S31AFE005BCD6100149381001893A1001C93C1002093E10024900131 +S31AFE005BE2002C83230008839900047FDE9AA677DEFFFF3C800004 +S31AFE005BF700388433A03860000838A0000648000D2D7F788AA6DF +S31AFE005C0C577B0FFE39200000380000807C0903A6612010003C94 +S31AFE005C21C00E007C0004AC7D398BA67CD88BA67C198BA67CD8EA +S31AFE005C368BA6392900104200FFE03D2004007C0004AC7D388BC4 +S31AFE005C4BA63FA000003CC0FE003CE0FE013D20000038C65FD01C +S31AFE005C6038E7EA7C391D3B8839297C583860001C388000007F6C +S31AFE005C7525CB7848004811807D3B883BFE3C004800482D386083 +S31AFE005C8A001C48004C393860001C48004AE1801E0A003B5E0AA6 +S31AFE005C9F005400073293FC0000901E0A00935C00047FE3FB7850 +S31AFE005CB43880000038A000A4480056DD38C000047CC903A62F0F +S31AFE005CC99B0000391E2C00395E2C203D2000003D60000038E0AF +S31AFE005CDE000038009000915C001C39294CA0396B6460911C0079 +S31AFE005CF310911C0008911C0018915C0014915C000CB0EA000278 +S31AFE005D08912A0004B00A0000392905F0394A00084200FFECA456 +S31AFE005D1D0AFFF87D09437860002000B00A0000394000047D49AE +S31AFE005D3203A6399F007238000000B009000291690004B00900BB +S31AFE005D4700396B05F0392900084200FFEC7D284B78A408FFF808 +S31AFE005D5C3B60000160002000B0080000A13E09523BA0001061D4 +S31AFE005D71290003B13E0952A01E0950390005F05400043AB01EFE +S31AFE005D860950A13E09543B80FFFF7129FFFDB13E0954A01E090D +S31AFE005D9B623D40DEBB7000FFCFB01E0962A13E0960614A20E30A +S31AFE005DB07129FFCFB13E0960A01E09643960000060000030B016 +S31AFE005DC51E0964A13E09523860888861290A00B13E0952A01EBC +S31AFE005DDA09503880000F7000F5FFB01E0950813E0AEC38C00553 +S31AFE005DEFEE5529002E913E0AEC801E0AEC38E000406000003DB3 +S31AFE005E04901E0AEC813E0AEC38002C20552906B0913E0AEC931C +S31AFE005E197E0030B01F000039202C00B13F00029BBF00049BBFC4 +S31AFE005E2E0005B11F0006939F0030915F0034917F0038917F00A2 +S31AFE005E433C917F0040B07F0044B17F0044B09F0046B17F0048C6 +S31AFE005E58B0DF004AB0FF004CB11F004EB11F005038000006B130 +S31AFE005E6D7F00587C0903A6B17F005A3CA00000B17F005CB17FF5 +S31AFE005E82005E38A533A67D8963788C05FFFF9809000039290080 +S31AFE005E97014200FFF438000000B01F0078B01F0094B01F009675 +S31AFE005EACB01F0098B01F009AB01F009EB01F00A0B01F00A23987 +S31AFE005EC1200001B13E09C0A01E09C070060001418200187FC9CE +S31AFE005ED6F378A00909C0700A00014082FFF87D3E4B783800FFED +S31AFE005EEBFFB01A00103920001AB13A0014396000003C001088E6 +S31AFE005F00917A00046000000C901A00003920D555B13A000E38AF +S31AFE005F1500280AB01A0008392000903D60FA10992B0000A01E5D +S31AFE005F2A096260000001B01E0962A13E09605529043CB13E095B +S31AFE005F3F60419E00103D6002007C0004AC7D788BA6813900004F +S31AFE005F543C800000816900247F23CB78800B0000388433A07CEF +S31AFE005F690803A64E800021386000018001002C7C0803A6832168 +S31AFE005F7E000C83410010836100148381001883A1001C83C10092 +S31AFE005F932083E10024382100284E8000209421FFF87C0802A606 +S31AFE005FA89001000C4BFFF7BD3860001C480049113860001C48F3 +S31AFE005FBD0047B98001000C7C0803A6382100084E80002094210D +S31AFE005FD2FFF87C0802A69001000C3860001C48004631386000EB +S31AFE005FE7038001000C7C0803A6382100084E8000209421FFF0F1 +S31AFE005FFC7C0802A693C1000893E1000C900100143D6000003D05 +S31AFE006011200000392939883BEB39847C1F4840418000207D3E91 +S31AFE0060264B78813F00003BFFFFFC7D2803A64E8000217C1FF0E1 +S31AFE00603B404080FFEC800100147C0803A683C1000883E1000CE3 +S31AFE006050382100104E8000209421FFF87C0802A69001000C3D2E +S31AFE006065200000800937042C00000041820010800937049003E8 +S31AFE00607A0094480000243D20000090693BF0480018197C16027F +S31AFE00608FA628007A124081000C38007A127C1603A68001000C45 +S31AFE0060A47C0803A6382100084E8000204E800020386000004E93 +S31AFE0060B98000209421FFF07C0802A693E1000C900100144800F1 +S31AFE0060CE05F13D2000003889366C800400083BE000002C000030 +S31AFE0060E300418200307FE3FB787C9F2378809F000080BF0004C4 +S31AFE0060F880DF000888FF000C3BFF0010480004C1801F00082C6B +S31AFE00610D0000004082FFE0800100147C0803A683E1000C38214D +S31AFE00612200104E8000203C000A007C0004AC7C108BA67C0004B7 +S31AFE006137AC7C188BA63C000C004C00012C7C108BA64C00012CE7 +S31AFE00614C7C0004AC7C188BA63C0002004C00012C7C108BA64C89 +S31AFE00616100012C7C0004AC7C188BA64E8000209421FFF87C08E9 +S31AFE00617602A69001000C480000ED38007A127C1603A680010016 +S31AFE00618B0C7C0803A6382100084E8000203D20002F6129AF08A6 +S31AFE0061A07C6349D63C00431B6000DE837C0300967C63FE707CAF +S31AFE0061B50096707D6300507D3602A67D605B782C000000396BC0 +S31AFE0061CAFFFF4C810020394BFFFF7C1602A67C0900004182FFCE +S31AFE0061DFF87C0903787D605B782C0000007D4B53784181FFE09F +S31AFE0061F44E8000209421FFF87C0802A69001000C3D20FF006172 +S31AFE00620929093038000001B00900007C0006ACA00900007C00D5 +S31AFE00621E06AC5400AAFF38600000418200302060003A3D6000D6 +S31AFE006233005460103A396B33A87D6B002E3D2000003929349438 +S31AFE0062487C89002E7D6803A64E800021546307FA8001000C7CCC +S31AFE00625D0803A6382100084E8000203D200000394933A8390035 +S31AFE00627200407C0A402E3D20FE00392960B47C00480041820087 +S31AFE00628718800A00403D20FE013929B2187C00480040820034DA +S31AFE00629C3D20FE00392961F83D600000380000007D2A412E6088 +S31AFE0062B100DEAD396B34947C0B412E3D2000003929358038003B +S31AFE0062C600007C09412E3D60FE01800B3AAC3D20FE0139293AC6 +S31AFE0062DB707D2902147D2903A64E8004203D20FF006129001443 +S31AFE0062F0800900007C0006AC64000001900900007C0006AC486A +S31AFE0063050000E83D20FF0061290200A00900007C0006AC600078 +S31AFE00631A0008B00900007C0006AC480000C83D20FF0061290283 +S31AFE00632F00A00900007C0006AC60000004B00900007C0006AC33 +S31AFE006344480000A83D20FF0061290240A00900007C0006AC60F1 +S31AFE006359000004B00900007C0006AC480000883D20FF0061298A +S31AFE00636E0220A00900007C0006AC60000008B00900007C00067A +S31AFE006383AC480000683D20FF0061290220A00900007C0006ACC6 +S31AFE00639860000004B00900007C0006AC480000483D20FF006154 +S31AFE0063AD290940800900007C0006AC60000080900900007C00B9 +S31AFE0063C206AC480000283D20FF0061290948816900007C0006FD +S31AFE0063D7AC3C00800054005D7E7D6B0378916900007C0006AC8B +S31AFE0063EC3D60FE01800B3BBC3D20FE0139293B587D2902147DF0 +S31AFE0064012903A64E8004203D20FF0061290200A00900007C00B1 +S31AFE00641606AC5400063E60000100B00900007C0006AC48000093 +S31AFE00642B683D20FF0061290240A00900007C0006AC5400063E59 +S31AFE00644060000100B00900007C0006AC480000443D20FF0061B2 +S31AFE006455290220A00900007C0006AC5400063E60000100B0095A +S31AFE00646A00007C0006AC480000203D20FF0061290940800900CB +S31AFE00647F007C0006AC6000E000900900007C0006AC3D60FE0133 +S31AFE006494800B3CA43D20FE0139293C407D2902147D2903A64EF1 +S31AFE0064A98004203D20FF0061290014800900007C0006AC600025 +S31AFE0064BE0040900900007C0006AC4E8000203D20FF00612902E8 +S31AFE0064D300A00900007C0006AC60000008B00900007C0006AC8A +S31AFE0064E84E8000203D20FF0061290200A00900007C0006AC608E +S31AFE0064FD000004B00900007C0006AC4E8000203D20FF006129C7 +S31AFE0065120240A00900007C0006AC60000004B00900007C0006B8 +S31AFE006527AC4E8000203D20FF0061290220A00900007C0006ACE2 +S31AFE00653C60000008B00900007C0006AC4E8000203D20FF00614C +S31AFE006551290220A00900007C0006AC60000004B00900007C0076 +S31AFE00656606AC4E8000203D20FF0061290940800900007C000642 +S31AFE00657BAC60000080900900007C0006AC4E8000203D20FF006A +S31AFE00659061290948816900007C0006AC3C00800054000FFE7D65 +S31AFE0065A56B0378916900007C0006AC4E8000207C1E22A660001F +S31AFE0065BA00077C1E23A64E8000209421FFF093E1000C54E0FF19 +S31AFE0065CFFE70FF00012F0000002F8300207CC0FE707D60002697 +S31AFE0065E4556B1FFE54A500267D400026554ADFFE7C0600507DF4 +S31AFE0065F94A00D07CE0002654E7EFFE7D6B00D060A808FF5400AA +S31AFE00660E0FFE7D0858787D4950F860A508FD7CFF00387CAB58C7 +S31AFE00662338714A000D2F9F00007D654378548400267129001D3E +S31AFE0066387D4A4B78608402003960000039000020419E005C5458 +S31AFE00664D6B402E7D55C3A67D70C3A67C93C3A67CB6C3A660A0B7 +S31AFE00666201007D5DC3A67D78C3A67C9BC3A67C1EC3A63863005F +S31AFE006677013CC6FF807F8340007CC0FE707C0600507D20002607 +S31AFE00668C5529EFFE54000FFE7D2700393C8400803CA50080406B +S31AFE0066A182FFAC656020007C10C3A67C18C3A683E1000C382113 +S31AFE0066B600104E800020380000007C19C3A6380000207C0903B7 +S31AFE0066CBA639200000380000007C15C3A67D30C3A67C13C3A677 +S31AFE0066E07C16C3A67C1DC3A67D38C3A67C1BC3A67C1EC3A6394A +S31AFE0066F52901004200FFD83C00200060001F007C10C3A67C18E5 +S31AFE00670AC3A64E8000209421FDE87CDE9AA674C6FFFF3D600016 +S31AFE00671F00812B36BC2C090000408202003940003038000001E8 +S31AFE0067347D4903A6900B36BCB12609C43800000039263C807DDC +S31AFE006749284B789806086038E62E0838A1000838862E0038618C +S31AFE00675E00093981021198090000392900014200FFF839202E88 +S31AFE00677300B1280002396000103940020938002E089968000591 +S31AFE00678899680004B0080000B14800063920A800B1262E0838F6 +S31AFE00679D000101B007000290A700047C8B2378B14B0002380015 +S31AFE0067B200A59801000890AB0004B1262E003800000098060866 +S31AFE0067C7643920005099260868380000019806086039200111D3 +S31AFE0067DCB12609C0A00609C070090001418200187CC93378A0B0 +S31AFE0067F10909C0700A00014082FFF87D264B7838000211B00622 +S31AFE00680609C0A12609C071200001418200187CC93378A0090911 +S31AFE00681BC0700A00014082FFF87D264B78392000007D2903A662 +S31AFE006830380000819806086C7D4902A6614AC3517D4903A6A048 +S31AFE0068450B000070098000418200084200FFF4394001007D49F6 +S31AFE00685A03A63D2000013929807439600000380000FF7C09591A +S31AFE00686FAE396B00014200FFF87D8763787C6B1B787C0B38006C +S31AFE0068844182009C3CA00001880B00002C00004D4082008088E9 +S31AFE0068990B00012C00004F40820074880B00022C000054408252 +S31AFE0068AE00688C0B000839400000892B00015400402E7C084B0B +S31AFE0068C3787C0A4000396B000240800054388580747C651B789F +S31AFE0068D8880B0000396B00017D693A787D23FE707C0451AE7CCE +S31AFE0068ED604A787C0018507C00FE70394A00017CA900787C0AFB +S31AFE00690240007D6000387C0B4B784180FFCC48000010396B0055 +S31AFE006917017C0B38004082FF70380000009806086038210218C5 +S31AFE00692C4E8000209421FFE87C0802A693A1000C93C100109365 +S31AFE006941E100149001001C7C7D1B787C9F23787CBE2B784BFF32 +S31AFE006956FDBD3D20000139698074394B01007C0B50404080001E +S31AFE00696B8457A8063E880B00007C00400040820054886B0001F3 +S31AFE006980396B00027F83F0004FFEE3827C000026540007FE7C3D +S31AFE0069950000D07FC900787C6000387C034B794081004C7C6910 +S31AFE0069AA03A67D695B787FE4FB7888090000392900019804000C +S31AFE0069BF00388400014200FFF048000028886B00013803000230 +S31AFE0069D47D2B00EE5529063E2C0900FF4182000C7C0B504041F7 +S31AFE0069E980FF88386000008001001C7C0803A683A1000C83C1B8 +S31AFE0069FE001083E10014382100184E8000209421FFF87C080267 +S31AFE006A13A69001000C4800463D8001000C7C0803A63821000841 +S31AFE006A284E8000203C80FF00608400007C9E9BA63CA0FA106027 +S31AFE006A3DA500013C60000060630000986500007C788AA63C607E +S31AFE006A520A007C0004AC7C788BA63C600C007C0004AC7C788B7D +S31AFE006A67A63C6004007C0004AC7C788BA63C6001007C0004ACB6 +S31AFE006A7C7C788BA63C6007007C0004AC7C788BA67C708AA63C90 +S31AFE006A91600A007C708BA64C00012C3C600C007C708BA64C00DB +S31AFE006AA6012C3C6004007C708BA64C00012C7C0004AC3C6000AC +S31AFE006ABB6060632400906400003C60FFFF6063FF8890640004AB +S31AFE006AD03C600000606300C2B06402003C6055CC6063AA339089 +S31AFE006AE564032090640324906403289064032C386000C3B06445 +S31AFE006AFA022038600083B06402403CA0FE0060A56C9C3CC0FE0F +S31AFE006B0F0060C66D9C7CE530507CE7167038C000008065000097 +S31AFE006B249064017C90C4016838A5000438C600017C063800414F +S31AFE006B3980FFE838600200B064017A3C601880606310009064B8 +S31AFE006B4E01703C60FE00606304013CA0FF8060A509609064019D +S31AFE006B630090A401043C600000606300813CA0FFC060A504005C +S31AFE006B789064010890A4010C3C600000606300803CA0000060AB +S31AFE006B8DA504009064011090A401143C600000606300803CA03D +S31AFE006BA2000060A504009064011890A4011C3C60FA0060630416 +S31AFE006BB7013CA0FFE060A509309064012090A401243C60800041 +S31AFE006BCC606300013CA0A00060A501089064012890A4012C3CA8 +S31AFE006BE160FA21606300013CA0FFFF60A501089064013090A41B +S31AFE006BF601343C60FC00606300013CA0FF8060A5094090640157 +S31AFE006C0B3890A4013C3C60020060630000906402808064028486 +S31AFE006C205463653E2C030000418200103C605F506063D00048D9 +S31AFE006C3500000C3C6000006063D000906402843C4000003C6079 +S31AFE006C4AFF0060630014904300003C400000604200007C42109C +S31AFE006C5FF87C5603A6384000013C60FF0060630200B0430000DD +S31AFE006C743CA0FA1060A500013C60000060630008986500007C3B +S31AFE006C896802A67063FFFF6463FE007C6803A64E800020CFAF53 +S31AFE006C9EC0040FAFC4040CAF8C0410AF0C04F0AF0C00F3BF48D4 +S31AFE006CB305FFFFC005FFFFC005CFAFC0040FAFC4040CAF8C042A +S31AFE006CC800AF0C0407AF0C080CAF0C0401AF0C040FAF0C080CC1 +S31AFE006CDDAF0C0401AF0C040FAF0C080CAF0C0410AF0C04F0AF14 +S31AFE006CF2C000F3BF4805FFFFC005CFFF00040FFF04040CFF0C08 +S31AFE006D070013FF4804FFFFC004FFFFC005FFFFC005FFFFC0050A +S31AFE006D1CCFFF00040FFF04040CFF0C0003FF0C0C0CFF0C00032B +S31AFE006D31FF0C0C0CFF0C0003FF0C0C0CFF0C0013FF4804FFFF8E +S31AFE006D46C004FFFFC005FFFFC005FFFFC005FFFFC005FFFFC0A6 +S31AFE006D5B05FCFFC004C0FFC00401FFC0040FFFC0041FFFC00460 +S31AFE006D70FFFFC004FFFFC005FFFFC005FFFFC005FFFFC005FF3D +S31AFE006D85FFC005FFFFC005FFFFC007FFFFC007FFFFC007FFFF21 +S31AFE006D9AC0077063000E3C80FA1060840001986400004E8000C3 +S31AFE006DAF203C80FA106084000138A0000A98A400003CA0000AFC +S31AFE006DC47CA903A64200000038A0000C98A400003CA0000A7C24 +S31AFE006DD9A903A6420000003863FFFF2C0300004080FFD038A0DE +S31AFE006DEE000698A400003CA000147CA903A6420000004E80007C +S31AFE006E03203D20FE0139293D285463073E7C6918AE4E8000209E +S31AFE006E189421FFF87C0802A69001000C3D200000806936D82C6C +S31AFE006E2D0300004181000C4800291D4800000C3800FFFF9009CA +S31AFE006E4236D88001000C7C0803A6382100084E8000203803FFE6 +S31AFE006E579F280000054181000C3863FFA94E8000203923FFD02C +S31AFE006E6C5520063E280000094181000C7D234B784E80002038CC +S31AFE006E8103FFBF280000054081000C3860FFFF4E80002038631E +S31AFE006E96FFC94E8000209421FFE07C0802A69001002438000080 +S31AFE006EAB0098010018906100104BFFFF655463063E38810008B2 +S31AFE006EC04800001D2C0300014082FFEC800100247C0803A6386D +S31AFE006ED52100204E8000209421FFF07C0802A693C1000893E1D5 +S31AFE006EEA000C900100147C9F2378897F00102C0B000040820017 +S31AFE006EFF282C03002440820098392000013800FFFF901F000462 +S31AFE006F14993F0010917F0000917F000C4800007C2C0B00014014 +S31AFE006F298200542C03002340820020815F0008817F000C380019 +S31AFE006F3E00007C0A59AE39200002993F001048000050817F00D2 +S31AFE006F530C2C0B0800418200E8801F0000813F00087C001A141E +S31AFE006F68901F00007C6959AE380B0001901F000C480000242CDE +S31AFE006F7D0B0002408200245463063E4BFFFECD546320363800B3 +S31AFE006F920003907F0004981F001038600000480000AC2C0B0046 +S31AFE006FA703408200985463063E4BFFFEA5801F0004893F00031E +S31AFE006FBC7C001B787C090000901F0004418200103860002D4895 +S31AFE006FD10027454800006C3860002B48002739813F00088809C3 +S31AFE006FE600022C00003A4082004C8869000083DF000C4800274E +S31AFE006FFB1D813F00088869000148002711396000037C0BF040D3 +S31AFE007010418100287FCAF3787FE4FB78812400087C0958AE7D3E +S31AFE0070252B4A14396B00017C0B50409809FFFD4081FFE8386030 +S31AFE00703A00014800001038000000981F00103860FFFF800100CE +S31AFE00704F147C0803A683C1000883E1000C382100104E800020D4 +S31AFE0070649421FFE07C0802A69361000C9381001093A100149354 +S31AFE007079C1001893E1001C900100243D20FE013B693D287C7C83 +S31AFE00708E1B7838600024480026818BFC00003BC000002C1F00DE +S31AFE0070A3003BA00000418200247FE3FB78480026657C1DFA14C3 +S31AFE0070B83BDE00017FFCF0AE541D063E2C1F00004082FFE438AF +S31AFE0070CD6000234800264557A0E13E7C7B00AE4800263957A01B +S31AFE0070E2073E7C7B00AE4800262D4BFFFD2D5463067E2C030032 +S31AFE0070F72B4082FF98800100247C0803A68361000C8381001026 +S31AFE00710C83A1001483C1001883E1001C382100204E800020945B +S31AFE00712121FFD87C0802A6936100149381001893A1001C93C159 +S31AFE007136002093E100249001002C3D20000081693BA03D40002C +S31AFE00714B002C0B000038000000900A36DC3F6000003F800000B2 +S31AFE007160408101383FC000003FA000003D20000080093BAC2C45 +S31AFE0071750000004182006C801C3BA03D600000280000034081D2 +S31AFE00718A0018801E3BA4700900034082000C3BE00004480000A6 +S31AFE00719F34801C3BA03BE000012800000140810024800B3BA498 +S31AFE0071B4540007FE7C0000D07C00FE707C0900F8540007FE5508 +S31AFE0071C92907BC7C1F4B78808B3BA4386100087FE5FB784800B9 +S31AFE0071DE312948000014813E3BA43BE0000188090000980100FE +S31AFE0071F3083D200000800936DC2C0000004082009839000000C4 +S31AFE0072087C08F8004080006C3D20FE0138C93D2838A100083CE6 +S31AFE00721DE000003C8000007D6828AE81473BA85560E13E7D26DF +S31AFE00723200AE992A0000800436DC394A00012C00000091473B79 +S31AFE007247A8408200505560073E7D2600AE396A0001992A0000C2 +S31AFE00725C801B36DC91673BA82C00000040820030390800017CB5 +S31AFE00727108F8004180FFB0813D3BA0801E3BA47D3F48502C09F5 +S31AFE00728600007C00FA14901E3BA4913D3BA04181FED880010016 +S31AFE00729B2C7C0803A6836100148381001883A1001C83C10020C9 +S31AFE0072B083E10024382100284E8000209421FFE87C0802A69373 +S31AFE0072C5A1000C93C1001093E100149001001C2C0600003D20DB +S31AFE0072DA00003D6000003D4000003D00000090893BA8906B3B12 +S31AFE0072EFA490AA3BA090C83BAC418200303FA000003800000084 +S31AFE007304901D36DC813D36DC4BFFFE15813D36DC801D36DC2CD9 +S31AFE00731900000041820010386000004800001C4BFFFDF93D60AF +S31AFE00732E0000812B3BA83800000098090000806B3BA88001008F +S31AFE0073431C7C0803A683A1000C83C1001083E10014382100187B +S31AFE0073584E8000209421FFC07C0802A69281001092A100149292 +S31AFE00736DC1001892E1001C930100209321002493410028936123 +S31AFE007382002C9381003093A1003493C1003893E1003C9001004D +S31AFE007397443D20000080093BA03B6000002C0000003D200000B4 +S31AFE0073AC936936DC3E8000003EA00000408101703D200000810E +S31AFE0073C1693BA43F000000880B00002C000000418201583EC053 +S31AFE0073D600003F4000003EE0000080163BAC2C00000041820095 +S31AFE0073EB5880153BA02800000340810018801A3BA870090003C4 +S31AFE0074004082000C3BC000044800003C80153BA03BC00001288E +S31AFE0074150000014081002C801A3BA8540007FE7C0000D07C00D2 +S31AFE00742AFE707C0900F8540007FE552907BC7C1E4B784800001F +S31AFE00743F083BC000013BE000007C1FF000408000743FA0000077 +S31AFE0074543F2000003B810008813D3BA48869000039290001917A +S31AFE0074693D3BA45463063E4BFFF9E5801936DC547B26362C00C9 +S31AFE00747E0000408200A881383BA4886900003929000191383B9B +S31AFE007493A45463063E4BFFF9BD801436DC7F631B782C000000FA +S31AFE0074A8547B063E4082007C7F7FE1AE3BFF00017C1FF00041E6 +S31AFE0074BD80FFA080163BAC2C00000041820018809A3BA838617D +S31AFE0074D200087FC5F37848002E8D4800000C813A3BA89B6900F1 +S31AFE0074E7003D200000800936DC2C0000004082003481373BA0DF +S31AFE0074FC801A3BA87D3E48502C0900007C00F214901A3BA891D2 +S31AFE007511373BA04081001481383BA4880900002C000000408263 +S31AFE007526FEBC800100447C0803A68281001082A1001482C10013 +S31AFE00753B1882E1001C8301002083210024834100288361002C38 +S31AFE0075508381003083A1003483C1003883E1003C382100404E93 +S31AFE0075658000209421FFE87C0802A693A1000C93C1001093E18D +S31AFE00757A00149001001C2C0600003D2000003D6000003D40008E +S31AFE00758F003D00000090693BA4908B3BA890AA3BA090C83BAC7C +S31AFE0075A4418200303FA0000038000000901D36DC813D36DC4BEA +S31AFE0075B9FFFDA5813D36DC801D36DC2C00000041820010386002 +S31AFE0075CE0000480000104BFFFD893D20000080693BA8800100D2 +S31AFE0075E31C7C0803A683A1000C83C1001083E1001438210018D9 +S31AFE0075F84E8000209421FFF87C0802A69001000C480028453D25 +S31AFE00760D20000038000001900936C08001000C7C0803A6382169 +S31AFE00762200084E8000209421FFE87C0802A693A1000C93C100FD +S31AFE0076371093E100149001001C7C9E23783BA000007C7F1B78D7 +S31AFE00764C93BE000048000024801E0000813F0000540020367CE4 +S31AFE007661001B7839290001901E0000913F00003BBD0001813FE3 +S31AFE0076760000886900002C030000418200104BFFF7D17C631BFC +S31AFE00768B794080FFC87FA3EB788001001C7C0803A683A1000C67 +S31AFE0076A083C1001083E10014382100184E8000207C84237939D1 +S31AFE0076B54000004082001838000030980300019803000038606B +S31AFE0076CA00024E800020392500077D20FE7054001F7E7D2902AE +S31AFE0076DF147D251E71418200603D20FE0138C93D2838E5FFFF4D +S31AFE0076F454E018387C88043068A90001200900007D204914315B +S31AFE00770968FFFF7C0B41107C0B4B79418200285508063E5500FD +S31AFE00771EE13E7D6600AE5509073E7C0648AE996300009C0300EC +S31AFE0077330138630001394A00027CE53B794082FFB07D4353780A +S31AFE0077484E8000209421FFF07C0802A693E1000C900100143D08 +S31AFE00775D20000080A93BE07C641B782C050000386000004081B2 +S31AFE00777200843FE00000801F36E42C000000418200103860000B +S31AFE007787017C0803A64E8000212C030001408200103D2000006D +S31AFE00779C986936E048000054801F36E42123FFFF216900007D1F +S31AFE0077B12B4914216000007C0B01147C0B4B79418200343D207B +S31AFE0077C6000080093BBC2C00000041820024386000017C0803F7 +S31AFE0077DBA64E8000212C030000418200103D2000003800000168 +S31AFE0077F0980936E1800100147C0803A683E1000C382100104EDF +S31AFE0078058000209421FFF07C0802A693E1000C900100143FE0B6 +S31AFE00781A0000881F36E02C000000418200343D20000080093659 +S31AFE00782FE42C000000418200243D20000080A93BE03860000010 +S31AFE007844388000007C0803A64E80002138000000981F36E03F13 +S31AFE007859E00000881F36E12C000000418200283D20000080097B +S31AFE00786E3BBC2C00000041820018386000007C0803A64E800070 +S31AFE0078832138000000981F36E1800100147C0803A683E1000C93 +S31AFE007898382100104E8000209421FFF07C0802A693C1000893C1 +S31AFE0078ADE1000C900100143D200000800936D42C000000418251 +S31AFE0078C20010800936D47C0803A64E8000213D20000080093BCD +S31AFE0078D7F42C000000418200143800000090093BF43BE0000284 +S31AFE0078EC48000010480084E5480084197C7F1B78480085A12C6D +S31AFE00790103000041820008480085CD4800858D4BFFFEF9480022 +S31AFE007916853D386000034800288938600003480028192C1F0093 +S31AFE00792B00418200203FC00000813E36C47FE3FB787D2803A685 +S31AFE0079404E8000212C0300004082FFEC480085493D2000008070 +S31AFE0079550936D02C00000041820010800936D07C0803A64E8081 +S31AFE00796A0021800100147C0803A683C1000883E1000C3821000C +S31AFE00797F104E8000209421FFB87C0802A69361003493810038E5 +S31AFE00799493A1003C93C1004093E100449001004C7C7E1B783B79 +S31AFE0079A9E000003F6000003B810028801B3BC03BA000012C00C4 +S31AFE0079BE00004182001C7FE3FB787F84E3787C0803A64E8000A3 +S31AFE0079D3217C7D1B78480000107FE3FB7848001D0D9061002836 +S31AFE0079E8381FFFE02800001F7C0A03782F9D00003BFF00017F82 +S31AFE0079FD83E3784181004C390000047D0903A6386100087C6B91 +S31AFE007A121B7838000000392000007C0B49AE392900014200FF15 +S31AFE007A27F8380000047C0903A67C6943787F8BE378880B00004C +S31AFE007A3C396B000198090000392900014200FFF0419E00302028 +S31AFE007A510A001F7C0001107C0500F85400077A54A507387FC49D +S31AFE007A66F3787C052B7838C000004BFFF84D7C7E1B784800001C +S31AFE007A7B58212A001F7D2949107D2048F8540006F65529073847 +S31AFE007A907D2903782C0900007FCBF378380000783929FFFF4181 +S31AFE007AA58200182C090000980B0000396B00013929FFFF40828F +S31AFE007ABAFFF0280A001F4181000C3BDE0010480000083BDE0013 +S31AFE007ACF082C1F00464081FEE08001004C7C0803A68361003454 +S31AFE007AE48381003883A1003C83C1004083E10044382100484ED2 +S31AFE007AF98000209421FFD07C0802A67D8000269381002093A199 +S31AFE007B0E002493C1002893E1002C900100349181001C880300A0 +S31AFE007B2300386300012C0000507C9D237890610008392000002B +S31AFE007B383BC0004740820070386100083881000C4BFFFAE12C09 +S31AFE007B4D030000418200288121000888090000392900012C0067 +S31AFE007B62003D91210008408200108121000C3BC9000148000046 +S31AFE007B77383D20FE0188093D407FA4EB782C00000039693D4082 +S31AFE007B8C418200D8880B0000980400008D2B0001388400012C74 +S31AFE007BA10900004082FFEC480000BC7D3F4B787C1FF000408047 +S31AFE007BB600803B800000397FFFE020AB001F7CA5291039210046 +S31AFE007BCB103881000C7CA028F87C8428787CA9483854A5077AD1 +S31AFE007BE054000738806100082A0B001F7CA503787D2423789351 +S31AFE007BF581001038C000004BFFF96D808100107FE3FB78480010 +S31AFE007C0A1AF94191001081210008392900104800000C8121005A +S31AFE007C1F0839290008912100083BFF00017C1FF0004180FF8C0E +S31AFE007C343D20FE0188093D447FA4EB782C00000039693D4441B3 +S31AFE007C4982001C880B0000980400008D2B0001388400012C09AA +S31AFE007C5E00004082FFEC380000009804000080010034818100D5 +S31AFE007C731C7C0803A68381002083A1002483C1002883E1002C47 +S31AFE007C887D808120382100304E8000209421FF307C0802A6932B +S31AFE007C9DC100C893E100CC900100D43BC000003D6000017C7F0C +S31AFE007CB21B789BCB8B04893F00003809FFC12800003441810842 +S31AFE007CC7903D60FE01396B3D985400103A7D4B002E3D20FE010F +S31AFE007CDC39293D987D4A4A147D4903A64E800420480080E948D9 +S31AFE007CF100801D3D20FE0139293D285460E73E7D0900AE5463F6 +S31AFE007D06073E7CE918AE3D40000138000053392A8B04980A8BCC +S31AFE007D1B0439600000996900039909000198E900024800083CFB +S31AFE007D303D20FE0188093D483D6000012C000000396B8B043992 +S31AFE007D45493D48418207E8880A00008D2A0001980B00002C0983 +S31AFE007D5A0000396B00014082FFEC480007CC387F000148000B98 +S31AFE007D6F99480007F8387F000148000D5D480007EC3C600001D9 +S31AFE007D8438638B044BFFFBFD480007DC881F00012C000000403B +S31AFE007D998200404800092D3D20FE0188093D443D6000012C0059 +S31AFE007DAE0000396B8B0439493D4441820778880A00008D2A00FB +S31AFE007DC301980B00002C090000396B00014082FFEC4800075CD1 +S31AFE007DD8381F0001900100883BC1008C3BE100887FE3FB787FA1 +S31AFE007DEDC4F3784BFFF8392C030000418200A481210088880982 +S31AFE007E020000392900012C00002C912100884082008C7FE3FBC7 +S31AFE007E1778388100904BFFF80D2C0300004182007881210088AE +S31AFE007E2C88090000392900012C00002C91210088408200608015 +S31AFE007E4181008C2C0400004182003880610090480008B97C6496 +S31AFE007E561B79418200148061008880A1008C38C000004BFFF759 +S31AFE007E6B018001008C812100887C0002147D290214912100883E +S31AFE007E8081210088880900002C00002C40820010380900019032 +S31AFE007E950100884BFFFF5081210088880900002C000000408209 +S31AFE007EAA003C3D20FE0188093D443D6000012C000000396B8B1C +S31AFE007EBF0439493D444182066C880A00008D2A0001980B000081 +S31AFE007ED42C090000396B00014082FFEC480006503D20FE01888C +S31AFE007EE9093D883D6000012C000000396B8B0439493D884182AB +S31AFE007EFE0634880A00008D2A0001980B00002C090000396B006B +S31AFE007F13014082FFEC480006183C8000017FE3FB7838848B0464 +S31AFE007F284BFFFBD54800063C381F00013BE10094900100947FF0 +S31AFE007F3DE3FB78388100984BFFF6E52C0300004182009081213B +S31AFE007F52009488090000392900012C00002C912100944082002E +S31AFE007F67787FE3FB783881009C4BFFF6B92C0300004182006410 +S31AFE007F7C806100983C80000180A1009C38848B0438C000014B6A +S31AFE007F91FFF32D2C030000408205D03D60FE01880B3D8C3D209D +S31AFE007FA600012C00000039498B04396B3D8C4182001C880B00A5 +S31AFE007FBB008D2B0001980A00002C090000394A00014082FFECEC +S31AFE007FD038000000980A0000480005903D20FE0188093D883DF2 +S31AFE007FE56000012C000000396B8B0439493D884182053C880AE6 +S31AFE007FFA00008D2A0001980B00002C090000396B00014082FF78 +S31AFE00800FEC480005203BC00001381F00013BE100A0900100A0BE +S31AFE0080247FE3FB78388100A44BFFF5FD2C030000418201F88169 +S31AFE0080392100A088090000392900012C00002C912100A040820D +S31AFE00804E01E07FE3FB78388100A84BFFF5D12C030000418201FF +S31AFE008063CC806100A088030000386300012C00003A906100A099 +S31AFE008078408201B42C1E000041820124800100A82C00000041B0 +S31AFE00808D8200A8800100A83BE000007C1F004040800054394103 +S31AFE0080A20008816100A0892B0000396B00017D204B782C000056 +S31AFE0080B77D7D2AF9AE916100A040820018880B0000392B000181 +S31AFE0080CC600000207C0AF9AE912100A03BFF0001281F007F415A +S31AFE0080E1810010800100A87C1F00404180FFB8808100A438613B +S31AFE0080F600087FE5FB78480022697C03F80040820024812100C0 +S31AFE00810BA8800100A47D3F48502C0900007C00FA14900100A446 +S31AFE008120912100A84082FF6C800100A82C0000004082003C3D2F +S31AFE00813520FE0188093D443D6000012C000000396B8B04394981 +S31AFE00814A3D44418203E4880A00008D2A0001980B00002C0900CF +S31AFE00815F00396B00014082FFEC480003C83D20FE0188093D8CEC +S31AFE0081743D6000012C000000396B8B0439493D8C418203AC88B0 +S31AFE0081890A00008D2A0001980B00002C090000396B00014082DC +S31AFE00819EFFEC48000390808100A480A100A838C000014BFFF35E +S31AFE0081B3B92C0300004182003C3D20FE0188093D443D600001C0 +S31AFE0081C82C000000396B8B0439493D444182035C880A00008DFB +S31AFE0081DD2A0001980B00002C090000396B00014082FFEC4800EC +S31AFE0081F203403D20FE0188093D8C3D6000012C000000396B8B82 +S31AFE0082070439493D8C41820324880A00008D2A0001980B000038 +S31AFE00821C2C090000396B00014082FFEC480003083D20FE01888B +S31AFE008231093D903D6000012C000000396B8B0439493D9041824F +S31AFE00824602EC880A00008D2A0001980B00002C090000396B006B +S31AFE00825B014082FFEC480002D0881F0000395F0001680900533E +S31AFE008270216900007D2B491468000043216000007C0B01147C22 +S31AFE0082850B4B7939600000914100AC916100B03BC100AC4182ED +S31AFE00829A00287FC3F378388100B04BFFF385812100AC880900EC +S31AFE0082AF002C00003B4082000C38090001900100AC7FC3F37855 +S31AFE0082C4388100B44BFFF3612C0300004182000C806100B448BB +S31AFE0082D9007B113860000348001EC53860000348001E55806103 +S31AFE0082EE00B02C0300004182004C3D200000800936CC2C000075 +S31AFE008303004182001C800936CC7C0803A64E8000217C631B7968 +S31AFE00831840820008906100B0800100B02C000000418200183871 +S31AFE00832D000009900100B03860000948000339480002384800FE +S31AFE00834215852C0300004182001838000063981F00003D2000CF +S31AFE0083570038000001900936F4881F000068090053216900001C +S31AFE00836C7D2B491468000073216000007C0B01147C0B4B79416F +S31AFE008381820024386000004BFFF3C53D200001392923503D60D3 +S31AFE0083960000912B36F048007A754800000C386000014BFFF38B +S31AFE0083ABA53860000348001DF53860000348001D853860FFFF04 +S31AFE0083C0480001B83D200000800936C87C0803A64E800021386B +S31AFE0083D5600001480001A048001BB1480001883C800001387FEC +S31AFE0083EA000138848B0438A0012C48000E0D480001703C800051 +S31AFE0083FF01387F000138848B0438A0012C48000D7D48000158E9 +S31AFE008414381F0001900100B8386100B8388100BC4BFFF2052C7B +S31AFE0084290300004182007C812100B888090000392900012C007E +S31AFE00843E002C912100B84082006488090000392900012C000049 +S31AFE00845343912100B840820010806100BC480027254800000C0C +S31AFE008468806100BC480027113D20FE0188093D443D6000012CA6 +S31AFE00847D000000396B8B0439493D44418200A8880A00008D2AFC +S31AFE0084920001980B00002C090000396B00014082FFEC4800005E +S31AFE0084A78C3D20FE0188093D883D6000012C000000396B8B0481 +S31AFE0084BC39493D8841820070880A00008D2A0001980B00002C14 +S31AFE0084D1090000396B00014082FFEC48000054381F00019001B2 +S31AFE0084E600C0386100C0388100C44BFFF1392C03000040820082 +S31AFE0084FB443D20FE0188093D943D6000012C000000396B8B0469 +S31AFE00851039493D944182001C880A00008D2A0001980B00002C07 +S31AFE008525090000396B00014082FFEC38000000980B00004800BF +S31AFE00853A00303C60FE0138633D444BFFEB21806100C4480012EC +S31AFE00854F3D480000183C8000017FE3FB7838848B0438A0012C94 +S31AFE00856448001E653C60000138638B044BFFEAF538600000802B +S31AFE0085790100D47C0803A683C100C883E100CC382100D04E80B4 +S31AFE00858E00209421FFE87C0802A693A1000C93C1001093E100D4 +S31AFE0085A3149001001C3FA00001389D8B0448001A1D387D8B04F7 +S31AFE0085B84BFFEAAD8001001C7C0803A683A1000C83C1001083F8 +S31AFE0085CDE10014382100184E8000209421FFF07C0802A693E1FD +S31AFE0085E2000C900100143D200000800936D82C000000408000EF +S31AFE0085F7084BFFFF993FE00001387F83044BFFE899387F83041A +S31AFE00860C4BFFF6897C631B794182FFEC7C6318F854630FFE8038 +S31AFE0086210100147C0803A683E1000C382100104E8000204E8069 +S31AFE00863600209421FFF87C0802A69001000C4BFFEFB948001844 +S31AFE00864B493860002B480010C58001000C7C0803A638210008D2 +S31AFE0086604E8000203D200000906936D84E8000209421FFF87C99 +S31AFE0086750802A69001000C3D20FE0139293D285460E73E7D49DD +S31AFE00868A00AE5463073E7D0918AE3D60000138000058386B8B85 +S31AFE00869F04980B8B0439200000994300019903000299230003F9 +S31AFE0086B44BFFE9B18001000C7C0803A6382100084E8000203D83 +S31AFE0086C920000138A00000392993543CC0000038E0FFFF3C8088 +S31AFE0086DE00003D6000013D4000003D0000003800000190E63B41 +S31AFE0086F3B490AB9304912A3BB8900836E890A43BB04E80002077 +S31AFE0087089421FFF07C0802A693C1000893E1000C900100143DCA +S31AFE00871D200000800936E87C7F1B782C0000007C9E237840824B +S31AFE00873200084BFFFF952C1F0012418100243D600000800B3BA2 +S31AFE008747B83D200001392993547C0900507C00F21428000080BB +S31AFE00875C4081000C386000004800006C3CE0000080073BB47CDD +S31AFE0087711F00004182004C3D00000080083BB07C1F00004180B5 +S31AFE0087860020395F00013D20000139299304554B103A380000A8 +S31AFE00879B007C09592E91483BB03D600000814B3BB83D2000013B +S31AFE0087B03929930457E0103A7D49012E93E73BB43D20000080FB +S31AFE0087C5693BB87C03F21490093BB8800100147C0803A683C128 +S31AFE0087DA000883E1000C382100104E8000209421FFD87C0802A5 +S31AFE0087EFA6936100149381001893A1001C93C1002093E100243B +S31AFE0088049001002C3D600000800B36EC7C7D1B782C0000007C20 +S31AFE0088199E23787CBF2B7840820058380000013D20000139291C +S31AFE00882E93D4900B36EC39400000380000087C0903A6390A00E3 +S31AFE00884301554BC00E5547103A2C0B00005560083C4080000CCB +S31AFE0088586C0004C168001DB77C0B03784200FFE87D0A43782805 +S31AFE00886D0A00FF7C09392E4081FFC43D600000380000003D2047 +S31AFE00888200013B6993D4900B36DC3F800000480000248921004F +S31AFE0088970857E0463E7C004A785400103A7D7B002E57E9402E55 +S31AFE0088AC7D3F5A783BBD00012C1E00003BDEFFFF4182002038B0 +S31AFE0088C16100087FA4EB7838A0000148001A39801C36DC2C0061 +S31AFE0088D600004182FFBC7FE3FB788001002C7C0803A683610078 +S31AFE0088EB148381001883A1001C83C1002083E100243821002897 +S31AFE0089004E8000209421FFD87C0802A693A1001C93C100209361 +S31AFE008915E100249001002C3D2000013800000098098B043BA9DD +S31AFE00892A8B047C691B7890610008880900002C00004340820072 +S31AFE00893FF4880900012C000052408200E88BC900022C1E00438E +S31AFE008954408200DC880900032C00003A408200D0380900043B60 +S31AFE008969E10008900100087FE3FB783881000C4BFFECB12C03C3 +S31AFE00897E0000418201388121000888090000392900012C00001A +S31AFE0089932C91210008408201207FE3FB78388100104BFFEC85A9 +S31AFE0089A82C0300004182010C8061000C8081001038A0FFFF4B98 +S31AFE0089BDFFFE2D3D20000083E936DC2C1F0000418200403D20F1 +S31AFE0089D2FE0188093D887FA3EB782C00000039693D884182005C +S31AFE0089E71C880B00008D2B0001980300002C09000038630001A3 +S31AFE0089FC4082FFEC3800000098030000480000B07C641B78383F +S31AFE008A117D000138A000204BFFEC993D2000019BC98B0438631B +S31AFE008A2600017FFD19AE4800008C81210008880900007D2B4BF1 +S31AFE008A3B782C00004C386900017C0903784182002041810010DB +S31AFE008A502C0000434182003C4800004C2C0900504182001C485F +S31AFE008A650000403C80000138848B0438A0012C4800095D4800B5 +S31AFE008A7A00403C80000138848B0438A0012C48000A914800006B +S31AFE008A8F2C3C80000138848B0438A00800480005FD4800001810 +S31AFE008AA43C8000017D635B7838848B0438A0012C480019058013 +S31AFE008AB901002C7C0803A683A1001C83C1002083E100243821C5 +S31AFE008ACE00284E8000209421FFF87C0802A69001000C88030079 +S31AFE008AE3002C000070408200183C80000138848B0438A0012CF7 +S31AFE008AF848000709480000143C80000138848B0438A0012C485C +S31AFE008B0D0018B58001000C7C0803A6382100084E80002039231D +S31AFE008B22011C7C0348404C800020800400003884000490030053 +S31AFE008B3700386300047C0348404180FFEC4E8000203800004568 +S31AFE008B4C98030000392000309D230001380000329C03000138E9 +S31AFE008B616300014E8000203800004F980300003920004B9D2323 +S31AFE008B760001386300014E8000209421FFE87C0802A693A1005F +S31AFE008B8B0C93C1001093E100149001001C7C9E23797C7D1B78EA +S31AFE008BA03BE0000041820038887D00003BBD00014BFFE2A537A0 +S31AFE008BB5DEFFFF7FFF1B7857E920367C00002654001FFE7C0095 +S31AFE008BCA00D07D2900787FE000387C1F4B784082FFD07FE3FBC1 +S31AFE008BDF788001001C7C0803A683A1000C83C1001083E100143F +S31AFE008BF4382100184E8000209421FFE87C0802A6938100089392 +S31AFE008C09A1000C93C1001093E100149001001C7C7D1B787C9C68 +S31AFE008C1E2378388000024BFFFF5D907C0000387D0002800100FE +S31AFE008C331C7C0803A68381000883A1000C83C1001083E10014D7 +S31AFE008C48382100184E8000209421FFE87C0802A693810008933D +S31AFE008C5DA1000C93C1001093E100149001001C7C7D1B787C9C14 +S31AFE008C722378388000084BFFFF09907C0000387D0008800100F2 +S31AFE008C871C7C0803A68381000883A1000C83C1001083E1001483 +S31AFE008C9C382100184E8000203803FF9F2800000541810014384C +S31AFE008CB103FFA990040000386000014E8000203803FFBF2800C3 +S31AFE008CC600054181000C3803FFC94BFFFFE43863FFD05460066E +S31AFE008CDB3E280000094081000C386000004E80002090640000CA +S31AFE008CF0386000014E8000209421FFE87C0802A693A1000C9349 +S31AFE008D05C1001093E100149001001C7C7D1B78887D00003BBDC6 +S31AFE008D1A00014BFFFF897FA3EB788001001C7C0803A683A100FA +S31AFE008D2F0C83C1001083E10014382100184E8000203D20FE0198 +S31AFE008D445480E13E39293E707D6900AE5484073E7C0920AE9976 +S31AFE008D596300009C030001386300014E8000209421FFE07C085C +S31AFE008D6E02A69381001093A1001493C1001893E1001C9001004B +S31AFE008D83247C7F1B787C9C23783BC000003BA100084800001833 +S31AFE008D988001000857DE20365400073E7FDE03783BFF0001887A +S31AFE008DAD7F00007FA4EB784BFFFEF12C0300004082FFDC93DC34 +S31AFE008DC200007FE3FB78800100247C0803A68381001083A100B9 +S31AFE008DD71483C1001883E1001C382100204E8000209421FFE890 +S31AFE008DEC7C0802A69381000893A1000C93C1001093E10014906A +S31AFE008E0101001C7C7F1B783B9F00107C1FE0407C9E2378408093 +S31AFE008E160038887F00004BFFE0398C1F00017C7D1B787C0303E7 +S31AFE008E2B784BFFE02957BD20363BFF00017FBD1B787C1FE04034 +S31AFE008E409BBE00003BDE00014180FFD07FE3FB788001001C7C28 +S31AFE008E550803A68381000883A1000C83C1001083E100143821F2 +S31AFE008E6A00184E8000209421FFE87C0802A693A1000C93C1008D +S31AFE008E7F1093E100149001001C7C9D237857A4463E4BFFFEB169 +S31AFE008E9457A4863E4BFFFEA957A4C63E4BFFFEA157A4063E4BA3 +S31AFE008EA9FFFE998001001C7C0803A683A1000C83C1001083E168 +S31AFE008EBE0014382100184E8000209421FFE87C0802A693A1002C +S31AFE008ED30C93C1001093E100149001001C7C9E2378881E000086 +S31AFE008EE83BE000002C000000393E0001418200207FFDFB788858 +S31AFE008EFD0900003BBD00012C000000392900014082FFF07FBFDC +S31AFE008F12EB782F9F00C97C0000265400EFFE7C0000D07C090098 +S31AFE008F27F87FE00038712900C87C1F4B7857E4063E7FFDFB7874 +S31AFE008F3C4BFFFE052C1D00003BFFFFFF4081005C7FFDFB787FC3 +S31AFE008F51C4F378896400007FAAEB78210B00007C085914696970 +S31AFE008F660023210900007D2849147C004B783000FFFF7C0001B9 +S31AFE008F7B107C0900F87129002A7D6B00387D6B4B782C0A00008B +S31AFE008F909963000038840001386300013BBDFFFF4181FFB48088 +S31AFE008FA501001C7C0803A683A1000C83C1001083E10014382114 +S31AFE008FBA00184E8000209421FFF07C0802A693C1000893E100F8 +S31AFE008FCF0C900100143BC300107C03F0407C9F2378408000188D +S31AFE008FE4889F00003BFF00014BFFFD557C03F0404180FFF08097 +S31AFE008FF90100147C0803A683C1000883E1000C382100104E802A +S31AFE00900E0020392000047D2903A638000000980300003863000F +S31AFE009023014200FFF87C80C670980300007C8986709D23000171 +S31AFE0090387C8046709C030001988300014E8000203963000438EB +S31AFE00904D600000394000037D405378892B00002C000000546012 +S31AFE009062402E7C034B78396B0001394AFFFF4181FFE44E8000AC +S31AFE00907720380000087C0903A68804000038840001980300006E +S31AFE00908C386300014200FFF04E8000209421FFE87C0802A693B5 +S31AFE0090A1C1001093E100149001001C3BC100087C9F23787FC3B4 +S31AFE0090B6F37848001AE12C0300004182003038000051981F0091 +S31AFE0090CB00392000439D3F00017FC3F3784BFFFF717C641B7839 +S31AFE0090E03BFF00017FE3FB784BFFFD894800000C7FE3FB784B23 +S31AFE0090F5FFFA557C7F1B7838000000981F00008001001C7C0876 +S31AFE00910A03A683C1001083E10014382100184E8000209421FFC4 +S31AFE00911FC87C0802A693A1002C93C1003093E100349001003CEA +S31AFE0091343BA100207C641B787FA3EB784BFFFED17FA3EB783858 +S31AFE00914981000848001AF52C03000041820014800100103860FE +S31AFE00915E00012C00000040820008386000008001003C7C080325 +S31AFE009173A683A1002C83C1003083E10034382100384E80002062 +S31AFE0091889421FFE07C0802A693A1001493C1001893E1001C903A +S31AFE00919D0100247C7D1B787C9F2378388100084BFFFBBD7C1DF6 +S31AFE0091B2180041820020806100084BFFFF612C03000041820024 +S31AFE0091C7107FE3FB784BFFF99D4800000C7FE3FB784BFFF971ED +S31AFE0091DC3800000098030000800100247C0803A683A10014831A +S31AFE0091F1C1001883E1001C382100204E8000209421FFD87C0895 +S31AFE00920602A693A1001C93C1002093E100249001002C892300E2 +S31AFE00921B003800FFFF2C0900677C9F237890010008386300017D +S31AFE0092304182008C418100102C09006341820024480000C02C51 +S31AFE009245090070408200B8388100084BFFFAA9388100104BFF5C +S31AFE00925AFB91480000B0880300002C00002D4082002088030026 +S31AFE00926F012C000031408200143D2000003800000090093BE069 +S31AFE009284480000103C80000038843BE04BFFFAD93D20000080EC +S31AFE009299693BE02C030000418200104BFFFE792C030000418283 +S31AFE0092AE00547FE3FB784BFFF8B5480000503FA00000389D3B00 +S31AFE0092C3DC4BFFFAA5809D3BDC386100104BFFFD41801D3BDCB4 +S31AFE0092D82C00FFFF4182000C2C000000408200103800000290BC +S31AFE0092ED0100084800001C3800000190010008480000107FE36F +S31AFE009302FB784BFFF8457C7F1B78800100082C00000041820052 +S31AFE00931728418100102C00FFFF4182008C4800007C2C000001D9 +S31AFE00932C418200242C00000241820060480000683D20000139A9 +S31AFE0093412923503D600000912B36F0480000603FA000013C80B4 +S31AFE009356000138842350387D246C4BFFF7C13861001038800026 +S31AFE00936B4738BD246C480019292C03000041820028381D246C94 +S31AFE0093803D2000007FE3FB78900936F04BFFF7DD480000187FE6 +S31AFE009395E3FB784BFFF7D14800000C7FE3FB784BFFF7A57C7F4D +S31AFE0093AA1B7838000000981F00008001002C7C0803A683A1002A +S31AFE0093BF1C83C1002083E10024382100284E8000209421FFD09A +S31AFE0093D47C0802A693210014934100189361001C9381002093C9 +S31AFE0093E9A1002493C1002893E1002C900100347C9F23787CBDD6 +S31AFE0093FE2B78388100084BFFF8F53881000C3F8000004BFFF7F6 +S31AFE009413ED389C3BCC4BFFF9D1380000513BBDFFE67F3FEA1442 +S31AFE009428981F00003920004D9D3F00013BFF00017FFAFB787F4B +S31AFE00943D43D378388000004BFFF8FD7C7F1B787FFEFB783800DB +S31AFE0094520030389C3BCC981E0000387E00014BFFFB617C7F1BCD +S31AFE009467783B8000003F600000480000247FE3FB78389D3BD4F5 +S31AFE00947C4BFFFB457C7F1B78389D3BD43B9C0001387B3BCC4BFE +S31AFE009491FFFBE97C1FC840408000408001000C7C1C0000408057 +S31AFE0094A60034806100083C8000003FA0000038843BCC38BD3B02 +S31AFE0094BBD4480017292C03000038000000900100084082FFA8D3 +S31AFE0094D038000031981E00007F43D3785784063E4BFFF861385D +S31AFE0094E5000000981F0000800100347C0803A683210014834159 +S31AFE0094FA00188361001C8381002083A1002483C1002883E10005 +S31AFE00950F2C382100304E8000209421FFC07C0802A693A1003498 +S31AFE00952493C1003893E1003C90010044380000007C9F2378909F +S31AFE00953901001C900100109001001490010018388100204BFFEA +S31AFE00954EF7053BA100287FA4EB784BFFF8917FA3EB783881006D +S31AFE00956308480016DD2C030000418200E438000071981F000076 +S31AFE009578392000709D3F000180810020387F00014BFFF8E938F8 +S31AFE00958D8100084BFFFA31800100207C7F1B787009000241825A +S31AFE0095A20020388000024BFFF8C9388000024BFFF79188810036 +S31AFE0095B7134BFFF7897C7F1B7880010020700900044182002827 +S31AFE0095CC800100142C0000004182001C7FE3FB78388000044B0A +S31AFE0095E1FFF891808100144BFFF8E17C7F1B7880010020700909 +S31AFE0095F6000841820028800100182C0000004182001C7FE3FB68 +S31AFE00960B78388000084BFFF861808100184BFFF8B17C7F1B78D1 +S31AFE0096208001002070090010418200348001001C2C0000004106 +S31AFE0096358200287FE3FB78388000104BFFF8318081001C4BFFFB +S31AFE00964AF8814800000C7FE3FB784BFFF4F57C7F1B783800006C +S31AFE00965F00981F0000800100447C0803A683A1003483C1003875 +S31AFE00967483E1003C382100404E8000209421FFD87C0802A6936B +S31AFE0096896100149381001893A1001C93C1002093E1002490013A +S31AFE00969E002C3B8100087C7D1B787C9B23787CA42B787F83E3DD +S31AFE0096B3784BFFF95D7F83E3787FA4EB787F65DB7848001631DD +S31AFE0096C88001002C7C0803A6836100148381001883A1001C83D8 +S31AFE0096DDC1002083E10024382100284E8000203D200000816955 +S31AFE0096F236F05463103A7C63582E4E8000203D20000081693668 +S31AFE009707F05463103A7C83592E4E8000209421FFF87C0802A60C +S31AFE00971C9001000C3D20000039293200816900185464063E8028 +S31AFE0097316B0000800B000C7C0803A64E8000218001000C7C08F0 +S31AFE00974603A6382100084E8000209421FFF87C0802A6900100A9 +S31AFE00975B0C3D2000003929320081690018806B0000800B001070 +S31AFE0097707C0803A64E8000218001000C7C0803A6382100084E5B +S31AFE0097858000209421FFF87C0802A69001000C3D2000003929F7 +S31AFE00979A3200816900187C651B78806B0000800B0014388000CC +S31AFE0097AF007C0803A64E8000218001000C7C0803A6382100086A +S31AFE0097C44E8000209421FFE87C0802A693A1000C93C10010939F +S31AFE0097D9E100149001001C3FC00000817E3BE43D2000002C0B24 +S31AFE0097EE0000380000003BBE3BE4900936F47C7F1B78418200FE +S31AFE009803187D635B7848000055801E3BE42C0000004082002C0D +S31AFE009818813F00003C007D82913D000460001008901F000093B0 +S31AFE00982DFE3BE43860000348000971386000034800090180013A +S31AFE009842001C7C0803A683A1000C83C1001083E100143821006F +S31AFE009857184E8000209421FFF87C0802A69001000C3D20000020 +S31AFE00986C816936F42C0B0000408200183D20000080093BE43980 +S31AFE009881493BE47C0300004182000C3860000048000024800A8A +S31AFE009896000491693BE490030000386000034800090138600084 +S31AFE0098AB0348000891386000018001000C7C0803A6382100080C +S31AFE0098C04E8000203D20000080093BE43120FFFF7C6901104E09 +S31AFE0098D58000209421FFF87C0802A69001000C2C030000418273 +S31AFE0098EA00483D400000812A36F83929FFFF2C090000912A3641 +S31AFE0098FFF8418100683D20000039293200816900183800000003 +S31AFE009914900A36F8806B0000800B0014388000057C0803A64EB0 +S31AFE0099298000214800003C3D600000812B36F8392900012C09F1 +S31AFE00993E0001912B36F8408200243D2000003929320081690064 +S31AFE0099531838800004806B0000800B00147C0803A64E80002181 +S31AFE0099688001000C7C0803A6382100084E8000209421FFF87CB5 +S31AFE00997D0802A69001000C3D2000003929320081690018806BA6 +S31AFE0099920000800B00107C0803A64E8000218001000C7C0803F1 +S31AFE0099A7A6382100084E8000209421FFC87C0802A692C10010A7 +S31AFE0099BC92E10014930100189321001C934100209361002493F0 +S31AFE0099D181002893A1002C93C1003093E100349001003C2C044B +S31AFE0099E6000D418201B43D600000814B36FC3D200001392997F1 +S31AFE0099FBD47C8951AE2C04000A394A0001914B36FC3F40000030 +S31AFE009A104182000C2C0A0064408201843D200000392932008319 +S31AFE009A25C900187EE000A67EE0BB7839600000516004207C00C8 +S31AFE009A3A01243D20FE013AC93E84807E0000813E000C3880004C +S31AFE009A4F247D2803A63B6000003BE0004F4E800021807E00009A +S31AFE009A64813E000C3880004F7D2803A64E800021801A36FC7C92 +S31AFE009A791B0000408000703D2000013D60FE013B0997D43B2B7A +S31AFE009A8E3E847D38D8AE807E00005520E13E7F9900AE817E006B +S31AFE009AA30C7F84E3787D6803A65529073E7FB948AE3B7B00010A +S31AFE009AB84E800021807E0000813E000C7FA4EB787D2803A64EBB +S31AFE009ACD800021801A36FC7F9FE214579F063E7C1B00007FBFF0 +S31AFE009AE2EA1457BF063E4180FFA8807E0000813E000C3880002A +S31AFE009AF7237D2803A64E800021807E0000813E000C57E0E13ED7 +S31AFE009B0C7C9600AE7D2803A64E800021807E0000813E000C5723 +S31AFE009B21E0073E7C9600AE7D2803A64E800021807E0000813E4C +S31AFE009B3600107D2803A64E8000215460063E2C00002B98610081 +S31AFE009B4B08418200383861000838800001480016492C030000CE +S31AFE009B6040820014880100082C00002D4082FFC44BFFFED43D4E +S31AFE009B752000003929320038000001900900443D600000392017 +S31AFE009B8A0000912B36FC7C0000A652E004207C0001248001003A +S31AFE009B9F3C7C0803A682C1001082E10014830100188321001C1E +S31AFE009BB483410020836100248381002883A1002C83C100308339 +S31AFE009BC9E10034382100384E8000209421FFE87C0802A693A1F3 +S31AFE009BDE000C93C1001093E100149001001C7CBF2B787FE0FB91 +S31AFE009BF3782C0000007C7D1B787C9E23783BFFFFFF4182002455 +S31AFE009C08889E00007FA3EB784BFFFDA17FE0FB782C0000003B77 +S31AFE009C1DDE00013BFFFFFF4082FFE48001001C7C0803A683A184 +S31AFE009C32000C83C1001083E10014382100184E8000209421FF2E +S31AFE009C47E87C0802A693A1000C93C1001093E100149001001C17 +S31AFE009C5C7CBF2B787FE0FB782C0000007C7D1B787C9E23783B97 +S31AFE009C71FFFFFF418200247FA3EB784BFFFCFD7FE0FB782C0030 +S31AFE009C860000987E00003BDE00013BFFFFFF4082FFE480010037 +S31AFE009C9B1C7C0803A683A1000C83C1001083E1001438210018FA +S31AFE009CB04E8000209421FF909081000C90A1001090C100149016 +S31AFE009CC5E100189101001C912100209141002438600000382126 +S31AFE009CDA00704E8000209421FFF87C0802A69001000C38600006 +S31AFE009CEF004BFFFBE93D600001380000207C0903A63D200000AD +S31AFE009D0481493BF0396B23503D000000392000007C09502E7C25 +S31AFE009D1909592E392900044200FFF47D6A5B783D200000816905 +S31AFE009D2E3BF0800B0094900A0100812B0090912A0104800B00B0 +S31AFE009D4380900A0108812B0088912A010C800B008C900A011026 +S31AFE009D58812B0084912A01143D4000003D600000800B36F43DE6 +S31AFE009D6D2000012C00000039292350912A36F0418200183800C7 +S31AFE009D820000900836F4386000404BFFF9614BFFFACD386000E1 +S31AFE009D97404BFFF9554BFFFAC13D20000090693BF48001000CC4 +S31AFE009DAC7C0803A6382100084E8000209421FFF87C0802A690BA +S31AFE009DC101000C380000207C0903A63D20000081493BF03D6007 +S31AFE009DD60001396B2350392000007C09582E7C09512E39290092 +S31AFE009DEB044200FFF47D6A5B783D20000081693BF0800A01006F +S31AFE009E00900B0094812A0104912B0090800A0108900B008081EF +S31AFE009E152A010C912B0088800A0110900B008C812A0114912B7B +S31AFE009E2A0084386000014BFFFAA98001000C7C0803A638210002 +S31AFE009E3F084E800020386000004E8000203D20FE0139299E44EE +S31AFE009E543D400000912A36CC3D60FE01396B9F8C3D2000009162 +S31AFE009E696936C83D40FE013D600000394A9CE0914B36D43D201E +S31AFE009E7EFE0139299DB83D600000912B36D04E8000209421FF14 +S31AFE009E93F07C0802A693C1000893E1000C900100143D200000BC +S31AFE009EA8800937002C000000408200C4380000019009370048DE +S31AFE009EBD0060493D2000003BC93200813E00343860FFFF7D2822 +S31AFE009ED203A64E800021813E00347C7F1B783860FFFD7D280322 +S31AFE009EE7A64E800021815E00143D20FE0139299BD4912A0004EE +S31AFE009EFC3D60FE016FE0FFFF396B9C446800FFFE3D20FE01918E +S31AFE009F116A0008392999B03100FFFF7CE80110912A000C3D6012 +S31AFE009F26FE01301FFFFF7D00F910396B99783D20FE017CE040A3 +S31AFE009F3B39916A001039299CB4912A001441820014813E00347E +S31AFE009F507FE3FB787D2803A64E800021801E0030386000007C04 +S31AFE009F650803A64E800021386000044BFFCE2D800100147C0849 +S31AFE009F7A03A683C1000883E1000C382100104E8000209421FF5E +S31AFE009F8FF87C0802A69001000C3D20000039293200800900403E +S31AFE009FA42C0000004182000C7C0803A64E8000218001000C7C84 +S31AFE009FB90803A6382100084E8000207FE000084E800020942185 +S31AFE009FCEFFD87C0802A6936100149381001893A1001C93C1009F +S31AFE009FE32093E100249001002C7C9D23787C7C1B783800005425 +S31AFE009FF8981D00007F8326704BFFCE059C7D00017F83E3784B24 +S31AFE00A00DFFCDF97FBFEB789C7F0001380000749C1F00013920F7 +S31AFE00A02200689D3F0001380000729C1F0001392000659D3F00E0 +S31AFE00A03701380000619C1F0001392000643BA0003A9D3F00010B +S31AFE00A04C9FBF000148000D01906100083BFF00017FE4FB783804 +S31AFE00A06161000838A0000438C000004BFFD2517C7F1B783B80F3 +S31AFE00A076003B9B9F0000386000044BFFCD859C7F000138600070 +S31AFE00A08B404BFFCD799C7F00019FBF0001386000404BFFF65108 +S31AFE00A0A03B61000C9061000C3BFF00017FE4FB787F63DB783884 +S31AFE00A0B5A0000438C000004BFFD2017C7F1B789B9F0000386079 +S31AFE00A0CA00004BFFCD399C7F0001386000014BFFCD2D9C7F0019 +S31AFE00A0DF019FBF0001386000014BFFF6059061000C3BFF0001F2 +S31AFE00A0F47FE4FB787F63DB7838A0000438C000004BFFD1B97C24 +S31AFE00A1097F1B7838000000981F00019B9F00008001002C7C08D0 +S31AFE00A11E03A6836100148381001883A1001C83C1002083E10063 +S31AFE00A13324382100284E8000202C030001418200202803000141 +S31AFE00A148418000502C030002418200242C030003418200304868 +S31AFE00A15D00003C3C0002004C00012C7C108BA64C00012C480078 +S31AFE00A17200283C0004004C00012C7C108BA64C00012C48000075 +S31AFE00A187143C000C004C00012C7C108BA64C00012C7C708AA698 +S31AFE00A19C54630FFE4E8000202C03000141820020280300014178 +S31AFE00A1B18000682C030002418200202C03000341820028480034 +S31AFE00A1C600543C0002007C0004AC7C188BA6480000443D6004D0 +S31AFE00A1DB007C0004AC7D788BA648000034380000807C0903A6B7 +S31AFE00A1F039200000612010003D600E007C0004AC7D398BA67D31 +S31AFE00A205788BA67C198BA67D788BA6392900104200FFE07C7824 +S31AFE00A21A8AA654630FFE4E8000203D60000038000001900B36A2 +S31AFE00A22FDC3D20FE013929A2F43D600000912B37043D400000D5 +S31AFE00A24448000098800A3BEC2800000340810030708000034021 +S31AFE00A259820028706000034082002080030000386300049004D7 +S31AFE00A26E0000812A3BEC388400043929FFFC4800005C3D6000A7 +S31AFE00A28300800B3BEC2800000140810034708000014082002C13 +S31AFE00A2987060000140820024A003000038630002B00400008181 +S31AFE00A2AD2B3BEC388400023929FFFE912B3BEC48000020880353 +S31AFE00A2C200003863000198040000812A3BEC388400013929FF5B +S31AFE00A2D7FF912A3BEC800A3BEC2C0000004082FF643D2000002E +S31AFE00A2EC38000000900936DC3D20000038000000900937044EBF +S31AFE00A3018000209421FFE87C0802A69381000893A1000C93C12B +S31AFE00A316001093E100149001001C7C601B787CBC2B787C83237D +S31AFE00A32B783FA000007C040378939D3BEC4BFFFEED807D3BEC17 +S31AFE00A3407C63E0508001001C7C0803A68381000883A1000C836C +S31AFE00A355C1001083E10014382100184E8000209421FFE87C0827 +S31AFE00A36A02A69381000893A1000C93C1001093E1001490010059 +S31AFE00A37F1C7CBC2B783FA00000939D3BEC4BFFFE99807D3BEC93 +S31AFE00A3947C63E0508001001C7C0803A68381000883A1000C8318 +S31AFE00A3A9C1001083E10014382100184E800020386000004E808D +S31AFE00A3BE0020386000004E800020386000004E8000209421FFA6 +S31AFE00A3D3F07C0802A693C1000893E1000C900100143D20000077 +S31AFE00A3E880093BFC2C000000418200603FE000003BC000007DB6 +S31AFE00A3FD4000A67D40537839200000512004207C000124817F4A +S31AFE00A4123BFC800B0014901F3BFC808B001893CB00187C000060 +S31AFE00A427A6514004207C000124812B000C80AB0010806B000042 +S31AFE00A43C7D2803A64E800021801F3BFC2C0000004082FFB080D7 +S31AFE00A4510100147C0803A683C1000883E1000C382100104E80BD +S31AFE00A46600209421FFF87C0802A69001000C4BFFFF5D80010021 +S31AFE00A47B0C7C0803A6382100084E80002090690000380000000F +S31AFE00A490900900149089000490A90010900900189128000090A6 +S31AFE00A4A5C9000890E9000C4E800020812300002C0900004182BE +S31AFE00A4BA00F8810300043809FFFF28000039418100E83D60FE24 +S31AFE00A4CF01396B3E985400103A7D4B002E3D20FE0139293E98D1 +S31AFE00A4E47D4A4A147D4903A64E8004203D20FF0061290200A150 +S31AFE00A4F96900007C0006AC556B063E38000000600080007C001B +S31AFE00A50E46307D600378540B043EB16900007C0006AC48000035 +S31AFE00A523903D20FF0061290240A16900007C0006AC556B063E2B +S31AFE00A53838000000600080007C0046307D600378540B043EB156 +S31AFE00A54D6900007C0006AC4800005C3D20FF0061290220A169A8 +S31AFE00A56200007C0006AC556B063E38000000600080007C0046D4 +S31AFE00A577307D600378540B043EB16900007C0006AC48000028EA +S31AFE00A58C3D20FF0061290940800900007C0006AC540004DE5545 +S31AFE00A5A10B68247C005B78900900007C0006AC800300003D2014 +S31AFE00A5B60000394933A85408103A7C0A402E3D20FE0039296078 +S31AFE00A5CBB47C004800418200187C0A402E3D20FE013929B218A8 +S31AFE00A5E07C0048004C820020800300083D6000007C0A412E8112 +S31AFE00A5F5430010396B34943D2000007D4B412E392935807C69FE +S31AFE00A60A412E4E8000207C631B794D8200203803FFFF28000017 +S31AFE00A61F397C0803784D8100203D60FE01396B3F805500103A5E +S31AFE00A6347D4B002E3D20FE0139293F807D4A4A147D4903A64EB8 +S31AFE00A6498004203D20FF0061290014816900007C0006AC3C0006 +S31AFE00A65E80007C0044307D6B0078916900007C0006AC4E80001D +S31AFE00A673203D20FF0061290200A00900007C0006AC7000FFF789 +S31AFE00A6885400043EB00900007C0006AC4E8000203D20FF006191 +S31AFE00A69D290200A00900007C0006AC7000FFFB5400043EB009E9 +S31AFE00A6B200007C0006AC4E8000203D20FF0061290240A00900A2 +S31AFE00A6C7007C0006AC7000FFFB5400043EB00900007C0006AC65 +S31AFE00A6DC4E8000203D20FF0061290220A00900007C0006AC7028 +S31AFE00A6F100FFF75400043EB00900007C0006AC4E8000203D2092 +S31AFE00A706FF0061290220A00900007C0006AC7000FFFB540004F6 +S31AFE00A71B3EB00900007C0006AC4E8000203D20FF0061290940E3 +S31AFE00A730800900007C0006AC5400066E900900007C0006AC4E7C +S31AFE00A7458000203D20FF0061290948816900007C0006AC394390 +S31AFE00A75AFFE53C0080007C0054307D6B0078916900007C00066A +S31AFE00A76FAC4E8000207C631B794D8200203803FFFF280000393B +S31AFE00A7847C0803784D8100203D60FE01396B40685500103A7DCB +S31AFE00A7994B002E3D20FE01392940687D4A4A147D4903A64E8066 +S31AFE00A7AE04203D20FF0061290014816900007C0006AC3C0080A0 +S31AFE00A7C3007C0044307D6B0378916900007C0006AC4E80002014 +S31AFE00A7D83D20FF0061290200A00900007C0006AC60000008B091 +S31AFE00A7ED0900007C0006AC4E8000203D20FF0061290200A0099D +S31AFE00A80200007C0006AC60000004B00900007C0006AC4E8000F6 +S31AFE00A817203D20FF0061290240A00900007C0006AC60000004A5 +S31AFE00A82CB00900007C0006AC4E8000203D20FF0061290220A096 +S31AFE00A8410900007C0006AC60000008B00900007C0006AC4E80AA +S31AFE00A85600203D20FF0061290220A00900007C0006AC6000008A +S31AFE00A86B04B00900007C0006AC4E8000203D20FF0061290940CC +S31AFE00A880800900007C0006AC60000080900900007C0006AC4E13 +S31AFE00A8958000203D20FF0061290948816900007C0006AC39433F +S31AFE00A8AAFFE53C0080007C0054307D6B0378916900007C000616 +S31AFE00A8BFAC4E8000207C631B794D8200203803FFFF28000039EA +S31AFE00A8D47C0803784D8100203D60FE01396B41505500103A7D91 +S31AFE00A8E94B002E3D20FE01392941507D4A4A147D4903A64E802C +S31AFE00A8FE04203D20FF0061290010816900007C0006AC3C008053 +S31AFE00A913007C0044307D6B0378916900007C0006AC4E800020C2 +S31AFE00A9283D20FF0061290200A00900007C0006AC60000080B0C7 +S31AFE00A93D0900007C0006AC4E8000203D20FF0061290200A0094B +S31AFE00A95200007C0006AC60000040B00900007C0006AC4E800069 +S31AFE00A967203D20FF0061290240A00900007C0006AC60000080D8 +S31AFE00A97CB00900007C0006AC4E8000203D20FF0061290220A045 +S31AFE00A9910900007C0006AC60000080B00900007C0006AC4E80E1 +S31AFE00A9A600203D20FF0061290220A00900007C0006AC60000039 +S31AFE00A9BB40B00900007C0006AC4E8000203D20FF006129094C33 +S31AFE00A9D0816900007C0006AC3943FFE53C0080007C0054307DBD +S31AFE00A9E56B0378916900007C0006AC4E8000207C8723787C63E0 +S31AFE00A9FA1B794D8200203803FFFF280000397C0803784D81005A +S31AFE00AA0F203D60FE01396B42385500103A7D4B002E3D20FE0163 +S31AFE00AA24392942387D4A4A147D4903A64E8004203C0080007C7F +S31AFE00AA390044303D60FF00616B0018808B00007C0006AC7C84D7 +S31AFE00AA4E00787CEAFE707D493A787D2950507D29FE707C8003D2 +S31AFE00AA63787C0048787C8948387D240378908B00007C0006AC3C +S31AFE00AA784E8000207C8823787C631B794D8200203803FFFF2875 +S31AFE00AA8D0000394D8100203D60FE01396B43205400103A7D4B80 +S31AFE00AAA2002E3D20FE01392943207D4A4A147D4903A64E8004E6 +S31AFE00AAB7203D20FF0061290200A08900007C0006AC5484063E0B +S31AFE00AACC38000000600080007C0046307C8003785404043EB0A6 +S31AFE00AAE18900007C0006AC4E8000203D20FF0061290240A08966 +S31AFE00AAF600007C0006AC5484063E38000000600080007C004623 +S31AFE00AB0B307C8003785404043EB08900007C0006AC4E8000209B +S31AFE00AB203D20FF0061290220A08900007C0006AC5484063E3869 +S31AFE00AB35000000600080007C0046307C8003785404043EB089EB +S31AFE00AB4A00007C0006AC4E8000203D20FF00612909408009001E +S31AFE00AB5F007C0006AC540004DE550B68247C005B7890090000A5 +S31AFE00AB747C0006AC4E800020386000014E800020386000014E3E +S31AFE00AB898000203D20000090693C044E8000209421FFF87C085F +S31AFE00AB9E02A69001000C3D2000003D60000181493C04906B98C1 +S31AFE00ABB338814A0000388B98382C0A0000386000004182001052 +S31AFE00ABC8386000027D4803A64E8000218001000C7C0803A6388B +S31AFE00ABDD2100084E8000209421FFF87C0802A69001000C3D2076 +S31AFE00ABF200013D600000814B3C049069983839099838908800AD +S31AFE00AC070490A80008814A00002C0A00004082000C3860000089 +S31AFE00AC1C480000147D044378386000037D4803A64E800021800F +S31AFE00AC3101000C7C0803A6382100084E8000209421FFF87C0851 +S31AFE00AC4602A69001000C3D2000013D600000814B3C0490699818 +S31AFE00AC5B383909983890880004814A00002C0A00004082000CAB +S31AFE00AC7038600000480000147D044378386000047D4803A64E43 +S31AFE00AC858000218001000C7C0803A6382100084E800020942157 +S31AFE00AC9AFFF87C0802A69001000C3D2000013D600000814B3CDE +S31AFE00ACAF0490699838390998389088000490A80008814A000086 +S31AFE00ACC42C0A00004082000C38600000480000147D044378380B +S31AFE00ACD96000057D4803A64E8000218001000C7C0803A638218D +S31AFE00ACEE00084E8000209421FFF87C0802A69001000C3D200085 +S31AFE00AD03013D600000814B3C0490699838390998389088000496 +S31AFE00AD1890A80008814A00002C0A00004082000C386000004833 +S31AFE00AD2D0000147D044378386000077D4803A64E800021800140 +S31AFE00AD42000C7C0803A6382100084E8000209421FFE87C08024E +S31AFE00AD57A693E100149001001C3BE100087FE3FB784BFFFE3196 +S31AFE00AD6C2C0300004082000C3860000048000008A07F00068044 +S31AFE00AD8101001C7C0803A683E10014382100184E8000209421E3 +S31AFE00AD96FFF87C0802A69001000C4BFFB3F98001000C7C0803DA +S31AFE00ADABA6382100084E8000203C00FE00600001007C0903A6D1 +S31AFE00ADC04E8004209421FFF87C0802A69001000C4BFFFFE538AD +S31AFE00ADD56000008001000C7C0803A6382100084E800020386064 +S31AFE00ADEA00004E8000209421FFE87C0802A693A1000C93C10006 +S31AFE00ADFF1093E100149001001C7C7F1B78386000003BA00001F4 +S31AFE00AE14380000002C1FFFFE41820040418100102C1FFFFD4148 +S31AFE00AE2982004C480000502C1FFFFF408200483D200000812950 +S31AFE00AE3E37082C0900003BA9FFFF4181003C7D3D4B7840820068 +S31AFE00AE53343BA0FFFD4800002C3D200000392932003D600000D9 +S31AFE00AE689069001893EB3708480000143BE00000480000083B01 +S31AFE00AE7DFF0001380000012C000000418200803D2000003BC9B3 +S31AFE00AE923200813E00182C09000041820018806900008009001C +S31AFE00AEA714388000047C0803A64E8000213D200001392998440A +S31AFE00AEBC57E028347C004A143D2000002C030000901E0018932B +S31AFE00AED1E93708813E00184182001C806900008009001438804C +S31AFE00AEE600057C0803A64E800021480000188069000080090060 +S31AFE00AEFB14388000047C0803A64E8000217FA3EB788001001C30 +S31AFE00AF107C0803A683A1000C83C1001083E10014382100184E40 +S31AFE00AF2580002039400001380000002C03FFFE418200404181D0 +S31AFE00AF3A00102C03FFFD4182004C480000502C03FFFF4082002D +S31AFE00AF4F483D2000008129370C2C0900003949FFFF4181003CA4 +S31AFE00AF647D2A4B78408200343940FFFD4800002C3D20000039F5 +S31AFE00AF792932003D60000090090014906B370C480000143860E8 +S31AFE00AF8E00004800000838630001380000012C00000041820096 +S31AFE00AFA3283D20000139299844546028343D6000007C004A144A +S31AFE00AFB8396B32003D200000900B00149069370C7D4353784E89 +S31AFE00AFCD8000204E8000204E8000204E8000209421FFE87C08E1 +S31AFE00AFE202A693E100149001001C3D200000392932008169009E +S31AFE00AFF7183800000090010008812B0000800B00187C651B7895 +S31AFE00B00C7C8623787D234B78388100087C0803A64E80002180CE +S31AFE00B0210100087C7F1B782C000000418200103D20000080693A +S31AFE00B0363C08480001997FE3FB788001001C7C0803A683E100D8 +S31AFE00B04B14382100184E8000209421FFE87C0802A693A1000C71 +S31AFE00B06093C1001093E100149001001C380000407C0903A63D5B +S31AFE00B0752000003D60FE0139293200396BADE8394000007D69DA +S31AFE00B08A512E394A00044200FFF83D2000013D60FE013929987A +S31AFE00B09F44396BADE839000000550A28343808000139000008A5 +S31AFE00B0B47D0903A67D69512E394A00044200FFF87C0803782C04 +S31AFE00B0C90800024081FFDC3FA0000038000013901D32003D6022 +S31AFE00B0DE00003BBD3200396B33A8917D00043D200000392930AF +S31AFE00B0F3003D60FE01913D0008396BADB4917D00403D20FE0123 +S31AFE00B1083929ADC43D60FE01913D0010396BAD94917D00483D69 +S31AFE00B11D20FE013929ADF03D60FE01913D0030396BAF283D4069 +S31AFE00B132FE01917D0034394AAFD03D20FE01915D00203929AF46 +S31AFE00B147D4913D001C3860FFFE4BFFFCA13860FFFE4BFFFDD108 +S31AFE00B15C38000000901D0024901D0028901D004C901D004438DA +S31AFE00B1717D003C4BFFFA193D20FE01392997C8913D008C8001B7 +S31AFE00B186001C7C0803A683A1000C83C1001083E1001438210012 +S31AFE00B19B184E8000207C842379418200243884FFFF7C0320AE0B +S31AFE00B1B02C0000034082000C386000014E8000202C0400004092 +S31AFE00B1C582FFE4386000004E8000209421FFF87C0802A690011D +S31AFE00B1DA000C7C631B793D20FE013809B2084182000880030038 +S31AFE00B1EF943D200000392932008129008C7C0303787D2803A644 +S31AFE00B2044E8000218001000C7C0803A6382100084E80002094A5 +S31AFE00B21921FFF07C0802A693C1000893E1000C900100143D2002 +S31AFE00B22E0000800932007C7F1B782C000014396932007C9E236D +S31AFE00B243783860FFFF4082001C812B001838800006806900009B +S31AFE00B258800900147C0803A64E8000217C1F18004082001C7F14 +S31AFE00B26DE3FB787FC4F3784BFFFD697C601B797C0303784082E8 +S31AFE00B28200287FE3FB787FC4F3784BFFAE257C601B787C09FEF9 +S31AFE00B297707D2302787C6348507C63FE707C03183880010014EC +S31AFE00B2AC7C0803A683C1000883E1000C382100104E8000202821 +S31AFE00B2C10500037C691B78408100107C801B78700B0003418253 +S31AFE00B2D600302C05000038A5FFFF4D820020880400002C050077 +S31AFE00B2EB0098090000388400013929000138A5FFFF4082FFE805 +S31AFE00B3004E8000202805000F7C6B1B78408100388004000038DB +S31AFE00B315A5FFF0900B0000852400042805000F952B00048404BB +S31AFE00B32A0004940B000485240004952B000438840004396B008E +S31AFE00B33F044181FFD028050003408100208004000038A5FFFCF3 +S31AFE00B35428050003900B000038840004396B00044181FFE82CD8 +S31AFE00B3690500007D695B7838A5FFFF4D820020880400002C0586 +S31AFE00B37E000098090000388400013929000138A5FFFF4082FF59 +S31AFE00B393E84E800020280500037C691B784081000C7060000383 +S31AFE00B3A8418200282C05000038A5FFFF4D8200202C05000098DD +S31AFE00B3BD8900003929000138A5FFFF4082FFF04E800020548439 +S31AFE00B3D2063E5480402E7C0023785409801E7C004B787C6B1B89 +S31AFE00B3E7782805000F40810024900B0000940B000438A5FFF0AA +S31AFE00B3FC940B00042805000F940B0004396B00044181FFE42841 +S31AFE00B4110500034081001838A5FFFC28050003900B0000396BFA +S31AFE00B42600044181FFF02C0500007D695B784D8200207CA90357 +S31AFE00B43BA698890000392900014200FFF84E8000209421FFA84B +S31AFE00B4507C631B79394100087D47537839000000408200143818 +S31AFE00B4650000309801000839410009480000247C032B967D2031 +S31AFE00B47A29D67D2918507D6648AE7C030379996A0000394A0052 +S31AFE00B48F014082FFE47C0A3800418200287D0343787CE93B7802 +S31AFE00B4A48C0AFFFF386300017C0A4800980400003884000140F8 +S31AFE00B4B982FFEC7C681B7838000000980400007D03437838212E +S31AFE00B4CE00584E8000209421FF987C0802A67D800026924100B1 +S31AFE00B4E330926100349281003892A1003C92C1004092E10044F5 +S31AFE00B4F8930100489321004C93410050936100549381005893F4 +S31AFE00B50DA1005C93C1006093E100649001006C9181002C7C994C +S31AFE00B52223788BB900003AE100082C1D00007EF2BB787C7B1B10 +S31AFE00B537787CB82B783BC000003AA000003B390001418204801B +S31AFE00B54C2C1D00254082043C8BB900003B3900012C1D002D3A0D +S31AFE00B561C000003BE00000408200108BB900003B3900013AC071 +S31AFE00B57600012C1D0030408200148BB900003B8000013B3900F8 +S31AFE00B58B01480000083B800000381DFFD0280000094181003C48 +S31AFE00B5A07FA3EB787F24CB787FE9FB781D29000A3929FFD07D4E +S31AFE00B5B5291A1488640000388400013803FFD028000009408181 +S31AFE00B5CAFFE47D3F4B787C9923787C7D1B782C1D002E40820091 +S31AFE00B5DF3C8BB900003B390001381DFFD0280000093B9C000131 +S31AFE00B5F4418100247F24CB7888640000388400013803FFD02897 +S31AFE00B6090000094081FFF07C7D1B787C9923782C1D006C3A80C4 +S31AFE00B61E00004082000C8BB900003B390001381DFFA828000068 +S31AFE00B633203A790001418101F83D60FE01396B44405400103A0D +S31AFE00B6487D4B002E3D20FE01392944407D4A4A147D4903A64ECF +S31AFE00B65D800420386000307F6803A63B8000013BE000084E802B +S31AFE00B6720021386000787F6803A64E800021897800005569064A +S31AFE00B6873E38090001280000084181001C801800085529103AB4 +S31AFE00B69C396B00017C604A1499780000480000302809000741B4 +S31AFE00B6B181001C807800043800000839230004981800009138CE +S31AFE00B6C60004480000108078000438030004901800042C1D00DF +S31AFE00B6DB648063000041820028418100102C1D00584182004CA2 +S31AFE00B6F0480000602C1D0070418200342C1D00784182002C48F1 +S31AFE00B70500004C2C0300004080000C3A80002D7C6300D03CC052 +S31AFE00B71AFE0138C644083881000838A0000A480000203CC0FEC8 +S31AFE00B72F0138C644144800000C3CC0FE0138C644283881000830 +S31AFE00B74438A000104BFFFD057C751B787E579378480000EC8997 +S31AFE00B7597800005569063E38090001280000084181001C801875 +S31AFE00B76E00085529103A396B00017C604A1499780000480000BA +S31AFE00B78330280900074181001C807800043800000839230004CB +S31AFE00B798981800009138000448000010807800043803000490F8 +S31AFE00B7AD18000482E300007EE3BB78480003C97C751B7848008E +S31AFE00B7C20080897800005569063E3809000128000008418100B7 +S31AFE00B7D71C801800085529103A396B00017D404A149978000004 +S31AFE00B7EC48000030280900074181001C81580004380000083960 +S31AFE00B8012A000498180000913800044800001081580004380A0C +S31AFE00B816000490180004886A00037F6803A63BDE00014E8000FC +S31AFE00B82B214800018C3860003F7F6803A63BDE00014E8000219E +S31AFE00B8407F55F8503134FFFF7D294910381AFFFF7C0048782FB6 +S31AFE00B8559C00007F4948387D3A03782C140000419E00243BA0A6 +S31AFE00B86A0030418200207E83A3787F6803A63BDE00013A800032 +S31AFE00B87F004E800021480000083BA000202C1400002E160000F2 +S31AFE00B8943AD5FFFF7F8000264092003C7F40D3782C0000003BEA +S31AFE00B8A95AFFFF4081002C7F5FD3787FA3EB787F6803A63BDEEA +S31AFE00B8BE00014E8000217FE0FB782C0000003BFFFFFF4181FF8A +S31AFE00B8D3E47FFAFB787F880120418200147E83A3787F6803A6E1 +S31AFE00B8E83BDE00014E8000217EA0AB782C0000007ED5B3784013 +S31AFE00B8FD8100547EBDAB787EFCBB788BFC00007F6803A67FE3D9 +S31AFE00B912FB783B9C00013BDE00014E8000212C1F000A408200B1 +S31AFE00B927143860000D7F6803A63BDE00014E8000217FA0EB7833 +S31AFE00B93C2C0000003BBDFFFF4181FFC47F97E3787FB5EB784102 +S31AFE00B9519200687F40D3782C0000003B5AFFFF408100587F5F23 +S31AFE00B966D378386000207F6803A63BDE00014E8000217FE0FBD2 +S31AFE00B97B782C0000003BFFFFFF4181FFE4480000307FA3EB7835 +S31AFE00B9907F6803A63BDE00013A7900014E8000212C1D000A40BE +S31AFE00B9A58200143860000D7F6803A63BDE00014E8000218BB971 +S31AFE00B9BA00007E799B782C1D00004082FB887FC3F378800100AE +S31AFE00B9CF6C8181002C7C0803A682410030826100348281003853 +S31AFE00B9E482A1003C82C1004082E10044830100488321004C8382 +S31AFE00B9F9410050836100548381005883A1005C83C1006083E188 +S31AFE00BA0E00647D808120382100684E8000203D20000081693CEB +S31AFE00BA230C38000000986B0000396B000191693C0C980B000039 +S31AFE00BA384E8000209421FF707C0802A693A1008493C100889390 +S31AFE00BA4DE1008C900100943D60000090A10010906B3C0C38A154 +S31AFE00BA6200083BA1009838000002396000003C60FE0190A100B0 +S31AFE00BA77789081000C90C1001490E100189101001C91210020B3 +S31AFE00BA8C91410024980100709961007193A100743863BA1C38E6 +S31AFE00BAA1A100704BFFFA31800100947C0803A683A1008483C1D8 +S31AFE00BAB6008883E1008C382100904E8000209421FF707C08027E +S31AFE00BACBA693A1008493C1008893E1008C9001009490A10010C2 +S31AFE00BAE09081000C7C641B789061000838A100083BA100983837 +S31AFE00BAF5000001396000003C60FE0190A1007890C1001490E184 +S31AFE00BB0A00189101001C91210020914100249801007099610091 +S31AFE00BB1F7193A100743863BD7838A100704BFFF9A980010094DA +S31AFE00BB347C0803A683A1008483C1008883E1008C382100904E30 +S31AFE00BB498000209421FFF87C0802A69001000C7C601B787C855E +S31AFE00BB5E23783C60FE013863BD787C0403784BFFF969800100A0 +S31AFE00BB730C7C0803A6382100084E80002088030000392000004D +S31AFE00BB884800000C88030000392900012C00000038630001405A +S31AFE00BB9D82FFF07D234B784E8000207C691B78480000102C03CE +S31AFE00BBB20000386000004D8200208869000088040000388400BA +S31AFE00BBC7017C030000392900014182FFE07C6018504E800020AE +S31AFE00BBDC880400007C691B784800001098030000880400003895 +S31AFE00BBF16300012C000000388400014082FFEC3800000098036E +S31AFE00BC0600007D234B784E8000207C6B1B78480000102C0300D3 +S31AFE00BC1B00386000004D820020886B0000396B00013803FFBFF8 +S31AFE00BC30280000194181000C380300205403063E892400003811 +S31AFE00BC458400013809FFBF280000194181000C38090020540995 +S31AFE00BC5A063E7D204B787C0300004182FFB47C6018504E800026 +S31AFE00BC6F207CA02B797C691B787C0903A64082001438600000C8 +S31AFE00BC844E8000207C6018504E800020886900008804000038D2 +S31AFE00BC998400017C030000392900014082FFE42C030000418294 +S31AFE00BCAE00084200FFE0386000004E8000207CA02B797C6B1B0C +S31AFE00BCC3787C0903A640820018386000004E8000207C6018501E +S31AFE00BCD84E80002042400050886B0000396B00013803FFBF28DA +S31AFE00BCED0000194181000C380300205403063E892400003884F8 +S31AFE00BD0200013809FFBF280000194181000C3809002054090655 +S31AFE00BD173E7D204B787C0300004082FFB42C0300004082FFB4DD +S31AFE00BD2C386000004E8000204800002C89230000880400003894 +S31AFE00BD418400017C09000038630001418200148803FFFF8864F7 +S31AFE00BD56FFFF7C6300504E8000207CA02B782C00000038A5FFF2 +S31AFE00BD6BFF4082FFCC386000004E8000209421FFE87C0802A6E5 +S31AFE00BD809381000893A1000C93C1001093E100149001001C3D78 +S31AFE00BD9520000080093B587C7D1B782C000000408200743D200E +S31AFE00BDAA000039293200800900343860FFFF7C0803A67D3E4B66 +S31AFE00BDBF783BE000004E8000217C7C1B78813E00347FE3FB7896 +S31AFE00BDD47D2803A64E800021813E00147FA4EB78806900008057 +S31AFE00BDE909000C7C0803A64E80002137FF00014081FFD43D20E8 +S31AFE00BDFE000039293200800900347F83E3787C0803A64E800083 +S31AFE00BE1321480000483D20000039293200816900142C0B00003F +S31AFE00BE284182001C806B0000800B000C7FA4EB787C0803A64E9F +S31AFE00BE3D8000214800001C816900187FA4EB78806B0000800BE9 +S31AFE00BE52000C7C0803A64E8000218001001C7C0803A6838100E1 +S31AFE00BE670883A1000C83C1001083E10014382100184E8000205F +S31AFE00BE7C9421FFF07C0802A693E1000C900100143D2000003922 +S31AFE00BE91293200816900147C7F1B782C0B0000408200088169C6 +S31AFE00BEA60018806B0000800B00107C0803A64E800021987F00B2 +S31AFE00BEBB00800100147C0803A683E1000C382100104E800020E5 +S31AFE00BED09421FFE07C0802A69361000C9381001093A10014939A +S31AFE00BEE5C1001893E1001C900100243D20000080093B587C7DB4 +S31AFE00BEFA1B782C000000408200883D20000039293200800900AC +S31AFE00BF0F343860FFFF7C0803A67D3C4B783BE000004E8000219C +S31AFE00BF247C7B1B78813C00347FE3FB787D2803A64E80002181F6 +S31AFE00BF397C00147FA4EB78806B0000800B001C7C0803A64E804C +S31AFE00BF4E00217C7E1B7941820010881D00002C000000408200C5 +S31AFE00BF634C37FF00014081FFC03D200000392932008009003414 +S31AFE00BF787F63DB787C0803A64E800021480000643D200000391D +S31AFE00BF8D293200816900142C0B000041820034806B0000800B9E +S31AFE00BFA2001C7FA4EB7848000034817C00307FE3FB787D68037E +S31AFE00BFB7A63D2000003800000190093B584E80002148000020B2 +S31AFE00BFCC816900187FA4EB78806B0000800B001C7C0803A64EC7 +S31AFE00BFE18000217C7E1B787FC3F378800100247C0803A68361B6 +S31AFE00BFF6000C8381001083A1001483C1001883E1001C382100A5 +S31AFE00C00B204E8000209421FFE87C0802A69381000893A1000CEA +S31AFE00C02093C1001093E100149001001C3D20000080093B587C79 +S31AFE00C0357D1B782C000000408200803D200000392932008009FA +S31AFE00C04A00343860FFFF7C0803A67D3E4B783BE000004E80007F +S31AFE00C05F217C7C1B78813E00347FE3FB787D2803A64E80002117 +S31AFE00C074813E00142C0900004182001C8069000080090014380E +S31AFE00C0898000077FA5EB787C0803A64E80002137FF000140817C +S31AFE00C09EFFC83D20000039293200800900347F83E3787C080330 +S31AFE00C0B3A64E800021480000303D2000003929320081290014B8 +S31AFE00C0C82C0900004182001C8069000080090014388000077F87 +S31AFE00C0DDA5EB787C0803A64E8000213D2000003929320081298B +S31AFE00C0F200182C0900004182001C80690000800900147FA5EB74 +S31AFE00C10778388000077C0803A64E8000218001001C7C0803A602 +S31AFE00C11C8381000883A1000C83C1001083E10014382100184E43 +S31AFE00C1318000209421FFD07C0802A69301001093210014934165 +S31AFE00C14600189361001C9381002093A1002493C1002893E1003C +S31AFE00C15B2C900100347C7D1B787CBE2B787FBFEB783B60000035 +S31AFE00C1703F2000003F8000003B40000081393B802C0900004132 +S31AFE00C185820020896900002C0B000041820014380900019961C3 +S31AFE00C19A000890193B80480000647FC0FE707C1E005054000F7A +S31AFE00C1AFFE7FE9EA78216900007D2B49147C0B48394182003C19 +S31AFE00C1C4386000324BFFFE49480000083BDEFFCE2C1E00004047 +S31AFE00C1D9810014386100084BFFFCF17C7B1B794182FFE82C1B64 +S31AFE00C1EE0000408200143860FFFF48000180386100084BFFFC1C +S31AFE00C2037D880100089B5F00007C0303785400063E2C00000D4F +S31AFE00C2184182007C418100282C000008418200D4418100102C1B +S31AFE00C22D00000341820038480001142C00000A41820058480004 +S31AFE00C24201082C00002B418200E8418100102C000024418200F3 +S31AFE00C257DC480000F02C00007F41820098480000E47C1FE80005 +S31AFE00C26C408200183C60FE01386344C84BFFF84D3860FFFE4831 +S31AFE00C2810000F8987F00003BFF00013F000000480000DC89214D +S31AFE00C29600083F0000002C09000A40820010881837102C000024 +S31AFE00C2AB0D418200182C09000D40820018881837102C00000A59 +S31AFE00C2C04082000C9B410008480000A4801C3B782C000000410B +S31AFE00C2D58200143860000D4BFFFA9D3860000A4BFFFA95880130 +S31AFE00C2EA00083860000198183710480000847C1FE8003F000015 +S31AFE00C2FF004182006C801C3B782C0000004182001C38600008FD +S31AFE00C3144BFFFA65386000204BFFFA5D386000084BFFFA553B9A +S31AFE00C329FFFFFF480000407C1FE800408200145463063E4BFFD8 +S31AFE00C33EC3293860000048000034801C3B782C000000418200A8 +S31AFE00C3530C886100084BFFFA21880100083F000000981F0000E8 +S31AFE00C3683BFF000188010008981837104BFFFE08800100347C78 +S31AFE00C37D0803A68301001083210014834100188361001C8381CA +S31AFE00C392002083A1002483C1002883E1002C382100304E8000D7 +S31AFE00C3A7209421FFC07C0802A6924100089261000C92810010C0 +S31AFE00C3BC92A1001492C1001892E1001C93010020932100249308 +S31AFE00C3D14100289361002C9381003093A1003493C1003893E11E +S31AFE00C3E6003C900100447C9D23787C7C1B787D3DE0107D294955 +S31AFE00C3FB107D294BB87C1CE8507C0048787FA948387D3D037986 +S31AFE00C4107CB62B78408101403E40FE012C16000041820014386E +S31AFE00C4257244CC7C96E0504BFFF69948000010387244CC7F844C +S31AFE00C43AE3784BFFF6897FBEEB787F9DE3783BE000003E80FED7 +S31AFE00C44F013EA0FE013E60FE013B5EFFF03AFD00103F00FE014C +S31AFE00C4643F60FE013F20FE017C1FF000408000147C9DF8AE386D +S31AFE00C4797844D84BFFF6494800000C387944E04BFFF63D7FFC6C +S31AFE00C48EFE707C1CF8507C000E707C0002147C00F8502C0000CB +S31AFE00C4A3014082000C387B44E44BFFF61957801F7E7C1F021458 +S31AFE00C4B87C001E70540018387C00F8502C0000074082000C38C0 +S31AFE00C4CD7B44E44BFFF5F53BFF00012C1F000F4081FF907FBC5F +S31AFE00C4E2EB787FDDF378387444E84BFFF5D97EBEAB783BE000AD +S31AFE00C4F7007C1FE8004080002C7C9CF8AE3804FFE02000005E66 +S31AFE00C50C7C0001107C0003B87C0900F87C8000387129002E7C5D +S31AFE00C521044B784800000838800020387E44EC4BFFF5953BFF1E +S31AFE00C53600012C1F000F4081FFBC387344F04BFFF5817F5DD3C7 +S31AFE00C54B797EFCBB784181FECC800100447C0803A68241000868 +S31AFE00C5608261000C8281001082A1001482C1001882E1001C832C +S31AFE00C57501002083210024834100288361002C8381003083A170 +S31AFE00C58A003483C1003883E1003C382100404E8000209421FF0D +S31AFE00C59FF87C0802A69001000C38A000004BFFFDFD8001000C19 +S31AFE00C5B47C0803A6382100084E8000209421FF607C0802A6931F +S31AFE00C5C961008C9381009093A1009493C1009893E1009C900173 +S31AFE00C5DE00A49081000C388100A83FA000003B80000038000050 +S31AFE00C5F3013961000890810074837D3B809061000890A1001012 +S31AFE00C60890C1001490E100189101001C9121002091410024981D +S31AFE00C61D010070916100789B810071388100704BFFF5213C6077 +S31AFE00C632FE01386344F44BFFF48D939D3B803861008038800096 +S31AFE00C6470838A000004BFFFAE988610080937D3B806860005978 +S31AFE00C65C212000007C09011468630079212300007C6919147CD4 +S31AFE00C671630378800100A47C0803A68361008C8381009083A158 +S31AFE00C686009483C1009883E1009C382100A04E8000209421FF90 +S31AFE00C69BE87C0802A69381000893A1000C93C1001093E100142A +S31AFE00C6B09001001C7C9C23787CBD2B787C7F1B783BC000004864 +S31AFE00C6C50000C857C0103A7FFD012E881F00003BDE000148007F +S31AFE00C6DA0098881F00002C0000224082008457C0103A7D60EA4C +S31AFE00C6EF14812BFFFC7C09F8004082000C3BFF000193EBFFFC78 +S31AFE00C704893F0000692000227C0000D07D2900D055290FFE5408 +S31AFE00C719000FFE7D2B00394182002C7FE3FB788D23000169201B +S31AFE00C72E00227C0000D07D2900D055290FFE54000FFE7D2B007A +S31AFE00C743394082FFE47C7F1B78881F00002C0000004082002CB0 +S31AFE00C7583C60FE013863450C4BFFF365480000083BFF0001888C +S31AFE00C76D1F00002C0000004182004C2C0000204082FF603800B4 +S31AFE00C7820000981F00003BFF0001881F00002C00000041820016 +S31AFE00C7972C2C000020408200187FE3FB788C0300012C00002086 +S31AFE00C7AC4182FFF87C7F1B78881F00002C0000004082FF0C3C50 +S31AFE00C7C16000003C80000080BD000093DC0000386339F838840F +S31AFE00C7D63A68480000258001001C7C0803A68381000883A10041 +S31AFE00C7EB0C83C1001083E10014382100184E8000209421FFD872 +S31AFE00C8007C0802A6930100089321000C93410010936100149318 +S31AFE00C81581001893A1001C93C1002093E100249001002C7C7F5D +S31AFE00C82A1B787CBC2B787C9A23787F83E3784BFFF3497FFDFB7C +S31AFE00C83F787C1DD0007C7B1B78418200C0809D00007F83E37878 +S31AFE00C8547F65DB784BFFF4652C0300004082009C807D00004B1C +S31AFE00C869FFF3197C03D800408100847C1FD0003BC000014182E5 +S31AFE00C87E00603F00FE013F20FE017C1DF80041820044809F00EE +S31AFE00C893007F83E3787F65DB784BFFF4212C0300004082002C7C +S31AFE00C8A82C1E00004182001880BD0000387845207F84E3784B57 +S31AFE00C8BDFFF2093BC00000809F0000387945484BFFF1F93BFFA2 +S31AFE00C8D200107C1FD0004082FFB02C1E0000408200143C60FEA7 +S31AFE00C8E7013863454C4BFFF1D9480000187FA3EB7848000014B6 +S31AFE00C8FC3BBD00107C1DD0004082FF48386000008001002C7CE8 +S31AFE00C9110803A6830100088321000C8341001083610014838150 +S31AFE00C926001883A1001C83C1002083E10024382100284E800065 +S31AFE00C93B209421FFE87C0802A69381000893A1000C93C100103B +S31AFE00C95093E100149001001C7C601B783C60FE017C9D23787C5F +S31AFE00C9651F03787CBE2B78386345504BFFF1557C1FE80041823C +S31AFE00C97A00283F80FE0180BF000080DF0008387C45587FC4F391 +S31AFE00C98F784BFFF1353BFF00107C1FE8004082FFE48001001C98 +S31AFE00C9A47C0803A68381000883A1000C83C1001083E10014380D +S31AFE00C9B92100184E800020912300149883000090A3000490C3D1 +S31AFE00C9CE000890E3000C910300104E8000209421FFB07C08024D +S31AFE00C9E3A691C1000891E1000C92010010922100149241001868 +S31AFE00C9F89261001C9281002092A1002492C1002892E1002C93E0 +S31AFE00CA0D01003093210034934100389361003C9381004093A133 +S31AFE00CA22004493C1004893E1004C900100547D344B787D16432C +S31AFE00CA37783016FFFF7D20B1106A800001216000007C0B0114C4 +S31AFE00CA4C7D2B00397C701B787C9823787CD133787CF53B787D29 +S31AFE00CA615353783B4000013A40000041820008925600007C1267 +S31AFE00CA76A8007E3F8B78408000507EA903A67FEBFB7839000049 +S31AFE00CA8B00812B00102C0900004182000891090000814B00046C +S31AFE00CAA02C0A000040820020800B00082C0000004182000C2CAB +S31AFE00CAB50000024082000C812B000C91490000396B0018420008 +S31AFE00CACAFFC47CBD2B787C1D8000408002043DC0FE013DE0FEBE +S31AFE00CADF0157BE103A7C9EC02E880400002C00002D4082014CE2 +S31AFE00CAF4396000007C0BA8008AE400017E3F8B78392000003B9E +S31AFE00CB097D0001408001147F9EC2143B200001881F00007C1737 +S31AFE00CB1E0000408200F0813F00102C09000041820020800900DB +S31AFE00CB33002C00000041820014809F0014386E45644BFFEF81AA +S31AFE00CB483B400000801F00042C00000041820080813C00008802 +S31AFE00CB5D0900023BC900032C00003D4182000C83DC00043BBD1A +S31AFE00CB720001801F00082C000000418200102C00000141820013 +S31AFE00CB873C48000040809F000C7FC3F37838A0000038C0000029 +S31AFE00CB9C480001992C0300004082002480BF00147FC4F3783850 +S31AFE00CBB16F45844BFFEF113B4000004800000C813F000C93C9F2 +S31AFE00CBC60000813F00103B7D000148000034801F00082C00007E +S31AFE00CBDB00418200102C0000024182001C48000020817F000CED +S31AFE00CBF0812B000039290001912B00004800000C813F000C93AE +S31AFE00CC052900003960000148000014392900017C09A8003BFF2D +S31AFE00CC1A00184180FEFC2C0B0000408200A83C60FE0138634512 +S31AFE00CC2FAC7EE4BB784BFFEE91480000902C160000418200788D +S31AFE00CC442C12000041820014386E45647E649B784BFFEE713B9A +S31AFE00CC594000002C140000418200102C1400014182003C4800E7 +S31AFE00CC6E00407C7EC02E7EC4B37838A0000038C0000048000000 +S31AFE00CC83B52C030000408200247C9EC02E386F45847E659B7860 +S31AFE00CC984BFFEE2D3B4000004800000C7C1EC02E901600003BE6 +S31AFE00CCAD7D00013A400001480000183C60FE01386345CC3B7D16 +S31AFE00CCC200014BFFEE013B4000007F7DDB787C1D80004180FE7D +S31AFE00CCD70C7F43D378800100547C0803A681C1000881E1000C71 +S31AFE00CCEC8201001082210014824100188261001C828100208266 +S31AFE00CD01A1002482C1002882E1002C830100308321003483410A +S31AFE00CD1600388361003C8381004083A1004483C1004883E10010 +S31AFE00CD2B4C382100504E8000208803000038E000012C0000201C +S31AFE00CD403900000A39800000408200108C0300012C00002041EF +S31AFE00CD5582FFF8880300002C0000004182012C2C0700004182AF +S31AFE00CD6A0038880300002C0000304082002C892300013809FFB6 +S31AFE00CD7FBF280000194181000C380900205409063E2C0900781E +S31AFE00CD944082000C39000010386300028943000038E0000039B5 +S31AFE00CDA92AFFD0380AFFBF21290009392000007D2949142000A9 +S31AFE00CDBE0005380000007C0001147D2B03793863000139200075 +S31AFE00CDD30040820010380AFF9F28000005418100083920000144 +S31AFE00CDE82C09000041820068392AFFD05520063E280000094175 +S31AFE00CDFD81000C7D2B4B7848000030380AFF9F280000054181DE +S31AFE00CE12000C396AFFA94800001C380AFFBF200000057C0001AA +S31AFE00CE27107C0003B8392AFFC97C0B48387C0B40004080001CD6 +S31AFE00CE3C880300007D2C41D62C0000007D895A144082FF1848D1 +S31AFE00CE5100003C2C0600004182002C88060000480000088C06FB +S31AFE00CE6600012C000000418200187C0A00004082FFF0880600E6 +S31AFE00CE7B002C0000004082000C386000004E8000202C050000ED +S31AFE00CE90918400004182000890650000386000014E80002088A5 +S31AFE00CEA50300002C000020408200108C0300012C0000204182B4 +S31AFE00CEBAFFF88863000068690074200900007D2049146860004D +S31AFE00CECF54214000007C0A01147D2B03794182001038000001CA +S31AFE00CEE4900400004800003068690046200900007D2049146887 +S31AFE00CEF9600066214000007C0A01147C0A4B794082000C3860AE +S31AFE00CF0E00004E80002091640000386000014E8000209421FFEC +S31AFE00CF23E07C0802A69361000C9381001093A1001493C1001811 +S31AFE00CF3893E1001C900100243D200001396998D0800BFFD47C59 +S31AFE00CF4D9C23782C0000007CDB33784182000C3800000A48000D +S31AFE00CF62012838000001B00998D088030000396B00022C0000D6 +S31AFE00CF77002F85000041820018980B00008C030001396B00013A +S31AFE00CF8C2C0000004082FFF038000000980B0000396B000140EF +S31AFE00CFA19E00103D20FE01386946004800001C2C05000141822D +S31AFE00CFB6000C3800000A480000CC3D20FE013869460C88030026 +S31AFE00CFCB002C00000041820018980B00008C030001396B00016E +S31AFE00CFE02C0000004082FFF03D2000013BA998B83800000098F9 +S31AFE00CFF50B00007FA3EB783880000038A0000C4BFFE3953D6098 +S31AFE00D00A0000812B37183BFDFFEC38000001B13F0018B01F00DF +S31AFE00D01F1AA01C0004392900012C0000003BC00000912B371889 +S31AFE00D03493DF00144082000C38000045B01C00047F85E37838AB +S31AFE00D0497D0018388002057FA6EB7848003CAD2C0300004180D1 +S31AFE00D05E002838000001901DFFEC3920FFFF93DF0004913F0023 +S31AFE00D0731093DF000C93DF00083860000048000010380000096B +S31AFE00D088901B00003860FFFF800100247C0803A68361000C8309 +S31AFE00D09D81001083A1001483C1001883E1001C382100204E808E +S31AFE00D0B200203D20000138000000900998A4386000004E800074 +S31AFE00D0C7209421FFC87C0802A692C1001092E1001493010018F2 +S31AFE00D0DC9321001C93410020936100249381002893A1002C9330 +S31AFE00D0F1C1003093E100349001003C7C9923783B6000007C1BDE +S31AFE00D106C8003D2000013BC998D07C7A1B787CBC2B7840800159 +S31AFE00D11B783BFEFFD43B0100083AE000043AC00009813F000C46 +S31AFE00D1302C0900004081005C7C1BC8507F890000809F02347F09 +S31AFE00D14543D3784FFEE3827FA0002657BD07FE7FBD00D07C00AB +S31AFE00D15AE8787D3DE8387FBD03787FA5EB784BFFE159801F021F +S31AFE00D16F34813F000C7C00EA147D3D4850901F0234913F000C1A +S31AFE00D1847F7BEA147F5AEA14480000FC801F0010280001FF4068 +S31AFE00D1998100F838000001900100083920000091380004387F55 +S31AFE00D1AE002C3880020538BF002038DF00147F07C37848003CF6 +S31AFE00D1C36D7C631B794080002C813F0004392900012C09000F1C +S31AFE00D1D8913F000441810010801F00082C000000408200443887 +S31AFE00D1ED0000084800008CA81E00002C00000340820064813F72 +S31AFE00D2020008A97E0002392900017C0B48004082001C3863FF38 +S31AFE00D217FC381E0004907F000C901F0234917F0008907F001071 +S31AFE00D22CA01F000AB2FE0000B01E0002387F002C3880000438C9 +S31AFE00D241BF002038DF001448003AB92C0300004080003892DCFA +S31AFE00D25600003860FFFF480000382C00000540820014A81E00DC +S31AFE00D26B023860FFFF901C0000480000203800000B901C00000F +S31AFE00D2803860FFFF480000107C1BC8004180FEA07F63DB788034 +S31AFE00D29501003C7C0803A682C1001082E100148301001883210C +S31AFE00D2AA001C83410020836100248381002883A1002C83C100A3 +S31AFE00D2BF3083E10034382100384E8000203803FFFF2800000BA3 +S31AFE00D2D43D20FE01386946144D8100203D60FE01396B473054F1 +S31AFE00D2E900103A7D4B002E3D20FE01392947307D4A4A147D49CC +S31AFE00D2FE03A64E8004203C60FE01386346244E8000203C60FE54 +S31AFE00D31301386346344E8000203C60FE01386346484E8000204B +S31AFE00D3283C60FE013863466C4E8000203C60FE01386346844EC8 +S31AFE00D33D8000203C60FE01386346984E8000203C60FE013863FF +S31AFE00D35246AC4E8000203C60FE01386346BC4E8000203C60FE22 +S31AFE00D36701386346D04E8000203C60FE01386346EC4E800020B7 +S31AFE00D37C3C60FE01386347004E8000203C60FE01386347144E4E +S31AFE00D3918000209421FFE87C0802A693A1000C93C1001093E103 +S31AFE00D3A600149001001C3D200000800937207C9F23782C00008E +S31AFE00D3BB004082007C48004C153D20000138699ADC8003000476 +S31AFE00D3D02C00000540820018A00300162C0000004082005048FA +S31AFE00D3E5004CE9480000482C00000040820014480008D9380007 +S31AFE00D3FA000A981F0000480000603FA00001389DA12038A00063 +S31AFE00D40F8048004D512C0300003BBDA1203D2000003D600000BC +S31AFE00D42493A93C28906B37204082000C38600000480000303DE2 +S31AFE00D439400000816A3C283D000000880B0000396B0001981F1F +S31AFE00D44E000081283720916A3C283929FFFF912837203860005E +S31AFE00D463018001001C7C0803A683A1000C83C1001083E10014E9 +S31AFE00D478382100184E8000209421FFE07C0802A693A1001493A1 +S31AFE00D48DC1001893E1001C900100243D2000003BA932007C7EFB +S31AFE00D4A21B783BE000644800002837FFFFFF40820010480000A1 +S31AFE00D4B7513BE0006448000014813D0048386000647D2803A6E0 +S31AFE00D4CC4E8000217FC3F378388100084BFFFEBD2C0300004175 +S31AFE00D4E182FFCC88610008800100247C0803A683A1001483C1A6 +S31AFE00D4F6001883E1001C382100204E8000209421FFE87C0802FC +S31AFE00D50BA693A1000C93C1001093E100149001001C3D2000012A +S31AFE00D5203BA9A1A04800003080BE37247FE3FB787FA4EB784819 +S31AFE00D535004D417C631B7940810014801E37247FBD1A147C0325 +S31AFE00D54A0050901E372448004A853FC00000801E37242C000034 +S31AFE00D55F00418200303D2000013BE99ADC801F00042C000005F4 +S31AFE00D5744082000C7FE3FB7848004B51801F00042C0000004008 +S31AFE00D58982FFA0480007413D2000003BC93200801E00443D2006 +S31AFE00D59E00012C0000003929A1A03D6000003D4000003BE0006F +S31AFE00D5B300912B3C2C93EA372441820010386000004BFFDC0DC5 +S31AFE00D5C893FE00448001001C7C0803A683A1000C83C1001083A4 +S31AFE00D5DDE10014382100184E8000209421FFF07C0802A693E19D +S31AFE00D5F2000C900100143D600000812B3C2C2C04002498890049 +S31AFE00D6070039290001912B3C2C40820010380000013D2000001B +S31AFE00D61C90093C103FE00000801F3C10688B0023212B00007D27 +S31AFE00D6316959143140FFFF7D2A01107D2058394182001C3D4059 +S31AFE00D6460000392000013D60000038000000912A3C14900B3CBA +S31AFE00D65B183D600000812B3724392900012C090100912B37244A +S31AFE00D6704182002C3D20000080093C142C000000418200283D28 +S31AFE00D685600000812B3C18392900012C090003912B3C184082BF +S31AFE00D69A00104BFFFE6938000000901F3C10800100147C080367 +S31AFE00D6AFA683E1000C382100104E8000209421FFE87C0802A62D +S31AFE00D6C493A1000C93C1001093E100149001001C4800055D7C4E +S31AFE00D6D97D1B783C60FE013C80FE0138A000EC38844828386347 +S31AFE00D6EE48204BFFE3D57FA3EB78480005A58001001C7C08031E +S31AFE00D703A683A1000C83C1001083E10014382100184E8000200C +S31AFE00D7189421FFE87C0802A693A1000C93C1001093E100149074 +S31AFE00D72D01001C480005017C7D1B783C60FE013C80FE0138A0BE +S31AFE00D74200FE38844838386348204BFFE3797FA3EB7848000519 +S31AFE00D757498001001C7C0803A683A1000C83C1001083E10014AA +S31AFE00D76C382100184E8000209421FFE87C0802A69381000893CE +S31AFE00D781A1000C93C1001093E100149001001C7C7D1B787C9EA3 +S31AFE00D79623784BFFFD6D3D2000008009371C3D6000001FE00056 +S31AFE00D7AB0A3B8B320048000014813C0048386000647D2803A6B8 +S31AFE00D7C04E8000217FA3EB787FC4F3784BFFFBC97C631B79406D +S31AFE00D7D58200102C1F00003BFFFFFF4082FFD48001001C7C0870 +S31AFE00D7EA03A68381000883A1000C83C1001083E100143821001C +S31AFE00D7FF184E8000209421FF787C0802A693C1008093E10084E7 +S31AFE00D8149001008C7C8023782C00000590A1001090C1001490E0 +S31AFE00D829E100189101001C91210020914100249081000C3BC05F +S31AFE00D83E00004182002C28000005418100102C000004418201EF +S31AFE00D85394480003482C000006418203082C0000074182030C90 +S31AFE00D868480003343FE00000801F37283D6000002C0000003909 +S31AFE00D87D200001912B372C40820014480011C1907F37282C03C5 +S31AFE00D892000041820308811F37283808FFFF280000394181024D +S31AFE00D8A7F83D60FE01396B48485400103A7D4B002E3D20FE01B0 +S31AFE00D8BC392948487D4A4A147D4903A64E8004203D20FF00611E +S31AFE00D8D1290014816900007C0006AC3948FFFF3C0080007C0032 +S31AFE00D8E654307D6B0378916900007C0006AC480002A83D20FFCC +S31AFE00D8FB0061290200A00900007C0006AC60000008B009000090 +S31AFE00D9107C0006AC480002883D20FF0061290200A00900007CF1 +S31AFE00D9250006AC60000004B00900007C0006AC480002683D20DD +S31AFE00D93AFF0061290240A00900007C0006AC60000004B0090015 +S31AFE00D94F007C0006AC480002483D20FF0061290220A00900004E +S31AFE00D9647C0006AC60000008B00900007C0006AC480002283D7E +S31AFE00D97920FF0061290220A00900007C0006AC60000004B009D6 +S31AFE00D98E00007C0006AC480002083D20FF006129094080090048 +S31AFE00D9A3007C0006AC60000080900900007C0006AC480001E865 +S31AFE00D9B83D20FF0061290948816900007C0006AC3948FFE53C66 +S31AFE00D9CD0080007C0054307D6B0378916900007C0006AC4800EE +S31AFE00D9E201BC3D60000083CB372C38000000900B372C3D20008E +S31AFE00D9F700814937282C0A00004182019C7D4853783808FFFF8A +S31AFE00DA0C280000394181018C3D60FE01396B49305400103A7D7D +S31AFE00DA214B002E3D20FE01392949307D4A4A147D4903A64E80DA +S31AFE00DA3604203D20FF0061290014816900007C0006AC3948FF21 +S31AFE00DA4BFF3C0080007C0054307D6B0078916900007C0006AC7F +S31AFE00DA604800013C3D20FF0061290200A00900007C0006AC70F9 +S31AFE00DA7500FFF75400043EB00900007C0006AC480001183D2067 +S31AFE00DA8AFF0061290200A00900007C0006AC7000FFFB5400045F +S31AFE00DA9F3EB00900007C0006AC480000F43D20FF0061290240E5 +S31AFE00DAB4A00900007C0006AC7000FFFB5400043EB00900007C4D +S31AFE00DAC90006AC480000D03D20FF0061290220A00900007C004D +S31AFE00DADE06AC7000FFF75400043EB00900007C0006AC48000052 +S31AFE00DAF3AC3D20FF0061290220A00900007C0006AC7000FFFB25 +S31AFE00DB085400043EB00900007C0006AC480000883D20FF0061FA +S31AFE00DB1D290940800900007C0006AC5400066E900900007C00E9 +S31AFE00DB3206AC480000683D20FF0061290948816900007C0006D5 +S31AFE00DB47AC3948FFE53C0080007C0054307D6B0078916900009E +S31AFE00DB5C7C0006AC4800003C3D20000083C93728480000303945 +S31AFE00DB7161000838010090392000039BC1007199210070900185 +S31AFE00DB860074916100783D200000800B000883C9371C90093749 +S31AFE00DB9B1C7FC3F3788001008C7C0803A683C1008083E10084C2 +S31AFE00DBB0382100884E8000209421FFE07C0802A693A1001493F2 +S31AFE00DBC5C1001893E1001C900100247C7D1B787C9F23787CA3C8 +S31AFE00DBDA2B784BFFCCE938000000901F00007FA3EB783881006B +S31AFE00DBEF084BFFF7A52C03000041820018880100082C00000365 +S31AFE00DC044082000C38000001901F000038600001800100247C97 +S31AFE00DC190803A683A1001483C1001883E1001C382100204E80E6 +S31AFE00DC2E00209421FFE87C0802A69381000893A1000C93C10045 +S31AFE00DC431093E100149001001C3FA000003BBD3200813D003488 +S31AFE00DC583860FFFF7D2803A64E800021801D00347C7C1B78384C +S31AFE00DC6D6000007C0803A64E8000217F83E3788001001C7C08A4 +S31AFE00DC8203A68381000883A1000C83C1001083E100143821007F +S31AFE00DC97184E8000209421FFF87C0802A69001000C3D2000009C +S31AFE00DCAC39293200800900347C0803A64E8000218001000C7CE9 +S31AFE00DCC10803A6382100084E8000209421FFE87C0802A693A14E +S31AFE00DCD6000C93C1001093E100149001001C3FA000003BBD3287 +S31AFE00DCEB00817D00343D20000080693C207D6803A63D20000061 +S31AFE00DD003800000090093B584E800021801D00303D200000800D +S31AFE00DD15693C247C0803A64E8000213D200000380000019009E1 +S31AFE00DD2A3B788001001C7C0803A683A1000C83C1001083E1007B +S31AFE00DD3F14382100184E8000209421FFE87C0802A693A1000C50 +S31AFE00DD5493C1001093E100149001001C3FA000003BBD32008193 +S31AFE00DD691D00343860FFFF7D0803A63D400000392000013D6018 +S31AFE00DD7E000038000000912A3B58900B3B784E8000213D20006C +S31AFE00DD930090693C20813D0034386000017D2803A64E8000215A +S31AFE00DDA8813D00303860FFFF7D2803A64E8000213D20000080C4 +S31AFE00DDBD1D003090693C24386000017C0803A64E800021800171 +S31AFE00DDD2001C7C0803A683A1000C83C1001083E100143821009A +S31AFE00DDE7184E8000209421FFE87C0802A69381000893A1000CF9 +S31AFE00DDFC93C1001093E100149001001C3FE00000801F37302C24 +S31AFE00DE11000000408200A03FA000003BBD3200813D0034386003 +S31AFE00DE26FFFF7D2803A64E800021813D00347C7C1B7838600093 +S31AFE00DE3B017D2803A64E800021815D00143D20FE013929D6BC4E +S31AFE00DE50912A00043D60FE01396BD7183D20FE01916A00083933 +S31AFE00DE6529D5E8912A000C3D60FE01396BD4803D20FE01916A0C +S31AFE00DE7A00103929D804912A00143D60FE01396BDBB83D20FE44 +S31AFE00DE8F01916A00183929D774912A001C801D00347F83E378B4 +S31AFE00DEA47C0803A64E80002138000001901F37303D2000003F5E +S31AFE00DEB9A00001A0893B6A387D9ADC480041353BBD9ADC801DED +S31AFE00DECE00043D20000090093C1C8001001C7C0803A68381001B +S31AFE00DEE30883A1000C83C1001083E10014382100184E800020C3 +S31AFE00DEF89421FFF07C0802A693E1000C90010014480040CD3D8A +S31AFE00DF0D2000013BE99ADC3D200000817F000480093C1C7C0082 +S31AFE00DF225800418200602C0B0004408200484BFFFE193C600029 +S31AFE00DF37013D2000013929A1A03C80000038C3A1203CA000007B +S31AFE00DF4C396000013940000D3D0000003CE0000038000000907B +S31AFE00DF61C43C28916537209943A12091283C2C90073724801FE3 +S31AFE00DF7600042C000000408200084BFFFE6D3D20000180099A62 +S31AFE00DF8BE03D600000900B3C1C800100147C0803A683E1000CDB +S31AFE00DFA0382100104E8000209421FFE87C0802A693A1000C9376 +S31AFE00DFB5C1001093E100149001001C3D20000080E93B6C2C07AD +S31AFE00DFCA0000408200283D000000392000013D6000003D4000A3 +S31AFE00DFDF003800232891283B6490EB3C50900A3B684800007C46 +S31AFE00DFF43C60FE013C8000003863479C38843C5038A000014BD3 +S31AFE00E009FF4E213C60FE013C8000003863477438843B6838A0AC +S31AFE00E01E00024BFF4E093C60FE013C800000386347CC38843B4A +S31AFE00E0336438A000014BFF4DF13C60FE013C800000386347E8EE +S31AFE00E0483884395838A000054BFF4DD93C60FE013C8000013895 +S31AFE00E05D6348103884211C38A000054BFF4DC13D20000038002C +S31AFE00E072000090093B844800034D480031813D6000003D2000B1 +S31AFE00E0870039293B483BEB3B387C1F48004182003C7D3D4B78A3 +S31AFE00E09C3BC00001813F00047FE3FB787D2803A64E8000217C1D +S31AFE00E0B1631B794182000C93DF000C48000008907F000C3BFF6D +S31AFE00E0C600107C1FE8004082FFD43D20000080093C542C000077 +S31AFE00E0DB00408200143C60FE0138634A184BFFD9DD48000090E6 +S31AFE00E0F03D20000080093B642C000000418200283C60000138A6 +S31AFE00E105632108480027912C030000418200143C60FE01386339 +S31AFE00E11A4A384BFFD9A9480000103D2000003800000190093BDC +S31AFE00E12F843D20000080093B842C000000418200403C600000E3 +S31AFE00E14438633958480001B97C641B783C60FE0138634A644BF2 +S31AFE00E159FFD96D3C6000013863211C4800019D7C641B783C60FE +S31AFE00E16EFE0138634A6C4BFFD9514BFFFC758001001C7C0803F5 +S31AFE00E183A683A1000C83C1001083E10014382100184E80002082 +S31AFE00E1989421FFF093E1000C380000047C0903A67C9F237838F2 +S31AFE00E1AD800000398000188963000038E000012C0B000038A0F4 +S31AFE00E1C2000038C0000A38630001418201106960003021200098 +S31AFE00E1D7007C0901147CE9003941820030892300003809FFBF59 +S31AFE00E1EC280000194181000C380900205409063E2C090078401C +S31AFE00E2018200108D63000138C0001038630001392BFFD0380B67 +S31AFE00E216FFBF7D2A4B787C0803785529063E5400063E21290024 +S31AFE00E22B09392000007D29491420000005380000007C00011487 +S31AFE00E2407D27037938E000003920000040820010380BFF9F2859 +S31AFE00E25500000541810008392000012C09000041820068554092 +S31AFE00E26A063E280000094181000C7D49537848000030380BFF0D +S31AFE00E27F9F280000054181000C392BFFA94800001C5500063EE3 +S31AFE00E294200000057C0001107C0003B8392BFFC97C0948387CDB +S31AFE00E2A909300040800020896300007C0531D62C0B00007CA07C +S31AFE00E2BE4A14386300014082FF0C480000142C0B002E418200FC +S31AFE00E2D30C386000004800001C7CA060307C840378398CFFF847 +S31AFE00E2E84200FECC909F00003860000183E1000C382100104E22 +S31AFE00E2FD8000209421FFE87C0802A693A1000C93C1001093E188 +S31AFE00E31200149001001C890300033FA0000188A3000088C3004C +S31AFE00E3270188E300023C80FE0138844A88387DA2A04BFFD70509 +S31AFE00E33C387DA2A08001001C7C0803A683A1000C83C100108300 +S31AFE00E351E10014382100184E800020812300007C09180041825B +S31AFE00E366002081230004908900008003000490640000900400AE +S31AFE00E37B04908300044E80002090890004908900009124000095 +S31AFE00E390912400044E8000207C6B1B78806B00007C0358004150 +S31AFE00E3A582001880030000900B000081230000916900044E8037 +S31AFE00E3BA0020386000004E8000209421FFE87C0802A693A100A8 +S31AFE00E3CF0C93C1001093E100149001001C3D0000003CE0000037 +S31AFE00E3E439283C3839673C3091283C3891673C303D400001919F +S31AFE00E3F92900043BCAA2C0916B00043FA000003BE000107FC42A +S31AFE00E40EF378387D3C304BFFFF4937FFFFFF3BDE06104082FFB3 +S31AFE00E423EC8001001C7C0803A683A1000C83C1001083E100142E +S31AFE00E438382100184E8000209421FFF87C0802A69001000C8077 +S31AFE00E44D040000A124000490030010B123001480040000A10435 +S31AFE00E46200043D20000039693C4890093C483D400000B10B00C4 +S31AFE00E47704906A3C54480000158001000C7C0803A63821000886 +S31AFE00E48C4E8000209421FFF87C0802A69001000C812300003838 +S31AFE00E4A18300108009000038A000007C0803A64E8000218001D1 +S31AFE00E4B6000C7C0803A6382100084E8000209421FF587C080233 +S31AFE00E4CBA67D80002693410090936100949381009893A1009C07 +S31AFE00E4E093C100A093E100A4900100AC9181008C3D20000039A6 +S31AFE00E4F529320083A9004C3D6000002C1D00007C7B1B787C9AB5 +S31AFE00E50A23787CBC2B7883EB3C543BC00005418200547FBFEB44 +S31AFE00E51F78815F0000801F000C816A00243D2000002C00000048 +S31AFE00E53439293734916A0028912A00244082002C800A00003C4B +S31AFE00E54980000038843C487FE3FB7838A000007C0803A64E8051 +S31AFE00E55E0021801F000C60000001901F000C2E1D000048000029 +S31AFE00E5733C813F00007FE3FB788009001C7C0803A64E800021FD +S31AFE00E5883D20000039293200800900483C60000360630D407C8D +S31AFE00E59D0803A64E80002137DEFFFF408100E4813F00007FE3EB +S31AFE00E5B2FB788009000C7C0803A64E8000212C0300004182FF3B +S31AFE00E5C7B0813F00003D6000008149001038A0000238EB3C40DB +S31AFE00E5DC9361000893410010938100147FE3FB78388100083850 +S31AFE00E5F1DC000E7D4803A63800000E392000009001000C912BC1 +S31AFE00E6063C404E8000213D20000080093C503FC000002C0000F3 +S31AFE00E61B00418200384BFFF6117C7D1B783C60FE0138634A94FA +S31AFE00E6304BFFD4957F63DB783880000E4BFFDF617F43D3787F0D +S31AFE00E64584E3784BFFDF557FA3EB784BFFF64D801E3C402C0007 +S31AFE00E65A0000408200307FFDFB787FDFF378813D00007FA3EB32 +S31AFE00E66F788009001C7C0803A64E800021801F3C402C00000012 +S31AFE00E6844182FFE47FBFEB7841920018813F00003800000081D2 +S31AFE00E6996900289009002891690024800100AC8181008C7C08B9 +S31AFE00E6AE03A683410090836100948381009883A1009C83C1003E +S31AFE00E6C3A083E100A47D808120382100A84E8000209421FFF85D +S31AFE00E6D87C0802A69001000C3D20000038093C407C0400004086 +S31AFE00E6ED8200103800000190093C404800001881230000816946 +S31AFE00E7020028800B00087C0803A64E8000218001000C7C080313 +S31AFE00E717A6382100084E8000209421FFE07C0802A69361000C34 +S31AFE00E72C9381001093A1001493C1001893E1001C900100243D7A +S31AFE00E741200000392932008389004C3D6000002C1C00007C7DD5 +S31AFE00E7561B787C9B237883CB3C54418200547F9EE378815E0019 +S31AFE00E76B00801E000C816A00243D2000002C0000003929373486 +S31AFE00E780916A0028912A00244082002C800A00003C8000003812 +S31AFE00E795843C487FC3F37838A000007C0803A64E800021801E24 +S31AFE00E7AA000C60000001901E000C813E00007FC3F3788009003A +S31AFE00E7BF1C7C0803A64E8000213C60000038633C384BFFFBC950 +S31AFE00E7D47C7F1B7941820054393F000CA009000C817F000C81C0 +S31AFE00E7E949000481090008B01D000C917D0000915D0004911DB1 +S31AFE00E7FE000880BF00087F63DB7838A5FFF2389F001A4BFFCAAB +S31AFE00E813B13C60000038633C307FE4FB784BFFFB3D807F000839 +S31AFE00E82848000008386000002C1C000041820018813E000038D5 +S31AFE00E83D000000816900289009002891690024800100247C08A8 +S31AFE00E85203A68361000C8381001083A1001483C1001883E10008 +S31AFE00E8671C382100204E8000209421FFE87C0802A693A1000C0D +S31AFE00E87C93C1001093E100149001001C7CA02B797C0903A640BC +S31AFE00E89181003C7C9F23787FC902A63FA00000807F000080BFEE +S31AFE00E8A60004809D3C444BFFCA15801D3C44813F000437DEFF9A +S31AFE00E8BBFF7C004A143BFF0008901D3C444082FFD88001001CC6 +S31AFE00E8D07C0803A683A1000C83C1001083E10014382100184E47 +S31AFE00E8E58000209421FF607C0802A69361008C9381009093A1E2 +S31AFE00E8FA009493C1009893E1009C900100A47C7E1B783C600017 +S31AFE00E90F007C9B237838633C304BFFFA817C7C1B787F89FE7070 +S31AFE00E9247D20E2787C004850817E00007C00FE70393C000C7DE8 +S31AFE00E9393F0038800B001493E100089361000C7FC3F3783881CD +S31AFE00E94E000838A000017C0803A64E8000213D20000080093C91 +S31AFE00E963502C000000418200384BFFF2C57C7D1B783C60FE01FC +S31AFE00E97838634AA44BFFD1497FE3FB783880000E4BFFDC15388B +S31AFE00E98D7F000E389BFFF24BFFDC097FA3EB784BFFF301813E6F +S31AFE00E9A20000800900282C0000004182005C3C600000386339F0 +S31AFE00E9B758389F001E38A000044BFFD3752C030000418200405A +S31AFE00E9CC815E00007FC3F378812A00287F64DB78800900043DD3 +S31AFE00E9E160FE017C0803A683AA0014396BE8703D20000093E97B +S31AFE00E9F63C44916A00144E800021813E000093A900142C1C0033 +S31AFE00EA0B00418200183C600000937C000838633C387F84E378F7 +S31AFE00EA204BFFF93D800100A47C0803A68361008C838100908384 +S31AFE00EA35A1009483C1009883E1009C382100A04E80002094211B +S31AFE00EA4AFFF87C0802A69001000C3D20000080693C5481630039 +S31AFE00EA5F00800B00207C0803A64E8000218001000C7C0803A61D +S31AFE00EA74382100084E8000209421FFF87C0802A69001000C7C49 +S31AFE00EA89641B783C60FE0138634AB44BFFD0318001000C7C08ED +S31AFE00EA9E03A6382100084E8000209421FFF07C0802A693E10023 +S31AFE00EAB30C900100143D2000013BE92588801F001C2C00000083 +S31AFE00EAC84082002C90692588909F00044800049D7C631B7940D2 +S31AFE00EADD82001C801F0008392000017C0000D0913F001C901F9A +S31AFE00EAF2001038600000800100147C0803A683E1000C382100D8 +S31AFE00EB07104E8000203D200001392925888009001C7C6B1B786B +S31AFE00EB1C2C0000004082000C386000074E800020800900147C40 +S31AFE00EB310B00404180001480090018386000007C0B00404D80DE +S31AFE00EB460020386000014E8000203D20000139692588800B00D7 +S31AFE00EB5B1C2C0000004182001C812B001438600000912400006D +S31AFE00EB70800B0018900500004E800020386000074E8000203D9C +S31AFE00EB8520000139692588800B001C7C6A1B782C0000004182F8 +S31AFE00EB9A001C812B000838600000912A0000800B000C90040014 +S31AFE00EBAF004E800020386000074E8000209421FFD87C0802A61A +S31AFE00EBC49321000C93410010936100149381001893A1001C937D +S31AFE00EBD9C1002093E100249001002C3D200001800925A47C7F42 +S31AFE00EBEE1B782C0000007C9E23787CBA2B783B80000040820044 +S31AFE00EC030C38600007480000F83D20000183A925883C80FE011B +S31AFE00EC183CA0FE013884FAA038A5FBC87CA428507FA3EB784BAA +S31AFE00EC2DFFC6957CBFF214380000807C0903A639200000612073 +S31AFE00EC4210003D600E007C0004AC7D398BA67D788BA67C198BA5 +S31AFE00EC57A67D788BA6392900104200FFE03C0004004C00012C8C +S31AFE00EC6C7C108BA64C00012C3D20000139292588800900107CD7 +S31AFE00EC81BE2B783C60FE017FFF00383F20FE017D3B4B78386354 +S31AFE00EC964AF07FE4FB784BFFCE294800001C801B000838794B11 +S31AFE00ECAB085400F87E7C0002147FFF02144BFFCE0D7C1FF04068 +S31AFE00ECC0408000207FE3FB787FA803A64E800021480003657C9B +S31AFE00ECD57C1B794182FFCC93FA00003C0002004C00012C7C10B8 +S31AFE00ECEA8BA64C00012C3C60FE0138634B0C4BFFCDCD7F83E311 +S31AFE00ECFF788001002C7C0803A68321000C83410010836100142E +S31AFE00ED148381001883A1001C83C1002083E10024382100284ECF +S31AFE00ED298000209421FFD07C0802A692E1000C930100109321AA +S31AFE00ED3E0014934100189361001C9381002093A1002493C100CC +S31AFE00ED532893E1002C900100343D600001392B25888009001CC6 +S31AFE00ED687CBE2B782C0000007CD833787C7C1B787C9D23783B10 +S31AFE00ED7D4000004082000C386000074800011C836B25883C8014 +S31AFE00ED92FE013CA0FE013884FBC838A5FD0C7CA428507F63DBD4 +S31AFE00EDA7784BFFC5197CBDF214380000807C0903A63920000035 +S31AFE00EDBC612010003D600E007C0004AC7D398BA67D788BA67C4D +S31AFE00EDD1198BA67D788BA6392900104200FFE03C0004004C009A +S31AFE00EDE6012C7C108BA64C00012C3C60FE0138634B107FA4EB12 +S31AFE00EDFB787F86E3784BFFCCC53D2000013EE0FE013B292588C0 +S31AFE00EE104800002038774B084BFFCCAD57E0F87E7C0002147FFE +S31AFE00EE25BD02147FDFF0507F9C02142C1E00004081005080193E +S31AFE00EE3A00087FC5F3787F8500007F83E3787FA4EB784FFEE3F1 +S31AFE00EE4F827D200026552907FE7D2900D07C0048787CA948388B +S31AFE00EE647D2503787F6803A67CBF2B784E800021480001C17C95 +S31AFE00EE797A1B794182FF98939800003C0002004C00012C7C10AA +S31AFE00EE8E8BA64C00012C3C60FE0138634B0C4BFFCC297F43D360 +S31AFE00EEA378800100347C0803A682E1000C830100108321001441 +S31AFE00EEB8834100188361001C8381002083A1002483C10028830A +S31AFE00EECDE1002C382100304E80002028030007418100883D608F +S31AFE00EEE2FE01396B4C205460103A7D4B002E3D20FE0139294C0A +S31AFE00EEF7207D4A4A147D4903A64E8004203C60FE0138634B30AB +S31AFE00EF0C4E8000203C60FE0138634B504E8000203C60FE01386C +S31AFE00EF21634B684E8000203C60FE0138634B804E8000203C6048 +S31AFE00EF36FE0138634B9C4E8000203C60FE0138634BB44E800050 +S31AFE00EF4B203C60FE0138634BC44E8000203C60FE0138634BE8F1 +S31AFE00EF604E8000203C60FE0138634C0C4E8000209421FFE07C1E +S31AFE00EF750802A693A1001493C1001893E1001C900100243D207D +S31AFE00EF8A000183E925883C80FE013CA0FE013884FA0438A5FA2D +S31AFE00EF9FA07CA428507FE3FB784BFFC3193FC000013BA0000843 +S31AFE00EFB438610008380000807C0903A639200000612010003D96 +S31AFE00EFC9600E007C0004AC7D398BA67D788BA67C198BA67D78CD +S31AFE00EFDE8BA6392900104200FFE07FE803A64E8000217D3DF1AC +S31AFE00EFF3D63D600001396B25883D29FE003C00FE00912B0018CE +S31AFE00F008900B001493CB000893AB000C38600000800100247CD7 +S31AFE00F01D0803A683A1001483C1001883E1001C382100204E80CE +S31AFE00F03200209421FFF07C0802A693E1000C900100143C000074 +S31AFE00F0477E7C7F1B786000007E7FE90039418200503C60FE0177 +S31AFE00F05C38634C407FE4FB784BFFCA613C000010600000107FEE +S31AFE00F071E9003938600004408200303C600020606300207FE3D5 +S31AFE00F08618387C6300D07C63FE707C6018F8546307BC54000764 +S31AFE00F09B387C6303784800000838600000800100147C0803A620 +S31AFE00F0B083E1000C382100104E8000203D20FE00392920007C27 +S31AFE00F0C50348407C802378396000004181000C7C0048404181E3 +S31AFE00F0DA001C3D20FE01388928D07C032040418100107C00209F +S31AFE00F0EF4040810008396000017D635B784E8000209421FF68A8 +S31AFE00F1047C0802A693410080936100849381008893A1008C930B +S31AFE00F119C1009093E100949001009C3FA000003BBD320090615D +S31AFE00F12E0008819D00347C7A1B783860FFFF7D8803A63B8100E5 +S31AFE00F143083B6100A03800000139600000938100789081000CF4 +S31AFE00F15890A1001090C1001490E100189101001C91210020915E +S31AFE00F16D4100249801007099610071936100744E800021813D9B +S31AFE00F18200347C7C1B78386000017D2803A64E80002138810026 +S31AFE00F197707F43D3784BFFC9B1801D00347F83E3787C0803A6C3 +S31AFE00F1AC4E8000218001009C7C0803A6834100808361008483E2 +S31AFE00F1C181008883A1008C83C1009083E10094382100984E80F1 +S31AFE00F1D600209421FFE07C0802A6934100089361000C93810050 +S31AFE00F1EB1093A1001493C1001893E1001C900100243FA0000023 +S31AFE00F2003BBD3200813D00347C7A1B783860FFFF7D2803A67CF0 +S31AFE00F2159C23784E800021813D00347C7B1B78386000017D2800 +S31AFE00F22A03A64E8000217F84E3787F43D3784BFFD365801D00A9 +S31AFE00F23F347F63DB787C0803A64E800021800100247C0803A65F +S31AFE00F254834100088361000C8381001083A1001483C1001883BA +S31AFE00F269E1001C382100204E8000209421FFE87C0802A693E1EC +S31AFE00F27E00149001001C3FE00001813F03C03881000880690069 +S31AFE00F293008009001C7C0803A64E8000212C0300004082FFE4CD +S31AFE00F2A88001001C7C0803A683E10014382100184E8000209418 +S31AFE00F2BD21FFE07C0802A69381001093A1001493C1001893E1C0 +S31AFE00F2D2001C900100243BE000003FA00001813D03C03881001D +S31AFE00F2E708806900008009001C7C0803A64E8000212C0300002D +S31AFE00F2FC418202A4896100082C0B000441820040408100102C63 +S31AFE00F3110B00184182002C480000382C0B000241810030392BC2 +S31AFE00F326FFFF7D694B787D29FE70380900017FE948387D3F032A +S31AFE00F33B78480000143860FFFB480002683860FFFC4800026064 +S31AFE00F3502C1F00004182FF8C3D200001816903C03BC903C080B9 +S31AFE00F3656B0000800B001C389E04087C0803A64E8000212C0350 +S31AFE00F37A000041820224813D03C0389E040980690000800900BB +S31AFE00F38F1C7C0803A64E8000212C0300004182020488010008A4 +S31AFE00F3A43BE00000680000017C0000D07C00FE707C0900F855C4 +S31AFE00F3B92906305400056A7C004B787C1F0000393E0004901E16 +S31AFE00F3CE0410913E0404408000487FDCF3787D3D4B783FC000F1 +S31AFE00F3E301813E03C038810008806900008009001C7C0803A612 +S31AFE00F3F84E8000212C030000418201A0880100087C1DF9AE8128 +S31AFE00F40D3C04103BFF00017C1F48004180FFCC3FC00001813E2D +S31AFE00F42203C03BFE03C0806900008009001C389F040A7C080318 +S31AFE00F437A64E8000212C03000041820160801F04142C000000F1 +S31AFE00F44C41820024813E03C0389F040B806900008009001C7C4E +S31AFE00F4610803A64E8000212C030000418201343D2000013BC969 +S31AFE00F47603C0889E040888BE04097C862A782C0600FF4182009D +S31AFE00F48B283C60FE0138634C504BFFFC6D809E0410387E0004CF +S31AFE00F4A04BFFFD394BFFFDD13860FFFA48000100801E04142CFF +S31AFE00F4B500000041820088801E041038C000007C0600003BE0AC +S31AFE00F4CA0000408000403D2000007FEBFB7839093740387E0080 +S31AFE00F4DF047C0A03787D2358AE54C0C23E7C004A787C00021485 +S31AFE00F4F4396B00017D28022E7C0B500054C0442E7C064A7841A3 +S31AFE00F50980FFDC3D200001392903C08889040A88A9040B5480D8 +S31AFE00F51E402E7C002B787C060000418200803C60FE0138634C00 +S31AFE00F533704BFFFBCD3860FFF948000070801E041038C000004B +S31AFE00F5487C0600003BE00000408000287FEBFB78387E00047C12 +S31AFE00F55D0A03787C0358AE396B00017C0B50007C06021454061D +S31AFE00F572043E4180FFEC3D200001888907CA54C5063E7C04284D +S31AFE00F58700418200203C60FE0138634C9C4BFFFB6D3860FFF928 +S31AFE00F59C480000103860FFFD4800000838600000800100247C61 +S31AFE00F5B10803A68381001083A1001483C1001883E1001C38210F +S31AFE00F5C600204E8000209421FFD87C0802A69301000893210016 +S31AFE00F5DB0C93410010936100149381001893A1001C93C100202F +S31AFE00F5F093E100249001002C2C0400037CBE2B7840820044385F +S31AFE00F60500FFFE901E0000480001103FA00001813D03C03880CF +S31AFE00F61A0006806900008009000C3BBD03C07C0803A64E80009D +S31AFE00F62F2138000001939D0410981D040C38600000480000E09F +S31AFE00F6443FA000003BBD3200813D00343860FFFF7D2803A63F8F +S31AFE00F6598000013B5C03C07FB8EB784E800021813D00347C7B4B +S31AFE00F66E1B787D2803A63BE000133F2000014E800021801D0088 +S31AFE00F68314813D00347F63DB787D2803A6901C03C04E80002187 +S31AFE00F698813C03C038800007806900008009001438A003E87C55 +S31AFE00F6AD0803A64E8000213920000038000001913A0418901A81 +S31AFE00F6C20414913A04104BFFFBF57C7C1B794182FF402C1CFF29 +S31AFE00F6D7FD40820030813800483C6000076063A1207D2803A6B5 +S31AFE00F6EC4E800021813903C038800043806900008009000C7CA4 +S31AFE00F7010803A64E8000217FE0FB782C0000003BFFFFFF418157 +S31AFE00F716FFB4939E00003860FFFF8001002C7C0803A683010002 +S31AFE00F72B088321000C83410010836100148381001883A1001CE5 +S31AFE00F74083C1002083E10024382100284E8000209421FFD07C55 +S31AFE00F7550802A692E1000C930100109321001493410018936120 +S31AFE00F76A001C9381002093A1002493C1002893E1002C90010031 +S31AFE00F77F343D2000017C9B2378396903C0812B04187F60FE70B3 +S31AFE00F7947C1B005054000FFE210900007D2849147D2A00397C8C +S31AFE00F7A97A1B787CB72B783B0000003F200001418201787D7C94 +S31AFE00F7BE5B78801C04102C000000408200F03BC000134BFFFA7F +S31AFE00F7D3ED7C7F1B794082004C3D4000013BAA03C0897D04085B +S31AFE00F7E8893D040C7C0B4800418200A03809FFFF5400063E7CAD +S31AFE00F7FD0B000040820020812A03C03880000680690000800968 +S31AFE00F812000C7C0803A64E800021480000283BE0FFF82C1FFFE9 +S31AFE00F827FC41820044813903C038800043806900008009000CCF +S31AFE00F83C7C0803A64E8000217FC0F3782C0000003BDEFFFF4169 +S31AFE00F85181FF802C1F00004080006093F700003800FFFF901CC7 +S31AFE00F8660410480000C8813903C03880000680690000800900B8 +S31AFE00F87B0C7C0803A64E80002138000001901C04184BFFFFC83A +S31AFE00F890813903C038800006806900008009000C7C0803A64E2B +S31AFE00F8A5800021893D040C39290001993D040C4BFFFFA083BC62 +S31AFE00F8BA0410809C04047F9BE8007F43D3784FFEEB827C0000B8 +S31AFE00F8CF26540007FE7C0000D07F6900787FBD00387FBD4B7882 +S31AFE00F8E47FA5EB784BFFB9D97F7DD850815C04187F60FE707CC2 +S31AFE00F8F91B0050813C0410817C040454000FFE210A00007D4864 +S31AFE00F90E51147D4800397D6BEA147D3D4850913C0410917C0453 +S31AFE00F923047F5AEA147F18EA144082FE947F03C3788001003495 +S31AFE00F9387C0803A682E1000C830100108321001483410018836F +S31AFE00F94D61001C8381002083A1002483C1002883E1002C382163 +S31AFE00F96200304E8000203803000828000007418100883D60FE17 +S31AFE00F97701396B4D705400103A7D4B002E3D20FE0139294D7006 +S31AFE00F98C7D4A4A147D4903A64E8004203C60FE0138634CC84E44 +S31AFE00F9A18000203C60FE0138634CDC4E8000203C60FE0138632B +S31AFE00F9B64CFC4E8000203C60FE0138634D084E8000203C60FEEF +S31AFE00F9CB0138634D144E8000203C60FE0138634D204E800020A7 +S31AFE00F9E03C60FE0138634D304E8000203C60FE0138634D444E58 +S31AFE00F9F58000203C60FE0138634D5C4E8000207D588AA6554AE8 +S31AFE00FA0A0FFE2C0A000041820040380000807C0903A63920005E +S31AFE00FA1F00612010003D600E007C0004AC7D398BA67D788BA659 +S31AFE00FA347C198BA67D788BA6392900104200FFE03C0004007C7E +S31AFE00FA490004AC7C188BA63D60FE00380000AA980B055539205C +S31AFE00FA5E0055992B02AA38000090980B0555892B00002C0A001B +S31AFE00FA730099230000880B0001392000FF98030001992B000072 +S31AFE00FA88418200103D6002007C0004AC7D788BA6386000004EBB +S31AFE00FA9D8000207C6A1B787CF88AA654E70FFE2C070000418255 +S31AFE00FAB20040380000807C0903A639200000612010003D600E80 +S31AFE00FAC7007C0004AC7D398BA67D788BA67C198BA67D788BA601 +S31AFE00FADC392900104200FFE03C0004007C0004AC7C188BA655F8 +S31AFE00FAF1480010396000AA9968055539200055992802AA3800B3 +S31AFE00FB0600809808055599680555992802AA392000327D290370 +S31AFE00FB1BA62F87000038000030980A0000396A00014200000085 +S31AFE00FB303D20004C7D2903A6880A00005400067261294B407DD4 +S31AFE00FB452903A65400063E886A0000546906727C0900004182CE +S31AFE00FB5A0014706000207D204B78408200084200FFE438000007 +S31AFE00FB6FFF98080000892A00007D6A5B782C0900FF3D200001DF +S31AFE00FB844082001C3529FFFF40810014880A0000394A00012C17 +S31AFE00FB990000FF4182FFEC7D2BFE707D604A787C0058507C0051 +S31AFE00FBAEFE707C6300384D9E00203C0002007C0004AC7C188B25 +S31AFE00FBC3A64E8000209421FFF093C1000893E1000C7D588AA610 +S31AFE00FBD8554A0FFE2C0A000041820040380000807C0903A63910 +S31AFE00FBED200000612010003D000E007C0004AC7D398BA67D185B +S31AFE00FC028BA67C198BA67D188BA6392900104200FFE03D200438 +S31AFE00FC17007C0004AC7D388BA62C0500002F8A0000546A00100A +S31AFE00FC2C408100A03BC000AA3BE00055398000A038C000FF9B5E +S31AFE00FC41CA05559BEA02AA998A05558804000039200031980327 +S31AFE00FC560000380000327C0903A63904000138E300013929FF42 +S31AFE00FC6BFF4200FFFC880300007D2903A6540006725400063E06 +S31AFE00FC8089630000556906727C09000041820014716000207D7F +S31AFE00FC95204B78408200084200FFE498CA0000892300008804EA +S31AFE00FCAA00007D0443787C0900007CE33B784182000C39600006 +S31AFE00FCBFFF4800000C34A5FFFF4181FF787CA8FE707D002A7818 +S31AFE00FCD47C0040507C00FE70392000FF992A00007D6B003841A5 +S31AFE00FCE99E00103D2002007C0004AC7D388BA67D635B7883C1EC +S31AFE00FCFE000883E1000C382100104E8000209421FFF87C0802EC +S31AFE00FD13A69001000C3803FFFE2800001D418100A03D60FE0119 +S31AFE00FD28396B4D905400103A7D4B002E3D20FE0139294D907D95 +S31AFE00FD3D4A4A147D4903A64E80042038600002480000783860B2 +S31AFE00FD5200414BFF999954637F3E2C0300024182004028030008 +S31AFE00FD6702418100102C030001418200384800004C2C030004BD +S31AFE00FD7C418200242C0300084082003C386000084800003838FA +S31AFE00FD9160000E480000303860000C480000283860000448007B +S31AFE00FDA6002038600005480000183860000A4800001038600095 +S31AFE00FDBB0B480000083860000F8001000C7C0803A63821000812 +S31AFE00FDD04E8000203D20000081693BF0806B00985463C23E4E32 +S31AFE00FDE58000209421FFF87C0802A69001000C7C641B783860E5 +S31AFE00FDFA00404BFF99058001000C7C0803A6382100084E8000DF +S31AFE00FE0F209421FFF87C0802A69001000C386000414BFF98CDBD +S31AFE00FE2460640600548004203D2000005484045E900939403822 +S31AFE00FE396000414BFF98C58001000C7C0803A6382100084E807F +S31AFE00FE4E00209421FFF87C0802A69001000C386000414BFF984B +S31AFE00FE638D3D20000080893940546305E8380000007C642378C3 +S31AFE00FE7890093940386000414BFF98818001000C7C0803A63831 +S31AFE00FE8D2100084E8000204E8000204E8000209421FFF87C0839 +S31AFE00FEA202A69001000C386000404BFF98413D20FE0139299FAA +S31AFE00FEB7C47C634A78200300007C6019148001000C7C0803A6E7 +S31AFE00FECC382100084E8000209421FFF87C0802A69001000C3821 +S31AFE00FEE16000404BFF980938830004386000404BFF9811800172 +S31AFE00FEF6000C7C0803A6382100084E8000209421FFF87C080239 +S31AFE00FF0BA69001000C3D200000800939442C0000004082001039 +S31AFE00FF203800000190093944480008118001000C7C0803A63826 +S31AFE00FF352100084E8000203D200000800939482C0000004C823B +S31AFE00FF4A002038000001900939487D1E9AA67508FFFF3D200078 +S31AFE00FF5F017D2903A638008001B00809C07C0902A6600086A04C +S31AFE00FF747C0903A64200000080080ABC3D600001600000C09068 +S31AFE00FF89080ABC81280AB8616B00A2552906AE91280AB8916812 +S31AFE00FF9E09F07CE902A690E80AE038002800B0083E8039683E2D +S31AFE00FFB38038002808B00B000239200091B12809C0394000018A +S31AFE00FFC89148003038000018980B0004980B0005B14B0006B0C6 +S31AFE00FFDDEB0028B0EB002CB0EB002EB14B003039282800B0E91A +S31AFE00FFF200023800B000B008280038082810900900043968284E +S31AFE0100070838082820B14B0002900B000439202000B128280830 +S31AFE01001C380000FF98080A863920000599280A8A38004820B060 +S31AFE010031080A8239204823B1280A824E80002039233E80A00947 +S31AFE01004600207D4302147D4B5378A00A000070088000418200B2 +S31AFE01005B28A00A00007008200041820010A00900027D430214CD +S31AFE01007048000008394A00087C0A58004082FFD47D495378A0F7 +S31AFE010085090000700080004082FFF87D2A4B787C090378A00A9B +S31AFE01009A0000700B100041820014A00A00007000EFFFB00A0028 +S31AFE0100AF00B12A0002A12A00023900000038090001B00A000256 +S31AFE0100C4816A00045529043E7C8B49AEA00A000060008000B03B +S31AFE0100D90A0000A12A000071208000418200647D4B53787D0AE6 +S31AFE0100EE43783D0000076108FFFF394A00017C0A400040820086 +S31AFE01010338A1230A82394000007129FFFDB1230A82A00B000040 +S31AFE0101185400047EB00B0000A1230A8261290002B1230A82A060 +S31AFE01012D0B000060008000B00B0000A00B0000700980004082AC +S31AFE010142FFB87D6A5B787D495378A0090000700080004082FF47 +S31AFE010157F87D2A4B78B00A00024E80002038E33E80A1070010F1 +S31AFE01016C7C03422E7D434214700680004182000C386000004EC9 +S31AFE010181800020812A0004396000008809000098040000B0CAD5 +S31AFE0101960002812A0004996900007C03422E600080007C03430B +S31AFE0101AB2E7D388AA655290FFE2C09000041820028812A0004CD +S31AFE0101C0A00700062C000000408100187C004BAC7C0004AC34A0 +S31AFE0101D500FFF0392900104181FFF0386000014E8000209421C2 +S31AFE0101EAFFE87C0802A693E100149001001C7C7F1B787FE3FBC8 +S31AFE0101FF78388100084BFFFF612C0300004182FFF08861000831 +S31AFE0102148001001C7C0803A683E10014382100184E800020949B +S31AFE01022921FFE87C0802A693A1000C93C1001093E100149001CA +S31AFE01023E001C7CBF2B787FE0FB782C0000007C7D1B787C9E23E5 +S31AFE010253783BFFFFFF41820024889E00007FA3EB784BFFFDDD2B +S31AFE0102687FE0FB782C0000003BDE00013BFFFFFF4082FFE48007 +S31AFE01027D01001C7C0803A683A1000C83C1001083E100143821C8 +S31AFE01029200184E8000209421FFE87C0802A693A1000C93C100F0 +S31AFE0102A71093E100149001001C7CBF2B787FE0FB782C0000001C +S31AFE0102BC7C7D1B787C9E23783BFFFFFF418200247FA3EB784BF8 +S31AFE0102D1FFFF197FE0FB782C000000987E00003BDE00013BFF94 +S31AFE0102E6FFFF4082FFE48001001C7C0803A683A1000C83C1001D +S31AFE0102FB1083E10014382100184E8000209421FFE87C0802A63A +S31AFE0103109381000893A1000C93C1001093E100149001001C3DA1 +S31AFE0103252000008009394C3D6000001FE0000A3B8B32007C7DF9 +S31AFE01033A1B787C9E237848000014813C0048386000647D28035C +S31AFE01034FA64E8000217FA3EB787FC4F3784BFFFE097C631B7908 +S31AFE010364408200102C1F00003BFFFFFF4082FFD48001001C7C7C +S31AFE0103790803A68381000883A1000C83C1001083E10014382158 +S31AFE01038E00184E8000209421FF807C8023782C00000590A10022 +S31AFE0103A31090C1001490E100189101001C9121002091410024CC +S31AFE0103B89081000C386000004182002C28000005418100102C5C +S31AFE0103CD00000441820144480002B42C000006418202782C0071 +S31AFE0103E2000741820278480002A03D60FE01800B4EDC3D20FE27 +S31AFE0103F70139294E087D2902147D2903A64E8004203D20FF00DA +S31AFE01040C61290014800900007C0006AC60000400900900007C08 +S31AFE0104210006AC480000E03D20FF0061290200A00900007C00DA +S31AFE01043606AC60000008B00900007C0006AC480000C03D20FF47 +S31AFE01044B0061290200A00900007C0006AC60000004B009000017 +S31AFE0104607C0006AC480000A03D20FF0061290240A00900007C1F +S31AFE0104750006AC60000004B00900007C0006AC480000803D204B +S31AFE01048AFF0061290220A00900007C0006AC60000008B00900B5 +S31AFE01049F007C0006AC480000603D20FF0061290220A0090000BC +S31AFE0104B47C0006AC60000004B00900007C0006AC480000403DF0 +S31AFE0104C920FF0061290940800900007C0006AC600000809009F7 +S31AFE0104DE00007C0006AC480000203D20FF0061290948800900AE +S31AFE0104F3007C0006AC60000010900900007C0006AC3D2000002D +S31AFE0105083800000190093950480001783D2000008069395038B6 +S31AFE01051D000000900939503D60FE01800B4FC43D20FE013929AA +S31AFE0105324EF07D2902147D2903A64E8004203D20FF006129008E +S31AFE01054714800900007C0006AC540005A8900900007C0006AC07 +S31AFE01055C4800012C3D20FF0061290200A00900007C0006AC70E1 +S31AFE01057100FFF75400043EB00900007C0006AC480001083D204F +S31AFE010586FF0061290200A00900007C0006AC7000FFFB54000437 +S31AFE01059B3EB00900007C0006AC480000E43D20FF0061290240CD +S31AFE0105B0A00900007C0006AC7000FFFB5400043EB00900007C25 +S31AFE0105C50006AC480000C03D20FF0061290220A00900007C0035 +S31AFE0105DA06AC7000FFF75400043EB00900007C0006AC4800002A +S31AFE0105EF9C3D20FF0061290220A00900007C0006AC7000FFFB0D +S31AFE0106045400043EB00900007C0006AC480000783D20FF0061E2 +S31AFE010619290940800900007C0006AC5400066E900900007C00C1 +S31AFE01062E06AC480000583D20FF0061290948800900007C00061E +S31AFE010643AC54000734900900007C0006AC48000038386000364D +S31AFE0106584800003039610008380100883920000398610071994E +S31AFE01066D21007090010074916100783D200000800B000880699A +S31AFE010682394C9009394C382100804E8000209421FFE87C0802D2 +S31AFE010697A693C1001093E100149001001C7C9E237839200000FC +S31AFE0106AC7C7F1B78913E0000881F0A86700B00014182006038C9 +S31AFE0106C1000001981F0A86A13F2800391F28007120800040827C +S31AFE0106D6003C8128000439400001880900003960B00098010034 +S31AFE0106EB08B1480002B17F280038610008388000014BFFAAA5A7 +S31AFE0107002C0300004182000C38000001901E0000380000109022 +S31AFE0107151F094C392000017D234B788001001C7C0803A683C18B +S31AFE01072A001083E10014382100184E8000209421FFF07C0802A4 +S31AFE01073FA693C1000893E1000C900100143D2000003BE93200C6 +S31AFE010754813F00343860FFFF7D2803A64E8000217C7E1B787CBB +S31AFE0107691E9AA67400FFFF3D200000800939542C000000408245 +S31AFE01077E009438000001900939544BFFF7B5813F0034386000EC +S31AFE010793007D2803A64E800021815F00147C1E9AA67400FFFFCF +S31AFE0107A83D20FE01900A000039290228912A00043D60FE013921 +S31AFE0107BD6B02983D20FE01916A000839290040912A000C3D60B8 +S31AFE0107D2FE01396B01E83D20FE01916A001039290394912A0066 +S31AFE0107E7143D60FE01396B06903D20FE01916A00183929030832 +S31AFE0107FC912A001C801F00347FC3F3787C0803A64E80002180F0 +S31AFE0108110100147C0803A683C1000883E1000C382100104E8098 +S31AFE01082600209421FFF07C0802A693E1000C900100143D200046 +S31AFE01083B0080693C587C9F23782C030000418200084BFFAA750D +S31AFE010850881F00002C0000024082002C3C80000038843C483897 +S31AFE0108657F001C38A000064BFFB4C92C03000040820010801F99 +S31AFE01087A00103D20000090093958800100147C0803A683E100A7 +S31AFE01088F0C382100104E8000209421FE887C0802A69321015C74 +S31AFE0108A493410160936101649381016893A1016C93C101709336 +S31AFE0108B9E101749001017C3D20000090693C58386100187C7931 +S31AFE0108CE1B783880000038A0012C4BFFAAC13D20000080893C69 +S31AFE0108E34839693C48A06B00043D201234394000003CE0000046 +S31AFE0108F838C0000161295555396000063907395898C10019993E +S31AFE01090D61001A9121001C9947395899480003380000FF9081EA +S31AFE0109220034B06100389801015198C10018994800019948001F +S31AFE010937023CA0FE017D1D437838A508289801014898010149A2 +S31AFE01094C9801014A9801014B9801014C9801014D9801014E987B +S31AFE01096101014F980101503861000838800044480000D53B80CC +S31AFE01097600023B4101483F60000048001F0D7C7E1B787F23CB93 +S31AFE01098B783880012C7F45D37838C0004338E0004448000249BC +S31AFE0109A048000AA1881B39582C00000040820028881D00012C2E +S31AFE0109B50000004082001C881D00022C000000408200108BFD1D +S31AFE0109CA00032C1F00004182001438600044480000BD38600075 +S31AFE0109DF004800003848001EA97C7E1850280307CF4081FFB09C +S31AFE0109F47F80E3782C0000003B9CFFFF4181FF80386000444829 +S31AFE010A0900008D3D20000093E93C503860FFFF8001017C7C08C9 +S31AFE010A1E03A68321015C83410160836101648381016883A10114 +S31AFE010A336C83C1017083E10174382101784E8000203D20000092 +S31AFE010A4881293C5C2C09000041820024A00900047C00200040AD +S31AFE010A5D82000C3860FFFF4E800020812900002C0900004082CC +S31AFE010A72FFE43D20000080093C5C90693C5CB083000490A3000E +S31AFE010A870890030000386000004E8000203D20000081293C5C95 +S31AFE010A9C396000002C0900004D8200207D2A4B78A00900047CF0 +S31AFE010AB10018004082001C2C0B00004182001080090000900B07 +S31AFE010AC6000048000008814900007D2B4B78812900002C0900B2 +S31AFE010ADB004082FFD03D20000091493C5C4E8000209421FFE817 +S31AFE010AF07C0802A69381000893A1000C93C1001093E1001490E8 +S31AFE010B0501001C7C7E1B7883FE000838000000A13F0006600025 +S31AFE010B1AFFFF7C090000817E00047C9C23784082000C38000082 +S31AFE010B2F00B01F0006A01F00047D635B78B00B0002A3BF00043E +S31AFE010B44480008CD7C651B787FA4EB787FE3FB78480008512CDE +S31AFE010B59030000408200603D20000081693C5C2C0B0000418284 +S31AFE010B6E0050A12B0004A01F00027C09000040820034A0BF00B2 +S31AFE010B8304800B00087D635B7838A5FFF87F86E378A0FF00003B +S31AFE010B98389F00087C0803A64E8000217FC3F378480007D9482B +S31AFE010BAD000018816B00002C0B00004082FFB87FC3F378480085 +S31AFE010BC207C18001001C7C0803A68381000883A1000C83C10007 +S31AFE010BD71083E10014382100184E8000209421FFD87C0802A665 +S31AFE010BEC930100089321000C93410010936100149381001893E8 +S31AFE010C01A1001C93C1002093E100249001002C7C9C2378281C5C +S31AFE010C1605C07C791B787CB82B787CDA33787CFE3B78418100B0 +S31AFE010C2BA8386005EA480006ED7C7F1B794182009883BF000811 +S31AFE010C40381C0008837F0004B01F000CB3DD0000B35D0002A01B +S31AFE010C551F000C392000007F85E378B01D0004B13D00067F243A +S31AFE010C6ACB78387D00084BFFA6513D200000800939583960001F +S31AFE010C7F11901B000C81380000997B0009913B0010A01D000420 +S31AFE010C947F63DB78B01B0002A39F000C480007717C651B787F43 +S31AFE010CA984E3787FA3EB78480006F5B07D00067F05C3787FE336 +S31AFE010CBEFB7838800011480004457FE3FB78480006B5800100F6 +S31AFE010CD32C7C0803A6830100088321000C8341001083610014A6 +S31AFE010CE88381001883A1001C83C1002083E10024382100284EDB +S31AFE010CFD8000209421FFD87C0802A69381001893A1001C93C1B5 +S31AFE010D12002093E100249001002C7CBF2B787C7D1B787C9C23AD +S31AFE010D27787CDE33787FE3FB783881000848001A252C030000E9 +S31AFE010D3C41800024A0DF0004A0FE00047FA3EB787F84E3783878 +S31AFE010D51A100084BFFFE91386000004800001C3C60FE013C80B3 +S31AFE010D66FE0138634FD838844FFC4BFFAD553860FFFF80010048 +S31AFE010D7B2C7C0803A68381001883A1001C83C1002083E10024BD +S31AFE010D90382100284E8000209421FFE87C0802A6938100089363 +S31AFE010DA5A1000C93C1001093E100149001001C3F8000007CBFF4 +S31AFE010DBA2B783D200000807C3C607CDD33787CFE3B7893E93C9E +S31AFE010DCF644BFFA4F13D20000081693C682C0B00004182001CC6 +S31AFE010DE4B3CB0004801D000039200000900B0000913C3C604831 +S31AFE010DF90000143C60FE013863500C7FE4FB784BFFACBD800130 +S31AFE010E0E001C7C0803A68381000883A1000C83C1001083E1008D +S31AFE010E2314382100184E8000209421FFD07C0802A693410018A6 +S31AFE010E389361001C9381002093A1002493C1002893E1002C9058 +S31AFE010E4D010034A3A600047CBA2B787C7E1B787C9C23783CA014 +S31AFE010E62FE017CFF3B7838A50D98386100087FA4EB784BFFFB5B +S31AFE010E77D12C0300004080000C3860FFFF48000084813F00046F +S31AFE010E8C3C001062817F000060004DD37D2900161D6B03E8559A +S31AFE010EA129D1BE7F6B4A143D4000003D2000003D60000093CA63 +S31AFE010EB63C6093893C64934B3C68480019CD7FBAEB787C7E1B69 +S31AFE010ECB783BE0FFFF3FA000003F800000480019B57C7E185066 +S31AFE010EE07C03D8404080001848000559801D3C602C000000403E +S31AFE010EF582FFE483FC3C647F43D3784BFFFB957FE3FB78800122 +S31AFE010F0A00347C0803A6834100188361001C8381002083A10048 +S31AFE010F1F2483C1002883E1002C382100304E8000209421FFF07D +S31AFE010F347C0802A693E1000C900100147C691B78880900002C1D +S31AFE010F490000FF4082002C880900012C0000FF40820020880971 +S31AFE010F5E00022C0000FF4082001488090003386000012C00001D +S31AFE010F73FF418200643FE000007D234B78389F395838A0000478 +S31AFE010F884BFFADAD2C0300004082000C38600001480000408805 +S31AFE010F9D1F3958389F39582C0000004082002C880400012C004F +S31AFE010FB2000040820020880400022C0000004082001488040027 +S31AFE010FC703386000012C00000041820008386000008001001450 +S31AFE010FDC7C0803A683E1000C382100104E8000209421FFD87CFF +S31AFE010FF10802A693A1001C93C1002093E100249001002C7C7E23 +S31AFE0110061B7883FE00047C9D2378387F00104BFFFF1D2C0300A8 +S31AFE01101B0041820020A09F00007FE3FB785484D6BA38A0000084 +S31AFE011030480003752C030000418200107FC3F378480003414863 +S31AFE0110450000A8801F000C813D0000A17D000490010008912113 +S31AFE01105A000CB1610010A13F0000A01F00025523D6BA7C030026 +S31AFE01106F50B01E000C881F00092C00000641820038418100108E +S31AFE0110842C00000141820014480000582C00001141820038482E +S31AFE01109900004C7C1F1A14901E00087FC3F378388100084800BC +S31AFE0110AE05054800003C7C1F1A14901E00087FC3F378388100B5 +S31AFE0110C30848000AE5480000247C1F1A14901E00087FC3F3783C +S31AFE0110D8388100084BFFFA114800000C7FC3F378480002998084 +S31AFE0110ED01002C7C0803A683A1001C83C1002083E1002438210A +S31AFE01110200284E8000209421FFE07C0802A69361000C938100E9 +S31AFE0111171093A1001493C1001893E1001C900100247C7C1B782A +S31AFE01112C83BC000480FC0008A13C000C7CFD38507D293A14B153 +S31AFE0111413C000CA01D000054E9352E5400053E60004000700048 +S31AFE011156F0FF7C004B78B01D000039200000993D00013D000017 +S31AFE01116B00A1283C6CA01C000CB13D0004B01D000239690001CD +S31AFE011180B1683C6C3940000038000040989D0009981D0008B1F7 +S31AFE0111955D000AB15D00063D200000800939587CBB2B78901DC7 +S31AFE0111AA000C813B00007CE43B78913D00107FA3EB7838A00015 +S31AFE0111BF00480001E5B07D000A7F83E378389B000438A008009D +S31AFE0111D448000371800100247C0803A68361000C8381001083EC +S31AFE0111E9A1001483C1001883E1001C382100204E8000203D00B7 +S31AFE0111FE0000800839682C0000004C820020380000019008398A +S31AFE01121368380000047C0903A63C8000003D2000013D60000137 +S31AFE01122881443C7038A9082C390B07DC38C005EA38E000007D83 +S31AFE01123D272A147120000239690002914800007C00002654002C +S31AFE0112521FFE7C0000D07D6B00787D2900387D295B78912800A9 +S31AFE011267107D0A4378B0C8000E390A001438E705EC4200FFC429 +S31AFE01127C91443C704E8000209421FFE87C0802A6938100089372 +S31AFE011291A1000C93C1001093E100149001001C3D2000013BE97B +S31AFE0112A607DC3BC000003F80FE017FFDFB7880DF0010A0FF0095 +S31AFE0112BB0EA11F000C813F00007FC4F3787FA5EB78387C50380E +S31AFE0112D04BFFA7F53BDE00012C1E00033BFF00143BBD0014401D +S31AFE0112E581FFD03D2000003C60FE0180893C70386350644BFF59 +S31AFE0112FAA7CD8001001C7C0803A68381000883A1000C83C1001C +S31AFE01130F1083E10014382100184E8000203CA0000080653C7070 +S31AFE0113242C0300004D8200203CE00000814739603D2000008037 +S31AFE011339093964394A00017CC050503C8000008164395C8103DA +S31AFE01134E0010800300003928001490053C707C065800912300AE +S31AFE011363089103000438000000B003000C914739604C8100207B +S31AFE01137890C4395C4E8000203D400000812A39603D60000080A6 +S31AFE01138D0B3C703929FFFF912A3960906B3C70900300004E80D3 +S31AFE0113A200203484FFFE41800018A00300003484FFFE7CA50208 +S31AFE0113B714386300024080FFF02C04FFFF408200108803000031 +S31AFE0113CC5400402E7CA5021454AB043E54A9843E380000007C5A +S31AFE0113E1A95A146000FFFF7C0500004081000C3D25FFFF38A9EE +S31AFE0113F600017CA928F85523C63E5463402E5520063E7C031BA3 +S31AFE01140B784E800020A123000EA003000CA16300107C004A14F2 +S31AFE011420A1430012892300097C005A147C005214A06300027CBA +S31AFE011435004A147C601A144E8000209421FFD87C0802A693817B +S31AFE01144A001893A1001C93C1002093E100249001002C3F800098 +S31AFE01145F003FA000003FC00000386005EA4BFFFEB17C7F1B7986 +S31AFE011474408200183C60FE01386350744BFFA6454BFFFE0148C4 +S31AFE011489000000809F00103861000838A005EA4BFFD289546059 +S31AFE01149E043E2C000000B07F000C41820074A0010014813C39A9 +S31AFE0114B3742C00080039290001913C3974418200182C00080685 +S31AFE0114C8418200347FE3FB784BFFFEB14BFFFF94813D396C8085 +S31AFE0114DD1F001039290001913D396C901F00047FE3FB783881AF +S31AFE0114F2000E4BFFFAF94BFFFF70813E3970801F001039290063 +S31AFE01150701913E3970901F00047FE3FB7848000F9D4BFFFF503C +S31AFE01151C7FE3FB784BFFFE618001002C7C0803A68381001883BE +S31AFE011531A1001C83C1002083E10024382100284E8000209421D3 +S31AFE011546FFE87C0802A69001001C80040000A1440004900100CD +S31AFE01155B08390100083D200000B148000439693C48A14B0004BC +S31AFE011570B0A1001480093C48A0A3000C808300109001000EB13D +S31AFE0115854100127D0343784BFFCF393D600000812B3978392910 +S31AFE01159A0001912B39788001001C7C0803A6382100184E8000C0 +S31AFE0115AF209421FFF07C0802A693C1000893E1000C90010014B1 +S31AFE0115C47C7F1B78807F00087C9E2378A00300002C00080040AC +S31AFE0115D9820050A09F000C38A000004BFFFDC17C631B794082C6 +S31AFE0115EE003C813F000838A0000098690000817F0008B06B00E3 +S31AFE01160302807F0008A09F000C4BFFFD99813F00087FC5F37822 +S31AFE011618B06900027FE3FB78388000014BFFFAE57FE3FB784BC6 +S31AFE01162DFFFD55800100147C0803A683C1000883E1000C38217B +S31AFE01164200104E8000209421FFD87C0802A69341001093610000 +S31AFE011657149381001893A1001C93C1002093E100249001002C20 +S31AFE01166C7C9B23787C7E1B78736000023B9E002C83BC00048385 +S31AFE011681FC00087CBA2B784182004438000018B01C000C813F83 +S31AFE011696000C396000065169E0063C000204913F000C6000056C +S31AFE0116ABB490010008387F00143881000838A000044BFF9C0585 +S31AFE0116C038000000B01E001648000020A13E00163960000539C0 +S31AFE0116D5290014B13C000C801F000C5160E006901F000C801F29 +S31AFE0116EA000C396000005160C10E901F000C813E00542C1A00AD +S31AFE0116FF00913F0004801E0050B17F0010901F00084082005402 +S31AFE011714A01E0012B01F0000A13E00149B7F000DB13F0002A070 +S31AFE0117291E00162C0000004182000C63600008981F000D3800B0 +S31AFE01173E05B4B01F000EB35F00123D20000080093958396000C7 +S31AFE01175306901D000C813E0008997D0009913D0010A01C000C31 +S31AFE0117687FA3EB78B01D0002A3BC000C4BFFFC9D7C651B787FD2 +S31AFE01177DA4EB787FE3FB784BFFFC21B07F00107F83E3783880BB +S31AFE011792000638BE00084BFFF971801E00042C00000A408200EB +S31AFE0117A7243C8000013CA0FE0138A5199C7FC6F378387E00185C +S31AFE0117BC6084D4C048000B5D48000034881F000D7009000340FF +S31AFE0117D1820010A01E00162C0000004182001C3CA0FE0138A5D5 +S31AFE0117E619747FC6F378387E0018388003E848000B298001003E +S31AFE0117FB2C7C0803A683410010836100148381001883A1001C53 +S31AFE01181083C1002083E10024382100284E8000209421FFE07C53 +S31AFE0118250802A69361000C9381001093A1001493C1001893E1AD +S31AFE01183A001C900100247C7C1B7883FC0008815C0004A0DF0051 +S31AFE01184F00A0FF0002807F000480BF000839000014B11C000C6E +S31AFE0118643BEA0014801F000C39200005396000005120E00651E7 +S31AFE01187960C10E901F000C39200400B13F000EB17F0010B17FA0 +S31AFE01188E0012B0EA0014B0DF0002991F000D907F000890BF00C4 +S31AFE0118A3043D200000800939587C9B2378900A000C813B00009C +S31AFE0118B838000006912A0010980A0009A13C000C7D435378B13D +S31AFE0118CD2A0002A3BC000C4BFFFB3D7C651B787FA4EB787FE38C +S31AFE0118E2FB784BFFFAC1B07F00107F83E3787F65DB78388000E9 +S31AFE0118F7064BFFF811800100247C0803A68361000C83810010A8 +S31AFE01190C83A1001483C1001883E1001C382100204E8000203D09 +S31AFE01192120000081293C74396000002C0900004D8200207D2ACE +S31AFE0119364B787C0918004082001C2C0B000041820010800900C6 +S31AFE01194B00900B000048000008814900007D2B4B7881290000B8 +S31AFE0119602C0900004082FFD43D20000091493C744E800020943A +S31AFE01197521FFF87C0802A69001000C3880000038A000014BFF9C +S31AFE01198AFCC18001000C7C0803A6382100084E8000209421FFC9 +S31AFE01199FF87C0802A69001000C38000000900300044BFFFF71E4 +S31AFE0119B48001000C7C0803A6382100084E8000209421FFF07CF0 +S31AFE0119C90802A693E1000C900100147C7F1B78480000108003C6 +S31AFE0119DE0000901F00404BFFF99D807F00402C0300004082FFF1 +S31AFE0119F3EC800100147C0803A683E1000C382100104E80002065 +S31AFE011A089421FFE87C0802A693A1000C93C1001093E100149040 +S31AFE011A1D01001C7C7D1B7838000000901D0004387D0018480008 +S31AFE011A32097D7FA3EB784BFFFF8D7FA3EB784BFFFEE18001008A +S31AFE011A471C7C0803A683A1000C83C1001083E1001438210018CF +S31AFE011A5C4E8000208124000880E30050814900048009000CA11E +S31AFE011A7164000C7D075051540036BA7D6058507D09021441819F +S31AFE011A8600707C0A38507D6058517D08021440810060814300C2 +S31AFE011A9B407D275A142C0A0000380000009123005090040000D9 +S31AFE011AB041820030800A00002C0000004182001C7D4953788182 +S31AFE011AC5290000800900002C0000004082FFF47D2A4B78908AF0 +S31AFE011ADA0000480000109103004490830040916300483860009B +S31AFE011AEF014E800020386000004E8000209421FFF07C0802A698 +S31AFE011B0493C1000893E1000C90010014812400087C7F1B788388 +S31AFE011B19C90008801F00547D20F0514081006C387F00184800CC +S31AFE011B2E0881811F0054A15F00167D68F0505549043E7F8B48B3 +S31AFE011B43004FFEE3827C000026540007FE7C0000D07D29007871 +S31AFE011B587D6B00387D6B4B79408100307D2B50505525043E2C86 +S31AFE011B6D0500007C085A14901F0054B13F001641820014807F88 +S31AFE011B820034386300147C835A144BFF9735800100147C0803C7 +S31AFE011B97A683C1000883E1000C382100104E8000209421FFE0E7 +S31AFE011BAC7C0802A69361000C9381001093A1001493C100189388 +S31AFE011BC1E1001C900100247C7C1B78807C0004A01C000C83FC86 +S31AFE011BD60008B0030002A3BC000C7C9E23784BFFF82D7C651BAD +S31AFE011BEB787FA4EB787FE3FB784BFFF7B12C0300003B60000051 +S31AFE011C00408203A03D20000083A93C744800000883BD00002C70 +S31AFE011C151D00004182037CA13D0012A01F00027C09000040825E +S31AFE011C2AFFE8A13D00142C09000041820028A01F00007C090063 +S31AFE011C3F004082FFD07FC3F378389D000838A000044BFFA0E5C5 +S31AFE011C542C0300004082FFB8801D0004817E0004A13E00082C17 +S31AFE011C69000002917D000CB13D001041820024881F000D700933 +S31AFE011C7E0004418200187FA3EB784BFFFD817F83E3784BFFF683 +S31AFE011C93F14800031C813D00043809FFFF28000009418102FCED +S31AFE011CA83D60FE01396B50985400103A7D4B002E3D20FE0139D1 +S31AFE011CBD2950987D4A4A147D4903A64E800420881F000D700949 +S31AFE011CD200024182004038000002901D0004813F0004A17F0024 +S31AFE011CE70039290001913D0050B17D0014801E00003920000029 +S31AFE011CFC901D0008B13D004C7FA3EB78B13D0016388000124844 +S31AFE011D110002247FC4F3787F83E3784BFFFB0548000280387DBE +S31AFE011D26001848000685881F000D70090004418200103800007C +S31AFE011D3B01901D00044800026070090002408202387009001032 +S31AFE011D5041820250813D0054807F0008392900017C03480040E1 +S31AFE011D6582023C38000004907D0054901D00044800022C881F39 +S31AFE011D7A000D83DD005070090010418200107FA3EB787F84E3CB +S31AFE011D8F784BFFFD6D7FA3EB787F84E3784BFFFCC5881F000D6C +S31AFE011DA47C7B1B787009000141820024807F0004801D00507CCE +S31AFE011DB9030000408200143803000139200005901D0050913DD2 +S31AFE011DCE0004801D00507C00F00040820010A01D004C2C000097 +S31AFE011DE300418201BCA3FD00162C1F000040820024387D0018B2 +S31AFE011DF8480005B57FA3EB783880001038A000004BFFF841B374 +S31AFE011E0DFD004C4800019038000001B01D004C48000184881FD3 +S31AFE011E22000D70090010418201787FA3EB787F84E3784BFFFCAB +S31AFE011E37C9813D0054801F0008392900017C00480040820158CD +S31AFE011E4C38000000901D00047FA3EB784BFFFAC94800014488EC +S31AFE011E611F000D70090010418200607FA3EB787F84E3784BFF62 +S31AFE011E76FC89813D0054801F0008392900017C0048004082002B +S31AFE011E8B40881F000D700900014182002C813D00503800000A90 +S31AFE011EA039290001913D0050901D00047FA3EB78388000103871 +S31AFE011EB5A000004BFFF7914800000C38000008901D0004881FB5 +S31AFE011ECA000D70090001418200D0387D0018480004D5813D0038 +S31AFE011EDF503800000939290001913D0050901D00047FA3EB78A1 +S31AFE011EF4388000114800003C7FA3EB787F84E3784BFFFB5D887A +S31AFE011F091F000D7C7B1B78700900014182008C813D00503800F9 +S31AFE011F1E000A39290001913D0050901D00047FA3EB7838800030 +S31AFE011F331038A000004BFFF71148000064881F000D7009001071 +S31AFE011F48418200587FA3EB787F84E3784BFFFBA9813D00548001 +S31AFE011F5D1F0008392900017C00480040820038387D001848000D +S31AFE011F72043D3800000A901D0004480000247FA3EB7838800078 +S31AFE011F870038A000014BFFF6BD480000107FC4F3787F83E37807 +S31AFE011F9C4BFFF8852C1B00004082000C7F83E3784BFFF3D58060 +S31AFE011FB10100247C0803A68361000C8381001083A1001483C144 +S31AFE011FC6001883E1001C382100204E8000209421FFF87C0802D0 +S31AFE011FDBA69001000C4BFFF461480004218001000C7C0803A6E3 +S31AFE011FF0382100084E8000209421FFE87C0802A6938100089311 +S31AFE012005A1000C93C1001093E100149001001C7C7D1B787C9CD7 +S31AFE01201A23783880000038A006444BFF93753D600000810B3C80 +S31AFE01202F74381D006C395D0058901D0034915D0030392000011B +S31AFE012044380005EA93AB3C74913D0004B39D0012B01D003A91A1 +S31AFE0120591D0000915D003C386000008001001C7C0803A68381C0 +S31AFE01206E000883A1000C83C1001083E10014382100184E800015 +S31AFE012083209421FFF07C0802A693E1000C900100147C7F1B78A0 +S31AFE012098480000084BFFFF39801F00042C00000041820010A01A +S31AFE0120AD1F00162C0000004082FFE8800100147C0803A683E1E9 +S31AFE0120C2000C382100104E8000209421FFF07C0802A693E1005D +S31AFE0120D70C900100147C7F1B784BFFFFA5817F000469690004E8 +S31AFE0120EC200900007D20491469600002214000007C0A01147D73 +S31AFE0121012A03794182002038000007901F00047FE3FB783880BC +S31AFE012116001138A000004BFFF52D480000242C0B0005408200F0 +S31AFE01212B1C38000006901F00047FE3FB783880001138A0000017 +S31AFE0121404BFFF5097FE3FB784BFFF87D800100147C0803A68364 +S31AFE012155E1000C382100104E8000209421FFE87C0802A6938150 +S31AFE01216A000893A1000C93C1001093E100149001001C7CBE2B15 +S31AFE01217F797C7F1B787C9D237840810010801F00482C000000A7 +S31AFE0121944082001438600000480000B8907F0048480000AC3B3D +S31AFE0121A980000048000064809F00447FA3EB784BFF9109807F25 +S31AFE0121BE0040801F0048812300007FC0F050913F00407F9C0290 +S31AFE0121D3147FBD02144BFFF1A9807F00402C0300004182FFBCBC +S31AFE0121E881630008A123000C800B000C540036BA7D2048509180 +S31AFE0121FD3F0048800B000C540036BA7D6B0214917F00442C1ECA +S31AFE01221200004182003C80BF00487C1E28004080FF90809F00FC +S31AFE012227447FA3EB787FC5F3784BFF9091813F0044801F0048CF +S31AFE01223C7D29F2147C1E0050901F0048913F00447F9CF2147F47 +S31AFE01225183E3788001001C7C0803A68381000883A1000C83C14B +S31AFE012266001083E10014382100184E8000209421FFF07C08024D +S31AFE01227BA693C1000893E1000C900100147CBE2B797C7F1B78B6 +S31AFE012290807F00344081006C813F00043929FFFC280900014041 +S31AFE0122A581000C3860FFFF48000058A01F00162C000000408299 +S31AFE0122BA0048213E05B47D2949107D294BB87D2048F87FC94895 +S31AFE0122CF38700005B47D3E0378386300147FC5F3784BFF8FE146 +S31AFE0122E47FE3FB78B3DF00163880001038A000004BFFF3557FB2 +S31AFE0122F9C3F3784800000838600000800100147C0803A683C1AF +S31AFE01230E000883E1000C382100104E8000209421FFE87C0802C4 +S31AFE012323A69381000893A1000C93C1001093E100149001001C05 +S31AFE0123387C7F1B787CBD2B787CDC3378909F0004480005453D1C +S31AFE01234D20000081293C78907F00082C09000093BF000C939F1C +S31AFE0123620010418200187C09F80041820020812900002C090037 +S31AFE012377004082FFF03D20000080093C7893E93C78901F000022 +S31AFE01238C8001001C7C0803A68381000883A1000C83C10010835A +S31AFE0123A1E10014382100184E8000203D20000081293C7839409A +S31AFE0123B600002C0900004D8200207D2B4B787C0918004082001F +S31AFE0123CB202C0A00004182001080090000900A00004800001C48 +S31AFE0123E081690000480000147D2A4B78812900002C0900004014 +S31AFE0123F582FFD03D20000091693C784E8000209421FFE87C0864 +S31AFE01240A02A693A1000C93C1001093E100149001001C3D2000DA +S31AFE01241F0083E93C783BC000002C1F00003FA000004182006437 +S31AFE01243448000459801F0008813F00047C6018507C03484041F2 +S31AFE01244980003C2C1E000041820010801F0000901E000048000B +S31AFE01245E000C801F0000901D3C78801F000C807F00107C080317 +S31AFE012473A63BC000004E80002183FD3C784800000C7FFEFB7847 +S31AFE01248883FF00002C1F00004082FFA48001001C7C0803A683BB +S31AFE01249DA1000C83C1001083E10014382100184E800020942198 +S31AFE0124B2FFE87C0802A69381000893A1000C93C1001093E100C9 +S31AFE0124C7149001001C7C7D1B7883FD0004A13F0002A01F000089 +S31AFE0124DC69290800216900007D2B491468000001216000007C57 +S31AFE0124F10B01147C0B4839418200D83FC00000387F0018389E6A +S31AFE012506395838A000044BFF98292C030000408200BCA01F00D7 +S31AFE01251B062C00000140820064813F000E38000002B01F000670 +S31AFE012530913F0018801F0008391F0008A1280004901F001238DC +S31AFE0125459F0012B1240004801E39583D200000901F000E8149DF +S31AFE01255A3C4839293C48A1690004915F0008B1680004380000A2 +S31AFE01256F1CB01D000C7FA3EB7838A008064BFFEFC94800005058 +S31AFE0125842C000002408200483FC00001801E1FDC3B9E1FDC2C6C +S31AFE01259900000041820034807C0008389F000E38A000044BFF22 +S31AFE0125AE97897C631B794082001CA01F000C817F0008813C0012 +S31AFE0125C304B009000491690000907E1FDC7FA3EB784BFFEDADD1 +S31AFE0125D88001001C7C0803A68381000883A1000C83C10010830C +S31AFE0125EDE10014382100184E8000209421FFD87C0802A69361D4 +S31AFE01260200149381001893A1001C93C1002093E1002490010091 +S31AFE0126172C7C7F1B787C9D23783860002A4BFFECF97C7E1B79BC +S31AFE01262C40820018480001007FC3F3784BFFED49386000004864 +S31AFE0126410000F4817E000439200004992B0005394000013900AF +S31AFE012656080038000006980B0004B14B0000B14B0006B10B00C3 +S31AFE01266B023D200000800939583D400000900B000E392A3C48CF +S31AFE012680A1090004800A3C48B10B000C900B0008813F00003D1C +S31AFE012695400001912B0018396A1FDC380000FF93EB0008980122 +S31AFE0126AA000D93AB000439200001912A1FDC980100089801007D +S31AFE0126BF099801000A9801000B9801000C3BA000073F8000016A +S31AFE0126D43B60001CB37E000C7FC3F3783881000838A008064B59 +S31AFE0126E9FFEE5D480001A17C7F1B78480000144BFFED49801C9D +S31AFE0126FE1FDC2C0000004182FF30480001857C7F18502803004D +S31AFE012713F94081FFE47FA0EB782C0000003BBDFFFF4181FFB4F6 +S31AFE0127287FC3F3784BFFEC553860FFFF8001002C7C0803A6836C +S31AFE01273D6100148381001883A1001C83C1002083E1002438216C +S31AFE01275200284E8000209421FFD87C0802A6930100089321004F +S31AFE0127670C93410010936100149381001893A1001C93C1002070 +S31AFE01277C93E100249001002C3D2000013B291FE83B1900967CBF +S31AFE0127917B1B787C9C23787F3DCB783B4000007FBEEB787F6371 +S31AFE0127A6DB787FC4F37838A000044BFF95852C0300007F5FD3F8 +S31AFE0127BB78418200383BBE000A7C1DC0003B5F000A4081FFD4FD +S31AFE0127D0801B00007F63DB78901C0000389C00044BFFFE192C0E +S31AFE0127E5030000408000283860FFFF4800006C7C1AC82EA13D3B +S31AFE0127FA0008817D0004B13C0008901C0000917C0004480000C1 +S31AFE01280F4C3CC000008126397C80FC0000390900011D29000AFC +S31AFE0128243D600001A15C0008801C0004396B1FE87CE9592E7D43 +S31AFE012839295A142C080010B1490008900900049106397C4082FD +S31AFE01284E000C380000009006397C386000008001002C7C080315 +S31AFE012863A6830100088321000C83410010836100148381001891 +S31AFE01287883A1001C83C1002083E10024382100284E8000209417 +S31AFE01288D21FFF87C0802A69001000C3D200000392932008009D6 +S31AFE0128A20048386003E87C0803A64E8000213D200000806939B6 +S31AFE0128B78038630001906939808001000C7C0803A6382100081E +S309FE0128CC4E80002015 +S31AFE0128D03C746F7069633E0048656C702061626F7574206865A4 +S31AFE0128E56C703F0000000068656C70000000005B2D77203C7446 +S31AFE0128FA696D656F75743E5D205B656E7472795D00004578656A +S31AFE01290F6375746520636F64652061742061206C6F6361746930 +S31AFE0129246F6E0000676F00002D62203C6C6F636174696F6E3E64 +S31AFE012939205B2D6C203C6C656E6774683E5D00446973706C619A +S31AFE01294E7920286865782064756D702920612072616E6765209C +S31AFE0129636F66206D656D6F72790000000064756D700000000016 +S31AFE0129785B4F4E207C204F46465D00004D616E616765206D6122 +S31AFE01298D6368696E6520636163686573000000636163686500AE +S31AFE0129A200000A526564426F6F7428746D2920646562756720E9 +S31AFE0129B7656E7669726F6E6D656E74202D206275696C7420257F +S31AFE0129CC732C2025730A000030373A34303A3038000000004F9A +S31AFE0129E16374203237203230303000506C6174666F726D3A20FB +S31AFE0129F6257320282573292025730A0000004D6F746F726F6C78 +S31AFE012A0B61204D425800000000506F77657250432038363000EB +S31AFE012A2000000000436F7079726967687420284329203230307D +S31AFE012A35302C20526564204861742C20496E632E0A0A00524178 +S31AFE012A4A4D3A2025702D25700A003D3D20457865637574696E8B +S31AFE012A5F6720626F6F742073637269707420696E2025642E257A +S31AFE012A74303364207365636F6E6473202D20656E746572205E69 +S31AFE012A894320746F2061626F72740A00000000526564426F6F70 +S31AFE012A9E743E200000002A2A204572726F723A20496C6C656787 +S31AFE012AB3616C20636F6D6D616E643A2025730A00006F6E000064 +S31AFE012AC86F666600496E76616C6964206361636865206D6F647E +S31AFE012ADD653A2025730A00636163686573203F0A000000257316 +S31AFE012AF20A20202025732025730A000000006261736520616486 +S31AFE012B076472657373000000006C656E677468000044756D707B +S31AFE012B1C2077686174205B6C6F636174696F6E5D3F0A000077DA +S31AFE012B316169742074696D656F7574000000007374617274698E +S31AFE012B466E6720616464726573730000000041626F757420740B +S31AFE012B5B6F20737461727420657865637574696F6E206174209A +S31AFE012B702570202D2061626F72742077697468205E4320776994 +S31AFE012B857468696E202564207365636F6E64730A0000006574E8 +S31AFE012B9A68300000000071756963635F657468000000515549E5 +S31AFE012BAF43432045746865726E65743A204E6F2066726565202E +S31AFE012BC4786D697420627566666572730A000000000000004CD2 +S31AFE012BD96F616420612066696C65006C6F616400000000454C3C +S31AFE012BEE4620696D61676573206E6F7420737570706F727465DE +S31AFE012C03640A000000496E76616C696420532D7265636F726463 +S31AFE012C18206174206F66667365742025702C20696E7075743A9B +S31AFE012C2D2025630A00000042616420532D7265636F7264206332 +S31AFE012C426F756E74206174206F66667365742025700A00000057 +S31AFE012C570041646472657373206F6666736574203D2025700ADA +S31AFE012C6C00000000417474656D707420746F206C6F6164205339 +S31AFE012C812D7265636F7264206461746120746F206164647265B0 +S31AFE012C9673733A202570205B6E6F7420696E2052414D5D0A0025 +S31AFE012CAB002A2A2A205761726E696E672120436865636B737594 +S31AFE012CC06D206661696C757265202D20416464723A20256C783A +S31AFE012CD52C202530326C58203C3E202530326C580A0000456E8C +S31AFE012CEA74727920706F696E743A2025702C2061646472657379 +S31AFE012CFF732072616E67653A2025702D25700A0000496E7661D2 +S31AFE012D146C696420532D7265636F7264206174206F6666736525 +S31AFE012D2974203078256C782C20747970653A2025780A0000003C +S31AFE012D3E0000FFFF27A4FFFF2608FFFF2608FFFF2608FFFF2709 +S31AFE012D538CFFFF278CFFFF278CFFFF2754FFFF2754FFFF27540D +S31AFE012D68256308000A000000766572626F7365006C6F61642001 +S31AFE012D7D72617720646174610000006C6F616420616464726578 +S31AFE012D92737300000000646F776E6C6F6164206D6F64652028DC +S31AFE012DA754465450206F722078797A4D4F44454D2900000000AD +S31AFE012DBC686F7374206E616D6520284950206164647265737397 +S31AFE012DD129000066696C65206E616D65000000496E76616C69FB +S31AFE012DE66420495020616464726573733A2025730A006D6F6474 +S31AFE012DFB656D000000496E76616C696420276D6F6465273A20B8 +S31AFE012E1025730A00746674700000000054465450206D6F646545 +S31AFE012E25207265717569726573206120776F726B696E67206ED3 +S31AFE012E3A6574776F726B0A00000046696C65206E616D65206D0A +S31AFE012E4F697373696E670A000075736167653A206C6F616420A3 +S31AFE012E6425730A0043616E2774206C6F616420272573273A20E5 +S31AFE012E7925730A00000000526177206C6F61642072657175696D +S31AFE012E8E7265732061206D656D6F727920616464726573730A96 +S31AFE012EA3005261772066696C65206C6F616465642025702D259B +S31AFE012EB8700A0000454C4600556E7265636F676E697A656420A2 +S31AFE012ECD696D61676520747970653A20256C780A0000007B63BB +S31AFE012EE26D64737D00004D616E61676520464C41534820696D48 +S31AFE012EF76167657300666973005B2D6C5D000000004D616E6111 +S31AFE012F0C676520636F6E66696775726174696F6E206B65707473 +S31AFE012F2120696E20464C415348206D656D6F727900000066638F +S31AFE012F366F6E666967005B2D665D00000000496E697469616C59 +S31AFE012F4B697A6520464C41534820496D6167652053797374655B +S31AFE012F606D205B4649535D00696E6974000000005B2D635D0034 +S31AFE012F75000000446973706C617920636F6E74656E7473206F4F +S31AFE012F8A6620464C41534820496D6167652053797374656D2071 +S31AFE012F9F5B4649535D000000006C6973740000000000000000C2 +S31AFE012FB4446973706C61792066726565205B617661696C616220 +S31AFE012FC96C655D206C6F636174696F6E732077697468696E2001 +S31AFE012FDE464C41534820496D6167652053797374656D205B4602 +S31AFE012FF349535D000066726565000000002D66203C666C617394 +S31AFE013008685F616464723E202D6C203C6C656E6774683E0045F4 +S31AFE01301D7261736520464C41534820636F6E74656E74730000D2 +S31AFE013032000065726173650000006E616D6500000000446973B3 +S31AFE013047706C617920616E20696D6167652066726F6D20464C21 +S31AFE01305C41534820496D6167652053797374656D205B46495379 +S31AFE0130715D000064656C65746500005B2D62203C6D656D6F720F +S31AFE013086795F6C6F61645F616464726573733E5D205B2D635D70 +S31AFE01309B206E616D65000000004C6F616420696D616765206631 +S31AFE0130B0726F6D20464C41534820496D616765205379737465EF +S31AFE0130C56D205B4649535D20696E746F2052414D0000006C6F15 +S31AFE0130DA6164000000002D62203C6D656D5F626173653E202D68 +S31AFE0130EF6C203C696D6167655F6C656E6774683E205B2D7320A2 +S31AFE0131043C646174615F6C656E6774683E5D205B2D66203C668F +S31AFE0131196C6173685F616464723E5D205B2D65203C656E74723D +S31AFE01312E795F706F696E743E5D205B2D72203C72616D5F616410 +S31AFE01314364723E5D203C6E616D653E00004372656174652061F1 +S31AFE0131586E20696D6167650063726561746500002A2A2A206951 +S31AFE01316D6E76616C696420276669732720636F6D6D616E643AE1 +S31AFE0131822025730A0000666973200000000066756C6C20696E65 +S31AFE013197697469616C697A6174696F6E2C20657261736573201E +S31AFE0131AC616C6C206F6620666C6173680000000041626F7574B2 +S31AFE0131C120746F20696E697469616C697A65205B666F726D610F +S31AFE0131D6745D20464C41534820696D6167652073797374656D98 +S31AFE0131EB002A2A2041626F727465640A002A2A2A20496E697459 +S31AFE01320069616C697A6520464C41534820496D616765205379B9 +S31AFE0132157374656D0A0000202020696E697469616C697A6174DA +S31AFE01322A696F6E206661696C65642025703A202578282573292A +S31AFE01323F0A00000000202020205761726E696E673A206465767C +S31AFE01325469636520636F6E74656E7473206E6F74206572617365 +S31AFE01326965642C20736F6D6520626C6F636B73206D6179206EEF +S31AFE01327E6F7420626520757361626C650A00526564426F6F7417 +S31AFE01329300526564426F6F745B6261636B75705D0052656442E7 +S31AFE0132A86F6F7420636F6E66696700004649532064697265631B +S31AFE0132BD746F72790000004572726F722077726974696E6720DB +S31AFE0132D2696D6167652064657363726970746F727320617420F8 +S31AFE0132E725703A202578282573290A0000646973706C61792038 +S31AFE0132FC636865636B73756D730000004E616D652020202020D1 +S31AFE013311202020202020202020464C4153482061646472202019 +S31AFE013326202573202020204C656E677468202020202020456E80 +S31AFE01333B74727920706F696E740A000000436865636B73756D92 +S31AFE013350000000004D656D206164647200000000252D3136735D +S31AFE013365202030782530386C5820202030782530386C5820207C +S31AFE01337A30782530386C58202030782530386C580A002020308D +S31AFE01338F782530386C58202E2E2030782530386C580A000000BC +S31AFE0133A46D656D6F727920626173652061646472657373007243 +S31AFE0133B9616D2062617365206164647265737300000000656E98 +S31AFE0133CE74727920706F696E74206164647265737300464C4163 +S31AFE0133E35348206D656D6F72792062617365206164647265732E +S31AFE0133F873000000696D616765206C656E677468205B696E2031 +S31AFE01340D464C4153485D00696D6167652073697A65205B6163BD +S31AFE0134227475616C20646174615D0000000066696C65206E6134 +S31AFE0134376D65000000696E76616C696420617267756D656E743F +S31AFE01344C73000000726571756972656420706172616D65746523 +S31AFE01346172206D697373696E670000496E76616C696420464C4C +S31AFE01347641534820696D6167652073697A652F6C656E677468B1 +S31AFE01348B20636F6D62696E6174696F6E00496E76616C6964208D +S31AFE0134A0464C41534820616464726573733A20257020282573CF +S31AFE0134B5290A0020202076616C69642072616E67652069732011 +S31AFE0134CA25702D25700A000000002A2A205741524E494E473AC3 +S31AFE0134DF2052414D20616464726573733A202570206D61792057 +S31AFE0134F4626520696E76616C69640A004E616D652069732074D5 +S31AFE0135096F6F206C6F6E672C206D757374206265206C65737327 +S31AFE01351E207468616E2025642063686172730A00000043616ED2 +S31AFE0135332774206C6F6361746520256C64206279746573206669 +S31AFE01354872656520696E20464C4153480A000000496D616765BB +S31AFE01355D20666F756E642C2062757420464C41534820616464AA +S31AFE0135727265737320696E636F72726563740A000000496D6178 +S31AFE013587676520666F756E642C20627574204C454E4754482089 +S31AFE01359C697320696E636F72726563740A000000416E20696DA1 +S31AFE0135B1616765206E616D6564202725732720657869737473E8 +S31AFE0135C6000043616E27742070726F6772616D2074686973202E +S31AFE0135DB726567696F6E202D20636F6E7461696E7320636F6430 +S31AFE0135F06520696E20757365210A000043616E277420657261C8 +S31AFE013605736520726567696F6E2061742025703A202578282541 +S31AFE01361A73290A00000043616E27742070726F6772616D207299 +S31AFE01362F6567696F6E2061742025703A202578282573290A00DB +S31AFE0136444572726F722065726173696E672061742025703A2055 +S31AFE0136592578282573290A000000004572726F722070726F67E5 +S31AFE01366E72616D6D696E672061742025703A20257828257329CD +S31AFE0136830A000000006C656E67746800006D697373696E672087 +S31AFE013698617267756D656E7400000000696D616765206E616D56 +S31AFE0136AD65000044656C65746520696D61676520272573270022 +S31AFE0136C200004E6F20696D616765202725732720666F756E64CC +S31AFE0136D70A000000006D656D6F7279205B6C6F61645D206261DB +S31AFE0136EC736520616464726573730000646973706C617920636D +S31AFE0137016865636B73756D000000004E6F742061206C6F61644C +S31AFE01371661626C6520696D6167650A0000002A2A205761726ECC +S31AFE01372B696E67202D20636865636B73756D206661696C7572E3 +S31AFE013740652E202073746F7265643A202530386C782C20636F22 +S31AFE0137556D70757465643A202530386C780A00436865636B73A5 +S31AFE01376A756D3A202530386C780A00000000464C4153483A20C6 +S31AFE01377F64726976657220696E6974206661696C6564212C20DE +S31AFE0137947374617475733A2025780A00464C4153483A20257019 +S31AFE0137A9202D2025702C20256420626C6F636B73206F66202557 +S31AFE0137BE7020627974657320656163682E0A00000000746F6FFF +S31AFE0137D32066657720617267756D656E7473000000756E7265CA +S31AFE0137E8636F676E697A656420636F6D6D616E64000000005223 +S31AFE0137FD756E2073637269707420617420626F6F740000626F80 +S31AFE0138126F745F73637269707400426F6F74207363726970747C +S31AFE01382700626F6F745F7363726970745F6461746100000000E6 +S31AFE01383C426F6F74207363726970742074696D656F75742028BA +S31AFE013851313030306D73207265736F6C7574696F6E2900626F4E +S31AFE0138666F745F7363726970745F74696D656F75740025733A39 +S31AFE01387B200000000025732000747275650000000066616C73F5 +S31AFE013890650000002564200030782530325800003A000000202F +S31AFE0138A50000003F3F00000A0000002E2E2025730A0000456EB0 +S31AFE0138BA746572207363726970742C207465726D696E617465DF +S31AFE0138CF207769746820656D707479206C696E650A00000000E2 +S31AFE0138E43E3E2000FFFEFA98FFFEFABCFFFEFB38FFFEFB44FF81 +S31AFE0138F9FEFAD0FFFEFAECFFFEFC4CFFFEFC60FFFEFDD4FFFEA1 +S31AFE01390EFD24FFFEFC7CFFFEFCC0FFFEF918FFFEF918FFFEF93E +S31AFE01392328FFFEF930FFFEF918FFFEF9206C69737420636F6EFC +S31AFE01393866696775726174696F6E206F6E6C79002A2A20696E10 +S31AFE01394D76616C696420656E7472790A00000055706461746591 +S31AFE01396220526564426F6F74206E6F6E2D766F6C6174696C6584 +S31AFE01397720636F6E66696775726174696F6E0000004572726F06 +S31AFE01398C722077726974696E6720636F6E66696720646174613B +S31AFE0139A12061742025703A202578282573290A00000000000078 +S31AFE0139B60000FFFEF6D0FFFEF730FFFEF6E8FFFEF6ECFFFEF762 +S31AFE0139CB00FFFEF7205265717565737420666F7220636F6E66B8 +S31AFE0139E069672076616C75652027257327202D2077726F6E6720 +S31AFE0139F520747970650A0043616E27742066696E6420636F6EFE +S31AFE013A0A6669672076616C756520272573270A0000000000001F +S31AFE013A1F00FFFEF4C0FFFEF4C0FFFEF524FFFEF4E0FFFEF4C093 +S31AFE013A34FFFEF4CC464C41534820636F6E666967757261746992 +S31AFE013A496F6E20636865636B73756D206572726F72206F7220A8 +S31AFE013A5E696E76616C6964206B65790A000000000000FFFF28CE +S31AFE013A7378FFFF2878FFFF2878FFFF2878FFFF2878FFFF2878AB +S31AFE013A88FFFF2878FFFF2878FFFF2878FFFF2878FFFF2878FF0F +S31AFE013A9DFF2878FFFF2878FFFF2878FFFF2878FFFF2878FFFFFA +S31AFE013AB22898FFFF28B8FFFF28D8FFFF28F8FFFF2918FFFF29DA +S31AFE013AC77CFFFF297CFFFF297CFFFF297CFFFF2938FFFF2958A2 +S31AFE013ADCFFFF2958FFFF2958FFFF2958FFFF2958FFFF2958FF56 +S31AFE013AF1FF2958FFFF2958FFFF2958FFFF2958FFFF2958FFFF41 +S31AFE013B062958FFFF2958FFFF2958FFFF2958FFFF2958FFFF2901 +S31AFE013B1B58FFFF2958FFFF2958FFFF2958FFFF2958FFFF2958BD +S31AFE013B30FFFF2958FFFF2958FFFF2958FFFF2958FFFF2958FF01 +S31AFE013B45FF2958FFFF2958FFFF2958FFFF2958FFFF2958FFFFEC +S31AFE013B5A2938FFFF2938FFFF2938FFFF2938FFFF2938FFFF294D +S31AFE013B6F38FFFF2938FFFF2938FFFF2938FFFF2938FFFF293829 +S31AFE013B84FFFF2938FFFF2938FFFF2938FFFF2938FFFF2938FF4D +S31AFE013B99FF28B0FFFF28B0FFFF28D4FFFF28F8FFFF28F8FFFF31 +S31AFE013BAE2938FFFF2938FFFF2938FFFF2938FFFF291CFFFF2915 +S31AFE013BC338FFFF2938FFFF2938FFFF2938FFFF2938FFFF2938D5 +S31AFE013BD8FFFF2938FFFF2938FFFF2938FFFF2938FFFF2938FFF9 +S31AFE013BEDFF2938FFFF2938FFFF2938FFFF2938FFFF2938FFFFE4 +S31AFE013C022938FFFF2938FFFF2938FFFF2938FFFF2938FFFF29A4 +S31AFE013C1738FFFF2938FFFF2938FFFF2938FFFF2938FFFF293880 +S31AFE013C2CFFFF2938FFFF2938FFFF2938FFFF2938FFFF2938FFA4 +S31AFE013C41FF286CFFFF286CFFFF286CFFFF286CFFFF286CFFFF90 +S31AFE013C56286CFFFF286CFFFF286CFFFF286CFFFF286CFFFF2852 +S31AFE013C6B6CFFFF286CFFFF286CFFFF286CFFFF286CFFFF286CF9 +S31AFE013C80FFFF288CFFFF28ACFFFF28CCFFFF28ECFFFF290CFF70 +S31AFE013C95FF2970FFFF2970FFFF2970FFFF2970FFFF292CFFFF67 +S31AFE013CAA294CFFFF294CFFFF294CFFFF294CFFFF294CFFFF2998 +S31AFE013CBF4CFFFF294CFFFF294CFFFF294CFFFF294CFFFF294C60 +S31AFE013CD4FFFF294CFFFF294CFFFF294CFFFF294CFFFF294CFF98 +S31AFE013CE9FF294CFFFF294CFFFF294CFFFF294CFFFF294CFFFF83 +S31AFE013CFE294CFFFF294CFFFF294CFFFF294CFFFF294CFFFF2944 +S31AFE013D134CFFFF294CFFFF294CFFFF294CFFFF294CFFFF294C0B +S31AFE013D283031323334353637383961626364656600000000001F +S31AFE013D3D000000503031004F4B000065436F7320474442207317 +S31AFE013D5274756273205B7769746820526564426F6F745D202DE9 +S31AFE013D67206275696C74204F63742032372032303030202F20E2 +S31AFE013D7C30373A33393A343100000000453031004530330045EE +S31AFE013D9130320042303100FFFF3F54FFFF47BCFFFF3FF8FFFF4E +S31AFE013DA6467CFFFF44CCFFFF47BCFFFF47BCFFFF47BCFFFF41F1 +S31AFE013DBB84FFFF464CFFFF47BCFFFF47BCFFFF47BCFFFF47BCD6 +S31AFE013DD0FFFF4280FFFF47BCFFFF47BCFFFF4184FFFF3FDCFF3C +S31AFE013DE5FF47BCFFFF44CCFFFF4664FFFF47BCFFFF47BCFFFF0C +S31AFE013DFA47BCFFFF427CFFFF47BCFFFF47BCFFFF47BCFFFF47A8 +S31AFE013E0FBCFFFF47BCFFFF47BCFFFF47BCFFFF47BCFFFF47BCD8 +S31AFE013E24FFFF4748FFFF44CCFFFF3F98FFFF47BCFFFF47BCFF13 +S31AFE013E39FF3FE8FFFF47BCFFFF47BCFFFF47BCFFFF462CFFFFD8 +S31AFE013E4E47BCFFFF4198FFFF47BCFFFF47BCFFFF47BCFFFF3F40 +S31AFE013E63D0FFFF4644FFFF44CC00000000303132333435363743 +S31AFE013E7838396162636465660000000030313233343536373896 +S31AFE013E8D3941424344454600000000FFFF6718FFFF6718FFFF55 +S31AFE013EA26718FFFF6718FFFF6718FFFF6718FFFF6718FFFF672E +S31AFE013EB718FFFF6718FFFF6718FFFF6718FFFF6718FFFF671868 +S31AFE013ECCFFFF6718FFFF6718FFFF6718FFFF6658FFFF6658FFEE +S31AFE013EE1FF668CFFFF66C0FFFF66C0FFFF6718FFFF6718FFFF96 +S31AFE013EF66718FFFF6718FFFF66F4FFFF6718FFFF6718FFFF67FF +S31AFE013F0B18FFFF6718FFFF6718FFFF6718FFFF6718FFFF671813 +S31AFE013F20FFFF6718FFFF6718FFFF6718FFFF6718FFFF6718FF17 +S31AFE013F35FF6718FFFF6718FFFF6718FFFF6718FFFF6718FFFF02 +S31AFE013F4A6718FFFF6718FFFF6718FFFF6718FFFF6718FFFF6785 +S31AFE013F5F18FFFF6718FFFF6718FFFF6718FFFF6718FFFF6718BF +S31AFE013F74FFFF6718FFFF6718FFFF6718FFFF66CCFFFF66CCFF5D +S31AFE013F89FF66CCFFFF66CCFFFF66CCFFFF66CCFFFF66CCFFFF2F +S31AFE013F9E66CCFFFF66CCFFFF66CCFFFF66CCFFFF66CCFFFF66B3 +S31AFE013FB3CCFFFF66CCFFFF66CCFFFF66CCFFFF66F4FFFF6718C3 +S31AFE013FC8FFFF673CFFFF6760FFFF6784FFFF67F0FFFF67F0FFE7 +S31AFE013FDDFF67F0FFFF67F0FFFF67A8FFFF67C8FFFF67C8FFFFBA +S31AFE013FF267C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8FFFF676D +S31AFE014007C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8F6 +S31AFE01401CFFFF67C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8FFAA +S31AFE014031FF67C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8FFFF95 +S31AFE01404667C8FFFF67C8FFFF67C8FFFF67C8FFFF67C8FFFF6718 +S31AFE01405BC8FFFF67C8FFFF67C8FFFF67C8FFFF6748FFFF6748A2 +S31AFE014070FFFF6748FFFF6748FFFF6748FFFF6748FFFF6748FFD6 +S31AFE014085FF6748FFFF6748FFFF6748FFFF6748FFFF6748FFFFC1 +S31AFE01409A6748FFFF6748FFFF6748FFFF6748FFFF6770FFFF671C +S31AFE0140AF90FFFF67B0FFFF67D0FFFF67F0FFFF6858FFFF68584C +S31AFE0140C4FFFF6858FFFF6858FFFF6810FFFF6830FFFF6830FFC5 +S31AFE0140D9FF6830FFFF6830FFFF6830FFFF6830FFFF6830FFFFE0 +S31AFE0140EE6830FFFF6830FFFF6830FFFF6830FFFF6830FFFF6862 +S31AFE01410330FFFF6830FFFF6830FFFF6830FFFF6830FFFF683084 +S31AFE014118FFFF6830FFFF6830FFFF6830FFFF6830FFFF6830FFA0 +S31AFE01412DFF6830FFFF6830FFFF6830FFFF6830FFFF6830FFFF8B +S31AFE0141426830FFFF6830FFFF6830FFFF6830FFFF67B0FFFF678F +S31AFE014157B0FFFF67B0FFFF67B0FFFF67B0FFFF67B0FFFF67B035 +S31AFE01416CFFFF67B0FFFF67B0FFFF67B0FFFF67B0FFFF67B0FFD1 +S31AFE014181FF67B0FFFF67B0FFFF67B0FFFF67B0FFFF67D8FFFF94 +S31AFE01419667F8FFFF6818FFFF6838FFFF6858FFFF68A0FFFF686A +S31AFE0141ABA0FFFF68A0FFFF68A0FFFF68A0FFFF6878FFFF68788C +S31AFE0141C0FFFF6878FFFF6878FFFF6878FFFF6878FFFF6878FF90 +S31AFE0141D5FF6878FFFF6878FFFF6878FFFF6878FFFF6878FFFF7B +S31AFE0141EA6878FFFF6878FFFF6878FFFF6878FFFF6878FFFF68FD +S31AFE0141FF78FFFF6878FFFF6878FFFF6878FFFF6878FFFF6878D8 +S31AFE014214FFFF6878FFFF6878FFFF6878FFFF6878FFFF6878FF3B +S31AFE014229FF6878FFFF6878FFFF6878FFFF6878FFFF67FCFFFFA3 +S31AFE01423E6840FFFF67FCFFFF6840FFFF67FCFFFF6840FFFF674B +S31AFE014253FCFFFF6840FFFF67FCFFFF6840FFFF67FCFFFF6840A1 +S31AFE014268FFFF67FCFFFF6840FFFF67FCFFFF6840FFFF6840FF89 +S31AFE01427DFF6840FFFF6840FFFF6840FFFF6840FFFF6840FFFFEA +S31AFE0142926840FFFF6840FFFF6840FFFF6840FFFF6840FFFF686C +S31AFE0142A740FFFF6840FFFF6840FFFF6840FFFF6840FFFF68407F +S31AFE0142BCFFFF6840FFFF6840FFFF6840FFFF6840FFFF6840FFAB +S31AFE0142D1FF6840FFFF6840FFFF6840FFFF6840FFFF6840FFFF96 +S31AFE0142E66840FFFF6840FFFF6840FFFF6840FFFF6840FFFF6818 +S31AFE0142FB40FFFF6840FFFF6840FFFF6840FFFF6840FFFF68402B +S31AFE014310FFFF6840FFFF6840FFFF6840FFFF6840FFFF6858FF3E +S31AFE014325FF6858FFFF6858FFFF6858FFFF6858FFFF6858FFFFC9 +S31AFE01433A6858FFFF6858FFFF6858FFFF6858FFFF6858FFFF684B +S31AFE01434F58FFFF6858FFFF6858FFFF6858FFFF6858FFFF679807 +S31AFE014364FFFF6798FFFF67CCFFFF6800FFFF6800FFFF6858FF88 +S31AFE014379FF6858FFFF6858FFFF6858FFFF6834FFFF6858FFFF99 +S31AFE01438E6858FFFF6858FFFF6858FFFF6858FFFF6858FFFF68F7 +S31AFE0143A358FFFF6858FFFF6858FFFF6858FFFF6858FFFF6858F2 +S31AFE0143B8FFFF6858FFFF6858FFFF6858FFFF6858FFFF6858FF36 +S31AFE0143CDFF6858FFFF6858FFFF6858FFFF6858FFFF6858FFFF21 +S31AFE0143E26858FFFF6858FFFF6858FFFF6858FFFF6858FFFF68A3 +S31AFE0143F758FFFF6858FFFF6858FFFF6858FFFF68583031323396 +S31AFE01440C3435363738390000303132333435363738396162631C +S31AFE0144216465660000000030313233343536373839414243443B +S31AFE01443645460000000000000000FFFF7240FFFF73F0FFFF735F +S31AFE01444BF0FFFF73F0FFFF73F0FFFF73F0FFFF73F0FFFF73F082 +S31AFE014460FFFF73F0FFFF73F0FFFF73F0FFFF7384FFFF7240FF7B +S31AFE014475FF73F0FFFF73F0FFFF73F0FFFF73F0FFFF73F0FFFF49 +S31AFE01448A73F0FFFF73F0FFFF73F0FFFF73F0FFFF73F0FFFF73C0 +S31AFE01449FF0FFFF7220FFFF73F0FFFF73F0FFFF7318FFFF73F0D7 +S31AFE0144B4FFFF73F0FFFF73F0FFFF73F0FFFF7240000000005EBD +S31AFE0144C9430A003078253038583A2000000000253032580000C6 +S31AFE0144DE00002020000020000000207C0000256300007C0A00BA +S31AFE0144F300202D2061726520796F7520737572652028792F6E50 +S31AFE014508293F2000556E62616C616E63656420737472696E676D +S31AFE01451D210A00416D626967756F757320636F6D6D616E64208E +S31AFE014532272573272C2063686F69636573206172653A20257315 +S31AFE01454700202573000A00000055736167653A0A002020257387 +S31AFE01455C25732025730A00002A2A204572726F723A202573205B +S31AFE014571616C7265616479207370656369666965640A002A2A24 +S31AFE014586204572726F723A20696E76616C6964206E756D626579 +S31AFE01459B72202725732720666F722025730A0000002A2A2045AC +S31AFE0145B072726F723A20696E76616C696420666C6167202725C5 +S31AFE0145C563270A000000002A2A204572726F723A206E6F20640F +S31AFE0145DA656661756C742F6E6F6E2D666C616720617267756DC9 +S31AFE0145EF656E747320737570706F727465640A00004E455441C0 +S31AFE01460453434949000000004F43544554000000556E6B6E6FEA +S31AFE014619776E206572726F7200000066696C65206E6F742066C1 +S31AFE01462E6F756E6400006163636573732076696F6C6174696FC3 +S31AFE0146436E000000006469736B2066756C6C206F7220616C6C17 +S31AFE0146586F636174696F6E20657863656564656400000000699B +S31AFE01466D6C6C6567616C2054465450206F7065726174696F6E73 +S31AFE0146820000756E6B6E6F776E207472616E73666572204944DC +S31AFE0146970066696C6520616C72656164792065786973747300A7 +S31AFE0146AC6E6F20737563682075736572000000006F706572614E +S31AFE0146C174696F6E2074696D6564206F757400736F6D65207333 +S31AFE0146D66F7274206F66206E6574776F726B206572726F72000C +S31AFE0146EB00696E76616C696420706172616D65746572000000ED +S31AFE01470070726F746F636F6C2076696F6C6174696F6E000066D2 +S31AFE014715696C65206973206C6172676572207468616E206275F5 +S31AFE01472A666665720000FFFF8BD4FFFF8BE0FFFF8BECFFFF8B0E +S31AFE01473FF8FFFF8C04FFFF8C10FFFF8C1CFFFF8C28FFFF8C342A +S31AFE014754FFFF8C40FFFF8C4CFFFF8C5847444220636F6E6E65C9 +S31AFE0147696374696F6E20706F7274006764625F706F72740000E3 +S31AFE01477E00004E6574776F726B20646562756720617420626F2A +S31AFE0147936F742074696D6500006E65745F6465627567000000AD +S31AFE0147A855736520424F4F545020666F72206E6574776F726B95 +S31AFE0147BD20636F6E66696775726174696F6E00626F6F74700026 +S31AFE0147D200004C6F63616C204950206164647265737300000023 +S31AFE0147E700626F6F74705F6D795F69700044656661756C742032 +S31AFE0147FC736572766572204950206164647265737300000062EB +S31AFE0148116F6F74705F7365727665725F69700025732E25640A44 +S31AFE01482600006E65745F696F5F7772697465000000006E657429 +S31AFE01483B5F696F5F726561640000000000FFFF9084FFFF90840D +S31AFE014850FFFF9084FFFF9084FFFF9084FFFF9084FFFF9084FFF5 +S31AFE014865FF9084FFFF9084FFFF9084FFFF9084FFFF9084FFFFE0 +S31AFE01487A9084FFFF9084FFFF9084FFFF9084FFFF90B0FFFF900E +S31AFE01488FD0FFFF90F0FFFF9110FFFF9130FFFF9354FFFF935499 +S31AFE0148A4FFFF9354FFFF9354FFFF9150FFFF9170FFFF9170FF54 +S31AFE0148B9FF9170FFFF9170FFFF9170FFFF9170FFFF9170FFFFEB +S31AFE0148CE9170FFFF9170FFFF9170FFFF9170FFFF9170FFFF9144 +S31AFE0148E370FFFF9170FFFF9170FFFF9170FFFF9170FFFF917050 +S31AFE0148F8FFFF9170FFFF9170FFFF9170FFFF9170FFFF9170FFAC +S31AFE01490DFF9170FFFF9170FFFF9170FFFF9170FFFF9170FFFF96 +S31AFE0149229170FFFF9170FFFF9170FFFF9170FFFF9108FFFF9157 +S31AFE01493708FFFF9108FFFF9108FFFF9108FFFF9108FFFF91086B +S31AFE01494CFFFF9108FFFF9108FFFF9108FFFF9108FFFF9108FF5F +S31AFE014961FF9108FFFF9108FFFF9108FFFF9108FFFF9134FFFF1E +S31AFE0149769158FFFF917CFFFF91A0FFFF91C4FFFF926CFFFF9225 +S31AFE01498B6CFFFF926CFFFF926CFFFF91E8FFFF9208FFFF920807 +S31AFE0149A0FFFF9208FFFF9208FFFF9208FFFF9208FFFF9208FF06 +S31AFE0149B5FF9208FFFF9208FFFF9208FFFF9208FFFF9208FFFFF1 +S31AFE0149CA9208FFFF9208FFFF9208FFFF9208FFFF9208FFFF9249 +S31AFE0149DF08FFFF9208FFFF9208FFFF9208FFFF9208FFFF9208BE +S31AFE0149F4FFFF9208FFFF9208FFFF9208FFFF9208FFFF9208FFB2 +S31AFE014A09FF9208FFFF9208FFFF9208FFFF92084E6F206E65740E +S31AFE014A1E776F726B20696E746572666163657320666F756E643B +S31AFE014A330A0000000043616E27742067657420424F4F5450208E +S31AFE014A48696E666F202D206E6574776F726B2064697361626CA2 +S31AFE014A5D6564210A00000049503A20257300002C204465666104 +S31AFE014A72756C74207365727665723A2025730A00000000000022 +S31AFE014A870025642E25642E25642E25640045746865726E657428 +S31AFE014A9C2073656E643A0A0045746865726E65742072656376E3 +S31AFE014AB13A0A006574685F6472765F6473722073686F756C6464 +S31AFE014AC6206E6F742062652063616C6C65643A20766563746F7E +S31AFE014ADB722025642C20646174612025780A00000000000000F9 +S31AFE014AF02E2E2E2045726173652066726F6D2025702D25703A8D +S31AFE014B052000002E0000000A0000002E2E2E2050726F67726129 +S31AFE014B1A6D2066726F6D2025702D25702061742025703A2000C5 +S31AFE014B2F004E6F206572726F72202D206F7065726174696F6E27 +S31AFE014B4420636F6D706C657465000000496E76616C69642046B1 +S31AFE014B594C41534820616464726573730000004572726F7220EA +S31AFE014B6E747279696E6720746F20657261736500000045727234 +S31AFE014B836F7220747279696E6720746F206C6F636B2F756E6C30 +S31AFE014B986F636B004572726F7220747279696E6720746F20706C +S31AFE014BAD726F6772616D0047656E65726963206572726F72005F +S31AFE014BC200004465766963652F726567696F6E206973207772D1 +S31AFE014BD76974652D70726F74656374656400000000464C415365 +S31AFE014BEC48207375622D73797374656D206E6F7420696E6974E6 +S31AFE014C0169616C697A656400000000556E6B6E6F776E206572D0 +S31AFE014C16726F7200000000000000FFFFA2E4FFFFA2F0FFFFA27D +S31AFE014C2BFCFFFFA308FFFFA314FFFFA320FFFFA32CFFFFA338AE +S31AFE014C40457272203D2025780A000000000000004672616D691E +S31AFE014C556E67206572726F72202D20626C6B3A2025782F2578BD +S31AFE014C6A2F25780A0000435243206572726F72202D2072656391 +S31AFE014C7F76643A2025303278253032782C20636F6D70757465A0 +S31AFE014C94643A2025780A0000436865636B73756D206572726F96 +S31AFE014CA972202D2072656376643A2025782C20636F6D70757423 +S31AFE014CBE65643A2025780A00000043616E277420616363657346 +S31AFE014CD3732066696C65000000536F7272792C207A4D6F64652A +S31AFE014CE86D206E6F7420617661696C61626C652079657400544D +S31AFE014CFD696D6564206F7574000000456E64206F662066696C1F +S31AFE014D12650043616E63656C6C6564000000496E76616C6964E0 +S31AFE014D27206672616D696E67004352432F636865636B73756D14 +S31AFE014D3C206572726F720000426C6F636B2073657175656E6314 +S31AFE014D5165206572726F7200000000556E6B6E6F776E206572B2 +S31AFE014D66726F7200000000000000FFFFAC7CFFFFAC70FFFFACF6 +S31AFE014D7B64FFFFAC58FFFFAC4CFFFFAC40FFFFAC34FFFFAC2828 +S31AFE014D90FFFFB028FFFFB028FFFFB020FFFFAFB8FFFFB020FF5D +S31AFE014DA5FFAFC0FFFFAFF8FFFFB000FFFFB010FFFFB010FFFFB9 +S31AFE014DBAB008FFFFB018FFFFAFF8FFFFB030FFFFB010FFFFB072 +S31AFE014DCF18FFFFB018FFFFB020FFFFB028FFFFB030FFFFB0308C +S31AFE014DE4FFFFB030FFFFB030FFFFB030FFFFB030FFFFB030FF60 +S31AFE014DF9FFB018FFFFB018FFFFB018FFFFB018FFFFB600FFFFD5 +S31AFE014E0EB600FFFFB600FFFFB600FFFFB600FFFFB600FFFFB650 +S31AFE014E2300FFFFB600FFFFB600FFFFB600FFFFB600FFFFB600F1 +S31AFE014E38FFFFB600FFFFB600FFFFB600FFFFB600FFFFB620FFBD +S31AFE014E4DFFB640FFFFB660FFFFB680FFFFB6A0FFFFB6FCFFFF0C +S31AFE014E62B6FCFFFFB6FCFFFFB6FCFFFFB6C0FFFFB6E0FFFFB668 +S31AFE014E77E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E05D +S31AFE014E8CFFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FF29 +S31AFE014EA1FFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFF14 +S31AFE014EB6B6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB648 +S31AFE014ECBE0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E009 +S31AFE014EE0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB6E0FFFFB650FF65 +S31AFE014EF5FFB650FFFFB650FFFFB650FFFFB650FFFFB650FFFF90 +S31AFE014F0AB650FFFFB650FFFFB650FFFFB650FFFFB650FFFFB6C3 +S31AFE014F1F50FFFFB650FFFFB650FFFFB650FFFFB650FFFFB670F4 +S31AFE014F34FFFFB694FFFFB6B8FFFFB6DCFFFFB700FFFFB798FF1E +S31AFE014F49FFB798FFFFB798FFFFB798FFFFB724FFFFB744FFFF96 +S31AFE014F5EB744FFFFB744FFFFB744FFFFB744FFFFB744FFFFB7A5 +S31AFE014F7344FFFFB744FFFFB744FFFFB744FFFFB744FFFFB74403 +S31AFE014F88FFFFB744FFFFB744FFFFB744FFFFB744FFFFB744FF33 +S31AFE014F9DFFB744FFFFB744FFFFB744FFFFB744FFFFB744FFFF1E +S31AFE014FB2B744FFFFB744FFFFB744FFFFB744FFFFB744FFFFB751 +S31AFE014FC744FFFFB744FFFFB744FFFFB744FFFFB74425733A20B6 +S31AFE014FDC43616E27742066696E642061646472657373206F6652 +S31AFE014FF1207365727665720A0000005F5F7564705F73656E64D5 +S31AFE015006746F000000007564705F7265637666726F6D202D2034 +S31AFE01501B64726F70706564207061636B6574206F662025642037 +S31AFE01503062797465730A00004275665B25645D2F25703A206257 +S31AFE01504575663A2025702C206C656E3A2025642F25642C206EA7 +S31AFE01505A6578743A2025700A000046726565206C697374203D37 +S31AFE01506F2025700A005F5F656E65745F706F6C6C3A206E6F2091 +S31AFE0150846D6F726520627566666572730A00000000000000FF49 +S31AFE015099FFCC34FFFFCC8CFFFFCF08FFFFCCE0FFFFCCE0FFFF81 +S317FE0150AECD88FFFFCDC8FFFFCE64FFFFCEA8FFFFCEE8AB +S31AFE0150C0000000007C2F2D5C7C2D00005B2D725D205B2D765D27 +S31AFE0150D5205B2D68203C686F73743E5D205B2D6D207B5446545E +S31AFE0150EA50207C2078797A4D4F44454D7D5D205B2D62203C6221 +S31AFE0150FF6173655F616464726573733E5D203C66696C655F6EB5 +S31AFE015114616D653E000000000000337400007C20FE012B98000B +S31AFE0151290000000000000000000000FE005B8CFE005BA4FE008C +S31AFE01513E5B7CFE005B64FE0059F4FE0058A8FE005FA0FE005728 +S31AFE01515368FE005760000037340000000008003E2879B800001B +S31AFE015168FE0060B4FE00B218FE00B218FE00B218FE00B218FEFD +S31AFE01517D00B218FE00B218FE00B218FE00B218FE00B218FE0030 +S31AFE015192B218FE00B218FE00B218FE00B218FE00B218FE00B269 +S31AFE0151A718FE00B218FE00B218FE00B218FE00B218FE00B218EE +S31AFE0151BCFE00B218FE00B218FE00B218FE00B218FE00B218FEF3 +S31AFE0151D100B218FE00B218FE00B218FE00B218FE00B218FE00DC +S31AFE0151E6B218FE00B218FE00B218FE00B218FE00B218FE00B215 +S31AFE0151FB18FE00B218FE00B218FE00B218FE00B218FE00B2189A +S31AFE015210FE00B218FE00B218FE00B218FE00B218FE00B218FE9E +S31AFE01522500B218FE00B218FE00B218FE00B218FE00B218FE0087 +S31AFE01523AB218FE00B218FE00B218FE00B218FE00B218FE00B2C0 +S31AFE01524F18FE00B2180000000000000000000000000000000065 +S31AFE01526400000000000000000000000000000000000000000030 +S31AFE0152790000000000000000000000000000000000000000001B +S31AFE01528E00000000000000000000000000000000000000000006 +S31AFE0152A3000000000000000000000000000000000000000000F1 +S31AFE0152B8000000000000000000000000000000000000000000DC +S31AFE0152CD000000000000000000000000000000000000000000C7 +S31AFE0152E2000000000000000000000000000000000000000000B2 +S31AFE0152F70000000000000000000000000000000000000000009D +S31AFE01530C00000000000000000000000000000000000000000087 +S31AFE01532100000000000000000000000000000000000000000072 +S31AFE0153360000000000000000000000000000000000000000005D +S31AFE01534B00000000000000000000000000000000000000000048 +S31AFE01536000000000000000000000000000000000000000000033 +S31AFE0153750000000000000000000000000000000000000000001E +S31AFE01538A00000000000000000000000000000000000000000009 +S31AFE01539F000000000000000000000000000000000000000000F4 +S31AFE0153B4000000000000000000000000000000000000000000DF +S31AFE0153C9000000000000000000000000000000000000000000CA +S31AFE0153DE000000000000000000000000000000000000000000B5 +S31AFE0153F3000000000000000000000000000000000000000000A0 +S31AFE0154080000000000000000000000000000000000000000008A +S31AFE01541D000000000000000000000000000000FE000000FE0079 +S31AFE01543200000040000000000000FF000000FF00000000100012 +S31AFE0154470001000000FA100000FA100000000000040100000031 +S31AFE01545C000000000000000000800000000000000000000000B6 +S31AFE01547100000000000000000000000000000000000000FE0023 +S31AFE01548685D8FE008634000000000000000000000000FFFFFFFA +S31AFE01549BFF0000000000000000FE0096800000000000000000E4 +S31AFE0154B00001235000000000000000000000000000000000006E +S31AFE0154C5000000FFFFFFFEFFFFFFFE0000000000001E140000A5 +S31AFE0154DA1E14000001F400000000000000000000000000000091 +S31AFE0154EF0000000000FE00E440FE00E8E8FE00E6D400001021CA +S31AFE01550420423063408450A560C670E781089129A14AB16BC157 +S31AFE0155198CD1ADE1CEF1EF123102103273225252B5429472F72B +S31AFE01552E62D693398318B37BA35AD3BDC39CF3FFE3DE2462343D +S31AFE015543430420140164E674C744A45485A56AB54B8528950932 +S31AFE015558E5EEF5CFC5ACD58D365326721611063076D766F65652 +S31AFE01556D9546B4B75BA77A97198738F7DFE7FED79DC7BC48C435 +S31AFE01558258E5688678A70840186128023823C9CCD9EDE98EF9B4 +S31AFE015597AF89489969A90AB92B5AF54AD47AB76A961A710A505E +S31AFE0155AC3A332A12DBFDCBDCFBBFEB9E9B798B58BB3BAB1A6C5C +S31AFE0155C1A67C874CE45CC52C223C030C601C41EDAEFD8FCDECA0 +S31AFE0155D6DDCDAD2ABD0B8D689D497E976EB65ED54EF43E132E6A +S31AFE0155EB321E510E70FF9FEFBEDFDDCFFCBF1BAF3A9F598F78F3 +S31AFE015600918881A9B1CAA1EBD10CC12DF14EE16F108000A1308B +S31AFE015615C220E3500440257046606783B99398A3FBB3DAC33DEE +S31AFE01562AD31CE37FF35E02B1129022F332D2423552146277722E +S31AFE01563F56B5EAA5CB95A88589F56EE54FD52CC50D34E224C33A +S31AFE01565414A004817466644754244405A7DBB7FA879997B8E734 +S31AFE0156695FF77EC71DD73C26D336F2069116B0665776764615DA +S31AFE01567E5634D94CC96DF90EE92F99C889E9B98AA9AB584448C0 +S31AFE015693657806682718C008E1388228A3CB7DDB5CEB3FFB1E83 +S31AFE0156A88BF99BD8ABBBBB9A4A755A546A377A160AF11AD02A89 +S31AFE0156BDB33A92FD2EED0FDD6CCD4DBDAAAD8B9DE88DC97C26AE +S31AFE0156D26C075C644C453CA22C831CE00CC1EF1FFF3ECF5DDF4E +S31AFE0156E77CAF9BBFBA8FD99FF86E177E364E555E742E933EB20C +S31AFE0156FC0ED11EF0000000000000000000000000000003E800BC +S31AFE0157110000000000000000000000000000000000000000007E +S31AFE01572600000000000000000000000000000000000000000069 +S31AFE01573B00000000000000000000000000FE013160FE01315044 +S31AFE015750FE0130E0FE003E38FE013074FE013044FE01303CFE3D +S31AFE015765003A5CFE013034FE01301CFE013000FE003C60FE011E +S31AFE01577A2FF8FE012FB4FE012FB0FE004534FE012F68FE012FF3 +S31AFE01578F44FE012F3CFE004794FE012FA8FE012F78FE012F705F +S31AFE0157A4FE004644FE0130D8FE0130A4FE01307CFE0038A8FE02 +S31AFE0157B901299CFE012984FE012978FE002864FE012970FE01A3 +S31AFE0157CE2948FE01292CFE002A54FE012EFCFE012EE8FE012E15 +S31AFE0157E3E0FE003714FE012F34FE012F08FE012F00FE002F7020 +S31AFE0157F8FE012928FE01290CFE0128F4FE002B4CFE0128ECFE72 +S31AFE01580D0128D8FE0128D0FE0029E0FE012BE4FE012BD8000072 +S31AFE015822330CFE004C4CFE013810FE0137FC000000000000001E +S31AFE015837010000000100000000FE013828FE01381CFE0138105C +S31AFE01584C000000010000000400000000FE013864FE01383CFE31 +S31AFE015861013810000000010000000200000000FE0147CCFE01D0 +S31AFE01587647A800000000000000010000000100000000FE0147E1 +S31AFE01588BE8FE0147D4FE0147CC000000000000000500000000EA +S31AFE0158A0FE014810FE0147F4FE0147CC00000000000000050046 +S31AFE0158B5000000FE014774FE0147600000000000000001000078 +S31AFE0158CA000200000000FE01479CFE014780000000000000001A +S31AFE0158DF010000000100000000FE002CE800000000FE00DFA816 +S31AFE0158F400000000FE012BA0FE005BBC0000335C000000004EDE +S314FE015909800021000000000000000000000000E9 S705FE000100FB diff --git a/packages/hal/powerpc/mbx/current/misc/redboot_ROM.cfg b/packages/hal/powerpc/mbx/current/misc/redboot_ROM.cfg --- a/packages/hal/powerpc/mbx/current/misc/redboot_ROM.cfg +++ b/packages/hal/powerpc/mbx/current/misc/redboot_ROM.cfg @@ -49,12 +49,6 @@ cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SU inferred_value 0 }; -cdl_component CYGBLD_BUILD_REDBOOT { - user_value 1 -}; - - - cdl_option CYGSEM_HAL_ROM_MONITOR { user_value 1 }; @@ -62,3 +56,9 @@ cdl_option CYGSEM_HAL_ROM_MONITOR { cdl_component CYG_HAL_STARTUP { user_value ROM }; + +cdl_component CYGBLD_BUILD_REDBOOT { + user_value 1 +}; + + diff --git a/packages/hal/powerpc/ppc40x/current/ChangeLog b/packages/hal/powerpc/ppc40x/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/ChangeLog @@ -0,0 +1,25 @@ +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/powerpc/ppc40x/current/cdl/hal_powerpc_ppc40x.cdl b/packages/hal/powerpc/ppc40x/current/cdl/hal_powerpc_ppc40x.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/cdl/hal_powerpc_ppc40x.cdl @@ -0,0 +1,82 @@ +# ==================================================================== +# +# hal_powerpc_ppc40x.cdl +# +# PowerPC/PPC40x variant 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): jskov +# Contributors: gthomas +# Date: 2000-08-27 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_POWERPC_PPC40x { + display "PowerPC 40x variant HAL" + parent CYGPKG_HAL_POWERPC + hardware + include_dir cyg/hal + define_header hal_powerpc_ppc40x.h + description " + The PowerPC 40x variant HAL package provides generic support + for this processor variant. It is also necessary to + select a specific target platform HAL package." + + # Note: This should be sub-variant specific to reduce memory use. + define_proc { + puts $cdl_header "#define CYGHWR_HAL_VSR_TABLE (CYGHWR_HAL_POWERPC_VECTOR_BASE + 0x3000)" + puts $cdl_header "#define CYGHWR_HAL_VIRTUAL_VECTOR_TABLE (CYGHWR_HAL_VSR_TABLE + 0x200)" + } + + cdl_component CYGPKG_HAL_POWERPC_PPC403 { + display "PowerPC 403 microprocessor" + default_value 1 + implements CYGINT_HAL_POWERPC_VARIANT + description " + The PowerPC 403 microprocessor." + + cdl_option CYGHWR_HAL_POWERPC_FPU { + display "Variant FPU support" + calculated 1 + } + + cdl_option CYGPKG_HAL_POWERPC_MSBFIRST { + display "CPU Variant big-endian" + calculated 1 + } + } + + define_proc { + puts $::cdl_header "#include " + } + + compile var_intr.c var_misc.c variant.S +} diff --git a/packages/hal/powerpc/ppc40x/current/include/var_cache.h b/packages/hal/powerpc/ppc40x/current/include/var_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/include/var_cache.h @@ -0,0 +1,192 @@ +#ifndef CYGONCE_VAR_CACHE_H +#define CYGONCE_VAR_CACHE_H +//============================================================================= +// +// var_cache.h +// +// Variant 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): nickg +// Contributors:nickg, jskov +// Date: 2000-04-02 +// Purpose: Variant cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations on the PPC60x variant CPUs. +// Usage: Is included via the architecture cache header: +// #include +// ... +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include + +#include + +#include + + +//----------------------------------------------------------------------------- +// Cache dimensions + +// Data cache +#define HAL_DCACHE_SIZE 8192 // Size of data cache in bytes +#define HAL_DCACHE_LINE_SIZE 16 // Size of a data cache line +#define HAL_DCACHE_WAYS 2 // Associativity of the cache + +// Instruction cache +#define HAL_ICACHE_SIZE 16384 // Size of cache in bytes +#define HAL_ICACHE_LINE_SIZE 16 // Size of a cache line +#define HAL_ICACHE_WAYS 2 // Associativity of the cache + +#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) +#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) + +//----------------------------------------------------------------------------- +// Global control of data cache + +// Enable the data cache - this is implicit whenever the MMU is turned on +#define HAL_DCACHE_ENABLE() + +// Disable the data cache +#define HAL_DCACHE_DISABLE() + +// Invalidate the entire cache +#define HAL_DCACHE_INVALIDATE_ALL() \ + CYG_MACRO_START \ + int _i_, _indx_; \ + _indx_ = 0; \ + for (_i_ = 0; _i_ < HAL_DCACHE_SETS; _i_++) { \ + asm volatile ("dccci 0,%0;" :: "r"(_indx_)); \ + _indx_ += HAL_DCACHE_LINE_SIZE; \ + } \ + CYG_MACRO_END + +// Synchronize the contents of the cache with memory. +#define HAL_DCACHE_SYNC() + +// Query the state of the data cache +#define HAL_DCACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + (_state_) = 0; \ + CYG_MACRO_END + +// Set the data cache refill burst size +//#define HAL_DCACHE_BURST_SIZE(_size_) + +// Set the data cache write mode +//#define HAL_DCACHE_WRITE_MODE( _mode_ ) + +//#define HAL_DCACHE_WRITETHRU_MODE 0 +//#define HAL_DCACHE_WRITEBACK_MODE 1 + +// 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_) + +// Undo a previous lock operation +//#define HAL_DCACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +#define HAL_DCACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Data cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +//#define HAL_DCACHE_FLUSH( _base_ , _size_ ) + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) + +// Write dirty cache lines to memory for the given address range. +//#define HAL_DCACHE_STORE( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_DCACHE_ZERO( _base_ , _size_ ) + +//----------------------------------------------------------------------------- +// Global control of Instruction cache + +// Enable the instruction cache +#define HAL_ICACHE_ENABLE() + +// Disable the instruction cache +#define HAL_ICACHE_DISABLE() + +// Invalidate the entire cache +#define HAL_ICACHE_INVALIDATE_ALL() + +// Synchronize the contents of the cache with memory. +#define HAL_ICACHE_SYNC() + +// Query the state of the instruction cache +#define HAL_ICACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + (_state_) = 0; \ + CYG_MACRO_END + +// Set the instruction cache refill burst size +//#define HAL_ICACHE_BURST_SIZE(_size_) + +// 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_) + +// Undo a previous lock operation +//#define HAL_ICACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +#define HAL_ICACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Instruction cache line control + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_CACHE_H +// End of var_cache.h diff --git a/packages/hal/powerpc/ppc40x/current/include/var_intr.h b/packages/hal/powerpc/ppc40x/current/include/var_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/include/var_intr.h @@ -0,0 +1,54 @@ +#ifndef CYGONCE_VAR_INTR_H +#define CYGONCE_VAR_INTR_H +//============================================================================= +// +// var_intr.h +// +// Variant 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): nickg +// Contributors:nickg, jskov, jlarmour, hmt +// Date: 2000-04-02 +// Purpose: Variant interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock on the PPC60x variant CPUs. +// Usage: Is included via the architecture interrupt header: +// #include +// ... +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +// No builtin interrupt controller in the PPC40x CPUs. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_INTR_H +// End of var_intr.h diff --git a/packages/hal/powerpc/ppc40x/current/include/var_regs.h b/packages/hal/powerpc/ppc40x/current/include/var_regs.h new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/include/var_regs.h @@ -0,0 +1,90 @@ +#ifndef CYGONCE_HAL_VAR_REGS_H +#define CYGONCE_HAL_VAR_REGS_H + +//========================================================================== +// +// var_regs.h +// +// PowerPC 40x variant CPU definitions +// +//========================================================================== +//####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): jskov +// Contributors: jskov,gthomas +// Date: 2000-08-27 +// Purpose: Provide PPC40x register definitions +// Description: Provide PPC40x register definitions +// The short difinitions (sans CYGARC_REG_) are exported only +// if CYGARC_HAL_COMMON_EXPORT_CPU_MACROS is defined. +// Usage: Included via the acrhitecture register header: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +//-------------------------------------------------------------------------- +// Cache +#define CYGARC_REG_HID0 1008 + +#ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS +#define HID0 CYGARC_REG_HID0 +#endif // ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS + +//-------------------------------------------------------------------------- +// MMU control. +#ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS + +#define EVPR 982 // Exception vector prefix +#define M_PID 945 // Process ID + +#define M_EPN_EPNMASK 0xfffff000 // effective page no mask +#define M_EPN_EV 0x00000040 // entry valid +#define M_EPN_SIZE(n) (n<<7) // entry size (0=1K, 1=4K, ... 7=16M) + +#define M_RPN_RPNMASK 0xfffff000 // real page no mask +#define M_RPN_EX 0x00000200 // execute enable +#define M_RPN_WR 0x00000100 // write enable +#define M_RPN_W 0x00000008 // write-through (when cache enabled) +#define M_RPN_I 0x00000004 // cache inhibited +#define M_RPN_M 0x00000002 // memory coherent (not implemented) +#define M_RPN_G 0x00000001 // guarded + +#define CYGARC_TLBWE(_id_, _hi_, _lo_) \ + asm volatile ("tlbwe %1,%0,0; tlbwe %2,%0,1" :: "r"(_id_), "r"(_hi_), "r"(_lo_)); + +#define CYGARC_TLBRE(_id_, _hi_, _lo_) \ + asm volatile ("tlbre %0,%2,0; tlbre %1,%2,1" : "=r"(_hi_), "=r"(_lo_) : "r"(_id_)); + +#endif // ifdef CYGARC_HAL_COMMON_EXPORT_CPU_MACROS + +//----------------------------------------------------------------------------- +#endif // ifdef CYGONCE_HAL_VAR_REGS_H +// End of var_regs.h diff --git a/packages/hal/powerpc/ppc40x/current/include/variant.inc b/packages/hal/powerpc/ppc40x/current/include/variant.inc new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/include/variant.inc @@ -0,0 +1,176 @@ +#ifndef CYGONCE_HAL_VARIANT_INC +#define CYGONCE_HAL_VARIANT_INC +##============================================================================= +## +## variant.inc +## +## PPC40x family assembler header file +## +##============================================================================= +#####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): jskov +## Contributors:jskov, gthomas +## Date: 2000-08-27 +## Purpose: MPCxxx family definitions. +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the PPC40x CPU family. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#undef CYG_MSR_COMMON +#define CYG_MSR_COMMON (MSR_ME | MSR_RI) + +#include + +##----------------------------------------------------------------------------- +## PPC40x defined vectors + + .macro hal_extra_vectors + .endm + +##----------------------------------------------------------------------------- +## PPC40x CPU initialization +## +## Initialize CPU to a post-reset state, ensuring the ground doesn''t +## shift under us while we try to set things up. + + .macro hal_cpu_init + # Set up MSR (disable MMU for now) + lwi r3,(CYG_MSR & ~(MSR_IR | MSR_DR)) + sync + mfmsr r4 + mtmsr r3 + sync + .endm + +##----------------------------------------------------------------------------- +## PPC40x monitor initialization + +#ifndef CYGPKG_HAL_PPC_MON_DEFINED + +#if defined(CYG_HAL_STARTUP_ROM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + + .macro hal_mon_init +#ifdef CYGSEM_HAL_POWERPC_COPY_VECTORS + # If we are starting up from ROM and want vectors in RAM + # or we are starting in RAM and NOT using a ROM monitor, + # copy exception handler code to 0. + lwi r3,rom_vectors # r3 = rom start + lwi r4,0 # r4 = ram start + lwi r5,rom_vectors_end # r5 = rom end + cmplw r3,r5 # skip if no vectors + beq 2f + + subi r3,r3,4 + subi r4,r4,4 + subi r5,r5,4 +1: + lwzu r0,4(r3) # get word from ROM + stwu r0,4(r4) # store in RAM + cmplw r3,r5 # compare + blt 1b # loop if not yet done +2: + + # Ensure that the vectors will come from 0x0000 + lwi r4,0 + mtspr EVPR,r4 +#endif + + # Next initialize the VSR table. This happens whether the + # vectors were copied to RAM or not. + + # First fill with exception handlers + lwi r3,cyg_hal_default_exception_vsr + lwi r4,hal_vsr_table + subi r4,r4,4 + li r5,CYGNUM_HAL_VSR_COUNT +1: stwu r3,4(r4) + subi r5,r5,1 + cmpwi r5,0 + bne 1b + + # Then fill in the special vectors + lwi r3,cyg_hal_default_interrupt_vsr + lwi r4,hal_vsr_table + stw r3,CYGNUM_HAL_VECTOR_INTERRUPT*4(r4) + stw r3,CYGNUM_HAL_VECTOR_DECREMENTER*4(r4) + .endm + +#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) + + # Initialize the VSR table entries + # We only take control of the interrupt vectors, + # the rest are left to the ROM for now... + + .macro hal_mon_init + lwi r3,cyg_hal_default_interrupt_vsr + lwi r4,hal_vsr_table + stw r3,CYGNUM_HAL_VECTOR_INTERRUPT*4(r4) + stw r3,CYGNUM_HAL_VECTOR_DECREMENTER*4(r4) + .endm + + +#else + + .macro hal_mon_init + + .endm + +#endif + + +#define CYGPKG_HAL_PPC_MON_DEFINED + +#endif // CYGPKG_HAL_PPC_MON_DEFINED + +##----------------------------------------------------------------------------- +## PPC40x exception state handling + .macro hal_variant_save regs + .endm + + .macro hal_variant_load regs + .endm + +##----------------------------------------------------------------------------- +## Indicate that the ISR tables are defined in variant.S + +#define CYG_HAL_PPC_ISR_TABLES_DEFINED + +#------------------------------------------------------------------------------ +#endif // ifndef CYGONCE_HAL_VARIANT_INC +# end of variant.inc diff --git a/packages/hal/powerpc/ppc40x/current/src/var_intr.c b/packages/hal/powerpc/ppc40x/current/src/var_intr.c new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/src/var_intr.c @@ -0,0 +1,55 @@ +//========================================================================== +// +// var_intr.c +// +// PowerPC variant interrupt handlers +// +//========================================================================== +//####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): jskov +// Contributors: jskov +// Date: 2000-02-11 +// Purpose: PowerPC variant interrupt handlers +// Description: This file contains code to handle interrupt related issues +// on the PowerPC variant. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include + +externC void +hal_variant_IRQ_init(void) +{ + // No special init required for 40x series. +} + +// ------------------------------------------------------------------------- +// EOF var_intr.c diff --git a/packages/hal/powerpc/ppc40x/current/src/var_misc.c b/packages/hal/powerpc/ppc40x/current/src/var_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/src/var_misc.c @@ -0,0 +1,136 @@ +//========================================================================== +// +// var_misc.c +// +// HAL implementation miscellaneous functions +// +//========================================================================== +//####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): jskov +// Contributors: jskov +// Date: 2000-02-04 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS +#include +#include + +#include + +//-------------------------------------------------------------------------- +void hal_variant_init(void) +{ +} + + +//-------------------------------------------------------------------------- +// Variant specific idle thread action. +bool +hal_variant_idle_thread_action( cyg_uint32 count ) +{ + // Let architecture idle thread action run + return true; +} + +//--------------------------------------------------------------------------- +// Use MMU resources to map memory regions. +// Takes and returns an int used to ID the MMU resource to use. This ID +// is increased as resources are used and should be used for subsequent +// invocations. +// +// The PPC4xx CPUs do not have BATs. Fortunately we don't currently +// use the MMU, so we can simulate BATs by using the TLBs. +int +cyg_hal_map_memory (int id, CYG_ADDRESS virt, CYG_ADDRESS phys, + cyg_int32 size, cyg_uint8 flags) +{ + cyg_uint32 epn, rpn; + int sv, lv, max_tlbs; + + // There are 64 TLBs. + max_tlbs = 64; + + // Use the smallest "size" value which is big enough (round up) + for (sv = 0, lv = 0x400; sv < 8; sv++, lv <<= 2) { + if (lv >= size) break; + } + + // Note: the process ID comes from the PID register (always 0) + epn = (virt & M_EPN_EPNMASK) | M_EPN_EV | M_EPN_SIZE(sv); + rpn = (phys & M_RPN_RPNMASK) | M_RPN_EX | M_RPN_WR; + + if (flags & CYGARC_MEMDESC_CI) { + rpn |= M_RPN_I; + } + + if (flags & CYGARC_MEMDESC_GUARDED) + rpn |= M_RPN_G; + + CYGARC_TLBWE(id, epn, rpn); + id++; + + // Make caches default disabled when MMU is disabled. + + return id; +} + + +// Initialize MMU to a sane (NOP) state. +// +// Initialize TLBs with 0, Valid bits unset. +void +cyg_hal_clear_MMU (void) +{ + cyg_uint32 tlbhi = 0; + cyg_uint32 tlblo = 0; + int id, max_tlbs; + cyg_uint32 tlb[64][2]; + + // There are 64 TLBs. + max_tlbs = 64; + + CYGARC_MTSPR (M_PID, 0); + + for (id = 0; id < max_tlbs; id++) { + CYGARC_TLBRE(id, tlb[id][0], tlb[id][1]); + CYGARC_TLBWE(id, tlbhi, tlblo); + } + + // Make caches default disabled when MMU is disabled. +} + +//-------------------------------------------------------------------------- +// End of var_misc.c diff --git a/packages/hal/powerpc/ppc40x/current/src/variant.S b/packages/hal/powerpc/ppc40x/current/src/variant.S new file mode 100644 --- /dev/null +++ b/packages/hal/powerpc/ppc40x/current/src/variant.S @@ -0,0 +1,77 @@ +##============================================================================= +## +## variant.S +## +## PowerPC PPC40x variant 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): jskov +## Contributors:jskov,gthomas +## Date: 2000-08-27 +## Purpose: PowerPC PPC40x variant code +## Description: Variant specific code for PowerPC 40x CPUs. +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#--------------------------------------------------------------------------- +# Interrupt vector tables. +# These tables contain the isr, data and object pointers used to deliver +# interrupts to user code. + + .data + + .extern hal_default_decrementer_isr + .extern hal_default_isr + + .globl hal_interrupt_handlers +hal_interrupt_handlers: + .long hal_default_decrementer_isr + .rept CYGNUM_HAL_ISR_COUNT-1 + .long hal_default_isr + .endr + + .globl hal_interrupt_data +hal_interrupt_data: + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr + + .globl hal_interrupt_objects +hal_interrupt_objects: + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr + +##----------------------------------------------------------------------------- +## end of variant.S + diff --git a/packages/hal/sh/arch/current/ChangeLog b/packages/hal/sh/arch/current/ChangeLog --- a/packages/hal/sh/arch/current/ChangeLog +++ b/packages/hal/sh/arch/current/ChangeLog @@ -1,3 +1,26 @@ +2000-10-31 Jesper Skov + + + * include/mod_7707a.h: Moved to SH3 HAL. + * include/mod_7708.h: Same. + * include/mod_7709a.h: Same. + * include/mod_7729.h: Same. + * include/sh3_sci.h: Same. + * include/sh3_scif.h: Same. + * src/sh3_sci.c: Same. + * src/sh3_scif.c: Same. + + * include/hal_cache.h: Moved SH3 code out to new SH3 HAL. + * cdl/hal_sh.cdl: Same. + * include/hal_intr.h: Same. + * include/sh_regs.h: Same. + * src/hal_misc.c: Same. + * src/hal_mk_defs.c: Same. + + * src/vectors.S: Changed to support SH4. Moved CPU post-reset init + code to variant HALs. Moved interrupt decoding to variant HAL + macros. Moved cache code to variant HALs. + 2000-10-24 Jesper Skov * src/vectors.S (hal_hw_init): Added errata comment. diff --git a/packages/hal/sh/arch/current/cdl/hal_sh.cdl b/packages/hal/sh/arch/current/cdl/hal_sh.cdl --- a/packages/hal/sh/arch/current/cdl/hal_sh.cdl +++ b/packages/hal/sh/arch/current/cdl/hal_sh.cdl @@ -52,13 +52,7 @@ cdl_package CYGPKG_HAL_SH { necessary to select a specific target platform HAL package." - cdl_interface CYGINT_HAL_SH_VARIANT { - display "Number of variant implementations in this configuration" - no_define - requires 1 == CYGINT_HAL_SH_VARIANT - } - - compile hal_misc.c context.S sh_stub.c sh3_sci.c sh3_scif.c + compile hal_misc.c context.S sh_stub.c # The "-o file" is a workaround for CR100958 - without it the # output file would end up in the source directory under CygWin. @@ -111,74 +105,12 @@ cdl_package CYGPKG_HAL_SH { description " CPU type and endian mode can be selected using these option." - cdl_option CYGPKG_HAL_SH_7707A { - display "SH 7707A microprocessor" - implements CYGINT_HAL_SH_VARIANT - implements CYGINT_HAL_SH_CPG_V2 - default_value 0 + cdl_interface CYGINT_HAL_SH_VARIANT { + display "Number of variant implementations in this configuration" no_define - define -file=system.h CYGPKG_HAL_SH_7707A - description " - The SH3 7707A microprocessor. This is an embedded part that in - addition to the SH3 processor core has built in peripherals - such as memory controllers, serial ports, LCD controller and - timers/counters." - define_proc { - puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " - } - } - - cdl_option CYGPKG_HAL_SH_7708 { - display "SH 7708 microprocessor" - implements CYGINT_HAL_SH_VARIANT - implements CYGINT_HAL_SH_CPG_V1 - default_value 0 - no_define - define -file=system.h CYGPKG_HAL_SH_7708 - description " - The SH3 7708 microprocessor. This is an embedded part that in - addition to the SH3 processor core has built in peripherals - such as memory controllers, serial ports and - timers/counters." - define_proc { - puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " - } + requires 1 == CYGINT_HAL_SH_VARIANT } - - cdl_option CYGPKG_HAL_SH_7709A { - display "SH 7709A microprocessor" - implements CYGINT_HAL_SH_VARIANT - implements CYGINT_HAL_SH_CPG_V3 - default_value 0 - no_define - define -file=system.h CYGPKG_HAL_SH_7709A - description " - The SH3 7709A microprocessor. This is an embedded part that in - addition to the SH3 processor core has built in peripherals - such as memory controllers, DMA controllers, A/D and D/A - converters, serial ports and timers/counters." - define_proc { - puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " - } - } - - cdl_option CYGPKG_HAL_SH_7729 { - display "SH 7729 microprocessor" - implements CYGINT_HAL_SH_VARIANT - implements CYGINT_HAL_SH_CPG_V3 - default_value 0 - no_define - define -file=system.h CYGPKG_HAL_SH_7729 - description " - The SH3 7729 microprocessor. This is an embedded part that in - addition to the SH3 processor core has built in peripherals - such as memory controllers, serial ports, and timers/counters, - and a DSP engine." - define_proc { - puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " - } - } - + cdl_option CYGHWR_HAL_SH_BIGENDIAN { display "Use big-endian mode" default_value 1 @@ -187,50 +119,6 @@ cdl_package CYGPKG_HAL_SH { } } - cdl_component CYGPKG_HAL_SH_INTERRUPT { - display "Interrupt controls" - flavor none - no_define - description " - Initial interrupt settings can be specified using these option." - - cdl_option CYGHWR_HAL_SH_IRQ_HANDLE_SPURIOUS_INTERRUPTS { - display "Handle spurious interrupts" - default_value 0 - description " - The SH3 may generate spurious interrupts with INTEVT = 0 - when changing the BL bit of the status register. Enabling - this option will cause such interrupts to be identified - very early in the interrupt handler and be ignored. Given - that the SH HAL uses the I-mask to control interrupts, - these spurious interrupts should not occur, and so there - should be no reason to include the special handling code." - } - - cdl_option CYGHWR_HAL_SH_IRQ_USE_IRQLVL { - display "Use IRQ0-3 pins as IRL input" - default_value 0 - description " - It is possible for the IRQ0-3 pins to be used as IRL - inputs by enabling this option." - } - - cdl_option CYGHWR_HAL_SH_IRQ_ENABLE_IRLS_INTERRUPTS { - display "Enable IRLS interrupt pins" - default_value 0 - active_if CYGHWR_HAL_SH_IRQ_USE_IRQLVL - description " - IRLS interrupt pins must be specifically - activated. When they are, they will cause the same - type of interrupt as those caused by the IRL pins. If - IRL and IRLS pins signal an interrupt at the same - time, the highest level interrupt will be generated. - Only available on some cores, and probably share pins - with other interrupt sources (PINT) which cannot be - used in this configuration." - } - } - cdl_component CYGPKG_HAL_SH_CACHE { display "Cache controls" flavor none @@ -244,183 +132,6 @@ cdl_package CYGPKG_HAL_SH { description " Controls whether caches should be enabled on startup." } - - cdl_option CYGHWR_HAL_SH_CACHE_MODE_P0 { - display "Select cache mode set for P0/U0/P3 at startup" - default_value { "WRITE_BACK" } - legal_values { "WRITE_BACK" "WRITE_THROUGH" } - flavor data - description " - Controls what cache mode the cache should be put in at - startup for areas P0, U0 and P3. Write-back mode improves - performance by letting dirty data to be kept in the - cache for a period of time, allowing mutiple writes to - the same cache line to be written back to memory in - one memory transaction. In Write-through mode, each - individual write will cause a memory transaction." - } - - cdl_option CYGHWR_HAL_SH_CACHE_MODE_P1 { - display "Select cache mode set for P1 at startup" - default_value { "WRITE_BACK" } - legal_values { "WRITE_BACK" "WRITE_THROUGH" } - flavor data - description " - Controls what cache mode the cache should be put in at - startup for area P1. Write-back mode improves - performance by letting dirty data to be kept in the - cache for a period of time, allowing mutiple writes to - the same cache line to be written back to memory in - one memory transaction. In Write-through mode, each - individual write will cause a memory transaction." - } - } - - - cdl_component CYGHWR_HAL_SH_CLOCK_SETTINGS { - display "SH on-chip generic clock controls" - description " - The various clocks used by the system are controlled by - these options, some of which are derived from platform - settings." - flavor none - no_define - - cdl_interface CYGINT_HAL_SH_CPG_V1 { - display "Clock pulse generator type 1" - } - - cdl_interface CYGINT_HAL_SH_CPG_V2 { - display "Clock pulse generator type 2" - } - - cdl_interface CYGINT_HAL_SH_CPG_V3 { - display "Clock pulse generator type 3" - } - - - cdl_option CYGHWR_HAL_SH_TMU_PRESCALE_0 { - display "TMU counter 0 prescaling" - description " - The peripheral clock is driving the counter used for - the real-time clock, prescaled by this factor." - flavor data - legal_values { 4 16 64 256 } - default_value 4 - } - - - cdl_option CYGHWR_HAL_SH_CLOCK_CKIO { - display "CKIO clock" - no_define - flavor data - # CKIO is either XTAL or PLL2 output - calculated { CYGINT_HAL_SH_CPG_V1 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) - ? (CYGHWR_HAL_SH_OOC_XTAL) - : CYGHWR_HAL_SH_PLL2_OUTPUT - ) - : CYGINT_HAL_SH_CPG_V2 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 2) - ? (CYGHWR_HAL_SH_OOC_XTAL) - : CYGHWR_HAL_SH_PLL2_OUTPUT - ) - : CYGINT_HAL_SH_CPG_V3 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) - ? (CYGHWR_HAL_SH_OOC_XTAL) - : CYGHWR_HAL_SH_PLL2_OUTPUT - ) - : 0 } - } - - cdl_option CYGHWR_HAL_SH_PLL1_OUTPUT { - display "The clock output from PLL1" - no_define - flavor data - calculated { CYGHWR_HAL_SH_CLOCK_CKIO * CYGHWR_HAL_SH_OOC_PLL_1 } - } - - cdl_option CYGHWR_HAL_SH_PLL2_OUTPUT { - display "The clock output from PLL2" - no_define - flavor data - calculated { CYGINT_HAL_SH_CPG_V1 ? ( - (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) - ) - : CYGINT_HAL_SH_CPG_V2 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 5) - ? (CYGHWR_HAL_SH_OOC_XTAL / 2) - : (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 6) - ? (14745600) - : (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) - ? (11075600) - : (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) - ) - : CYGINT_HAL_SH_CPG_V3 ? ( - (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) - ) - : 0 } - } - - - cdl_option CYGHWR_HAL_SH_DIVIDER1_INPUT { - display "The clock input to divider 1" - no_define - flavor data - # DIV1 input is either PLL2 output or PLL1 output - calculated { (CYGHWR_HAL_SH_OOC_PLL_1 == 0) - ? CYGHWR_HAL_SH_PLL2_OUTPUT - : CYGHWR_HAL_SH_PLL1_OUTPUT } - } - - cdl_option CYGHWR_HAL_SH_DIVIDER2_INPUT { - display "The clock input to divider 2" - no_define - flavor data - # DIV2 input is either PLL2 output or PLL1 output - calculated { CYGINT_HAL_SH_CPG_V1 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 3 || CYGHWR_HAL_SH_OOC_CLOCK_MODE == 4) - ? CYGHWR_HAL_SH_PLL2_OUTPUT - : CYGHWR_HAL_SH_PLL1_OUTPUT - ) - : CYGINT_HAL_SH_CPG_V2 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE <= 2) - ? CYGHWR_HAL_SH_PLL1_OUTPUT - : CYGHWR_HAL_SH_PLL2_OUTPUT - ) - : CYGINT_HAL_SH_CPG_V3 ? ( - (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 3 || CYGHWR_HAL_SH_OOC_CLOCK_MODE == 4) - ? CYGHWR_HAL_SH_PLL2_OUTPUT - : CYGHWR_HAL_SH_PLL1_OUTPUT - ) - : 0 } - } - - cdl_option CYGHWR_HAL_SH_PROCESSOR_SPEED { - display "Processor clock speed (MHz)" - flavor data - calculated { CYGHWR_HAL_SH_DIVIDER1_INPUT / CYGHWR_HAL_SH_OOC_DIVIDER_1 } - description " - The core (CPU, cache and MMU) speed is computed from - the input clock speed and the divider 1 setting." - } - - cdl_option CYGHWR_HAL_SH_BOARD_SPEED { - display "Platform bus clock speed (MHz)" - flavor data - calculated { CYGHWR_HAL_SH_CLOCK_CKIO } - description " - The platform bus speed is CKIO." - } - - cdl_option CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED { - display "Processor on-chip peripheral clock speed (MHz)" - flavor data - calculated { CYGHWR_HAL_SH_DIVIDER2_INPUT / CYGHWR_HAL_SH_OOC_DIVIDER_2 } - description " - The peripheral speed is computed from the input clock - speed and the divider 2 settings." - } } # Real-time clock/counter specifics diff --git a/packages/hal/sh/arch/current/include/hal_cache.h b/packages/hal/sh/arch/current/include/hal_cache.h --- a/packages/hal/sh/arch/current/include/hal_cache.h +++ b/packages/hal/sh/arch/current/include/hal_cache.h @@ -50,246 +50,8 @@ //============================================================================= #include -#include -#include -#include // HAL_READ/WRITE macros - -#include CYGBLD_HAL_CPU_MODULES_H // cache module specs - -#include // CYGARC_REG_ definitions - -//----------------------------------------------------------------------------- -// Cache dimensions - one unified cache - -#define HAL_CACHE_UNIFIED - -#define HAL_UCACHE_SIZE CYGARC_SH_MOD_CAC_SIZE -#define HAL_UCACHE_LINE_SIZE CYGARC_SH_MOD_CAC_LINE_SIZE -#define HAL_UCACHE_WAYS CYGARC_SH_MOD_CAC_WAYS - -// Cache addressing information -#define CYGARC_REG_CACHE_ADDRESS_BASE CYGARC_SH_MOD_CAC_ADDRESS_BASE -#define CYGARC_REG_CACHE_ADDRESS_TOP CYGARC_SH_MOD_CAC_ADDRESS_TOP -#define CYGARC_REG_CACHE_ADDRESS_STEP CYGARC_SH_MOD_CAC_ADDRESS_STEP - -// Writing this to a cache address entry forces a flush of the line if -// it is dirty. -#define CYGARC_REG_CACHE_ADDRESS_FLUSH CYGARC_SH_MOD_CAC_ADDRESS_FLUSH - -#define HAL_UCACHE_SETS (HAL_UCACHE_SIZE/(HAL_UCACHE_LINE_SIZE*HAL_UCACHE_WAYS)) - -//----------------------------------------------------------------------------- -// Global control of cache - -// This is all handled in assembly (see vectors.S) due to a requirement about -// not fiddling the cache from cachable memory. - -externC void cyg_hal_cache_enable(void); -externC void cyg_hal_cache_disable(void); -externC void cyg_hal_cache_invalidate_all(void); -externC void cyg_hal_cache_sync(void); -externC void cyg_hal_cache_sync_region(cyg_haladdress base, - cyg_haladdrword len); -externC void cyg_hal_cache_write_mode(int mode); - -// Enable the cache -#define HAL_UCACHE_ENABLE() cyg_hal_cache_enable() - -// Disable the cache -#define HAL_UCACHE_DISABLE() cyg_hal_cache_disable() - -// Invalidate the entire cache -#define HAL_UCACHE_INVALIDATE_ALL() cyg_hal_cache_invalidate_all() - -// Synchronize the contents of the cache with memory. -#define HAL_UCACHE_SYNC() cyg_hal_cache_sync() - -// Query the state of the cache (does not affect the caching) -#define HAL_UCACHE_IS_ENABLED(_state_) \ - CYG_MACRO_START \ - HAL_READ_UINT32(CYGARC_REG_CCR, (_state_)); \ - (_state_) &= ~CYGARC_REG_CCR_CE; \ - CYG_MACRO_END - -// Set the cache refill burst size -//#define HAL_UCACHE_BURST_SIZE(_size_) - -// Set the cache write mode -#define HAL_UCACHE_WRITE_MODE( _mode_ ) \ - CYG_MACRO_START \ - cyg_uint32 _m_; \ - if (HAL_UCACHE_WRITETHRU_MODE == _mode_) \ - _m_ = CYGARC_REG_CCR_WT; \ - else \ - _m_ = CYGARC_REG_CCR_CB; \ - cyg_hal_cache_write_mode(_m_); \ - CYG_MACRO_END - -#define HAL_UCACHE_WRITETHRU_MODE 0 -#define HAL_UCACHE_WRITEBACK_MODE 1 - -// This macro allows the client to specify separate modes for the two -// regions. -#define HAL_UCACHE_WRITE_MODE_SH( _mode_ ) cyg_hal_cache_write_mode(_mode_) - -// Load the contents of the given address range into the cache -// and then lock the cache so that it stays there. -//#define HAL_UCACHE_LOCK(_base_, _size_) - -// Undo a previous lock operation -//#define HAL_UCACHE_UNLOCK(_base_, _size_) - -// Unlock entire cache -//#define HAL_UCACHE_UNLOCK_ALL() - -//----------------------------------------------------------------------------- -// Cache line control - -// Allocate cache lines for the given address range without reading its -// contents from memory. -//#define HAL_UCACHE_ALLOCATE( _base_ , _size_ ) - -// Write dirty cache lines to memory and invalidate the cache entries -// for the given address range. -#define HAL_UCACHE_FLUSH( _base_ , _size_ ) \ - cyg_hal_cache_sync_region(_base_, _size_) - -// Invalidate cache lines in the given range without writing to memory. -//#define HAL_UCACHE_INVALIDATE( _base_ , _size_ ) - -// Write dirty cache lines to memory for the given address range. -//#define HAL_UCACHE_STORE( _base_ , _size_ ) - - -// Preread the given range into the cache with the intention of reading -// from it later. -//#define HAL_UCACHE_READ_HINT( _base_ , _size_ ) - -// Preread the given range into the cache with the intention of writing -// to it later. -//#define HAL_UCACHE_WRITE_HINT( _base_ , _size_ ) -// Allocate and zero the cache lines associated with the given range. -//#define HAL_UCACHE_ZERO( _base_ , _size_ ) - - -//----------------------------------------------------------------------------- -// Data and instruction cache macros map onto the both-cache macros - -//----------------------------------------------------------------------------- -// Global control of data cache - -#define HAL_DCACHE_SIZE HAL_UCACHE_SIZE -#define HAL_DCACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE -#define HAL_DCACHE_WAYS HAL_UCACHE_WAYS -#define HAL_DCACHE_SETS HAL_UCACHE_SETS - -// Enable the data cache -#define HAL_DCACHE_ENABLE() HAL_UCACHE_ENABLE() - -// Disable the data cache -#define HAL_DCACHE_DISABLE() HAL_UCACHE_DISABLE() - -// Invalidate the entire cache -#define HAL_DCACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() - -// Synchronize the contents of the cache with memory. -#define HAL_DCACHE_SYNC() HAL_UCACHE_SYNC() - -// Query the state of the data cache -#define HAL_DCACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) - -// Set the data cache refill burst size -//#define HAL_DCACHE_BURST_SIZE(_size_) - -// Set the data cache write mode -//#define HAL_DCACHE_WRITE_MODE( _mode_ ) - -//#define HAL_DCACHE_WRITETHRU_MODE 0 -//#define HAL_DCACHE_WRITEBACK_MODE 1 - -// 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_) - -// Undo a previous lock operation -//#define HAL_DCACHE_UNLOCK(_base_, _size_) - -// Unlock entire cache -//#define HAL_DCACHE_UNLOCK_ALL() - -//----------------------------------------------------------------------------- -// Data cache line control - -// Allocate cache lines for the given address range without reading its -// contents from memory. -//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) - -// Write dirty cache lines to memory and invalidate the cache entries -// for the given address range. -#define HAL_DCACHE_FLUSH( _base_ , _size_ ) HAL_UCACHE_FLUSH( _base_, _size_ ) +#include // get variant cache handling -// Invalidate cache lines in the given range without writing to memory. -//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) - -// Write dirty cache lines to memory for the given address range. -//#define HAL_DCACHE_STORE( _base_ , _size_ ) - -// Preread the given range into the cache with the intention of reading -// from it later. -//#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) - -// Preread the given range into the cache with the intention of writing -// to it later. -//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) - -// Allocate and zero the cache lines associated with the given range. -//#define HAL_DCACHE_ZERO( _base_ , _size_ ) - -//----------------------------------------------------------------------------- -// Global control of Instruction cache - -#define HAL_ICACHE_SIZE HAL_UCACHE_SIZE -#define HAL_ICACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE -#define HAL_ICACHE_WAYS HAL_UCACHE_WAYS -#define HAL_ICACHE_SETS HAL_UCACHE_SETS - -// Enable the instruction cache -#define HAL_ICACHE_ENABLE() HAL_UCACHE_ENABLE() - -// Disable the instruction cache -#define HAL_ICACHE_DISABLE() HAL_UCACHE_DISABLE() - -// Invalidate the entire cache -#define HAL_ICACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() - - -// Synchronize the contents of the cache with memory. -#define HAL_ICACHE_SYNC() HAL_UCACHE_SYNC() - -// Query the state of the instruction cache -#define HAL_ICACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) - -// Set the instruction cache refill burst size -//#define HAL_ICACHE_BURST_SIZE(_size_) - -// 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_) - -// Undo a previous lock operation -//#define HAL_ICACHE_UNLOCK(_base_, _size_) - -// Unlock entire cache -//#define HAL_ICACHE_UNLOCK_ALL() - -//----------------------------------------------------------------------------- -// Instruction cache line control - -// Invalidate cache lines in the given range without writing to memory. -//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) - -//----------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_CACHE_H // End of hal_cache.h diff --git a/packages/hal/sh/arch/current/include/hal_intr.h b/packages/hal/sh/arch/current/include/hal_intr.h --- a/packages/hal/sh/arch/current/include/hal_intr.h +++ b/packages/hal/sh/arch/current/include/hal_intr.h @@ -51,13 +51,14 @@ //========================================================================== #include -#include CYGBLD_HAL_CPU_MODULES_H // INTC module selection + +#include // More include statements below. First part of this file must be // usable for both assembly and C files, so only use defines here. //-------------------------------------------------------------------------- -// SH3 exception vectors. These correspond to VSRs and are the values +// SH exception vectors. These correspond to VSRs and are the values // to use for HAL_VSR_GET/SET // // Note that exceptions are decoded - there is a VSR slot for each exception @@ -72,27 +73,29 @@ #define CYGNUM_HAL_VECTOR_TLBERROR_WRITE 6 // TLB prot violation s #define CYGNUM_HAL_VECTOR_DATA_ACCESS 7 // address error (load) #define CYGNUM_HAL_VECTOR_DATA_WRITE 8 // address error (store) -// define CYGNUM_HAL_VECTOR_RESERVED_9 9 -// define CYGNUM_HAL_VECTOR_RESERVED_10 10 +// RESERVED 9-10 #define CYGNUM_HAL_VECTOR_TRAP 11 // unconditional trap #define CYGNUM_HAL_VECTOR_ILLEGAL_INSTRUCTION 12 // reserved instruction #define CYGNUM_HAL_VECTOR_ILLEGAL_SLOT_INSTRUCTION 13 // illegal instruction in delay slot -// define CYGNUM_HAL_VECTOR_RESERVED_14 14 +#define CYGNUM_HAL_VECTOR_NMI 14 // NMI #define CYGNUM_HAL_VECTOR_INSTRUCTION_BP 15 // user breakpoint -#define CYG_VECTOR_IS_INTERRUPT(v) \ - (CYGNUM_HAL_VECTOR_INSTRUCTION_BP < (v)) - #define CYGNUM_HAL_VECTOR_INTERRUPT 16 // all interrupts +#ifndef CYG_VECTOR_IS_INTERRUPT +# define CYG_VECTOR_IS_INTERRUPT(v) (CYGNUM_HAL_VECTOR_INSTRUCTION_BP < (v)) +#endif + #define CYGNUM_HAL_VSR_MIN CYGNUM_HAL_VECTOR_POWERON -#define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_INTERRUPT +#ifndef CYGNUM_HAL_VSR_MAX +# define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_INTERRUPT +#endif #define CYGNUM_HAL_VSR_COUNT ( CYGNUM_HAL_VSR_MAX + 1 ) -#define CYGNUM_HAL_VSR_EXCEPTION_COUNT (CYGNUM_HAL_VECTOR_INSTRUCTION_BP-CYGNUM_HAL_VECTOR_POWERON+1) - - +#ifndef CYGNUM_HAL_VSR_EXCEPTION_COUNT +# define CYGNUM_HAL_VSR_EXCEPTION_COUNT (CYGNUM_HAL_VECTOR_INSTRUCTION_BP-CYGNUM_HAL_VECTOR_POWERON+1) +#endif // The decoded interrupts. #define CYGNUM_HAL_INTERRUPT_NMI 0 @@ -128,74 +131,24 @@ #define CYGNUM_HAL_INTERRUPT_REF_RCMI 30 #define CYGNUM_HAL_INTERRUPT_REF_ROVI 31 -#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_REF_ROVI +#ifndef CYGNUM_HAL_ISR_MAX +# define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_REF_ROVI +#endif -//---------------------------------------------------------------------------- -// Additional vectors provided by INTC V2 +#define CYGNUM_HAL_ISR_MIN CYGNUM_HAL_INTERRUPT_NMI +#define CYGNUM_HAL_ISR_COUNT ( CYGNUM_HAL_ISR_MAX - CYGNUM_HAL_ISR_MIN + 1 ) -//#ifdef CYGARC_SH_MOD_INTC_V2 // FIXME -#define CYGNUM_HAL_INTERRUPT_RESERVED_5C0 32 -#define CYGNUM_HAL_INTERRUPT_HUDI_HUDI 33 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 34 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ1 35 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ2 36 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ3 37 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ4 38 -#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ5 39 -#define CYGNUM_HAL_INTERRUPT_RESERVED_6C0 40 -#define CYGNUM_HAL_INTERRUPT_RESERVED_6E0 41 -#define CYGNUM_HAL_INTERRUPT_PINT_PINT07 42 -#define CYGNUM_HAL_INTERRUPT_PINT_PINT8F 43 -#define CYGNUM_HAL_INTERRUPT_RESERVED_740 44 -#define CYGNUM_HAL_INTERRUPT_RESERVED_760 45 -#define CYGNUM_HAL_INTERRUPT_RESERVED_780 46 -#define CYGNUM_HAL_INTERRUPT_RESERVED_7A0 47 -#define CYGNUM_HAL_INTERRUPT_RESERVED_7C0 48 -#define CYGNUM_HAL_INTERRUPT_RESERVED_7E0 59 -#define CYGNUM_HAL_INTERRUPT_DMAC_DEI0 50 -#define CYGNUM_HAL_INTERRUPT_DMAC_DEI1 51 -#define CYGNUM_HAL_INTERRUPT_DMAC_DEI2 52 -#define CYGNUM_HAL_INTERRUPT_DMAC_DEI3 53 -#define CYGNUM_HAL_INTERRUPT_IRDA_ERI1 54 -#define CYGNUM_HAL_INTERRUPT_IRDA_RXI1 55 -#define CYGNUM_HAL_INTERRUPT_IRDA_BRI1 56 -#define CYGNUM_HAL_INTERRUPT_IRDA_TXI1 57 -#define CYGNUM_HAL_INTERRUPT_SCIF_ERI2 58 -#define CYGNUM_HAL_INTERRUPT_SCIF_RXI2 59 -#define CYGNUM_HAL_INTERRUPT_SCIF_BRI2 60 -#define CYGNUM_HAL_INTERRUPT_SCIF_TXI2 61 -#define CYGNUM_HAL_INTERRUPT_ADC_ADI 62 +// The vector used by the Real time clock +#ifndef CYGNUM_HAL_INTERRUPT_RTC +# define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TMU0_TUNI0 +#endif -#ifdef CYGARC_SH_MOD_INTC_V2 // FIXME - -#undef CYGNUM_HAL_ISR_MAX -#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_ADC_ADI - -#endif // CYGARC_SH_MOD_INTC_V2 - -//---------------------------------------------------------------------------- -// Additional vectors provided by INTC V3 - -//#ifdef CYGARC_SH_MOD_INTC_V3 // FIXME -#define CYGNUM_HAL_INTERRUPT_LCDC_LCDI 63 -#define CYGNUM_HAL_INTERRUPT_PCC_PCC0 64 -#define CYGNUM_HAL_INTERRUPT_PCC_PCC1 65 - -#ifdef CYGARC_SH_MOD_INTC_V3 // FIXME - -#undef CYGNUM_HAL_ISR_MAX -#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_PCC_PCC1 - -#endif // CYGARC_SH_MOD_INTC_V3 - -// CYGNUM_HAL_ISR_COUNT must match CYG_ISR_TABLE_SIZE defined in vectors.S. -#define CYGNUM_HAL_ISR_MIN CYGNUM_HAL_INTERRUPT_NMI -#define CYGNUM_HAL_ISR_COUNT ( CYGNUM_HAL_ISR_MAX + 1 ) - +//-------------------------------------------------------------------------- // Exception vectors. These are the values used when passed out to an // external exception handler using cyg_hal_deliver_exception() -// The exception indexes are EXPEVT/0x20 +// The exception indexes are EXPEVT/0x20. Variants may define additional +// exception vectors. #define CYGNUM_HAL_EXCEPTION_POWERON 0 // power-on #define CYGNUM_HAL_EXCEPTION_RESET 1 // reset @@ -206,23 +159,21 @@ #define CYGNUM_HAL_EXCEPTION_TLBERROR_WRITE 6 // TLB prot violation s #define CYGNUM_HAL_EXCEPTION_DATA_ACCESS 7 // address error (load) #define CYGNUM_HAL_EXCEPTION_DATA_WRITE 8 // address error (store) -// define CYGNUM_HAL_EXCEPTION_RESERVED_9 9 -// define CYGNUM_HAL_EXCEPTION_RESERVED_10 10 #define CYGNUM_HAL_EXCEPTION_TRAP 11 // unconditional trap #define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION 12 // reserved instruction #define CYGNUM_HAL_EXCEPTION_ILLEGAL_SLOT_INSTRUCTION 13 // illegal instruction in delay slot -// define CYGNUM_HAL_EXCEPTION_RESERVED_14 14 #define CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP 15 // user breakpoint #define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_POWERON -#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP + +#ifndef CYGNUM_HAL_EXCEPTION_MAX +# define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP +#endif + #define CYGNUM_HAL_EXCEPTION_COUNT \ ( CYGNUM_HAL_EXCEPTION_MAX - CYGNUM_HAL_EXCEPTION_MIN + 1 ) -// The vector used by the Real time clock -#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TMU0_TUNI0 - #ifndef __ASSEMBLER__ #include diff --git a/packages/hal/sh/arch/current/include/mod_7707a.h b/packages/hal/sh/arch/current/include/mod_7707a.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/mod_7707a.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef CYGONCE_HAL_MOD_77xx_H -#define CYGONCE_HAL_MOD_77xx_H - -//============================================================================= -// -// mod_7707a.h -// -// List modules available on CPU -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-06-08 -// Purpose: Define modules (and versions) available on this CPU. -// Usage: Included from -// -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -//----------------------------------------------------------------------------- -// Modules provided by the CPU - -#define CYGARC_SH_MOD_BCN_V2 -#define CYGARC_SH_MOD_INTC_V2 -#define CYGARC_SH_MOD_INTC_V3 -#define CYGARC_SH_MOD_IRDA -#define CYGARC_SH_MOD_SCIF -#define CYGARC_SH_MOD_PFC -#define CYGARC_SH_MOD_UBC_V1 -#define CYGARC_SH_MOD_CPG_V2 - -//----------------------------------------------------------------------------- -// Extra details for Cache Module (CAC) - -// Cache dimenions - one unified cache -#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes -#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line -#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache - -// Cache addressing information -// way: bits 13 - 12 -// entry: bits 11 - 4 -#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 -#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 -#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 -// U : bit 1 -// V : bit 0 -// Writing zero to both forces a flush of the line if it is dirty. -#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 - -//----------------------------------------------------------------------------- -// Extra details for interrupt handling -#define CYGARC_SH_SOFTWARE_IP_UPDATE - -#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/arch/current/include/mod_7708.h b/packages/hal/sh/arch/current/include/mod_7708.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/mod_7708.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef CYGONCE_HAL_MOD_77xx_H -#define CYGONCE_HAL_MOD_77xx_H - -//============================================================================= -// -// mod_7708.h -// -// List modules available on CPU -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-03-16 -// Purpose: Define modules (and versions) available on this CPU. -// Usage: Included from -// -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -//----------------------------------------------------------------------------- -// Modules provided by the CPU - -#define CYGARC_SH_MOD_SCI_V2 -#define CYGARC_SH_MOD_UBC_V1 -#define CYGARC_SH_MOD_CPG_V1 - - -//----------------------------------------------------------------------------- -// Extra details for Cache Module (CAC) - -// Cache dimenions - one unified cache -#define CYGARC_SH_MOD_CAC_SIZE 8192 // Size of cache in bytes -#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line -#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache - -// Cache addressing information -// way: bits 12 - 11 -// entry: bits 10 - 4 -#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 -#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0002000 -#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 -// U : bit 1 -// V : bit 0 -// Writing zero to both forces a flush of the line if it is dirty. -#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 - -//----------------------------------------------------------------------------- -// Extra details for interrupt handling -#define CYGARC_SH_SOFTWARE_IP_UPDATE - -#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/arch/current/include/mod_7709a.h b/packages/hal/sh/arch/current/include/mod_7709a.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/mod_7709a.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef CYGONCE_HAL_MOD_77xx_H -#define CYGONCE_HAL_MOD_77xx_H - -//============================================================================= -// -// mod_7709a.h -// -// List modules available on CPU -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-03-16 -// Purpose: Define modules (and versions) available on this CPU. -// Usage: Included from -// -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -//----------------------------------------------------------------------------- -// Modules provided by the CPU - -#define CYGARC_SH_MOD_BCN_V2 -#define CYGARC_SH_MOD_INTC_V2 -#define CYGARC_SH_MOD_IRDA -#define CYGARC_SH_MOD_SCIF -#define CYGARC_SH_MOD_PFC -#define CYGARC_SH_MOD_UBC_V2 -#define CYGARC_SH_MOD_DMAC -#define CYGARC_SH_MOD_CPG_V3 - -//----------------------------------------------------------------------------- -// Extra details for Cache Module (CAC) - -// Cache dimenions - one unified cache -#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes -#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line -#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache - -// Cache addressing information -// way: bits 13 - 12 -// entry: bits 11 - 4 -#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 -#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 -#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 -// U : bit 1 -// V : bit 0 -// Writing zero to both forces a flush of the line if it is dirty. -#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 - -//----------------------------------------------------------------------------- -// Extra details for interrupt handling -#define CYGARC_SH_SOFTWARE_IP_UPDATE - -#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/arch/current/include/mod_7729.h b/packages/hal/sh/arch/current/include/mod_7729.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/mod_7729.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef CYGONCE_HAL_MOD_77xx_H -#define CYGONCE_HAL_MOD_77xx_H - -//============================================================================= -// -// mod_7729.h -// -// List modules available on CPU -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-08-29 -// Purpose: Define modules (and versions) available on this CPU. -// Usage: Included from -// -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -//----------------------------------------------------------------------------- -// Modules provided by the CPU - -#define CYGARC_SH_MOD_BCN_V2 -#define CYGARC_SH_MOD_INTC_V2 -#define CYGARC_SH_MOD_INTC_V3 -#define CYGARC_SH_MOD_PFC -#define CYGARC_SH_MOD_IRDA -#define CYGARC_SH_MOD_SCIF -#define CYGARC_SH_MOD_UBC_V3 -#define CYGARC_SH_MOD_CPG_V3 - -//----------------------------------------------------------------------------- -// Extra details for Cache Module (CAC) - -// Cache dimenions - one unified cache -#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes -#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line -#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache - -// Cache addressing information -// way: bits 13 - 12 -// entry: bits 11 - 4 -#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 -#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 -#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 -// U : bit 1 -// V : bit 0 -// Writing zero to both forces a flush of the line if it is dirty. -#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 - -//----------------------------------------------------------------------------- -// Extra details for interrupt handling -#define CYGARC_SH_SOFTWARE_IP_UPDATE - -#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/arch/current/include/sh3_sci.h b/packages/hal/sh/arch/current/include/sh3_sci.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/sh3_sci.h +++ /dev/null @@ -1,81 +0,0 @@ -//============================================================================= -// -// sh3_sci.h -// -// Simple driver for the SH Serial Communication Interface (SCI) -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 1999-05-17 -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#ifdef CYGNUM_HAL_SH_SH3_SCI_PORTS - -//-------------------------------------------------------------------------- -// SCI register offsets -#ifdef CYGARC_SH_MOD_SCI_V2 -# define _REG_SCSPTR -0x4 // serial port register -#endif -#define _REG_SCSMR 0x0 // serial mode register -#define _REG_SCBRR 0x2 // bit rate register -#define _REG_SCSCR 0x4 // serial control register -#define _REG_SCTDR 0x6 // transmit data register -#define _REG_SCSSR 0x8 // serial status register -#define _REG_SCRDR 0xa // receive data register - -//-------------------------------------------------------------------------- - -typedef struct { - cyg_uint8* base; - cyg_int32 msec_timeout; - int isr_vector; -} channel_data_t; - -//-------------------------------------------------------------------------- - -#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) -// This one should only be used by old-stub compatibility code! -externC void cyg_hal_plf_sci_init_channel(const channel_data_t* chan); -#endif - -externC cyg_uint8 cyg_hal_plf_sci_getc(void* __ch_data); -externC void cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c); -externC void cyg_hal_plf_sci_init(int sci_index, int comm_index, - int rcv_vect, cyg_uint8* base); - - -#endif // CYGNUM_HAL_SH_SH3_SCI_PORTS -//----------------------------------------------------------------------------- -// end of sh3_sci.h diff --git a/packages/hal/sh/arch/current/include/sh3_scif.h b/packages/hal/sh/arch/current/include/sh3_scif.h deleted file mode 100644 --- a/packages/hal/sh/arch/current/include/sh3_scif.h +++ /dev/null @@ -1,88 +0,0 @@ -//============================================================================= -// -// sh3_scif.h -// -// Simple driver for the SH3 Serial Communication Interface with FIFO -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-03-30 -// Description: Simple driver for the SH Serial Communication Interface -// The driver can be used for either the SCIF or the IRDA -// modules (the latter can act as the former). -// Clients of this file can configure the behavior with: -// CYGNUM_SCIF_PORTS: number of SCI ports -// -// Note: It should be possible to configure a channel to IRDA mode. -// Worry about that when some board needs it. -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#ifdef CYGNUM_HAL_SH_SH3_SCIF_PORTS - -//-------------------------------------------------------------------------- -// SCIF register offsets -#define _REG_SCSMR 0x00 -#define _REG_SCBRR 0x02 -#define _REG_SCSCR 0x04 -#define _REG_SCFTDR 0x06 -#define _REG_SCSSR 0x08 -#define _REG_SCFRDR 0x0a -#define _REG_SCFCR 0x0c -#define _REG_SCFDR 0x0e - -//-------------------------------------------------------------------------- - -typedef struct { - cyg_uint8* base; - cyg_int32 msec_timeout; - int isr_vector; -} channel_data_t; - -//-------------------------------------------------------------------------- - -#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) -// This one should only be used by old-stub compatibility code! -externC void cyg_hal_plf_scif_init_channel(const channel_data_t* chan); -#endif - -externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); -externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); -void cyg_hal_plf_scif_init(int scif_index, int comm_index, - int rcv_vect, cyg_uint8* base); - - -#endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS -//----------------------------------------------------------------------------- -// end of sh3_scif.h diff --git a/packages/hal/sh/arch/current/include/sh_regs.h b/packages/hal/sh/arch/current/include/sh_regs.h --- a/packages/hal/sh/arch/current/include/sh_regs.h +++ b/packages/hal/sh/arch/current/include/sh_regs.h @@ -40,7 +40,7 @@ // Usage: #include // Notes: // This file describes registers for on-core modules found in all -// the SH3 CPUs supported by the HAL. For each CPU is defined a +// the SH CPUs supported by the HAL. For each CPU is defined a // module specification file (mod_.h) which lists // modules (and their version if applicable) included in that // particular CPU model. Note that the versioning is ad hoc; @@ -50,1026 +50,7 @@ // //============================================================================= -// Find out which modules are supported by the chosen CPU -// Note: At them moment only some modules are conditionalized (the ones -// not in the 7708). For consistency, all modules should be treated -// the same. #include -#include CYGBLD_HAL_CPU_MODULES_H - -//========================================================================== -// CPU Definitions -//========================================================================== - -//-------------------------------------------------------------------------- -// Status register -#define CYGARC_REG_SR_MD 0x40000000 -#define CYGARC_REG_SR_RB 0x20000000 -#define CYGARC_REG_SR_BL 0x10000000 -#define CYGARC_REG_SR_M 0x00000200 -#define CYGARC_REG_SR_Q 0x00000100 -#define CYGARC_REG_SR_IMASK 0x000000f0 -#define CYGARC_REG_SR_I3 0x00000080 -#define CYGARC_REG_SR_I2 0x00000040 -#define CYGARC_REG_SR_I1 0x00000020 -#define CYGARC_REG_SR_I0 0x00000010 -#define CYGARC_REG_SR_S 0x00000002 -#define CYGARC_REG_SR_T 0x00000001 - - -//========================================================================== -// Memory Mapped Registers -//========================================================================== - -//++++++ Module MMU ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// MMU control registers -#define CYGARC_REG_MMUCR 0xffffffe0 - -#define CYGARC_REG_MMUCR_SV 0x00000100 -#define CYGARC_REG_MMUCR_RC_MASK 0x000000c0 -#define CYGARC_REG_MMUCR_TF 0x00000004 -#define CYGARC_REG_MMUCR_IX 0x00000002 -#define CYGARC_REG_MMUCR_AT 0x00000001 - -//++++++ Module CAC ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// Cache registers -#define CYGARC_REG_CCR 0xffffffec - -#define CYGARC_REG_CCR_RA 0x00000020 -#define CYGARC_REG_CCR_CF 0x00000008 -#define CYGARC_REG_CCR_CB 0x00000004 -#define CYGARC_REG_CCR_WT 0x00000002 -#define CYGARC_REG_CCR_CE 0x00000001 - -//-------------------------------------------------------------------------- -// Cache registers -#define CYGARC_REG_CCR 0xffffffec - -#define CYGARC_REG_CCR_RA 0x00000020 -#define CYGARC_REG_CCR_CF 0x00000008 -#define CYGARC_REG_CCR_CB 0x00000004 -#define CYGARC_REG_CCR_WT 0x00000002 -#define CYGARC_REG_CCR_CE 0x00000001 - - -//-------------------------------------------------------------------------- -// Address array access -// Address part (base/top/step specified in mod file) -#define CYGARC_REG_CACHE_ADDRESS_ADDRESS 0x00000008 // compare address - -// Data part -#define CYGARC_REG_CACHE_ADDRESS_TAG_Mask 0x1ffffc00 -#define CYGARC_REG_CACHE_ADDRESS_U 0x00000002 // updated (contains dirty data) -#define CYGARC_REG_CACHE_ADDRESS_V 0x00000001 // valid - - -//++++++ Module BSC ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// Bus State Control -#define CYGARC_REG_BCR1 0xffffff60 -#define CYGARC_REG_BCR2 0xffffff62 -#define CYGARC_REG_WCR1 0xffffff64 -#define CYGARC_REG_WCR2 0xffffff66 -#define CYGARC_REG_MCR 0xffffff68 -#define CYGARC_REG_DCR 0xffffff6a -#define CYGARC_REG_PCR 0xffffff6c -#define CYGARC_REG_RTCSR 0xffffff6e -#define CYGARC_REG_RTCNT 0xffffff70 -#define CYGARC_REG_RTCOR 0xffffff72 -#define CYGARC_REG_RFCR 0xffffff74 - -#ifdef CYGARC_SH_MOD_BCN_V2 -# define CYGARC_REG_BCR3 0xffffff7e -#endif - -#define CYGARC_REG_SDMR_AREA2_BASE 0xffffd000 -#define CYGARC_REG_SDMR_AREA3_BASE 0xffffe000 - -#define CYGARC_REG_BCR1_DRAMTP2 0x0010 -#define CYGARC_REG_BCR1_DRAMTP1 0x0008 -#define CYGARC_REG_BCR1_DRAMTP0 0x0004 - -// Bus widths for areas -#define CYGARC_REG_BCR2_A6_8 0x1000 -#define CYGARC_REG_BCR2_A6_16 0x2000 -#define CYGARC_REG_BCR2_A6_32 0x3000 -#define CYGARC_REG_BCR2_A5_8 0x0400 -#define CYGARC_REG_BCR2_A5_16 0x0800 -#define CYGARC_REG_BCR2_A5_32 0x0c00 -#define CYGARC_REG_BCR2_A4_8 0x0100 -#define CYGARC_REG_BCR2_A4_16 0x0200 -#define CYGARC_REG_BCR2_A4_32 0x0300 -#define CYGARC_REG_BCR2_A3_8 0x0040 -#define CYGARC_REG_BCR2_A3_16 0x0080 -#define CYGARC_REG_BCR2_A3_32 0x00c0 -#define CYGARC_REG_BCR2_A2_8 0x0010 -#define CYGARC_REG_BCR2_A2_16 0x0020 -#define CYGARC_REG_BCR2_A2_32 0x0030 - -// Memory type selection and other IO behavior controls -#define CYGARC_REG_BCR1_PULA 0x8000 // Pin A25 to A0 Pull-Up -#define CYGARC_REG_BCR1_PULD 0x4000 // Pin D31 to D0 Pull-Up -#define CYGARC_REG_BCR1_HIZMEM 0x2000 // Hi-Z memory control -#define CYGARC_REG_BCR1_HIZCNT 0x1000 // High-Z Control -#define CYGARC_REG_BCR1_ENDIAN 0x0800 // Endian Flag -#define CYGARC_REG_BCR1_A0_BST_MASK 0x0600 // Area 0 Burst ROM Control -#define CYGARC_REG_BCR1_A0_BST_4 0x0200 -#define CYGARC_REG_BCR1_A0_BST_8 0x0400 -#define CYGARC_REG_BCR1_A0_BST_16 0x0600 -#define CYGARC_REG_BCR1_A5_BST_MASK 0x0180 // Area 5 Burst ROM Control -#define CYGARC_REG_BCR1_A5_BST_4 0x0080 -#define CYGARC_REG_BCR1_A5_BST_8 0x0100 -#define CYGARC_REG_BCR1_A5_BST_16 0x0180 -#define CYGARC_REG_BCR1_A6_BST_MASK 0x0060 // Area 6 Burst ROM Control -#define CYGARC_REG_BCR1_A6_BST_4 0x0020 -#define CYGARC_REG_BCR1_A6_BST_8 0x0040 -#define CYGARC_REG_BCR1_A6_BST_16 0x0060 -#define CYGARC_REG_BCR1_DRAMTP_MASK 0x001c // Area 2, Area 3 Memory Type -#define CYGARC_REG_BCR1_A5PCM 0x0002 // Area 5 Bus Type -#define CYGARC_REG_BCR1_A6PCM 0x0001 // Area 6 Bus Type - -// Intercycle wait states -#define CYGARC_REG_WCR1_WAITSEL 0x8000 // WAIT Sampling Timing Select -#define CYGARC_REG_WCR1_A6I_MASK 0x3000 // Intercycle Idle Specification -#define CYGARC_REG_WCR1_A6I_SHIFT 12 -#define CYGARC_REG_WCR1_A5I_MASK 0x0c00 -#define CYGARC_REG_WCR1_A5I_SHIFT 10 -#define CYGARC_REG_WCR1_A4I_MASK 0x0300 -#define CYGARC_REG_WCR1_A4I_SHIFT 8 -#define CYGARC_REG_WCR1_A3I_MASK 0x00c0 -#define CYGARC_REG_WCR1_A3I_SHIFT 6 -#define CYGARC_REG_WCR1_A2I_MASK 0x0030 -#define CYGARC_REG_WCR1_A2I_SHIFT 4 -#define CYGARC_REG_WCR1_A0I_MASK 0x0003 -#define CYGARC_REG_WCR1_A0I_SHIFT 0 - -#define CYGARC_REG_WCR1_0WS 0 -#define CYGARC_REG_WCR1_1WS 1 -#define CYGARC_REG_WCR1_2WS 2 -#define CYGARC_REG_WCR1_3WS 3 - - -// Wait states -#define CYGARC_REG_WCR2_A6_MASK 0xe000 // Wait states + burst pitch -#define CYGARC_REG_WCR2_A6_SHIFT 13 -#define CYGARC_REG_WCR2_A5_MASK 0x1c00 // Wait states + burst pitch -#define CYGARC_REG_WCR2_A5_SHIFT 10 -#define CYGARC_REG_WCR2_A4_MASK 0x0380 // Wait states -#define CYGARC_REG_WCR2_A4_SHIFT 7 -#define CYGARC_REG_WCR2_A3_MASK 0x0060 // Wait states / CAS latency -#define CYGARC_REG_WCR2_A3_SHIFT 5 -#define CYGARC_REG_WCR2_A2_MASK 0x0018 // Wait states / CAS latency -#define CYGARC_REG_WCR2_A2_SHIFT 3 -#define CYGARC_REG_WCR2_A0_MASK 0x0007 // Wait states + burst pitch -#define CYGARC_REG_WCR2_A0_SHIFT 0 - -#define CYGARC_REG_WCR2_0WS 0 -#define CYGARC_REG_WCR2_1WS 1 -#define CYGARC_REG_WCR2_2WS 2 -#define CYGARC_REG_WCR2_3WS 3 -#define CYGARC_REG_WCR2_4WS 4 -#define CYGARC_REG_WCR2_6WS 5 -#define CYGARC_REG_WCR2_8WS 6 -#define CYGARC_REG_WCR2_10WS 7 - - -//----------------------------------------------------------------------------- -// Calculate constants needed to drive the proper SDRAM refresh rate. Argument -// is delay between required refresh events in microseconds (us). Should be -// available off the SDRAM spec sheet. -// These should be a part of a fully CDLicized memory controller setup. -#define CYGARC_RTCSR_PRESCALE(_r_) \ -(((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(4*1000000))<256) ? 4 : \ - ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(16*1000000))<256) ? 16 : \ - ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(64*1000000))<256) ? 64 : \ - ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(256*1000000))<256) ? 256 : \ - ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(1024*1000000))<256) ? 1024 : \ - ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(2048*1000000))<256) ? 2048 : 4096) - -// These two macros provide the static values we need to stuff into the -// registers. -#define CYGARC_RTCSR_CKSx(_r_) \ - (( 4 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x08 : \ - ( 16 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x10 : \ - ( 64 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x18 : \ - ( 256 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x20 : \ - (1024 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x28 : \ - (2048 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x30 : 0x38 ) - -#define CYGARC_RTCSR_N(_r_) \ - (CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(CYGARC_RTCSR_PRESCALE(_r_)*1000000)) - - -//++++++ Module UBC ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// User Break Control -#define CYGARC_REG_BRCR 0xffffff98 // 16 bit - -#define CYGARC_REG_BARA 0xffffffb0 // 32 bit -#define CYGARC_REG_BAMRA 0xffffffb4 // 8 bit (v1) / 32 bit -#define CYGARC_REG_BBRA 0xffffffb8 // 16 bit -#define CYGARC_REG_BASRA 0xffffffe4 // 8 bit - -#define CYGARC_REG_BARB 0xffffffa0 // 32 bit -#define CYGARC_REG_BAMRB 0xffffffa4 // 8 bit (v1) / 32 bit -#define CYGARC_REG_BASRB 0xffffffe8 // 8 bit -#define CYGARC_REG_BBRB 0xffffffa8 // 16 bit -#define CYGARC_REG_BDRB 0xffffff90 // 32 bit -#define CYGARC_REG_BDMRB 0xffffff94 // 32 bit - -#ifdef CYGARC_SH_MOD_UBC_V3 -#define CYGARC_REG_BETR 0xffffff9c // 16 bit -#define CYGARC_REG_BRSR 0xffffffac // 32 bit -#define CYGARC_REG_BRDR 0xffffffbc // 32 bit -#endif - -#define CYGARC_REG_BRCR_CMFA 0x8000 // condition match flag A -#define CYGARC_REG_BRCR_CMFB 0x4000 // condition match flag B -#define CYGARC_REG_BRCR_PCBA 0x0400 // post execute channel A -#define CYGARC_REG_BRCR_DBEB 0x0080 // data break enable B -#define CYGARC_REG_BRCR_PCBB 0x0040 // post execute channel B -#define CYGARC_REG_BRCR_SEQ 0x0008 // sequence condition select - -#ifdef CYGARC_SH_MOD_UBC_V1 -#define CYGARC_REG_BAMRA_BASMA 0x04 // BASRA masked -#define CYGARC_REG_BAMRA_BARA_UNMASKED 0x00 // BARA not masked -#define CYGARC_REG_BAMRA_BARA_10BIT 0x01 // Lowest 10 bit masked -#define CYGARC_REG_BAMRA_BARA_12BIT 0x02 // Lowest 12 bit masked -#define CYGARC_REG_BAMRA_BARA_MASKED 0x03 // All bits masked -#else -// mask is fully configurable in other versions of the UBC -#endif - -#ifdef CYGARC_SH_MOD_UBC_V3 -#define CYGARC_REG_BBRA_DMA 0x0080 // Break on DMAC cycle -#define CYGARC_REG_BBRA_CPU 0x0040 // Break on CPU cycle -#endif -#define CYGARC_REG_BBRA_DFETCH 0x0020 // Break on DFETCH -#define CYGARC_REG_BBRA_IFETCH 0x0010 // Break on IFETCH -#define CYGARC_REG_BBRA_WRITE 0x0008 // Break on WRITE -#define CYGARC_REG_BBRA_READ 0x0004 // Break on READ -#define CYGARC_REG_BBRA_SIZE_LONG 0x0003 // Break on long access -#define CYGARC_REG_BBRA_SIZE_WORD 0x0002 // Break on word access -#define CYGARC_REG_BBRA_SIZE_BYTE 0x0001 // Break on byte access -#define CYGARC_REG_BBRA_SIZE_ANY 0x0000 // Break on any size - - -//++++++ Module CPG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// Oscillator control registers -#define CYGARC_REG_FRQCR 0xffffff80 -#define CYGARC_REG_WTCNT 0xffffff84 // read 8bit, write 16bit -#define CYGARC_REG_WTCSR 0xffffff86 // read 8bit, write 16bit - -#define CYGARC_REG_WTCNT_WRITE 0x5a00 // top 8bit value for write - -#define CYGARC_REG_WTCSR_WRITE 0xa500 // top 8bit value for write -#define CYGARC_REG_WTCSR_TME 0x80 // timer enable -#define CYGARC_REG_WTCSR_WT_IT 0x40 // watchdog(1)/interval(0) -#define CYGARC_REG_WTCSR_RSTS 0x20 // manual(1)/poweron(0) -#define CYGARC_REG_WTCSR_WOVF 0x10 // watchdog overflow -#define CYGARC_REG_WTCSR_IOVF 0x08 // interval overflow -#define CYGARC_REG_WTCSR_CKS2 0x04 // clock select 2 -#define CYGARC_REG_WTCSR_CKS1 0x02 // clock select 1 -#define CYGARC_REG_WTCSR_CKS0 0x01 // clock select 0 -#define CYGARC_REG_WTCSR_CKSx_MASK 0x07 // clock select mask -// This is the period (in us) between watchdog reset and overflow. -// Note: We use max timeout delay for now. -#define CYGARC_REG_WTCSR_CKSx_SETTING 0x07 // max delay - -#define CYGARC_REG_WTCSR_PERIOD ((1000000000/(CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/4096))*256) - -// Translate various CDL clock configurations to register equivalents -// for the various CPG versions -#if defined(CYGARC_SH_MOD_CPG_V1) // ---------------------------- V1 - -// PLL1 -#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 -#else -# error "Unsupported PLL1 setting" -#endif - -// Divider1 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 -#else -# error "Unsupported Divider1 setting" -#endif - -// Divider2 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 -#else -# error "Unsupported Divider1 setting" -#endif - -// CKOEN - set in all modes but 7 -#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE != 7) -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 -#else -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 -#endif - -#elif defined(CYGARC_SH_MOD_CPG_V2) // ---------------------------- V2 - -// PLL1 -#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 -#else -# error "Unsupported PLL1 setting" -#endif - -// Divider1 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 -#else -# error "Unsupported Divider1 setting" -#endif - -// Divider2 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 -#else -# error "Unsupported Divider1 setting" -#endif - -// CKOEN - set in all modes but 2 -#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE != 2) -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 -#else -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 -#endif - -#elif defined(CYGARC_SH_MOD_CPG_V3) // ---------------------------- V3 - -// PLL1 -#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 3) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x8000 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 6) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x8010 -#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 8) -# define CYGARC_REG_FRQCR_INIT_PLL1 0x0030 -#else -# error "Unsupported PLL1 setting" -#endif - -// Divider1 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 3) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x4000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 -#else -# error "Unsupported Divider1 setting" -#endif - -// Divider2 -#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 3) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x2000 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 -#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 6) -# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x2002 -#else -# error "Unsupported Divider2 setting" -#endif - -// CKOEN - set in modes 0-2 -#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE <= 2) -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 -#else -# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 -#endif - -#else - -# error "Unsupported CPG version" - -#endif - -// Init value -#define CYGARC_REG_FRQCR_INIT (CYGARC_REG_FRQCR_INIT_PLL1|CYGARC_REG_FRQCR_INIT_DIVIDER1|CYGARC_REG_FRQCR_INIT_DIVIDER2|CYGARC_REG_FRQCR_INIT_CKOEN) - -//++++++ Module TMU ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// TMU registers -#define CYGARC_REG_TOCR 0xfffffe90 // 8 bit -#define CYGARC_REG_TSTR 0xfffffe92 // 8 bit -#define CYGARC_REG_TCOR0 0xfffffe94 // 32 bit -#define CYGARC_REG_TCNT0 0xfffffe98 // 32 bit -#define CYGARC_REG_TCR0 0xfffffe9c // 16 bit -#define CYGARC_REG_TCOR1 0xfffffea0 // 32 bit -#define CYGARC_REG_TCNT1 0xfffffea4 // 32 bit -#define CYGARC_REG_TCR1 0xfffffea8 // 16 bit -#define CYGARC_REG_TCOR2 0xfffffeac // 32 bit -#define CYGARC_REG_TCNT2 0xfffffeb0 // 32 bit -#define CYGARC_REG_TCR2 0xfffffeb4 // 16 bit -#define CYGARC_REG_TCPR2 0xfffffeb8 // 32 bit - -// TSTR -#define CYGARC_REG_TSTR_STR0 0x0001 -#define CYGARC_REG_TSTR_STR1 0x0002 -#define CYGARC_REG_TSTR_STR2 0x0004 - -// TCR0/1/2 -#define CYGARC_REG_TCR_TPSC0 0x0001 -#define CYGARC_REG_TCR_TPSC1 0x0002 -#define CYGARC_REG_TCR_TPSC2 0x0004 -#define CYGARC_REG_TCR_CKEG0 0x0008 -#define CYGARC_REG_TCR_CKEG1 0x0010 -#define CYGARC_REG_TCR_UNIE 0x0020 -#define CYGARC_REG_TCR_UNF 0x0100 - -#define CYGARC_REG_TCR_TPSC_4 (0) -#define CYGARC_REG_TCR_TPSC_16 (CYGARC_REG_TCR_TPSC0) -#define CYGARC_REG_TCR_TPSC_64 (CYGARC_REG_TCR_TPSC1) -#define CYGARC_REG_TCR_TPSC_256 (CYGARC_REG_TCR_TPSC0|CYGARC_REG_TCR_TPSC1) - -// TCR2 additional bits -#define CYGARC_REG_TCR_ICPE0 0x0040 -#define CYGARC_REG_TCR_ICPE1 0x0080 -#define CYGARC_REG_TCR_ICPF 0x0200 - - -//++++++ Module INTC +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// Interrupt registers -#define CYGARC_REG_EXCEVT 0xffffffd4 -#define CYGARC_REG_INTEVT 0xffffffd8 - -#define CYGARC_REG_ICR 0xfffffee0 -#define CYGARC_REG_IPRA 0xfffffee2 -#define CYGARC_REG_IPRB 0xfffffee4 - -//#ifdef CYGARC_SH_MOD_INTC_V2 // FIXME: HAL_INTERRUPT_SET_LEVEL needs these -# define CYGARC_REG_INTEVT2 0xa4000000 -# define CYGARC_REG_IRR0 0xa4000004 -# define CYGARC_REG_IRR1 0xa4000006 -# define CYGARC_REG_IRR2 0xa4000008 -# define CYGARC_REG_ICR0 CYGARC_REG_ICR -# define CYGARC_REG_ICR1 0xa4000010 -# define CYGARC_REG_ICR2 0xa4000012 -# define CYGARC_REG_INTER 0xa4000014 -# define CYGARC_REG_IPRC 0xa4000016 -# define CYGARC_REG_IPRD 0xa4000018 -# define CYGARC_REG_IPRE 0xa400001a -//#endif -//#ifdef CYGARC_SH_MOD_INTC_V3 // FIXME: HAL_INTERRUPT_SET_LEVEL needs these -# define CYGARC_REG_IRR3 0xa400000a -# define CYGARC_REG_IRR4 0xa400000c -# define CYGARC_REG_IPRF 0xa400001c -//#endif - - -#define CYGARC_REG_IPRA_TMU0_MASK 0xf000 -#define CYGARC_REG_IPRA_TMU0_PRI1 0x1000 -#define CYGARC_REG_IPRA_TMU1_MASK 0x0f00 -#define CYGARC_REG_IPRA_TMU1_PRI1 0x0100 -#define CYGARC_REG_IPRA_TMU2_MASK 0x00f0 -#define CYGARC_REG_IPRA_TMU2_PRI1 0x0010 -#define CYGARC_REG_IPRA_RTC_MASK 0x000f -#define CYGARC_REG_IPRA_RTC_PRI1 0x0001 - -#define CYGARC_REG_IPRB_WDT_MASK 0xf000 -#define CYGARC_REG_IPRB_WDT_PRI1 0x1000 -#define CYGARC_REG_IPRB_REF_MASK 0x0f00 -#define CYGARC_REG_IPRB_REF_PRI1 0x0100 -#define CYGARC_REG_IPRB_SCI_MASK 0x00f0 -#define CYGARC_REG_IPRB_SCI_PRI1 0x0010 - -//#ifdef CYGARC_SH_MOD_INTC_V2 // FIXME: HAL_INTERRUPT_SET_LEVEL needs these -#define CYGARC_REG_IPRC_IRQ3_MASK 0xf000 -#define CYGARC_REG_IPRC_IRQ3_PRI1 0x1000 -#define CYGARC_REG_IPRC_IRQ2_MASK 0x0f00 -#define CYGARC_REG_IPRC_IRQ2_PRI1 0x0100 -#define CYGARC_REG_IPRC_IRQ1_MASK 0x00f0 -#define CYGARC_REG_IPRC_IRQ1_PRI1 0x0010 -#define CYGARC_REG_IPRC_IRQ0_MASK 0x000f -#define CYGARC_REG_IPRC_IRQ0_PRI1 0x0001 - -#define CYGARC_REG_IPRD_PINT07_MASK 0xf000 -#define CYGARC_REG_IPRD_PINT07_PRI1 0x1000 -#define CYGARC_REG_IPRD_PINT8F_MASK 0x0f00 -#define CYGARC_REG_IPRD_PINT8F_PRI1 0x0100 -#define CYGARC_REG_IPRD_IRQ5_MASK 0x00f0 -#define CYGARC_REG_IPRD_IRQ5_PRI1 0x0010 -#define CYGARC_REG_IPRD_IRQ4_MASK 0x000f -#define CYGARC_REG_IPRD_IRQ4_PRI1 0x0001 - -#define CYGARC_REG_IPRE_DMAC_MASK 0xf000 -#define CYGARC_REG_IPRE_DMAC_PRI1 0x1000 -#define CYGARC_REG_IPRE_IRDA_MASK 0x0f00 -#define CYGARC_REG_IPRE_IRDA_PRI1 0x0100 -#define CYGARC_REG_IPRE_SCIF_MASK 0x00f0 -#define CYGARC_REG_IPRE_SCIF_PRI1 0x0010 -#define CYGARC_REG_IPRE_ADC_MASK 0x000f -#define CYGARC_REG_IPRE_ADC_PRI1 0x0001 - -#define CYGARC_REG_ICR1_MAI 0x8000 -#define CYGARC_REG_ICR1_IRQLVL 0x4000 -#define CYGARC_REG_ICR1_BLMSK 0x2000 -#define CYGARC_REG_ICR1_IRLSEN 0x1000 -#define CYGARC_REG_ICR1_SENSE_IRQ5_shift 10 -#define CYGARC_REG_ICR1_SENSE_IRQ4_shift 8 -#define CYGARC_REG_ICR1_SENSE_IRQ3_shift 6 -#define CYGARC_REG_ICR1_SENSE_IRQ2_shift 4 -#define CYGARC_REG_ICR1_SENSE_IRQ1_shift 2 -#define CYGARC_REG_ICR1_SENSE_IRQ0_shift 0 -#define CYGARC_REG_ICR1_SENSE_LEVEL 0x2 -#define CYGARC_REG_ICR1_SENSE_UP 0x1 - -// The (initial) IRQ mode is controlled by configuration. -#ifdef CYGHWR_HAL_SH_IRQ_USE_IRQLVL -# ifdef CYGHWR_HAL_SH_IRQ_ENABLE_IRLS_INTERRUPTS -# define CYGARC_REG_ICR1_INIT (CYGARC_REG_ICR1_IRLSEN|CYGARC_REG_ICR1_IRQLVL) -# else -# define CYGARC_REG_ICR1_INIT (CYGARC_REG_ICR1_IRQLVL) -# endif -#else -# define CYGARC_REG_ICR1_INIT 0x0000 -#endif - -#define CYGARC_REG_IRR0_PINT07 0x80 -#define CYGARC_REG_IRR0_PINT8F 0x40 -#define CYGARC_REG_IRR0_IRQ5 0x20 -#define CYGARC_REG_IRR0_IRQ4 0x10 -#define CYGARC_REG_IRR0_IRQ3 0x08 -#define CYGARC_REG_IRR0_IRQ2 0x04 -#define CYGARC_REG_IRR0_IRQ1 0x02 -#define CYGARC_REG_IRR0_IRQ0 0x01 - -//#endif - -//#ifdef CYGARC_SH_MOD_INTC_V3 // FIXME: HAL_INTERRUPT_SET_LEVEL needs these -#define CYGARC_REG_IPRF_LCDI_MASK 0x0f00 -#define CYGARC_REG_IPRF_LCDI_PRI1 0x0100 -#define CYGARC_REG_IPRF_PCC0_MASK 0x00f0 -#define CYGARC_REG_IPRF_PCC0_PRI1 0x0010 -#define CYGARC_REG_IPRF_PCC1_MASK 0x000f -#define CYGARC_REG_IPRF_PCC1_PRI1 0x0001 - -//#endif - -//++++++ Module RTC ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// RealTime Clock - -#define CYGARC_REG_RC64CNT 0xfffffec0 -#define CYGARC_REG_RSECCNT 0xfffffec2 -#define CYGARC_REG_RMINCNT 0xfffffec4 -#define CYGARC_REG_RHRCNT 0xfffffec6 -#define CYGARC_REG_RWKCNT 0xfffffec8 -#define CYGARC_REG_RDAYCNT 0xfffffeca -#define CYGARC_REG_RMONCNT 0xfffffecc -#define CYGARC_REG_RYRCNT 0xfffffece -#define CYGARC_REG_RSECAR 0xfffffed0 -#define CYGARC_REG_RMINAR 0xfffffed2 -#define CYGARC_REG_RHRAR 0xfffffed4 -#define CYGARC_REG_RWKAR 0xfffffed6 -#define CYGARC_REG_RDAYAR 0xfffffed8 -#define CYGARC_REG_RMONAR 0xfffffeda -#define CYGARC_REG_RCR1 0xfffffedc -#define CYGARC_REG_RCR2 0xfffffede - - -#define CYGARC_REG_RCR1_CF 0x80 // carry flag -#define CYGARC_REG_RCR1_CIE 0x10 // carry interrupt enable -#define CYGARC_REG_RCR1_AIE 0x08 // alarm interrupt enable -#define CYGARC_REG_RCR1_AF 0x01 // alarm flag - -#define CYGARC_REG_RCR2_PEF 0x80 // periodic interrupt flag -#define CYGARC_REG_RCR2_PES2 0x40 // periodic interrupt setting -#define CYGARC_REG_RCR2_PES1 0x20 -#define CYGARC_REG_RCR2_PES0 0x10 -#define CYGARC_REG_RCR2_RTCEN 0x08 // RTC enable -#define CYGARC_REG_RCR2_ADJ 0x04 // second adjustment -#define CYGARC_REG_RCR2_RESET 0x02 // reset -#define CYGARC_REG_RCR2_START 0x01 // start - - - -//++++++ Module SCI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//-------------------------------------------------------------------------- -// Serial registers. All 8 bit registers. -#define CYGARC_REG_SCSMR 0xfffffe80 // serial mode register -#define CYGARC_REG_SCBRR 0xfffffe82 // bit rate register -#define CYGARC_REG_SCSCR 0xfffffe84 // serial control register -#define CYGARC_REG_SCTDR 0xfffffe86 // transmit data register -#define CYGARC_REG_SCSSR 0xfffffe88 // serial status register -#define CYGARC_REG_SCRDR 0xfffffe8a // receive data register - -#ifdef CYGARC_SH_MOD_SCI_V2 -# define CYGARC_REG_SCSPTR 0xfffffe7c // serial port register -#endif - -// Serial Mode Register -#define CYGARC_REG_SCSMR_CA 0x80 // communication mode -#define CYGARC_REG_SCSMR_CHR 0x40 // character length (7 if set) -#define CYGARC_REG_SCSMR_PE 0x20 // parity enable -#define CYGARC_REG_SCSMR_OE 0x10 // parity mode -#define CYGARC_REG_SCSMR_STOP 0x08 // stop bit length -#define CYGARC_REG_SCSMR_MP 0x04 // multiprocessor mode -#define CYGARC_REG_SCSMR_CKS1 0x02 // clock select 1 -#define CYGARC_REG_SCSMR_CKS0 0x01 // clock select 0 -#define CYGARC_REG_SCSMR_CKSx_MASK 0x03 // mask - -// Serial Control Register -#define CYGARC_REG_SCSCR_TIE 0x80 // transmit interrupt enable -#define CYGARC_REG_SCSCR_RIE 0x40 // receive interrupt enable -#define CYGARC_REG_SCSCR_TE 0x20 // transmit enable -#define CYGARC_REG_SCSCR_RE 0x10 // receive enable -#define CYGARC_REG_SCSCR_MPIE 0x08 // multiprocessor interrupt enable -#define CYGARC_REG_SCSCR_TEIE 0x04 // transmit-end interrupt enable -#define CYGARC_REG_SCSCR_CKE1 0x02 // clock enable 1 -#define CYGARC_REG_SCSCR_CKE0 0x01 // clock enable 0 - -// Serial Status Register -#define CYGARC_REG_SCSSR_TDRE 0x80 // transmit data register empty -#define CYGARC_REG_SCSSR_RDRF 0x40 // receive data register full -#define CYGARC_REG_SCSSR_ORER 0x20 // overrun error -#define CYGARC_REG_SCSSR_FER 0x10 // framing error -#define CYGARC_REG_SCSSR_PER 0x08 // parity error -#define CYGARC_REG_SCSSR_TEND 0x04 // transmit end -#define CYGARC_REG_SCSSR_MPB 0x02 // multiprocessor bit -#define CYGARC_REG_SCSSR_MPBT 0x01 // multiprocessor bit transfer - -// When clearing the status register, always write the value: -// CYGARC_REG_SCSSR_CLEARMASK & ~bit -// to prevent other bits than the one of interest to be cleared. -#define CYGARC_REG_SCSSR_CLEARMASK 0xf8 - -// Baud rate values calculation, depending on peripheral clock (Pf) -// n is CKS setting (0-3) -// N = (Pf/(64*2^(2n-1)*B))-1 -// With CYGARC_SCBRR_CKSx providing the values 1, 4, 16, 64 we get -// N = (Pf/(32*_CKS*B))-1 -// -// The CYGARC_SCBRR_OPTIMAL_CKS macro should compute the minimal CKS -// setting for the given baud rate and peripheral clock. -// -// The error of the CKS+count value can be computed by: -// E(%) = ((Pf/((N+1)*B*(64^(n-1)))-1)*100 -// -#define CYGARC_SCBRR_PRESCALE(_b_) \ -((((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/1/(_b_))-1)<256) ? 1 : \ - (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/4/(_b_))-1)<256) ? 4 : \ - (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/16/(_b_))-1)<256) ? 16 : 64) - -// These two macros provide the static values we need to stuff into the -// registers. -#define CYGARC_SCBRR_CKSx(_b_) \ - ((1 == CYGARC_SCBRR_PRESCALE(_b_)) ? 0 : \ - (4 == CYGARC_SCBRR_PRESCALE(_b_)) ? 1 : \ - (16 == CYGARC_SCBRR_PRESCALE(_b_)) ? 2 : 3) -#define CYGARC_SCBRR_N(_b_) \ - (((_b_) < 4800) ? 0 : \ - ((_b_) > 115200) ? 0 : \ - ((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1)) - -//++++++ Module IRDA +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#ifdef CYGARC_SH_MOD_IRDA - -//-------------------------------------------------------------------------- -// IrDA (infrared data association). Can also act as regular serial w FIFO - -#define CYGARC_REG_SCSMR1 0xa4000140 -#define CYGARC_REG_SCBRR1 0xa4000142 -#define CYGARC_REG_SCSCR1 0xa4000144 -#define CYGARC_REG_SCFTDR1 0xa4000146 -#define CYGARC_REG_SCSSR1 0xa4000148 -#define CYGARC_REG_SCFRDR1 0xa400014a -#define CYGARC_REG_SCFCR1 0xa400014c -#define CYGARC_REG_SCFDR1 0xa400014e - -// Serial Mode Register -#define CYGARC_REG_SCSMR1_IRMOD 0x80 // IrDA Mode -#define CYGARC_REG_SCSMR1_ICK_MASK 0x78 // IR pulse width -#define CYGARC_REG_SCSMR1_PSEL 0x04 // IR pulse selector(?) -#define CYGARC_REG_SCSMR1_CKS1 0x02 // clock select 1 -#define CYGARC_REG_SCSMR1_CKS0 0x01 // clock select 0 -#define CYGARC_REG_SCSMR1_CKSx_MASK 0x03 // mask - -// Serial Control Register -#define CYGARC_REG_SCSCR1_TIE 0x80 // transmit interrupt enable -#define CYGARC_REG_SCSCR1_RIE 0x40 // receive interrupt enable -#define CYGARC_REG_SCSCR1_TE 0x20 // transmit enable -#define CYGARC_REG_SCSCR1_RE 0x10 // receive enable -#define CYGARC_REG_SCSCR1_CKE1 0x02 // clock enable 1 -#define CYGARC_REG_SCSCR1_CKE0 0x01 // clock enable 0 - -// Serial Status Register -#define CYGARC_REG_SCSSR1_PER_MASK 0xf000 // number of parity errors -#define CYGARC_REG_SCSSR1_PER_shift 12 -#define CYGARC_REG_SCSSR1_FER_MASK 0x0f00 // number of framing errors -#define CYGARC_REG_SCSSR1_FER_shift 8 -#define CYGARC_REG_SCSSR1_ER 0x0080 // receive error -#define CYGARC_REG_SCSSR1_TEND 0x0040 // transmit end -#define CYGARC_REG_SCSSR1_TDFE 0x0020 // transmit fifo data empty -#define CYGARC_REG_SCSSR1_BRK 0x0010 // break detection -#define CYGARC_REG_SCSSR1_FER 0x0008 // framing error -#define CYGARC_REG_SCSSR1_PER 0x0004 // parity error -#define CYGARC_REG_SCSSR1_RDF 0x0002 // receive fifo data full -#define CYGARC_REG_SCSSR1_DR 0x0001 // receive data ready - -// When clearing the status register, always write the value: -// CYGARC_REG_SCSSR2_CLEARMASK & ~bit -// to prevent other bits than the one of interest to be cleared. -#define CYGARC_REG_SCSSR1_CLEARMASK 0xf3 - -// Serial FIFO Control Register -#define CYGARC_REG_SCFCR1_RTRG_MASK 0xc0 // receive fifo data trigger -#define CYGARC_REG_SCFCR1_RTRG_1 0x00 // trigger on 1 char -#define CYGARC_REG_SCFCR1_RTRG_4 0x40 // trigger on 4 chars -#define CYGARC_REG_SCFCR1_RTRG_8 0x80 // trigger on 8 chars -#define CYGARC_REG_SCFCR1_RTRG_14 0xc0 // trigger on 14 chars - -#define CYGARC_REG_SCFCR1_TTRG_MASK 0x30 // transmit fifo data trigger -#define CYGARC_REG_SCFCR1_TTRG_8 0x00 // trigger on 8 chars -#define CYGARC_REG_SCFCR1_TTRG_4 0x10 // trigger on 4 chars -#define CYGARC_REG_SCFCR1_TTRG_2 0x20 // trigger on 2 chars -#define CYGARC_REG_SCFCR1_TTRG_1 0x30 // trigger on 1 char - -#define CYGARC_REG_SCFCR1_MCE 0x08 // modem control enable -#define CYGARC_REG_SCFCR1_TFRST 0x04 // transmit fifo reset -#define CYGARC_REG_SCFCR1_RFRST 0x02 // receive fifo reset -#define CYGARC_REG_SCFCR1_LOOP 0x01 // loop back test - - -// Serial FIFO Data Count Set Register -#define CYGARC_REG_SCFDR1_RCOUNT_MASK 0x001f // number of chars in r fifo -#define CYGARC_REG_SCFDR1_RCOUNT_shift 0 -#define CYGARC_REG_SCFDR1_TCOUNT_MASK 0x1f00 // number of chars in t fifo -#define CYGARC_REG_SCFDR1_TCOUNT_shift 8 - -#endif // CYGARC_SH_MOD_IRDA - -//++++++ Module SCIF +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#ifdef CYGARC_SH_MOD_SCIF - -//-------------------------------------------------------------------------- -// Serial w FIFO registers - -#define CYGARC_REG_SCSMR2 0xa4000150 // Serial mode -#define CYGARC_REG_SCBRR2 0xa4000152 // Bit rate -#define CYGARC_REG_SCSCR2 0xa4000154 // Serial control -#define CYGARC_REG_SCFTDR2 0xa4000156 // Transmit FIFO data -#define CYGARC_REG_SCSSR2 0xa4000158 // Serial status -#define CYGARC_REG_SCFRDR2 0xa400015a // Receive data FIFO -#define CYGARC_REG_SCFCR2 0xa400015c // FIFO control register -#define CYGARC_REG_SCFDR2 0xa400015e // FIFO data count set - -// Serial Mode Register -#define CYGARC_REG_SCSMR2_CHR 0x40 // character length (7 if set) -#define CYGARC_REG_SCSMR2_PE 0x20 // parity enable -#define CYGARC_REG_SCSMR2_OE 0x10 // parity mode -#define CYGARC_REG_SCSMR2_STOP 0x08 // stop bit length -#define CYGARC_REG_SCSMR2_CKS1 0x02 // clock select 1 -#define CYGARC_REG_SCSMR2_CKS0 0x01 // clock select 0 -#define CYGARC_REG_SCSMR2_CKSx_MASK 0x03 // mask - -// Serial Control Register -#define CYGARC_REG_SCSCR2_TIE 0x80 // transmit interrupt enable -#define CYGARC_REG_SCSCR2_RIE 0x40 // receive interrupt enable -#define CYGARC_REG_SCSCR2_TE 0x20 // transmit enable -#define CYGARC_REG_SCSCR2_RE 0x10 // receive enable -#define CYGARC_REG_SCSCR2_CKE1 0x02 // clock enable 1 -#define CYGARC_REG_SCSCR2_CKE0 0x01 // clock enable 0 - -// Serial Status Register -#define CYGARC_REG_SCSSR2_PER_MASK 0xf000 // number of parity errors -#define CYGARC_REG_SCSSR2_PER_shift 12 -#define CYGARC_REG_SCSSR2_FER_MASK 0x0f00 // number of framing errors -#define CYGARC_REG_SCSSR2_FER_shift 8 -#define CYGARC_REG_SCSSR2_ER 0x0080 // receive error -#define CYGARC_REG_SCSSR2_TEND 0x0040 // transmit end -#define CYGARC_REG_SCSSR2_TDFE 0x0020 // transmit fifo data empty -#define CYGARC_REG_SCSSR2_BRK 0x0010 // break detection -#define CYGARC_REG_SCSSR2_FER 0x0008 // framing error -#define CYGARC_REG_SCSSR2_PER 0x0004 // parity error -#define CYGARC_REG_SCSSR2_RDF 0x0002 // receive fifo data full -#define CYGARC_REG_SCSSR2_DR 0x0001 // receive data ready - -// When clearing the status register, always write the value: -// CYGARC_REG_SCSSR2_CLEARMASK & ~bit -// to prevent other bits than the one of interest to be cleared. -#define CYGARC_REG_SCSSR2_CLEARMASK 0xf3 - -// Serial FIFO Control Register -#define CYGARC_REG_SCFCR2_RTRG_MASK 0xc0 // receive fifo data trigger -#define CYGARC_REG_SCFCR2_RTRG_1 0x00 // trigger on 1 char -#define CYGARC_REG_SCFCR2_RTRG_4 0x40 // trigger on 4 chars -#define CYGARC_REG_SCFCR2_RTRG_8 0x80 // trigger on 8 chars -#define CYGARC_REG_SCFCR2_RTRG_14 0xc0 // trigger on 14 chars - -#define CYGARC_REG_SCFCR2_TTRG_MASK 0x30 // transmit fifo data trigger -#define CYGARC_REG_SCFCR2_TTRG_8 0x00 // trigger on 8 chars -#define CYGARC_REG_SCFCR2_TTRG_4 0x10 // trigger on 4 chars -#define CYGARC_REG_SCFCR2_TTRG_2 0x20 // trigger on 2 chars -#define CYGARC_REG_SCFCR2_TTRG_1 0x30 // trigger on 1 char - -#define CYGARC_REG_SCFCR2_MCE 0x08 // modem control enable -#define CYGARC_REG_SCFCR2_TFRST 0x04 // transmit fifo reset -#define CYGARC_REG_SCFCR2_RFRST 0x02 // receive fifo reset -#define CYGARC_REG_SCFCR2_LOOP 0x01 // loop back test - - -// Serial FIFO Data Count Set Register -#define CYGARC_REG_SCFDR2_RCOUNT_MASK 0x001f // number of chars in r fifo -#define CYGARC_REG_SCFDR2_RCOUNT_shift 0 -#define CYGARC_REG_SCFDR2_TCOUNT_MASK 0x1f00 // number of chars in t fifo -#define CYGARC_REG_SCFDR2_TCOUNT_shift 8 - -#endif // CYGARC_SH_MOD_SCIF - -//++++++ Module DMAC +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#ifdef CYGARC_SH_MOD_DMAC - -//-------------------------------------------------------------------------- -// DMA Controller registers - -#define CYGARC_REG_SAR0 0xa4000020 -#define CYGARC_REG_DAR0 0xa4000024 -#define CYGARC_REG_DMATCR0 0xa4000028 -#define CYGARC_REG_CHCR0 0xa400002c -#define CYGARC_REG_SAR1 0xa4000030 -#define CYGARC_REG_DAR1 0xa4000034 -#define CYGARC_REG_DMATCR1 0xa4000038 -#define CYGARC_REG_CHCR1 0xa400003c -#define CYGARC_REG_SAR2 0xa4000040 -#define CYGARC_REG_DAR2 0xa4000044 -#define CYGARC_REG_DMATCR2 0xa4000048 -#define CYGARC_REG_CHCR2 0xa400004c -#define CYGARC_REG_SAR3 0xa4000050 -#define CYGARC_REG_DAR3 0xa4000054 -#define CYGARC_REG_DMATCR3 0xa4000058 -#define CYGARC_REG_CHCR3 0xa400005c -#define CYGARC_REG_DMAOR 0xa4000060 - -// Offsets from base register -#define CYGARC_REG_SAR 0x00 -#define CYGARC_REG_DAR 0x04 -#define CYGARC_REG_DMATCR 0x08 -#define CYGARC_REG_CHCR 0x0c - - -// DMA Channel Control Register. If there's a digit suffix to CHCR the flag -// is only valid in the listed channels. -#define CYGARC_REG_CHCR3_DI 0x00100000 // direct/indirect selection -#define CYGARC_REG_CHCR2_RO 0x00080000 // source address reload -#define CYGARC_REG_CHCR01_RL 0x00040000 // request check level -#define CYGARC_REG_CHCR01_AM 0x00020000 // acknowledge mode -#define CYGARC_REG_CHCR01_AL 0x00010000 // acknowledge level -#define CYGARC_REG_CHCR_DM1 0x00008000 // destination address mode -#define CYGARC_REG_CHCR_DM0 0x00004000 -#define CYGARC_REG_CHCR_SM1 0x00002000 // source address mode -#define CYGARC_REG_CHCR_SM0 0x00001000 -#define CYGARC_REG_CHCR_RS3 0x00000800 // resource select -#define CYGARC_REG_CHCR_RS2 0x00000400 -#define CYGARC_REG_CHCR_RS1 0x00000200 -#define CYGARC_REG_CHCR_RS0 0x00000100 -#define CYGARC_REG_CHCR01_DS 0x00000040 // DREQ select -#define CYGARC_REG_CHCR_TM 0x00000020 // transmit mode -#define CYGARC_REG_CHCR_TS1 0x00000010 // transmit size -#define CYGARC_REG_CHCR_TS0 0x00000008 -#define CYGARC_REG_CHCR_IE 0x00000004 // interrupt enable -#define CYGARC_REG_CHCR_TE 0x00000002 // transfer end -#define CYGARC_REG_CHCR_DE 0x00000001 // DMAC enable - -// Resource select options -#define CYGARC_REG_CHCR_RS_EXT_DUAL 0x00000000 -#define CYGARC_REG_CHCR_RS_EXT_EX_DAC 0x00000100 -#define CYGARC_REG_CHCR_RS_EXT_DAC_EX 0x00000300 -#define CYGARC_REG_CHCR_RS_AUTO 0x00000400 -#define CYGARC_REG_CHCR_RS_IRDA_TX 0x00000a00 -#define CYGARC_REG_CHCR_RS_IRDA_RX 0x00000b00 -#define CYGARC_REG_CHCR_RS_SCIF_TX 0x00000c00 -#define CYGARC_REG_CHCR_RS_SCIF_RX 0x00000d00 -#define CYGARC_REG_CHCR_RS_AD 0x00000e00 -#define CYGARC_REG_CHCR_RS_CMT 0x00000f00 - - -// DMA Operation Register -#define CYGARC_REG_DMAOR_PR1 0x0200 // priority level -#define CYGARC_REG_DMAOR_PR0 0x0100 -#define CYGARC_REG_DMAOR_AE 0x0004 // address error flag -#define CYGARC_REG_DMAOR_NMIF 0x0002 // NMI flag -#define CYGARC_REG_DMAOR_DME 0x0001 // DMA master enable - - -#endif // CYGARC_SH_MOD_DMAC - -//++++++ Module PFC +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#ifdef CYGARC_SH_MOD_PFC - -#define CYGARC_REG_PACR 0xa4000100 // port A control -#define CYGARC_REG_PBCR 0xa4000102 // port B control -#define CYGARC_REG_PCCR 0xa4000104 // port C control -#define CYGARC_REG_PDCR 0xa4000106 // port D control -#define CYGARC_REG_PECR 0xa4000108 // port E control -#define CYGARC_REG_PFCR 0xa400010a // port F control -#define CYGARC_REG_PGCR 0xa400010c // port G control -#define CYGARC_REG_PHCR 0xa400010e // port H control -#define CYGARC_REG_PJCR 0xa4000110 // port J control -#define CYGARC_REG_PKCR 0xa4000112 // port K control -#define CYGARC_REG_PLCR 0xa4000114 // port L control -#define CYGARC_REG_SCPCR 0xa4000116 // SC port control - -#define CYGARC_REG_PADR 0xa4000120 // port A data -#define CYGARC_REG_PBDR 0xa4000122 // port B data -#define CYGARC_REG_PCDR 0xa4000124 // port C data -#define CYGARC_REG_PDDR 0xa4000126 // port D data -#define CYGARC_REG_PEDR 0xa4000128 // port E data -#define CYGARC_REG_PFDR 0xa400012a // port F data -#define CYGARC_REG_PGDR 0xa400012c // port G data -#define CYGARC_REG_PHDR 0xa400012e // port H data -#define CYGARC_REG_PJDR 0xa4000130 // port J data -#define CYGARC_REG_PKDR 0xa4000132 // port K data -#define CYGARC_REG_PLDR 0xa4000134 // port L data -#define CYGARC_REG_SCPDR 0xa4000136 // SC port data - - -// Port C -#define CYGARC_REG_PCCR_PC7_MASK 0xc000 -#define CYGARC_REG_PCCR_PC7_shift 14 -#define CYGARC_REG_PCCR_PC6_MASK 0x3000 -#define CYGARC_REG_PCCR_PC6_shift 12 -#define CYGARC_REG_PCCR_PC5_MASK 0x0c00 -#define CYGARC_REG_PCCR_PC5_shift 10 -#define CYGARC_REG_PCCR_PC4_MASK 0x0300 -#define CYGARC_REG_PCCR_PC4_shift 8 -#define CYGARC_REG_PCCR_PC3_MASK 0x00c0 -#define CYGARC_REG_PCCR_PC3_shift 6 -#define CYGARC_REG_PCCR_PC2_MASK 0x0030 -#define CYGARC_REG_PCCR_PC2_shift 4 -#define CYGARC_REG_PCCR_PC1_MASK 0x000c -#define CYGARC_REG_PCCR_PC1_shift 2 -#define CYGARC_REG_PCCR_PC0_MASK 0x0003 -#define CYGARC_REG_PCCR_PC0_shift 0 - -#define CYGARC_REG_PCCR_MD_OTHER 0x0 -#define CYGARC_REG_PCCR_MD_OUT 0x1 -#define CYGARC_REG_PCCR_MD_IN_ON 0x2 -#define CYGARC_REG_PCCR_MD_IN_OFF 0x3 - -#define CYGARC_REG_PCDR_PC7DT 0x80 -#define CYGARC_REG_PCDR_PC6DT 0x40 -#define CYGARC_REG_PCDR_PC5DT 0x20 -#define CYGARC_REG_PCDR_PC4DT 0x10 -#define CYGARC_REG_PCDR_PC3DT 0x08 -#define CYGARC_REG_PCDR_PC2DT 0x04 -#define CYGARC_REG_PCDR_PC1DT 0x02 -#define CYGARC_REG_PCDR_PC0DT 0x01 - - -#endif // CYGARC_SH_MOD_PFC +#include #endif // ifndef CYGONCE_HAL_SH_REGS_H diff --git a/packages/hal/sh/arch/current/src/hal_misc.c b/packages/hal/sh/arch/current/src/hal_misc.c --- a/packages/hal/sh/arch/current/src/hal_misc.c +++ b/packages/hal/sh/arch/current/src/hal_misc.c @@ -53,6 +53,8 @@ #include // HAL cache #include // HAL interrupts/exceptions +#include // timer registers + //--------------------------------------------------------------------------- // Functions used during initialization. @@ -193,43 +195,6 @@ hal_idle_thread_action( cyg_uint32 count } //--------------------------------------------------------------------------- -// Initial cache enabling - -#ifdef CYGHWR_HAL_SH_CACHE_MODE_P0_WRITE_BACK -# define CACHE_MODE_P0 0 -#else -# define CACHE_MODE_P0 CYGARC_REG_CCR_WT -#endif - -#ifdef CYGHWR_HAL_SH_CACHE_MODE_P1_WRITE_BACK -# define CACHE_MODE_P1 CYGARC_REG_CCR_CB -#else -# define CACHE_MODE_P1 0 -#endif - -externC void -cyg_hal_enable_caches(void) -{ - // Initialize cache. - HAL_UCACHE_INVALIDATE_ALL(); - - // Set cache modes - HAL_UCACHE_WRITE_MODE_SH(CACHE_MODE_P0|CACHE_MODE_P1); - -#ifdef CYGHWR_HAL_SH_CACHE_ENABLE - // Enable cache. - HAL_UCACHE_ENABLE(); -#endif -} - -//--------------------------------------------------------------------------- -// SH3 variant stuff -// This should be split out... -void -hal_variant_init(void) -{ -} - // Low-level delay (in microseconds) void @@ -259,342 +224,4 @@ hal_delay_us(int usecs) } //--------------------------------------------------------------------------- -// Interrupt function support - -#ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING -externC cyg_uint8 cyg_hal_ILVL_table[]; -#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) \ - /* Update the ILVL table, so it is easy for the interrupt entry */ \ - /* code to find out the level of a given interrupt source. */ \ - cyg_hal_ILVL_table[(_vector_)] = (_level_) -#else -#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) -#endif - -void -hal_interrupt_set_level(int vector, int level) -{ - cyg_uint16 iprX; - - CYG_ASSERT((0 <= (level) && 15 >= (level)), "Illegal level"); - CYG_ASSERT((CYGNUM_HAL_ISR_MIN <= (vector) - && CYGNUM_HAL_ISR_MAX >= (vector)), "Illegal vector"); - - HAL_UPDATE_ILVL_TABLE(vector, level); - - switch( (vector) ) { - case CYGNUM_HAL_INTERRUPT_NMI: - /* fall through */ - case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: - /* Cannot change levels */ - break; - - /* IPRA */ - case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0: - HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); - iprX &= ~CYGARC_REG_IPRA_TMU0_MASK; - iprX |= (level)*CYGARC_REG_IPRA_TMU0_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); - break; - case CYGNUM_HAL_INTERRUPT_TMU1_TUNI1: - HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); - iprX &= ~CYGARC_REG_IPRA_TMU1_MASK; - iprX |= (level)*CYGARC_REG_IPRA_TMU1_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); - break; - case CYGNUM_HAL_INTERRUPT_TMU2_TUNI2: - case CYGNUM_HAL_INTERRUPT_TMU2_TICPI2: - HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); - iprX &= ~CYGARC_REG_IPRA_TMU2_MASK; - iprX |= (level)*CYGARC_REG_IPRA_TMU2_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); - break; - case CYGNUM_HAL_INTERRUPT_RTC_ATI: - case CYGNUM_HAL_INTERRUPT_RTC_PRI: - case CYGNUM_HAL_INTERRUPT_RTC_CUI: - HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); - iprX &= ~CYGARC_REG_IPRA_RTC_MASK; - iprX |= (level)*CYGARC_REG_IPRA_RTC_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); - break; - - /* IPRB */ - case CYGNUM_HAL_INTERRUPT_SCI_ERI: - case CYGNUM_HAL_INTERRUPT_SCI_RXI: - case CYGNUM_HAL_INTERRUPT_SCI_TXI: - case CYGNUM_HAL_INTERRUPT_SCI_TEI: - HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); - iprX &= ~CYGARC_REG_IPRB_SCI_MASK; - iprX |= (level)*CYGARC_REG_IPRB_SCI_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); - break; - case CYGNUM_HAL_INTERRUPT_WDT_ITI: - HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); - iprX &= ~CYGARC_REG_IPRB_WDT_MASK; - iprX |= (level)*CYGARC_REG_IPRB_WDT_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); - break; - case CYGNUM_HAL_INTERRUPT_REF_RCMI: - case CYGNUM_HAL_INTERRUPT_REF_ROVI: - HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); - iprX &= ~CYGARC_REG_IPRB_REF_MASK; - iprX |= (level)*CYGARC_REG_IPRB_REF_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); - break; - -#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL - /* IPRC */ - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: - HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); - iprX &= ~CYGARC_REG_IPRC_IRQ0_MASK; - iprX |= (level)*CYGARC_REG_IPRC_IRQ0_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: - HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); - iprX &= ~CYGARC_REG_IPRC_IRQ1_MASK; - iprX |= (level)*CYGARC_REG_IPRC_IRQ1_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: - HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); - iprX &= ~CYGARC_REG_IPRC_IRQ2_MASK; - iprX |= (level)*CYGARC_REG_IPRC_IRQ2_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: - HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); - iprX &= ~CYGARC_REG_IPRC_IRQ3_MASK; - iprX |= (level)*CYGARC_REG_IPRC_IRQ3_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); - break; -#endif - /* IPRD */ - case CYGNUM_HAL_INTERRUPT_PINT_PINT07: - HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); - iprX &= ~CYGARC_REG_IPRD_PINT07_MASK; - iprX |= (level)*CYGARC_REG_IPRD_PINT07_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); - break; - case CYGNUM_HAL_INTERRUPT_PINT_PINT8F: - HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); - iprX &= ~CYGARC_REG_IPRD_PINT8F_MASK; - iprX |= (level)*CYGARC_REG_IPRD_PINT8F_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: - HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); - iprX &= ~CYGARC_REG_IPRD_IRQ5_MASK; - iprX |= (level)*CYGARC_REG_IPRD_IRQ5_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: - HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); - iprX &= ~CYGARC_REG_IPRD_IRQ4_MASK; - iprX |= (level)*CYGARC_REG_IPRD_IRQ4_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); - break; - - /* IPRE */ - case CYGNUM_HAL_INTERRUPT_DMAC_DEI0: - case CYGNUM_HAL_INTERRUPT_DMAC_DEI1: - case CYGNUM_HAL_INTERRUPT_DMAC_DEI2: - case CYGNUM_HAL_INTERRUPT_DMAC_DEI3: - HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); - iprX &= ~CYGARC_REG_IPRE_DMAC_MASK; - iprX |= (level)*CYGARC_REG_IPRE_DMAC_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); - break; - case CYGNUM_HAL_INTERRUPT_IRDA_ERI1: - case CYGNUM_HAL_INTERRUPT_IRDA_RXI1: - case CYGNUM_HAL_INTERRUPT_IRDA_BRI1: - case CYGNUM_HAL_INTERRUPT_IRDA_TXI1: - HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); - iprX &= ~CYGARC_REG_IPRE_IRDA_MASK; - iprX |= (level)*CYGARC_REG_IPRE_IRDA_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); - break; - case CYGNUM_HAL_INTERRUPT_SCIF_ERI2: - case CYGNUM_HAL_INTERRUPT_SCIF_RXI2: - case CYGNUM_HAL_INTERRUPT_SCIF_BRI2: - case CYGNUM_HAL_INTERRUPT_SCIF_TXI2: - HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); - iprX &= ~CYGARC_REG_IPRE_SCIF_MASK; - iprX |= (level)*CYGARC_REG_IPRE_SCIF_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); - break; - case CYGNUM_HAL_INTERRUPT_ADC_ADI: - HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); - iprX &= ~CYGARC_REG_IPRE_ADC_MASK; - iprX |= (level)*CYGARC_REG_IPRE_ADC_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); - break; - - /* IPRF */ - case CYGNUM_HAL_INTERRUPT_LCDC_LCDI: - HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); - iprX &= ~CYGARC_REG_IPRF_LCDI_MASK; - iprX |= (level)*CYGARC_REG_IPRF_LCDI_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); - break; - case CYGNUM_HAL_INTERRUPT_PCC_PCC0: - HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); - iprX &= ~CYGARC_REG_IPRF_PCC0_MASK; - iprX |= (level)*CYGARC_REG_IPRF_PCC0_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); - break; - case CYGNUM_HAL_INTERRUPT_PCC_PCC1: - HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); - iprX &= ~CYGARC_REG_IPRF_PCC1_MASK; - iprX |= (level)*CYGARC_REG_IPRF_PCC1_PRI1; - HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); - break; - - case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: - case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: - /* Do nothing for these reserved vectors. */ - break; - - default: - CYG_FAIL("Unknown interrupt vector"); - break; - } -} - -void -hal_interrupt_mask(int vector) -{ - switch( (vector) ) { - case CYGNUM_HAL_INTERRUPT_NMI: - /* fall through */ - case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: - /* Can only be masked by fiddling Imask in SR. */ - break; - case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: - HAL_INTERRUPT_SET_LEVEL((vector), 0); - break; - case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: - case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: - /* Do nothing for these reserved vectors. */ - break; - default: - CYG_FAIL("Unknown interrupt vector"); - break; - } -} - -void -hal_interrupt_unmask(int vector) -{ - switch( (vector) ) { - case CYGNUM_HAL_INTERRUPT_NMI: - /* fall through */ - case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: - /* Can only be unmasked by fiddling Imask in SR. */ - break; - case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: - HAL_INTERRUPT_SET_LEVEL((vector), 1); - break; - case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: - case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: - /* Do nothing for these reserved vectors. */ - break; - default: - CYG_FAIL("Unknown interrupt vector"); - break; - } -} - -void -hal_interrupt_acknowledge(int vector) -{ - if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 - && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { - - cyg_uint8 irr0; - - HAL_READ_UINT8(CYGARC_REG_IRR0, irr0); - switch ( vector ) { -#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: - irr0 &= ~CYGARC_REG_IRR0_IRQ0; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: - irr0 &= ~CYGARC_REG_IRR0_IRQ1; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: - irr0 &= ~CYGARC_REG_IRR0_IRQ2; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: - irr0 &= ~CYGARC_REG_IRR0_IRQ3; - break; -#endif - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: - irr0 &= ~CYGARC_REG_IRR0_IRQ4; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: - irr0 &= ~CYGARC_REG_IRR0_IRQ5; - break; - default: - CYG_FAIL("Unhandled interrupt vector"); - } - HAL_WRITE_UINT8(CYGARC_REG_IRR0, irr0); - } -} - -// Note: The PINTs can be masked and configured individually, even -// though there are only two vectors. Maybe add some fake vectors just -// for masking/configuring? -void -hal_interrupt_configure(int vector, int level, int up) -{ - if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 - && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { - - cyg_uint16 icr1, ss, mask; - ss = 0; - mask = CYGARC_REG_ICR1_SENSE_UP|CYGARC_REG_ICR1_SENSE_LEVEL; - if (up) ss |= CYGARC_REG_ICR1_SENSE_UP; - if (level) ss |= CYGARC_REG_ICR1_SENSE_LEVEL; - CYG_ASSERT(!(up && level), "Cannot trigger on high level!"); - - switch( (vector) ) { - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; - break; -#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; - break; - case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: - ss <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; - mask <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; - break; -#endif - default: - CYG_FAIL("Unhandled interrupt vector"); - } - - HAL_READ_UINT16(CYGARC_REG_ICR1, icr1); - icr1 &= ~mask; - icr1 |= ss; - HAL_WRITE_UINT16(CYGARC_REG_ICR1, icr1); - } -} - -//--------------------------------------------------------------------------- // End of hal_misc.c diff --git a/packages/hal/sh/arch/current/src/hal_mk_defs.c b/packages/hal/sh/arch/current/src/hal_mk_defs.c --- a/packages/hal/sh/arch/current/src/hal_mk_defs.c +++ b/packages/hal/sh/arch/current/src/hal_mk_defs.c @@ -103,18 +103,6 @@ main(void) DEFINE(CYGNUM_HAL_VSR_MAX, CYGNUM_HAL_VSR_MAX); DEFINE(CYGNUM_HAL_VSR_COUNT, CYGNUM_HAL_VSR_COUNT); DEFINE(CYGNUM_HAL_VSR_EXCEPTION_COUNT, CYGNUM_HAL_VSR_EXCEPTION_COUNT); - - // Caching details - DEFINE(CYGARC_REG_CACHE_ADDRESS_FLUSH, CYGARC_REG_CACHE_ADDRESS_FLUSH); - DEFINE(CYGARC_REG_CACHE_ADDRESS_BASE,CYGARC_REG_CACHE_ADDRESS_BASE); - DEFINE(CYGARC_REG_CACHE_ADDRESS_TOP,CYGARC_REG_CACHE_ADDRESS_TOP); - DEFINE(CYGARC_REG_CACHE_ADDRESS_STEP,CYGARC_REG_CACHE_ADDRESS_STEP); - DEFINE(HAL_UCACHE_SIZE, HAL_UCACHE_SIZE); - DEFINE(HAL_UCACHE_WAYS, HAL_UCACHE_WAYS); - DEFINE(HAL_UCACHE_LINE_SIZE, HAL_UCACHE_LINE_SIZE); - - - // Variant definitions - want these to be included instead. } //-------------------------------------------------------------------------- diff --git a/packages/hal/sh/arch/current/src/sh3_sci.c b/packages/hal/sh/arch/current/src/sh3_sci.c deleted file mode 100644 --- a/packages/hal/sh/arch/current/src/sh3_sci.c +++ /dev/null @@ -1,307 +0,0 @@ -//============================================================================= -// -// sh3_sci.c -// -// Simple driver for the SH Serial Communication Interface (SCI) -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 1999-05-17 -// Description: Simple driver for the SH Serial Communication Interface -// Clients of this file can configure the behavior with: -// CYGNUM_SCI_PORTS: number of SCI ports -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#ifdef CYGNUM_HAL_SH_SH3_SCI_PORTS - -#include // IO macros -#include // CYG_ISR_HANDLED -#include // Helper functions -#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS -#include // SAVE/RESTORE GP -#include // Calling-if API -#include // serial register definitions - -#include // our header - -//-------------------------------------------------------------------------- - -#ifndef CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE -# define CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE 38400 -#endif - -void -cyg_hal_plf_sci_init_channel(const channel_data_t* chan) -{ - cyg_uint8 tmp; - cyg_uint8* base = chan->base; - - // Disable Tx/Rx interrupts, but enable Tx/Rx - HAL_WRITE_UINT8(base+_REG_SCSCR, - CYGARC_REG_SCSCR_TE|CYGARC_REG_SCSCR_RE); - - // 8-1-no parity. - HAL_WRITE_UINT8(base+_REG_SCSMR, 0); - - // Set speed to CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE - HAL_READ_UINT8(base+_REG_SCSMR, tmp); - tmp &= ~CYGARC_REG_SCSMR_CKSx_MASK; - tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE); - HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); - HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE)); -} - -static cyg_bool -cyg_hal_plf_sci_getc_nonblock(void* __ch_data, cyg_uint8* ch) -{ - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - cyg_uint8 sr; - - HAL_READ_UINT8(base+_REG_SCSSR, sr); - if ((sr & CYGARC_REG_SCSSR_RDRF) == 0) - return false; - - HAL_READ_UINT8(base+_REG_SCRDR, *ch); - - // Clear buffer full flag. - HAL_WRITE_UINT8(base+_REG_SCSSR, sr & ~CYGARC_REG_SCSSR_RDRF); - - return true; -} - -cyg_uint8 -cyg_hal_plf_sci_getc(void* __ch_data) -{ - cyg_uint8 ch; - CYGARC_HAL_SAVE_GP(); - - while(!cyg_hal_plf_sci_getc_nonblock(__ch_data, &ch)); - - CYGARC_HAL_RESTORE_GP(); - return ch; -} - -void -cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c) -{ - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - cyg_uint8 sr; - CYGARC_HAL_SAVE_GP(); - - do { - HAL_READ_UINT8(base+_REG_SCSSR, sr); - } while ((sr & CYGARC_REG_SCSSR_TDRE) == 0); - - HAL_WRITE_UINT8(base+_REG_SCTDR, c); - - // Clear empty flag. - HAL_WRITE_UINT8(base+_REG_SCSSR, sr & ~CYGARC_REG_SCSSR_TDRE); - - // Hang around until the character has been safely sent. - do { - HAL_READ_UINT8(base+_REG_SCSSR, sr); - } while ((sr & CYGARC_REG_SCSSR_TDRE) == 0); - - CYGARC_HAL_RESTORE_GP(); -} - -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - -static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCI_PORTS]; - -static void -cyg_hal_plf_sci_write(void* __ch_data, const cyg_uint8* __buf, - cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - cyg_hal_plf_sci_putc(__ch_data, *__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - -static void -cyg_hal_plf_sci_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - *__buf++ = cyg_hal_plf_sci_getc(__ch_data); - - CYGARC_HAL_RESTORE_GP(); -} - -cyg_bool -cyg_hal_plf_sci_getc_timeout(void* __ch_data, cyg_uint8* ch) -{ - channel_data_t* chan = (channel_data_t*)__ch_data; - int delay_count; - cyg_bool res; - CYGARC_HAL_SAVE_GP(); - - delay_count = chan->msec_timeout * 10; // delay in .1 ms steps - - for(;;) { - res = cyg_hal_plf_sci_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_sci_control(void *__ch_data, __comm_control_cmd_t __func, ...) -{ - static int irq_state = 0; - channel_data_t* chan = (channel_data_t*)__ch_data; - cyg_uint8 scr; - int ret = 0; - CYGARC_HAL_SAVE_GP(); - - switch (__func) { - case __COMMCTL_IRQ_ENABLE: - irq_state = 1; - HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr |= CYGARC_REG_SCSCR_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); - break; - case __COMMCTL_IRQ_DISABLE: - ret = irq_state; - irq_state = 0; - HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr &= ~CYGARC_REG_SCSCR_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); - 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_sci_isr(void *__ch_data, int* __ctrlc, - CYG_ADDRWORD __vector, CYG_ADDRWORD __data) -{ - cyg_uint8 c, sr; - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - int res = 0; - CYGARC_HAL_SAVE_GP(); - - *__ctrlc = 0; - HAL_READ_UINT8(base+_REG_SCSSR, sr); - if (sr & CYGARC_REG_SCSSR_RDRF) { - HAL_READ_UINT8(base+_REG_SCRDR, c); - - // Clear buffer full flag. - HAL_WRITE_UINT8(base+_REG_SCSSR, - CYGARC_REG_SCSSR_CLEARMASK & ~CYGARC_REG_SCSSR_RDRF); - - if( cyg_hal_is_break( &c , 1 ) ) - *__ctrlc = 1; - - res = CYG_ISR_HANDLED; - } - - CYGARC_HAL_RESTORE_GP(); - return res; -} - -void -cyg_hal_plf_sci_init(int sci_index, int comm_index, - int rcv_vect, cyg_uint8* base) -{ - channel_data_t* chan = &channels[sci_index]; - hal_virtual_comm_table_t* comm; - int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); - - // Initialize channel table - chan->base = base; - chan->isr_vector = rcv_vect; - chan->msec_timeout = 1000; - - // Disable interrupts. - HAL_INTERRUPT_MASK(chan->isr_vector); - - // Init channel - - cyg_hal_plf_sci_init_channel(chan); - - // Setup procs in the vector table - - // Initialize channel procs - CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); - comm = CYGACC_CALL_IF_CONSOLE_PROCS(); - CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); - CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_sci_write); - CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_sci_read); - CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_sci_putc); - CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_sci_getc); - CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_sci_control); - CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_sci_isr); - CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_sci_getc_timeout); - - // Restore original console - CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); -} - -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - -#endif // CYGNUM_HAL_SH_SH3_SCI_PORTS - -//----------------------------------------------------------------------------- -// end of sh_sci.c diff --git a/packages/hal/sh/arch/current/src/sh3_scif.c b/packages/hal/sh/arch/current/src/sh3_scif.c deleted file mode 100644 --- a/packages/hal/sh/arch/current/src/sh3_scif.c +++ /dev/null @@ -1,344 +0,0 @@ -//============================================================================= -// -// sh3_scif.c -// -// Simple driver for the SH3 Serial Communication Interface with FIFO -// -//============================================================================= -//####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): jskov -// Contributors:jskov -// Date: 2000-03-30 -// Description: Simple driver for the SH Serial Communication Interface -// The driver can be used for either the SCIF or the IRDA -// modules (the latter can act as the former). -// Clients of this file can configure the behavior with: -// CYGNUM_SCIF_PORTS: number of SCI ports -// -// Note: It should be possible to configure a channel to IRDA mode. -// Worry about that when some board needs it. -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#ifdef CYGNUM_HAL_SH_SH3_SCIF_PORTS - -#include // IO macros -#include // CYG_ISR_HANDLED -#include // Helper functions -#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS -#include // SAVE/RESTORE GP -#include // Calling-if API -#include // serial register definitions -#include // target_register_t - -#include // our header - -//-------------------------------------------------------------------------- - -#ifndef CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE -# define CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE 38400 -#endif - -void -cyg_hal_plf_scif_init_channel(const channel_data_t* chan) -{ - cyg_uint8* base = chan->base; - cyg_uint8 tmp; - cyg_uint16 sr; - - // Disable everything. - HAL_WRITE_UINT8(base+_REG_SCSCR, 0); - - // Reset FIFO. - HAL_WRITE_UINT8(base+_REG_SCFCR, - CYGARC_REG_SCFCR2_TFRST|CYGARC_REG_SCFCR2_RFRST); - - // 8-1-no parity. - HAL_WRITE_UINT8(base+_REG_SCSMR, 0); - - // Set speed to CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE - HAL_READ_UINT8(base+_REG_SCSMR, tmp); - tmp &= ~CYGARC_REG_SCSMR2_CKSx_MASK; - tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE); - HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); - HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE)); - - // Let things settle: Here we should should wait the equivalent of - // one bit interval, - // i.e. 1/CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE second, but - // until we have something like the Linux delay loop, it's hard to - // do reliably. So just move on and hope for the best (this is - // unlikely to cause problems since the CPU has just come out of - // reset anyway). - - // Clear status register (read back first). - HAL_READ_UINT16(base+_REG_SCSSR, sr); - HAL_WRITE_UINT16(base+_REG_SCSSR, 0); - - // Bring FIFO out of reset and set to trigger on every char in - // FIFO (or C-c input would not be processed). - HAL_WRITE_UINT8(base+_REG_SCFCR, - CYGARC_REG_SCFCR2_RTRG_1|CYGARC_REG_SCFCR2_TTRG_1); - - // Leave Tx/Rx interrupts disabled, but enable Tx/Rx - HAL_WRITE_UINT8(base+_REG_SCSCR, - CYGARC_REG_SCSCR2_TE|CYGARC_REG_SCSCR2_RE); -} - -//static -cyg_bool -cyg_hal_plf_scif_getc_nonblock(void* __ch_data, cyg_uint8* ch) -{ - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - cyg_uint16 fdr, sr; - - HAL_READ_UINT16(base+_REG_SCFDR, fdr); - if (0 == (fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK)) - return false; - - HAL_READ_UINT8(base+_REG_SCFRDR, *ch); - - // Clear DR/RDF flags - HAL_READ_UINT16(base+_REG_SCSSR, sr); - HAL_WRITE_UINT16(base+_REG_SCSSR, - CYGARC_REG_SCSSR2_CLEARMASK & ~(CYGARC_REG_SCSSR2_RDF | CYGARC_REG_SCSSR2_DR)); - - return true; -} - -cyg_uint8 -cyg_hal_plf_scif_getc(void* __ch_data) -{ - cyg_uint8 ch; - CYGARC_HAL_SAVE_GP(); - - while(!cyg_hal_plf_scif_getc_nonblock(__ch_data, &ch)); - - CYGARC_HAL_RESTORE_GP(); - return ch; -} - -void -cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c) -{ - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - cyg_uint16 fdr, sr; - CYGARC_HAL_SAVE_GP(); - - do { - HAL_READ_UINT16(base+_REG_SCFDR, fdr); - } while (((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) >> CYGARC_REG_SCFDR2_TCOUNT_shift) == 16); - - HAL_WRITE_UINT8(base+_REG_SCFTDR, c); - - // Clear FIFO-empty/transmit end flags (read back SR first) - HAL_READ_UINT16(base+_REG_SCSSR, sr); - HAL_WRITE_UINT16(base+_REG_SCSSR, CYGARC_REG_SCSSR2_CLEARMASK - & ~(CYGARC_REG_SCSSR2_TDFE | CYGARC_REG_SCSSR2_TEND )); - - // Hang around until the character has been safely sent. - do { - HAL_READ_UINT16(base+_REG_SCFDR, fdr); - } while ((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) != 0); - - CYGARC_HAL_RESTORE_GP(); -} - -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - -static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCIF_PORTS]; - -static void -cyg_hal_plf_scif_write(void* __ch_data, const cyg_uint8* __buf, - cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - cyg_hal_plf_scif_putc(__ch_data, *__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - -static void -cyg_hal_plf_scif_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - *__buf++ = cyg_hal_plf_scif_getc(__ch_data); - - CYGARC_HAL_RESTORE_GP(); -} - -cyg_bool -cyg_hal_plf_scif_getc_timeout(void* __ch_data, cyg_uint8* ch) -{ - channel_data_t* chan = (channel_data_t*)__ch_data; - int delay_count; - cyg_bool res; - CYGARC_HAL_SAVE_GP(); - - delay_count = chan->msec_timeout * 10; // delay in .1 ms steps - - for(;;) { - res = cyg_hal_plf_scif_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_scif_control(void *__ch_data, __comm_control_cmd_t __func, ...) -{ - static int irq_state = 0; - channel_data_t* chan = (channel_data_t*)__ch_data; - cyg_uint8 scr; - int ret = 0; - CYGARC_HAL_SAVE_GP(); - - switch (__func) { - case __COMMCTL_IRQ_ENABLE: - irq_state = 1; - HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr |= CYGARC_REG_SCSCR2_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); - break; - case __COMMCTL_IRQ_DISABLE: - ret = irq_state; - irq_state = 0; - HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr &= ~CYGARC_REG_SCSCR2_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); - 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_scif_isr(void *__ch_data, int* __ctrlc, - CYG_ADDRWORD __vector, CYG_ADDRWORD __data) -{ - cyg_uint8 c; - cyg_uint16 fdr, sr; - cyg_uint8* base = ((channel_data_t*)__ch_data)->base; - int res = 0; - CYGARC_HAL_SAVE_GP(); - - *__ctrlc = 0; - HAL_READ_UINT16(base+_REG_SCFDR, fdr); - if ((fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK) != 0) { - HAL_READ_UINT8(base+_REG_SCFRDR, c); - - // Clear buffer full flag (read back first). - HAL_READ_UINT16(base+_REG_SCSSR, sr); - HAL_WRITE_UINT16(base+_REG_SCSSR, - CYGARC_REG_SCSSR2_CLEARMASK & ~CYGARC_REG_SCSSR2_RDF); - - if( cyg_hal_is_break( &c , 1 ) ) - *__ctrlc = 1; - - res = CYG_ISR_HANDLED; - } - - CYGARC_HAL_RESTORE_GP(); - return res; -} - -void -cyg_hal_plf_scif_init(int scif_index, int comm_index, - int rcv_vect, cyg_uint8* base) -{ - channel_data_t* chan = &channels[scif_index]; - hal_virtual_comm_table_t* comm; - int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); - - // Initialize channel table - chan->base = base; - chan->isr_vector = rcv_vect; - chan->msec_timeout = 1000; - - // Disable interrupts. - HAL_INTERRUPT_MASK(chan->isr_vector); - - // Init channel - cyg_hal_plf_scif_init_channel(chan); - - // Setup procs in the vector table - - // Initialize channel procs - CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); - comm = CYGACC_CALL_IF_CONSOLE_PROCS(); - CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); - CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_scif_write); - CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_scif_read); - CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_scif_putc); - CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_scif_getc); - CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_scif_control); - CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_scif_isr); - CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_scif_getc_timeout); - - // Restore original console - CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); -} - -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - -#endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS - -//----------------------------------------------------------------------------- -// end of sh3_scif.c diff --git a/packages/hal/sh/arch/current/src/sh_stub.c b/packages/hal/sh/arch/current/src/sh_stub.c --- a/packages/hal/sh/arch/current/src/sh_stub.c +++ b/packages/hal/sh/arch/current/src/sh_stub.c @@ -131,7 +131,7 @@ void __single_step (void) // The address of the instruction to execute. HAL_WRITE_UINT32(CYGARC_REG_BARA, get_register(PC)); // Match entire address. -#ifdef CYGARC_SH_MOD_UBC_V1 +#if (CYGARC_SH_MOD_UBC == 1) HAL_WRITE_UINT8(CYGARC_REG_BAMRA, CYGARC_REG_BAMRA_BARA_UNMASKED); #else HAL_WRITE_UINT32(CYGARC_REG_BAMRA, 0xffffffff); @@ -140,7 +140,7 @@ void __single_step (void) HAL_WRITE_UINT16(CYGARC_REG_BRCR, CYGARC_REG_BRCR_PCBA); // Stop on IFETCH/READ HAL_WRITE_UINT16(CYGARC_REG_BBRA, -#ifdef CYGARC_SH_MOD_UBC_V3 +#if (CYGARC_SH_MOD_UBC == 3) CYGARC_REG_BBRA_CPU| // Match on CPU cycle #endif CYGARC_REG_BBRA_IFETCH|CYGARC_REG_BBRA_READ); diff --git a/packages/hal/sh/arch/current/src/vectors.S b/packages/hal/sh/arch/current/src/vectors.S --- a/packages/hal/sh/arch/current/src/vectors.S +++ b/packages/hal/sh/arch/current/src/vectors.S @@ -53,6 +53,7 @@ #endif #include +#include #include #include @@ -66,22 +67,6 @@ #undef __DEBUG #=========================================================================== -# SR initialization value -# zero all bits except: -# MD = Processor operation mode field (privileged mode) -# I0-3 = Mask out all interrupts but NMI. -# -# When saving or restoring the state of an exception or interrupt, the bit -# CYGARC_REG_SR_RB is also set, switching the register bank. When this bit -# is set, interrupts must be disabled. -# -# Note: We could also use the BL bit to prevent interrupts, but that would -# also prevent the use of breakpoints. - -#define CYG_SR (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK) -#define CYG_SR_BANK1 (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK|CYGARC_REG_SR_RB) - -#=========================================================================== # Start by defining the exceptions vectors. .section ".vectors","ax" @@ -124,7 +109,7 @@ mov #1,r7 #endif - mov #CYGARC_REG_EXCEVT,r1 + mov.l $nCYGARC_REG_EXCEVT,r1 mov.l @r1,r1 shlr2 r1 shlr r1 ! divide cause by 0x08 @@ -160,7 +145,7 @@ #ifdef __DEBUG mov.l $exc_state_marker,r0 mov.l r0,@-r15 - mov #CYGARC_REG_EXCEVT,r0 + mov.l $nCYGARC_REG_EXCEVT,r0 mov.l @r0,r0 mov.l r0,@-r15 #endif @@ -213,7 +198,7 @@ .globl _cyg_hal_default_exception_vsr_bp_safe _cyg_hal_default_exception_vsr_bp_safe: #endif - mov #CYGARC_REG_EXCEVT,r0 + mov.l $nCYGARC_REG_EXCEVT,r0 mov.l @r0,r4 mov #-5,r0 ! divide cause by 0x20 shld r0,r4 @@ -257,7 +242,7 @@ mov #2,r7 #endif - mov #CYGARC_REG_EXCEVT,r1 + mov.l $nCYGARC_REG_EXCEVT,r1 mov.l @r1,r1 shlr2 r1 shlr r1 ! divide cause by 0x08 @@ -269,6 +254,8 @@ .align 2 $_hal_vsr_table2: .long _hal_vsr_table +$nCYGARC_REG_EXCEVT: + .long CYGARC_REG_EXCEVT #--------------------------------------------------------------------------- # Interrupt entry @@ -279,7 +266,7 @@ #ifdef CYGHWR_HAL_SH_IRQ_HANDLE_SPURIOUS_INTERRUPTS # A spurious interrupt with INTEVT=0 may be caused by # clearing of BL. Those interrupts need to be ignored. - mov #CYGARC_REG_INTEVT,r0 + mov.l $nCYGARC_REG_INTEVT,r0 mov.l @r0,r0 cmp/eq #0,r0 bf 1f @@ -415,31 +402,13 @@ 1: mov.l r8,@-r15 1: #endif - # Decode the interrupt vector -#ifdef CYGARC_SH_MOD_INTC_V2 - mov.l $nCYGARC_REG_INTEVT2,r0 -#else - mov #CYGARC_REG_INTEVT,r0 -#endif - mov.l @r0,r4 - mov #-5,r0 ! divide cause by 0x20 - shld r0,r4 - add #-14,r4 ! adjust so NMI becomes 0 + # Decode the interrupt vector, and find ISR index + hal_intc_decode r0,r4 mov #CYGARC_SHREG_EVENT,r0 mov.l r4,@(r0,r8) ! store decoded vector number back ! to saved state. - - // Find ISR index. -#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN -#define CYG_ISR_TABLE_SIZE 1 - mov #0,r9 ! only one ISR in the table -#else // CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN -#define CYG_ISR_TABLE_SIZE CYGNUM_HAL_ISR_COUNT - mov r4,r9 - shll2 r9 ! get from vector number to ISR index -#endif // CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN - + hal_intc_translate r4,r9 #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) @@ -640,7 +609,9 @@ restore_state: .long CYG_SR $nCYG_SR_BANK1: .long CYG_SR_BANK1 -#ifdef CYGARC_SH_MOD_INTC_V2 +$nCYGARC_REG_INTEVT: + .long CYGARC_REG_INTEVT +#ifdef CYGARC_REG_INTEVT2 $nCYGARC_REG_INTEVT2: .long CYGARC_REG_INTEVT2 #endif @@ -675,54 +646,8 @@ restore_state: #--------------------------------------------------------------------------- # Platform initialization (reset) __reset_platform: - # Initialize CPU - mov.l $nCYG_SR,r1 ! Put CPU in a well-known state - ldc r1,sr - mov #0,r0 - mov #CYGARC_REG_CCR,r1 ! Disable cache - mov.l r0,@r1 - mov #CYGARC_REG_MMUCR,r1 ! Disable MMU - mov.l r0,@r1 - mov #CYGARC_REG_BBRA,r1 ! Disable UBC Channel A - mov.w r0,@r1 - mov #CYGARC_REG_BBRB,r1 ! Disable UBC Channel B - mov.w r0,@r1 - mov #CYGARC_REG_BRCR,r1 ! Reset UBC common register - mov.w r0,@r1 - mov.l $CYGARC_REG_TSTR,r1 ! Disable timers - mov.b r0,@r1 - mov.l $CYGARC_REG_IPRA,r1 ! Disable interrupt request sources - mov.w r0,@r1 - mov.l $CYGARC_REG_IPRB,r1 - mov.w r0,@r1 -#ifdef CYGARC_SH_MOD_INTC_V2 - mov.l $CYGARC_REG_IPRC,r1 - mov.w r0,@r1 - mov.l $CYGARC_REG_IPRD,r1 - mov.w r0,@r1 - mov.l $CYGARC_REG_IPRE,r1 - mov.w r0,@r1 -#ifdef CYGARC_SH_MOD_INTC_V3 - mov.l $CYGARC_REG_IPRF,r1 - mov.w r0,@r1 -#endif - mov.w $nCYG_ICR1_INIT,r0 - mov.l $CYGARC_REG_ICR1,r1 ! Set interrupt controller to IRQ mode - mov.w r0,@r1 -#endif - mov.w $nCYG_WTCSR,r0 ! Clear watchdog - mov #CYGARC_REG_WTCSR,r1 - mov.w r0,@r1 + hal_post_reset_init - # Initialize VBR if necessary -#if !defined(CYG_HAL_STARTUP_RAM) || \ - ( defined(CYG_HAL_STARTUP_RAM) && \ - !defined(CYGSEM_HAL_USE_ROM_MONITOR)) - mov.l $__reset,r1 ! Set VBR - ldc r1,vbr -#endif - - #ifdef __DEBUG mov #0,r0 mov #1,r1 @@ -740,45 +665,7 @@ restore_state: mov #13,r13 mov #14,r14 #endif - - bra hal_hw_init - nop - -$nCYG_WTCSR: - .word 0xa500 ! clear all CSR bits - - .align 2 - -$nCYG_SR: - .long CYG_SR -$CYGARC_REG_TSTR: - .long CYGARC_REG_TSTR -$CYGARC_REG_IPRA: - .long CYGARC_REG_IPRA -$CYGARC_REG_IPRB: - .long CYGARC_REG_IPRB -#ifdef CYGARC_SH_MOD_INTC_V2 -$CYGARC_REG_IPRC: - .long CYGARC_REG_IPRC -$CYGARC_REG_IPRD: - .long CYGARC_REG_IPRD -$CYGARC_REG_IPRE: - .long CYGARC_REG_IPRE -$CYGARC_REG_ICR1: - .long CYGARC_REG_ICR1 -#endif -#ifdef CYGARC_SH_MOD_INTC_V2 -$CYGARC_REG_IPRF: - .long CYGARC_REG_IPRF -$nCYG_ICR1_INIT: - .word CYGARC_REG_ICR1_INIT - .align 2 -#endif -$__reset: - .long __reset - -hal_hw_init: - + # Call platform specific hardware initialization # This may include memory controller initialization. It is not # safe to access RAM until after this point. @@ -895,7 +782,7 @@ 2: # nop # Enable caches - mov.l $_cyg_hal_enable_caches,r1 + mov.l $_cyg_var_enable_caches,r1 jsr @r1 nop @@ -950,8 +837,8 @@ 9: .long __bss_end $_cyg_hal_invoke_constructors: .long _cyg_hal_invoke_constructors -$_cyg_hal_enable_caches: - .long _cyg_hal_enable_caches +$_cyg_var_enable_caches: + .long _cyg_var_enable_caches $_hal_variant_init: .long _hal_variant_init $_hal_platform_init: @@ -972,151 +859,6 @@ 9: #endif #--------------------------------------------------------------------------- -# Cache operations -# These need to be written in assembly to ensure they do not rely on data -# in cachable space (i.e., code must use registers exclusively, not the stack). - -# This macro must be used at the top of each cache function. It ensures -# that the code gets executed from a shadow region where caching is disabled -# (0xA0000000). - .macro GOTO_NONCACHED_SHADOW - mova 10f,r0 - mov.l $MASK,r1 - and r1,r0 - mov.l $BASE,r1 - or r1,r0 - jmp @r0 - nop - .align 2 -10: - .endm - - .globl _cyg_hal_cache_enable -_cyg_hal_cache_enable: - GOTO_NONCACHED_SHADOW - mov #CYGARC_REG_CCR,r1 - mov.l @r1,r0 - or #CYGARC_REG_CCR_CE,r0 - mov.l r0,@r1 - nop - rts - nop - - .globl _cyg_hal_cache_disable -_cyg_hal_cache_disable: - GOTO_NONCACHED_SHADOW - mov #CYGARC_REG_CCR,r1 - mov.l @r1,r0 - mov #CYGARC_REG_CCR_CE,r2 - not r2,r2 - and r2,r0 - mov.l r0,@r1 - nop - rts - nop - - .globl _cyg_hal_cache_invalidate_all -_cyg_hal_cache_invalidate_all: - GOTO_NONCACHED_SHADOW - mov #CYGARC_REG_CCR,r1 - mov.l @r1,r0 - or #CYGARC_REG_CCR_CF,r0 - mov.l r0,@r1 - nop ! Nothing in the docs suggest we need - nop ! nops here, but without them, the - nop ! CPU crashes. - rts - nop - - .globl _cyg_hal_cache_sync -_cyg_hal_cache_sync: - GOTO_NONCACHED_SHADOW - mov.l $CYGARC_REG_CACHE_ADDRESS_FLUSH,r0 - mov.l $CYGARC_REG_CACHE_ADDRESS_BASE,r1 - mov.l $CYGARC_REG_CACHE_ADDRESS_TOP,r2 - mov.l $CYGARC_REG_CACHE_ADDRESS_STEP,r3 -1: cmp/hi r1,r2 - bf 2f - mov.l r0,@r1 - bra 1b - add r3,r1 ! delay slot! -2: nop - rts - nop - - ! r4 = base - ! r5 = size - .globl _cyg_hal_cache_sync_region -_cyg_hal_cache_sync_region: - GOTO_NONCACHED_SHADOW - mov.l 10f,r0 - and r4,r0 ! array index - mov.l 11f,r1 - add r0,r1 ! base (aligned, A set) - - ! make sure top is aligned to start of _next_ cache line - mov r1,r0 - add r5,r0 ! top (non-aligned) - add #2*HAL_UCACHE_LINE_SIZE-1,r0 - mov.l 13f,r2 - and r0,r2 - - mov.l $CYGARC_REG_CACHE_ADDRESS_STEP,r3 - mov.l 12f,r5 -1: cmp/hi r1,r2 - bf 3f - mov r4,r0 ! create address tag - and r5,r0 - mov.l r0,@r1 ! store tag in array, causing (sync+)invalidate - ! if the tag matches any of the lines - add r3,r4 ! inc address tag - bra 1b - add r3,r1 ! inc array index, delay slot! -3: nop - rts - nop - - .align 2 -10: .long ((HAL_UCACHE_SIZE/HAL_UCACHE_WAYS)-1)&~0xf ! mask -11: .long CYGARC_REG_CACHE_ADDRESS_BASE|CYGARC_REG_CACHE_ADDRESS_ADDRESS -12: .long CYGARC_REG_CACHE_ADDRESS_TAG_Mask -13: .long ~(HAL_UCACHE_LINE_SIZE-1) - - .globl _cyg_hal_cache_write_mode -_cyg_hal_cache_write_mode: - GOTO_NONCACHED_SHADOW - # Mode argument in r4. - # Read current state and mask out the two caching mode bits - mov #CYGARC_REG_CCR,r1 - mov.l @r1,r3 - mov #CYGARC_REG_CCR_CB|CYGARC_REG_CCR_WT,r2 - and r2,r4 - not r2,r2 - and r2,r3 - # Or in the new settings and restore to CCR - or r4,r3 - mov.l r3,@r1 - nop - rts - nop - - .align 2 -$CYGARC_REG_CACHE_ADDRESS_FLUSH: - .long CYGARC_REG_CACHE_ADDRESS_FLUSH -$CYGARC_REG_CACHE_ADDRESS_BASE: - .long CYGARC_REG_CACHE_ADDRESS_BASE -$CYGARC_REG_CACHE_ADDRESS_TOP: - .long CYGARC_REG_CACHE_ADDRESS_TOP -$CYGARC_REG_CACHE_ADDRESS_STEP: - .long CYGARC_REG_CACHE_ADDRESS_STEP - - -$MASK: - .long 0x1fffffff ! mask off top 3 bits -$BASE: - .long 0xa0000000 ! base of non-cachable memory - -#--------------------------------------------------------------------------- # Interrupt vector tables. # These tables contain the isr, data and object pointers used to deliver # interrupts to user code. @@ -1124,6 +866,11 @@ 13: .long ~(HAL_UCACHE_LINE_SIZE-1) .data .extern _hal_default_isr +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN +#define CYG_ISR_TABLE_SIZE 1 +#else +#define CYG_ISR_TABLE_SIZE CYGNUM_HAL_ISR_COUNT +#endif .globl _hal_interrupt_handlers _hal_interrupt_handlers: diff --git a/packages/hal/sh/cq7708/current/ChangeLog b/packages/hal/sh/cq7708/current/ChangeLog --- a/packages/hal/sh/cq7708/current/ChangeLog +++ b/packages/hal/sh/cq7708/current/ChangeLog @@ -1,3 +1,8 @@ +2000-10-31 Jesper Skov + + * include/plf_intr.h: Added. + * include/plf_cache.h: Added. + 2000-10-20 Jonathan Larmour * include/pkgconf/mlt_sh_sh7708_cq7708_ram.h: diff --git a/packages/hal/sh/cq7708/current/include/plf_cache.h b/packages/hal/sh/cq7708/current/include/plf_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7708/current/include/plf_cache.h @@ -0,0 +1,61 @@ +#ifndef CYGONCE_PLF_CACHE_H +#define CYGONCE_PLF_CACHE_H + +//============================================================================= +// +// plf_cache.h +// +// Platform specific 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): jskov +// Contributors:jskov +// Date: 2000-10-31 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +//============================================================================= + +// Nothing here at present. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_PLF_CACHE_H +// End of plf_cache.h + diff --git a/packages/hal/sh/cq7708/current/include/plf_intr.h b/packages/hal/sh/cq7708/current/include/plf_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7708/current/include/plf_intr.h @@ -0,0 +1,60 @@ +#ifndef CYGONCE_HAL_PLF_INTR_H +#define CYGONCE_HAL_PLF_INTR_H + +//========================================================================== +// +// plf_intr.h +// +// Platform specific 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): jskov +// Contributors: jskov, +// Date: 2000-10-31 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock for the CQ7708 board. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +//-------------------------------------------------------------------------- + +// No platform specific stuff at present. + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_PLF_INTR_H +// End of plf_intr.h diff --git a/packages/hal/sh/cq7750/current/ChangeLog b/packages/hal/sh/cq7750/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/ChangeLog @@ -0,0 +1,37 @@ +2000-11-01 Jesper Skov + + * cdl/hal_sh_sh7750_cq7750.cdl: Adding clock options. + +2000-08-16 Haruki Kashiwaya + + * Set up directory structure. + +2000-04-18 Ryozaburo Suzuki + + * Contributed sources for the CqREEK/SH-4 platform. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/sh/cq7750/current/cdl/hal_sh_sh7750_cq7750.cdl b/packages/hal/sh/cq7750/current/cdl/hal_sh_sh7750_cq7750.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/cdl/hal_sh_sh7750_cq7750.cdl @@ -0,0 +1,319 @@ +# ==================================================================== +# +# hal_sh_sh7750_cq7750.cdl +# +# CQ7750 board 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): jskov +# Original data: jskov +# Contributors: Ryozaburo Suzuki +# Date: 1999-10-29 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_SH_SH7750_CQ7750 { + display "CqREEK SH7750 board" + parent CYGPKG_HAL_SH + requires CYGPKG_HAL_SH_7750 + define_header hal_sh_sh7750_cq7750.h + include_dir cyg/hal + description " + The cq HAL package provides the support needed to run + eCos on a CqREEK SH7750 board." + + compile hal_diag.c plf_misc.c + + implements CYGINT_HAL_DEBUG_GDB_STUBS + implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT + implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + + puts $::cdl_header "#define CYGNUM_HAL_SH_SH4_SCIF_PORTS 1" + puts $::cdl_header "#define CYGHWR_HAL_VSR_TABLE 0x08000000" + puts $::cdl_header "#define CYGHWR_HAL_VECTOR_TABLE 0x08000100" + } + + cdl_component CYG_HAL_STARTUP { + display "Startup type" + flavor data + legal_values {"RAM" "ROM"} + default_value {"RAM"} + no_define + define -file system.h CYG_HAL_STARTUP + description " + When targetting the CQ7750 board it is possible to build + the system for either RAM bootstrap or ROM bootstrap. + RAM bootstrap generally requires that the board + is equipped with ROMs containing a suitable ROM monitor or + equivalent software that allows GDB to download the eCos + application on to the board. The ROM bootstrap typically + requires that the eCos application be blown into EPROMs or + equivalent technology." + } + + + 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 CQ/7750 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 CQ/7750 board has only one serial port. This option + chooses which port will be used for diagnostic output." + } + + cdl_component CYGHWR_HAL_SH_PLF_CLOCK_SETTINGS { + display "SH on-chip platform clock controls" + description " + The various clocks used by the system are derived from + these options." + flavor none + no_define + + cdl_option CYGHWR_HAL_SH_OOC_XTAL { + display "SH clock crystal" + flavor data + legal_values 9000000 to 66000000 + default_value 33000000 + no_define + description " + This option specifies the frequency of the crystal all + other clocks are derived from." + } + + cdl_option CYGHWR_HAL_SH_OOC_CKIO { + display "SH clock CKIO output enable" + default_value 1 + description " + This selects whether CKIO output is enabled." + } + + cdl_option CYGHWR_HAL_SH_OOC_PLL_1 { + display "SH clock PLL circuit 1" + flavor data + default_value 6 + legal_values { 0 6 } + description " + This selects whether PLL1 is enabled." + } + + cdl_option CYGHWR_HAL_SH_OOC_PLL_2 { + display "SH clock PLL circuit 2" + flavor data + default_value 1 + legal_values { 0 1 } + description " + This selects whether PLL2 is enabled." + } + + cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_IFC { + display "SH clock divider, core" + flavor data + default_value 1 + legal_values { 1 2 3 4 6 8 } + description " + This divider option affects the CPU core clock." + } + + cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_BFC { + display "SH clock divider, bus" + flavor data + default_value 8 + legal_values { 1 2 3 4 6 8 } + description " + This divider option affects the bus clock." + } + + cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_PFC { + display "SH clock divider, peripheral" + flavor data + default_value 8 + legal_values { 1 2 3 4 6 8 } + description " + This divider option affects the peripheral clock." + } + + cdl_option CYGHWR_HAL_SH_OOC_CLOCK_MODE { + display "SH clock mode" + flavor data + default_value 2 + legal_values { 0 1 2 3 4 5 } + description " + This option must mirror the clock mode hardwired on + the MD0-MD2 pins of the CPU in order to correctly + initialize the FRQCR register." + } + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + parent CYGPKG_NONE + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "sh-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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m4 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -ggdb -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" : "-ml -m3 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -ggdb -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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m4 -ggdb -nostdlib -Wl,--gc-sections -Wl,-static" : "-ml -m3 -ggdb -nostdlib -Wl,--gc-sections -Wl,-static" } + description " + This option controls the global linker flags. Individual + packages may define options which override these global flags." + } + + cdl_option CYGBLD_BUILD_GDB_STUBS { + display "Build GDB stub ROM image" + default_value 0 + requires { CYG_HAL_STARTUP == "ROM" } + requires CYGSEM_HAL_ROM_MONITOR + requires CYGBLD_BUILD_COMMON_GDB_STUBS + requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + no_define + description " + This option enables the building of the GDB stubs for the + board. The common HAL controls takes care of most of the + build process, but the final conversion from ELF image to + binary data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.bin : /bin/gdb_module.img + $(OBJCOPY) -O binary $< $@ + } + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "sh_sh7750_cq7750_ram" : \ + "sh_sh7750_cq7750_rom" } + + cdl_option CYGHWR_MEMORY_LAYOUT_LDI { + display "Memory layout linker script fragment" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_LDI + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + + cdl_option CYGHWR_MEMORY_LAYOUT_H { + display "Memory layout header file" + flavor data + no_define + define -file system.h CYGHWR_MEMORY_LAYOUT_H + calculated { CYG_HAL_STARTUP == "RAM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + requires { CYG_HAL_STARTUP == "RAM" } + parent CYGPKG_HAL_ROM_MONITOR + requires !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + description " + Support can be enabled for boot ROMs or ROM monitors which contain + GDB stubs. This support changes various eCos semantics such as + the encoding of diagnostic output, and the overriding of hardware + interrupt vectors." + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } +} diff --git a/packages/hal/sh/cq7750/current/include/hal_diag.h b/packages/hal/sh/cq7750/current/include/hal_diag.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/hal_diag.h @@ -0,0 +1,88 @@ +#ifndef CYGONCE_HAL_HAL_DIAG_H +#define CYGONCE_HAL_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): jskov +// Contributors:jskov +// Date: 1999-04-24 +// Purpose: HAL Support for Kernel Diagnostic Routines +// Description: Diagnostic routines for use during kernel development. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include + +#define HAL_DIAG_INIT() hal_if_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) + +#else // everything by steam + +//----------------------------------------------------------------------------- +// 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 // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// Simple LED control. +externC void hal_diag_led_on( void ); +externC void hal_diag_led_off( void ); + +//----------------------------------------------------------------------------- +// end of hal_diag.h +#endif // CYGONCE_HAL_HAL_DIAG_H diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.h b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.h @@ -0,0 +1,17 @@ +// eCos memory layout - Wed Nov 01 08:48:23 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x8008000) +#define CYGMEM_REGION_ram_SIZE (0xff8000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x9000000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.ldi b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.ldi @@ -0,0 +1,26 @@ +// eCos memory layout - Wed Nov 01 08:48:23 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x8008000, LENGTH = 0xff8000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (ram, 0x8008000, LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.mlt b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_ram.mlt @@ -0,0 +1,12 @@ +version 0 +region ram 8008000 ff8000 0 ! +section vectors 0 1 0 1 1 1 1 1 8008000 8008000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 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 1 0 1 0 1 0 1 data data ! +section data 0 8 0 1 0 1 0 1 bss bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.h b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.h @@ -0,0 +1,20 @@ +// eCos memory layout - Wed Nov 01 08:47:52 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x8000200) +#define CYGMEM_REGION_ram_SIZE (0xfffe00) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0x80000000) +#define CYGMEM_REGION_rom_SIZE (0x100000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x9000000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.ldi b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.ldi @@ -0,0 +1,27 @@ +// eCos memory layout - Wed Nov 01 08:47:52 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x8000200, LENGTH = 0xfffe00 + rom : ORIGIN = 0x80000000, LENGTH = 0x100000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (rom, 0x80000000, LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (rom, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, 0x8000200, FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.mlt b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/pkgconf/mlt_sh_sh7750_cq7750_rom.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 8000200 fffe00 0 ! +region rom 80000000 100000 1 ! +section data 0 1 1 1 1 1 0 0 8000200 bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! +section vectors 0 1 0 1 1 1 1 1 80000000 80000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 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 1 0 1 0 0 0 1 data ! diff --git a/packages/hal/sh/cq7750/current/include/platform.inc b/packages/hal/sh/cq7750/current/include/platform.inc new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/platform.inc @@ -0,0 +1,228 @@ +#ifndef CYGONCE_HAL_PLATFORM_INC +#define CYGONCE_HAL_PLATFORM_INC +##============================================================================= +## +## platform.inc +## +## SH/CQ7750 board assembler header file +## +##============================================================================= +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.0 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://sourceware.cygnus.com/ecos +# +# Software distributed under the License is distributed on an +# 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): jskov +## Contributors:Ryozaburo Suzuki +## Date: 2000-04-18 +## Purpose: SH/CQ7750 board definitions. +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the SH/CQ7750 board. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#include +#include + +#------------------------------------------------------------------------------ +# Hardware initialization. + + .macro hal_hardware_init + // Set up the Bus State Controller + mova BSC_settings_table,r0 + mov r0,r3 +1: mov.l @r3+,r0 // Address (or zero) + mov r0,r2 + cmp/eq #0,r0 + bt 4f + mov.l @r3+,r1 // data + mov.l @r3+,r0 // byte or word or long? + + cmp/eq #0,r0 // byte + bt 2f + + cmp/eq #1,r0 // word + bt 3f + + bra 1b // long + mov.l r1,@r2 // delay slot + +2: bra 1b + mov.b r1,@r2 // delay slot + +3: bra 1b + mov.w r1,@r2 // delay slot + + .align 2 + +BSC_settings_table: + # BCR1: + .long CYGARC_REG_BCR1 + .long 0x0020000c + .long 2 + # BCR2: + .long CYGARC_REG_BCR2 + .long 0x35F8 + .long 1 + # WCR1: + .long CYGARC_REG_WCR1 + .long 0x77117121 + .long 2 + # WCR2: + .long CYGARC_REG_WCR2 + .long 0xFC8AE520 + .long 2 + # WCR3: + .long CYGARC_REG_WCR3 + .long 0x07117101 + .long 2 + # PCR: + .long CYGARC_REG_PCR + .long 0x0000 + .long 1 + # RTCNT: + .long CYGARC_REG_RTCNT + .long 0xa500 + .long 1 + # RTCOR: + .long CYGARC_REG_RTCOR + .long 0xa53b + .long 1 + # RFCR: + .long CYGARC_REG_RFCR + .long 0xa400 + .long 1 + # RTCSR: + .long CYGARC_REG_RTCSR + .long 0xa508 + .long 1 + # MCR: + .long CYGARC_REG_MCR + .long 0x10192194 + .long 2 + # SDMR2: + .long CYGARC_REG_SDMR2 + .long 0xaa + .long 0 + # MCR: + .long CYGARC_REG_MCR + .long 0x50192194 + .long 2 + # SDMR2: + .long CYGARC_REG_SDMR2 + .long 0xaa + .long 0 + # Table end + .long 0 + + .align 2 +4: + .endm + +#------------------------------------------------------------------------------ +# Monitor initialization. + +#ifndef CYGPKG_HAL_SH_MON_DEFINED + +#if defined(CYG_HAL_STARTUP_ROM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + + # If we are starting up from ROM, or we are starting in + # RAM and NOT using a ROM monitor, initialize the VSR table. + + .macro hal_mon_init + mov.l $_hal_vsr_table_p,r3 + # Write exception vectors + mov.l $_cyg_hal_default_exception_vsr_p,r4 + mov #CYGNUM_HAL_VSR_EXCEPTION_COUNT,r5 +1: mov.l r4,@r3 + add #4,r3 + dt r5 + bf 1b + # Write interrupt vector + mov.l $_cyg_hal_default_interrupt_vsr_p,r4 + mov.l r4,@r3 + bra 2f + nop + .align 2 + +$_cyg_hal_default_exception_vsr_p: + .long _cyg_hal_default_exception_vsr +$_cyg_hal_default_interrupt_vsr_p: + .long _cyg_hal_default_interrupt_vsr + + .extern _hal_vsr_table +$_hal_vsr_table_p: + .long _hal_vsr_table + +2: + .endm + +#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) + + # Initialize the VSR table entries + # We only take control of the interrupt vector, + # the rest are left to the ROM for now... + + .macro hal_mon_init + # Write interrupt vector + mov.l $_hal_vsr_table_p,r3 + mov.l $_cyg_hal_default_interrupt_vsr_p,r4 + mov.l r4,@r3 + bra 2f + nop + .align 2 + +$_cyg_hal_default_interrupt_vsr_p: + .long _cyg_hal_default_interrupt_vsr + + .extern _hal_vsr_table +$_hal_vsr_table_p: + .long _hal_vsr_table+CYGNUM_HAL_VECTOR_INTERRUPT*4 + +2: + .endm + +#else + + .macro hal_mon_init + .endm + +#endif + + +#define CYGPKG_HAL_SH_MON_DEFINED + +#endif // CYGPKG_HAL_SH_MON_DEFINED + +#endif // CYGONCE_HAL_PLATFORM_INC diff --git a/packages/hal/sh/cq7750/current/include/plf_cache.h b/packages/hal/sh/cq7750/current/include/plf_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/plf_cache.h @@ -0,0 +1,61 @@ +#ifndef CYGONCE_PLF_CACHE_H +#define CYGONCE_PLF_CACHE_H + +//============================================================================= +// +// plf_cache.h +// +// Platform specific 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): jskov +// Contributors:jskov +// Date: 2000-10-31 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +//============================================================================= + +// Nothing here at present. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_PLF_CACHE_H +// End of plf_cache.h + diff --git a/packages/hal/sh/cq7750/current/include/plf_intr.h b/packages/hal/sh/cq7750/current/include/plf_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/plf_intr.h @@ -0,0 +1,60 @@ +#ifndef CYGONCE_HAL_PLF_INTR_H +#define CYGONCE_HAL_PLF_INTR_H + +//========================================================================== +// +// plf_intr.h +// +// Platform specific 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): jskov +// Contributors: jskov, +// Date: 2000-10-31 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock for the CQ7750 board. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +//-------------------------------------------------------------------------- + +// No platform specific stuff at present. + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_PLF_INTR_H +// End of plf_intr.h diff --git a/packages/hal/sh/cq7750/current/include/plf_stub.h b/packages/hal/sh/cq7750/current/include/plf_stub.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/include/plf_stub.h @@ -0,0 +1,90 @@ +#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): jskov +// Contributors:jskov +// Date: 1999-05-18 +// Purpose: Platform HAL stub support for Hitachi/CQ boards. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include // CYG_UNUSED_PARAM, externC + +#include // architecture stub support + +#include // hal_diag_led_on + +//---------------------------------------------------------------------------- +// 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. +#ifdef CYGSEM_HAL_ROM_MONITOR +# define HAL_STUB_PLATFORM_INIT() hal_diag_led_on() +#else +# define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT +#endif + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +//---------------------------------------------------------------------------- +// Reset. +// Block interrupts and cause an exception. This forces a reset. +#define HAL_STUB_PLATFORM_RESET() \ + asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) + +#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 + +//----------------------------------------------------------------------------- +#endif // CYGONCE_HAL_PLF_STUB_H +// End of plf_stub.h diff --git a/packages/hal/sh/cq7750/current/src/hal_diag.c b/packages/hal/sh/cq7750/current/src/hal_diag.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/src/hal_diag.c @@ -0,0 +1,218 @@ +//============================================================================= +// +// 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): nickg, jskov +// Contributors: nickg, jskov +// Date: 1999-03-23 +// Purpose: HAL diagnostic output +// Description: Implementations of HAL diagnostic output support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include // our header. + +#include // base types, externC +#include // IO macros +#include // calling interface API +#include // Interrupt macros +#include // driver API +#include // Helper functions + +#define SCI_BASE ((cyg_uint8*)0xffe80000) + +//----------------------------------------------------------------------------- + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +void +cyg_hal_plf_comms_init(void) +{ + static int initialized = 0; + + if (initialized) + return; + + initialized = 1; + + cyg_hal_plf_scif_init(0, 0, CYGNUM_HAL_INTERRUPT_SCIF_RXI, SCI_BASE); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +//============================================================================= +// Led control +//============================================================================= +#define LED 0xb4000000 + +void +hal_diag_led_on( void ) +{ + HAL_WRITE_UINT8(LED, 0x18); +} + +void +hal_diag_led_off( void ) +{ + HAL_WRITE_UINT8(LED, 0); +} + +//============================================================================= +// Compatibility with older stubs +//============================================================================= + +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; + +#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) +#include // hal_output_gdb_string +#endif + +#if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) + +#define CYG_HAL_DIAG_GDB + +#elif defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) + +#define CYG_HAL_DIAG_GDB + +#endif + +//----------------------------------------------------------------------------- + +void hal_diag_init(void) +{ + cyg_hal_plf_scif_init_channel(&channel); +} + +void +hal_diag_write_char_serial( char c ) +{ + cyg_hal_plf_scif_putc(&channel, c); +} + +void +hal_diag_read_char(char *c) +{ + *c = (char) cyg_hal_plf_scif_getc(&channel); +} + +// Packet function +void +hal_diag_write_char(char c) +{ +#ifdef CYG_HAL_DIAG_GDB + static char line[100]; + static int pos = 0; + + // 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) + { + char c1; + static char hex[] = "0123456789ABCDEF"; + cyg_uint8 csum = 0; + int i; + + cyg_hal_plf_scif_putc(&channel, '$'); + cyg_hal_plf_scif_putc(&channel, '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_scif_putc(&channel, h); + cyg_hal_plf_scif_putc(&channel, l); + csum += h; + csum += l; + } + cyg_hal_plf_scif_putc(&channel, '#'); + cyg_hal_plf_scif_putc(&channel, hex[(csum>>4)&0xF]); + cyg_hal_plf_scif_putc(&channel, hex[csum&0xF]); + + // Wait for the ACK character '+' from GDB here and handle + // receiving a ^C instead. + c1 = (char) cyg_hal_plf_scif_getc(&channel); + + if( c1 == '+' ) + break; // a good acknowledge + + // Check for user break. + if( cyg_hal_is_break( &c1, 1 ) ) + cyg_hal_user_break( NULL ); + + // 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 + } +#else // CYG_HAL_DIAG_GDB + cyg_hal_plf_scif_putc(&channel, c); +#endif +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// End of hal_diag.c diff --git a/packages/hal/sh/cq7750/current/src/plf_misc.c b/packages/hal/sh/cq7750/current/src/plf_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/cq7750/current/src/plf_misc.c @@ -0,0 +1,57 @@ +//========================================================================== +// +// plf_misc.c +// +// HAL platform miscellaneous functions +// +//========================================================================== +//####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): jskov +// Contributors: jskov,nickg, jlarmour +// Date: 1999-10-13 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // interfacing API + +//-------------------------------------------------------------------------- +void +hal_platform_init(void) +{ + hal_if_init(); +} + +//-------------------------------------------------------------------------- +// eof plf_misc.c diff --git a/packages/hal/sh/edk/current/ChangeLog b/packages/hal/sh/edk/current/ChangeLog deleted file mode 100644 --- a/packages/hal/sh/edk/current/ChangeLog +++ /dev/null @@ -1,356 +0,0 @@ -2000-10-20 Jonathan Larmour - - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_rom.h: - * include/pkgconf/mlt_sh_edk7708_romram.h: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_rom.ldi: - * include/pkgconf/mlt_sh_edk7708_romram.ldi: - Regenerated with updated host tools - -2000-10-17 Jesper Skov - - * include/pkgconf/mlt_sh_edk7708_ram.h: Adding heap1. - * include/pkgconf/mlt_sh_edk7708_ram.mlt: Ditto. - * include/pkgconf/mlt_sh_edk7708_ram.ldi: Ditto. - * include/pkgconf/mlt_sh_edk7708_rom.h: Ditto. - * include/pkgconf/mlt_sh_edk7708_rom.mlt: Ditto. - * include/pkgconf/mlt_sh_edk7708_rom.ldi: Ditto. - * include/pkgconf/mlt_sh_edk7708_romram.h: Ditto. - * include/pkgconf/mlt_sh_edk7708_romram.mlt: Ditto. - * include/pkgconf/mlt_sh_edk7708_romram.ldi: Ditto. - -2000-10-10 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Fix legal OCC ranges. - -2000-09-26 Jesper Skov - - * include/platform.inc: Use calculated FRQCR init value. - - * cdl/hal_sh_edk7708.cdl: Updated clock options. - -2000-07-07 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Require sub-variant package. - -2000-06-29 Jesper Skov - - * src/hal_diag.c: serial driver API changes. - -2000-06-28 Jesper Skov - - * src/hal_diag.c: Include hal_if file. - -2000-06-28 Jesper Skov - - * src/plf_misc.c: - * src/hal_diag.c: - * src/plf_stub.c: [deleted] - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - * include/pkgconf/mlt_sh_edk7708_rom.h: - * include/pkgconf/mlt_sh_edk7708_rom.ldi: - * include/pkgconf/mlt_sh_edk7708_rom.mlt: - * include/pkgconf/mlt_sh_edk7708_romram.h: - * include/pkgconf/mlt_sh_edk7708_romram.ldi: - * include/pkgconf/mlt_sh_edk7708_romram.mlt: - * include/plf_stub.h: - * include/hal_diag.h: - * cdl/hal_sh_edk7708.cdl: - Changed to use virtual vector table. - -1999-06-19 John Dallaway - - * cdl/hal_sh_edk7708.cdl: Tidy display strings. - -2000-04-12 Jesper Skov - - * src/hal_diag.c: Output text raw if configuration requires it. - - * include/platform.inc: - * src/edk.S: [deleted] - * cdl/hal_sh_edk7708.cdl: - Hardware init code moved to platform.inc in order to allow ROMRAM - startup. - - * include/pkgconf/mlt_sh_edk7708_romram.h: - * include/pkgconf/mlt_sh_edk7708_romram.mlt: - * include/pkgconf/mlt_sh_edk7708_romram.ldi: - * cdl/hal_sh_edk7708.cdl: - Add ROMRAM startup option. - -2000-04-06 Jonathan Larmour - - * cdl/hal_sh_edk7708.cdl: Use -g now that toolchains work with that - (and in fact new toolchains no longer work with -ggdb) - -2000-04-06 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Define vsr base location. - -2000-04-04 Jesper Skov - - * src/hal_diag.c (hal_diag_write_char): Add GDB critical IO region - handling. - -2000-03-20 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Added board speed variable. - -2000-03-09 Jesper Skov - - * src/hal_diag.c: Fix compiler warning. - -2000-02-28 Jesper Skov - - * include/platform.inc: Use sh_offsets instead of C header. - -2000-02-18 Jonathan Larmour - - * cdl/hal_sh_edk7708.cdl (CYGBLD_BUILD_GDB_STUBS): When - building stubs, define every dependency required here rather than - in the template - -2000-02-17 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: - Go back to -ggdb. -gstabs don't provide enough info for - source-level debugging. - - * include/pkgconf/mlt_sh_edk7708_rom.h: - * include/pkgconf/mlt_sh_edk7708_rom.ldi: - * include/pkgconf/mlt_sh_edk7708_rom.mlt: - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - Don't use . assignment due to tools problem. - -2000-02-16 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Added LE support. - -2000-02-15 Jesper Skov - - * misc/STUBS_config: - * include/pkgconf/mlt_sh_edk7708_rom.ldi: - * include/pkgconf/mlt_sh_edk7708_rom.mlt: - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - Updated for new stubs scheme. - - * cdl/hal_sh_edk7708.cdl: Removed stubs startup. - Use -gstabs instead of -ggdb to work around problem with GDB. - -2000-02-10 Jesper Skov - - * include/plf_stub.h: - HAL_STUB_PLATFORM_STUBS_INIT->HAL_STUB_PLATFORM_INIT - -2000-02-07 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: use cpu flags when linking. - -2000-02-03 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Implements stubs. - -2000-01-27 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Moved part of stubs build rule to - common HAL. Changed description. - -2000-01-26 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Fix display string. - -2000-01-24 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Add stubs build rule. - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - * include/pkgconf/mlt_sh_edk7708_stubs.ldi: - * include/pkgconf/mlt_sh_edk7708_stubs.h: - * include/pkgconf/mlt_sh_edk7708_stubs.mlt: - Give stub more RAM. - -2000-01-24 John Dallaway - - * cdl/*.cdl: - - Remove obsolete option CYGTST_TESTING_IDENTIFIER. - -2000-01-19 Hugo Tyson - - * cdl/*.cdl: Add descriptions to a number of options &c which were - lacking same, also tidied up other typos as noticed en passant. - -2000-01-18 Jesper Skov - CR 902066 - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - * include/pkgconf/mlt_sh_edk7708_ram.h: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - Correct RAM size. - -1999-12-21 Jonathan Larmour - - * src/plf_misc.c (cyg_hal_user_break): Rename - CYG_HAL_USE_ROM_MONITOR_GDB_STUBS -> CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs - - * cdl/hal_sh_edk7708.cdl: Don't need to define CYG_HAL_SH_SH7708 any - more - Add new platform-specific CYGSEM_HAL_USE_ROM_MONITOR option to - control ROM monitor support - -1999-12-20 Gary Thomas - - * cdl/hal_sh_edk7708.cdl: Add -Wl for linker options. - -1999-11-25 Gary Thomas - - * include/pkgconf/mlt_sh_edk7708_stubs.h: - * include/pkgconf/mlt_sh_edk7708_rom.h: - * include/pkgconf/mlt_sh_edk7708_ram.h: New file(s). - -1999-11-02 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Use define_proc for CPU define. - -1999-11-01 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Use define_proc for const header defs. - -1999-10-29 Jesper Skov - - * cdl/hal_sh_edk7708.cdl: Added. - -1999-10-13 Jesper Skov - - * src/hal_diag.c (hal_diag_write_char): - * src/plf_misc.c: - * src/PKGconf.mak (COMPILE): - Added user breakpoint handling. - -1999-09-02 Jesper Skov - - * misc/STUBS_config: Also disable kernel support in HAL. - -1999-08-17 Jesper Skov - - * misc/STUBS_config: Added. - -1999-06-18 Jesper Skov - - * include/pkgconf/hal_sh_edk7708.h: Consistent EDK7708 naming. - -1999-06-01 Jesper Skov - - * src/hal_diag.c (hal_diag_write_char): Don't look for 0x03 - chars. It doesn't work well. Better the dedicated magic handles - C-c. - - * src/edk.S: Cleaned up memory controller setup. - -1999-05-31 Jesper Skov - - * include/pkgconf/hal_sh_edk7708.h: Removed FIX ME. - - * src/edk.S: Fixed delay-slot problem. - -1999-05-28 Jesper Skov - - * include/pkgconf/hal_sh_edk7708.h: Fixed platform name. - - * include/pkgconf/mlt_sh_edk7708_rom.ldi: - * include/pkgconf/mlt_sh_edk7708_rom.mlt: - * include/pkgconf/mlt_sh_edk7708_stubs.ldi: - * include/pkgconf/mlt_sh_edk7708_stubs.mlt: - * include/pkgconf/mlt_sh_edk7708_ram.ldi: - * include/pkgconf/mlt_sh_edk7708_ram.mlt: - Fixed memory layout and generated MLT files. - -1999-05-28 Jesper Skov - - * include/pkgconf/hal_sh_edk.h: [deleted] - * include/pkgconf/mlt_sh_edk_ram.ldi: [deleted] - * include/pkgconf/mlt_sh_edk_ram.mlt: [deleted] - * include/pkgconf/mlt_sh_edk_rom.ldi: [deleted] - * include/pkgconf/mlt_sh_edk_stubs.ldi: [deleted] - * include/pkgconf/hal_sh_edk7708.h: [added] - * include/pkgconf/mlt_sh_edk7708_ram.ldi: [added] - * include/pkgconf/mlt_sh_edk7708_ram.mlt: [added] - * include/pkgconf/mlt_sh_edk7708_rom.ldi: [added] - * include/pkgconf/mlt_sh_edk7708_rom.mlt: [added] - * include/pkgconf/mlt_sh_edk7708_stubs.ldi:[added] - * include/pkgconf/mlt_sh_edk7708_stubs.mlt:[added] - * src/PKGconf.mak: - Renamed SH platform package to edk7708. - -1999-05-21 Jesper Skov - - * include/pkgconf/hal_sh_edk.h (CYGNUM_HAL_RTC_PERIOD): The timer - is running at 1/4 of the peripheral clock. - - * include/plf_stub.h: Added RESET code. - - * include/pkgconf/hal_sh_edk.h: Added RTC data for the edk board. - -1999-05-20 John Dallaway - - * include/pkgconf/mlt_sh_edk_ram.mlt: Working MLT-generated - version. - -1999-05-20 Jesper Skov - - * Moved files to CVS trunk. - -1999-05-19 Jesper Skov - - * src/edk.S (_hal_hardware_init): Fix a few mistakes. - - * include/plf_stub.h: Enable led in stub init. - - * include/pkgconf/mlt_sh_edk_stubs.ldi: - * include/pkgconf/mlt_sh_edk_rom.ldi: - Added. - Moved RAM region to the end of the chunk and made it bigger. - - * src/edk.S (_hal_hardware_init): Added Bus State Controller - initialization. - -1999-05-19 Jesper Skov - - * Most things working now. Will start keeping track of changes. - -1999-04-22 Jesper Skov - - * Set up directory structure. - -//=========================================================================== -//####COPYRIGHTBEGIN#### -// -// ------------------------------------------- -// The contents of this file are subject to the Red Hat eCos Public License -// Version 1.1 (the "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of the License at -// http://www.redhat.com/ -// -// Software distributed under the License is distributed on an "AS IS" -// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -// License for the specific language governing rights and limitations under -// the License. -// -// The Original Code is eCos - Embedded Configurable Operating System, -// released September 30, 1998. -// -// The Initial Developer of the Original Code is Red Hat. -// Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. -// All Rights Reserved. -// ------------------------------------------- -// -//####COPYRIGHTEND#### -//=========================================================================== diff --git a/packages/hal/sh/edk/current/cdl/hal_sh_edk7708.cdl b/packages/hal/sh/edk/current/cdl/hal_sh_edk7708.cdl deleted file mode 100644 --- a/packages/hal/sh/edk/current/cdl/hal_sh_edk7708.cdl +++ /dev/null @@ -1,312 +0,0 @@ -# ==================================================================== -# -# hal_sh_edk7708.cdl -# -# EDK7708 board 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): jskov -# Original data: jskov -# Contributors: -# Date: 1999-10-29 -# -#####DESCRIPTIONEND#### -# -# ==================================================================== - -cdl_package CYGPKG_HAL_SH_EDK7708 { - display "Hitachi EDK/SH7708 board" - parent CYGPKG_HAL_SH - requires CYGPKG_HAL_SH_7708 - define_header hal_sh_edk7708.h - include_dir cyg/hal - description " - The edk HAL package provides the support needed to run - eCos on a Hitachi SH3 EDK7708 board." - - compile hal_diag.c plf_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 " - puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " - - puts $::cdl_header "#define CYGNUM_HAL_SH_SH3_SCI_PORTS 1" - puts $::cdl_header "#define CYGHWR_HAL_VSR_TABLE 0x08000000" - puts $::cdl_header "#define CYGHWR_HAL_VECTOR_TABLE 0x08000100" - } - - cdl_component CYG_HAL_STARTUP { - display "Startup type" - flavor data - legal_values {"RAM" "ROM" "ROMRAM"} - default_value {"RAM"} - no_define - define -file system.h CYG_HAL_STARTUP - description " - When targetting the EDK7708 board it is possible to build - the system for either RAM bootstrap or ROM bootstrap. - RAM bootstrap generally requires that the board - is equipped with ROMs containing a suitable ROM monitor or - equivalent software that allows GDB to download the eCos - application on to the board. The ROM bootstrap typically - requires that the eCos application be blown into EPROMs or - equivalent technology. ROMRAM bootstrap is similar to ROM - bootstrap, but everything is copied to RAM before execution - starts thus improving performace, but at the cost of an - increased RAM footprint." - } - - 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 EDK/7708 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 EDK/7708 board has only one serial port. This option - chooses which port will be used for diagnostic output." - } - - cdl_component CYGHWR_HAL_SH_PLF_CLOCK_SETTINGS { - display "SH on-chip platform clock controls" - description " - The various clocks used by the system are derived from - these options." - flavor none - no_define - - cdl_option CYGHWR_HAL_SH_OOC_XTAL { - display "SH clock crystal" - flavor data - legal_values 8000000 to 50000000 - default_value 15000000 - no_define - description " - This option specifies the frequency of the crystal all - other clocks are derived from." - } - - cdl_option CYGHWR_HAL_SH_OOC_PLL_1 { - display "SH clock PLL circuit 1" - flavor data - default_value 1 - legal_values { 0 1 2 4 } - description " - This selects the multiplication factor provided by - PLL1. If PLL1 is disabled via CAP1, this option should - be set to zero." - } - - cdl_option CYGHWR_HAL_SH_OOC_PLL_2 { - display "SH clock PLL circuit 2" - flavor data - default_value 4 - legal_values { 0 1 4 } - no_define - description " - This selects the multiplication factor provided by - PLL2. If PLL2 is disabled via CAP2, this option should - be set to zero." - } - - cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_1 { - display "SH clock divider 1" - flavor data - default_value 1 - legal_values { 1 2 3 4 } - description " - This divider option affects the CPU core clock." - } - - cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_2 { - display "SH clock divider 2" - flavor data - default_value 4 - legal_values { 1 2 3 4 } - description " - This divider option affects the peripheral clock." - } - - cdl_option CYGHWR_HAL_SH_OOC_CLOCK_MODE { - display "SH clock mode" - flavor data - default_value 2 - legal_values { 0 1 2 3 4 7 } - description " - This option must mirror the clock mode hardwired on - the MD0-MD2 pins of the CPU in order to correctly - initialize the FRQCR register." - } - } - - cdl_component CYGBLD_GLOBAL_OPTIONS { - display "Global build options" - flavor none - parent CYGPKG_NONE - no_define - description " - Global build options including control over - compiler flags, linker flags and choice of toolchain." - - - cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { - display "Global command prefix" - flavor data - no_define - default_value { "sh-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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m3 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" : "-ml -m3 -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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m3 -nostdlib -Wl,--gc-sections -Wl,-static" : "-ml -m3 -nostdlib -Wl,--gc-sections -Wl,-static" } - description " - This option controls the global linker flags. Individual - packages may define options which override these global flags." - } - - cdl_option CYGBLD_BUILD_GDB_STUBS { - display "Build GDB stub ROM image" - default_value 0 - requires { CYG_HAL_STARTUP == "ROM" } - requires CYGSEM_HAL_ROM_MONITOR - requires CYGBLD_BUILD_COMMON_GDB_STUBS - requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT - requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT - requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT - requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM - no_define - description " - This option enables the building of the GDB stubs for the - board. The common HAL controls takes care of most of the - build process, but the final conversion from ELF image to - binary data is handled by the platform CDL, allowing - relocation of the data if necessary." - - make -priority 320 { - /bin/gdb_module.bin : /bin/gdb_module.img - $(OBJCOPY) -O binary $< $@ - } - } - } - - cdl_component CYGHWR_MEMORY_LAYOUT { - display "Memory layout" - flavor data - no_define - calculated { CYG_HAL_STARTUP == "RAM" ? "sh_edk7708_ram" : \ - CYG_HAL_STARTUP == "ROM" ? "sh_edk7708_rom" : \ - "sh_edk7708_romram" } - - 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" ? "" : \ - CYG_HAL_STARTUP == "ROM" ? "" : \ - "" } - } - - 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" ? "" : \ - CYG_HAL_STARTUP == "ROM" ? "" : \ - "" } - } - } - - cdl_option CYGSEM_HAL_USE_ROM_MONITOR { - display "Work with a ROM monitor" - flavor booldata - legal_values { "GDB_stubs" } - default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } - requires { CYG_HAL_STARTUP == "RAM" } - parent CYGPKG_HAL_ROM_MONITOR - description " - Support can be enabled for boot ROMs or ROM monitors which contain - GDB stubs. This support changes various eCos semantics such as - the encoding of diagnostic output, and the overriding of hardware - interrupt vectors." - } - - cdl_option CYGSEM_HAL_ROM_MONITOR { - display "Behave as a ROM monitor" - flavor bool - default_value 0 - parent CYGPKG_HAL_ROM_MONITOR - requires { CYG_HAL_STARTUP == "ROM" } - description " - Enable this option if this program is to be used as a ROM monitor, - i.e. applications will be loaded into RAM on the board, and this - ROM monitor may process exceptions or interrupts generated from the - application. This enables features such as utilizing a separate - interrupt stack when exceptions are generated." - } -} diff --git a/packages/hal/sh/edk/current/include/hal_diag.h b/packages/hal/sh/edk/current/include/hal_diag.h deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/hal_diag.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef CYGONCE_HAL_HAL_DIAG_H -#define CYGONCE_HAL_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): jskov -// Contributors:jskov -// Date: 1999-04-24 -// Purpose: HAL Support for Kernel Diagnostic Routines -// Description: Diagnostic routines for use during kernel development. -// Usage: #include -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#include - -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) - -#include - -#define HAL_DIAG_INIT() hal_if_diag_init() -#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) -#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) - -#else // everything by steam - -//----------------------------------------------------------------------------- -// 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 // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG - -//----------------------------------------------------------------------------- -// Simple LED control. -externC void hal_diag_led_on( void ); -externC void hal_diag_led_off( void ); - -//----------------------------------------------------------------------------- -// end of hal_diag.h -#endif // CYGONCE_HAL_HAL_DIAG_H diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.h b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.h deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.h +++ /dev/null @@ -1,17 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:50:36 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include -#include - -#endif -#define CYGMEM_REGION_ram (0x8008000) -#define CYGMEM_REGION_ram_SIZE (0xf8000) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.ldi b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.ldi deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.ldi +++ /dev/null @@ -1,26 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:50:36 2000 - -// This is a generated file - do not edit - -#include - -MEMORY -{ - ram : ORIGIN = 0x8008000, LENGTH = 0xf8000 -} - -SECTIONS -{ - SECTIONS_BEGIN - SECTION_vectors (ram, 0x8008000, LMA_EQ_VMA) - SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) - SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) - SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) - SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) - CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); - SECTIONS_END -} diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.mlt b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.mlt deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_ram.mlt +++ /dev/null @@ -1,12 +0,0 @@ -version 0 -region ram 8008000 f8000 0 ! -section vectors 0 1 0 1 1 1 1 1 8008000 8008000 text text ! -section text 0 4 0 1 0 1 0 1 fini fini ! -section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! -section rodata 0 8 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 1 0 1 0 1 0 1 data data ! -section data 0 8 0 1 0 1 0 1 bss bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.h b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.h deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.h +++ /dev/null @@ -1,20 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:51:04 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include -#include - -#endif -#define CYGMEM_REGION_ram (0x8000200) -#define CYGMEM_REGION_ram_SIZE (0xffe00) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#define CYGMEM_REGION_rom (0xa0000000) -#define CYGMEM_REGION_rom_SIZE (0x20000) -#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.ldi b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.ldi deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.ldi +++ /dev/null @@ -1,27 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:51:04 2000 - -// This is a generated file - do not edit - -#include - -MEMORY -{ - ram : ORIGIN = 0x8000200, LENGTH = 0xffe00 - rom : ORIGIN = 0xa0000000, LENGTH = 0x20000 -} - -SECTIONS -{ - SECTIONS_BEGIN - SECTION_vectors (rom, 0xa0000000, LMA_EQ_VMA) - SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) - SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) - SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA) - SECTION_rodata (rom, ALIGN (0x8), LMA_EQ_VMA) - SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) - SECTION_gcc_except_table (rom, ALIGN (0x1), LMA_EQ_VMA) - SECTION_data (ram, 0x8000200, FOLLOWING (.gcc_except_table)) - SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) - CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); - SECTIONS_END -} diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.mlt b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.mlt deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_rom.mlt +++ /dev/null @@ -1,13 +0,0 @@ -version 0 -region ram 8000200 ffe00 0 ! -region rom a0000000 20000 1 ! -section data 0 1 1 1 1 1 0 0 8000200 bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! -section vectors 0 1 0 1 1 1 1 1 a0000000 a0000000 text text ! -section text 0 4 0 1 0 1 0 1 fini fini ! -section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! -section rodata 0 8 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 1 0 1 0 0 0 1 data ! diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.h b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.h deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.h +++ /dev/null @@ -1,20 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:51:30 2000 - -// This is a generated file - do not edit - -#ifndef __ASSEMBLER__ -#include -#include - -#endif -#define CYGMEM_REGION_ram (0x8000200) -#define CYGMEM_REGION_ram_SIZE (0xffe00) -#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) -#define CYGMEM_REGION_rom (0xa0000000) -#define CYGMEM_REGION_rom_SIZE (0x20000) -#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) -#ifndef __ASSEMBLER__ -extern char CYG_LABEL_NAME (__heap1) []; -#endif -#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) -#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.ldi b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.ldi deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.ldi +++ /dev/null @@ -1,27 +0,0 @@ -// eCos memory layout - Fri Oct 20 09:51:30 2000 - -// This is a generated file - do not edit - -#include - -MEMORY -{ - ram : ORIGIN = 0x8000200, LENGTH = 0xffe00 - rom : ORIGIN = 0xa0000000, LENGTH = 0x20000 -} - -SECTIONS -{ - SECTIONS_BEGIN - SECTION_vectors (ram, 0x8000200, AT (0xa0000000)) - SECTION_text (ram, ALIGN (0x10), FOLLOWING (.vectors)) - SECTION_fini (ram, ALIGN (0x10), FOLLOWING (.text)) - SECTION_rodata1 (ram, ALIGN (0x10), FOLLOWING (.fini)) - SECTION_rodata (ram, ALIGN (0x10), FOLLOWING (.rodata1)) - SECTION_fixup (ram, ALIGN (0x10), FOLLOWING (.rodata)) - SECTION_gcc_except_table (ram, ALIGN (0x10), FOLLOWING (.fixup)) - SECTION_data (ram, ALIGN (0x10), FOLLOWING (.gcc_except_table)) - SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) - CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); - SECTIONS_END -} diff --git a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.mlt b/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.mlt deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/pkgconf/mlt_sh_edk7708_romram.mlt +++ /dev/null @@ -1,13 +0,0 @@ -version 0 -region ram 8000200 ffe00 0 ! -region rom a0000000 20000 1 ! -section vectors 0 10 1 1 1 1 1 1 8000200 a0000000 text text ! -section text 0 10 1 1 0 1 0 1 fini fini ! -section fini 0 10 1 1 0 1 0 1 rodata1 rodata1 ! -section rodata1 0 10 1 1 0 1 0 1 rodata rodata ! -section rodata 0 10 1 1 0 1 0 1 fixup fixup ! -section fixup 0 10 1 1 0 1 0 1 gcc_except_table gcc_except_table ! -section gcc_except_table 0 10 1 1 0 1 0 1 data data ! -section data 0 10 1 1 0 1 0 0 bss ! -section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! -section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/sh/edk/current/include/platform.inc b/packages/hal/sh/edk/current/include/platform.inc deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/platform.inc +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef CYGONCE_HAL_PLATFORM_INC -#define CYGONCE_HAL_PLATFORM_INC -##============================================================================= -## -## platform.inc -## -## SH/EDK7708 board assembler header file -## -##============================================================================= -#####COPYRIGHTBEGIN#### -# -# ------------------------------------------- -# The contents of this file are subject to the Red Hat eCos Public License -# Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# http://sourceware.cygnus.com/ecos -# -# Software distributed under the License is distributed on an -# 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): jskov -## Contributors:jskov -## Date: 2000-02-02 -## Purpose: SH/EDK7708 board definitions. -## Description: This file contains various definitions and macros that are -## useful for writing assembly code for the SH/EDK7708 board. -## Usage: -## #include -## ... -## -## -######DESCRIPTIONEND#### -## -##============================================================================= - -#include - -#include -#include - -#------------------------------------------------------------------------------ -# Hardware initialization. - - .macro hal_hardware_init - // Set up the Bus State Controller - mova BSC_settings_table,r0 - mov r0,r3 -1: mov.w @r3+,r0 // Address (or zero) - cmp/eq #0,r0 - bt 2f - mov.w @r3+,r1 // data - bra 1b - mov.w r1,@r0 // delay slot - - .align 2 -BSC_settings_table: - # These are the settings set by the Hitachi ROM Monitor. - - .word CYGARC_REG_FRQCR - .word CYGARC_REG_FRQCR_INIT - - # BCR2: Bus size of areas 1-6 to 32 bits - .word CYGARC_REG_BCR2 - .word 0x3ffc - # BCR1: Areas 2 and 3 are SDRAM - .word CYGARC_REG_BCR1 - .word 0x080c - # BCR2: Bus size of areas 1-6 to 32 bits [note: second write!] - .word CYGARC_REG_BCR2 - .word 0x3ffc - # WCR1: 3 wait-state cycles inserted for all areas - .word CYGARC_REG_WCR1 - .word 0x3fff - # WCR2: extra wait states and full pitch for burst - .word CYGARC_REG_WCR2 - .word 0xffd7 - # MCR: RAS/CAS & burst timing area 2/3 - .word CYGARC_REG_MCR - .word 0x963c - # RTCNT: refresh counter (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCNT - .word (0xa500 | 0x0000) - # RTCOR: refresh time constant (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCOR - .word (0xa500 | 0x003b) - # RFCR: refresh count register (needs a4 in top byte to accept write) - .word CYGARC_REG_RFCR - .word (0xa400 | 0x0000) - # RTCSR: refresh timer control (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCSR - .word (0xa500 | 0x0008) - - # Set SDMR to 0x220 - .word 0xd880 - .word 0 - - # Table end - .word 0 - - .align 2 -2: - .endm - -#------------------------------------------------------------------------------ -# Monitor initialization. - -#ifndef CYGPKG_HAL_SH_MON_DEFINED - -#if !defined(CYG_HAL_STARTUP_RAM) || \ - ( defined(CYG_HAL_STARTUP_RAM) && \ - !defined(CYGSEM_HAL_USE_ROM_MONITOR)) - - # If we are not starting up from RAM, or we are starting in - # RAM and NOT using a ROM monitor, initialize the VSR table. - - .macro hal_mon_init - mov.l $_hal_vsr_table_p,r3 - # Write exception vectors - mov.l $_cyg_hal_default_exception_vsr_p,r4 - mov #CYGNUM_HAL_VSR_EXCEPTION_COUNT,r5 -1: mov.l r4,@r3 - add #4,r3 - dt r5 - bf 1b - # Write interrupt vector - mov.l $_cyg_hal_default_interrupt_vsr_p,r4 - mov.l r4,@r3 - bra 2f - nop - .align 2 - -$_cyg_hal_default_exception_vsr_p: - .long _cyg_hal_default_exception_vsr -$_cyg_hal_default_interrupt_vsr_p: - .long _cyg_hal_default_interrupt_vsr - - .extern _hal_vsr_table -$_hal_vsr_table_p: - .long _hal_vsr_table - -2: - .endm - -#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) - - # Initialize the VSR table entries - # We only take control of the interrupt vector, - # the rest are left to the ROM for now... - - .macro hal_mon_init - # Write interrupt vector - mov.l $_hal_vsr_table_p,r3 - mov.l $_cyg_hal_default_interrupt_vsr_p,r4 - mov.l r4,@r3 - bra 2f - nop - .align 2 - -$_cyg_hal_default_interrupt_vsr_p: - .long _cyg_hal_default_interrupt_vsr - - .extern _hal_vsr_table -$_hal_vsr_table_p: - .long _hal_vsr_table+CYGNUM_HAL_VECTOR_INTERRUPT*4 - -2: - .endm - -#else - - .macro hal_mon_init - .endm - -#endif - - -#define CYGPKG_HAL_SH_MON_DEFINED - -#endif // CYGPKG_HAL_SH_MON_DEFINED - -#endif // CYGONCE_HAL_PLATFORM_INC diff --git a/packages/hal/sh/edk/current/include/plf_stub.h b/packages/hal/sh/edk/current/include/plf_stub.h deleted file mode 100644 --- a/packages/hal/sh/edk/current/include/plf_stub.h +++ /dev/null @@ -1,90 +0,0 @@ -#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): jskov -// Contributors:jskov -// Date: 1999-05-18 -// Purpose: Platform HAL stub support for Hitachi/EDK boards. -// Usage: #include -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include -#include - -#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -#include // CYG_UNUSED_PARAM, externC - -#include // architecture stub support - -#include // hal_diag_led_on - -//---------------------------------------------------------------------------- -// 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. -#ifdef CYGSEM_HAL_ROM_MONITOR -# define HAL_STUB_PLATFORM_INIT() hal_diag_led_on() -#else -# define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT -#endif - -#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -// Block interrupts and cause an exception. This forces a reset. -#define HAL_STUB_PLATFORM_RESET() \ - asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 - -//----------------------------------------------------------------------------- -#endif // CYGONCE_HAL_PLF_STUB_H -// End of plf_stub.h diff --git a/packages/hal/sh/edk/current/misc/STUBS_config b/packages/hal/sh/edk/current/misc/STUBS_config deleted file mode 100644 --- a/packages/hal/sh/edk/current/misc/STUBS_config +++ /dev/null @@ -1,84 +0,0 @@ -#! /bin/sh -# Configure SH/edk7708 eCos to create EDK7708 GDB stubs -# Ensure that PATH include the directory where the SH tools reside. -# -# Run from an empty temporary directory with one argument: the path to -# the packages directory (i.e., where pkgconf.tcl lives). -# -# Output will be ./stubrom.bin which is suitable for burning into ROM. - -if ( echo | tclsh ) 2>/dev/null ; then - TCL=tclsh -elif ( echo | cygtclsh80 ) 2>/dev/null ; then - TCL=cygtclsh80 -else - echo Could not find TCL interpreter - exit 1 -fi - -$TCL $1/pkgconf.tcl \ - --target=sh --platform=edk7708 --startup=rom \ - --disable CYGPKG_KERNEL --disable CYGPKG_UITRON \ - --disable CYGPKG_LIBC --disable CYGPKG_LIBM \ - --disable CYGPKG_ERROR --disable CYGPKG_IO \ - --disable CYGPKG_IO_SERIAL --disable CYGPKG_DEVICES_WALLCLOCK \ - --disable CYGPKG_DEVICES_WATCHDOG - -patch < -#include - - .globl _hal_hardware_init -_hal_hardware_init: - - // Set up the Bus State Controller - mov.l $BSC_settings_table,r3 -1: mov.w @r3+,r0 // Address (or zero) - cmp/eq #0,r0 - bt 2f - mov.w @r3+,r1 // data - bra 1b - mov.w r1,@r0 // delay slot - -2: - rts - nop - - .align 2 -$BSC_settings_table: - .long BSC_settings_table -BSC_settings_table: - # These are the settings set by the Hitachi ROM Monitor. - - # BCR2: Bus size of areas 1-6 to 32 bits - .word CYGARC_REG_BCR2 - .word 0x3ffc - # BCR1: Areas 2 and 3 are SDRAM - .word CYGARC_REG_BCR1 - .word 0x080c - # BCR2: Bus size of areas 1-6 to 32 bits [note: second write!] - .word CYGARC_REG_BCR2 - .word 0x3ffc - # WCR1: 3 wait-state cycles inserted for all areas - .word CYGARC_REG_WCR1 - .word 0x3fff - # WCR2: extra wait states and full pitch for burst - .word CYGARC_REG_WCR2 - .word 0xffd7 - # MCR: RAS/CAS & burst timing area 2/3 - .word CYGARC_REG_MCR - .word 0x963c -#if 0 - # DCR: RAS/CAS & burst timing area 2 - .word CYGARC_REG_DCR - .word 0x0000 - # PCR: PCMCIA disabled - .word CYGARC_REG_PCR - .word 0x0000 -#endif - # RTCNT: refresh counter (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCNT - .word (0xa500 | 0x0000) - # RTCOR: refresh time constant (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCOR - .word (0xa500 | 0x003b) - # RFCR: refresh count register (needs a4 in top byte to accept write) - .word CYGARC_REG_RFCR - .word (0xa400 | 0x0000) - # RTCSR: refresh timer control (needs a5 in top byte to accept write) - .word CYGARC_REG_RTCSR - .word (0xa500 | 0x0008) - - # Set SDMR to 0x220 - .word 0xd880 - .word 0 - - # Table end - .word 0 - -#------------------------------------------------------------------------------ -# end of edk.S diff --git a/packages/hal/sh/edk/current/src/hal_diag.c b/packages/hal/sh/edk/current/src/hal_diag.c deleted file mode 100644 --- a/packages/hal/sh/edk/current/src/hal_diag.c +++ /dev/null @@ -1,219 +0,0 @@ -//============================================================================= -// -// 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): nickg, jskov -// Contributors: nickg, jskov -// Date: 1999-03-23 -// Purpose: HAL diagnostic output -// Description: Implementations of HAL diagnostic output support. -// -//####DESCRIPTIONEND#### -// -//============================================================================= - -#include - -#include // our header. - -#include // base types, externC -#include // IO macros -#include // Calling interface -#include // Interrupt macros -#include // driver API -#include // Helper functions - -#define SCI_BASE ((cyg_uint8*)0xfffffe80) - -//----------------------------------------------------------------------------- - -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - -void -cyg_hal_plf_comms_init(void) -{ - static int initialized = 0; - - if (initialized) - return; - - initialized = 1; - - cyg_hal_plf_sci_init(0, 0, CYGNUM_HAL_INTERRUPT_SCI_RXI, SCI_BASE); -} - -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - -//============================================================================= -// Led control -//============================================================================= -#define LED_ON 0x04000000 -#define LED_OFF 0x18000000 - -void -hal_diag_led_on( void ) -{ - HAL_WRITE_UINT8(LED_ON, 0); -} - -void -hal_diag_led_off( void ) -{ - HAL_WRITE_UINT8(LED_OFF, 0); -} - - -//============================================================================= -// Compatibility with older stubs -//============================================================================= - -#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG - -static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; - -#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) -#include // hal_output_gdb_string -#endif - -#if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) - -#define CYG_HAL_DIAG_GDB - -#elif defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) - -#define CYG_HAL_DIAG_GDB - -#endif - -//----------------------------------------------------------------------------- - -void hal_diag_init(void) -{ - cyg_hal_plf_sci_init_channel(&channel); -} - -void -hal_diag_write_char_serial( char c ) -{ - cyg_hal_plf_sci_putc(&channel, c); -} - -void -hal_diag_read_char(char *c) -{ - *c = (char) cyg_hal_plf_sci_getc(&channel); -} - -// Packet function -void -hal_diag_write_char(char c) -{ -#ifdef CYG_HAL_DIAG_GDB - static char line[100]; - static int pos = 0; - - // 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) - { - char c1; - static char hex[] = "0123456789ABCDEF"; - cyg_uint8 csum = 0; - int i; - - cyg_hal_plf_sci_putc(&channel, '$'); - cyg_hal_plf_sci_putc(&channel, '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_sci_putc(&channel, h); - cyg_hal_plf_sci_putc(&channel, l); - csum += h; - csum += l; - } - cyg_hal_plf_sci_putc(&channel, '#'); - cyg_hal_plf_sci_putc(&channel, hex[(csum>>4)&0xF]); - cyg_hal_plf_sci_putc(&channel, hex[csum&0xF]); - - // Wait for the ACK character '+' from GDB here and handle - // receiving a ^C instead. - c1 = (char) cyg_hal_plf_sci_getc(&channel); - - if( c1 == '+' ) - break; // a good acknowledge - - // Check for user break. - if( cyg_hal_is_break( &c1, 1 ) ) - cyg_hal_user_break( NULL ); - - // 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 - } -#else // CYG_HAL_DIAG_GDB - cyg_hal_plf_sci_putc(&channel, c); -#endif -} -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG - -//----------------------------------------------------------------------------- -// End of hal_diag.c diff --git a/packages/hal/sh/edk/current/src/plf_misc.c b/packages/hal/sh/edk/current/src/plf_misc.c deleted file mode 100644 --- a/packages/hal/sh/edk/current/src/plf_misc.c +++ /dev/null @@ -1,57 +0,0 @@ -//========================================================================== -// -// plf_misc.c -// -// HAL platform miscellaneous functions -// -//========================================================================== -//####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): jskov -// Contributors: jskov,nickg, jlarmour -// Date: 1999-10-13 -// Purpose: HAL miscellaneous functions -// Description: This file contains miscellaneous functions provided by the -// HAL. -// -//####DESCRIPTIONEND#### -// -//========================================================================== - -#include - -#include // interfacing API - -//-------------------------------------------------------------------------- -void -hal_platform_init(void) -{ - hal_if_init(); -} - -//-------------------------------------------------------------------------- -// eof plf_misc.c diff --git a/packages/hal/sh/edk7708/current/ChangeLog b/packages/hal/sh/edk7708/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/ChangeLog @@ -0,0 +1,365 @@ +2000-11-01 Jesper Skov + + * Moved HAL to edk7708. + +2000-10-31 Jesper Skov + + * include/plf_intr.h: Added. + * include/plf_cache.h: Added. + +2000-10-20 Jonathan Larmour + + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_rom.h: + * include/pkgconf/mlt_sh_edk7708_romram.h: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_rom.ldi: + * include/pkgconf/mlt_sh_edk7708_romram.ldi: + Regenerated with updated host tools + +2000-10-17 Jesper Skov + + * include/pkgconf/mlt_sh_edk7708_ram.h: Adding heap1. + * include/pkgconf/mlt_sh_edk7708_ram.mlt: Ditto. + * include/pkgconf/mlt_sh_edk7708_ram.ldi: Ditto. + * include/pkgconf/mlt_sh_edk7708_rom.h: Ditto. + * include/pkgconf/mlt_sh_edk7708_rom.mlt: Ditto. + * include/pkgconf/mlt_sh_edk7708_rom.ldi: Ditto. + * include/pkgconf/mlt_sh_edk7708_romram.h: Ditto. + * include/pkgconf/mlt_sh_edk7708_romram.mlt: Ditto. + * include/pkgconf/mlt_sh_edk7708_romram.ldi: Ditto. + +2000-10-10 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Fix legal OCC ranges. + +2000-09-26 Jesper Skov + + * include/platform.inc: Use calculated FRQCR init value. + + * cdl/hal_sh_edk7708.cdl: Updated clock options. + +2000-07-07 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Require sub-variant package. + +2000-06-29 Jesper Skov + + * src/hal_diag.c: serial driver API changes. + +2000-06-28 Jesper Skov + + * src/hal_diag.c: Include hal_if file. + +2000-06-28 Jesper Skov + + * src/plf_misc.c: + * src/hal_diag.c: + * src/plf_stub.c: [deleted] + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + * include/pkgconf/mlt_sh_edk7708_rom.h: + * include/pkgconf/mlt_sh_edk7708_rom.ldi: + * include/pkgconf/mlt_sh_edk7708_rom.mlt: + * include/pkgconf/mlt_sh_edk7708_romram.h: + * include/pkgconf/mlt_sh_edk7708_romram.ldi: + * include/pkgconf/mlt_sh_edk7708_romram.mlt: + * include/plf_stub.h: + * include/hal_diag.h: + * cdl/hal_sh_edk7708.cdl: + Changed to use virtual vector table. + +1999-06-19 John Dallaway + + * cdl/hal_sh_edk7708.cdl: Tidy display strings. + +2000-04-12 Jesper Skov + + * src/hal_diag.c: Output text raw if configuration requires it. + + * include/platform.inc: + * src/edk.S: [deleted] + * cdl/hal_sh_edk7708.cdl: + Hardware init code moved to platform.inc in order to allow ROMRAM + startup. + + * include/pkgconf/mlt_sh_edk7708_romram.h: + * include/pkgconf/mlt_sh_edk7708_romram.mlt: + * include/pkgconf/mlt_sh_edk7708_romram.ldi: + * cdl/hal_sh_edk7708.cdl: + Add ROMRAM startup option. + +2000-04-06 Jonathan Larmour + + * cdl/hal_sh_edk7708.cdl: Use -g now that toolchains work with that + (and in fact new toolchains no longer work with -ggdb) + +2000-04-06 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Define vsr base location. + +2000-04-04 Jesper Skov + + * src/hal_diag.c (hal_diag_write_char): Add GDB critical IO region + handling. + +2000-03-20 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Added board speed variable. + +2000-03-09 Jesper Skov + + * src/hal_diag.c: Fix compiler warning. + +2000-02-28 Jesper Skov + + * include/platform.inc: Use sh_offsets instead of C header. + +2000-02-18 Jonathan Larmour + + * cdl/hal_sh_edk7708.cdl (CYGBLD_BUILD_GDB_STUBS): When + building stubs, define every dependency required here rather than + in the template + +2000-02-17 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: + Go back to -ggdb. -gstabs don't provide enough info for + source-level debugging. + + * include/pkgconf/mlt_sh_edk7708_rom.h: + * include/pkgconf/mlt_sh_edk7708_rom.ldi: + * include/pkgconf/mlt_sh_edk7708_rom.mlt: + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + Don't use . assignment due to tools problem. + +2000-02-16 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Added LE support. + +2000-02-15 Jesper Skov + + * misc/STUBS_config: + * include/pkgconf/mlt_sh_edk7708_rom.ldi: + * include/pkgconf/mlt_sh_edk7708_rom.mlt: + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + Updated for new stubs scheme. + + * cdl/hal_sh_edk7708.cdl: Removed stubs startup. + Use -gstabs instead of -ggdb to work around problem with GDB. + +2000-02-10 Jesper Skov + + * include/plf_stub.h: + HAL_STUB_PLATFORM_STUBS_INIT->HAL_STUB_PLATFORM_INIT + +2000-02-07 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: use cpu flags when linking. + +2000-02-03 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Implements stubs. + +2000-01-27 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Moved part of stubs build rule to + common HAL. Changed description. + +2000-01-26 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Fix display string. + +2000-01-24 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Add stubs build rule. + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + * include/pkgconf/mlt_sh_edk7708_stubs.ldi: + * include/pkgconf/mlt_sh_edk7708_stubs.h: + * include/pkgconf/mlt_sh_edk7708_stubs.mlt: + Give stub more RAM. + +2000-01-24 John Dallaway + + * cdl/*.cdl: + + Remove obsolete option CYGTST_TESTING_IDENTIFIER. + +2000-01-19 Hugo Tyson + + * cdl/*.cdl: Add descriptions to a number of options &c which were + lacking same, also tidied up other typos as noticed en passant. + +2000-01-18 Jesper Skov + CR 902066 + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + * include/pkgconf/mlt_sh_edk7708_ram.h: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + Correct RAM size. + +1999-12-21 Jonathan Larmour + + * src/plf_misc.c (cyg_hal_user_break): Rename + CYG_HAL_USE_ROM_MONITOR_GDB_STUBS -> CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs + + * cdl/hal_sh_edk7708.cdl: Don't need to define CYG_HAL_SH_SH7708 any + more + Add new platform-specific CYGSEM_HAL_USE_ROM_MONITOR option to + control ROM monitor support + +1999-12-20 Gary Thomas + + * cdl/hal_sh_edk7708.cdl: Add -Wl for linker options. + +1999-11-25 Gary Thomas + + * include/pkgconf/mlt_sh_edk7708_stubs.h: + * include/pkgconf/mlt_sh_edk7708_rom.h: + * include/pkgconf/mlt_sh_edk7708_ram.h: New file(s). + +1999-11-02 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Use define_proc for CPU define. + +1999-11-01 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Use define_proc for const header defs. + +1999-10-29 Jesper Skov + + * cdl/hal_sh_edk7708.cdl: Added. + +1999-10-13 Jesper Skov + + * src/hal_diag.c (hal_diag_write_char): + * src/plf_misc.c: + * src/PKGconf.mak (COMPILE): + Added user breakpoint handling. + +1999-09-02 Jesper Skov + + * misc/STUBS_config: Also disable kernel support in HAL. + +1999-08-17 Jesper Skov + + * misc/STUBS_config: Added. + +1999-06-18 Jesper Skov + + * include/pkgconf/hal_sh_edk7708.h: Consistent EDK7708 naming. + +1999-06-01 Jesper Skov + + * src/hal_diag.c (hal_diag_write_char): Don't look for 0x03 + chars. It doesn't work well. Better the dedicated magic handles + C-c. + + * src/edk.S: Cleaned up memory controller setup. + +1999-05-31 Jesper Skov + + * include/pkgconf/hal_sh_edk7708.h: Removed FIX ME. + + * src/edk.S: Fixed delay-slot problem. + +1999-05-28 Jesper Skov + + * include/pkgconf/hal_sh_edk7708.h: Fixed platform name. + + * include/pkgconf/mlt_sh_edk7708_rom.ldi: + * include/pkgconf/mlt_sh_edk7708_rom.mlt: + * include/pkgconf/mlt_sh_edk7708_stubs.ldi: + * include/pkgconf/mlt_sh_edk7708_stubs.mlt: + * include/pkgconf/mlt_sh_edk7708_ram.ldi: + * include/pkgconf/mlt_sh_edk7708_ram.mlt: + Fixed memory layout and generated MLT files. + +1999-05-28 Jesper Skov + + * include/pkgconf/hal_sh_edk.h: [deleted] + * include/pkgconf/mlt_sh_edk_ram.ldi: [deleted] + * include/pkgconf/mlt_sh_edk_ram.mlt: [deleted] + * include/pkgconf/mlt_sh_edk_rom.ldi: [deleted] + * include/pkgconf/mlt_sh_edk_stubs.ldi: [deleted] + * include/pkgconf/hal_sh_edk7708.h: [added] + * include/pkgconf/mlt_sh_edk7708_ram.ldi: [added] + * include/pkgconf/mlt_sh_edk7708_ram.mlt: [added] + * include/pkgconf/mlt_sh_edk7708_rom.ldi: [added] + * include/pkgconf/mlt_sh_edk7708_rom.mlt: [added] + * include/pkgconf/mlt_sh_edk7708_stubs.ldi:[added] + * include/pkgconf/mlt_sh_edk7708_stubs.mlt:[added] + * src/PKGconf.mak: + Renamed SH platform package to edk7708. + +1999-05-21 Jesper Skov + + * include/pkgconf/hal_sh_edk.h (CYGNUM_HAL_RTC_PERIOD): The timer + is running at 1/4 of the peripheral clock. + + * include/plf_stub.h: Added RESET code. + + * include/pkgconf/hal_sh_edk.h: Added RTC data for the edk board. + +1999-05-20 John Dallaway + + * include/pkgconf/mlt_sh_edk_ram.mlt: Working MLT-generated + version. + +1999-05-20 Jesper Skov + + * Moved files to CVS trunk. + +1999-05-19 Jesper Skov + + * src/edk.S (_hal_hardware_init): Fix a few mistakes. + + * include/plf_stub.h: Enable led in stub init. + + * include/pkgconf/mlt_sh_edk_stubs.ldi: + * include/pkgconf/mlt_sh_edk_rom.ldi: + Added. + Moved RAM region to the end of the chunk and made it bigger. + + * src/edk.S (_hal_hardware_init): Added Bus State Controller + initialization. + +1999-05-19 Jesper Skov + + * Most things working now. Will start keeping track of changes. + +1999-04-22 Jesper Skov + + * Set up directory structure. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/sh/edk7708/current/cdl/hal_sh_edk7708.cdl b/packages/hal/sh/edk7708/current/cdl/hal_sh_edk7708.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/cdl/hal_sh_edk7708.cdl @@ -0,0 +1,312 @@ +# ==================================================================== +# +# hal_sh_edk7708.cdl +# +# EDK7708 board 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): jskov +# Original data: jskov +# Contributors: +# Date: 1999-10-29 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_SH_EDK7708 { + display "Hitachi EDK/SH7708 board" + parent CYGPKG_HAL_SH + requires CYGPKG_HAL_SH_7708 + define_header hal_sh_edk7708.h + include_dir cyg/hal + description " + The edk HAL package provides the support needed to run + eCos on a Hitachi SH3 EDK7708 board." + + compile hal_diag.c plf_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 " + puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H " + + puts $::cdl_header "#define CYGNUM_HAL_SH_SH3_SCI_PORTS 1" + puts $::cdl_header "#define CYGHWR_HAL_VSR_TABLE 0x08000000" + puts $::cdl_header "#define CYGHWR_HAL_VECTOR_TABLE 0x08000100" + } + + cdl_component CYG_HAL_STARTUP { + display "Startup type" + flavor data + legal_values {"RAM" "ROM" "ROMRAM"} + default_value {"RAM"} + no_define + define -file system.h CYG_HAL_STARTUP + description " + When targetting the EDK7708 board it is possible to build + the system for either RAM bootstrap or ROM bootstrap. + RAM bootstrap generally requires that the board + is equipped with ROMs containing a suitable ROM monitor or + equivalent software that allows GDB to download the eCos + application on to the board. The ROM bootstrap typically + requires that the eCos application be blown into EPROMs or + equivalent technology. ROMRAM bootstrap is similar to ROM + bootstrap, but everything is copied to RAM before execution + starts thus improving performace, but at the cost of an + increased RAM footprint." + } + + 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 EDK/7708 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 EDK/7708 board has only one serial port. This option + chooses which port will be used for diagnostic output." + } + + cdl_component CYGHWR_HAL_SH_PLF_CLOCK_SETTINGS { + display "SH on-chip platform clock controls" + description " + The various clocks used by the system are derived from + these options." + flavor none + no_define + + cdl_option CYGHWR_HAL_SH_OOC_XTAL { + display "SH clock crystal" + flavor data + legal_values 8000000 to 50000000 + default_value 15000000 + no_define + description " + This option specifies the frequency of the crystal all + other clocks are derived from." + } + + cdl_option CYGHWR_HAL_SH_OOC_PLL_1 { + display "SH clock PLL circuit 1" + flavor data + default_value 1 + legal_values { 0 1 2 4 } + description " + This selects the multiplication factor provided by + PLL1. If PLL1 is disabled via CAP1, this option should + be set to zero." + } + + cdl_option CYGHWR_HAL_SH_OOC_PLL_2 { + display "SH clock PLL circuit 2" + flavor data + default_value 4 + legal_values { 0 1 4 } + no_define + description " + This selects the multiplication factor provided by + PLL2. If PLL2 is disabled via CAP2, this option should + be set to zero." + } + + cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_1 { + display "SH clock divider 1" + flavor data + default_value 1 + legal_values { 1 2 3 4 } + description " + This divider option affects the CPU core clock." + } + + cdl_option CYGHWR_HAL_SH_OOC_DIVIDER_2 { + display "SH clock divider 2" + flavor data + default_value 4 + legal_values { 1 2 3 4 } + description " + This divider option affects the peripheral clock." + } + + cdl_option CYGHWR_HAL_SH_OOC_CLOCK_MODE { + display "SH clock mode" + flavor data + default_value 2 + legal_values { 0 1 2 3 4 7 } + description " + This option must mirror the clock mode hardwired on + the MD0-MD2 pins of the CPU in order to correctly + initialize the FRQCR register." + } + } + + cdl_component CYGBLD_GLOBAL_OPTIONS { + display "Global build options" + flavor none + parent CYGPKG_NONE + no_define + description " + Global build options including control over + compiler flags, linker flags and choice of toolchain." + + + cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { + display "Global command prefix" + flavor data + no_define + default_value { "sh-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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m3 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" : "-ml -m3 -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 { CYGHWR_HAL_SH_BIGENDIAN ? "-mb -m3 -nostdlib -Wl,--gc-sections -Wl,-static" : "-ml -m3 -nostdlib -Wl,--gc-sections -Wl,-static" } + description " + This option controls the global linker flags. Individual + packages may define options which override these global flags." + } + + cdl_option CYGBLD_BUILD_GDB_STUBS { + display "Build GDB stub ROM image" + default_value 0 + requires { CYG_HAL_STARTUP == "ROM" } + requires CYGSEM_HAL_ROM_MONITOR + requires CYGBLD_BUILD_COMMON_GDB_STUBS + requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + requires CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT + requires CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + no_define + description " + This option enables the building of the GDB stubs for the + board. The common HAL controls takes care of most of the + build process, but the final conversion from ELF image to + binary data is handled by the platform CDL, allowing + relocation of the data if necessary." + + make -priority 320 { + /bin/gdb_module.bin : /bin/gdb_module.img + $(OBJCOPY) -O binary $< $@ + } + } + } + + cdl_component CYGHWR_MEMORY_LAYOUT { + display "Memory layout" + flavor data + no_define + calculated { CYG_HAL_STARTUP == "RAM" ? "sh_edk7708_ram" : \ + CYG_HAL_STARTUP == "ROM" ? "sh_edk7708_rom" : \ + "sh_edk7708_romram" } + + 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" ? "" : \ + CYG_HAL_STARTUP == "ROM" ? "" : \ + "" } + } + + 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" ? "" : \ + CYG_HAL_STARTUP == "ROM" ? "" : \ + "" } + } + } + + cdl_option CYGSEM_HAL_USE_ROM_MONITOR { + display "Work with a ROM monitor" + flavor booldata + legal_values { "GDB_stubs" } + default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } + requires { CYG_HAL_STARTUP == "RAM" } + parent CYGPKG_HAL_ROM_MONITOR + description " + Support can be enabled for boot ROMs or ROM monitors which contain + GDB stubs. This support changes various eCos semantics such as + the encoding of diagnostic output, and the overriding of hardware + interrupt vectors." + } + + cdl_option CYGSEM_HAL_ROM_MONITOR { + display "Behave as a ROM monitor" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + requires { CYG_HAL_STARTUP == "ROM" } + description " + Enable this option if this program is to be used as a ROM monitor, + i.e. applications will be loaded into RAM on the board, and this + ROM monitor may process exceptions or interrupts generated from the + application. This enables features such as utilizing a separate + interrupt stack when exceptions are generated." + } +} diff --git a/packages/hal/sh/edk7708/current/include/hal_diag.h b/packages/hal/sh/edk7708/current/include/hal_diag.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/hal_diag.h @@ -0,0 +1,88 @@ +#ifndef CYGONCE_HAL_HAL_DIAG_H +#define CYGONCE_HAL_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): jskov +// Contributors:jskov +// Date: 1999-04-24 +// Purpose: HAL Support for Kernel Diagnostic Routines +// Description: Diagnostic routines for use during kernel development. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) + +#include + +#define HAL_DIAG_INIT() hal_if_diag_init() +#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_) +#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_) + +#else // everything by steam + +//----------------------------------------------------------------------------- +// 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 // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// Simple LED control. +externC void hal_diag_led_on( void ); +externC void hal_diag_led_off( void ); + +//----------------------------------------------------------------------------- +// end of hal_diag.h +#endif // CYGONCE_HAL_HAL_DIAG_H diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.h b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.h @@ -0,0 +1,17 @@ +// eCos memory layout - Fri Oct 20 09:50:36 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x8008000) +#define CYGMEM_REGION_ram_SIZE (0xf8000) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.ldi b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.ldi @@ -0,0 +1,26 @@ +// eCos memory layout - Fri Oct 20 09:50:36 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x8008000, LENGTH = 0xf8000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (ram, 0x8008000, LMA_EQ_VMA) + SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.mlt b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_ram.mlt @@ -0,0 +1,12 @@ +version 0 +region ram 8008000 f8000 0 ! +section vectors 0 1 0 1 1 1 1 1 8008000 8008000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 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 1 0 1 0 1 0 1 data data ! +section data 0 8 0 1 0 1 0 1 bss bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.h b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.h @@ -0,0 +1,20 @@ +// eCos memory layout - Fri Oct 20 09:51:04 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x8000200) +#define CYGMEM_REGION_ram_SIZE (0xffe00) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0xa0000000) +#define CYGMEM_REGION_rom_SIZE (0x20000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.ldi b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.ldi @@ -0,0 +1,27 @@ +// eCos memory layout - Fri Oct 20 09:51:04 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x8000200, LENGTH = 0xffe00 + rom : ORIGIN = 0xa0000000, LENGTH = 0x20000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (rom, 0xa0000000, LMA_EQ_VMA) + SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_rodata (rom, ALIGN (0x8), LMA_EQ_VMA) + SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA) + SECTION_gcc_except_table (rom, ALIGN (0x1), LMA_EQ_VMA) + SECTION_data (ram, 0x8000200, FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.mlt b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_rom.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 8000200 ffe00 0 ! +region rom a0000000 20000 1 ! +section data 0 1 1 1 1 1 0 0 8000200 bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! +section vectors 0 1 0 1 1 1 1 1 a0000000 a0000000 text text ! +section text 0 4 0 1 0 1 0 1 fini fini ! +section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 8 0 1 0 1 0 1 rodata rodata ! +section rodata 0 8 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 1 0 1 0 0 0 1 data ! diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.h b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.h @@ -0,0 +1,20 @@ +// eCos memory layout - Fri Oct 20 09:51:30 2000 + +// This is a generated file - do not edit + +#ifndef __ASSEMBLER__ +#include +#include + +#endif +#define CYGMEM_REGION_ram (0x8000200) +#define CYGMEM_REGION_ram_SIZE (0xffe00) +#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W) +#define CYGMEM_REGION_rom (0xa0000000) +#define CYGMEM_REGION_rom_SIZE (0x20000) +#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R) +#ifndef __ASSEMBLER__ +extern char CYG_LABEL_NAME (__heap1) []; +#endif +#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1)) +#define CYGMEM_SECTION_heap1_SIZE (0x8100000 - (size_t) CYG_LABEL_NAME (__heap1)) diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.ldi b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.ldi new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.ldi @@ -0,0 +1,27 @@ +// eCos memory layout - Fri Oct 20 09:51:30 2000 + +// This is a generated file - do not edit + +#include + +MEMORY +{ + ram : ORIGIN = 0x8000200, LENGTH = 0xffe00 + rom : ORIGIN = 0xa0000000, LENGTH = 0x20000 +} + +SECTIONS +{ + SECTIONS_BEGIN + SECTION_vectors (ram, 0x8000200, AT (0xa0000000)) + SECTION_text (ram, ALIGN (0x10), FOLLOWING (.vectors)) + SECTION_fini (ram, ALIGN (0x10), FOLLOWING (.text)) + SECTION_rodata1 (ram, ALIGN (0x10), FOLLOWING (.fini)) + SECTION_rodata (ram, ALIGN (0x10), FOLLOWING (.rodata1)) + SECTION_fixup (ram, ALIGN (0x10), FOLLOWING (.rodata)) + SECTION_gcc_except_table (ram, ALIGN (0x10), FOLLOWING (.fixup)) + SECTION_data (ram, ALIGN (0x10), FOLLOWING (.gcc_except_table)) + SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA) + CYG_LABEL_DEFN(__heap1) = ALIGN (0x8); + SECTIONS_END +} diff --git a/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.mlt b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.mlt new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/pkgconf/mlt_sh_edk7708_romram.mlt @@ -0,0 +1,13 @@ +version 0 +region ram 8000200 ffe00 0 ! +region rom a0000000 20000 1 ! +section vectors 0 10 1 1 1 1 1 1 8000200 a0000000 text text ! +section text 0 10 1 1 0 1 0 1 fini fini ! +section fini 0 10 1 1 0 1 0 1 rodata1 rodata1 ! +section rodata1 0 10 1 1 0 1 0 1 rodata rodata ! +section rodata 0 10 1 1 0 1 0 1 fixup fixup ! +section fixup 0 10 1 1 0 1 0 1 gcc_except_table gcc_except_table ! +section gcc_except_table 0 10 1 1 0 1 0 1 data data ! +section data 0 10 1 1 0 1 0 0 bss ! +section bss 0 10 0 1 0 1 0 1 heap1 heap1 ! +section heap1 0 8 0 0 0 0 0 0 ! diff --git a/packages/hal/sh/edk7708/current/include/platform.inc b/packages/hal/sh/edk7708/current/include/platform.inc new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/platform.inc @@ -0,0 +1,196 @@ +#ifndef CYGONCE_HAL_PLATFORM_INC +#define CYGONCE_HAL_PLATFORM_INC +##============================================================================= +## +## platform.inc +## +## SH/EDK7708 board assembler header file +## +##============================================================================= +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.0 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://sourceware.cygnus.com/ecos +# +# Software distributed under the License is distributed on an +# 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): jskov +## Contributors:jskov +## Date: 2000-02-02 +## Purpose: SH/EDK7708 board definitions. +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the SH/EDK7708 board. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#include +#include + +#------------------------------------------------------------------------------ +# Hardware initialization. + + .macro hal_hardware_init + // Set up the Bus State Controller + mova BSC_settings_table,r0 + mov r0,r3 +1: mov.w @r3+,r0 // Address (or zero) + cmp/eq #0,r0 + bt 2f + mov.w @r3+,r1 // data + bra 1b + mov.w r1,@r0 // delay slot + + .align 2 +BSC_settings_table: + # These are the settings set by the Hitachi ROM Monitor. + + .word CYGARC_REG_FRQCR + .word CYGARC_REG_FRQCR_INIT + + # BCR2: Bus size of areas 1-6 to 32 bits + .word CYGARC_REG_BCR2 + .word 0x3ffc + # BCR1: Areas 2 and 3 are SDRAM + .word CYGARC_REG_BCR1 + .word 0x080c + # BCR2: Bus size of areas 1-6 to 32 bits [note: second write!] + .word CYGARC_REG_BCR2 + .word 0x3ffc + # WCR1: 3 wait-state cycles inserted for all areas + .word CYGARC_REG_WCR1 + .word 0x3fff + # WCR2: extra wait states and full pitch for burst + .word CYGARC_REG_WCR2 + .word 0xffd7 + # MCR: RAS/CAS & burst timing area 2/3 + .word CYGARC_REG_MCR + .word 0x963c + # RTCNT: refresh counter (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCNT + .word (0xa500 | 0x0000) + # RTCOR: refresh time constant (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCOR + .word (0xa500 | 0x003b) + # RFCR: refresh count register (needs a4 in top byte to accept write) + .word CYGARC_REG_RFCR + .word (0xa400 | 0x0000) + # RTCSR: refresh timer control (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCSR + .word (0xa500 | 0x0008) + + # Set SDMR to 0x220 + .word 0xd880 + .word 0 + + # Table end + .word 0 + + .align 2 +2: + .endm + +#------------------------------------------------------------------------------ +# Monitor initialization. + +#ifndef CYGPKG_HAL_SH_MON_DEFINED + +#if !defined(CYG_HAL_STARTUP_RAM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + + # If we are not starting up from RAM, or we are starting in + # RAM and NOT using a ROM monitor, initialize the VSR table. + + .macro hal_mon_init + mov.l $_hal_vsr_table_p,r3 + # Write exception vectors + mov.l $_cyg_hal_default_exception_vsr_p,r4 + mov #CYGNUM_HAL_VSR_EXCEPTION_COUNT,r5 +1: mov.l r4,@r3 + add #4,r3 + dt r5 + bf 1b + # Write interrupt vector + mov.l $_cyg_hal_default_interrupt_vsr_p,r4 + mov.l r4,@r3 + bra 2f + nop + .align 2 + +$_cyg_hal_default_exception_vsr_p: + .long _cyg_hal_default_exception_vsr +$_cyg_hal_default_interrupt_vsr_p: + .long _cyg_hal_default_interrupt_vsr + + .extern _hal_vsr_table +$_hal_vsr_table_p: + .long _hal_vsr_table + +2: + .endm + +#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) + + # Initialize the VSR table entries + # We only take control of the interrupt vector, + # the rest are left to the ROM for now... + + .macro hal_mon_init + # Write interrupt vector + mov.l $_hal_vsr_table_p,r3 + mov.l $_cyg_hal_default_interrupt_vsr_p,r4 + mov.l r4,@r3 + bra 2f + nop + .align 2 + +$_cyg_hal_default_interrupt_vsr_p: + .long _cyg_hal_default_interrupt_vsr + + .extern _hal_vsr_table +$_hal_vsr_table_p: + .long _hal_vsr_table+CYGNUM_HAL_VECTOR_INTERRUPT*4 + +2: + .endm + +#else + + .macro hal_mon_init + .endm + +#endif + + +#define CYGPKG_HAL_SH_MON_DEFINED + +#endif // CYGPKG_HAL_SH_MON_DEFINED + +#endif // CYGONCE_HAL_PLATFORM_INC diff --git a/packages/hal/sh/edk7708/current/include/plf_cache.h b/packages/hal/sh/edk7708/current/include/plf_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/plf_cache.h @@ -0,0 +1,61 @@ +#ifndef CYGONCE_PLF_CACHE_H +#define CYGONCE_PLF_CACHE_H + +//============================================================================= +// +// plf_cache.h +// +// Platform specific 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): jskov +// Contributors:jskov +// Date: 2000-10-31 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +//============================================================================= + +// Nothing here at present. + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_PLF_CACHE_H +// End of plf_cache.h + diff --git a/packages/hal/sh/edk7708/current/include/plf_intr.h b/packages/hal/sh/edk7708/current/include/plf_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/plf_intr.h @@ -0,0 +1,60 @@ +#ifndef CYGONCE_HAL_PLF_INTR_H +#define CYGONCE_HAL_PLF_INTR_H + +//========================================================================== +// +// plf_intr.h +// +// Platform specific 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): jskov +// Contributors: jskov, +// Date: 2000-10-31 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock for the EDK board. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +//-------------------------------------------------------------------------- + +// No platform specific stuff at present. + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_PLF_INTR_H +// End of plf_intr.h diff --git a/packages/hal/sh/edk7708/current/include/plf_stub.h b/packages/hal/sh/edk7708/current/include/plf_stub.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/include/plf_stub.h @@ -0,0 +1,90 @@ +#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): jskov +// Contributors:jskov +// Date: 1999-05-18 +// Purpose: Platform HAL stub support for Hitachi/EDK boards. +// Usage: #include +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#include // CYG_UNUSED_PARAM, externC + +#include // architecture stub support + +#include // hal_diag_led_on + +//---------------------------------------------------------------------------- +// 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. +#ifdef CYGSEM_HAL_ROM_MONITOR +# define HAL_STUB_PLATFORM_INIT() hal_diag_led_on() +#else +# define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT +#endif + +#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +//---------------------------------------------------------------------------- +// Reset. +// Block interrupts and cause an exception. This forces a reset. +#define HAL_STUB_PLATFORM_RESET() \ + asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) + +#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 + +//----------------------------------------------------------------------------- +#endif // CYGONCE_HAL_PLF_STUB_H +// End of plf_stub.h diff --git a/packages/hal/sh/edk7708/current/src/edk.S b/packages/hal/sh/edk7708/current/src/edk.S new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/src/edk.S @@ -0,0 +1,117 @@ +##============================================================================= +## +## edk.S +## +## EDK board hardware setup +## +##============================================================================= +#####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): jskov +## Contributors:jskov +## Date: 1999-05-03 +## Purpose: EDK7708 board hardware setup +## Description: This file contains any code needed to initialize the +## hardware on a Hitachi SH3 EDK7708 board. +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include +#include + + .globl _hal_hardware_init +_hal_hardware_init: + + // Set up the Bus State Controller + mov.l $BSC_settings_table,r3 +1: mov.w @r3+,r0 // Address (or zero) + cmp/eq #0,r0 + bt 2f + mov.w @r3+,r1 // data + bra 1b + mov.w r1,@r0 // delay slot + +2: + rts + nop + + .align 2 +$BSC_settings_table: + .long BSC_settings_table +BSC_settings_table: + # These are the settings set by the Hitachi ROM Monitor. + + # BCR2: Bus size of areas 1-6 to 32 bits + .word CYGARC_REG_BCR2 + .word 0x3ffc + # BCR1: Areas 2 and 3 are SDRAM + .word CYGARC_REG_BCR1 + .word 0x080c + # BCR2: Bus size of areas 1-6 to 32 bits [note: second write!] + .word CYGARC_REG_BCR2 + .word 0x3ffc + # WCR1: 3 wait-state cycles inserted for all areas + .word CYGARC_REG_WCR1 + .word 0x3fff + # WCR2: extra wait states and full pitch for burst + .word CYGARC_REG_WCR2 + .word 0xffd7 + # MCR: RAS/CAS & burst timing area 2/3 + .word CYGARC_REG_MCR + .word 0x963c +#if 0 + # DCR: RAS/CAS & burst timing area 2 + .word CYGARC_REG_DCR + .word 0x0000 + # PCR: PCMCIA disabled + .word CYGARC_REG_PCR + .word 0x0000 +#endif + # RTCNT: refresh counter (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCNT + .word (0xa500 | 0x0000) + # RTCOR: refresh time constant (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCOR + .word (0xa500 | 0x003b) + # RFCR: refresh count register (needs a4 in top byte to accept write) + .word CYGARC_REG_RFCR + .word (0xa400 | 0x0000) + # RTCSR: refresh timer control (needs a5 in top byte to accept write) + .word CYGARC_REG_RTCSR + .word (0xa500 | 0x0008) + + # Set SDMR to 0x220 + .word 0xd880 + .word 0 + + # Table end + .word 0 + +#------------------------------------------------------------------------------ +# end of edk.S diff --git a/packages/hal/sh/edk7708/current/src/hal_diag.c b/packages/hal/sh/edk7708/current/src/hal_diag.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/src/hal_diag.c @@ -0,0 +1,219 @@ +//============================================================================= +// +// 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): nickg, jskov +// Contributors: nickg, jskov +// Date: 1999-03-23 +// Purpose: HAL diagnostic output +// Description: Implementations of HAL diagnostic output support. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include // our header. + +#include // base types, externC +#include // IO macros +#include // Calling interface +#include // Interrupt macros +#include // driver API +#include // Helper functions + +#define SCI_BASE ((cyg_uint8*)0xfffffe80) + +//----------------------------------------------------------------------------- + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +void +cyg_hal_plf_comms_init(void) +{ + static int initialized = 0; + + if (initialized) + return; + + initialized = 1; + + cyg_hal_plf_sci_init(0, 0, CYGNUM_HAL_INTERRUPT_SCI_RXI, SCI_BASE); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +//============================================================================= +// Led control +//============================================================================= +#define LED_ON 0x04000000 +#define LED_OFF 0x18000000 + +void +hal_diag_led_on( void ) +{ + HAL_WRITE_UINT8(LED_ON, 0); +} + +void +hal_diag_led_off( void ) +{ + HAL_WRITE_UINT8(LED_OFF, 0); +} + + +//============================================================================= +// Compatibility with older stubs +//============================================================================= + +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; + +#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) +#include // hal_output_gdb_string +#endif + +#if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs) + +#define CYG_HAL_DIAG_GDB + +#elif defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) + +#define CYG_HAL_DIAG_GDB + +#endif + +//----------------------------------------------------------------------------- + +void hal_diag_init(void) +{ + cyg_hal_plf_sci_init_channel(&channel); +} + +void +hal_diag_write_char_serial( char c ) +{ + cyg_hal_plf_sci_putc(&channel, c); +} + +void +hal_diag_read_char(char *c) +{ + *c = (char) cyg_hal_plf_sci_getc(&channel); +} + +// Packet function +void +hal_diag_write_char(char c) +{ +#ifdef CYG_HAL_DIAG_GDB + static char line[100]; + static int pos = 0; + + // 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) + { + char c1; + static char hex[] = "0123456789ABCDEF"; + cyg_uint8 csum = 0; + int i; + + cyg_hal_plf_sci_putc(&channel, '$'); + cyg_hal_plf_sci_putc(&channel, '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_sci_putc(&channel, h); + cyg_hal_plf_sci_putc(&channel, l); + csum += h; + csum += l; + } + cyg_hal_plf_sci_putc(&channel, '#'); + cyg_hal_plf_sci_putc(&channel, hex[(csum>>4)&0xF]); + cyg_hal_plf_sci_putc(&channel, hex[csum&0xF]); + + // Wait for the ACK character '+' from GDB here and handle + // receiving a ^C instead. + c1 = (char) cyg_hal_plf_sci_getc(&channel); + + if( c1 == '+' ) + break; // a good acknowledge + + // Check for user break. + if( cyg_hal_is_break( &c1, 1 ) ) + cyg_hal_user_break( NULL ); + + // 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 + } +#else // CYG_HAL_DIAG_GDB + cyg_hal_plf_sci_putc(&channel, c); +#endif +} +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG + +//----------------------------------------------------------------------------- +// End of hal_diag.c diff --git a/packages/hal/sh/edk7708/current/src/plf_misc.c b/packages/hal/sh/edk7708/current/src/plf_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/edk7708/current/src/plf_misc.c @@ -0,0 +1,57 @@ +//========================================================================== +// +// plf_misc.c +// +// HAL platform miscellaneous functions +// +//========================================================================== +//####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): jskov +// Contributors: jskov,nickg, jlarmour +// Date: 1999-10-13 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // interfacing API + +//-------------------------------------------------------------------------- +void +hal_platform_init(void) +{ + hal_if_init(); +} + +//-------------------------------------------------------------------------- +// eof plf_misc.c diff --git a/packages/hal/sh/sh3/current/ChangeLog b/packages/hal/sh/sh3/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/ChangeLog @@ -0,0 +1,35 @@ +2000-11-01 Jesper Skov + + * Many changes to bring the Haruki's HAL split up to date. Also + split the register header file into many header files, one for + each CPU module. + +2000-08-15 Haruki Kashiwaya + + * Set up directory structure. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/sh/sh3/current/cdl/hal_sh_sh3.cdl b/packages/hal/sh/sh3/current/cdl/hal_sh_sh3.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/cdl/hal_sh_sh3.cdl @@ -0,0 +1,372 @@ +# ==================================================================== +# +# hal_sh_sh3.cdl +# +# SH3 variant 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): jskov +# Original data: jskov +# Contributors: +# Date: 2000-10-30 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_SH_SH3 { + display "SH3 variant" + parent CYGPKG_HAL_SH + hardware + include_dir cyg/hal + define_header hal_sh_sh3.h + description " + The SH3 (SuperH 3) variant HAL package provides generic + support for SH3 variant CPUs." + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H " + } + + compile sh3_sci.c sh3_scif.c var_misc.c variant.S + + # The "-o file" is a workaround for CR100958 - without it the + # output file would end up in the source directory under CygWin. + # n.b. grep does not behave itself under win32 + make -priority 1 { + /include/cyg/hal/sh3_offsets.inc : /src/var_mk_defs.c + $(CC) $(CFLAGS) $(INCLUDE_PATH) -Wp,-MD,sh3_offsets.tmp -o var_mk_defs.tmp -S $< + fgrep .equ var_mk_defs.tmp | sed s/#// > $@ + @echo $@ ": \\" > $(notdir $@).deps + @tail +2 sh3_offsets.tmp >> $(notdir $@).deps + @echo >> $(notdir $@).deps + @rm sh3_offsets.tmp var_mk_defs.tmp + } + + # CPU variant supported + cdl_option CYGPKG_HAL_SH_7707A { + display "SH 7707A microprocessor" + parent CYGPKG_HAL_SH_CPU + implements CYGINT_HAL_SH_VARIANT + implements CYGINT_HAL_SH_CPG_T2 + default_value 0 + no_define + define -file=system.h CYGPKG_HAL_SH_7707A + description " + The SH3 7707A microprocessor. This is an embedded part that in + addition to the SH3 processor core has built in peripherals + such as memory controllers, serial ports, LCD controller and + timers/counters." + define_proc { + puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " + } + } + + cdl_option CYGPKG_HAL_SH_7708 { + display "SH 7708 microprocessor" + parent CYGPKG_HAL_SH_CPU + implements CYGINT_HAL_SH_VARIANT + implements CYGINT_HAL_SH_CPG_T1 + default_value 0 + no_define + define -file=system.h CYGPKG_HAL_SH_7708 + description " + The SH3 7708 microprocessor. This is an embedded part that in + addition to the SH3 processor core has built in peripherals + such as memory controllers, serial ports and + timers/counters." + define_proc { + puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " + } + } + + cdl_option CYGPKG_HAL_SH_7709A { + display "SH 7709A microprocessor" + parent CYGPKG_HAL_SH_CPU + implements CYGINT_HAL_SH_VARIANT + implements CYGINT_HAL_SH_CPG_T3 + implements CYGINT_HAL_SH_DMA_CHANNELS + implements CYGINT_HAL_SH_DMA_CHANNELS + implements CYGINT_HAL_SH_DMA_CHANNELS + implements CYGINT_HAL_SH_DMA_CHANNELS + default_value 0 + no_define + define -file=system.h CYGPKG_HAL_SH_7709A + description " + The SH3 7709A microprocessor. This is an embedded part that in + addition to the SH3 processor core has built in peripherals + such as memory controllers, DMA controllers, A/D and D/A + converters, serial ports and timers/counters." + define_proc { + puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " + } + } + + cdl_option CYGPKG_HAL_SH_7729 { + display "SH 7729 microprocessor" + parent CYGPKG_HAL_SH_CPU + implements CYGINT_HAL_SH_VARIANT + implements CYGINT_HAL_SH_CPG_T3 + default_value 0 + no_define + define -file=system.h CYGPKG_HAL_SH_7729 + description " + The SH3 7729 microprocessor. This is an embedded part that in + addition to the SH3 processor core has built in peripherals + such as memory controllers, serial ports, and timers/counters, + and a DSP engine." + define_proc { + puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " + } + } + + cdl_component CYGHWR_HAL_SH_CLOCK_SETTINGS { + display "SH on-chip generic clock controls" + description " + The various clocks used by the system are controlled by + these options, some of which are derived from platform + settings." + flavor none + no_define + + cdl_interface CYGINT_HAL_SH_CPG_T1 { + display "Clock pulse generator type 1" + } + + cdl_interface CYGINT_HAL_SH_CPG_T2 { + display "Clock pulse generator type 2" + } + + cdl_interface CYGINT_HAL_SH_CPG_T3 { + display "Clock pulse generator type 3" + } + + + cdl_option CYGHWR_HAL_SH_TMU_PRESCALE_0 { + display "TMU counter 0 prescaling" + description " + The peripheral clock is driving the counter used for + the real-time clock, prescaled by this factor." + flavor data + legal_values { 4 16 64 256 } + default_value 4 + } + + + cdl_option CYGHWR_HAL_SH_CLOCK_CKIO { + display "CKIO clock" + no_define + flavor data + # CKIO is either XTAL or PLL2 output + calculated { CYGINT_HAL_SH_CPG_T1 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) + ? (CYGHWR_HAL_SH_OOC_XTAL) + : CYGHWR_HAL_SH_PLL2_OUTPUT + ) + : CYGINT_HAL_SH_CPG_T2 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 2) + ? (CYGHWR_HAL_SH_OOC_XTAL) + : CYGHWR_HAL_SH_PLL2_OUTPUT + ) + : CYGINT_HAL_SH_CPG_T3 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) + ? (CYGHWR_HAL_SH_OOC_XTAL) + : CYGHWR_HAL_SH_PLL2_OUTPUT + ) + : 0 } + } + + cdl_option CYGHWR_HAL_SH_PLL1_OUTPUT { + display "The clock output from PLL1" + no_define + flavor data + calculated { CYGHWR_HAL_SH_CLOCK_CKIO * CYGHWR_HAL_SH_OOC_PLL_1 } + } + + cdl_option CYGHWR_HAL_SH_PLL2_OUTPUT { + display "The clock output from PLL2" + no_define + flavor data + calculated { CYGINT_HAL_SH_CPG_T1 ? ( + (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) + ) + : CYGINT_HAL_SH_CPG_T2 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 5) + ? (CYGHWR_HAL_SH_OOC_XTAL / 2) + : (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 6) + ? (14745600) + : (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 7) + ? (11075600) + : (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) + ) + : CYGINT_HAL_SH_CPG_T3 ? ( + (CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_2) + ) + : 0 } + } + + + cdl_option CYGHWR_HAL_SH_DIVIDER1_INPUT { + display "The clock input to divider 1" + no_define + flavor data + # DIV1 input is either PLL2 output or PLL1 output + calculated { (CYGHWR_HAL_SH_OOC_PLL_1 == 0) + ? CYGHWR_HAL_SH_PLL2_OUTPUT + : CYGHWR_HAL_SH_PLL1_OUTPUT } + } + + cdl_option CYGHWR_HAL_SH_DIVIDER2_INPUT { + display "The clock input to divider 2" + no_define + flavor data + # DIV2 input is either PLL2 output or PLL1 output + calculated { CYGINT_HAL_SH_CPG_T1 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 3 || CYGHWR_HAL_SH_OOC_CLOCK_MODE == 4) + ? CYGHWR_HAL_SH_PLL2_OUTPUT + : CYGHWR_HAL_SH_PLL1_OUTPUT + ) + : CYGINT_HAL_SH_CPG_T2 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE <= 2) + ? CYGHWR_HAL_SH_PLL1_OUTPUT + : CYGHWR_HAL_SH_PLL2_OUTPUT + ) + : CYGINT_HAL_SH_CPG_T3 ? ( + (CYGHWR_HAL_SH_OOC_CLOCK_MODE == 3 || CYGHWR_HAL_SH_OOC_CLOCK_MODE == 4) + ? CYGHWR_HAL_SH_PLL2_OUTPUT + : CYGHWR_HAL_SH_PLL1_OUTPUT + ) + : 0 } + } + + cdl_option CYGHWR_HAL_SH_PROCESSOR_SPEED { + display "Processor clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_DIVIDER1_INPUT / CYGHWR_HAL_SH_OOC_DIVIDER_1 } + description " + The core (CPU, cache and MMU) speed is computed from + the input clock speed and the divider 1 setting." + } + + cdl_option CYGHWR_HAL_SH_BOARD_SPEED { + display "Platform bus clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_CLOCK_CKIO } + description " + The platform bus speed is CKIO." + } + + cdl_option CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED { + display "Processor on-chip peripheral clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_DIVIDER2_INPUT / CYGHWR_HAL_SH_OOC_DIVIDER_2 } + description " + The peripheral speed is computed from the input clock + speed and the divider 2 settings." + } + } + + + cdl_component CYGPKG_HAL_SH_INTERRUPT { + display "Interrupt controls" + flavor none + no_define + description " + Initial interrupt settings can be specified using these option." + + cdl_option CYGHWR_HAL_SH_IRQ_HANDLE_SPURIOUS_INTERRUPTS { + display "Handle spurious interrupts" + default_value 0 + description " + The SH3 may generate spurious interrupts with INTEVT = 0 + when changing the BL bit of the status register. Enabling + this option will cause such interrupts to be identified + very early in the interrupt handler and be ignored. Given + that the SH HAL uses the I-mask to control interrupts, + these spurious interrupts should not occur, and so there + should be no reason to include the special handling code." + } + + cdl_option CYGHWR_HAL_SH_IRQ_USE_IRQLVL { + display "Use IRQ0-3 pins as IRL input" + default_value 0 + description " + It is possible for the IRQ0-3 pins to be used as IRL + inputs by enabling this option." + } + + cdl_option CYGHWR_HAL_SH_IRQ_ENABLE_IRLS_INTERRUPTS { + display "Enable IRLS interrupt pins" + default_value 0 + active_if CYGHWR_HAL_SH_IRQ_USE_IRQLVL + description " + IRLS interrupt pins must be specifically + activated. When they are, they will cause the same + type of interrupt as those caused by the IRL pins. If + IRL and IRLS pins signal an interrupt at the same + time, the highest level interrupt will be generated. + Only available on some cores, and probably share pins + with other interrupt sources (PINT) which cannot be + used in this configuration." + } + } + + # Cache settings + cdl_option CYGHWR_HAL_SH_CACHE_MODE_P0 { + display "Select cache mode set for P0/U0/P3 at startup" + parent CYGPKG_HAL_SH_CACHE + default_value { "WRITE_BACK" } + legal_values { "WRITE_BACK" "WRITE_THROUGH" } + flavor data + description " + Controls what cache mode the cache should be put in at + startup for areas P0, U0 and P3. Write-back mode improves + performance by letting dirty data to be kept in the + cache for a period of time, allowing mutiple writes to + the same cache line to be written back to memory in + one memory transaction. In Write-through mode, each + individual write will cause a memory transaction." + } + + cdl_option CYGHWR_HAL_SH_CACHE_MODE_P1 { + display "Select cache mode set for P1 at startup" + parent CYGPKG_HAL_SH_CACHE + default_value { "WRITE_BACK" } + legal_values { "WRITE_BACK" "WRITE_THROUGH" } + flavor data + description " + Controls what cache mode the cache should be put in at + startup for area P1. Write-back mode improves + performance by letting dirty data to be kept in the + cache for a period of time, allowing mutiple writes to + the same cache line to be written back to memory in + one memory transaction. In Write-through mode, each + individual write will cause a memory transaction." + } +} diff --git a/packages/hal/sh/sh3/current/include/mod_7707a.h b/packages/hal/sh/sh3/current/include/mod_7707a.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_7707a.h @@ -0,0 +1,83 @@ +#ifndef CYGONCE_HAL_MOD_77xx_H +#define CYGONCE_HAL_MOD_77xx_H + +//============================================================================= +// +// mod_7707a.h +// +// List modules available on CPU +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-06-08 +// Purpose: Define modules (and versions) available on this CPU. +// Usage: Included from +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//----------------------------------------------------------------------------- +// Modules provided by the CPU + +#define CYGARC_SH_MOD_BCN 2 +#define CYGARC_SH_MOD_CPG 2 +#define CYGARC_SH_MOD_INTC 3 +#define CYGARC_SH_MOD_IRDA 1 +#define CYGARC_SH_MOD_PFC 1 +#define CYGARC_SH_MOD_SCI 1 +#define CYGARC_SH_MOD_SCIF 1 +#define CYGARC_SH_MOD_UBC 1 + +//----------------------------------------------------------------------------- +// Extra details for Cache Module (CAC) + +// Cache dimenions - one unified cache +#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line +#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache + +// Cache addressing information +// way: bits 13 - 12 +// entry: bits 11 - 4 +#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 +#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 +#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 +// U : bit 1 +// V : bit 0 +// Writing zero to both forces a flush of the line if it is dirty. +#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 + +//----------------------------------------------------------------------------- +// Extra details for interrupt handling +#define CYGARC_SH_SOFTWARE_IP_UPDATE + +#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/sh3/current/include/mod_7708.h b/packages/hal/sh/sh3/current/include/mod_7708.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_7708.h @@ -0,0 +1,81 @@ +#ifndef CYGONCE_HAL_MOD_77xx_H +#define CYGONCE_HAL_MOD_77xx_H + +//============================================================================= +// +// mod_7708.h +// +// List modules available on CPU +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-03-16 +// Purpose: Define modules (and versions) available on this CPU. +// Usage: Included from +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//----------------------------------------------------------------------------- +// Modules provided by the CPU + +#define CYGARC_SH_MOD_BCN 1 +#define CYGARC_SH_MOD_CPG 1 +#define CYGARC_SH_MOD_INTC 1 +#define CYGARC_SH_MOD_SCI 2 +#define CYGARC_SH_MOD_UBC 1 + + +//----------------------------------------------------------------------------- +// Extra details for Cache Module (CAC) + +// Cache dimenions - one unified cache +#define CYGARC_SH_MOD_CAC_SIZE 8192 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line +#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache + +// Cache addressing information +// way: bits 12 - 11 +// entry: bits 10 - 4 +#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 +#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0002000 +#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 +// U : bit 1 +// V : bit 0 +// Writing zero to both forces a flush of the line if it is dirty. +#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 + +//----------------------------------------------------------------------------- +// Extra details for interrupt handling +#define CYGARC_SH_SOFTWARE_IP_UPDATE + +#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/sh3/current/include/mod_7709a.h b/packages/hal/sh/sh3/current/include/mod_7709a.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_7709a.h @@ -0,0 +1,84 @@ +#ifndef CYGONCE_HAL_MOD_77xx_H +#define CYGONCE_HAL_MOD_77xx_H + +//============================================================================= +// +// mod_7709a.h +// +// List modules available on CPU +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-03-16 +// Purpose: Define modules (and versions) available on this CPU. +// Usage: Included from +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//----------------------------------------------------------------------------- +// Modules provided by the CPU + +#define CYGARC_SH_MOD_BCN 2 +#define CYGARC_SH_MOD_CPG 3 +#define CYGARC_SH_MOD_DMAC 1 +#define CYGARC_SH_MOD_INTC 2 +#define CYGARC_SH_MOD_IRDA 1 +#define CYGARC_SH_MOD_PFC 1 +#define CYGARC_SH_MOD_SCI 1 +#define CYGARC_SH_MOD_SCIF 1 +#define CYGARC_SH_MOD_UBC 2 + +//----------------------------------------------------------------------------- +// Extra details for Cache Module (CAC) + +// Cache dimenions - one unified cache +#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line +#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache + +// Cache addressing information +// way: bits 13 - 12 +// entry: bits 11 - 4 +#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 +#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 +#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 +// U : bit 1 +// V : bit 0 +// Writing zero to both forces a flush of the line if it is dirty. +#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 + +//----------------------------------------------------------------------------- +// Extra details for interrupt handling +#define CYGARC_SH_SOFTWARE_IP_UPDATE + +#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/sh3/current/include/mod_7729.h b/packages/hal/sh/sh3/current/include/mod_7729.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_7729.h @@ -0,0 +1,83 @@ +#ifndef CYGONCE_HAL_MOD_77xx_H +#define CYGONCE_HAL_MOD_77xx_H + +//============================================================================= +// +// mod_7729.h +// +// List modules available on CPU +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-08-29 +// Purpose: Define modules (and versions) available on this CPU. +// Usage: Included from +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//----------------------------------------------------------------------------- +// Modules provided by the CPU + +#define CYGARC_SH_MOD_BCN 2 +#define CYGARC_SH_MOD_CPG 3 +#define CYGARC_SH_MOD_INTC 3 +#define CYGARC_SH_MOD_IRDA 1 +#define CYGARC_SH_MOD_PFC 1 +#define CYGARC_SH_MOD_SCI 1 +#define CYGARC_SH_MOD_SCIF 1 +#define CYGARC_SH_MOD_UBC 3 + +//----------------------------------------------------------------------------- +// Extra details for Cache Module (CAC) + +// Cache dimenions - one unified cache +#define CYGARC_SH_MOD_CAC_SIZE 16384 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_LINE_SIZE 16 // Size of a cache line +#define CYGARC_SH_MOD_CAC_WAYS 4 // Associativity of the cache + +// Cache addressing information +// way: bits 13 - 12 +// entry: bits 11 - 4 +#define CYGARC_SH_MOD_CAC_ADDRESS_BASE 0xf0000000 +#define CYGARC_SH_MOD_CAC_ADDRESS_TOP 0xf0004000 +#define CYGARC_SH_MOD_CAC_ADDRESS_STEP 0x00000010 +// U : bit 1 +// V : bit 0 +// Writing zero to both forces a flush of the line if it is dirty. +#define CYGARC_SH_MOD_CAC_ADDRESS_FLUSH 0x00000000 + +//----------------------------------------------------------------------------- +// Extra details for interrupt handling +#define CYGARC_SH_SOFTWARE_IP_UPDATE + +#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/sh3/current/include/mod_regs_bsc.h b/packages/hal/sh/sh3/current/include/mod_regs_bsc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_bsc.h @@ -0,0 +1,180 @@ +//============================================================================= +// +// mod_regs_bsc.h +// +// BSC (bus state controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Register definitions +#define CYGARC_REG_BCR1 0xffffff60 +#define CYGARC_REG_BCR2 0xffffff62 +#define CYGARC_REG_WCR1 0xffffff64 +#define CYGARC_REG_WCR2 0xffffff66 +#define CYGARC_REG_MCR 0xffffff68 +#define CYGARC_REG_DCR 0xffffff6a +#define CYGARC_REG_PCR 0xffffff6c +#define CYGARC_REG_RTCSR 0xffffff6e +#define CYGARC_REG_RTCNT 0xffffff70 +#define CYGARC_REG_RTCOR 0xffffff72 +#define CYGARC_REG_RFCR 0xffffff74 + +#define CYGARC_REG_SDMR_AREA2_BASE 0xffffd000 +#define CYGARC_REG_SDMR_AREA3_BASE 0xffffe000 + +#define CYGARC_REG_BCR1_DRAMTP2 0x0010 +#define CYGARC_REG_BCR1_DRAMTP1 0x0008 +#define CYGARC_REG_BCR1_DRAMTP0 0x0004 + +// Bus widths for areas +#define CYGARC_REG_BCR2_A6_8 0x1000 +#define CYGARC_REG_BCR2_A6_16 0x2000 +#define CYGARC_REG_BCR2_A6_32 0x3000 +#define CYGARC_REG_BCR2_A5_8 0x0400 +#define CYGARC_REG_BCR2_A5_16 0x0800 +#define CYGARC_REG_BCR2_A5_32 0x0c00 +#define CYGARC_REG_BCR2_A4_8 0x0100 +#define CYGARC_REG_BCR2_A4_16 0x0200 +#define CYGARC_REG_BCR2_A4_32 0x0300 +#define CYGARC_REG_BCR2_A3_8 0x0040 +#define CYGARC_REG_BCR2_A3_16 0x0080 +#define CYGARC_REG_BCR2_A3_32 0x00c0 +#define CYGARC_REG_BCR2_A2_8 0x0010 +#define CYGARC_REG_BCR2_A2_16 0x0020 +#define CYGARC_REG_BCR2_A2_32 0x0030 + +// Memory type selection and other IO behavior controls +#define CYGARC_REG_BCR1_PULA 0x8000 // Pin A25 to A0 Pull-Up +#define CYGARC_REG_BCR1_PULD 0x4000 // Pin D31 to D0 Pull-Up +#define CYGARC_REG_BCR1_HIZMEM 0x2000 // Hi-Z memory control +#define CYGARC_REG_BCR1_HIZCNT 0x1000 // High-Z Control +#define CYGARC_REG_BCR1_ENDIAN 0x0800 // Endian Flag +#define CYGARC_REG_BCR1_A0_BST_MASK 0x0600 // Area 0 Burst ROM Control +#define CYGARC_REG_BCR1_A0_BST_4 0x0200 +#define CYGARC_REG_BCR1_A0_BST_8 0x0400 +#define CYGARC_REG_BCR1_A0_BST_16 0x0600 +#define CYGARC_REG_BCR1_A5_BST_MASK 0x0180 // Area 5 Burst ROM Control +#define CYGARC_REG_BCR1_A5_BST_4 0x0080 +#define CYGARC_REG_BCR1_A5_BST_8 0x0100 +#define CYGARC_REG_BCR1_A5_BST_16 0x0180 +#define CYGARC_REG_BCR1_A6_BST_MASK 0x0060 // Area 6 Burst ROM Control +#define CYGARC_REG_BCR1_A6_BST_4 0x0020 +#define CYGARC_REG_BCR1_A6_BST_8 0x0040 +#define CYGARC_REG_BCR1_A6_BST_16 0x0060 +#define CYGARC_REG_BCR1_DRAMTP_MASK 0x001c // Area 2, Area 3 Memory Type +#define CYGARC_REG_BCR1_A5PCM 0x0002 // Area 5 Bus Type +#define CYGARC_REG_BCR1_A6PCM 0x0001 // Area 6 Bus Type + +// Intercycle wait states +#define CYGARC_REG_WCR1_WAITSEL 0x8000 // WAIT Sampling Timing Select +#define CYGARC_REG_WCR1_A6I_MASK 0x3000 // Intercycle Idle Specification +#define CYGARC_REG_WCR1_A6I_SHIFT 12 +#define CYGARC_REG_WCR1_A5I_MASK 0x0c00 +#define CYGARC_REG_WCR1_A5I_SHIFT 10 +#define CYGARC_REG_WCR1_A4I_MASK 0x0300 +#define CYGARC_REG_WCR1_A4I_SHIFT 8 +#define CYGARC_REG_WCR1_A3I_MASK 0x00c0 +#define CYGARC_REG_WCR1_A3I_SHIFT 6 +#define CYGARC_REG_WCR1_A2I_MASK 0x0030 +#define CYGARC_REG_WCR1_A2I_SHIFT 4 +#define CYGARC_REG_WCR1_A0I_MASK 0x0003 +#define CYGARC_REG_WCR1_A0I_SHIFT 0 + +#define CYGARC_REG_WCR1_0WS 0 +#define CYGARC_REG_WCR1_1WS 1 +#define CYGARC_REG_WCR1_2WS 2 +#define CYGARC_REG_WCR1_3WS 3 + + +// Wait states +#define CYGARC_REG_WCR2_A6_MASK 0xe000 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A6_SHIFT 13 +#define CYGARC_REG_WCR2_A5_MASK 0x1c00 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A5_SHIFT 10 +#define CYGARC_REG_WCR2_A4_MASK 0x0380 // Wait states +#define CYGARC_REG_WCR2_A4_SHIFT 7 +#define CYGARC_REG_WCR2_A3_MASK 0x0060 // Wait states / CAS latency +#define CYGARC_REG_WCR2_A3_SHIFT 5 +#define CYGARC_REG_WCR2_A2_MASK 0x0018 // Wait states / CAS latency +#define CYGARC_REG_WCR2_A2_SHIFT 3 +#define CYGARC_REG_WCR2_A0_MASK 0x0007 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A0_SHIFT 0 + +#define CYGARC_REG_WCR2_0WS 0 +#define CYGARC_REG_WCR2_1WS 1 +#define CYGARC_REG_WCR2_2WS 2 +#define CYGARC_REG_WCR2_3WS 3 +#define CYGARC_REG_WCR2_4WS 4 +#define CYGARC_REG_WCR2_6WS 5 +#define CYGARC_REG_WCR2_8WS 6 +#define CYGARC_REG_WCR2_10WS 7 + +//-------------------------------------------------------------------------- +// Additional type definitions +#if (CYGARC_SH_MOD_BCN > 1) +# define CYGARC_REG_BCR3 0xffffff7e +#endif + + + +//----------------------------------------------------------------------------- +// Calculate constants needed to drive the proper SDRAM refresh rate. Argument +// is delay between required refresh events in microseconds (us). Should be +// available off the SDRAM spec sheet. +// These should be a part of a fully CDLicized memory controller setup. +#define CYGARC_RTCSR_PRESCALE(_r_) \ +(((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(4*1000000))<256) ? 4 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(16*1000000))<256) ? 16 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(64*1000000))<256) ? 64 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(256*1000000))<256) ? 256 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(1024*1000000))<256) ? 1024 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(2048*1000000))<256) ? 2048 : 4096) + +// These two macros provide the static values we need to stuff into the +// registers. +#define CYGARC_RTCSR_CKSx(_r_) \ + (( 4 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x08 : \ + ( 16 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x10 : \ + ( 64 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x18 : \ + ( 256 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x20 : \ + (1024 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x28 : \ + (2048 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x30 : 0x38 ) + +#define CYGARC_RTCSR_N(_r_) \ + (CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(CYGARC_RTCSR_PRESCALE(_r_)*1000000)) + + diff --git a/packages/hal/sh/sh3/current/include/mod_regs_cac.h b/packages/hal/sh/sh3/current/include/mod_regs_cac.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_cac.h @@ -0,0 +1,66 @@ +//============================================================================= +// +// mod_regs_cac.h +// +// CAC (cache) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +// Besides the below, cache sizes are defined in the CPU variant module +// headers (mod_77xx.h). + +//-------------------------------------------------------------------------- +// Cache registers +#define CYGARC_REG_CCR 0xffffffec + +#define CYGARC_REG_CCR_RA 0x00000020 +#define CYGARC_REG_CCR_CF 0x00000008 +#define CYGARC_REG_CCR_CB 0x00000004 +#define CYGARC_REG_CCR_WT 0x00000002 +#define CYGARC_REG_CCR_CE 0x00000001 + + +//-------------------------------------------------------------------------- +// Address array access +// Address part (base/top/step specified in mod file) +#define CYGARC_REG_CACHE_ADDRESS_ADDRESS 0x00000008 // compare address + +// Data part +#define CYGARC_REG_CACHE_ADDRESS_TAG_Mask 0x1ffffc00 +#define CYGARC_REG_CACHE_ADDRESS_U 0x00000002 // updated (contains dirty data) +#define CYGARC_REG_CACHE_ADDRESS_V 0x00000001 // valid + + diff --git a/packages/hal/sh/sh3/current/include/mod_regs_cpg.h b/packages/hal/sh/sh3/current/include/mod_regs_cpg.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_cpg.h @@ -0,0 +1,213 @@ +//============================================================================= +// +// mod_regs_cpg.h +// +// CPG (clock pulse generator) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Oscillator control registers +#define CYGARC_REG_FRQCR 0xffffff80 +#define CYGARC_REG_WTCNT 0xffffff84 // read 8bit, write 16bit +#define CYGARC_REG_WTCSR 0xffffff86 // read 8bit, write 16bit + +#define CYGARC_REG_WTCNT_WRITE 0x5a00 // top 8bit value for write + +#define CYGARC_REG_WTCSR_WRITE 0xa500 // top 8bit value for write +#define CYGARC_REG_WTCSR_TME 0x80 // timer enable +#define CYGARC_REG_WTCSR_WT_IT 0x40 // watchdog(1)/interval(0) +#define CYGARC_REG_WTCSR_RSTS 0x20 // manual(1)/poweron(0) +#define CYGARC_REG_WTCSR_WOVF 0x10 // watchdog overflow +#define CYGARC_REG_WTCSR_IOVF 0x08 // interval overflow +#define CYGARC_REG_WTCSR_CKS2 0x04 // clock select 2 +#define CYGARC_REG_WTCSR_CKS1 0x02 // clock select 1 +#define CYGARC_REG_WTCSR_CKS0 0x01 // clock select 0 +#define CYGARC_REG_WTCSR_CKSx_MASK 0x07 // clock select mask +// This is the period (in us) between watchdog reset and overflow. +// Note: We use max timeout delay for now. +#define CYGARC_REG_WTCSR_CKSx_SETTING 0x07 // max delay + +#define CYGARC_REG_WTCSR_PERIOD ((1000000000/(CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/4096))*256) + +// Translate various CDL clock configurations to register equivalents +// for the various CPG versions +#if (CYGARC_SH_MOD_CPG == 1) // ---------------------------- V1 + +// PLL1 +#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 +#else +# error "Unsupported PLL1 setting" +#endif + +// Divider1 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 +#else +# error "Unsupported Divider1 setting" +#endif + +// Divider2 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 +#else +# error "Unsupported Divider1 setting" +#endif + +// CKOEN - set in all modes but 7 +#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE != 7) +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 +#else +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 +#endif + +#elif (CYGARC_SH_MOD_CPG == 2) // ---------------------------- V2 + +// PLL1 +#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 +#else +# error "Unsupported PLL1 setting" +#endif + +// Divider1 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 +#else +# error "Unsupported Divider1 setting" +#endif + +// Divider2 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 +#else +# error "Unsupported Divider1 setting" +#endif + +// CKOEN - set in all modes but 2 +#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE != 2) +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 +#else +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 +#endif + +#elif (CYGARC_SH_MOD_CPG == 3) // ---------------------------- V3 + +// PLL1 +#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) || (CYGHWR_HAL_SH_OOC_PLL_1 == 1) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 2) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0010 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 3) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x8000 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 4) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0020 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 6) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x8010 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 8) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0030 +#else +# error "Unsupported PLL1 setting" +#endif + +// Divider1 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0004 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 3) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x4000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_1 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER1 0x0008 +#else +# error "Unsupported Divider1 setting" +#endif + +// Divider2 +#if (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0001 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 3) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x2000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x0002 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_2 == 6) +# define CYGARC_REG_FRQCR_INIT_DIVIDER2 0x2002 +#else +# error "Unsupported Divider2 setting" +#endif + +// CKOEN - set in modes 0-2 +#if (CYGHWR_HAL_SH_OOC_CLOCK_MODE <= 2) +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0100 +#else +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 +#endif + +#else + +# error "Unsupported CPG version" + +#endif + +// Init value +#define CYGARC_REG_FRQCR_INIT (CYGARC_REG_FRQCR_INIT_PLL1|CYGARC_REG_FRQCR_INIT_DIVIDER1|CYGARC_REG_FRQCR_INIT_DIVIDER2|CYGARC_REG_FRQCR_INIT_CKOEN) diff --git a/packages/hal/sh/sh3/current/include/mod_regs_dma.h b/packages/hal/sh/sh3/current/include/mod_regs_dma.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_dma.h @@ -0,0 +1,111 @@ +//============================================================================= +// +// mod_regs_dma.h +// +// DMA (direct memory access) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// DMA Controller registers + +#define CYGARC_REG_SAR0 0xa4000020 +#define CYGARC_REG_DAR0 0xa4000024 +#define CYGARC_REG_DMATCR0 0xa4000028 +#define CYGARC_REG_CHCR0 0xa400002c +#define CYGARC_REG_SAR1 0xa4000030 +#define CYGARC_REG_DAR1 0xa4000034 +#define CYGARC_REG_DMATCR1 0xa4000038 +#define CYGARC_REG_CHCR1 0xa400003c +#define CYGARC_REG_SAR2 0xa4000040 +#define CYGARC_REG_DAR2 0xa4000044 +#define CYGARC_REG_DMATCR2 0xa4000048 +#define CYGARC_REG_CHCR2 0xa400004c +#define CYGARC_REG_SAR3 0xa4000050 +#define CYGARC_REG_DAR3 0xa4000054 +#define CYGARC_REG_DMATCR3 0xa4000058 +#define CYGARC_REG_CHCR3 0xa400005c +#define CYGARC_REG_DMAOR 0xa4000060 + +// Offsets from base register +#define CYGARC_REG_SAR 0x00 +#define CYGARC_REG_DAR 0x04 +#define CYGARC_REG_DMATCR 0x08 +#define CYGARC_REG_CHCR 0x0c + + +// DMA Channel Control Register. If there's a digit suffix to CHCR the flag +// is only valid in the listed channels. +#define CYGARC_REG_CHCR3_DI 0x00100000 // direct/indirect selection +#define CYGARC_REG_CHCR2_RO 0x00080000 // source address reload +#define CYGARC_REG_CHCR01_RL 0x00040000 // request check level +#define CYGARC_REG_CHCR01_AM 0x00020000 // acknowledge mode +#define CYGARC_REG_CHCR01_AL 0x00010000 // acknowledge level +#define CYGARC_REG_CHCR_DM1 0x00008000 // destination address mode +#define CYGARC_REG_CHCR_DM0 0x00004000 +#define CYGARC_REG_CHCR_SM1 0x00002000 // source address mode +#define CYGARC_REG_CHCR_SM0 0x00001000 +#define CYGARC_REG_CHCR_RS3 0x00000800 // resource select +#define CYGARC_REG_CHCR_RS2 0x00000400 +#define CYGARC_REG_CHCR_RS1 0x00000200 +#define CYGARC_REG_CHCR_RS0 0x00000100 +#define CYGARC_REG_CHCR01_DS 0x00000040 // DREQ select +#define CYGARC_REG_CHCR_TM 0x00000020 // transmit mode +#define CYGARC_REG_CHCR_TS1 0x00000010 // transmit size +#define CYGARC_REG_CHCR_TS0 0x00000008 +#define CYGARC_REG_CHCR_IE 0x00000004 // interrupt enable +#define CYGARC_REG_CHCR_TE 0x00000002 // transfer end +#define CYGARC_REG_CHCR_DE 0x00000001 // DMAC enable + +// Resource select options +#define CYGARC_REG_CHCR_RS_EXT_DUAL 0x00000000 +#define CYGARC_REG_CHCR_RS_EXT_EX_DAC 0x00000100 +#define CYGARC_REG_CHCR_RS_EXT_DAC_EX 0x00000300 +#define CYGARC_REG_CHCR_RS_AUTO 0x00000400 +#define CYGARC_REG_CHCR_RS_IRDA_TX 0x00000a00 +#define CYGARC_REG_CHCR_RS_IRDA_RX 0x00000b00 +#define CYGARC_REG_CHCR_RS_SCIF_TX 0x00000c00 +#define CYGARC_REG_CHCR_RS_SCIF_RX 0x00000d00 +#define CYGARC_REG_CHCR_RS_AD 0x00000e00 +#define CYGARC_REG_CHCR_RS_CMT 0x00000f00 + + +// DMA Operation Register +#define CYGARC_REG_DMAOR_PR1 0x0200 // priority level +#define CYGARC_REG_DMAOR_PR0 0x0100 +#define CYGARC_REG_DMAOR_AE 0x0004 // address error flag +#define CYGARC_REG_DMAOR_NMIF 0x0002 // NMI flag +#define CYGARC_REG_DMAOR_DME 0x0001 // DMA master enable diff --git a/packages/hal/sh/sh3/current/include/mod_regs_intc.h b/packages/hal/sh/sh3/current/include/mod_regs_intc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_intc.h @@ -0,0 +1,158 @@ +//============================================================================= +// +// mod_regs_intc.h +// +// INTC (interrupt controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Interrupt registers, module type 1 +#define CYGARC_REG_EXCEVT 0xffffffd4 +#define CYGARC_REG_INTEVT 0xffffffd8 + +#define CYGARC_REG_ICR 0xfffffee0 +#define CYGARC_REG_IPRA 0xfffffee2 +#define CYGARC_REG_IPRB 0xfffffee4 + +#define CYGARC_REG_IPRA_TMU0_MASK 0xf000 +#define CYGARC_REG_IPRA_TMU0_PRI1 0x1000 +#define CYGARC_REG_IPRA_TMU1_MASK 0x0f00 +#define CYGARC_REG_IPRA_TMU1_PRI1 0x0100 +#define CYGARC_REG_IPRA_TMU2_MASK 0x00f0 +#define CYGARC_REG_IPRA_TMU2_PRI1 0x0010 +#define CYGARC_REG_IPRA_RTC_MASK 0x000f +#define CYGARC_REG_IPRA_RTC_PRI1 0x0001 + +#define CYGARC_REG_IPRB_WDT_MASK 0xf000 +#define CYGARC_REG_IPRB_WDT_PRI1 0x1000 +#define CYGARC_REG_IPRB_REF_MASK 0x0f00 +#define CYGARC_REG_IPRB_REF_PRI1 0x0100 +#define CYGARC_REG_IPRB_SCI_MASK 0x00f0 +#define CYGARC_REG_IPRB_SCI_PRI1 0x0010 + + +#if (CYGARC_SH_MOD_INTC >= 2) +# define CYGARC_REG_INTEVT2 0xa4000000 +# define CYGARC_REG_IRR0 0xa4000004 +# define CYGARC_REG_IRR1 0xa4000006 +# define CYGARC_REG_IRR2 0xa4000008 +# define CYGARC_REG_ICR0 CYGARC_REG_ICR +# define CYGARC_REG_ICR1 0xa4000010 +# define CYGARC_REG_ICR2 0xa4000012 +# define CYGARC_REG_INTER 0xa4000014 +# define CYGARC_REG_IPRC 0xa4000016 +# define CYGARC_REG_IPRD 0xa4000018 +# define CYGARC_REG_IPRE 0xa400001a + + +#define CYGARC_REG_IPRC_IRQ3_MASK 0xf000 +#define CYGARC_REG_IPRC_IRQ3_PRI1 0x1000 +#define CYGARC_REG_IPRC_IRQ2_MASK 0x0f00 +#define CYGARC_REG_IPRC_IRQ2_PRI1 0x0100 +#define CYGARC_REG_IPRC_IRQ1_MASK 0x00f0 +#define CYGARC_REG_IPRC_IRQ1_PRI1 0x0010 +#define CYGARC_REG_IPRC_IRQ0_MASK 0x000f +#define CYGARC_REG_IPRC_IRQ0_PRI1 0x0001 + +#define CYGARC_REG_IPRD_PINT07_MASK 0xf000 +#define CYGARC_REG_IPRD_PINT07_PRI1 0x1000 +#define CYGARC_REG_IPRD_PINT8F_MASK 0x0f00 +#define CYGARC_REG_IPRD_PINT8F_PRI1 0x0100 +#define CYGARC_REG_IPRD_IRQ5_MASK 0x00f0 +#define CYGARC_REG_IPRD_IRQ5_PRI1 0x0010 +#define CYGARC_REG_IPRD_IRQ4_MASK 0x000f +#define CYGARC_REG_IPRD_IRQ4_PRI1 0x0001 + +#define CYGARC_REG_IPRE_DMAC_MASK 0xf000 +#define CYGARC_REG_IPRE_DMAC_PRI1 0x1000 +#define CYGARC_REG_IPRE_IRDA_MASK 0x0f00 +#define CYGARC_REG_IPRE_IRDA_PRI1 0x0100 +#define CYGARC_REG_IPRE_SCIF_MASK 0x00f0 +#define CYGARC_REG_IPRE_SCIF_PRI1 0x0010 +#define CYGARC_REG_IPRE_ADC_MASK 0x000f +#define CYGARC_REG_IPRE_ADC_PRI1 0x0001 + +#define CYGARC_REG_ICR1_MAI 0x8000 +#define CYGARC_REG_ICR1_IRQLVL 0x4000 +#define CYGARC_REG_ICR1_BLMSK 0x2000 +#define CYGARC_REG_ICR1_IRLSEN 0x1000 +#define CYGARC_REG_ICR1_SENSE_IRQ5_shift 10 +#define CYGARC_REG_ICR1_SENSE_IRQ4_shift 8 +#define CYGARC_REG_ICR1_SENSE_IRQ3_shift 6 +#define CYGARC_REG_ICR1_SENSE_IRQ2_shift 4 +#define CYGARC_REG_ICR1_SENSE_IRQ1_shift 2 +#define CYGARC_REG_ICR1_SENSE_IRQ0_shift 0 +#define CYGARC_REG_ICR1_SENSE_LEVEL 0x2 +#define CYGARC_REG_ICR1_SENSE_UP 0x1 + +// The (initial) IRQ mode is controlled by configuration. +#ifdef CYGHWR_HAL_SH_IRQ_USE_IRQLVL +# ifdef CYGHWR_HAL_SH_IRQ_ENABLE_IRLS_INTERRUPTS +# define CYGARC_REG_ICR1_INIT (CYGARC_REG_ICR1_IRLSEN|CYGARC_REG_ICR1_IRQLVL) +# else +# define CYGARC_REG_ICR1_INIT (CYGARC_REG_ICR1_IRQLVL) +# endif +#else +# define CYGARC_REG_ICR1_INIT 0x0000 +#endif + +#define CYGARC_REG_IRR0_PINT07 0x80 +#define CYGARC_REG_IRR0_PINT8F 0x40 +#define CYGARC_REG_IRR0_IRQ5 0x20 +#define CYGARC_REG_IRR0_IRQ4 0x10 +#define CYGARC_REG_IRR0_IRQ3 0x08 +#define CYGARC_REG_IRR0_IRQ2 0x04 +#define CYGARC_REG_IRR0_IRQ1 0x02 +#define CYGARC_REG_IRR0_IRQ0 0x01 + +#endif + + + +#if (CYGARC_SH_MOD_INTC >= 3) +# define CYGARC_REG_IRR3 0xa400000a +# define CYGARC_REG_IRR4 0xa400000c +# define CYGARC_REG_IPRF 0xa400001c + +#define CYGARC_REG_IPRF_LCDI_MASK 0x0f00 +#define CYGARC_REG_IPRF_LCDI_PRI1 0x0100 +#define CYGARC_REG_IPRF_PCC0_MASK 0x00f0 +#define CYGARC_REG_IPRF_PCC0_PRI1 0x0010 +#define CYGARC_REG_IPRF_PCC1_MASK 0x000f +#define CYGARC_REG_IPRF_PCC1_PRI1 0x0001 + +#endif diff --git a/packages/hal/sh/sh3/current/include/mod_regs_mmu.h b/packages/hal/sh/sh3/current/include/mod_regs_mmu.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_mmu.h @@ -0,0 +1,50 @@ +//============================================================================= +// +// mod_regs_mmu.h +// +// MMU Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// MMU control registers +#define CYGARC_REG_MMUCR 0xffffffe0 + +#define CYGARC_REG_MMUCR_SV 0x00000100 +#define CYGARC_REG_MMUCR_RC_MASK 0x000000c0 +#define CYGARC_REG_MMUCR_TF 0x00000004 +#define CYGARC_REG_MMUCR_IX 0x00000002 +#define CYGARC_REG_MMUCR_AT 0x00000001 diff --git a/packages/hal/sh/sh3/current/include/mod_regs_pfc.h b/packages/hal/sh/sh3/current/include/mod_regs_pfc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_pfc.h @@ -0,0 +1,100 @@ +//============================================================================= +// +// mod_regs_pfc.h +// +// PFC (pin function controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#define CYGARC_REG_PACR 0xa4000100 // port A control +#define CYGARC_REG_PBCR 0xa4000102 // port B control +#define CYGARC_REG_PCCR 0xa4000104 // port C control +#define CYGARC_REG_PDCR 0xa4000106 // port D control +#define CYGARC_REG_PECR 0xa4000108 // port E control +#define CYGARC_REG_PFCR 0xa400010a // port F control +#define CYGARC_REG_PGCR 0xa400010c // port G control +#define CYGARC_REG_PHCR 0xa400010e // port H control +#define CYGARC_REG_PJCR 0xa4000110 // port J control +#define CYGARC_REG_PKCR 0xa4000112 // port K control +#define CYGARC_REG_PLCR 0xa4000114 // port L control +#define CYGARC_REG_SCPCR 0xa4000116 // SC port control + +#define CYGARC_REG_PADR 0xa4000120 // port A data +#define CYGARC_REG_PBDR 0xa4000122 // port B data +#define CYGARC_REG_PCDR 0xa4000124 // port C data +#define CYGARC_REG_PDDR 0xa4000126 // port D data +#define CYGARC_REG_PEDR 0xa4000128 // port E data +#define CYGARC_REG_PFDR 0xa400012a // port F data +#define CYGARC_REG_PGDR 0xa400012c // port G data +#define CYGARC_REG_PHDR 0xa400012e // port H data +#define CYGARC_REG_PJDR 0xa4000130 // port J data +#define CYGARC_REG_PKDR 0xa4000132 // port K data +#define CYGARC_REG_PLDR 0xa4000134 // port L data +#define CYGARC_REG_SCPDR 0xa4000136 // SC port data + + +// Port C +#define CYGARC_REG_PCCR_PC7_MASK 0xc000 +#define CYGARC_REG_PCCR_PC7_shift 14 +#define CYGARC_REG_PCCR_PC6_MASK 0x3000 +#define CYGARC_REG_PCCR_PC6_shift 12 +#define CYGARC_REG_PCCR_PC5_MASK 0x0c00 +#define CYGARC_REG_PCCR_PC5_shift 10 +#define CYGARC_REG_PCCR_PC4_MASK 0x0300 +#define CYGARC_REG_PCCR_PC4_shift 8 +#define CYGARC_REG_PCCR_PC3_MASK 0x00c0 +#define CYGARC_REG_PCCR_PC3_shift 6 +#define CYGARC_REG_PCCR_PC2_MASK 0x0030 +#define CYGARC_REG_PCCR_PC2_shift 4 +#define CYGARC_REG_PCCR_PC1_MASK 0x000c +#define CYGARC_REG_PCCR_PC1_shift 2 +#define CYGARC_REG_PCCR_PC0_MASK 0x0003 +#define CYGARC_REG_PCCR_PC0_shift 0 + +#define CYGARC_REG_PCCR_MD_OTHER 0x0 +#define CYGARC_REG_PCCR_MD_OUT 0x1 +#define CYGARC_REG_PCCR_MD_IN_ON 0x2 +#define CYGARC_REG_PCCR_MD_IN_OFF 0x3 + +#define CYGARC_REG_PCDR_PC7DT 0x80 +#define CYGARC_REG_PCDR_PC6DT 0x40 +#define CYGARC_REG_PCDR_PC5DT 0x20 +#define CYGARC_REG_PCDR_PC4DT 0x10 +#define CYGARC_REG_PCDR_PC3DT 0x08 +#define CYGARC_REG_PCDR_PC2DT 0x04 +#define CYGARC_REG_PCDR_PC1DT 0x02 +#define CYGARC_REG_PCDR_PC0DT 0x01 + diff --git a/packages/hal/sh/sh3/current/include/mod_regs_rtc.h b/packages/hal/sh/sh3/current/include/mod_regs_rtc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_rtc.h @@ -0,0 +1,77 @@ +//============================================================================= +// +// mod_regs_rtc.h +// +// RTC (real time clock) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// RealTime Clock + +#define CYGARC_REG_RC64CNT 0xfffffec0 +#define CYGARC_REG_RSECCNT 0xfffffec2 +#define CYGARC_REG_RMINCNT 0xfffffec4 +#define CYGARC_REG_RHRCNT 0xfffffec6 +#define CYGARC_REG_RWKCNT 0xfffffec8 +#define CYGARC_REG_RDAYCNT 0xfffffeca +#define CYGARC_REG_RMONCNT 0xfffffecc +#define CYGARC_REG_RYRCNT 0xfffffece +#define CYGARC_REG_RSECAR 0xfffffed0 +#define CYGARC_REG_RMINAR 0xfffffed2 +#define CYGARC_REG_RHRAR 0xfffffed4 +#define CYGARC_REG_RWKAR 0xfffffed6 +#define CYGARC_REG_RDAYAR 0xfffffed8 +#define CYGARC_REG_RMONAR 0xfffffeda +#define CYGARC_REG_RCR1 0xfffffedc +#define CYGARC_REG_RCR2 0xfffffede + + +#define CYGARC_REG_RCR1_CF 0x80 // carry flag +#define CYGARC_REG_RCR1_CIE 0x10 // carry interrupt enable +#define CYGARC_REG_RCR1_AIE 0x08 // alarm interrupt enable +#define CYGARC_REG_RCR1_AF 0x01 // alarm flag + +#define CYGARC_REG_RCR2_PEF 0x80 // periodic interrupt flag +#define CYGARC_REG_RCR2_PES2 0x40 // periodic interrupt setting +#define CYGARC_REG_RCR2_PES1 0x20 +#define CYGARC_REG_RCR2_PES0 0x10 +#define CYGARC_REG_RCR2_RTCEN 0x08 // RTC enable +#define CYGARC_REG_RCR2_ADJ 0x04 // second adjustment +#define CYGARC_REG_RCR2_RESET 0x02 // reset +#define CYGARC_REG_RCR2_START 0x01 // start + + diff --git a/packages/hal/sh/sh3/current/include/mod_regs_ser.h b/packages/hal/sh/sh3/current/include/mod_regs_ser.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_ser.h @@ -0,0 +1,278 @@ +//============================================================================= +// +// mod_regs_ser.h +// +// SCI, SCIF, and IRDA (serial) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// Note: All three serial module definitions kept in the same file +// since they share some of the information. +//####DESCRIPTIONEND#### +// +//============================================================================= + +//++++++ Module SCI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//-------------------------------------------------------------------------- +// Serial registers. All 8 bit registers. +#define CYGARC_REG_SCSMR 0xfffffe80 // serial mode register +#define CYGARC_REG_SCBRR 0xfffffe82 // bit rate register +#define CYGARC_REG_SCSCR 0xfffffe84 // serial control register +#define CYGARC_REG_SCTDR 0xfffffe86 // transmit data register +#define CYGARC_REG_SCSSR 0xfffffe88 // serial status register +#define CYGARC_REG_SCRDR 0xfffffe8a // receive data register + +// Serial Mode Register +#define CYGARC_REG_SCSMR_CA 0x80 // communication mode +#define CYGARC_REG_SCSMR_CHR 0x40 // character length (7 if set) +#define CYGARC_REG_SCSMR_PE 0x20 // parity enable +#define CYGARC_REG_SCSMR_OE 0x10 // parity mode +#define CYGARC_REG_SCSMR_STOP 0x08 // stop bit length +#define CYGARC_REG_SCSMR_MP 0x04 // multiprocessor mode +#define CYGARC_REG_SCSMR_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR_MPIE 0x08 // multiprocessor interrupt enable +#define CYGARC_REG_SCSCR_TEIE 0x04 // transmit-end interrupt enable +#define CYGARC_REG_SCSCR_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR_TDRE 0x80 // transmit data register empty +#define CYGARC_REG_SCSSR_RDRF 0x40 // receive data register full +#define CYGARC_REG_SCSSR_ORER 0x20 // overrun error +#define CYGARC_REG_SCSSR_FER 0x10 // framing error +#define CYGARC_REG_SCSSR_PER 0x08 // parity error +#define CYGARC_REG_SCSSR_TEND 0x04 // transmit end +#define CYGARC_REG_SCSSR_MPB 0x02 // multiprocessor bit +#define CYGARC_REG_SCSSR_MPBT 0x01 // multiprocessor bit transfer + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR_CLEARMASK 0xf8 + + +#if (CYGARC_SH_MOD_SCI >= 2) +# define CYGARC_REG_SCSPTR 0xfffffe7c // serial port register +#endif + + +// Baud rate values calculation, depending on peripheral clock (Pf) +// n is CKS setting (0-3) +// N = (Pf/(64*2^(2n-1)*B))-1 +// With CYGARC_SCBRR_CKSx providing the values 1, 4, 16, 64 we get +// N = (Pf/(32*_CKS*B))-1 +// +// The CYGARC_SCBRR_OPTIMAL_CKS macro should compute the minimal CKS +// setting for the given baud rate and peripheral clock. +// +// The error of the CKS+count value can be computed by: +// E(%) = ((Pf/((N+1)*B*(64^(n-1)))-1)*100 +// +#define CYGARC_SCBRR_PRESCALE(_b_) \ +((((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/1/(_b_))-1)<256) ? 1 : \ + (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/4/(_b_))-1)<256) ? 4 : \ + (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/16/(_b_))-1)<256) ? 16 : 64) + +// These two macros provide the static values we need to stuff into the +// registers. +#define CYGARC_SCBRR_CKSx(_b_) \ + ((1 == CYGARC_SCBRR_PRESCALE(_b_)) ? 0 : \ + (4 == CYGARC_SCBRR_PRESCALE(_b_)) ? 1 : \ + (16 == CYGARC_SCBRR_PRESCALE(_b_)) ? 2 : 3) +#define CYGARC_SCBRR_N(_b_) \ + (((_b_) < 4800) ? 0 : \ + ((_b_) > 115200) ? 0 : \ + ((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1)) + + +//++++++ Module IRDA +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#ifdef CYGARC_SH_MOD_IRDA + +//-------------------------------------------------------------------------- +// IrDA (infrared data association). Can also act as regular serial w FIFO + +#define CYGARC_REG_SCSMR1 0xa4000140 +#define CYGARC_REG_SCBRR1 0xa4000142 +#define CYGARC_REG_SCSCR1 0xa4000144 +#define CYGARC_REG_SCFTDR1 0xa4000146 +#define CYGARC_REG_SCSSR1 0xa4000148 +#define CYGARC_REG_SCFRDR1 0xa400014a +#define CYGARC_REG_SCFCR1 0xa400014c +#define CYGARC_REG_SCFDR1 0xa400014e + +// Serial Mode Register +#define CYGARC_REG_SCSMR1_IRMOD 0x80 // IrDA Mode +#define CYGARC_REG_SCSMR1_ICK_MASK 0x78 // IR pulse width +#define CYGARC_REG_SCSMR1_PSEL 0x04 // IR pulse selector(?) +#define CYGARC_REG_SCSMR1_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR1_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR1_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR1_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR1_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR1_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR1_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR1_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR1_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR1_PER_MASK 0xf000 // number of parity errors +#define CYGARC_REG_SCSSR1_PER_shift 12 +#define CYGARC_REG_SCSSR1_FER_MASK 0x0f00 // number of framing errors +#define CYGARC_REG_SCSSR1_FER_shift 8 +#define CYGARC_REG_SCSSR1_ER 0x0080 // receive error +#define CYGARC_REG_SCSSR1_TEND 0x0040 // transmit end +#define CYGARC_REG_SCSSR1_TDFE 0x0020 // transmit fifo data empty +#define CYGARC_REG_SCSSR1_BRK 0x0010 // break detection +#define CYGARC_REG_SCSSR1_FER 0x0008 // framing error +#define CYGARC_REG_SCSSR1_PER 0x0004 // parity error +#define CYGARC_REG_SCSSR1_RDF 0x0002 // receive fifo data full +#define CYGARC_REG_SCSSR1_DR 0x0001 // receive data ready + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR2_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR1_CLEARMASK 0xf3 + +// Serial FIFO Control Register +#define CYGARC_REG_SCFCR1_RTRG_MASK 0xc0 // receive fifo data trigger +#define CYGARC_REG_SCFCR1_RTRG_1 0x00 // trigger on 1 char +#define CYGARC_REG_SCFCR1_RTRG_4 0x40 // trigger on 4 chars +#define CYGARC_REG_SCFCR1_RTRG_8 0x80 // trigger on 8 chars +#define CYGARC_REG_SCFCR1_RTRG_14 0xc0 // trigger on 14 chars + +#define CYGARC_REG_SCFCR1_TTRG_MASK 0x30 // transmit fifo data trigger +#define CYGARC_REG_SCFCR1_TTRG_8 0x00 // trigger on 8 chars +#define CYGARC_REG_SCFCR1_TTRG_4 0x10 // trigger on 4 chars +#define CYGARC_REG_SCFCR1_TTRG_2 0x20 // trigger on 2 chars +#define CYGARC_REG_SCFCR1_TTRG_1 0x30 // trigger on 1 char + +#define CYGARC_REG_SCFCR1_MCE 0x08 // modem control enable +#define CYGARC_REG_SCFCR1_TFRST 0x04 // transmit fifo reset +#define CYGARC_REG_SCFCR1_RFRST 0x02 // receive fifo reset +#define CYGARC_REG_SCFCR1_LOOP 0x01 // loop back test + + +// Serial FIFO Data Count Set Register +#define CYGARC_REG_SCFDR1_RCOUNT_MASK 0x001f // number of chars in r fifo +#define CYGARC_REG_SCFDR1_RCOUNT_shift 0 +#define CYGARC_REG_SCFDR1_TCOUNT_MASK 0x1f00 // number of chars in t fifo +#define CYGARC_REG_SCFDR1_TCOUNT_shift 8 + +#endif // CYGARC_SH_MOD_IRDA + +//++++++ Module SCIF +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#ifdef CYGARC_SH_MOD_SCIF + +//-------------------------------------------------------------------------- +// Serial w FIFO registers + +#define CYGARC_REG_SCSMR2 0xa4000150 // Serial mode +#define CYGARC_REG_SCBRR2 0xa4000152 // Bit rate +#define CYGARC_REG_SCSCR2 0xa4000154 // Serial control +#define CYGARC_REG_SCFTDR2 0xa4000156 // Transmit FIFO data +#define CYGARC_REG_SCSSR2 0xa4000158 // Serial status +#define CYGARC_REG_SCFRDR2 0xa400015a // Receive data FIFO +#define CYGARC_REG_SCFCR2 0xa400015c // FIFO control register +#define CYGARC_REG_SCFDR2 0xa400015e // FIFO data count set + +// Serial Mode Register +#define CYGARC_REG_SCSMR2_CHR 0x40 // character length (7 if set) +#define CYGARC_REG_SCSMR2_PE 0x20 // parity enable +#define CYGARC_REG_SCSMR2_OE 0x10 // parity mode +#define CYGARC_REG_SCSMR2_STOP 0x08 // stop bit length +#define CYGARC_REG_SCSMR2_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR2_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR2_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR2_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR2_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR2_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR2_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR2_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR2_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR2_PER_MASK 0xf000 // number of parity errors +#define CYGARC_REG_SCSSR2_PER_shift 12 +#define CYGARC_REG_SCSSR2_FER_MASK 0x0f00 // number of framing errors +#define CYGARC_REG_SCSSR2_FER_shift 8 +#define CYGARC_REG_SCSSR2_ER 0x0080 // receive error +#define CYGARC_REG_SCSSR2_TEND 0x0040 // transmit end +#define CYGARC_REG_SCSSR2_TDFE 0x0020 // transmit fifo data empty +#define CYGARC_REG_SCSSR2_BRK 0x0010 // break detection +#define CYGARC_REG_SCSSR2_FER 0x0008 // framing error +#define CYGARC_REG_SCSSR2_PER 0x0004 // parity error +#define CYGARC_REG_SCSSR2_RDF 0x0002 // receive fifo data full +#define CYGARC_REG_SCSSR2_DR 0x0001 // receive data ready + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR2_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR2_CLEARMASK 0xf3 + +// Serial FIFO Control Register +#define CYGARC_REG_SCFCR2_RTRG_MASK 0xc0 // receive fifo data trigger +#define CYGARC_REG_SCFCR2_RTRG_1 0x00 // trigger on 1 char +#define CYGARC_REG_SCFCR2_RTRG_4 0x40 // trigger on 4 chars +#define CYGARC_REG_SCFCR2_RTRG_8 0x80 // trigger on 8 chars +#define CYGARC_REG_SCFCR2_RTRG_14 0xc0 // trigger on 14 chars + +#define CYGARC_REG_SCFCR2_TTRG_MASK 0x30 // transmit fifo data trigger +#define CYGARC_REG_SCFCR2_TTRG_8 0x00 // trigger on 8 chars +#define CYGARC_REG_SCFCR2_TTRG_4 0x10 // trigger on 4 chars +#define CYGARC_REG_SCFCR2_TTRG_2 0x20 // trigger on 2 chars +#define CYGARC_REG_SCFCR2_TTRG_1 0x30 // trigger on 1 char + +#define CYGARC_REG_SCFCR2_MCE 0x08 // modem control enable +#define CYGARC_REG_SCFCR2_TFRST 0x04 // transmit fifo reset +#define CYGARC_REG_SCFCR2_RFRST 0x02 // receive fifo reset +#define CYGARC_REG_SCFCR2_LOOP 0x01 // loop back test + + +// Serial FIFO Data Count Set Register +#define CYGARC_REG_SCFDR2_RCOUNT_MASK 0x001f // number of chars in r fifo +#define CYGARC_REG_SCFDR2_RCOUNT_shift 0 +#define CYGARC_REG_SCFDR2_TCOUNT_MASK 0x1f00 // number of chars in t fifo +#define CYGARC_REG_SCFDR2_TCOUNT_shift 8 + +#endif // CYGARC_SH_MOD_SCIF diff --git a/packages/hal/sh/sh3/current/include/mod_regs_tmu.h b/packages/hal/sh/sh3/current/include/mod_regs_tmu.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_tmu.h @@ -0,0 +1,79 @@ +//============================================================================= +// +// mod_regs_tmu.h +// +// TMU (timer unit) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// TMU registers +#define CYGARC_REG_TOCR 0xfffffe90 // 8 bit +#define CYGARC_REG_TSTR 0xfffffe92 // 8 bit +#define CYGARC_REG_TCOR0 0xfffffe94 // 32 bit +#define CYGARC_REG_TCNT0 0xfffffe98 // 32 bit +#define CYGARC_REG_TCR0 0xfffffe9c // 16 bit +#define CYGARC_REG_TCOR1 0xfffffea0 // 32 bit +#define CYGARC_REG_TCNT1 0xfffffea4 // 32 bit +#define CYGARC_REG_TCR1 0xfffffea8 // 16 bit +#define CYGARC_REG_TCOR2 0xfffffeac // 32 bit +#define CYGARC_REG_TCNT2 0xfffffeb0 // 32 bit +#define CYGARC_REG_TCR2 0xfffffeb4 // 16 bit +#define CYGARC_REG_TCPR2 0xfffffeb8 // 32 bit + +// TSTR +#define CYGARC_REG_TSTR_STR0 0x0001 +#define CYGARC_REG_TSTR_STR1 0x0002 +#define CYGARC_REG_TSTR_STR2 0x0004 + +// TCR0/1/2 +#define CYGARC_REG_TCR_TPSC0 0x0001 +#define CYGARC_REG_TCR_TPSC1 0x0002 +#define CYGARC_REG_TCR_TPSC2 0x0004 +#define CYGARC_REG_TCR_CKEG0 0x0008 +#define CYGARC_REG_TCR_CKEG1 0x0010 +#define CYGARC_REG_TCR_UNIE 0x0020 +#define CYGARC_REG_TCR_UNF 0x0100 + +#define CYGARC_REG_TCR_TPSC_4 (0) +#define CYGARC_REG_TCR_TPSC_16 (CYGARC_REG_TCR_TPSC0) +#define CYGARC_REG_TCR_TPSC_64 (CYGARC_REG_TCR_TPSC1) +#define CYGARC_REG_TCR_TPSC_256 (CYGARC_REG_TCR_TPSC0|CYGARC_REG_TCR_TPSC1) + +// TCR2 additional bits +#define CYGARC_REG_TCR_ICPE0 0x0040 +#define CYGARC_REG_TCR_ICPE1 0x0080 +#define CYGARC_REG_TCR_ICPF 0x0200 diff --git a/packages/hal/sh/sh3/current/include/mod_regs_ubc.h b/packages/hal/sh/sh3/current/include/mod_regs_ubc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/mod_regs_ubc.h @@ -0,0 +1,95 @@ +//============================================================================= +// +// mod_regs_ubc.h +// +// UBC (user break controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// User Break Control +#define CYGARC_REG_BRCR 0xffffff98 // 16 bit + +#define CYGARC_REG_BARA 0xffffffb0 // 32 bit +#define CYGARC_REG_BAMRA 0xffffffb4 // 8 bit (v1) / 32 bit +#define CYGARC_REG_BBRA 0xffffffb8 // 16 bit +#define CYGARC_REG_BASRA 0xffffffe4 // 8 bit + +#define CYGARC_REG_BARB 0xffffffa0 // 32 bit +#define CYGARC_REG_BAMRB 0xffffffa4 // 8 bit (v1) / 32 bit +#define CYGARC_REG_BASRB 0xffffffe8 // 8 bit +#define CYGARC_REG_BBRB 0xffffffa8 // 16 bit +#define CYGARC_REG_BDRB 0xffffff90 // 32 bit +#define CYGARC_REG_BDMRB 0xffffff94 // 32 bit + + +#define CYGARC_REG_BRCR_CMFA 0x8000 // condition match flag A +#define CYGARC_REG_BRCR_CMFB 0x4000 // condition match flag B +#define CYGARC_REG_BRCR_PCBA 0x0400 // post execute channel A +#define CYGARC_REG_BRCR_DBEB 0x0080 // data break enable B +#define CYGARC_REG_BRCR_PCBB 0x0040 // post execute channel B +#define CYGARC_REG_BRCR_SEQ 0x0008 // sequence condition select + +#if (CYGARC_SH_MOD_UBC == 1) +#define CYGARC_REG_BAMRA_BASMA 0x04 // BASRA masked +#define CYGARC_REG_BAMRA_BARA_UNMASKED 0x00 // BARA not masked +#define CYGARC_REG_BAMRA_BARA_10BIT 0x01 // Lowest 10 bit masked +#define CYGARC_REG_BAMRA_BARA_12BIT 0x02 // Lowest 12 bit masked +#define CYGARC_REG_BAMRA_BARA_MASKED 0x03 // All bits masked +#else +// mask is fully configurable in other versions of the UBC +#endif + +#define CYGARC_REG_BBRA_DFETCH 0x0020 // Break on DFETCH +#define CYGARC_REG_BBRA_IFETCH 0x0010 // Break on IFETCH +#define CYGARC_REG_BBRA_WRITE 0x0008 // Break on WRITE +#define CYGARC_REG_BBRA_READ 0x0004 // Break on READ +#define CYGARC_REG_BBRA_SIZE_LONG 0x0003 // Break on long access +#define CYGARC_REG_BBRA_SIZE_WORD 0x0002 // Break on word access +#define CYGARC_REG_BBRA_SIZE_BYTE 0x0001 // Break on byte access +#define CYGARC_REG_BBRA_SIZE_ANY 0x0000 // Break on any size + + +//---------------------------------------------------------------------------- +// Other types +#if (CYGARC_SH_MOD_UBC >= 3) +#define CYGARC_REG_BETR 0xffffff9c // 16 bit +#define CYGARC_REG_BRSR 0xffffffac // 32 bit +#define CYGARC_REG_BRDR 0xffffffbc // 32 bit + +#define CYGARC_REG_BBRA_DMA 0x0080 // Break on DMAC cycle +#define CYGARC_REG_BBRA_CPU 0x0040 // Break on CPU cycle +#endif diff --git a/packages/hal/sh/sh3/current/include/sh3_sci.h b/packages/hal/sh/sh3/current/include/sh3_sci.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/sh3_sci.h @@ -0,0 +1,81 @@ +//============================================================================= +// +// sh3_sci.h +// +// Simple driver for the SH Serial Communication Interface (SCI) +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 1999-05-17 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH3_SCI_PORTS + +//-------------------------------------------------------------------------- +// SCI register offsets +#if (CYGARC_SH_MOD_SCI >= 2) +# define _REG_SCSPTR -0x4 // serial port register +#endif +#define _REG_SCSMR 0x0 // serial mode register +#define _REG_SCBRR 0x2 // bit rate register +#define _REG_SCSCR 0x4 // serial control register +#define _REG_SCTDR 0x6 // transmit data register +#define _REG_SCSSR 0x8 // serial status register +#define _REG_SCRDR 0xa // receive data register + +//-------------------------------------------------------------------------- + +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +//-------------------------------------------------------------------------- + +#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) +// This one should only be used by old-stub compatibility code! +externC void cyg_hal_plf_sci_init_channel(const channel_data_t* chan); +#endif + +externC cyg_uint8 cyg_hal_plf_sci_getc(void* __ch_data); +externC void cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c); +externC void cyg_hal_plf_sci_init(int sci_index, int comm_index, + int rcv_vect, cyg_uint8* base); + + +#endif // CYGNUM_HAL_SH_SH3_SCI_PORTS +//----------------------------------------------------------------------------- +// end of sh3_sci.h diff --git a/packages/hal/sh/sh3/current/include/sh3_scif.h b/packages/hal/sh/sh3/current/include/sh3_scif.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/sh3_scif.h @@ -0,0 +1,88 @@ +//============================================================================= +// +// sh3_scif.h +// +// Simple driver for the SH3 Serial Communication Interface with FIFO +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-03-30 +// Description: Simple driver for the SH Serial Communication Interface +// The driver can be used for either the SCIF or the IRDA +// modules (the latter can act as the former). +// Clients of this file can configure the behavior with: +// CYGNUM_SCIF_PORTS: number of SCI ports +// +// Note: It should be possible to configure a channel to IRDA mode. +// Worry about that when some board needs it. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH3_SCIF_PORTS + +//-------------------------------------------------------------------------- +// SCIF register offsets +#define _REG_SCSMR 0x00 +#define _REG_SCBRR 0x02 +#define _REG_SCSCR 0x04 +#define _REG_SCFTDR 0x06 +#define _REG_SCSSR 0x08 +#define _REG_SCFRDR 0x0a +#define _REG_SCFCR 0x0c +#define _REG_SCFDR 0x0e + +//-------------------------------------------------------------------------- + +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +//-------------------------------------------------------------------------- + +#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) +// This one should only be used by old-stub compatibility code! +externC void cyg_hal_plf_scif_init_channel(const channel_data_t* chan); +#endif + +externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); +externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); +void cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base); + + +#endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS +//----------------------------------------------------------------------------- +// end of sh3_scif.h diff --git a/packages/hal/sh/sh3/current/include/var_cache.h b/packages/hal/sh/sh3/current/include/var_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/var_cache.h @@ -0,0 +1,295 @@ +#ifndef CYGONCE_VAR_CACHE_H +#define CYGONCE_VAR_CACHE_H + +//============================================================================= +// +// var_cache.h +// +// HAL variant 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): jskov +// Contributors:jskov +// Date: 1999-04-23 +// Purpose: Cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations. +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include +#include +#include +#include // HAL_READ/WRITE macros + +#include CYGBLD_HAL_CPU_MODULES_H // cache module specs + +#include // CYGARC_REG_ definitions + +//----------------------------------------------------------------------------- +// Cache dimensions - one unified cache + +#define HAL_CACHE_UNIFIED + +#define HAL_UCACHE_SIZE CYGARC_SH_MOD_CAC_SIZE +#define HAL_UCACHE_LINE_SIZE CYGARC_SH_MOD_CAC_LINE_SIZE +#define HAL_UCACHE_WAYS CYGARC_SH_MOD_CAC_WAYS + +// Cache addressing information +#define CYGARC_REG_CACHE_ADDRESS_BASE CYGARC_SH_MOD_CAC_ADDRESS_BASE +#define CYGARC_REG_CACHE_ADDRESS_TOP CYGARC_SH_MOD_CAC_ADDRESS_TOP +#define CYGARC_REG_CACHE_ADDRESS_STEP CYGARC_SH_MOD_CAC_ADDRESS_STEP + +// Writing this to a cache address entry forces a flush of the line if +// it is dirty. +#define CYGARC_REG_CACHE_ADDRESS_FLUSH CYGARC_SH_MOD_CAC_ADDRESS_FLUSH + +#define HAL_UCACHE_SETS (HAL_UCACHE_SIZE/(HAL_UCACHE_LINE_SIZE*HAL_UCACHE_WAYS)) + +//----------------------------------------------------------------------------- +// Global control of cache + +// This is all handled in assembly (see variant.S) due to a requirement about +// not fiddling the cache from cachable memory. + +externC void cyg_hal_cache_enable(void); +externC void cyg_hal_cache_disable(void); +externC void cyg_hal_cache_invalidate_all(void); +externC void cyg_hal_cache_sync(void); +externC void cyg_hal_cache_sync_region(cyg_haladdress base, + cyg_haladdrword len); +externC void cyg_hal_cache_write_mode(int mode); + +// Enable the cache +#define HAL_UCACHE_ENABLE() cyg_hal_cache_enable() + +// Disable the cache +#define HAL_UCACHE_DISABLE() cyg_hal_cache_disable() + +// Invalidate the entire cache +#define HAL_UCACHE_INVALIDATE_ALL() cyg_hal_cache_invalidate_all() + +// Synchronize the contents of the cache with memory. +#define HAL_UCACHE_SYNC() cyg_hal_cache_sync() + +// Query the state of the cache (does not affect the caching) +#define HAL_UCACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + HAL_READ_UINT32(CYGARC_REG_CCR, (_state_)); \ + (_state_) &= ~CYGARC_REG_CCR_CE; \ + CYG_MACRO_END + +// Set the cache refill burst size +//#define HAL_UCACHE_BURST_SIZE(_size_) + +// Set the cache write mode +#define HAL_UCACHE_WRITE_MODE( _mode_ ) \ + CYG_MACRO_START \ + cyg_uint32 _m_; \ + if (HAL_UCACHE_WRITETHRU_MODE == _mode_) \ + _m_ = CYGARC_REG_CCR_WT; \ + else \ + _m_ = CYGARC_REG_CCR_CB; \ + cyg_hal_cache_write_mode(_m_); \ + CYG_MACRO_END + +#define HAL_UCACHE_WRITETHRU_MODE 0 +#define HAL_UCACHE_WRITEBACK_MODE 1 + +// This macro allows the client to specify separate modes for the two +// regions. +#define HAL_UCACHE_WRITE_MODE_SH( _mode_ ) cyg_hal_cache_write_mode(_mode_) + +// Load the contents of the given address range into the cache +// and then lock the cache so that it stays there. +//#define HAL_UCACHE_LOCK(_base_, _size_) + +// Undo a previous lock operation +//#define HAL_UCACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_UCACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_UCACHE_ALLOCATE( _base_ , _size_ ) + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +#define HAL_UCACHE_FLUSH( _base_ , _size_ ) \ + cyg_hal_cache_sync_region((cyg_haladdress) _base_, (cyg_haladdrword)_size_) + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_UCACHE_INVALIDATE( _base_ , _size_ ) + +// Write dirty cache lines to memory for the given address range. +//#define HAL_UCACHE_STORE( _base_ , _size_ ) + + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_UCACHE_READ_HINT( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_UCACHE_WRITE_HINT( _base_ , _size_ ) + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_UCACHE_ZERO( _base_ , _size_ ) + + +//----------------------------------------------------------------------------- +// Data and instruction cache macros map onto the both-cache macros + +//----------------------------------------------------------------------------- +// Global control of data cache + +#define HAL_DCACHE_SIZE HAL_UCACHE_SIZE +#define HAL_DCACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE +#define HAL_DCACHE_WAYS HAL_UCACHE_WAYS +#define HAL_DCACHE_SETS HAL_UCACHE_SETS + +// Enable the data cache +#define HAL_DCACHE_ENABLE() HAL_UCACHE_ENABLE() + +// Disable the data cache +#define HAL_DCACHE_DISABLE() HAL_UCACHE_DISABLE() + +// Invalidate the entire cache +#define HAL_DCACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() + +// Synchronize the contents of the cache with memory. +#define HAL_DCACHE_SYNC() HAL_UCACHE_SYNC() + +// Query the state of the data cache +#define HAL_DCACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) + +// Set the data cache refill burst size +//#define HAL_DCACHE_BURST_SIZE(_size_) + +// Set the data cache write mode +//#define HAL_DCACHE_WRITE_MODE( _mode_ ) + +//#define HAL_DCACHE_WRITETHRU_MODE 0 +//#define HAL_DCACHE_WRITEBACK_MODE 1 + +// 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_) + +// Undo a previous lock operation +//#define HAL_DCACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_DCACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Data cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +#define HAL_DCACHE_FLUSH( _base_ , _size_ ) HAL_UCACHE_FLUSH( _base_, _size_ ) + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) + +// Write dirty cache lines to memory for the given address range. +//#define HAL_DCACHE_STORE( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_DCACHE_ZERO( _base_ , _size_ ) + +//----------------------------------------------------------------------------- +// Global control of Instruction cache + +#define HAL_ICACHE_SIZE HAL_UCACHE_SIZE +#define HAL_ICACHE_LINE_SIZE HAL_UCACHE_LINE_SIZE +#define HAL_ICACHE_WAYS HAL_UCACHE_WAYS +#define HAL_ICACHE_SETS HAL_UCACHE_SETS + +// Enable the instruction cache +#define HAL_ICACHE_ENABLE() HAL_UCACHE_ENABLE() + +// Disable the instruction cache +#define HAL_ICACHE_DISABLE() HAL_UCACHE_DISABLE() + +// Invalidate the entire cache +#define HAL_ICACHE_INVALIDATE_ALL() HAL_UCACHE_INVALIDATE_ALL() + + +// Synchronize the contents of the cache with memory. +#define HAL_ICACHE_SYNC() HAL_UCACHE_SYNC() + +// Query the state of the instruction cache +#define HAL_ICACHE_IS_ENABLED(_state_) HAL_UCACHE_IS_ENABLED(_state_) + +// Set the instruction cache refill burst size +//#define HAL_ICACHE_BURST_SIZE(_size_) + +// 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_) + +// Undo a previous lock operation +//#define HAL_ICACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_ICACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Instruction cache line control + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_CACHE_H +// End of var_cache.h diff --git a/packages/hal/sh/sh3/current/include/var_intr.h b/packages/hal/sh/sh3/current/include/var_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/var_intr.h @@ -0,0 +1,113 @@ +#ifndef CYGONCE_VAR_INTR_H +#define CYGONCE_VAR_INTR_H + +//========================================================================== +// +// var_intr.h +// +// HAL variant 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): jskov +// Contributors: jskov, +// Date: 1999-04-24 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock. +// +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include CYGBLD_HAL_CPU_MODULES_H // INTC module selection + +//---------------------------------------------------------------------------- +// Additional vectors provided by INTC V2 + +#if (CYGARC_SH_MOD_INTC >= 2) +#define CYGNUM_HAL_INTERRUPT_RESERVED_5C0 32 +#define CYGNUM_HAL_INTERRUPT_HUDI_HUDI 33 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 34 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ1 35 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ2 36 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ3 37 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ4 38 +#define CYGNUM_HAL_INTERRUPT_IRQ_IRQ5 39 +#define CYGNUM_HAL_INTERRUPT_RESERVED_6C0 40 +#define CYGNUM_HAL_INTERRUPT_RESERVED_6E0 41 +#define CYGNUM_HAL_INTERRUPT_PINT_PINT07 42 +#define CYGNUM_HAL_INTERRUPT_PINT_PINT8F 43 +#define CYGNUM_HAL_INTERRUPT_RESERVED_740 44 +#define CYGNUM_HAL_INTERRUPT_RESERVED_760 45 +#define CYGNUM_HAL_INTERRUPT_RESERVED_780 46 +#define CYGNUM_HAL_INTERRUPT_RESERVED_7A0 47 +#define CYGNUM_HAL_INTERRUPT_RESERVED_7C0 48 +#define CYGNUM_HAL_INTERRUPT_RESERVED_7E0 59 +#define CYGNUM_HAL_INTERRUPT_DMAC_DEI0 50 +#define CYGNUM_HAL_INTERRUPT_DMAC_DEI1 51 +#define CYGNUM_HAL_INTERRUPT_DMAC_DEI2 52 +#define CYGNUM_HAL_INTERRUPT_DMAC_DEI3 53 +#define CYGNUM_HAL_INTERRUPT_IRDA_ERI1 54 +#define CYGNUM_HAL_INTERRUPT_IRDA_RXI1 55 +#define CYGNUM_HAL_INTERRUPT_IRDA_BRI1 56 +#define CYGNUM_HAL_INTERRUPT_IRDA_TXI1 57 +#define CYGNUM_HAL_INTERRUPT_SCIF_ERI2 58 +#define CYGNUM_HAL_INTERRUPT_SCIF_RXI2 59 +#define CYGNUM_HAL_INTERRUPT_SCIF_BRI2 60 +#define CYGNUM_HAL_INTERRUPT_SCIF_TXI2 61 +#define CYGNUM_HAL_INTERRUPT_ADC_ADI 62 + +#undef CYGNUM_HAL_ISR_MAX +#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_ADC_ADI + +#endif // CYGARC_SH_MOD_INTC >= 2 + +//---------------------------------------------------------------------------- +// Additional vectors provided by INTC V3 + +#if (CYGARC_SH_MOD_INTC >= 3) +#define CYGNUM_HAL_INTERRUPT_LCDC_LCDI 63 +#define CYGNUM_HAL_INTERRUPT_PCC_PCC0 64 +#define CYGNUM_HAL_INTERRUPT_PCC_PCC1 65 + +#undef CYGNUM_HAL_ISR_MAX +#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_PCC_PCC1 + +#endif // CYGARC_SH_MOD_INTC >= 3 + + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_INTR_H +// End of var_intr.h diff --git a/packages/hal/sh/sh3/current/include/var_regs.h b/packages/hal/sh/sh3/current/include/var_regs.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/var_regs.h @@ -0,0 +1,100 @@ +#ifndef CYGONCE_VAR_SH_REGS_H +#define CYGONCE_VAR_SH_REGS_H +//============================================================================= +// +// sh_regs.h +// +// SH CPU definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 1999-04-24 +// Purpose: Define CPU memory mapped registers etc. +// Usage: #include +// Notes: +// This file describes registers for on-core modules found in all +// the SH3 CPUs supported by the HAL. For each CPU is defined a +// module specification file (mod_.h) which lists +// modules (and their version if applicable) included in that +// particular CPU model. Note that the versioning is ad hoc; +// it doesn't reflect Hitachi internal versioning in any way. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +// Find out which modules are supported by the chosen CPU +#include +#include CYGBLD_HAL_CPU_MODULES_H + +//========================================================================== +// CPU Definitions +//========================================================================== + +//-------------------------------------------------------------------------- +// Status register +#define CYGARC_REG_SR_MD 0x40000000 +#define CYGARC_REG_SR_RB 0x20000000 +#define CYGARC_REG_SR_BL 0x10000000 +#define CYGARC_REG_SR_M 0x00000200 +#define CYGARC_REG_SR_Q 0x00000100 +#define CYGARC_REG_SR_IMASK 0x000000f0 +#define CYGARC_REG_SR_I3 0x00000080 +#define CYGARC_REG_SR_I2 0x00000040 +#define CYGARC_REG_SR_I1 0x00000020 +#define CYGARC_REG_SR_I0 0x00000010 +#define CYGARC_REG_SR_S 0x00000002 +#define CYGARC_REG_SR_T 0x00000001 + + +//========================================================================== +// Module Definitions +//========================================================================== + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CYGARC_SH_MOD_DMAC +#include +#endif +#ifdef CYGARC_SH_MOD_PFC +#include +#endif + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_SH_REGS_H +// End of var_regs.h diff --git a/packages/hal/sh/sh3/current/include/variant.inc b/packages/hal/sh/sh3/current/include/variant.inc new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/include/variant.inc @@ -0,0 +1,188 @@ +#ifndef CYGONCE_HAL_VARIANT_INC +#define CYGONCE_HAL_VARIANT_INC +##============================================================================= +## +## variant.inc +## +## SH3 variant assembler header file +## +##============================================================================= +#####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): jskov +## Contributors:jskov +## Date: 2000-10-30 +## Purpose: SH3 variant definitions and init code +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the SH3 CPU family. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include +#include + +#=========================================================================== +# SR initialization value +# zero all bits except: +# MD = Processor operation mode field (privileged mode) +# I0-3 = Mask out all interrupts but NMI. +# +# When saving or restoring the state of an exception or interrupt, the bit +# CYGARC_REG_SR_RB is also set, switching the register bank. When this bit +# is set, interrupts must be disabled. +# +# Note: We could also use the BL bit to prevent interrupts, but that would +# also prevent the use of breakpoints. + +#define CYG_SR (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK) +#define CYG_SR_BANK1 (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK|CYGARC_REG_SR_RB) + +##----------------------------------------------------------------------------- +## Hardware init macros +#ifndef CYGPKG_HAL_SH_POST_RESET_INIT + .macro hal_post_reset_init + # Initialize CPU + mov.l $nCYG_SR,r1 ! Put CPU in a well-known state + ldc r1,sr + mov #0,r0 + mov #CYGARC_REG_CCR,r1 ! Disable cache + mov.l r0,@r1 + mov #CYGARC_REG_MMUCR,r1 ! Disable MMU + mov.l r0,@r1 + mov #CYGARC_REG_BBRA,r1 ! Disable UBC Channel A + mov.w r0,@r1 + mov #CYGARC_REG_BBRB,r1 ! Disable UBC Channel B + mov.w r0,@r1 + mov #CYGARC_REG_BRCR,r1 ! Reset UBC common register + mov.w r0,@r1 + mov.l $CYGARC_REG_TSTR,r1 ! Disable timers + mov.b r0,@r1 + mov.l $CYGARC_REG_IPRA,r1 ! Disable interrupt request sources + mov.w r0,@r1 + mov.l $CYGARC_REG_IPRB,r1 + mov.w r0,@r1 +#if (CYGARC_SH_MOD_INTC >= 2) + mov.l $CYGARC_REG_IPRC,r1 + mov.w r0,@r1 + mov.l $CYGARC_REG_IPRD,r1 + mov.w r0,@r1 + mov.l $CYGARC_REG_IPRE,r1 + mov.w r0,@r1 +#if (CYGARC_SH_MOD_INTC >= 3) + mov.l $CYGARC_REG_IPRF,r1 + mov.w r0,@r1 +#endif + mov.w $nCYG_ICR1_INIT,r0 + mov.l $CYGARC_REG_ICR1,r1 ! Set interrupt controller to IRQ mode + mov.w r0,@r1 +#endif + mov.w $nCYG_WTCSR,r0 ! Clear watchdog + mov #CYGARC_REG_WTCSR,r1 + mov.w r0,@r1 + + # Initialize VBR if necessary +#if !defined(CYG_HAL_STARTUP_RAM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + mov.l $__reset,r1 ! Set VBR + ldc r1,vbr +#endif + bra 1f + nop + +$nCYG_WTCSR: + .word 0xa500 ! clear all CSR bits + + .align 2 +$nCYG_SR: + .long CYG_SR +$CYGARC_REG_TSTR: + .long CYGARC_REG_TSTR +$CYGARC_REG_IPRA: + .long CYGARC_REG_IPRA +$CYGARC_REG_IPRB: + .long CYGARC_REG_IPRB +#if (CYGARC_SH_MOD_INTC >= 2) +$CYGARC_REG_IPRC: + .long CYGARC_REG_IPRC +$CYGARC_REG_IPRD: + .long CYGARC_REG_IPRD +$CYGARC_REG_IPRE: + .long CYGARC_REG_IPRE +$CYGARC_REG_ICR1: + .long CYGARC_REG_ICR1 +$nCYG_ICR1_INIT: + .word CYGARC_REG_ICR1_INIT + .align 2 +#endif +#if (CYGARC_SH_MOD_INTC >= 3) +$CYGARC_REG_IPRF: + .long CYGARC_REG_IPRF +#endif +$__reset: + .long __reset + +1: + .endm +#define CYGPKG_HAL_SH_POST_RESET_INIT +#endif + +##----------------------------------------------------------------------------- +## Interrupt decode macros + .macro hal_intc_decode tmp,inum +#if (CYGARC_SH_MOD_INTC >= 2) + mov.l $nCYGARC_REG_INTEVT2,\tmp +#else + mov #CYGARC_REG_INTEVT,\tmp +#endif + mov.l @\tmp,\inum + mov #-5,\tmp ! divide cause by 0x20 + shld \tmp,\inum + add #-14,\inum ! adjust so NMI becomes 0 + + .endm + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + .macro hal_intc_translate inum,vnum + mov #0,\vnum ! Just vector zero is supported + .endm +#else + .macro hal_intc_translate inum,vnum + mov \inum,\vnum ! Vector == interrupt number + shll2 \vnum ! get from vector number to ISR index + .endm +#endif + +#------------------------------------------------------------------------------ +#endif // CYGONCE_HAL_VARIANT_INC +# end of variant.inc diff --git a/packages/hal/sh/sh3/current/src/sh3_sci.c b/packages/hal/sh/sh3/current/src/sh3_sci.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/src/sh3_sci.c @@ -0,0 +1,307 @@ +//============================================================================= +// +// sh3_sci.c +// +// Simple driver for the SH Serial Communication Interface (SCI) +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 1999-05-17 +// Description: Simple driver for the SH Serial Communication Interface +// Clients of this file can configure the behavior with: +// CYGNUM_SCI_PORTS: number of SCI ports +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH3_SCI_PORTS + +#include // IO macros +#include // CYG_ISR_HANDLED +#include // Helper functions +#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS +#include // SAVE/RESTORE GP +#include // Calling-if API +#include // serial register definitions + +#include // our header + +//-------------------------------------------------------------------------- + +#ifndef CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE +# define CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE 38400 +#endif + +void +cyg_hal_plf_sci_init_channel(const channel_data_t* chan) +{ + cyg_uint8 tmp; + cyg_uint8* base = chan->base; + + // Disable Tx/Rx interrupts, but enable Tx/Rx + HAL_WRITE_UINT8(base+_REG_SCSCR, + CYGARC_REG_SCSCR_TE|CYGARC_REG_SCSCR_RE); + + // 8-1-no parity. + HAL_WRITE_UINT8(base+_REG_SCSMR, 0); + + // Set speed to CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE + HAL_READ_UINT8(base+_REG_SCSMR, tmp); + tmp &= ~CYGARC_REG_SCSMR_CKSx_MASK; + tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE); + HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); + HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE)); +} + +static cyg_bool +cyg_hal_plf_sci_getc_nonblock(void* __ch_data, cyg_uint8* ch) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 sr; + + HAL_READ_UINT8(base+_REG_SCSSR, sr); + if ((sr & CYGARC_REG_SCSSR_RDRF) == 0) + return false; + + HAL_READ_UINT8(base+_REG_SCRDR, *ch); + + // Clear buffer full flag. + HAL_WRITE_UINT8(base+_REG_SCSSR, sr & ~CYGARC_REG_SCSSR_RDRF); + + return true; +} + +cyg_uint8 +cyg_hal_plf_sci_getc(void* __ch_data) +{ + cyg_uint8 ch; + CYGARC_HAL_SAVE_GP(); + + while(!cyg_hal_plf_sci_getc_nonblock(__ch_data, &ch)); + + CYGARC_HAL_RESTORE_GP(); + return ch; +} + +void +cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint8 sr; + CYGARC_HAL_SAVE_GP(); + + do { + HAL_READ_UINT8(base+_REG_SCSSR, sr); + } while ((sr & CYGARC_REG_SCSSR_TDRE) == 0); + + HAL_WRITE_UINT8(base+_REG_SCTDR, c); + + // Clear empty flag. + HAL_WRITE_UINT8(base+_REG_SCSSR, sr & ~CYGARC_REG_SCSSR_TDRE); + + // Hang around until the character has been safely sent. + do { + HAL_READ_UINT8(base+_REG_SCSSR, sr); + } while ((sr & CYGARC_REG_SCSSR_TDRE) == 0); + + CYGARC_HAL_RESTORE_GP(); +} + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCI_PORTS]; + +static void +cyg_hal_plf_sci_write(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_plf_sci_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_plf_sci_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_plf_sci_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +cyg_bool +cyg_hal_plf_sci_getc_timeout(void* __ch_data, cyg_uint8* ch) +{ + channel_data_t* chan = (channel_data_t*)__ch_data; + int delay_count; + cyg_bool res; + CYGARC_HAL_SAVE_GP(); + + delay_count = chan->msec_timeout * 10; // delay in .1 ms steps + + for(;;) { + res = cyg_hal_plf_sci_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_sci_control(void *__ch_data, __comm_control_cmd_t __func, ...) +{ + static int irq_state = 0; + channel_data_t* chan = (channel_data_t*)__ch_data; + cyg_uint8 scr; + int ret = 0; + CYGARC_HAL_SAVE_GP(); + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); + scr |= CYGARC_REG_SCSCR_RIE; + HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); + scr &= ~CYGARC_REG_SCSCR_RIE; + HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); + 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_sci_isr(void *__ch_data, int* __ctrlc, + CYG_ADDRWORD __vector, CYG_ADDRWORD __data) +{ + cyg_uint8 c, sr; + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + int res = 0; + CYGARC_HAL_SAVE_GP(); + + *__ctrlc = 0; + HAL_READ_UINT8(base+_REG_SCSSR, sr); + if (sr & CYGARC_REG_SCSSR_RDRF) { + HAL_READ_UINT8(base+_REG_SCRDR, c); + + // Clear buffer full flag. + HAL_WRITE_UINT8(base+_REG_SCSSR, + CYGARC_REG_SCSSR_CLEARMASK & ~CYGARC_REG_SCSSR_RDRF); + + if( cyg_hal_is_break( &c , 1 ) ) + *__ctrlc = 1; + + res = CYG_ISR_HANDLED; + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +void +cyg_hal_plf_sci_init(int sci_index, int comm_index, + int rcv_vect, cyg_uint8* base) +{ + channel_data_t* chan = &channels[sci_index]; + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize channel table + chan->base = base; + chan->isr_vector = rcv_vect; + chan->msec_timeout = 1000; + + // Disable interrupts. + HAL_INTERRUPT_MASK(chan->isr_vector); + + // Init channel + + cyg_hal_plf_sci_init_channel(chan); + + // Setup procs in the vector table + + // Initialize channel procs + CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_sci_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_sci_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_sci_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_sci_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_sci_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_sci_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_sci_getc_timeout); + + // Restore original console + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +#endif // CYGNUM_HAL_SH_SH3_SCI_PORTS + +//----------------------------------------------------------------------------- +// end of sh_sci.c diff --git a/packages/hal/sh/sh3/current/src/sh3_scif.c b/packages/hal/sh/sh3/current/src/sh3_scif.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/src/sh3_scif.c @@ -0,0 +1,344 @@ +//============================================================================= +// +// sh3_scif.c +// +// Simple driver for the SH3 Serial Communication Interface with FIFO +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-03-30 +// Description: Simple driver for the SH Serial Communication Interface +// The driver can be used for either the SCIF or the IRDA +// modules (the latter can act as the former). +// Clients of this file can configure the behavior with: +// CYGNUM_SCIF_PORTS: number of SCI ports +// +// Note: It should be possible to configure a channel to IRDA mode. +// Worry about that when some board needs it. +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH3_SCIF_PORTS + +#include // IO macros +#include // CYG_ISR_HANDLED +#include // Helper functions +#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS +#include // SAVE/RESTORE GP +#include // Calling-if API +#include // serial register definitions +#include // target_register_t + +#include // our header + +//-------------------------------------------------------------------------- + +#ifndef CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE +# define CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE 38400 +#endif + +void +cyg_hal_plf_scif_init_channel(const channel_data_t* chan) +{ + cyg_uint8* base = chan->base; + cyg_uint8 tmp; + cyg_uint16 sr; + + // Disable everything. + HAL_WRITE_UINT8(base+_REG_SCSCR, 0); + + // Reset FIFO. + HAL_WRITE_UINT8(base+_REG_SCFCR, + CYGARC_REG_SCFCR2_TFRST|CYGARC_REG_SCFCR2_RFRST); + + // 8-1-no parity. + HAL_WRITE_UINT8(base+_REG_SCSMR, 0); + + // Set speed to CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE + HAL_READ_UINT8(base+_REG_SCSMR, tmp); + tmp &= ~CYGARC_REG_SCSMR2_CKSx_MASK; + tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE); + HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); + HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE)); + + // Let things settle: Here we should should wait the equivalent of + // one bit interval, + // i.e. 1/CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE second, but + // until we have something like the Linux delay loop, it's hard to + // do reliably. So just move on and hope for the best (this is + // unlikely to cause problems since the CPU has just come out of + // reset anyway). + + // Clear status register (read back first). + HAL_READ_UINT16(base+_REG_SCSSR, sr); + HAL_WRITE_UINT16(base+_REG_SCSSR, 0); + + // Bring FIFO out of reset and set to trigger on every char in + // FIFO (or C-c input would not be processed). + HAL_WRITE_UINT8(base+_REG_SCFCR, + CYGARC_REG_SCFCR2_RTRG_1|CYGARC_REG_SCFCR2_TTRG_1); + + // Leave Tx/Rx interrupts disabled, but enable Tx/Rx + HAL_WRITE_UINT8(base+_REG_SCSCR, + CYGARC_REG_SCSCR2_TE|CYGARC_REG_SCSCR2_RE); +} + +//static +cyg_bool +cyg_hal_plf_scif_getc_nonblock(void* __ch_data, cyg_uint8* ch) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint16 fdr, sr; + + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + if (0 == (fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK)) + return false; + + HAL_READ_UINT8(base+_REG_SCFRDR, *ch); + + // Clear DR/RDF flags + HAL_READ_UINT16(base+_REG_SCSSR, sr); + HAL_WRITE_UINT16(base+_REG_SCSSR, + CYGARC_REG_SCSSR2_CLEARMASK & ~(CYGARC_REG_SCSSR2_RDF | CYGARC_REG_SCSSR2_DR)); + + return true; +} + +cyg_uint8 +cyg_hal_plf_scif_getc(void* __ch_data) +{ + cyg_uint8 ch; + CYGARC_HAL_SAVE_GP(); + + while(!cyg_hal_plf_scif_getc_nonblock(__ch_data, &ch)); + + CYGARC_HAL_RESTORE_GP(); + return ch; +} + +void +cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint16 fdr, sr; + CYGARC_HAL_SAVE_GP(); + + do { + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + } while (((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) >> CYGARC_REG_SCFDR2_TCOUNT_shift) == 16); + + HAL_WRITE_UINT8(base+_REG_SCFTDR, c); + + // Clear FIFO-empty/transmit end flags (read back SR first) + HAL_READ_UINT16(base+_REG_SCSSR, sr); + HAL_WRITE_UINT16(base+_REG_SCSSR, CYGARC_REG_SCSSR2_CLEARMASK + & ~(CYGARC_REG_SCSSR2_TDFE | CYGARC_REG_SCSSR2_TEND )); + + // Hang around until the character has been safely sent. + do { + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + } while ((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) != 0); + + CYGARC_HAL_RESTORE_GP(); +} + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCIF_PORTS]; + +static void +cyg_hal_plf_scif_write(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_plf_scif_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_plf_scif_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_plf_scif_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +cyg_bool +cyg_hal_plf_scif_getc_timeout(void* __ch_data, cyg_uint8* ch) +{ + channel_data_t* chan = (channel_data_t*)__ch_data; + int delay_count; + cyg_bool res; + CYGARC_HAL_SAVE_GP(); + + delay_count = chan->msec_timeout * 10; // delay in .1 ms steps + + for(;;) { + res = cyg_hal_plf_scif_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_scif_control(void *__ch_data, __comm_control_cmd_t __func, ...) +{ + static int irq_state = 0; + channel_data_t* chan = (channel_data_t*)__ch_data; + cyg_uint8 scr; + int ret = 0; + CYGARC_HAL_SAVE_GP(); + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); + scr |= CYGARC_REG_SCSCR2_RIE; + HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); + scr &= ~CYGARC_REG_SCSCR2_RIE; + HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); + 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_scif_isr(void *__ch_data, int* __ctrlc, + CYG_ADDRWORD __vector, CYG_ADDRWORD __data) +{ + cyg_uint8 c; + cyg_uint16 fdr, sr; + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + int res = 0; + CYGARC_HAL_SAVE_GP(); + + *__ctrlc = 0; + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + if ((fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK) != 0) { + HAL_READ_UINT8(base+_REG_SCFRDR, c); + + // Clear buffer full flag (read back first). + HAL_READ_UINT16(base+_REG_SCSSR, sr); + HAL_WRITE_UINT16(base+_REG_SCSSR, + CYGARC_REG_SCSSR2_CLEARMASK & ~CYGARC_REG_SCSSR2_RDF); + + if( cyg_hal_is_break( &c , 1 ) ) + *__ctrlc = 1; + + res = CYG_ISR_HANDLED; + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +void +cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base) +{ + channel_data_t* chan = &channels[scif_index]; + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize channel table + chan->base = base; + chan->isr_vector = rcv_vect; + chan->msec_timeout = 1000; + + // Disable interrupts. + HAL_INTERRUPT_MASK(chan->isr_vector); + + // Init channel + cyg_hal_plf_scif_init_channel(chan); + + // Setup procs in the vector table + + // Initialize channel procs + CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_scif_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_scif_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_scif_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_scif_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_scif_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_scif_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_scif_getc_timeout); + + // Restore original console + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +#endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS + +//----------------------------------------------------------------------------- +// end of sh3_scif.c diff --git a/packages/hal/sh/sh3/current/src/var_misc.c b/packages/hal/sh/sh3/current/src/var_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/src/var_misc.c @@ -0,0 +1,439 @@ +//========================================================================== +// +// var_misc.c +// +// HAL miscellaneous functions +// +//========================================================================== +//####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): jskov +// Contributors: jskov, jlarmour, nickg +// Date: 1999-04-03 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +#include + +#include +#include // tracing macros +#include // assertion macros +#include // diag_printf + +#include // HAL header +#include // HAL cache +#include // HAL interrupts/exceptions + +//--------------------------------------------------------------------------- +// Initial cache enabling + +#ifdef CYGHWR_HAL_SH_CACHE_MODE_P0_WRITE_BACK +# define CACHE_MODE_P0 0 +#else +# define CACHE_MODE_P0 CYGARC_REG_CCR_WT +#endif + +#ifdef CYGHWR_HAL_SH_CACHE_MODE_P1_WRITE_BACK +# define CACHE_MODE_P1 CYGARC_REG_CCR_CB +#else +# define CACHE_MODE_P1 0 +#endif + +externC void +cyg_var_enable_caches(void) +{ + // Initialize cache. + HAL_UCACHE_INVALIDATE_ALL(); + + // Set cache modes + HAL_UCACHE_WRITE_MODE_SH(CACHE_MODE_P0|CACHE_MODE_P1); + +#ifdef CYGHWR_HAL_SH_CACHE_ENABLE + // Enable cache. + HAL_UCACHE_ENABLE(); +#endif +} + +//--------------------------------------------------------------------------- +void +hal_variant_init(void) +{ +} + +//--------------------------------------------------------------------------- +// Interrupt function support + +#ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING +externC cyg_uint8 cyg_hal_ILVL_table[]; +#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) \ + /* Update the ILVL table, so it is easy for the interrupt entry */ \ + /* code to find out the level of a given interrupt source. */ \ + cyg_hal_ILVL_table[(_vector_)] = (_level_) +#else +#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) +#endif + +void +hal_interrupt_set_level(int vector, int level) +{ + cyg_uint16 iprX; + + CYG_ASSERT((0 <= (level) && 15 >= (level)), "Illegal level"); + CYG_ASSERT((CYGNUM_HAL_ISR_MIN <= (vector) + && CYGNUM_HAL_ISR_MAX >= (vector)), "Illegal vector"); + + HAL_UPDATE_ILVL_TABLE(vector, level); + + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Cannot change levels */ + break; + + /* IPRA */ + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU0_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU0_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_TMU1_TUNI1: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU1_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU1_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_TMU2_TUNI2: + case CYGNUM_HAL_INTERRUPT_TMU2_TICPI2: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU2_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU2_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_RTC_ATI: + case CYGNUM_HAL_INTERRUPT_RTC_PRI: + case CYGNUM_HAL_INTERRUPT_RTC_CUI: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_RTC_MASK; + iprX |= (level)*CYGARC_REG_IPRA_RTC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + + /* IPRB */ + case CYGNUM_HAL_INTERRUPT_SCI_ERI: + case CYGNUM_HAL_INTERRUPT_SCI_RXI: + case CYGNUM_HAL_INTERRUPT_SCI_TXI: + case CYGNUM_HAL_INTERRUPT_SCI_TEI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_SCI_MASK; + iprX |= (level)*CYGARC_REG_IPRB_SCI_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + case CYGNUM_HAL_INTERRUPT_WDT_ITI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_WDT_MASK; + iprX |= (level)*CYGARC_REG_IPRB_WDT_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + case CYGNUM_HAL_INTERRUPT_REF_RCMI: + case CYGNUM_HAL_INTERRUPT_REF_ROVI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_REF_MASK; + iprX |= (level)*CYGARC_REG_IPRB_REF_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + +#if (CYGARC_SH_MOD_INTC >= 2) +#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL + /* IPRC */ + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_IRQ0_MASK; + iprX |= (level)*CYGARC_REG_IPRC_IRQ0_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_IRQ1_MASK; + iprX |= (level)*CYGARC_REG_IPRC_IRQ1_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_IRQ2_MASK; + iprX |= (level)*CYGARC_REG_IPRC_IRQ2_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_IRQ3_MASK; + iprX |= (level)*CYGARC_REG_IPRC_IRQ3_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; +#endif + /* IPRD */ + case CYGNUM_HAL_INTERRUPT_PINT_PINT07: + HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); + iprX &= ~CYGARC_REG_IPRD_PINT07_MASK; + iprX |= (level)*CYGARC_REG_IPRD_PINT07_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); + break; + case CYGNUM_HAL_INTERRUPT_PINT_PINT8F: + HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); + iprX &= ~CYGARC_REG_IPRD_PINT8F_MASK; + iprX |= (level)*CYGARC_REG_IPRD_PINT8F_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: + HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); + iprX &= ~CYGARC_REG_IPRD_IRQ5_MASK; + iprX |= (level)*CYGARC_REG_IPRD_IRQ5_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: + HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); + iprX &= ~CYGARC_REG_IPRD_IRQ4_MASK; + iprX |= (level)*CYGARC_REG_IPRD_IRQ4_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); + break; + + /* IPRE */ + case CYGNUM_HAL_INTERRUPT_DMAC_DEI0: + case CYGNUM_HAL_INTERRUPT_DMAC_DEI1: + case CYGNUM_HAL_INTERRUPT_DMAC_DEI2: + case CYGNUM_HAL_INTERRUPT_DMAC_DEI3: + HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); + iprX &= ~CYGARC_REG_IPRE_DMAC_MASK; + iprX |= (level)*CYGARC_REG_IPRE_DMAC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); + break; + case CYGNUM_HAL_INTERRUPT_IRDA_ERI1: + case CYGNUM_HAL_INTERRUPT_IRDA_RXI1: + case CYGNUM_HAL_INTERRUPT_IRDA_BRI1: + case CYGNUM_HAL_INTERRUPT_IRDA_TXI1: + HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); + iprX &= ~CYGARC_REG_IPRE_IRDA_MASK; + iprX |= (level)*CYGARC_REG_IPRE_IRDA_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); + break; + case CYGNUM_HAL_INTERRUPT_SCIF_ERI2: + case CYGNUM_HAL_INTERRUPT_SCIF_RXI2: + case CYGNUM_HAL_INTERRUPT_SCIF_BRI2: + case CYGNUM_HAL_INTERRUPT_SCIF_TXI2: + HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); + iprX &= ~CYGARC_REG_IPRE_SCIF_MASK; + iprX |= (level)*CYGARC_REG_IPRE_SCIF_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); + break; + case CYGNUM_HAL_INTERRUPT_ADC_ADI: + HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); + iprX &= ~CYGARC_REG_IPRE_ADC_MASK; + iprX |= (level)*CYGARC_REG_IPRE_ADC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); + break; +#endif // (CYGARC_SH_MOD_INTC >= 2) + +#if (CYGARC_SH_MOD_INTC >= 3) + /* IPRF */ + case CYGNUM_HAL_INTERRUPT_LCDC_LCDI: + HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); + iprX &= ~CYGARC_REG_IPRF_LCDI_MASK; + iprX |= (level)*CYGARC_REG_IPRF_LCDI_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); + break; + case CYGNUM_HAL_INTERRUPT_PCC_PCC0: + HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); + iprX &= ~CYGARC_REG_IPRF_PCC0_MASK; + iprX |= (level)*CYGARC_REG_IPRF_PCC0_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); + break; + case CYGNUM_HAL_INTERRUPT_PCC_PCC1: + HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); + iprX &= ~CYGARC_REG_IPRF_PCC1_MASK; + iprX |= (level)*CYGARC_REG_IPRF_PCC1_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); + break; +#endif // (CYGARC_SH_MOD_INTC >= 3) + + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + /* Do nothing for these reserved vectors. */ + break; + + default: + CYG_FAIL("Unknown interrupt vector"); + break; + } +} + +void +hal_interrupt_mask(int vector) +{ + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Can only be masked by fiddling Imask in SR. */ + break; + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: + HAL_INTERRUPT_SET_LEVEL((vector), 0); + break; + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + /* Do nothing for these reserved vectors. */ + break; + default: + CYG_FAIL("Unknown interrupt vector"); + break; + } +} + +void +hal_interrupt_unmask(int vector) +{ + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Can only be unmasked by fiddling Imask in SR. */ + break; + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: + HAL_INTERRUPT_SET_LEVEL((vector), 1); + break; + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + /* Do nothing for these reserved vectors. */ + break; + default: + CYG_FAIL("Unknown interrupt vector"); + break; + } +} + +void +hal_interrupt_acknowledge(int vector) +{ +#if (CYGARC_SH_MOD_INTC >= 2) + if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 + && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { + + cyg_uint8 irr0; + + HAL_READ_UINT8(CYGARC_REG_IRR0, irr0); + switch ( vector ) { +#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: + irr0 &= ~CYGARC_REG_IRR0_IRQ0; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: + irr0 &= ~CYGARC_REG_IRR0_IRQ1; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: + irr0 &= ~CYGARC_REG_IRR0_IRQ2; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: + irr0 &= ~CYGARC_REG_IRR0_IRQ3; + break; +#endif + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: + irr0 &= ~CYGARC_REG_IRR0_IRQ4; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: + irr0 &= ~CYGARC_REG_IRR0_IRQ5; + break; + default: + CYG_FAIL("Unhandled interrupt vector"); + } + HAL_WRITE_UINT8(CYGARC_REG_IRR0, irr0); + } +#endif +} + +// Note: The PINTs can be masked and configured individually, even +// though there are only two vectors. Maybe add some fake vectors just +// for masking/configuring? +void +hal_interrupt_configure(int vector, int level, int up) +{ +#if (CYGARC_SH_MOD_INTC >= 2) + if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 + && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { + + cyg_uint16 icr1, ss, mask; + ss = 0; + mask = CYGARC_REG_ICR1_SENSE_UP|CYGARC_REG_ICR1_SENSE_LEVEL; + if (up) ss |= CYGARC_REG_ICR1_SENSE_UP; + if (level) ss |= CYGARC_REG_ICR1_SENSE_LEVEL; + CYG_ASSERT(!(up && level), "Cannot trigger on high level!"); + + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; + break; +#ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; + break; + case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: + ss <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; + mask <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; + break; +#endif + default: + CYG_FAIL("Unhandled interrupt vector"); + } + + HAL_READ_UINT16(CYGARC_REG_ICR1, icr1); + icr1 &= ~mask; + icr1 |= ss; + HAL_WRITE_UINT16(CYGARC_REG_ICR1, icr1); + } +#endif +} + +//--------------------------------------------------------------------------- +// End of hal_misc.c diff --git a/packages/hal/sh/sh3/current/src/var_mk_defs.c b/packages/hal/sh/sh3/current/src/var_mk_defs.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/src/var_mk_defs.c @@ -0,0 +1,84 @@ +//========================================================================== +// +// var_mk_defs.c +// +// HAL (variant) "make defs" program +// +//========================================================================== +//####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 +// Date: 2000-02-21 +// Purpose: SH architecture dependent definition generator +// Description: This file contains code that can be compiled by the target +// compiler and used to generate machine specific definitions +// suitable for use in assembly code. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // HAL header +#include // HAL header +#include // HAL header +#ifdef CYGPKG_KERNEL +# include +# include +#endif + +/* + * This program is used to generate definitions needed by + * assembly language modules. + * + * This technique was first used in the OSF Mach kernel code: + * generate asm statements containing #defines, + * compile this file to assembler, and then extract the + * #defines from the assembly-language output. + */ + +#define DEFINE(sym, val) \ + asm volatile("\n\t.equ\t" #sym ",%0" : : "i" (val)) + +int +main(void) +{ + // Caching details + DEFINE(CYGARC_REG_CACHE_ADDRESS_FLUSH, CYGARC_REG_CACHE_ADDRESS_FLUSH); + DEFINE(CYGARC_REG_CACHE_ADDRESS_BASE,CYGARC_REG_CACHE_ADDRESS_BASE); + DEFINE(CYGARC_REG_CACHE_ADDRESS_TOP,CYGARC_REG_CACHE_ADDRESS_TOP); + DEFINE(CYGARC_REG_CACHE_ADDRESS_STEP,CYGARC_REG_CACHE_ADDRESS_STEP); + DEFINE(HAL_UCACHE_SIZE, HAL_UCACHE_SIZE); + DEFINE(HAL_UCACHE_WAYS, HAL_UCACHE_WAYS); + DEFINE(HAL_UCACHE_LINE_SIZE, HAL_UCACHE_LINE_SIZE); + +} + +//-------------------------------------------------------------------------- +// EOF var_mk_defs.c diff --git a/packages/hal/sh/sh3/current/src/variant.S b/packages/hal/sh/sh3/current/src/variant.S new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh3/current/src/variant.S @@ -0,0 +1,192 @@ +##========================================================================== +## +## variant.S +## +## SH3 variant 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): jskov +## Contributors: jskov +## Date: 2000-10-30 +## Purpose: SH3 misc assembly code +######DESCRIPTIONEND#### +## +##========================================================================== + +#include +#include + +#include +#include + +#--------------------------------------------------------------------------- +# Cache operations +# These need to be written in assembly to ensure they do not rely on data +# in cachable space (i.e., code must use registers exclusively, not the stack). + +# This macro must be used at the top of each cache function. It ensures +# that the code gets executed from a shadow region where caching is disabled +# (0xA0000000). + .macro GOTO_NONCACHED_SHADOW + mova 10f,r0 + mov.l $MASK,r1 + and r1,r0 + mov.l $BASE,r1 + or r1,r0 + jmp @r0 + nop + .align 2 +10: + .endm + + .globl _cyg_hal_cache_enable +_cyg_hal_cache_enable: + GOTO_NONCACHED_SHADOW + mov #CYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_CE,r2 + mov.l r2,@r1 + nop + rts + nop + + .globl _cyg_hal_cache_disable +_cyg_hal_cache_disable: + GOTO_NONCACHED_SHADOW + mov #CYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_CE,r2 + not r2,r2 + and r2,r0 + mov.l r0,@r1 + nop + rts + nop + + .globl _cyg_hal_cache_invalidate_all +_cyg_hal_cache_invalidate_all: + GOTO_NONCACHED_SHADOW + mov #CYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_CF,r2 + or r2,r0 + mov.l r0,@r1 + nop ! Nothing in the docs suggest we need + nop ! nops here, but without them, the + nop ! CPU crashes. + rts + nop + + .globl _cyg_hal_cache_sync +_cyg_hal_cache_sync: + GOTO_NONCACHED_SHADOW + mov.l $CYGARC_REG_CACHE_ADDRESS_FLUSH,r0 + mov.l $CYGARC_REG_CACHE_ADDRESS_BASE,r1 + mov.l $CYGARC_REG_CACHE_ADDRESS_TOP,r2 + mov.l $CYGARC_REG_CACHE_ADDRESS_STEP,r3 +1: cmp/hi r1,r2 + bf 2f + mov.l r0,@r1 + bra 1b + add r3,r1 ! delay slot! +2: nop + rts + nop + + ! r4 = base + ! r5 = size + .globl _cyg_hal_cache_sync_region +_cyg_hal_cache_sync_region: + GOTO_NONCACHED_SHADOW + mov.l 10f,r0 + and r4,r0 ! array index + mov.l 11f,r1 + add r0,r1 ! base (aligned, A set) + + ! make sure top is aligned to start of _next_ cache line + mov r1,r0 + add r5,r0 ! top (non-aligned) + add #2*HAL_UCACHE_LINE_SIZE-1,r0 + mov.l 13f,r2 + and r0,r2 + + mov.l $CYGARC_REG_CACHE_ADDRESS_STEP,r3 + mov.l 12f,r5 +1: cmp/hi r1,r2 + bf 3f + mov r4,r0 ! create address tag + and r5,r0 + mov.l r0,@r1 ! store tag in array, causing (sync+)invalidate + ! if the tag matches any of the lines + add r3,r4 ! inc address tag + bra 1b + add r3,r1 ! inc array index, delay slot! +3: nop + rts + nop + + .align 2 +10: .long ((HAL_UCACHE_SIZE/HAL_UCACHE_WAYS)-1)&~0xf ! mask +11: .long CYGARC_REG_CACHE_ADDRESS_BASE|CYGARC_REG_CACHE_ADDRESS_ADDRESS +12: .long CYGARC_REG_CACHE_ADDRESS_TAG_Mask +13: .long ~(HAL_UCACHE_LINE_SIZE-1) + + .globl _cyg_hal_cache_write_mode +_cyg_hal_cache_write_mode: + GOTO_NONCACHED_SHADOW + # Mode argument in r4. + # Read current state and mask out the two caching mode bits + mov #CYGARC_REG_CCR,r1 + mov.l @r1,r3 + mov #CYGARC_REG_CCR_CB|CYGARC_REG_CCR_WT,r2 + and r2,r4 + not r2,r2 + and r2,r3 + # Or in the new settings and restore to CCR + or r4,r3 + mov.l r3,@r1 + nop + rts + nop + + .align 2 +$CYGARC_REG_CACHE_ADDRESS_FLUSH: + .long CYGARC_REG_CACHE_ADDRESS_FLUSH +$CYGARC_REG_CACHE_ADDRESS_BASE: + .long CYGARC_REG_CACHE_ADDRESS_BASE +$CYGARC_REG_CACHE_ADDRESS_TOP: + .long CYGARC_REG_CACHE_ADDRESS_TOP +$CYGARC_REG_CACHE_ADDRESS_STEP: + .long CYGARC_REG_CACHE_ADDRESS_STEP + + +$MASK: + .long 0x1fffffff ! mask off top 3 bits +$BASE: + .long 0xa0000000 ! base of non-cachable memory diff --git a/packages/hal/sh/sh4/current/ChangeLog b/packages/hal/sh/sh4/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/ChangeLog @@ -0,0 +1,39 @@ +2000-11-01 Jesper Skov + + * Many changes to bring the variant HAL up to date with the later + SH arch HAL changes. Rewrote caching code to handle the split + cache. + +2000-08-16 Haruki Kashiwaya + + * Set up directory structure. + +2000-04-18 Ryozaburo Suzuki + + * Contributed sources for the CqREEK/SH-4 platform. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/hal/sh/sh4/current/cdl/hal_sh_sh4.cdl b/packages/hal/sh/sh4/current/cdl/hal_sh_sh4.cdl new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/cdl/hal_sh_sh4.cdl @@ -0,0 +1,145 @@ +# ==================================================================== +# +# hal_sh_sh4.cdl +# +# SH4 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): jskov +# Original data: jskov +# Contributors: +# Date: 1999-10-29 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_HAL_SH_SH4 { + display "SH4 architecture" + parent CYGPKG_HAL_SH + hardware + include_dir cyg/hal + define_header hal_sh_sh4.h + description " + The SH4 (SuperH 4) architecture HAL package provides generic + support for this processor architecture. It is also + necessary to select a specific target platform HAL + package." + + compile sh4_scif.c var_misc.c variant.S + + define_proc { + puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H " + } + + # The "-o file" is a workaround for CR100958 - without it the + # output file would end up in the source directory under CygWin. + # n.b. grep does not behave itself under win32 + make -priority 1 { + /include/cyg/hal/sh4_offsets.inc : /src/var_mk_defs.c + $(CC) $(CFLAGS) $(INCLUDE_PATH) -Wp,-MD,sh4_offsets.tmp -o var_mk_defs.tmp -S $< + fgrep .equ var_mk_defs.tmp | sed s/#// > $@ + @echo $@ ": \\" > $(notdir $@).deps + @tail +2 sh4_offsets.tmp >> $(notdir $@).deps + @echo >> $(notdir $@).deps + @rm sh4_offsets.tmp var_mk_defs.tmp + } + + # CPU variant supported + cdl_component CYGPKG_HAL_SH_7750 { + display "SH 7750 microprocessor" + parent CYGPKG_HAL_SH_CPU + implements CYGINT_HAL_SH_VARIANT + default_value 0 + no_define + define -file=system.h CYGPKG_HAL_SH_7750 + description " + The SH4 7750 microprocessor. This is an embedded part that in + addition to the SH4 processor core has built in peripherals + such as memory controllers, DMA controllers, serial ports and + timers/counters." + define_proc { + puts $cdl_system_header "#define CYGBLD_HAL_CPU_MODULES_H " + } + } + + cdl_component CYGHWR_HAL_SH_CLOCK_SETTINGS { + display "SH on-chip generic clock controls" + description " + The various clocks used by the system are controlled by + these options, some of which are derived from platform + settings." + flavor none + no_define + + cdl_option CYGHWR_HAL_SH_TMU_PRESCALE_0 { + display "TMU counter 0 prescaling" + description " + The peripheral clock is driving the counter used for + the real-time clock, prescaled by this factor." + flavor data + legal_values { 4 16 64 256 } + default_value 4 + } + + cdl_option CYGHWR_HAL_SH_PLL1_OUTPUT { + display "The clock output from PLL1" + no_define + flavor data + calculated { CYGHWR_HAL_SH_OOC_XTAL * CYGHWR_HAL_SH_OOC_PLL_1 } + } + + cdl_option CYGHWR_HAL_SH_PROCESSOR_SPEED { + display "Processor clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_PLL1_OUTPUT / CYGHWR_HAL_SH_OOC_DIVIDER_IFC } + description " + The core (CPU, cache and MMU) speed is computed from + the input clock speed and the IFC divider setting." + } + + cdl_option CYGHWR_HAL_SH_BOARD_SPEED { + display "Platform bus clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_PLL1_OUTPUT / CYGHWR_HAL_SH_OOC_DIVIDER_BFC } + description " + The bus speed is computed from + the input clock speed and the BFC divider setting." + } + + cdl_option CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED { + display "Processor on-chip peripheral clock speed (MHz)" + flavor data + calculated { CYGHWR_HAL_SH_PLL1_OUTPUT / CYGHWR_HAL_SH_OOC_DIVIDER_PFC } + description " + The peripheral speed is computed from the input clock + speed and the PFC divider setting." + } + } +} diff --git a/packages/hal/sh/sh4/current/include/mod_7750.h b/packages/hal/sh/sh4/current/include/mod_7750.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_7750.h @@ -0,0 +1,96 @@ +#ifndef CYGONCE_HAL_MOD_77xx_H +#define CYGONCE_HAL_MOD_77xx_H + +//============================================================================= +// +// mod_7750.h +// +// List modules available on CPU +// +//============================================================================= +//####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): jskov +// Contributors:Haruki Kashiwaya +// Date: 2000-08-09 +// Purpose: Define modules (and versions) available on this CPU. +// Usage: Included from +// +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//----------------------------------------------------------------------------- +// Modules provided by the CPU + +#define CYGARC_SH_MOD_CPG 1 +#define CYGARC_SH_MOD_SCIF 1 + + +//----------------------------------------------------------------------------- +// Extra details for Cache Module (CAC) + +//============================================================================= +// Icache +// Cache dimenions +#define CYGARC_SH_MOD_CAC_I_SIZE 8192 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_I_LINE_SIZE 32 // Size of a cache line +#define CYGARC_SH_MOD_CAC_I_WAYS 1 // Associativity of the cache + +// Cache addressing information +// entry: bits 12 - 5 +#define CYGARC_SH_MOD_ICAC_ADDRESS_BASE 0xf0000000 +#define CYGARC_SH_MOD_ICAC_ADDRESS_TOP 0xf0002000 +#define CYGARC_SH_MOD_ICAC_ADDRESS_STEP 0x00000020 +// V : bit 0 +// Writing zero to V forces an invalidate of the line +#define CYGARC_SH_MOD_ICAC_ADDRESS_FLUSH 0x00000000 + + +//============================================================================= +// Dcache +// Cache dimenions +#define CYGARC_SH_MOD_CAC_D_SIZE 16384 // Size of cache in bytes +#define CYGARC_SH_MOD_CAC_D_LINE_SIZE 32 // Size of a cache line +#define CYGARC_SH_MOD_CAC_D_WAYS 1 // Associativity of the cache + +// Cache addressing information +// entry: bits 13 - 5 +#define CYGARC_SH_MOD_DCAC_ADDRESS_BASE 0xf4000000 +#define CYGARC_SH_MOD_DCAC_ADDRESS_TOP 0xf0004000 +#define CYGARC_SH_MOD_DCAC_ADDRESS_STEP 0x00000020 +// U : bit 1 +// V : bit 0 +// Writing zero to both forces a flush of the line if it is dirty. +#define CYGARC_SH_MOD_DCAC_ADDRESS_FLUSH 0x00000000 + +//----------------------------------------------------------------------------- +// Extra details for interrupt handling +#define CYGARC_SH_SOFTWARE_IP_UPDATE + +#endif // CYGONCE_HAL_MOD_77xx_H diff --git a/packages/hal/sh/sh4/current/include/mod_regs_bsc.h b/packages/hal/sh/sh4/current/include/mod_regs_bsc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_bsc.h @@ -0,0 +1,176 @@ +//============================================================================= +// +// mod_regs_bsc.h +// +// BSC (bus state controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Register definitions +#define CYGARC_REG_BCR1 0xFF800000 +#define CYGARC_REG_BCR2 0xFF800004 +#define CYGARC_REG_WCR1 0xFF800008 +#define CYGARC_REG_WCR2 0xFF80000C +#define CYGARC_REG_WCR3 0xFF800010 +#define CYGARC_REG_MCR 0xFF800014 +#define CYGARC_REG_PCR 0xFF800018 +#define CYGARC_REG_RTCSR 0xFF80001C +#define CYGARC_REG_RTCNT 0xFF800020 +#define CYGARC_REG_RTCOR 0xFF800024 +#define CYGARC_REG_RFCR 0xFF800028 + +#define CYGARC_REG_SDMR2 0xFF90008c + +#define CYGARC_REG_SDMR_AREA2_BASE 0xff900000 +#define CYGARC_REG_SDMR_AREA3_BASE 0xff940000 + +#define CYGARC_REG_BCR1_DRAMTP2 0x0010 +#define CYGARC_REG_BCR1_DRAMTP1 0x0008 +#define CYGARC_REG_BCR1_DRAMTP0 0x0004 + +// Bus widths for areas +#define CYGARC_REG_BCR2_A6_8 0x1000 +#define CYGARC_REG_BCR2_A6_16 0x2000 +#define CYGARC_REG_BCR2_A6_32 0x3000 +#define CYGARC_REG_BCR2_A5_8 0x0400 +#define CYGARC_REG_BCR2_A5_16 0x0800 +#define CYGARC_REG_BCR2_A5_32 0x0c00 +#define CYGARC_REG_BCR2_A4_8 0x0100 +#define CYGARC_REG_BCR2_A4_16 0x0200 +#define CYGARC_REG_BCR2_A4_32 0x0300 +#define CYGARC_REG_BCR2_A3_8 0x0040 +#define CYGARC_REG_BCR2_A3_16 0x0080 +#define CYGARC_REG_BCR2_A3_32 0x00c0 +#define CYGARC_REG_BCR2_A2_8 0x0010 +#define CYGARC_REG_BCR2_A2_16 0x0020 +#define CYGARC_REG_BCR2_A2_32 0x0030 + +// Memory type selection and other IO behavior controls +#define CYGARC_REG_BCR1_PULA 0x8000 // Pin A25 to A0 Pull-Up +#define CYGARC_REG_BCR1_PULD 0x4000 // Pin D31 to D0 Pull-Up +#define CYGARC_REG_BCR1_HIZMEM 0x2000 // Hi-Z memory control +#define CYGARC_REG_BCR1_HIZCNT 0x1000 // High-Z Control +#define CYGARC_REG_BCR1_ENDIAN 0x0800 // Endian Flag +#define CYGARC_REG_BCR1_A0_BST_MASK 0x0600 // Area 0 Burst ROM Control +#define CYGARC_REG_BCR1_A0_BST_4 0x0200 +#define CYGARC_REG_BCR1_A0_BST_8 0x0400 +#define CYGARC_REG_BCR1_A0_BST_16 0x0600 +#define CYGARC_REG_BCR1_A5_BST_MASK 0x0180 // Area 5 Burst ROM Control +#define CYGARC_REG_BCR1_A5_BST_4 0x0080 +#define CYGARC_REG_BCR1_A5_BST_8 0x0100 +#define CYGARC_REG_BCR1_A5_BST_16 0x0180 +#define CYGARC_REG_BCR1_A6_BST_MASK 0x0060 // Area 6 Burst ROM Control +#define CYGARC_REG_BCR1_A6_BST_4 0x0020 +#define CYGARC_REG_BCR1_A6_BST_8 0x0040 +#define CYGARC_REG_BCR1_A6_BST_16 0x0060 +#define CYGARC_REG_BCR1_DRAMTP_MASK 0x001c // Area 2, Area 3 Memory Type +#define CYGARC_REG_BCR1_A5PCM 0x0002 // Area 5 Bus Type +#define CYGARC_REG_BCR1_A6PCM 0x0001 // Area 6 Bus Type + +// Intercycle wait states +#define CYGARC_REG_WCR1_WAITSEL 0x8000 // WAIT Sampling Timing Select +#define CYGARC_REG_WCR1_A6I_MASK 0x3000 // Intercycle Idle Specification +#define CYGARC_REG_WCR1_A6I_SHIFT 12 +#define CYGARC_REG_WCR1_A5I_MASK 0x0c00 +#define CYGARC_REG_WCR1_A5I_SHIFT 10 +#define CYGARC_REG_WCR1_A4I_MASK 0x0300 +#define CYGARC_REG_WCR1_A4I_SHIFT 8 +#define CYGARC_REG_WCR1_A3I_MASK 0x00c0 +#define CYGARC_REG_WCR1_A3I_SHIFT 6 +#define CYGARC_REG_WCR1_A2I_MASK 0x0030 +#define CYGARC_REG_WCR1_A2I_SHIFT 4 +#define CYGARC_REG_WCR1_A0I_MASK 0x0003 +#define CYGARC_REG_WCR1_A0I_SHIFT 0 + +#define CYGARC_REG_WCR1_0WS 0 +#define CYGARC_REG_WCR1_1WS 1 +#define CYGARC_REG_WCR1_2WS 2 +#define CYGARC_REG_WCR1_3WS 3 + + +// Wait states +#define CYGARC_REG_WCR2_A6_MASK 0xe000 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A6_SHIFT 13 +#define CYGARC_REG_WCR2_A5_MASK 0x1c00 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A5_SHIFT 10 +#define CYGARC_REG_WCR2_A4_MASK 0x0380 // Wait states +#define CYGARC_REG_WCR2_A4_SHIFT 7 +#define CYGARC_REG_WCR2_A3_MASK 0x0060 // Wait states / CAS latency +#define CYGARC_REG_WCR2_A3_SHIFT 5 +#define CYGARC_REG_WCR2_A2_MASK 0x0018 // Wait states / CAS latency +#define CYGARC_REG_WCR2_A2_SHIFT 3 +#define CYGARC_REG_WCR2_A0_MASK 0x0007 // Wait states + burst pitch +#define CYGARC_REG_WCR2_A0_SHIFT 0 + +#define CYGARC_REG_WCR2_0WS 0 +#define CYGARC_REG_WCR2_1WS 1 +#define CYGARC_REG_WCR2_2WS 2 +#define CYGARC_REG_WCR2_3WS 3 +#define CYGARC_REG_WCR2_4WS 4 +#define CYGARC_REG_WCR2_6WS 5 +#define CYGARC_REG_WCR2_8WS 6 +#define CYGARC_REG_WCR2_10WS 7 + + + +//----------------------------------------------------------------------------- +// Calculate constants needed to drive the proper SDRAM refresh rate. Argument +// is delay between required refresh events in microseconds (us). Should be +// available off the SDRAM spec sheet. +// These should be a part of a fully CDLicized memory controller setup. +#define CYGARC_RTCSR_PRESCALE(_r_) \ +(((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(4*1000000))<256) ? 4 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(16*1000000))<256) ? 16 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(64*1000000))<256) ? 64 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(256*1000000))<256) ? 256 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(1024*1000000))<256) ? 1024 : \ + ((CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(2048*1000000))<256) ? 2048 : 4096) + +// These two macros provide the static values we need to stuff into the +// registers. +#define CYGARC_RTCSR_CKSx(_r_) \ + (( 4 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x08 : \ + ( 16 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x10 : \ + ( 64 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x18 : \ + ( 256 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x20 : \ + (1024 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x28 : \ + (2048 == CYGARC_RTCSR_PRESCALE(_r_)) ? 0x30 : 0x38 ) + +#define CYGARC_RTCSR_N(_r_) \ + (CYGHWR_HAL_SH_BOARD_SPEED*(_r_)/(CYGARC_RTCSR_PRESCALE(_r_)*1000000)) + + diff --git a/packages/hal/sh/sh4/current/include/mod_regs_cac.h b/packages/hal/sh/sh4/current/include/mod_regs_cac.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_cac.h @@ -0,0 +1,61 @@ +//============================================================================= +// +// mod_regs_cac.h +// +// CAC (cache) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +// Besides the below, cache sizes are defined in the CPU variant module +// headers (mod_77xx.h). + +//-------------------------------------------------------------------------- +// Cache registers +#define CYGARC_REG_CCR 0xFF00001C + +#define CYGARC_REG_CCR_IIX 0x00008000 // IC index enable +#define CYGARC_REG_CCR_ICI 0x00000800 // IC invalidation +#define CYGARC_REG_CCR_ICE 0x00000100 // IC Enable +#define CYGARC_REG_CCR_OIX 0x00000080 // OC index enable +#define CYGARC_REG_CCR_ORA 0x00000020 // OC RAM enable +#define CYGARC_REG_CCR_OCI 0x00000008 // OC Invalidation +#define CYGARC_REG_CCR_CB 0x00000004 // Copy-Back enable +#define CYGARC_REG_CCR_WT 0x00000002 // Write Through enable +#define CYGARC_REG_CCR_OCE 0x00000001 // OC Enable + +#define CYGARC_REG_CCR_CE 0x00000101 // IC, OC Enable +#define CYGARC_REG_CCR_CF 0x00000808 // IC, OC Invalidation + diff --git a/packages/hal/sh/sh4/current/include/mod_regs_cpg.h b/packages/hal/sh/sh4/current/include/mod_regs_cpg.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_cpg.h @@ -0,0 +1,154 @@ +//============================================================================= +// +// mod_regs_cpg.h +// +// CPG (clock pulse generator) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Oscillator control registers +#define CYGARC_REG_FRQCR 0xFFC00000 +#define CYGARC_REG_STBCR 0xFFC00004 +#define CYGARC_REG_WTCNT 0xFFC00008 // read 8bit, write 16bit +#define CYGARC_REG_WTCSR 0xFFC0000C // read 8bit, write 16bit +#define CYGARC_REG_STBCR2 0xFFC00010 + +#define CYGARC_REG_WTCNT_WRITE 0x5a00 // top 8bit value for write + +#define CYGARC_REG_WTCSR_WRITE 0xa500 // top 8bit value for write +#define CYGARC_REG_WTCSR_TME 0x80 // timer enable +#define CYGARC_REG_WTCSR_WT_IT 0x40 // watchdog(1)/interval(0) +#define CYGARC_REG_WTCSR_RSTS 0x20 // manual(1)/poweron(0) +#define CYGARC_REG_WTCSR_WOVF 0x10 // watchdog overflow +#define CYGARC_REG_WTCSR_IOVF 0x08 // interval overflow +#define CYGARC_REG_WTCSR_CKS2 0x04 // clock select 2 +#define CYGARC_REG_WTCSR_CKS1 0x02 // clock select 1 +#define CYGARC_REG_WTCSR_CKS0 0x01 // clock select 0 +#define CYGARC_REG_WTCSR_CKSx_MASK 0x07 // clock select mask +// This is the period (in us) between watchdog reset and overflow. +// Note: We use max timeout delay for now. +#define CYGARC_REG_WTCSR_CKSx_SETTING 0x07 // max delay + +#define CYGARC_REG_WTCSR_PERIOD ((1000000000/(CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/4096))*256) + +// Translate various CDL clock configurations to register equivalents +// for the various CPG versions +#if (CYGARC_SH_MOD_CPG == 1) // ---------------------------- V1 + +// PLL1 +#if (CYGHWR_HAL_SH_OOC_PLL_1 == 0) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0000 +#elif (CYGHWR_HAL_SH_OOC_PLL_1 == 6) +# define CYGARC_REG_FRQCR_INIT_PLL1 0x0400 +#else +# error "Unsupported PLL1 setting" +#endif + +// PLL2 +#if (CYGHWR_HAL_SH_OOC_PLL_2 == 0) +# define CYGARC_REG_FRQCR_INIT_PLL2 0x0000 +#elif (CYGHWR_HAL_SH_OOC_PLL_2 == 1) +# define CYGARC_REG_FRQCR_INIT_PLL2 0x0200 +#else +# error "Unsupported PLL2 setting" +#endif + +// Divider IFC +#if (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x0040 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 3) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x0080 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x00c0 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 6) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x0100 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_IFC == 8) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_IFC 0x0140 +#else +# error "Unsupported Divider IFC setting" +#endif + +// Divider BFC +#if (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 1) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0008 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 3) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0010 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0018 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 6) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0020 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_BFC == 8) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_BFC 0x0028 +#else +# error "Unsupported Divider BFC setting" +#endif + +// Divider PFC +#if (CYGHWR_HAL_SH_OOC_DIVIDER_PFC == 2) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_PFC 0x0000 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_PFC == 3) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_PFC 0x0001 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_PFC == 4) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_PFC 0x0002 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_PFC == 6) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_PFC 0x0003 +#elif (CYGHWR_HAL_SH_OOC_DIVIDER_PFC == 8) +# define CYGARC_REG_FRQCR_INIT_DIVIDER_PFC 0x0004 +#else +# error "Unsupported Divider PFC setting" +#endif + + +// CKOEN +#ifdef CYGHWR_HAL_SH_OOC_CKIO +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0800 +#else +# define CYGARC_REG_FRQCR_INIT_CKOEN 0x0000 +#endif + +#else + +# error "Unsupported CPG version" + +#endif + +// Init value +#define CYGARC_REG_FRQCR_INIT (CYGARC_REG_FRQCR_INIT_PLL1|CYGARC_REG_FRQCR_INIT_PLL2|CYGARC_REG_FRQCR_INIT_DIVIDER_IFC|CYGARC_REG_FRQCR_INIT_DIVIDER_BFC|CYGARC_REG_FRQCR_INIT_DIVIDER_PFC|CYGARC_REG_FRQCR_INIT_CKOEN) diff --git a/packages/hal/sh/sh4/current/include/mod_regs_dma.h b/packages/hal/sh/sh4/current/include/mod_regs_dma.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_dma.h @@ -0,0 +1,111 @@ +//============================================================================= +// +// mod_regs_dma.h +// +// DMA (direct memory access) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// DMA Controller registers + +#define CYGARC_REG_SAR0 0xa4000020 +#define CYGARC_REG_DAR0 0xa4000024 +#define CYGARC_REG_DMATCR0 0xa4000028 +#define CYGARC_REG_CHCR0 0xa400002c +#define CYGARC_REG_SAR1 0xa4000030 +#define CYGARC_REG_DAR1 0xa4000034 +#define CYGARC_REG_DMATCR1 0xa4000038 +#define CYGARC_REG_CHCR1 0xa400003c +#define CYGARC_REG_SAR2 0xa4000040 +#define CYGARC_REG_DAR2 0xa4000044 +#define CYGARC_REG_DMATCR2 0xa4000048 +#define CYGARC_REG_CHCR2 0xa400004c +#define CYGARC_REG_SAR3 0xa4000050 +#define CYGARC_REG_DAR3 0xa4000054 +#define CYGARC_REG_DMATCR3 0xa4000058 +#define CYGARC_REG_CHCR3 0xa400005c +#define CYGARC_REG_DMAOR 0xa4000060 + +// Offsets from base register +#define CYGARC_REG_SAR 0x00 +#define CYGARC_REG_DAR 0x04 +#define CYGARC_REG_DMATCR 0x08 +#define CYGARC_REG_CHCR 0x0c + + +// DMA Channel Control Register. If there's a digit suffix to CHCR the flag +// is only valid in the listed channels. +#define CYGARC_REG_CHCR3_DI 0x00100000 // direct/indirect selection +#define CYGARC_REG_CHCR2_RO 0x00080000 // source address reload +#define CYGARC_REG_CHCR01_RL 0x00040000 // request check level +#define CYGARC_REG_CHCR01_AM 0x00020000 // acknowledge mode +#define CYGARC_REG_CHCR01_AL 0x00010000 // acknowledge level +#define CYGARC_REG_CHCR_DM1 0x00008000 // destination address mode +#define CYGARC_REG_CHCR_DM0 0x00004000 +#define CYGARC_REG_CHCR_SM1 0x00002000 // source address mode +#define CYGARC_REG_CHCR_SM0 0x00001000 +#define CYGARC_REG_CHCR_RS3 0x00000800 // resource select +#define CYGARC_REG_CHCR_RS2 0x00000400 +#define CYGARC_REG_CHCR_RS1 0x00000200 +#define CYGARC_REG_CHCR_RS0 0x00000100 +#define CYGARC_REG_CHCR01_DS 0x00000040 // DREQ select +#define CYGARC_REG_CHCR_TM 0x00000020 // transmit mode +#define CYGARC_REG_CHCR_TS1 0x00000010 // transmit size +#define CYGARC_REG_CHCR_TS0 0x00000008 +#define CYGARC_REG_CHCR_IE 0x00000004 // interrupt enable +#define CYGARC_REG_CHCR_TE 0x00000002 // transfer end +#define CYGARC_REG_CHCR_DE 0x00000001 // DMAC enable + +// Resource select options +#define CYGARC_REG_CHCR_RS_EXT_DUAL 0x00000000 +#define CYGARC_REG_CHCR_RS_EXT_EX_DAC 0x00000100 +#define CYGARC_REG_CHCR_RS_EXT_DAC_EX 0x00000300 +#define CYGARC_REG_CHCR_RS_AUTO 0x00000400 +#define CYGARC_REG_CHCR_RS_IRDA_TX 0x00000a00 +#define CYGARC_REG_CHCR_RS_IRDA_RX 0x00000b00 +#define CYGARC_REG_CHCR_RS_SCIF_TX 0x00000c00 +#define CYGARC_REG_CHCR_RS_SCIF_RX 0x00000d00 +#define CYGARC_REG_CHCR_RS_AD 0x00000e00 +#define CYGARC_REG_CHCR_RS_CMT 0x00000f00 + + +// DMA Operation Register +#define CYGARC_REG_DMAOR_PR1 0x0200 // priority level +#define CYGARC_REG_DMAOR_PR0 0x0100 +#define CYGARC_REG_DMAOR_AE 0x0004 // address error flag +#define CYGARC_REG_DMAOR_NMIF 0x0002 // NMI flag +#define CYGARC_REG_DMAOR_DME 0x0001 // DMA master enable diff --git a/packages/hal/sh/sh4/current/include/mod_regs_intc.h b/packages/hal/sh/sh4/current/include/mod_regs_intc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_intc.h @@ -0,0 +1,76 @@ +//============================================================================= +// +// mod_regs_intc.h +// +// INTC (interrupt controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// Interrupt registers, module type 1 +#define CYGARC_REG_EXCEVT 0xFF000024 +#define CYGARC_REG_INTEVT 0xFF000028 + +#define CYGARC_REG_ICR 0xFFD00000 +#define CYGARC_REG_IPRA 0xFFD00004 +#define CYGARC_REG_IPRB 0xFFD00008 +#define CYGARC_REG_IPRC 0xFFD0000C + +#define CYGARC_REG_IPRA_TMU0_MASK 0xf000 +#define CYGARC_REG_IPRA_TMU0_PRI1 0x1000 +#define CYGARC_REG_IPRA_TMU1_MASK 0x0f00 +#define CYGARC_REG_IPRA_TMU1_PRI1 0x0100 +#define CYGARC_REG_IPRA_TMU2_MASK 0x00f0 +#define CYGARC_REG_IPRA_TMU2_PRI1 0x0010 +#define CYGARC_REG_IPRA_RTC_MASK 0x000f +#define CYGARC_REG_IPRA_RTC_PRI1 0x0001 + +#define CYGARC_REG_IPRB_WDT_MASK 0xf000 +#define CYGARC_REG_IPRB_WDT_PRI1 0x1000 +#define CYGARC_REG_IPRB_REF_MASK 0x0f00 +#define CYGARC_REG_IPRB_REF_PRI1 0x0100 +#define CYGARC_REG_IPRB_SCI_MASK 0x00f0 +#define CYGARC_REG_IPRB_SCI_PRI1 0x0010 + +#define CYGARC_REG_IPRC_GPIO_MASK 0xF000 +#define CYGARC_REG_IPRC_GPIO_PRI1 0x1000 +#define CYGARC_REG_IPRC_DMAC_MASK 0x0F00 +#define CYGARC_REG_IPRC_DMAC_PRI1 0x0100 +#define CYGARC_REG_IPRC_SCIF_MASK 0x00F0 +#define CYGARC_REG_IPRC_SCIF_PRI1 0x0010 +#define CYGARC_REG_IPRC_HUDI_MASK 0x000F +#define CYGARC_REG_IPRC_HUDI_PRI1 0x0001 + diff --git a/packages/hal/sh/sh4/current/include/mod_regs_mmu.h b/packages/hal/sh/sh4/current/include/mod_regs_mmu.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_mmu.h @@ -0,0 +1,52 @@ +//============================================================================= +// +// mod_regs_mmu.h +// +// MMU Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// MMU control registers +#define CYGARC_REG_MMUCR 0xFF000010 + +#define CYGARC_REG_MMUCR_LRUI_MASK 0xFC000000 +#define CYGARC_REG_MMUCR_URB_MASK 0x00FC0000 +#define CYGARC_REG_MMUCR_URC_MASK 0x0000FC00 +#define CYGARC_REG_MMUCR_SQMD 0x00000200 +#define CYGARC_REG_MMUCR_SV 0x00000100 +#define CYGARC_REG_MMUCR_TI 0x00000004 +#define CYGARC_REG_MMUCR_AT 0x00000001 diff --git a/packages/hal/sh/sh4/current/include/mod_regs_pfc.h b/packages/hal/sh/sh4/current/include/mod_regs_pfc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_pfc.h @@ -0,0 +1,100 @@ +//============================================================================= +// +// mod_regs_pfc.h +// +// PFC (pin function controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#define CYGARC_REG_PACR 0xa4000100 // port A control +#define CYGARC_REG_PBCR 0xa4000102 // port B control +#define CYGARC_REG_PCCR 0xa4000104 // port C control +#define CYGARC_REG_PDCR 0xa4000106 // port D control +#define CYGARC_REG_PECR 0xa4000108 // port E control +#define CYGARC_REG_PFCR 0xa400010a // port F control +#define CYGARC_REG_PGCR 0xa400010c // port G control +#define CYGARC_REG_PHCR 0xa400010e // port H control +#define CYGARC_REG_PJCR 0xa4000110 // port J control +#define CYGARC_REG_PKCR 0xa4000112 // port K control +#define CYGARC_REG_PLCR 0xa4000114 // port L control +#define CYGARC_REG_SCPCR 0xa4000116 // SC port control + +#define CYGARC_REG_PADR 0xa4000120 // port A data +#define CYGARC_REG_PBDR 0xa4000122 // port B data +#define CYGARC_REG_PCDR 0xa4000124 // port C data +#define CYGARC_REG_PDDR 0xa4000126 // port D data +#define CYGARC_REG_PEDR 0xa4000128 // port E data +#define CYGARC_REG_PFDR 0xa400012a // port F data +#define CYGARC_REG_PGDR 0xa400012c // port G data +#define CYGARC_REG_PHDR 0xa400012e // port H data +#define CYGARC_REG_PJDR 0xa4000130 // port J data +#define CYGARC_REG_PKDR 0xa4000132 // port K data +#define CYGARC_REG_PLDR 0xa4000134 // port L data +#define CYGARC_REG_SCPDR 0xa4000136 // SC port data + + +// Port C +#define CYGARC_REG_PCCR_PC7_MASK 0xc000 +#define CYGARC_REG_PCCR_PC7_shift 14 +#define CYGARC_REG_PCCR_PC6_MASK 0x3000 +#define CYGARC_REG_PCCR_PC6_shift 12 +#define CYGARC_REG_PCCR_PC5_MASK 0x0c00 +#define CYGARC_REG_PCCR_PC5_shift 10 +#define CYGARC_REG_PCCR_PC4_MASK 0x0300 +#define CYGARC_REG_PCCR_PC4_shift 8 +#define CYGARC_REG_PCCR_PC3_MASK 0x00c0 +#define CYGARC_REG_PCCR_PC3_shift 6 +#define CYGARC_REG_PCCR_PC2_MASK 0x0030 +#define CYGARC_REG_PCCR_PC2_shift 4 +#define CYGARC_REG_PCCR_PC1_MASK 0x000c +#define CYGARC_REG_PCCR_PC1_shift 2 +#define CYGARC_REG_PCCR_PC0_MASK 0x0003 +#define CYGARC_REG_PCCR_PC0_shift 0 + +#define CYGARC_REG_PCCR_MD_OTHER 0x0 +#define CYGARC_REG_PCCR_MD_OUT 0x1 +#define CYGARC_REG_PCCR_MD_IN_ON 0x2 +#define CYGARC_REG_PCCR_MD_IN_OFF 0x3 + +#define CYGARC_REG_PCDR_PC7DT 0x80 +#define CYGARC_REG_PCDR_PC6DT 0x40 +#define CYGARC_REG_PCDR_PC5DT 0x20 +#define CYGARC_REG_PCDR_PC4DT 0x10 +#define CYGARC_REG_PCDR_PC3DT 0x08 +#define CYGARC_REG_PCDR_PC2DT 0x04 +#define CYGARC_REG_PCDR_PC1DT 0x02 +#define CYGARC_REG_PCDR_PC0DT 0x01 + diff --git a/packages/hal/sh/sh4/current/include/mod_regs_rtc.h b/packages/hal/sh/sh4/current/include/mod_regs_rtc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_rtc.h @@ -0,0 +1,77 @@ +//============================================================================= +// +// mod_regs_rtc.h +// +// RTC (real time clock) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// RealTime Clock + +#define CYGARC_REG_RC64CNT 0xfffffec0 +#define CYGARC_REG_RSECCNT 0xfffffec2 +#define CYGARC_REG_RMINCNT 0xfffffec4 +#define CYGARC_REG_RHRCNT 0xfffffec6 +#define CYGARC_REG_RWKCNT 0xfffffec8 +#define CYGARC_REG_RDAYCNT 0xfffffeca +#define CYGARC_REG_RMONCNT 0xfffffecc +#define CYGARC_REG_RYRCNT 0xfffffece +#define CYGARC_REG_RSECAR 0xfffffed0 +#define CYGARC_REG_RMINAR 0xfffffed2 +#define CYGARC_REG_RHRAR 0xfffffed4 +#define CYGARC_REG_RWKAR 0xfffffed6 +#define CYGARC_REG_RDAYAR 0xfffffed8 +#define CYGARC_REG_RMONAR 0xfffffeda +#define CYGARC_REG_RCR1 0xfffffedc +#define CYGARC_REG_RCR2 0xfffffede + + +#define CYGARC_REG_RCR1_CF 0x80 // carry flag +#define CYGARC_REG_RCR1_CIE 0x10 // carry interrupt enable +#define CYGARC_REG_RCR1_AIE 0x08 // alarm interrupt enable +#define CYGARC_REG_RCR1_AF 0x01 // alarm flag + +#define CYGARC_REG_RCR2_PEF 0x80 // periodic interrupt flag +#define CYGARC_REG_RCR2_PES2 0x40 // periodic interrupt setting +#define CYGARC_REG_RCR2_PES1 0x20 +#define CYGARC_REG_RCR2_PES0 0x10 +#define CYGARC_REG_RCR2_RTCEN 0x08 // RTC enable +#define CYGARC_REG_RCR2_ADJ 0x04 // second adjustment +#define CYGARC_REG_RCR2_RESET 0x02 // reset +#define CYGARC_REG_RCR2_START 0x01 // start + + diff --git a/packages/hal/sh/sh4/current/include/mod_regs_ser.h b/packages/hal/sh/sh4/current/include/mod_regs_ser.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_ser.h @@ -0,0 +1,277 @@ +//============================================================================= +// +// mod_regs_ser.h +// +// SCI, SCIF, and IRDA (serial) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// Note: All three serial module definitions kept in the same file +// since they share some of the information. +//####DESCRIPTIONEND#### +// +//============================================================================= + +//++++++ Module SCI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//-------------------------------------------------------------------------- +// Serial registers. All 8 bit registers. +#define CYGARC_REG_SCSMR1 0xFFE00000 // serial mode register +#define CYGARC_REG_SCBRR1 0xFFE00004 // bit rate register +#define CYGARC_REG_SCSCR1 0xFFE00008 // serial control register +#define CYGARC_REG_SCTDR1 0xFFE0000C // transmit data register +#define CYGARC_REG_SCSSR1 0xFFE00010 // serial status register +#define CYGARC_REG_SCRDR1 0xFFE00014 // receive data register +#define CYGARC_REG_SCRCMR1 0xFFE00018 +#define CYGARC_REG_SCSPTR1 0xFFE0001C // serial port register + +// Serial Mode Register +#define CYGARC_REG_SCSMR1_CA 0x80 // communication mode +#define CYGARC_REG_SCSMR1_CHR 0x40 // character length (7 if set) +#define CYGARC_REG_SCSMR1_PE 0x20 // parity enable +#define CYGARC_REG_SCSMR1_OE 0x10 // parity mode +#define CYGARC_REG_SCSMR1_STOP 0x08 // stop bit length +#define CYGARC_REG_SCSMR1_MP 0x04 // multiprocessor mode +#define CYGARC_REG_SCSMR1_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR1_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR1_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR1_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR1_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR1_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR1_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR1_MPIE 0x08 // multiprocessor interrupt enable +#define CYGARC_REG_SCSCR1_TEIE 0x04 // transmit-end interrupt enable +#define CYGARC_REG_SCSCR1_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR1_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR1_TDRE 0x80 // transmit data register empty +#define CYGARC_REG_SCSSR1_RDRF 0x40 // receive data register full +#define CYGARC_REG_SCSSR1_ORER 0x20 // overrun error +#define CYGARC_REG_SCSSR1_FER 0x10 // framing error +#define CYGARC_REG_SCSSR1_PER 0x08 // parity error +#define CYGARC_REG_SCSSR1_TEND 0x04 // transmit end +#define CYGARC_REG_SCSSR1_MPB 0x02 // multiprocessor bit +#define CYGARC_REG_SCSSR1_MPBT 0x01 // multiprocessor bit transfer + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR1_CLEARMASK 0xf8 + + +// Baud rate values calculation, depending on peripheral clock (Pf) +// n is CKS setting (0-3) +// N = (Pf/(64*2^(2n-1)*B))-1 +// With CYGARC_SCBRR_CKSx providing the values 1, 4, 16, 64 we get +// N = (Pf/(32*_CKS*B))-1 +// +// The CYGARC_SCBRR_OPTIMAL_CKS macro should compute the minimal CKS +// setting for the given baud rate and peripheral clock. +// +// The error of the CKS+count value can be computed by: +// E(%) = ((Pf/((N+1)*B*(64^(n-1)))-1)*100 +// +#define CYGARC_SCBRR_PRESCALE(_b_) \ +((((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/1/(_b_))-1)<256) ? 1 : \ + (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/4/(_b_))-1)<256) ? 4 : \ + (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/16/(_b_))-1)<256) ? 16 : 64) + +// These two macros provide the static values we need to stuff into the +// registers. +#define CYGARC_SCBRR_CKSx(_b_) \ + ((1 == CYGARC_SCBRR_PRESCALE(_b_)) ? 0 : \ + (4 == CYGARC_SCBRR_PRESCALE(_b_)) ? 1 : \ + (16 == CYGARC_SCBRR_PRESCALE(_b_)) ? 2 : 3) +#define CYGARC_SCBRR_N(_b_) \ + (((_b_) < 4800) ? 0 : \ + ((_b_) > 115200) ? 0 : \ + ((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1)) + + +//++++++ Module IRDA +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#ifdef CYGARC_SH_MOD_IRDA + +//-------------------------------------------------------------------------- +// IrDA (infrared data association). Can also act as regular serial w FIFO + +#define CYGARC_REG_SCSMR1 0xFFE00000 // serial mode register +#define CYGARC_REG_SCBRR1 0xFFE00004 // bit rate register +#define CYGARC_REG_SCSCR1 0xFFE00008 // serial control register +#define CYGARC_REG_SCTDR1 0xFFE0000C // transmit data register +#define CYGARC_REG_SCSSR1 0xFFE00010 // serial status register +#define CYGARC_REG_SCRDR1 0xFFE00014 // receive data register +#define CYGARC_REG_SCRCMR1 0xFFE00018 +#define CYGARC_REG_SCSPTR1 0xFFE0001C // serial port register + +// Serial Mode Register +#define CYGARC_REG_SCSMR1_IRMOD 0x80 // IrDA Mode +#define CYGARC_REG_SCSMR1_ICK_MASK 0x78 // IR pulse width +#define CYGARC_REG_SCSMR1_PSEL 0x04 // IR pulse selector(?) +#define CYGARC_REG_SCSMR1_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR1_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR1_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR1_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR1_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR1_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR1_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR1_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR1_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR1_PER_MASK 0xf000 // number of parity errors +#define CYGARC_REG_SCSSR1_PER_shift 12 +#define CYGARC_REG_SCSSR1_FER_MASK 0x0f00 // number of framing errors +#define CYGARC_REG_SCSSR1_FER_shift 8 +#define CYGARC_REG_SCSSR1_ER 0x0080 // receive error +#define CYGARC_REG_SCSSR1_TEND 0x0040 // transmit end +#define CYGARC_REG_SCSSR1_TDFE 0x0020 // transmit fifo data empty +#define CYGARC_REG_SCSSR1_BRK 0x0010 // break detection +#define CYGARC_REG_SCSSR1_FER 0x0008 // framing error +#define CYGARC_REG_SCSSR1_PER 0x0004 // parity error +#define CYGARC_REG_SCSSR1_RDF 0x0002 // receive fifo data full +#define CYGARC_REG_SCSSR1_DR 0x0001 // receive data ready + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR2_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR1_CLEARMASK 0xf3 + +// Serial FIFO Control Register +#define CYGARC_REG_SCFCR1_RTRG_MASK 0xc0 // receive fifo data trigger +#define CYGARC_REG_SCFCR1_RTRG_1 0x00 // trigger on 1 char +#define CYGARC_REG_SCFCR1_RTRG_4 0x40 // trigger on 4 chars +#define CYGARC_REG_SCFCR1_RTRG_8 0x80 // trigger on 8 chars +#define CYGARC_REG_SCFCR1_RTRG_14 0xc0 // trigger on 14 chars + +#define CYGARC_REG_SCFCR1_TTRG_MASK 0x30 // transmit fifo data trigger +#define CYGARC_REG_SCFCR1_TTRG_8 0x00 // trigger on 8 chars +#define CYGARC_REG_SCFCR1_TTRG_4 0x10 // trigger on 4 chars +#define CYGARC_REG_SCFCR1_TTRG_2 0x20 // trigger on 2 chars +#define CYGARC_REG_SCFCR1_TTRG_1 0x30 // trigger on 1 char + +#define CYGARC_REG_SCFCR1_MCE 0x08 // modem control enable +#define CYGARC_REG_SCFCR1_TFRST 0x04 // transmit fifo reset +#define CYGARC_REG_SCFCR1_RFRST 0x02 // receive fifo reset +#define CYGARC_REG_SCFCR1_LOOP 0x01 // loop back test + + +// Serial FIFO Data Count Set Register +#define CYGARC_REG_SCFDR1_RCOUNT_MASK 0x001f // number of chars in r fifo +#define CYGARC_REG_SCFDR1_RCOUNT_shift 0 +#define CYGARC_REG_SCFDR1_TCOUNT_MASK 0x1f00 // number of chars in t fifo +#define CYGARC_REG_SCFDR1_TCOUNT_shift 8 + +#endif // CYGARC_SH_MOD_IRDA + +//++++++ Module SCIF +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#ifdef CYGARC_SH_MOD_SCIF + +//-------------------------------------------------------------------------- +// Serial w FIFO registers + +#define CYGARC_REG_SCSMR2 0xffe80000 // Serial mode +#define CYGARC_REG_SCBRR2 0xffe80004 // Bit rate +#define CYGARC_REG_SCSCR2 0xffe80008 // Serial control +#define CYGARC_REG_SCFTDR2 0xffe8000c // Transmit FIFO data +#define CYGARC_REG_SCFSR2 0xffe80010 // Serial status +#define CYGARC_REG_SCFRDR2 0xffe80014 // Receive data FIFO +#define CYGARC_REG_SCFCR2 0xffe80018 // FIFO control register +#define CYGARC_REG_SCFDR2 0xffe8001c // FIFO data count set +#define CYGARC_REG_SCSPTR2 0xffe80020 // serial port register +#define CYGARC_REG_SCLSR2 0xffe80024 // line status register + +// Serial Mode Register +#define CYGARC_REG_SCSMR2_CHR 0x40 // character length (7 if set) +#define CYGARC_REG_SCSMR2_PE 0x20 // parity enable +#define CYGARC_REG_SCSMR2_OE 0x10 // parity mode +#define CYGARC_REG_SCSMR2_STOP 0x08 // stop bit length +#define CYGARC_REG_SCSMR2_CKS1 0x02 // clock select 1 +#define CYGARC_REG_SCSMR2_CKS0 0x01 // clock select 0 +#define CYGARC_REG_SCSMR2_CKSx_MASK 0x03 // mask + +// Serial Control Register +#define CYGARC_REG_SCSCR2_TIE 0x80 // transmit interrupt enable +#define CYGARC_REG_SCSCR2_RIE 0x40 // receive interrupt enable +#define CYGARC_REG_SCSCR2_TE 0x20 // transmit enable +#define CYGARC_REG_SCSCR2_RE 0x10 // receive enable +#define CYGARC_REG_SCSCR2_CKE1 0x02 // clock enable 1 +#define CYGARC_REG_SCSCR2_CKE0 0x01 // clock enable 0 + +// Serial Status Register +#define CYGARC_REG_SCSSR2_PER_MASK 0xf000 // number of parity errors +#define CYGARC_REG_SCSSR2_PER_shift 12 +#define CYGARC_REG_SCSSR2_FER_MASK 0x0f00 // number of framing errors +#define CYGARC_REG_SCSSR2_FER_shift 8 +#define CYGARC_REG_SCSSR2_ER 0x0080 // receive error +#define CYGARC_REG_SCSSR2_TEND 0x0040 // transmit end +#define CYGARC_REG_SCSSR2_TDFE 0x0020 // transmit fifo data empty +#define CYGARC_REG_SCSSR2_BRK 0x0010 // break detection +#define CYGARC_REG_SCSSR2_FER 0x0008 // framing error +#define CYGARC_REG_SCSSR2_PER 0x0004 // parity error +#define CYGARC_REG_SCSSR2_RDF 0x0002 // receive fifo data full +#define CYGARC_REG_SCSSR2_DR 0x0001 // receive data ready + +// When clearing the status register, always write the value: +// CYGARC_REG_SCSSR2_CLEARMASK & ~bit +// to prevent other bits than the one of interest to be cleared. +#define CYGARC_REG_SCSSR2_CLEARMASK 0xf3 + +// Serial FIFO Control Register +#define CYGARC_REG_SCFCR2_RTRG_MASK 0xc0 // receive fifo data trigger +#define CYGARC_REG_SCFCR2_RTRG_1 0x00 // trigger on 1 char +#define CYGARC_REG_SCFCR2_RTRG_4 0x40 // trigger on 4 chars +#define CYGARC_REG_SCFCR2_RTRG_8 0x80 // trigger on 8 chars +#define CYGARC_REG_SCFCR2_RTRG_14 0xc0 // trigger on 14 chars + +#define CYGARC_REG_SCFCR2_TTRG_MASK 0x30 // transmit fifo data trigger +#define CYGARC_REG_SCFCR2_TTRG_8 0x00 // trigger on 8 chars +#define CYGARC_REG_SCFCR2_TTRG_4 0x10 // trigger on 4 chars +#define CYGARC_REG_SCFCR2_TTRG_2 0x20 // trigger on 2 chars +#define CYGARC_REG_SCFCR2_TTRG_1 0x30 // trigger on 1 char + +#define CYGARC_REG_SCFCR2_MCE 0x08 // modem control enable +#define CYGARC_REG_SCFCR2_TFRST 0x04 // transmit fifo reset +#define CYGARC_REG_SCFCR2_RFRST 0x02 // receive fifo reset +#define CYGARC_REG_SCFCR2_LOOP 0x01 // loop back test + + +// Serial FIFO Data Count Set Register +#define CYGARC_REG_SCFDR2_RCOUNT_MASK 0x001f // number of chars in r fifo +#define CYGARC_REG_SCFDR2_RCOUNT_shift 0 +#define CYGARC_REG_SCFDR2_TCOUNT_MASK 0x1f00 // number of chars in t fifo +#define CYGARC_REG_SCFDR2_TCOUNT_shift 8 + +#endif // CYGARC_SH_MOD_SCIF diff --git a/packages/hal/sh/sh4/current/include/mod_regs_tmu.h b/packages/hal/sh/sh4/current/include/mod_regs_tmu.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_tmu.h @@ -0,0 +1,79 @@ +//============================================================================= +// +// mod_regs_tmu.h +// +// TMU (timer unit) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// TMU registers +#define CYGARC_REG_TOCR 0xFFD80000 // 8 bit +#define CYGARC_REG_TSTR 0xFFD80004 // 8 bit +#define CYGARC_REG_TCOR0 0xFFD80008 // 32 bit +#define CYGARC_REG_TCNT0 0xFFD8000C // 32 bit +#define CYGARC_REG_TCR0 0xFFD80010 // 16 bit +#define CYGARC_REG_TCOR1 0xFFD80014 // 32 bit +#define CYGARC_REG_TCNT1 0xFFD80018 // 32 bit +#define CYGARC_REG_TCR1 0xFFD8001C // 16 bit +#define CYGARC_REG_TCOR2 0xFFD80020 // 32 bit +#define CYGARC_REG_TCNT2 0xFFD80024 // 32 bit +#define CYGARC_REG_TCR2 0xFFD80028 // 16 bit +#define CYGARC_REG_TCPR2 0xFFD8002C // 32 bit + +// TSTR +#define CYGARC_REG_TSTR_STR0 0x0001 +#define CYGARC_REG_TSTR_STR1 0x0002 +#define CYGARC_REG_TSTR_STR2 0x0004 + +// TCR0/1/2 +#define CYGARC_REG_TCR_TPSC0 0x0001 +#define CYGARC_REG_TCR_TPSC1 0x0002 +#define CYGARC_REG_TCR_TPSC2 0x0004 +#define CYGARC_REG_TCR_CKEG0 0x0008 +#define CYGARC_REG_TCR_CKEG1 0x0010 +#define CYGARC_REG_TCR_UNIE 0x0020 +#define CYGARC_REG_TCR_UNF 0x0100 + +#define CYGARC_REG_TCR_TPSC_4 (0) +#define CYGARC_REG_TCR_TPSC_16 (CYGARC_REG_TCR_TPSC0) +#define CYGARC_REG_TCR_TPSC_64 (CYGARC_REG_TCR_TPSC1) +#define CYGARC_REG_TCR_TPSC_256 (CYGARC_REG_TCR_TPSC0|CYGARC_REG_TCR_TPSC1) + +// TCR2 additional bits +#define CYGARC_REG_TCR_ICPE0 0x0040 +#define CYGARC_REG_TCR_ICPE1 0x0080 +#define CYGARC_REG_TCR_ICPF 0x0200 diff --git a/packages/hal/sh/sh4/current/include/mod_regs_ubc.h b/packages/hal/sh/sh4/current/include/mod_regs_ubc.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/mod_regs_ubc.h @@ -0,0 +1,75 @@ +//============================================================================= +// +// mod_regs_ubc.h +// +// UBC (user break controller) Module register definitions +// +//============================================================================= +//####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): jskov +// Contributors:jskov +// Date: 2000-10-30 +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +//-------------------------------------------------------------------------- +// User Break Control +#define CYGARC_REG_BARA 0xFF200000 // 32 bit +#define CYGARC_REG_BAMRA 0xFF200004 // 8 bit +#define CYGARC_REG_BBRA 0xFF200008 // 16 bit + +#define CYGARC_REG_BARB 0xFF20000C // 32 bit +#define CYGARC_REG_BAMRB 0xFF200010 // 8 bit + +#define CYGARC_REG_BBRB 0xFF200014 // 16 bit +#define CYGARC_REG_BDRB 0xFF200018 // 32 bit +#define CYGARC_REG_BDMRB 0xFF20001C // 32 bit + +#define CYGARC_REG_BRCR 0xFF200020 // 16 bit + + +#define CYGARC_REG_BRCR_CMFA 0x8000 // condition match flag A +#define CYGARC_REG_BRCR_CMFB 0x4000 // condition match flag B +#define CYGARC_REG_BRCR_PCBA 0x0400 // post execute channel A +#define CYGARC_REG_BRCR_DBEB 0x0080 // data break enable B +#define CYGARC_REG_BRCR_PCBB 0x0040 // post execute channel B +#define CYGARC_REG_BRCR_SEQ 0x0008 // sequence condition select +#define CYGARC_REG_BRCR_UBDE 0x0001 // User Break Debug Enable + + +#define CYGARC_REG_BBRA_DFETCH 0x0020 // Break on DFETCH +#define CYGARC_REG_BBRA_IFETCH 0x0010 // Break on IFETCH +#define CYGARC_REG_BBRA_WRITE 0x0008 // Break on WRITE +#define CYGARC_REG_BBRA_READ 0x0004 // Break on READ +#define CYGARC_REG_BBRA_SIZE_QUAD 0x0040 // Break on quad word access +#define CYGARC_REG_BBRA_SIZE_LONG 0x0003 // Break on long word access +#define CYGARC_REG_BBRA_SIZE_WORD 0x0002 // Break on word access +#define CYGARC_REG_BBRA_SIZE_BYTE 0x0001 // Break on byte access +#define CYGARC_REG_BBRA_SIZE_ANY 0x0000 // Break on any size diff --git a/packages/hal/sh/sh4/current/include/sh4_scif.h b/packages/hal/sh/sh4/current/include/sh4_scif.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/sh4_scif.h @@ -0,0 +1,86 @@ +//============================================================================= +// +// sh4_scif.h +// +// Simple driver for the sh4 Serial Communication Interface with FIFO +// +//============================================================================= +//####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): jskov +// Contributors:Haruki Kashiwaya +// Date: 2000-08-09 +// Description: Simple driver for the SH Serial Communication Interface +// The driver can be used for the SCIF modules. +// Clients of this file can configure the behavior with: +// CYGNUM_SCIF_PORTS: number of SCI ports +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH4_SCIF_PORTS + +//-------------------------------------------------------------------------- +// SCIF register offsets +#define _REG_SCSMR 0x00 +#define _REG_SCBRR 0x04 +#define _REG_SCSCR 0x08 +#define _REG_SCFTDR 0x0c +#define _REG_SCFSR 0x10 +#define _REG_SCFRDR 0x14 +#define _REG_SCFCR 0x18 +#define _REG_SCFDR 0x1c +#define _REG_SCSPTR 0x20 +#define _REG_SCLSR 0x24 + +//-------------------------------------------------------------------------- + +typedef struct { + cyg_uint8* base; + cyg_int32 msec_timeout; + int isr_vector; +} channel_data_t; + +//-------------------------------------------------------------------------- + +#if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) +// This one should only be used by old-stub compatibility code! +externC void cyg_hal_plf_scif_init_channel(const channel_data_t* chan); +#endif + +externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); +externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); +void cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base); + + +#endif // CYGNUM_HAL_SH_SH4_SCIF_PORTS +//----------------------------------------------------------------------------- +// end of sh4_scif.h diff --git a/packages/hal/sh/sh4/current/include/var_cache.h b/packages/hal/sh/sh4/current/include/var_cache.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/var_cache.h @@ -0,0 +1,234 @@ +#ifndef CYGONCE_VAR_CACHE_H +#define CYGONCE_VAR_CACHE_H +//============================================================================= +// +// var_cache.h +// +// Variant 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): nickg +// Contributors:nickg, jskov +// Date: 2000-04-02 +// Purpose: Variant cache control API +// Description: The macros defined here provide the HAL APIs for handling +// cache control operations on the SH variant CPUs. +// Usage: Is included via the architecture cache header: +// #include +// ... +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#include + +#include + +//============================================================================= + +#ifndef HAL_DCACHE_DEFINED + +#define HAL_DCACHE_SIZE CYGARC_SH_MOD_CAC_D_SIZE +#define HAL_DCACHE_LINE_SIZE CYGARC_SH_MOD_CAC_D_LINE_SIZE +#define HAL_DCACHE_WAYS CYGARC_SH_MOD_CAC_D_WAYS +#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS)) + +// Cache addressing information +#define CYGARC_REG_DCACHE_ADDRESS_BASE CYGARC_SH_MOD_DCAC_ADDRESS_BASE +#define CYGARC_REG_DCACHE_ADDRESS_TOP CYGARC_SH_MOD_DCAC_ADDRESS_TOP +#define CYGARC_REG_DCACHE_ADDRESS_STEP CYGARC_SH_MOD_DCAC_ADDRESS_STEP +#define CYGARC_REG_DCACHE_ADDRESS_FLUSH CYGARC_SH_MOD_DCAC_ADDRESS_FLUSH + +#define HAL_DCACHE_DEFINED +#endif + +#ifndef HAL_ICACHE_DEFINED + +#define HAL_ICACHE_SIZE CYGARC_SH_MOD_CAC_I_SIZE +#define HAL_ICACHE_LINE_SIZE CYGARC_SH_MOD_CAC_I_LINE_SIZE +#define HAL_ICACHE_WAYS CYGARC_SH_MOD_CAC_I_WAYS +#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS)) + +// Cache addressing information +#define CYGARC_REG_ICACHE_ADDRESS_BASE CYGARC_SH_MOD_ICAC_ADDRESS_BASE +#define CYGARC_REG_ICACHE_ADDRESS_TOP CYGARC_SH_MOD_ICAC_ADDRESS_TOP +#define CYGARC_REG_ICACHE_ADDRESS_STEP CYGARC_SH_MOD_ICAC_ADDRESS_STEP +#define CYGARC_REG_ICACHE_ADDRESS_FLUSH CYGARC_SH_MOD_ICAC_ADDRESS_FLUSH + +#define HAL_ICACHE_DEFINED +#endif + + +//----------------------------------------------------------------------------- +// Global control of cache + +// This is all handled in assembly (see variant.S) due to a requirement about +// not fiddling the cache from cachable memory. + +externC void cyg_hal_dcache_enable(void); +externC void cyg_hal_dcache_disable(void); +externC void cyg_hal_dcache_invalidate_all(void); +externC void cyg_hal_dcache_sync(void); +externC void cyg_hal_dcache_sync_region(cyg_haladdress base, + cyg_haladdrword len); +externC void cyg_hal_dcache_write_mode(int mode); + +// Enable the cache +#define HAL_DCACHE_ENABLE() cyg_hal_dcache_enable() + +// Disable the cache +#define HAL_DCACHE_DISABLE() cyg_hal_dcache_disable() + +// Invalidate the entire cache +#define HAL_DCACHE_INVALIDATE_ALL() cyg_hal_dcache_invalidate_all() + +// Synchronize the contents of the cache with memory. +#define HAL_DCACHE_SYNC() cyg_hal_dcache_sync() + +// Query the state of the cache (does not affect the caching) +#define HAL_DCACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + HAL_READ_UINT32(CYGARC_REG_CCR, (_state_)); \ + (_state_) &= ~CYGARC_REG_CCR_OCE; \ + CYG_MACRO_END + +// Set the cache refill burst size +//#define HAL_ICACHE_BURST_SIZE(_size_) + +// Set the cache write mode +#define HAL_ICACHE_WRITE_MODE( _mode_ ) \ + CYG_MACRO_START \ + cyg_uint32 _m_; \ + if (HAL_DCACHE_WRITETHRU_MODE == _mode_) \ + _m_ = CYGARC_REG_CCR_WT; \ + else \ + _m_ = CYGARC_REG_CCR_CB; \ + cyg_hal_cache_write_mode(_m_); \ + CYG_MACRO_END + +#define HAL_DCACHE_WRITETHRU_MODE 0 +#define HAL_DCACHE_WRITEBACK_MODE 1 + +// This macro allows the client to specify separate modes for the two +// regions. +#define HAL_DCACHE_WRITE_MODE_SH( _mode_ ) cyg_hal_dcache_write_mode(_mode_) + +// Load the contents of the given address range into the cache +// and then lock the cache so that it stays there. +//#define HAL_DCACHE_LOCK(_base_, _size_) + +// Undo a previous lock operation +//#define HAL_DCACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_DCACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Cache line control + +// Allocate cache lines for the given address range without reading its +// contents from memory. +//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ ) + +// Write dirty cache lines to memory and invalidate the cache entries +// for the given address range. +#define HAL_DCACHE_FLUSH( _base_ , _size_ ) \ + cyg_hal_dcache_sync_region((cyg_haladdress)_base_, (cyg_haladdrword)_size_) + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) + +// Write dirty cache lines to memory for the given address range. +//#define HAL_DCACHE_STORE( _base_ , _size_ ) + + +// Preread the given range into the cache with the intention of reading +// from it later. +//#define HAL_DCACHE_READ_HINT( _base_ , _size_ ) + +// Preread the given range into the cache with the intention of writing +// to it later. +//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ ) + +// Allocate and zero the cache lines associated with the given range. +//#define HAL_DCACHE_ZERO( _base_ , _size_ ) + + +//----------------------------------------------------------------------------- +// Global control of Instruction cache + +externC void cyg_hal_icache_enable(void); +externC void cyg_hal_icache_disable(void); +externC void cyg_hal_icache_invalidate_all(void); + +// Enable the cache +#define HAL_ICACHE_ENABLE() cyg_hal_dcache_enable() + +// Disable the cache +#define HAL_ICACHE_DISABLE() cyg_hal_dcache_disable() + +// Invalidate the entire cache +#define HAL_ICACHE_INVALIDATE_ALL() cyg_hal_icache_invalidate_all() + +// Synchronize the contents of the cache with memory. +#define HAL_ICACHE_SYNC() HAL_ICACHE_INVALIDATE_ALL() + +// Query the state of the cache (does not affect the caching) +#define HAL_ICACHE_IS_ENABLED(_state_) \ + CYG_MACRO_START \ + HAL_READ_UINT32(CYGARC_REG_CCR, (_state_)); \ + (_state_) &= ~CYGARC_REG_CCR_ICE; \ + CYG_MACRO_END + +// Set the instruction cache refill burst size +//#define HAL_ICACHE_BURST_SIZE(_size_) + +// 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_) + +// Undo a previous lock operation +//#define HAL_ICACHE_UNLOCK(_base_, _size_) + +// Unlock entire cache +//#define HAL_ICACHE_UNLOCK_ALL() + +//----------------------------------------------------------------------------- +// Instruction cache line control + +// Invalidate cache lines in the given range without writing to memory. +//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ ) + +//----------------------------------------------------------------------------- +#endif // ifndef CYGONCE_VAR_CACHE_H +// End of var_cache.h diff --git a/packages/hal/sh/sh4/current/include/var_intr.h b/packages/hal/sh/sh4/current/include/var_intr.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/var_intr.h @@ -0,0 +1,113 @@ +#ifndef CYGONCE_HAL_VAR_INTR_H +#define CYGONCE_HAL_VAR_INTR_H + +//========================================================================== +// +// var_intr.h +// +// SH4 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): jskov +// Contributors: jskov, +// Date: 1999-04-24 +// Purpose: Define Interrupt support +// Description: The macros defined here provide the HAL APIs for handling +// interrupts and the clock. +// +// Usage: +// #include +// ... +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include +#include CYGBLD_HAL_CPU_MODULES_H // INTC module selection + +// More include statements below. First part of this file must be +// usable for both assembly and C files, so only use defines here. +#include + +//-------------------------------------------------------------------------- +// Additional SH4 exception vectors. +// These are identified with event values 0x800 and 0x820, so we need to +// extend the decode macros accordingly. Performance wise it's not an +// issue - these are exceptions, not interrupts. No critical fast path. +#define CYGNUM_HAL_VECTOR_FPU_EXCEPTION 9 // FPU exception +#define CYGNUM_HAL_VECTOR_TLB_MUTI_HIT 10 // mutible TLB hit +#define CYGNUM_HAL_VECTOR_FPU_DISABLE 17 +#define CYGNUM_HAL_VECTOR_SLOT_FPU_DISABLE 18 + +#define CYG_VECTOR_IS_INTERRUPT(v) \ + ((CYGNUM_HAL_VECTOR_INSTRUCTION_BP < (v)) && ((v) < CYGNUM_HAL_VECTOR_FPU_DISABLE)) + +#define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_SLOT_FPU_DISABLE + +#define CYGNUM_HAL_VSR_EXCEPTION_COUNT (CYGNUM_HAL_VSR_MAX-CYGNUM_HAL_VECTOR_POWERON+1) + +#define CYGNUM_HAL_INTERRUPT_RESERVED_5C0 32 +#define CYGNUM_HAL_INTERRUPT_RESERVED_5E0 33 +#define CYGNUM_HAL_INTERRUPT_HUDI 34 +#define CYGNUM_HAL_INTERRUPT_GPIO 35 +#define CYGNUM_HAL_INTERRUPT_DMAC_DMTE0 36 +#define CYGNUM_HAL_INTERRUPT_DMAC_DMTE1 37 +#define CYGNUM_HAL_INTERRUPT_DMAC_DMTE2 38 +#define CYGNUM_HAL_INTERRUPT_DMAC_DMTE3 39 +#define CYGNUM_HAL_INTERRUPT_DMAC_DMAE 40 +#define CYGNUM_HAL_INTERRUPT_RESERVED_6E0 41 +#define CYGNUM_HAL_INTERRUPT_SCIF_ERI 42 +#define CYGNUM_HAL_INTERRUPT_SCIF_RXI 43 +#define CYGNUM_HAL_INTERRUPT_SCIF_BRI 44 +#define CYGNUM_HAL_INTERRUPT_SCIF_TXI 45 + +#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_SCIF_TXI + +// Exception vectors. These are the values used when passed out to an +// external exception handler using cyg_hal_deliver_exception() + +// These are in addition to the exceptions defined by the architecture. + +#define CYGNUM_HAL_EXCEPTION_FPU_EXCEPTION 9 // fpu exception +#define CYGNUM_HAL_EXCEPTION_TLB_MULTI_HIT 10 // TLB multi hit exception +#define CYGNUM_HAL_EXCEPTION_FPU_DISABLE 17 +#define CYGNUM_HAL_EXCEPTION_SLOT_FPU_DISABLE 18 + +#define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_POWERON +#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_SLOT_FPU_DISABLE + + +// The vector used by the Real time clock +#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TMU0_TUNI0 + +//-------------------------------------------------------------------------- +#endif // ifndef CYGONCE_HAL_VAR_INTR_H +// End of hal_intr.h diff --git a/packages/hal/sh/sh4/current/include/var_regs.h b/packages/hal/sh/sh4/current/include/var_regs.h new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/var_regs.h @@ -0,0 +1,91 @@ +#ifndef CYGONCE_HAL_VAR_REGS_H +#define CYGONCE_HAL_VAR_REGS_H +//============================================================================= +// +// var_regs.h +// +// SH4 CPU definitions +// +//============================================================================= +//####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): jskov +// Contributors:Ryozaburo Suzuki +// Date: 2000-04-18 +// Purpose: Define CPU memory mapped registers etc. +// Usage: Included via the acrhitecture register header: +// #include +// Notes: +// This file describes registers for on-core modules found in all +// the SH4 CPUs supported by the HAL. For each CPU is defined a +// module specification file (mod_.h) which lists +// modules (and their version if applicable) included in that +// particular CPU model. Note that the versioning is ad hoc; +// it doesn't reflect Hitachi internal versioning in any way. +// +//####DESCRIPTIONEND#### +// + +// Find out which modules are supported by the chosen CPU +#include +#include CYGBLD_HAL_CPU_MODULES_H + +//========================================================================== +// CPU Definitions +//========================================================================== + +//-------------------------------------------------------------------------- +// Status register +#define CYGARC_REG_SR_MD 0x40000000 +#define CYGARC_REG_SR_RB 0x20000000 +#define CYGARC_REG_SR_BL 0x10000000 +#define CYGARC_REG_SR_M 0x00000200 +#define CYGARC_REG_SR_Q 0x00000100 +#define CYGARC_REG_SR_IMASK 0x000000f0 +#define CYGARC_REG_SR_I3 0x00000080 +#define CYGARC_REG_SR_I2 0x00000040 +#define CYGARC_REG_SR_I1 0x00000020 +#define CYGARC_REG_SR_I0 0x00000010 +#define CYGARC_REG_SR_S 0x00000002 +#define CYGARC_REG_SR_T 0x00000001 +#define CYGARC_REG_SR_FD 0x00008000 + +//========================================================================== +// Module Definitions +//========================================================================== + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // CYGONCE_HAL_VAR_REGS_H diff --git a/packages/hal/sh/sh4/current/include/variant.inc b/packages/hal/sh/sh4/current/include/variant.inc new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/include/variant.inc @@ -0,0 +1,167 @@ +#ifndef CYGONCE_HAL_VARIANT_INC +#define CYGONCE_HAL_VARIANT_INC +##============================================================================= +## +## variant.inc +## +## SH4 variant assembler header file +## +##============================================================================= +#####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): jskov +## Contributors:jskov +## Date: 2000-10-30 +## Purpose: SH4 variant definitions and init code +## Description: This file contains various definitions and macros that are +## useful for writing assembly code for the SH3 CPU family. +## Usage: +## #include +## ... +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include +#include + +#=========================================================================== +# SR initialization value +# zero all bits except: +# MD = Processor operation mode field (privileged mode) +# I0-3 = Mask out all interrupts but NMI. +# +# When saving or restoring the state of an exception or interrupt, the bit +# CYGARC_REG_SR_RB is also set, switching the register bank. When this bit +# is set, interrupts must be disabled. +# +# Note: We could also use the BL bit to prevent interrupts, but that would +# also prevent the use of breakpoints. + +#define CYG_SR (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK) +#define CYG_SR_BANK1 (CYGARC_REG_SR_MD|CYGARC_REG_SR_IMASK|CYGARC_REG_SR_RB) + +##----------------------------------------------------------------------------- +## Hardware init macros +#ifndef CYGPKG_HAL_SH_POST_RESET_INIT + .macro hal_post_reset_init + # Initialize CPU + mov.l $nCYG_SR,r1 ! Put CPU in a well-known state + ldc r1,sr + mov #0,r0 + mov.l $nCYGARC_REG_CCR,r1 ! Disable cache + mov.l r0,@r1 + mov.l $nCYGARC_REG_MMUCR,r1 ! Disable MMU + mov.l r0,@r1 + mov.l $nCYGARC_REG_BBRA,r1 ! Disable UBC Channel A + mov.w r0,@r1 + mov.l $nCYGARC_REG_BBRB,r1 ! Disable UBC Channel B + mov.w r0,@r1 + mov.l $nCYGARC_REG_BRCR,r1 ! Reset UBC common register + mov.w r0,@r1 + mov.l $CYGARC_REG_TSTR,r1 ! Disable timers + mov.b r0,@r1 + mov.l $CYGARC_REG_IPRA,r1 ! Disable interrupt request sources + mov.w r0,@r1 + mov.l $CYGARC_REG_IPRB,r1 + mov.w r0,@r1 + mov.l $CYGARC_REG_IPRC,r1 + mov.w r0,@r1 + mov.w $nCYG_WTCSR,r0 ! Clear watchdog + mov.l $nCYGARC_REG_WTCSR,r1 + mov.w r0,@r1 + + # Initialize VBR if necessary +#if !defined(CYG_HAL_STARTUP_RAM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + mov.l $__reset,r1 ! Set VBR + ldc r1,vbr +#endif + bra 1f + nop + +$nCYG_WTCSR: + .word 0xa500 ! clear all CSR bits + + .align 2 +$nCYG_SR: + .long CYG_SR +$nCYGARC_REG_CCR: + .long CYGARC_REG_CCR +$nCYGARC_REG_MMUCR: + .long CYGARC_REG_MMUCR +$nCYGARC_REG_BBRA: + .long CYGARC_REG_BBRA +$nCYGARC_REG_BBRB: + .long CYGARC_REG_BBRB +$nCYGARC_REG_BRCR: + .long CYGARC_REG_BRCR +$CYGARC_REG_TSTR: + .long CYGARC_REG_TSTR +$CYGARC_REG_IPRA: + .long CYGARC_REG_IPRA +$CYGARC_REG_IPRB: + .long CYGARC_REG_IPRB +$CYGARC_REG_IPRC: + .long CYGARC_REG_IPRC +$nCYGARC_REG_WTCSR: + .long CYGARC_REG_WTCSR +$__reset: + .long __reset + +1: + .endm +#define CYGPKG_HAL_SH_POST_RESET_INIT +#endif + +##----------------------------------------------------------------------------- +## Interrupt decode macros + .macro hal_intc_decode tmp,inum + mov.l $nCYGARC_REG_INTEVT,\tmp + mov.l @\tmp,\inum + mov #-5,\tmp ! divide cause by 0x20 + shld \tmp,\inum + add #-14,\inum ! adjust so NMI becomes 0 + .endm + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN + .macro hal_intc_translate inum,vnum + mov #0,\vnum ! Just vector zero is supported + .endm +#else + .macro hal_intc_translate inum,vnum + mov \inum,\vnum ! Vector == interrupt number + shll2 \vnum ! get from vector number to ISR index + .endm +#endif + +#------------------------------------------------------------------------------ +#endif // CYGONCE_HAL_VARIANT_INC +# end of variant.inc diff --git a/packages/hal/sh/sh4/current/src/sh4_scif.c b/packages/hal/sh/sh4/current/src/sh4_scif.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/src/sh4_scif.c @@ -0,0 +1,333 @@ +//============================================================================= +// +// sh4_scif.c +// +// Simple driver for the SH4 Serial Communication Interface with FIFO +// +//============================================================================= +//####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): jskov +// Contributors:Haruki Kashiwaya +// Date: 2000-08-09 +// Description: Simple driver for the SH Serial Communication Interface +// The driver can be used for the SCIF modules. +// Clients of this file can configure the behavior with: +// CYGNUM_SCIF_PORTS: number of SCI ports +// +//####DESCRIPTIONEND#### +// +//============================================================================= + +#include + +#ifdef CYGNUM_HAL_SH_SH4_SCIF_PORTS + +#include // IO macros +#include // CYG_ISR_HANDLED +#include // Helper functions +#include // HAL_ENABLE/MASK/UNMASK_INTERRUPTS +#include // SAVE/RESTORE GP +#include // Calling-if API +#include // serial register definitions +#include // target_register_t + +#include // our header + +//-------------------------------------------------------------------------- + +void +cyg_hal_plf_scif_init_channel(const channel_data_t* chan) +{ + cyg_uint8* base = chan->base; + cyg_uint16 tmp; + cyg_uint16 sr; + + // Disable everything. + HAL_WRITE_UINT16(base+_REG_SCSCR, 0); + + // Reset FIFO. + HAL_WRITE_UINT16(base+_REG_SCFCR, + CYGARC_REG_SCFCR2_TFRST|CYGARC_REG_SCFCR2_RFRST); + + // 8-1-no parity. + HAL_WRITE_UINT16(base+_REG_SCSMR, 0); + + // Set speed to 38400 + HAL_READ_UINT16(base+_REG_SCSMR, tmp); + tmp &= ~CYGARC_REG_SCSMR2_CKSx_MASK; + tmp |= CYGARC_SCBRR_CKSx(38400); + HAL_WRITE_UINT16(base+_REG_SCSMR, tmp); + HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(38400)); + + // Let things settle: Here we should should wait the equivalent of + // one bit interval, i.e. 1/38400 second, but until we have + // something like the Linux delay loop, it's hard to do reliably. So + // just move on and hope for the best (this is unlikely to cause + // problems since the CPU has just come out of reset anyway). + + // Clear status register (read back first). + HAL_READ_UINT16(base+_REG_SCFSR, sr); + HAL_WRITE_UINT16(base+_REG_SCFSR, 0); + + // Bring FIFO out of reset and set to trigger on every char in + // FIFO (or C-c input would not be processed). + HAL_WRITE_UINT16(base+_REG_SCFCR, + CYGARC_REG_SCFCR2_RTRG_1|CYGARC_REG_SCFCR2_TTRG_1); + + // Leave Tx/Rx interrupts disabled, but enable Tx/Rx + HAL_WRITE_UINT16(base+_REG_SCSCR, + CYGARC_REG_SCSCR2_TE|CYGARC_REG_SCSCR2_RE); +} + +static cyg_bool +cyg_hal_plf_scif_getc_nonblock(void* __ch_data, cyg_uint8* ch) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint16 fdr, sr; + + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + if ((fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK) == 0) + return false; + + HAL_READ_UINT8(base+_REG_SCFRDR, *ch); + + // Clear FIFO full flag (read before clearing) + HAL_READ_UINT16(base+_REG_SCFSR, sr); + HAL_WRITE_UINT16(base+_REG_SCFSR, + CYGARC_REG_SCSSR2_CLEARMASK & ~CYGARC_REG_SCSSR2_RDF); + + return true; +} + +cyg_uint8 +cyg_hal_plf_scif_getc(void* __ch_data) +{ + cyg_uint8 ch; + CYGARC_HAL_SAVE_GP(); + + while(!cyg_hal_plf_scif_getc_nonblock(__ch_data, &ch)); + + CYGARC_HAL_RESTORE_GP(); + return ch; +} + +void +cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c) +{ + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + cyg_uint16 fdr, sr; + CYGARC_HAL_SAVE_GP(); + + do { + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + } while (((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) >> CYGARC_REG_SCFDR2_TCOUNT_shift) == 16); + + HAL_WRITE_UINT8(base+_REG_SCFTDR, c); + + // Clear FIFO-empty/transmit end flags (read back SR first) + HAL_READ_UINT16(base+_REG_SCFSR, sr); + HAL_WRITE_UINT16(base+_REG_SCFSR, CYGARC_REG_SCSSR2_CLEARMASK + & ~(CYGARC_REG_SCSSR2_TDFE | CYGARC_REG_SCSSR2_TEND )); + + // Hang around until the character has been safely sent. + do { + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + } while ((fdr & CYGARC_REG_SCFDR2_TCOUNT_MASK) != 0); + + CYGARC_HAL_RESTORE_GP(); +} + +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ + || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) + +static channel_data_t channels[CYGNUM_HAL_SH_SH4_SCIF_PORTS]; + +static void +cyg_hal_plf_scif_write(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_plf_scif_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_plf_scif_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_plf_scif_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +cyg_bool +cyg_hal_plf_scif_getc_timeout(void* __ch_data, cyg_uint8* ch) +{ + channel_data_t* chan = (channel_data_t*)__ch_data; + int delay_count; + cyg_bool res; + CYGARC_HAL_SAVE_GP(); + + delay_count = chan->msec_timeout * 10; // delay in .1 ms steps + + for(;;) { + res = cyg_hal_plf_scif_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_scif_control(void *__ch_data, __comm_control_cmd_t __func, ...) +{ + static int irq_state = 0; + channel_data_t* chan = (channel_data_t*)__ch_data; + cyg_uint8 scr; + int ret = 0; + CYGARC_HAL_SAVE_GP(); + + switch (__func) { + case __COMMCTL_IRQ_ENABLE: + irq_state = 1; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT16(chan->base+_REG_SCSCR, scr); + scr |= CYGARC_REG_SCSCR2_RIE; + HAL_WRITE_UINT16(chan->base+_REG_SCSCR, scr); + break; + case __COMMCTL_IRQ_DISABLE: + ret = irq_state; + irq_state = 0; + HAL_INTERRUPT_UNMASK(chan->isr_vector); + HAL_READ_UINT16(chan->base+_REG_SCSCR, scr); + scr &= ~CYGARC_REG_SCSCR2_RIE; + HAL_WRITE_UINT16(chan->base+_REG_SCSCR, scr); + 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_scif_isr(void *__ch_data, int* __ctrlc, + CYG_ADDRWORD __vector, CYG_ADDRWORD __data) +{ + cyg_uint8 c; + cyg_uint16 fdr, sr; + cyg_uint8* base = ((channel_data_t*)__ch_data)->base; + int res = 0; + CYGARC_HAL_SAVE_GP(); + + *__ctrlc = 0; + HAL_READ_UINT16(base+_REG_SCFDR, fdr); + if ((fdr & CYGARC_REG_SCFDR2_RCOUNT_MASK) != 0) { + HAL_READ_UINT8(base+_REG_SCFRDR, c); + + // Clear buffer full flag (read back first). + HAL_READ_UINT16(base+_REG_SCFSR, sr); + HAL_WRITE_UINT16(base+_REG_SCFSR, + CYGARC_REG_SCSSR2_CLEARMASK & ~CYGARC_REG_SCSSR2_RDF); + + if( cyg_hal_is_break( &c , 1 ) ) + *__ctrlc = 1; + + res = CYG_ISR_HANDLED; + } + + CYGARC_HAL_RESTORE_GP(); + return res; +} + +void +cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base) +{ + channel_data_t* chan = &channels[scif_index]; + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize channel table + chan->base = base; + chan->isr_vector = rcv_vect; + chan->msec_timeout = 1000; + + // Disable interrupts. + HAL_INTERRUPT_MASK(chan->isr_vector); + + // Init channel + cyg_hal_plf_scif_init_channel(chan); + + // Setup procs in the vector table + + // Initialize channel procs + CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_scif_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_scif_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_scif_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_scif_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_scif_control); + CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_scif_isr); + CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_scif_getc_timeout); + + // Restore original console + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + +#endif // CYGNUM_HAL_SH_SH4_SCIF_PORTS + +//----------------------------------------------------------------------------- +// end of sh4_scif.c diff --git a/packages/hal/sh/sh4/current/src/var_misc.c b/packages/hal/sh/sh4/current/src/var_misc.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/src/var_misc.c @@ -0,0 +1,272 @@ +//========================================================================== +// +// var_misc.c +// +// HAL miscellaneous functions +// +//========================================================================== +//####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): jskov +// Contributors: jskov, jlarmour, nickg +// Date: 1999-04-03 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +#include + +#include +#include // tracing macros +#include // assertion macros +#include // diag_printf + +#include // HAL header +#include // HAL cache +#include // HAL interrupts/exceptions + +//--------------------------------------------------------------------------- +// Initial cache enabling + +#ifdef CYGHWR_HAL_SH_CACHE_MODE_P0_WRITE_BACK +# define CACHE_MODE_P0 0 +#else +# define CACHE_MODE_P0 CYGARC_REG_CCR_WT +#endif + +#ifdef CYGHWR_HAL_SH_CACHE_MODE_P1_WRITE_BACK +# define CACHE_MODE_P1 CYGARC_REG_CCR_CB +#else +# define CACHE_MODE_P1 0 +#endif + +externC void +cyg_var_enable_caches(void) +{ + // Initialize cache. + HAL_DCACHE_INVALIDATE_ALL(); + HAL_ICACHE_INVALIDATE_ALL(); + + // Set cache modes + HAL_DCACHE_WRITE_MODE_SH(CACHE_MODE_P0|CACHE_MODE_P1); + +#ifdef CYGHWR_HAL_SH_CACHE_ENABLE + // Enable cache. + HAL_ICACHE_ENABLE(); + HAL_DCACHE_ENABLE(); +#endif +} + +//--------------------------------------------------------------------------- +void +hal_variant_init(void) +{ +} + +//--------------------------------------------------------------------------- + +#ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING +externC cyg_uint8 cyg_hal_ILVL_table[]; +#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) \ + /* Update the ILVL table, so it is easy for the interrupt entry */ \ + /* code to find out the level of a given interrupt source. */ \ + cyg_hal_ILVL_table[(_vector_)] = (_level_) +#else +#define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) +#endif + +void +hal_interrupt_set_level(int vector, int level) +{ + cyg_uint16 iprX; + + CYG_ASSERT((0 <= (level) && 15 >= (level)), "Illegal level"); + CYG_ASSERT((CYGNUM_HAL_ISR_MIN <= (vector) + && CYGNUM_HAL_ISR_MAX >= (vector)), "Illegal vector"); + + HAL_UPDATE_ILVL_TABLE(vector, level); + + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Cannot change levels */ + break; + + /* IPRA */ + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU0_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU0_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_TMU1_TUNI1: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU1_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU1_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_TMU2_TUNI2: + case CYGNUM_HAL_INTERRUPT_TMU2_TICPI2: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_TMU2_MASK; + iprX |= (level)*CYGARC_REG_IPRA_TMU2_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + case CYGNUM_HAL_INTERRUPT_RTC_ATI: + case CYGNUM_HAL_INTERRUPT_RTC_PRI: + case CYGNUM_HAL_INTERRUPT_RTC_CUI: + HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); + iprX &= ~CYGARC_REG_IPRA_RTC_MASK; + iprX |= (level)*CYGARC_REG_IPRA_RTC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); + break; + + /* IPRB */ + case CYGNUM_HAL_INTERRUPT_SCI_ERI: + case CYGNUM_HAL_INTERRUPT_SCI_RXI: + case CYGNUM_HAL_INTERRUPT_SCI_TXI: + case CYGNUM_HAL_INTERRUPT_SCI_TEI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_SCI_MASK; + iprX |= (level)*CYGARC_REG_IPRB_SCI_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + case CYGNUM_HAL_INTERRUPT_WDT_ITI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_WDT_MASK; + iprX |= (level)*CYGARC_REG_IPRB_WDT_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + case CYGNUM_HAL_INTERRUPT_REF_RCMI: + case CYGNUM_HAL_INTERRUPT_REF_ROVI: + HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); + iprX &= ~CYGARC_REG_IPRB_REF_MASK; + iprX |= (level)*CYGARC_REG_IPRB_REF_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); + break; + + /* IPRC */ + case CYGNUM_HAL_INTERRUPT_HUDI: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_HUDI_MASK; + iprX |= (level)*CYGARC_REG_IPRC_HUDI_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_GPIO: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_GPIO_MASK; + iprX |= (level)*CYGARC_REG_IPRC_GPIO_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_DMAC_DMTE0: + case CYGNUM_HAL_INTERRUPT_DMAC_DMTE1: + case CYGNUM_HAL_INTERRUPT_DMAC_DMTE2: + case CYGNUM_HAL_INTERRUPT_DMAC_DMTE3: + case CYGNUM_HAL_INTERRUPT_DMAC_DMAE: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_DMAC_MASK; + iprX |= (level)*CYGARC_REG_IPRC_DMAC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_SCIF_ERI: + case CYGNUM_HAL_INTERRUPT_SCIF_RXI: + case CYGNUM_HAL_INTERRUPT_SCIF_BRI: + case CYGNUM_HAL_INTERRUPT_SCIF_TXI: + HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); + iprX &= ~CYGARC_REG_IPRC_DMAC_MASK; + iprX |= (level)*CYGARC_REG_IPRC_DMAC_PRI1; + HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); + break; + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_5C0: + case CYGNUM_HAL_INTERRUPT_RESERVED_5E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_6E0: + /* Do nothing for these reserved vectors. */ + break; + } +} + +void +hal_interrupt_mask(int vector) +{ + switch( vector ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Can only be masked by fiddling Imask in SR. */ + break; + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: + HAL_INTERRUPT_SET_LEVEL((vector), 0); + break; + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + /* Do nothing for these reserved vectors. */ + break; + default: + CYG_FAIL("Unknown interrupt vector"); + break; + } +} + +void +hal_interrupt_unmask(int vector) +{ + switch( (vector) ) { + case CYGNUM_HAL_INTERRUPT_NMI: + /* fall through */ + case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: + /* Can only be unmasked by fiddling Imask in SR. */ + break; + case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: + HAL_INTERRUPT_SET_LEVEL((vector), 1); + break; + case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: + case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: + /* Do nothing for these reserved vectors. */ + break; + default: + CYG_FAIL("Unknown interrupt vector"); + break; + } +} + + +void +hal_interrupt_acknowledge(int vector) +{ +} + +void +hal_interrupt_configure(int vector, int level, int up) +{ +} diff --git a/packages/hal/sh/sh4/current/src/var_mk_defs.c b/packages/hal/sh/sh4/current/src/var_mk_defs.c new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/src/var_mk_defs.c @@ -0,0 +1,91 @@ +//========================================================================== +// +// var_mk_defs.c +// +// HAL (variant) "make defs" program +// +//========================================================================== +//####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 +// Date: 2000-02-21 +// Purpose: SH architecture dependent definition generator +// Description: This file contains code that can be compiled by the target +// compiler and used to generate machine specific definitions +// suitable for use in assembly code. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include // HAL header +#include // HAL header +#include // HAL header +#ifdef CYGPKG_KERNEL +# include +# include +#endif + +/* + * This program is used to generate definitions needed by + * assembly language modules. + * + * This technique was first used in the OSF Mach kernel code: + * generate asm statements containing #defines, + * compile this file to assembler, and then extract the + * #defines from the assembly-language output. + */ + +#define DEFINE(sym, val) \ + asm volatile("\n\t.equ\t" #sym ",%0" : : "i" (val)) + +int +main(void) +{ + // Caching details + DEFINE(HAL_ICACHE_SIZE, HAL_ICACHE_SIZE); + DEFINE(HAL_ICACHE_WAYS, HAL_ICACHE_WAYS); + DEFINE(HAL_ICACHE_LINE_SIZE, HAL_ICACHE_LINE_SIZE); + DEFINE(CYGARC_REG_ICACHE_ADDRESS_BASE,CYGARC_REG_ICACHE_ADDRESS_BASE); + DEFINE(CYGARC_REG_ICACHE_ADDRESS_TOP,CYGARC_REG_ICACHE_ADDRESS_TOP); + DEFINE(CYGARC_REG_ICACHE_ADDRESS_STEP,CYGARC_REG_ICACHE_ADDRESS_STEP); + DEFINE(CYGARC_REG_ICACHE_ADDRESS_FLUSH, CYGARC_REG_ICACHE_ADDRESS_FLUSH); + + DEFINE(HAL_DCACHE_SIZE, HAL_DCACHE_SIZE); + DEFINE(HAL_DCACHE_WAYS, HAL_DCACHE_WAYS); + DEFINE(HAL_DCACHE_LINE_SIZE, HAL_DCACHE_LINE_SIZE); + DEFINE(CYGARC_REG_DCACHE_ADDRESS_BASE,CYGARC_REG_DCACHE_ADDRESS_BASE); + DEFINE(CYGARC_REG_DCACHE_ADDRESS_TOP,CYGARC_REG_DCACHE_ADDRESS_TOP); + DEFINE(CYGARC_REG_DCACHE_ADDRESS_STEP,CYGARC_REG_DCACHE_ADDRESS_STEP); + DEFINE(CYGARC_REG_DCACHE_ADDRESS_FLUSH, CYGARC_REG_DCACHE_ADDRESS_FLUSH); +} + +//-------------------------------------------------------------------------- +// EOF var_mk_defs.c diff --git a/packages/hal/sh/sh4/current/src/variant.S b/packages/hal/sh/sh4/current/src/variant.S new file mode 100644 --- /dev/null +++ b/packages/hal/sh/sh4/current/src/variant.S @@ -0,0 +1,213 @@ +##========================================================================== +## +## variant.S +## +## SH4 variant 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): jskov +## Contributors: jskov +## Date: 2000-10-31 +## Purpose: SH4 misc assembly code +######DESCRIPTIONEND#### +## +##========================================================================== + +#include +#include + +#include +#include + +#--------------------------------------------------------------------------- +# Cache operations +# These need to be written in assembly to ensure they do not rely on data +# in cachable space (i.e., code must use registers exclusively, not the stack). + +# This macro must be used at the top of each cache function. It ensures +# that the code gets executed from a shadow region where caching is disabled +# (0xA0000000). + .macro GOTO_NONCACHED_SHADOW + mova 10f,r0 + mov.l $MASK,r1 + and r1,r0 + mov.l $BASE,r1 + or r1,r0 + jmp @r0 + nop + .align 2 +10: + .endm + + .globl _cyg_hal_dcache_enable +_cyg_hal_dcache_enable: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_OCE,r2 + mov.l r2,@r1 + nop + rts + nop + + .globl _cyg_hal_dcache_disable +_cyg_hal_dcache_disable: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_OCE,r2 + not r2,r2 + and r2,r0 + mov.l r0,@r1 + nop + rts + nop + + .globl _cyg_hal_dcache_invalidate_all +_cyg_hal_dcache_invalidate_all: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov #CYGARC_REG_CCR_OCI,r2 + or r2,r0 + mov.l r0,@r1 + nop ! Nothing in the docs suggest we need + nop ! nops here, but without them, the + nop ! CPU crashes. + rts + nop + + .globl _cyg_hal_dcache_sync +_cyg_hal_dcache_sync: + GOTO_NONCACHED_SHADOW + mov.l $CYGARC_REG_DCACHE_ADDRESS_FLUSH,r0 + mov.l $CYGARC_REG_DCACHE_ADDRESS_BASE,r1 + mov.l $CYGARC_REG_DCACHE_ADDRESS_TOP,r2 + mov.l $CYGARC_REG_DCACHE_ADDRESS_STEP,r3 +1: cmp/hi r1,r2 + bf 2f + mov.l r0,@r1 + bra 1b + add r3,r1 ! delay slot! +2: nop + rts + nop + + .align 2 +$CYGARC_REG_DCACHE_ADDRESS_FLUSH: + .long CYGARC_REG_DCACHE_ADDRESS_FLUSH +$CYGARC_REG_DCACHE_ADDRESS_BASE: + .long CYGARC_REG_DCACHE_ADDRESS_BASE +$CYGARC_REG_DCACHE_ADDRESS_TOP: + .long CYGARC_REG_DCACHE_ADDRESS_TOP +$CYGARC_REG_DCACHE_ADDRESS_STEP: + .long CYGARC_REG_DCACHE_ADDRESS_STEP + + + ! r4 = base + ! r5 = size + .globl _cyg_hal_dcache_sync_region +_cyg_hal_dcache_sync_region: + GOTO_NONCACHED_SHADOW +1: ocbp @r4 ! operand cache block purge + add #CYGARC_SH_MOD_DCAC_ADDRESS_STEP,r4 + add #-CYGARC_SH_MOD_DCAC_ADDRESS_STEP,r5 + cmp/pl r5 + bt 1b + rts + nop + + .globl _cyg_hal_dcache_write_mode +_cyg_hal_dcache_write_mode: + GOTO_NONCACHED_SHADOW + # Mode argument in r4. + # Read current state and mask out the two caching mode bits + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r3 + mov #CYGARC_REG_CCR_CB|CYGARC_REG_CCR_WT,r2 + and r2,r4 + not r2,r2 + and r2,r3 + # Or in the new settings and restore to CCR + or r4,r3 + mov.l r3,@r1 + nop + rts + nop + + + .globl _cyg_hal_icache_enable +_cyg_hal_icache_enable: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov.l $nCYGARC_REG_CCR_ICE,r2 + mov.l r2,@r1 + nop + rts + nop + + .globl _cyg_hal_icache_disable +_cyg_hal_icache_disable: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov.l $nCYGARC_REG_CCR_ICE,r2 + not r2,r2 + and r2,r0 + mov.l r0,@r1 + nop + rts + nop + + .globl _cyg_hal_icache_invalidate_all +_cyg_hal_icache_invalidate_all: + GOTO_NONCACHED_SHADOW + mov.l $nCYGARC_REG_CCR,r1 + mov.l @r1,r0 + mov.l $nCYGARC_REG_CCR_ICI,r2 + or r2,r0 + mov.l r0,@r1 + nop ! Nothing in the docs suggest we need + nop ! nops here, but without them, the + nop ! CPU crashes. + rts + nop + + .align 2 +$MASK: + .long 0x1fffffff ! mask off top 3 bits +$BASE: + .long 0xa0000000 ! base of non-cachable memory +$nCYGARC_REG_CCR: + .long CYGARC_REG_CCR +$nCYGARC_REG_CCR_ICE: + .long CYGARC_REG_CCR_ICE +$nCYGARC_REG_CCR_ICI: + .long CYGARC_REG_CCR_ICI diff --git a/packages/io/fileio/current/ChangeLog b/packages/io/fileio/current/ChangeLog --- a/packages/io/fileio/current/ChangeLog +++ b/packages/io/fileio/current/ChangeLog @@ -1,3 +1,15 @@ +2000-11-01 Jonathan Larmour + + * src/io.cxx (readwrite): Ensure we call FILEIO_RETURN_VALUE() to + get correct cleanup + (fpathconf): Ditto + (lseek): Ditto + + * src/file.cxx (open): If applicable, refer to stdin, stdout and stderr + here to ensure they are pulled in, in case selective linking would + otherwise eliminate them. This is to ensure they get allocated to + fd's 0, 1 and 2. + 2000-10-13 Nick Garnett * src/io.cxx (readwrite): Merged both read() and write() functions diff --git a/packages/io/fileio/current/src/file.cxx b/packages/io/fileio/current/src/file.cxx --- a/packages/io/fileio/current/src/file.cxx +++ b/packages/io/fileio/current/src/file.cxx @@ -47,6 +47,7 @@ #include #include #include +#include #include // base kernel types #include // tracing macros @@ -54,6 +55,7 @@ #include // string functions #include +#include // stdin, stdout, stderr #include "fio.h" // Private header @@ -168,6 +170,14 @@ static Cyg_Mutex getcwd_lock CYGBLD_ATTR { FILEIO_ENTRY(); + // we want to be sure we pull in stdin/out/err, so they can be + // assigned to fds 0, 1 and 2 +#ifdef CYGINT_ISO_STDIO_STREAMS + CYG_REFERENCE_OBJECT(stdin); + CYG_REFERENCE_OBJECT(stdout); + CYG_REFERENCE_OBJECT(stderr); +#endif + CYG_CANCELLATION_POINT; int ret = 0; diff --git a/packages/io/fileio/current/src/io.cxx b/packages/io/fileio/current/src/io.cxx --- a/packages/io/fileio/current/src/io.cxx +++ b/packages/io/fileio/current/src/io.cxx @@ -126,8 +126,7 @@ static ssize_t readwrite( int fd, void * CYG_CANCELLATION_POINT; - CYG_REPORT_RETVAL(cnt); - return cnt; + FILEIO_RETURN_VALUE(cnt); } //========================================================================== @@ -200,8 +199,7 @@ static ssize_t readwrite( int fd, void * if( ret != 0 ) FILEIO_RETURN(ret); - CYG_REPORT_RETVAL(pos); - return pos; + FILEIO_RETURN_VALUE(pos); } //========================================================================== @@ -347,8 +345,7 @@ static ssize_t readwrite( int fd, void * if( ret != 0 ) FILEIO_RETURN(ret); - CYG_REPORT_RETVAL(info.value); - return info.value; + FILEIO_RETURN_VALUE(info.value); } //========================================================================== diff --git a/packages/io/flash/current/src/flash.h b/packages/io/flash/current/src/flash.h deleted file mode 100644 --- a/packages/io/flash/current/src/flash.h +++ /dev/null @@ -1,19 +0,0 @@ - -#define FLASH_Read_ID 0x90 -#define FLASH_Read_Query 0x98 -#define FLASH_Read_Status 0x70 -#define FLASH_Clear_Status 0x50 -#define FLASH_Status_Ready 0x80 -#define FLASH_Write 0xE8 -#define FLASH_Program 0x10 -#define FLASH_Block_Erase 0x20 -#define FLASH_Clear_Locks 0x60 -#define FLASH_Confirm 0xD0 -#define FLASH_Configure 0xB8 -#define FLASH_Configure_ReadyWait 0x00 -#define FLASH_Configure_PulseOnErase 0x01 -#define FLASH_Configure_PulseOnProgram 0x02 -#define FLASH_Configure_PulseOnBoth 0x03 -#define FLASH_Reset 0xFF - -#define FLASH_BLOCK_SIZE 0x10000 diff --git a/packages/io/serial/current/ChangeLog b/packages/io/serial/current/ChangeLog --- a/packages/io/serial/current/ChangeLog +++ b/packages/io/serial/current/ChangeLog @@ -153,6 +153,10 @@ 2000-05-28 Gary Thomas + + * tests/ser_test_protocol.inl: Added rules for REF4955. + 2000-05-08 Jesper Skov * cdl/io_serial.cdl: active_if CYGPKG_IO diff --git a/packages/isoinfra/current/ChangeLog b/packages/isoinfra/current/ChangeLog --- a/packages/isoinfra/current/ChangeLog +++ b/packages/isoinfra/current/ChangeLog @@ -1,3 +1,11 @@ +2000-11-01 Jonathan Larmour + + * cdl/isoinfra.cdl: Add CYGINT_ISO_STDIO_STREAMS and + CYGBLD_ISO_STDIO_STREAMS_HEADER. + Change flavor of other stdio interfaces to booldata + * include/stdio.h: Use #ifdefs not #ifs on interfaces to reflect above + Add CYGINT_ISO_STDIO_STREAMS and CYGBLD_ISO_STDIO_STREAMS_HEADER. + 2000-10-05 Nick Garnett * include/sys/types.h: Changed type of pid_t to plain int. It diff --git a/packages/isoinfra/current/cdl/isoinfra.cdl b/packages/isoinfra/current/cdl/isoinfra.cdl --- a/packages/isoinfra/current/cdl/isoinfra.cdl +++ b/packages/isoinfra/current/cdl/isoinfra.cdl @@ -149,6 +149,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_FILETYPES { display "Number of implementations of stdio file types" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_FILETYPES } } @@ -158,8 +159,23 @@ cdl_package CYGPKG_ISOINFRA { default_value 0 } + cdl_interface CYGINT_ISO_STDIO_STREAMS { + display "Stdio standard streams implementations" + flavor booldata + requires { 1 >= CYGINT_ISO_STDIO_STREAMS } + } + + cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + display "Stdio standard streams implementation header" + description "This header file must define stdin, stdout + and stderr." + flavor booldata + default_value 0 + } + cdl_interface CYGINT_ISO_STDIO_FILEOPS { display "Number of implementations of stdio file operations" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_FILEOPS } } @@ -176,6 +192,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_FILEACCESS { display "Number of implementations of stdio file access \ functionals" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_FILEACCESS } } @@ -191,6 +208,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_FORMATTED_IO { display "Number of implementations of stdio formatted I/O" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_FORMATTED_IO } } @@ -202,6 +220,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_CHAR_IO { display "Number of implementations of stdio character I/O" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_CHAR_IO } } @@ -213,6 +232,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_DIRECT_IO { display "Number of implementations of stdio direct I/O" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_DIRECT_IO } } @@ -224,6 +244,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_FILEPOS { display "Number of implementations of stdio file positioning" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_FILEPOS } } @@ -235,6 +256,7 @@ cdl_package CYGPKG_ISOINFRA { cdl_interface CYGINT_ISO_STDIO_ERROR { display "Number of implementations of stdio error handling" + flavor booldata requires { 1 >= CYGINT_ISO_STDIO_ERROR } } diff --git a/packages/isoinfra/current/include/stdio.h b/packages/isoinfra/current/include/stdio.h --- a/packages/isoinfra/current/include/stdio.h +++ b/packages/isoinfra/current/include/stdio.h @@ -60,49 +60,55 @@ #define __need_size_t #include -#if CYGINT_ISO_STDIO_FILETYPES +#ifdef CYGINT_ISO_STDIO_FILETYPES # ifdef CYGBLD_ISO_STDIO_FILETYPES_HEADER # include CYGBLD_ISO_STDIO_FILETYPES_HEADER # endif #endif -#if CYGINT_ISO_STDIO_FILEOPS +#ifdef CYGINT_ISO_STDIO_STREAMS +# ifdef CYGBLD_ISO_STDIO_STREAMS_HEADER +# include CYGBLD_ISO_STDIO_STREAMS_HEADER +# endif +#endif + +#ifdef CYGINT_ISO_STDIO_FILEOPS # ifdef CYGBLD_ISO_STDIO_FILEOPS_HEADER # include CYGBLD_ISO_STDIO_FILEOPS_HEADER # endif #endif -#if CYGINT_ISO_STDIO_FILEACCESS +#ifdef CYGINT_ISO_STDIO_FILEACCESS # ifdef CYGBLD_ISO_STDIO_FILEACCESS_HEADER # include CYGBLD_ISO_STDIO_FILEACCESS_HEADER # endif #endif -#if CYGINT_ISO_STDIO_FORMATTED_IO +#ifdef CYGINT_ISO_STDIO_FORMATTED_IO # ifdef CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER # include CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER # endif #endif -#if CYGINT_ISO_STDIO_CHAR_IO +#ifdef CYGINT_ISO_STDIO_CHAR_IO # ifdef CYGBLD_ISO_STDIO_CHAR_IO_HEADER # include CYGBLD_ISO_STDIO_CHAR_IO_HEADER # endif #endif -#if CYGINT_ISO_STDIO_DIRECT_IO +#ifdef CYGINT_ISO_STDIO_DIRECT_IO # ifdef CYGBLD_ISO_STDIO_DIRECT_IO_HEADER # include CYGBLD_ISO_STDIO_DIRECT_IO_HEADER # endif #endif -#if CYGINT_ISO_STDIO_FILEPOS +#ifdef CYGINT_ISO_STDIO_FILEPOS # ifdef CYGBLD_ISO_STDIO_FILEPOS_HEADER # include CYGBLD_ISO_STDIO_FILEPOS_HEADER # endif #endif -#if CYGINT_ISO_STDIO_ERROR +#ifdef CYGINT_ISO_STDIO_ERROR # ifdef CYGBLD_ISO_STDIO_ERROR_HEADER # include CYGBLD_ISO_STDIO_ERROR_HEADER # endif diff --git a/packages/kernel/current/ChangeLog b/packages/kernel/current/ChangeLog --- a/packages/kernel/current/ChangeLog +++ b/packages/kernel/current/ChangeLog @@ -300,6 +300,10 @@ 2000-06-08 Jesper Skov + + * tests/kcache1.c (entry0): Skip invalidate tests on TX49. Too slow. + 2000-05-30 Gary Thomas * tests/dhrystone.c: Increase number of test loops for faster @@ -344,6 +348,10 @@ 2000-05-20 Jonathan Larmour + + * tests/dhrystone.c: More loops on the TX49 + 2000-05-15 Jonathan Larmour * cdl/counters.cdl (CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY): diff --git a/packages/kernel/current/tests/dhrystone.c b/packages/kernel/current/tests/dhrystone.c --- a/packages/kernel/current/tests/dhrystone.c +++ b/packages/kernel/current/tests/dhrystone.c @@ -80,6 +80,8 @@ dtime(void) #define PASSES 100000 #elif defined(CYGPKG_HAL_V85X_V850_CEB) #define PASSES 20000 +#elif defined(CYGPKG_HAL_MIPS_TX49_REF4955) +#define PASSES 1000000 #elif defined(CYGPKG_HAL_POWERPC_MPC8xx) #define PASSES 250000 #else diff --git a/packages/kernel/current/tests/kcache1.c b/packages/kernel/current/tests/kcache1.c --- a/packages/kernel/current/tests/kcache1.c +++ b/packages/kernel/current/tests/kcache1.c @@ -324,6 +324,12 @@ static void entry0( cyg_addrword_t data if (cyg_test_is_simulator) CYG_TEST_PASS_FINISH("End of test"); +#if defined(CYGPKG_HAL_MIPS_TX49) + // The TX49 has a large cache, and even with reduced loop count, + // 90+ seconds elapses between each INFO output. + CYG_TEST_PASS_FINISH("End of test"); +#endif + cyg_test_is_simulator = 1; #endif #ifdef HAL_ICACHE_INVALIDATE_ALL diff --git a/packages/language/c/libc/stdio/current/ChangeLog b/packages/language/c/libc/stdio/current/ChangeLog --- a/packages/language/c/libc/stdio/current/ChangeLog +++ b/packages/language/c/libc/stdio/current/ChangeLog @@ -1,3 +1,22 @@ +2000-11-01 Jonathan Larmour + + * include/stdio.h: Make FILE array type larger to be more resistant + against small data sections. + Lose the cyg_libc_stdio_stdin/out/err definitions with macros for + stdin/stdout/err since it can cause problems with libgcc exception + code. Instead just make these extern FILE *s. + * src/common/stderr.cxx: + * src/common/stdin.cxx: + * src/common/stdout.cxx: + Define objects with init priority corresponding to order the fd's + should be allocated where applicable. + Define actual stdin, stdout, stderr externally visible constants to + point to the streams. + + * cdl/stdio.cdl: Support CYGINT_ISO_STDIO_STREAMS interface + + * src/common/fopen.cxx (fdopen): return f as intended + 2000-10-23 Jesper Skov * include/streambuf.inl: Adjust assertions to cope with buffers diff --git a/packages/language/c/libc/stdio/current/cdl/stdio.cdl b/packages/language/c/libc/stdio/current/cdl/stdio.cdl --- a/packages/language/c/libc/stdio/current/cdl/stdio.cdl +++ b/packages/language/c/libc/stdio/current/cdl/stdio.cdl @@ -56,6 +56,7 @@ cdl_package CYGPKG_LIBC_STDIO { implements CYGINT_ISO_STDIO_CHAR_IO implements CYGINT_ISO_STDIO_DIRECT_IO implements CYGINT_ISO_STDIO_ERROR + implements CYGINT_ISO_STDIO_STREAMS requires { CYGBLD_ISO_STDIO_FILETYPES_HEADER == \ "" } requires { CYGBLD_ISO_STDIO_FILEACCESS_HEADER == \ @@ -68,6 +69,8 @@ cdl_package CYGPKG_LIBC_STDIO { "" } requires { CYGBLD_ISO_STDIO_ERROR_HEADER == \ "" } + requires { CYGBLD_ISO_STDIO_STREAMS_HEADER == \ + "" } requires CYGPKG_ISOINFRA requires CYGINT_ISO_ERRNO_CODES requires CYGINT_ISO_ERRNO diff --git a/packages/language/c/libc/stdio/current/include/stdio.h b/packages/language/c/libc/stdio/current/include/stdio.h --- a/packages/language/c/libc/stdio/current/include/stdio.h +++ b/packages/language/c/libc/stdio/current/include/stdio.h @@ -91,30 +91,19 @@ typedef cyg_ucount32 fpos_t; // The array size is irrelevant other than being more than 8, and is present // to stop references to FILEs being marked as able to be put in the small // data section. We can't just mark it as in the ".data" section as on some -// targets it may actually be ".common". Maybe this doesn't matter? -// FIXME: This doesn't work if things are larger than 16 are put in sdata, -// e.g. on mips by specifying -G 32 -typedef CYG_ADDRESS FILE[16]; +// targets it may actually be ".common". +typedef CYG_ADDRESS FILE[9999]; // EXTERNAL VARIABLES // Default file streams for input/output. These only need to be // expressions, not l-values - ISO C standard chap. 7.9.1 // -// cyg_libc_stdio_stdin/out/err aren't really files of course, -// but they are only named here so that we can take the address of -// them, in which case it doesn't matter what type they point to really -// // CYGPRI_LIBC_STDIO_NO_DEFAULT_STREAMS is used when initializing -// cyg_libc_stdio_stdin/out/err privately inside the C library +// stdin/out/err privately inside the C library #ifndef CYGPRI_LIBC_STDIO_NO_DEFAULT_STREAMS -extern FILE cyg_libc_stdio_stdin, cyg_libc_stdio_stdout, - cyg_libc_stdio_stderr; - -#define stdin (&cyg_libc_stdio_stdin) -#define stdout (&cyg_libc_stdio_stdout) -#define stderr (&cyg_libc_stdio_stderr) +__externC FILE *stdin, *stdout, *stderr; #endif // FUNCTION PROTOTYPES diff --git a/packages/language/c/libc/stdio/current/src/common/fopen.cxx b/packages/language/c/libc/stdio/current/src/common/fopen.cxx --- a/packages/language/c/libc/stdio/current/src/common/fopen.cxx +++ b/packages/language/c/libc/stdio/current/src/common/fopen.cxx @@ -242,6 +242,7 @@ externC FILE *fdopen( int fd, const char Cyg_StdioStream *real_stream = (Cyg_StdioStream *)f; fpos_t pos = 0; real_stream->set_position( pos, SEEK_CUR ); + return f; } #endif // def CYGPKG_LIBC_STDIO_FILEIO diff --git a/packages/language/c/libc/stdio/current/src/common/stderr.cxx b/packages/language/c/libc/stdio/current/src/common/stderr.cxx --- a/packages/language/c/libc/stdio/current/src/common/stderr.cxx +++ b/packages/language/c/libc/stdio/current/src/common/stderr.cxx @@ -64,12 +64,18 @@ #include // C library files #include // Cyg_libc_stdio_find_filename() +// CONSTANTS + +// add 2 to the priority to allow it to be the fd 2 if necessary +#define PRIO (CYG_INIT_LIBC+2) + // STATICS Cyg_StdioStream -cyg_libc_stdio_stderr CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC) = Cyg_StdioStream( +cyg_libc_stdio_stderr CYGBLD_ATTRIB_INIT_PRI(PRIO) = Cyg_StdioStream( Cyg_libc_stdio_find_filename(CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE, - Cyg_StdioStream::CYG_STREAM_WRITE, false, false), + Cyg_StdioStream::CYG_STREAM_WRITE, + false, false), Cyg_StdioStream::CYG_STREAM_WRITE, false, false, _IONBF, 0, NULL ); // CLASSES @@ -86,6 +92,10 @@ public: // And here's an instance of the class just to make the code run static cyg_libc_dummy_stderr_init_class cyg_libc_dummy_stderr_init - CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC); + CYGBLD_ATTRIB_INIT_PRI(PRIO); + +// and finally stderr itself +__externC Cyg_StdioStream * const stderr; +Cyg_StdioStream * const stderr=&cyg_libc_stdio_stderr; // EOF stderr.cxx diff --git a/packages/language/c/libc/stdio/current/src/common/stdin.cxx b/packages/language/c/libc/stdio/current/src/common/stdin.cxx --- a/packages/language/c/libc/stdio/current/src/common/stdin.cxx +++ b/packages/language/c/libc/stdio/current/src/common/stdin.cxx @@ -64,10 +64,15 @@ #include // C library files #include // Cyg_libc_stdio_find_filename() +// CONSTANTS + +// Use default libc priority to allow it to be the fd 0 if necessary +#define PRIO (CYG_INIT_LIBC) + // STATICS Cyg_StdioStream -cyg_libc_stdio_stdin CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC) = Cyg_StdioStream( +cyg_libc_stdio_stdin CYGBLD_ATTRIB_INIT_PRI(PRIO) = Cyg_StdioStream( Cyg_libc_stdio_find_filename(CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE, Cyg_StdioStream::CYG_STREAM_READ, false, false), Cyg_StdioStream::CYG_STREAM_READ, false, false, _IOLBF ); @@ -87,5 +92,10 @@ public: // And here's an instance of the class just to make the code run static cyg_libc_dummy_stdin_init_class cyg_libc_dummy_stdin_init - CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC); + CYGBLD_ATTRIB_INIT_PRI(PRIO); + +// and finally stdin itself +__externC Cyg_StdioStream * const stdin; +Cyg_StdioStream * const stdin=&cyg_libc_stdio_stdin; + // EOF stdin.cxx diff --git a/packages/language/c/libc/stdio/current/src/common/stdout.cxx b/packages/language/c/libc/stdio/current/src/common/stdout.cxx --- a/packages/language/c/libc/stdio/current/src/common/stdout.cxx +++ b/packages/language/c/libc/stdio/current/src/common/stdout.cxx @@ -64,12 +64,18 @@ #include // C library files #include // Cyg_libc_stdio_find_filename() +// CONSTANTS + +// add 1 to the priority to allow it to be the fd 1 if necessary +#define PRIO (CYG_INIT_LIBC+1) + // STATICS Cyg_StdioStream -cyg_libc_stdio_stdout CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC) = Cyg_StdioStream( +cyg_libc_stdio_stdout CYGBLD_ATTRIB_INIT_PRI(PRIO) = Cyg_StdioStream( Cyg_libc_stdio_find_filename(CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE, - Cyg_StdioStream::CYG_STREAM_WRITE, false, false), + Cyg_StdioStream::CYG_STREAM_WRITE, + false, false), Cyg_StdioStream::CYG_STREAM_WRITE, false, false, _IOLBF ); // CLASSES @@ -86,6 +92,10 @@ public: // And here's an instance of the class just to make the code run static cyg_libc_dummy_stdout_init_class cyg_libc_dummy_stdout_init - CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_LIBC); + CYGBLD_ATTRIB_INIT_PRI(PRIO); + +// and finally stdout itself +__externC Cyg_StdioStream * const stdout; +Cyg_StdioStream * const stdout=&cyg_libc_stdio_stdout; // EOF stdout.cxx diff --git a/packages/services/memalloc/common/current/ChangeLog b/packages/services/memalloc/common/current/ChangeLog --- a/packages/services/memalloc/common/current/ChangeLog +++ b/packages/services/memalloc/common/current/ChangeLog @@ -1,3 +1,8 @@ +2000-11-01 Jesper Skov + + * tests/realloc.c (main): Use reasonable factor when making too + large realloc (targets with 64MB would cause an overflow). + 2000-10-31 Jonathan Larmour * tests/testaux.hxx: Prototype cyg_hal_invoke_constructors() diff --git a/packages/services/memalloc/common/current/tests/realloc.c b/packages/services/memalloc/common/current/tests/realloc.c --- a/packages/services/memalloc/common/current/tests/realloc.c +++ b/packages/services/memalloc/common/current/tests/realloc.c @@ -168,7 +168,7 @@ main( int argc, char *argv[] ) CYG_TEST_PASS_FAIL( fill_with_alphabet( str, size/4, 1 ), "reallocation quarter size usability"); - CYG_TEST_PASS_FAIL( realloc( str, size*100 ) == NULL, + CYG_TEST_PASS_FAIL( realloc( str, size*4 ) == NULL, "reallocing allocation that is too large" ); CYG_TEST_PASS_FAIL( compare_with_alphabet( str, size/4, 1 ), "Checking old contents maintained despite failure" ); diff --git a/packages/templates/all/ChangeLog b/packages/templates/all/ChangeLog --- a/packages/templates/all/ChangeLog +++ b/packages/templates/all/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Update inferred values for current CDL. + 2000-07-22 Jonathan Larmour * current.ect: Don't include signals package by default as it conflicts diff --git a/packages/templates/all/current.ect b/packages/templates/all/current.ect --- a/packages/templates/all/current.ect +++ b/packages/templates/all/current.ect @@ -165,3 +165,11 @@ cdl_option CYGSEM_KERNEL_SCHED_ASR_GLOBA inferred_value 1 }; +cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_SIGSETJMP_HEADER { + inferred_value 1 +}; + diff --git a/packages/templates/default/ChangeLog b/packages/templates/default/ChangeLog --- a/packages/templates/default/ChangeLog +++ b/packages/templates/default/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Update inferred values for stdio streams header + 2000-08-02 Jonathan Larmour * current.ect: Update inferred values for current CDL diff --git a/packages/templates/default/current.ect b/packages/templates/default/current.ect --- a/packages/templates/default/current.ect +++ b/packages/templates/default/current.ect @@ -119,3 +119,7 @@ cdl_option CYGBLD_ISO_SIGNAL_IMPL_HEADER cdl_option CYGBLD_ISO_SETJMP_HEADER { inferred_value 1 }; + +cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + inferred_value 1 +}; diff --git a/packages/templates/elix/ChangeLog b/packages/templates/elix/ChangeLog --- a/packages/templates/elix/ChangeLog +++ b/packages/templates/elix/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Update values for current CDL + 2000-10-11 Jonathan Larmour * current.ect: CYGPKG_NET_ETH_DRIVERS has been renamed to diff --git a/packages/templates/elix/current.ect b/packages/templates/elix/current.ect --- a/packages/templates/elix/current.ect +++ b/packages/templates/elix/current.ect @@ -173,3 +173,15 @@ cdl_option CYGBLD_ISO_PTHREAD_IMPL_HEADE cdl_option CYGBLD_ISO_POSIX_LIMITS_HEADER { inferred_value 1 }; + +cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_SIGSETJMP_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_OPEN_MAX_HEADER { + inferred_value 1 +}; diff --git a/packages/templates/net/ChangeLog b/packages/templates/net/ChangeLog --- a/packages/templates/net/ChangeLog +++ b/packages/templates/net/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Update inferred values for current CDL + 2000-08-03 Gary Thomas * current.ect: Ethernet drivers have moved. diff --git a/packages/templates/net/current.ect b/packages/templates/net/current.ect --- a/packages/templates/net/current.ect +++ b/packages/templates/net/current.ect @@ -175,5 +175,14 @@ cdl_option CYGSEM_KERNEL_SCHED_ASR_GLOBA inferred_value 1 }; +cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + inferred_value 1 +}; +cdl_option CYGBLD_ISO_SIGSETJMP_HEADER { + inferred_value 1 +}; +cdl_option CYGBLD_ISO_OPEN_MAX_HEADER { + inferred_value 1 +}; diff --git a/packages/templates/posix/ChangeLog b/packages/templates/posix/ChangeLog --- a/packages/templates/posix/ChangeLog +++ b/packages/templates/posix/ChangeLog @@ -1,3 +1,7 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Update inferred values for current CDL + 2000-07-24 Jonathan Larmour * current.ect: Add CYGPKG_LIBC_STARTUP and CYGPKG_LIBC_STARTUP because diff --git a/packages/templates/posix/current.ect b/packages/templates/posix/current.ect --- a/packages/templates/posix/current.ect +++ b/packages/templates/posix/current.ect @@ -112,3 +112,10 @@ cdl_option CYGBLD_ISO_POSIX_LIMITS_HEADE inferred_value 1 }; +cdl_option CYGBLD_ISO_SIGSETJMP_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_OPEN_MAX_HEADER { + inferred_value 1 +}; diff --git a/packages/templates/stubs/ChangeLog b/packages/templates/stubs/ChangeLog --- a/packages/templates/stubs/ChangeLog +++ b/packages/templates/stubs/ChangeLog @@ -1,3 +1,8 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Add inferred values for CDL that confuses the + config tool inference engine at present. + 2000-07-20 Nick Garnett * current.ect: Added ISOINFRA package. diff --git a/packages/templates/stubs/current.ect b/packages/templates/stubs/current.ect --- a/packages/templates/stubs/current.ect +++ b/packages/templates/stubs/current.ect @@ -21,3 +21,20 @@ This is the eCos stubs configuration. It cdl_option CYGBLD_BUILD_GDB_STUBS { user_value 1 ; }; + +cdl_option CYGBLD_ISO_ERRNO_CODES_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_ERRNO_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRERROR_HEADER { + inferred_value 1 +}; + +cdl_option CYGSEM_ERROR_PER_THREAD_ERRNO { + inferred_value 0 +}; + diff --git a/packages/templates/uitron/ChangeLog b/packages/templates/uitron/ChangeLog --- a/packages/templates/uitron/ChangeLog +++ b/packages/templates/uitron/ChangeLog @@ -1,3 +1,8 @@ +2000-11-03 Jonathan Larmour + + * current.ect: Add inferred values for CDL that confuses the + config tool inference engine at present. + 2000-09-07 Jonathan Larmour * current.ect: Add libc signals package because there's no real reason diff --git a/packages/templates/uitron/current.ect b/packages/templates/uitron/current.ect --- a/packages/templates/uitron/current.ect +++ b/packages/templates/uitron/current.ect @@ -35,3 +35,96 @@ features." ; }; +cdl_option CYGBLD_ISO_CTYPE_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_ERRNO_CODES_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_ERRNO_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_FILETYPES_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_STREAMS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_FILEACCESS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_FORMATTED_IO_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_CHAR_IO_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_DIRECT_IO_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDIO_ERROR_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDLIB_STRCONV_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDLIB_ABS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STDLIB_DIV_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRERROR_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRTOK_R_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRING_LOCALE_FUNCS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRING_MEMFUNCS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_STRING_STRFUNCS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_C_TIME_TYPES_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_C_CLOCK_FUNCS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_SIGNAL_NUMBERS_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_SIGNAL_IMPL_HEADER { + inferred_value 1 +}; + +cdl_option CYGBLD_ISO_SETJMP_HEADER { + inferred_value 1 +}; + +