本文基于OpenWrt 21.02版本和MT7621平台介绍如何新增一个产品设备来进行编译,在旧版的OpenWrt(例如:MT7628的官方SDK)中则有所不同,仅供参考。

建立dts文件

  1. 在OpenWrt代码库下的target/linux/ramips/dts/新建一个mt7621_mint_router2_spi.dts文件,其他的硬件平台则需要选择其他平台路径下的dts文件夹,例如:target/linux/bcm63xx/dts/
  2. 编辑新建立的dts文件,参考如下:
#include "mt7621.dtsi"  // 引入mt7621芯片的dtsi文件

/ {
	compatible = "mint,router2_spi", "mediatek,mt7621-soc";  // 设备的兼容性列表
	model = "mint router2_spi";  // 设备的型号
};

&spi0 {
	status = "okay";  // 启用SPI0 总线

	flash@0 {
		compatible = "jedec,spi-nor";  // spi flash的类型
		reg = <0>;  // 设备的寄存器地址
		spi-max-frequency = <44000000>;  // SPI 总线最大频率
		broken-flash-reset;  // 如果设备复位,SPI 总线将会被重置

		partitions {
			compatible = "fixed-partitions";  // 设备的兼容性列表
			#address-cells = <1>;  // 分区的地址单元数量
			#size-cells = <1>;  // 分区的大小单元数量

			partition@0 {
				label = "u-boot";  // 分区的名称
				reg = <0x0 0x30000>;  // 分区的地址范围
				read-only;  // 只读分区
			};

			partition@30000 {
				label = "u-boot-env";  // 分区的名称
				reg = <0x30000 0x10000>;  // 分区的地址范围
				read-only;  // 只读分区
			};

			factory: partition@40000 {
				label = "factory";  // 分区的名称
				reg = <0x40000 0x10000>;  // 分区的地址范围
				read-only;  // 只读分区
			};

			partition@50000 {
				compatible = "denx,uimage";  // 分区的兼容性列表
				label = "firmware";  // 分区的名称
				reg = <0x50000 0x1fb0000>;  // 分区的地址范围
			};
		};
	};
};

&sdhci {
	status = "okay";  // 启用SDHCI 控制器
};

&switch0 {
	ports {
		port@0 {
			status = "okay";  // 启用端口0
			label = "lan1";  // 端口的名称
		};

		port@1 {
			status = "okay";  // 启用端口1
			label = "lan2";  // 端口的名称
		};

		port@2 {
			status = "okay";  // 启用端口2
			label = "lan3";  // 端口的名称
		};

		port@3 {
			status = "okay";  // 启用端口3
			label = "lan4";  // 端口的名称
		};

		port@4 {
			status = "okay";  // 启用端口4
			label = "wan";  // 端口的名称
		};
	};
};

&i2c { // 配置i2c设备节点
	status = "okay"; // 启用i2c设备节点

	rtc@51 { // 配置PCF8563实时时钟设备节点
		status = "okay"; // 启用PCF8563实时时钟设备
		compatible = "nxp,pcf8563"; // 设备兼容性为NXP的PCF8563型号
		reg = <0x51>; // PCF8563实时时钟设备节点在i2c总线上的地址为0x51
	};
};

&pcie {  // 定义PCIe总线节点
	status = "okay";  // 启用该PCIe总线
};

&pcie0 {  // 定义PCIe设备节点0
	wifi@0,0 {  // 定义一个wifi设备
		compatible = "mediatek,mt76";  // 指定设备的兼容性
		reg = <0x0000 0 0 0 0>;  // 指定设备的寄存器地址
		mediatek,mtd-eeprom = <&factory 0x0000>;  // 指定这个wifi设备的厂家校准信息及MAC的存储位置
		ieee80211-freq-limit = <2400000 2500000>;  // 指定设备的IEEE 802.11频率限制
	};
};

&pcie1 {  // 定义PCIe设备节点1
	wifi@0,0 {  // 定义一个wifi设备
		compatible = "mediatek,mt76";  // 指定设备的兼容性
		reg = <0x0000 0 0 0 0>;  // 指定设备的寄存器地址
		mediatek,mtd-eeprom = <&factory 0x0000>;  // 指定这个wifi设备的厂家校准信息及MAC的存储位置
		ieee80211-freq-limit = <5000000 6000000>;  // 指定设备的IEEE 802.11频率限制
	};
};

&state_default {  // 定义默认状态
	gpio {  // 定义GPIO控制器
		groups = "uart2", "uart3", "rgmii2", "sdhci";  // 指定作为GPIO的端口组
		function = "gpio";  // 指定GPIO控制器
	};
};

修改mt7621.mk文件

打开target/linux/ramips/image/mt7621.mk,在设备列表里加入新增产品的编译选项,参考如下:

define Device/mediatek_mt7621-eval-board
  $(Device/dsa-migration)
  BLOCKSIZE := 64k
  IMAGE_SIZE := 15104k
  DEVICE_VENDOR := MediaTek
  DEVICE_MODEL := MT7621 EVB
  DEVICE_PACKAGES := -wpad-basic-wolfssl
  SUPPORTED_DEVICES += mt7621
endef
TARGET_DEVICES += mediatek_mt7621-eval-board

# 新增产品的编译选项
define Device/mint_router2_spi
  $(Device/dsa-migration)
  $(Device/uimage-lzma-loader)
  BLOCKSIZE := 64k			#flash的block大小
  IMAGE_SIZE := 32448k		#固件最大大小,如果这里设置过小而开了很多的软件包,就会编译出错
  DEVICE_VENDOR := mint		#厂家名称
  DEVICE_MODEL := router2_spi	#产品型号
  DEVICE_PACKAGES := kmod-mt7603 kmod-usb3 uboot-envtools	#默认安装的软件包
  SUPPORTED_DEVICES += mt7621	#基于mt7621
endef
TARGET_DEVICES += mint_router2_spi

选择新建的产品编译

命令行输入make menuconfig,选择新增的产品:

$ make menuconfig
  Target System —>
    MediaTek Ralink MIPS
  Subtarget —>
    MT7621 based boards
  Target Profile —>
    mint router2_spi

保存后退出menuconfig,执行make V=s进行编译即可。