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

📄 rtl8019as_net509tag.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			//page 3 ,8019特有,没有模拟
			printf("Page 3 hasn't been simulated.");
			return -1;
		
		}      		/*	if( (addr == ISR_ADDRESS) || (addr==IMR_ADDRESS) )				{		  		}		*/		 return 1;
	}



  
	void nic8019::write_cr(Core::s8 data)
	{

		if( (rtl8019_net.cr&CR_START) == CR_START)
		{//清除网卡中断
			rtl8019_net.isr &= ~(ISR_RST);
		}
	        //DBG_PRINT("+++++++++++++++++++++WRITE_CR\n");
		rtl8019_net.cr = data;//		//printf("write cr:%x\n",data);
		if( ((rtl8019_net.cr & CR_SEND) == CR_SEND) && !(rtl8019_net.cr&CR_FINISH))
		{// 把数据从网络芯片读到虚拟机
		
             // DBG_PRINT("+++++++++++++++++++++CR_SEND\n");
			if(rtl8019_net.rbcr1 == 0x0f)//硬件规定(CR_SEND特有),由驱动写入
			{
				rtl8019_net.rsar0 = 0;
				rtl8019_net.rsar1 = rtl8019_net.bnry;

				start_page = rtl8019_net.bnry - 0x40;
				//attention 这里可能有错,需要进一步的验证
				read_total_count = (((Core::u8)rtl8019_net.nic_ram[start_page*PAGE_SIZE+3]<<8)\
					|rtl8019_net.nic_ram[start_page*PAGE_SIZE+2])+4;//4 is 8019as header size
		
				rtl8019_net.rbcr0 = (Core::u8)(read_total_count&0x0ff);//注意是网络序 big-endian
				rtl8019_net.rbcr1 = (Core::u8)(read_total_count>>8)&0xff;

				read_total_page = (read_total_count + PAGE_SIZE-1)>>8;//一共要读取几页
				read_offset = 0;				page_to_read = 0;
			}#ifdef DE_BUG               printf("+++++++write_cr.CR_SEND, start_page:0x%x\t\					  read_total_count:0x%x\n",start_page,read_total_count);               printf("+++++++write_cr.CR_SEND,read_total_page:0x%x\n"\				   ,read_total_page);#endif               return;// attention please!!,maybe wrong
		}
	

		if( ((rtl8019_net.cr & CR_REMOTE_W) == CR_REMOTE_W) && !(rtl8019_net.cr&CR_FINISH))
		{  //从虚拟机到网络芯片
		
			start_page = rtl8019_net.rsar1;
			write_total_count = rtl8019_net.rbcr0 + (((Core::s32)rtl8019_net.rbcr1)<<8);              			//WUKONG_STDOUT("write_cr.CR_REMOTE_W,start_page:0x"<<std::hex<<start_page\
			//	<<"\twrite_total_count:0x"<<std::hex<<write_total_count);
			//printf("\n");

			if( write_total_count> (6*PAGE_SIZE))
			{
				printf("In write_cr,写入的数据个数大于缓冲区");
			}
			write_offset = 0;            return;// attention please!!,maybe wrong
		}

		if( (rtl8019_net.cr & CR_TXP) == CR_TXP)
		{//从网络芯片写入以太网
		
			rtl8019_net.tpsr = rtl8019_net.rsar1;//高8位起始地址正好是页号
			rtl8019_net.tbcr0 = rtl8019_net.rbcr0;
			rtl8019_net.tbcr1 = rtl8019_net.rbcr1;
			//printf("write_cr,tpsr:0x%x  write_total_count:0x%x",rtl8019_net.tpsr,\			//	write_total_count);
			//must be deleted under windows
			tuntap_output(  );

			rtl8019_net.isr = ISR_PTX;
			if( (rtl8019_net.imr&IMR_PTX) == IMR_PTX)
			{//机器中断由board设置,attention
				//nic_state |= 1;
				//printf("\nISR_PTX,传输完毕\n");
			  //state->io.intsr |= NETCARDINT;
              //  armulator_update_int( );
			}

		}       
	}

	static Core::s32 read_after_receive=1;
	Core::s8 nic8019::read_from_rtl8019()
	{
	//DBG_PRINT("read_from_rtl8019 hasn't been completed!\n");
	//	return -1;

		Core::s32 data;
		//DBG_PRINT("read_from_rtl8019 hasn't been completed!\n");
		if( (rtl8019_net.cr&CR_SEND) == CR_SEND)		
		{//remote read (command send)                			if( read_after_receive)			{				//printf("++++++++++read_from_rtl8019++++++");				read_after_receive=0;			}
			if( rtl8019_net.bnry == rtl8019_net.curr)
			{
				//DBG_PRINT("read_from_rtl8019.01\n");				//WUKONG_STDOUT("The receive buffer is empty!bnry:0x"\				//	<<std::hex<<rtl8019_net.bnry<<"curr:0x"<<std::hex<<rtl8019_net.curr);				printf("The receive buffer is empty!bnry:0x%x\tbnry:0x%x\n"\					,rtl8019_net.bnry,rtl8019_net.curr);			    exit(-1);
				data = -1;
			}

			/*	if(read_offset>=read_total_count)
			{
				DBG_PRINT("");
				
			}
			*/

			//映射关系,必须减去0x40
			data = rtl8019_net.nic_ram[(rtl8019_net.bnry - 0x40)*PAGE_SIZE+read_offset];
			read_offset++;
          //  printf("%-8x",data);           // if( read_offset %6 ==0)          //  {			//	printf("\n");           // }                
			if( (read_offset%PAGE_SIZE)==0 || (read_offset + page_to_read*PAGE_SIZE)==read_total_count)
			{
				rtl8019_net.bnry = (rtl8019_net.bnry+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)\							+rtl8019_net.pstart;
				read_offset = 0;
				page_to_read++; 
			}
			//
			if( page_to_read == read_total_page)
			{//remote read (command send)

				rtl8019_net.cr |=CR_FINISH;
				rtl8019_net.cr &=(~CR_SEND);

				//if( (read_offset%PAGE_SIZE)!=0)
				//{
				//	rtl8019_net.bnry = (rtl8019_net.bnry+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)\				//				+rtl8019_net.pstart;
				//}
				rtl8019_net.isr |= ISR_RDC;//remote DMAsend command
				if( (rtl8019_net.imr & IMR_RDC))
				{//中断由board设置,attention
				//	state->io.intsr |= NETCARDINT;
                //    armulator_update_int( );				//	WUKONG_STDOUT("read_form_rtl8019,CR_SEND OVER.intsr:0x"<<std::hex\
				//		<<state->io.intsr);
					//nic_state |= 1;
					//printf("read_from_rtl8019,ISR_RDC");
				}				//DBG_PRINT("\nfffffCR_SEND OVER.imr:0x%x\n",rtl8019_net.imr & IMR_RDC);
#ifdef DE_BUG
	printf("Page start:0x%x\tstop:0x%x\tcurr:0x%x\tbnry:0x%x\n",\						   rtl8019_net.pstart,rtl8019_net.pstop,\						   rtl8019_net.curr,rtl8019_net.bnry);
#endif
			}
		
		 
		}

		return data;

	}


	Core::s32 nic8019::tuntap_input( )
	{
		Core::s32 tuntap_packet_count = 0;
		Core::s32 rtl8019as_packet_count = 0;
		Core::u8 buffer[6*PAGE_SIZE]={0,};
		Core::s32 rtl8019as_write_count=0;        Core::s32 buffer_count = 0;        Core::s32 i = 0;
	

			if( (rtl8019_net.cr & CR_STOP) == CR_STOP)
			{
				printf("cr:%x\n",rtl8019_net.cr);
				printf("tuntap_input,nic is stop\n");
				return -1;
			}

			//attention
//			tuntap_packet_count = read(tuntap_fd, &buffer[4], sizeof(buffer));
			// was replaced by next statement
			tuntap_packet_count = recv_from_ethernet( &buffer[4], sizeof(buffer));

			rtl8019as_packet_count = tuntap_packet_count + 4;		  //DBG_PRINT("rtl8019as_packet_count:%d\n",rtl8019as_packet_count);		  //for( i = 0; i< tuntap_packet_count ; i++)		  // {			//printf("%d   ",buffer[4+i]);		    //      if( (i%12==0) && i!=0)		     //        printf("\n");		  //}

			if(rtl8019as_packet_count > (6*PAGE_SIZE))
			{
				printf("tuntap_input, the packet received is more than 0x%d bytes\n",6*PAGE_SIZE);
				return -1;
			}

			if( (buffer[4]==(Core::u8)0x0ff) && (buffer[5]==(Core::u8)0x0ff) && (buffer[6]==(Core::u8)0x0ff)\			    &&  (buffer[7]==(Core::u8)0x0ff) && (buffer[8]==(Core::u8)0x0ff) && (buffer[9]==(Core::u8)0x0ff))
			{//判断是否是广播
			//DBG_PRINT("tuntap_input,multi-broadcast address.\n");
			}
			else if((buffer[4]!=0x00) || (buffer[5]!=0x01) || (buffer[6]!=0x02) || (buffer[7]!=0x03)\
				||(buffer[8]!=0x04) || (buffer[9]!=0x05))
			{//检查mac地址是否匹配
				printf("tuntap_input, mac address isn't match\n");
				for(int k=0;k<tuntap_packet_count;k++)
				printf("%8x",buffer[k+4]);
				return -1;
			}

			//8019as 特有的4个字节的头
			buffer[0] = 80;//用来指明是8019
			buffer[1] = 19;
			buffer[2] = (Core::u8)(tuntap_packet_count&0x00ff);
			buffer[3] = (Core::u8)((tuntap_packet_count>>8)&0x0ff);//big-endian#ifdef DE_BUG           			for( i = 0; i< tuntap_packet_count+4 ; i++)			{				printf("%-8x",buffer[i]);				if( (i%11==0) && i!=0)                   printf("\n");			 }
#endif

			rtl8019as_write_count = 0;			buffer_count = 0;  

			


			while (rtl8019as_packet_count--)
			{
				//				//DBG_PRINT("pstart:0x%x\t bnry:0x%x\n curr:0x%x\t pstop:0x%x\n\n",\                 //                rtl8019_net.pstart, rtl8019_net.bnry, rtl8019_net.curr, rtl8019_net.pstop);
				if( ((rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart)==rtl8019_net.bnry)
				{//判断缓冲区是否溢出
					//WUKONG_STDOUT("The receive buffer overflow.rtl8019_net.isr=0x"\					//	<<std::hex<<rtl8019_net.isr<<"rtl8019_net.imr=0x"\					//	<<std::hex<<rtl8019_net.imr);					printf("The receive buffer overflow.start:0x%x\						   \tstop:0x%x\tcurr:0x%x\tbnry:0x%x\n",\						   rtl8019_net.pstart,rtl8019_net.pstop,\						   rtl8019_net.curr,rtl8019_net.bnry);					printf("rtl8019as_packet_count:0x%x\n",rtl8019as_packet_count);					exit(1);                     //   state->io.intsr |= NETCARDINT;                      //  armulator_update_int(state);                      //  DBG_PRINT("state->io.intsr=0x%x\n",state->io.intsr);
				rtl8019_net.isr |= (ISR_OVW | ISR_RST);//具体要看驱动的处理,两者应该有区别
				if((rtl8019_net.imr & IMR_OVW) || (rtl8019_net.imr & IMR_RST))
				{ //机器中断由board设置,attention
				   nic_state |= 1;
				//	state->io.intsr |= NETCARDINT;
				//    armulator_update_int( );
				}
				//rtl8019_net.isr |= ISR_PRX;
				//if((rtl8019_net.imr & IMR_PRX) == IMR_PRX)
				//{
				//	state->io.intsr |= NETCARDINT;
		        //	armulator_update_int(state);
				//}
				return -1;
			}

			//                // printf("buffer:%x\t",buffer[buffer_count++]);
			rtl8019_net.nic_ram[(rtl8019_net.curr-0x40)*PAGE_SIZE+rtl8019as_write_count]=buffer[buffer_count++];			//if( buffer_count % 6 == 0 )			//	printf("\n");               
			rtl8019as_write_count++;

			if( (rtl8019as_write_count%PAGE_SIZE) == 0)
			{
				rtl8019_net.curr = (rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart;
				rtl8019as_write_count = 0;
			}		

		}

		//DBG_PRINT("curr:0x%x\n",rtl8019_net.curr);
		if( (rtl8019as_write_count%PAGE_SIZE) != 0)
		{//
			rtl8019_net.curr = (rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart;
	
		}

		//printf("\n after start:0x%x\		//				   \tstop:0x%x\tcurr:0x%x\tbnry:0x%x\n",\		//				   rtl8019_net.pstart,rtl8019_net.pstop,\		//				   rtl8019_net.curr,rtl8019_net.bnry);		//			printf("rtl8019as_packet_count:0x%x\n",rtl8019as_packet_count);
			   //DBG_PRINT("curr:0x%x\n",rtl8019_net.curr);
		//          		     //DBG_PRINT("ISR=0x%x, IMR=0x%x\n\n",rtl8019_net.isr,rtl8019_net.imr);
		rtl8019_net.isr |= ISR_PRX;
		if((rtl8019_net.imr & IMR_PRX) == IMR_PRX)
		{//机器中断由board设置,attention

			nic_state |= 1; 
			//state->io.intsr |= NETCARDINT;
        	//armulator_update_int( );			//WUKONG_STDOUT("this is imr:0x"<<std::hex<<rtl8019_net.imr);		//	printf("\nISR_PRX,接收完毕\n");                //DBG_PRINT("intsr=0x%x, intmr=0x%x\n",state->io.intsr , state->io.intmr);                //DBG_PRINT("fiq=0x%x, irq=0x%x\n",state->NfiqSig, state->NirqSig);
		}
	        read_after_receive = 1;		//printf("tuntap_input ,bnry:0x%x,curr:0x%x",rtl8019_net.bnry,rtl8019_net.curr);
		return 1;

	}

	Core::s32 nic8019::tuntap_output( )
	{// write_cr CR_TXP

		Core::s32 packet_len;
		Core::s32 acture_len;        Core::s32 i,p;

		if( (rtl8019_net.cr&CR_STOP) )
		{
			printf("In tuntap_output,网卡处于停止状态\n");
			return -1;
		}


		 packet_len = rtl8019_net.tbcr0 + (((Core::s32)rtl8019_net.tbcr1<<8));
		 //attention
//		 acture_len = write( tuntap_fd,&rtl8019_net.nic_ram[(rtl8019_net.tpsr - 0x40)*PAGE_SIZE],packet_len);		 //was replaced by net statement#ifdef DE_BUG		  p = 0;         printf("in tuntap_output:\n");         for(i = 0; i<write_total_count; i++)		{			printf("%-8x",rtl8019_net.nic_ram[(rtl8019_net.tpsr-0x40)*PAGE_SIZE+i]);            if(++p == 6)		    {				printf("\n"); 				p = 0;			}		}#endif		 acture_len = write_to_ethernet( &rtl8019_net.nic_ram[(rtl8019_net.tpsr - 0x40)*PAGE_SIZE],packet_len);				//printf("\nacture_len:%d\t packet_len:%d\n",acture_len,packet_len);

⌨️ 快捷键说明

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