📄 ne2000monic.cpp
字号:
/* 掆巭偡傞崰傑偱懸偮 */ //ne_wait_func(0); // 僷働僢僩偑儊儌儕偵彂偐傟側偄傛偆偵偡傞 outp8( NE_P0_RCR, NE_RCR_MON ); // 儚乕僪暆揮憲丄儖乕僾僶僢僋儌乕僪 outp8( NE_P0_DCR, NE_DCR_WTS + NE_DCR_FT1 + NE_DCR_LS ); // 庴怣僶僢僼傽奐巒傾僪儗僗 // 64 outp8( NE_P0_PSTART, NE_MEM_START ); // 庴怣僶僢僼傽廔椆傾僪儗僗 // 128 outp8( NE_P0_PSTOP, NE_MEM_END ); // 儊儌儕僥僗僩僷僞乕儞彂偒崬傒 ne_pio_writemem( (byte *)ne_test_pattern, NE_MEM_START * NE_PAGE_SIZE, ne_sizeof_test_pattern ); // 儊儌儕僥僗僩僷僞乕儞撉傒崬傒 ne_pio_readmem( NE_MEM_START * NE_PAGE_SIZE, ne_test_buffer, ne_sizeof_test_pattern ); // 僥僗僩僷僞乕儞偺斾妑 if( ne_bcompare( (byte *)ne_test_pattern, ne_test_buffer, ne_sizeof_test_pattern )!=0 ) return(1); // 晄堦抳側傜廔椆 // EEPROM 僨乕僞撉傒偩偟 ne_pio_readmem( 0, ne_test_buffer, 16 ); // 僀乕僒僱僢僩傾僪儗僗庢摼 for(i=0;i<11;i+=2) ether_mac_addr[i/2]=ne_test_buffer[i]; // 妱傝崬傒僗僥乕僞僗儗僕僗僞僋儕傾 outp8( NE_P0_ISR, 0xff ); return(0);}/*! \brief nic_init NE2000弶婜壔儖乕僠儞 \param void \return void \author Yamami \date create:2004/07/28 update:$Date: 2004/10/31 14:29:43 $*/void Ne2000MoNic::nic_init(void){ // 奺曄悢偺弶婜壔 int i; byte c; //NIC儕僙僢僩 c = inp8(NE_ASIC_RESET); outp8(NE_ASIC_RESET, c); //儕僙僢僩姰椆傑偱懸偮 sleep(300); // 儕儌乕僩DMA 掆巭 outp8( NE_P0_COMMAND, ne_cr_proto | NE_CR_STP ); // FIFO 僗儗僢僔儑儖僪 8Byte,儕儌乕僩DMA 帺摦弶婜壔嬛巭 // 8086 僶僀僩僆乕僟,16bit暆 DMA 揮憲 // Page0_0Eh DATA CONFIGURATION REGISTER (DCR) 0EH (WRITE) // 7 6 5 4 3 2 1 0 // - FT1 FT0 ARM LS LAS BOS WTS // 0 1 0 0 1 0 0 1 outp8( NE_P0_DCR, NE_DCR_FT1 + NE_DCR_WTS + NE_DCR_LS ); // 儕儌乕僩DMA 僶僀僩僇僂儞僞僋儕傾 outp8( NE_P0_RBCR0, 0 ); outp8( NE_P0_RBCR1, 0 ); // 儌僯僞儌乕僪 // (僷働僢僩庴怣張棟傪偍偙側偆偑丄僶僢僼傽儕儞僌偼偟側偄) // RECEIVE CONFIGURATION REGISTER (RCR) 0CH (WRITE) outp8( NE_P0_RCR, NE_RCR_MON ); // 撪晹儖乕僾僶僢僋儌乕僪 // TRANSMIT CONFIGURATION REGISTER (TCR) 0DH (WRITE) outp8( NE_P0_TCR, NE_TCR_LB0 ); // 憲怣儕儞僌僶僢僼傽奐巒傾僪儗僗偺愝掕 // 64 outp8( NE_P0_TPSR, NE_TX_PAGE_START ); // 庴怣儕儞僌僶僢僼傽奐巒傾僪儗僗偺愝掕 // 70 outp8( NE_P0_PSTART, NE_RX_PAGE_START ); // 庴怣儕儞僌僶僢僼傽嫬奅傾僪儗僗偺愝掕 // 70 outp8( NE_P0_BNRY, NE_RX_PAGE_START ); // 庴怣儕儞僌僶僢僼傽廔椆傾僪儗僗偺愝掕 // 128 outp8( NE_P0_PSTOP, NE_RX_PAGE_STOP ); // 妱傝崬傒僗僥乕僞僗儗僕僗僞偺僋儕傾 outp8( NE_P0_ISR, 0xff ); // 妱傝崬傒嫋壜忦審偺愝掕 // Packet recieve successful outp8( NE_P0_IMR, NE_IMR_PRXE ); //Yamami 慡妱傝崬傒傪嫋壜偟偰傒傞 //outp8( NE_P0_IMR, 0x7F ); // Page 1 偺愝掕 outp8( NE_P0_COMMAND, ne_cr_proto | ( NE_CR_PS1 + NE_CR_STP ) ); // Ethernet 傾僪儗僗偺愝掕 // 偙偙偱巜掕偟偨傾僪儗僗偺僷働僢僩傪庴偗庢傞 for(i=0;i<6;i++){ outp8( NE_P1_PAR0 + i, ether_mac_addr[i] ); } // 嵟弶偵庴怣偟偨僷働僢僩傪奿擺偡傞傾僪儗僗偺愝掕 outp8( NE_P1_CURR, NE_RX_PAGE_START + 1 ); /* 儅儖僠僉儍僗僩儗僕僗僞偺愝掕 */ outp8( NE_P1_MAR0, 0 ); outp8( NE_P1_MAR0+1, 0 ); outp8( NE_P1_MAR0+2, 0 ); outp8( NE_P1_MAR0+3, 0 ); outp8( NE_P1_MAR0+4, 0 ); outp8( NE_P1_MAR0+5, 0 ); outp8( NE_P1_MAR0+6, 0 ); outp8( NE_P1_MAR0+7, 0 ); // Page 0 偵傕偳偡 outp8( NE_P0_COMMAND, ne_cr_proto | NE_CR_STP ); // 庴怣僷働僢僩僼傿儖僞偺愝掕 // 僽儘乕僪僉儍僗僩偲帺暘埗偺傒傪儊儌儕偵奿擺 // accept broadcast outp8( NE_P0_RCR, NE_RCR_AB );// 仾 傪僐儊儞僩傾僂僩偡傞偲// Yamami儌僯僞儌乕僪偺傑傑偲偟偰傒傞!!!!! 帠偵側傞 //Yamami 僾儘儈僗僉儍僗僩偺傒庴偗庢傞傛偆偵偟偰傒傞???? 堘偆傛偆偩 //outp8( NE_P0_RCR, NE_RCR_APROMIS ); // NIC 傪傾僋僥傿僽偵偡傞 outp8( NE_P0_COMMAND, ne_cr_proto | NE_CR_STA ); // 儖乕僾僶僢僋儌乕僪傪敳偗偰捠忢摦嶌儌乕僪偵擖傞 outp8( NE_P0_TCR, 0 );}/*! \brief ne_pio_writemem 旕岞奐儖乕僠儞 Ne2000 僶僢僼傽儊儌儕彂偒崬傒 \param byte *src [in] 揮憲尦傾僪儗僗 \param dword dest [in] 揮憲愭傾僪儗僗 \param dword size [in] 挿偝 \return void \author Yamami \date create:2004/08/02 update:$Date: 2004/10/31 14:29:43 $*/void Ne2000MoNic::ne_pio_writemem( byte *src, dword dest, dword size ){ dword i; word writetmp; /* 僗僥乕僞僗儗僕僗僞僋儕傾 */ outp8( NE_P0_COMMAND, NE_CR_RD2 + NE_CR_STA ); outp8( NE_P0_ISR, NE_ISR_RDC); /* 挿偝 */ outp8( NE_P0_RBCR0, size & 0xff ); outp8( NE_P0_RBCR1, size >> 8 ); /* 揮憲愭傾僪儗僗 */ outp8( NE_P0_RSAR0, dest & 0xff ); outp8( NE_P0_RSAR1, dest >> 8 ); outp8( NE_P0_COMMAND, NE_CR_RD1 + NE_CR_STA );// for(i=0;i<size;i+=2){// outp8( PIO_ADATA, *(src+1) );// outp8( NE_ASIC_DATA, *src );// src+=2;// } // 2004/08/02 DATA偼16價僢僩暆偱傗傝偲傝偡傞偺偱丄Word曄姺偟偰I/O for(i = 0 ; i < size ; i+=2 , src+=2){ //writetmp = (word)(*(src) << 8) + (word)*(src+1); //儕僩儖僄儞僨傿傾儞側傜偙偆丠丠 writetmp = (word)(*(src + 1) << 8) + (word)*(src); outp16( NE_ASIC_DATA, writetmp ); } /* wait */ for(i=0;i<0xff;i++){ if( ( inp8(NE_P0_ISR) & NE_ISR_RDC ) == 0 ) break; }}/*! \brief ne_pio_readmem 旕岞奐儖乕僠儞 NE2000 偺儊儌儕偐傜撉傒偩偟 \param dword src [in] 揮憲尦傾僪儗僗 \param byte *dest [in] 揮憲愭傾僪儗僗 \param dword size [in] 挿偝 \return void \author Yamami \date create:2004/08/02 update:$Date: 2004/10/31 14:29:43 $*/void Ne2000MoNic::ne_pio_readmem( dword src, byte *dest, dword size ){ dword i; word readtmp;//Yamami 僨僶僢僌//printf("ne_pio_readmem src=%x \n",src); // abort DMA, start NIC outp8( NE_P0_COMMAND, NE_CR_RD2 + NE_CR_STA ); // length outp8( NE_P0_RBCR0, size & 0xff ); outp8( NE_P0_RBCR1, size >> 8 ); // source address outp8( NE_P0_RSAR0, src & 0xff ); outp8( NE_P0_RSAR1, src >> 8 ); outp8( NE_P0_COMMAND, NE_CR_RD0 + NE_CR_STA );// for(i=0;i<size;i+=2){// *dest=inp8( NE_ASIC_DATA );// *(dest+1)=inp8( PIO_ADATA );// dest+=2;// } // 2004/08/02 DATA偼16價僢僩暆偱傗傝偲傝偡傞偺偱丄Word曄姺偟偰I/O for(i = 0 ; i < size ; i+=2 , dest+=2){ readtmp=inp16( NE_ASIC_DATA ); //*dest=(byte)(readtmp >> 8); //*(dest+1)=(byte)(readtmp & 0xff); //儕僩儖僄儞僨傿傾儞側傜偙偆丠丠 *(dest+1)=(byte)(readtmp >> 8); *(dest)=(byte)(readtmp & 0xff); } }/*! \brief ne_bcompare 旕岞奐儖乕僠儞 僶僀僫儕斾妑儖乕僠儞 \param byte *src [in] 斾妑尦傾僪儗僗 \param byte *dest [in] 斾妑愭傾僪儗僗 \param dword size [in] 挿偝 \return int 寢壥:堦抳==0,晄堦抳==0埲奜 \author Yamami \date create:2004/08/02 update:$Date: 2004/10/31 14:29:43 $*/int Ne2000MoNic::ne_bcompare( byte *src, byte *dest, dword size ){ dword i; for(i=0;i<size;i++){ if( src[i]!=dest[i] ) return(1); } return(0);}/*! \brief disable netRecv interrupt \author Yamami \date create:2004/08/08 update:*/void Ne2000MoNic::disableNetWork() { byte IrqMask; IrqMask = 1 << (nicIRQ - 1); //outp8(0x21, inp8(0x21) | 0x04); outp8(0x21, inp8(0x21) | IrqMask);}/*! \brief enable netRecv interrupt \author Yamami \date create:2004/08/08 update:*/void Ne2000MoNic::enableNetWork() { byte IrqMask; IrqMask = 0; IrqMask = IrqMask ^ (1 << (nicIRQ - 1)); //XOR 摉奩價僢僩偺傒0偲偡傞丅 //outp8(0x21, inp8(0x21) & 0xF7); outp8(0x21, inp8(0x21) & IrqMask);}/*! \brief getNicIRQ NIC IRQ 僎僢僞乕 \author Yamami \date create:2004/08/30 update:*/int Ne2000MoNic::getNicIRQ() { //TODO Yamami!! 杮棃偼丄愝掕僼傽僀儖摍偐傜IRQ忣曬傪摼傞 return nicIRQ;}/*! \brief setNicIRQ NIC IRQ 僙僢僞乕 \author Yamami \date create:2004/10/31 update:2004/10/31*/void Ne2000MoNic::setNicIRQ(int value) { nicIRQ = value;}/*! \brief getNicIOBASE NIC IO_BASE 僎僢僞乕 \author Yamami \date create:2004/10/31 update:2004/10/31*/int Ne2000MoNic::getNicIOBASE() { //TODO Yamami!! 杮棃偼丄愝掕僼傽僀儖摍偐傜IRQ忣曬傪摼傞 return nicIo_Base;}/*! \brief setNicIOBASE NIC IO_BASE 僙僢僞乕 \author Yamami \date create:2004/10/31 update:2004/10/31*/void Ne2000MoNic::setNicIOBASE(int value) { nicIo_Base = value;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -