AnsweredAssumed Answered

MCF5485 FEC DMA

Question asked by Alexey Minkov on Oct 7, 2014
Good afternoon. Not working FEC + DMA.

 

FEC works and FEC + DMA does not.

Below the listing. Can someone tell me what I did wrong?


void init_eth (void)

{

    int i;

    //Конфигурация Ethernet

 

    *((unsigned long*)0x80009024) = 0x00000001;            // Сброс

    *((unsigned long*)0x80009008) = 0x00000000;            // Запретить прерывания

    *((unsigned long*)0x80009004) = 0xffffffff;            // Очистить регистр прерываний

    *((unsigned long*)0x80009144) = 0x00000008;            // Кол-во байт после которого начнется передача //576

    *((unsigned long*)0x80009118) = 0x00000000;            // Индивидуальный адрес назначения старшие разряды

    *((unsigned long*)0x8000911c) = 0x00000000;            // Индивидуальный адрес назначения младшие разряды

    *((unsigned long*)0x80009120) = 0xffffffff;            // Групповой адрес назначения старшие разряды

    *((unsigned long*)0x80009124) = 0xffffffff;            // Групповой адрес назначения младшие разряды

    *((unsigned long*)0x800090e4) = 0x12345678;            // Физический адрес назначения старшие разряды

    *((unsigned long*)0x800090e8) = 0x9abc8808;            // Физический адрес назначения младшие разряды

    *((unsigned long*)0x80009084) = 0x05ee000C;            // Нормальный режим, MII_MODE=1, PROM=1, max frame lengght=1518

    *((unsigned long*)0x800090c4) = 0x00000004;            // Полный дуплекс

    *((unsigned long*)0x80009064) = 0xc0000000;            // MIB logic выкл.

 

    for(i=0x80009200; i<=0x80009278; i+=4)   

    {

        *((unsigned long*)i)=0x00000000;   

    }

   

    for(i=0x80009280; i<=0x800092e4; i+=4)   

    {

        *((unsigned long*)i)=0x00000000;   

    }

 

    *((unsigned long*)0x80009064) = 0x00000000;            // MIB logic вкл.

 

    *((unsigned long*)0x800091c4) = 0x03000000;            // Reset FIFO

    *((unsigned long*)0x800091c4) = 0x00000000;

                

    *((unsigned long*)0x800091ac) = 0x09340000;            // TX: Frame Mode Enable, UF MASK, TXW MASK

    *((unsigned long*)0x8000918c) = 0x09140000;            // RX: Frame Mode Enable, RXW MASK, UF MASK, TXW MASK

    *((unsigned long*)0x800091c8) = 0x02000000;            // CRC enable

    *((unsigned long*)0x80009198) = 0x00000300;            // Размер FIFO 768

    *((unsigned long*)0x800091b8) = 0x00000200;            // Размер FIFO 512    ;

 

 

 

    *((unsigned long*)0x80009044) = 0x000000b0;            // Настройка частоты MII 2.5 МГц

 

    *((unsigned long*)0x80009040) = 0x509201E1;            // MII R 0x4: Разрешить 100Mbps full-duplex, 100Mbps half-duplex,10Mbps full-duplex, 10Mbps half-duplex, поддержка IEEE 802.3

    *((unsigned long*)0x80009040) = 0x50822100;            // MII R 0x0: Нормальный режим, Вкл.100Mbps, full-duplex

 

    *((unsigned long*)0x80009024) = 0x00000002;            // Разрешить работу TX, RX

}

 

#pragma define_section data_rx1d ".data_rx1d"

__declspec(data_rx1d)

 

s8    data_rx1[2][1536];

 

#pragma define_section data_tx1d ".data_tx1d"

__declspec(data_tx1d)

 

s8    data_tx1[2][1536];

 

#pragma define_section rx_desc ".rx_desc"

__declspec(rx_desc)

 

MCD_FEC_BD   desc_rx1[2];

 

#pragma define_section tx_desc ".tx_desc"

__declspec(tx_desc)

 

MCD_FEC_BD   desc_tx1[2];

 

 

      //Инициализация буферов в dpram и дескрипторов на выдачу

      for(i=0; i<2; ++i)

      {

           for(j=0; j<1536; ++j)

         {

            data_rx1[i][j]=0;

            data_tx1[i][j]=0;

         }

      }

  //Инициализация буферов и дескрипторов на прием в sysram

    for(i=0; i<2; ++i) ///8

    {

        desc_tx1[i].length=1536;

        desc_tx1[i].statCtrl=MCD_FEC_END_FRAME;

        desc_tx1[i].dataPointer=(u32)&data_tx1[i][0];

  

        desc_rx1[i].length=1536;

        desc_rx1[i].statCtrl=MCD_FEC_BUF_READY;

        desc_rx1[i].dataPointer=(u32)&data_rx1[i][0];

    }

   

     desc_rx1[1].statCtrl |= MCD_FEC_WRAP;

     

    desc_tx1[1].statCtrl |= MCD_FEC_WRAP;   

   

    //формирование пакетов на выдачу

    for(i=0; i<2; ++i)

    {

 

        for(j=0; j<1536; ++j)

        {

            data_tx1[i][j] =(s8)j; //буфер на выдачу

        }

    }

 

 

    init_eth ();

      

     //Инициализация контроллера DMA

     res = MCD_initDma ((dmaRegs*)(MBAR_BASE + MMAP_DMA), (void*)(MBAR_BASE + MMAP_SRAM), (MCD_RELOC_TASKS));

    

 

   

     desc_tx1[0].statCtrl |= MCD_FEC_BUF_READY|MCD_FEC_END_FRAME;

    

    res=MCD_dmaStatus(0xc);                                                /*res == 6!!!*/

    if((res==MCD_DONE)||(res==MCD_NO_DMA))

    {        

          res=MCD_startDma(0xc, (s8*)&desc_tx1[0], 0, (s8*)ADR_FECTFDR_0, 0, 1536, 0, DMA_FEC0_TX, 6, MCD_FECTX_DMA|MCD_TT_FLAGS_SP|MCD_TT_FLAGS_CW|MCD_TT_FLAGS_RL, 0|MCD_NO_CSUM|MCD_NO_BYTE_SWAP);

    }

 

Outcomes