移植u-boot-2015.07之修改程序支持 DM9000 网卡
1.添加DM9000的驱动程序
- 查看 drivers/net/Makefile 文件发现 dm9000x.o 是与 CONFIG_DRIVER_DM9000 这个宏有关的。修改 include/configs/smdk2440.h 如下
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
改为
#define CONFIG_DRIVER_DM9000 /* 此项决定编译 DM9000x.c 文件 */
uboot中搜索 CONFIG_DRIVER_DM9000,参考别的板级头文件,添加宏定义如下
#define CONFIG_DRIVER_DM9000 /* 此项决定编译 DM9000x.c 文件 */
#define CONFIG_DM9000_BASE 0x20000000 /* DM9000 的基地址,与 DM9000 与 S3C2440 的物理连接有关,查看原理图得到 DM9000 连接到 S3C2440 的哪一个片上面,这里是 nGCS4,也就是0x20000000起始地址处 */
#define DM9000_IO CONFIG_DM9000_BASE /* DM9000 的 IO,此处等于 DM9000 的起始基地址 */
#define DM9000_DATA (CONFIG_DM9000_BASE + 4) /* 与 DM9000 的 CMD 引脚有关,本板子 DM9000 的 CMD 引脚接到 LADDR2,所以要加上 2^2=4 */
2.配置时间参数
配置 BWSCON 以及 BANKCON4 寄存器来对应 DM9000 的设置,这里使用之前的配置 BANKCON4 = 0x00000700,BWSCON = 0x22011110
3.更改驱动程序
- 在 sourceinsight 里面全局搜索 “Net:”,得到在
arch/arm/lib/board.c
以及common/board_r.c
里面有eth_initialize(gd->bd);
eth_initialize(gd->bd); /* 前面我们知道 gd->bd 指向的是 bd_t 结构体,里面存有串口波特率以及ip地址等等 */
board_eth_init(bis)
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
- 将 board/samsung/smdk2440/smdk2440.c里的board_eth_init函数改为
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis); /* 好奇的是实际上并没有使用 bis 参数,不知道传入的目的是什么 */
#endif
return rc;
4.修改网卡初始化配置
- 修改 include/configs/smdk2440.h 里面的
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 10.0.0.110
#define CONFIG_SERVERIP 10.0.0.1
改为
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.100 //自己根据需要设置
#define CONFIG_SERVERIP 192.168.2.1 //自己根据需要设置
#define CONFIG_ETHADDR 00:08:3e:26:0a:5b //自己根据需要设置
由于2015.07版本中的 include/env_default.h 里面的 default_environment 数组里面并没有 “ethaddr=” 字样,所以我们添加一行如下
#ifdef CONFIG_ETHADDR
"ethaddr=" __stringify(CONFIG_ETHADDR) "\0"
#endif
这里设置完毕之后uboot启动的时候就会自动设置好想要的网络参数了,当然也可以通过uboot内置命令来进行设置
- 为了解决 “ERROR: resetting DM9000 -> not responding” 与 “could not establish link” 输出信息(其实不管它也没有问题,但是就是看着不舒服,而且速度也比较慢)。将 DM9000x.c 里的
dm9000_reset(void)
函数改为
if ((DM9000_ior(DM9000_PIDL) != 0x0) ||
(DM9000_ior(DM9000_PIDH) != 0x90))
printf("ERROR: resetting DM9000 -> not responding\n");
//改变为下面这样
i = 0;
do
{
if(i == 1000) //此数字根据具体情况进行赋值,我的是1000就可以了
{
break;
}
i ++;
}while((DM9000_ior(DM9000_PIDL) != 0x0) || (DM9000_ior(DM9000_PIDH) != 0x90));
dm9000_init 函数里面的
i = 0;
while (!(dm9000_phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
}
}
全部注释掉,这样就会直接以100M全速运行。改动到这里就不会出现第一次ping不成功,要快速连ping两次才能成功
测试如下:
U-Boot 2015.07 (Jun 13 2016 - 18:58:30 +0800) CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB Flash: 2 MiB NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 SMDK2440 # ping 192.168.2.1 dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0c:29:c1:01:ef operating at 100M full duplex mode Using dm9000 device host 192.168.2.1 is alive |