⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcmb_io.h

📁 eCos操作系统源码
💻 H
字号:
#ifndef CYGONCE_PCMB_IO_H#define CYGONCE_PCMB_IO_H//=============================================================================////      pcmb_io.h////      PC Motherboard specific IO support////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.// Copyright (C) 2002 Gary Thomas//// 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):    proven// Contributors: proven, jskov, pjo// Date:         1999-10-15// Purpose:      PC Motherboard IO support// Description:  The macros defined here provide the HAL APIs for handling//               basic IO - specifically PCI config access.//              //####DESCRIPTIONEND####////==========================================================================#include <pkgconf/system.h>#include CYGBLD_HAL_PLATFORM_H#include <cyg/hal/pcmb_io.h>//----------------------------------------------------------------------------// The PCI resources required by the STPC // PCI Config registers in IO space#define STPC_PCI_ADDR_REG  (0xCF8)#define STPC_PCI_DATA_REG  (0xCFC)//----------------------------------------------------------------------------// Initialize the PCI bus.#define HAL_PCI_INIT() \CYG_MACRO_START    \CYG_MACRO_END//----------------------------------------------------------------------------// Compute address necessary to access PCI config space for the given// bus and device.#define HAL_PCI_CONFIG_ADDRESS( __bus, __devfn, __offset )               \	((1<<31) | ((__bus) << 16) | ((__devfn) << 8) | ((__offset) & ~3))               //----------------------------------------------------------------------------// Read a value from the PCI configuration space of the appropriate// size at an address composed from the bus, devfn and offset.#define HAL_PCI_CFG_READ_UINT32( __bus, __devfn, __offset, __val )                              \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_READ_UINT32(STPC_PCI_DATA_REG,(__val));                                                 \CYG_MACRO_END#define HAL_PCI_CFG_READ_UINT8( __bus, __devfn, __offset, __val )                               \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_READ_UINT8(STPC_PCI_DATA_REG + ((__offset)&3),(__val));                                 \CYG_MACRO_END    #define HAL_PCI_CFG_READ_UINT16( __bus, __devfn, __offset, __val )                              \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_READ_UINT16(STPC_PCI_DATA_REG + ((__offset)&2),(__val));                                \CYG_MACRO_END    //----------------------------------------------------------------------------// Write a value to the PCI configuration space of the appropriate// size at an address composed from the bus, devfn and offset.#define HAL_PCI_CFG_WRITE_UINT32( __bus, __devfn, __offset, __val )                             \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_WRITE_UINT32(STPC_PCI_DATA_REG,(__val));                                                \CYG_MACRO_END#define HAL_PCI_CFG_WRITE_UINT8( __bus, __devfn, __offset, __val )                              \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_WRITE_UINT8(STPC_PCI_DATA_REG+(__offset & 3),(__val));                                  \CYG_MACRO_END#define HAL_PCI_CFG_WRITE_UINT16( __bus, __devfn, __offset, __val )                             \CYG_MACRO_START                                                                                 \    HAL_WRITE_UINT32(STPC_PCI_ADDR_REG,HAL_PCI_CONFIG_ADDRESS((__bus),(__devfn),(__offset)));   \    HAL_WRITE_UINT16(STPC_PCI_DATA_REG+(__offset & 2),(__val));                                 \CYG_MACRO_END     //-----------------------------------------------------------------------------// Resources#ifdef CYGSEM_HAL_I386_PC_LARGE_PCI_SPACE// Use unrestricted PCI space#define CYG_PCI_MAX_BUS                     256#define CYG_PCI_MIN_DEV                       0#define CYG_PCI_MAX_DEV                      32#define CYG_PCI_MAX_FN                        8#endif// This is where the PCI spaces are mapped in the CPU's address space.// In the PC the PCI address space is mapped 1-1 into the CPU physical// address space, so these values are both zero.#define HAL_PCI_PHYSICAL_MEMORY_BASE    0x00000000#define HAL_PCI_PHYSICAL_IO_BASE        0x0000// Map PCI device resources starting from these addresses in PCI space.// These are the addresses in PCI space where we should map device// memory.  Since there is RAM and other devices in low memory and IO// space, we allocate from high addresses. In most PC platforms, the// BIOS will have actually allocated the PCI devices before we start,// so these values are actually academic.#define HAL_PCI_ALLOC_BASE_MEMORY  0xf0000000#define HAL_PCI_ALLOC_BASE_IO      0xDF00//----------------------------------------------------------------------------// Translate the PCI interrupt requested by the device (INTA#, INTB#,// INTC# or INTD#) to the associated CPU interrupt (i.e., HAL vector).#define HAL_PCI_TRANSLATE_INTERRUPT( __bus, __devfn, __vec, __valid)            \CYG_MACRO_START                                                                 \	HAL_PCI_CFG_READ_UINT8((__bus),(__devfn),CYG_PCI_CFG_INT_LINE,(__vec)); \	if(__vec<=15) __valid=1;                                                \	else __valid=0;                                                         \	__vec += 0x20;                                                          \CYG_MACRO_END//-----------------------------------------------------------------------------// CMOS RAM access#define HAL_CMOS_ADDRESS        0x70    // CMOS address register#define HAL_CMOS_DATA           0x71    // CMOS data register#define HAL_READ_CMOS( __addr, __val )                  \CYG_MACRO_START                                         \{                                                       \    HAL_WRITE_UINT8( HAL_CMOS_ADDRESS, __addr );        \    HAL_READ_UINT8( HAL_CMOS_DATA, (__val) );           \}                                                       \CYG_MACRO_END#define HAL_WRITE_CMOS( __addr, __val )                 \CYG_MACRO_START                                         \{                                                       \    HAL_WRITE_UINT8( HAL_CMOS_ADDRESS, __addr );        \    HAL_WRITE_UINT8( HAL_CMOS_DATA, (__val) );          \}                                                       \CYG_MACRO_END//-----------------------------------------------------------------------------// Debug macros// Some simple macros for writing useful info to a PC ASCII display#define PC_WRITE_SCREEN( __pos, __ch ) \                       (*((short *)(0xB8000)+((__pos)%(80*25))) = (0x0700+(__ch)))#define PC_SCREEN_LINE( __line ) ((__line)*80)#define PC_WRITE_SCREEN_8( __pos, __val )                       \{                                                               \    char __hex[] = "0123456789ABCDEF";                          \    PC_WRITE_SCREEN( (__pos), __hex[((int)(__val)>>4)&0xF] );        \    PC_WRITE_SCREEN( ((__pos)+1), __hex[(int)(__val)&0xF] );         \}#define PC_WRITE_SCREEN_16( __pos, __val )      \    PC_WRITE_SCREEN_8( __pos, (int)(__val)>>8 );     \    PC_WRITE_SCREEN_8( (__pos)+2, (int)(__val) );#define PC_WRITE_SCREEN_32( __pos, __val )      \    PC_WRITE_SCREEN_16( __pos, (int)(__val)>>16 );   \    PC_WRITE_SCREEN_16( (__pos)+4, (int)(__val) );//-----------------------------------------------------------------------------// IDE interface macros//#define HAL_IDE_NUM_CONTROLLERS 2// Initialize the IDE controller(s).#define HAL_IDE_INIT() (HAL_IDE_NUM_CONTROLLERS)#define __PCMB_IDE_PRI_CMD   0x1f0#define __PCMB_IDE_PRI_CTL   0x3f4#define __PCMB_IDE_SEC_CMD   0x170#define __PCMB_IDE_SEC_CTL   0x374#define __CMD_ADDR(__n) ((__n) ? __PCMB_IDE_SEC_CMD : __PCMB_IDE_PRI_CMD)#define __CTL_ADDR(__n) ((__n) ? __PCMB_IDE_SEC_CTL : __PCMB_IDE_PRI_CTL)#define HAL_IDE_READ_UINT8( __ctlr, __regno, __val )  \    HAL_READ_UINT8(__CMD_ADDR(__ctlr) + (__regno), (__val))#define HAL_IDE_READ_UINT16( __ctlr, __regno, __val )  \    HAL_READ_UINT16(__CMD_ADDR(__ctlr) + (__regno), (__val))#define HAL_IDE_READ_ALTSTATUS( __ctlr, __val )  \    HAL_READ_UINT16(__CTL_ADDR(__ctlr) + 2, (__val))#define HAL_IDE_WRITE_UINT8( __ctlr, __regno, __val )  \    HAL_WRITE_UINT8(__CMD_ADDR(__ctlr) + (__regno), (__val))#define HAL_IDE_WRITE_UINT16( __ctlr, __regno, __val )  \    HAL_WRITE_UINT16(__CMD_ADDR(__ctlr) + (__regno), (__val))#define HAL_IDE_WRITE_CONTROL( __ctlr, __val )  \    HAL_WRITE_UINT16(__CTL_ADDR(__ctlr) + 2, (__val))//-----------------------------------------------------------------------------// end of pcmb_io.h#endif // CYGONCE_PCMB_IO_H

⌨️ 快捷键说明

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