第二十一期 U-Boot啟動OpenWrt實驗 《路由器就是開發板》
阿新 • • 發佈:2019-01-09
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