📄 pci.h
字号:
// 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 bus configuration space for a device whose properties// match those required by the match_func, which the user supplies. The// match_func's arguments are vendor, device, class exactly as they might// be in the two APIs above. The additional parameter is for any state// which a caller might wish available to its callback routine.// 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.typedef cyg_bool (cyg_pci_match_func)( cyg_uint16,/* vendor */ cyg_uint16,/* device */ cyg_uint32,/* class */ void * /* arbitrary user data */ );externC cyg_bool cyg_pci_find_matching( cyg_pci_match_func *matchp, void * match_callback_data, 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 );// Allocate memory and IO space for all devices found on the given// bus and its subordinate busses. This routine recurses when a// PCI-to-PCI bridge is encountered. The next_bus argument points// to a variable holding the bus number of the next PCI bus to// be allocated when a bridge is encountered. This routine returns// true if successful, false if unsuccessful.externC cyg_bool cyg_pci_configure_bus( cyg_uint8 bus, cyg_uint8 *next_bus );// 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.// Note: these can be overridden by the platform#ifndef CYG_PCI_MAX_BUS#define CYG_PCI_MAX_BUS 8 // Eight is enough?#endif#ifndef CYG_PCI_MAX_DEV#define CYG_PCI_MAX_DEV 32#endif#ifndef CYG_PCI_MIN_DEV#define CYG_PCI_MIN_DEV 0#endif#ifndef CYG_PCI_MAX_FN#define CYG_PCI_MAX_FN 8#endif#ifndef CYG_PCI_MAX_BAR#define CYG_PCI_MAX_BAR 6#endif//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_PCI_H// End of pci.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -