Цитата(InsolentS @ Jul 9 2007, 00:26)

люди добрые, помогите плиззззз....проект встал, а мне его сдавать месяц назад :'(
Вот так я делаю. Сначала ресет, ждем его завершения. Потом разрешаю auto negatiation, ждем завершения. На физикле загорается светодиодик. Потом из регистров физикла читаем скорость и дуплекс. Может что и не совсем рационально - но все работает.
Код
#ifdef RTL8201
#define MII_BMSR_REG 0x01
#define MII_ANLPAR_REG 0x05
unsigned short stat1, stat;
stat = AT91F_MII_ReadPhy(pEmac, 0x00);
AT91F_MII_WritePhy(pEmac, 0x00, stat | 0x8000); // reset
do
stat = AT91F_MII_ReadPhy(pEmac, 0x00);
while(stat & 0x8000);
dbgu_out("PHY reset completed.\n\r");
AT91F_MII_WritePhy(pEmac, 0x00, stat | 0x1000); // auto negotiation enabled
do
stat = AT91F_MII_ReadPhy(pEmac, 0x01); // auto neg. completed
while(!(stat & 0x20));
dbgu_out("PHY auto negotiation completed.\n\r");
stat = AT91F_MII_ReadPhy(pEmac, MII_BMSR_REG);
stat1 = AT91F_MII_ReadPhy(pEmac, MII_ANLPAR_REG);
if ((stat & (1 << 14)) && (stat1 & (1 << 8)) ) {
pEmac->EMAC_CFG |= (AT91C_EMAC_SPD| AT91C_EMAC_FD);
dbgu_out("set MII for 100BaseTX and Full Duplex\n\r");
} else if ((stat & (1 << 12)) && (stat1 & (1 << 6)) ) {
pEmac->EMAC_CFG = (pEmac->EMAC_CFG & AT91C_EMAC_SPD) | AT91C_EMAC_FD;
dbgu_out("set MII for 10BaseT and Full Duplex\n\r");
} else if ((stat & (1 << 13)) && (stat1 & (1 << 7)) ) {
pEmac->EMAC_CFG = (pEmac->EMAC_CFG | AT91C_EMAC_SPD ) & ~AT91C_EMAC_FD;
dbgu_out("set MII for 100BaseTX and Half Duplex\n\r");
} else if ((stat & (1 << 11)) && (stat1 & (1 << 5)) ) {
pEmac->EMAC_CFG = pEmac->EMAC_CFG & ~AT91C_EMAC_SPD & ~AT91C_EMAC_FD;
dbgu_out("set MII for 10BaseT and Half Duplex\n\r");
}
#else