|
|
  |
Ethernet + Cyclone + Nios |
|
|
|
Feb 8 2010, 20:55
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
Продолжаю бороться с приемом пакета. Поставил callback обработку на isr, теперь пытаюсь поймать это прерывание от приходящего пакета. пингую адрес(192.168.37.5 к примеру), пакет идет как broadcast, загорается led приема, но в isr так и не заходит, хотя ставлю там контрольную точку. может где-то (кроме callback )необходимо разрешить прерывания? В примере есть int tse_sgdma_read_init(), не пойму его смысл. В нем формируется дескриптор и сразу идет обработка входящего пакета в независимости оттого. есть он или нет. Собственно вопросы: 1. Как зайти в обработчик isr? 2. Нужен ли и зачем int tse_sgdma_read_init() ? вот последний код с полностью рабочей отправкой и хромающим приемом:
hello_world.rar ( 3.83 килобайт )
Кол-во скачиваний: 415
|
|
|
|
|
Feb 11 2010, 07:15
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
Цитата(vadimuzzz @ Feb 9 2010, 05:18)  в обработчик не заходит, потому что само прерывание не сконфигурировано. это и делается в функции tse_sgdma_read_init(), она вызывается после register_callback. в ней формируется дескриптор и регистры DMA. tse_sgdma_read_init() вызывается только в начале Добавил read_init после определения isr в register_callback, никакого эффекта. Уже попробовал определить через alt_irq_register, все равно не заходит. Уже и irq_enable_all ставил... В software handbook написано - чтобы зайти в isr поставьте контрольную точку. естественно ставил и не хочет заходить. Как можно посмотреть генерируется ли это прерывание и почему не заходит?
|
|
|
|
|
Feb 12 2010, 14:09
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
стыд-то какой. нашел своего слона: в Код alt_u32 TseMacRxRead(alt_sgdma_descriptor *rxDesc) { alt_u32 sgdma_status_rx = 0; sgdma_status_rx = IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE); alt_u32 sgdma_control_rx = 0; sgdma_control_rx = IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE); alt_u8 result = 0; while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ){ } [b]result = alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, (alt_sgdma_descriptor *) &rxDesc[0]);[/b] return 0; } сначала эта строка была в цикле while и естественно ничего не конфигурировалось....
Причина редактирования: Оформление кода
|
|
|
|
|
Mar 12 2010, 14:01
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
Ну вот, пакеты отправляю, принимаю. Единственное, осталось пару вопросов, связанных с приемом: После инициализации isr, отправляю пару пакетов, затем пингую (одним пакетом) плату и остаюсь навеки в обработчике прерывания(не выходит). То есть после обработки пакета опять и опять заходит в TseMacSgDmaRxIsr и там остается. Еще одно интересное замечание: Код if((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK )){ TseMacRxRead([b]desc[/b]); } если оставить desc, то данные заносятся в массив pkt, если оставить currdescriptor_ptr, то ничего не записывается. Причем если стоит desc, то данные записываются в pkt до прерывания. захожу в него а массив уже забит новыми данными, хотя по идее он только после TseMacRxRead их туда скопирует. В общем, есть подозрение, что нужно выделить отдельные дескрипторы для приема пакетов. Решил избавиться от приема всяких broadcast пакетов и отключил promiscious(отвечает за broadcast пакеты) считываю контрольный регистр tse_mac: cmd_cfg = 0x203 казалось бы пинг не должен проходить и все, что имеет ff в destination, но все равно заходит в isr обработчик.
|
|
|
|
|
Mar 13 2010, 10:42
|

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

|
Цитата(dim99 @ Mar 12 2010, 20:01)  если оставить desc, то данные заносятся в массив pkt, если оставить currdescriptor_ptr, то ничего не записывается. Причем если стоит desc, то данные записываются в pkt до прерывания. захожу в него а массив уже забит новыми данными, хотя по идее он только после TseMacRxRead их туда скопирует. В общем, есть подозрение, что нужно выделить отдельные дескрипторы для приема пакетов. а currdescriptor_ptr куда указывает? данные и должны там оказываться раньше, чем прерывание произойдет. дескриптора надо дескрипторов достаточно 2 - по 1 на прием и передачу Цитата Решил избавиться от приема всяких broadcast пакетов и отключил promiscious(отвечает за broadcast пакеты) считываю контрольный регистр tse_mac: cmd_cfg = 0x203 казалось бы пинг не должен проходить и все, что имеет ff в destination, но все равно заходит в isr обработчик. promiscuous не имеет отношения к broadcast. в нормальном режиме (promisc выключен) броадкасты проходят, это необходимо для работы сети (ARP, например). в неразборчивом режиме принимаются пакеты с другим dest адресом (но не броадкаст). так что отличие только в unicast пакетах. выкладывайте код
|
|
|
|
|
Mar 14 2010, 11:36
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
C broadcast вроде разобрался. Я думал, что процедура приема пакета немного другая: 1.пакет приходит на PHY 2.копируется в FIFO MAC 3. из FIFO MAC по прерыванию пользовательская isr копирует в нужную область памяти Как же получается так, что до прерывания isr данные попадают в мой массив? Еще не нравится, что в TseMacReceive не выполняется условие: Код if ((desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK) ) получается, что и дескриптор для приема не формируется нормальный, а используется тот, который был создан в процедуре отправки, либо инициализированный в TseMacSgDmaReadInit. currdescriptor_ptr указывает на дескриптор, в котором адрес для передачи данных = 0, понятно что записи не будет. Собственно только 1 вопрос, почему не выходит из цикла обработки прерывания, когда получаю пакет(тем более, что пакет 1, а обработка зависает будто их много). Проверял IORD_ALTERA_TSEMAC_RX_SECTION_EMPTY, постоянно = 0. code attached
hello_world.rar ( 4.2 килобайт )
Кол-во скачиваний: 291
|
|
|
|
|
Mar 14 2010, 17:32
|

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

|
Процедура приема пакета такая: 1. пакет поступает в PHY, оттуда кидается в MAC 2. FIFO не хранит пакет целиком, может быть даже меньше пакета размером. по сути MAC - устройство с avalon-streaming интерфейсом. вся работа ведется с SGDMA. 3. инициализируется цепочка дескрипторов. SGDMA берет дескриптор и пишет из avalon-streaming в память, которая указана в дескрипторе. 4. по наступлении заданных условий генерируется прерывание (пакет к этому времени уже лежит в памяти, см. п.3) Теперь по дескрипторам. На текущий момент (вплоть до версии 9.1) длина цепочки дескрипторов в драйвере равна 1. т.е. активный дескриптор всегда один, тот что next - просто заглушка. поэтому тупо забиваем константы (кстати, чему они у вас равны?) Код 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); этот код Код if ((desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK) ) и не может выполниться, он же макросами обложен (а длина цепочки дескрипторов в драйвере равна 1, см. выше): Код #if ALTERA_TSE_SGDMA_RX_DESC_CHAIN_SIZE > 1 вот константы для дескрипторов из моего драйвера: Код #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 вот это Код rx_section = IORD_ALTERA_TSEMAC_RX_SECTION_EMPTY(sgdma_rx_dev); - вообще бред, sgdma_rx_dev не имеет никакого отношения к tse_mac. опять же повторюсь, после инициализации mac вся работа ведется только с sgdma. с дескрипторами порядок наведите, все должно работать. ну и по вашему вопросу: в каком месте в обработчике висит?
|
|
|
|
|
Mar 23 2010, 07:50
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580

|
Появился хороший вопрос:
Отправляю пакеты с pc, естественно посылается еще куча всего (broadcast к примеру), как среди этих всех пакетов отсеять свои? Понятно, что нужно определить какую-то служебную информацию в пакете, чтоб считать его своим.
И как быть, если нужно обработать или скопировать пришедшие данные, когда уже пришел следующий пакет и возникает прерывание, ведь после него все мои данные от предыдущего пакета сотрутся?
Или нужно выключать dma, а после обработки включать и отсылать пакет на PC с сообщением об успешном приеме, чтобы синхронизироваться.
В общем, не пойму я пока этого процесса, где его можно подсмотреть?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|