20250709荣品RD-RK3588开发板的Android13系统下修改为连续长按10s开机

20250709荣品RD-RK3588开发板的Android13系统下修改为连续长按10s开机
2025/7/9 10:11


缘起:由于荣品RD-RK3588开发板使用的PMIC是RK806。
以前在荣品PRO-RK3566开发板上使用的PMIC是RK809上做过了长按开机的。
直接迁移过来了!


1、根据RK809的DATASHEET,短按开机【100ms/500ms】/长按关机,长按关机。6s/8s/10s
我在网上找到的DATASHEET是V1.0的,据说有V1.4的或者更新的?
如果有,方便的话,发一下。

2、我们希望长按2s开机。
如果 RK809的开机模式是写死了。我司需要 等待 2s时间 【以防 误操作/误触发】

可以使用这个上电逻辑不?

先让 RK809检测到500ms 开机指令,如果检测到,先【清除掉 寄存器中的开机指示?】,然后让 RK809等待1.5s == 1500ms,
现在 在 检测 电源键 是否还是按下的。如果是的。走正常的开机逻辑。
如果不是,就判定为 误操作,关机了。

或者您这边有更好的 上电逻辑/建议?

【荣品RD-RK3588开发板使用RK806这颗PMIC,看驱动名称使用了PMIC接口】
Z:\14TB\versions\RD-RK3588_Android13\u-boot\drivers\power\pmic\rk8xx_spi.c
【荣品PRO-RK3566开发板使用RK809这颗PMIC】
Z:\14TB\versions\pro3566_Android13.0\u-boot\drivers\power\pmic\rk8xx.c

Z:\14TB\versions\RD-RK3588_Android13\u-boot\drivers\power\pmic\rk8xx_spi.c

本次修改存在的问题:
1、uboot启动到pmic的probe大概1-2s。
之后需要检测POWERKEY按键是否连续按10s。
本程序简单的处理为10s的最后阶段检测一次。
实际上,需要在循环的每一次/一秒的延迟/间隔期间都需要检测,没有按POWER按键就直接走关机流程了!

2、本次关机流程,直接COPY了关机的代码。
实际上调用关机函数更好!


static int rk8xx_spi_probe(struct udevice *dev)
{
struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
struct rk8xx_priv *priv = dev_get_priv(dev);
struct udevice *spi = dev_get_parent(dev);
struct spi_slave *slave = NULL;
u8 on_source, off_source;
u8 msb, lsb, value = 0;
int ret;

printf("**** wyb 2025/6/26 16:58 %s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

    if (spi->seq < 0) {
dev_err(dev, "Failed to configure the spi num\n");
return -EINVAL;
}

    slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz,
plat->mode);
if (!slave)
return -ENODEV;
priv->slave = slave;

    /* read Chip variant */
ret = rk806_spi_read(dev, RK806_CHIP_NAME, &msb, 1);
if (ret) {
dev_err(dev, "rk806 name read error: %d\n", ret);
return ret;
}

    ret = rk806_spi_read(dev, RK806_CHIP_VER, &lsb, 1);
if (ret) {
dev_err(dev, "rk806 version read error: %d\n", ret);
return ret;
}

    priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
printf("spi%d: RK%x%x: %d\n", spi->seq, msb, (lsb >> 4), lsb & 0x0f);

    rk806_spi_read(dev, RK806_ON_SOURCE, &on_source, 1);
rk806_spi_read(dev, RK806_OFF_SOURCE, &off_source, 1);
printf("ON=0x%02x, OFF=0x%02x\n", on_source, off_source);

    ret = rk806_spi_read(dev, RK806_HW_VER, &value, 1);
if (ret)
panic("RK806: read RK806_HW_VER error!\n");
/* dual rk806 dev name: "rk806master@0", "rk806slave@1"
* single rk806 dev name: " rk806single@0"
*/
if ((!strcmp(dev->name, "rk806master@0")) || (!strcmp(dev->name, "rk806slave@1"))) {
if (value != HW_DUAL_PMIC) {
dev_err(dev, "HW single pmic, the firmware dual pmic(0x%x)!\n", value);
run_command("download", 0);
}
} else {
if (value != HW_SINGLE_PMIC) {
dev_err(dev, "HW dual pmic, the firmware single pmic(0x%x)!\n", value);
run_command("download", 0);
}
}

    if ((lsb & 0x0f) == VERSION_AB) {
ret = rk806_spi_read(dev, RK806_SYS_CFG1, &value, 1);
if (ret) {
dev_err(dev, "rk806 RK806_SYS_CFG1 read error: %d\n", ret);
return ret;
}
value |= 0x80;
rk806_spi_write(dev, RK806_SYS_CFG1, &value, 1);
}

    if (priv->rst_fun) {
rk806_spi_read(dev, RK806_SYS_CFG3, &value, 1);
value &= 0x3f;
if (priv->rst_fun == RK806_RST_MODE1) {
value |= (RK806_RST_MODE1 << 6);
rk806_spi_write(dev, RK806_SYS_CFG3, &value, 1);
} else if (priv->rst_fun == RK806_RST_MODE2) {
value |= (RK806_RST_MODE2 << 6);
rk806_spi_write(dev, RK806_SYS_CFG3, &value, 1);
}
}

    rk8xx_spi_irq_chip_init(dev);


///* 10*100ms */
//mode = rockchip_get_boot_mode();
//printf("xxxx: mode: %d\n", mode);
//value=pmic_reg_read(dev, 0xf0)&0x80;
//printf("value=0x%x\n",value );
//if((pmic_reg_read(dev, 0xf0)&0x80) && mode == BOOT_MODE_UNDEFINE )
//{
//    printf("xxxx: power off\n");
//    rk8xx_shutdown(dev);
//}
//if ((pmic_reg_read(dev, 0xf0) & 0x80)==0 &&
//    mode == BOOT_MODE_UNDEFINE) {
//    i = 0;
//    while (i < 10) {
//        value = pmic_reg_read(dev, 0xf0) & 0x80;
//        printf("value=0x%x\n",value );
//        if ((value & 0x80)) {
//            printf("xxxx: power off\n");
//            rk8xx_shutdown(dev);
//        }
//        mdelay(100);
//        i++;
//    }
//    printf("xxxx: power on\n");
//}

////for j = 0;
//for(j=0; j<256; j++)
//{
//    //printf("0x%02x, ", pmic_reg_read(dev, j) );
//    printf("0x%02x = 0x%02x\n", j, pmic_reg_read(dev, j) );
//}

    //int j = 0;
//for(j=0; j<256; j++)
//{
//    //printf("0x%02x, ", pmic_reg_read(dev, j) );
//    //ret = rk806_spi_read(dev, RK806_SYS_CFG1, &value, 1);
//    ret = rk806_spi_read(dev, j, &value, 1);
//    //printf("0x%02x = 0x%02x\n", j, pmic_reg_read(dev, j) );
//    printf("0x%02x = 0x%02x\n", j, value );
//}


    int j = 0;
for(j=0; j<10; j++)
{
mdelay(1000);
printf("**** wyb 2025/6/26 16:58 %s %s %d j=%d\n", __FILE__, __FUNCTION__, __LINE__, j);
}

//ret = rk806_spi_read(dev, RK806_SYS_CFG3, &dev_off, 1);
ret = rk806_spi_read(dev, 0x5D, &value, 1);
if (0x80 == value)
{
u8 dev_off;
int ret = 0;
printf("**** wyb 2025/6/26 16:58 %s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

ret = rk806_spi_read(dev, RK806_SYS_CFG3, &dev_off, 1);
if (ret)
return ret;

dev_off |= RK806_DEV_OFF;
ret = rk806_spi_write(dev, RK806_SYS_CFG3, &dev_off, 1);
if (ret) {
dev_err(dev, "rk806 shutdown error: %d\n", ret);
return ret;
}

while (1)
;
}

    return 0;
}

static int rk8xx_spi_shutdown(struct udevice *dev)
{
u8 dev_off;
int ret = 0;

printf("**** wyb 2025/6/26 16:58 %s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

    ret = rk806_spi_read(dev, RK806_SYS_CFG3, &dev_off, 1);
if (ret)
return ret;

    dev_off |= RK806_DEV_OFF;
ret = rk806_spi_write(dev, RK806_SYS_CFG3, &dev_off, 1);
if (ret) {
dev_err(dev, "rk806 shutdown error: %d\n", ret);
return ret;
}

    while (1)
;

    return 0;
}

参考资料:
https://blog.csdn.net/Y1anH/article/details/146641944?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-146641944-blog-127852443.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.2&utm_relevant_index=3
RK806S PMIC电源管理芯片调试
https://blog.csdn.net/Y1anH/article/details/146641944

解析此处的核心代码

当点按PWRON按键时,rk806上电开始启动bootloader和uboot,在执行到此处时检测到是由于按键启动的,所以0x5d的值是0x80,0x74的值是0x80,在一般情况下,mode都默认是none的,所以mode值为11,因此就进入了我们的if判断,若是由于按键启动的,则直接调用rk8xx_shutdown函数关掉,进入这个函数会看到实际是通过i2c给0x72寄存器的BIT(0)写1,使其关机。

所以此操作就实现了点按PWRON按键无法开机,避免了误触情况。

在判断里加上0x74寄存器为0x40的情况,则避免了12V电源插入自动启动

而长按开机时,0x5d实际读到的值是0x00,所以不会进入此处的判断

关于此处按键寄存器检测的值,从逻辑上来看更像是按下为0x00,不按为0x80,这里后续还要再想办法测试一下,即rk806芯片手册与实际描述是相反的。或者与PWRON按键接vcc或GND有关,因为rk806手册按下按键时电平状态是拉低的

总之实现的逻辑是这样的,具体的场景需要微调寄存器判断的值


https://blog.csdn.net/u011774634/article/details/130585756?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-6-130585756-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-6-130585756-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=11
RK3588S Android12修改PMIC(RK806)长按电源键强制关机的时长为10秒
https://blog.csdn.net/u011774634/article/details/130585756

--- a/kernel-5.10/drivers/mfd/rk806-core.c
+++ b/kernel-5.10/drivers/mfd/rk806-core.c
@@ -677,6 +677,8 @@ static int rk806_parse_dt(struct rk806 *rk806)
/* PWRON_ON_TIME: 0:500mS; 1:20mS */
if (device_property_read_bool(dev, "pwron-on-time-500ms"))
rk806_field_write(rk806, PWRON_ON_TIME, 0x00);
+       
+       rk806_field_write(rk806,PWRON_LP_OFF_TIME,0x02);

return 0;
}


https://blog.csdn.net/u011774634/article/details/132744969?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-132744969-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-132744969-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=12
RK3588S Android12修改短按电源键的开机按键时长
https://blog.csdn.net/u011774634/article/details/132744969

RK806的power按键开机时长有2种选择,通过如下寄存器进行配置:

默认为20mS,如果要改为500mS,则将0x76寄存器的第7位写0即可。

dts修改方法为在rk806的节点中增加如下属性即可,如下修改:

--- a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi
+++ b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi
@@ -43,6 +43,8 @@
*    and simultaneously pull down the RESETB PIN for 5mS before releasing
*/
pmic-reset-func = <1>;
+               
+               pwron-on-time-500ms;

vcc1-supply = <&vcc5v0_sys>;
vcc2-supply = <&vcc5v0_sys>;

pwron-on-time-500ms的解析参考kernel-5.10\drivers\mfd\rk806-core.c中如下代码:

    /* PWRON_ON_TIME: 0:500mS; 1:20mS */
if (device_property_read_bool(dev, "pwron-on-time-500ms"))
rk806_field_write(rk806, PWRON_ON_TIME, 0x00);


https://blog.csdn.net/weixin_43245753/article/details/127852443
RK3588长按power键强制关机的按键时间设置


https://wenku.csdn.net/answer/4cc3d5c9b6ae43f09a8c301a1ec7a02d?spm=1001.2101.3001.6650.20&utm_medium=distribute.pc_relevant.none-task-chatgpt-2%7Edefault%7ECTRLIST%7EPosition-20-4cc3d5c9b6ae43f09a8c301a1ec7a02d-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-chatgpt-2%7Edefault%7ECTRLIST%7EPosition-20-4cc3d5c9b6ae43f09a8c301a1ec7a02d-blog-127852443.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=25
RK3568 Android11 去除长按power键关机的功能 - CSDN文库.mhtml
https://wenku.csdn.net/answer/4cc3d5c9b6ae43f09a8c301a1ec7a02d

RK3568 Android11 去除长按power键关机的功能                                                                                        
时间: 2023-09-11 13:10:10 浏览: 545                                                                                        

您可以通过修改系统源代码来实现去除长按power键关机的功能。具体的实现步骤如下:                                                                                        

1、打开系统源代码,并找到 frameworks/base/packages/systemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java 文件。                                                                                        

2、在该文件中找到 mPowerOptions = (Linearlayout) mDialog.findViewById(R.id.power_options);代码行。                                                                                        

3、在该代码行后面添加以下代码:    
// 关闭长按 power 键关机功能
mPowerOptions.findViewById(R.id.shutdown).setVisibility(View.GONE);复制代码                                                                                        

4、保存文件并重新编译系统源代码。                                                                                        

5、在设备上安装编译后的系统镜像,并测试长按 power 键是否已经无法关机。                                                                                        

注意:该方法需要您具备一定的 Android 系统开发经验,并且需要对设备进行 ROOT 操作才能实现。另外,修改系统源代码可能会导致系统不稳定或无法正常升级,请谨慎操作。    


https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf
RK809 Datasheet

【付费下载】
https://bbs.16rd.com/thread-566291-1-1.html
[瑞芯微RK资料]?瑞芯微RK809 datasheet数据手册1.4修订版本


如果 RK809的开机模式是写死了。我司需要 等待 2s时间 【以防 误操作/误触发】

可以使用这个上电逻辑不?

先让 RK809检测到500ms 开机指令,如果检测到,先【清除掉 寄存器中的开机指示?】,然后让 RK809等待1.5s == 1500ms,
现在 在 检测 电源键 是否还是按下的。如果是的。走正常的开机逻辑。
如果不是,就判定为 误操作,关机了。

或者您这边有更好的 上电逻辑/建议?

没有这样改过不清楚是否可行 ,如果是完全掉电的情况下rk809的寄存器是会重新初始化的,需要注意完全掉电的情况下 这个长按短按开机的判断不会生效@造诣==灶燚 


1、我们地面站的电池是 直接 焊接到板上的。只要电池有电,可以保证 RK3566总是有电的。
2、我的考虑是在UBOOT阶段 使用2000 ms来判断RK809是 真实 需求上电?
还是 误触发。
【如果是误触发,直接在uboot阶段就关机了】

就算RK809掉电 也没有关系吧?


请问RK809的0xF7,里面的 PWRON_LP_TM 可以配置成为长按2秒钟开机吗? 


不清楚这个寄存器实际对应的是哪个,你可以用i2cget  与i2cset 工具查看默认值 ,修改对应寄存器值测试

可以尝试在uboot 启动的时候在rk809的驱动 初始化部分添加操作寄存器的部分  通过这两个去获取对应pmic的引脚状态或着这个按键按下的状态看下

https://www.elecfans.com/d/2092347.html
【深圳触觉智能技术分享】RK3568 RK809电量计电池调试

https://www.elecfans.com/d/2089149.html
基于IDO-SBC3568主板说明PMIC RK809电量计的调试方法-电子发烧友网

https://blog.csdn.net/Industio_CSDN/article/details/130921874?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-130921874-blog-107173710.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.2&utm_relevant_index=4
https://blog.csdn.net/Industio_CSDN/article/details/130921874
【深圳触觉智能技术分享】RK3568 RK809电量计电池调试


https://blog.csdn.net/qq_40715266/article/details/130229120?spm=1001.2101.3001.6650.18&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-18-130229120-blog-107173710.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-18-130229120-blog-107173710.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=21
https://blog.csdn.net/qq_40715266/article/details/130229120
rk3568-rk809电池电量计
[*] CW2015 Battery driver


https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf
RK809 Datasheet

【PDF】
Rockchip RK809 Datasheet

文件格式:PDF/Adobe Acrobat -
翻译此页
7 RK809 Datasheet Rev 1.01 Chapter 1 Introduction 1.1 Overview The RK809 is a complex power-management integrated circuit (PMIC) integrated CODEC for multi-core system applications powered by an external power supply. The RK809 can provide a complete power management solution with very few ...
www.rockchip.fr/RK809 datasheet...


【参考资料:】
https://damodev.csdn.net/68243289a5baf817cf4bb2d5.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjQwNTYwLCJleHAiOjE3NDk1Mzk2ODksImlhdCI6MTc0ODkzNDg4OSwidXNlcm5hbWUiOiJ3YjQ5MTYifQ.H5IbfRcXuGLiIByHSErH_Ot8Y5r_XJUMkbGuVadaNkw&spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7Eactivity-4-146173693-blog-107173710.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7Eactivity-4-146173693-blog-107173710.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=7
https://damodev.csdn.net/68243289a5baf817cf4bb2d5.html
RK809-5电源管理芯片(PMIC)主要有以下几种开机模式:

BING:RK809 dts press-on-time = <0>;


https://blog.csdn.net/cew333/article/details/126164529
[RK3568 Android11] RK809开机短按时间设置和长按电源键设置

https://www.codeleading.com/article/72216664876/
[RK3568 Android11] RK809开机短按时间设置和长按电源键设置
一、长按电源键             关机
二、短按开机电源键响应时间 开机


https://www.uudwc.com/A/dMX9M/
rk3568 长按电源键关机修改

https://blog.csdn.net/u011774634/article/details/132744969?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-132744969-blog-115718749.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-132744969-blog-115718749.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=21
https://blog.csdn.net/u011774634/article/details/132744969
RK3588S Android12修改短按电源键的开机按键时长

RK806的power按键开机时长有2种选择,通过如下寄存器进行配置:


默认为20mS,如果要改为500mS,则将0x76寄存器的第7位写0即可。

dts修改方法为在rk806的节点中增加如下属性即可,如下修改:

--- a/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi
+++ b/kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi
@@ -43,6 +43,8 @@
*    and simultaneously pull down the RESETB PIN for 5mS before releasing
*/
pmic-reset-func = <1>;
+               
+               pwron-on-time-500ms;

vcc1-supply = <&vcc5v0_sys>;
vcc2-supply = <&vcc5v0_sys>;

pwron-on-time-500ms的解析参考kernel-5.10\drivers\mfd\rk806-core.c中如下代码:

    /* PWRON_ON_TIME: 0:500mS; 1:20mS */
if (device_property_read_bool(dev, "pwron-on-time-500ms"))
rk806_field_write(rk806, PWRON_ON_TIME, 0x00);


https://blog.csdn.net/tianlai1009/article/details/107173710?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522d5016a5486700307a67c49ef8efaa4be%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=d5016a5486700307a67c49ef8efaa4be&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-8-107173710-null-null.142^v102^pc_search_result_base6&utm_term=RK3566%20uboot%20%E9%95%BF%E6%8C%89%20%E5%BC%80%E6%9C%BA&spm=1018.2226.3001.4187
https://blog.csdn.net/tianlai1009/article/details/107173710

RK809搞一下长按PWR键重启

拿到的源码默认长按关机,短按开机,

不要长按关机,

只要长按重启

那么看一下规格书:

看一下驱动:

没有做这个寄存器的配置?i2cset测试一下:

i2cget -f -y 0 0x20 0xf7
0x86
默认是86,长按关机,

那自己加一下试试:

i2cset -f -y 0 0x20 0xf7 0xc6

测试成功。

自己加一下寄存器初始化:

/* power down configuration 0xf7 */
#define RK817_PWR_KEY_LONG_PRESS_MASK        BIT(6)
#define RK817_PWR_KEY_LONG_PRESS_H            BIT(6)
#define RK817_PWR_KEY_LONG_PRESS_L            (0)

static const struct rk808_reg_data rk817_pre_init_reg[] = {

    {RK817_RTC_CTRL_REG, RTC_STOP, RTC_STOP},
{RK817_GPIO_INT_CFG, RK817_INT_POL_MSK, RK817_INT_POL_L},
{RK817_SYS_CFG(1), RK817_HOTDIE_TEMP_MSK | RK817_TSD_TEMP_MSK,
RK817_HOTDIE_105 | RK817_TSD_140},
{RK817_PMIC_PWRON_KEY,RK817_PWR_KEY_LONG_PRESS_MASK,RK817_PWR_KEY_LONG_PRESS_H}

};

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

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

相关文章

20250713-`Seaborn.pairplot` 的使用注意事项

Seaborn.pairplot 的使用注意事项 sns.pairplot 是 Seaborn 中最常用、最强大的探索性数据分析&#xff08;EDA&#xff09;函数之一。 它在一个调用里就能同时展示&#xff1a; 任意两两变量间的 散点图&#xff08;观察关系、聚类、异常值&#xff09;对角线上每个变量的 单…

如何选择合适的AI论文写作工具?七个AI英文论文写作网站

在写作英文论文时&#xff0c;许多人往往会遇到写作思路卡壳、语言不流畅、重复率过高等问题。幸运的是&#xff0c;AI论文写作工具的出现&#xff0c;极大地提升了写作效率和质量。这些工具不仅可以帮你快速生成内容、扩展论点&#xff0c;还可以优化语言&#xff0c;帮助你顺…

【保姆级喂饭教程】idea中安装Conventional Commit插件

目录前言一、安装二、测试前言 之前了解到了Conventional Commit规范&#xff0c;idea中好像没什么钩子工具&#xff0c;测试一下Conventional Commit插件吧 一、安装 点击file-settings 点击plugins插件&#xff0c;搜索Conventional Commit&#xff0c;点击install安装&…

# 电脑每次重启都自动启动惠普安装程序,怎么取消?

电脑每次重启都自动启动惠普安装程序&#xff0c;怎么取消&#xff1f; 一、通过任务管理器禁用&#xff1a; 1&#xff09;右键点击任务栏上的空白区域&#xff0c;选择 “任务管理器”。 2&#xff09;在任务管理器窗口中&#xff0c;点击顶部菜单栏上的 “启动” 选项卡。 3…

QT遇到过的样式记录

此帖主要记录平常工程里遇到的qt样式 窗口无边框 原始文档 void QWidget::setWindowFlag(Qt::WindowType flag, bool on true) Sets the window flag flag on this widget if on is true; otherwise clears the flag. This function was introduced in Qt 5.9. See also se…

软件设计师中级概念题

软件过程模型 1. 瀑布模型&#xff1a; 五个阶段&#xff1a;需求分析、设计、编码、测试、运行与维护。 为软件的开发和维护提供了一种有效的管理模式&#xff0c;它是以文档作为驱动、合适于软件需求很明确的软件项目模型。瀑布模型假设&#xff0c;一个待开发的系统需求是完…

Elasticsearch安装、入门、基础API操作、全文检索、精准查询、地理查询、复合查询、排序、分页、高亮、数据聚合、自动补全、数据同步、ES集群

学习资料&#xff1a; 通过网盘分享的文件&#xff1a;Elasticsearch 链接: https://pan.baidu.com/s/18BxA0BH0G–jwy95uFmFZQ 提取码: yyds 初识ES正向索引倒排索引ES与MySQL 概念对比安装ES操作索引库mapping属性创建索引库{"mappings": {"properties":…

教程:如何查看浏览器扩展程序的源码

在学习前端、自动化或扩展开发时&#xff0c;我们常常会想研究某个浏览器插件的实现逻辑。即使扩展没有公开源码&#xff0c;只要我们本地安装了它&#xff0c;就可以查看它的完整源代码进行学习。✅ 方法一&#xff1a;从浏览器插件目录提取源码 第一步&#xff1a;打开扩展程…

虚拟储能与分布式光伏协同优化:新型电力系统的灵活性解决方案

安科瑞顾强摘要&#xff1a; 在全球能源结构向低碳化、智能化加速转型的背景下&#xff0c;分布式光伏的大规模接入为电力系统带来机遇的同时&#xff0c;也因其波动性与间歇性带来了运行挑战。本文聚焦于虚拟储能系统&#xff08;Virtual Energy Storage System, VESS&#xf…

java valueOf方法

一,什么是valueOf方法?valueOf是java包装类(比如Long,Integer等)中提供的一个静态方法二,valueOf的主要作用是什么主要作用是将其他类型的数据转换为当前包装类的对象三,代码实例:咱们以Long.valueOf为例,1,他可以接受一个long类型的数值,返回对应的Long对象(把基本类型long包…

工业平板电脑 vs 消费级平板:从防护等级到使用寿命全方面对比

平板电脑已经广泛应用于各个行业。但你知道吗&#xff1f;市面上常见的“平板”其实可以分为两大类&#xff1a;工业平板电脑和消费级平板电脑。虽然它们看起来都是“平板”&#xff0c;但用途、性能和适用场景却大不相同。今天&#xff0c;我们就来聊聊这两者的区别&#xff0…

MySQL技术笔记-索引+慢 SQL+锁 全链路优化实战

目录 前言 MySQL索引 一、概述 二、索引分类 &#xff08;一&#xff09;按功能特性分类 &#xff08;二&#xff09;按存储方式分类 &#xff08;三&#xff09;按数据结构分类 &#xff08;四&#xff09;按索引字段数量分类 三、索引的优缺点 &#xff08;一&…

S7-1200 与 S7-300 PNS7-400 PN UDP 通信 TIA 相同项目

7-1200 与 S7-300 PN/S7-400 PN UDP 通信 TIA 相同项目S7-1200 与 S7-300 PN 口之间的以太网通信可以通过 UDP 协议来实现&#xff0c;使用的通信指令是在双方 CPU 调用通信-开放式用户通信TSEND_C&#xff0c;TRCV_C&#xff08;1200支持&#xff0c;300不支持&#xff09;或T…

java进阶(二)+学习笔记

面向对象设计原则1. 面向对象概念面向对象 是一种编程思想&#xff0c;面向过程是关注实现的步骤&#xff0c;每个步骤定义一个函数&#xff0c;调用函数执行即可。面向对象关注的是谁(对象)来执行&#xff0c; 把具有相同属性和行为的一类事物(对象)进行抽象成类&#…

[附源码+数据库+毕业论]基于Spring Boot+mysql+vue结合内容推荐算法的学生咨询系统

摘要 随着互联网的普及&#xff0c;学生在学习和生活中面临着海量信息&#xff0c;如何高效获取有价值的内容成为亟待解决的问题。本文基于 Spring Boot 框架&#xff0c;结合内容推荐算法&#xff0c;设计并实现了一个学生咨询系统。系统采用 Spring Boot MyBatis MySQL Vu…

DeepSeek 微调实践:DeepSeek-R1 大模型基于 MS-Swift 框架部署 / 推理 / 微调实践大全

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 GPT多模态大模型与AI Agent智能体书籍本章配套视频课程【陈敬雷】 文…

python基础知识pip配置pip.conf文件

pip.conf一、 INI格式二、 级别三、 文件位置四、 加载顺序五、 常用一、 INI格式 配置文件可以更改pip命令行选项的默认值&#xff0c;这个文件是使用INI格式编写的。 INI格式 主要包含三个内容&#xff1a;1.节section 2.键值对 3.注释 [section1] key1 value1 \\注释 key2…

深入理解 Java JVM

文章目录&#x1f4d5;1. JVM简介&#x1f4d5;2. JVM运行流程&#x1f4d5;3. JVM运行时数据区&#x1f4d5;4. JVM类加载✏️4.1 类加载过程✏️4.2 双亲委派模型✏️4.3 破坏双亲委派模型&#x1f4d5;5. JVM垃圾回收机制&#xff08;GC机制&#xff09;✏️5.1 判断死亡对象…

Linux内核高效之道:Slab分配器与task_struct缓存管理

前言 在Linux内核中&#xff0c;进程创建与销毁是最频繁的操作之一。想象一下&#xff1a;当系统每秒需要处理成百上千次fork()和exit()调用时&#xff0c;如何保证task_struct&#xff08;进程描述符&#xff09;的分配与释放既快速又不产生内存碎片&#xff1f;这就是Slab分配…

双esp8266-01之间UDP透传传输,自定义协议

使用AT模式的透传&#xff0c;串口打印的数据包含pd1,4,数据打印的数据不是直接将数据打印出来&#xff0c;包含了pd1,4,特殊字符&#xff0c;针对想要直接开机直接透传&#xff0c;打印数据且按照自主协议帧头的功能进行开发。1.server程序&#xff1a;/*************SERVER**…