Перейти к содержанию
    

код можно посмотреть в драйвере, что идет в комплекте с ниос-иде. там есть функции передачи пакета, что-то вроде raw_eth_send и обработчик прерываний на прием. прерывания на передачу не особо нужны. я брал код оттуда и выбрасывал все лишнее. все, что нужно есть в описании на контроллер sgdma в 5 томе квартус-хендбука. ну и на PHY почитать описание, какие там регистры, дефолтные установки. для начала - проинициализировать PHY. функция инициализации, что идет с драйвером поддерживает несколько микросхем, если там нет вашей, то сделать по аналогии. по памяти не скажу какие точно файлы надо ковырять, надо поискать папки типа triple_speed_ethernet, завтра на работе уточню.

upd:

нашел сорцы, правда не свежие, нет реализации tse_mac_raw_send. исходники родного драйвера лежат в ip/triple_speed_ethernet/lib

_____.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проинициализировать PHY. функция инициализации, что идет с драйвером поддерживает несколько микросхем, если там нет вашей, то сделать по аналогии.

 

Хотел уточнить насчет PHY. использую marvell 88E1111, она идет по дефолту в tse. документации по ней нет у меня.

вот с ее инициализацией парюсь.

если сделать вот так, то по идее она должна проинициализироваться (все выдрал из triple_speed_ethernet.c)?:

int PhyDevInit(){

alt_tse_phy_profile MV88E1111 = {"Marvell 88E1111", /* Marvell 88E1111 */

MV88E1111_OUI, /* OUI */

MV88E1111_MODEL, /* Vender Model Number */

MV88E1111_REV, /* Model Revision Number */

0x11, /* Location of Status Register */

14, /* Location of Speed Status */

13, /* Location of Duplex Status */

10, /* Location of Link Status */

&marvell_phy_cfg, /* Function pointer to configure Marvell PHY */

};

alt_tse_phy_add_profile(&MV88E1111);

return 0;//success

}

 

int marvell_phy_cfg(np_tse_mac *pmac) {

 

alt_u16 dat;

 

/* If there is no link yet, we enable auto crossover and reset the PHY */

if((IORD(&pmac->mdio1.STATUS, 0) & PCS_ST_an_done) == 0) {

//tse_dprintf(5, "MARVELL : Enabling auto crossover\n");

IOWR(&pmac->mdio1.CONTROL, 16, 0x0078);

//tse_dprintf(5, "MARVELL : PHY reset\n");

dat = IORD(&pmac->mdio1.CONTROL, 0);

IOWR(&pmac->mdio1.CONTROL, 0, dat | (1<<15));

}

 

return 0;

}

 

int alt_tse_phy_add_profile(alt_tse_phy_profile *phy){

alt_32 i;

 

/* search PHY profile for same ID */

for(i = 0; i < phy_profile_count; i++)

{

if(pphy_profiles->oui == phy->oui && pphy_profiles->model_number == phy->model_number)

{

//tse_dprintf(4, "WARNING : PHY OUI 0x%06x, PHY Model Number 0x%02x already exist in PHY profile\n", (int) phy->oui, phy->model_number);

//tse_dprintf(4, "In case of same PHY OUI and PHY Model Number in profile, first added PHY setting will be used\n");

}

}

 

/* Allocate memory space to store the profile */

pphy_profiles[phy_profile_count] = (alt_tse_phy_profile *) malloc(sizeof(alt_tse_phy_profile));

if(!pphy_profiles[phy_profile_count]) {

//tse_dprintf(1, "ERROR : Unable to allocate memory for pphy_profile[%d]\n", phy_profile_count);

return -1;

}

 

/* Store PHY information */

*pphy_profiles[phy_profile_count] = *phy;

strcpy(pphy_profiles[phy_profile_count]->name, phy->name);

 

phy_profile_count++;

 

return phy_profile_count - 1;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а, марвел. гадкая конторка, даташиты под NDA... скорее всего должны пройти дефолтные настройки, фактически там надо только пару контрольных регистров зашить. включить там автоопределение всего (линк, скорость, полярность) и сбросить трансивер. вроде это и делается. потом нужно воткнуть кабель и почитать статусные регистры. ну еще имеет смысл начать с регистра, где лежит кодовый номер микросхемы (ее тип, ревизия). основные регистры (их всего штук 6) у всех PHY одинаковые, это стандарт. посмотрите в даташите на какой-нибудь аналог, м.б. микреловский, они даташиты дают. вот с vendor specific регистрами - беда, но основные фичи должны быть доступны и без них. вот уж не знаю на кой икс альтера ставит такие микросхемы. да, всякие там структуры, тоже не нужны, я константы тупо забил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а, марвел. гадкая конторка, даташиты под NDA... скорее всего должны пройти дефолтные настройки, фактически там надо только пару контрольных регистров зашить. включить там автоопределение всего (линк, скорость, полярность) и сбросить трансивер. вроде это и делается. потом нужно воткнуть кабель и почитать статусные регистры. ну еще имеет смысл начать с регистра, где лежит кодовый номер микросхемы (ее тип, ревизия). основные регистры (их всего штук 6) у всех PHY одинаковые, это стандарт. посмотрите в даташите на какой-нибудь аналог, м.б. микреловский, они даташиты дают. вот с vendor specific регистрами - беда, но основные фичи должны быть доступны и без них. вот уж не знаю на кой икс альтера ставит такие микросхемы. да, всякие там структуры, тоже не нужны, я константы тупо забил.

 

То есть для инициализации нужно воспользоваться MDIO?

Если так, то manual по cIII дает распиновку только на

ENET_MDC

ENET_MDIO

и ENET_MDIO как вход для nios'a. как тогда что-либо записать в PHY или он типа bidir?

 

Из sources получается доступ можно организовать таким образом:

 

IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,PHY,0x01)

где PHY - это адрес MDIO или как пишет manual cIII (The MDIO address of the PHY device is configured to the value 18 (0x12))?

 

а регистры расписаны вроде в ug_ethernet:

Control

Status

PHY_ID1

PHY ID2

Adv

RemAdv

 

А вообще внешне как-нибудь проявляется инициализация PHY, может led загорится или необязательно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ENET_MDIO - двунаправленная, там только к ниосу буфер прикрутить надо внешний(у самого ниоса будут mdio_input,mdio_output и mdio_oen), в мануале есть картинка. PHY в IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,PHY,0x01) это адрес трансивера, их м.б. несколько на шине. можно тупо в цикле прогнать от 0 до 31 и читать регистр PHY_ID1. если не 0 - значит адрес тот. те регистры, что вы написали - это и есть стандартные, про которые я выше говорил, они есть у любого PHY. кроме них еще есть фирменные "фичи", но в случае марвела это, видимо, страшная тайна :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ENET_MDIO - двунаправленная, там только к ниосу буфер прикрутить надо внешний(у самого ниоса будут mdio_input,mdio_output и mdio_oen), в мануале есть картинка. PHY в IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,PHY,0x01) это адрес трансивера, их м.б. несколько на шине. можно тупо в цикле прогнать от 0 до 31 и читать регистр PHY_ID1. если не 0 - значит адрес тот. те регистры, что вы написали - это и есть стандартные, про которые я выше говорил, они есть у любого PHY. кроме них еще есть фирменные "фичи", но в случае марвела это, видимо, страшная тайна :)

 

Извините меня за наскальные рисунки, но так я быстрей разберусь.

Что за элементы в виде треугольников - это alt_buf(его можно использовать?) и правильная ли задумка внешнего буффера или это отдельный элемент, не совсем пойму?

post-44580-1258563118_thumb.jpg

 

и еще вопрос. что такое timing constraints и нужны ли они в проекте, а то начитаюсь про них на alteraforum.com вот и думаю...

Изменено пользователем dim99

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините меня за наскальные рисунки, но так я быстрей разберусь.

Что за элементы в виде треугольников - это alt_buf(его можно использовать?) и правильная ли задумка внешнего буффера или это отдельный элемент, не совсем пойму?

tri-state буфер. megafunctions/gates/bus_tri

и еще вопрос. что такое timing constraints и нужны ли они в проекте, а то начитаюсь про них на alteraforum.com вот и думаю...

временные ограничения, в которые фиттер должен вписать проект. как минимум надо задать ограничения по частоте для всех клоков.

частоты для 3-го циклона здесь невелики, но если кристалл почти заполнен, возникнут проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго дня!

 

Есть измерительные платы с ПЛИС, работающие в термостате в диапазоне от +50 до +100 градусов цельсия.

Пока все сделано на "рассыпухе" - измеритель на ПЛИС, МК extended диапазона, CAN интерфейс наружу, внешняя коробочка с Ethernet к компу.

 

Есть желание все эти функции запихнуть внутрь ПЛИС, запустив там NIOS и добавив Ethernet PHY.

 

Поискав немного компоненты extended диапазона понял что это непросто...

Имеющие опыт реализации подобного, поскажите пожалуйста SRAM (или другой RAM для NIOS) и Ethernet PHY extended диапазона температур.. (трансформаторы эзернета вроде при 100 живут нормально)..

 

требования к скорости обмена отсутствуют.

Ethernet хочется из-за развязки, длины и удобства адресации (IP).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поискав немного компоненты extended диапазона понял что это непросто...

непросто, но не невозможно :)

 

ethernet PHY: http://www.national.com/pf/DP/DP83848VYB.html#Overview

 

SRAM: http://www.issi.com/products-extended-temperature-sdram.htm

 

FPGA: http://www.altera.com/products/devices/cyc...-mkts-auto.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появились первые интересные результаты работы с ethernet.

 

В общем после hard reset PHY начинает в режиме auto-negotiation обмениваться пакетами с PC.

точнее сказать, PHY принимает пакеты от PC.

 

Для обеспечения работы с PHY в свойствах PC lan adapter выставил full duplex и 100 mbit.

После автоопределения PHY начинает моргать показывая. что работает именно в этом режиме - 100 duplex, как раз то, что поддерживает на данный проект мой fpga проект.

 

