| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- /*
- * Copyright 2010 by egnite GmbH
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * For additional information see http://www.ethernut.de/
- */
- /*
- * \file arch/avr/board/ethernut1.c
- * \brief Ethernut 1 board initialization.
- *
- * \verbatim
- * $Id$
- * \endverbatim
- */
- #include <cfg/memory.h>
- #include <cfg/arch/avr.h>
- #include <toolchain.h>
- #if defined(RTL_EESK_BIT) && defined(__GNUC__) && defined(NUTXMEM_SIZE)
- /*
- * Macros used for RTL8019AS EEPROM Emulation.
- * See FakeNicEeprom().
- */
- #ifndef RTL_BASE_ADDR
- #define RTL_BASE_ADDR 0x8300
- #endif
- #define NIC_CR _MMIO_BYTE(RTL_BASE_ADDR)
- #define NIC_EE _MMIO_BYTE(RTL_BASE_ADDR + 1)
- #if (RTL_EEMU_AVRPORT == AVRPORTB)
- #define RTL_EEMU_PORT PORTB
- #define RTL_EEMU_DDR DDRB
- #elif (RTL_EEMU_AVRPORT == AVRPORTD)
- #define RTL_EEMU_PORT PORTD
- #define RTL_EEMU_DDR DDRD
- #elif (RTL_EEMU_AVRPORT == AVRPORTE)
- #define RTL_EEMU_PORT PORTE
- #define RTL_EEMU_DDR DDRE
- #elif (RTL_EEMU_AVRPORT == AVRPORTF)
- #define RTL_EEMU_PORT PORTF
- #define RTL_EEMU_DDR DDRF
- #else
- #define RTL_EE_MEMBUS
- #define RTL_EEMU_PORT PORTC
- #define RTL_EEMU_DDR DDRC
- #endif /* RTL_EEMU_AVRPORT */
- #if (RTL_EEDO_AVRPORT == AVRPORTB)
- #define RTL_EEDO_PORT PORTB
- #define RTL_EEDO_DDR DDRB
- #elif (RTL_EEDO_AVRPORT == AVRPORTD)
- #define RTL_EEDO_PORT PORTD
- #define RTL_EEDO_DDR DDRD
- #elif (RTL_EEDO_AVRPORT == AVRPORTE)
- #define RTL_EEDO_PORT PORTE
- #define RTL_EEDO_DDR DDRE
- #elif (RTL_EEDO_AVRPORT == AVRPORTF)
- #define RTL_EEDO_PORT PORTF
- #define RTL_EEDO_DDR DDRF
- #else
- #define RTL_EE_MEMBUS
- #define RTL_EEDO_PORT PORTC
- #define RTL_EEDO_DDR DDRC
- #endif /* RTL_EEDO_AVRPORT */
- #if (RTL_EESK_AVRPORT == AVRPORTB)
- #define RTL_EESK_PIN PINB
- #define RTL_EESK_DDR DDRB
- #elif (RTL_EESK_AVRPORT == AVRPORTD)
- #define RTL_EESK_PIN PIND
- #define RTL_EESK_DDR DDRD
- #elif (RTL_EESK_AVRPORT == AVRPORTE)
- #define RTL_EESK_PIN PINE
- #define RTL_EESK_DDR DDRE
- #elif (RTL_EESK_AVRPORT == AVRPORTF)
- #define RTL_EESK_PIN PINF
- #define RTL_EESK_DDR DDRF
- #else
- #define RTL_EE_MEMBUS
- #define RTL_EESK_PIN PINC
- #define RTL_EESK_DDR DDRC
- #endif /* RTL_EESK_AVRPORT */
- /*
- * Before using extended memory, we need to run the RTL8019AS EEPROM emulation.
- * Not doing this may put this controller in a bad state, where it interferes
- * the data/address bus.
- *
- * This function has to be called as early as possible but after the external
- * memory interface has been enabled.
- *
- * The following part is used by the GCC environment only. For ICCAVR it has
- * been included in the C startup file.
- */
- static void FakeNicEeprom(void) NUT_NAKED_FUNC NUT_LINKER_SECT(".init1") NUT_USED_FUNC;
- void FakeNicEeprom(void)
- {
- /*
- * Prepare the EEPROM emulation port bits. Configure the EEDO
- * and the EEMU lines as outputs and set both lines to high.
- */
- #ifdef RTL_EEMU_BIT
- sbi(RTL_EEMU_PORT, RTL_EEMU_BIT);
- sbi(RTL_EEMU_DDR, RTL_EEMU_BIT);
- #endif
- sbi(RTL_EEDO_PORT, RTL_EEDO_BIT);
- sbi(RTL_EEDO_DDR, RTL_EEDO_BIT);
- /* Force the chip to re-read the EEPROM contents. */
- NIC_CR = 0xE1;
- NIC_EE = 0x40;
- /* No external memory access beyond this point. */
- #ifdef RTL_EE_MEMBUS
- cbi(MCUCR, SRE);
- #endif
- /*
- * Loop until the chip stops toggling our EESK input. We do it in
- * assembly language to make sure, that no external RAM is used
- * for the counter variable.
- */
- __asm__ __volatile__("\n" /* */
- "EmuLoop: " "\n" /* */
- " ldi r24, 0 " "\n" /* Clear counter. */
- " ldi r25, 0 " "\n" /* */
- " sbis %0, %1 " "\n" /* Check if EESK set. */
- " rjmp EmuClkClr " "\n" /* */
- "EmuClkSet: " "\n" /* */
- " adiw r24, 1 " "\n" /* Count loops with EESK set. */
- " breq EmuDone " "\n" /* Exit loop on counter overflow. */
- " sbis %0, %1 " "\n" /* Test if EESK is still set. */
- " rjmp EmuLoop " "\n" /* EESK changed, do another loop. */
- " rjmp EmuClkSet " "\n" /* Continue waiting. */
- "EmuClkClr: " "\n" /* */
- " adiw r24, 1 " "\n" /* Count loops with EESK clear. */
- " breq EmuDone " "\n" /* Exit loop on counter overflow. */
- " sbic %0, %1 " "\n" /* Test if EESK is still clear. */
- " rjmp EmuLoop " "\n" /* EESK changed, do another loop. */
- " rjmp EmuClkClr " "\n" /* Continue waiting. */
- "EmuDone: \n\t" /* */
- : /* No outputs. */
- :"I"(_SFR_IO_ADDR(RTL_EESK_PIN)), /* Emulation port. */
- "I"(RTL_EESK_BIT) /* EESK bit. */
- :"r24", "r25");
- /* Enable memory interface. */
- #ifdef RTL_EE_MEMBUS
- sbi(MCUCR, SRE);
- #endif
- /* Reset port outputs to default. */
- #ifdef RTL_EEMU_BIT
- cbi(RTL_EEMU_PORT, RTL_EEMU_BIT);
- cbi(RTL_EEMU_DDR, RTL_EEMU_BIT);
- #endif
- cbi(RTL_EEDO_PORT, RTL_EEDO_BIT);
- cbi(RTL_EEDO_DDR, RTL_EEDO_BIT);
- }
- #endif /* RTL_EESK_BIT && __GNUC__ && NUTXMEM_SIZE */
- /*!
- * \brief Early Ethernut 1 hardware initialization.
- */
- void NutBoardInit(void)
- {
- }
|