首页 > 其他分享 >手把手教学——OpenWrt新机的固件编译/定制

手把手教学——OpenWrt新机的固件编译/定制

时间:2024-01-16 11:56:41浏览次数:26  
标签:name 手把手 Bytes base usedFlag 固件 ipq40xx OpenWrt size

手把手教学——OpenWrt新机的固件编译/定制

目录

背景

手里有一台QCA的IPQ4019的路由器,为TP-Link的Deco M9 Plus 2.0。

查了下OpenWrt已经支持这个CPU了,便打算刷机看看。

硬件参数

已知参数:

硬件参数 型号/规格 说明
CPU IPQ4019
Flash Nand Flash(128M) Winbond W29N01HV
RAM 512M
PHY QCA8072
无线 2.4G+5G band1:IPQ4019内置;5G4:QCA9886 规格AC2200
USB 2.0 1个
蓝牙 CSR8811 UART总线
Zigbee EFR32MG SPI总线

软件修改

新增profile

工作目录应该在openwrt/target/linux/ipq40xx。所以:

cd openwrt/target/linux/ipq40xx

目前软件为Deco M9 Plus V2,结合之前以后的Deco系列命名:

$ rg deco
base-files/etc/board.d/02_network
129:	tplink,deco-m4r-v4)

base-files/etc/board.d/01_leds
201:tplink,deco-m4r-v4)

应该定为tplink,deco-m9plus-v2

然后参考其他新机的提交,应该在以下文件修改:

$ rg ac2200           
image/generic.mk
193:define Device/asus_map-ac2200
200:TARGET_DEVICES += asus_map-ac2200
1136:TARGET_DEVICES += asus_map-ac2200

files/arch/arm/boot/dts/qcom-ipq4019-map-ac2200.dts
11:	compatible = "asus,map-ac2200";

base-files/etc/uci-defaults/04_led_migration
6:asus,map-ac2200)

base-files/etc/hotplug.d/firmware/11-ath10k-caldata
21:	asus,map-ac2200)
56:	asus,map-ac2200|\
153:	asus,map-ac2200|\

base-files/etc/board.d/02_network
34:	asus,map-ac2200|\

base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
5:	asus,map-ac2200)

base-files/lib/upgrade/platform.sh
147:	asus,map-ac2200)

参考修改即可:

diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network
index babde1b..70a4a3d 100644
--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
+++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
@@ -32,6 +32,7 @@ ipq40xx_setup_interfaces()
 	8dev,jalapeno|\
 	alfa-network,ap120c-ac|\
 	asus,map-ac2200|\
+	tplink,deco-m9plus-v2|\
 	cilab,meshpoint-one|\
 	edgecore,ecw5211|\
 	glinet,gl-ap1300|\
diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index 654be26..2bbdf96 100644
--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -18,6 +18,7 @@ case "$FIRMWARE" in
 	;;
 "ath10k/pre-cal-pci-0000:01:00.0.bin")
 	case "$board" in
+	tplink,deco-m9plus-v2|\
 	asus,map-ac2200)
 		caldata_extract_ubi "Factory" 0x9000 0x2f20
 		ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
@@ -54,6 +55,7 @@ case "$FIRMWARE" in
 "ath10k/pre-cal-ahb-a000000.wifi.bin")
 	case "$board" in
 	asus,map-ac2200|\
+	tplink,deco-m9plus-v2|\
 	asus,rt-ac42u|\
 	asus,rt-ac58u)
 		caldata_extract_ubi "Factory" 0x1000 0x2f20
@@ -151,6 +153,7 @@ case "$FIRMWARE" in
 "ath10k/pre-cal-ahb-a800000.wifi.bin")
 	case "$board" in
 	asus,map-ac2200|\
+	tplink,deco-m9plus-v2|\
 	asus,rt-ac58u)
 		caldata_extract_ubi "Factory" 0x5000 0x2f20
 		;;
diff --git a/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh b/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
index 96e70f6..a93c646 100644
--- a/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
+++ b/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
@@ -2,6 +2,11 @@
 
 preinit_set_mac_address() {
 	case $(board_name) in
+    tplink,deco-m9plus-v2)
+		base_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)
+		ip link set dev eth1 address $(macaddr_add "$base_mac" 1)
+		ip link set dev eth2 address $(macaddr_add "$base_mac" 3)
+		;;
 	asus,map-ac2200)
 		base_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)
 		ip link set dev eth0 address $(macaddr_add "$base_mac" 1)
diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
index 22f2ee9..5f1aa74 100644
--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
@@ -144,6 +144,7 @@ platform_do_upgrade() {
 		fi
 		nand_do_upgrade "$1"
 		;;
+ 	tplink,deco-m9plus-v2 |\
 	asus,map-ac2200)
 		CI_KERNPART="linux"
 		nand_do_upgrade "$1"
diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk
index f5132cb..aa35b2f 100644
--- a/target/linux/ipq40xx/image/generic.mk
+++ b/target/linux/ipq40xx/image/generic.mk
@@ -1109,6 +1109,23 @@ endef
 # Missing DSA Setup
 #TARGET_DEVICES += tel_x1pro
 
+define Device/tplink_deco-m9plus-v2
+	$(call Device/FitzImage)
+	$(call Device/UbiFit)
+	DEVICE_VENDOR := TP-Link
+	DEVICE_MODEL := M9 Plus
+	DEVICE_VARIANT := v2
+	SOC := qcom-ipq4019
+	DEVICE_DTS_CONFIG := [email protected]
+	KERNEL_INITRAMFS_SUFFIX := -recovery.itb
+	IMAGE/factory.ubi := append-ubi | qsdk-ipq-factory-nand | append-rutx-metadata
+	PAGESIZE := 2048
+	BLOCKSIZE := 128k
+	DEVICE_PACKAGES := ath10k-firmware-qca9888-ct \
+		kmod-fs-ext4 kmod-mmc kmod-spi-dev mkf2fs e2fsprogs kmod-fs-f2fs kmod-bluetooth
+endef
+TARGET_DEVICES += tplink_deco-m9plus-v2
+
 define Device/unielec_u4019-32m
 	$(call Device/FitImage)
 	DEVICE_VENDOR := Unielec

其中,DEVICE_DTS_CONFIG这个参数,需要结合M9Plus的启动参数来判断,日志会输出这个信息。

最关键的文件是dts文件,即设备树。

设备树

因为都是ipq40xx,所以很多和同个目录下的机型,是可以共用的,即头部包含的dtsi文件。

但特别需要关注几个硬件参数:

  • 内存
  • Flash大小/分区表
  • 无线接口
  • 有线接口
  • GPIO(LED+Reset)

内存

相对简单,基本上找个512M机型的dts文件照抄即可;这里参考的是GL的B2000:

	memory {
		device_type = "memory";
		reg = <0x80000000 0x10000000>;
	};

Flash/分区表

首先需要知道原有的分区,根据启动日志:

name = SBL1                            , base = 0x00000000, size = 0x00030000 Bytes, usedFlag = 1
name = boot-config_0                   , base = 0x00030000, size = 0x00010000 Bytes, usedFlag = 1
name = MIBIB                           , base = 0x00040000, size = 0x00010000 Bytes, usedFlag = 1
name = boot-config_1                   , base = 0x00050000, size = 0x00010000 Bytes, usedFlag = 1
name = QSEE                            , base = 0x00060000, size = 0x00060000 Bytes, usedFlag = 1
name = CDT                             , base = 0x000c0000, size = 0x00010000 Bytes, usedFlag = 1
name = DDRPARAMS                       , base = 0x000d0000, size = 0x00010000 Bytes, usedFlag = 1
name = uboot-env                       , base = 0x000e0000, size = 0x00010000 Bytes, usedFlag = 1
name = fs-uboot@0                      , base = 0x000f0000, size = 0x00080000 Bytes, usedFlag = 1
name = radio                           , base = 0x00170000, size = 0x0000fff0 Bytes, usedFlag = 1
name = bluetooth-XTAL                  , base = 0x0017fff0, size = 0x00000010 Bytes, usedFlag = 1
name = default-mac                     , base = 0x00180000, size = 0x00001000 Bytes, usedFlag = 1
name = device-id                       , base = 0x00182000, size = 0x00001000 Bytes, usedFlag = 1
name = product-info                    , base = 0x00183000, size = 0x00005000 Bytes, usedFlag = 1
name = support-list                    , base = 0x00190000, size = 0x00010000 Bytes, usedFlag = 1
name = group-info                      , base = 0x001a0000, size = 0x00010000 Bytes, usedFlag = 1
name = user-config                     , base = 0x001b0000, size = 0x00010000 Bytes, usedFlag = 1
name = device-config                   , base = 0x001c0000, size = 0x00100000 Bytes, usedFlag = 1
name = partition-table@0               , base = 0x002c0000, size = 0x00002000 Bytes, usedFlag = 1
name = os-image@0                      , base = 0x002d0000, size = 0x00010000 Bytes, usedFlag = 1
name = file-system@0                   , base = 0x002e0000, size = 0x00010000 Bytes, usedFlag = 1
name = soft-version@0                  , base = 0x002f0000, size = 0x00010000 Bytes, usedFlag = 1
name = profile@0                       , base = 0x00300000, size = 0x00010000 Bytes, usedFlag = 1
name = default-config@0                , base = 0x00310000, size = 0x00010000 Bytes, usedFlag = 1
name = partition-table                 , base = 0x00320000, size = 0x00002000 Bytes, usedFlag = 1
name = fs-uboot                        , base = 0x00330000, size = 0x00080000 Bytes, usedFlag = 1
name = os-image                        , base = 0x003b0000, size = 0x00010000 Bytes, usedFlag = 1
name = file-system                     , base = 0x003c0000, size = 0x00010000 Bytes, usedFlag = 1
name = soft-version                    , base = 0x003d0000, size = 0x00010000 Bytes, usedFlag = 1
name = profile                         , base = 0x003e0000, size = 0x00010000 Bytes, usedFlag = 1
name = default-config                  , base = 0x003f0000, size = 0x00010000 Bytes, usedFlag = 1
name = tm-sig                          , base = 0x00400000, size = 0x00200000 Bytes, usedFlag = 1
name = user-config-bak                 , base = 0x00600000, size = 0x00010000 Bytes, usedFlag = 1
name = zigbee-cal                      , base = 0x00610000, size = 0x00000010 Bytes, usedFlag = 1
name = zigbee-firmware                 , base = 0x02700000, size = 0x00040000 Bytes, usedFlag = 1
name = emmc-gpt                        , base = 0x04000000, size = 0x00004400 Bytes, usedFlag = 1
name = emmc-os@0                       , base = 0x04004400, size = 0x00400000 Bytes, usedFlag = 1
name = emmc-files@0                    , base = 0x04404400, size = 0x04000000 Bytes, usedFlag = 1
name = emmc-os                         , base = 0x08404400, size = 0x00400000 Bytes, usedFlag = 1
name = emmc-files                      , base = 0x08804400, size = 0x04000000 Bytes, usedFlag = 1
name = emmc-config                     , base = 0x0c804400, size = 0x04000000 Bytes, usedFlag = 1

可以根据自己的需求来调整。

通常情况下,不修改uboot之前的分区。

无线接口

根据同目录下其他 AC200规格的写法,这里参考的是GL.iNet GL-B2200

&wifi0 {
	status = "okay";
	nvmem-cell-names = "pre-calibration";
	nvmem-cells = <&precal_art_1000>;
	qcom,ath10k-calibration-variant = "GL-B2200";
};

&wifi1 {
	status = "okay";
	nvmem-cell-names = "pre-calibration";
	nvmem-cells = <&precal_art_5000>;
	qcom,ath10k-calibration-variant = "GL-B2200";
	ieee80211-freq-limit = <5100000 5400000>;
};


&pcie0 {
	status = "okay";
	perst-gpio = <&tlmm 38 GPIO_ACTIVE_LOW>;
	wake-gpio = <&tlmm 50 GPIO_ACTIVE_LOW>;

	bridge@0,0 {
		reg = <0x00000000 0 0 0 0>;
		#address-cells = <3>;
		#size-cells = <2>;
		ranges;

		wifi2: wifi@1,0 {
			status = "okay";
			/* Bootlog shows this is a 168c:0056 - QCA 9888v2 */
			compatible = "qcom,ath10k";
			reg = <0x00010000 0 0 0 0>;
			nvmem-cell-names = "pre-calibration";
			nvmem-cells = <&precal_art_9000>;
			qcom,ath10k-calibration-variant = "GL-B2200";
			ieee80211-freq-limit = <5450000 5900000>;
		};
	};
};

有线接口

&swport4 {
	status = "okay";
	label = "eth2";
	nvmem-cell-names = "mac-address";
	nvmem-cells = <&macaddr_gmac1>;
};

&swport5 {
	status = "okay";
	label = "eth1";
	nvmem-cell-names = "mac-address";
	nvmem-cells = <&macaddr_gmac0>;
};

注意修改对应的MAC地址。

完整汇总如下:

// SPDX-License-Identifier: ISC
/*
 * Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved.
 * Copyright (c) 2020 Yanase Yuki <[email protected]>
 */

#include "qcom-ipq4019.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/soc/qcom,tcsr.h>
#include <dt-bindings/leds/common.h>

/ {
	model = "TP-Link Deco M9Plus v2";
	compatible = "tplink,deco-m9plus-v2", "qcom,ipq4019";

	memory {
		device_type = "memory";
		reg = <0x80000000 0x20000000>;
	};

	chosen {
		/*
		 * U-Boot adds "ubi.mtd=rootfs root=mtd:ubi_rootfs" to
		 * kernel command line. But we use different partition names,
		 * so we have to set correct parameters.
		 */
        bootargs-append = " clk_ignore_unused";
		stdout-path = &blsp1_uart1;
	};

	aliases {
		ethernet1 = &swport4;
		led-boot = &power_red;
		led-failsafe = &power_red;
		led-running = &power_green;
		led-upgrade = &power_green;
	};

	soc {
		rng@22000 {
			status = "okay";
		};

		tcsr@1949000 {
			compatible = "qcom,tcsr";
			reg = <0x1949000 0x100>;
			qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
		};

		tcsr@194b000 {
			compatible = "qcom,tcsr";
			reg = <0x194b000 0x100>;
			qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
			status = "okay";
		};

		ess_tcsr@1953000 {
			compatible = "qcom,tcsr";
			reg = <0x1953000 0x1000>;
			qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
		};

		tcsr@1957000 {
			compatible = "qcom,tcsr";
			reg = <0x1957000 0x100>;
			qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
		};

		crypto@8e3a000 {
			status = "okay";
		};

		watchdog@b017000 {
			status = "okay";
		};
	};

	leds {
		compatible = "gpio-leds";
		power_red: red {
			label = "red:system";
			gpios = <&tlmm 0 GPIO_ACTIVE_LOW>;
		};

		power_green: green {
			label = "green:system";
			gpios = <&tlmm 1 GPIO_ACTIVE_LOW>;
		};

		power_blue: blue {
			label = "blue:system";
			gpios = <&tlmm 2 GPIO_ACTIVE_LOW>;
		};
	};

	keys {
		compatible = "gpio-keys";

		reset {
			label = "reset";
			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
			linux,input-type = <1>;
		};
	};
};

&tlmm {
	serial_0_pins: serial0_pinmux {
		mux {
			pins = "gpio16", "gpio17";
			function = "blsp_uart0";
			bias-disable;
		};
	};

	mdio_pins: mdio_pinmux {
		mux_1 {
			pins = "gpio6";
			function = "mdio";
			bias-pull-up;
		};

		mux_2 {
			pins = "gpio7";
			function = "mdc";
			bias-pull-up;
		};
	};
};

&blsp_dma {
	status = "okay";
};

&blsp1_uart1 {
	pinctrl-0 = <&serial_0_pins>;
	pinctrl-names = "default";
	status = "okay";
};

&cryptobam {
	status = "okay";
};

&qpic_bam {
	status = "okay";
};

&nand {
	status = "okay";

	nand@0 {
		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			partition@0 {
				label = "sbl1";
				reg = <0x0 0x100000>;
				read-only;
			};

			partition@100000 {
				label = "mibib";
				reg = <0x100000 0x100000>;
				read-only;
			};

			partition@200000 {
				label = "boot-config-0";
				reg = <0x200000 0x100000>;
				read-only;
			};

			partition@300000 {
				label = "qsee";
				reg = <0x300000 0x100000>;
				read-only;
			};

			partition@400000 {
				label = "cdt";
				reg = <0x400000 0x80000>;
				read-only;
			};

			partition@480000 {
				label = "boot-config-1";
				reg = <0x480000 0x80000>;
				read-only;
			};

			partition@500000 {
				label = "uboot-env";
				reg = <0x500000 0x180000>;
				read-only;
			};

			partition@680000 {
				label = "uboot";
				reg = <0x680000 0x200000>;
				read-only;
			};

			partition@880000 {
				label = "art";
				reg = <0x880000 0x80000>;
				read-only;
				compatible = "nvmem-cells";
				#address-cells = <1>;
				#size-cells = <1>;

				precal_art_1000: precal@1000 {
					reg = <0x1000 0x2f20>;
				};

				precal_art_5000: precal@5000 {
					reg = <0x5000 0x2f20>;
				};

				precal_art_9000: precal@9000 {
					reg = <0x9000 0x2f20>;
				};

				macaddr_gmac0: macaddr@0 {
					reg = <0x0 0x6>;
				};

				macaddr_gmac1: macaddr@6 {
					reg = <0x6 0x6>;
				};
			};

            partition@900000 {
				label = "ubi";
				reg = <0x900000 0x7680000>;
            };
		};
	};
};


