20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片

20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片
2025/7/31 17:48


缘起:本文前置条件:已经解决FT8206和PRO-RK3566的硬件连接。
通过i2cdect可以扫描到i2c从机地址:0x38。【8位地址为0x70】


缘起:本文只分析I2C的挂载问题。

1、敦泰FT的代理商说所有的FT的驱动程序都是兼容的,不同的就是不是对应的驱动就不能升级upgrade了。
反正我也不需要升级。直接使用以前调通的FT5X06的驱动程序了。
Y:\Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c
原厂的edt-ft5x06.c不能用的。我用的是 飞凌魔改过的版本。
DTS也直接拷贝的飞凌的。

2、荣品的PRO-RK3566开发板的Android13的坐标原点在左上角。
但是TP得坐标原点是根据固件不同而异。
你需要在报点的地方进行处理,或者要求供应商/屏厂修改适合你的项目的固件并预烧录进去了。


如果你的TP/LCD屏的硬件接线正确,在Android13下使用i2cdetect扫描I2C1。
很容易得到0x38有设备,但是没有挂载驱动程序。

1、FT8206。使用 FT5X06的驱动程序。
2、I2C可以读了。请问 这些寄存器的值对不?
3、现在是 TP触摸没有反应?用示波器 点IRQ中断引脚吗?TP坏了?


我想在 开关 RK3566/RK3588+Android13下的内核。

rootroot@rootroot-X99-Turbo:~/Android13.0/kernel-5.10$ make ARCH=arm64 menuconfig
请问是这样操作吗?有点不对劲


没有问题,具体内核配置文件对应的是这个


https://doc.rpdzkj.cn/#/zh_cn/%E7%91%9E%E8%8A%AF%E5%BE%AE%E7%B3%BB%E5%88%97/rk3566-rk3568/6.Android13%E5%BC%80%E5%8F%91?id=%e5%b8%b8%e7%94%a8%e6%ba%90%e7%a0%81%e8%b7%af%e5%be%84
Android开发

常用源码路径
常用配置项    源码路径
RD-RK3588 设备树    kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts
UBOOT默认配置文件    u-boot/arch/arm/dts/rk3588-u-boot.dtsi
内核默认配置文件    kernel-5.10/arch/arm64/configs/rockchip_defconfig
Uboot Logo图片    kernel-5.10/logo.bmp
Kernel Logo图片    kernel-5.10/logo_kernel.bmp
parameter分区表    device/rockchip/rk3588/parameter.txt
device板级配置文件    device/rockchip/rk3588/rp_boards/


1、在内核中打开FT5X06的驱动程序。
Z:\Android13.0\kernel-5.10\arch\arm64\configs\rockchip_defconfig

CONFIG_TABLET_USB_KBTAB=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_EDT_FT5X06=y
CONFIG_TOUCHSCREEN_GSL3673=y
CONFIG_TOUCHSCREEN_GSL3673_800X1280=y
CONFIG_TOUCHSCREEN_GSLX680_PAD=y
CONFIG_TOUCHSCREEN_GT1X=y
CONFIG_TOUCHSCREEN_ILI210X=y
CONFIG_TOUCHSCREEN_ELAN5515=y
CONFIG_ROCKCHIP_REMOTECTL=y


如果不知道格式如何写,去.config里面找!
Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\.config
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set

CONFIG_TOUCHSCREEN_EDT_FT5X06=y


# CONFIG_TABLET_USB_PEGASUS is not set
# CONFIG_TABLET_SERIAL_WACOM4 is not set
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_PROPERTIES=y
# CONFIG_TOUCHSCREEN_ADS7846 is not set
# CONFIG_TOUCHSCREEN_AD7877 is not set
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_ADC is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_BU21029 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
# CONFIG_TOUCHSCREEN_DYNAPRO is not set
# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_EGALAX is not set
# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
# CONFIG_TOUCHSCREEN_EXC3000 is not set
# CONFIG_TOUCHSCREEN_FT5436 is not set
CONFIG_TOUCHSCREEN_FT5726=y
# CONFIG_TOUCHSCREEN_FT8206 is not set
# CONFIG_TOUCHSCREEN_FTS is not set

# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
CONFIG_TOUCHSCREEN_GSL3673=y
CONFIG_TOUCHSCREEN_GSL3673_800X1280=y
CONFIG_TOUCHSCREEN_GSLX680_PAD=y
CONFIG_TOUCHSCREEN_GT1X=y
# CONFIG_TOUCHSCREEN_HIDEEP is not set
CONFIG_TOUCHSCREEN_ILI210X=y
# CONFIG_TOUCHSCREEN_S6SY761 is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_EKTF2127 is not set
# CONFIG_TOUCHSCREEN_ELAN is not set
CONFIG_TOUCHSCREEN_ELAN5515=y
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MCS5000 is not set
# CONFIG_TOUCHSCREEN_MMS114 is not set
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_MK712 is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
CONFIG_TOUCHSCREEN_EDT_FT5X06=y
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_PIXCIR is not set
# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
# CONFIG_TOUCHSCREEN_TSC2004 is not set
# CONFIG_TOUCHSCREEN_TSC2005 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_RM_TS is not set
# CONFIG_TOUCHSCREEN_SILEAD is not set
# CONFIG_TOUCHSCREEN_SIS_I2C is not set
# CONFIG_TOUCHSCREEN_ST1232 is not set
# CONFIG_TOUCHSCREEN_STMFTS is not set
# CONFIG_TOUCHSCREEN_SUR40 is not set
# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
# CONFIG_TOUCHSCREEN_SX8654 is not set
# CONFIG_TOUCHSCREEN_TPS6507X is not set
# CONFIG_TOUCHSCREEN_ZET6223 is not set
# CONFIG_TOUCHSCREEN_ZFORCE is not set
# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_ZINITIX is not set
CONFIG_TOUCHSCREEN_GT9XX=y
CONFIG_ROCKCHIP_REMOTECTL=y
CONFIG_ROCKCHIP_REMOTECTL_PWM=y


2、驱动修改部分【直接使用飞凌魔改版本!^_】
Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\Kconfig
config TOUCHSCREEN_EDT_FT5X06
tristate "EDT FocalTech FT5x06 I2C Touchscreen support"
depends on I2C
help
Say Y here if you have an EDT "Polytouch" touchscreen based
on the FocalTech FT5x06 family of controllers connected to
your system.

      If unsure, say N.

      To compile this driver as a module, choose M here: the
module will be called edt-ft5x06.


Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\Makefile
obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06)    += edt-ft5x06.o


Z:\Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c


我看你们的 FT5X06的驱动程序 是修过的!
?要 这样改?
这样改 可以实现什么功能?


看上去好像是原厂的没有申请gpio中断号,所以我们添上去的gpio中断注册


Z:\14TB\versions\OK3588-android12-R5source\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c
Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\drivers\input\touchscreen\edt-ft5x06.c

#include <asm/unaligned.h>
#include <linux/pinctrl/consumer.h>


struct edt_ft5x06_ts_data {
struct i2c_client *client;
struct input_dev *input;
struct touchscreen_properties prop;
u16 num_x;
u16 num_y;
struct regulator *vcc;

    struct gpio_desc *reset_gpio;
struct gpio_desc *wake_gpio;
    struct gpio_desc *int_gpio;

#if defined(CONFIG_DEBUG_FS)
struct dentry *debug_dir;
u8 *raw_buffer;
size_t raw_bufsize;
#endif

    struct mutex mutex;
bool factory_mode;
enum edt_pmode suspend_mode;
int threshold;
int gain;
int offset;
int offset_x;
int offset_y;
int report_rate;
int max_support_points;

    char name[EDT_NAME_LEN];

    struct edt_reg_addr reg_addr;
enum edt_ver version;

    struct pinctrl            *pinctrl;
struct pinctrl_state    *pins_default;

};


static int edt_ft5x06_ts_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
const struct edt_i2c_chip_data *chip_data;
struct edt_ft5x06_ts_data *tsdata;
u8 buf[2] = { 0xfc, 0x00 };
struct input_dev *input;
unsigned long irq_flags;
int error;
char fw_version[EDT_NAME_LEN];

    dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n");

    u8 rdbuf[EDT_NAME_LEN];
memset(rdbuf, 0, sizeof(rdbuf));

    tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL);
if (!tsdata) {
dev_err(&client->dev, "failed to allocate driver data.\n");
return -ENOMEM;
}

    error = edt_ft5x06_ts_readwrite(client, 1, "\xBB",
EDT_NAME_LEN - 1, rdbuf);
if (error)
return error;

    tsdata->pinctrl = devm_pinctrl_get(&client->dev);
if (!IS_ERR(tsdata->pinctrl)) {
tsdata->pins_default = pinctrl_lookup_state(tsdata->pinctrl, "ft5x06_defaults");
if (IS_ERR(tsdata->pins_default))
dev_err(&client->dev, "could not get default pinstate\n");

        if (!IS_ERR_OR_NULL(tsdata->pins_default)) {
error = pinctrl_select_state(tsdata->pinctrl,
tsdata->pins_default);
if (error < 0)
dev_err(&client->dev, "could not set pins\n");
}
}

    chip_data = device_get_match_data(&client->dev);
if (!chip_data)
chip_data = (const struct edt_i2c_chip_data *)id->driver_data;
if (!chip_data || !chip_data->max_support_points) {
dev_err(&client->dev, "invalid or missing chip data\n");
return -EINVAL;
}


touchscreen_parse_properties(input, true, &tsdata->prop);

    error = input_mt_init_slots(input, tsdata->max_support_points,
INPUT_MT_DIRECT);
if (error) {
dev_err(&client->dev, "Unable to init MT slots.\n");
return error;
}

    i2c_set_clientdata(client, tsdata);

    irq_flags = irq_get_trigger_type(client->irq);
if (irq_flags == IRQF_TRIGGER_NONE)
irq_flags = IRQF_TRIGGER_FALLING;
irq_flags |= IRQF_ONESHOT;

    tsdata->int_gpio = devm_gpiod_get_optional(&client->dev, 
"irq", GPIOD_OUT_HIGH);
if(IS_ERR(tsdata->int_gpio)){
error = PTR_ERR(tsdata->int_gpio);
dev_err(&client->dev, "Failed to request int gpio %d\n", error);
} else {
client->irq = gpiod_to_irq(tsdata->int_gpio);
irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
}


error = devm_request_threaded_irq(&client->dev, client->irq,
NULL, edt_ft5x06_ts_isr, irq_flags,
client->name, tsdata);
if (error) {
dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
return error;
}

    error = devm_device_add_group(&client->dev, &edt_ft5x06_attr_group);
if (error)
return error;

    error = input_register_device(input);
if (error)
return error;

    edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev));

    dev_dbg(&client->dev,
"EDT FT5x06 initialized: IRQ %d, WAKE pin %d, Reset pin %d.\n",
client->irq,
tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1,
tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1);

    return 0;
}

static int edt_ft5x06_ts_remove(struct i2c_client *client)


3、DTS部分:【直接使用飞凌版本^_】
Z:\14TB\versions\OK3588-android12-R5source\kernel-5.10\arch\arm64\boot\dts\rockchip\OK3588-C-common.dtsi


&i2c2 {
status = "okay";

    extio: tca6424@23 {
compatible = "ti,tca6424";
reg = <0x23>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PA4 IRQ_TYPE_EDGE_FALLING>;
gpio-controller;
pinctrl-0 = <&extio_int_gpio>;
pinctrl-names = "default";
#gpio-cells = <2>;
status = "okay";
};

    ft5x06_dsi0: ft5x06@38 { //dsi0 tp
compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
reg = <0x38>;
pinctrl-names = "ft5x06_defaults";
pinctrl-0 = <&ft5x06_dsi1_gpio>;
//        interrupt-parent = <&gpio3>;
//        interrupts = <RK_PC0 IRQ_TYPE_EDGE_FALLING>;
irq-gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
touchscreen-size-x = <1024>;
touchscreen-size-y = <600>;
status = "okay";
};

    gt9xx_dsi0: gt9xx@14 {
compatible = "goodix,gt911";
reg = <0x14>;
pinctrl-names = "gt9xx_default";
pinctrl-0 = <&gt911_dsi1_gpio>;
//interrupt-parent = <&gpio3>;
//interrupts = <RK_PC0 IRQ_TYPE_EDGE_FALLING>;
irq-gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_HIGH>;
touchscreen-size-x = <1024>;
touchscreen-size-y = <600>;
is-mutex;
filter-reg = <0x38>;
bus-reg = <0x02>;
status = "okay";
};
};


