📄 rtl8019as_net509tag.cpp
字号:
#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 + -