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

Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.

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


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

Наткнулся на timing constraints при использовании эзенета с опенкорес. Задавал кто констрейны для него? Задать то я задал, только правильно ли. Хотелось бы сравнить с чьими - нибудь.

шины-то везде одинаковые (*MII), так что и констрейны одинаковые. выкладывайте, поглядим

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


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

шины-то везде одинаковые (*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!

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


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

Как то так... Сейчас работает, но может и просто сборка удачная получилась.

Напрягло то, что когда задал эти констрейы в таймквесте на нерабочей скомпилированной версии (т.е. компиляция была проведена без констрейнов) - ошибок таймквест не выдал, но после перекомпиляции с учетом констрейнов - все заработало. Тоже вопрос - почему?

PHY у меня DP83848.

когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.

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

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


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

когда констрейнов по I/O нет, таймквест ошибок не выдает, только в отчете будут отмечены unconstrained i/o. соответственно при компиляции он не проверяет времянки (не по чему проверять) и кидает провода и регистры как попало. отсюда и шаманство - то работает, то нет при (вроде бы) нерелевантных изменениях.

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

Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.

А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.

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


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

Нет, ну вот раскидал он регистры и провода - не работает, к примеру. Запускаю таймквест и задаю констрейны (проект не перекомпилирую - т.е. он не рабочий) - и ПОСЛЕ задания констрейнов в таймквесте (проект нерабочй, не перекомпилирую) - таймквест ошибок не выдает.

А вот когда перекомпилирую с этими констрейнами - все работает, таймквест также не ругается. Т.е. когда анализирую в таймквесте и рабочий, и нерабочий проект - он говорит что все нормально.

так там и нет сообщения об ошибке, только в отчете будет красным подсвечен раздел "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_* я взял из даташита. эти констрейны более жесткие, чем у вас

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


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

Эх...

В общем давно пользуюсь связкой 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) );

При этом в анализаторе протоколов видно, что пакет улетает.

 

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

 

 

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


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

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

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

 

практика показывает, что все ошибки глупые :)

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


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

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

Собственно, стоит задача отправить 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

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

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


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

а марвел в каком режиме? 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).

post-75633-1360926464_thumb.jpg

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

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


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

пример инициализации 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.

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


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

Создал систему для Циклона 4 (DE0Nano) post-39850-1361886918_thumb.jpg

Драйвер от уважаемого 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 байт известного содержимого. Приемник совсем не хочет принимать.

Подозреваю, что из-за констрейнов... Каких не врубаюсь. Подскажите пожалуйста куда копать.

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


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

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

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

 

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

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


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

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

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

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

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

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

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

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

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

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