#include <stdio.h>
#include "HA_typedef.h"
#include "hardware.h"
#include "intc.h"
#include "hardware_reg.h"
#define BDNUM_RX 1
#define BDNUM_TX 1
#define MAC_TXRAM 0x30020000
#define MAC_RXRAM 0x30020800
#define RX_LENG 200 //4的整数倍
#define TX_LENG 200
//////////////////////////display functin//////////////////////////////
//parameter
#define RECORD_ADD 0x07fffff0
#define FAULT 0xffffffff
#define MANUAL_RESET 0x00000011
#define SEC_ONE_START 0x00001111
#define SEC_ONE_END 0x000011ff
#define SEC_TWO_START 0x00002222
#define SEC_TWO_END 0x000022ff
#define SEC_THREE_START 0x00003333
#define SEC_THREE_END 0x000033ff
#define SEC_FOUR_START 0x00004444
#define SEC_FOUR_SE 0x00004455
#define SEC_FOUR_PP 0x00004466
#define SEC_FOUR_END 0x000044ff
#define SEC_FIVE_START 0x00005555
#define SEC_FIVE_END 0x000055ff
#define SEC_SIX_START 0x00006666
#define TX_EMPTY_INTC 0x00006601
#define RX_UNDERFLOW_INTC 0x00006602
#define RX_OVERFLOW_INTC 0x00006603
#define RX_FULL_INTC 0x00006604
#define SEC_SIX_END 0x000066ff
#define FINISH 0x0000ffff
U32 a[30];
U32 c[25];
U32 temp1,temp2;
U32 count;
char test[]={0x00, 0x17, 0x31, 0x17, 0x9B, 0xD2, 0x00, 0x12
, 0x7F , 0x03 , 0x51 , 0x3F , 0x08 , 0x00 , 0x45 , 0x00
, 0x00 , 0xA2 , 0x13 , 0x7D , 0x00 , 0x00 , 0x3B , 0x11
, 0xFE , 0x2A , 0x3A , 0xC0 , 0x70 , 0x26 , 0xAC , 0x11
, 0x16 , 0xAC , 0x06 , 0xA5 , 0x06 , 0xA5 , 0x00 , 0x8E
, 0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x01 , 0x00 , 0x01
, 0xFF , 0x03 , 0x00 , 0x21 , 0x45 , 0x00 , 0x00 , 0x7C
, 0x00 , 0x00 , 0x40 , 0x00 , 0x33 , 0x11 , 0xB3 , 0xFB
, 0xDB , 0x85 , 0x3C , 0x1D , 0x79 , 0xF8 , 0x01 , 0xDB
, 0x1F , 0x40 , 0x0F , 0xA1 , 0x00 , 0x68 , 0xE5 , 0x32
, 0x02 , 0x01 , 0x00 , 0x00 , 0x17 , 0x60 , 0x08 , 0x5F
, 0xE9 , 0xA2 , 0x26 , 0xF5 , 0x1A , 0xC5 , 0xE7 , 0x1E
, 0xAD , 0xC4 , 0xFF , 0x4F , 0x0E , 0x32 , 0x05 , 0x78
, 0x92 , 0x40 , 0x36 , 0xF5 , 0xC5 , 0xEA , 0xC6 , 0xEA
, 0x9D , 0xE4 , 0xC3 , 0xB5 , 0xBA , 0x0B , 0xCB , 0x18
, 0x87 , 0x8D , 0xE6 , 0x2F , 0x7A , 0x94 , 0x60 , 0xBE
, 0xBC , 0x93 , 0x5E , 0x51 , 0x6A , 0x54 , 0x2F , 0xBC
, 0x5B , 0x99 , 0x57 , 0x13 , 0x7E , 0x55 , 0x86 , 0xFE
, 0xDA , 0x03 , 0xC0 , 0xE0 , 0xCA , 0x6A , 0x39 , 0xB4
, 0x46 , 0xC7 , 0x7B , 0xDD , 0x9E , 0xD0 , 0x52 , 0xF2
, 0xF8 , 0x96 , 0xF8 , 0x28 , 0x00 , 0x33 , 0x41 , 0xF9
, 0x80 , 0x36 , 0x0C , 0x50 , 0x66 , 0xE6 , 0xF6 , 0x03
};
//**********************************************//
//该程序是为发送数据造一个MAC帧 前面6个字节为目的帧的MAC地址 后六个字节为发送MAC的地址 接着为数据
void packet_creat(U32 len)
{
U32 i;
/**/ U32 count1=0;
U8 *point;
U8 *p = (U8 *)malloc(sizeof(char)*len); //SET A NEW MEMERY ROOM
point=p;
if(p == NULL) exit(1);
memset(p,0x00,sizeof(char)*len); //INITIAL THE DEFAULT VALUE
// set random mac address
//for(i=0;i<6;i++)p[i] = 0xFF; //broadcast address
p[i++]=0x00;
p[i++]=0x17;
p[i++]=0x31;
p[i++]=0x17;
p[i++]=0x9B;
p[i++]=0xD2;
for(i=6;i<12;i++)p[i] = 0x05; //source address
// set packet length
*(RP16)(p + 12) = len-14;
for(i=14;i<len;i++)
{
p[i] = 0xaa;
count1++;
}
for(i=0;i<0xb0;i++)
{
*(RP8)(MAC_TXRAM+i)=*point++;//test[i];
}
}
void phy_reset()
{
write_reg(MAC_MIIADDRESS, 0x00);
write_reg(MAC_MIITXDATA, 0x8000);
write_reg(MAC_MIICMD, 0x04);
}
void phy_hard_reset( int mii_hard_rst)
{
if (mii_hard_rst == 1)
{
*(RP)GPIO_PORTH_SEL |= 0X0040;
*(RP)GPIO_PORTH_DATA |= 0X0040;
*(RP)GPIO_PORTH_DIR &= (~0X0040);
}
else
{
*(RP)GPIO_PORTH_SEL |= 0X0040;
*(RP)GPIO_PORTH_DATA &= (~0X0040);
*(RP)GPIO_PORTH_DIR &= (~0X0040);
}
}
void mii_reg_read()
{
int i,j;
U32 temp;
for(i=0;i<25;i++)
{
write_reg(MAC_MIIADDRESS, (i<<8) | 0x1f);
//temp = read_reg(MAC_MIIADDRESS);
//if(temp != i<<8) break;
write_reg(MAC_MIICMD, 0x02);
for(j=0;j<100000;j++);
c[i] = read_reg(MAC_MIIRXDATA);
}
}
void mac_reset_read()
{
int i=0;
memset(a, 0xff,120);
if((a[i++] = read_reg(MAC_CTRL)) != 0x0000a000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_INTSRC) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_INTMASK) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_IPGT) )!= 0x00000012) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_IPGR1) )!= 0x0000000c) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_IPGR2) )!= 0x00000012) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_PACKETLEN) )!= 0x00400600) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_COLLCONF) )!= 0x000F003F) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_TXBD_NUM) )!= 0x00000040) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_FLOWCTRL) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIICTRL) )!= 0x00000064) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIICMD) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIIADDRESS))!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIITXDATA) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIIRXDATA) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_MIISTATUS) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_ADDR0) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_ADDR1) )!= 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_HASH0) ) != 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_HASH1) ) != 0x00000000) write_reg(RECORD_ADD,FAULT);
if((a[i++] = read_reg(MAC_TXPAUSE)) != 0x00000000) write_reg(RECORD_ADD,FAULT);
/**/
}
// 本程序主要完成了MAC内部的回环操作 首先造MAC帧 然后对发送描述符和接收描述符清零
// 接着配置发送描述符和接收描述符
//最后配置MAC控制寄存器设置回环模式
void mac_selfloop_back()
{
U32 i,j;
U32 check=0xe000;
U32 b[25];
packet_creat(200);
write_reg(MAC_PACKETLEN, 0x400600);
write_reg(MAC_CTRL, 0xaaa3);
for(j=0;j<0x100000;j++);
for(i=0;i<BDNUM_TX;i++)
{
write_reg((MAC_BD+i*8), 0x00);
write_reg((MAC_BD+i*8+4), 0x00);
}
for(i=0;i<BDNUM_RX;i++)
{
write_reg(((MAC_BD+64*8)+i*8), 0x00);
write_reg(((MAC_BD+64*8)+i*8+4), 0x00);
}
*(RP)MAC_ADDR0 = 0x0E0E0E0E;
*(RP)MAC_ADDR1 = 0x0E0E0E0E;
write_reg(MAC_INTMASK, 0x7f); //open all mac int
for(i = 0; i < BDNUM_RX;i++)
{
write_reg(((MAC_BD+64*8)+ i*8 + 4),(MAC_RXRAM+i*RX_LENG));
}
for(i = 0;i < BDNUM_TX; i++)
{
write_reg(((MAC_BD + 4) + i*8),(MAC_TXRAM + i*TX_LENG) );
}
for(i = 0; i < BDNUM_RX;i++)
{
if (i == BDNUM_RX - 1)
write_reg(((MAC_BD+64*8)+ i*8), 0xe000);
else
write_reg(((MAC_BD+64*8)+ i*8), 0xc000);
}
for(i = 0;i < BDNUM_TX; i++)
{
if(i == BDNUM_TX - 1)
{
write_reg((MAC_BD + i*8), 0x00c8f800); //64
}
else
{
write_reg((MAC_BD + i*8), 0x00c8d800); //200
}
}
while(1)
{
for(j=0;j<0x100000;j++);
temp2 = *(RP)(MAC_BD+8*64);
if(!(temp2 & 0x8000)) break;
}
while(1);
}
//***************** delay *****************//
//*****************************************//
void delay (U32 j)
{
U32 i;
for (i=0;i<j;i++)
{};
}
//************** write MII reg ***