русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Драйвер Ethernet - LXT972


Дата добавления: 2014-11-28; просмотров: 921; Нарушение авторских прав


 

Версия U‑boot‑1.1.1 не имеет встроенного драйвера LXT972, следовательно его необходимо интегрировать в текущую версию u‑boot‑1.1.1.

 

Для включения контроллера, нужно patch-файлами обновить исходные тексты U-boot под нашу версию реализации схемы (AT91RM9200‑SK) и ее особенности, отличные от традиционного включения процессора AT91RM9200‑DK(EK).

Традиционная версия программы U-boot-1.1.1 не предусматривает многих моментов, которые реализованы в нашей плате. Поэтому изменения нужно вносить с учетом специфики включения устройств или отдельных блоков.

 

Драйвер lxt972, как идеально подходящий, взят с более старшей версии u-boot-1.1.6 ( предварительно нужно старшую версию распаковать и скопировать во временную директорию).

Среди исходных текстов u-boot-1.1.6 нужно найти следующие 2 файла:

 

lxt971a.h (header) и lxt971a.c (source)

 

9.5.1 u‑boot‑1.1.1/include/lxt971a.h

 

Файл lxt971a.h копируется в директорию u‑boot‑1.1.1/include/.

 

9.5.2 u‑boot‑1.1.1/include/at91rm9200_net.h – подключение header-драйвера

 

Обязательно сделать эти изменения, так как наложенный patch-файл, как описывалось выше, вносит изменения в процедуры, которые нужны для других драйверов, но не для нашего.

 

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

#include <common.h>

#include <asm/io.h>

#include <asm/arch/hardware.h>

#ifdef CONFIG_PHY_IS_RTL8201

#include "rtl8201.h"

#elif defined (CONFIG_PHY_IS_LXT972)

#include "lxt971a.h"

#else

#include "dm9161.h"

#endif

….

/* MII functions */

static void at91rm9200_EmacEnableMDIO(AT91PS_EMAC p_mac);

static void at91rm9200_EmacDisableMDIO(AT91PS_EMAC p_mac);



//static UCHAR at91rm9200_EmacReadPhy(AT91PS_EMAC p_mac, unsigned char PhyAddress, unsigned char RegisterAddress, unsigned sho

rt *pInput);

//static UCHAR at91rm9200_EmacWritePhy(AT91PS_EMAC p_mac, unsigned char PhyAddres, unsigned char RegisterAddress, unsigned sho

rt *pOutput);

static UCHAR at91rm9200_EmacReadPhy(AT91PS_EMAC p_mac, unsigned char RegisterAddress, unsigned short *pInput);

static UCHAR at91rm9200_EmacWritePhy(AT91PS_EMAC p_mac, unsigned char RegisterAddress, unsigned short *pOutput);

void at91rm92000_GetPhyInterface(void );

 

9.5.3 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;

}

9.5.4 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));

}

 

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

 

9.5.5 u‑boot‑1.1.1/include/configs/RM9200.h - набор сетевых команд

 

В файле RM9200.h есть возможность выбирать конфигурацию отдельных команд для u‑boot.

 

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

(CONFIG_CMD_DFL | \

CFG_CMD_NET | \

CFG_CMD_PING | \

CFG_CMD_I2C | \

CFG_CMD_EEPROM \

& ~(CFG_CMD_BDI | \

CFG_CMD_FPGA | \

CFG_CMD_NAND \

) \

)

 

С полным списком возможных команд можно ознакомиться в файле - u‑boot‑1.1.1/README

 

 



<== предыдущая лекция | следующая лекция ==>
Возможности | Перечень программ и утилит для сборки u-boot-1.1.1


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 5.242 сек.