Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ethernet + Cyclone + Nios
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
avacs
Цитата(inco @ Jan 24 2011, 17:38) *
Люди помогите разобраться с передачей по Ethernet.

Есть кит 4 циклона DK-START-4CGX15N.
Беру проект который выкладывал тут ув. vadimuzzz, ОГРОМНОЕ ему за это спасибо!

Немного подправил его под проект кита "board_update_portal". Компилирую его запускаю... и естественно
ничего не работает.

Долго не мог въехать что именно не работает не было ни передачи ни приёма (светодиоды кита rx, tx мигали), при этом пример кита со стеком IP от iniche работал.

Начал по шагам сравнивать инициализацию PHY и MAC, нашел одно отличие у себя и у примера из кита. После добавления такой строки в инициализацию MAC - приём заработал.

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE, 0x03); // PCS SGMII mode enabled

А вот с передачей полная засада!

Уже не пойму куда смотреть. Лампочка tx на PHY (88E1111) мигает. Дескриптор возвращает
actual_bytes_transferred 0xc8, то есть вроде всё передал. Смотрю а пакета НЕТ!

Немного о конфигурации ПК. Для отладки Etherneta, стоит отдельная сетевая карта (вторая), IP прописал ей статический.

Приём на ките смотрю по запросам карточки. Она чего-то просит по широковещательному адресу FFFFFFFFFFFF у кита.
А на приёме у карточки из кита ничего нет! Может я ей неправильные пакеты шлю, хотя как я понял Wireshark должен показывать любые пакеты. Может чего-то на карточке в ПК надо сконфигурировать? Уже не знаю куда смотреть!!!

Прошу помощи у народа!

Файлы проекта (soft) прилагаю.


inco, недавно, сам мучался с такой же проблемой, правда на DSP 3C120 - CIII + Marvel 88E1111. пробовал проекты из данного топика, и оба запускались сразу на прием на 100Мб, а вот при передаче таже засада что и у Вас, светодиод мигает, а пакетов на другом конце в Wireshark - 0... КОРОЧЕ, ДОЛБАЛСЯ Я НЕДЕЛЮ ПОСЛЕ НОВОГО ГОДА... 3-й раз читал докуметацию (спасибо Little styart за доки и информацию).
Все заработало, когда поставил 1 бит в регистре 20 (0x14) Marvell. На всякий случай еще раз включил Ethernet передатчик...
Код
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x14,0xC53);
    IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x00,0xB100); //peregrujaem MAC SOFT Reset

Да, на карточке тоже ставил 100 Мб, autonegotiation..., а то можно поставить такой режим что коннект будет восстанавливатся только после "передергивания" кабеля Ethernet. Надеюсь поможет! Удачи. beer.gif
inco
Спасибо за информацию!

Я уже это тоже попробовал. Почитал доку на марвел и тоже попробовал принудительно включить передатчик (нулевой бит в 20 регистре). Но не сильно помогло. Если до этого вообще не видел данных, то после включения передатчика увидел что иногда в карточку приходят пакеты. Но не понятно как. Я сделал посылку пакетов примерно раз в секунду, но минут за 5 приходит только от 1 до 3 пакетов и всё. Больше пока времени разбираться не было. Уже второй день загрузили другими делами, может завтра продолжу если время выберу.
avacs
Цитата(inco @ Jan 26 2011, 22:33) *
Спасибо за информацию!

Я уже это тоже попробовал. Почитал доку на марвел и тоже попробовал принудительно включить передатчик (нулевой бит в 20 регистре). Но не сильно помогло. Если до этого вообще не видел данных, то после включения передатчика увидел что иногда в карточку приходят пакеты. Но не понятно как. Я сделал посылку пакетов примерно раз в секунду, но минут за 5 приходит только от 1 до 3 пакетов и всё. Больше пока времени разбираться не было. Уже второй день загрузили другими делами, может завтра продолжу если время выберу.

icon, ты меня непонял (или я неправильно выразился, сразу извиняюсь).
Я тоже сначала думал, что дело в нулевом бите, типа не включил Transmitter и поэтому нет сообщений, но все оказалось чуть интереснее!
Там есть еще и первый бит, он дает какое то (там есть описание) смещение между тактами RX и TX,
Вот из оф документации:п. 4.12.2 (стр 252 и далее у MArvell 88E1111 datasheet),
Регистр 20, бит -1, (стр 170) -> "RGMII Transmit Timing Control" =>> "1 - Add delay to GTX_CLK for TXD Outputs", fo details see Page 218.
У меня после выстановки именно этого бита заработала передача!
Я думаю что все бы заработало сразу если бы при тактировании я поставил фазовый сдвиг между CLK_RX и CLK_TX в TSE.
vadimuzzz
Цитата(avacs @ Jan 27 2011, 03:01) *
Я думаю что все бы заработало сразу если бы при тактировании я поставил фазовый сдвиг между CLK_RX и CLK_TX в TSE.

кстати не факт sm.gif. дело в том, что у марвела куча режимов шины *MII. если на плате разведено под rgmii, то при ините надо это указать.
inco
На ките марвел подключен по SGMII двумя диффиринциальными проводами RX и TX и всё.
vadimuzzz
Цитата(inco @ Jan 27 2011, 12:10) *
На ките марвел подключен по SGMII двумя диффиринциальными проводами RX и TX и всё.

