阅读:1804回复:10
谁有DOS下NE2000的驱动原码?
谢谢
|
|
沙发#
发布于:2002-11-04 14:26
我也在找这个,这方面的东东简直就是古董的的平方,太难找了!!!找到了可别忘了兄弟我啊,email:zhangba@cmmail.com,你也给我一个email吧,互相帮助。
|
|
|
板凳#
发布于:2002-11-05 12:22
知道这个是不是,在google上一查就有,是源码,我粗看了一下!
如果是请给分! Windows for Workgroups v3.11 and DIS_PKT9.DOS Joe R. Doupnik jrd@cc.usu.edu Utah State University 3 Feb 1994 Windows for Workgroups v3.11 introduces major changes to the network support material. If you wish to use a Packet Driver program, such as MS-DOS Kermit or one of the winsock DLLs, while within WFW then two supporting shims will be need to be loaded before WFW starts. There are at least two situations to consider and different shims are involved. Situation 1: WFW runs over a lan adapter dedicated to WFW. ----------- This is the case we explore in detail below. The two shims needed are DIS_PKT9.DOS and WINPKT.COM, both available by anonymous ftp from netlab2.usu.edu [129.123.1.44] in directory \\anonftp\\drivers and from sites carrying the Crynwr Collection of Packet Drivers. The important points are that a version 2 NDIS driver is required, not the newer version 3 32-bit protected mode NDIS kind, and that small edits will be needed to WFW text files protocol.ini and system.ini. Situation 2: WFW runs over a Novell ODI handler. ------------ The two shims needed are ODIPKT.COM and WINPKT.COM, both available from netlab2 above. Both are installed independently of WFW and no changes to WFW are needed. Dis_pkt9 will not run in this environment because no NDIS v2 interface is provided by WFW when using ODI. Instead ODIPKT provides the Packet Driver interface on the top of ODI. Situation other: WFW runs over another network\'s handler. ---------------- We can\'t say much because the environment is not known to us. The general guidlines about NDIS v2 support still apply. Please notice that we deal only with dis_pkt9.dos and winpkt.com. If you have another variation of dis_pkt you will need to contact the persons responsible for your variation. Similarly, people have circulated modified copies of winpkt without source code or external identifying markings. The winpkt referred to here uses two command line arguments and the entire package is bundled in winpkt.zip as source code, doc, and executable. Both are available from netlab2 as cited above. If in doubt get these. ODIPKT prime site is hsdndev.harvard.edu, and Dan Lanciani ddl@harvard.edu, is the author and responsible person. Please contact him on details of using ODIPKT. Steps to follow after installing network support in WFW v3.11. This presumes that WFW owns the network adapter (Situation 1 above). 1. Ensure that both PROTMAN.EXE and PROTMAN.DOS are in the WFW directory. You may have to uncompress them from the WFW distribution media. Copy files dis_pkt9.dos and winpkt.com there too. 2. Edit protocol.ini to insert the [pktdrv] section as shown below. Changes to the intvec= and novell= lines are permitted. An NE2000 NDIS v2 board driver, MS$NE2000, is used in this example. [pktdrv] DriverName=PKTDRV$ bindings=MS$NE2000 intvec=0x63 novell=no 3. Edit system.ini [network drivers] section to add \",dis_pkt9.dos\" to the transport= line, and to ensure a NDIS v2 netcard= driver has been given. Please do not confuse this transport= line with a similar one in the [enhanced] section; the [enhanced] section refers to 32 bit protected mode material. An NE2000 board is used in this example. [network drivers] devdir=C:\\WFW LoadRMDrivers=Yes transport=ndishlp.sys,*netbeui,dis_pkt9.dos netcard=ne2000.dos 4. Before starting Windows issue DOS commands (once only) NET START WINPKT \\x060 0x63 (example interrupts) The first command energizes the NDIS v2 handlers, and the dis_pkt9 banner should be displayed ending with the Ethernet address of your board. NET.EXE is in the WFW directory; also see next paragraph. The second command starts Windows helper shim winpkt, and that needs the Packet Driver (dis_pkt9) active beforehand. A comment on the line \"LoadRMDrivers=Yes.\" NET START reads file system.ini to obtain loading information, and the answer \"Yes\" tells it to run protman.exe which loads the drivers with protocol.ini supplying details. If the answer were \"No\" then the real mode drivers would not be loaded or available. However, if \"No\" were stated then we could give command NET START NETBIND to run protman.exe and achieve the same results as the \"Yes\" case. Sample WFW 3.11 Protocol.ini file using an NE2000 Ethernet board - ---------------------------------------------------------------- [network.setup] version=0x3110 netcard=ms$ne2000,1,MS$NE2000,3 transport=ms$ndishlp,MS$NDISHLP transport=ms$netbeui,NETBEUI lana0=ms$ne2000,1,ms$ndishlp lana1=ms$ne2000,1,ms$netbeui [protman] DriverName=PROTMAN$ PRIORITY=MS$NDISHLP [MS$NDISHLP] DriverName=ndishlp$ BINDINGS=MS$NE2000 [NETBEUI] DriverName=netbeui$ SESSIONS=10 NCBS=12 BINDINGS=MS$NE2000 LANABASE=0 [pktdrv] (dis_pkt9 section, use as shown) DriverName=PKTDRV$ (spelling must be correct here) bindings=MS$NE2000 (use board driver section name) intvec=0x63 (Packet Driver interrupt to use) novell=no (use novell=y if Ethernet_802.3) [MS$NE2000] (NDIS v2 board driver section) DriverName=MS2000$ INTERRUPT=5 IOBASE=0x360 [NE2000] Adapters=MS$NE2000 Section from WFW 3.11 system.ini file - ------------------------------------- [network drivers] (You need to edit this section) devdir=C:\\WFW LoadRMDrivers=Yes transport=ndishlp.sys,*netbeui,dis_pkt9.dos netcard=ne2000.dos ^^^^^^^^^^^^^--+ ^^^^^^^^^^^^^^^^^^ | | | ensure a netcard= line like this |- add this by hand exists right here. It chooses the NDIS v2 level board driver. (end of document) 不 |
|
地板#
发布于:2002-11-05 17:50
联系我:
QQ 34138008 mail: huguozhong@hotmail.com :) |
|
|
地下室#
发布于:2002-11-08 16:31
我们要的是驱动程序的源程序代码,不是上面那些
|
|
|
5楼#
发布于:2002-11-08 18:01
自己去下载!
解包后有全部的源程序! 请看一下再下结论! |
|
6楼#
发布于:2002-11-09 19:18
ftp不可以匿名登陆,http上只有pktdrv和odi驱动,太可惜
|
|
|
7楼#
发布于:2003-02-22 10:07
//这是源程序文件
#include <string.h> #include <io.h> #include \"rtlregs.h\" #include \"util.h\" #include \"eboot.h\" #include \"arp.h\" #include \"ether.h\" /*! * \\addtogroup xgStack */ /*@{*/ #define NIC_PAGE_SIZE 0x100 #define NIC_START_PAGE 0x40 #define NIC_STOP_PAGE 0x60 #define NIC_TX_PAGES 6 #define NIC_TX_BUFFERS 2 #define NIC_FIRST_TX_PAGE NIC_START_PAGE #define NIC_FIRST_RX_PAGE (NIC_FIRST_TX_PAGE + NIC_TX_PAGES * NIC_TX_BUFFERS) #define TX_PAGES 12 u_char mac[6] = { 0x00,0x06,0x98,0x00,0x00,0x00 }; volatile u_char *base = (u_char *)0x8300; /*! * Realtek packet header. */ struct nic_pkt_header { u_char ph_status; /*!< \\brief Status, contents of RSR register */ u_char ph_nextpg; /*!< \\brief Page for next packet */ u_short ph_size; /*!< \\brief Size of header and packet in octets */ }; /*! * \\brief Reset the NIC. * * \\return 0 on success, -1 otherwise. */ static int NicReset(void) { u_char i; u_char j; for(j = 0; j < 20; j++) { i = nic_read(NIC_RESET); Delay(500); nic_write(NIC_RESET, i); for(i = 0; i < 20; i++) { Delay(5000); if(nic_read(NIC_PG0_ISR) & NIC_ISR_RST) return 0; } } return -1; } /*! * \\brief Initialize the NIC. * * For further description of the initialization * please refer to the original Ethernut code. */ void NicInit(void) { u_short i; /* * Enable external data and address * bus. */ outp(BV(SRE) | BV(SRW), MCUCR); if(NicReset()) return; nic_write(NIC_PG0_IMR, 0); nic_write(NIC_PG0_ISR, 0xff); nic_write(NIC_CR, NIC_CR_STP | NIC_CR_RD2 | NIC_CR_PS0 | NIC_CR_PS1); nic_write(NIC_PG3_EECR, NIC_EECR_EEM0 | NIC_EECR_EEM1); nic_write(NIC_PG3_CONFIG3, 0); nic_write(NIC_PG3_CONFIG2, NIC_CONFIG2_BSELB); nic_write(NIC_PG3_EECR, 0); Delay(50000); nic_write(NIC_CR, NIC_CR_STP | NIC_CR_RD2); nic_write(NIC_PG0_DCR, NIC_DCR_LS | NIC_DCR_FT1); nic_write(NIC_PG0_RBCR0, 0); nic_write(NIC_PG0_RBCR1, 0); nic_write(NIC_PG0_RCR, NIC_RCR_MON); nic_write(NIC_PG0_TCR, NIC_TCR_LB0); nic_write(NIC_PG0_TPSR, NIC_FIRST_TX_PAGE); nic_write(NIC_PG0_BNRY, NIC_STOP_PAGE - 1); nic_write(NIC_PG0_PSTART, NIC_FIRST_RX_PAGE); nic_write(NIC_PG0_PSTOP, NIC_STOP_PAGE); nic_write(NIC_PG0_ISR, 0xff); nic_write(NIC_CR, NIC_CR_STP | NIC_CR_RD2 | NIC_CR_PS0); for(i = 0; i < 6; i++) nic_write(NIC_PG1_PAR0 + i, mac); for(i = 0; i < 8; i++) nic_write(NIC_PG1_MAR0 + i, 0); nic_write(NIC_PG1_CURR, NIC_START_PAGE + TX_PAGES); nic_write(NIC_CR, NIC_CR_STP | NIC_CR_RD2); nic_write(NIC_PG0_RCR, NIC_RCR_AB); nic_write(NIC_PG0_ISR, 0xff); nic_write(NIC_PG0_IMR, 0); nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); nic_write(NIC_PG0_TCR, 0); Delay(2000000); } /*! * \\brief Send an Ethernet frame. * * \\param dmac Destination MAC address. * \\param type Frame type. * \\param len Frame size. * * \\return 0 on success, -1 otherwise. */ int EtherOutput(u_char *dmac, u_short type, u_short len) { u_short i; u_short sz; u_char *cp; ETHERHDR *eh; #if 0 u_char isr; #endif if(type == ETHERTYPE_ARP) { eh = &arpframe.eth_hdr; cp = (u_char *)&arpframe; } else { eh = &sframe.eth_hdr; cp = (u_char *)&sframe; } for(i = 0; i < 6; i++) eh->ether_shost = mac; if(dmac) { for(i = 0; i < 6; i++) eh->ether_dhost = dmac; } else { for(i = 0; i < 6; i++) eh->ether_dhost = 0xFF; } eh->ether_type = type; if((len += sizeof(ETHERHDR)) < 60) sz = 60; else sz = len; nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); nic_write(NIC_PG0_RBCR0, (u_char)sz); nic_write(NIC_PG0_RBCR1, (u_char)(sz >> 8)); nic_write(NIC_PG0_RSAR0, 0); nic_write(NIC_PG0_RSAR1, NIC_FIRST_TX_PAGE); nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD1); /* * Transfer frame. */ for(i = 0; i < len; i++, cp++) nic_write(NIC_IOPORT, *cp); for(i = len; i < sz; i++) nic_write(NIC_IOPORT, 0); /* * Complete remote dma. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); for(i = 0; i <= 20; i++) if(nic_read(NIC_PG0_ISR) & NIC_ISR_RDC) break; nic_write(NIC_PG0_ISR, NIC_ISR_RDC); /* * Number of bytes to be transmitted. */ nic_write(NIC_PG0_TBCR0, (sz & 0xff)); nic_write(NIC_PG0_TBCR1, ((sz >> 8) & 0xff)); /* * First page of packet to be transmitted. */ nic_write(NIC_PG0_TPSR, NIC_FIRST_TX_PAGE); /* * Start transmission. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_TXP | NIC_CR_RD2); /* * Wait until transmission is completed or aborted. */ while(nic_read(NIC_CR) & NIC_CR_TXP); return 0; } /*! * \\brief Receive an Ethernet frame. * * \\param tms Return with timeout after the specified * number of waiting loops. On a 14 Mhz ATmega * this value represents approximately the number * of milliseconds to wait. * * \\return The number of bytes received, 0 on timeout * or -1 in case of a failure. */ int EtherInput(u_short type, u_short tms) { int rc = 0; u_char isr = 0; struct nic_pkt_header hdr; u_char *buf; u_char nextpg; u_char bnry; u_char curr; u_short i; u_char wtc; while(tms && rc == 0) { for(wtc = 1; tms; wtc++) { isr = nic_read(NIC_PG0_ISR); if(isr & NIC_ISR_RXE) { return -1; } if(isr & NIC_ISR_PRX) { break; } if(wtc == 0) tms--; } /* * Any frame received? */ if((isr & NIC_ISR_PRX) == 0) { nic_write(NIC_PG0_ISR, isr); break; } /* * Get the current page pointer. It points to the page where the NIC * will start saving the next incoming packet. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2 | NIC_CR_PS0); curr = nic_read(NIC_PG1_CURR); nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); /* * Get the pointer to the last page we read from. The following page * is the one where we start reading. If it\'s equal to the current * page pointer, then there\'s nothing to read. In this case we return * a null pointer. */ if((bnry = nic_read(NIC_PG0_BNRY) + 1) >= NIC_STOP_PAGE) bnry = NIC_FIRST_RX_PAGE; if(bnry == curr) { nic_write(NIC_PG0_ISR, isr); continue; } /* * Read the NIC specific packet header. */ nic_write(NIC_PG0_RBCR0, sizeof(struct nic_pkt_header)); nic_write(NIC_PG0_RBCR1, 0); nic_write(NIC_PG0_RSAR0, 0); nic_write(NIC_PG0_RSAR1, bnry); buf = (u_char *)&hdr; nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD0); for(i = 0; i < sizeof(struct nic_pkt_header); i++) *buf++ = nic_read(NIC_IOPORT); /* * Complete remote dma. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); for(i = 0; i <= 20; i++) { if(nic_read(NIC_PG0_ISR) & NIC_ISR_RDC) break; } nic_write(NIC_PG0_ISR, NIC_ISR_RDC); /* * Check packet length. */ if(hdr.ph_size < 60 + sizeof(struct nic_pkt_header) || hdr.ph_size > 1518 + sizeof(struct nic_pkt_header)) { return 0; } /* * Calculate the page of the next packet. If it differs from the * pointer in the packet header, we discard the whole buffer * and return a null pointer. */ nextpg = bnry + (hdr.ph_size >> 8) + ((hdr.ph_size & 0xFF) != 0); if(nextpg >= NIC_STOP_PAGE) { nextpg -= NIC_STOP_PAGE; nextpg += NIC_FIRST_RX_PAGE; } if(nextpg != hdr.ph_nextpg) { u_char nextpg1 = nextpg + 1; if(nextpg1 >= NIC_STOP_PAGE) { nextpg1 -= NIC_STOP_PAGE; nextpg1 += NIC_FIRST_RX_PAGE; } if(nextpg1 != hdr.ph_nextpg) { nic_write(NIC_PG0_ISR, isr); break; } nextpg = nextpg1; } /* * Check packet status. */ if((hdr.ph_status & 0x0F) == 1) { rc = hdr.ph_size - sizeof(struct nic_pkt_header); /* * Set remote dma byte count and * start address. Don\'t read the * header again. */ nic_write(NIC_PG0_RBCR0, (u_char)rc); nic_write(NIC_PG0_RBCR1, (u_char)((u_short)rc >> 8)); nic_write(NIC_PG0_RSAR0, sizeof(struct nic_pkt_header)); nic_write(NIC_PG0_RSAR1, bnry); /* * Perform the read. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD0); buf = (u_char *)&rframe; for(i = 0; i < rc; i++) *buf++ = nic_read(NIC_IOPORT); /* * Complete remote dma. */ nic_write(NIC_CR, NIC_CR_STA | NIC_CR_RD2); for(i = 0; i <= 20; i++) { if(nic_read(NIC_PG0_ISR) & NIC_ISR_RDC) break; } nic_write(NIC_PG0_ISR, NIC_ISR_RDC); } /* * Set boundary register to the last page we read. */ if(--nextpg < NIC_FIRST_RX_PAGE) nextpg = NIC_STOP_PAGE - 1; nic_write(NIC_PG0_BNRY, nextpg); /* * Handle incoming ARP requests. */ if(rframe.eth_hdr.ether_type != type) { if(rframe.eth_hdr.ether_type == ETHERTYPE_ARP) ArpRespond(); rc = 0; } } return rc; } /*@}*/ |
|
|
8楼#
发布于:2003-02-22 10:09
//这是头文件:
#include \"types.h\" /*! * \\addtogroup xgStack */ /*@{*/ /* * All types in network byte order. */ #define ETHERTYPE_IP 0x0008 /*!< \\brief IP protocol */ #define ETHERTYPE_ARP 0x0608 /*!< \\brief Address resolution protocol */ typedef struct ether_header { u_char ether_dhost[6]; /*!< \\brief Destination MAC address. */ u_char ether_shost[6]; /*!< \\brief Source MAC address. */ u_short ether_type; /*!< \\brief Protocol type. */ } ETHERHDR; /*@}*/ extern u_char mac[6]; extern void NicInit(void); extern int EtherOutput(u_char *dest, u_short type, u_short len); extern int EtherInput(u_short type, u_short tms); #endif |
|
|
9楼#
发布于:2003-02-22 10:13
我在纯DOS下实现的TCP/IP协议栈,靠的就是这个老网卡的支持啊!
|
|
|
10楼#
发布于:2003-02-23 22:33
我不要很多分,但你还是要记得给这个老古董点面子吧――给分吧
|
|
|