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

Отправляю пакеты с pc, естественно посылается еще куча всего (broadcast к примеру), как среди этих всех пакетов отсеять свои?

Понятно, что нужно определить какую-то служебную информацию в пакете, чтоб считать его своим.

по MAC-адресам (это основной адрес вашего устройства) TSE фильтрует сам (при выключенном promisc). если этого недостаточно - можно делать дополнительные фильтры - по IP, протоколам, портам и т.п. - естественно, программно. broadcast тут не в кассу, т.к. нужен, например, для ARP. Хотите, скажем, попинговать адрес, сначала идет broadcast ARP-запрос: кто имеет такой-то айпишник, в ответ получает MAC-адрес.

И как быть, если нужно обработать или скопировать пришедшие данные, когда уже пришел следующий пакет и возникает прерывание, ведь после него все мои данные от предыдущего пакета сотрутся?

Или нужно выключать dma, а после обработки включать и отсылать пакет на PC с сообщением об успешном приеме, чтобы синхронизироваться.

тут все от вашей задачи зависит. если кровь из носу надо несколько пакетов принять - делаете очередь пакетов (можно посмотреть в LwIP или NicheStack). а нет - затыкаете прием на время обработки пакета и отправки квитка о готовности.

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


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

А кто-нить реализовывал UDP/IP на основе TSE и NicheStack???

Может кто-нить поделиться рабочим примером?

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


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

наткнулся тут случайно: "Description: VHDL implementation of a UDP/IP core! Area-optimized for direct PC-FPGA communication! "

 

http://opencores.org/project,udp_ip__core

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


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

Ну вот, стоило перенести свой ethernet в другой проект, как тут же всплыли старые ошибки.

 

После TseMacSgDmaReadInit заходит в TseMacRxRead выполняет

alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, (alt_sgdma_descriptor *)rxDesc);

 

и впадает в постоянную обработку прерывания TseMacSgDmaRxIsr.

 

Дескрипторы в норме, отдаю ему currdescriptor_ptr, который подготовлен для записи данных.

Результат выполнения async_transfer=0, ошибок нет.

В прошлый раз эта проблема решилась, когда оставил все дескрипторы, как в примере vadimuzzz.

 

Так теперь беру этот же работающий проект, переношу код и старые ошибки вылазят.

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


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

Так теперь беру этот же работающий проект, переношу код и старые ошибки вылазят.

выкладывайте последнюю версию и содержимое регистров SGDMA до и после входа в обработчик прерывания

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


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

Все разрешилось, прошу прощения.

 

В SOPC builder проморгал связь: descriptor_memory->sgdma_rx, отсюда и проблемы.

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


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

пытаюсь сделать свой проект на основе hello_world от dim99 возникло несколько вопросов

 

1. какой объем памяти вы отводите под descriptor_memory?

2. можно ли выделить пространство в основной ОЗУ процессора под descriptor_memory или это обязательно должна быть отдельная память?

3. Как удалось наладить приемпакетов? (поделитесь, плз, последней версией hello_world.с)

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


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

1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки)

2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная)

3. hello_world.rar

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


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

1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки)

2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная)

3. hello_world.rar

 

Спасибо огромное!

передача вообще чисто работает, а вот с приемом есть трудность - пропадают первые 2 байта пакета... я, конечно, вышел из положения выставлением IP Align в мегафункции, но интересно где может быть косяк. (rx_pkt начинается с третьего байта).

 

 

З.Ы.: С ПЛИС я не новичок, а вот с ниос и С еще начинающий, так что извиняите за глупые вопросы из области программирования =)

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

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


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

Да, отлаженный soft это всегда здорово, скажите отдельное спасибо vadimuzzz.

 

пропадают первые 2 байта пакета - это как раз и есть align ip.

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


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

пропадают первые 2 байта пакета - это как раз и есть align ip.

 

я так не думаю... при отправке четко: если нет IP align то отправляется с первого байта, если есть - то с третьего...

а на приеме мы тоже видим смещение на 2 байта (потеря без align и начало с первого байта с align)... ip Align просто компенсирует наш косяк...

 

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

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


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

похоже дело было в кривой цепочке include.... подцепил по другому все модули и проблема самоликвидировалась.... всё стало как нужно и на приеме... если Align то принимает 2 байта нулей, потом пакет, если не Align то сразу идет пакет...

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


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

wpost

Вы кстати как инициализировали PHY?

Хочется узнать, только у меня отпадает link, когда через MDIO выставляю контрольные биты для PHY(поэтому и приходится на PC режим задавать. чтобы срабатывал auto-neg).

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


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

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 умеют переворачивать.

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


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

И всетаки пример "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!!!

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


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

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

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

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

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

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

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

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

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

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