新增自己的開發板到openwrt中
手頭有個mt7620a的開發板,打算加到openwrt的dts裡面,跟linux新增一個裝置類似,整個過程分這樣幾步:構建dts;修改核心編譯的makefile;修改相應的初始化引數。
構建DTS
一個特定的裝置需要一個dts檔案來描述,dts檔案裡面具體描述了板子的一些細節,板子的flash分割槽、led燈、GPIO的複用等等,板級的細節其實都在dts檔案裡面。
一類裝置一般有一個dtsi檔案,這是一類裝置的抽象,比如基於mt7620a晶片方案的裝置是有非常多的共性的,這些共性會抽象出來放置到dtsi裡面,在dts裡面我們要包含本晶片方案的dtsi檔案,然後在通用方案之上在增加我們自己板子的特性。
DTS檔案路徑
dts檔案的路徑在:
target/linux/ramips/dts
DTS內容
手頭的板子打算叫icecreambox,簡稱ICB-BOX。dts中compatible指示的是晶片方案,model指示的是自己的板子的名字,這個可以自己定義。
compatible = “ralink,mt7620a-icb-board”, “ralink,mt7620a-soc”;
model = “IceCreamBox”;
model在後面還會有用。
[email protected] {
ralink,mtd-eeprom = <&factory 0>;
}
板級的引數讀取位置,也就是factory區域,裡面有mac等板級初始化資訊。
chosen {
bootargs = “console=ttyS0,115200”;
};
串列埠的波特率。
還有網路、PCIE、sdhci、led、key等相關的配置,要注意的是mt7620a上的72個GPIO被分成了四個暫存器組,其中第0組暫存器是預設enable的,另外三組暫存器都是disable狀態,如果要先在dts總enable才可以。下面是擷取的GPIO分組:
gpio1: [email protected] {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x638 0x24>;
interrupt-parent = <&intc>;
interrupts = <6>;
gpio-controller;
#gpio-cells = <2>;
ralink,gpio-base = <24>;
ralink,num-gpios = <16>;
ralink,
register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];
status = "disabled";
};
gpio2: [email protected] {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x660 0x24>;
interrupt-parent = <&intc>;
interrupts = <6>;
gpio-controller;
#gpio-cells = <2>;
ralink,gpio-base = <40>;
ralink,num-gpios = <32>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];
status = "disabled";
};
gpio3: [email protected] {
compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
reg = <0x688 0x24>;
interrupt-parent = <&intc>;
interrupts = <6>;
gpio-controller;
#gpio-cells = <2>;
ralink,gpio-base = <72>;
ralink,num-gpios = <1>;
ralink,register-map = [ 00 04 08 0c
10 14 18 1c
20 24 ];
status = "disabled";
};
核心編譯的makefile
構建好了裝置樹(DTS)後,還需要修改核心的makefile,告訴核心如何編譯自己新加入的DTS,
image編譯
核心編譯的makefile在:
target/linux/ramips/image/Makefile
核心編譯的過程中會根據DTS檔案編譯生成DTB檔案,我們刷寫的韌體其實是DTB檔案會和核心的uimage檔案打包成bin檔案。
在makefile中首先新增自己的DTS檔案呼叫規則,然後再對應的晶片方案下call就可以了,這裡一定要遵守openwrt的編譯規則。
呼叫規則:
Image/Build/Profile/ICB-BOX= (1),$(1),icb-box,NT-ICB-8M)
這裡BuildFirmware/Default8M/在makefile開始的前半部分有定義,直接使用就可以。這裡的icb-box會出現在編譯生成的韌體中。
編譯呼叫:
(1))
這裡的呼叫及引數在https://blog.csdn.net/lixuande19871015/article/details/50515892這篇文章中有介紹。
相關初始化引數
添加了DTS檔案,也告訴核心如何編譯了,但是對路由板來說還有些初始化相關的東西需要修改。下面列舉幾個:
board name
在路徑:
target/linux/ramips/base-files/lib/ramips.sh
中新增自己的板子的名字,類似這樣:
這個後面我們可以在/proc/cupinfo中能看到我們的設定。
網路相關引數
target/linux/ramips/base-files/etc/board.d
在這個路徑下是板級的一些初始化引數,路由板比較關注的是網路相關的,這裡可以配置網路節點的mac地址的獲取,比如lan的mac,wan的mac等,還可以配置vlan劃分,類似下面這樣:
vlan劃分:
mac獲取及配置:
如果有自己其他的一些改動,可以在根路徑下放置files資料夾,裡面放自己想放的東西就可以,韌體編譯的時候回把這個files下的檔案拷貝到系統的根目錄,比如我想改/etc/banner,直接在files下建立etc路徑,然後建立自己的banner檔案,韌體就會將這個檔案直接編譯進去了。
編譯生成的韌體張這個樣子
至此,我們就將一個開發板新增到了openwrt的系統中,如果想提交的社群,可以去git上嘗試一下。openwrt的git:
所有的改動都放在了git上,感興趣的同學可以看看: