我想利用网卡中的eeprom存储我的一点内容,如何实现?
解决方案 »
- 关于资源加载问题,100分
- powerpoint生成的pps文件可以显示在对话框中吗
- vc2008中,对话框,编译时候无错误,运行时有错误,
- 问VC, 按钮点击
- C++字符串连接?
- 赏月散分
- 如何正确显示控件-在客户区中
- 急!急!急!:为什么我第一次拖动标题栏时Tab属性页的子窗体在剧烈晃动,而第二次拖动时却没有出现这种情况??
- 用CAsyncSocket作的服务器端程序,第一次连接成功后,如果再次连接成功间隔时间很长?
- 如何在VC中使用CBase64类,哪里可找到其相关的头文件或动态库?
- 哪有directshow入门的资料啊?急![email protected]
- 如何取别的机器MAC地址?SendArp跟哪些系统服务相关?
我做过用8139网卡制作89c51编程器的东西,可以去驱动开发网找AthlonxpX86的网络硬盘,里面放着开发文档
//written by jason zhang
//eed usts
//READ eepromコッハ/* 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 7typedef enum _OP_ENUM{
OP_WRITE = EE_WRITE_CMD,
OP_READ = EE_READ_CMD,
OP_ERASE = EE_ERASE_CMD,
}OP_ENUM;
#define EIGHT_BIT_MODE 0//カィメ・93C46 カチミエト」ハス#if (EIGHT_BIT_MODE)
#define FLAG 0x0
#define VID 0x2
#define DID 0x4
#define NET_ADDR_ID 0xe
#else
#define FLAG 0x0
#define VID 0x1
#define DID 0x2
#define NET_ADDR_ID 0x7
#endif
USHORT
opEEPROM(
PUCHAR ioaddr,//93c46 port addr
ULONG locate, //サヨテ
OP_ENUM op, //
USHORT data//カチノセイルラアコヤ
)
{
int i, addrlen;
UCHAR TmpVal;
USHORT retval = 0; switch(op){
case OP_WRITE: #if (EIGHT_BIT_MODE) //8BIT MODE
locate = (op << 15) | (locate << 8) | ((UCHAR)data);
addrlen = 18;
#else //16BIT MODE
locate = (op << 22) | (locate << 16) | data;
addrlen = 25;
#endif break;
case OP_READ:
case OP_ERASE:#if (EIGHT_BIT_MODE) //8BIT MODE
locate = (op << 7) | locate;
addrlen = 10;
#else //16BIT MODE
locate = (op << 6) | locate;
addrlen = 9;
#endif
break;
default:
return 0;
}
NdisRawWritePortUchar(ioaddr, EE_ENB & ~EE_CS); //ス
NdisRawWritePortUchar(ioaddr, EE_ENB); //select chip for(i = addrlen; i >= 0; i --){//エョミミミエネ・
TmpVal = (locate & (1 << i)) ? EE_DI : 0;
NdisRawWritePortUchar(ioaddr, EE_ENB | TmpVal);
NdisRawWritePortUchar(ioaddr, EE_ENB | TmpVal | EE_CLK); //raise clk
} NdisRawWritePortUchar(ioaddr, EE_ENB); //low clk //read result
for(i = 0; i < 16; i ++){
NdisRawWritePortUchar(ioaddr, EE_ENB | EE_CLK); //raise clk
NdisRawReadPortUchar(ioaddr, &TmpVal);
TmpVal &= EE_DO;
retval = (retval << 1) | TmpVal;
NdisRawWritePortUchar(ioaddr, EE_ENB); //low clk
}
NdisRawWritePortUchar(ioaddr, ~EE_CS); DbgPrint("retval=%x\n", retval);
return retval;
}//finish
//カチヘィオリヨキ
USHORT addr[3];for(i = 0; i < 3; i ++)
addr[i] = opEEPROM(
ioaddr,//93c46 port addr
NET_ADDR_ID + i, //サヨテ
OP_READ, //
0//カチノセイルラアコヤ
);