Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
120901-Linux-On-AT91RM9200-SK-new.doc
Скачиваний:
33
Добавлен:
05.03.2016
Размер:
798.21 Кб
Скачать
      1. U‑boot‑1.1.1/board/rm9200/at91rm9200_ether.C (et_enable)

Если обратить внимание на схему, а именно на PB23, можно заметить, что это сигналET_ENABLE (разрешение работы микросхемы драйвера сети).

Для полного включения Ethernetконтроллера, нужны изменения в исходных текстахU‑boot‑1.1.1.

Листинг программы, отображающий изменения в исходном тексте (конфигурирование вывода PB23на вывод):

int eth_init (bd_t * bd) {

/* Enable PIO to access the ET_ENABLE */

AT91C_BASE_PIOB->PIO_PER |= 1<<23;

AT91C_BASE_PIOB->PIO_OER |= 1<<23;

AT91C_BASE_PIOB->PIO_CODR |= 1<<23;

}

      1. U‑boot‑1.1.1/board/rm9200/at91rm9200_ether.C – добавление драйвера lxt972

Добавление драйвера LXT972,требует обязательного редактирования некоторых процедур в исходном тексте программыu‑boot, в файлеu‑boot‑1.1.1/board/RM9200/at91rm9200_ether.c, связанных с работойEthernetконтроллера.

Эти процедуры берутся из старшей версии u-boot-1.1.6из файлаlxt971a.c

Также, необходимо сделать следующее:

  • Скопировать header«AT91RM9200.h» с текущей версииRomboot.

  • Переименовать его в AT91RM9200_all.h.

  • Скопировать в u-boot-1.1.1/include/

  • Добавить header в at91rm9200_ether.c:

#include <AT91RM9200_all.h>

  • Исправить то, что по умолчанию, на следующее:

Листинг программы, отображающий изменения в исходном тексте:

#ifdef CONFIG_PHY_IS_RTL8201

AT91S_PhyOps AT91S_Rtl8201Ops;

#elif defined (CONFIG_PHY_IS_LXT972)

AT91S_PhyOps AT91S_Lxt972Ops;

#else

AT91S_PhyOps AT91S_Dm9161Ops;

#endif

AT91PS_PhyOps pPhyOps;

// вставить процедуры из lxt971a.c

// эти процедуры и есть LXT972-драйвер !!!

//

#elif defined (CONFIG_PHY_IS_LXT972)

/*

* Name:

* lxt972_IsPhyConnected

* Description:

* Reads the 2 PHY ID registers

* Arguments:

* p_mac - pointer to AT91S_EMAC struct

* Return value:

* TRUE - if id read successfully

* FALSE- if error

*/

unsigned int lxt972_IsPhyConnected (AT91PS_EMAC p_mac)

{

unsigned short Id1, Id2;

unsigned int dly;

//printf ("lxt972_IsPhyConnected\n\r");

at91rm9200_EmacEnableMDIO (p_mac);

at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_ID1, &Id1);

at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_ID2, &Id2);

at91rm9200_EmacDisableMDIO (p_mac);

if ((Id1 == (0x0013)) && ((Id2 & 0xFFF0) == 0x78E0))

{

//for (dly=0; dly<0x0000ffff; dly++){}

return TRUE;

}

else

{

//printf ("ID1-%X\n\r",Id1);

//printf ("ID2-%X\n\r",Id2);

}

return FALSE;

}

/*

* Name:

* lxt972_GetLinkSpeed

* Description:

* Link parallel detection status of MAC is checked and set in the

* MAC configuration registers

* Arguments:

* p_mac - pointer to MAC

* Return value:

* TRUE - if link status set succesfully

* FALSE - if link status not set

*/

UCHAR lxt972_GetLinkSpeed (AT91PS_EMAC p_mac)

{

unsigned short stat1;

//printf ("lxt972_GetLinkSpeed\n\r");

if (!at91rm9200_EmacReadPhy (p_mac, PHY_LXT971_STAT2, &stat1))

return FALSE;

if (!(stat1 & PHY_LXT971_STAT2_LINK)) /* link status up? */

return FALSE;

if (stat1 & PHY_LXT971_STAT2_100BTX) {

if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {

printf ("lxt972_Speed 100M-Full\n\r");

/*set Emac for 100BaseTX and Full Duplex */

p_mac->EMAC_CFG |= AT91C_EMAC_SPD | AT91C_EMAC_FD;

} else {

printf ("lxt972_Speed 100M-Half\n\r");

/*set Emac for 100BaseTX and Half Duplex */

p_mac->EMAC_CFG = (p_mac->EMAC_CFG &

~(AT91C_EMAC_SPD | AT91C_EMAC_FD))

| AT91C_EMAC_SPD;

}

return TRUE;

} else {

if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {

printf ("lxt972_Speed 10M-Full\n\r");

/*set MII for 10BaseT and Full Duplex */

p_mac->EMAC_CFG = (p_mac->EMAC_CFG &

~(AT91C_EMAC_SPD | AT91C_EMAC_FD))

| AT91C_EMAC_FD;

} else {

printf ("lxt972_Speed 10M-Half\n\r");

/*set MII for 10BaseT and Half Duplex */

p_mac->EMAC_CFG &= ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);

}

return TRUE;

}

printf ("lxt972_Speed NO SET\n\r");

return FALSE;

}

/*

* Name:

* lxt972_InitPhy

* Description:

* MAC starts checking its link by using parallel detection and

* Autonegotiation and the same is set in the MAC configuration registers

* Arguments:

* p_mac - pointer to struct AT91S_EMAC

* Return value:

* TRUE - if link status set succesfully

* FALSE - if link status not set

*/

UCHAR lxt972_InitPhy (AT91PS_EMAC p_mac)

{

UCHAR ret = TRUE;

//printf ("lxt972_InitPhy\n\r");

at91rm9200_EmacEnableMDIO (p_mac);

if (!lxt972_GetLinkSpeed (p_mac)) {

/* Try another time */

ret = lxt972_GetLinkSpeed (p_mac);

//printf ("lxt972_InitPhy - ERROR \n\r");

}

/* Disable PHY Interrupts */

at91rm9200_EmacWritePhy (p_mac, PHY_LXT971_INT_ENABLE, 0);

at91rm9200_EmacDisableMDIO (p_mac);

return (ret);

}

/*

* Name:

* lxt972_AutoNegotiate

* Description:

* MAC Autonegotiates with the partner status of same is set in the

* MAC configuration registers

* Arguments:

* dev - pointer to struct net_device

* Return value:

* TRUE - if link status set successfully

* FALSE - if link status not set

*/

UCHAR lxt972_AutoNegotiate (AT91PS_EMAC p_mac, int *status)

{

unsigned short value;

//printf ("lxt972_AutoNegotiate\n\r");

/* Set lxt972 control register */

if (!at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_CTRL, &value))

return FALSE;

/* Restart Auto_negotiation */

value |= PHY_COMMON_CTRL_RES_AUTO;

if (!at91rm9200_EmacWritePhy (p_mac, PHY_COMMON_CTRL, &value))

return FALSE;

/*check AutoNegotiate complete */

udelay (10000);

at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_STAT, &value);

if (!(value & PHY_COMMON_STAT_AN_COMP))

return FALSE;

return (lxt972_GetLinkSpeed (p_mac));

}

Вставленная часть кода представляет собой нужный для данной платы драйвер сетевой микросхемы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]