1. 程式人生 > >第二十一期 U-Boot啟動OpenWrt實驗 《路由器就是開發板》

第二十一期 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";
			};
		};
	};
 
	
[email protected]
{ compatible = "cfi-flash"; reg = <0x1f000000 0x1000000>; bank-width = <2>; device-width = <2>; #address-cells = <1>; #size-cells = <1>; [email protected] { label = "u-boot"; reg = <0x0 0x40000>; read-only; }; [email protected]
{ label = "u-boot-env"; reg = <0x40000 0x20000>; read-only; }; factory: [email protected] { label = "factory"; reg = <0x60000 0x20000>; read-only; }; [email protected] { label = "firmware"; reg = <0x80000 0xf60000>; }; [email protected] { 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>; }; }; [email protected] { mtd-mac-address = <&factory 0x28>; }; [email protected] { ralink,portmap = <0x2f>; }; [email protected] { ralink,mtd-eeprom = <&factory 0>; }; [email protected] { 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

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

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