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

 
 
26 страниц V  « < 17 18 19 20 21 > »   
Reply to this topicStart new topic
> Ethernet + Cyclone + Nios
alexPec
сообщение Jan 7 2013, 19:48
Сообщение #271


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 16 2013, 06:20
Сообщение #272


Гуру
******

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



Цитата(alexPec @ Jan 8 2013, 02:48) *
Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.

шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим
Go to the top of the page
 
+Quote Post
alexPec
сообщение Jan 16 2013, 12:07
Сообщение #273


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(vadimuzzz @ Jan 16 2013, 10:20) *
шины-то везде одинаковые (*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!
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 16 2013, 13:00
Сообщение #274


Гуру
******

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



Цитата(alexPec @ Jan 16 2013, 19:07) *
Как то так... Сейчас работает, но может и просто сборка удачная получилась.
Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему?
PHY у меня DP83848.

когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.
завтра свой пример констрейнов выложу, у меня немного иначе сделано.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Jan 16 2013, 16:25
Сообщение #275


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(vadimuzzz @ Jan 16 2013, 17:00) *
когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.
завтра свой пример констрейнов выложу, у меня немного иначе сделано.

Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.
А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 17 2013, 01:08
Сообщение #276


Гуру
******

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



Цитата(alexPec @ Jan 16 2013, 23:25) *
Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.
А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.

так там и нет сообщения об ошибке, только в отчете будет красным подсвечен раздел "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_* я взял из даташита. эти констрейны более жесткие, чем у вас
Go to the top of the page
 
+Quote Post
alexPec
сообщение Jan 17 2013, 16:01
Сообщение #277


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Спасибо, переварю, переиначу у себя.
Go to the top of the page
 
+Quote Post
_VM
сообщение Jan 23 2013, 20:34
Сообщение #278


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 23-03-05
Из: Москва
Пользователь №: 3 625



Эх...
В общем давно пользуюсь связкой 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) );
При этом в анализаторе протоколов видно, что пакет улетает.

Проходил кто сии фокусы?

Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 23 2013, 23:48
Сообщение #279


Гуру
******

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



Цитата(_VM @ Jan 24 2013, 03:34) *
Проходил кто сии фокусы?

у меня везде размер памяти под дескрипторы 1024 байта, меньше смыла делать нет, т.к. размер блока на ц3/ц4 как раз 9кбит. если уверены во всем остальном, то цепляйте сигналтап к портам sgdma и проверяйте. там есть mm-slave порт для конфигурации процессором, mm-master для апдейта состояния дескрипторов и avalon-st (in или out в зависимости от того, какой канал, rx или tx). порядок проверки: сначала mm-slave, потом avalon-st (если предыдущий шаг прошел успешно), потом mm-master (опять же при успешном завершении предыдущего).

практика показывает, что все ошибки глупые sm.gif
Go to the top of the page
 
+Quote Post
InfyQ
сообщение Feb 15 2013, 09:28
Сообщение #280





Группа: Новичок
Сообщений: 2
Регистрация: 15-02-13
Пользователь №: 75 633



Здравствуйте. Помогите, пожалуйста, разобраться с проблемой.
Собственно, стоит задача отправить 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 не работал.)

Сообщение отредактировал InfyQ - Feb 15 2013, 09:31
Прикрепленные файлы
Прикрепленный файл  eth_src.rar ( 4.91 килобайт ) Кол-во скачиваний: 53
 
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 15 2013, 10:04
Сообщение #281


Гуру
******

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



а марвел в каком режиме? rgmii?
Go to the top of the page
 
+Quote Post
InfyQ
сообщение Feb 15 2013, 11:26
Сообщение #282





Группа: Новичок
Сообщений: 2
Регистрация: 15-02-13
Пользователь №: 75 633



Цитата(vadimuzzz @ Feb 15 2013, 20:04) *
а марвел в каком режиме? 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).

Сообщение отредактировал InfyQ - Feb 15 2013, 11:26
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 15 2013, 11:58
Сообщение #283


Гуру
******

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



пример инициализации 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.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Feb 26 2013, 14:24
Сообщение #284


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Создал систему для Циклона 4 (DE0Nano)
Прикрепленное изображение

Драйвер от уважаемого vadimuzzz
Основные функции драйвера
CODE
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;
}


CODE
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;
}


CODE
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 байт известного содержимого. Приемник совсем не хочет принимать.
Подозреваю, что из-за констрейнов... Каких не врубаюсь. Подскажите пожалуйста куда копать.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 27 2013, 06:01
Сообщение #285


Гуру
******

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



Не понял на счет борды, на этой нет eth:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?No=593

уточните спеки системы, особенно насчет PHY и шины к ней
Go to the top of the page
 
+Quote Post

26 страниц V  « < 17 18 19 20 21 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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