Mercurial > ecos
diff packages/hal/sh/arch/current/src/hal_misc.c @ 134:d2f49caf9e38 ecos-sw-2000-11-03
Merge from eCos master repository on 2000-11-03-09:00:49-GMT
| author | jlarmour |
|---|---|
| date | Fri, 03 Nov 2000 21:17:40 +0000 |
| parents | eb9fd8c04db3 |
| children | 9b55e9c69693 |
line wrap: on
line diff
--- 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 <cyg/hal/hal_cache.h> // HAL cache #include <cyg/hal/hal_intr.h> // HAL interrupts/exceptions +#include <cyg/hal/sh_regs.h> // 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
