annotate packages/devs/eth/phy/current/src/KS8721.c @ 2381:1a2bc9c156f9

* cdl/phy_eth_drivers.cdl: * src/KS8721.c: Add support for support for Micrel KS8721 PHY
author asl
date Mon, 09 Apr 2007 12:56:08 +0000
parents
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2381
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
1 //==========================================================================
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
2 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
3 // dev/KS8721.c
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
4 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
5 // Ethernet transceiver (PHY) support
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
6 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
7 //==========================================================================
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
9 // -------------------------------------------
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
11 // Copyright (C) 2005 Gary Thomas
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
12 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
14 // the terms of the GNU General Public License as published by the Free
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
16 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
20 // for more details.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
21 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
22 // You should have received a copy of the GNU General Public License along
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
25 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
27 // or inline functions from this file, or you compile this file and link it
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
28 // with other works to produce a work based on this file, this file does not
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
30 // License. However the source code for this file must still be made available
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
32 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
34 // this file might be covered by the GNU General Public License.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
35 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license/
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
38 // -------------------------------------------
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
40 //==========================================================================
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
42 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
43 // Author(s): Uwe Kindler <uwe_kindler@web.de>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
44 // Contributors: Markus Schade <marks@peppercon.de>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
45 // Date: 2007-04-04
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
46 // Purpose:
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
47 // Description: Support for ethernet Micrel KS8721 PHY
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
48 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
49 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
50 //####DESCRIPTIONEND####
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
51 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
52 //==========================================================================
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
53
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
54 #include <pkgconf/system.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
55 #include <pkgconf/devs_eth_phy.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
56
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
57 #include <cyg/infra/cyg_type.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
58
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
59 #include <cyg/hal/hal_arch.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
60 #include <cyg/hal/drv_api.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
61 #include <cyg/hal/hal_if.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
62 #include <cyg/hal/hal_tables.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
63
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
64 #include <cyg/io/eth_phy.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
65 #include <cyg/io/eth_phy_dev.h>
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
66
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
67
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
68 static bool ks8721_stat(eth_phy_access_t *f, int *state)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
69 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
70 unsigned short phy_state;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
71 unsigned short phy_anadv_reg;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
72 int tries;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
73 int ms;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
74
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
75 // Read negotiated state
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
76 if (_eth_phy_read(f, PHY_BMSR, f->phy_addr, &phy_state))
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
77 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
78 if ((phy_state & PHY_BMSR_AUTO_NEG) == 0)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
79 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
80 eth_phy_printf("... waiting for auto-negotiation");
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
81 for (tries = 0; tries < CYGINT_DEVS_ETH_PHY_AUTO_NEGOTIATION_TIME; tries++)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
82 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
83 if (_eth_phy_read(f, PHY_BMSR, f->phy_addr, &phy_state))
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
84 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
85 if ((phy_state & PHY_BMSR_AUTO_NEG) != 0)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
86 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
87 break;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
88 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
89 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
90
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
91 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
92 // Wait for 1 second
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
93 //
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
94 for (ms = 0; ms < 1000; ++ms)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
95 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
96 CYGACC_CALL_IF_DELAY_US(1000); // 1 ms
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
97 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
98 eth_phy_printf(".");
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
99 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
100 eth_phy_printf("\n");
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
101 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
102 if ((phy_state & PHY_BMSR_AUTO_NEG) != 0)
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
103 {
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
104 _eth_phy_read(f, PHY_AN_ADV, f->phy_addr, &phy_anadv_reg);
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
105 eth_phy_printf("\nAuto negotiation advertisement: %x\n", phy_anadv_reg);
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
106 *state = 0;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
107 if ((phy_state & PHY_BMSR_LINK) != 0) *state |= ETH_PHY_STAT_LINK;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
108 if ((phy_anadv_reg & PHY_AN_ADV_100FDX) != 0) *state |= ETH_PHY_STAT_100MB | ETH_PHY_STAT_FDX;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
109 return true;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
110 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
111 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
112 return false;
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
113 }
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
114
1a2bc9c156f9 * cdl/phy_eth_drivers.cdl:
asl
parents:
diff changeset
115 _eth_phy_dev("Micrel KS8721", 0x00221619, ks8721_stat)