там вроде ничего особенного в этом режиме нет, надо только заменить в коде выше
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B,t2|0xB);//RGMII to Copper
на
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B,t2|0x4);//SGMII without clock to Copper.
и выбросить установку задержек.
примерно так:
CODE

alt_u32 t2;
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|0x4);//SGMII without clock to Copper.
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
Stewart Little
bb-offtopic.gif
Цитата(avacs @ Jan 26 2011, 22:04) *
спасибо Little styart за доки и информацию

Stewart Little, если Вы не против sm.gif
avacs
Цитата(Stewart Little @ Jan 27 2011, 11:43) *
bb-offtopic.gif

Stewart Little, если Вы не против sm.gif


bb-offtopic.gif Прошу прощения! перепутал... За инфу Спасибо! beer.gif
inco
Вроде заработала передача дело оказалось в этой строке:

Было: - передача не работала
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 16);

Сделал как в примере кита:
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0);

И передача заработала!

А с инициализацией мака было всё в порядке.

Вот на всякий случай выкладываю весь кусок инициализации:
CODE
IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0);

// PHY and other board peripheral initialization
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE, PHY);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, 27); //Extended PHY Specific Status Register
t2 &= 0xFFF0;
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, 27, t2 | 0x04); //SGMII without Clock with SGMII Auto-Neg to copper

if((IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS)
& PCS_ST_an_done) == 0) {
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL + 16, 0x78);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL);
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);
}

// Without next string don't work reading packet
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE, 0x03); // PCS SGMII mode enabled

do {
Delay(0xFFFFF);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS);
} while((t2 & 0x04) == 0); //wait for link-up

/* Get the Rx and Tx SGDMA addresses */
sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);
sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTW
ARERESET_MSK);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0);

/* reset the mac */

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

/* Initialize MAC registers */

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); //1024/4;
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); //32/4; // start transmit when there are 48 bytes
IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4);
IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0);
IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_
MSK);
// 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)(0xED << 16) | (int)(0x19 << 24)));
IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x03) | (int)(0x01 << 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);
covsh
Здравствуйте!
Я новичок с плис, начиная разбираться с ethernet на ките DK-N2EVAL-3C25N
Микросхема физического уровня dp83848.

Всю тему прочил уже несколько раз, но ответов так и не нашел.

Собрал систему в sopc использую модель eth_ocm.
далее, создаю простую программу в nios и наталкиваюсь на то, что для успешной компиляции в проекте должен присутствовать InterNiche TCP/IP и соответсвенно UCOSII.
я прав или что-то путаю?

Хорошо, создал новый проект на основе шаблона с UCOSII, и при запуске получил приглашение ввести серийный номер smile3046.gif

Хочу попробовать свои силы с компонентом triple speed Ethernet (TSE) но меня смущает что он time limited. Как можно это побороть?

Направьте на путь истинный, с чего начать освоение 10/100 ethernet?

ps использую quartus II 9.1 sp1
vadimuzzz
Цитата(covsh @ Mar 8 2011, 22:15) *
Всю тему прочил уже несколько раз, но ответов так и не нашел.

Собрал систему в sopc использую модель eth_ocm.
далее, создаю простую программу в nios и наталкиваюсь на то, что для успешной компиляции в проекте должен присутствовать InterNiche TCP/IP и соответсвенно UCOSII.
я прав или что-то путаю?

в этой теме есть ответ и примеры кода без InterNiche TCP/IP
Цитата
Хочу попробовать свои силы с компонентом triple speed Ethernet (TSE) но меня смущает что он time limited. Как можно это побороть?

"правильной" лицензией.
Цитата
с чего начать освоение 10/100 ethernet?

если будете делать по примерам из этого топика, то сначала почитайте про ваш PHY, у него может отличаться инициализация. потом почитать про SGDMA. ну, и иметь представление об ARP, ICMP. этого хватит, чтобы пропинговать плату.
covsh
Цитата(vadimuzzz @ Mar 9 2011, 02:52) *
в этой теме есть ответ и примеры кода без InterNiche TCP/IP

было бы очень любезно, если бы вы указали где найти.
перелистал всю тему и без толку.
в гугле нашел лишь то, что можно InterNiche запустить без rtos используя superloop
http://www.alterawiki.com/wiki/%22Super_Loop%22_NicheStack

Цитата
"правильной" лицензией.

а она вообще существует под 9.1 sp2 ? sm.gif


vadimuzzz
Цитата(covsh @ Mar 9 2011, 13:52) *
было бы очень любезно, если бы вы указали где найти.
перелистал всю тему и без толку.

ну вы блин даете. http://electronix.ru/forum/index.php?showt...st&p=751876 - это для TSE. несколько раньше было для опенкоровского. может не листать, а читать попробовать?
covsh
Уважаемый, vadimuzzz
Я начинающий в этом вопросе, прошу понимания у знатоков sm.gif

Последовательность моих действий:
Я использую Quartus II 9.1 sp2.
Использую компонент eth_ocm_91_0_beta.zip
установил модуль в “C:\altera\91\ip\user_components\eth_ocm” в соответствии с инструкцией.
Далее, создал систему в SOPC