&gmac {
	status = "okay";
};

&switch {
	status = "okay";
};

&swport4 {
	status = "okay";
	label = "eth2";
	nvmem-cell-names = "mac-address";
	nvmem-cells = <&macaddr_gmac1>;
};

&swport5 {
	status = "okay";
	label = "eth1";
	nvmem-cell-names = "mac-address";
	nvmem-cells = <&macaddr_gmac0>;
};

&wifi0 {
	status = "okay";

	ieee80211-freq-limit = <2401000 2473000>;
    qcom,ath10k-calibration-variant = "TP-Link Deco M9Plus v2";

	nvmem-cell-names = "pre-calibration", "mac-address";
	nvmem-cells = <&precal_art_1000>;
	mac-address-increment = <1>;
};

&wifi1 {
	status = "okay";

	ieee80211-freq-limit = <5170000 5250000>;
    qcom,ath10k-calibration-variant = "TP-Link Deco M9Plus v2";

	nvmem-cell-names = "pre-calibration", "mac-address";
	nvmem-cells = <&precal_art_5000>;
	mac-address-increment = <2>;
};

&pcie0 {
	status = "okay";

	perst-gpios = <&tlmm 38 GPIO_ACTIVE_LOW>;
	wake-gpios = <&tlmm 40 GPIO_ACTIVE_LOW>;
	clkreq-gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;

	bridge@0,0 {
		reg = <0x00000000 0 0 0 0>;
		#address-cells = <3>;
		#size-cells = <2>;
		ranges;

		wifi2: wifi@1,0 {
			compatible = "qcom,ath10k";
			reg = <0x00010000 0 0 0 0>;

			ieee80211-freq-limit = <5450000 5900000>;
            qcom,ath10k-calibration-variant = "TP-Link Deco M9Plus v2";

            nvmem-cell-names = "pre-calibration", "mac-address";
            nvmem-cells = <&precal_art_9000>;
		};
	};
};

&mdio {
	status = "okay";
	pinctrl-0 = <&mdio_pins>;
	pinctrl-names = "default";
	reset-gpios = <&tlmm 41 GPIO_ACTIVE_LOW>;
};

&usb2 {
	status = "okay";

	dwc3@6000000 {
		#address-cells = <1>;
		#size-cells = <0>;

		usb2_port1: port@1 {
			reg = <1>;
			#trigger-source-cells = <0>;
		};
	};
};

&usb2_hs_phy {
	status = "okay";
};

&usb3 {
	status = "okay";

	dwc3@8a00000 {
		#address-cells = <1>;
		#size-cells = <0>;

		usb3_port1: port@1 {
			reg = <1>;
			#trigger-source-cells = <0>;
		};

		usb3_port2: port@2 {
			reg = <2>;
			#trigger-source-cells = <0>;
		};
	};
};

&usb3_hs_phy {
	status = "okay";
};

&usb3_ss_phy {
	status = "okay";
};

至此,便可以通过:

make menuconfig

选中tplink,deco-m9plus-v2机型,然后编译。

编译后的固件:

$ ls bin/targets/ipq40xx/generic/ |grep m9
openwrt-ipq40xx-generic-tplink_deco-m9plus-v2-initramfs-recovery.itb
openwrt-ipq40xx-generic-tplink_deco-m9plus-v2.manifest
openwrt-ipq40xx-generic-tplink_deco-m9plus-v2-squashfs-factory.ubi
openwrt-ipq40xx-generic-tplink_deco-m9plus-v2-squashfs-sysupgrade.bin

刷机

参考另一篇文章:uboot相关指令 - 付时凡 - 博客园 (cnblogs.com)

问题修复

启动后QCA9886未正常启动,报错如下:

[   11.918714] ath10k_pci 0000:01:00.0: Failed to find firmware-N.bin (N between 2 and 6) from ath10k/QCA9888/hw2.0: -12

