?? mac.c
字號:
/***********************************************************************
* $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 + -