⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.c

📁 关于DM9161E在SEP4020上的应用
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************** 
 * $Workfile:   mac.c  $ 
 * $Revision: 1.1.1.1 $ 
 * $Author:      asic $ 
 * $Date: 2008/06/23 $ 
 * 
 * Project:     EPOS-Nucleus-Net
 * 
 * Description: 
 *     mac driver   
 *
 * Revision History: 
 * 
 *********************************************************************** 
 * 
 *  Copyright (c) 2008 ASIC
 * 
 *  All rights reserved 
 * 
 **********************************************************************/

#include "ostype.h"
#include "mac.h"
#include "net/inc/externs.h"
//#include "hardware_reg.h"  
#include "hardware_intc.h"  
#include "sep4020.h"
#include "NUCLEUS.H"
#include "target.h"
#include "mem_defs.h"
//#include "uart_defs.h"
#include "DM9161AE.h"
#include "def.h"

extern UINT8   NETI_MAC_Address[1][6];
#define DEBUG 0
#define DEBUG2 1
#define debug_phy_loopback 0
#define debug_mac_loopback 0
#define TIMER_LOAD_VAL 0xffffffff

#define IP_ALEN  4              /* number of bytes in an IP address */
#define ETH_ALEN 6              /* number of bytes in an ETHERNET address */
#define TOK_ALEN 6              /* number of bytes in a Token Ring address */
#define LL_ALEN  6              /* number of bytes in a Link Layer address */
                                /* (token ring or ethernet)   */
#define ETHERSIZE  1514   /* maximum number of bytes in ETHERNET packet */
                          /* (used by ethernet drivers)   */
#if 0                         
struct _ether 
{
    UINT8 eth_dest[ETH_ALEN];    /* where the packet is going  */
    UINT8 eth_source[ETH_ALEN];  /* who it came from           */
    UINT16 eth_type;              /* Ethernet packet type for 802.3 */
                                /* or length of (IP layer + LLC,SNAP) if 802.2   */
};
#endif

#define HW_Address_Size     6     /* Length of Ethernet Addresses           */
#define TYPE_LENGTH         2     /* Length of Header Type/Length Field     */  
#define MTU_Size            1500  /* MAX Transmission Unit, excluding media */
                                  /*  header length for ethernet            */

/* Ethernet header size:  dest addr, source addr, Type/Length               */
#define ETH_HeaderSize      ((HW_Address_Size * 2) + TYPE_LENGTH)

static UINT32 timestamp;    //计时变量
static UINT32 lastdec;
UINT32 time_count;         //计数时间值
UINT16 delay_time_flage;   //计数标志位
UINT32 dis_address;        //回显地址

UINT32 Tx_count;           //发送描述符的索引号
UINT32 Rx_count;           //接收描述符的索引号
NU_HISR  Mac_Xmit;
NU_HISR  Mac_Rcv;
//#define  MAC_TXRAM    0x30200000
//#define  MAC_RXRAM    0x30220000
#define  Max_Frame_Len 1536
CHAR    TEMP_BUF_T[2000];
CHAR    TEMP_BUF_R[2000];
int     Hisr_Activated;
//volatile UINT32 et_data_ptr;
//volatile UINT32 et_data_len;
#if DEBUG
UINT32 debug_receive[64];
UINT32 debug_send[64];
UINT32 debug_rxdress[64];
#endif
//int      Hisr_Activated = 0;
VOID Mac_TxHisr();
VOID Mac_RxHisr();
STATUS Mac_Transmit(DV_DEVICE_ENTRY *dev, NET_BUFFER *buf_ptr);
STATUS Mac_Receive();
STATUS Mac_Ioctl(DV_DEVICE_ENTRY *dev, INT option, DV_REQ *d_req);


#define MAC_ISR_TXB		0x00000001
#define MAC_ISR_TXE		0x00000002
#define MAC_ISR_RXB 	0x00000004
#define MAC_ISR_RXE		0x00000008
#define MAC_ISR_BUSY	0x00000010
#define MAC_ISR_TXC 	0x00000020
#define MAC_ISR_RXC		0x00000040

#define NEW_WAIT 1

#define DISPLAY_ERROR   0   /* display error during interrupt */
#define DEBUG_RING      0
#define DEBUG_NIC       1


/* ********************************************************************   */
#define ETHER_MIN_LEN   64                  /* includes header */
#define CRC_LEN         4
#define ETHER_MAX_LEN   (ETHERSIZE+CRC_LEN)       /* includes header */


#define EROUND  ((sizeof(struct _ether) + 3) & ~3)
#define EOFF    (EROUND - sizeof(struct _ether))

//NE2000_SOFTC KS_FAR ne2000softc[1];
extern KS_CONSTANT UINT8 KS_FAR test_pattern[32];

//该程序是为发送数据造一个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
	i = 0;
	// set random mac address
	//for(i=0;i<6;i++)p[i] = 0xFF;   				//broadcast address
	p[i++]=0x00;
	p[i++]=0x16;
	p[i++]=0xd3;
	p[i++]=0x46;
	p[i++]=0x68;
	p[i++]=0xfe;
	for(i=6;i<12;i++)p[i] = 0x0E;  				//source address
	// set packet length
	*(RP16)(p + 12) = len-14;
    
	for(i=14;i<len;i++)
	 {
	  p[i] = 0xaa;
	  count1++;
	 }
	 
	for(i=0;i<len;i++)
	{
	    *(RP8)(MAC_TXRAM+i)=*point++;//test[i];
	}
}
*/
UINT32 get_timer_masked()
{
	UINT32 now = read_reg(TIMER_T2CCR);

	if (lastdec >= now) {
		/* normal mode */
		timestamp += lastdec - now;
	} else {
		/* we have an overflow ... */
		timestamp += lastdec + TIMER_LOAD_VAL - now;
	}
	lastdec = now;

	return timestamp;
}

void Timer2_init(void)
{
	write_reg(TIMER_T2LCR, TIMER_LOAD_VAL);
	write_reg(TIMER_T2CR, 0x16);
	*(RP)(TIMER_T2CR) |= 0x01;
	lastdec = TIMER_LOAD_VAL;
	timestamp = 0;
}

UINT32 get_timer (UINT32 base)
{
	return get_timer_masked () - base;
}


void reset_timer_masked (void)
{
	/* reset time */
	lastdec = TIMER_T2CCR;
	timestamp = 0;
}

STATUS Mac_Initialize(DV_DEVICE_ENTRY *dev_ptr)
{

	STATUS 	status;
	UINT32  Tx_BD_Num;
	UINT32 i,j;
	UINT16 Phy_BMCR;
//#if debug_phy_loopback
	UINT16 New_Phy_BMCR;
//#endif
	UINT32 Mac_CTLR;
	UINT32 Mac_CTLR_READ;
	UINT32 Adress;
	VOID 	*pointer;
	/*设备初始化,初始化设备结构中相应的指针*/
	/* Fill in the device table */
    dev_ptr->dev_output     = NET_Ether_Send;   /* net.c */
    dev_ptr->dev_input      = NET_Ether_Input;  /* net.c */
    dev_ptr->dev_start      = Mac_Transmit;
    dev_ptr->dev_receive    = Mac_Receive;
    dev_ptr->dev_addrlen    = HW_Address_Size;
    dev_ptr->dev_hdrlen     = ETH_HeaderSize;
    dev_ptr->dev_mtu        = MTU_Size;         /* 1500 */
    dev_ptr->dev_ioctl      = Mac_Ioctl;
    
    dis_address = 0x04000000;
    Tx_count = 0;
    Rx_count = 0;
    Hisr_Activated = 0;
	/*设置MAC地址,参考8019*/
	/* Allow reception of broadcast and multicast packets. */
    dev_ptr->dev_flags |= (DV_BROADCAST | DV_MULTICAST);

    /* CAM filter setting is done in api_MacHWInit routine */
    memcpy(dev_ptr->dev_mac_addr, (UINT8*)dev_ptr->dev_driver_options, 6);
    *(RP)MAC_ADDR1 = (UINT32)NETI_MAC_Address[0][0]<<8|(UINT32)NETI_MAC_Address[0][1];
    *(RP)MAC_ADDR0 = (UINT32)NETI_MAC_Address[0][2]<<24|(UINT32)NETI_MAC_Address[0][3]<<16|(UINT32)NETI_MAC_Address[0][4]<<8|(UINT32)NETI_MAC_Address[0][5];
	/*打开中断屏蔽位*/
	
	*(RP)INTC_IMR |= (0x01<<INT_MAC);
	
	/*使能MAC内部中断*/
	write_reg(MAC_INTMASK, 0x00);
	
	/*初始化接收发送描述符*/
	Tx_BD_Num = read_reg(MAC_TXBD_NUM);
	//write_reg(MAC_TXBD_NUM,0x1);
	for(i=0;i<Tx_BD_Num;i++)
    {
	  write_reg((MAC_BD+i*8), 0x00);
	  write_reg((MAC_BD+i*8+4), 0x00);
	}		
	
	for(i=0;i<128-Tx_BD_Num;i++)
    {
	  write_reg(((MAC_BD+Tx_BD_Num*8)+i*8), 0x00);
	  write_reg(((MAC_BD+Tx_BD_Num*8)+i*8+4), 0x00);
	}
	
	for(i=0;i<128-Tx_BD_Num;i++)
    {
	  if (i == ((128-Tx_BD_Num) - 1))
		  	write_reg(((MAC_BD+Tx_BD_Num*8)+ i*8), 0xe000);
	  	else
		  	write_reg(((MAC_BD+Tx_BD_Num*8)+ i*8), 0xc000);
	#if DEBUG
	for( j=0;j<64;j++)                     //调试
	{
	   Adress = MAC_BD+Tx_BD_Num*8+ j*8;
	  debug_receive[j] = read_reg(Adress);
	  }
	 #endif
	}
	
	//分配64个发送和64个接收描述符的内存缓冲区
	for(i = 0; i < 128-Tx_BD_Num;i++)
	{
	  	
      if(NU_Allocate_Memory (&System_Memory, (VOID **)&pointer,
                          Max_Frame_Len, NU_NO_SUSPEND)!=NU_SUCCESS)
      {
      	while(1);
      }
      write_reg(((MAC_BD+Tx_BD_Num*8)+ i*8 + 4),(U32)pointer);
       Adress = read_reg((MAC_BD+Tx_BD_Num*8)+ i*8 + 4); 	
      #if DEBUG
	for( j=0;j<64;j++)                     //调试
	{
	  Adress = MAC_BD+Tx_BD_Num*8+ j*8 +4;
	  debug_rxdress[j] = read_reg(Adress);
	  }
	 #endif	
    }

	for(i = 0;i < Tx_BD_Num; i++)
	{
		if(NU_Allocate_Memory (&System_Memory, (VOID **)&pointer,
                          Max_Frame_Len, NU_NO_SUSPEND)!=NU_SUCCESS)
	      {
	      	while(1);
	      }
	      write_reg(((MAC_BD + 4) + i*8),(U32)pointer );			
    } 
    
	//清除MAC_CTLR寄存器
	write_reg(MAC_CTRL, 0x0000);
	Mac_CTLR = 0x00;
	/*初始化PHY,并通过PHY的状态自适应获得的状态来设置MAC*/
	
	status = NetNIC_PhyInit();
/*#if debug_phy_loopback
#else
	if(status != NET_PHY_ERR_NONE)
	{
	//PHY link down
		return status;
	}
#endif	*/
/*	Phy_BMCR = NetNIC_PhyRegRd(PHY_ADDR, DM9161AE_BMCR);
	
	if(Phy_BMCR & 0x2000)
		Mac_CTLR |= 0x0800;
	else Mac_CTLR &= ~0x0800;
	
	if(Phy_BMCR & 0x0100)
		Mac_CTLR |= 0x0400;
	else Mac_CTLR &= ~0x0400;*/
#if debug_phy_loopback
	Phy_BMCR |= 0x4100;
	Phy_BMCR &= ~0x3000;
	NetNIC_PhyRegWr(PHY_ADDR, DM9161AE_BMCR, Phy_BMCR);
	New_Phy_BMCR = NetNIC_PhyRegRd(PHY_ADDR, DM9161AE_BMCR);
	if(New_Phy_BMCR != Phy_BMCR)
		return -1;
#else 
    Phy_BMCR = 0x0100;
	Phy_BMCR &= ~0x3000;
	NetNIC_PhyRegWr(PHY_ADDR, DM9161AE_BMCR, Phy_BMCR);
	New_Phy_BMCR = NetNIC_PhyRegRd(PHY_ADDR, DM9161AE_BMCR);
	if(New_Phy_BMCR != Phy_BMCR)
		return -1;
#endif
//status = NetNIC_PhyAutoNeg();


#if debug_mac_loopback
	Mac_CTLR = 0xaaa3;
	//Mac_CTLR = 0xaea7;
#else
	//Mac_CTLR |= 0xa02b;
	Mac_CTLR = 0xa803;
	Mac_CTLR &= ~0x0800;
#endif
	/*配置MAC控制寄存器*/
	write_reg(MAC_CTRL, Mac_CTLR);
	Mac_CTLR_READ = read_reg(MAC_CTRL);
	
	//打开中断
	
	*(RP)INTC_IMR &= ~(0x01<<INT_MAC);
	write_reg(MAC_INTMASK, 0x7f);
	/*创建发送和接收数据HSR*/
	/* Create the HISR for receiving packets from the MAC */
    status = NU_Allocate_Memory (&System_Memory,
                                 &pointer,
                                 2000,
                                 NU_NO_SUSPEND);
    if (status != NU_SUCCESS)
    {
        return (-2);
    }

    status = NU_Create_HISR (&Mac_Rcv, "MAC_RX_HISR",
                             Mac_RxHisr,
                             0, pointer, 2000);
   
    if (status != NU_SUCCESS)
    {
        return (-3);
    }

    /* Create the HISR for transmitting packets */
    status = NU_Allocate_Memory (&System_Memory,
                                 &pointer,
                                 2000,
                                 NU_NO_SUSPEND);
    if (status != NU_SUCCESS)
    {
        return (-4);
    }

    status = NU_Create_HISR (&Mac_Xmit, "MAC_TX_HISR",
                              Mac_TxHisr,
                              0, pointer, 2000);
    if (status != NU_SUCCESS)
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -