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

📄 mac.txt

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 TXT
字号:
#######################################################
********有关MAC的寄存器地址****************************
parameter MAC_REG_BASE          = 32'h1f00_2000;

			/*
			 * MAC Controller
			 */                                             
			/* Data structure  for Tx BD */
 parameter BIT_MAC_TX_BD_READY    = 32'h0000_8000;     // Tx BD Ready
 parameter BIT_MAC_TX_BD_IRQ      = 32'h0000_4000;     // Tx BD IRQ Enable
 parameter BIT_MAC_TX_BD_WRAP     = 32'h0000_2000;    // Tx BD Wrap (last BD)
 parameter BIT_MAC_TX_BD_PAD      = 32'h0000_1000;     // Tx BD Pad Enable
 parameter BIT_MAC_TX_BD_CRC      = 32'h0000_0800;     // Tx BD CRC Enable
                                                      
 parameter BIT_MAC_TX_BD_UNDERRUN = 32'h0000_0100;     // Tx BD Underrun Status
 parameter BIT_MAC_TX_BD_RETRY    = 32'h0000_00F0;     // Tx BD Retry Status
 parameter BIT_MAC_TX_BD_RETLIM   = 32'h0000_0008;     // Tx BD Retransmission Limit Status
 parameter BIT_MAC_TX_BD_LATECOL  = 32'h0000_0004;     // Tx BD Late Collision Status
 parameter BIT_MAC_TX_BD_DEFER    = 32'h0000_0002;     // Tx BD Defer Status
 parameter BIT_MAC_TX_BD_CARRIER  = 32'h0000_0001;     // Tx BD Carrier Sense Lost Status
                                                      
/* Rx BD */                                           
 parameter BIT_MAC_RX_BD_EMPTY    = 32'h0000_8000;    // Rx BD Empty
 parameter BIT_MAC_RX_BD_IRQ      = 32'h0000_4000;    // Rx BD IRQ Enable
 parameter BIT_MAC_RX_BD_WRAP     = 32'h0000_2000;    // Rx BD Wrap (last BD)
                                                      
 parameter BIT_MAC_RX_BD_MISS     = 32'h0000_0080;     // Rx BD Miss Status
 parameter BIT_MAC_RX_BD_OVERRUN  = 32'h0000_0040;     // Rx BD Overrun Status
 parameter BIT_MAC_RX_BD_INVSIMB  = 32'h0000_0020;     // Rx BD Invalid Symbol Status
 parameter BIT_MAC_RX_BD_DRIBBLE  = 32'h0000_0010;     // Rx BD Dribble Nibble Status
 parameter BIT_MAC_RX_BD_TOOLONG  = 32'h0000_0008;     // Rx BD Too Long Status
 parameter BIT_MAC_RX_BD_SHORT    = 32'h0000_0004;     // Rx BD Too Short Frame Status
 parameter BIT_MAC_RX_BD_CRCERR   = 32'h0000_0002;     // Rx BD CRC Error Status
 parameter BIT_MAC_RX_BD_LATECOL  = 32'h0000_0001;     // Rx BD Late Collision Status
                                                 
// MAC Controller                                
parameter REG_MAC_MODER           = 32'h0000_0000;     // 0x00 
    parameter BIT_MAC_MODER_RXEN      = 32'h0000_0001; // Receive Enable
    parameter BIT_MAC_MODER_TXEN      = 32'h0000_0002; // Transmit Enable
    parameter BIT_MAC_MODER_NOPRE     = 32'h0000_0004; // No Preamble
    parameter BIT_MAC_MODER_BRO       = 32'h0000_0008; // Reject Broadcast
    parameter BIT_MAC_MODER_IAM       = 32'h0000_0010; // Use Individual Hash
    parameter BIT_MAC_MODER_PRO       = 32'h0000_0020; // Promiscuous (receive all)
    parameter BIT_MAC_MODER_IFG       = 32'h0000_0040; // Min. IFG not required
    parameter BIT_MAC_MODER_LOOPBCK   = 32'h0000_0080; // Loop Back
    parameter BIT_MAC_MODER_NOBCKOF   = 32'h0000_0100; // No Backoff
    parameter BIT_MAC_MODER_EXDFREN   = 32'h0000_0200; // Excess Defer
    parameter BIT_MAC_MODER_FULLD     = 32'h0000_0400; // Full Duplex
    parameter BIT_MAC_MODER_RST       = 32'h0000_0800; // Reset MAC
    parameter BIT_MAC_MODER_DLYCRCEN  = 32'h0000_1000; // Delayed CRC Enable
    parameter BIT_MAC_MODER_CRCEN     = 32'h0000_2000; // CRC Enable
    parameter BIT_MAC_MODER_HUGEN     = 32'h0000_4000; // Huge Enable
    parameter BIT_MAC_MODER_PAD       = 32'h0000_8000; // Pad Enable
    parameter BIT_MAC_MODER_RECSMALL  = 32'h0001_0000; // Receive Small
    parameter BIT_MAC_SOFT_RST        = 32'h0080_0000; // Soft reset for MAC
