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

Не понял на счет борды, на этой нет eth:

http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=593

 

уточните спеки системы, особенно насчет PHY и шины к ней

Подцепил к ней это http://starterkit.ru/html/index.php?name=s...=view&id=19 Режим MII Работает нормально, даже внешнего питания не требует (от USB) Вот только приемник TSE не работает.

post-39850-1361949690_thumb.jpg

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

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


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

я приводил пример для DP83848, мельком глянул даташит на ks8721 - вроде времянки такие же.

 

http://electronix.ru/forum/index.php?showt...t&p=1128246

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


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

я приводил пример для DP83848, мельком глянул даташит на ks8721 - вроде времянки такие же.

 

http://electronix.ru/forum/index.php?showt...t&p=1128246

Спасибо.

Приемник заработал. Но принимает только один раз. Для повторного приема необходимо перезагрузить .sof

Не врубаюсь в чем хитрость..

Стоп..

Кажется заработало. Глубина FIFO приемника была маленькая.

Теперь нужно проверить как правильно принимаются байты. В приемнике eth_ocm нужный байт находился в массиве buf_ptr

...
        buf_ptr = (alt_u8*)alt_remap_cached ((volatile void*) pkt, 4);
        buf_ptr = (alt_u8*)(((unsigned int)buf_ptr) + ETHHDR_BIAS);
        IOWR_ETH_OCM_DESC_PTR(ETH_OCM_0_BASE, 1, (alt_u32)buf_ptr);
...

Подскажите пожалуйста как для TSE поступать. На приемник передается 96 байт известного содержимого.

Где будут находиться данные по приему (TSE)?

    if((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK ))
    {
        tse_mac_aRxRead(currdescriptor_ptr);
     }

Принимающая функция tse_mac_aRxRead Как теперь из нее достать каждый отдельный байтик принятого пакета?

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

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


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

Спасибо.

Разобрался.

Данные по приему тут buf_ptr = (alt_u8*)alt_remap_cached ((volatile void*) pkt, 4);

Приемы нормальные. Байты все в нужных местах.

Но еще остается непонятка. Примерно после 1..2_х минут работы все останавливается. Нет прерываний по приему.

При этом программа крутится как положено. Главный цикл работает.

Помогает перезагрузка .elf из отладчика либо перезагрузка .sof из программатора.

В чем может быть причина остановки?

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


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

В чем может быть причина остановки?

 

C опенкорес эзернетом то же самое бывает когда переполняется внутреннее фифо ядра эзернет. Т.е. если поток большой и не успевает софт обработать пакеты - прием затыкается, пропадают прерывания на прием. Передача при этом работает, софт тоже. Но правда такие случаи с опенкоресом у меня были только когда брейкпоинт ставишь - пакетов наваливается пока в брейке висит и прерывания приема пропадают. А в штатном режиме такого не было, правда потоки у меня не запредельные - 4..8 мбит. Спасала только перезаливка elf

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


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

C опенкорес эзернетом то же самое бывает когда переполняется внутреннее фифо ядра эзернет. Т.е. если поток большой и не успевает софт обработать пакеты - прием затыкается, пропадают прерывания на прием. Передача при этом работает, софт тоже. Но правда такие случаи с опенкоресом у меня были только когда брейкпоинт ставишь - пакетов наваливается пока в брейке висит и прерывания приема пропадают. А в штатном режиме такого не было, правда потоки у меня не запредельные - 4..8 мбит. Спасала только перезаливка elf

Да, похоже как будто переполнение фифо tse. Но я выствил фифо на прием 2048, а наприем передаю из компа короткие пакеты 96 байт один раз в 0.3 сек. Вроде не должно при таком объеме фифо затыкаться...

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

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


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

я тут тоже недавно словил похожий баг с переполнением приемного fifo. по какой-то причине первый пакет мог (не выяснил, при каких условиях) вызвать переполнение fifo. хотя в штатном режиме сбойный пакет просто должен быть отброшен. я покопался в доках и нашел ошибку в своем коде, которая тянется с хз каких времен. суть: если взводится бит ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK в командном регистре, то RX_SECTION_FULL должен быть установлен в 0, т.к. иначе опция проверки пакетов не работает.

сейчас код инициализации MAC у меня выглядит так:

    IOWR_ALTERA_TSEMAC_FRM_LENGTH(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 8);
    IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  3);
    IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ETH_0_TRIPLE_SPEED_ETHERNET_0_TRANSMIT_FIFO_DEPTH - 16);
    IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  0);
    IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, ETH_0_TRIPLE_SPEED_ETHERNET_0_RECEIVE_FIFO_DEPTH - 16); 
    IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,  0);
    IOWR_ALTERA_TSEMAC_TX_CMD_STAT(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,0);
    IOWR_ALTERA_TSEMAC_RX_CMD_STAT(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE,0);
    IOWR_ALTERA_TSEMAC_MAC_0(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, MY_MAC_ADDR.mac_addr.mac_hi);
    IOWR_ALTERA_TSEMAC_MAC_1(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, MY_MAC_ADDR.mac_addr.mac_lo);
    IOWR_ALTERA_TSEMAC_CMD_CONFIG(ETH_0_TRIPLE_SPEED_ETHERNET_0_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);

