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