parameter REG_MAC_INT_SOURCE      = 32'h0000_0004;     // 0x04
    parameter BIT_MAC_INT_TXB         = 32'h0000_0001; // Transmit Buffer IRQ          
    parameter BIT_MAC_INT_TXE         = 32'h0000_0002; // Transmit Error IRQ           
    parameter BIT_MAC_INT_RXB         = 32'h0000_0004; // Receive Buffer IRQ           
    parameter BIT_MAC_INT_RXE         = 32'h0000_0008; // Receive Error IRQ            
    parameter BIT_MAC_INT_BUSY        = 32'h0000_0010; // Busy IRQ                    
    parameter BIT_MAC_INT_TXC         = 32'h0000_0020; // Transmit Control Frame IRQ   
    parameter BIT_MAC_INT_RXC         = 32'h0000_0040; // Received Control Frame IRQ        
parameter REG_MAC_INT_MASK        = 32'h0000_0008;     // 0x08 
    parameter BIT_MAC_INT_MASK_TXB    = 32'h0000_0001; // Transmit Buffer IRQ Mask 
    parameter BIT_MAC_INT_MASK_TXE    = 32'h0000_0002; // Transmit Error IRQ Mask 
    parameter BIT_MAC_INT_MASK_RXF    = 32'h0000_0004; // Receive Frame IRQ Mask 
    parameter BIT_MAC_INT_MASK_RXE    = 32'h0000_0008; // Receive Error IRQ Mask 
    parameter BIT_MAC_INT_MASK_BUSY   = 32'h0000_0010; // Busy IRQ Mask 
    parameter BIT_MAC_INT_MASK_TXC    = 32'h0000_0020; // Transmit Control Frame IRQ Mask 
    parameter BIT_MAC_INT_MASK_RXC    = 32'h0000_0040; // Received Control Frame IRQ Mask 
parameter REG_MAC_IPGT            = 32'h0000_000C;     // 0x0C 
parameter REG_MAC_IPGR1           = 32'h0000_0010;     // 0x10
parameter REG_MAC_IPGR2           = 32'h0000_0014;     // 0x14
parameter REG_MAC_PACKETLEN       = 32'h0000_0018;     // 0x18
parameter REG_MAC_COLLCONF        = 32'h0000_001C;     // 0x1C
parameter REG_MAC_TX_BD_NUM       = 32'h0000_0020;     // 0x20
parameter REG_MAC_CTRLMODER       = 32'h0000_0024;     // 0x24   
    parameter BIT_MAC_CTRLMODER_PASSALL= 32'h0000_0001;// Pass Control Frames 
    parameter BIT_MAC_CTRLMODER_RXFLOW= 32'h0000_0002; // Receive Control Flow Enable 
    parameter BIT_MAC_CTRLMODER_TXFLOW= 32'h0000_0004; // Transmit Control Flow Enable 
parameter REG_MAC_MIIMODER        = 32'h0000_0028;     // 0x28 
    parameter BIT_MAC_MIIMODER_CLKDIV = 32'h0000_00FF; // Clock Divider
    parameter BIT_MAC_MIIMODER_NOPRE  = 32'h0000_0100; // No Preamble
    parameter BIT_MAC_MIIMODER_RST    = 32'h0000_0200; // MIIM Reset 
parameter REG_MAC_MIICOMMAND      = 32'h0000_002C;     // 0x2C
    parameter BIT_MAC_MIICMD_SCANSTAT = 32'h0000_0001; // Scan Status 
    parameter BIT_MAC_MIICMD_RSTAT    = 32'h0000_0002; // Read Status 
    parameter BIT_MAC_MIICMD_WCTRLDATA= 32'h0000_0004; // Write Control Data 
parameter REG_MAC_MIIADDRESS      = 32'h0000_0030;     // 0x30    
    parameter BIT_MAC_MIIADDRESS_FIAD = 32'h0000_001F; // PHY Address 
    parameter BIT_MAC_MIIADDRESS_RGAD = 32'h0000_1F00; // RGAD Address
parameter REG_MAC_MIITX_DATA      = 32'h0000_0034;     // 0x34
parameter REG_MAC_MIIRX_DATA      = 32'h0000_0038;     // 0x38
parameter REG_MAC_MIISTATUS       = 32'h0000_003C;     // 0x3C
    parameter BIT_MAC_MIISTAT_LINKFAIL=32'h0000_0001;  // Link Fail bit
    parameter BIT_MAC_MIISTAT_BUSY    =32'h0000_0002;  // MII Busy bit 
    parameter BIT_MAC_MIISTAT_NVALID  =32'h0000_0004;  // Data in MII Status Register is invalid bit 
