在平时使用u-boot通过网络下载linux内核,我们的通常做法是手动设置serverip,ipaddr,然后通tftpboot命令把linux内核下载到指定地址,最后通过bootm命令来启动linux内核。
其实,这一切都可以通过u-boot自带的dhcp命令来实现。需要在configure文件中加入CONFIG_CMD_DHCP。此命令的具体实现在common/cmd_net.c与net/bootp.c。
dhcp的命令用法如下:
dhcp [loadAddress][[hostIPaddr:]bootfilename]
例:dhcp 0x20000000 192.168.1.10:uImage
使用这条命令,就不需要设置serverip,ipaddr,以及gateway(如果跨网段)了。
当dhcp成功从dhcp服务器上面拿到ip地址后,其就会从192.168.1.10地址,以tftp的方式获取uImage文件。
但是,使用这条命令有一个需要注意的地方,如果dhcp服务器ACK包中含有bootfilename,则此条命令将会执行失败。
serverip会使用dhcp服务的ip地址,bootfilename使用dhcp服务器返回的命令。
故认为这个是一个bug。请参考下面patch去解决这个问题。
http://article.gmane.org/gmane.comp.boot-loaders.u-boot/130743
——————————————————————————
when using dhcp command with parameters as usage message,
if DHCP server response contains bootfilename, it will overwrite
the dhcp command parameters. So the dhcp command parameters
can not be used.
Using this patch to fix it.
Signed-off-by: Bo Shen voice.shen at gmail.com
—
common/cmd_net.c | 1 +
net/bootp.c | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff –git a/common/cmd_net.c b/common/cmd_net.c
index 65f32bc..9b1e650 100644
— a/common/cmd_net.c
+++ b/common/cmd_net.c
@@ -221,6 +221,7 @@ static int netboot_common(enum proto_t proto, cmd_tbl_t *cmdtp, int argc,
case 3:load_addr = simple_strtoul(argv[1], NULL, 16);
copy_filename (BootFile, argv[2], sizeof(BootFile));
+ setenv (“bootfile”, BootFile);
break;
diff –git a/net/bootp.c b/net/bootp.c
index 9e32476..df9f5eb 100644
— a/net/bootp.c
+++ b/net/bootp.c
@@ -116,7 +116,8 @@ static void BootpCopyNetParams(Bootp_t *bp)
memcpy (NetServerEther, ((Ethernet_t *)NetRxPacket)-et_src, 6);
#endif
if (strlen(bp-bp_file) 0)
– copy_filename (BootFile, bp-bp_file, sizeof(BootFile));
+ if (!getenv(“bootfile”))
+ copy_filename (BootFile, bp-bp_file, sizeof(BootFile));
debug(“Bootfile: %s
“, BootFile);
—
1.7.9.5
——————————————————————————