From 18d334c2ea62ecc9f059b786e1240ee68bc2ec45 Mon Sep 17 00:00:00 2001 From: hehaoyang Date: Wed, 8 May 2024 02:27:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=20i2c-tools=E3=80=81can?= =?UTF-8?q?-utils=E3=80=81ifmetric=E3=80=81network-manager=E7=AD=89?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=B7=A5=E5=85=B7=E5=8C=85;=202.=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3QT=E7=95=8C=E9=9D=A2=E7=A8=8B=E5=BA=8F=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- external/libmali/meson.build | 4 + external/libmali/rockchip_egl/libEGL.so.1 | Bin 0 -> 7928 bytes .../devicetree/bindings/serial/rs485.txt | 1 + .../arm64/rockchip/rk3568-evb1-ddr4-v10.dtsi | 873 ++++++++++++++++++ kernel/drivers/tty/serial/8250/8250.h | 2 +- kernel/drivers/tty/serial/8250/8250_core.c | 4 +- kernel/drivers/tty/serial/8250/8250_dma.c | 6 +- kernel/drivers/tty/serial/8250/8250_dw.c | 3 + kernel/drivers/tty/serial/8250/8250_port.c | 123 ++- kernel/drivers/tty/serial/serial_core.c | 20 +- kernel/include/linux/serial_core.h | 4 +- .../recipes/hvgo-tvis/files/hvgo.c | 2 + .../packagegroups/packagegroup-tvis-app.bb | 1 - .../ubuntu-tool-tvis/files/canutils/candump | Bin 30856 -> 0 bytes .../ubuntu-tool-tvis/files/canutils/cangen | Bin 22664 -> 0 bytes .../ubuntu-tool-tvis/files/canutils/cansend | Bin 18560 -> 0 bytes .../ubuntu-tool-tvis/files/ifmetric/ifmetric | Bin 14264 -> 0 bytes .../ubuntu-tool-tvis/ubuntu-tool-tvis.bb | 28 - .../ubuntu-base/ubuntu-base_20.04.bb | 24 +- 19 files changed, 1036 insertions(+), 59 deletions(-) create mode 100644 external/libmali/rockchip_egl/libEGL.so.1 create mode 100644 kernel/arch/arm64/rockchip/rk3568-evb1-ddr4-v10.dtsi delete mode 100755 yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/candump delete mode 100755 yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cangen delete mode 100755 yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cansend delete mode 100755 yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/ifmetric/ifmetric delete mode 100755 yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/ubuntu-tool-tvis.bb diff --git a/external/libmali/meson.build b/external/libmali/meson.build index b932ab5636..7cffdcc74d 100644 --- a/external/libmali/meson.build +++ b/external/libmali/meson.build @@ -277,6 +277,10 @@ if gpu == 'valhall-g610' install_data('firmware/g610/mali_csffw.bin', install_dir : '/lib/firmware') endif +#Use the RK3568 Linux libEGL. so. 1 library. Reason: Stable and Compatible. +rk368z_linux_egl = join_paths(meson.current_source_dir(), 'rockchip_egl') +run_command('cp', '-r', rk368z_linux_egl, meson.current_build_dir(), check : true) + if vendor_package # Install vendor ld config custom_target( diff --git a/external/libmali/rockchip_egl/libEGL.so.1 b/external/libmali/rockchip_egl/libEGL.so.1 new file mode 100644 index 0000000000000000000000000000000000000000..0bb1be35f955308aca59ec677f67546cb2cc902a GIT binary patch literal 7928 zcmeHMU2GiH6+XLT@`Dp+Q$h)(t=Az)6yb@TG?1i~vRVHumYl>GQ-NA(Jl!uwnY3>VfL()1z#sub>*YCJ7Z!>Uf>rZ$je(#SH9ZdwC3gWZZCW5f_UhoA|*K zsc;L>pxrbbF@Qk_D3L&fo&$N$WQ4C##tui|Vx5e@CErmvS=L;+TCwVmU2`mptg)$c zRxV%5&lT%VzBYAks8p@wr|g+h-jhX3tn8v~%@!+msrYoBO2wHn_pCy-deN*`%|Su3 z(tAjHBbjjz&5Vzwhpc1f;KOv}!sJ+H?EFzNISs}%k5=cMVwrtf$B)`}En9f#Tm7YC zWnr;@uClQ8npli7Co!610oKQr%fI01jnj`*8SCEA{IBT5zoP3KcuH~12XOFj?~_dP zcpWdYL=gmv6|9;b;%Xbnzzj^76 zt80e!5#ril*$UCh{+pRb;%{dzC*!>zi47i>t?rMf8i_c$GMC@M{9%t@W?T9!(?}7$ z+-NrM65oui(llNE3DZ8NXNdl>Ml{9zO5dlMhRwPgM(icxv7+?*h~7=p^80;X3_aJk z=gk-2VEt#Bw|Kw(~IiPaU6Te?D_8rBNOjGF46(fBE=>9)ZLz$Ik@o_}78Rw%c|FwllDuf$a=zXJ9)6Uv36a7orY~sr$#3 zf|puTn)_qT^an0Sv`^`?O7|#5-LJeR1=Ux<5#s5LiKe!Kd6RcW_U97j>(u4}!jZV2_w0o9i?m9)D&LIWBY@MqN# z-s`IB?N*BMxJ+{6FQ`73KQ52FZz%s=m2*w%$`Pl!`_f43-1~oeT-H2*;vA6~8akc4 zKfO>aLSr_#A}w5X23_Itb!jg!K}{ZzJSAi0>fGR}kMxnD-#QtF=CYc&GF6?S%XV^}Ad5 zC_#KrYkvjty{-F+Al^gQu~B>igLgCbr4QzFUxKh7gZO^FH^EBXk{I+ATGRcrh06Ky z4#K_);_deVA~)zxI+%#^|5d-a+ZU}a`n(wyc>AwCZ?f;>w1s0|d;0D3;^FOimVMlL z+}$*f50(Z7Kfej(zxS4Yy6MA^p9eJlFfL~=d9SXJe?GHvYtM69_3{08)%ed7{KS0u z$1He$+SfzQ)o;gt#<;|T-x+4z=J{z~Z&z3vi&%%Aeh+;X`CjeoIf;P5|= z9}G82qSxGbdMJ#GILiNfjK`^coxJb*Y0v*(UHtQAcpt4ZPSn1C|Ly7@XxkS%d4giR z{=@t3>x{=E?%}+3*#4clm-Uk}bf}$S{BQ^p_Q?+Vg$_7nYfjOu(vd~V+NF~9RNlU5 z%~k}iFwCUxEX>ZDS=zdsvz)S(mFu}W9m(-UUao4*m8vs#$;vs^THUf2*jcqaU&=fA z9RF-YYRIi!(Xwkbd&$aIoZ1r2*6ecL$}N=3OKjrfEY@@as;&~pWLcw=XU~mTBj<dYq6Uu)Pcp=}j4;iNUr3)Fw=Rs1J~lFC zO`T1TkFY}-_|{jGfeXl#?_x3Pelzk8lg#>3*|BGsIyH|L(BsQSvtZW?WagGCtmaXt zMy5!9n6K4~)k=V|SXRrIY%$Q@e90lxeG}8kFLK{albJ7Qjte=q0q1FY$@VnSXNPvV znB~!`?1TT9uH&5T*ksPs>tynrmw759R^|T=$#+3MEvWZUSAeF}CF(A3|HwDMYf{Jl zi)%C3U*q*J4HR{3*xu73x{o{FZ<2>>s6FUaRh03>2gXMo*{?XpM?C|IdRN`>w<6e1 zFe|ku>{0iCqV7lh&;w1gz0|VcQ6GUObvTJ%#zy=K)1%xG8SGIu zLmKMw7WH5^cXx0DS|=71 +#include +#include +#include "rk3568.dtsi" +#include "rk3568-evb.dtsi" + +/ { + model = "Rockchip RK3568 EVB1 DDR4 V10 Board"; + compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568"; + + rk_headset: rk-headset { + compatible = "rockchip_headset"; + //headset_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>; + //pinctrl-names = "default"; + //pinctrl-0 = <&hp_det>; + }; + + vcc2v5_sys: vcc2v5-ddr { + compatible = "regulator-fixed"; + regulator-name = "vcc2v5-sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <2500000>; + regulator-max-microvolt = <2500000>; + vin-supply = <&vcc3v3_sys>; + }; + + /*vcc3v3_vga: vcc3v3-vga { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_vga"; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>; + enable-active-high; + vin-supply = <&vcc3v3_sys>; + };*/ + + pcie30_avdd0v9: pcie30-avdd0v9 { + compatible = "regulator-fixed"; + regulator-name = "pcie30_avdd0v9"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc3v3_sys>; + }; + + pcie30_avdd1v8: pcie30-avdd1v8 { + compatible = "regulator-fixed"; + regulator-name = "pcie30_avdd1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc3v3_sys>; + }; + + vcc3v3_pcie: gpio-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_pcie"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + regulator-boot-on; + enable-active-high; + gpio = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>; + startup-delay-us = <5000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc3v3_bu: vcc3v3-bu { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_bu"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc_camera: vcc-camera-regulator { + compatible = "regulator-fixed"; +// gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; +// pinctrl-names = "default"; +// pinctrl-0 = <&camera_pwr>; + regulator-name = "vcc_camera"; + enable-active-high; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_sys>; + }; + + /*vcc_dvdd: vcc-dvdd { + compatible = "regulator-fixed"; + regulator-name = "vcc_dvdd"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + enable-active-high; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc_dvdd_en>; + vin-supply = <&vcc3v3_sys>; + };*/ + /*vcc_avdd: vcc-avdd { + compatible = "regulator-fixed"; + regulator-name = "vcc_avdd"; + regulator-min-microvolt = <2800000>; + regulator-max-microvolt = <2800000>; + enable-active-high; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc_avdd_en>; + vin-supply = <&vcc3v3_sys>; + };*/ + /*vcc_iovdd: vcc-iovdd { + compatible = "regulator-fixed"; + regulator-name = "vcc_iovdd"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + enable-active-high; + regulator-always-on; + regulator-boot-on; + gpio = <&gpio3 RK_PA5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc_iovdd_en>; + vin-supply = <&vcc3v3_sys>; + };*/ + vcc_rtl8821chipen: vcc-rtl8821chipen { + compatible = "regulator-fixed"; + regulator-name = "chipen-rtl8821"; + enable-active-high; + regulator-always-on; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_chipen_rtl8821>; + gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; + vcc_rtl8821power:vcc-rtl8821power { + compatible = "regulator-fixed"; + regulator-name = "power-rtl8821"; + enable-active-high; + regulator-always-on; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_power_rtl8821>; + gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; + vcc_5Gpower:vcc_5Gpower { + compatible = "regulator-fixed"; + regulator-name = "out5G_power"; + enable-active-high; + regulator-always-on; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_5G_power>; + gpio = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + txrx_485ctl_enable:txrx_485ctl_enable { + compatible = "regulator-fixed"; + regulator-name = "txrx_485ctl_enable"; + enable-active-low; + regulator-always-on; + //pinctrl-names = "default"; + //pinctrl-0 = <&txrx_485_enable>; + //gpio = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; + + tws_gpio:tws_gpio { + compatible = "quec,gpio_driver"; + tws,led_crtl2 = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>; + tws,led_crtl3 = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>; + tws,led_crtl4 = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; + tws,led_crtl5 = <&gpio3 RK_PA5 GPIO_ACTIVE_HIGH>; + tws,led_crtl6 = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>; + tws,led_crtl7 = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>; + tws,led_crtl8 = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>; + tws,relay_gpio1_d2 = <&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>; + tws,relay_gpio1_d4 = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&tws_led_ctrl>; + status = "okay"; + }; +}; + +&combphy0_us { + status = "okay"; +}; + +&combphy1_usq { + status = "okay"; +}; + +&combphy2_psq { + status = "okay"; +}; + +&csi2_dphy_hw { + status = "okay"; +}; + +&csi2_dphy0 { + status = "okay"; + ports { + #address-cells = <1>; + #size-cells = <0>; + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + mipi_in_ucam0: endpoint@1 { + reg = <1>; + remote-endpoint = <&ucam_out0>; + data-lanes = <1 2 3 4>; + }; + }; + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + csidphy_out: endpoint@0 { + reg = <0>; + remote-endpoint = <&mipi_csi2_input>; + }; + }; + }; +}; + +/*&csi2_dphy1 { + status = "okay"; + 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 = <&cam_out0>; + data-lanes = <1 2>; + }; + }; + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + dphy1_out: endpoint@1 { + reg = <1>; + remote-endpoint = <&isp0_in>; + }; + }; + }; +};*/ + +/*&csi2_dphy2 { + status = "okay"; + ports { + #address-cells = <1>; + #size-cells = <0>; + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + dphy2_in: endpoint@1 { + reg = <1>; + remote-endpoint = <&cam_out1>; + data-lanes = <1 2>; + }; + }; + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + dphy2_out: endpoint@1 { + reg = <1>; + remote-endpoint = <&mipi_csi2_input>; + }; + }; + }; +};*/ + +&mipi_csi2 { + status = "okay"; + ports { + #address-cells = <1>; + #size-cells = <0>; + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + mipi_csi2_input: endpoint@1 { + reg = <1>; + remote-endpoint = <&csidphy_out>; + data-lanes = <1 2 3 4>; + }; + }; + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + mipi_csi2_output: endpoint@0 { + reg = <0>; + remote-endpoint = <&cif_mipi_in>; + data-lanes = <1 2 3 4>; + }; + }; + + }; +}; + +&rkcif_mipi_lvds { + status = "okay"; + //rockchip,cif-monitor = <1 2 60 1000 5>; //加这个复位机制测试 + //rockchip,cif-monitor = <3 200 10 1000 0>; + rockchip,cif-monitor = <2 2 5 1000 5>; + port { + cif_mipi_in: endpoint { + remote-endpoint = <&mipi_csi2_output>; + data-lanes = <1 2 3 4>; + }; + }; +}; + +&rkcif_mipi_lvds_sditf { + status = "okay"; + port { + mipi_lvds_sditf: endpoint { + remote-endpoint = <&isp_in>; + data-lanes = <1 2 3 4>; + }; + }; +}; + + +/* + * video_phy0 needs to be enabled + * when dsi0 is enabled + */ + +&vop { + status = "okay"; + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>, <&cru DCLK_VOP2>; + assigned-clocks-parents = <&cru PLL_VPLL>, <&pmucru PLL_HPLL>, <&cru PLL_GPLL>; +}; + +&vp0 { + rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_SMART1)>; + rockchip,primary-plane = ; +}; + +&vp1 { + rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>; + rockchip,primary-plane = ; +}; + +&vp2 { + rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_ESMART1)>; + rockchip,primary-plane = ; +}; + +&dsi0 { + status = "disabled"; +}; + +&dsi0_in_vp0 { + status = "disabled"; +}; + +&dsi0_in_vp1 { + status = "disabled"; +}; + +/* + * video_phy1 needs to be enabled + * when dsi1 is enabled + */ +&dsi1 { + status = "disabled"; +}; + +&dsi1_in_vp0 { + status = "disabled"; +}; + +&dsi1_in_vp1 { + status = "odisabled"; +}; +&dsi1_in_vp2{ + status = "disabled"; +}; + +&route_dsi1 { + status = "disabled"; + connect = <&vp1_out_dsi1>; +}; + +&route_hdmi { + status = "okay"; + connect = <&vp1_out_hdmi>; +}; + +&route_lvds { + status = "disabled"; + connect = <&vp2_out_lvds>; +}; + +&route_edp { + status = "okay"; + connect = <&vp0_out_edp>; +}; + +&lvds_in_vp2 { + status = "disabled"; +}; + +&lvds{ + status = "disabled"; +}; + +&edp { + force-hpd; + //hpd-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; + +&edp_phy { + status = "okay"; +}; + +&edp_in_vp0 { + status = "okay"; +}; + +&edp_in_vp1 { + status = "disabled"; +}; + +&gmac0 { + phy-mode = "rgmii"; + clock_in_out = "output"; + + snps,reset-gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; + snps,reset-active-high; + /* Reset time is 20ms, 100ms for rtl8211f */ + snps,reset-delays-us = <0 20000 100000>; + + assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>; + assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>; + assigned-clock-rates = <0>, <125000000>; + + pinctrl-names = "default"; + pinctrl-0 = <&gmac0_miim + &gmac0_tx_bus2 + &gmac0_rx_bus2 + &gmac0_rgmii_clk + &gmac0_rgmii_bus>; + + tx_delay = <0x3c>; + rx_delay = <0x2f>; + + phy-handle = <&rgmii_phy0>; + status = "disabled"; +}; + +&gmac1 { + phy-mode = "rgmii"; + clock_in_out = "output"; + + snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>; + snps,reset-active-high; + /* Reset time is 20ms, 100ms for rtl8211f */ + snps,reset-delays-us = <0 20000 100000>; + + 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 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + + tx_delay = <0x4f>; + rx_delay = <0x26>; + + phy-handle = <&rgmii_phy1>; + status = "ok"; +}; + +/* + * power-supply should switche to vcc3v3_lcd1_n + * when mipi panel is connected to dsi1. + */ +>1x { + status = "okay"; + power-supply = <&vcc3v3_lcd0_n>; +}; + +&i2c4 { + status = "okay"; + pinctrl-0 = <&i2c4m1_xfer>; + pericom_30216c:pericom_30216c@1D { + status = "okay"; + compatible = "pericom,30216c"; + reg = <0x1D>; + pinctrl-names = "default"; + pinctrl-0 = <&prm_30216_gpio>; + interrupt-parent = <&gpio0>; + interrupts = <5 IRQ_TYPE_LEVEL_LOW>; + swcc-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>; + }; + rtc@32 { + reg = <0x32>; + compatible = "epson,rx8130"; + interrupt-parent = <&gpio0>; + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&rx8130_gpio>; + //int-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>; + }; + hym8563: hym8563@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + interrupt-parent = <&gpio0>; + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&rtc_int>; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; + gt911@14 { + compatible = "goodix,gt9xx"; + reg = <0x14>; + + pinctrl-names = "default"; + pinctrl-0 = <>911_gpio>; + touch-gpio = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>; //int IO + reset-gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>; //reset io + max-x = <800>; //x size + max-y = <1280>; //y size + tp-size = <911>; //TP model + status = "okay"; + }; +}; + +&mdio0 { + rgmii_phy0: phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x0>; + }; +}; + +&mdio1 { + rgmii_phy1: phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x0>; + }; +}; + +&video_phy0 { + status = "okay"; +}; + +&video_phy1 { + status = "okay"; +}; + +&pcie30phy { + status = "okay"; +}; + +&pcie3x1 { + rockchip,bifurcation; + reset-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie>; + pinctrl-names = "default"; + pinctrl-0 = <&rtl8111_isolate>;//isolate脚 需要硬件拉高 + status = "okay"; +}; + +&pcie3x2 { + rockchip,bifurcation; + reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; + quectel,5Gmodule; + reset5G-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie>; + status = "okay"; +}; + +&pinctrl { + gpio-rtl8821 { + gpio_chipen_rtl8821: gpio-chipen-rtl8821 { + rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + gpio_power_rtl8821:gpio-power-rtl8821 { + rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + gpio-5Gpower { + gpio_5G_power:gpio-5G-power { + rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + gpio-485enable { + txrx_485_enable:txrx_485_enable { + rockchip,pins = <1 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + pericom_30216c { + prm_30216_gpio:prm-30216-gpio { + rockchip,pins = + <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, + <0 RK_PD6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + gt911 { + gt911_gpio:gt911-gpio { + rockchip,pins = + <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + rx8130_gpio { + rx8130_gpio:rx8130_gpio{ + rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + cam_en { + camera_pwr: camera-pwr { + rockchip,pins = + /* camera power en */ + <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + vcc_iovdd_en: vcc-iovdd-en { + rockchip,pins = + /* camera power en */ + <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + vcc_dvdd_en: vcc-dvdd-en { + rockchip,pins = + /* camera power en */ + <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + vcc_avdd_en: vcc-avdd-en { + rockchip,pins = + /* camera power en */ + <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + headphone { + hp_det: hp-det { + //peeta + rockchip,pins = <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + wireless-bluetooth { + uart1_gpios: uart1-gpios { + rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + rtl8111 { + rtl8111_isolate: ertl8111-isolate { + rockchip,pins = <3 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>;//这里需要配置isolate引脚,默认pull up + }; + }; + + tws_gpio_ctrl { + tws_led_ctrl:tws_led_ctrl { + rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>, + <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + rtc { + rtc_int: rtc-int { + rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + uart7_rts { + uart7_rts_gpio:uart7_rts_gpio { + rockchip,pins = <1 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +/*&rkcif { + status = "okay"; +}; + +&rkcif_mmu { + status = "okay"; +};*/ + +&rkisp { + status = "okay"; + /* the max input w h and fps of mulit sensor */ + //max-input = <3264 2448 30>; +}; + +&rkisp_mmu { + status = "okay"; +}; + +&rkisp_vir0 { + status = "okay"; + /* s5k4h7->csi2_dphy1->isp_vir0 */ + port { + #address-cells = <1>; + #size-cells = <0>; + + isp_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&mipi_lvds_sditf>; + }; + }; +}; + +/*&rkisp_vir1 { + status = "okay";*/ + /* s5k4h7_cam2->csi2_dphy2->csi2->vicap */ + /* vicap sditf->isp_vir1 */ + /*port { + #address-cells = <1>; + #size-cells = <0>; + isp1_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&mipi_lvds_sditf>; + }; + }; +};*/ + +&route_dsi0 { + status = "disabled"; + connect = <&vp1_out_dsi0>; +}; + +&sata1 { + status = "okay"; +}; + +&sata2 { + status = "okay"; +}; + +&sdmmc1 { + max-frequency = <150000000>; + supports-sdio; + 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"; +}; + +&spdif_8ch { + status = "disabled"; + pinctrl-names = "default"; + pinctrl-0 = <&spdifm1_tx>; +}; + +&uart3 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart3m1_xfer>; +}; + +&uart4 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart4m1_xfer>; +}; + +&uart5 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart5m1_xfer>; +}; + +&uart7 { + status = "okay"; + pinctrl-names = "default"; + //pinctrl-0 = <&uart7m1_xfer &uart7_rts_gpio>; + pinctrl-0 = <&uart7m1_xfer>; + rs485-de-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>; + linux,rs485-enabled-at-boot-time; +}; + +&uart8 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart8m1_xfer>; +}; + +&uart1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>; +}; + +&vcc3v3_lcd0_n { + //gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; + enable-active-high; +}; + +&vcc3v3_lcd1_n { + //gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; + enable-active-high; +}; + +&wireless_wlan { + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; +}; + +&wireless_bluetooth { + compatible = "bluetooth-platdata"; + clocks = <&rk809 1>; + clock-names = "ext_clock"; + //wifi-bt-power-toggle; + 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 = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; + //BT,wake_gpio = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>; + //BT,wake_host_irq = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; diff --git a/kernel/drivers/tty/serial/8250/8250.h b/kernel/drivers/tty/serial/8250/8250.h index 7c19addb64..817dd311b9 100644 --- a/kernel/drivers/tty/serial/8250/8250.h +++ b/kernel/drivers/tty/serial/8250/8250.h @@ -139,7 +139,7 @@ void serial8250_rpm_put(struct uart_8250_port *p); void serial8250_rpm_get_tx(struct uart_8250_port *p); void serial8250_rpm_put_tx(struct uart_8250_port *p); -int serial8250_em485_init(struct uart_8250_port *p); +int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485); void serial8250_em485_destroy(struct uart_8250_port *p); static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) diff --git a/kernel/drivers/tty/serial/8250/8250_core.c b/kernel/drivers/tty/serial/8250/8250_core.c index 4e1d450ffd..a273d9b257 100644 --- a/kernel/drivers/tty/serial/8250/8250_core.c +++ b/kernel/drivers/tty/serial/8250/8250_core.c @@ -1017,8 +1017,10 @@ int serial8250_register_8250_port(struct uart_8250_port *up) if (uart->port.fifosize && !uart->tx_loadsz) uart->tx_loadsz = uart->port.fifosize; - if (up->port.dev) + if (up->port.dev) { uart->port.dev = up->port.dev; + uart_get_rs485_mode(&uart->port); + } if (up->port.flags & UPF_FIXED_TYPE) uart->port.type = up->port.type; diff --git a/kernel/drivers/tty/serial/8250/8250_dma.c b/kernel/drivers/tty/serial/8250/8250_dma.c index 141a5b03be..27cab1f9fa 100644 --- a/kernel/drivers/tty/serial/8250/8250_dma.c +++ b/kernel/drivers/tty/serial/8250/8250_dma.c @@ -43,7 +43,8 @@ static void __dma_tx_complete(void *param) if (ret) { p->ier |= UART_IER_THRI; #ifdef CONFIG_ARCH_ROCKCHIP - p->ier |= UART_IER_PTIME; + if (!p->em485) + p->ier |= UART_IER_PTIME; #endif serial_port_out(&p->port, UART_IER, p->ier); } @@ -152,7 +153,8 @@ int serial8250_tx_dma(struct uart_8250_port *p) if (p->ier & UART_IER_THRI) { p->ier &= ~UART_IER_THRI; #ifdef CONFIG_ARCH_ROCKCHIP - p->ier &= ~UART_IER_PTIME; + if (!p->em485) + p->ier &= ~UART_IER_PTIME; #endif serial_out(p, UART_IER, p->ier); } diff --git a/kernel/drivers/tty/serial/8250/8250_dw.c b/kernel/drivers/tty/serial/8250/8250_dw.c index 2882547b85..04a29680c2 100644 --- a/kernel/drivers/tty/serial/8250/8250_dw.c +++ b/kernel/drivers/tty/serial/8250/8250_dw.c @@ -572,6 +572,9 @@ static int dw8250_probe(struct platform_device *pdev) p->serial_out = dw8250_serial_out; p->set_ldisc = dw8250_set_ldisc; p->set_termios = dw8250_set_termios; +#if defined(CONFIG_ARCH_ROCKCHIP) + p->rs485_config = serial8250_em485_config; +#endif p->membase = devm_ioremap(dev, regs->start, resource_size(regs)); if (!p->membase) diff --git a/kernel/drivers/tty/serial/8250/8250_port.c b/kernel/drivers/tty/serial/8250/8250_port.c index 39156ecbeb..8547a0d41b 100644 --- a/kernel/drivers/tty/serial/8250/8250_port.c +++ b/kernel/drivers/tty/serial/8250/8250_port.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -60,6 +61,12 @@ #define DEBUG_AUTOCONF(fmt...) do { } while (0) #endif +#if 0 +#define DEBUG_EM485(fmt...) printk(fmt) +#else +#define DEBUG_EM485(fmt...) do { } while (0) +#endif + #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) /* @@ -567,13 +574,27 @@ static void serial8250_clear_fifos(struct uart_8250_port *p) static inline void serial8250_em485_rts_after_send(struct uart_8250_port *p) { + struct uart_port *port = &p->port; unsigned char mcr = serial8250_in_MCR(p); + int value = 0; + + if (port->rs485_de_gpio) { + if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND) + value = 0; + else + value = 1; + + gpiod_set_value(port->rs485_de_gpio, value); + DEBUG_EM485("%s ttyS%d gpio:%d\n", __func__, p->port.line, value); + return; + } if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND) mcr |= UART_MCR_RTS; else mcr &= ~UART_MCR_RTS; serial8250_out_MCR(p, mcr); + DEBUG_EM485("%s ttyS%d mcr:%02x\n", __func__, up->port.line, mcr); } static enum hrtimer_restart serial8250_em485_handle_start_tx(struct hrtimer *t); @@ -623,8 +644,10 @@ EXPORT_SYMBOL_GPL(serial8250_rpm_put); * * Return 0 - success, -errno - otherwise */ -int serial8250_em485_init(struct uart_8250_port *p) +static int serial8250_em485_init(struct uart_8250_port *p) { + DEBUG_EM485("%s ttyS%d\n", __func__, p->port.line); + if (p->em485) return 0; @@ -644,7 +667,6 @@ int serial8250_em485_init(struct uart_8250_port *p) return 0; } -EXPORT_SYMBOL_GPL(serial8250_em485_init); /** * serial8250_em485_destroy() - put uart_8250_port into normal state @@ -672,6 +694,45 @@ void serial8250_em485_destroy(struct uart_8250_port *p) } EXPORT_SYMBOL_GPL(serial8250_em485_destroy); +/** + * serial8250_em485_config() - generic ->rs485_config() callback + * @port: uart port + * @rs485: rs485 settings + * + * Generic callback usable by 8250 uart drivers to activate rs485 settings + * if the uart is incapable of driving RTS as a Transmit Enable signal in + * hardware, relying on software emulation instead. + */ +int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485) +{ + struct uart_8250_port *up = up_to_u8250p(port); + + /* clamp the delays to [0, 100ms] */ + rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U); + rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U); + + port->rs485 = *rs485; + DEBUG_EM485("%s ttyS%d\n", __func__, port->line); + + /* + * Both serial8250_em485_init() and serial8250_em485_destroy() + * are idempotent. + */ + if (rs485->flags & SER_RS485_ENABLED) { + int ret = serial8250_em485_init(up); + + if (ret) { + rs485->flags &= ~SER_RS485_ENABLED; + port->rs485.flags &= ~SER_RS485_ENABLED; + } + return ret; + } + + serial8250_em485_destroy(up); + return 0; +} +EXPORT_SYMBOL_GPL(serial8250_em485_config); + /* * These two wrappers ensure that enable_runtime_pm_tx() can be called more than * once and disable_runtime_pm_tx() will still disable RPM because the fifo is @@ -1447,6 +1508,7 @@ static void serial8250_stop_rx(struct uart_port *port) static void __do_stop_tx_rs485(struct uart_8250_port *p) { + DEBUG_EM485("%s ttyS%d\n", __func__, p->port.line); serial8250_em485_rts_after_send(p); /* @@ -1490,20 +1552,23 @@ static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec) hrtimer_start(hrt, t, HRTIMER_MODE_REL); } -static void __stop_tx_rs485(struct uart_8250_port *p) +static void __stop_tx_rs485(struct uart_8250_port *p, u64 stop_delay) { struct uart_8250_em485 *em485 = p->em485; + DEBUG_EM485("%s ttyS%d\n", __func__, p->port.line); + stop_delay += (u64)p->port.rs485.delay_rts_after_send * NSEC_PER_MSEC; + /* * __do_stop_tx_rs485 is going to set RTS according to config * AND flush RX FIFO if required. */ - if (p->port.rs485.delay_rts_after_send > 0) { + if (stop_delay > 0) { em485->active_timer = &em485->stop_tx_timer; - start_hrtimer_ms(&em485->stop_tx_timer, - p->port.rs485.delay_rts_after_send); + hrtimer_start(&em485->stop_tx_timer, ns_to_ktime(stop_delay), HRTIMER_MODE_REL); } else { __do_stop_tx_rs485(p); + em485->active_timer = NULL; } } @@ -1512,7 +1577,8 @@ static inline void __do_stop_tx(struct uart_8250_port *p) if (p->ier & UART_IER_THRI) { p->ier &= ~UART_IER_THRI; #ifdef CONFIG_ARCH_ROCKCHIP - p->ier &= ~UART_IER_PTIME; + if (!p->em485) + p->ier &= ~UART_IER_PTIME; #endif serial_out(p, UART_IER, p->ier); serial8250_rpm_put_tx(p); @@ -1525,18 +1591,25 @@ static inline void __stop_tx(struct uart_8250_port *p) if (em485) { unsigned char lsr = serial_in(p, UART_LSR); - /* - * To provide required timeing and allow FIFO transfer, - * __stop_tx_rs485() must be called only when both FIFO and - * shift register are empty. It is for device driver to enable - * interrupt on TEMT. - */ - if ((lsr & BOTH_EMPTY) != BOTH_EMPTY) + u64 stop_delay = 0; + + p->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; + + if (!(lsr & UART_LSR_THRE)) return; - em485->active_timer = NULL; + /* + * To provide required timing and allow FIFO transfer, + * __stop_tx_rs485() must be called only when both FIFO and + * shift register are empty. The device driver should either + * enable interrupt on TEMT or set UART_CAP_NOTEMT that will + * enlarge stop_tx_timer by the tx time of one frame to cover + * for emptying of the shift register. + */ + if (!(lsr & UART_LSR_TEMT)) + stop_delay = p->port.frame_time + 2000; - __stop_tx_rs485(p); + __stop_tx_rs485(p, stop_delay); } __do_stop_tx(p); } @@ -1573,7 +1646,9 @@ static inline void __start_tx(struct uart_port *port) if (!(up->ier & UART_IER_THRI)) { up->ier |= UART_IER_THRI; #ifdef CONFIG_ARCH_ROCKCHIP - up->ier |= UART_IER_PTIME; + /* Disable PTIME when it is rs485 mode*/ + if (!up->em485) + up->ier |= UART_IER_PTIME; #endif serial_port_out(port, UART_IER, up->ier); @@ -1601,12 +1676,24 @@ static inline void start_tx_rs485(struct uart_port *port) struct uart_8250_port *up = up_to_u8250p(port); struct uart_8250_em485 *em485 = up->em485; unsigned char mcr; + int value = 0; if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX)) serial8250_stop_rx(&up->port); em485->active_timer = NULL; + if (port->rs485_de_gpio) { + if (up->port.rs485.flags & SER_RS485_RTS_ON_SEND) + value = 0; + else + value = 1; + gpiod_set_value(port->rs485_de_gpio, value); + DEBUG_EM485("%s ttyS%d gpio:%d\n", __func__, port->line, value); + __start_tx(port); + return; + } + mcr = serial8250_in_MCR(up); if (!!(up->port.rs485.flags & SER_RS485_RTS_ON_SEND) != !!(mcr & UART_MCR_RTS)) { @@ -1615,6 +1702,7 @@ static inline void start_tx_rs485(struct uart_port *port) else mcr &= ~UART_MCR_RTS; serial8250_out_MCR(up, mcr); + DEBUG_EM485("%s:%d ttyS%d MCR:%02X\n", __func__, __LINE__, port->line, mcr); if (up->port.rs485.delay_rts_before_send > 0) { em485->active_timer = &em485->start_tx_timer; @@ -1778,6 +1866,7 @@ unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr) lsr = serial_in(up, UART_LSR); } while (lsr & (UART_LSR_DR | UART_LSR_BI)); + serial8250_out_MCR(up, 2); tty_flip_buffer_push(&port->state->port); return lsr; } diff --git a/kernel/drivers/tty/serial/serial_core.c b/kernel/drivers/tty/serial/serial_core.c index fc1c7d5f10..aec3c61b9a 100644 --- a/kernel/drivers/tty/serial/serial_core.c +++ b/kernel/drivers/tty/serial/serial_core.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include #include +#include /* * This is used to lock changes in serial line configuration. @@ -332,6 +334,7 @@ uart_update_timeout(struct uart_port *port, unsigned int cflag, unsigned int baud) { unsigned int bits; + u64 frame_time; /* byte size and parity */ switch (cflag & CSIZE) { @@ -354,6 +357,8 @@ uart_update_timeout(struct uart_port *port, unsigned int cflag, if (cflag & PARENB) bits++; + frame_time = (u64)bits * NSEC_PER_SEC; + /* * The total number of bits to be transmitted in the fifo. */ @@ -364,6 +369,7 @@ uart_update_timeout(struct uart_port *port, unsigned int cflag, * Add .02 seconds of slop */ port->timeout = (HZ * bits) / baud + HZ/50; + port->frame_time = DIV64_U64_ROUND_UP(frame_time, baud); } EXPORT_SYMBOL(uart_update_timeout); @@ -2336,7 +2342,10 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, */ spin_lock_irqsave(&port->lock, flags); port->mctrl &= TIOCM_DTR; - port->ops->set_mctrl(port, port->mctrl); + if (!(port->rs485.flags & SER_RS485_ENABLED)) + port->ops->set_mctrl(port, port->mctrl); + else + port->rs485_config(port, &port->rs485); spin_unlock_irqrestore(&port->lock, flags); /* @@ -3066,8 +3075,10 @@ EXPORT_SYMBOL(uart_remove_one_port); * This function implements the device tree binding described in * Documentation/devicetree/bindings/serial/rs485.txt. */ -void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf) +void uart_get_rs485_mode(struct uart_port *port) { + struct serial_rs485 *rs485conf = &port->rs485; + struct device *dev = port->dev; u32 rs485_delay[2]; int ret; @@ -3099,6 +3110,11 @@ void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf) rs485conf->flags &= ~SER_RS485_RTS_ON_SEND; rs485conf->flags |= SER_RS485_RTS_AFTER_SEND; } + + port->rs485_de_gpio = devm_gpiod_get_optional(dev, "rs485-de", + GPIOD_OUT_LOW); + if (IS_ERR(port->rs485_de_gpio)) + port->rs485_de_gpio = NULL; } EXPORT_SYMBOL_GPL(uart_get_rs485_mode); diff --git a/kernel/include/linux/serial_core.h b/kernel/include/linux/serial_core.h index 3460b15a26..0e22f057cf 100644 --- a/kernel/include/linux/serial_core.h +++ b/kernel/include/linux/serial_core.h @@ -246,6 +246,7 @@ struct uart_port { int hw_stopped; /* sw-assisted CTS flow state */ unsigned int mctrl; /* current modem ctrl settings */ unsigned int timeout; /* character-based timeout */ + unsigned int frame_time; /* frame timing in ns */ unsigned int type; /* port type */ const struct uart_ops *ops; unsigned int custom_divisor; @@ -261,6 +262,7 @@ struct uart_port { struct attribute_group *attr_group; /* port specific attributes */ const struct attribute_group **tty_groups; /* all attributes (serial core use only) */ struct serial_rs485 rs485; + struct gpio_desc *rs485_de_gpio; /* enable RS485 de */ void *private_data; /* generic platform data pointer */ }; @@ -552,5 +554,5 @@ static inline int uart_handle_break(struct uart_port *port) (cflag) & CRTSCTS || \ !((cflag) & CLOCAL)) -void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf); +void uart_get_rs485_mode(struct uart_port *port); #endif /* LINUX_SERIAL_CORE_H */ diff --git a/yocto/meta-tvis-app/recipes/hvgo-tvis/files/hvgo.c b/yocto/meta-tvis-app/recipes/hvgo-tvis/files/hvgo.c index cea061853b..ea4951af35 100755 --- a/yocto/meta-tvis-app/recipes/hvgo-tvis/files/hvgo.c +++ b/yocto/meta-tvis-app/recipes/hvgo-tvis/files/hvgo.c @@ -16,6 +16,8 @@ static version versions[] = { {"V1.05 20240406", "移植QT环境"}, {"V1.06 20240407", "添加魔视模型库"}, {"V1.07 20240425", "1.继承SDK1.3版本; 2. rtsp-server 更新; 3. 有线网卡脚本优化;"}, + {"V1.08 20240430", "修复485+RTC"}, + {"V1.09 20240508", "1. 添加 i2c-tools、can-utils、ifmetric、network-manager等测试工具包; 2. 解决QT界面程序编译报错问题"}, }; /* 获取版本信息说明 */ diff --git a/yocto/meta-tvis-app/recipes/packagegroups/packagegroup-tvis-app.bb b/yocto/meta-tvis-app/recipes/packagegroups/packagegroup-tvis-app.bb index b4bd5d4711..a2818d8610 100755 --- a/yocto/meta-tvis-app/recipes/packagegroups/packagegroup-tvis-app.bb +++ b/yocto/meta-tvis-app/recipes/packagegroups/packagegroup-tvis-app.bb @@ -11,5 +11,4 @@ RDEPENDS:${PN} = "\ netcore-tvis \ opencv-tvis \ rtsp-server-tvis \ - ubuntu-tool-tvis \ " \ No newline at end of file diff --git a/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/candump b/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/candump deleted file mode 100755 index 02d31e703ba8d7e896e93124efd5de7495f4b06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30856 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 U!-&2c>0ajTUpIodk8SIJ1IZgW3IG5A diff --git a/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cangen b/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cangen deleted file mode 100755 index 7d6c7f3b23cee9990cc85f6546b7463582c64139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22664 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 ZDZU!7SpT_6cLU>#y#65rMvt*|{VxSH^jZJ_ diff --git a/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cansend b/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/canutils/cansend deleted file mode 100755 index cb8bb7f697102deca09993459100b83c7f54ae94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18560 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

