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

📄 driver.h

📁 RTL8139驱动源码
💻 H
字号:

#define		NUM_OF_DESC		4 

//ethernet
#define		MAX_ETHERNET_FRAME_SIZE	1518
#define		MIN_ETHERNET_FRAME_SIZE	64
#define		MAC_HEADER_SIZE			14

//Tx
#define		TX_BUF_SIZE		1536 //每个发送包长 1518 ->0x600 32bit align
#define		RX_BUF_SIZE		TX_BUF_SIZE

//Rx
#define		RING_BUF_SIZE	0x4000	//接收缓冲区 16 k
#define		RING_BUF_PAD	TX_BUF_SIZE

//
#define		NUM_OF_PACKETS	0x40	//每次接收包的个数

/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
   The RTL chips use a 64 element hash table based on the Ethernet CRC.  */
#define		MULTICAST_FILTER_LIMIT		32

//包头
typedef struct tagPACKETHEADER{
	USHORT	ROK : 1;
	USHORT  FAE : 1;
	USHORT	CRC : 1;
	USHORT	LONG: 1;
	USHORT	RUNT: 1;
	USHORT	ISE : 1;
	USHORT	reserved : 7;
	USHORT	BAR : 1;
	USHORT	PAM : 1;
	USHORT	MAR : 1;
	USHORT   PacketLength;
}PACKETHEADER, *PPACKETHEADER;

//
typedef struct tagADAPTER{

	NDIS_HANDLE		MiniportAdapterHandle;
	NDIS_HANDLE		WrapperConfigurationContext;

	UCHAR		NetworkAddress[6];
	UCHAR		mc_filter[8];
	ULONG		PacketFilter;

	PUCHAR		ioaddr;
	//i/o
	ULONG		BaseIO;
	NDIS_MINIPORT_INTERRUPT	IntObj;

	//irq
	ULONG		IRQLevel;
	ULONG		IRQVector;
	ULONG		IRQAffinity;
	USHORT		IRQMode;

	PUCHAR		tx_bufs; // TX_BUF_SIZE * NUM_OF_DESC
	NDIS_PHYSICAL_ADDRESS		tx_bufs_dma;

	//2.接收:
	PUCHAR		rx_ring;
	NDIS_PHYSICAL_ADDRESS		rx_ring_dma;
	USHORT		read_ptr;

	PUCHAR		rx_bufs;
	NDIS_PHYSICAL_ADDRESS		rx_bufs_dma;

	//packet,buffer & pool
	NDIS_HANDLE		pkt_pool;
	NDIS_HANDLE		buf_pool;

	PNDIS_PACKET	pkt_desc[NUM_OF_PACKETS];
	PNDIS_BUFFER	buf_desc[NUM_OF_PACKETS];

	UINT			FreeRxPkt, FreeTxDesc;
	UINT			cur_rx, cur_tx, dirty_tx, dirty_rx;

	//isr status
	USHORT		curISR;

	//
	ULONG			ERR_COUNT;
	ULONG			XMIT_OK, XMIT_ERR;
	ULONG			RCV_OK, RCV_ERR;
	ULONG			RCV_NO_BUFFER;

	ULONG			rev_byte, xmit_byte;

	char twistie, twist_row, twist_col;	/* Twister tune state. */
}ADAPTER, *PADAPTER;




NDIS_STATUS 
RInit(
    OUT PNDIS_STATUS  OpenErrorStatus,
    OUT PUINT  SelectedMediumIndex,
    IN PNDIS_MEDIUM  MediumArray,
    IN UINT  MediumArraySize,
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN NDIS_HANDLE  WrapperConfigurationContext
    );

VOID 
RHalt(
    IN NDIS_HANDLE  MiniportAdapterContext
    );

RSet(
                   IN NDIS_HANDLE MiniportAdapterContext,
                   IN NDIS_OID Oid,
                   IN PVOID InformationBuffer,
                   IN ULONG InformationBufferLength,
                   OUT PULONG BytesRead,
                   OUT PULONG BytesNeeded
                   );

NDIS_STATUS 
RQuery(
    IN NDIS_HANDLE  MiniportAdapterContext,
    IN NDIS_OID  Oid,
    IN PVOID  InformationBuffer,
    IN ULONG  InformationBufferLength,
    OUT PULONG  BytesWritten,
    OUT PULONG  BytesNeeded
    );

