summaryrefslogtreecommitdiff
path: root/ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml')
-rw-r--r--ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml172
1 files changed, 172 insertions, 0 deletions
diff --git a/ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml b/ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml
new file mode 100644
index 0000000..35ccdda
--- /dev/null
+++ b/ecos/packages/devs/eth/phy/current/doc/eth_phy.sgml
@@ -0,0 +1,172 @@
+<!-- {{{ Banner -->
+
+<!-- =============================================================== -->
+<!-- -->
+<!-- eth_phy.sgml -->
+<!-- -->
+<!-- eCos ethernet PHY device driver documentation -->
+<!-- -->
+<!-- =============================================================== -->
+<!-- ####ECOSDOCCOPYRIGHTBEGIN#### -->
+<!-- =============================================================== -->
+<!-- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2010 Free Software Foundation, 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 obtained from the copyright holder -->
+<!-- =============================================================== -->
+<!-- ####ECOSDOCCOPYRIGHTEND#### -->
+<!-- =============================================================== -->
+<!-- #####DESCRIPTIONBEGIN#### -->
+<!-- -->
+<!-- ####DESCRIPTIONEND#### -->
+<!-- =============================================================== -->
+
+<!-- }}} -->
+
+<part id="io-eth-phy-generic">
+<title>Ethernet PHY Device Support</title>
+<chapter id="io-eth-phy-generic1">
+<title>Ethernet PHY Device Support</title>
+<sect1 id="io-eth-phy-api">
+<title>Ethernet PHY Device API</title>
+<para>
+Modern ethernet subsystems are often separated into two pieces, the
+media access controller (sometimes known as a MAC) and the physical
+device or line interface (often referred to as a PHY). In this case,
+the MAC handles generating and parsing physical frames and the PHY
+handles how this data is actually moved to/from the wire. The MAC
+and PHY communicate via a special protocol, known as MII. This MII
+protocol can handle control over the PHY which allows for selection
+of such transmission criteria as line speed, duplex mode, etc.
+</para>
+<para>
+In most cases, ethernet drivers only need to bother with the PHY during
+system initialization. Since the details of the PHY are separate from
+the MAC, there are different drivers for each. The drivers for the PHY
+are described by a set of exported functions which are commonly used by
+the MAC. The primary use of these functions currently is to initialize
+the PHY and determine the status of the line connection.
+</para>
+<para>
+The connection between the MAC and the PHY differs from MAC to MAC, so
+the actual routines to manipulate this data channel are a property of
+the MAC instance. Furthermore, there are many PHY devices each with their
+own internal operations. A complete MAC/PHY driver setup will be comprised
+of the MAC MII access functions and the PHY internal driver.
+</para>
+<para>
+A driver instance is contained within a
+<type>eth_phy_access_t</type>:
+<programlisting>
+
+#define PHY_BIT_LEVEL_ACCESS_TYPE 0
+#define PHY_REG_LEVEL_ACCESS_TYPE 1
+
+typedef struct {
+ int ops_type; // 0 => bit level, 1 => register level
+ bool init_done;
+ void (*init)(void);
+ void (*reset)(void);
+ union {
+ struct {
+ void (*set_data)(int);
+ int (*get_data)(void);
+ void (*set_clock)(int);
+ void (*set_dir)(int);
+ } bit_level_ops;
+ struct {
+ void (*put_reg)(int reg, int unit, unsigned short data);
+ bool (*get_reg)(int reg, int unit, unsigned short *data);
+ } reg_level_ops;
+ } ops;
+ int phy_addr;
+ struct _eth_phy_dev_entry *dev; // Chip access functions
+} eth_phy_access_t;
+
+struct _eth_phy_dev_entry {
+ char *name;
+ unsigned long id;
+ bool (*stat)(eth_phy_access_t *f, int *stat);
+};
+
+</programlisting>
+The <varname>dev</varname> element points to the PHY specific support
+functions.
+Currently, the only function which must be defined is <function>stat()</function>.
+</para>
+<para>
+The MAC-MII-PHY interface is a narrow connection, with commands and status
+moving between the MAC and PHY using a bit-serial protocol.
+Some MAC devices contain the intelligence to run this protocol, exposing
+a mechanism to access PHY registers one at a time. Other MAC devices may only
+provide access to the MII data lines (or even still, this may be considered
+completely separate from the MAC). In these cases, the PHY support layer
+must handle the serial protocol.
+The choice between the access methods is in the
+<varname>ops_type</varname> field.
+If it has the value
+<varname>PHY_BIT_LEVEL_ACCESS_TYPE</varname>, then the PHY device layer will
+run the protocol, using the access functions
+<function>set_data()</function>,
+<function>get_data()</function>,
+<function>set_clock()</function>,
+<function>set_dir()</function> are used to control the MII signals and run
+the protocol.
+If <varname>ops_type</varname> has the value
+<varname>PHY_REG_LEVEL_ACCESS_TYPE</varname>,
+then the routines
+<function>put_reg()</function>, and
+<function>get_reg()</function>
+are used to access the PHY registers.
+</para>
+<para>
+Two additional functions may be defined.
+These are
+<function>init()</function>, and
+<function>reset()</function>.
+The purpose of these functions is for gross-level management of the
+MII interface.
+The
+<function>init()</function>
+function will be called once, at system initialization time.
+It should do whatever operations are necessary to prepare the
+MII channel.
+In the case of
+<varname>PHY_BIT_LEVEL_ACCESS_TYPE</varname> devices,
+<function>init()</function>
+should prepare the signals for use, i.e. set up the appropriate
+parallel port registers, etc.
+The
+<function>reset()</function>
+function may be called by a driver to cause the PHY device to
+be reset to a known state.
+Not all drivers will require this and this function may not even
+be possible, so it's use and behavior is somewhat target specific.
+</para>
+<para>
+Currently, the only function required of device specific drivers is
+<function>stat()</function>.
+This routine should query appropriate registers in the PHY and return
+a status bitmap indicating the state of the physical connection.
+In the case where the PHY can auto-negotiate a line speed and condition,
+this information may be useful to the MAC to indicate what speed it should
+provide data, etc.
+The status bitmask contains these bits:
+<programlisting>
+#define ETH_PHY_STAT_LINK 0x0001 // Link up/down
+#define ETH_PHY_STAT_100MB 0x0002 // Connection is 100Mb/10Mb
+#define ETH_PHY_STAT_FDX 0x0004 // Connection is full/half duplex
+#define ETH_PHY_STAT_1000MB 0x0008 // Connection is 1Gb
+</programlisting>
+Note: the usage here is that if the bit is set, then the condition
+exists. For example, if the
+<varname>ETH_PHY_STAT_LINK</varname>
+is set, then a physical link has been established.
+</para>
+</sect1>
+</chapter>
+</part>