&pinctrl {


lcd {
mipi0_enable_gpio: mipi0-enable-gpio {
rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
};
mipi1_enable_gpio: mipi1-enable-gpio {
rockchip,pins = <3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

    tp_int {
        ft5x06_dsi1_gpio:  ft5x06-dsi1-gpio {
rockchip,pins = <3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
};

        ft5x06_dsi2_gpio: ft5x06-dsi2-gpio {
rockchip,pins = <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
};


gt911_dsi1_gpio:gt911-dsi0-gpio {
rockchip,pins = <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>,
<3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
};

        gt911_dsi2_gpio:gt911-dsi1-gpio {
rockchip,pins = <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>,
<3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
};                    
};

    hdmirxdet {
hdmirx_det_gpio: hdmirx-det-gpio {
rockchip,pins = <1 RK_PD5 RK_FUNC_GPIO &pcfg_pull_up>;
};
};


};


Z:\14TB\versions\pro3566_Android13.0\kernel-5.10\arch\arm64\boot\dts\rockchip\rk356x\pro-rk3566-single-lcd-gpio.dtsi

&i2c1 {
gt9xx: goodix_ts@5d {
status = "disabled";
/***** tp pin ******/
pinctrl-names = "default";
pinctrl-0 = <&goodix_irq>;
goodix_rst_gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
goodix_irq_gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
};
gt1x: goodix_gt1x@5d {
status = "disabled";
/***** tp pin ******/
pinctrl-names = "default";
pinctrl-0 = <&goodix_irq>;
goodix,rst-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
goodix,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
};
};

&pinctrl {
lcd1 {
lcd_rst_gpio: lcd1-rst-gpio {
rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
    goodix {
goodix_irq: goodix-irq {
rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>;
};
};

};


最终效果图:
Z:\Android13.0\kernel-5.10\arch\arm64\boot\dts\rockchip\rk356x\pro-rk3566-single-lcd-gpio.dtsi

&edp_panel {
power-supply = <&vcc3v3_lcd0_n>;
backlight = <&backlight4>;
};

&i2c1 {
//    gt9xx: goodix_ts@5d {
//        status = "disabled";
//        /***** tp pin ******/
//            pinctrl-names = "default";
//            pinctrl-0 = <&goodix_irq>;
//        goodix_rst_gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
//        goodix_irq_gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
//    };
//    
//    gt1x: goodix_gt1x@5d {
//        status = "disabled";
//        /***** tp pin ******/
//                pinctrl-names = "default";
//                pinctrl-0 = <&goodix_irq>;
//                goodix,rst-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
//                goodix,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_FALLING>;
//    };

    ft5x06: ft5x06@38 { //dsi0 tp
compatible = "edt,edt-ft5406", "edt,edt-ft5x06";
reg = <0x38>;
pinctrl-names = "ft5x06_defaults";
pinctrl-0 = <&ft5x06_dsi1_gpio>;
//        interrupt-parent = <&gpio0>;
//        interrupts = <RK_PB5 IRQ_TYPE_EDGE_FALLING>;
//irq-gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
irq-gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>;
//reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <1200>;
touchscreen-size-y = <1920>;
//touchscreen-size-x = <1920>;
//touchscreen-size-y = <1200>;
status = "okay";
};

};

&pinctrl {
lcd1 {
lcd_rst_gpio: lcd1-rst-gpio {
rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

//    goodix {
//        goodix_irq: goodix-irq {
//            rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>;
//        };
//    };

    tp_int {
ft5x06_dsi1_gpio:  ft5x06-dsi1-gpio {
rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
};                    
};


};
/********************************************/

测试效果:

使用 如上测试APK。
1根手指正常。
2根手指正常
3根手指也正常
4根手指还是正常。

5根手指。测试APK上 异常了。不能画了。

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

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

相关文章

异常检测:算法分类及经典模型概览

第一部分&#xff1a;异常检测的核心概念 在深入算法细节之前&#xff0c;理解异常检测的“语境”至关重要。 1. 什么是异常检测&#xff1f; 异常检测&#xff08;Anomaly Detection 或 Outlier Detection&#xff09;旨在通过数据挖掘技术&#xff0c;识别出数据集中与大多数…

技术干货 | 矢网DTF测量技术:透视线缆、天线与波导内部缺陷的“射频X光”(二)

无线通信、雷达等领域中&#xff0c;射频组件与传输系统的性能至关重要&#xff0c;其内部微小损伤易导致信号问题甚至系统失效。传统测试无法精确定位故障点&#xff0c;排查困难。DTF测量&#xff0c;矢网赋予的“透视眼”&#xff01;它能穿透“黑箱”&#xff0c;精确定位线…

【[CSP-J 2022] 上升点列】

题目 [CSP-J 2022] 上升点列 题目描述 在一个二维平面内&#xff0c;给定 n 个整数点 (x i ,y i​ )&#xff0c;此外你还可以自由添加 k 个整数点。 你在自由添加 k 个点后&#xff0c;还需要从 nk 个点中选出若干个整数点并组成一个序列&#xff0c;使得序列中任意相邻两点间…

Kong API Gateway的十年进化史

一、技术基因的诞生&#xff08;2007-2015&#xff09; 2007年&#xff0c;三位意大利开发者Augusto Marietti、Marco Palladino和Michele Orru在博洛尼亚的一个小车库中创立了Mashape公司。 最初他们开发了一个名为Mashup的API聚合平台&#xff0c;试图通过整合第三方API为开发…

蓝牙设备配对:从机发现主机全过程

在蓝牙 paging 过程中&#xff0c;从设备&#xff08;Slave&#xff09;是通过特定的扫描机制和跳频方式来发现主设备发送的 ID 包的&#xff0c;具体过程如下&#xff1a;从设备处于特定扫描模式&#xff1a;从设备需要处于 Page Scan 模式&#xff0c;才能够接收主设备发送的…

聚观早报 | 三星获特斯拉AI芯片订单;小米16首发成安卓最强SOC;iPhone 17 Pro支持8倍光学变焦

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。整理丨肖羽7月29日消息三星获特斯拉AI芯片订单小米16首发成安卓最强SOCiPhone 17 Pro支持8倍光学变焦宁德时代滑板底盘公司启动首轮融…

Gemini Fullstack LangGraph Quickstart(DeepSeek+Tavily版本)

文章目录参考资料说明Gemini Fullstack LangGraph QuickstartDeepSeek Fullstack LangGraph Quickstart项目部署完整源码地址后端部署前端部署参考资料 DeepResearch应用开发实战网盘课件资料 说明 本文仅供学习和交流使用&#xff0c;感谢赋范社区相关老师的辛苦付出&#…

钢筋计数误差↓78%!陌讯多模态融合算法在建筑地产AI质检的落地实践

​摘要​​针对建筑地产行业钢筋验收场景的高误差痛点&#xff0c;本文解析陌讯视觉算法的多模态融合架构如何实现毫米级精度目标检测。实测显示&#xff1a;在Jetson Xavier NX边缘设备上&#xff0c;钢筋计数mAP0.5达​​92.4%​​&#xff0c;较基线模型提升28个百分点&…

负载均衡 LoadBalance

问题引入 我们一个服务可能会进行多机部署&#xff0c;也就说多台服务器组成的集群共同对外提供一致的服务&#xff0c;那么我们的微服务的代码就需要拷贝多份&#xff0c;部署到不同的机器上。 我们使用 IDEA 来开启多个相同的服务 这里以 product-service 为例&#xff1a;…

13. 若依框架中的 Sensitive 敏感字段过滤

若依框架中有Sensitive注解&#xff0c;但代码中并未使用&#xff0c;但该注解的实现还是比较值的学习的。该注解是一个运行时注解该注解只能应用在字段上JacksonAnnotationsInside 表示当使用Jackson序列化时&#xff0c;Jackson会自动识别该注解下的其他Jackson相关注解&…

git本地仓库,工作区和暂存区的知识

一 git工作原理 Git 的工作原理基于分布式版本控制&#xff0c;通过管理文件的不同版本状态&#xff0c;实现代码的追踪、协作和回溯。除了常见的工作区&#xff08;Working Directory&#xff09; 和暂存区&#xff08;Staging Area/Index&#xff09;&#xff0c;核心还包括本…

MPU6050模块

一&#xff1a;MPU6050简介输出一个随姿态变化而变化的电压&#xff0c;想要量化电压&#xff0c;就得使用ADC转化欧拉角偏航角&#xff08;Yaw&#xff09;&#xff1a;也叫航向角&#xff0c;通常是绕 z 轴旋转的角度&#xff0c;以 x 轴正向为起始边&#xff0c;旋转后 x 轴…

jvm的栈和堆

在 JVM 中&#xff0c;栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;是两种核心内存区域&#xff0c;用于存储不同类型的数据&#xff0c;它们的设计和存储规则有明确区分&#xff0c;主要体现在存储内容、生命周期和管理方式上&#xff1a;一、栈&#xf…

自动驾驶车辆的敏捷安全档案

简介近年来&#xff0c;在开发安全关键软件时&#xff0c;敏捷开发方法的使用日益增多。敏捷方法非常适合自动驾驶汽车软件的增量改进、运行设计域的逐步扩展以及新型智能路侧单元的开发。由于车辆和智能路侧单元的预期改进&#xff0c;未来几年将会有新的自动驾驶车辆试验。因…

【时时三省】(C语言基础)动态内存分配与它的指针变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省什么是内存的动态分配全局变量是分配在内存中的静态存储区的&#xff0c;非静态的局部变量&#xff08;包括形参&#xff09;是分配在内存中的动态存储区的&#xff0c;这个存储区是一个称为栈…

SpringMVC的核心架构与请求处理流程

Spring MVC 核心架构核心组件组件作用类比DispatcherServlet前端控制器&#xff0c;统一接收请求并协调各组件处理一个餐厅的前台HandlerMapping根据请求URL映射到对应的处理器&#xff08;Controller&#xff09;路由表HandlerAdapter执行处理器方法&#xff0c;处理参数绑定、…

css 不错的按钮动画

效果图wxml <view class"{{status?active:}}"><view class"up-top btn"><text>向上</text></view><view class"up-left btn"><text>向左</text></view><view class"up-center b…

若依框架RuoYi-Vue-Plus-5.X的启动,本地安装docker,再部署 Redis、PG数据库(智慧水务)SmartWaterServer

一、部署redis数据库拉取镜像 docker pull redis启动Redis容器docker run -d --name redis-server -p 6379:6379 -v redis-data:/data redis redis-server --requirepass 123redis版本二、部署PostgreSQL 数据库拉取镜像docker pull postgres:15 创建数据存储目录、建议将数据挂…

Idea 清除无用的引用类

在IntelliJ IDEA中&#xff0c;你可以通过以下方式将选中的代码设置为大写&#xff1a;1. 使用快捷键(推荐)Windows/Linux&#xff1a;Ctrl Shift UMac&#xff1a;Cmd Shift U操作步骤&#xff1a;选中文本按下快捷键&#xff0c;即可在大小写之间切换。2. 通过菜单操作选…

同个主机拉取不同权限仓库的方法

背景&#xff1a;因为某些神奇的原因&#xff0c;无法同时授权仓库权限给自己。 1.本地电脑只有权限访问web仓库地址&#xff0c;无权限访问backend仓库&#xff1b; 2.堡垒机服务器只有权限访问backend仓库&#xff0c;无权限访问web仓库地址。 web仓库地址 &#xff1a;codeu…