aim711_misc.c

来自「eCos操作系统源码」· C语言 代码 · 共 601 行 · 第 1/2 页

C
601
字号
//==========================================================================////      aim711_misc.c////      HAL misc board support code for ARM Industrial Module AIM 711////==========================================================================//####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, r.cassebohm//               Michael Checky <Michael_Checky@ThermoKing.com>//               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 <pkgconf/system.h>#ifndef MIN#define MIN(_x_,_y_) ((_x_) < (_y_) ? (_x_) : (_y_))#endif#ifndef MAX#define MAX(_x_,_y_) ((_x_) > (_y_) ? (_x_) : (_y_))#endif//======================================================================// Use Timer0 for kernel clockstatic cyg_uint32 _period;#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT#if 0 // Not supported yetstatic 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_EXT2);    return 0;  // No need to run DSR}#endif#endifvoid hal_clock_initialize(cyg_uint32 period){    cyg_uint32 tmod, clkcon;    // 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_READ_UINT32(KS32C_CLKCON, clkcon);    period = period/((clkcon & 0xffff) + 1);    HAL_WRITE_UINT32(KS32C_TDATA0, period);    // And enable timer    HAL_WRITE_UINT32(KS32C_TMOD, tmod);    _period = period;#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT#if 0 // Not supported yet    cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_EXT2,                             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_EXT2);#endif#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;}static voidhal_ks32c_i2c_init(void);//======================================================================// Interrupt controller stuffvoid hal_hardware_init(void){    cyg_uint32 intmask, syscfg, val;    // Setup external IO timing    // Timing for Ext0 is for external 16550 UART, all other are default values    val = ( KS32C_EXTACON_INIT(1,1,3,0) << KS32C_EXTACON0_EXT0_shift ) \            | ( KS32C_EXTACON_INIT(1,1,3,1) << KS32C_EXTACON0_EXT1_shift );    HAL_WRITE_UINT32(KS32C_EXTACON0, val);    val = ( KS32C_EXTACON_INIT(1,1,3,1) << KS32C_EXTACON1_EXT2_shift ) \            | ( KS32C_EXTACON_INIT(1,1,3,1) << KS32C_EXTACON1_EXT3_shift );    HAL_WRITE_UINT32(KS32C_EXTACON1, val);    // Setup GPIO ports    HAL_READ_UINT32(KS32C_IOPMOD, val);    val |= (AIM711_GPIO_DOUT0_DAK0|AIM711_GPIO_DOUT1_DAK1 \            |AIM711_GPIO_DOUT2_TO0|AIM711_GPIO_DOUT3_TO1 \            |AIM711_GPIO_POWERLED);    HAL_WRITE_UINT32(KS32C_IOPMOD, val);    // Make Power LED on    AIM711_GPIO_SET(AIM711_GPIO_POWERLED);    // Enable XIRQ0 for external 16550 UART    HAL_READ_UINT32(KS32C_IOPCON, val);    val &= ~( KS32C_IOPCON_XIRQ_MASK << KS32C_IOPCON_XIRQ0_shift );    val |= ( KS32C_IOPCON_XIRQ_LEVEL|KS32C_IOPCON_XIRQ_AKTIV_HI| \            KS32C_IOPCON_XIRQ_ENABLE ) << KS32C_IOPCON_XIRQ0_shift ;    HAL_WRITE_UINT32(KS32C_IOPCON, val);    // 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();    // Setup I2C bus    hal_ks32c_i2c_init();    // 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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?