1. 程式人生 > >新增自己的開發板到openwrt中

新增自己的開發板到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= ( c a l l B u i l d F i r m w a r e / D e f a u l t 8 M / (1),$(1),icb-box,NT-ICB-8M)

這裡BuildFirmware/Default8M/在makefile開始的前半部分有定義,直接使用就可以。這裡的icb-box會出現在編譯生成的韌體中。
編譯呼叫:

( c a l l I m a g e / B u i l d / P r o f i l e / I C B B O X , (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:

https://github.com/openwrt/openwrt

所有的改動都放在了git上,感興趣的同學可以看看:

https://github.com/lixuande/openwrt-icbbox