问题1:
采用newmsg-9260的开发板,开发板上的PHY使用RMII方式链接SAM9260,而实际的目标板上,为了将4层板改为2层板,将连接方式由RMII改为了MII,由此带来的问题如下:
1. 不管使用newmsg更改过的源码还是从kernel.org下载的源码,不管如何更改内核选项,编译生成的内核uImage通过NFS方式挂载根文件系统时,总是不能成功挂载根文件系统,出现错误提示:
IP-Config: Complete: device=eth0, addr=192.168.1.244, mask=255.255.255.0, gw=255.255.255.255, host=192.168.1.244, domain=, nis-domain=(none), bootserver=255.255.255.255, rootserver=192.168.1.200, rootpath= Looking up port of RPC 100003/2 on 192.168.1.200 eth0: link up (10/Half) eth0: link down eth0: link up (10/Half) rpcbind: server 192.168.1.200 not responding, timed out Root-NFS: Unable to get nfsd port number from server, using default Looking up port of RPC 100005/1 on 192.168.1.200 rpcbind: server 192.168.1.200 not responding, timed out Root-NFS: Unable to get mountd port number from server, using default Root-NFS: Server returned error -5 while mounting /nfsroot/root422 VFS: Unable to mount root fs via NFS, trying floppy. VFS: Cannot open root device "<NULL>" or unknown-block(2,0) Please append a correct "root=" boot option; here are the available partitions: 1f00 258048 mtdblock0 (driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
解决:
修改了./arch/arm/mach-at91/board-sam9260ek.c中一行,is_rmii由1改为0,编译后通过NFS可以成功加载根文件系统了;
[1]. 修改的地方ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA7,
.is_rmii = 0,
// .is_rmii = 1,
};
[2]. MII和RMII的时钟频率不一样,今天查了下,MII的时钟频率是100Mbps时25MHz,10Mbp时2.5Mhz;而RMII省了一半信号线,所以频率提高一倍到50MHz;
既然时钟不一样,程序中必然需要用到条件语句分别进行配置。
[3]. 网上看到对函数lpc32xx_mii_probe()的分析:lpc32xx_mii_probe()完成了这样一个事情:找到第一个phy设备,然后根据内核配置,选用MII接口或RMII接口,之后再进行简单的配置。
这部分说明了,起关键作用的是,内核源码中有一个参数设定了使用MII还是RMII;
[4]. 确实在配置网络时有很多地方用到了is_rmii作为条件,查找is_rmii的赋值的地方,最终确认是./arch/arm/mach-at91/board-sam9260ek.c中的ek_macb_data;
问题2:
使用newmsg提供的U-Boot源码u-boot-2009.11-rc2.tar.gz编译,在U-Boot命令行模式下,始终不能ping通主机上的服务器,从而不能使用tftp方式加载内核镜像等;
解决:
在用户自定义的头文件newmsg9260.h中,对宏CONFIG_RMII的定义是#define CONFIG_RMII 1
原来以为,要禁止使用RMII方式,只需要将CONFIG_RMII宏的数值改为0;
[1]. 实际用到此宏定义作为判别条件的文件macb.c中对宏CONFIG_RMII的引用是这样的,#ifdef CONFIG_RMII;
[2]. 要使得判别条件#ifdef CONFIG_RMII为假,不能使用#define CONFIG_RMII 0的方式进行声明,而应该使用#undef CONFIG_RMII的方式来声明;
[3]. 换用#undef CONFIG_RMII的方式声明后,编译生成的二进制文件下载到开发板的flash中,在U-Boot的命令行模式,发现不能ping通服务器了,这是我们期望的;
开发板原来能ping通服务器,现在不能ping通了,说明用#undef CONFIG_RMII的方式做的声明起作用了;
[4]. 编译生成的二进制文件下载到目标板的flash中,在U-Boot的命令行模式,发现能够ping通服务器了,这是我们期望的;
[5]. 目标板上使用tftp命令加载各种镜像文件,网络很通畅,又解决了一个拦路虎;