parameter REG_MAC_ADDR0           = 32'h0000_0040;     // 0x40
parameter REG_MAC_ADDR1           = 32'h0000_0044;     // 0x44
parameter REG_MAC_HASH0           = 32'h0000_0048;     // 0x48
parameter REG_MAC_HASH1           = 32'h0000_004C;     // 0x4C
parameter REG_MAC_TX_CTRL         = 32'h0000_0050;     // 0x50    
    parameter BIT_MAC_TX_CTRL_PAUSERQ = 32'h0001_0000; // Send PAUSE request
parameter REG_MAC_BD_BASE         = 32'h0000_0400;     // 0x400


########################################################
********有关MAC的存储区地址*****************************
(原仿真环境的相关值)
parameter SD_MAC_TX_BASE        = 20'h5_0000;   发送缓冲区起始地址
parameter SD_MAC_TX_SIZE        = 20'h0_8000;   发送缓冲区总长度
parameter SD_MAC_RX_BASE        = 20'h5_8000;   接收缓冲区起始地址
parameter SD_MAC_RX_SIZE        = 20'h0_8000;   接收缓冲区总长度

########################################################
测试常量
parameter TOTAL_BD_NUM          = 128;            //
parameter MAC_ADDRESS_HI        = 32'h0000_AA02;
parameter MAC_ADDRESS_LO        = 32'h0304_0506;

parameter MIN_FL                = 64;
parameter MAX_FL                = 1518;
########################################################

操作流程:

1.寄存器初始化


寄存器                    复位值                      初始化值                初始化说明
REG_MAC_MODER             0000A000                    0000A400                全双工,低两位发送接受时控制
REG_MAC_INT_MASK          00000000                    0000007F                所有的中断屏蔽位打开
REG_MAC_IPGT              00000012                    00000015                半双工建议为12H,全双工建议为15H
REG_MAC_PACKETLEN         00400600                    不需初始化
REG_MAC_COLLCONF          000F003F                    不需初始化
REG_MAC_TX_BD_NUM         00000040                    不需初始化
REG_MAC_CTRLMODER         00000000                    00000007                允许发送控制帧、接受帧,且存入内存
REG_MAC_ADDR0             00000000                    03040506
REG_MAC_ADDR1             00000000                    0000AA02                设置MAC地址0605040302AA


最后,再将发送、接收使能:REG_MAC_MODER低2bit置11;

2.LoobBack测试
   初始化REG_MAC_MODER寄存器为0000A480;
   在发送缓冲区构造一发送帧:设置设置MAC地址0605040302AA,数据字节递增,记录长度;
   构造发送TxBD、RxBD,并填入MAC的RAM中(TxBD Ready置1便发送、RxBD Ready 置1便准备接收);   
   等待发送完成;
   发送完成后(中断服务程序执行),读取TxBD,显示发送结果状态,并比较发送缓冲区和接收缓冲区中的数据;
   

3.发送数据帧
   在发送缓冲区中构造发送数据帧:设置好接收方的MAC地址,构造数据;
   构造发送TxBD,启动发送
   等待中断服务程序;
   读取TxBD,获取发送状态。

4.发送控制帧
   启动发送:将REG_MAC_TX_CTRL寄存器Bit16 置1,Bit[15:0]置0040(可随意);
   等待中断服务程序;

5.接收数据帧
   接收前(可以在初始化中)设置好RxBD并填入MAC内部RAM中;
   等待接收中断服务程序;
   读取RxBD获取接收状态,比较接收数据。

6.中断服务程序
   若MAC发出中断,读取REG_MAC_INT_SOURCE寄存器,获取中断类型;
   若是TXB中断(Bit[0]): 正确发送数据帧,唤醒等待发送完成的进程
   若是TXE中断(Bit[1]):发送数据帧出错,唤醒等待发送完成的进程
   若是RXB中断(Bit[2]):正确接收数据帧,唤醒等待接收完成的进程
   若是RXE中断(Bit[3]):接收数据帧出错,唤醒等待接收完成的进程
   若是TXC中断(Bit[4]):发送完控制帧,  唤醒等待发送控制帧完成的进程
   若是RXC中断(Bit[5]):接收完数据帧,  唤醒等待接收完成的进程
   
   清中断,向REG_MAC_INT_SOURCE寄存器写入读取的状态值。
   
7.总程序流程

main()
{

   InitializeRegister();
   
   填入RxBD;//准备接收
   
   LoopBackTest(){
    
     SendOneNormalFrame();
     WaitForTxInt();
     ReadRxFrame();
     CompareData();
   }
   
   SendOneNormalFrame();
   WaitForTxInt();
      
   SendOneHugeFrame();
   WaitForTxInt();
   
   SendOneSmallFrame();
   Delay1s;
   
   
   //接收测试
   WaitForRxInt();
   ReadRxNormalFrame();
     
   
}

   
#######################################################################################
如有任何问题表述不清楚,尽管找我.


⌨️ 快捷键说明

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