vadimuzzz 0 23 марта, 2010 Опубликовано 23 марта, 2010 · Жалоба Отправляю пакеты с pc, естественно посылается еще куча всего (broadcast к примеру), как среди этих всех пакетов отсеять свои? Понятно, что нужно определить какую-то служебную информацию в пакете, чтоб считать его своим. по MAC-адресам (это основной адрес вашего устройства) TSE фильтрует сам (при выключенном promisc). если этого недостаточно - можно делать дополнительные фильтры - по IP, протоколам, портам и т.п. - естественно, программно. broadcast тут не в кассу, т.к. нужен, например, для ARP. Хотите, скажем, попинговать адрес, сначала идет broadcast ARP-запрос: кто имеет такой-то айпишник, в ответ получает MAC-адрес. И как быть, если нужно обработать или скопировать пришедшие данные, когда уже пришел следующий пакет и возникает прерывание, ведь после него все мои данные от предыдущего пакета сотрутся? Или нужно выключать dma, а после обработки включать и отсылать пакет на PC с сообщением об успешном приеме, чтобы синхронизироваться. тут все от вашей задачи зависит. если кровь из носу надо несколько пакетов принять - делаете очередь пакетов (можно посмотреть в LwIP или NicheStack). а нет - затыкаете прием на время обработки пакета и отправки квитка о готовности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 1 апреля, 2010 Опубликовано 1 апреля, 2010 · Жалоба А кто-нить реализовывал UDP/IP на основе TSE и NicheStack??? Может кто-нить поделиться рабочим примером? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 апреля, 2010 Опубликовано 2 апреля, 2010 · Жалоба наткнулся тут случайно: "Description: VHDL implementation of a UDP/IP core! Area-optimized for direct PC-FPGA communication! " http://opencores.org/project,udp_ip__core Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim99 0 2 апреля, 2010 Опубликовано 2 апреля, 2010 · Жалоба Ну вот, стоило перенести свой ethernet в другой проект, как тут же всплыли старые ошибки. После TseMacSgDmaReadInit заходит в TseMacRxRead выполняет alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, (alt_sgdma_descriptor *)rxDesc); и впадает в постоянную обработку прерывания TseMacSgDmaRxIsr. Дескрипторы в норме, отдаю ему currdescriptor_ptr, который подготовлен для записи данных. Результат выполнения async_transfer=0, ошибок нет. В прошлый раз эта проблема решилась, когда оставил все дескрипторы, как в примере vadimuzzz. Так теперь беру этот же работающий проект, переношу код и старые ошибки вылазят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 2 апреля, 2010 Опубликовано 2 апреля, 2010 · Жалоба Так теперь беру этот же работающий проект, переношу код и старые ошибки вылазят. выкладывайте последнюю версию и содержимое регистров SGDMA до и после входа в обработчик прерывания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim99 0 2 апреля, 2010 Опубликовано 2 апреля, 2010 · Жалоба Все разрешилось, прошу прощения. В SOPC builder проморгал связь: descriptor_memory->sgdma_rx, отсюда и проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 3 апреля, 2010 Опубликовано 3 апреля, 2010 · Жалоба пытаюсь сделать свой проект на основе hello_world от dim99 возникло несколько вопросов 1. какой объем памяти вы отводите под descriptor_memory? 2. можно ли выделить пространство в основной ОЗУ процессора под descriptor_memory или это обязательно должна быть отдельная память? 3. Как удалось наладить приемпакетов? (поделитесь, плз, последней версией hello_world.с) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim99 0 3 апреля, 2010 Опубликовано 3 апреля, 2010 · Жалоба 1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки) 2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная) 3. hello_world.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 5 апреля, 2010 Опубликовано 5 апреля, 2010 (изменено) · Жалоба 1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки) 2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная) 3. hello_world.rar Спасибо огромное! передача вообще чисто работает, а вот с приемом есть трудность - пропадают первые 2 байта пакета... я, конечно, вышел из положения выставлением IP Align в мегафункции, но интересно где может быть косяк. (rx_pkt начинается с третьего байта). З.Ы.: С ПЛИС я не новичок, а вот с ниос и С еще начинающий, так что извиняите за глупые вопросы из области программирования =) Изменено 5 апреля, 2010 пользователем wpost Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim99 0 5 апреля, 2010 Опубликовано 5 апреля, 2010 · Жалоба Да, отлаженный soft это всегда здорово, скажите отдельное спасибо vadimuzzz. пропадают первые 2 байта пакета - это как раз и есть align ip. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба пропадают первые 2 байта пакета - это как раз и есть align ip. я так не думаю... при отправке четко: если нет IP align то отправляется с первого байта, если есть - то с третьего... а на приеме мы тоже видим смещение на 2 байта (потеря без align и начало с первого байта с align)... ip Align просто компенсирует наш косяк... когда я работал с TSE через конечные автоматы, то ip align работал четко симметрично на прием и передачу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба похоже дело было в кривой цепочке include.... подцепил по другому все модули и проблема самоликвидировалась.... всё стало как нужно и на приеме... если Align то принимает 2 байта нулей, потом пакет, если не Align то сразу идет пакет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim99 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба wpost Вы кстати как инициализировали PHY? Хочется узнать, только у меня отпадает link, когда через MDIO выставляю контрольные биты для PHY(поэтому и приходится на PC режим задавать. чтобы срабатывал auto-neg). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба wpost Вы кстати как инициализировали PHY? Хочется узнать, только у меня отпадает link, когда через MDIO выставляю контрольные биты для PHY(поэтому и приходится на PC режим задавать. чтобы срабатывал auto-neg). я не спользую MDIO вообще.. PHY у меня DP83848I auto-neg у меня жестко включен на уровне схемотехники (pin AN_EN pull-up) вся инициализация сводится к достаточно длинному аппаратному ресету, выдаваемому альтерой на соответствующую ногу PHY. после чего сразу устанавливается линк на 100. далее я записываю MAC адрес в соответстующие адреса мегафункции (TSE) и записываю в управляющий регистр TSE в 0x00000023. где 3 означает включить прием и передачу, а 2 - говорит TSE автоматически убирать PAD (дополнение нулями маленьких пакетов до минимальной длины). вот собственно и все настройки. опыт применения DP83848I достаточно большой (3 года), но с другим процессором LPC2468. C MDIO за это время ни разу не заморачивались. auto-neg вроде как работает... хотя проверить трудно т.к. у меня все хабы и PC умеют переворачивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wpost 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба И всетаки пример "Hello_world" принимает пакеты неправильно... если отправлять одинокие редкие пакеты всё кажется лучезарно, но... если отправить фрагментированный пакет (много не надо достаточно двух кусков), то в массиве rx_pkt оказывается только последний пакет, а первый пропадает. я так понимаю что проблема в том, что они диут подряд и новый пакет перекрывает старый при вычитывании из SGDMA... изучение вопроса привело к обнаружению "Read until EOP = 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); ... постановка "Read until EOP = 1" приводит к зацикливанию в прерывании на первом же заходе в него... т.е. на arp пакете... как решить проблему пока не знаю, если у кого есть мысли help!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться