|
|
  |
Ethernet + Cyclone + Nios |
|
|
|
Mar 23 2010, 08:05
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(dim99 @ Mar 23 2010, 13:50)  Отправляю пакеты с pc, естественно посылается еще куча всего (broadcast к примеру), как среди этих всех пакетов отсеять свои? Понятно, что нужно определить какую-то служебную информацию в пакете, чтоб считать его своим. по MAC-адресам (это основной адрес вашего устройства) TSE фильтрует сам (при выключенном promisc). если этого недостаточно - можно делать дополнительные фильтры - по IP, протоколам, портам и т.п. - естественно, программно. broadcast тут не в кассу, т.к. нужен, например, для ARP. Хотите, скажем, попинговать адрес, сначала идет broadcast ARP-запрос: кто имеет такой-то айпишник, в ответ получает MAC-адрес. Цитата И как быть, если нужно обработать или скопировать пришедшие данные, когда уже пришел следующий пакет и возникает прерывание, ведь после него все мои данные от предыдущего пакета сотрутся? Или нужно выключать dma, а после обработки включать и отсылать пакет на PC с сообщением об успешном приеме, чтобы синхронизироваться. тут все от вашей задачи зависит. если кровь из носу надо несколько пакетов принять - делаете очередь пакетов (можно посмотреть в LwIP или NicheStack). а нет - затыкаете прием на время обработки пакета и отправки квитка о готовности.
|
|
|
|
|
Apr 2 2010, 07:11
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
Ну вот, стоило перенести свой ethernet в другой проект, как тут же всплыли старые ошибки.
После TseMacSgDmaReadInit заходит в TseMacRxRead выполняет alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, (alt_sgdma_descriptor *)rxDesc);
и впадает в постоянную обработку прерывания TseMacSgDmaRxIsr.
Дескрипторы в норме, отдаю ему currdescriptor_ptr, который подготовлен для записи данных. Результат выполнения async_transfer=0, ошибок нет. В прошлый раз эта проблема решилась, когда оставил все дескрипторы, как в примере vadimuzzz.
Так теперь беру этот же работающий проект, переношу код и старые ошибки вылазят.
|
|
|
|
|
Apr 3 2010, 06:43
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки) 2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная) 3.
hello_world.rar ( 5.15 килобайт )
Кол-во скачиваний: 318
|
|
|
|
|
Apr 5 2010, 14:19
|

Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354

|
Цитата(dim99 @ Apr 3 2010, 10:43)  1. descriptor_memory: 4k, хотя можно меньше - 4 дескриптора x размер дескриптора. (2 - прием\отправка, 2 заглушки) 2. лучше отдельной памятью, но наверное можно и в основной. (в примере была отдельная) 3.
hello_world.rar ( 5.15 килобайт )
Кол-во скачиваний: 318Спасибо огромное! передача вообще чисто работает, а вот с приемом есть трудность - пропадают первые 2 байта пакета... я, конечно, вышел из положения выставлением IP Align в мегафункции, но интересно где может быть косяк. (rx_pkt начинается с третьего байта). З.Ы.: С ПЛИС я не новичок, а вот с ниос и С еще начинающий, так что извиняите за глупые вопросы из области программирования =)
Сообщение отредактировал wpost - Apr 5 2010, 14:19
|
|
|
|
|
Apr 6 2010, 04:06
|

Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354

|
Цитата(dim99 @ Apr 5 2010, 23:24)  пропадают первые 2 байта пакета - это как раз и есть align ip. я так не думаю... при отправке четко: если нет IP align то отправляется с первого байта, если есть - то с третьего... а на приеме мы тоже видим смещение на 2 байта (потеря без align и начало с первого байта с align)... ip Align просто компенсирует наш косяк... когда я работал с TSE через конечные автоматы, то ip align работал четко симметрично на прием и передачу...
|
|
|
|
|
Apr 6 2010, 18:16
|

Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354

|
Цитата(dim99 @ Apr 6 2010, 19:21)  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 умеют переворачивать.
|
|
|
|
|
Apr 12 2010, 14:35
|

Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-04-10
Из: СПб
Пользователь №: 56 354

|
И всетаки пример "Hello_world" принимает пакеты неправильно... если отправлять одинокие редкие пакеты всё кажется лучезарно, но... если отправить фрагментированный пакет (много не надо достаточно двух кусков), то в массиве rx_pkt оказывается только последний пакет, а первый пропадает. я так понимаю что проблема в том, что они диут подряд и новый пакет перекрывает старый при вычитывании из SGDMA... изучение вопроса привело к обнаружению "Read until EOP = 0" см ниже Цитата(vadimuzzz @ Mar 14 2010, 21:47)  ... Код 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!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|