NDIS_STATUS 
RReset(
    OUT PBOOLEAN  AddressingReset,
    IN NDIS_HANDLE  MiniportAdapterContext
    );

VOID
RReturnPkt(
    IN NDIS_HANDLE  MiniportAdapterContext,
    IN PNDIS_PACKET  Packet
    ); 

VOID
RSendPkts(
    IN NDIS_HANDLE  MiniportAdapterContext,
    IN PPNDIS_PACKET  PacketArray,
    IN UINT  NumberofPackets
    );

VOID
RIsr(
    OUT PBOOLEAN  InterruptRecognized,
    OUT PBOOLEAN  QueueMiniportHandleInterrupt,
    IN NDIS_HANDLE  MiniportAdapterContext
    );

VOID 
RIsrDpc(
    IN NDIS_HANDLE  MiniportAdapterContext
    );

VOID 
REnint(
    IN NDIS_HANDLE  MiniportAdapterContext
    );

VOID 
RDisint(
    IN NDIS_HANDLE  MiniportAdapterContext
    );

VOID
FreeRes(PADAPTER	adapter);

NDIS_STATUS
StartDevice(
		PADAPTER	adapter
		);

NDIS_STATUS
AllocRes(
		PADAPTER	adapter
		);

ULONG
CopyPktToBuf(
			PNDIS_PACKET packet,
			PUCHAR		 buffer
			);

VOID
IssueCMD(
	PADAPTER	adapter,
	UINT		cur_tx,
	ULONG		paddr,
	UINT		len
	);

BOOLEAN
SendPkt(
	IN PADAPTER		 adapter,
    IN PNDIS_PACKET  Packet
	);

VOID
TxInt(
			PADAPTER adapter
			);

VOID
RxInt(
			PADAPTER adapter
			);


BOOLEAN
PacketOK(
	PPACKETHEADER pPktHdr
	);


//
#define		INIT_CODE	//		code_seg("_ITEXT", "ICODE")
#define		PAGE_CODE	//		code_seg("_PTEXT", "PCODE")
#define		LOCK_CODE	//		code_seg("_LTEXT", "LCODE")




/*  EEPROM_Ctrl bits. */
#define EE_CS	0x08	/* EEPROM chip select. */
#define EE_CLK	0x04	/* EEPROM shift clock. */
#define EE_DI	0x02	/* EEPROM chip data in. */
#define EE_DO	0x01	/* EEPROM chip data out. */
#define EE_ENB	(0x80 | EE_CS)

#define EE_WRITE_CMD	5
#define EE_READ_CMD		6
#define EE_ERASE_CMD	7

typedef enum _OP_ENUM{
	OP_WRITE = EE_WRITE_CMD,
	OP_READ = EE_READ_CMD,
	OP_ERASE = EE_ERASE_CMD,
}OP_ENUM;


USHORT
opEEPROM(
		PUCHAR		ioaddr,//93c46 port addr
		ULONG		locate, //寄存器位置
		OP_ENUM		op,	//操作类型
		USHORT		data
		);

PNDIS_PACKET
RevOnePacket(
		PADAPTER adapter
		);


VOID
SetMII(
		PADAPTER	adapter
		);

VOID
ResetNIC(
		PADAPTER	adapter
		);
VOID
RxErrHandle(
		PADAPTER adapter
		);

#define	NextTxDesc(i)	(i) == (NUM_OF_DESC - 1) ? 0 : (i + 1)
#define	NextRxDesc(i)	(i) == (NUM_OF_PACKETS - 1) ? 0 : (i + 1)

#define R39_INTERRUPT_MASK \
	(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK)

BOOLEAN
RCheck(
    IN NDIS_HANDLE  MiniportAdapterContext
);


NTSTATUS
RIoControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
ROpen(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
RUnload(
    IN PDRIVER_OBJECT DriverObject
    );

NTSTATUS
RRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );
NTSTATUS
RWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RCleanup(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );



#define	USER_OID_REV_BYTE							0x02000000
#define	USER_OID_XMIT_BYTE							0x02000001

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -