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

📄 ne2000monic.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    /* 掆巭偡傞崰傑偱懸偮 */    //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 + -