Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ethernet + Cyclone + Nios
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
COMA
Цитата(vadimuzzz @ Dec 14 2011, 04:05) *
да, не густо. на arping тоже не откликается. тут мне в ЛП подсказали, что вопрос об этой плате мне уже задавали. я тогда высказал предположение, что дело в клоках передатчика.
вы смотрели в сигналтапе на входе MAC ff_tx_data, ff_tx_sop, ff_tx_wren относительно ff_tx_clk? Можно еще ff_tx_clk посмотреть относительно какого-нибудь быстрого клока (есть/нет).
Триггер либо на sop, либо на фронт wren.
и еще попингуйте с платы комп. есть ли сигналы txd? если да, то что покажет снифер на компе?


Ок. Добавлю быстрый клок с PLL и посмотрю сигналы.
COMA
Добавил клок 200 МГц.
Снизил частоту системы до 50 МГц

Посмотрел сигналы на входе и выходе TSE MAC.
Нажмите для просмотра прикрепленного файла
между PHY и TSE
Сигналы идут на TSE, от TSE сигналов нет.

Соответственно со стороны TSE - ff_tx_data, ff_rx_data тоже ничего нет. клоки ff_tx_clk и ff_rx_clk есть.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
На триггеры sop и wren не срабатывают.

Такое ощущение, что TSE отбрасывает все пакеты как битые.

Файлы stp приложил.
Нажмите для просмотра прикрепленного файла
vadimuzzz
Цитата(COMA @ Dec 15 2011, 13:05) *
Такое ощущение, что TSE отбрасывает все пакеты как битые.

это проверить легко: смотрите сигналтапом выход приемного канала DMA на предмет прерываний. если есть sop, valid - значит TSE выдает пакеты. еще
на выходе SGDMA приемника есть сигнал error, если он не 0 - смотрим в ug_ethernet код ошибки. если пакеты выходят без ошибок - ищем дальше.
имеет смысл собрать проект с конфигурацией debug, м.б. в логах что-нибудь вылезет
COMA
Пробовал ставить триггеры почти на все линии. Ничего не изменилось в сигналтапе.

Заметил разницу в логах:

С модулем TSE не выводится строчка:

"Your Ethernet MAC address is 11:12:13:14:15:16"

Возможно модуль не до конца инициализируется.
vadimuzzz
Цитата(COMA @ Dec 15 2011, 17:47) *
Пробовал ставить триггеры почти на все линии. Ничего не изменилось в сигналтапе.

у вас на картинках только шина MII, интересует выход приемного канала TSE (там шина avalon-st, идет на sgdma_rx_0). помимо данных, sop, valid и прочего там есть сигнал типа error
Цитата
Возможно модуль не до конца инициализируется.

собираете debug-версию (драйвера тоже) и в пошаговую отладку. MAC-адрес устанавливается в функции tse_mac_init (файл ins_tse_mac.c). ну и попинговать комп со стороны платы тоже не мешает
COMA
Это вторая картинка сверху.
На ней есть сигналы ff_rx_sop, ff_rx_eop, rx_err.
Триггеры поочередно ставил на все сигналы, не сработало.

Дебаг версию соберу.
COMA
Удалось запустить TSE.
1. Изменил дизайн, выкинул память дескрипторов. SGDMA подключены к SDRAM.
Нажмите для просмотра прикрепленного файла

2. Добавил следующий код в проект:

Код
#ifdef ALT_INICHE
    #include "ipport.h"
#endif

#include "system.h"
#include "altera_avalon_tse.h"
#include "altera_avalon_tse_system_info.h"

alt_tse_system_info tse_mac_device[MAXNETS] = {
    TSE_SYSTEM_INT_MEM_NO_SHARED_FIFO(TSE_0, 0, SGDMA_TX_0, SGDMA_RX_0, TSE_PHY_AUTO_ADDRESS, 0)
};



Лог работы:
Цитата
Copyright 1996-2008 by InterNiche Technologies. All rights reserved.
prep_tse_mac 0
Your Ethernet MAC address is 11:12:13:14:15:16
Static IP Address is 192.168.3.250
prepped 1 interface, initializing...
[tse_mac_init]
INFO : TSE MAC 0 found at address 0x04000000
INFO : PHY National DP83848C found at PHY address 0x01 of MAC Group[0]
INFO : PHY[0.0] - Automatically mapped to tse_mac_device[0]
INFO : PHY[0.0] - Restart Auto-Negotiation, checking PHY link...
INFO : PHY[0.0] - Auto-Negotiation PASSED
INFO : PHY[0.0] - Checking link...
INFO : PHY[0.0] - Link established
INFO : PHY[0.0] - Speed = 100, Duplex = Full
OK, x=4, CMD_CONFIG=0x00000000

MAC post-initialization: CMD_CONFIG=0x04000203
[tse_sgdma_read_init] RX descriptor chain desc (1 depth) created
mctest init called
IP address of et1 : 192.168.3.250
Created "Inet main" task (Prio: 2)
Created "clock tick" task (Prio: 3)
Created "web server" task (Prio: 4)

Web Server starting up

Fetching file: /mount/rozipfs/index.html.
Can't open the 404 File Not Found error page.
Have you programmed the filing system into flash?
[http_handle_receive] Error preparing response


Но теперь возникла другая проблема.
Через некоторое время появляется куча сообщений - "No free buffers for rx"
и сеть перестает работать.

Проект и системная библиотека собраны с оптимизацией О3 и без отладочной информации.
vadimuzzz
Цитата(COMA @ Dec 16 2011, 13:14) *
Через некоторое время появляется куча сообщений - "No free buffers for rx"
и сеть перестает работать.

видимо, входящие пакеты приходят слишком быстро, кончается память. а почему вы решили дескрипторы в sdram располагать?
COMA
Потому что это рабочий вариант.
Использование отдельной памяти для дескрипторов не работает.
vadimuzzz
Цитата(COMA @ Dec 16 2011, 15:39) *
Использование отдельной памяти для дескрипторов не работает.

blink.gif первый раз такое вижу. а в отладчике пускали?
COMA
Да. Запускал.
vadimuzzz
Цитата(COMA @ Dec 16 2011, 17:33) *
Да. Запускал.

висло где-то на этапе инициализации? выяснили, почему MAC-адрес не присваивается?
COMA
Ничего не висло. MAC адрес не присваивался потому что не было этого кода:
Код
alt_tse_system_info tse_mac_device[MAXNETS] = {
    TSE_SYSTEM_INT_MEM_NO_SHARED_FIFO(TSE_0, 0, SGDMA_TX_0, SGDMA_RX_0, TSE_PHY_AUTO_ADDRESS, 0)
};


Как я понял, этот код добавляет(описывает) TSE MAC в программу.
philll
Здравствуйте. Вопрос к Гуру. Хочу использовать шаблон Simple Sockek Server . На плате установлен Marvel 88E1111. Интерфейс SGMAII . Подскажите как в этом случае инициализировать MAC и микросхему.
rainzz
Собрал систему с TSE. Переделал стандартный пример Simple Socket Server (uCOSII+NicheStack) под передачу файла по протоколу TFTP. Но скорость передачи оказалась ниже плинтуса - около 1.6Mb/s при подключении 100Mb. Друзья, подскажите где копать чтобы разогнать протокол.
Jeremiah
Цитата(vadimuzzz @ Sep 16 2009, 15:42) *
тут посмотрите (внизу).
PHY пробовал KSZ8041 и LAN8700
Добрый день! Возможно уже не в тему) но все же) никак не могу на open cores
"10/100 Ethernet MAC with Avalon Interface от Jakob Jones (есчё называется eth_ocm врод"
ссылка на ниосфорум уже не работает! а тка хочеться посмотреть что это за зверь ! не могли бы вы дать ссылочку или если есть то сам архивчек!
Мое мыло: maxtelegin@gmail.com
Зарание благодарю!
wpost
Пытаюсь запустить simple socket server на kit плате Cyclone IV GX EP4CGX150DF31

вроде как почти получилось.... но уперся в проблемму "TSEMAC SW reset bit never cleared!"
поиск по интернету показал, что с этим сталкиваются многие, но решения не приводится... кто знает как решить проблему?

Код
InterNiche Portable TCP/IP, v3.1

Copyright 1996-2008 by InterNiche Technologies. All rights reserved.
prep_tse_mac 0
Your Ethernet MAC address is 77:00:a2:df:55:aa
prepped 1 interface, initializing...
[tse_mac_init]
INFO    : TSE MAC 0 found at address 0x08003000
INFO    : PHY Marvell 88E1111 found at PHY address 0x12 of MAC Group[0]
INFO    : PHY[0.0] - Automatically mapped to tse_mac_device[0]
INFO    : PHY[0.0] - Restart Auto-Negotiation, checking PHY link...
INFO    : PHY[0.0] - Auto-Negotiation PASSED
MARVELL : Mode changed to RGMII/Modified MII to Copper mode
MARVELL : Enable RGMII Timing Control
MARVELL : PHY reset
INFO    : PHY[0.0] - Checking link...
INFO    : PHY[0.0] - Link not yet established, restart auto-negotiation...
INFO    : PHY[0.0] - Restart Auto-Negotiation, checking PHY link...
INFO    : PHY[0.0] - Auto-Negotiation PASSED
INFO    : PHY[0.0] - Link established
INFO    : PHY[0.0] - Speed = 1000, Duplex = Full
TSEMAC SW reset bit never cleared!
OK, x=10002, CMD_CONFIG=0x00002000

MAC post-initialization: CMD_CONFIG=0x04000208
[tse_sgdma_read_init] RX descriptor chain desc (1 depth) created
mctest init called
IP address of et1 : 192.168.0.10
Created "Inet main" task (Prio: 2)
Created "clock tick" task (Prio: 3)
DHCP timed out, going back to default IP address(es)

Simple Socket Server starting up
[sss_task] Simple Socket Server listening on port 30
Created "simple socket server" task (Prio: 4)InterNiche Portable TCP/IP, v3.1

Copyright 1996-2008 by InterNiche Technologies. All rights reserved.
prep_tse_mac 0
Your Ethernet MAC address is 77:00:a2:df:55:aa
prepped 1 interface, initializing...
[tse_mac_init]
INFO    : TSE MAC 0 found at address 0x08003000
INFO    : PHY Marvell 88E1111 found at PHY address 0x12 of MAC Group[0]
INFO    : PHY[0.0] - Automatically mapped to tse_mac_device[0]
INFO    : PHY[0.0] - Restart Auto-Negotiation, checking PHY link...
INFO    : PHY[0.0] - Auto-Negotiation PASSED
MARVELL : Mode changed to RGMII/Modified MII to Copper mode
MARVELL : Enable RGMII Timing Control
MARVELL : PHY reset
INFO    : PHY[0.0] - Checking link...
INFO    : PHY[0.0] - Link not yet established, restart auto-negotiation...
INFO    : PHY[0.0] - Restart Auto-Negotiation, checking PHY link...
INFO    : PHY[0.0] - Auto-Negotiation PASSED
INFO    : PHY[0.0] - Link established
INFO    : PHY[0.0] - Speed = 1000, Duplex = Full
TSEMAC SW reset bit never cleared!
OK, x=10002, CMD_CONFIG=0x00002000

MAC post-initialization: CMD_CONFIG=0x04000208
[tse_sgdma_read_init] RX descriptor chain desc (1 depth) created
mctest init called
IP address of et1 : 192.168.0.10
Created "Inet main" task (Prio: 2)
Created "clock tick" task (Prio: 3)
DHCP timed out, going back to default IP address(es)

Simple Socket Server starting up
[sss_task] Simple Socket Server listening on port 30
Created "simple socket server" task (Prio: 4)
ISK
У нас была подобная проблема. Тоже искали решение по форумам, но там никаких стоящих решений по этой теме не нашли. Насколько я помню, проблема была в подключении TSE ethernet MAC к PHY. Смотрите правильность подключения сигналов, частот. У нас вроде бы не подключен была клок, то ли на приём, то ли на передачу.
wpost
Цитата(ISK @ Sep 28 2012, 16:31) *
Смотрите правильность подключения сигналов, частот.


Спасибо за совет! Решение оказалось простое.... у Marvell 88E1111 порт GTX_CLK оказался входом, а не выходом... убогость документации Marvell, конечно, шокирует.....
wpost
Цитата(wpost @ Oct 1 2012, 09:33) *
Спасибо за совет! Решение оказалось простое.... у Marvell 88E1111 порт GTX_CLK оказался входом, а не выходом... убогость документации Marvell, конечно, шокирует.....


а у кого-нить получилось запустил FTP серсвер?
alexPec
Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.
vadimuzzz
Цитата(alexPec @ Jan 8 2013, 02:48) *
Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.

шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим
alexPec
Цитата(vadimuzzz @ Jan 16 2013, 10:20) *
шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим


Код
//Ставим требование 1 нс до и после фронта rxclk стабильных данных
create_clock -period 40 -name rxclk [get_ports {eth_rxclk}]
set_input_delay -clock { rxclk } 1 [get_ports {eth_rxd[0] eth_rxd[1] eth_rxd[2] eth_rxd[3] eth_rxdv eth_rxerr}]

//Это по статье DES00 писал

create_clock -period 40 -name txclk [get_ports {eth_txclk}]
create_clock -period 40 -name txclk_virt
set_clock_groups -exclusive -group {txclk txclk_virt}
set_output_delay -clock { txclk_virt } -rise -max 11 [get_ports {eth_txd[0] eth_txd[1] eth_txd[2] eth_txd[3] eth_txen}]


Как то так... Сейчас работает, но может и просто сборка удачная получилась.
Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему?
PHY у меня DP83848.

Может сможете подсказать по смежным темам: нерешенная1 и нерешенная2 ?

Рад снова видеть Вас здесь, Vadimuzzz!
vadimuzzz
Цитата(alexPec @ Jan 16 2013, 19:07) *
Как то так... Сейчас работает, но может и просто сборка удачная получилась.
Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему?
PHY у меня DP83848.

когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.
завтра свой пример констрейнов выложу, у меня немного иначе сделано.
alexPec
Цитата(vadimuzzz @ Jan 16 2013, 17:00) *
когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.
завтра свой пример констрейнов выложу, у меня немного иначе сделано.

Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.
А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.
vadimuzzz
Цитата(alexPec @ Jan 16 2013, 23:25) *
Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.
А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.

так там и нет сообщения об ошибке, только в отчете будет красным подсвечен раздел "Unconstrained paths". давайте отчет таймквеста тоже выкладывайте.
что касается констрейнов, то для приемника д. б. как-то так:
Код
create_clock -name rx_virtualclk -period 40
create_clock -period 40 -name rxclk [get_ports {eth_rxclk}] -waveform {20ns 40ns}
set_clock_groups -exclusive -group {rxclk rx_virtualclk}
set phy_tco_max 10
set phy_tco_min -10
set_input_delay -clock rx_virtualclk -max $phy_tco_max [get_ports {eth_rxd* eth_rxerr}]
set_input_delay -clock rx_virtualclk -min $phy_tco_min [get_ports {eth_rxd* eth_rxerr}]

для передатчика последнюю строку заменить на:
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $tsu [get_ports {eth_txd* eth_txen}]
set_output_delay -clock { txclk_virt } -rise -min -$th [get_ports {eth_txd* eth_txen}]

параметры phy_* я взял из даташита. эти констрейны более жесткие, чем у вас
alexPec
Спасибо, переварю, переиначу у себя.
_VM
Эх...
В общем давно пользуюсь связкой NIOS + SGDMA + TSE.
Все работало и устраивало, пока не произвел ревизию.
Обнаружил, что размер блока накристальной памяти выделенной под дескрипторы - 4096 байт, показалось многовато.
В исходниках индексация памяти дескрипторов при их формировании (функции alt_avalon_sgdma_construct_stream_to_mem_desc и alt_avalon_sgdma_construct_mem_to_stream_desc) производится определениями:
#define ALTERA_TSE_FIRST_TX_SGDMA_DESC_OFST 0
#define ALTERA_TSE_SECOND_TX_SGDMA_DESC_OFST 1
#define ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST 2
#define ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST 3
т.е. используется всего 4 дескриптора.
Размер дескриптора (структура alt_sgdma_descriptor) 32 байта.
Ну я и решил уменьшить размер памяти дескрипторов до 128 байт.
Не заработало.
Прием пакетов отвалился совсем (прерывания по приему не генерятся).
Передача блокируется внутри alt_avalon_sgdma_do_sync_transfer() на ожидании завершения передачи данных, строки:
/* Wait for the descriptor (chain) to complete */
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(dev->base) &
ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
При этом в анализаторе протоколов видно, что пакет улетает.

Проходил кто сии фокусы?

vadimuzzz
Цитата(_VM @ Jan 24 2013, 03:34) *
Проходил кто сии фокусы?

у меня везде размер памяти под дескрипторы 1024 байта, меньше смыла делать нет, т.к. размер блока на ц3/ц4 как раз 9кбит. если уверены во всем остальном, то цепляйте сигналтап к портам sgdma и проверяйте. там есть mm-slave порт для конфигурации процессором, mm-master для апдейта состояния дескрипторов и avalon-st (in или out в зависимости от того, какой канал, rx или tx). порядок проверки: сначала mm-slave, потом avalon-st (если предыдущий шаг прошел успешно), потом mm-master (опять же при успешном завершении предыдущего).

практика показывает, что все ошибки глупые sm.gif
InfyQ
Здравствуйте. Помогите, пожалуйста, разобраться с проблемой.
Собственно, стоит задача отправить ethernet фрейм, используя TSE. В наличии стенд Altera DE2-115 (Циклон4, Marvel 88E1111). Аппаратную часть взял от Simple Socket Server, программную(драйвер) использую от ув. Vadimuzzz'a.

MAC_init:
Цитата
int MAC_init() {

alt_u32 tse_cmd_cfg = 0;
tse_cmd_cfg = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);
printf("MAC_init(): tse_cmd_cfg= %x\n", tse_cmd_cfg);
alt_u32 /*t,*1=0,*/t2 = 0;
int status = 0;
p_counter = 0;


alt_u16 phyid1, phyid2;
/* PHY инициализация */
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY);
phyid1 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 2);
phyid2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 3);

printf ("PHY=%X phy found:id1 %x, id2 %x\n",PHY, phyid1, phyid2);
do {
Delay(0xFFFFF);
t2=IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);
printf("t2=%d\n", t2);
}
while ((t2 & 0x04) == 0);//wait link-up
printf("t2=%d\n", t2);
/* ПОлучаем адреса Rx и Tx SGDMA */
sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);
sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME);
if((!sgdma_tx_dev)||(!sgdma_rx_dev)) {
printf("[triple_speed_ethernet_init] Error opening TX or RX SGDMA\n");
}
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTW
ARERESET_MSK);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0);

/* перезапускаем мак */

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE , ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK);
while (IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE)
& ALTERA_TSEMAC_CMD_SW_RESET_MSK) {
}

/* Инициализация мак регистров */

IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3);
IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH - 16);
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 16);
IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16);
IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 16);
IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,0);
IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_
MSK);
IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,0);
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK | ALTERA_TSEMAC_CMD_PAD_EN_MSK);
IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xAB << 16) | (int)(0xF0 << 24)));
IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x0D) | (int)(0xBA << 8)) & 0xFFFF));

alt_avalon_sgdma_register_callback(sgdma_rx_dev,
(alt_avalon_sgdma_callback) &tse_sgdmaRx_isr,
(alt_u16) ALTERA_TSE_SGDMA_INTR_MASK, sgdma_rx_dev);

alt_u32 *uncached_packet_payload;
uncached_packet_payload
= (void *) alt_remap_cached((volatile void*) pkt, 4);
alt_avalon_sgdma_construct_stream_to_mem_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_SGDMA_RX_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_SGDMA_RX_DESC_OFST], // pointer to "next"
uncached_packet_payload, // starting write_address
0, // read until EOP
0);
while ((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE)
& ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK))
;
t2 = alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev,
&desc[ALTERA_TSE_FIRST_SGDMA_RX_DESC_OFST]);
tse_cmd_cfg = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);
printf("MAC_init(): tse_cmd_cfg= %x\n", tse_cmd_cfg);
sem = 0;
printf("controlPHY = %x\n",IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 0));
printf("statusPHY = %x\n",IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 1));
return status;
}


tse_mac_raw_send:
Цитата
int tse_mac_raw_send(char * data, unsigned data_bytes) {
alt_u32 *uncached_packet_payload;
alt_32 timeout;
alt_u16 actualBytesTransferred=0;
int result;
if (sem != 0) /* Tx занят*/
{
alt_printf("Tx is busy\n");
return -22;
}
sem = 1;

// clear bit-31 before passing it to SGDMA Driver
uncached_packet_payload = (alt_u32*) alt_remap_cached(
(volatile void*) data, 4);

if (data_bytes > ALTERA_TSE_MIN_MTU_SIZE) {
alt_avalon_sgdma_construct_mem_to_stream_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_SGDMA_TX_DESC_OFST],// pointer to "next"
uncached_packet_payload, // starting read address
(data_bytes), // # bytes
0, // don't read from constant address
1, // generate sop
1, // generate endofpacket signal
0); // atlantic channel (don't know/don't care: set to 0)
result = 0;

// Проверяем не занят ли TX и SGDMA
timeout = 0;
while ((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE)
& ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK)) {
if (timeout++ == ALTERA_TSE_SGDMA_BUSY_TIME_OUT_CNT) {
alt_printf("WARNING : TX SGDMA Timeout\n");
return -22; // avoid being stuck here
}
}
// Начинаем передачу
IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_TX_BASE, 0);
IOWR_ALTERA_AVALON_SGDMA_STATUS (SGDMA_TX_BASE, 0xFF);
result = alt_avalon_sgdma_do_sync_transfer(
sgdma_tx_dev,
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST]);
//printf("tse_sgdmaRx_isr() result = %d\n", result);
} else {
result = -3;
}

if (result < 0) /* SGDMA не доступен */
{
alt_printf("raw_send() SGDMA not available\n");
sem = 0;
return -22;
} else /* Всё ОК*/
{
sem = 0;
actualBytesTransferred=0;
actualBytesTransferred = IORD_ALTERA_TSE_SGDMA_DESC_ACTUAL_BYTES_TRANSFERRED(&desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST]);
//printf("actualBytesTransferred = %d\n", actualBytesTransferred);
return 0; /*ОК */
}
}


отправка пакетов из Main
Цитата
while (1){
a=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE);
if (a==0x01){
while (a==0x1)
{
res_init = tse_mac_raw_send(data_ptr, 200);
res_init = tse_mac_raw_send(data_test1, 200);
res_init = tse_mac_raw_send(data_test2, 200);
res_init = tse_mac_raw_send(data_test3, 200);
a=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE);
}
StatisticsCounters_Report();
}
}


В итоге, внешне вроде как всё работает: Светодиоды TX, RX на Marverl моргают, запускается на скорости 1гбит/c full duplex (судя по светодиодам). В консоль получаю вывод:

Цитата
------------------------------------------------------Hello from NIOS
MAC_init(): tse_cmd_cfg= 4000223
PHY=10 phy found:id1 141, id2 cc2
t2=31081
t2=31085
t2=31085
MAC_init(): tse_cmd_cfg= 4000223
controlPHY = 1140
controlPHY = 796d
MAC init err: 0



------------------------------------------------------------------
The MAC address 1: F0AB0700
The MAC address 2: BA0D
The number of frames that are successfully transmitted including the pause frames: 168067
The number of receive frames with CRC error: 0
The number of data and padding octets that are successfully transmitted: 31260462
The number of data and padding octets that are successfully received: 0
The number of pause frames transmitted: 0
The number received pause frames received: 0
The number of errored frames received: 0
The number of transmit frames with one the following errors(see TSE guide 5-10): 13
The number of valid unicast frames received: 0
The number of valid multicast frames received(without pause frames): 0
The number of valid broadcast frames received: 0
The number of valid unicast frames transmitted: 126049
The number of valid multicast frames transmitted, excluding pause frames: 42020
The number of valid broadcast frames transmitted: 0
The number of frames that are dropped due to MAC internal errors when FIFO buffer overflow persists: 0
The total number of octets received: 0
The total number of frames received: 0
The number of frames received with length less than 64 bytes: 0
The number of frames received that are longer than the value configured in the frm_length register: 0
The number of 64-byte good and err frames received: 0
The number of received good and errored frames between the length of 65 and 127 bytes: 0
The number of received good and errored frames between the length of 128 and 255 bytes: 0
The number of received good and errored frames between the length of 256 and 511 bytes: 0
The number of received good and errored frames between the length of 512 and 1023 bytes: 0
The number of received good and errored frames between the length of 1024 and 1518 bytes: 0
The number of received good and errored frames between the length of 1519 and the maximum frame length configured in the frm_length register: 0
Too long frames with CRC error: 0
Too short frames with CRC error: 0


------------------------------------------------------------------tse_sgdmaRx_isr(): Im here
Packet counter:1
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK
RX descriptor reported error. Packet dropped
tse_sgdmaRx_isr(): Im here
Packet counter:2
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK
RX descriptor reported error. Packet dropped
tse_sgdmaRx_isr(): Im here
Packet counter:3
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK
RX descriptor reported error. Packet dropped


Т.е. судя по Statistics Counters и светодиодам всё успешно отправляется. Но на WireShark (ОС win7) тишина.. В чем может быть проблема??
Да и почему SGDMA рапортует об ошибках входящих пакетов?

P.S. До этого успешно отправлял пакеты с помощью демонстрационного примера Simple Socket Server.
P.S.S. Заранее извиняюсь за глупые ошибки) До этого с FPGA не работал.)
vadimuzzz
а марвел в каком режиме? rgmii?
InfyQ
Цитата(vadimuzzz @ Feb 15 2013, 20:04) *
а марвел в каком режиме? rgmii?

Если вы о перемычках на стенде, то да(перемычка установлена в режим RGMII). Да и демонстрационный пример Simple Socket Server брался и использовался для RGMII режима.

Еще смущают строчки
Цитата
The number of frames that are successfully transmitted including the pause frames: 168067
The number of data and padding octets that are successfully transmitted: 31260462

31260462/168067=186 хотя отправляю пакеты по 200 байт.

Еще такой вопрос. Как принудительно установить скорость в 100мбит. В документации нашел бит, который отвечает за скорость eth_speed. Но помимо этого бита скорость зависит еще от сигнала set_1000 (т.к. у меня этот бит по умолчанию "0", но link запускается в гигабитном режиме). Как и где можно изменить этот сигнал?? -)

Может быть предоставить вывод еще каких либо регистров?

P.S. Прошу прощения, Аппаратная часть от Web Server (DE2_115_WEB_SERVER_RGMII_ENET0).
vadimuzzz
пример инициализации PHY в режиме rgmii:
Код
    /* PHY and other board peripherial initialization */
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY);
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B);//Extended PHY Specific Status Register
    t2 &= 0xFFF0;
    IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B,t2|0xB);//RGMII to Copper
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x14);//Extended PHY Specific Control Register
    IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x14,t2|0x82);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL);
    IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2|PCS_CTL_sw_reset);//Previous Operations Require SW Reset
    do
    {
        t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);
    }
    while((t2&0x04)==0);//wait for link-up


