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

📄 pci-library-reference.html

📁 ecos 文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!-- Copyright (C) 2003 Red Hat, Inc.                                -->
<!-- This material may be distributed only subject to the terms      -->
<!-- and conditions set forth in the Open Publication License, v1.0  -->
<!-- or later (the latest version is presently available at          -->
<!-- http://www.opencontent.org/openpub/).                           -->
<!-- Distribution of the work or derivative of the work in any       -->
<!-- standard (paper) book form is prohibited unless prior           -->
<!-- permission is obtained from the copyright holder.               -->
<HTML
><HEAD
><TITLE
>PCI Library reference</TITLE
><meta name="MSSmartTagsPreventParsing" content="TRUE">
<META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
"><LINK
REL="HOME"
TITLE="eCos Reference Manual"
HREF="ecos-ref.html"><LINK
REL="UP"
TITLE="The eCos PCI Library"
HREF="ecos-pci-library.html"><LINK
REL="PREVIOUS"
TITLE="The eCos PCI Library"
HREF="ecos-pci-library.html"><LINK
REL="NEXT"
TITLE="eCos POSIX compatibility layer"
HREF="posix-compatibility.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>eCos Reference Manual</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="ecos-pci-library.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 30. The eCos PCI Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="posix-compatibility.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="PCI-LIBRARY-REFERENCE">PCI Library reference</H1
><P
>This document defines the PCI Support Library for eCos.</P
><P
>The PCI support 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 is used by device drivers, or other
code, to access the PCI configuration space portably. The low level
API 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.</P
><P
>Underlying the low-level API is HAL support for the basic
configuration space operations. These should not generally be used
by any code other than the PCI library, and are present in the HAL
to allow low level initialization of the PCI bus and devices to
take place if necessary.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN12800">PCI Library API</H2
><P
>The PCI library provides the following routines and types
for accessing the PCI configuration space.</P
><P
>The API for the PCI library is found in the header file
<TT
CLASS="FILENAME"
>&lt;cyg/io/pci.h&gt;</TT
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN12805">Definitions</H2
><P
>The header file contains definitions for the common configuration
structure offsets and specimen values for device, vendor and class
code.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN12808">Types and data structures</H2
><P
>The following types are defined:</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>typedef CYG_WORD32 cyg_pci_device_id;</PRE
></TD
></TR
></TABLE
><P
>This is comprised of the bus number, device number and functional
unit numbers packed into a single word. The macro <TT
CLASS="FUNCTION"
>CYG_PCI_DEV_MAKE_ID()</TT
>, in conjunction with the <TT
CLASS="FUNCTION"
>CYG_PCI_DEV_MAKE_DEVFN()</TT
>
macro, may be used to construct a device id from the bus, device and functional
unit numbers. Similarly the macros <TT
CLASS="FUNCTION"
>CYG_PCI_DEV_GET_BUS()</TT
>,
<TT
CLASS="FUNCTION"
>CYG_PCI_DEV_GET_DEVFN()</TT
>,
<TT
CLASS="FUNCTION"
>CYG_PCI_DEV_GET_DEV()</TT
>, and
<TT
CLASS="FUNCTION"
>CYG_PCI_DEV_GET_FN()</TT
> may be used to extract the
constituent parts of a device id. It should not be necessary to use these
macros under normal circumstances. The following code fragment demonstrates
how these macros may be used:</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>  // Create a packed representation of device 1, function 0
  cyg_uint8 devfn = CYG_PCI_DEV_MAKE_DEVFN(1,0);

  // Create a packed devid for that device on bus 2
  cyg_pci_device_id devid = CYG_PCI_DEV_MAKE_ID(2, devfn);

  diag_printf("bus %d, dev %d, func %d\n",
              CYG_PCI_DEV_GET_BUS(devid),
              CYG_PCI_DEV_GET_DEV(CYG_PCI_DEV_GET_DEVFN(devid)),
              CYG_PCI_DEV_GET_FN(CYG_PCI_DEV_GET_DEVFN(devid));</PRE
></TD
></TR
></TABLE
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>typedef struct cyg_pci_device;</PRE
></TD
></TR
></TABLE
><P
>This structure is used to contain data read from a PCI device's
configuration header by <TT
CLASS="FUNCTION"
>cyg_pci_get_device_info()</TT
>.
It is also used to record the resource allocations made to the device.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>typedef CYG_WORD64 CYG_PCI_ADDRESS64;
typedef CYG_WORD32 CYG_PCI_ADDRESS32;</PRE
></TD
></TR
></TABLE
><P
>Pointers in the PCI address space are 32 bit (IO space) or
32/64 bit (memory space). In most platform and device configurations
all of PCI memory will be linearly addressable using only 32 bit
pointers as read from <TT
CLASS="VARNAME"
>base_map[]</TT
>.</P
><P
>The 64 bit type is used to allow handling 64 bit devices in
the future, should it be necessary, without changing the library's
API.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN12827">Functions</H2
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>void cyg_pci_init(void);</PRE
></TD
></TR
></TABLE
><P
>Initialize the PCI library and establish contact with the
hardware. This function is idempotent and can be called either by
all drivers in the system, or just from an application initialization
function.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cyg_bool cyg_pci_find_device( cyg_uint16 vendor,
			      cyg_uint16 device,
			      cyg_pci_device_id *devid );</PRE
></TD
></TR
></TABLE
><P
>Searches the PCI bus configuration space for a device with
the given <TT
CLASS="PARAMETER"
><I
>vendor</I
></TT
> and <TT
CLASS="PARAMETER"
><I
>device</I
></TT
>
ids. The search starts at the device pointed to by <TT
CLASS="PARAMETER"
><I
>devid</I
></TT
>,
or at the first slot if it contains <TT
CLASS="LITERAL"
>CYG_PCI_NULL_DEVID</TT
>.
<TT
CLASS="PARAMETER"
><I
>*devid</I
></TT
> will be updated with the ID of the next device
found. Returns <TT
CLASS="CONSTANT"
>true</TT
> if one is found and <TT
CLASS="CONSTANT"
>false</TT
> if not.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cyg_bool cyg_pci_find_class( cyg_uint32 dev_class,
			     cyg_pci_device_id *devid );</PRE
></TD
></TR
></TABLE
><P
>Searches the PCI bus configuration space for a device with
the given <TT
CLASS="PARAMETER"
><I
>dev_class</I
></TT
> class code.  The search starts at the
device pointed to by <TT
CLASS="PARAMETER"
><I
>devid</I
></TT
>, or at the first slot if it
contains <TT
CLASS="LITERAL"
>CYG_PCI_NULL_DEVID</TT
>.</P
><P
><TT
CLASS="PARAMETER"
><I
>*devid</I
></TT
> will be updated with the ID of the next
device found. Returns <TT
CLASS="CONSTANT"
>true</TT
> if one is found and
<TT
CLASS="CONSTANT"
>false</TT
> if not.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cyg_bool cyg_pci_find_next( cyg_pci_device_id cur_devid,
			    cyg_pci_device_id *next_devid );</PRE
></TD
></TR
></TABLE
><P
>Searches the PCI configuration space for the next valid device
after <TT
CLASS="PARAMETER"
><I
>cur_devid</I
></TT
>. If <TT
CLASS="PARAMETER"
><I
>cur_devid</I
></TT
>
is given the value <TT
CLASS="LITERAL"
>CYG_PCI_NULL_DEVID</TT
>, then the search starts
at the first slot. It is permitted for <TT
CLASS="PARAMETER"
><I
>next_devid</I
></TT
> to
point to <TT
CLASS="PARAMETER"
><I
>cur_devid</I
></TT
>.  Returns <TT
CLASS="CONSTANT"
>true</TT
>
if another device is found and <TT
CLASS="CONSTANT"
>false</TT
> if not.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cyg_bool cyg_pci_find_matching( cyg_pci_match_func *matchp,
                                void * match_callback_data,
			        cyg_pci_device_id *devid );</PRE
></TD
></TR
></TABLE
><P
>Searches the PCI bus configuration space for a device whose properties
match those required by the caller supplied <TT
CLASS="PARAMETER"
><I
>cyg_pci_match_func</I
></TT
>.
The search starts at the device pointed to by <TT
CLASS="PARAMETER"
><I
>devid</I
></TT
>, or
at the first slot if it contains <TT
CLASS="CONSTANT"
>CYG_PCI_NULL_DEVID</TT
>. The
<TT
CLASS="PARAMETER"
><I
>devid</I
></TT
> will be updated with the ID of the next device found.
This function returns <TT
CLASS="CONSTANT"
>true</TT
> if a matching device is found
and <TT
CLASS="CONSTANT"
>false</TT
> if not.</P
><P
>The match_func has a type declared as:</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>typedef cyg_bool (cyg_pci_match_func)( cyg_uint16 vendor,
                                       cyg_uint16 device,
                                       cyg_uint32 class,
                                       void *     user_data);</PRE
></TD
></TR
></TABLE
><P
>The <TT
CLASS="PARAMETER"
><I
>vendor</I
></TT
>, <TT
CLASS="PARAMETER"
><I
>device</I
></TT
>, and
<TT
CLASS="PARAMETER"
><I
>class</I
></TT
> are from the device configuration space. The
<TT
CLASS="PARAMETER"
><I
>user_data</I
></TT
> is the callback data passed to <TT
CLASS="FUNCTION"
>cyg_pci_find_matching</TT
>.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>void cyg_pci_get_device_info ( cyg_pci_device_id devid,
			       cyg_pci_device *dev_info );</PRE
></TD
></TR
></TABLE
><P
>This function gets the PCI configuration information for the
device indicated in <TT
CLASS="PARAMETER"
><I
>devid</I
></TT
>. The common fields of the
<SPAN
CLASS="STRUCTNAME"
>cyg_pci_device</SPAN
> 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 <TT
CLASS="VARNAME"
>base_size[]</TT
> array.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>void cyg_pci_set_device_info ( cyg_pci_device_id devid,
			       cyg_pci_device *dev_info );</PRE
></TD
></TR
></TABLE
><P
>This function sets the PCI configuration information for the
device indicated in <TT
CLASS="PARAMETER"
><I
>devid</I
></TT
>. 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 <TT
CLASS="PARAMETER"
><I
>*dev_info</I
></TT
>, so that it reflects the true state of the hardware.</P
><TABLE
BORDER="5"
BGCOLOR="#E0E0F0"
WIDTH="70%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>void cyg_pci_read_config_uint8(  cyg_pci_device_id devid,
				 cyg_uint8 offset, cyg_uint8 *val );
void cyg_pci_read_config_uint16( cyg_pci_device_id devid,
				 cyg_uint8 offset, cyg_uint16 *val );
void cyg_pci_read_config_uint32( cyg_pci_device_id devid,
				 cyg_uint8 offset, cyg_uint32 *val );</PRE
></TD
></TR
></TABLE
><P
>These functions read registers of the appropriate size from
the configuration space of the given device. They should mainly

⌨️ 快捷键说明

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