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

 
 
26 страниц V  « < 20 21 22 23 24 > »   
Reply to this topicStart new topic
> Ethernet + Cyclone + Nios
vadimuzzz
сообщение Apr 10 2013, 14:29
Сообщение #316


Гуру
******

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



поправил для передатчика
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Apr 11 2013, 12:43
Сообщение #317


Знающий
****

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



Цитата(vadimuzzz @ Apr 10 2013, 17:29) *
поправил для передатчика
Код
set phy_tsu 10
set phy_th 0
set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}]
set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}]

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

Спасибо. Я виноват. Мог-бы и сам заметить опечатку.
Сигналтапом нет возможности.
Пробую другие варианты системы...
Если не сложно посоветуйте пожалуйста где можно почитать как строится скрипт констрейнов .sdc. Совсем смутно в этом ориентируюсь.

Сообщение отредактировал Acvarif - Apr 11 2013, 13:12
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Apr 14 2013, 09:10
Сообщение #318


Знающий
****

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



Железо перепроовал по всякому (разные процессоры и т.п) Всеравно 88e1111 виснет на приемнике. В то же время на DE0Nano + ksz8721 и приемник и передатчик работает на любом железе и при небольших вариациях констрейнов без проблем.
Нашел пару документов
1. http://www.altera.com/literature/ug/ug_tq_tutorial.pdf
2. http://embedders.org/sites/default/files/T...for_dummies.pdf
Попробую проанализировать стандартный пример web сервера. Пример работает нормально. Но там столько наворочено...
Go to the top of the page
 
+Quote Post
doom13
сообщение May 28 2013, 13:37
Сообщение #319


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

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

np_tse_mac *pmac= (np_tse_mac *) TSE_MAC_BASE;

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


2.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void TseMacInit()
{
...
...
IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);
...
...
}
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 30 2013, 13:38
Сообщение #320


Гуру
******

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



Цитата(doom13 @ May 28 2013, 20:37) *
Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты.

во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш,
например установкой breakpoint
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2013, 06:41
Сообщение #321


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



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


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

Сообщение отредактировал doom13 - Jun 4 2013, 06:44
Go to the top of the page
 
+Quote Post
targasonic
сообщение Jun 7 2013, 11:23
Сообщение #322





Группа: Новичок
Сообщений: 1
Регистрация: 7-06-13
Пользователь №: 77 103



Подскажите пожалуйста с реализацией UDP протокола на Cyclone III:

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

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

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

Подскажите в каком направление двигаться, заранее спасибо.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 7 2013, 11:46
Сообщение #323


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



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

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

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

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

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


Начать с передачи-приёма данных с помощью ядра TSE, выше выкладывали рабочий драйвер, а к нему уже привинтить реализацию UDP.
На вход мегафункции TSE подаётся готовый пакет со всеми заголовками, IP-crc и UDP-crc. TSE считает только контрольную сумму всего пакета (FRAME CHECK SEQUENCE), может заменять мак-адрес передатчика и при приёме может осуществлять фильтрацию мак-адресов.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jun 9 2013, 23:49
Сообщение #324


Гуру
******

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



Цитата(doom13 @ Jun 4 2013, 13:41) *
т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD?

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

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


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

я в этой теме выкладывал пример проекта. после небольшой доработки напильником, из него можно выжать примерно вдвое больше
Go to the top of the page
 
+Quote Post
TASK
сообщение Jun 10 2013, 12:59
Сообщение #325





Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766



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

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

Прикрепленные файлы
Прикрепленный файл  eth_driver.rar ( 2.74 килобайт ) Кол-во скачиваний: 53
 
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 10 2013, 14:26
Сообщение #326


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



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

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


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

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

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

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

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

Go to the top of the page
 
+Quote Post
TASK
сообщение Jun 10 2013, 16:41
Сообщение #327





Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766



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

alt_printf("Hello from NIOS\n");
MAC_init();
while (1){ }
return 0;
}
3) Затем с PC подается ARP-запрос:
Ping 192.168.1.2
4) На точку останова в обработчике ни разу не попасть!
Go to the top of the page
 
+Quote Post
TASK
сообщение Jun 10 2013, 17:47
Сообщение #328





Группа: Новичок
Сообщений: 9
Регистрация: 8-05-13
Пользователь №: 76 766



Не попасть при приема в обработчик прерывания.
(для Cyclone IV, SGMI, Marvell 88e1111)

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

IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0);

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

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

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

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

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

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

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

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

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

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

alt_u32 *uncached_packet_payload;

uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4);
alt_avalon_sgdma_construct_stream_to_mem_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next"
uncached_packet_payload, // starting write_address
0, // read until EOP
0);
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);

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

Go to the top of the page
 
+Quote Post
alexPec
сообщение Jun 11 2013, 05:06
Сообщение #329


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

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



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

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


Дурацкий вопрос - а констрейны для приема прописали?
Go to the top of the page
 
+Quote Post
Димитрий
сообщение Jun 15 2013, 10:57
Сообщение #330


Частый гость
**

Группа: Свой
Сообщений: 184
Регистрация: 21-03-06
Из: Нижний Новгород
Пользователь №: 15 435



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

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

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

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

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

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

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

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

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

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

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

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

endmodule


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


не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору?
Как/чем можно посмотреть почему phy не поднял линк?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:58
Рейтинг@Mail.ru


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