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