alexPec 3 7 января, 2013 Опубликовано 7 января, 2013 · Жалоба Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 16 января, 2013 Опубликовано 16 января, 2013 · Жалоба Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь. шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 16 января, 2013 Опубликовано 16 января, 2013 · Жалоба шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим //Ставим требование 1 нс до и после фронта rxclk стабильных данных create_clock -period 40 -name rxclk [get_ports {eth_rxclk}] set_input_delay -clock { rxclk } 1 [get_ports {eth_rxd[0] eth_rxd[1] eth_rxd[2] eth_rxd[3] eth_rxdv eth_rxerr}] //Это по статье DES00 писал create_clock -period 40 -name txclk [get_ports {eth_txclk}] 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 {eth_txd[0] eth_txd[1] eth_txd[2] eth_txd[3] eth_txen}] Как то так... Сейчас работает, но может и просто сборка удачная получилась. Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему? PHY у меня DP83848. Может сможете подсказать по смежным темам: нерешенная1 и нерешенная2 ? Рад снова видеть Вас здесь, Vadimuzzz! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 16 января, 2013 Опубликовано 16 января, 2013 · Жалоба Как то так... Сейчас работает, но может и просто сборка удачная получилась. Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему? PHY у меня DP83848. когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях. завтра свой пример констрейнов выложу, у меня немного иначе сделано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 16 января, 2013 Опубликовано 16 января, 2013 · Жалоба когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях. завтра свой пример констрейнов выложу, у меня немного иначе сделано. Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает. А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 17 января, 2013 Опубликовано 17 января, 2013 · Жалоба Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает. А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально. так там и нет сообщения об ошибке, только в отчете будет красным подсвечен раздел "Unconstrained paths". давайте отчет таймквеста тоже выкладывайте. что касается констрейнов, то для приемника д. б. как-то так: 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}] для передатчика последнюю строку заменить на: 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}] параметры phy_* я взял из даташита. эти констрейны более жесткие, чем у вас Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 17 января, 2013 Опубликовано 17 января, 2013 · Жалоба Спасибо, переварю, переиначу у себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_VM 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Эх... В общем давно пользуюсь связкой NIOS + SGDMA + TSE. Все работало и устраивало, пока не произвел ревизию. Обнаружил, что размер блока накристальной памяти выделенной под дескрипторы - 4096 байт, показалось многовато. В исходниках индексация памяти дескрипторов при их формировании (функции alt_avalon_sgdma_construct_stream_to_mem_desc и alt_avalon_sgdma_construct_mem_to_stream_desc) производится определениями: #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 т.е. используется всего 4 дескриптора. Размер дескриптора (структура alt_sgdma_descriptor) 32 байта. Ну я и решил уменьшить размер памяти дескрипторов до 128 байт. Не заработало. Прием пакетов отвалился совсем (прерывания по приему не генерятся). Передача блокируется внутри alt_avalon_sgdma_do_sync_transfer() на ожидании завершения передачи данных, строки: /* Wait for the descriptor (chain) to complete */ while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(dev->base) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ); При этом в анализаторе протоколов видно, что пакет улетает. Проходил кто сии фокусы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 23 января, 2013 Опубликовано 23 января, 2013 · Жалоба Проходил кто сии фокусы? у меня везде размер памяти под дескрипторы 1024 байта, меньше смыла делать нет, т.к. размер блока на ц3/ц4 как раз 9кбит. если уверены во всем остальном, то цепляйте сигналтап к портам sgdma и проверяйте. там есть mm-slave порт для конфигурации процессором, mm-master для апдейта состояния дескрипторов и avalon-st (in или out в зависимости от того, какой канал, rx или tx). порядок проверки: сначала mm-slave, потом avalon-st (если предыдущий шаг прошел успешно), потом mm-master (опять же при успешном завершении предыдущего). практика показывает, что все ошибки глупые :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InfyQ 0 15 февраля, 2013 Опубликовано 15 февраля, 2013 (изменено) · Жалоба Здравствуйте. Помогите, пожалуйста, разобраться с проблемой. Собственно, стоит задача отправить ethernet фрейм, используя TSE. В наличии стенд Altera DE2-115 (Циклон4, Marvel 88E1111). Аппаратную часть взял от Simple Socket Server, программную(драйвер) использую от ув. Vadimuzzz'a. MAC_init: int MAC_init() { alt_u32 tse_cmd_cfg = 0; tse_cmd_cfg = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); printf("MAC_init(): tse_cmd_cfg= %x\n", tse_cmd_cfg); alt_u32 /*t,*1=0,*/t2 = 0; int status = 0; p_counter = 0; alt_u16 phyid1, phyid2; /* PHY инициализация */ IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY); phyid1 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 2); phyid2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 3); printf ("PHY=%X phy found:id1 %x, id2 %x\n",PHY, phyid1, phyid2); do { Delay(0xFFFFF); t2=IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS); printf("t2=%d\n", t2); } while ((t2 & 0x04) == 0);//wait link-up printf("t2=%d\n", t2); /* ПОлучаем адреса Rx и Tx SGDMA */ sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME); sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME); if((!sgdma_tx_dev)||(!sgdma_rx_dev)) { printf("[triple_speed_ethernet_init] Error opening TX or RX SGDMA\n"); } IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTW ARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0); /* перезапускаем мак */ 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) { } /* Инициализация мак регистров */ 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); IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 16); IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 16); 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); IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xAB << 16) | (int)(0xF0 << 24))); IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x0D) | (int)(0xBA << 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_SGDMA_RX_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_SGDMA_RX_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_SGDMA_RX_DESC_OFST]); tse_cmd_cfg = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); printf("MAC_init(): tse_cmd_cfg= %x\n", tse_cmd_cfg); sem = 0; printf("controlPHY = %x\n",IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 0)); printf("statusPHY = %x\n",IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, 1)); return status; } tse_mac_raw_send: int tse_mac_raw_send(char * data, unsigned data_bytes) { alt_u32 *uncached_packet_payload; alt_32 timeout; alt_u16 actualBytesTransferred=0; int result; if (sem != 0) /* Tx занят*/ { alt_printf("Tx is busy\n"); return -22; } sem = 1; // clear bit-31 before passing it to SGDMA Driver uncached_packet_payload = (alt_u32*) alt_remap_cached( (volatile void*) data, 4); if (data_bytes > ALTERA_TSE_MIN_MTU_SIZE) { alt_avalon_sgdma_construct_mem_to_stream_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_SGDMA_TX_DESC_OFST],// pointer to "next" uncached_packet_payload, // starting read address (data_bytes), // # bytes 0, // don't read from constant address 1, // generate sop 1, // generate endofpacket signal 0); // atlantic channel (don't know/don't care: set to 0) result = 0; // Проверяем не занят ли TX и SGDMA timeout = 0; while ((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK)) { if (timeout++ == ALTERA_TSE_SGDMA_BUSY_TIME_OUT_CNT) { alt_printf("WARNING : TX SGDMA Timeout\n"); return -22; // avoid being stuck here } } // Начинаем передачу IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_TX_BASE, 0); IOWR_ALTERA_AVALON_SGDMA_STATUS (SGDMA_TX_BASE, 0xFF); result = alt_avalon_sgdma_do_sync_transfer( sgdma_tx_dev, (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST]); //printf("tse_sgdmaRx_isr() result = %d\n", result); } else { result = -3; } if (result < 0) /* SGDMA не доступен */ { alt_printf("raw_send() SGDMA not available\n"); sem = 0; return -22; } else /* Всё ОК*/ { sem = 0; actualBytesTransferred=0; actualBytesTransferred = IORD_ALTERA_TSE_SGDMA_DESC_ACTUAL_BYTES_TRANSFERRED(&desc[ALTERA_TSE_FIRST_SGDMA_TX_DESC_OFST]); //printf("actualBytesTransferred = %d\n", actualBytesTransferred); return 0; /*ОК */ } } отправка пакетов из Main while (1){ a=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE); if (a==0x01){ while (a==0x1) { res_init = tse_mac_raw_send(data_ptr, 200); res_init = tse_mac_raw_send(data_test1, 200); res_init = tse_mac_raw_send(data_test2, 200); res_init = tse_mac_raw_send(data_test3, 200); a=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE); } StatisticsCounters_Report(); } } В итоге, внешне вроде как всё работает: Светодиоды TX, RX на Marverl моргают, запускается на скорости 1гбит/c full duplex (судя по светодиодам). В консоль получаю вывод: ------------------------------------------------------Hello from NIOS MAC_init(): tse_cmd_cfg= 4000223 PHY=10 phy found:id1 141, id2 cc2 t2=31081 t2=31085 t2=31085 MAC_init(): tse_cmd_cfg= 4000223 controlPHY = 1140 controlPHY = 796d MAC init err: 0 ------------------------------------------------------------------ The MAC address 1: F0AB0700 The MAC address 2: BA0D The number of frames that are successfully transmitted including the pause frames: 168067 The number of receive frames with CRC error: 0 The number of data and padding octets that are successfully transmitted: 31260462 The number of data and padding octets that are successfully received: 0 The number of pause frames transmitted: 0 The number received pause frames received: 0 The number of errored frames received: 0 The number of transmit frames with one the following errors(see TSE guide 5-10): 13 The number of valid unicast frames received: 0 The number of valid multicast frames received(without pause frames): 0 The number of valid broadcast frames received: 0 The number of valid unicast frames transmitted: 126049 The number of valid multicast frames transmitted, excluding pause frames: 42020 The number of valid broadcast frames transmitted: 0 The number of frames that are dropped due to MAC internal errors when FIFO buffer overflow persists: 0 The total number of octets received: 0 The total number of frames received: 0 The number of frames received with length less than 64 bytes: 0 The number of frames received that are longer than the value configured in the frm_length register: 0 The number of 64-byte good and err frames received: 0 The number of received good and errored frames between the length of 65 and 127 bytes: 0 The number of received good and errored frames between the length of 128 and 255 bytes: 0 The number of received good and errored frames between the length of 256 and 511 bytes: 0 The number of received good and errored frames between the length of 512 and 1023 bytes: 0 The number of received good and errored frames between the length of 1024 and 1518 bytes: 0 The number of received good and errored frames between the length of 1519 and the maximum frame length configured in the frm_length register: 0 Too long frames with CRC error: 0 Too short frames with CRC error: 0 ------------------------------------------------------------------tse_sgdmaRx_isr(): Im here Packet counter:1 ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK RX descriptor reported error. Packet dropped tse_sgdmaRx_isr(): Im here Packet counter:2 ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK RX descriptor reported error. Packet dropped tse_sgdmaRx_isr(): Im here Packet counter:3 ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK RX descriptor reported error. Packet dropped Т.е. судя по Statistics Counters и светодиодам всё успешно отправляется. Но на WireShark (ОС win7) тишина.. В чем может быть проблема?? Да и почему SGDMA рапортует об ошибках входящих пакетов? P.S. До этого успешно отправлял пакеты с помощью демонстрационного примера Simple Socket Server. P.S.S. Заранее извиняюсь за глупые ошибки) До этого с FPGA не работал.) eth_src.rar Изменено 15 февраля, 2013 пользователем InfyQ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 15 февраля, 2013 Опубликовано 15 февраля, 2013 · Жалоба а марвел в каком режиме? rgmii? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InfyQ 0 15 февраля, 2013 Опубликовано 15 февраля, 2013 (изменено) · Жалоба а марвел в каком режиме? rgmii? Если вы о перемычках на стенде, то да(перемычка установлена в режим RGMII). Да и демонстрационный пример Simple Socket Server брался и использовался для RGMII режима. Еще смущают строчки The number of frames that are successfully transmitted including the pause frames: 168067 The number of data and padding octets that are successfully transmitted: 31260462 31260462/168067=186 хотя отправляю пакеты по 200 байт. Еще такой вопрос. Как принудительно установить скорость в 100мбит. В документации нашел бит, который отвечает за скорость eth_speed. Но помимо этого бита скорость зависит еще от сигнала set_1000 (т.к. у меня этот бит по умолчанию "0", но link запускается в гигабитном режиме). Как и где можно изменить этот сигнал?? -) Может быть предоставить вывод еще каких либо регистров? P.S. Прошу прощения, Аппаратная часть от Web Server (DE2_115_WEB_SERVER_RGMII_ENET0). Изменено 15 февраля, 2013 пользователем InfyQ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 15 февраля, 2013 Опубликовано 15 февраля, 2013 · Жалоба пример инициализации PHY в режиме rgmii: /* PHY and other board peripherial initialization */ IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B);//Extended PHY Specific Status Register t2 &= 0xFFF0; IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x1B,t2|0xB);//RGMII to Copper t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,0x14);//Extended PHY Specific Control Register IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_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_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL); IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2|PCS_CTL_sw_reset);//Previous Operations Require SW Reset do { t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS); } while((t2&0x04)==0);//wait for link-up чтобы принудительно выставить 100, подайте нули на входы set_10 и set_1000, а также сбросьте бит ETH_SPEED. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 26 февраля, 2013 Опубликовано 26 февраля, 2013 · Жалоба Создал систему для Циклона 4 (DE0Nano) Драйвер от уважаемого vadimuzzz Основные функции драйвера int MAC_init() { alt_u32 t,t1,t2=0; int status=0; IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_0_BASE,0x1F); 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); } currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]; nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr); desc_pointer = currdescriptor_ptr; desc_pointer->status&=~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK; desc_pointer = currdescriptor_ptr; /* Get the Rx and Tx SGDMA addresses */ sgdma_tx_dev = alt_avalon_sgdma_open("/dev/sgdma_tx_0"); if(sgdma_tx_dev == NULL) { printf("Could not open the transmit SG-DMA\n"); } else printf("Open the transmit SG-DMA... success\n"); sgdma_rx_dev = alt_avalon_sgdma_open("/dev/sgdma_rx_0"); if(sgdma_rx_dev == NULL) { printf("Could not open the receive SG-DMA\n"); } else printf("Open the receive SG-DMA... success\n"); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_0_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOF TWARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_TX_0_BASE, 0x0); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOF TWARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, 0x0); /* reset the mac */ IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE,ALTERA_TSEMAC_CMD_SW_RESET_MSK); while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK) { } t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE); /* Initialize MAC registers */ IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_0_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH); IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_0_BASE, 8); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_0_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_0_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_0_BASE, 3); IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_0_BASE, TSE_0_TRANSMIT_FIFO_DEPTH - 16); //1024/4; IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_0_BASE, 16); //32/4; // start transmit when there are 48 bytes IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_0_BASE, TSE_0_RECEIVE_FIFO_DEPTH - 16); //4000/4); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_0_BASE, 16); IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_0_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_MS K); IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_0_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_MS K); IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK); IOWR_ALTERA_TSEMAC_MAC_0(TSE_0_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xAB << 16) | (int)(0xF0 << 24))); IOWR_ALTERA_TSEMAC_MAC_1(TSE_0_BASE,(((int)(0x0D) | (int)(0xBA << 8)) & 0xFFFF)); t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE); 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); t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_0_BASE); t2=IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE); status = tse_sgdma_read_init(); sem=0; return status; } int tse_sgdma_read_init() { alt_u32 *uncached_packet_payload; uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4); currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]; nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr); 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, // pkt_array[chain_loop]->nb_buff, // starting write_address 0, // read until EOP 0); int ii=1; currdescriptor_ptr = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]; nextdescriptor_ptr = (alt_sgdma_descriptor *) IORD_ALTERA_TSE_SGDMA_DESC_NEXT(currdescriptor_ptr); ii=-alt_avalon_sgdma_check_descriptor_status(currdescriptor_ptr); ii=alt_avalon_sgdma_check_descriptor_status(nextdescriptor_ptr); desc_pointer = currdescriptor_ptr; tse_mac_aRxRead(currdescriptor_ptr); return 1; } int tse_sgdmaRx_isr(void * context, alt_u32 irqnum) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0xff); alt_u32 t2=0; tse_mac_rcv(); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, 0x00); //t2=IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE);-- //t2|=ALTERA_AVALON_SGDMA_CONTROL_CLEAR_INTERRUPT_MSK;--irq //IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, t2);-- IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_0_BASE, ALTERA_TSE_SGDMA_INTR_MASK); if((IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK )) { tse_mac_aRxRead(currdescriptor_ptr); } IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE,0xFF); t2=IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_0_BASE); return 1; } alt_u16 tse_mac_aRxRead(alt_sgdma_descriptor *rxDesc) { alt_u8 result = 0; while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_0_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ); result = alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, rxDesc);//(alt_sgdma_descriptor *) &rxDesc[0]); return 1; } int tse_mac_rcv() { alt_u32 *uncached_packet_payload; alt_u8 tempVar; desc_pointer = currdescriptor_ptr; if ((IORD_ALTERA_TSE_SGDMA_DESC_STATUS(desc_pointer)) & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK) { desc_pointer->status&=~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK; nextdescriptor_ptr = (alt_sgdma_descriptor *)IORD_ALTERA_TSE_SGDMA_DESC_NEXT(desc_pointer); uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4); tempVar = IORD_8DIRECT(&nextdescriptor_ptr->control, 0 ); 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 IOWR_8DIRECT(&nextdescriptor_ptr->control, 0, tempVar); desc_pointer = nextdescriptor_ptr; } return 1; } Все инициализируется нормально. Передача работает нормально. Программа нормально работает в sdram на 100 . Проблема в приемнике. На приемник передаю короткие пакеты 96 байт известного содержимого. Приемник совсем не хочет принимать. Подозреваю, что из-за констрейнов... Каких не врубаюсь. Подскажите пожалуйста куда копать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 27 февраля, 2013 Опубликовано 27 февраля, 2013 · Жалоба Не понял на счет борды, на этой нет eth: http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=593 уточните спеки системы, особенно насчет PHY и шины к ней Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться