简单的网络(一)了解PCI
简单的网络(二)环境模拟搭建
简单的网络(三)
简单的网络(四)发收包
一、初始化
通过上一个部分我们知道重置在18-1F端口写入数据就可以了。
通常是0x18
然后判断0x07位ISR寄存器的最高位
当网卡(NIC)进入复位状态时置 1,执行开始命令后清零;当接
收缓冲区溢出时置 1,读出一个或多个包后自动清零。
初始化主要设置缓冲区的配置
//设置接收配置寄存器 RCR 对数据包接收配置
port_write_byte(NE2K_IOADDR + 12, 0xE0);
//设置发送配置寄存器
port_write_byte(NE2K_IOADDR + 13, 0xE2);
//0x9正常宽字 0x01 loopbakce宽字 TCR设置
port_write_byte(NE2K_IOADDR + 14, 0xC8);
//长度第八位,高八位
port_write_byte(NE2K_IOADDR + 10, 0x00);
port_write_byte(NE2K_IOADDR + 11, 0x00);
//清楚中断标志
port_write_byte(NE2K_IOADDR + 7, 0xFF);
port_write_byte(NE2K_IOADDR + 0, 0x0A);
//写物理网卡地址 选择了page1
port_write_byte(NE2K_IOADDR + NIC_COMMAND,0x61);
for(i=0;i<6;i++){
port_write_byte(NE2K_IOADDR +i+1,buf[i*2]);
}
//当前寄存器位置
port_write_byte(NE2K_IOADDR + 7, 0x50);
//设置多播地址
port_write_byte(NE2K_IOADDR + 8, 0x00);
port_write_byte(NE2K_IOADDR + 9, 0x41);
port_write_byte(NE2K_IOADDR + 10, 0x00);
port_write_byte(NE2K_IOADDR + 11, 0x80);
port_write_byte(NE2K_IOADDR + 12, 0x00);
port_write_byte(NE2K_IOADDR + 13, 0x00);
port_write_byte(NE2K_IOADDR + 14, 0x00);
port_write_byte(NE2K_IOADDR + 15, 0x00);
port_write_byte(NE2K_IOADDR + 0, 0x21);
//设置接收页开始地址
port_write_byte(NE2K_IOADDR + 1, 0x50);
//设置接收页结束地址
port_write_byte(NE2K_IOADDR + 2, 0x80);
//设置边界地址
port_write_byte(NE2K_IOADDR + 3, 0x50);
port_write_byte(NE2K_IOADDR + 4, 0x40);//发送起始页
port_write_byte(NE2K_IOADDR + 12, 0xCC);
port_write_byte(NE2K_IOADDR + 13, 0xE2);//方便测试loopback
port_write_byte(NE2K_IOADDR + 15, 0x00);
port_write_byte(NE2K_IOADDR + 0, 0x22);
二、获取网卡地址
网卡地址的获取
1.设置读的位置
2.设置读页的高地位
3.设置读长度高地位
4.读取
网卡存储是重复存储在前面的12个字节的
三、设置网卡地址
第一页的前6个是设置mac的地址
7个是设置当前缓存指针的位置
8-F设置的是多播的地址匹配
四、发送包
1.缓冲位置
2.长度大小
3.写
4.实际长度
5.发射
检测发射成功 :
CR 的第二位 这一位在置1时发送数据包,在发送完毕或终止时自动清零,写 0 没影响
ISR的第零位 这一位显示接收无错误(接收收到数据包并无错误时置 1)
一位 这一位显示发送无错误(发送完数据包并无错误时置 1)
五、接收包
1.读取当前位置
2.读取边界位置
当前》边界
可以读取前面4个字节
0:接受状态,1:下一页,2:当度第八位,3:长度高八位
读取缓冲区内容剔除前面这四个标志位
六、效果![](http://static.oschina.net/uploads/space/2014/0706/234031_f7O5_1185580.jpg)
七、bug补充
图片中的两个bug 1.状态01 有问题 如果是发送是正常则对头,如果是loopback模式则无效 (测试结果)
CR寄存器发送完成后 &0x04==0 loopback模式对头 正常发射 错
TSR寄存器发送成功 &0x01==1 loopback模式错 正常发射 对
ISR寄存器 loopback模式对 正常发射 对
有知道上面CR和ISR的状态的还望告诉我!!!
2.高八位应该是零,结果跟第八位一样,排查发现跟自己写的C的转换函数有关系BUG。(跟指针有关)