После этого, перехожу в NIOS и создаю простой проект на основе шаблона «Hello World»
При компиляции возникает ошибка.
Код
nios2-elf-gcc -xc -MP -MMD -c  -I. -I./drivers/inc -I./HAL/inc -DSYSTEM_BUS_WIDTH=32 -D__hal__ -pipe -DALT_NO_INSTRUCTION_EMULATION -DALT_SINGLE_THREADED -DALTERA_TRIPLE_SPEED_MAC -DETH_OCM_PHY_MAX_PROFILES=3 -DETH_OCM_PHY_SUPPORT_DP83848C -DETH_OCM_PHY_SUPPORT_MVL88E1111    -O0 -g -Wall  -mno-hw-div -mhw-mul -mno-hw-mulx   -o obj/drivers/src/eth_ocm_phy.o c:/work/new_nios/Nios_c3_new/software/hello_bsp/drivers/src/eth_ocm_phy.c
c:/work/new_nios/Nios_c3_new/software/hello_bsp/drivers/src/eth_ocm_phy.c: In function `eth_ocm_phy_init':
c:/work/new_nios/Nios_c3_new/software/hello_bsp/drivers/src/eth_ocm_phy.c:160: error: structure has no member named `phyadd'

Чего не хватает в моем проекте?
Что идейно я упустил?

Цитата(vadimuzzz @ Mar 9 2011, 11:04) *
ну вы блин даете. http://electronix.ru/forum/index.php?showt...st&p=751876 - это для TSE. несколько раньше было для опенкоровского. может не листать, а читать попробовать?

вы имели ввиду вот это?
http://electronix.ru/forum/index.php?s=&am...st&p=687221
vadimuzzz
Цитата(covsh @ Mar 9 2011, 15:01) *
вы имели ввиду вот это?
http://electronix.ru/forum/index.php?s=&am...st&p=687221

не совсем то.. там для TSE код, а опенкоровский закомментирован (он д.б. рабочий, но я лучше поищу последнюю актуальную версию). если вам не критично, начните с TSE. а я поищу у себя старый код для опенкоровского ядра. таких ошибок компиляции, как у вас, я не видел, тогда юзал квартус 7.2. ругается компилятор на поле в какой-то структуре, может быть там имя поменялось в новой версии?
covsh
Цитата(vadimuzzz @ Mar 9 2011, 12:25) *
не совсем то.. там для TSE код, а опенкоровский закомментирован (он д.б. рабочий, но я лучше поищу последнюю актуальную версию). если вам не критично, начните с TSE. а я поищу у себя старый код для опенкоровского ядра. таких ошибок компиляции, как у вас, я не видел, тогда юзал квартус 7.2. ругается компилятор на поле в какой-то структуре, может быть там имя поменялось в новой версии?

при вникании оказалось что все ошибки идут из-за отсутствия определения ALT_INICHE в eth_ocm.h
попытки определить его в ручную дают еще более серьезные ошибки sm.gif
однако, как только проект создается с поддержкой MicroC/OS-II RTOS и NicheStack TCP/IP Stack, компиляция проходит успешно.

видимо, либо где-то есть возможность конфигурирования либо эта штука сейчас работает только совместно с NicheStack TCP/IP Stack.

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

остался вопрос только с лицензированием TSE. если кто может помочь, напишите в личку sm.gif
vadimuzzz
пример драйвера для опенкоровского модуля eth
nmurzin
Здравствуйте.

Начальство поручило мне освоить работу с Gigabit Ethernet.

У меня есть KIT на Cyclon III с микросхемой Marvell 88E111.

Меня интересует объем работы который мне предстоит пройти
прежде чем я смогу передавать данные с компьютера в ПЛИС.

Глядя на этот форум я увидел что к освоению Ethernet причастны:
- Sopc Builder.
- NIOS-IDE.
- Некий Компонент Lan91C111.
- DDR2 память.

Я ранее не работал c Sopc Builder .
Просвятите меня пожалуйста:

- Какое отношение имеют друг к другу Sopc Builder и NIOS ?
- Обязательно ли для этой задачи использовать Sopc Builder ?
- Какое отношение имеет DDR2 память к Ethernet ?
- Что за компонент Lan91C111 и для чего он нужен ?

- Ну и самый главный вопрос, за какое время в человекочасах решается данная задача ?
Поделитесь сколько времени у вас на это ушло.




vadimuzzz
Цитата(nmurzin @ Mar 31 2011, 13:54) *
- Какое отношение имеют друг к другу Sopc Builder и NIOS ?

NIOS - один из компонентов, используя которые как кирпичики, можно собрать в билдере систему (SOPC)
Цитата
- Обязательно ли для этой задачи использовать Sopc Builder ?

нет, но жизнь он упрощает здорово. есть куча готовых компонентов, можно писать свои.
Цитата
- Какое отношение имеет DDR2 память к Ethernet ?

никакого. просто, как правило, по Ethernet надо слить довольно большой объем данных, удобно складывать их там. или же хочется
систему с ниосом, эзернетом и какой-нибудь осью - опять память нужна
Цитата
- Что за компонент Lan91C111 и для чего он нужен ?

это контроллер эзернет (MAC+PHY в одном флаконе). ставят обычно на дешевых платах. у вас марвеловский PHY, для него нужна IP-корка эзернет,
либо альтеровская, либо своя или опенсорсная. для Lan91C111 она не нужна.

Цитата(nmurzin @ Mar 31 2011, 13:54) *
Поделитесь сколько времени у вас на это ушло.

это зависит от вашего опыта. работали ли вы с другими контроллерами (если да, то вариант с ниосом предпочтительнее) или ПЛИС
avacs
Ув. vadimuzzz... а вы пробовали использовать при передаче jumbo frame (>4кб)??? А то я или что то туплю или не понимаю, по описанию Marvell 88E1111 поддерживает jumbo >10 кб, но при попытке записать пакет выше 1530 байт вижу только мигание светодиода TX (плата DSP KIT CIII 3C120F780), а на другом конце на машине под Ubuntu 10.10 под Wireshark ничего не вижу... основа для работы с сетью Ваша (та что вы с dim99 ранее делали)... Длину массивов переменных увеличивал, может нужно было увеличить размер дескриптора SGDMA в SOPCe (у меня сейчас дескриптор 4096)? или я уже туплю и все до бонального просто....??
vadimuzzz
нет, не пробовал. размер descriptor memory тут скорее всего ни при чем - сами дескрипторы всего 32 байта по-моему, в них только указатели лежат. надо смотреть настройки MAC-корки (инициализация и передача/прием - все, что связано с размером пакетов). попробуйте сигналтапом прицепиться к sgdma передатчика, посмотреть транзакции там.
almost
Цитата(avacs @ Apr 15 2011, 16:59) *
Ув. vadimuzzz... а вы пробовали использовать при передаче jumbo frame (>4кб)??? А то я или что то туплю или не понимаю, по описанию Marvell 88E1111 поддерживает jumbo >10 кб, но при попытке записать пакет выше 1530 байт вижу только мигание светодиода TX (плата DSP KIT CIII 3C120F780), а на другом конце на машине под Ubuntu 10.10 под Wireshark ничего не вижу... основа для работы с сетью Ваша (та что вы с dim99 ранее делали)... Длину массивов переменных увеличивал, может нужно было увеличить размер дескриптора SGDMA в SOPCe (у меня сейчас дескриптор 4096)? или я уже туплю и все до бонального просто....??


Добрый день. А сколько места конкретно занимает данная SOPC? Интересно просто (у меня такой же кит), на таком же ките проект UDP + ethernet под RGMII занял сущие крохи- 1 процент от кристалла.
covsh
Здравствуйте!

Сначала хочу поблагодарить тов. vadimuzzz за исходник
который очень помог при старте.

Решил приделать к проекту vadimuzzz'a свой обработчик пакетов arp+ping
Как раз появилась очень хорошая статья по этому поводу.

Вылез большой глюк. Суть проблемы в следующем: прием пакетов начал работать очень странно.
Arp пакет принимает корректно, далее программа на него отвечает (все вижу по wireshark)
Следующим идет ping запрос и вот тут косяк – обработчик прерывания перестает вызываться (не останавливается по контрольной точке в самом начале tse_sgdmaRx_isr).

Оригинальный проект работает без нареканий. Прерывания есть по приему каждого пакета.

Прошу помощи у сообщества. Исходники прилагаю.

ps пробовал на 9.1 sp2, оптимизацию всю отключил. на 10.1 sp1 поведение аналогичное
covsh
разобрался в странном поведении своей программы.
причина заключалась в том что на этапе инициализации в процедуре MAC_init() прописывался один мак адрес
Код
IOWR_ALTERA_TSEMAC_MAC_0(TRIPLE_SPEED_ETHERNET_0_BASE,((int)(0x00) | (int)(0x07 <<  8) | (int)(0xAB << 16) | (int)(0xF0 << 24)));
IOWR_ALTERA_TSEMAC_MAC_1(TRIPLE_SPEED_ETHERNET_0_BASE,(((int)(0x0D) | (int)(0xBA <<  8)) & 0xFFFF));


а на этапе формирование ethernet пакета присваивал совершенно другие мак адреса.
исправил на нужные - все заработало.

есть еще одна проблема, причины которой я не могу понять
в программе есть структура arp сообщения
Код
typedef struct arp_message {
    alt_u16 hw_type; // протокол канального уровня (Ethernet)
    alt_u16 proto_type; // протокол сетевого уровня (IP)
    alt_u8 hw_addr_len; // длина MAC-адреса =6
    alt_u8 proto_addr_len; // длина IP-адреса =4
    alt_u16 type; // тип сообщения (запрос/ответ)
    alt_u8 mac_addr_from[6]; // MAC-адрес отправителя
    alt_u32 ip_addr_from; // IP-адрес отправителя
    alt_u8 mac_addr_to[6]; // MAC-адрес получателя, нули если неизвестен
    alt_u32 ip_addr_to; // IP-адрес получателя
}arp_message_t;


когда делаю такое присваивание
Код
arp_message_t *msg = (void*)(frame->data);

то поле типа alt_u32 ip_addr_from присваивает переменной со сдвижкой в 2 байта, т.е. захватывается кускок mac_addr_to.
аналочино и второе поле alt_u32 ip_addr_to присваивает с ошибкой.

пробовал делать выравнивание структуре вот так
Код
typedef struct arp_message {
    alt_u16 hw_type; // протокол канального уровня (Ethernet)
    alt_u16 proto_type; // протокол сетевого уровня (IP)
    alt_u8 hw_addr_len; // длина MAC-адреса =6
    alt_u8 proto_addr_len; // длина IP-адреса =4
    alt_u16 type; // тип сообщения (запрос/ответ)
    alt_u8 mac_addr_from[6]; // MAC-адрес отправителя
    alt_u32 ip_addr_from; // IP-адрес отправителя
    alt_u8 mac_addr_to[6]; // MAC-адрес получателя, нули если неизвестен
    alt_u32 ip_addr_to; // IP-адрес получателя
}arp_message_t __attribute__ ((aligned (4)));


убирать выравнивание массива
Код
volatile char pkt[1562];

ничего не помогает.
написал вместо alt_u32 alt_u8[4] работаю пока так.

как избавиться от какого явления?
исходник прикрепляю. там работающий arp+ping+ чуть udp
vadimuzzz
возможно (я код пока не смотрел) дело в настройках регистров MAC (Tx_Cmd_Stat Register и Rx_Cmd_Stat Register). там есть режим, когда по 32-битной границе выравнивается IP payload. поиграйте с битами TX_SHIFT16 и RX_SHIFT16 в соотв. регистрах.
covsh
Цитата(vadimuzzz @ Apr 26 2011, 03:04) *
возможно (я код пока не смотрел) дело в настройках регистров MAC (Tx_Cmd_Stat Register и Rx_Cmd_Stat Register). там есть режим, когда по 32-битной границе выравнивается IP payload. поиграйте с битами TX_SHIFT16 и RX_SHIFT16 в соотв. регистрах.

спасибо за наводку, но это не помогло. данные биты, как я понимаю, устанавливают выравнивание всего пакета.

у меня ситуация несколько другая. сделал пару иллюстраций.
итак, сначала на массив накладывает вот такая структура
eth_frame_t *frame = (void*) packet;

далее, на поле alt_u8 data[] накладывается новая структура ARP сообщения arp_message
arp_message_t *msg = (void*)(frame->data);
что должно быть и что получается я проиллюстрировал на рисунке


видно, что появляется сдвижка при наложении 32 битного числа, со всеми остальными типами все в порядке
может кто-нибудь подкинет идею почему так происходит?



vadimuzzz
а, понял. это из-за 6-байтного MAC-адреса. попробуйте объявить структуру с атрибутом packed
covsh
Цитата(vadimuzzz @ Apr 26 2011, 16:29) *
а, понял. это из-за 6-байтного MAC-адреса. попробуйте объявить структуру с атрибутом packed

большое спасибо, все получилось
doom13
Подскажите пожалуйста - каким образом работает
Command_Config PROMIS_EN.
(Promiscuous enable. Set this bit to 1 to enable promiscuous mode. In this mode, the MAC function receives all frames
without address filtering.)
Если бит PROMIS_EN = 0, то мак не видит пакеты, которые начинаются с нуля (B0-LSB = 0), почему?

vadimuzzz
Цитата(doom13 @ Jun 20 2011, 15:09) *
Если бит PROMIS_EN = 0, то мак не видит пакеты, которые начинаются с нуля (B0-LSB = 0), почему?

потому что не должен. в нормальном режиме MAC "видит" только пакеты с его адресом и broadcast'ы. в promiscuous "видит" все пакеты.
doom13
Цитата(vadimuzzz @ Jun 20 2011, 11:37) *
потому что не должен. в нормальном режиме MAC "видит" только пакеты с его адресом и broadcast'ы. в promiscuous "видит" все пакеты.

Насколькл я понял, при PROMIS_EN = 0, видит пакеты в которых младший бит destination MAC address = 1 и не видит те, в которых 0. Потом нашёл уже описание у Альтеры:

The MAC function can accept frames with the following address types:
■ Unicast address—bit 0 of the destination address is 0.
■ Multicast address—bit 0 of the destination address is 1.
■ Broadcast address—all 48 bits of the destination address are 1.
The MAC function always accepts broadcast frames. If promiscuous mode is enabled
(PROMIS_EN bit in the command_config register = 1), the MAC function omits
address filtering and accepts all unicast frames.

Ломал голову, думал что-то с времянкой, когда пакет с нуля начинается.




Ещё есть вопросик по осцилограммам rgmii: есть две платы, на одной - Marvell 88E1111, на другой Micrel KSZ9021RL, сигналы RX_CTL отличаются, хотя при этом всё работает нормально, MAC принимает-передаёт пакеты.

vadimuzzz
на дребезг похоже, как смотрели? резистор согласующий стоит?
doom13
Цитата(vadimuzzz @ Jun 20 2011, 17:45) *
на дребезг похоже, как смотрели? резистор согласующий стоит?


резистор не стоит, но и в документации насчёт этого пока ничего не нашёл.
vadimuzzz
а насколько часто такие различия повторяются? если это не дребезг, то картинка от марвела показывает на наличие RX_ER
doom13
Цитата(vadimuzzz @ Jun 21 2011, 11:05) *
а насколько часто такие различия повторяются? если это не дребезг, то картинка от марвела показывает на наличие RX_ER

вот это-то и не понятно, RX_CTL у марвела такой всегда. Есть две платы с марвелом, одна - с Stratix 2 (marvell подключён напрямую к fpga), на второй просто marvell, через переходник подключается к tms320c6455 (надо на нём гигабит запустить), на обоих RX_CTL одинаковый, как на рисунке. Приём-передача на nios ii, работает нормально, но в процессе отладки была замечена данная "особенность" marvella, при подключении к тому же tse mac nios ii платы с phy micrel, RX_CTL нормальный и данные тоже принимаются. Так вот и вопрос - так надо, или всётаки что-то не так?

И если ошибка - каким образом тогда пакет принимается правильный?
vadimuzzz
Цитата(doom13 @ Jun 21 2011, 16:37) *
И если ошибка - каким образом тогда пакет принимается правильный?

не знаю, м.б. у марвела кодирование RX_ER настраивается? (стандарт менялся, но давно)

Reanimator++
Господа, собирал ли кто-нибудь демку с веб-сервером?
Сколько памяти занимает футпринт и сколько ОЗУ требуется для выполнения?
Реально ли затолкать веб сервер в ончип мемори для например циклона 3 EP3C10?
vadimuzzz
Цитата(Reanimator++ @ Oct 15 2011, 18:09) *
Господа, собирал ли кто-нибудь демку с веб-сервером?

я собирал, только не помню какую. что-то килобайт около 200 весила. скорее всего не влезет, надо внешнюю ставить
Reanimator++
Жалко, на внешнюю лапок нету совсем, а на бга переходить не хочется..

А где можно подробнее почитать из каких программных кусков состоит альтеровский стек и какой кусок сколько и чего требует, чтобы можно было определиться что резать...
vadimuzzz
Цитата(Reanimator++ @ Oct 15 2011, 23:07) *
А где можно подробнее почитать из каких программных кусков состоит альтеровский стек и какой кусок сколько и чего требует, чтобы можно было определиться что резать...

посмотрите в сторону LwIP, порт для ниоса был на alteraforums.com (или на alterawiki). потом еще нужен драйвер TSE. это основные компоненты

вот пример http://www.alteraforum.com/forum/showthrea...93638#post93638
avacs
Вопрос к Гуру (ну и вообще к знатокам у кого все получилось),
год назад баловался с kit CIII120+Marvel 88E1111, и с проектами которые делал dim99 и vladimuzzz, все сначала получилось, долго мучался с инициализацией Marvell, но поднял на Nios+sgDMA+TSE c использованием внутренней памяти на 128кб. в общем все работало, Ping, принимались и отправлялись UDP сообщения. После, больше пол-года занимался другими работами, вот счас опять взялся за ту же железку и столкнулся с такой проблемой:
1. Раньше при нажатии клавиши Reset, Nios перегружался и все работало прекрасно, теперь стал только после перепрошивк новой программы из Eclips перезапускатся. думал Резет вектор не правильно указан, но все осталось так же... , при этом Ethernet работал как и должен, но ближе к теме,
2. Решил добавить внешнюю ОЗУ, подключил 64mb DDR2 bot в сопс, собрал железо - Nios стартовал, вся инициализация прошла успешно. Но по Ethernet принимается только первый пакет правильно (если отпраляю Ping), а остальные пакеты почему то имеют значения не того пакета, что пришел из marvell, а пакет который CIII должен был отправить в ответ на ARP запрос...
Вот, прошу помощи и совета.
Прилагаю стуктуру из SOPC (Q9.1 sp2, Nios2 sp2 IDE), и карту памяти... ибо есть подозрения что дело в дескрипторах, но что делаю не так не пойму. Проект использовал от vladimuzz (за что ему очередное спасибо).
vadimuzzz
Цитата(avacs @ Dec 1 2011, 21:33) *
Но по Ethernet принимается только первый пакет правильно (если отпраляю Ping), а остальные пакеты почему то имеют значения не того пакета, что пришел из marvell, а пакет который CIII должен был отправить в ответ на ARP запрос...

напоминает проблемы с кэшем данных. он включен?
avacs
Я так понимаю что нужно alt_dcache_flush() , но праильно ли я делаю не уверен (вернее совсем не правильно делаю скорее всего). Вот исходник вашего eth_driver.c
CODE
#include "control.h"
#include "system.h"
#include "defines.h"
#include "sys/alt_irq.h"
#include "triple_speed_ethernet_regs.h"
#include "altera_avalon_sgdma.h"
#include "altera_avalon_sgdma_descriptor.h"
#include "altera_avalon_sgdma_regs.h"
#include "sys/alt_cache.h"
#include "sys/alt_stdio.h"
#include "eth_driver.h"
#include "network.h"
#include <errno.h>

#include "altera_avalon_tse.h"

//---------------------------------------------------------------------------------------------
//alt_sgdma_descriptor *desc = (alt_sgdma_descriptor *) DESCRIPTOR_MEMORY_BASE;
alt_sgdma_descriptor *desc = (alt_sgdma_descriptor *) 0x4000000;
alt_sgdma_descriptor *currdescriptor_ptr;
alt_sgdma_descriptor *nextdescriptor_ptr;
alt_sgdma_descriptor *desc_pointer;

alt_sgdma_dev *sgdma_tx_dev;
alt_sgdma_dev *sgdma_rx_dev;

volatile char pkt[1562] __attribute__ ((aligned (4)));
volatile char pkt_copy[1562] __attribute__ ((aligned (4)));

int sem;
alt_u32 p_counter;
//---------------------------------------------------------------------------------------------
int MAC_init()
{
alt_u32 t2=0;
alt_u32 t5 =0;
int status=0;
p_counter=0;

// /* PHY and other board peripherial initialization */
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY); //
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x00,0x3100);
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x04,0x1E1);
// IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x09,0x1C0);// nnn
// IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x10,0x68); //nnn
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x14,0xC53);
// IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x14,0xC51);//delay to RX/TX
// IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x14,0xCD1);//delay to RX/TX
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,0x00,0xB100); //peregrujaem MAC SOFT Reset

do
{
Delay(0xFFFF);
t2=IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,MDIO_SPACE0,ALTERA_TSEMAC_PHY_ADDR_STATU
S);
}
while((t2&0x04)==0);//wait for link-up
// printf("t2 %x\n",t2);


alt_u32 desc_mem_clear_count=0;
for(desc_mem_clear_count=0;desc_mem_clear_count<256;++desc_mem_clear_count)
{
IOWR(DESCRIPTOR_MEMORY_BASE,desc_mem_clear_count,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");
sgdma_rx_dev = alt_avalon_sgdma_open("/dev/sgdma_rx");
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_AVALON_SGDMA_CONTROL(SGDMA_TX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTW
ARERESET_MSK); //-
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_BASE, 0x0);//-
// printf("SGDMA TX %x, SGDMA RX %x\n",sgdma_tx_dev, sgdma_rx_dev);

/* reset the mac */

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)
{
}

/* Initialize MAC registers */

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); //1024/4;
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); //16/32/4; // start transmit when there are 48 bytes
IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4);
IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0);//16
IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_
MSK);
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));

int tse_mac00;
int tse_mac01;
tse_mac00 = IORD_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE);
tse_mac01 = IORD_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE);

/*вывожу в терминал сообщение о МАК адресе и установленном IP адресе*/
printf("MAC addr setted! %X%X:%X%X:%X:%X:%X%X:%X\n",(tse_mac00&0x000000F0),(tse_mac00&0x0000000F),((tse_mac00&0x0000F000)>>8),((tse_mac00&0x00000F00)>>8),((tse_mac00&0x00FF0000)>>16),
((tse_mac00&0xFF000000)>>24),(tse_mac01&0x00F0),(tse_mac01&0x000F),((tse_mac01&0xFF00)>>8));

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;
alt_dcache_flush(pkt, 4);
uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
alt_dcache_flush(uncached_packet_payload, 4);
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);

// alt_avalon_sgdma_construct_stream_to_mem_desc(
// currdescriptor_ptr, // descriptor I want to work with
// nextdescriptor_ptr, // 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_RX_SGDMA_DESC_OFST]);
sem=0;

return status;
}
//---------------------------------------------------------------------------------------------

int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)
{
alt_u32 t2=0;
static int p_counter;

alt_u32 *uncached_packet_payload;
t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE);
if (t2 & (ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK |
ALTERA_AVALON_SGDMA_STATUS_DESC_COMPLETED_MSK))
{
p_counter++;


IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_STATUS_CHAIN_C
OMPLETED_MSK);
t2=IORD_ALTERA_TSE_SGDMA_DESC_STATUS(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
/*check status and handle packet*/
if( (t2 &
(ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_PARITY_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_OVERFLOW_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_SYNC_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_UEOP_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MEOP_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MSOP_MSK ) ) == 0)
{
t2=IORD_16DIRECT(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].actual_bytes_transferred, 0)-2;
alt_printf("Packet counter: 0x%x len bytes: 0x%x\n",p_counter, t2);
alt_printf("data: |%x|%x|%x|%x|%x|%x|%x|%x| |%x|%x|%x|%x|%x|%x|%x|%x|\n",
pkt[0]&0xFF,pkt[1]&0xFF,pkt[2]&0xFF,pkt[3]&0xFF,pkt[4]&0xFF,pkt[5]&0xFF,pkt[6]&0xFF,pkt[7]&0xFF,
pkt[8]&0xFF,pkt[9]&0xFF,pkt[10]&0xFF,pkt[11]&0xFF,pkt[12]&0xFF,pkt[13]&0xFF,pkt[14]&0xFF,pkt[15]&0xFF);
alt_printf(" |%x|%x|%x|%x|%x|%x|%x|%x| |%x|%x|%x|%x|%x|%x|%x|%x|\n",
pkt[16]&0xFF,pkt[17]&0xFF,pkt[18]&0xFF,pkt[19]&0xFF,pkt[20]&0xFF,pkt[21]&0xFF,pkt[22]&0xFF,pkt[23]&0xFF,
pkt[24]&0xFF,pkt[25]&0xFF,pkt[26]&0xFF,pkt[27]&0xFF,pkt[28]&0xFF,pkt[29]&0xFF,pkt[30]&0xFF,pkt[31]&0xFF);
CheckPacket(pkt,t2);
}
else
{
alt_printf("RX descriptor reported error. Packet dropped\n");
}

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_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


// t2=alt_avalon_sgdma_do_sync_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
t2=alt_avalon_sgdma_do_async_transfer(
sgdma_rx_dev,
&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
}
return 0;
}


//--------------------------------Ethernet Message Send-----------------------------

int tse_mac_raw_send(char * data, unsigned data_bytes)
{
alt_u32 *uncached_packet_payload;
alt_32 timeout;
int result;
if(sem!=0) /* Tx is busy*/
{
alt_printf("Tx is busy\n");
return -22;
}
sem = 1;
alt_dcache_flush(data, data_bytes);
// clear bit-31 before passing it to SGDMA Driver
// uncached_packet_payload = (alt_u32*)alt_remap_cached ((volatile void*) data, 4);
uncached_packet_payload = (alt_u32*)alt_remap_cached ((volatile void*) data, data_bytes);
/* Write data to Tx FIFO using the DMA */
// alt_dcache_flush(uncached_packet_payload, data_bytes);
if( data_bytes > ALTERA_TSE_MIN_MTU_SIZE )
{
alt_printf("TX Starting read adrr %x - bytes %x\n",uncached_packet_payload, data_bytes);
/* make sure there is room in the FIFO. */
alt_avalon_sgdma_construct_mem_to_stream_desc(
currdescriptor_ptr, // descriptor I want to work with
nextdescriptor_ptr,// 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;


// Make sure DMA controller is not busy from a former command
// and TX is able to accept data
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
}
}
// Set up the SGDMA
// Clear the status and control bits of the SGDMA descriptor
IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_TX_BASE, 0);
IOWR_ALTERA_AVALON_SGDMA_STATUS (SGDMA_TX_BASE, 0xFF);
// Start SGDMA (blocking call)
result = alt_avalon_sgdma_do_async_transfer(
sgdma_tx_dev,
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_TX_SGDMA_DESC_OFST]);
}
else
{
result = -3;
}
// printf("transfer %x\n", result);
if(result < 0) /* SGDMA not available */
{
alt_printf("raw_send() SGDMA not available\n");
sem = 0;
return -22; /* ENP_RESOURCE and SEND_DROPPED have the same value! */
}
else /* = 0, success */
{
sem = 0;
return 0; /*success */
}
}

//---------------------------------------------------------------------------------------------
vadimuzzz
проверка простая - вырубить кэш данных в CPU. если помогло - значит дело в нем и ищем где пропустили flush sm.gif
Maverick
Цитата(Postoroniy_V @ Oct 17 2007, 03:41) *
тоесть стоит задача реализовать подержку TCP/IP в железе а не в софте?
или всё таки в железе как здесь
тут вот исходники можно взять если всё таки в железе

а Вы не могли б выложить эти исходники...
не получается скачать...
Reanimator++
http://itee.uq.edu.au/~peters/xsvboard/index.html
Последняя ссылка в таблице
COMA
Добрый день!

Есть плата на Cyclone III.
На плате установлена микросхема PHY DP83848, две микросхемы памяти SDRAM по 32МБайт, FPGA EP3C25Q240C8N
Питание микросхем 3.3V

Блок схема представлена на рис. 1.
Нажмите для просмотра прикрепленного файла

Не удается заставить работать IP модуль Triple-Speed Ethernet (далее TSE) на плате с Cyclone III.
Плата заведомо рабочая.
Проверку проводил в следующей последовательности.

1. В Quartus II 9.0sp2 (32-bit) собрал систему на NIOS и IP OpenCores 10/100 Ethernet MAC v 8.0.3 (далее OCM).
Тестовый проект - web_server_0" работает нормально, устройство пингуется, страничка открывается.

2. Далее заменил модуль OCM на модуль TSE.
Пересобрал систему, сгенерировал новый проект в "web_server_1" NIOS IDE. Сеть перестала работать.

Проект для SOPC с OCM.
Нажмите для просмотра прикрепленного файла

Проект для SOPC с TSE.
Нажмите для просмотра прикрепленного файла

Помогите разобраться с этой проблемой. Проект прикладываю.
Нажмите для просмотра прикрепленного файла
vadimuzzz
а логи какие-нибудь есть?
COMA
Лог работы с OCM:
Цитата
Copyright 1996-2008 by InterNiche Technologies. All rights reserved.
Your Ethernet MAC address is 11:12:13:14:15:16
Static IP Address is 192.168.3.250
prepped 1 interface, initializing...
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


Страница открывается, выводится сообщение:
"HTTP Error 404
Nios II Web Server Demonstration
Can't find the requested file file. Have you programmed the flash filing system into flash?"

т.к. нет файла rozipfsс страничкой. IP пингуется.

Лог работы с TSE:
Цитата
Copyright 1996-2008 by InterNiche Technologies. All rights reserved.
Static IP Address is 192.168.3.250
prepped 1 interface, initializing...
mctest init called
IP address of : 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


Страница с IP 192.168.3.250 не грузится. IP не пингуется.
vadimuzzz
да, не густо. на arping тоже не откликается. тут мне в ЛП подсказали, что вопрос об этой плате мне уже задавали. я тогда высказал предположение, что дело в клоках передатчика.
вы смотрели в сигналтапе на входе MAC ff_tx_data, ff_tx_sop, ff_tx_wren относительно ff_tx_clk? Можно еще ff_tx_clk посмотреть относительно какого-нибудь быстрого клока (есть/нет).
Триггер либо на sop, либо на фронт wren.
и еще попингуйте с платы комп. есть ли сигналы txd? если да, то что покажет снифер на компе?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.