инициализацию PHY проводить не могу, потому xj не знаю по каким регистрам чего находится, вот хочу сегодня посмотреть lgngibn на какую-нибудь Gigabbit микросхему.

смотрел lan91c1111 - но она 100 mbit и номера битов в контрольном регистре для выставления скорости явно отличаются от marvell PHY.

 

В общем подправил код для отправки с tse_mac driver и пытаюсь отправить пакет через tse_mac_raw_send.

смотрю в wireshark - приходят пакеты с правильным количеством байтов, но заполненные нулями и определенными как FC (failed)

 

естественно, что надо бы еще

1. определить регистры PHY (пока не знаю какие) - доступ через MDIO настроен.

2. Проверить TSE_MAC надо, вдруг где недосмотрел

3. mem_to_stream от sgdma_tx вроде правильно формирует дескриптор, адрес для данных правильно выставлен.

 

Какие могут варианты неправильно формирования или подключения чего, что так пакеты передаются?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

непросто, но не невозможно :)

 

Спасибо, эти компоненты я тоже находил, есть проблемы в цене и доставабельности у National.

я создал отдельную тему по своему вопросу - http://electronix.ru/forum/index.php?showtopic=69863

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем подправил код для отправки с tse_mac driver и пытаюсь отправить пакет через tse_mac_raw_send.

смотрю в wireshark - приходят пакеты с правильным количеством байтов, но заполненные нулями и определенными как FC (failed)

 

естественно, что надо бы еще

1. определить регистры PHY (пока не знаю какие) - доступ через MDIO настроен.

2. Проверить TSE_MAC надо, вдруг где недосмотрел

3. mem_to_stream от sgdma_tx вроде правильно формирует дескриптор, адрес для данных правильно выставлен.

 

Какие могут варианты неправильно формирования или подключения чего, что так пакеты передаются?

начать лучше с према пакета, увидите какую структуру имеет правильный пакет. а так навсуидку 2 варианта. PHY может считать/не считать CRC; может добивать/не добивать пакет нулями до нужной длины. выкладывайте дамп, посмотрим. да, wireshark тип ошибки указывает.

 

Спасибо, эти компоненты я тоже находил, есть проблемы в цене и доставабельности у National.

я создал отдельную тему по своему вопросу - http://electronix.ru/forum/index.php?showtopic=69863

еще

http://www.micrel.com/applications/auto/Et..._Automotive.pdf

 

http://www.smsc-ais.com/AIS/content/view/843/810

 

hint: ищите по automotive ethernet

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где бы найти описание регистров Marvell 88e1111, посмотрел другие гигабитные микросхемы - совсем другие адреса регистров по сравнению с тем lan91c111 и intel 82575.

 

или какую другую микросхему посмотреть, у которой будет схожее расположение адресов регистров для контрольного и статусного особенно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно пока не пойму толком.

Доступ у меня только из-под MDIO осуществляется и через них надо настроить PHY.

Нашел PHYWORX 10/100/1000 Ethernet PHY Daughter Board Reference Guide и если ему верить, то

MDIO Registers

The PHY provides 32 internal management registers that can be accessed using the Management

Interface (MDIO). The Management Device Address of the PHY is configured to the value 18

(0x12).

 

Table 5: MDIO Registers Description

Register Name Description (Bits) Type

Reset

Value

0 Control

15: 1=PHY Reset, 0=normal operation. (SC)

14: Loopback. 1=enable loopback, 0=normal operation

13: Speed Selection (together with Bit 6):

6:13 = "11": reserved

= "10": 1000

= "01": 100

= "00": 10

12: Enable Auto-Negotiation (only enables the control state

machine, does not trigger the auto negotiation). If

disabled (0), bits 6,8,13 define the operation.

11: Power down (1) or normal operation (0)

10: Isolate PHY from GMII/MII (if 1)

9: Restart Autonegotiation. If set (1) will restart the

autonegotiation process.

8: set full duplex mode (1) or half-duplex (0)

7: Enable collision test signal (1)

6: Speed Selection (see Bit 13 above).

5:0 reserved. Write 0, ignore on read

 

т.е. обратившись к 0 регистру через IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0/*mdio_addr0*/,0x0); я могу достучаться до контрольного регистра и настроить вышеприведенные параметры.

Это успешно работает, потому что считал PHY_id =0x0141 как и про reference guide выше совпадает.

 

Смотрю в E1000_defines.h:

/* PHY 1000 MII Register/Bit Definitions */

/* PHY Registers defined by IEEE */

#define PHY_CONTROL 0x00 /* Control Register */

#define PHY_STATUS 0x01 /* Status Register */

#define PHY_ID1 0x02 /* Phy Id Reg (word 1) */

#define PHY_ID2 0x03 /* Phy Id Reg (word 2) */

#define PHY_AUTONEG_ADV 0x04 /* Autoneg Advertisement */

#define PHY_LP_ABILITY 0x05 /* Link Partner Ability (Base Page) */

#define PHY_1000T_CTRL 0x09 /* 1000Base-T Control Reg */

#define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */

 

Все то же самое.

включить там автоопределение всего (линк, скорость, полярность) и сбросить трансивер

а где взять полярность или ее настройка не критична?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...