реклама на сайте
подробности

 
 
26 страниц V  « < 8 9 10 11 12 > »   
Reply to this topicStart new topic
> Ethernet + Cyclone + Nios
dim99
сообщение Jan 28 2010, 08:52
Сообщение #136


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580



Спасибо vetal.
После доавбления alt_dcache_flush проблема разрешилась.
Go to the top of the page
 
+Quote Post
dim99
сообщение Jan 28 2010, 15:49
Сообщение #137


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580



Теперь пытаюсь написать прием пакета.

Хочу выяснить до конца алгоритм приема пакета.
1. задаем обработчик прерывания alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr, ... )

2. пришел пакет - обрабатываем в tse_sgdmaRx_isr
2.1 создаем дескриптор для входящего пакета - tse_mac_rcv
2.2 принимаем пакет - tse_mac_aRxRead

Хотелось бы узнать, алгоритм соответствует действительности?

И является ли alt_avalon_sgdma_register_callback тем самым обработчик прерывания или что это такое?
(в примерах на sgdma никакой обработки не было в этой процедуре).
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 29 2010, 01:39
Сообщение #138


Гуру
******

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



почти так. собственно обработчик прерывания прячется в недрах HAL,
alt_avalon_sgdma_register_callback регистрирует пользовательский обработчик, он запускается позже.
2.2 tse_mac_aRxRead выполняет асинхронное копирование из FIFO в память, куда указывает дескриптор. т.е. выполнение программы в этом месте блокируется до окончания копирования.
Go to the top of the page
 
+Quote Post
dim99
сообщение Feb 8 2010, 20:55
Сообщение #139


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 9 2010, 02:18
Сообщение #140


Гуру
******

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



в обработчик не заходит, потому что само прерывание не сконфигурировано. это и делается в функции tse_sgdma_read_init(), она вызывается после register_callback. в ней формируется дескриптор и регистры DMA. tse_sgdma_read_init() вызывается только в начале, т.к. код, который в ней содержится есть и в обработчике прерывания. в принципе, код tse_sgdma_read_init() можно перекинуть в MAC_Init.
Go to the top of the page
 
+Quote Post
dim99
сообщение Feb 11 2010, 07:15
Сообщение #141


Частый гость
**

Группа: Свой
Сообщений: 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 поставьте контрольную точку. естественно ставил и не хочет заходить.

Как можно посмотреть генерируется ли это прерывание и почему не заходит?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 11 2010, 10:29
Сообщение #142


Гуру
******

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



давайте содержимое регистров DMA после read_init
Go to the top of the page
 
+Quote Post
dim99
сообщение Feb 12 2010, 14:09
Сообщение #143


Частый гость
**

Группа: Свой
Сообщений: 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 и естественно ничего не конфигурировалось....
Причина редактирования: Оформление кода
Go to the top of the page
 
+Quote Post
dim99
сообщение Mar 12 2010, 14:01
Сообщение #144


Частый гость
**

Группа: Свой
Сообщений: 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 обработчик.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 13 2010, 10:42
Сообщение #145


Гуру
******

Группа: Свой
Сообщений: 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 пакетах.

выкладывайте код
Go to the top of the page
 
+Quote Post
dim99
сообщение Mar 14 2010, 11:36
Сообщение #146


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 14 2010, 17:32
Сообщение #147


Гуру
******

Группа: Свой
Сообщений: 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. с дескрипторами порядок наведите, все должно работать. ну и по вашему вопросу: в каком месте в обработчике висит?
Go to the top of the page
 
+Quote Post
dim99
сообщение Mar 15 2010, 16:32
Сообщение #148


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580



Спасибо, разобрался.
Теперь осталось сделать программу управляющую из-под pc.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 15 2010, 23:56
Сообщение #149


Гуру
******

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



Цитата(dim99 @ Mar 15 2010, 22:32) *
Теперь осталось сделать программу управляющую из-под pc.

можно на Qt писать: http://qt.nokia.com/products. там уйма готовых функций для работы с TCP и UDP. и примеров в хелпе вагон.
Go to the top of the page
 
+Quote Post
dim99
сообщение Mar 23 2010, 07:50
Сообщение #150


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 8-02-09
Из: Мытищи
Пользователь №: 44 580



Появился хороший вопрос:

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

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

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

В общем, не пойму я пока этого процесса, где его можно подсмотреть?
Go to the top of the page
 
+Quote Post

26 страниц V  « < 8 9 10 11 12 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016