[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;
}

[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] } } }

[Linux]创建server服务器并将数据存入log文件并只保留最后10000行

————————–baseport.c————————————-
#include
#include
#include
#include
#include
#include

#define PORT 8080 // 服务器端口
#define MAX_CLIENTS 5 // 最大连接数
#define BUFFER_SIZE 1024 // 数据缓冲区大小

int client_sockets[MAX_CLIENTS]; // 存储客户端套接字

// 结构体用于传递客户端套接字和地址信息
typedef struct {
int socket;
struct sockaddr_in address;
} client_info;

void *handle_client(void *arg) {
client_info *c_info = (client_info *)arg;
int client_socket = c_info->socket;
struct sockaddr_in client_address = c_info->address;
char buffer[BUFFER_SIZE];

// 获取并打印客户端IP地址
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client_address.sin_addr, client_ip, sizeof(client_ip));
printf(“Client connected: %s\n”, client_ip);

while (1) {
memset(buffer, 0, BUFFER_SIZE);

int bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
if (bytes_received <= 0) { printf("Client disconnected or error occurred.\n"); break; // 连接关闭 } printf("Received from %s: %s\n", client_ip, buffer); send(client_socket, buffer, bytes_received, 0); } close(client_socket); printf("Closed connection for socket %d (%s)\n", client_socket, client_ip); free(c_info); // 释放分配的内存 return NULL; } void manage_connections(int new_socket, struct sockaddr_in client_address) { int i; // 将变量声明移至循环外 // 关闭最早的连接 for (i = 0; i < MAX_CLIENTS; i++) { if (client_sockets[i] == 0) { // 找到空闲位置 client_sockets[i] = new_socket; return; } } // 如果达到最大连接数,关闭最早的连接 close(client_sockets[0]); // 将新的连接插入到数组中 for (i = 0; i < MAX_CLIENTS - 1; i++) { client_sockets[i] = client_sockets[i + 1]; } client_sockets[MAX_CLIENTS - 1] = new_socket; } int main() { int server_fd, new_socket; struct sockaddr_in address, client_address; int opt = 1; socklen_t addrlen = sizeof(client_address); // 初始化客户端套接字数组 memset(client_sockets, 0, sizeof(client_sockets)); // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Socket failed"); exit(EXIT_FAILURE); } // 绑定套接字 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { perror("Setsockopt failed"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("Bind failed"); exit(EXIT_FAILURE); } // 开始监听 if (listen(server_fd, 3) < 0) { perror("Listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d\n", PORT); while (1) { // 等待客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&client_address, &addrlen)) < 0) { perror("Accept failed"); exit(EXIT_FAILURE); } printf("New connection: socket fd is %d\n", new_socket); // 管理连接 manage_connections(new_socket, client_address); // 创建线程处理客户端 client_info *c_info = malloc(sizeof(client_info)); // 分配内存以存储客户端信息 c_info->socket = new_socket;
c_info->address = client_address;
pthread_t thread_id;
pthread_create(&thread_id, NULL, handle_client, (void *)c_info);
}

// 关闭服务器套接字
close(server_fd);
return 0;
}

—————————————–编译——————————————-
gcc -pthread -o baseport.o server.c

—————————在阿里云服务器运行、将结果打印到server.out文件,禁止缓存 执行—-
nohup stdbuf -oL ./baseport.o> baseport.log 2>&1 &

———————在/root/baseport/ 新建 baseport_last_10000_lines.sh —–并添加可执行属性—-

#!/bin/bash

# 设置日志文件路径
LOG_FILE=” /root/baseport/baseport.log”

# 仅保留最后 1000 行
tail -n 1000 “$LOG_FILE” > “$LOG_FILE.tmp” && mv “$LOG_FILE.tmp” “$LOG_FILE”

————————-执行—————————–
crontab -e

[orangepi]添加dtbo节点

1.在 内核/arch/arm64/boot/dts/rockchip/overlay下新建 rk356x-xxxx.dts,注意前缀必须是rk356x,否则开发板的orangeEnv.txt有规则不认文件
2.返回内核目录 sudo make ARCH=arm64 rockchip/overlay/rk356x-test-led.dtbo 会生成 rk356x-test-led.dtbo
3.将dtbo文件拷贝到开发板/boot/dtb/rockchip/overlay 目录下
4.修改开发板/boot/orangepiEnv.txt
5.在txt文件的最后一行加上 overlays=test-led ,即把dtbo文件的前缀和后缀去掉
6.重启开发板,在/proc/device-tree下可以看到新加的节点

rk356x-test-led.dts

/dts-v1/;
/plugin/;

/ {
fragment@0 {
target-path = “/”;

__overlay__ {
/*添加led_test节点,*/
led_test{
#address-cells = <1>;
#size-cells = <1>;
compatible = “fire,led_test”;
ranges;

//例程是控制lubancat2的系统灯 GPIO0_C7
led@0xfdd60004{
reg = <0xfdd60004 0x00000004 0xfdd6000C 0x00000004>; //数据寄存器和数据方向寄存器(高16位)
status = “okay”;
};
};
};
};
};

[FK]matlab 椭圆拟合

–注意matlab版本选择18版本以上,否则不支持部分函数

[cc lang=”matlab” tab_size=”4″]

function [ellipse] = ellipsefit(x,y)

x=[3
1
-2
2
0
-5
-15
-18
-21
-29
-38
-44
-55
-59
-67
-74
-80
-89
-103
-105
-108
-119
-120
-130
-132
-136
-138
-141
-154
-161
-175
-185
-186
-192
-198
-200
-203
-211
-217
-221
-222
-222
-226
-224
-230
-228
-227
-225
-221
-221
-218
-209
-210
-203
-196
-190
-186
-178
-172
-162
-153
-145
-136
-125
-114
-106
-98
-84
-83
-73
-64
-61
-54
-41
-33
-28
-17
-6
-3
10
26
31
44
50
57
65
71
84
90
98
108
117
115
124
142
153
158
162
168
171
183
187
196
197
205
212
218
218
215
223
224
225
229
224
227
227
220
225
219
218
218
213
209
207
200
197
189
179
167
162
157
149
143
128
121
115
108
99
96
92
88
87
74
70
63
56
47
41
23
20
14
15
13
19
15
8
1
-7
-15
-28
-36
-40
-46
-53
-58
-58
-68
-77
-85
-94
-103
-118
-127
-130

];

y=[-234
-233
-235
-231
-234
-233
-237
-233
-229
-226
-226
-225
-219
-222
-218
-215
-215
-208
-209
-211
-210
-206
-195
-192
-195
-189
-184
-184
-172
-156
-146
-140
-117
-114
-94
-88
-74
-71
-62
-47
-37
-20
-8
5
29
39
44
66
66
82
86
87
99
107
116
129
138
148
155
160
174
179
188
187
197
203
197
208
206
207
210
212
220
226
225
226
235
239
237
227
227
226
223
220
219
221
216
210
203
201
196
194
188
190
182
178
165
165
157
156
149
131
127
119
101
93
89
81
68
50
38
33
29
17
2
-10
-17
-26
-30
-43
-49
-63
-72
-88
-94
-100
-109
-119
-138
-139
-142
-151
-151
-161
-164
-167
-168
-169
-162
-163
-160
-159
-158
-158
-164
-164
-158
-152
-154
-162
-168
-170
-185
-185
-190
-180
-180
-174
-171
-172
-173
-163
-163
-165
-161
-160
-157
-161
-156
-154
-155
-152
-145
-147

];

%x=x+9.9831;
%y=y+26.9348;
%y = y*1.054;
%y = y*1.00134;
grid on;
hold on;
plot(x,y,’*’)

% 采用最小二乘法进行椭圆拟合
% 采用椭圆一般式子:x^2 + A*x*y + B*y^2 + C*x + D*y + E = 0;

xlength = length(x);
xmax = max(x);
ymax = max(y);
if(xlength ~= length(y) | xlength < 5) warning('椭圆拟合至少需要四个点数据'); else M1 = [ sum(x.^2.*y.^2), sum(x.*y.^3), sum(x.^2.*y), sum(x.*y.^2), sum(x.*y) sum(x.*y.^3), sum(y.^4), sum(x.*y.^2), sum(y.^3), sum(y.^2) sum(x.^2.*y), sum(x.*y.^2), sum(x.^2), sum(x.*y), sum(x) sum(x.*y.^2), sum(y.^3), sum(x.*y), sum(y.^2), sum(y) sum(x.*y), sum(y.^2), sum(x), sum(y), xlength] ; %M1满秩才可逆 if rank(M1) == 5 M2 = -[ sum(x.^3.*y); sum(x.^2.*y.^2); sum(x.^3); sum(x.^2.*y); sum(x.^2)]; G = inv(M1)*M2; [A,B,C,D,E] = deal(G(1),G(2),G(3),G(4),G(5)); ellipse = [A,B,C,D,E]; Xp = (A*D-2*B*C)/(A*A-4*B); Yp = (A*C-2*D)/(A*A-4*B); Xc = -Xp; Yc = -Yp; theta_r = 0.5*atan(A/(B-1)); theta_offset = - theta_r; a = sqrt((Xp^2+A*Xp*Yp+B*Yp^2-E)/(cos(theta_r)^2-A*sin(theta_r)*cos(theta_r)+B*sin(theta_r)^2)); b = sqrt((Xp^2+A*Xp*Yp+B*Yp^2-E)/(sin(theta_r)^2+A*sin(theta_r)*cos(theta_r)+B*cos(theta_r)^2)); %绘图 plot(x,y,'bo') fimplicit(@(x,y)x.^2 + A.*x.*y + B.*y.^2 + C.*x + D.*y + E ,'-r','LineWidth', 3) plot(Xc,Yc,'ro','LineWidth', 3); plot([Xc Xc+a*cos(theta_offset)],[Yc Yc+a*sin(theta_offset)],'--p','LineWidth', 3); title(['圆心坐标为(' num2str(Xc) ',' num2str(Yc) '),偏移角为' num2str(theta_offset*180/pi) '°,长轴为' num2str(a) ',短轴为' num2str(b) ... newline 'x^2 + ' num2str(A) 'xy + ' num2str(B) 'y^2 + ' num2str(C) 'x + ' num2str(D) 'y + ' num2str(E) '= 0']); axis equal end end end [/cc]