[ RK3566-Android11 ] 关于 RK628F 驱动移植以及调试说明

news2024/12/25 13:42:03

问题描述

我这个项目的SDK比较老,移植RK628F最新驱动的调试过程,踩了很多坑,希望大家别踩坑。


解决方案:

首先在FTP上下载最新的RK628的驱动 rk628-for-all-v27-240730 版本。
下载完后 不要直接替换,不要直接替换,不要直接替换,重要的事情说三遍!!!
按照一下移植过程同步移植。

U-boot部份:
1.先将RK628\rk628-for-all\v27-240730\kernel\rk628_for_all_v27_240730\src_rk628-for-all-kernel-v26-240730\u-boot\drivers\video\drm\rk628下整个rk628文件夹复制到u-boot\drivers\video\drm下。

2.打入RK628\rk628-for-all\v27-240730\kernel\rk628_for_all_v27_240730\patch_rk628-for-all-kernel-v26-240730\u-boot下的三个补丁。
一个是Kconfig和Makefile添加编译rk628。
一个是u-boot\drivers\video\drm\dw_hdmi.c相关改动。
另外一个rk628添加文件不用管它。

3.在u-boot\configs下找到rk3566.config索引到rk3568_defconfig,添加CONFIG_DRM_ROCKCHIP_RK628=y编译 RK628驱动。

CONFIG_DRM_ROCKCHIP_LVDS=y
CONFIG_DRM_ROCKCHIP_RGB=y
+CONFIG_DRM_ROCKCHIP_RK628=y
CONFIG_ROCKCHIP_CUBIC_LUT_SIZE=9

Kernel部分:
按照如下参考这个说明:

android 路径下补丁主要是针对rk628音频部分  不加   

1. kernel\arch 路径下的主要是dts 和config宏的修改  
       dts 是rk628的demo 作为参考。 替不替换都可以 
       config宏的修改一定要加上去。 

2. kenrel/Documentation  不加  

3. kernel/include  不加 

4.kernel\drivers\clk  不加 

4. kernel\drivers\misc  rk628显示部分 核心文件 
      kernel\drivers\misc\rk628 直接替换  
      kernel\drivers\misc\Kconfig Makefile 参考补丁手动加进去 主要是针对rk628 编译声明 宏声明 

5.kernel\drivers\media  rk628 输入部分的核心文件 主要针对camera  不加  

6. 以下路径文件 参考补丁手动加进去
          kernel\drivers\gpu   hdmi强制输出固定分辨率  绕过读edid流程
          kernel\drivers\i2c     提前i2c设备的注册 以加快rk628的初始化  
          kernel\drivers\base  增加宏主要是为了实现regmap文件结点可以写628寄存器 
          kernel\drivers\pwm  提前pwm设备的注册 以加快rk628的初始化 
          kernel\drivers\video 提前backlight设备的注册 以加快rk628的初始化

1.首先打上第六点的三个补丁,分别是:
0130-rk628-for-all-Call-rockchip_pwm_driver_init-and-pwm_.patch
0001-regmap-debugfs-Allow-register-writes-through-debugfs.patch
0126-i2c-rk3x-Call-rk3x_i2c_driver_init-early-when-CONFIG.patch

2.移植第四点的rk628核心驱动。直接将
rk628-for-all\v27-240730\kernel\rk628_for_all_v27_240730\src_rk628-for-all-kernel-v26-240730\kernel\drivers\misc\rk628整个文件移植到kernel\drivers\misc下
对应kernel\drivers\miscKconfig增加如下:

source "drivers/misc/ocxl/Kconfig"
+source "drivers/misc/rk628/Kconfig"
source "drivers/misc/cardreader/Kconfig"

对应kernel\drivers\misc\Makefile增加如下:

obj-$(CONFIG_RK803)		+= rk803.o
obj-$(CONFIG_ENC_SW2001) 	+= translogic.o
+obj-y				+= rk628/

3.打上rk628-for-all\v27-240730\kernel\rk628_for_all_v27_240730\patch_rk628-for-all-kernel-v26-240730\kernel\0190-drm-bridge-synopsys-Support-hdmi-force-output-kernel-4-19.patch补丁
涉及
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
include/drm/bridge/dw_hdmi.h

4.打上强制4K输出补丁和强制输出RGB888格式。
强制4K输出补丁:
在这里插入图片描述
rk3566-evb1-ddr4-v10.dts

#include "rk3566-evb1-ddr4-v10.dtsi"
#include "rk3568-android.dtsi"
++#include <dt-bindings/display/rockchip_vop.h> //图层 ID 定义头文件

++&vp0 { //x 取决于使用的 vp id,如 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 = <ROCKCHIP_VOP2_SMART0>;
++};

rk3568 force-output 4k.txt 补丁

//u-boot:
//uboot阶段需要将hdmi版本协议切到2.0,强制打开SCRAMBLER
diff --git a/drivers/video/drm/dw_hdmi.c b/drivers/video/drm/dw_hdmi.c
index 10a593870a..cb4a4a3334 100644
--- a/drivers/video/drm/dw_hdmi.c
+++ b/drivers/video/drm/dw_hdmi.c
@@ -820,14 +820,7 @@ static const struct dw_hdmi_phy_data dw_hdmi_phys[] = {
 static int rockchip_dw_hdmi_scrambling_enable(struct dw_hdmi *hdmi,
                                              int enable)
 {
-       u8 stat;
-
-       drm_scdc_readb(&hdmi->adap, SCDC_TMDS_CONFIG, &stat);
-
-       if (stat < 0) {
-               debug("Failed to read tmds config\n");
-               return false;
-       }
+       u8 stat = 0;

        if (enable == 1) {
                /* Write on Rx the bit Scrambling_Enable, register 0x20 */
@@ -1116,7 +1109,6 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
        }

        /* Scrambling Control */
-       if (hdmi_info->scdc.supported) {
                if (vmode->mtmdsclock > 340000000 ||
                    (hdmi_info->scdc.scrambling.low_rates &&
                     hdmi->scramble_low_rates)) {
@@ -1127,7 +1119,6 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
                } else {
                        rockchip_dw_hdmi_scrambling_enable(hdmi, 0);
                }
-       }

        /* Set up horizontal active pixel width */
        hdmi_writeb(hdmi, hdisplay >> 8, HDMI_FC_INHACTV1);

//强制输出3840x2160@60,这个vic mode为97. 
@@ -2430,13 +2421,15 @@ int rockchip_dw_hdmi_get_timing(struct display_state *state)
        unsigned int bus_format;
        unsigned long enc_out_encoding;
        struct overscan *overscan = &conn_state->overscan;
-       const u8 def_modes_vic[6] = {4, 16, 2, 17, 31, 19};
+       const u8 def_modes_vic[1] = {97};

        if (!hdmi)
                return -EFAULT;

        ret = drm_do_get_edid(&hdmi->adap, conn_state->edid);

+       ret = -EFAULT;  
+
        if (!ret) {
                hdmi->sink_is_hdmi =
                        drm_detect_hdmi_monitor(edid);

//强制修改bus_format为RGB888
@@ -2469,6 +2462,8 @@ int rockchip_dw_hdmi_get_timing(struct display_state *state)
        drm_rk_selete_output(&hdmi->edid_data, conn_state, &bus_format,
                             overscan, hdmi->dev_type, hdmi->output_bus_format_rgb);

+       bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+
        *mode = *hdmi->edid_data.preferred_mode;
        hdmi->vic = drm_match_cea_mode(mode);

//设置为HPD为高电平。  
@@ -2525,6 +2520,8 @@ int rockchip_dw_hdmi_detect(struct display_state *state)
        if (!hdmi)
                return -EFAULT;

+       return connector_status_connected;
+
        ret = dw_hdmi_detect_hotplug(hdmi, state);

        return ret;


//kernel:
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index ee7f83a81016..966ab224425d 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -202,40 +202,12 @@ static const u16 csc_coeff_full_to_limited[3][4] = {
 };

 static const struct drm_display_mode dw_hdmi_default_modes[] = {
-       /* 4 - 1280x720@60Hz 16:9 */
-       { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
-                  1430, 1650, 0, 720, 725, 730, 750, 0,
-                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 16 - 1920x1080@60Hz 16:9 */
-       { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
-                  2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
-                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 31 - 1920x1080@50Hz 16:9 */
-       { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
-                  2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
-                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 19 - 1280x720@50Hz 16:9 */
-       { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
-                  1760, 1980, 0, 720, 725, 730, 750, 0,
-                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
-       /* 0x10 - 1024x768@60Hz */
-       { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
-                  1184, 1344, 0,  768, 771, 777, 806, 0,
-                  DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
-       /* 17 - 720x576@50Hz 4:3 */
-       { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
-                  796, 864, 0, 576, 581, 586, 625, 0,
-                  DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
-       /* 2 - 720x480@60Hz 4:3 */
-       { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
-                  798, 858, 0, 480, 489, 495, 525, 0,
-                  DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
-         .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+       /* 97 - 3840x2160@60Hz 16:9 */
+        { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
+                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
+                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+          .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+
 };

 struct hdmi_vmode {

//强制打开hdmi 2.0 scramble。
@@ -1478,6 +1450,10 @@ static int hdmi_phy_i2c_read(struct dw_hdmi *hdmi, unsigned char addr)
 static bool dw_hdmi_support_scdc(struct dw_hdmi *hdmi)
 {
        struct drm_display_info *display = &hdmi->connector.display_info;
+       unsigned long mtmdsclock = hdmi->hdmi_data.video_mode.mtmdsclock;
+
+       if (mtmdsclock > HDMI14_MAX_TMDSCLK)
+               return true;  

        /* Completely disable SCDC support for older controllers */
        if (hdmi->version < 0x200a)
//将状态强制设置为永久连接的状态
@@ -2722,6 +2698,8 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
                                             connector);
        enum drm_connector_status result;

+       return connector_status_connected;
+
        if (!hdmi->force_logo) {
                mutex_lock(&hdmi->mutex);
                hdmi->force = DRM_FORCE_UNSPECIFIED;
//走强制输出的流程 
@@ -2792,6 +2770,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
                return 0;

        edid = drm_get_edid(connector, hdmi->ddc);
+       edid = NULL;  
        if (edid) {
                dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
                        edid->width_cm, edid->height_cm);
//初始化时 若rk628没有开始初始化,则phy存在没有拉高的场景
@@ -3985,7 +3964,7 @@ __dw_hdmi_probe(struct platform_device *pdev,

        hdmi->initialized = false;
        ret = hdmi_readb(hdmi, HDMI_PHY_STAT0);
-       if (((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) &&
+       if (((ret & HDMI_PHY_TX_PHY_LOCK) &&
             hdmi_readb(hdmi, HDMI_FC_EXCTRLDUR)) || hdmi->force_logo) {
                hdmi->mc_clkdis = hdmi_readb(hdmi, HDMI_MC_CLKDIS);
                hdmi->disabled = false;

//即假设在HDMI probe阶段已经将hpd脚和rxsence中断并且rk628端还没有拉高hpd脚,则hdmi会强制关闭
@@ -4072,8 +4051,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
        }

        dw_hdmi_setup_i2c(hdmi);
-       if (hdmi->phy.ops->setup_hpd)
-               hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data);

        if (hdmi->version >= 0x200a)
                hdmi->connector.ycbcr_420_allowed =

//强制输出可能导致match不上,出现显示不了kernel logo
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 401528583682..2a36b0a07ffc 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -770,8 +770,7 @@ static int setup_initial_state(struct drm_device *drm_dev,
                    /* we just need to focus on DRM_MODE_FLAG_ALL flag, so here
                     * we compare mode->flags with set->flags & DRM_MODE_FLAG_ALL.
                     */
-                   mode->flags == (set->flags & DRM_MODE_FLAG_ALL) &&
-                   mode->picture_aspect_ratio == set->picture_aspect_ratio) {
+                   mode->flags == (set->flags & DRM_MODE_FLAG_ALL)) {
                        found = 1;
                        match = 1;
                        break;


强制输出RGB888格式补丁
kernel\drivers\gpu\drm\rockchip\rockchip_drm_drv.c添加

	if (tmdsclock > max_tmds_clock) {
		if (max_tmds_clock >= 594000) {
			color_depth = 8;
		} else if (max_tmds_clock > 340000) {
			if (drm_mode_is_420(info, mode) || tmdsclock >= 594000)
				*color_format = DRM_HDMI_OUTPUT_YCBCR420;
		} else {
			color_depth = 8;
			if (drm_mode_is_420(info, mode) || tmdsclock >= 594000)
				*color_format = DRM_HDMI_OUTPUT_YCBCR420;
		}
	}

++	*color_format = DRM_HDMI_OUTPUT_DEFAULT_RGB;

	if (*color_format == DRM_HDMI_OUTPUT_YCBCR420) {
		*output_mode = ROCKCHIP_OUT_MODE_YUV420;
		if (color_depth > 8)
			*bus_format = MEDIA_BUS_FMT_UYYVYY10_0_5X30;
		else
			*bus_format = MEDIA_BUS_FMT_UYYVYY8_0_5X24;
		*bus_width = color_depth / 2;
		hdmi->output_bus_format = *bus_format;
	} else {
		*output_mode = ROCKCHIP_OUT_MODE_AAAA;

5.修改 kernel/.config 编译配置

CONFIG_DRM_ROCKCHIP_RK618=y
-- CONFIG_DRM_ROCKCHIP_RK628=y
++ # CONFIG_DRM_ROCKCHIP_RK628 is not set

#
# RK628 misc driver
#
++ CONFIG_RK628_MISC=y
++ CONFIG_RK628_MISC_HDMITX=y
++ CONFIG_ROCKCHIP_THUNDER_BOOT_RK628=y

6.dts配置分享
rk3566-evb1-ddr4-v10.dtsi

&i2c4_rk628 {
		status = "okay";
		// 屏背光脚
		panel-backlight = <&backlight>;
		// 屏使能光脚
		panel-power-supply = <&vcc3v3_lcd0_n>;
		// panel-enable-gpios = <&gpioX RK_PXX GPIO_ACTIVE_HIGH>;
		panel-reset-delay-ms = <10>;
		panel-enable-delay-ms = <150>;
		panel-prepare-delay-ms = <60>;
		panel-unprepare-delay-ms = <10>;
		panel-disable-delay-ms = <60>;
		// 我这里是外挂时钟 不需要24M时钟
		// pinctrl-names = "default";
		// pinctrl-0 = <&rk628_reset &refclk_pins>;
		// assigned-clocks = <&pmucru CLK_WIFI>;
		// assigned-clock-rates = <24000000>;
		// clocks = <&pmucru CLK_WIFI>;
		// clock-names = "soc_24M";

		rk628-hdmi-in;
		rk628-gvi-out {
			/* "rgb666"
			 * "rgb888"
			 * "rgb101010"
			 * "yuyv8"
			 * "yuyv10"
			 */
			bus-format = "rgb888";
			gvi,lanes = <8>;
			rockchip,division-mode;
			// rockchip, gvi-frm-rst;
			status = "okay";
		};

		display-timings {
			src-timing {
				clock-frequency = <594000000>;
				hactive = <3840>;
				vactive = <2160>;
				hback-porch = <296>;
				hfront-porch = <176>;
				vback-porch = <72>;
				vfront-porch = <8>;
				hsync-len = <88>;
				vsync-len = <10>;
				hsync-active = <1>;
				vsync-active = <1>;
				de-active = <0>;
				pixelclk-active = <0>;
			};

			dst-timing {
				clock-frequency = <594000000>;
				hactive = <3840>;
				vactive = <2160>;
				hback-porch = <296>;
				hfront-porch = <176>;
				vback-porch = <72>;
				vfront-porch = <8>;
				hsync-len = <88>;
				vsync-len = <10>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
	    };
};

&hdmi {
	status = "okay";
	force-bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
	force-output;
	force_timing {
		clock-frequency = <594000000>;
		hactive = <3840>;
		vactive = <2160>;
		hback-porch = <296>;
		hfront-porch = <176>;
		vback-porch = <72>;
		vfront-porch = <8>;
		hsync-len = <88>;
		vsync-len = <10>;
		hsync-active = <1>;
		vsync-active = <1>;
		de-active = <0>;
		pixelclk-active = <0>;
	};
};

&hdmi_in_vp0 {
	status = "okay";
};

&hdmi_in_vp1 {
	status = "disabled";
};

&hdmi_sound {
	status = "okay";
};

&route_hdmi {
	status = "okay";
	bridge = <&i2c4_rk628>;
	force-bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
	force-output;
	force_timing {
		clock-frequency = <594000000>;
		hactive = <3840>;
		vactive = <2160>;
		hback-porch = <296>;
		hfront-porch = <176>;
		vback-porch = <72>;
		vfront-porch = <8>;
		hsync-len = <88>;
		vsync-len = <10>;
		hsync-active = <1>;
		vsync-active = <1>;
		de-active = <0>;
		pixelclk-active = <0>;
	};
};

rk3568-evb.dtsi

&i2c4 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&i2c4m0_xfer>;
	clock-frequency = <400000>;

	i2c4_rk628: rk628@50 {
		status = "okay";
		compatible = "rockchip,rk628";
		reg = <0x50>;
		// INT
		interrupt-parent = <&gpioX>;
		interrupts = <RK_PXX IRQ_TYPE_LEVEL_HIGH>;
		// ENABLE
		enable-gpios = <&gpioX RK_PCXX GPIO_ACTIVE_HIGH>;
		// RESET
		reset-gpios = <&gpioX RK_PXX GPIO_ACTIVE_LOW>;
		#sound-dai-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&rk628_reset>;
	};
};

&pinctrl {
	rk628 {
		rk628_reset: rk628-reset {
			rockchip,pins = <X RK_PXX RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue获取后端重定向拼接的参数

前言 比如我们要重定向这样一个连接&#xff1a; http://192.168.2.189:8081?nameadmin springboot重定向&#xff1a; Vue获取&#xff1a; getParam(param) {var reg new RegExp("(^|&)" param "([^&]*)(&|$)");var r location.searc…

计算机的错误计算(八十八)

摘要 探讨双曲反正切函数 atanh(x)的计算精度问题。 IEEE 754-2019 中含有 atanh(x)函数。其定义为 例1. 计算 atanh(0.9999999999997) . 不妨用 LibreOffice中的电子表格计算&#xff0c;则有&#xff1a; 若在线运行JavaScript代码&#xff1a; let result Math.atanh(0.…

单电源转正负双电源电路

单电源转正负双电源电路&#xff1a; 1.通过两个DCDC芯片进行降压&#xff1a; 不同负载下电源纹波不同&#xff0c;所以看电源纹波首先先说明负载是什么&#xff1a; 采用TPS5430将单电源转换成双电源的方式供电&#xff1a; 2.通过电荷泵的方式转换电压 成本可以压低&#…

民生水暖工程背后的科技力量引领工程智能化转型

物联网技术的广泛应用&#xff0c;使得物理设备能够实时传输运行状态数据至云端&#xff0c;实现了设备的全面感知与互联互通。每一台机器、每一个传感器都成为数据的源泉&#xff0c;为远程监控提供了坚实的基础。而大数据分析技术的应用&#xff0c;则让这些海量数据得以被高…

R语言统计分析——用回归做ANOVA

参考资料&#xff1a;R语言实战【第2版】 ANOVA&#xff08;方差分析&#xff09;和回归都是广义线性模型的特例&#xff0c;方差分析也都可以使用lm()函数来分析。 # 加载multcomp包 library(multcomp) # 查看cholesterol数据集的处理水平 levels(cholesterol$trt) # 用aov()…

久久派搭建风电系统网站(基于mariadb数据库)

久久派搭建风电系统网站 1、安装mariadb2、设置root账号密码3、设置MariaDB开机自启4、允许远程登录5、还原数据库6、扩容swap7、拷贝数据8、运行系统方法1&#xff1a;通过sh脚本运行方法2&#xff1a;直接运行jar包 文中所需网盘资料及讲解视频在文章末尾哦1。 本文中参考资料…

万能无线航模模拟器加密狗说明书

快速开始 Step1 插入加密狗到你的电脑&#xff0c;手机或MAC的USB口。 Step2 使用加密狗上的按钮&#xff0c;选择一个合适的协议。具体看第一节。 Step3 和遥控器对码&#xff0c;成功后指示灯常亮。具体看FAQ第二节。 Step4 在你的电脑&#xff0c;手机或MAC 安装对…

GD32F103单片机-GPIO

GD32F103单片机-GPIO 一、GPIO介绍二、GD32F103库函数介绍三、GPIO输入输出3.1 GPIO输出-LED闪烁3.2 GPIO输入-独立按键 STM32GPIO部分见STM32F1单片机-GPIO 一、GPIO介绍 GD32的GPIO同STM32一样&#xff0c;GPIO可以配置成8种输入输出模式&#xff0c;由软件配置成推挽输出、…

八、发票校验(2)

第三节 发票校验后台设置 1、设置发票进项税默认值&#xff08;事务代码OMR2&#xff09; 维护指定公司代码的进项税缺省值&#xff0c;在采购业务的发票校验操作中能够快速地指定税码。 ——路径&#xff1a;IMG&#xff1a;物料管理>后勤发票校验>收入发票>维护…

备战秋招60天算法挑战,Day34

题目链接&#xff1a; https://leetcode.cn/problems/coin-change/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1qsvDeHEkg/ LeetCode 322.零钱兑换 题目描述 给你一个整数数组coins&#xff0c;表示不同面额的硬币&#xff1b;以及一个整数amount&#xff0c;表…

为数据仓库构建Zero-ETL无缝集成数据分析方案(上篇)

对于从事数据分析的小伙伴们来说&#xff0c;最头疼的莫过于数据处理的阶段。在我们将数据源的原始数据导入数据仓储进行分析之前&#xff0c;我们通常需要进行ETL流程对数据格式进行统一转换&#xff0c;这个流程需要分配专业数据工程师基于业务情况完成&#xff0c;整个过程十…

力扣每日1题--2181.合并零之间的节点

问题 下面我会向大家介绍我的思考过程和解题思路 解题思路 首先&#xff0c;我们看问题提供给我们的提示部分。第一点给了我们节点的数目&#xff0c;第二点给了我们val的范围&#xff0c;而我们这道题是要让我们求和的问题&#xff0c;那么我们就应该估算一下我们数据的一个…

多目标优化算法求解UF1、UF2、UF3、UF4、UF5、UF6、UF7、UF8、UF9、UF10

设计新的多目标测试函数时&#xff0c;需要考虑多个因素以确保它们能够有效地评估和比较多目标优化算法。以下是一些常见的设计原则和考虑因素&#xff1a; 目标函数的多样性&#xff1a;测试函数应涵盖不同类型的目标函数&#xff0c;如线性、非线性、凸函数、凹函数等&#x…

智慧矿山数字化工业大数据平台建设方案(52页PPT下载)

方案介绍&#xff1a; 传统矿山面临生产效率低、资源消耗大、安全隐患多、环境污染严重等问题&#xff0c;急需通过数字化转型实现可持续发展。而智慧矿山数字化工业大数据平台建设方案则可以有效的帮助矿业企业构建一个集数据采集、存储、处理、分析及应用于一体的智慧矿山数…

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …

Flutter动画—涟漪效果

功能分析 涟漪是由几个圆重叠在一起的 外层圆环比内层圆环的背景色要淡&#xff0c;可以改变外层圆的透明度 想要达到涟漪效果只要将每个圆的半径慢慢变大并且循环动画即可 ​实现方法 在画板上创建三个圆环&#xff0c;再实现外层的圆环要比内层圆环的颜色要淡。 class …

第二十四篇——地形篇:知己知彼知地形

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 战略层面的东西宏观了解了之后&#xff0c;越到最后&#xff0c;这些战术…

OpenAI gym: How to get complete list of ATARI environments

题意&#xff1a;OpenAI Gym&#xff1a;如何获取完整的 ATARI 环境列表 问题背景&#xff1a; I have installed OpenAI gym and the ATARI environments. I know that I can find all the ATARI games in the documentation but is there a way to do this in Python, witho…

神经网络—参数初始化、激活函数、损失函数及反向传播算法

基础知识点 神经网络NN(Neural Netwarks) 深度学习(Deep Learning) 神经元(Neuron) 深层神经网络&#xff08;Deep Neural Networks&#xff0c;DNNs&#xff09; 神经网络有下面三个基础层&#xff08;Layer&#xff09;构建而成&#xff1a; 输入层&#xff08;Input&am…

在线翻译百度,以及这三款实用便捷的翻译工具

嘿&#xff0c;朋友们&#xff0c;今天咱们来聊聊那些在日常生活和工作中不可或缺的在线翻译工具。说到这个&#xff0c;那绝对不能不提百度翻译了。那么&#xff0c;接下来就让我用口语化的方式给大家介绍一下它以及另外几款我推荐的翻译工具吧&#xff1a; 百度翻译推荐&…