snds100_misc.c
来自「eCos操作系统源码」· C语言 代码 · 共 287 行
C
287 行
//==========================================================================//// snds100_misc.c//// HAL misc board support code for Samsung SNDS100////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): gthomas// Contributors: gthomas, jskov// Grant Edwards <grante@visi.com>// Date: 2001-07-31// Purpose: HAL board support// Description: Implementations of HAL board interfaces////####DESCRIPTIONEND####////========================================================================*/#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.h> // base types#include <cyg/infra/cyg_trac.h> // tracing macros#include <cyg/infra/cyg_ass.h> // assertion macros#include <cyg/infra/diag.h> // diag_printf()#include <cyg/hal/hal_io.h> // IO macros#include <cyg/hal/hal_arch.h> // Register state info#include <cyg/hal/hal_diag.h>#include <cyg/hal/hal_cache.h>#include <cyg/hal/hal_intr.h> // necessary?#include <cyg/hal/hal_if.h> // calling interface#include <cyg/hal/hal_misc.h> // helper functions#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT#include <cyg/hal/drv_api.h> // HAL ISR support#endif#include "ks32c5000.h"#include <cyg/hal/plf_io.h>//======================================================================// Use Timer0 for kernel clockstatic cyg_uint32 _period;#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORTstatic cyg_interrupt abort_interrupt;static cyg_handle_t abort_interrupt_handle;// This ISR is called only for the Abort button interruptstatic intks32c_abort_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs){ cyg_hal_user_break((CYG_ADDRWORD*)regs); cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_EXT0); return 0; // No need to run DSR}#endifvoid hal_clock_initialize(cyg_uint32 period){ cyg_uint32 tmod; // Disable timer 0 HAL_READ_UINT32(KS32C_TMOD, tmod); tmod &= ~(KS32C_TMOD_TE0); HAL_WRITE_UINT32(KS32C_TMOD, 0); tmod &= ~(KS32C_TMOD_TMD0 | KS32C_TMOD_TCLR0); tmod |= KS32C_TMOD_TE0; // Set counter HAL_WRITE_UINT32(KS32C_TDATA0, period); // And enable timer HAL_WRITE_UINT32(KS32C_TMOD, tmod); _period = period;#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_EXT0, 99, // Priority 0, // Data item passed to interrupt handler ks32c_abort_isr, 0, &abort_interrupt_handle, &abort_interrupt); cyg_drv_interrupt_attach(abort_interrupt_handle); cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EXT0);#endif}void hal_clock_reset(cyg_uint32 vector, cyg_uint32 period){ _period = period;}void hal_clock_read(cyg_uint32 *pvalue){ cyg_uint32 value; HAL_READ_UINT32(KS32C_TCNT0, value); *pvalue = _period - value;}//======================================================================// Interrupt controller stuffextern volatile tInterruptController ks32c5000_int; // Interrupt controller registersextern volatile unsigned long EXTACON0; // Extern access control regextern volatile unsigned long EXTACON1; // Extern access control regextern volatile unsigned long IOPCON; // I/O Port Control regextern volatile unsigned long IOPMOD;extern volatile unsigned long SYSCON;void hal_hardware_init(void){ cyg_uint32 intmask, syscfg; // Set up eCos/ROM interfaces hal_if_init(); // Enable cache HAL_READ_UINT32(KS32C_SYSCFG, syscfg); syscfg &= ~KS32C_SYSCFG_CM_MASK; syscfg |= KS32C_SYSCFG_CM_0R_8C|KS32C_SYSCFG_WE; HAL_WRITE_UINT32(KS32C_SYSCFG, syscfg); HAL_UCACHE_INVALIDATE_ALL(); HAL_UCACHE_ENABLE(); // Clear global interrupt mask bit HAL_READ_UINT32(KS32C_INTMSK, intmask); intmask &= ~KS32C_INTMSK_GLOBAL; HAL_WRITE_UINT32(KS32C_INTMSK, intmask);}// This routine is called to respond to a hardware interrupt (IRQ). It// should interrogate the hardware and return the IRQ vector number.int hal_IRQ_handler(void){ // Do hardware-level IRQ handling cyg_uint32 irq_status; HAL_READ_UINT32(KS32C_INTOFFSET_IRQ, irq_status); irq_status = irq_status / 4; if (CYGNUM_HAL_ISR_MAX >= irq_status) return irq_status; // It's a bit bogus to test for FIQs after IRQs, but we use the // latter more, so don't impose the overhead of checking for FIQs HAL_READ_UINT32(KS32C_INTOFFSET_FIQ, irq_status); irq_status = irq_status / 4; if (CYGNUM_HAL_ISR_MAX >= irq_status) return irq_status; return CYGNUM_HAL_INTERRUPT_NONE;}//// Interrupt control//void hal_interrupt_mask(int vector){ cyg_uint32 mask, old_mask; HAL_READ_UINT32(KS32C_INTMSK, mask); old_mask = mask; mask |= (1<<vector); HAL_WRITE_UINT32(KS32C_INTMSK, mask);}void hal_interrupt_unmask(int vector){ cyg_uint32 mask, old_mask; HAL_READ_UINT32(KS32C_INTMSK, mask); old_mask = mask; mask &= ~(1<<vector); HAL_WRITE_UINT32(KS32C_INTMSK, mask);}void hal_interrupt_acknowledge(int vector){ HAL_WRITE_UINT32(KS32C_INTPND, (1<<vector));}void hal_interrupt_configure(int vector, int level, int up){}void hal_interrupt_set_level(int vector, int level){}void hal_show_IRQ(int vector, int data, int handler){}// -------------------------------------------------------------------------//// Delay for some number of micro-seconds//void hal_delay_us(cyg_int32 usecs){ cyg_uint32 count; cyg_uint32 ticks = ((CYGNUM_HAL_RTC_PERIOD*CYGNUM_HAL_RTC_DENOMINATOR)/1000000) * usecs; cyg_uint32 tmod; // Disable timer 1 HAL_READ_UINT32(KS32C_TMOD, tmod); tmod &= ~(KS32C_TMOD_TE1); HAL_WRITE_UINT32(KS32C_TMOD, tmod); tmod &= ~(KS32C_TMOD_TMD1 | KS32C_TMOD_TCLR1); tmod |= KS32C_TMOD_TE1; // Clear pending flag HAL_WRITE_UINT32(KS32C_INTPND, (1 << CYGNUM_HAL_INTERRUPT_TIMER1)); // Set counter HAL_WRITE_UINT32(KS32C_TDATA1, ticks); // And enable timer HAL_WRITE_UINT32(KS32C_TMOD, tmod); // Wait for timer to underflow. Can't test the timer completion // bit without actually enabling the interrupt. So instead watch // the counter. ticks /= 2; // wait for this threshold // Wait till timer counts below threshold do { HAL_READ_UINT32(KS32C_TCNT1, count); } while (count >= ticks); // then wait for it to be reloaded do { HAL_READ_UINT32(KS32C_TCNT1, count); } while (count < ticks); // Then disable timer 1 again tmod &= ~KS32C_TMOD_TE1; HAL_WRITE_UINT32(KS32C_TMOD, tmod);}// No way to reset boardvoid hal_reset(void){ CYG_INTERRUPT_STATE old; HAL_DISABLE_INTERRUPTS(old); while (1) ;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?