第二十一期 U-Boot启动OpenWrt实验 《路由器就是开发板》

https://blog.csdn.net/aggresss/article/details/52752388

这一期我们来做一个引导OpenWrt的实验,虽然还没有讲到OpenWrt的内容,但这里我们先拿一个我编译好的固件来实验一下,具体固件怎么编译下一期再讲。
如果使用RalinkSDK3.6的U-Boot进行编译出来的U-Boot启动时TTL会输出如下信息:
3: System Boot system code via Flash.
## Booting image at bf050000 ...
这个地址是Ralin默认的firmware地址。这里我们来分析一下flash的分区结构:


上面这张图一目了然,但是OpenWrt给hg255的的flash分区却和Ralink的分区不一样,我们看一下OpenWrt对hg255d的dts文件:
 

target/linux/ramips/dts/HG255D.dts
######################################
/dts-v1/;
 
/include/ "rt3050.dtsi"
 
/ {
	compatible = "HG255D", "ralink,rt3052-soc";
	model = "HuaWei HG255D";
 
	pinctrl {
		state_default: pinctrl0 {
			gpio {
				ralink,group = "spi", "i2c", "jtag", "rgmii", "mdio", "uartf";
				ralink,function = "gpio";
			};
		};
	};
 
	cfi@1f000000 {
		compatible = "cfi-flash";
		reg = <0x1f000000 0x1000000>;
 
		bank-width = <2>;
		device-width = <2>;
		#address-cells = <1>;
		#size-cells = <1>;
 
		partition@0 {
			label = "u-boot";
			reg = <0x0 0x40000>;
			read-only;
		};
 
		partition@30000 {
			label = "u-boot-env";
			reg = <0x40000 0x20000>;
			read-only;
		};
 
		factory: partition@60000 {
			label = "factory";
			reg = <0x60000 0x20000>;
			read-only;
		};
 
		partition@80000 {
			label = "firmware";
			reg = <0x80000 0xf60000>;
		};
 
		partition@fa0000 {
			label = "factory-orig";
			reg = <0xfa0000 0x20000>;
			read-only;
		};
	};
 
	gpio-leds {
		compatible = "gpio-leds";
		power {
			label = "hg255d:power";
			gpios = <&gpio0 8 1>;
		};
		internet {
			label = "hg255d:internet";
			gpios = <&gpio0 13 1>;
		};
		wifi {
			label = "hg255d:wlan";
			gpios = <&gpio0 14 1>;
		};
		usb {
			label = "hg255d:usb";
			gpios = <&gpio0 9 1>;
		};
		wps {
			label = "hg255d:wps";
			gpios = <&gpio0 12 1>;
		};
		voice {
			label = "hg255d:voice";
			gpios = <&gpio0 5 1>;
		};
	};
 
	gpio-keys-polled {
		compatible = "gpio-keys-polled";
		#address-cells = <1>;
		#size-cells = <0>;
		poll-interval = <10>;
		reset {
			label = "reset";
			gpios = <&gpio0 4 1>;
			linux,code = <0x198>;
		};
		wps {
			label = "wps";
			gpios = <&gpio0 10 1>;
			linux,code = <0x211>;
		};
		rfkill {
			label = "rfkill";
			gpios = <&gpio0 0 1>;
			linux,code = <0xf7>;
		};
	};
 
	ethernet@10100000 {
		mtd-mac-address = <&factory 0x28>;
	};
 
	esw@10110000 {
		ralink,portmap = <0x2f>;
	};
 
	wmac@10180000 {
		ralink,mtd-eeprom = <&factory 0>;
	};
 
	otg@101c0000 {
		status = "okay";
	};
};

我把这个文件描述的flash分区画了张图:

可以看出OpenWrt内核的引导地址为0xBF080000,而Ralink的默认引导地址为0xBF050000,如果不修改是无法引导OpenWrt的。这里的解决方案是修改U-Boot目录下 include/config/rt2880.h 的定义文件 的293行

################################
#define CFG_BOOTLOADER_SIZE	0x30000
#define CFG_CONFIG_SIZE		0x10000
#define CFG_FACTORY_SIZE	0x10000
#define CFG_ENV_ADDR		(CFG_FLASH_BASE + CFG_BOOTLOADER_SIZE)
#define CFG_FACTORY_ADDR	(CFG_FLASH_BASE + CFG_BOOTLOADER_SIZE + CFG_CONFIG_SIZE)
#define CFG_KERN_ADDR		(CFG_FLASH_BASE + (CFG_BOOTLOADER_SIZE + CFG_CONFIG_SIZE + CFG_FACTORY_SIZE))
###########################################
修改为:
#define CFG_BOOTLOADER_SIZE	0x40000
#define CFG_CONFIG_SIZE		0x20000
#define CFG_FACTORY_SIZE	0x20000
###########################################

这样就和OpenWrt的flash分区同步了,用前面提到的方法将OpenWrt刷入flash 0xBF080000开始的地址,然后用U-Boot默认方式启动就能看到OpenWrt已经启动了:

启动后telnet可以访问OpenWrt

----------------------------------

扫描二维码关注公众号,回复: 4837462 查看本文章

SDK下载地址:   https://github.com/aggresss/RFDemo

猜你喜欢

转载自blog.csdn.net/wxh0000mm/article/details/85612844
今日推荐