添加自己的开发板到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在后面还会有用。

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= ( 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

猜你喜欢

转载自blog.csdn.net/lixuande19871015/article/details/81987440
今日推荐