应该是需要选中QCA 9886相关的package:

CONFIG_PACKAGE_ath10k-firmware-qca9888=y
CONFIG_PACKAGE_ath10k-board-qca9888=y

标签:name,手把手,Bytes,base,usedFlag,固件,ipq40xx,OpenWrt,size
From: https://www.cnblogs.com/adam-ma/p/17967343

相关文章

  • 手把手教你MongoDB 数据库连接URL 格式、authSource参数
    快速了解MongoDB官方文档MongoDB是一个文档数据库MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成使用URL连接MongoDB数据库标准URI连接语法:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]......
  • openwrt编译记录
    最近在做openwrt的开发,因此这里记录一下过程:这里我用的编译环境是wsl2,虚拟机时ubuntu20.04,因为wsl可以更充分的使用电脑性能,这样编译的快点,实测我编译rk3568的openwrt固件大概就花了三个小时的样子。下面记录下步骤:1、配置上网环境这个步骤是必须的,不然会极大概率失败,我之前失......
  • 03-集群搭建:手把手教你玩转 Kubernete 集群搭建
    通过上一节课的学习,我们已经对Kubernetes的架构有了清楚的认识。但是到现在还没有和Kubernetes集群真正打过交道,所以你可能有一种“不识庐山真面目”的云里雾里的感觉。那么本节课,我们就来学习如何搭建Kubernetes集群,开启探索Kubernetes的第一站。在线Kubernetes集群......
  • 超微主板升级BMC和BIOS固件方法
    Netgate1541是Netgate公司2018年推出的一台1U防火墙设备,采用八核IntelXeon®CPUD1541,千兆和万兆端口各两个,并可扩展网络接口,能实现高达18.8Gbps的路由性能。Netgate1541防火墙实际上使用的是超微SYS-5018D-FN4T平台。2019年自行购入一台,稳定运行至今。考虑系统BMC和BIOS还是......
  • springboot集成swagger knife4j 最详细的步骤 手把手教你继承swagger
    springboot集成swaggerknife4j最详细的步骤手把手教你继承swagger效果图Knife4j介绍Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目一开始项目初衷是为了写一个增强版本的swagger的前端ui,但是随着项目的发展,面对越来越多的个性......
  • 手把手让你学会从压测到指标分析
    介绍wrk是一种使用Lua编写的HTTP压力测试工具,它是一个轻量级的开源工具,适用于测试Web服务器和Web应用程序的性能。以下是对wrk工具的特点、易用性、文档和社区支持等因素的简要介绍:特点:高性能:wrk使用多线程和事件驱动的I/O模型,可以获得很高的吞吐量。灵活性:wrk具有......
  • 服务器的固件和OS
    服务器的固件和OS服务器的固件主要包括BIOS或UEFI、BMC、CMOS,OS包括32位和64位。1)BIOS(Basic input/ Output System)即基本输入输出系统,是服务器启动后最先运行的软件。它包括基本输入输出控制程序、上电自检程序、系统启动自检程序、系统设置信息。BIOS是服务器硬件和OS之间的抽......
  • 手把手教你用 Python 去除图片和 PDF 水印
    我们在平时的学习,工作和写作中,有时会遇到一些需要将图片的水印去除的场景。虽然网络上有很多免费或者付费的软件可以帮助我们去除图片水印,但作为程序员,我们完全可以自己动手编程实现。原理分析假设我们需要将下面这张图片里的水印,使用Python代码去除。图像是由像素组成的,每......
  • Goland 2023.3.2最新安装激活教程,手把手带你激活Goland,永久有效!
    大家好,欢迎来到程序视点!我是小二哥。前言作为一个go语言程序员,觉得自己有义务为go新手开一条更简单便捷的上手之路。纵使网上教程很多,但总不尽人意。go的入门门槛还是非常低的,无论是安装还是使用。俗话说“工欲善其事必先利其器”,作为Go语言编程开发者,最锋利的编程工具非Gola......
  • stm32实战之su-03t语音模块固件的制作与烧录
    su-03t简介SU-03T是一款低成本、低功耗、小体积的离线语音识别模组,能快速应用于智能家居,各类智能小家电,86盒,玩具,灯具等需要语音操控的产品,SU-03T也具备强大的软件开发能力,我们可以在“智能公元”平台上实现语音固件的零代码开发,提高工作效率。管脚定义其中需要注意的是UART0的B0......