[Orangepi]设备树备份

/sdk/orangepi-build/kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b-v2.dts

// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2020 Rockchip Electronics Co., Ltd.
*
*/
/dts-v1/;

#include #include #include #include #include #include #include #include “rk3566.dtsi”
#include “rk3568-linux.dtsi”

/ {
model = “Rockchip RK3566 OPi 3B”;
compatible = “rockchip,rk3566-orangepi-3b”, “rockchip,rk3566”;

chosen: chosen {
bootargs = “earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 isolcpus=3”;
};

/* labeled +12v in schematic */
vcc12v_dcin: vcc12v-dcin-regulator {
compatible = “regulator-fixed”;
regulator-name = “vcc12v_dcin”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <12000000>;
regulator-max-microvolt = <12000000>;
};

/* labeled +5v in schematic */
vcc_5v: vcc-5v-regulator {
compatible = “regulator-fixed”;
regulator-name = “vcc_5v”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
vin-supply = <&vcc12v_dcin>;
};

vbus: vbus {
compatible = “regulator-fixed”;
regulator-name = “vbus”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};

/* labeled +3.3v For PCIe only in schematic */
vcc3v3_pcie: vcc3v3-pcie-regulator {
compatible = “regulator-fixed”;
regulator-name = “vcc3v3_pcie”;
regulator-always-on;
regulator-boot-on;
enable-active-high;
gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
pinctrl-names = “default”;
pinctrl-0 = <&pcie_drv>;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
vin-supply = <&vcc12v_dcin>;
};

hdmi_sound: hdmi-sound {
compatible = “simple-audio-card”;
simple-audio-card,format = “i2s”;
simple-audio-card,mclk-fs = <128>;
simple-audio-card,name = “rockchip,hdmi”;
status = “disabled”;

simple-audio-card,cpu {
sound-dai = <&i2s0_8ch>;
};
simple-audio-card,codec {
sound-dai = <&hdmi>;
};
};

key_irq {
compatible = “alientek,key”;
pinctrl-0 = <&key_irq_gpio>;
pinctrl-names = “alientek,key”;
misckey-gpio = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>;
interrupt-parent = <&gpio3>;
interrupts = <26 IRQ_TYPE_EDGE_BOTH>;
status = “okay”;
};

miscled {
compatible = “alientek,miscled”;
miscled-gpio = <&gpio3 RK_PD1 GPIO_ACTIVE_HIGH>;
status = “okay”;
};

leds: leds {
compatible = “gpio-leds”;
pinctrl-names = “default”;
pinctrl-0 =<&leds_gpio>;

led@1 {
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
label = “status_led”;
linux,default-trigger = “heartbeat”;
};

};

rk809_sound: rk809-sound {
status = “okay”;
compatible = “rockchip,multicodecs-card”;
rockchip,card-name = “rockchip-rk809”;
hp-det-gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>;
rockchip,format = “i2s”;
rockchip,mclk-fs = <256>;
rockchip,cpu = <&i2s1_8ch>;
rockchip,codec = <&rk809_codec>;
pinctrl-names = “default”;
pinctrl-0 = <&hp_det>;
};

vcc3v3_sys: vcc3v3-sys {
compatible = “regulator-fixed”;
regulator-name = “vcc3v3_sys”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
vin-supply = <&vbus>;
};

vcc5v0_sys: vcc5v0-sys {
compatible = “regulator-fixed”;
regulator-name = “vcc5v0_sys”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
vin-supply = <&vbus>;
};

vcc5v0_usb: vcc5v0-usb {
compatible = “regulator-fixed”;
regulator-name = “vcc5v0_usb”;
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
vin-supply = <&vbus>;
};

sdio_pwrseq: sdio-pwrseq {
compatible = “mmc-pwrseq-simple”;
clocks = <&rk809 1>;
clock-names = “ext_clock”;
pinctrl-names = “default”;
pinctrl-0 = <&wifi_enable_h>;

/*
* On the module itself this is one of these (depending
* on the actual card populated):
* – SDIO_RESET_L_WL_REG_ON
* – PDN (power down when low)
*/
post-power-on-delay-ms = <200>;
reset-gpios = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>;
};

test-power {
status = “okay”;
};

wireless_wlan: wireless-wlan {
compatible = “wlan-platdata”;
rockchip,grf = <&grf>;
wifi_chip_type = “ap6256”;
WIFI,host_wake_irq = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>;
status = “okay”;
};

wireless_bluetooth: wireless-bluetooth {
compatible = “bluetooth-platdata”;
clocks = <&rk809 1>;
clock-names = “ext_clock”;
uart_rts_gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
pinctrl-names = “default”, “rts_gpio”;
pinctrl-0 = <&uart1m0_rtsn>;
pinctrl-1 = <&uart1_gpios>;
BT,reset_gpio = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
BT,wake_gpio = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>;
BT,wake_host_irq = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
status = “okay”;
};

vcc_camera_ov5647: vcc-camera-ov5647 {
status = “okay”;
compatible = “regulator-fixed”;
regulator-name = “vcc_camera_ov5647”;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-boot-on;
};

ext_cam_ov5647_clk: external-camera-ov5647-clock {
compatible = “fixed-clock”;
clock-frequency = <25000000>;
clock-output-names = “ext_cam_ov5647_clk”;
#clock-cells = <0>;
};

vcc_sd: vcc-sd {
compatible = “regulator-fixed”;
regulator-max-microvolt = <3300000>;
regulator-min-microvolt = <3300000>;
regulator-name = “vcc_sd”;
vin-supply = <&vcc3v3_sys>;
};

vccio_phy: vcc-phy-regulator {
compatible = “regulator-fixed”;
regulator-max-microvolt = <1800000>;
regulator-min-microvolt = <1800000>;
regulator-name = “vccio_phy”;
regulator-always-on;
regulator-boot-on;
};

vcc5v0_host: vcc5v0-host-regulator {
compatible = “regulator-fixed”;
enable-active-high;
gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
pinctrl-names = “default”;
pinctrl-0 = <&vcc5v0_host_en>;
regulator-name = “vcc5v0_host”;
regulator-always-on;
};

vcc5v0_otg: vcc5v0-otg-regulator {
compatible = “regulator-fixed”;
enable-active-high;
gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
pinctrl-names = “default”;
pinctrl-0 = <&vcc5v0_otg_en>;
regulator-name = “vcc5v0_otg”;
regulator-always-on;
};

fan: pwm-fan {
compatible = “pwm-fan”;
#cooling-cells = <2>;
pwms = <&pwm7 0 20000000 0>;
cooling-levels = <0 50 100 150 200 255>;
rockchip,temp-trips = < 50000 1 55000 2 60000 3 65000 4 70000 5 >;

status = “okay”;
};

backlight: backlight {
compatible = “pwm-backlight”;
pwms = <&pwm2 0 25000 0>;
brightness-levels = < 0 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 >;
default-brightness-level = <200>;
};

edp-panel {
compatible = “simple-panel”;
backlight = <&backlight>;
prepare-delay-ms = <120>;
enable-delay-ms = <120>;
unprepare-delay-ms = <120>;
disable-delay-ms = <120>;

display-timings {
native-mode = <&edp_timing>;

edp_timing: timing0 {
clock-frequency = <125000000>;
hactive = <1920>;
vactive = <1080>;
hback-porch = <180>;
hfront-porch = <120>;
vback-porch = <10>;
vfront-porch = <10>;
hsync-len = <20>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};

port {
panel_in_edp: endpoint {
remote-endpoint = <&edp_out_panel>;
};
};
};
};

&bus_npu {
bus-supply = <&vdd_logic>;
pvtm-supply = <&vdd_cpu>;
status = “okay”;
};

&cpu0 {
cpu-supply = <&vdd_cpu>;
};

&dfi {
status = “okay”;
};

&dmc {
center-supply = <&vdd_logic>;
status = “disabled”;
};

&gpu {
mali-supply = <&vdd_gpu>;
status = “okay”;
};

&hdmi {
status = “okay”;
rockchip,phy-table =
<92812500 0x8009 0x0000 0x0270>,
<165000000 0x800b 0x0000 0x026d>,
<185625000 0x800b 0x0000 0x01ed>,
<297000000 0x800b 0x0000 0x01ad>,
<594000000 0x8029 0x0000 0x0088>,
<000000000 0x0000 0x0000 0x0000>;
};

&hdmi_in_vp0 {
status = “okay”;
};

&hdmi_in_vp1 {
status = “disabled”;
};

&hdmi_sound {
status = “okay”;
};

&i2c0 {
status = “okay”;

vdd_cpu: syr837@40 {
compatible = “silergy,syr827”;
reg = <0x40>;
vin-supply = <&vcc5v0_sys>;
regulator-compatible = “fan53555-reg”;
regulator-name = “vdd_cpu”;
regulator-min-microvolt = <712500>;
regulator-max-microvolt = <1390000>;
regulator-init-microvolt = <900000>;
regulator-initial-mode = <1>;
regulator-ramp-delay = <2300>;
fcs,suspend-voltage-selector = <1>;
regulator-boot-on;
regulator-always-on;
regulator-state-mem {
regulator-off-in-suspend;
};
};

rk809: pmic@20 {
compatible = “rockchip,rk809”;
reg = <0x20>;
interrupt-parent = <&gpio0>;
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = “default”, “pmic-sleep”,
“pmic-power-off”, “pmic-reset”;
pinctrl-0 = <&pmic_int>;
pinctrl-1 = <&soc_slppin_slp>, <&rk817_slppin_slp>;
pinctrl-2 = <&soc_slppin_gpio>, <&rk817_slppin_pwrdn>;
pinctrl-3 = <&soc_slppin_gpio>, <&rk817_slppin_rst>;

rockchip,system-power-controller;
wakeup-source;
#clock-cells = <1>;
clock-output-names = “rk808-clkout1”, “rk808-clkout2”;
//fb-inner-reg-idxs = <2>;
/* 1: rst regs (default in codes), 0: rst the pmic */
pmic-reset-func = <0>;
/* not save the PMIC_POWER_EN register in uboot */
not-save-power-en = <1>;

vcc1-supply = <&vcc3v3_sys>;
vcc2-supply = <&vcc3v3_sys>;
vcc3-supply = <&vcc3v3_sys>;
vcc4-supply = <&vcc3v3_sys>;
vcc5-supply = <&vcc3v3_sys>;
vcc6-supply = <&vcc3v3_sys>;
vcc7-supply = <&vcc3v3_sys>;
vcc8-supply = <&vcc3v3_sys>;
vcc9-supply = <&vcc3v3_sys>;

pwrkey {
status = “okay”;
};

pinctrl_rk8xx: pinctrl_rk8xx {
gpio-controller;
#gpio-cells = <2>;

rk817_slppin_null: rk817_slppin_null {
pins = “gpio_slp”;
function = “pin_fun0”;
};

rk817_slppin_slp: rk817_slppin_slp {
pins = “gpio_slp”;
function = “pin_fun1”;
};

rk817_slppin_pwrdn: rk817_slppin_pwrdn {
pins = “gpio_slp”;
function = “pin_fun2”;
};

rk817_slppin_rst: rk817_slppin_rst {
pins = “gpio_slp”;
function = “pin_fun3”;
};
};

regulators {
vdd_logic: DCDC_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>;
regulator-init-microvolt = <900000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = “vdd_logic”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vdd_gpu: DCDC_REG2 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>;
regulator-init-microvolt = <900000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = “vdd_gpu”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcc_ddr: DCDC_REG3 {
regulator-always-on;
regulator-boot-on;
regulator-initial-mode = <0x2>;
regulator-name = “vcc_ddr”;
regulator-state-mem {
regulator-on-in-suspend;
};
};

vdd_npu: DCDC_REG4 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>;
regulator-init-microvolt = <900000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = “vdd_npu”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vdda0v9_image: LDO_REG1 {
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <900000>;
regulator-max-microvolt = <900000>;
regulator-name = “vdda0v9_image”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vdda_0v9: LDO_REG2 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <900000>;
regulator-max-microvolt = <900000>;
regulator-name = “vdda_0v9”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vdda0v9_pmu: LDO_REG3 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <900000>;
regulator-max-microvolt = <900000>;
regulator-name = “vdda0v9_pmu”;
regulator-state-mem {
regulator-on-in-suspend;
regulator-suspend-microvolt = <900000>;
};
};

vccio_acodec: LDO_REG4 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>;
regulator-name = “vccio_acodec”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vccio_sd: LDO_REG5 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-name = “vccio_sd”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcc3v3_pmu: LDO_REG6 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-name = “vcc3v3_pmu”;
regulator-state-mem {
regulator-on-in-suspend;
regulator-suspend-microvolt = <3300000>;
};
};

vcca_1v8: LDO_REG7 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-name = “vcca_1v8”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcca1v8_pmu: LDO_REG8 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-name = “vcca1v8_pmu”;
regulator-state-mem {
regulator-on-in-suspend;
regulator-suspend-microvolt = <1800000>;
};
};

vcca1v8_image: LDO_REG9 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-name = “vcca1v8_image”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcc_1v8: DCDC_REG5 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-name = “vcc_1v8”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcc_3v3: SWITCH_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-name = “vcc_3v3”;
regulator-state-mem {
regulator-off-in-suspend;
};
};

vcc3v3_sd: SWITCH_REG2 {
regulator-always-on;
regulator-boot-on;
regulator-name = “vcc3v3_sd”;
regulator-state-mem {
regulator-off-in-suspend;
};
};
};

rk809_codec: codec {
#sound-dai-cells = <1>;
compatible = “rockchip,rk809-codec”, “rockchip,rk817-codec”;
clocks = <&cru I2S1_MCLKOUT>;
clock-names = “mclk”;
assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
assigned-clock-rates = <12288000>;
assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
pinctrl-names = “default”;
pinctrl-0 = <&i2s1m0_mclk>;
hp-volume = <20>;
spk-volume = <3>;
mic-in-differential;
status = “okay”;
};
};
};

&uart1 {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>;
};

&uart3 {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&uart3m0_xfer>;
dma-names = “tx”, “rx”;
};

&pwm7 {
status = “okay”;
};

&i2s0_8ch {
status = “okay”;
};

&i2s1_8ch {
status = “okay”;
rockchip,clk-trcm = <1>;
pinctrl-names = “default”;
pinctrl-0 = <&i2s1m0_sclktx &i2s1m0_lrcktx &i2s1m0_sdi0 &i2s1m0_sdo0>;
};

&iep {
status = “okay”;
};

&iep_mmu {
status = “okay”;
};

&jpegd {
status = “okay”;
};

&jpegd_mmu {
status = “okay”;
};

&mpp_srv {
status = “okay”;
};

&pinctrl {
wireless-bluetooth {
uart1_gpios: uart1-gpios {
rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

sd {
sdmmc0_pwr_h: sdmmc0-pwr-h {
rockchip,pins =
<0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

mxc6655xa {
mxc6655xa_irq_gpio: mxc6655xa_irq_gpio {
rockchip,pins = <3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

pmic {
pmic_int: pmic_int {
rockchip,pins =
<0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
};

soc_slppin_gpio: soc_slppin_gpio {
rockchip,pins =
<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
};

soc_slppin_slp: soc_slppin_slp {
rockchip,pins =
<0 RK_PA2 1 &pcfg_pull_none>;
};

soc_slppin_rst: soc_slppin_rst {
rockchip,pins =
<0 RK_PA2 2 &pcfg_pull_none>;
};
};

touch {
touch_gpio: touch-gpio {
rockchip,pins =
<0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>,
<0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

sdio-pwrseq {
wifi_enable_h: wifi-enable-h {
rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

usb {
vcc5v0_host_en: vcc5v0-host-en {
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
};

vcc5v0_otg_en: vcc5v0-otg-en {
rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

wireless-bluetooth {
uart8_gpios: uart8-gpios {
rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

key-irq-gpios {
/omit-if-no-ref/
key_irq_gpio: key-irq-pin {
rockchip,pins = <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

work-led {
leds_gpio: leds-gpio {
rockchip,pins = < 0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;

};
};

headphone {
hp_det: hp-det {
rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_down>;
};
};

pcie {
pcie_drv: pcie-drv {
rockchip,pins =
<0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

edp {
edp_hpd: edp-hpd {
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
};

bl_en: bl-en {
rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_output_high>;
};
};
};

/*
* There are 10 independent IO domains in RK3566/RK3568, including PMUIO[0:2] and VCCIO[1:7].
* 1/ PMUIO0 and PMUIO1 are fixed-level power domains which cannot be configured;
* 2/ PMUIO2 and VCCIO1,VCCIO[3:7] domains require that their hardware power supply voltages
* must be consistent with the software configuration correspondingly
* a/ When the hardware IO level is connected to 1.8V, the software voltage configuration
* should also be configured to 1.8V accordingly;
* b/ When the hardware IO level is connected to 3.3V, the software voltage configuration
* should also be configured to 3.3V accordingly;
* 3/ VCCIO2 voltage control selection (0xFDC20140)
* BIT[0]: 0x0: from GPIO_0A7 (default)
* BIT[0]: 0x1: from GRF
* Default is determined by Pin FLASH_VOL_SEL/GPIO0_A7:
* L:VCCIO2 must supply 3.3V
* H:VCCIO2 must supply 1.8V
*/

&pmu_io_domains {
status = “okay”;
pmuio1-supply = <&vcc3v3_pmu>;
pmuio2-supply = <&vcc3v3_pmu>;
vccio1-supply = <&vcc_3v3>;
vccio2-supply = <&vcc_1v8>;
vccio3-supply = <&vccio_sd>;
vccio4-supply = <&vcc_1v8>;
vccio5-supply = <&vccio_phy>;
vccio6-supply = <&vcc_3v3>;
vccio7-supply = <&vcc_3v3>;
};

&rk_rga {
status = “okay”;
};

&rkvdec {
status = “okay”;
};

&rkvdec_mmu {
status = “okay”;
};

&rkvenc {
venc-supply = <&vdd_logic>;
status = “okay”;
};

&rkvenc_mmu {
status = “okay”;
};

&rknpu {
rknpu-supply = <&vdd_npu>;
status = “okay”;
};

&rknpu_mmu {
status = “okay”;
};

&route_hdmi {
status = “disabled”;
connect = <&vp0_out_hdmi>;
};

&saradc {
status = “okay”;
vref-supply = <&vcca_1v8>;
};

&sdhci {
bus-width = <8>;
no-sdio;
no-sd;
non-removable;
max-frequency = <200000000>;
pinctrl-names = “default”;
pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
status = “okay”;
};

&sdmmc0 {
max-frequency = <150000000>;
no-sdio;
no-mmc;
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
disable-wp;
sd-uhs-sdr104;
vmmc-supply = <&vcc_sd>;
vqmmc-supply = <&vccio_sd>;
pinctrl-names = “default”;
pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>;
status = “okay”;
};

&sfc {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&fspi_pins>;

flash@0 {
compatible = “jedec,spi-nor”;
reg = <0>;
spi-max-frequency = <100000000>;
spi-rx-bus-width = <4>;
spi-tx-bus-width = <1>;
};
};

&tsadc {
status = “okay”;
};

&u2phy0_host {
phy-supply = <&vbus>;
status = “okay”;
};

&u2phy0_otg {
vbus-supply = <&vcc5v0_otg>;
status = “okay”;
};

&u2phy1_host {
status = “okay”;
};

&u2phy1_otg {
status = “okay”;
};

&usb2phy0 {
status = “okay”;
};

&usb2phy1 {
status = “okay”;
};

&usb_host0_ehci {
status = “okay”;
};

&usb_host0_ohci {
status = “okay”;
};

&usb_host1_ehci {
status = “okay”;
};

&usb_host1_ohci {
status = “okay”;
};

&usbdrd_dwc3 {
dr_mode = “otg”;
extcon = <&usb2phy0>;
status = “okay”;
};

&usbdrd30 {
status = “okay”;
};

&usbhost_dwc3 {
status = “okay”;
};

&usbhost30 {
status = “okay”;
};

&vdpu {
status = “okay”;
};

&vdpu_mmu {
status = “okay”;
};

&vepu {
status = “okay”;
};

&vepu_mmu {
status = “okay”;
};

&vop {
status = “okay”;
assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>;
assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>;
};

&vop_mmu {
status = “okay”;
};

&mdio1 {
rgmii_phy0: phy@0 {
compatible = “ethernet-phy-ieee802.3-c22”;
reg = <0x0>;
};
};

&gmac1 {
phy-mode = “rgmii”;
clock_in_out = “input”;

snps,reset-gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
//snps,reset-delays-us = <0 20000 100000>;
snps,reset-delays-us = <0 50000 200000>;

assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>;
assigned-clock-rates = <0>, <125000000>;

pinctrl-names = “default”;
pinctrl-0 = <&gmac1m0_miim &gmac1m0_tx_bus2 &gmac1m0_rx_bus2 &gmac1m0_rgmii_clk &gmac1m0_clkinout &gmac1m0_rgmii_bus>;

tx_delay = <0x30>;
rx_delay = <0x10>;

phy-handle = <&rgmii_phy0>;
status = “okay”;
};

&sdmmc1 {
max-frequency = <150000000>;
no-sd;
no-mmc;
bus-width = <4>;
disable-wp;
cap-sd-highspeed;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
pinctrl-names = “default”;
pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>;
sd-uhs-sdr104;
status = “okay”;
};

&combphy1_usq {
status = “okay”;
};

&combphy2_psq {
status = “okay”;
};

&pcie2x1 {
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie>;
status = “okay”;
};

&vp0 {
rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0 | 1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1 | 1 << ROCKCHIP_VOP2_SMART1)>;
rockchip,primary-plane = ;
cursor-win-id = ;
};

&i2c1 {
status = “okay”;

ov5647: ov5647@36 {
status = “disabled”;
compatible = “ovti,ov5647”;
reg = <0x36>;
clocks = <&ext_cam_ov5647_clk>;
clock-names = “ext_cam_ov5647_clk”;
pwdn-gpios = <&gpio2 RK_PC6 GPIO_ACTIVE_LOW>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = “back”;
rockchip,camera-module-name = “LMM248”;
rockchip,camera-module-lens-name = “YXC-M804A2”;
port {
ov5647_out: endpoint {
remote-endpoint = <&dphy1_in>;
data-lanes = <1 2>;
};
};
};

raspits_panel: raspits-panel@45 {
status = “disabled”;
compatible = “raspberrypi,7inch-touchscreen-panel”;
reg = <0x45>;

port {
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};

raspits_touch_ft5426: raspits-touch-ft5426@38 {
status = “disabled”;
compatible = “raspits_ft5426”;
reg = <0x38>;
};
};

&csi2_dphy_hw {
status = “disabled”;
};

&csi2_dphy0 {
status = “disabled”;
};

&csi2_dphy1 {
status = “disabled”;
/*
* dphy1 only used for split mode,
* can be used concurrently with dphy2
* full mode and split mode are mutually exclusive
*/
ports {
#address-cells = <1>;
#size-cells = <0>;

port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;

dphy1_in: endpoint@1 {
reg = <1>;
remote-endpoint = <&ov5647_out>;
data-lanes = <1 2>;
};
};

port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;

dphy1_out: endpoint@1 {
reg = <1>;
remote-endpoint = <&isp0_in>;
};
};
};
};

&rkisp {
status = “disabled”;
};

&rkisp_mmu {
status = “disabled”;
};

&rkisp_vir0 {
status = “disabled”;
port {
#address-cells = <1>;
#size-cells = <0>;

isp0_in: endpoint@0 {
reg = <0>;
remote-endpoint = <&dphy1_out>;
};
};
};

&edp {
status = “disabled”;
force-hpd;
hpd-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
pinctrl-names = “default”;
pinctrl-0 = <&edp_hpd &bl_en>;

ports {
port@1 {
reg = <1>;

edp_out_panel: endpoint {
remote-endpoint = <&panel_in_edp>;
};
};
};
};

&edp_phy {
status = “disabled”;
};

&route_edp {
status = “disabled”;
};

&pwm2 {
status = “disabled”;
};

&dsi1 {
status = “disabled”;

ports {
port@1 {
reg = <1>;

dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};

[Qt]姿态显示仪

——————pro————————
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
AttitudeDisplay.cpp \
main.cpp \
mainwindow.cpp

HEADERS += \
AttitudeDisplay.h \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

———————-AttitudeDisplay.h————————-
#ifndef ATTITUDEDISPLAY_H
#define ATTITUDEDISPLAY_H

#include

class AttitudeDisplay : public QWidget {
Q_OBJECT
public:
explicit AttitudeDisplay(QWidget *parent = nullptr);

void setAttitude(double roll, double pitch, double yaw);

protected:
void paintEvent(QPaintEvent *event) override;

private:
double m_roll; // 滚转角 (Roll)
double m_pitch; // 俯仰角 (Pitch)
double m_yaw; // 偏航角 (Yaw)
};

#endif // ATTITUDEDISPLAY_H

——————————mainwindow.h—————————
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include “AttitudeDisplay.h”

class MainWindow : public QMainWindow {
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
AttitudeDisplay *attitudeDisplay;
};

#endif // MAINWINDOW_H

————AttitudeDisplay.cpp——————————————-
#include “AttitudeDisplay.h”
#include
#include

AttitudeDisplay::AttitudeDisplay(QWidget *parent)
: QWidget(parent), m_roll(0), m_pitch(0), m_yaw(0) {
setMinimumSize(300, 300); // 设置最小尺寸
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 允许自动调整大小
}

void AttitudeDisplay::setAttitude(double roll, double pitch, double yaw) {
m_roll = roll;
m_pitch = pitch;
m_yaw = yaw;
update(); // 触发重绘
}

void AttitudeDisplay::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

int centerX = width() / 2;
int centerY = height() / 2;
int radius = qMin(width(), height()) / 2 – 10;

// 绘制圆形背景
painter.setBrush(QColor(30, 30, 30));
painter.setPen(Qt::NoPen);
painter.drawEllipse(centerX – radius, centerY – radius, radius * 2, radius * 2);

// 绘制天空和地面(改为圆形分段显示)
painter.save();
painter.translate(centerX, centerY); // 移动坐标系统到圆心
painter.rotate(-m_roll); // 根据滚转角旋转地平线

// 绘制天空部分(上半圆)
painter.setBrush(QColor(100, 150, 255)); // 天空蓝
painter.setPen(Qt::NoPen);
painter.drawPie(-radius, -radius, radius * 2, radius * 2, 90 * 16, 180 * 16); // 绘制上半圆

// 绘制地面部分(下半圆)
painter.setBrush(QColor(180, 100, 50)); // 地面棕
painter.setPen(Qt::NoPen);
painter.drawPie(-radius, -radius, radius * 2, radius * 2, -90 * 16, 180 * 16); // 绘制下半圆

painter.restore();

// 绘制俯仰线
painter.setPen(QPen(Qt::white, 2));
int pitchOffset = static_cast(m_pitch * radius / 90.0);
painter.drawLine(centerX – radius, centerY + pitchOffset, centerX + radius, centerY + pitchOffset);

// 绘制刻度
for (int i = -90; i <= 90; i += 15) { int offset = static_cast(i * radius / 90.0);
painter.drawLine(centerX – radius / 4, centerY + offset, centerX + radius / 4, centerY + offset);
if (i != 0) {
painter.drawText(QPointF(centerX + radius / 4 + 5, centerY + offset + 5), QString::number(i));
}
}

// 绘制指针
painter.setPen(QPen(Qt::yellow, 2));
painter.drawLine(centerX, centerY – radius, centerX, centerY + radius);

// 绘制中心指针
painter.setBrush(Qt::red);
painter.setPen(Qt::NoPen);
painter.drawEllipse(QPointF(centerX, centerY), 5, 5);

// 绘制仪表盘外圈
painter.setPen(QPen(Qt::white, 2));
painter.setBrush(Qt::NoBrush);
painter.drawEllipse(centerX – radius, centerY – radius, radius * 2, radius * 2);

// 绘制文字信息
painter.setPen(Qt::black);
painter.setFont(QFont(“Arial”, 12, QFont::Bold));
QString text = QString(“Roll: %1°\nPitch: %2°\nYaw: %3°”)
.arg(m_roll, 0, ‘f’, 1)
.arg(m_pitch, 0, ‘f’, 1)
.arg(m_yaw, 0, ‘f’, 1);
painter.drawText(centerX – radius + 15, centerY + radius + 0, text);
}
—————————main.cpp—————————
#include “mainwindow.h”
#include

int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

————————-mainwindow.cpp—————————–
#include “mainwindow.h”
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), attitudeDisplay(new AttitudeDisplay(this)) {
setWindowTitle(“圆形姿态仪”);
setMinimumSize(400, 400);

// 设置布局,将仪表盘放在中央
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->addWidget(attitudeDisplay);
layout->setAlignment(attitudeDisplay, Qt::AlignCenter);

// 模拟姿态数据更新
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [this]() {
static double roll = 0, pitch = 0, yaw = 0;
roll += 1.0;
pitch += 0.5;
yaw += 0.3;

if (roll > 180) roll = -180;
if (pitch > 90) pitch = -90;
if (yaw > 360) yaw -= 360;

attitudeDisplay->setAttitude(roll, pitch, yaw);
});
timer->start(50); // 每 50 毫秒更新一次
}

MainWindow::~MainWindow() {
delete attitudeDisplay;
}

[orangepi]安装步骤

0.修改密码
sudo passwd root
sudo passwd orangepi

nmcli connection delete uuid XXXX

1.连接无线
sudo nmcli –ask dev wifi connect mini_5G password fsw2021fsw ifname wlan0

sudo nmcli –ask dev wifi connect TP-LINK_7787 password yyxlx18396870603 ifname wlan0

sudo nmcli –ask dev wifi connect mini_5G password fsw2021fsw ifname wlx7822884b2787

sudo nmcli –ask dev wifi connect rtlwap password mqdqxyg1qy ifname wlx7822884b2787
sudo nmcli dev wifi connect password ifname

2.安装ssh
sudo apt-get install openssh-server
3.安装vnc
sudo set_vnc.sh
连接VNC 端口号为5901
4.安装qt
sudo install_qt.sh

5.

[Linux]开机自运行脚本

sudo vi /usr/local/bin/load_module.sh

//skyport的
#!/bin/bash
sleep 1
insmod /home/orangepi/wlanuav.ko rtw_country_code=”CN”
sleep 1
sudo iw dev wlx7822884b2786 set type AP
sleep 2
nmcli dev set wlx7822884b2786 managed no
sleep 2
sudo /usr/sbin/hostapd /usr/sbin/1.config -B
sleep 2
sudo ifconfig wlx7822884b2786 192.168.16.1
sleep 2
sudo openvpn –config /home/orangepi/skyport.ovpn –daemon
sleep 2
echo “autorun init done”

//baseport的

#!/bin/bash
chmod 777 /dev/spidev3.0
sleep 1
insmod /home/orangepi/wlanuav.ko rtw_country_code=”CN”
#sleep 1
#sudo iw dev wlx7822884b2787 set type AP
#sleep 2
#nmcli dev set wlx7822884b2787 managed no
#sleep 2
#sudo /usr/sbin/hostapd /usr/sbin/1.config -B
#sleep 2
#sudo ifconfig wlx7822884b2787 192.168.16.7
sleep 1
sudo openvpn –config /home/orangepi/baseport.ovpn –daemon
sleep 1

sudo chmod +x /usr/local/bin/load_module.sh

sudo vi /etc/rc.local

在 exit 0 之前添加:
——————————–
/usr/local/bin/load_module.sh

while ! ip route | grep -q “default”; do
echo “Waiting for default gateway…”
sleep 1
done

echo “Default gateway is set.”

sudo ip route del default via 192.168.43.1 dev usb0
—————————————–
sudo chmod +x /etc/rc.local

[Qt]地图显示4-显示指向

———————pro——————————
QT += core gui location positioning
QT += quick widgets quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
map.qml

RESOURCES += \
src.qrc \
src.qrc

—————mainwindow.h—————————

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:

bool isQmlView =false;

MainWindow(QWidget *parent = nullptr);
~MainWindow();

// 更新坐标的接口
void updateCoordinates(double latA, double lonA, double latB, double lonB);
private slots:
void on_zoomInButton_clicked();
void on_zoomOutButton_clicked();
void on_p2m_clicked();
void on_drawButton_clicked();

private:
Ui::MainWindow *ui;

QPointF center; // 圆心
double radius; // 圆半径
QPointF point1; // 经纬度点1对应的坐标
QPointF point2; // 经纬度点2对应的坐标
QPointF pointB; // 点 B 的圆周坐标
bool shouldDraw; // 是否绘制标志

void calculatePoints(double lat1, double lon1, double lat2, double lon2);
void calculatePointB(double latA, double lonA, double latB, double lonB);

private :
void zoomOut();
void zoomIn();

protected:
void paintEvent(QPaintEvent *event) override;

};

#endif // MAINWINDOW_H

—————–main.cpp————————–

#include “mainwindow.h”
#include
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

// 更新坐标到新位置
// w.updateCoordinates(34.0522, -118.2437, 36.7783, -119.4179); // A: Los Angeles, B: Fresno

qDebug()<<"11"; return a.exec(); } ----------------mainwindow.cpp----------------------------- #include "mainwindow.h" #include "ui_mainwindow.h" #include
#include
#include
#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 获取 QQuickWidget
QQuickWidget *quickWidget = ui->quickWidget;

// 设置 QML 文件路径
quickWidget->setSource(QUrl(QStringLiteral(“qrc:/map.qml”)));
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);

// 获取 QML 上下文
QQmlContext *context = quickWidget->rootContext();

// 默认坐标
QVariant coordinateA = QVariant::fromValue(QGeoCoordinate(36.01, 37.32)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(36.50, 40.0)); // Oakland

// 传递默认坐标到 QML
context->setContextProperty(“coordinateA”, coordinateA);
context->setContextProperty(“coordinateB”, coordinateB);

// 连接按钮到槽函数
connect(ui->zoomInButton, &QPushButton::clicked, this, &MainWindow::on_zoomInButton_clicked);
connect(ui->zoomOutButton, &QPushButton::clicked, this, &MainWindow::on_zoomOutButton_clicked);

center = QPointF(600, 540);
radius = 50;

}

void MainWindow::updateCoordinates(double latA, double lonA, double latB, double lonB)
{
QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject(); // 修改为 QQuickItem*

if (rootObject) {
// 更新 QML 的属性
rootObject->setProperty(“coordinateA”, QVariant::fromValue(QGeoCoordinate(latA, lonA)));
rootObject->setProperty(“coordinateB”, QVariant::fromValue(QGeoCoordinate(latB, lonB)));
} else {
qWarning() << "Root object is null!"; } } // 放大地图 void MainWindow::zoomIn() { } // 缩小地图 void MainWindow::zoomOut() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_zoomInButton_clicked() { QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom + 1.0; // 增加 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
}
}

void MainWindow::on_zoomOutButton_clicked()
{

QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom – 1.0; // 减少 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
qDebug()<update();
}
}

void MainWindow::on_p2m_clicked()
{
isQmlView = !isQmlView;

if (isQmlView) {
ui->quickWidget->show();
ui->label->hide();
} else {
ui->quickWidget->hide();
ui->label->show();
//imageWidget->repaint();
}
}

void MainWindow::paintEvent(QPaintEvent *event) {
QMainWindow::paintEvent(event);

if (!shouldDraw) return; // 如果没有触发绘制,直接返回

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

// 绘制圆
painter.setPen(Qt::black);
painter.drawEllipse(center, radius, radius);

// 绘制从圆心到点 B 的直线
painter.setPen(Qt::red); // 红色直线表示方向角
painter.drawLine(center, pointB);

qDebug() << "Drawn line from center to" << pointB; } void MainWindow::calculatePointB(double latA, double lonA, double latB, double lonB) { // 经纬度转弧度 double phi1 = qDegreesToRadians(latA); // 点 A 的纬度 double phi2 = qDegreesToRadians(latB); // 点 B 的纬度 double deltaLambda = qDegreesToRadians(lonB - lonA); // 经度差 // 计算方位角 (以弧度为单位) double theta = qAtan2( qSin(deltaLambda) * qCos(phi2), qCos(phi1) * qSin(phi2) - qSin(phi1) * qCos(phi2) * qCos(deltaLambda) ); // 转换为 [0, 2π] 范围 if (theta < 0) theta += 2 * M_PI; qDebug() << "Calculated angle (radians):" << theta; // 计算点 B 的圆周坐标 pointB.setX(center.x() + radius * qCos(theta)); pointB.setY(center.y() - radius * qSin(theta)); qDebug() << "Point B (on circle):" << pointB; } void MainWindow::on_drawButton_clicked() { // 示例经纬度 double latA = 30.0, lonA = 120.0; // 点 A 经纬度 double latB = 35.0, lonB = 125.0; // 点 B 经纬度 calculatePointB(latA, lonA, latB, lonB); shouldDraw = true; update(); // 触发重绘 } -----------------------------map.qml------------------------------- import QtQuick 2.15 import QtQuick.Controls 2.15 import QtLocation 5.15 import QtPositioning 5.15 Item { width: 800 height: 600 Plugin { id: mapPlugin name: "osm" // 使用 OpenStreetMap 插件 } // 坐标属性,可通过 C++ 更新 property var coordinateA: QtPositioning.coordinate(36.01, 116.11) property var coordinateB: QtPositioning.coordinate(37.0, 117.0) property real zoomLevelVal: 10 Map { anchors.fill: parent plugin: mapPlugin center: coordinateA // 默认以 A 为中心 zoomLevel: zoomLevelVal // 使用绑定的 zoomLevel 属性 // 显示从 A 到 B 的路径 MapPolyline { line.width: 1 line.color: "red" path: [coordinateA, coordinateB] } } }

[Qt]显示地图-3 切换地图和图片

——pro————————–
QT += core gui location positioning
QT += quick widgets quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
imagewidget.cpp \
main.cpp \
mainwindow.cpp

HEADERS += \
imagewidget.h \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
map.qml

RESOURCES += \
src.qrc

———————mainwindow.h————————-
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:

bool isQmlView =false;

MainWindow(QWidget *parent = nullptr);
~MainWindow();

// 更新坐标的接口
void updateCoordinates(double latA, double lonA, double latB, double lonB);
private slots:
void on_zoomInButton_clicked();
void on_zoomOutButton_clicked();
void on_p2m_clicked();
private:
Ui::MainWindow *ui;
private :
void zoomOut();
void zoomIn();
};

#endif // MAINWINDOW_H

———————main.cpp—————————-
#include “mainwindow.h”
#include
#include
#include “imagewidget.h”

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

// 更新坐标到新位置
// w.updateCoordinates(34.0522, -118.2437, 36.7783, -119.4179); // A: Los Angeles, B: Fresno

qDebug()<<"11"; return a.exec(); } ---------------------mainwindow.cpp------------------------------------- #include "mainwindow.h" #include "ui_mainwindow.h" #include "imagewidget.h" #include
#include
#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 获取 QQuickWidget
QQuickWidget *quickWidget = ui->quickWidget;

// 设置 QML 文件路径
quickWidget->setSource(QUrl(QStringLiteral(“qrc:/map.qml”)));
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);

// 获取 QML 上下文
QQmlContext *context = quickWidget->rootContext();

// 默认坐标
QVariant coordinateA = QVariant::fromValue(QGeoCoordinate(37.7749, -122.4194)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(37.8044, -122.2711)); // Oakland

// 传递默认坐标到 QML
context->setContextProperty(“coordinateA”, coordinateA);
context->setContextProperty(“coordinateB”, coordinateB);

// 连接按钮到槽函数
connect(ui->zoomInButton, &QPushButton::clicked, this, &MainWindow::on_zoomInButton_clicked);
connect(ui->zoomOutButton, &QPushButton::clicked, this, &MainWindow::on_zoomOutButton_clicked);

}

void MainWindow::updateCoordinates(double latA, double lonA, double latB, double lonB)
{
QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject(); // 修改为 QQuickItem*

if (rootObject) {
// 更新 QML 的属性
rootObject->setProperty(“coordinateA”, QVariant::fromValue(QGeoCoordinate(latA, lonA)));
rootObject->setProperty(“coordinateB”, QVariant::fromValue(QGeoCoordinate(latB, lonB)));
} else {
qWarning() << "Root object is null!"; } } // 放大地图 void MainWindow::zoomIn() { } // 缩小地图 void MainWindow::zoomOut() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_zoomInButton_clicked() { QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom + 1.0; // 增加 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
}
}

void MainWindow::on_zoomOutButton_clicked()
{

QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom – 1.0; // 减少 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
qDebug()<update();
}
}

void MainWindow::on_p2m_clicked()
{
isQmlView = !isQmlView;

if (isQmlView) {
ui->quickWidget->show();
ui->label->hide();
} else {
ui->quickWidget->hide();
ui->label->show();
//imageWidget->repaint();
}
}

———————-map.qml——————————
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtLocation 5.15
import QtPositioning 5.15

Item {
width: 800
height: 600

Plugin {
id: mapPlugin
name: “osm” // 使用 OpenStreetMap 插件
}

// 坐标属性,可通过 C++ 更新
property var coordinateA: QtPositioning.coordinate(37.7749, -122.4194)
property var coordinateB: QtPositioning.coordinate(37.8044, -122.2711)
property real zoomLevelVal: 10

Map {
anchors.fill: parent
plugin: mapPlugin
center: coordinateA // 默认以 A 为中心
zoomLevel: zoomLevelVal // 使用绑定的 zoomLevel 属性

// 显示从 A 到 B 的路径
MapPolyline {
line.width: 1
line.color: “red”
path: [coordinateA, coordinateB]
}
}
}

[Qt]显示地图-2 将地图嵌入主窗口,可放大缩小

———————pro—————————–
QT += core gui location positioning
QT += quick widgets quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
map.qml

RESOURCES += \
src.qrc

————————mainwindow.h—————————-

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

// 更新坐标的接口
void updateCoordinates(double latA, double lonA, double latB, double lonB);

private slots:
void on_zoomInButton_clicked();

void on_zoomOutButton_clicked();

private:
Ui::MainWindow *ui;
private :
void zoomOut();
void zoomIn();
};

#endif // MAINWINDOW_H

——————————–main.cpp———————————

#include “mainwindow.h”
#include
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

// 更新坐标到新位置
// w.updateCoordinates(34.0522, -118.2437, 36.7783, -119.4179); // A: Los Angeles, B: Fresno

qDebug()<<"11"; return a.exec(); } ---------------------------mainwindow.cpp--------------------------------------- #include "mainwindow.h" #include "ui_mainwindow.h" #include
#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 获取 QQuickWidget
QQuickWidget *quickWidget = ui->quickWidget;

// 设置 QML 文件路径
quickWidget->setSource(QUrl(QStringLiteral(“qrc:/map.qml”)));
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);

// 获取 QML 上下文
QQmlContext *context = quickWidget->rootContext();

// 默认坐标
QVariant coordinateA = QVariant::fromValue(QGeoCoordinate(37.7749, -122.4194)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(37.8044, -122.2711)); // Oakland

// 传递默认坐标到 QML
context->setContextProperty(“coordinateA”, coordinateA);
context->setContextProperty(“coordinateB”, coordinateB);

// 连接按钮到槽函数
connect(ui->zoomInButton, &QPushButton::clicked, this, &MainWindow::on_zoomInButton_clicked);
connect(ui->zoomOutButton, &QPushButton::clicked, this, &MainWindow::on_zoomOutButton_clicked);
}

void MainWindow::updateCoordinates(double latA, double lonA, double latB, double lonB)
{
QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject(); // 修改为 QQuickItem*

if (rootObject) {
// 更新 QML 的属性
rootObject->setProperty(“coordinateA”, QVariant::fromValue(QGeoCoordinate(latA, lonA)));
rootObject->setProperty(“coordinateB”, QVariant::fromValue(QGeoCoordinate(latB, lonB)));
} else {
qWarning() << "Root object is null!"; } } // 放大地图 void MainWindow::zoomIn() { } // 缩小地图 void MainWindow::zoomOut() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_zoomInButton_clicked() { qDebug()<<"2"; QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom + 1.0; // 增加 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
}
}

void MainWindow::on_zoomOutButton_clicked()
{

QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom – 1.0; // 减少 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
qDebug()<update();
}
}

———————————main.qml———————————-
#include “mainwindow.h”
#include “ui_mainwindow.h”
#include
#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 获取 QQuickWidget
QQuickWidget *quickWidget = ui->quickWidget;

// 设置 QML 文件路径
quickWidget->setSource(QUrl(QStringLiteral(“qrc:/map.qml”)));
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);

// 获取 QML 上下文
QQmlContext *context = quickWidget->rootContext();

// 默认坐标
QVariant coordinateA = QVariant::fromValue(QGeoCoordinate(37.7749, -122.4194)); // San Francisco
QVariant coordinateB = QVariant::fromValue(QGeoCoordinate(37.8044, -122.2711)); // Oakland

// 传递默认坐标到 QML
context->setContextProperty(“coordinateA”, coordinateA);
context->setContextProperty(“coordinateB”, coordinateB);

// 连接按钮到槽函数
connect(ui->zoomInButton, &QPushButton::clicked, this, &MainWindow::on_zoomInButton_clicked);
connect(ui->zoomOutButton, &QPushButton::clicked, this, &MainWindow::on_zoomOutButton_clicked);
}

void MainWindow::updateCoordinates(double latA, double lonA, double latB, double lonB)
{
QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject(); // 修改为 QQuickItem*

if (rootObject) {
// 更新 QML 的属性
rootObject->setProperty(“coordinateA”, QVariant::fromValue(QGeoCoordinate(latA, lonA)));
rootObject->setProperty(“coordinateB”, QVariant::fromValue(QGeoCoordinate(latB, lonB)));
} else {
qWarning() << "Root object is null!"; } } // 放大地图 void MainWindow::zoomIn() { } // 缩小地图 void MainWindow::zoomOut() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_zoomInButton_clicked() { qDebug()<<"2"; QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom + 1.0; // 增加 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
}
}

void MainWindow::on_zoomOutButton_clicked()
{

QQuickWidget *quickWidget = ui->quickWidget;
QQuickItem *rootObject = quickWidget->rootObject();

if (rootObject) {
double currentZoom = rootObject->property(“zoomLevelVal”).toDouble();
double newZoom = currentZoom – 1.0; // 减少 zoomLevel
rootObject->setProperty(“zoomLevelVal”, newZoom);
qDebug()<update();
}
}

[Qt]显示地图-1

—————–pro————————-
QT += core gui location positioning
QT += quick widgets quickwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
CoordinateUpdater.cpp \
main.cpp \
mainwindow.cpp

HEADERS += \
CoordinateUpdater.h \
mainwindow.h

FORMS += \
mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
main.qml

RESOURCES += \
res.qrc
————-CoordinateUpdater.h—————————-
#ifndef COORDINATEUPDATER_H
#define COORDINATEUPDATER_H

#include
#include

class CoordinateUpdater : public QObject {
Q_OBJECT
Q_PROPERTY(QGeoCoordinate coordinateA READ coordinateA WRITE setCoordinateA NOTIFY coordinateAChanged)
Q_PROPERTY(QGeoCoordinate coordinateB READ coordinateB WRITE setCoordinateB NOTIFY coordinateBChanged)

public:
explicit CoordinateUpdater(QObject *parent = nullptr);

QGeoCoordinate coordinateA() const;
QGeoCoordinate coordinateB() const;

void setCoordinateA(const QGeoCoordinate &coord);
void setCoordinateB(const QGeoCoordinate &coord);

signals:
void coordinateAChanged();
void coordinateBChanged();

private:
QGeoCoordinate m_coordinateA;
QGeoCoordinate m_coordinateB;
};

#endif // COORDINATEUPDATER_H

———————————-mainwindow.h—————————–

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

————————————CoordinateUpdater.cpp—————————-
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
——————————————main.cpp————————————–
#include
#include
#include
#include
#include
#include
#include “CoordinateUpdater.h”

int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);

// 创建 C++ 坐标更新器
CoordinateUpdater coordinateUpdater;
coordinateUpdater.setCoordinateA(QGeoCoordinate(37.7749, -122.4194)); // 初始值 (旧金山)
coordinateUpdater.setCoordinateB(QGeoCoordinate(37.8044, -122.2711)); // 初始值 (奥克兰)

QQmlApplicationEngine engine;

// 将 C++ 对象暴露给 QML
engine.rootContext()->setContextProperty(“coordinateUpdater”, &coordinateUpdater);

// 加载 QML 文件
const QUrl url(QStringLiteral(“qrc:/main.qml”));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.load(url);

// 模拟外部更新坐标
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&coordinateUpdater]() {
double newLatA = (qrand() % 180) – 90.0; // 随机纬度
double newLonA = (qrand() % 360) – 180.0; // 随机经度
double newLatB = (qrand() % 180) – 90.0;
double newLonB = (qrand() % 360) – 180.0;

coordinateUpdater.setCoordinateA(QGeoCoordinate(newLatA, newLonA));
coordinateUpdater.setCoordinateB(QGeoCoordinate(newLatB, newLonB));
});
timer.start(2000); // 每 2 秒更新坐标

return app.exec();
}

//#include “main.moc”

—————————–mainwindow.cpp———————————–

#include “mainwindow.h”
#include “ui_mainwindow.h”

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

——————————–main.qml————————————
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtLocation 5.15
import QtPositioning 5.15

ApplicationWindow {
visible: true
width: 640
height: 480

// QML 中的动态坐标绑定到 C++ 的属性
property var coordinateA: coordinateUpdater.coordinateA
property var coordinateB: coordinateUpdater.coordinateB

// 定义地图
Map {
anchors.fill: parent
plugin: Plugin {
name: “osm” // 使用 OpenStreetMap 插件
}
center: coordinateA // 设置地图中心为 A 坐标
zoomLevel: 12

// 绘制指向 B 坐标的箭头
MapQuickItem {
coordinate: coordinateA // A 坐标点
sourceItem: Image {
width: 30
height: 30
source: “qrc:/monkey.png” // 替换为您的箭头图片
rotation: Math.atan2(coordinateB.latitude – coordinateA.latitude,
coordinateB.longitude – coordinateA.longitude) * 180 / Math.PI
}
}

MapQuickItem {
coordinate: coordinateA // A 坐标点
sourceItem: Image {
width: 30
height: 30
source: “qrc:/monkey.png” // 替换为您的箭头图片
rotation: Math.atan2(-coordinateB.latitude + coordinateA.latitude,
-coordinateB.longitude + coordinateA.longitude) * 180 / Math.PI
}
}
}
/*
// 坐标更新时打印调试信息
Connections {
target: coordinateUpdater
onCoordinateAChanged: console.log(“Updated A:”, coordinateUpdater.coordinateA)
onCoordinateBChanged: console.log(“Updated B:”, coordinateUpdater.coordinateB)
}
*/
}

[阿里云]搭建openvpn服务器

1.安装openvpn
sudo yum install epel-release -y
sudo yum install openvpn easy-rsa -y

cd ~
git clone https://github.com/OpenVPN/easy-rsa.git

克隆完成后,检查 easy-rsa 文件夹是否已包含 easyrsa3 目录:
2.
mkdir -p ~/openvpn-ca
cp -r ~/easy-rsa/easyrsa3/* ~/openvpn-ca/

cd ~/openvpn-ca
./easyrsa init-pki

拷贝vars.example为vars

——————
set_var EASYRSA_REQ_COUNTRY “CN”
set_var EASYRSA_REQ_PROVINCE “ShanDong”
set_var EASYRSA_REQ_CITY “JiNan”
set_var EASYRSA_REQ_ORG “MyOrganization”
set_var EASYRSA_REQ_EMAIL “yue37152633@163.com”
set_var EASYRSA_REQ_OU “MyOrganizationalUnit”
————————-

./easyrsa init-pki
./easyrsa build-ca

输入密码(新)
输入用户名(新)

3.生成服务器密钥和证书。
./easyrsa gen-req server nopass
输入服务器名称(新)
./easyrsa sign-req server server
输入上次设置的密码(旧)
./easyrsa gen-dh

4.生成客户端密钥和证书。 该客户端的名称为client1
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

5.生成 HMAC 密钥(用于增强服务器安全)。
openvpn –genkey –secret ta.key

6.将证书、密钥文件复制到 OpenVPN 目录。
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/

7.配置 OpenVPN 服务器
复制 OpenVPN 的示例配置文件。
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/

如果没有sample-config-files/server.conf文件
———-更改为—————
git clone https://github.com/OpenVPN/openvpn.git

cd openvpn/sample-config-files
sudo cp server.conf /etc/openvpn/

sudo cp ~/openvpn-ca/pki/ca.crt /etc/openvpn/
sudo cp ~/openvpn-ca/pki/issued/server.crt /etc/openvpn/
sudo cp ~/openvpn-ca/pki/private/server.key /etc/openvpn/
sudo cp ~/openvpn-ca/pki/dh.pem /etc/openvpn/
sudo cp ~/openvpn-ca/ta.key /etc/openvpn/

8.编辑 /etc/openvpn/server.conf 文件,根据需求调整配置。
sudo nano /etc/openvpn/server.conf
将以下几行修改为生成的证书、密钥路径:
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/ta.key 0
//
设置 VPN 子网地址(默认为 10.8.0.0/24,可以按需求更改):
server 10.8.0.0 255.255.255.0
//
启用客户端与服务端的互通及客户端之间的通信:
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 8.8.8.8”
保存并退出编辑器。

9. 重启 OpenVPN 服务器以应用更改

完成配置后,重启 OpenVPN 服务以确保更改生效:
sudo systemctl restart openvpn@server

10.验证配置

使用以下命令查看 OpenVPN 是否正常运行
sudo systemctl status openvpn@server

11.启用 IP 转发
编辑 /etc/sysctl.conf 文件,找到或添加以下行,启用 IP 转发:
net.ipv4.ip_forward = 1

应用该更改:
sudo sysctl -p

12.配置防火墙

在阿里云控制台 安全组 中允许 UDP 1194 端口流量。您还可以使用以下命令设置防火墙规则:
CentOS (firewalld)

sudo firewall-cmd –permanent –add-port=1194/udp
sudo firewall-cmd –permanent –add-masquerade
sudo firewall-cmd –reload

并且在阿里云安全组添加1194 UDP接口

13.启动 OpenVPN 服务器
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server

14.创建客户端文件

client1.ovpn

————————
client
dev tun
proto udp
remote IP地址 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
#使用enx020c29a39b6d进行转发,不影响别的网卡
#route 10.8.0.0 255.255.255.0 enx020c29a39b6d
route-nopull
tls-auth ta.key 1
# OpenVPN 加密配置
#data-ciphers AES-256-GCM:AES-128-GCM
#data-ciphers-fallback AES-256-CBC
#data-ciphers-fallback BF-CBC
#comp-lzo no
#auth SHA256
verb 4


—–BEGIN CERTIFICATE—–
#写入CA文件
—–END CERTIFICATE—–


—–BEGIN CERTIFICATE—–
#写入CERT文件
—–END CERTIFICATE—–


—–BEGIN PRIVATE KEY—–
#写入KEY文件
—–END PRIVATE KEY—–


—–BEGIN OpenVPN Static key V1—–
#写入TLS文件
—–END OpenVPN Static key V1—–