Uz}&=c|U_NBh*b z3bb91IJ^Q|=%9X(Jw?Bc#jtloK0G76kau8VMQ?83f{H!!_s)A%-x2EnF7Q7M{)z;Z zU+s4V^}C$$_{! z-YI*gRy>>hOiJZ`>%Pg3=O;avoY0OCO?<- z{3OyNg;LI)bs%uge^7Se!!j;ledz4D_lG|?|KWwz8d8L&-Dto4_p#UoT*HoQ31u(* z#ex6g=zXH^@rpfJy7n8P8yLs2*_+Kqo#!g2B4h^QB(_zpyT_aVOX5Z`q~xV-poLwu(p zm^{(Vs@jcgUPK)}_zKZz> z+K)9R9kgtvV;8@``y%RboY#wuxEgM-mDkgA79DqMMf{hRtaJ>E_xd%G<#K)E*iCpV05U*S)s+Ho&01s~q$Qu_yURp={Dm!>)1qJl7xP z^h&Px|5h=L9!PNf|5gq!*8)R)Kcw~IPydSVio|zB;=3WEr1)-V$fnhZ?}8$n7T^7d z?|kCl_3*qTzS|Ms>BPUw;qv0U8}Xe@KgY#)G)qc6_QH}9&k|3ev!S@Cq@c90v8bTf zUef4pEG}Hy=qX)XP~ysWdm1*ZBMXDe&TV4(fhK(a8gw?We06`Zo#kUY+LOPoZ9{&; z1~0xm^}0D!=2&eDVmDH)!`~E|SiXC6TVQjmR$`}9t--buZJ*yp)S=GrX>pPOziMv@ zQj=c%20fkl#kQXpbw1i&W%-^a?e7G2O>W2vN|UH_`u)z$nuNF}DQW@=RCAoIUKdQj zE@r-_uptmoO~Oa9=sz~mn~mf5e@auHp~w>R)XpzNDe|7s&(o72)x9g4@qn>iFphf-_rNZUO ze&P}Kb6EX<1!zo!ytp5TQrr(j`$AsyKL}ZpcW{N`{vt|oKO*^=IF0gKfss$hK03tx zSd`*Erqya~iEAo1p+R1(A4DnI z6a2>b-_7NP|JxU6oT5xNG-x2%euKR6{|$LbG|Wq5`#(0w%LN*vC@+bH2A4Ose+>9k zoPtfPm&E@kV&oUJC|`x_T{?NOp4znxAP&K&QMYJ;pF#zVpJ-ovN57lPuQH6kkQ4gO z;(}sN$cy`|`2SwS#1Qc*KX9^ckNE+)!t%&~$ zIRSi%3&Mo`ySV%=MdL8?8_Z$91)C8gNg+@9Reu=c=Qi7QjISyhF|Nbt(%9Dj29iIg A?EnA( diff --git a/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/ifmetric/ifmetric b/yocto/meta-tvis-app/recipes/ubuntu-tool-tvis/files/ifmetric/ifmetric deleted file mode 100755 index ae6f26ae07a4279d5ef3f1c490b02158c4b4ecd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14264 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