чтобы принудительно выставить 100, подайте нули на входы set_10 и set_1000, а также сбросьте бит ETH_SPEED.
Acvarif
Создал систему для Циклона 4 (DE0Nano) Нажмите для просмотра прикрепленного файла
Драйвер от уважаемого vadimuzzz
Основные функции драйвера
CODE
int MAC_init()
{
alt_u32 t,t1,t2=0;
int status=0;
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE,0x1F);
t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,1);
while((IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x01)&0x04)==0)
{
Delay(0xFFFF);
}
t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,1);

//PHY_LEDS=ACT+LINK----------------------------------------------------------------------
t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x1e);
t2|=0x4000;
IOWR_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x1e,t2);
for(t2=0;t2<256;++t2)
{
IOWR(ONCHIP_MEMORY2_0_BASE,t2,0);
}
currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST];
nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr);
desc_pointer = currdescriptor_ptr;
desc_pointer->status&=~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK;
desc_pointer = currdescriptor_ptr;

/* Get the Rx and Tx SGDMA addresses */

sgdma_tx_dev = alt_avalon_sgdma_open("/dev/sgdma_tx_0");
if(sgdma_tx_dev == NULL)
{
printf("Could not open the transmit SG-DMA\n");
}
else printf("Open the transmit SG-DMA... success\n");
sgdma_rx_dev = alt_avalon_sgdma_open("/dev/sgdma_rx_0");
if(sgdma_rx_dev == NULL)
{
printf("Could not open the receive SG-DMA\n");
}
else printf("Open the receive SG-DMA... success\n");


IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_0_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOF
TWARERESET_MSK);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_0_BASE, 0x0);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOF
TWARERESET_MSK);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, 0x0);

/* reset the mac */

IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE,ALTERA_TSEMAC_CMD_SW_RESET_MSK);
while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK)
{
}

t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE);

/* Initialize MAC registers */

IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_0_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_0_BASE, 8);
IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_0_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_0_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_0_BASE, 3);
IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_0_BASE, TSE_0_TRANSMIT_FIFO_DEPTH - 16); //1024/4;
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_0_BASE, 16); //32/4; // start transmit when there are 48 bytes
IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_0_BASE, TSE_0_RECEIVE_FIFO_DEPTH - 16); //4000/4);
IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_0_BASE, 16);
IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_0_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_MS
K);
IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_0_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_MS
K);
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);
IOWR_ALTERA_TSEMAC_MAC_0(TSE_0_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xAB << 16) | (int)(0xF0 << 24)));
IOWR_ALTERA_TSEMAC_MAC_1(TSE_0_BASE,(((int)(0x0D) | (int)(0xBA << 8)) & 0xFFFF));
t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE);
alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_TSE_SGDMA_INTR_MASK,sgdma_rx_dev);
t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_0_BASE);
t2=IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE);
status = tse_sgdma_read_init();

sem=0;
return status;
}


CODE
int tse_sgdma_read_init()
{
alt_u32 *uncached_packet_payload;
uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST];
nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr);
alt_avalon_sgdma_construct_stream_to_mem_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next"
uncached_packet_payload, // pkt_array[chain_loop]->nb_buff, // starting write_address
0, // read until EOP
0);
int ii=1;
currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST];
nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr);
ii=-alt_avalon_sgdma_check_descriptor_status(currdescriptor_ptr);
ii=alt_avalon_sgdma_check_descriptor_status(nextdescriptor_ptr);
desc_pointer = currdescriptor_ptr;
tse_mac_aRxRead(currdescriptor_ptr);
return 1;
}


CODE
int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0xff);

alt_u32 t2=0;
tse_mac_rcv();
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, 0x00);
//t2=IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE);--
//t2|=ALTERA_AVALON_SGDMA_CONTROL_CLEAR_INTERRUPT_MSK;--irq
//IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, t2);--
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, ALTERA_TSE_SGDMA_INTR_MASK);
if((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK ))
{
tse_mac_aRxRead(currdescriptor_ptr);
}
IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE,0xFF);
t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE);
return 1;
}


Код
alt_u16  tse_mac_aRxRead(alt_sgdma_descriptor *rxDesc)
{
    alt_u8 result = 0;
    while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
    result = alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, rxDesc);//(alt_sgdma_descriptor *) &rxDesc[0]);
    return 1;
}


Код
int tse_mac_rcv()
{
    alt_u32 *uncached_packet_payload;
    alt_u8 tempVar;
    desc_pointer = currdescriptor_ptr;

    if ((IORD_ALTERA_TSE_SGDMA_DESC_STATUS(desc_pointer)) & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK)
    {
        desc_pointer->status&=~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK;
        nextdescriptor_ptr = (alt_sgdma_descriptor *)IORD_ALTERA_TSE_SGDMA_DESC_NEXT(desc_pointer);
        uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
        tempVar = IORD_8DIRECT(&nextdescriptor_ptr->control, 0 );
        alt_avalon_sgdma_construct_stream_to_mem_desc(
            (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST],  // descriptor I want to work with
            (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST],  // pointer to "next"
            uncached_packet_payload,            // starting write_address
            0,                                  // read until EOP
            0);                                 // don't write to constant address
        IOWR_8DIRECT(&nextdescriptor_ptr->control, 0, tempVar);
        desc_pointer = nextdescriptor_ptr;
    }
    return 1;
}


