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

а где взять полярность или ее настройка не критична?

в том файле, что выше, есть и про полярность, как раз marvel-specific. но если Auto Negotiate проходит, то все автоматом выставляется (как линк/дуплекс). полярность нужна, если какой-нибудь олух кабель неправильно обожмет.

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


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

Сегодня попробовал забить ему жестко без всякого auto-neg параметры для 100 mbit.

Сначала делаю hard reset для PHY - 10 ms(с альтерафорум там висит скрин из даташита на микросхему).

загораются led и он начинает принимать пакеты от сети в режиме auto-neg, потом забиваю параметры для 100 mbit выключаю auto-neg и он тухнет.

не знаю. может ему soft reset после этой операции нужен.

 

в общем остался на auto-neg на 100 mbit full duplex.

 

wireshark принимает вот такой пакет:

8 Frame 69 (126 bytes on wire, 126 bytes captured) Arrival Time: Nov 24, 2009 13:50:20.538005000

[Time delta from previous captured frame: 0.000003000 seconds]

[Time delta from previous displayed frame: 0.000003000 seconds]

[Time since reference or first frame: 1638.742094000 seconds]

Frame Number: 69 Frame Length: 126 bytes capture Length: 126 bytes

[Frame is marked: False]

[Protocols in frame: eth:mdshdr:fc] 0

Ethernet II, src: 00:07:ab:f0:Od:ba (00:07:ab:f0:Od:ba),

Dst: 00:00:00_00:00:00 (00:00:00:00:00:00) S

Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)

Address: 00:00:00_00:00:00 (00:00:00:00:00:00)

0 = IG bit: individual address (unicast)

0 = LG bit: Globally unique address (factory default)

Ј[source: 00:07:ab:f0:Od:ba (00:07:ab:f0:Od:ba)

Address: 00:07:ab:f0:Od:ba (00:07:ab:f0:Od:ba)

0 = IG bit: individual address (unicast)

0 = LG bit: Globally unique address (factory default)

Type: unknown (0x0000)

Trai1er: 000000000000000000000000000000000000000000000000...

Frame check sequence: 0x00000000 [incorrect, should be 0xd762142d] В

mds Header(unknown(0)/unknown(0)) В

mds Header

...0 0000 0000 0000 = Packet Len: 0

0000 0000 00.. = Dst index: 0x0000

00 0000 0000 = src index: 0x0000

0000 0000 0000 = VSAN: 0

В mds Trailer

eof: unknown (0) CRC: 0x00000000

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

подозрение, что неправильно формируется дескриптор для sgdma из-за чего и не может нормально пакет передать.

 

где бы посмотреть как правильно настроить sgdma и создать дескриптор для передачи данных?

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

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


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

смотреть в драйвере, м.б. тут фокусы с кэшем. смущает еще нулевая CRC, по идее PHY должен ее сам считать при правильных настройках. ну и ман по sgdma почитать. 5-й том квартус-хендбука. а инициализация точно нормально прошла? обнародуйте статусные регистры. а то я помню 2 недели вдоль и поперек TSE изучал, даже на опенкорес ушел, а дело было в хреновом кабеле.

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


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

Я убил много времени пытаясь запустить этот марвел-аляску (88E1111), встроенный в упомянутый ЕДК 120К - и бросил это бесполезное занятие. Поставил DP83848 Ethernet адаптер (от MoreThanIP) через HSMC-СантаКруз переходник - и сразу все заработало как надо, включая Simple Socket Server (Iniche+MicroC/OS, etc). Интересно, есть такие гении, которым удалось таки разморозить эту аляску?

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


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

смотреть в драйвере, м.б. тут фокусы с кэшем. смущает еще нулевая CRC, по идее PHY должен ее сам считать при правильных настройках. ну и ман по sgdma почитать. 5-й том квартус-хендбука. а инициализация точно нормально прошла? обнародуйте статусные регистры. а то я помню 2 недели вдоль и поперек TSE изучал, даже на опенкорес ушел, а дело было в хреновом кабеле.

 

Есть ли смысл подключить signaltap и посмотреть передаются ли данные к PHY?

инициализацию и прочее постараюсь завтра выложить.

 

Я убил много времени пытаясь запустить этот марвел-аляску (88E1111), встроенный в упомянутый ЕДК 120К - и бросил это бесполезное занятие. Поставил DP83848 Ethernet адаптер (от MoreThanIP) через HSMC-СантаКруз переходник - и сразу все заработало как надо, включая Simple Socket Server (Iniche+MicroC/OS, etc). Интересно, есть такие гении, которым удалось таки разморозить эту аляску?

 

Без паники ) я уже плююсь пакетами, осталось разобраться почему нулевыми.

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


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

Без паники ) я уже плююсь пакетами, осталось разобраться почему нулевыми.

 

Да у меня он тоже дышал - но на ладан. Simple Socket Server так и не заработал.

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


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

Есть ли смысл подключить signaltap и посмотреть передаются ли данные к PHY?

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

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


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

Что-то с разбега не получилось за signal tap засесть, завтра попробую это сделать.

 

Предложение по поводу принять пакет - хорошее. только вот как и чем из-под винды его отправить?

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


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

Что-то с разбега не получилось за signal tap засесть, завтра попробую это сделать.

 

Предложение по поводу принять пакет - хорошее. только вот как и чем из-под винды его отправить?

попинговать какой-нибудь левый адрес, которого в сети нет. пойдут ARP-пакеты с MAC-ом сетевухи в Src и broadcast(FF:FF:FF:FF:FF:FF) в Dst полях. см. http://ru.wikipedia.org/wiki/ARP

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


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

ну не может же быть, что ему не нравится память, отведенная для хранения принятых данных on-chip вместо ddr как в примере.

вот думаю выложить sopc, вдруг что-то напутал:

post-44580-1259173826_thumb.jpg

 

Кстати, после отправки пакета проверяю некоторые регистры о том, как отправился пакет:

frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x068);//frame trans 2

frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x0F0);//octets trans 0

frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x08C);//ifOutErrors 0

frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x088);//ifInErrors 0

 

количество переданных пакетов - 2 все правильно - при формировании descriptor выставляю свойство start пакета.

расстраивает, что количество переданных октетов - 0

 

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

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

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


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

по поводу нулевых CRC и SRC-MAC есть мысль: похоже косяк в настройках, выключен режим CRC offload и включена замена MAC-адреса тем, что лежит в регистрах(а они, видимо, нулевые). выложите код инициализации. ну и raw_send до кучи. по поводу SOPC: я не стал делать отдельное ОЗУ для дескрипторов, а замапил все в одну кучу. логика такая: выигрыш, который дает размещение пакета в отдельной памяти в момент приема/передачи пакета нивелируется тем, что когда пакет принят и проц хочет в нем поковыряться, придется копировать данные в основное ОЗУ, чтобы не блокировать прием.

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


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

нашел ошибку - неправильно формируется дескриптор.

Проверяю через alt_avalon_sgdma_check_descriptor_status(desc) и выдает разные ошибки, теперь вот сижу пытаюсь сделать нормальный дескриптор.

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


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

нашел ошибку - неправильно формируется дескриптор.

Проверяю через alt_avalon_sgdma_check_descriptor_status(desc) и выдает разные ошибки, теперь вот сижу пытаюсь сделать нормальный дескриптор.

так это, код инициализации выкладывайте и raw_send, быстрее дело пойдет

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


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

вот что есть на данный момент:

alt_sgdma_descriptor *desc = (alt_sgdma_descriptor *) DESCRIPTOR_MEMORY_BASE;

alt_sgdma_descriptor *currdescriptor_ptr;

 

int tse_mac_raw_sendM(char * data, unsigned data_bytes)

{

unsigned int* ActualData;//pointer to the transmitting data

unsigned length = 128;

int tx_length;

char buf2[1560];

char *uncached_pkt = alt_remap_uncached ((volatile void*) pkt, 256);

char *uncached_buf2 = alt_remap_uncached ((volatile void*) buf2, 1560);

 

uncached_pkt[0]=0xCC;

uncached_pkt[1]=0xCC;

int k=0;

for(k=2;k<254;k++){

uncached_pkt[k]=0xA5;

}

uncached_pkt[254]=0xEE;

uncached_pkt[255]=0xEE;

 

int i=0;

for(i=0;i<length;i++) {

uncached_buf2 = uncached_pkt;

}

ActualData = (unsigned int*)buf2;

//-------------------

//clear bit-31 before passing it to SGDMA Driver

ActualData = (unsigned int*)alt_remap_cached ((volatile void*) ActualData, 256);

 

if( length > ALTERA_TSE_MIN_MTU_SIZE ) {

/* make sure there is room in the FIFO. */

alt_avalon_sgdma_construct_mem_to_stream_desc(

(alt_sgdma_descriptor *) desc, // descriptor I want to work with

(alt_sgdma_descriptor *) desc,// pointer to "next"

(alt_u32 *) ActualData, // starting read address

(length), // # bytes

1, // 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)

 

int desc_stat=1;

desc_stat = alt_avalon_sgdma_check_descriptor_status(desc);//if 0 then packet is good

 

desc->read_burst = 128;

desc->write_burst = 128;

tx_length = tse_mac_sTxWriteM(desc);

 

}

return 0;

}

 

desc_stat = 119

проверяет в контрольном регистре дескриптора Owned_by_HW и выдает

#define EINPROGRESS 119 /* Connection already in progress */

 

пока char * data, unsigned data_bytes не использую.

 

дальше беру функцию из tse:

alt_32 tse_mac_sTxWriteM(alt_sgdma_descriptor *txDesc)   
{ 
  alt_32 timeout;
  alt_u8 result = 0;
  alt_u16 actualBytesTransferred;
    
  // Make sure DMA controller is not busy from a former command
  // and TX is able to accept data
  timeout = 0;
  //tse_dprintf("\nWaiting while tx SGDMA is busy......... ");
  while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE/*mi->tx_sgdma->base*/) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ) {
           if(timeout++ == ALTERA_TSE_SGDMA_BUSY_TIME_OUT_CNT) {
            //tse_dprintf(4, "WARNING : TX SGDMA Timeout\n");
            return 0;//error//ENP_RESOURCE;  // avoid being stuck here
           }
  }

  // Set up the SGDMA
  // Clear the status and control bits of the SGDMA descriptor
  IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_TX_BASE/*mi->tx_sgdma->base*/, 0);
  IOWR_ALTERA_AVALON_SGDMA_STATUS (SGDMA_TX_BASE/*mi->tx_sgdma->base*/, 0xFF);
  
  // Start SGDMA (blocking call)
  [i]result = alt_avalon_sgdma_do_sync_transfer(sgdma_tx_dev/*mi->tx_sgdma*/, &txDesc[0]);[/i]
  
  alt_u32 sgdma_res = 0;  
  sgdma_res = IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_TX_BASE);
  
  /* perform cache save read to obtain actual bytes transferred for current sgdma descriptor */
  actualBytesTransferred = IORD_ALTERA_TSE_SGDMA_DESC_ACTUAL_BYTES_TRANSFERRED(&txDesc[0]);
  int frame_transmited=0;
    frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x068);//frame trans
//    frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x0F0);//octets trans
//    frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x08C);//ifOutErrors
//    frame_transmited = IORD_16DIRECT(TSE_MAC_BASE,0x088);//ifInErrors
  
  return actualBytesTransferred;
}

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

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


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

1. char buf2[1560]; - должен иметь квалификатор volatile, иначе компилятор может наоптимизировать, что без поллитры не разберешься.

2. почему 1, // don't read from constant address - в оригинале 0. по логике тоже д.б. 0

3.

desc->read_burst = 128;

desc->write_burst = 128;

это зачем?

4. char buf2[1560] надо сделать глобальной переменной, иначе неясно, что произойдет при выходе из raw_send(функция не дожидается окончания передачи пакета)

5. tse_mac_sTxWriteM(desc) - код не меняли? таймаут сколько стоит?

6. код инициализации MAC/PHY тоже выкладывайте.

7.

   sgdma_tx_dev = alt_avalon_sgdma_open("/dev/sgdma_tx");
   if(!sgdma_tx_dev) {
      dprintf("[triple_speed_ethernet_init] Error opening TX SGDMA\n");
      return ENP_RESOURCE;
   }

не забыли?

 

хотя по п.4 наврал, там синхронная передача вроде. но все равно, глобальная лучше для отладки.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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