手头有个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在后面还会有用。
wmac@10180000 {
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: gpio@638 {
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: gpio@660 {
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: gpio@688 {
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上,感兴趣的同学可以看看: