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