📄 pci.h
字号:
#ifndef CYGONCE_PCI_H#define CYGONCE_PCI_H//=============================================================================//// pci.h//// PCI library////=============================================================================//####COPYRIGHTBEGIN####// // ------------------------------------------- // The contents of this file are subject to the Red Hat eCos Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.redhat.com/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations under // the License. // // The Original Code is eCos - Embedded Configurable Operating System, // released September 30, 1998. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jskov, from design by nickg // Contributors: jskov// Date: 1999-08-09// Purpose: PCI configuration access// Usage:// #include <cyg/io/pci.h>// Description: // This library provides a set of routines for accessing // the PCI bus configuration space in a portable manner. // This is provided by two APIs. The high level API (defined// by this file) is used by device drivers, or other code, to// access the PCI configuration space portably. The low level// API (see pci_hw.h) is used by the PCI library itself// to access the hardware in a platform-specific manner and// may also be used by device drivers to access the PCI// configuration space directly.////####DESCRIPTIONEND####////=============================================================================#include <cyg/infra/cyg_type.h>#include <cyg/io/pci_cfg.h>#include <cyg/io/pci_hw.h>//------------------------------------------------------------------// The PCI memory space can span 64 bits, IO space only 32 bitstypedef CYG_WORD64 CYG_PCI_ADDRESS64;typedef CYG_WORD32 CYG_PCI_ADDRESS32;//------------------------------------------------------------------// Macros for manufacturing and decomposing device idstypedef CYG_WORD32 cyg_pci_device_id; // PCI device ID#define CYG_PCI_DEV_MAKE_ID(__bus,__devfn) (((__bus)<<16)|((__devfn)<<8))#define CYG_PCI_DEV_GET_BUS(__devid) ((__devid>>16)&0xFF)#define CYG_PCI_DEV_GET_DEVFN(__devid) ((__devid>>8)&0xFF)#define CYG_PCI_NULL_DEVID 0xffffffff//------------------------------------------------------------------// PCI device data definitions and structurestypedef enum { CYG_PCI_HEADER_NORMAL = 0, CYG_PCI_HEADER_BRIDGE = 1, CYG_PCI_HEADER_CARDBUS_BRIDGE = 2} cyg_pci_header_type;typedef struct // PCI device data{ cyg_pci_device_id devid; // ID of this device // The following fields are read out of the // config space for this device. cyg_uint16 vendor; // vendor ID cyg_uint16 device; // device ID cyg_uint16 command; // command register cyg_uint16 status; // status register cyg_uint32 class_rev; // class+revision cyg_uint8 cache_line_size; // cache line size cyg_uint8 latency_timer; // latency timer cyg_pci_header_type header_type; // header type cyg_uint8 bist; // Built-in Self-Test cyg_uint32 base_address[6]; // Memory base address registers // The following fields are used by the resource allocation // routines to keep track of allocated resources. cyg_uint32 base_size[6]; // Memory size for each base address cyg_uint32 base_map[6]; // Physical address mapped CYG_ADDRWORD hal_vector; // HAL interrupt vector used by // device if int_line!=0 // One of the following unions will be filled in according to // the value of the header_type field. union { struct { cyg_uint32 cardbus_cis; // CardBus CIS Pointer cyg_uint16 sub_vendor; // subsystem vendor id cyg_uint16 sub_id; // subsystem id cyg_uint32 rom_address; // ROM address register cyg_uint8 cap_list; // capability list cyg_uint8 reserved1[7]; cyg_uint8 int_line; // interrupt line cyg_uint8 int_pin; // interrupt pin cyg_uint8 min_gnt; // timeslice request cyg_uint8 max_lat; // priority-level request } normal; struct { // Not yet supported } bridge; struct { // Not yet supported } cardbus_bridge; } header;} cyg_pci_device; //------------------------------------------------------------------------// InitexternC void cyg_pci_init( void );//------------------------------------------------------------------------// Common device configuration access functions// This function gets the PCI configuration information for the// device indicated in devid. The common fields of the cyg_pci_device// structure, and the appropriate fields of the relevant header union// member are filled in from the device's configuration space. If the// device has not been enabled, then this function will also fetch// the size and type information from the base address registers and// place it in the base_size[] array.externC void cyg_pci_get_device_info ( cyg_pci_device_id devid, cyg_pci_device *dev_info );// This function sets the PCI configuration information for the// device indicated in devid. Only the configuration space registers// that are writable are actually written. Once all the fields have// been written, the device info will be read back into *dev_info, so// that it reflects the true state of the hardware.externC void cyg_pci_set_device_info ( cyg_pci_device_id devid, cyg_pci_device *dev_info );//------------------------------------------------------------------------// Device find functions// Searches the PCI bus configuration space for a device with the// given vendor and device ids. The search starts at the device// pointed to by devid, or at the first slot if it contains// CYG_PCI_NULL_DEVID. *devid will be updated with the ID of the next// device found. Returns true if one is found and false if not.externC cyg_bool cyg_pci_find_device( cyg_uint16 vendor, cyg_uint16 device, cyg_pci_device_id *devid );// Searches the PCI bus configuration space for a device with the// given class code. The search starts at the device pointed to by// devid, or at the first slot if it contains CYG_PCI_NULL_DEVID.// *devid will be updated with the ID of the next device found.// Returns true if one is found and false if not.externC cyg_bool cyg_pci_find_class( cyg_uint32 dev_class, cyg_pci_device_id *devid );// Searches the PCI configuration space for the next valid device// after cur_devid. If cur_devid is given the value// CYG_PCI_NULL_DEVID, then the search starts at the first slot. It// is permitted for next_devid to point to the cur_devid. Returns// true if another device is found and false if not.externC cyg_bool cyg_pci_find_next( cyg_pci_device_id cur_devid, cyg_pci_device_id *next_devid );//------------------------------------------------------------------------// Resource Allocation// These routines allocate memory and IO space to PCI devices.// Allocate memory and IO space to all base address registers using// the current memory and IO base addresses in the library. If// dev_info does not contain valid base_size[] entries, then the// result is false.externC cyg_bool cyg_pci_configure_device( cyg_pci_device *dev_info );// These routines set the base addresses for memory and IO mappings// to be used by the memory allocation routines. Normally these base// addresses will be set to default values based on the platform,// these routines allow those to be changed by application code if// necessary.externC void cyg_pci_set_memory_base( CYG_PCI_ADDRESS64 base );externC void cyg_pci_set_io_base( CYG_PCI_ADDRESS32 base );// These routines allocate memory or IO space to the base address// register indicated by bar. The base address in *base will be// correctly aligned and the address of the next free location will// be written back into it if the allocation succeeds. If the base// address register is of the wrong type for this allocation, or// dev_info does not contain valid base_size[] entries, the result is// false.externC cyg_bool cyg_pci_allocate_memory( cyg_pci_device *dev_info, cyg_uint32 bar, CYG_PCI_ADDRESS64 *base );externC cyg_bool cyg_pci_allocate_io( cyg_pci_device *dev_info, cyg_uint32 bar, CYG_PCI_ADDRESS32 *base );// Translate the device's PCI interrupt (INTA#-INTD#) to the// associated HAL vector. This may also depend on which slot the// device occupies. If the device may generate interrupts, the// translated vector number will be stored in vec and the result is// true. Otherwise the result is false.externC cyg_bool cyg_pci_translate_interrupt( cyg_pci_device *dev_info, CYG_ADDRWORD *vec );//----------------------------------------------------------------------// Specific device configuration access functions// Read functions// These functions read registers of the appropriate size from the// configuration space of the given device. They should mainly be// used to access registers that are device specific. General PCI// registers are best accessed through cyg_pci_get_device_info().externC void cyg_pci_read_config_uint8( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint8 *val);externC void cyg_pci_read_config_uint16( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint16 *val);externC void cyg_pci_read_config_uint32( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint32 *val);// Write functions// These functions write registers of the appropriate size to the// configuration space of the given device. They should mainly be// used to access registers that are device specific. General PCI// registers are best accessed through// cyg_pci_get_device_info(). Writing the general registers this way// may render the contents of a cyg_pci_device structure invalid.externC void cyg_pci_write_config_uint8( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint8 val);externC void cyg_pci_write_config_uint16( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint16 val);externC void cyg_pci_write_config_uint32( cyg_pci_device_id devid, cyg_uint8 offset, cyg_uint32 val);//----------------------------------------------------------------------// Functions private to the PCI library. These should only be used by// tests.externC cyg_bool cyg_pci_allocate_memory_priv(cyg_pci_device *dev_info, cyg_uint32 bar, CYG_PCI_ADDRESS64 *base, CYG_PCI_ADDRESS64 *assigned_addr);externC cyg_bool cyg_pci_allocate_io_priv( cyg_pci_device *dev_info, cyg_uint32 bar, CYG_PCI_ADDRESS32 *base, CYG_PCI_ADDRESS32 *assigned_addr);//----------------------------------------------------------------------// Bus probing limits.#define CYG_PCI_MAX_BUS 1 // FIXME: Just the one for now#define CYG_PCI_MAX_DEV 32#define CYG_PCI_MAX_FN 8#define CYG_PCI_MAX_BAR 6//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_PCI_H// End of pci.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -