Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ethernet + Cyclone + Nios
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
Acvarif
Цитата(vadimuzzz @ Apr 5 2013, 11:52) *
если используете MII, то надо подать на tx_clk 25MHz, gtx_clk в данном режиме не используется
На tx_clk TSE?

Тут я кажется запутался. Схема соединения Циклона и PHY говорит о том, что на циклон, а значит на tse толжна поступать частота (125 мГц ??? ) от ноги tx_clk PHY. Я так понял, что запитать передатчик PHY нужно от Циклона частотой 125 мГц. Или 25 мГц?
Нажмите для просмотра прикрепленного файла
Или все не так?
Обратил внимание, что если на вход gtx_clk PHY ничего не подать, то передатчик как-будто умолкает - светодиод ENET0_LED_TX передатчика не мигает.
vadimuzzz
tx_clk в режиме MII будет либо 25 либо 2.5 MHz. если там лог. 0, значит PHY определил гигабитный линк. про gtx_clk сказано: This clock can be stopped when the device is in 10/100BASE_T modes (опора для PLL видимо с ноги XTAL берется). вы по регистрам смотрели, какой линк?
Acvarif
Цитата(vadimuzzz @ Apr 5 2013, 14:36) *
tx_clk в режиме MII будет либо 25 либо 2.5 MHz. если там лог. 0, значит PHY определил гигабитный линк. про gtx_clk сказано: This clock can be stopped when the device is in 10/100BASE_T modes (опора для PLL видимо с ноги XTAL берется). вы по регистрам смотрели, какой линк?

Понятно. tx_clk которое идет из PHY на TSE Циклон должно быть 25мГц. Но как понять can be stopped? Оставить этот вход PHY свободным или посадить на 0?
По регистрам не смотрел. По светодиоду понятно, что линк на 1000 (горит ENET0_LINK_1000). Хотя должен быть на 100 (перемычка jp1 поставлена на MII MODE).
В функции инициализации МАС инициализация PHY - только проверка установления линка.
.....
Код
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE,PHY);
    t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,1);
    while((IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x01)&0x04)==0)
    {
        Delay(0xFFFF);
    }
    t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,1);

//PHY_LEDS=ACT+LINK----------------------------------------------------------------------
    t2=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x1e);
    t2|=0x4000;
    IOWR_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x1e,t2);
    for(t2=0;t2<256;++t2)
    {
        IOWR(ONCHIP_MEMORY2_0_BASE,t2,0);
    }
....

Для ksz872 этого вполне достаточно
Нужно-ли еще что-то для инициализации 88е1111 в режиме MII?
Посадил вход gtx_clk на 0 светодиод передатчика перестал мигать. Линк все также остался на 1000.
vadimuzzz
в Control register бит 6 выставить в "0", бит 13 - в "1", это принудительно включит 100мбит. скорее всего после этого надо еще sw_reset сделать. но это грязный хак, лучше в auto-neg 100mbit прописать. личку гляньте.
Acvarif
Цитата(vadimuzzz @ Apr 5 2013, 17:01) *
в Control register бит 6 выставить в "0", бит 13 - в "1", это принудительно включит 100мбит. скорее всего после этого надо еще sw_reset сделать. но это грязный хак

Спасибо.
Прежде чем приступить пытаюсь глубже уяснить макросы чтения и записи данных в регистры phy.
Например чтение регистра PHY
Код
IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1);
забито как
Код
#define IORD_ALTERA_TSEMAC_MDIO(base, mdio, reg_num) \
  IORD_16DIRECT(base, 0x200 + (mdio * 0x80) + (reg_num * sizeof(alt_u32)) )
Все понятно, кроме... Что такое mdio? Физический адрес PHY, который можно определить через ID PHY?

Цитата
лучше в auto-neg 100mbit прописать
Получается, что нужно в 1 выставить 8_й бит врегистре 4. Только их там 2. Не врубился что такое Fiber и Copper.
vadimuzzz
Цитата(Acvarif @ Apr 8 2013, 12:29) *
Все понятно, кроме... Что такое mdio? Физический адрес PHY, который можно определить через ID PHY?

TSE может быть присоединен к нескольким PHY (до 32) (включая PCS в трансиверах кристаллов серий GX), поэтому есть 2 набора регистров. Наборы соответствуют адресам PHY в регистрах mdio_addr0, mdio_addr1
Acvarif
Цитата(vadimuzzz @ Apr 8 2013, 09:05) *
TSE может быть присоединен к нескольким PHY (до 32) (включая PCS в трансиверах кристаллов серий GX), поэтому есть 2 набора регистров. Наборы соответствуют адресам PHY в регистрах mdio_addr0, mdio_addr1

Тоесть если к TSE присоединен только один PHY то значение mdio в макросе типа IORD_ALTERA_TSEMAC_MDIO(base, mdio, reg_num) будет 0?
Виноват, но не врубился, зчем тогда нужен физический адрес PHY который определяется через PHY Identifier 1?
Например чтение состояние линка (ksz8721)
Код
    while((IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x01)&0x04)==0)
    {
        Delay(0xFFFF);
    }

будет нормальное если PHY будет равно 0х1 или 0х1f или просто 0. Если PHY выставить 0х2 цикл виснет.
Перед этим нужно записать MDIO адрес IOWR_ALTERA_TSEMAC_MDIO_ADDR0(base, data)
Не врубаюсь куда он (MDIO адрес ) записывается? В какое место PHY? Или это пишется в нужный регистр tse для того, чтобы потом правильно общаться с регистрами phy?
В качестве подготовки общения с регистрами PHY 88e1111 сделал такую процедуру на ksz8721 - проверка чтения из регистров управления и статуса и записи в регистр управл.
Код
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE,PHY); // PHY равно 0х1
    ru=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,0);
    alt_printf("Reg_Contr_R = %x \n", ru);
    IOWR_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0, 0, ru | 0x80);
    ru=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,0);
    alt_printf("Reg_Contr_W = %x \n", ru);

    rs=IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0,1);
    alt_printf("Reg_Stat = %x \n", rs);
На выходе имею
Reg_Contr_R = 3100
Reg_Contr_W = 3180
Reg_Stat = 786d
Тоесть чтение и запись в регистры ksz8721работает как надо
При попытке повторить то же на DE2-115 (88у1111) выдаются все ffff
Тоесть регистры не читаются. PHY выставил как 0х10 (так он и определяется). Тоесть выполнил команду IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE, 0х10);
Не знаю, что и думать...
Acvarif
Спасибо.
Все получилось. В смысле доступ к регистрам PHY есть.
Код
    for (t=0;t<33;t++) {
        IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE, t);
        alt_printf("Probing PHY at address %x ...\n", t);
        r = IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1);
        if (r == 0x0141)/*88e1111*/{
            alt_printf("PHY address:%x\n", t);
            alt_printf("PHY_ID1:%x\n", r);
            alt_printf("PHY_ID2:%x\n", IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID2));
            alt_printf("PHY_CONTROL:%x\n", IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, 0));
            alt_printf("PHY_STATUS:%x\n", IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, 1));
            break;
        }
    }
PHY определилось как 0х10. Данные регистров статуса и управления читаются нормально.
Теперь попробую включить скорость 100 через регистр управления и последующий программный сброс...
vadimuzzz
Цитата(Acvarif @ Apr 8 2013, 14:00) *
Тоесть если к TSE присоединен только один PHY то значение mdio в макросе типа IORD_ALTERA_TSEMAC_MDIO(base, mdio, reg_num) будет 0?

да, в смысле что второй набор регистров не нужен. на самом деле он и так не особо нужен, просто можно немного ускорить доступ.
Цитата
Виноват, но не врубился, зчем тогда нужен физический адрес PHY который определяется через PHY Identifier 1?
Например чтение состояние линка (ksz8721)
Код
    while((IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE,PHY,0x01)&0x04)==0)
    {
        Delay(0xFFFF);
    }

здесь явно косяк, наверное какая-то старая версия. я с багами пишу, да sm.gif д.б. 0 или 1
Цитата
Перед этим нужно записать MDIO адрес IOWR_ALTERA_TSEMAC_MDIO_ADDR0(base, data)

да, если используется нулевой банк регистров
Цитата
Не врубаюсь куда он (MDIO адрес ) записывается? В какое место PHY? Или это пишется в нужный регистр tse для того, чтобы потом правильно общаться с регистрами phy?

да, он лежит в регистре и вставляется во время MDIO-транзакции
Acvarif
Спасибо. По MDIO все прояснилось.
Пытаюсь заставить 88e1111 запуститься на скорости 100
Последовательно делаю
Код
t = IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, 0); // чтение регистра упр. в t
IOWR_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0, 0, t | 0x2000); // установка бит 13 - 1, бит 6 - 0 (скорость 100)
t = IORD_ALTERA_TSEMAC_MDIO(TSE_0_BASE, 0, 0); // чтение регистра упр. в t
IOWR_ALTERA_TSEMAC_MDIO(TSE_0_BASE,0, 0, t | 0xb100); // программный сброс
Линк устанавливается, но гад на 1000
vadimuzzz
Проверьте 12 бит, он должен быть сброшен, чтобы отключить auto-neg
Acvarif
Цитата(vadimuzzz @ Apr 9 2013, 09:54) *
Проверьте 12 бит, он должен быть сброшен, чтобы отключить auto-neg

Да. Спасибо. Оно. Скорость включилась на 100. Светодиод приемника на входящие пакеты реагирует, но реально приема нет - с этим буду разбираться потом. Покак задача запустить передатчик. Он почему-то виснет на функции tse_mac_raw_send((char*)ethmass_ptr, 1168); Да и с тактированием пока не понятно.
Поскольку в режиме MII GTX_CLK не нужно (This clock can be stopped when the device is in 10/100BASE_T modes ) - то опорные клоки для TX и RX очевидно 88е1111 формирует у себя и подает на MAC(FPGA). Проверю это утверждение путем вывода этих клоков на свободные ноги FPGA...
Acvarif
Передатчик заработал. Пакеты передает правильно.
Партачит приемник. Принимает один(два) раза и замолкает. Пакеты принимает правильно (все байты на месте).
Похоже, что у меня .sdc не совсем подходит от ksz8721. В нем сделано так
Код
#создаются все выходные клоки PLL
derive_pll_clocks -create_base_clocks

create_clock -period 40 -name txclk [get_ports {enet0_tx_clk}]
create_clock -period 40 -name txclk_virt
set_clock_groups -exclusive -group {txclk txclk_virt}
set_output_delay -clock { txclk_virt } -rise -max 11 [get_ports {enet0_tx_d[0] enet0_tx_d[1] enet0_tx_d[2] enet0_tx_d[3] enet0_tx_en}]

create_clock -period 40 -name rxclk [get_ports {enet0_rx_clk}]
set_input_delay -clock { rxclk } 1 [get_ports {enet0_rx_d[0] enet0_rx_d[1] enet0_rx_d[2] enet0_rx_d[3] enet0_rx_dv enet0_rx_err}]
vadimuzzz
попробуйте с такими констрейнами (названия портов подправьте):
Код
#RX path
create_clock -name rx_virtualclk -period 40
create_clock -period 40 -name rxclk [get_ports {eth_rxclk}] -waveform {20ns 40ns}
set_clock_groups -exclusive -group {rxclk rx_virtualclk}
set phy_tco_max 10
set phy_tco_min -10
set_input_delay -clock rx_virtualclk -max $phy_tco_max [get_ports {eth_rxd* eth_rxerr}]
set_input_delay -clock rx_virtualclk -min $phy_tco_min [get_ports {eth_rxd* eth_rxerr}]
#TX path
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $tsu [get_ports {eth_txd* eth_txen}]
set_output_delay -clock { txclk_virt } -rise -min -$th [get_ports {eth_txd* eth_txen}]
Acvarif
Цитата(vadimuzzz @ Apr 10 2013, 04:39) *
попробуйте с такими констрейнами (названия портов подправьте):
Код
#RX path
create_clock -name rx_virtualclk -period 40
create_clock -period 40 -name rxclk [get_ports {eth_rxclk}] -waveform {20ns 40ns}
set_clock_groups -exclusive -group {rxclk rx_virtualclk}
set phy_tco_max 10
set phy_tco_min -10
set_input_delay -clock rx_virtualclk -max $phy_tco_max [get_ports {eth_rxd* eth_rxerr}]
set_input_delay -clock rx_virtualclk -min $phy_tco_min [get_ports {eth_rxd* eth_rxerr}]
#TX path
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $tsu [get_ports {eth_txd* eth_txen}]
set_output_delay -clock { txclk_virt } -rise -min -$th [get_ports {eth_txd* eth_txen}]

Попробовал только для RX, пока тоже самое - один два приема.
Код
create_clock -name rx_virtualclk -period 40
create_clock -period 40 -name rxclk [get_ports {enet0_rx_clk}] -waveform {20ns 40ns}
set_clock_groups -exclusive -group {rxclk rx_virtualclk}
set phy_tco_max 10
set phy_tco_min -10
set_input_delay -clock rx_virtualclk -max $phy_tco_max [get_ports {enet0_rx_d* enet0_rx_err}]
set_input_delay -clock rx_virtualclk -min $phy_tco_min [get_ports {enet0_rx_d* enet0_rx_err}]

Для tx
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$th [get_ports {enet0_tx_d* enet0_tx_en}]

Выскакивает ошибка
Код
Error: can't read "tsu": no such variable
    while executing
"set_output_delay -clock { txclk_virt } -rise -max $tsu [get_ports {enet0_tx_d* enet0_tx_en}]"

Попробую еще изменить объем FIFO TSE (увеличить). На DE0Nano хватает 128 байт для приемника. Пакеты на прием имеют 96 байт.
vadimuzzz
поправил для передатчика
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma
Acvarif
Цитата(vadimuzzz @ Apr 10 2013, 17:29) *
поправил для передатчика
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma

Спасибо. Я виноват. Мог-бы и сам заметить опечатку.
Сигналтапом нет возможности.
Пробую другие варианты системы...
Если не сложно посоветуйте пожалуйста где можно почитать как строится скрипт констрейнов .sdc. Совсем смутно в этом ориентируюсь.
Acvarif
Железо перепроовал по всякому (разные процессоры и т.п) Всеравно 88e1111 виснет на приемнике. В то же время на DE0Nano + ksz8721 и приемник и передатчик работает на любом железе и при небольших вариациях констрейнов без проблем.
Нашел пару документов
1. http://www.altera.com/literature/ug/ug_tq_tutorial.pdf
2. http://embedders.org/sites/default/files/T...for_dummies.pdf
Попробую проанализировать стандартный пример web сервера. Пример работает нормально. Но там столько наворочено...
doom13
Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

1.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

np_tse_mac *pmac= (np_tse_mac *) TSE_MAC_BASE;

void TseMacInit()
{
...
...
pmac->COMMAND_CONFIG = ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK;
...
...
}


2.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void TseMacInit()
{
...
...
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);
...
...
}
vadimuzzz
Цитата(doom13 @ May 28 2013, 20:37) *
Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш,
например установкой breakpoint
doom13
Цитата(vadimuzzz @ May 30 2013, 16:38) *
во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш,
например установкой breakpoint


т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD?
Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр?
targasonic
Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:

Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...

Элементная база: Cyclone III, Marvell 88E1111, SDRAM
В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.
Скорость передачи: 48 МБ/с = 380 Мбит/с

Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?

Подскажите в каком направление двигаться, заранее спасибо.
doom13
Цитата(targasonic @ Jun 7 2013, 14:23) *
Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:

Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать...

Элементная база: Cyclone III, Marvell 88E1111, SDRAM
В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.
Скорость передачи: 48 МБ/с = 380 Мбит/с

Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя?

Подскажите в каком направление двигаться, заранее спасибо.


Начать с передачи-приёма данных с помощью ядра TSE, выше выкладывали рабочий драйвер, а к нему уже привинтить реализацию UDP.
На вход мегафункции TSE подаётся готовый пакет со всеми заголовками, IP-crc и UDP-crc. TSE считает только контрольную сумму всего пакета (FRAME CHECK SEQUENCE), может заменять мак-адрес передатчика и при приёме может осуществлять фильтрацию мак-адресов.
vadimuzzz
Цитата(doom13 @ Jun 4 2013, 13:41) *
т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD?

можно, используйте функцию alt_remap_uncached. иногда можно кэш данных вообще выбросить без ущерба для производительности, зависит от типа памяти.
Цитата
Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр?

если используете указатель, значит работаете с памятью. вот компилятор и считает себя в праве оптимизировать доступ. если это не совсем то, что вы от него желаете, надо бить его иногда по рукам. в HAL для этого есть несколько функций:
Цитата
alt_dcache_flush()
alt_dcache_flush_all()
alt_icache_flush()
alt_icache_flush_all()
alt_remap_cached()
alt_remap_uncached()
alt_uncached_free()
alt_uncached_malloc()


Цитата(targasonic @ Jun 7 2013, 18:23) *
Элементная база: Cyclone III, Marvell 88E1111, SDRAM
В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить.
Скорость передачи: 48 МБ/с = 380 Мбит/с

я в этой теме выкладывал пример проекта. после небольшой доработки напильником, из него можно выжать примерно вдвое больше
TASK
Помогите, пожалуйста, разобраться с приемом TSE.
За основу взят проект уважаемого VadimZZZ.
Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

Передача работает.
Приема нет
При PING ллаты (broadcast) не попадаю в обработчик прерывания.
Код выкладываю.
doom13
Цитата(TASK @ Jun 10 2013, 15:59) *
Помогите, пожалуйста, разобраться с приемом TSE.
За основу взят проект уважаемого VadimZZZ.
Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

Передача работает.
Приема нет
При PING ллаты (broadcast) не попадаю в обработчик прерывания.
Код выкладываю.


Вообще не заходит в прерывание или заходит один раз при старте? Если заходит один раз - где-то ошибка с sgdma, разрешено ли прерывание при возникновении ошибки в макросе ALTERA_TSE_SGDMA_INTR_MASK?

Я бы построил обработчик прерывания несколько иначе, см. ug_embedded_ip.pdf подраздел Building and Updating Descriptor List.
Код
alt_sgdma_descriptor * pCurrDescRx = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST];
alt_sgdma_descriptor * pNextDescRx = &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST];
char *rx_buff;

int SgDMARx_Isr(void* context, alt_u32 id)
{
    alt_u32 data;
    alt_u32 *uncached_packet;
    alt_sgdma_descriptor *pDescRx;
    alt_u32 desc_stat = 0;

    data = IORD_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE );
    data &= ~(ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_RUN_MSK);
    IOWR_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE, data );

    if(IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK)
    {
        IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE, 0);
        desc_stat = IORD_ALTERA_TSE_SGDMA_DESC_STATUS(pCurrDescRx);
        if(desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK)
        {
            pCurrDescRx->status &= ~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK;
            //,,,  (ОБРАБОТКА ПРИНЯТОГО ПАКЕТА)
        }
        uncached_packet = (alt_u32 *)alt_remap_cached((volatile void*) rx_buff, 4);
        alt_avalon_sgdma_construct_stream_to_mem_desc(pCurrDescRx, pNextDescRx,    uncached_packet, 0, 0);
        alt_dcache_flush(uncached_packet, 4);
        while (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK)
        ;    
        alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, pCurrDescRx);
    }
    return 0;
}

TASK
Порядок действий:
1) В режиме DEBUG устанавливается точка останова в начале обработчика
прерывания
int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)
2) Запускается программа
int main()
{
alt_u32 t=0;

alt_printf("Hello from NIOS\n");
MAC_init();
while (1){ }
return 0;
}
3) Затем с PC подается ARP-запрос:
Ping 192.168.1.2
4) На точку останова в обработчике ни разу не попасть!
TASK
Не попасть при приема в обработчик прерывания.
(для Cyclone IV, SGMI, Marvell 88e1111)

int MAC_init()
{
alt_u32 ,t2=0;
int status=0;
p_counter=0;

IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0);

// PHY and other board peripherial initialization
IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B); //Extended PHY Specific Status Register
t2 &= 0xFFF0;

IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B,t2 | 0x4);//SGMII without clock to Copper

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14); // Disable RGMII Timing Control
t2 &= ~0x82; //marvell_cfg_sgmii
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14, t2);

t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL);// PHY reset
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset

if((IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0)
{ IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL + 16, 0x78);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL);
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);
}
// Without next string don't work reading packet
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE);
IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE,t2 | 0x03); // PCS SGMII mode enabled

do {
Delay(0xFFFFF);
t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS);
}while((t2&0x04)==0); //wait for link-up

// Get the Rx and Tx SGDMA addresses
sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME);
sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME);
IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTWARERESET_MSK);
IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0);

// reset the mac
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK );
while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK);

// Initialize MAC registers
IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE, 8);
IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3);
IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH - 16); //1024/4;
IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); 32/4; // start transmit when there are 48 bytes
IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4);
IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0);
IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_
MSK);
//IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,0);
IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_
MSK);
//IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,0);
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK | ALTERA_TSEMAC_CMD_PAD_EN_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);//???ALTERA_TSEMAC_CMD_PROMIS_EN_MSK
IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xED << 16) | (int)(0x19 << 24)));
IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x05) | (int)(0x9B << 8)) & 0xFFFF));

alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_TSE_SGDMA_INTR_MASK, sgdma_rx_dev);

alt_u32 *uncached_packet_payload;

uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
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);
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);

sem=0;
return status;
}
//---------------------------------------------------------------------------------------------
int tse_sgdmaRx_isr(void * context, alt_u32 irqnum)
{
alt_u32 t2=0;
alt_u32 *uncached_packet_payload;
t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE);
if (t2 & (ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK |
ALTERA_AVALON_SGDMA_STATUS_DESC_COMPLETED_MSK))
{
p_counter++;
alt_printf("Packet counter:%x\n",p_counter);
IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_STATUS_CHAIN_C
OMPLETED_MSK);
t2=IORD_ALTERA_TSE_SGDMA_DESC_STATUS(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
/*check status and handle packet*/
if( (t2 &
(ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_PARITY_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_OVERFLOW_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_SYNC_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_UEOP_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MEOP_MSK |
ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MSOP_MSK ) ) == 0)
{
t2=IORD_16DIRECT(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].actual_bytes_transferred, 0)-2;
CheckPacket(pkt,t2);
}
else
{
alt_printf("RX descriptor reported error. Packet dropped\n");
}
uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
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); // don't write to constant address
t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &des[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
}
return 0;
}

alexPec
Цитата(TASK @ Jun 10 2013, 16:59) *
Помогите, пожалуйста, разобраться с приемом TSE.
За основу взят проект уважаемого VadimZZZ.
Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111.

Передача работает.
Приема нет
При PING ллаты (broadcast) не попадаю в обработчик прерывания.
Код выкладываю.


Дурацкий вопрос - а констрейны для приема прописали?
Димитрий
Здравствуйте.
возник вот какая проблема с использованием PHY_88E1111 + MAC_tse + Nios. В ниосе проект от уважаемого vadimzzz.

Когда подключаешся к сети то все нормально все пакеты ходят взад вперед, все работает, лампочки усердно мигают .
Собственно так проект и отладили до конца через общественную сеть.

Сложность возникла когда стали использовать Media Converter 10/100/1000Base-T to 1000Base-X.
Есть два конвертера, когда делаешь связку
общественная сеть --- КонвертерА --- оптика --- КонвертерВ -- ПК
то все работает как положено, все линки есть и сеть работает.
А вот когда подключаешь прибор например к КонвертеруА( или Б) то лампочки на конвертере горит только PWR и иного мигает
FDX (по описанию это означает коллизия). На плате прибора тоже все лампочки гаснут и иного мигает лампочка Duplex как сказано в описание тоже означает что коллизия.

ни какое шаманство с регистрами не поменяло состояние. Еще заметил что часто бывает что первое чтение после программного сброса возвращает нормальные записи в реситрах,
а последующие чтения рестров возвращают всегда фффф. При просмотре сигналов видно что действительно марвел не отвчает по шине мдио/млс.
при подключении прибора к ПК на прямую прямым кабелем светодиоды маргают что линк есть, но данные идут странные
вот когда связь есть т.е. общественная сеть
http://gyazo.com/05d003d967dae4be0368f02ece9c225d
а вот когда анпрямую к ПК
http://gyazo.com/114e94aa45b6d8446475cd91f440cf26
видно что потерялась преамбула
я так понимаю что марвел должен был автоматом поменять полярность.. или что то нужно еще сделать чтобы это произошло?

вот рисунок дампа регистров взятых и марвела
http://gyazo.com/ac80ec5b599128cc1efa4ab7eabe9288

здесь показан дамп регистров когда прибор подключен к сети и с линком все нормально
http://gyazo.com/c04829de874a1f808321ff8f5d146e03

документация на конвертер
http://gyazo.com/d313c01d2734b09e4c8329fceed85d16
http://gyazo.com/4c2a277e89eec85bf7ba3d7974a13a04

фотка конвертера при подключении его к прибору
http://gyazo.com/63121c90c10225904d2e760dbd4445a6

вот код подключения модуля
Код
module DevEthernet(
    // Clock
    input         CLOCK_50,
    // reset
    input  reset_n,
    // Ethernet
    output        NET0_GTX_CLK,
    output        NET0_MDC,
    inout         NET0_MDIO,
    output        NET0_RESET_N,
    input         NET0_RX_CLK,
    input  [3: 0] NET0_RX_DATA,
    input         NET0_RX_DV,
    output [3: 0] NET0_TX_DATA,
    output        NET0_TX_EN
);

    wire sys_clk, clk_125, clk_25, clk_2p5, clk_200, tx_clk;
    wire core_reset_n;
    wire mdc, mdio_in, mdio_oen, mdio_out;
    wire eth_mode, ena_10;
    // --
    wire        udp_stack_fifo_start_to_ethernet; //      udp_stack_fifo.start_to_ethernet
    wire [7:0]  udp_stack_fifo_rd_data;           //                    .rd_data
    wire        udp_stack_fifo_rdreq;             //                    .rdreq
    wire        udp_stack_fifo_rdempty;           //                    .rdempty
    wire [10:0] udp_stack_fifo_rdusedw;           //                    .rdusedw
    wire [7:0]  udp_stack_fifo_wr_data;           //                    .wr_data
    wire        udp_stack_fifo_wrreq;             //                    .wrreq
    wire        udp_stack_fifo_wrfull;            //                    .wrfull
    wire        udp_stack_eth_cntrl_export;       // udp_stack_eth_cntrl.export

    assign mdio_in   = NET0_MDIO;
    assign NET0_MDC  = mdc;
    assign NET0_MDIO = mdio_oen ? 1'bz : mdio_out;
        
    assign NET0_RESET_N = core_reset_n & udp_stack_eth_cntrl_export;
    
    assign udp_stack_fifo_start_to_ethernet = 1'b0;
    assign udp_stack_fifo_rdreq = 1'b0;
    assign udp_stack_fifo_wr_data = 8'h00;
    assign udp_stack_fifo_wrreq = 1'b0;
    
    pll pll_inst(
        .areset(~reset_n),
        .inclk0(CLOCK_50),
        .c0(sys_clk),
        .c1(clk_125),
        .c2(clk_25),
        .c3(clk_2p5),
        .c4(clk_200),
        .locked(core_reset_n)
    );
    
    assign tx_clk = eth_mode ? clk_125 :       // GbE Mode   = 125MHz clock
                    ena_10   ? clk_2p5 :       // 10Mb Mode  = 2.5MHz clock
                               clk_25;         // 100Mb Mode = 25 MHz clock
    
    ddio_out ddio_out_inst(
        .datain_h(1'b1),
        .datain_l(1'b0),
        .outclock(tx_clk),
        .dataout(NET0_GTX_CLK)
    );
    
    nios_system system_inst(
        .clk_clk                                (sys_clk),      //             clk.clk
        .reset_reset_n                          (core_reset_n), //           reset.reset_n    

        .reset_tse_reset_n      (udp_stack_eth_cntrl_export),
        .tse_export_rx_control  (NET0_RX_DV),   // tse_mac_conduit.rx_control
        .tse_export_rx_clk      (NET0_RX_CLK),  //                .rx_clk
        .tse_export_tx_control  (NET0_TX_EN),   //                .tx_control
        .tse_export_tx_clk      (tx_clk),       //                .tx_clk
        .tse_export_rgmii_out   (NET0_TX_DATA), //                .rgmii_out
        .tse_export_rgmii_in    (NET0_RX_DATA), //                .rgmii_in
        .tse_export_ena_10      (ena_10),       //                .ena_10
        .tse_export_eth_mode    (eth_mode),     //                .eth_mode
        .tse_export_mdio_in     (mdio_in),      //                .mdio_in
        .tse_export_mdio_out    (mdio_out),     //                .mdio_out
        .tse_export_mdc         (mdc),          //                .mdc
        .tse_export_mdio_oen    (mdio_oen),      //                .mdio_oen
        // --
        .udp_stack_fifo_start_to_ethernet(udp_stack_fifo_start_to_ethernet), //      udp_stack_fifo.start_to_ethernet
        .udp_stack_fifo_rd_data(udp_stack_fifo_rd_data),           //                    .rd_data
        .udp_stack_fifo_rdreq(udp_stack_fifo_rdreq),             //                    .rdreq
        .udp_stack_fifo_rdempty(udp_stack_fifo_rdempty),           //                    .rdempty
        .udp_stack_fifo_rdusedw(udp_stack_fifo_rdusedw),           //                    .rdusedw
        .udp_stack_fifo_wr_data(udp_stack_fifo_wr_data),           //                    .wr_data
        .udp_stack_fifo_wrreq(udp_stack_fifo_wrreq),             //                    .wrreq
        .udp_stack_fifo_wrfull(udp_stack_fifo_wrfull),            //                    .wrfull
        .udp_stack_eth_cntrl_export(udp_stack_eth_cntrl_export)       // udp_stack_eth_cntrl.export
    );

endmodule


вот код инициализации
Код
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_BASE, PHY);
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B);//Extended PHY Specific Status Register
    t2 &= 0xFFF0;
    IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B,t2|0xB);//RGMII to Copper
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14);//Extended PHY Specific Control Register
    IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14,t2|0x82);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs
    t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL);
    IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset
    do
    {
        for(i = 0; i < sizeof(reg_phy); i++){
            reg_phy[i] = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, i);
        }
        t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS);
    }


не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору?
Как/чем можно посмотреть почему phy не поднял линк?
sorok-odin
Цитата(Димитрий @ Jun 15 2013, 14:57) *
я так понимаю что марвел должен был автоматом поменять полярность.. или что то нужно еще сделать чтобы это произошло?

не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору?
Как/чем можно посмотреть почему phy не поднял линк?


16 регистр, биты 6:5=00 указывают, что жестко установлен режим MDI. Для автопереворота установить биты в 11 и сделать софт ресет. Ну, может патч-корд заменить на перекрестный (или какой там должен быть). Того, что марвелл перестает отвечать по MDIO, это конечно не объясняет.
С альтерой не знаком, ваш текст прочел по диагонали.

И еще, я бы с осторожностью относился к конвертеру, где в мануале не указаны фирма изготовитель, модель, а в 6 пункте вообще написано "Standerds".
Димитрий
Приветствую всех.

Добился что phy подключается и к ПК и к медиаконвертеру.
Не как не могу запустить езернет на 1Гбит.
подключил tse в этой части таким образом
// -- Ethernet
.reset_tse_reset_n(reset_n_tse),
.tse_export_rx_control (eth_hrd.NET0_RX_DV), // tse_mac_conduit.rx_control
.tse_export_rx_clk (eth_hrd.NET0_RX_CLK), // .rx_clk
.tse_export_tx_control (eth_hrd.NET0_TX_EN), // .tx_control
..................
.tse_export_ena_10 (ena_10), // .ena_10
.tse_export_eth_mode (eth_mode), // .eth_mode
................
.tse_export_set_10 (1'b0), // .set_10
.tse_export_set_1000 (1'b1),
сигнал tse_export_eth_mode устанавливается в 1, т.е. 125МГц
но все одно phy спускается на 100Мбит.
если dawnshift запретит то линк вообще не поднимается.

Перекопал форум по данному вопросу.
Что можно еще посмотреть в части запуска линка на 1Гбит?
DASM
"Что можно еще посмотреть в части запуска линка на 1Гбит?" Простите за оффтопик, просто настолько горькие воспоминания о NIOSII и посему такие радужные надежны на SoC типа SmartFusion2, Zynq 7000 . НИОС наверное не дураки писали. Идеология шин со slave arbitration на тот момент была для меня открытием. Но беда - все это жутко глючное, при добавлении чего-либо на шину висит намертво, причем в НИОС системе невозможно даже узнать - в чем дело - она просто не отвечает по JTAG. Может есть монстры ФПГА, которые констрейнами делают ее надежной и приятной, но добиться того, что в том же Zynq - два ядра на серьезной частоте, стандартизированные AXI и AHB+APB шины.. НИОСу это не светит. А поседеть и проклясть все с ним можно очень быстро. Так что совет - ищите иное решение.
TASK
Обрвщаюсь к знатокам, у кого получились прием/ передачв TSE
для Cyclone IV GX FPGA Development Kit DK-DEV-4CGX150N,+ SGMII+ PHY_Marvell 88e1111.
При компиляции проекта, выложенного на сайте Altera образуется sof-файл c отметкой “time_limitted”.
Использован, как указано на сайте, Quartus II Web Edition software version 11.1.0 и Nios(fast).
Нужна ли лицензия на Quartus II и Nios ?
Димитрий
была ошибка в схеме, потому и не поднимался линк на 1Гбит.
все заработало на раз, после коррекции.
всем спасибо
vadimuzzz
Цитата(TASK @ Jul 4 2013, 03:02) *
Нужна ли лицензия на Quartus II и Nios ?

да, и вдобавок на TSE
TASK
[
Можно ли обойтись без приобретения лицензий на QuartusII,Nios Ll,TSE
для Cyclone IV GX Transceiver Starter Kit (SGMII +Marvell 88111)?
Если можно, то прошу дать ссылки на плдходящие генераторы файлов лицензий.
Stewart Little
Цитата(TASK @ Jul 4 2013, 15:00) *
Если можно, то прошу дать ссылки на плдходящие генераторы файлов лицензий.

После 11-го июля позвоните в ЭФО - будет Вам счастье sm.gif
Alexey_Rostov
Добрый день, уважаемые товарищи.
Очень нужна помощь. Решаю задачу передачи данных по Ethernet. В наличии Stratix II kit DSP, mac lan91c111.
Осваивать передачу данных начал с примера описанного в "Using the NicheStack TCP/IP Stack. Nios II Edition Tutorial". Для железа взял проект standart из примеров для данного кита. В качестве софта -- simple socket server. Зашиваю плату, компилирую софт для заливки в процессор.
При компиляции С ишного проекта появляются ошибки:
Код
2 [main] ? (2544) c:\altera\11.0\quartus\bin\cygwin\bin\sh.exe: *** fatal error - couldn't allocate heap, Win32 error 487, base 0x6D0000, top 0x6E0000, reserve_size 61440, allocsize 65536, page_const 4096
      1 [main] sh 1368 fork: child -1 - died waiting for longjmp before initialization, retry 0, exit code 0x100, errno 11
/bin/sh: fork: Resource temporarily unavailable
      2 [main] ? (2908) c:\altera\11.0\quartus\bin\cygwin\bin\make.exe: *** fatal error - couldn't allocate heap, Win32 error 487, base 0x6A0000, top 0x730000, reserve_size 585728, allocsize 589824, page_const 4096
      1 [main] make 3276 fork: child -1 - died waiting for longjmp before initialization, retry 0, exit code 0x100, errno 11
make[1]: /cygdrive/c/altera/11.0/nios2eds/components/altera_hal/build/system_rules.mk:106: fork: Resource temporarily unavailable
Error: no processor component available.
SOPC_BUILDER_PATH may be incorrectly set in your environment.

make[1]: *** [proc_check] Error 1
make: *** [system_project] Error 2
Build completed in 73.193 seconds;


Как быть?
wpost
Цитата(farbius @ Sep 5 2013, 16:08) *
Добрый день, уважаемые товарищи.
Очень нужна помощь. Решаю задачу передачи данных по Ethernet. В наличии Stratix II kit DSP, mac lan91c111.
Осваивать передачу данных начал с примера описанного в "Using the NicheStack TCP/IP Stack. Nios II Edition Tutorial". Для железа взял проект standart из примеров для данного кита. В качестве софта -- simple socket server. Зашиваю плату, компилирую софт для заливки в процессор.
При компиляции С ишного проекта появляются ошибки:
Код
2 [main] ? (2544) c:\altera\11.0\quartus\bin\cygwin\bin\sh.exe: *** fatal error - couldn't allocate heap, Win32 error 487, base 0x6D0000, top 0x6E0000, reserve_size 61440, allocsize 65536, page_const 4096
      1 [main] sh 1368 fork: child -1 - died waiting for longjmp before initialization, retry 0, exit code 0x100, errno 11
/bin/sh: fork: Resource temporarily unavailable
      2 [main] ? (2908) c:\altera\11.0\quartus\bin\cygwin\bin\make.exe: *** fatal error - couldn't allocate heap, Win32 error 487, base 0x6A0000, top 0x730000, reserve_size 585728, allocsize 589824, page_const 4096
      1 [main] make 3276 fork: child -1 - died waiting for longjmp before initialization, retry 0, exit code 0x100, errno 11
make[1]: /cygdrive/c/altera/11.0/nios2eds/components/altera_hal/build/system_rules.mk:106: fork: Resource temporarily unavailable
Error: no processor component available.
SOPC_BUILDER_PATH may be incorrectly set in your environment.

make[1]: *** [proc_check] Error 1
make: *** [system_project] Error 2
Build completed in 73.193 seconds;


Как быть?


я думаю, что вы отвели мало оперативной памяти для вашего процессора. попробуйте увеличить объем ОЗУ в qsys
gosu-art
Всем привет. Вопрос не совсем по теме но может поможет кто нить.
Отправляю UDP пакеты с устройства. использую TSE
Когда заполняю значение CRC = 0 все норм пакеты приходят и я радуюсь biggrin.gif
Но как только начинаю ее считать то возникает след.
Нажмите для просмотра прикрепленного файла
Почему он говорит что CRC неправильная? Пересчитал в ручную - значение правильное.
RuSTA
Товарищи! Проблема с TSE MAC, а конкретна с лицензией. Кто может поделится ею.
Alexey_Rostov
Здравствуйте. Подскажите пожалуйста как переделать Simple Socket Server под UDP.

Пока понял, что необходимо в BSP editor отключить enable_tcp. Изменить функции send(), recv() на sendto(), recvfrom().
Как быть с telnet клиентом (с его помощью в SSS открывается порт на компьютере)? Насколько я знаю он под TCP/IP.
doom13
Здравствуйте. Возник вопрос по Triple Speed Ethernet: чем же TSE v13 отличается от TSE v12?
С предыдущей версией ip проект работает, при переходе на новую начинаются сбои (прерывание от sgdma_rx вообще перестало работать, sgdma_tx - виснет после передачи нескольких пакетов). Пока оставил старую версию ядра, но как-то не нравится ругательство Qsys о использовании устаревшей версии.
nenu1985
Здравствуйте. Скорей всего где-то что-то упустил, надеюсь большинство знает ответ. В драйвере vadimuzzz (спасибо ему) при отправке, пакеты полностью принимаются wireshark-от при их длине до 200-т байт. Если отправлять пакеты длиннее, в дискрипторах все ок - actual_bytes_transfered = bytes_to_transfer, control = 5, а wireshark принимает по-разному - от 180 до 280 байт, почему так, на что обратить внимание?
Функции MacInit, TseMacDataSend и TseMacTxWrite, не изменял.
Спасибо.
vadimuzzz
единственное, что в голову приходит - проблемы с i/o на стыке плис/phy (кривые констрейны, например). стоит пробежаться сигналтапом по цепочке, начиная с выхода sgdma. правда, если шина связи с phy - rgmii, то сами ноги посмотреть не удастся, но можно добраться до их ddr-регистров
nenu1985
Цитата(vadimuzzz @ Mar 19 2014, 03:56) *
единственное, что в голову приходит - проблемы с i/o на стыке плис/phy (кривые констрейны, например). стоит пробежаться сигналтапом по цепочке, начиная с выхода sgdma. правда, если шина связи с phy - rgmii, то сами ноги посмотреть не удастся, но можно добраться до их ddr-регистров

Потыкал сигналтапом в tse И sgdma_tx. При передаче больших пакетов происходила установка бита m_tx_err в единицу, после чего данные не передавались, ходя во в внутренние фифошки тсе данные поступали до eop sgdma (при малых пакетах до 200 байт этот бит не устанавливался и пересылка завершалась хорошо). Не могу понять из-за чего происходила ошибка передачи - при установке бита других сигналов не появлялось.
Дальше урезал проект для размещения ресурсов под сигналтап (плата небольшая - neek на циклоне 3). Из урезки существенным являлось замена sdram на ssram. В новой схеме пакеты передаются успешно при любой длинне. Так что буду работать дальше, всем спасибо )
Проблема пока не актуальна, но хотелось бы понять кто как решает похожие проблемы.
В старой схеме ддр работала на 133 МГц, периферия на 133/2 МГц (tse, sgdma, etc), режим tse - mii (small mac). В новой cхеме - ssram на 100 МГц, периферия 60 МГц, tse - small mac. Констрэйны не менял и не вникал что к чему, т.к. в доках про их необходимость мало чего написано и пока проходит мимо sm.gif

Alexander_35
День добрый!
Имеется кит. Разбираюсь на нем с TSE.
SSS для примера запустился без проблем.
Теперь пытаюсь запустить драйвер, написанный уважаемым vadimuzzz, но все попытки тщетны. Железную часть беру из вышеприведенного примера без изменений.
Доступ к регистрам PHY (8е1111) есть, значение после инициализации controlPHY = 1140, statusPHY = 796d.
В прерывание приемника не попадаю, при передаче лампочка горит, но в wireshark тихо.
Версия QII 13.1, на это и грешу:

Цитата(doom13 @ Feb 26 2014, 11:54) *
Здравствуйте. Возник вопрос по Triple Speed Ethernet: чем же TSE v13 отличается от TSE v12?
С предыдущей версией ip проект работает, при переходе на новую начинаются сбои (прерывание от sgdma_rx вообще перестало работать, sgdma_tx - виснет после передачи нескольких пакетов). Пока оставил старую версию ядра, но как-то не нравится ругательство Qsys о использовании устаревшей версии.


Возникала ли у кого-нибудь подобная проблема?

P.S. хотя может быть все что угодно - я глубоко начинающий ПЛИСовод и до просветления еще ой как далеко.
doom13
Цитата(Alexander_35 @ Aug 5 2014, 15:02) *
Теперь пытаюсь запустить драйвер, написанный уважаемым vadimuzzz, но все попытки тщетны. Железную часть беру из вышеприведенного примера без изменений.
Доступ к регистрам PHY (8е1111) есть, значение после инициализации controlPHY = 1140, statusPHY = 796d.
В прерывание приемника не попадаю, при передаче лампочка горит, но в wireshark тихо.

Раз лампочка при передаче загорается - MAC передаёт данные на PHY. У Вас для связи MAC-PHY используется RGMII, попробуйте подвигать "клок" TXC (RXC) относительно данных. Если не ошибаюсь, биты управления данной задержкой находятся в регистре PHY 0x1B.

Бит 20.1 - RGMII TX Timing Control, бит 20.7 - RGMII RX Timing Control.

Цитата(Alexander_35 @ Aug 5 2014, 15:02) *
Версия QII 13.1, на это и грешу:

С TSE v13 у меня так и не заработало (правда, сильно и не разбирался, оставил TSE 12 версии), железо и софт одни и те же, но как только ставим TSE v13 всё ложится. C TSE v12 проект отлично работает без каких-либо сбоев.
Alexander_35
Спасибо за совет, но к сожалению не помогло. Буду разбираться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.