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

📄 rtl8019as_net509tag.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "rtl8019as_net.h"
#include "iostream"



#define LINE_LEN 16
//end

Core::s32 tuntap_fd;
//#define DE_BUG
//
//#ifdef DE_BUG
//#define  WUKONG_STDOUT(x) do { std::cout<<x<<std::endl;} while(0)
//#else 
//#define WUKONG_STDOUT(x)
//#endif


namespace DEVICE
{
	DWORD  WINAPI rcv_packet(void * dummy);
	volatile Core::s32  nic_state;
	volatile Core::u32  recv_flag=0;
	u_char *pkt_data;


	nic8019::nic8019()
	{
		
		rtl8019_reset();
	}


	void nic8019::rtl8019_reset()
	{
		rtl8019_net.par[0] = 0;
		rtl8019_net.par[1] = 0x01;
		rtl8019_net.par[2] = 0x02;
		rtl8019_net.par[3] = 0x03;
		rtl8019_net.par[4] = 0x04;
		rtl8019_net.par[5] = 0x05;

		//DBG_PRINT("++++reset+++++\n");
		//结束或完成DMA
		rtl8019_net.cr = 0x21;

		//PSTART,PSTOP:网络芯片接收数据缓冲区的起始和终止页号。形成一个接收缓冲环。
		//没页256字节
		//CURR:接收缓冲环写页指针,初始化=PSTART
		//BNRY:接收缓冲环读页执政,初始化=PSTART
    
		rtl8019_net.bnry = 0x0;
		rtl8019_net.curr = 0x0;
		rtl8019_net.pstart = 0x0;
		rtl8019_net.pstop = 0x0;

	    // TPSR:网络芯片要发送的数据在网络芯片RAM中的其实页号 ,
		//TBCR0,1要发送数据的长度
		//CR:向控制寄存器发CR_TXP,即开始传输数据
		rtl8019_net.tpsr = 0x0;//0x40
		rtl8019_net.tbcr0 = 0;
		rtl8019_net.tbcr1 = 0;

		//RBCR0,1 读写数据长度  RSAR0,1 网络芯片中的起始地址
		//CR:发出开始读/写命令 CR_REMOTE_R CR_REMOTE_W
		rtl8019_net.rbcr0 = 0;
		rtl8019_net.rbcr1 = 0;
		rtl8019_net.rsar0 = 0;
		rtl8019_net.rsar1 = 0;

		//配置寄存器
		
		rtl8019_net.rcr = 0x0;//这些数值跟驱动程序有关,但模拟网卡用这些值的话将打打增加复杂度和工作量
		rtl8019_net.tcr = 0x00;
		rtl8019_net.dcr = 0x48;//FIFO的选择,普通模式接收,字节传输,看spec需要进一步改进
	
		rtl8019_net.imr = 0xff;//全部开放中断		rtl8019_net.isr = 0x40;//无远程DMA,可能要置0

		nic_state = 0;        //无中断
	
	}


	Core::s8 nic8019::rtl8019_read(Core::u32 addr)
	{
		 /*DBG_PRINT("++++++rtl8019_read address is : %h++++++\n",addr);*/
		Core::s32 ret_value;

		ret_value = -1;

	
        if( (rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_ZERO )
		{
			// page 0 :读寄存器,只模拟了部分的寄存器
			//DBG_PRINT("Page 0 hasn't been simulated.\n");
			//return -1;
			switch( addr)
			{
			case CR_ADDRESS:
				ret_value = rtl8019_net.cr;
				break;
			
			case ISR_ADDRESS:
				ret_value = rtl8019_net.isr;				//DBG_PRINT("rtl8019_net.isr=0x%x\n",ret_value);                        //DBG_PRINT("+++++++++++++++rtl8019_net.isr=0x%x\n\n",rtl8019_net.isr);
				break;
			
			case BNRY_ADDRESS:
				ret_value = rtl8019_net.bnry;				//DBG_PRINT("rtl8019_net.bnry=0x%x\n",ret_value);
				break;

			case DATA_ADDRESS://从网卡读取数据到虚拟机
				ret_value = read_from_rtl8019( );
				break;

			default:
				//attention 在驱动222行有错误,想reset端口读数据

				//WUKONG_STDOUT("The register you want in Page 0 can't read, address:0x"<<std::hex<<addr);
				return -1;
				break;
			}            

		}
		else if( (rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_ONE)
		{// 读取 page1的寄存器
		
			switch(addr) 
			{
			case CR_ADDRESS:
				ret_value = rtl8019_net.cr;
				break;
		
			case PAR0_ADDRESS:case PAR1_ADDRESS: case PAR2_ADDRESS:
			case PAR3_ADDRESS:case PAR4_ADDRESS: case PAR5_ADDRESS:
				{
					static int init=1;
					Core::u32 threadrid;

					ret_value = rtl8019_net.par[ ((addr & 0x000000ff)>>2) -1];
                         
					if(init)
					{
						init = 0;
						CreateThread(NULL,0,rcv_packet,NULL,0 ,&threadrid);
						send_init();
					}

				}
				break;
		
			case CURR_ADDRESS:
				ret_value = rtl8019_net.curr;
				break;

			case MAR0_ADDRESS:case MAR1_ADDRESS: case MAR2_ADDRESS:case MAR3_ADDRESS:
			case MAR4_ADDRESS:case MAR5_ADDRESS: case MAR6_ADDRESS:case MAR7_ADDRESS:
				ret_value = rtl8019_net.mar[((addr & 0x000000ff) - 0x20)>>2]  ;
				break;

			case DATA_ADDRESS://从芯片到虚拟机
				ret_value = read_from_rtl8019( );
				break;
			
			default:
				printf("Error address,in rtl8019_read,page1.address: 0x%x\n",addr);
				break;
		
			}

		}
		else if ((rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_TWO)
		{//读取 page 2 的寄存器
			switch( addr) 
			{
		
			case CR_ADDRESS:
				ret_value = rtl8019_net.cr;
				break;

			case PSTART_ADDRESS:
				ret_value = rtl8019_net.pstart;
				break;

			case PSTOP_ADDRESS:
				ret_value = rtl8019_net.pstop;
				break;

			case TPSR_ADDRESS:
				ret_value = rtl8019_net.tpsr;			    break;
			
			case RCR_ADDRESS:
				ret_value = rtl8019_net.rcr;
				break;

			case TCR_ADDRESS:
				ret_value = rtl8019_net.tcr;
				break;

			case DCR_ADDRESS:
				ret_value = rtl8019_net.dcr;
				break;

			case IMR_ADDRESS:
				ret_value = rtl8019_net.imr;                        //DBG_PRINT("rtl8019_net.imr=0x%x\n",ret_value);
				break;			case DATA_ADDRESS://从芯片到虚拟机
				ret_value = read_from_rtl8019( );
				break;

			default:
				printf("Error address,in rtl8019_read,page2.address: 0x%x\
					   \t cr is: 0x%x",addr,rtl8019_net.cr);
				ret_value = -1;
				break;

			}

		}
		else if ((rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_THREE)
		{
			//读取page 3 的寄存器
			printf("Page 3 hasn't been simulated.\n");
			ret_value = -1;
		
		}
		/*DBG_PRINT("++++++rtl8019_read address is : 0x%x data is: 0x%x++++++\n",addr,ret_value);*/
		return ret_value;
	}





	Core::s8 nic8019::rtl8019_write(Core::u32 addr, Core::s8 data)
	{
		/* Core::s32 ret_value;*/

		/*ret_value = 1;*/
		/*printf("++++++rtl8019_write address is : %x,data:%x++++++\n",addr,data);*/	//	if( CR_ADDRESS ==addr)		//	printf("rtl8019 cr:%x\n",data);	
		if( (rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_ZERO )
		{
			//page 0 可写寄存器(部分)
			switch( addr ) 
			{
			case CR_ADDRESS:
				/*rtl8019_net.cr = (u8)data;*/
				write_cr(data);
				break;
			
			case PSTART_ADDRESS :
				rtl8019_net.pstart = data;
				break;

			case PSTOP_ADDRESS:
				rtl8019_net.pstop = data;
				break;
			
			case BNRY_ADDRESS:
				rtl8019_net.bnry = data;
				break;

			case TPSR_ADDRESS:
				rtl8019_net.tpsr = data;
				break;

			case TBCR0_ADDRESS:
				rtl8019_net.tbcr0 = data;
				break;

			case TBCR1_ADDRESS:
				rtl8019_net.tbcr1 = data;
				break;			case ISR_ADDRESS:
				rtl8019_net.isr = data;				if(data ==0 )					nic_state = 0;				if ( rtl8019_net.isr == (Core::u8)0xff){rtl8019_net.isr = 0x40;}						//printf("write......rtl8019_net.isr=0x%x\n",data);//attetion
				break;			case RSAR0_ADDRESS:
				rtl8019_net.rsar0 = data;
				break;			case RSAR1_ADDRESS:
				rtl8019_net.rsar1 = data;
				break;			case RBCR0_ADDRESS :
				rtl8019_net.rbcr0 = data;
				break;			case RBCR1_ADDRESS :
				rtl8019_net.rbcr1 = data;
				break;

			case RCR_ADDRESS:
				rtl8019_net.rcr = data;
				break;

			case TCR_ADDRESS:
				rtl8019_net.tcr = data;
				break;

			case DCR_ADDRESS:
				rtl8019_net.dcr = data;
				break;

			case IMR_ADDRESS:
				rtl8019_net.imr = data;                rtl8019_net.imr |= IMR_RDC;//because of the nic driver attention				//printf("+++++++++++++++write......rtl8019_net.imr=0x%x\n",rtl8019_net.imr);
			break;			case DATA_ADDRESS://从虚拟机到网络芯片
				write_to_rtl8019(data);
				break;

			case RESET_ADDRESS:
				rtl8019_reset();
				break;

			default:
				printf("Error address,in rtl8019_write, page 0.address: 0x%x\n",addr);
				return -1;
				break;
			}
		}
		else if( (rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_ONE)
		{
			// page 1 可写寄存器
			switch(addr) {
			case CR_ADDRESS:
				/*rtl8019_net.cr = data;*/
				write_cr(data );
				break;
		
			case PAR0_ADDRESS:case PAR1_ADDRESS: case PAR2_ADDRESS:
			case PAR3_ADDRESS:case PAR4_ADDRESS: case PAR5_ADDRESS:
				rtl8019_net.par[ ((addr && 0x000000ff)>>2) -1] = data ;
				break;
		
			case CURR_ADDRESS:
				rtl8019_net.curr = data;
				break;

			case MAR0_ADDRESS:case MAR1_ADDRESS: case MAR2_ADDRESS:case MAR3_ADDRESS:
			case MAR4_ADDRESS:case MAR5_ADDRESS: case MAR6_ADDRESS:case MAR7_ADDRESS:
				rtl8019_net.mar[((addr && 0x000000ff)>>2) -1] =data;
				break;

			case RESET_ADDRESS:
				rtl8019_reset();
				break;

			case DATA_ADDRESS://从虚拟机到网络芯片
				write_to_rtl8019(data);
				break;                

			default:
				printf("Error address,in rtl8019_write, page 1.address: 0x%x\n",addr);				return -1;
				break;
		
			}
		}
		else if ((rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_TWO)
		{
			/*page 2 read only*/
			/*DBG_PRINT("rtl8019as page 2 register is read only. address: 0x%x cr is: 0x%x\n", addr,rtl8019_net.cr);*/			switch( addr ) {
			case CR_ADDRESS:
				/*rtl8019_net.cr = (u8)data;*/
				write_cr(data );
				break;
			case DATA_ADDRESS://虚拟机到网络芯片
				write_to_rtl8019(data);
				break;          			default:				printf("The register you want to write in page 2 is read only.\							  address: 0x%x\tcr is: 0x%x\n",addr,rtl8019_net.cr);                return -1;				break;                       			}
		
		}
		else if ((rtl8019_net.cr & CR_PAGE_NUM) == CR_PAGE_THREE)

⌨️ 快捷键说明

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