Все инициализируется нормально. Передача работает нормально. Программа нормально работает в sdram на 100 . Проблема в приемнике. На приемник передаю короткие пакеты 96 байт известного содержимого. Приемник совсем не хочет принимать.
Подозреваю, что из-за констрейнов... Каких не врубаюсь. Подскажите пожалуйста куда копать.
vadimuzzz
Не понял на счет борды, на этой нет eth:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=593

уточните спеки системы, особенно насчет PHY и шины к ней
Acvarif
Цитата(vadimuzzz @ Feb 27 2013, 10:01) *
Не понял на счет борды, на этой нет eth:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=593

уточните спеки системы, особенно насчет PHY и шины к ней

Подцепил к ней это http://starterkit.ru/html/index.php?name=s...=view&id=19 Режим MII Работает нормально, даже внешнего питания не требует (от USB) Вот только приемник TSE не работает.
Нажмите для просмотра прикрепленного файла
vadimuzzz
я приводил пример для DP83848, мельком глянул даташит на ks8721 - вроде времянки такие же.

http://electronix.ru/forum/index.php?showt...t&p=1128246
Acvarif
Цитата(vadimuzzz @ Feb 27 2013, 13:30) *
я приводил пример для DP83848, мельком глянул даташит на ks8721 - вроде времянки такие же.

http://electronix.ru/forum/index.php?showt...t&p=1128246

Спасибо.
Приемник заработал. Но принимает только один раз. Для повторного приема необходимо перезагрузить .sof
Не врубаюсь в чем хитрость..
Стоп..
Кажется заработало. Глубина FIFO приемника была маленькая.
Теперь нужно проверить как правильно принимаются байты. В приемнике eth_ocm нужный байт находился в массиве buf_ptr
Код
...
        buf_ptr = (alt_u8*)alt_remap_cached ((volatile void*) pkt, 4);
        buf_ptr = (alt_u8*)(((unsigned int)buf_ptr) + ETHHDR_BIAS);
        IOWR_ETH_OCM_DESC_PTR(ETH_OCM_0_BASE, 1, (alt_u32)buf_ptr);
...

Подскажите пожалуйста как для TSE поступать. На приемник передается 96 байт известного содержимого.
Где будут находиться данные по приему (TSE)?
Код
    if((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK ))
    {
        tse_mac_aRxRead(currdescriptor_ptr);
     }

Принимающая функция tse_mac_aRxRead Как теперь из нее достать каждый отдельный байтик принятого пакета?
Acvarif
Спасибо.
Разобрался.
Данные по приему тут buf_ptr = (alt_u8*)alt_remap_cached ((volatile void*) pkt, 4);
Приемы нормальные. Байты все в нужных местах.
Но еще остается непонятка. Примерно после 1..2_х минут работы все останавливается. Нет прерываний по приему.
При этом программа крутится как положено. Главный цикл работает.
Помогает перезагрузка .elf из отладчика либо перезагрузка .sof из программатора.
В чем может быть причина остановки?
alexPec
Цитата(Acvarif @ Mar 4 2013, 13:17) *
В чем может быть причина остановки?


C опенкорес эзернетом то же самое бывает когда переполняется внутреннее фифо ядра эзернет. Т.е. если поток большой и не успевает софт обработать пакеты - прием затыкается, пропадают прерывания на прием. Передача при этом работает, софт тоже. Но правда такие случаи с опенкоресом у меня были только когда брейкпоинт ставишь - пакетов наваливается пока в брейке висит и прерывания приема пропадают. А в штатном режиме такого не было, правда потоки у меня не запредельные - 4..8 мбит. Спасала только перезаливка elf
Acvarif
Цитата(alexPec @ Mar 4 2013, 12:27) *
C опенкорес эзернетом то же самое бывает когда переполняется внутреннее фифо ядра эзернет. Т.е. если поток большой и не успевает софт обработать пакеты - прием затыкается, пропадают прерывания на прием. Передача при этом работает, софт тоже. Но правда такие случаи с опенкоресом у меня были только когда брейкпоинт ставишь - пакетов наваливается пока в брейке висит и прерывания приема пропадают. А в штатном режиме такого не было, правда потоки у меня не запредельные - 4..8 мбит. Спасала только перезаливка elf

Да, похоже как будто переполнение фифо tse. Но я выствил фифо на прием 2048, а наприем передаю из компа короткие пакеты 96 байт один раз в 0.3 сек. Вроде не должно при таком объеме фифо затыкаться...
vadimuzzz
я тут тоже недавно словил похожий баг с переполнением приемного fifo. по какой-то причине первый пакет мог (не выяснил, при каких условиях) вызвать переполнение fifo. хотя в штатном режиме сбойный пакет просто должен быть отброшен. я покопался в доках и нашел ошибку в своем коде, которая тянется с хз каких времен. суть: если взводится бит ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK в командном регистре, то RX_SECTION_FULL должен быть установлен в 0, т.к. иначе опция проверки пакетов не работает.
сейчас код инициализации MAC у меня выглядит так:
Код
    IOWR_ALTERA_TSEMAC_FRM_LENGTH(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  3);
    IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ETH_0_TRIPLE_SPEED_ETHERNET_0_TRANSMIT_FIFO_DEPTH - 16);
    IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  0);
    IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ETH_0_TRIPLE_SPEED_ETHERNET_0_RECEIVE_FIFO_DEPTH - 16);
    IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  0);
    IOWR_ALTERA_TSEMAC_TX_CMD_STAT(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,0);
    IOWR_ALTERA_TSEMAC_RX_CMD_STAT(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,0);
    IOWR_ALTERA_TSEMAC_MAC_0(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, MY_MAC_ADDR.mac_addr.mac_hi);
    IOWR_ALTERA_TSEMAC_MAC_1(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, MY_MAC_ADDR.mac_addr.mac_lo);
    IOWR_ALTERA_TSEMAC_CMD_CONFIG(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,   ALTERA_TSEMAC_CMD_TX_ENA_MSK |
                                                                        ALTERA_TSEMAC_CMD_RX_ENA_MSK |
                                                                        ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK |
                                                                        ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK |
                                                                        ALTERA_TSEMAC_CMD_PAD_EN_MSK);

почему я этот баг раньше не поймал - ума не приложу, м.б. что-то меняли в новых корках
Acvarif
Спасибо. Приемник стал работать лучше. Но всеравно иногда затыкался.
Полностью избавиться от затыков на приеме помогло изменение конфигурации fifo tse из 32-бит на 8 бит
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
Не врубаюсь какая связь между размерностью фифо TSE и надежностью приемов...
Попробую вернуться назад (на 32 бита) и еще раз проверить
Acvarif
Приемник нормально заработал с 32_битным TSE фифо на процессорах типа S и F. На E нормально работает с 8 битным TSE фифо.
Спасибо vadimuzzz. Ваш драйвер TSE работает также неплохо как и драйвер Eth_ocm.
Acvarif
Успешно запустив Ethernet на De0Nano, появилсь необходимость использовать ethernet драйвер от vadimuzzz на DE2-115 где стоит phy 88E1111. Но не получается. Очевидно потому, что неизвестен адрес PHY. Для Микрела (ksz872bl) он был #define PHY 0x1. Если кто сталкивался подскажите пожалуйста какой установить #define PHY для 88E1111 (De2-115)?
Попробую автопределение
Код
for (t=0;t<33;t++) {
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, t);
    alt_printf("Probing PHY at address %x ...\n", t);
    r = IORD_ALTERA_TSEMAC_MDIO(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1);
    if (r == 0x22)/*KSZ9021*/{
        alt_printf("PHY address:%x\n", t);
        alt_printf("PHY_ID1:%x\n", r);
        alt_printf("PHY_ID2:%x\n", IORD_ALTERA_TSEMAC_MDIO(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID2));
        break;
    }
}

Подскажите please ID 88E1111
vadimuzzz
PHY_ADDR у марвела весьма своеобразно задается, путем подключения ног CONFIG к опеделенным LED. судя по схеме борды, адрес выставлен 10000b(0x10) для eth0 и 10001b (0x11) для eth1. на всякий случай, PHY_ID1=0x0141
Acvarif
Цитата(vadimuzzz @ Apr 3 2013, 14:28) *
PHY_ADDR у марвела весьма своеобразно задается, путем подключения ног CONFIG к опеделенным LED. судя по схеме борды, адрес выставлен 10000b(0x10) для eth0 и 10001b (0x11) для eth1. на всякий случай, PHY_ID1=0x0141

Спасибо.
PHY_ADDR определился как 0x10. Поскольку на передачу 88E1111 требует внешнюю тактовую, то подал на вход gtx_clock phy 125мГц. Светодиод передачи на боарде мигает, тоесть функция tse_mac_raw_send((char*)ethmass_ptr, 1168) работает - в PHY tse что-то загружает. Внешне вроде передатчик работает. Но на сниффере пусто.

Вроде инициализация tse никак не должна отличаться для ksz872 и для 88e1111? Да и подключение tse к PHY для режима MII должно быть одинаковое для ksz872 и 88e1111 кроме внешнй частоты gtx_clock phy 125мГц.

Пока не пойму чего этой 88E1111 не хватает?
vadimuzzz
Цитата(Acvarif @ Apr 4 2013, 20:23) *
Пока не пойму чего этой 88E1111 не хватает?

там не MII, а RGMII. поэтому нужны 2 вещи - правильные констрейны на I/O и сконфигурировать PHY для режима RGMII (добавятся задержки по клокам). поищите, я код конфигурации марвела выкладывал. м.б. даже в этой теме
Acvarif
Цитата(vadimuzzz @ Apr 4 2013, 18:36) *
там не MII, а RGMII. поэтому нужны 2 вещи - правильные констрейны на I/O и сконфигурировать PHY для режима RGMII (добавятся задержки по клокам). поищите, я код конфигурации марвела выкладывал. м.б. даже в этой теме

Понял. Поищу. Попробую режим RGMII. Со стандартным примером от терасик этот режим вроде работает. Правда работает неважно. В пакетах смещение на 8 байт. И в части программы (tse драйвер, инициализация MAC, прием , передача ) там ногу можно сломать столько наворочено. Ваш драйвер намного понятнее. На ksz872bl работает отлично.
И тем не менее на боарде DE2-115 есть перемычка Jp1 которая переключает режим работы PHY на MII (ножка 60 Enet0_Cconfig4). Что я собственно и сделал. После загрузки системы и запуска инициализации МАС линк есть. Передача тоже работает (светодиод передатчика 88е1111 мигает). Но в сеть ничего не поступает. Как будто скорость передачи не та...
vadimuzzz
Цитата(Acvarif @ Apr 5 2013, 13:57) *
И тем не менее на боарде DE2-115 есть перемычка Jp1 которая переключает режим работы PHY на MII (ножка 60 Enet0_Cconfig4). Что я собственно и сделал. После загрузки системы и запуска инициализации МАС линк есть. Передача тоже работает (светодиод передатчика 88е1111 мигает). Но в сеть ничего не поступает. Как будто скорость передачи не та...

если используете MII, то надо подать на tx_clk 25MHz, gtx_clk в данном режиме не используется
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.