почему я этот баг раньше не поймал - ума не приложу, м.б. что-то меняли в новых корках

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


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

Спасибо. Приемник стал работать лучше. Но всеравно иногда затыкался.

Полностью избавиться от затыков на приеме помогло изменение конфигурации fifo tse из 32-бит на 8 бит

post-39850-1362473234_thumb.jpg post-39850-1362473302_thumb.jpg

Не врубаюсь какая связь между размерностью фифо TSE и надежностью приемов...

Попробую вернуться назад (на 32 бита) и еще раз проверить

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

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


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

Приемник нормально заработал с 32_битным TSE фифо на процессорах типа S и F. На E нормально работает с 8 битным TSE фифо.

Спасибо vadimuzzz. Ваш драйвер TSE работает также неплохо как и драйвер Eth_ocm.

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


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

Успешно запустив Ethernet на De0Nano, появилсь необходимость использовать ethernet драйвер от vadimuzzz на DE2-115 где стоит phy 88E1111. Но не получается. Очевидно потому, что неизвестен адрес PHY. Для Микрела (ksz872bl) он был #define PHY 0x1. Если кто сталкивался подскажите пожалуйста какой установить #define PHY для 88E1111 (De2-115)?

Попробую автопределение

for (t=0;t<33;t++) {
    IOWR_ALTERA_TSEMAC_MDIO_ADDR0(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, t);
    alt_printf("Probing PHY at address %x ...\n", t);
    r = IORD_ALTERA_TSEMAC_MDIO(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID1);
    if (r == 0x22)/*KSZ9021*/{
        alt_printf("PHY address:%x\n", t);
        alt_printf("PHY_ID1:%x\n", r);
        alt_printf("PHY_ID2:%x\n", IORD_ALTERA_TSEMAC_MDIO(ETH_0_TRIPLE_SPEED_ETHERNET_0_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_PHY_ID2));
        break;
    }
}

Подскажите please ID 88E1111

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

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


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

PHY_ADDR у марвела весьма своеобразно задается, путем подключения ног CONFIG к опеделенным LED. судя по схеме борды, адрес выставлен 10000b(0x10) для eth0 и 10001b (0x11) для eth1. на всякий случай, PHY_ID1=0x0141

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


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

PHY_ADDR у марвела весьма своеобразно задается, путем подключения ног CONFIG к опеделенным LED. судя по схеме борды, адрес выставлен 10000b(0x10) для eth0 и 10001b (0x11) для eth1. на всякий случай, PHY_ID1=0x0141

Спасибо.

PHY_ADDR определился как 0x10. Поскольку на передачу 88E1111 требует внешнюю тактовую, то подал на вход gtx_clock phy 125мГц. Светодиод передачи на боарде мигает, тоесть функция tse_mac_raw_send((char*)ethmass_ptr, 1168) работает - в PHY tse что-то загружает. Внешне вроде передатчик работает. Но на сниффере пусто.

 

Вроде инициализация tse никак не должна отличаться для ksz872 и для 88e1111? Да и подключение tse к PHY для режима MII должно быть одинаковое для ksz872 и 88e1111 кроме внешнй частоты gtx_clock phy 125мГц.

 

Пока не пойму чего этой 88E1111 не хватает?

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


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

Пока не пойму чего этой 88E1111 не хватает?

там не MII, а RGMII. поэтому нужны 2 вещи - правильные констрейны на I/O и сконфигурировать PHY для режима RGMII (добавятся задержки по клокам). поищите, я код конфигурации марвела выкладывал. м.б. даже в этой теме

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


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

там не MII, а RGMII. поэтому нужны 2 вещи - правильные констрейны на I/O и сконфигурировать PHY для режима RGMII (добавятся задержки по клокам). поищите, я код конфигурации марвела выкладывал. м.б. даже в этой теме

Понял. Поищу. Попробую режим RGMII. Со стандартным примером от терасик этот режим вроде работает. Правда работает неважно. В пакетах смещение на 8 байт. И в части программы (tse драйвер, инициализация MAC, прием , передача ) там ногу можно сломать столько наворочено. Ваш драйвер намного понятнее. На ksz872bl работает отлично.

И тем не менее на боарде DE2-115 есть перемычка Jp1 которая переключает режим работы PHY на MII (ножка 60 Enet0_Cconfig4). Что я собственно и сделал. После загрузки системы и запуска инициализации МАС линк есть. Передача тоже работает (светодиод передатчика 88е1111 мигает). Но в сеть ничего не поступает. Как будто скорость передачи не та...

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

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


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

И тем не менее на боарде DE2-115 есть перемычка Jp1 которая переключает режим работы PHY на MII (ножка 60 Enet0_Cconfig4). Что я собственно и сделал. После загрузки системы и запуска инициализации МАС линк есть. Передача тоже работает (светодиод передатчика 88е1111 мигает). Но в сеть ничего не поступает. Как будто скорость передачи не та...

если используете MII, то надо подать на tx_clk 25MHz, gtx_clk в данном режиме не используется

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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