最近在ARM9板上开发DM9k网卡的程序,需要对网卡进行底层操作。此文记录开发过程,仅当日后参考之用。文章跟随进度逐步更新。
1、硬件特性:
DM9k经常接触到的部件是PHY、MAC、和处理器接口三个模块
2、初始化:
基本初始化步骤:启用芯片-》复位-》探测-》
网卡识别:
NIC:Network Interface Card
先把寄存器NCR的BIT[7]置“1”,启用外部PHY,然后读取phy_reg3中的数据,如有外部PHY,则可以识别网卡类型,否则使用内部PHY。
自动协商的目标是提供一种方法,使相互连接的网卡设备可以交换信息并自动配置双方的设备以达到最大性能。DM9k支持10/100M的速度。如果不启用自动协商机制,就需要将配置写入PHY的寄存器0和4。并设置GPIO控制寄存器GPR。
如果协商完成,PHY的寄存器0中的BIT[5]就会置“1”,随意在开启自动协商后探查此位以确定是否协商完成。
不知为何,uboot中的mode设置时全双工模式的phy_reg数据和Programming Guild中的不一样:
phy_reg0 = 0x2100;//phy_reg0 = 0x3100;
SRAM用来存储数据包,共16KB,13KB的接收和3KB的发送。
数据位宽的选择可以通过EECS(pin21)来设定,1为8位。并可以通过读取寄存器ISR的BIT[7]来确定。
NIC:网络中断控制
初始化过程:
1、内部PHY上电:
PHY默认是断电的,上电过程需要往寄存器GPR中的第0位写入“0”。
2、软重启:
往寄存器NCR的BIT[0]写入“1”,然后等待10us。
3、设置寄存器NCR的BIT[2:1]为“00”,以选择通常模式。
4、设置寄存器IMR的BIT[7]为“1”,启用“指针自动返回”功能。此功能是在写入SRAM时,如果超出了SRAM的地址范围,就会跳回SRAM 的起始地址。
5、读取EEPROM中保存的6个字节全球唯一MAC地址。
6、往寄存器PAR写入6字节的MAC地址。
7、往MAR写入8字节的哈希表。最后一个字节必须为0x80。
8、处理NIC中断或者上拉复位功能。
9. Set the IMR register (REG_FFH) Bit [0]=1/ Bit [1]=1 to enable the RX/ TX interrupt.
10. Program the RCR register to enable RX. The RX function is enabled by setting the RXEN Bit [0]= 1 in the RX control register, RCR REG_05. Please refer to the data sheet ch.6.6 about setting RCR.
11. The DM9000A/B NIC is being activated and ready RX/ TX now.
EEPROM中保存的内容:
1、MAC地址;
2、厂商ID和产品ID;
3、处理器控制总线引脚的优先级设置;
4、唤醒模式控制;
5、加电时PHY上电、断电的设置;
6、自动-MDIX的启用、禁用设置;
7、在16位模式下,LED1和LED2引脚作为IO16引脚和IOWAIT/WAKE引脚的设置;
8、LED模式0或1的设置;
EEPROM的格式在Datasheet的第七章中有详细描述。
EEPROM的读写:
中断寄存器的使用,将寄存器IMR的某一位置位则启用相应的中断。
回环问题:
搞了半天,原来是中断没设置好,还一直以为回环没设置好。设置好IMR的相应位,就可以收到回环数据包。
可是,还有个问题,发送数据包能够触发中断,而接收到数据包时中断没有触发。
如果把IMR设为0xfd,将收不到数据。如设为0x1,则可以收到。经实验,如设IMR[7]为1则收不到数据。而发送中断正常。为何?
原因是uboot的驱动的eth_send()函数已经把中断接收中断屏蔽掉了。
基址问题
RW/C1=Read/Write and Cleared by write 1
数据读写的位宽可以通过读取寄存器Bit [7]来获得