当前位置: 首页 > news >正文

基于RK3399 Android11适配OV13850 MIPI摄像头

目录

  • 1、原理图分析
  • 2、编写和配置设备树
  • 3、调试方法
  • 4、遇到的问题与解决
  • 5、补丁

1、原理图分析

在这里插入图片描述
  从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤MCLK使用的是GPIO3_B7 ⑥需要保证红色框框的供电电源正常。
  结合RK提供的文档,如下摄像头数据采集拓扑图所示,我们就可以开始编写配置设备树了,其实官方提供了很多类似的设备树配置给我们参考的。
摄像头数据采集拓扑

2、编写和配置设备树

①配置OV13850设备树节点Ⅰ
在这里插入图片描述
②配置OV13850设备树节点Ⅱ 提示:下图复用功能是<. RK_PB7 3 &pcfg_pull_one>;
在这里插入图片描述
③配置dphy
在这里插入图片描述
④配置isp
在这里插入图片描述

3、调试方法

①移植成功后,使用dmesg指令查看对应驱动的log
在这里插入图片描述
②驱动加载成功后,会有生成以下的摄像头设备节点
在这里插入图片描述
③RKISP 驱动如果加载成功,会有 video 及 media 设备存在于/dev/目录下。系统中可能存在 多个/dev/video 设备,通过/sys 可以查询到 RKISP 注册的 video 节点
在这里插入图片描述
④查看拓扑结构
 Ⅰ、通过media-ctl -p 查看rkisp1_selfpath 信息,可以知道打开哪些media设备
在这里插入图片描述
 Ⅱ、再通过media-ctl -p /dev/media0 查看已打开的media设备的拓扑,下图是截取了一部分信息
在这里插入图片描述
⑤查看摄像头支持哪几种图像流格式,截图省略
  指令:v4l2-ctl -d /dev/video0 --list-formats
⑥查看调试上层相关信息,截图省略
  指令:dumpsys media.camera
⑦抓图
  指令:v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=NV12 --stream-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1
在这里插入图片描述
在这里插入图片描述
  查看YUV图片可以使用该网站:在线查看 YUV 文件的免费在线工具 - ImageToStl
在这里插入图片描述

4、遇到的问题与解决

 ①问题1:相机权限问题:解决问题的链接
 ②问题2:没有获取到对应IQ文件,后面查看编译生成的文件,并没有将IQ文件拷贝过去,报错如下图所示
在这里插入图片描述
  解决方法:找到对应IQ目录上的.mk文件,在.mk文件中的PRODUCT_COPY_FILES节点下添加

$(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \

这条语句,这条语句作用是拷贝所有的IQ文件到/vendor/etc/camera/rkisp1/目录下。
 ③问题3:屏幕显示UI为0度横屏,而默认\hardware\rockchip\camera\etc\camera\camera3_profiles_rk3399.xml文件中配置的是传感器成像方向是90度,导致相机成像出现拉伸现象。
  解决方法:如下图所示。
在这里插入图片描述
 ④问题4:图像上下或者左右相反,可以通过修改OV13850寄存器完成上下或左右的翻转。
  解决方法:如下图介绍。
在这里插入图片描述
在这里插入图片描述

5、补丁

commit ea5601611a8fdff4b5efaf6db0f947bab7d0447d
Author: dengjiawen <1411471554@qq.com>
Date:   Thu Feb 22 10:52:28 2024 +0800适配MIPI摄像头OV13850diff --git a/frameworks/base/data/etc/privapp-permissions-platform.xml b/frameworks/base/data/etc/privapp-permissions-platform.xml
index 3b6abd50ee..0912e0ec6f 100644
--- a/frameworks/base/data/etc/privapp-permissions-platform.xml
+++ b/frameworks/base/data/etc/privapp-permissions-platform.xml
@@ -469,4 +469,8 @@ applications that come with the platform<privapp-permissions package="com.android.bips"><permission name="android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON"/></privapp-permissions>
+
+    <privapp-permissions package="com.android.camera2">
+               <permission name="android.permission.SYSTEM_CAMERA"/>
+      </privapp-permissions></permissions>
diff --git a/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml b/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
index 84dd8b5ed5..61ac244250 100755
--- a/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
+++ b/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
@@ -251,7 +251,7 @@<!-- ******************PSL specific section end **************************************************************--></Profiles>
-  <Profiles cameraId="0" name="ov13850" moduleId="m00">
+  <Profiles cameraId="0" name="ov13850" moduleId="m01"><Supported_hardware><hwType value="SUPPORTED_HW_RKISP1"/></Supported_hardware>
@@ -291,7 +291,7 @@<lens.info.hyperfocalDistance value="0.0"/> <!-- HAL may override this value from CMC for RAW sensors --><lens.info.minimumFocusDistance value="0.1"/> <!-- HAL may override this value from CMC for RAW sensors --><!-- Lens -->
-            <lens.facing value="BACK"/>
+            <lens.facing value="FRONT"/><!-- Request --><request.maxNumOutputStreams value="1,2,1"/><request.pipelineMaxDepth value="4"/>
@@ -463,7 +463,7 @@<sensor.baseGainFactor value="0,1"/> <!-- HAL may override this value from CMC for RAW sensors --><sensor.blackLevelPattern value="0,0,0,0"/><sensor.maxAnalogSensitivity value="2400"/> <!-- HAL may override this value from CMC for RAW sensors -->
-            <sensor.orientation value="90"/>
+            <sensor.orientation value="0"/>	<!-- 摄像头默认成像方向改为0, 这样和默认横屏0°才一致,成像才不会拉伸 --><sensor.profileHueSatMapDimensions value="0,0,0"/><sensor.availableTestPatternModes value="OFF,COLOR_BARS"/><!-- Info -->
diff --git a/hardware/rockchip/camera/etc/camera_etc.mk b/hardware/rockchip/camera/etc/camera_etc.mk
index ee01d12646..30328325bd 100755
--- a/hardware/rockchip/camera/etc/camera_etc.mk
+++ b/hardware/rockchip/camera/etc/camera_etc.mk
@@ -9,11 +9,13 @@ ifeq ($(filter box atv vr stbvr, $(strip $(TARGET_BOARD_PLATFORM_PRODUCT))), )ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \>= 26)))PRODUCT_COPY_FILES += \$(CUR_PATH)/camera/camera3_profiles_$(TARGET_BOARD_PLATFORM).xml:$(TARGET_COPY_OUT_VENDOR)/etc/camera/camera3_profiles.xml \
+	$(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \#$(call find-copy-subdir-files,*,$(CUR_PATH)/firmware,$(TARGET_COPY_OUT_VENDOR)/firmware) \#$(call find-copy-subdir-files,*,$(CUR_PATH)/camera,$(TARGET_COPY_OUT_VENDOR)/etc/camera) elsePRODUCT_COPY_FILES += \$(CUR_PATH)/camera/camera3_profiles_$(TARGET_BOARD_PLATFORM).xml:$(TARGET_COPY_OUT_SYSTEM)/etc/camera/camera3_profiles.xml \
+	$(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \$(call find-copy-subdir-files,*,$(CUR_PATH)/firmware,$(TARGET_COPY_OUT_SYSTEM)/etc/firmware) \$(call find-copy-subdir-files,*,$(CUR_PATH)/camera,$(TARGET_COPY_OUT_SYSTEM)/etc/camera) \$(call find-copy-subdir-files,*,$(CUR_PATH)/tools,$(TARGET_COPY_OUT_SYSTEM)/bin)
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
index 450c677864..9062188ed2 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
@@ -335,7 +335,7 @@cif_clkout: cif-clkout {rockchip,pins =/*cif_clkout*/
-				<2 RK_PB3 3 &pcfg_pull_none>;
+				<3 RK_PB7 3 &pcfg_pull_none>;};isp_dvp_d0d7: isp-dvp-d0d7 {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
index dd7d5f8952..d697023024 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
@@ -303,26 +303,6 @@};};-&i2c4 {
-	status = "disabled";
-	i2c-scl-rising-time-ns = <600>;
-	i2c-scl-falling-time-ns = <20>;
-
-	mpu6500@68 {
-		status = "disabled";
-		compatible = "invensense,mpu6500";
-		reg = <0x68>;
-		irq-gpio = <&gpio1 22 IRQ_TYPE_EDGE_RISING>;
-		mpu-int_config = <0x10>;
-		mpu-level_shifter = <0>;
-		mpu-orientation = <0 1 0 1 0 0 0 0 1>;
-		orientation-x= <1>;
-		orientation-y= <0>;
-		orientation-z= <0>;
-		mpu-debug = <1>;
-	};
-};
-&i2c7 {status = "okay";rtc@51 {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
index 83b7560801..da84220e47 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
@@ -50,7 +50,7 @@vcc_lcd: vcc-lcd {compatible = "regulator-fixed";regulator-name = "vcc_lcd";
-		gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>;
+		//gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>;startup-delay-us = <20000>;enable-active-high;regulator-min-microvolt = <3300000>;
@@ -423,15 +423,15 @@&isp1_mmu {
-	status = "disabled";
+	status = "okay";    // isp 驱动使用了 iommu,所以 isp iommu 也需要打开};
@@ -451,16 +451,45 @@&mipi_dphy_tx1rx1 {
-	status = "disabled";
+	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>;	// sensor 端的 port 名
+				data-lanes = <1 2 3 4>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			dphy_tx1rx1_out: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&isp1_mipi_in>;
+			};
+		};
+	};};&vopb {
@@ -484,19 +513,31 @@&rkisp1_1 {
-	status = "disabled";
+	status = "okay";
+
+	port {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		isp1_mipi_in: endpoint@0 {
+			reg = <0>;
+			remote-endpoint = <&dphy_tx1rx1_out>;   // mipi dphy 端的 port 名
+		};
+	};};&pinctrl {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
index 5b36e3c56d..ee56830ab5 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
@@ -555,7 +555,7 @@};&i2c4 {
-	status = "disabled";
+	status = "okay";i2c-scl-rising-time-ns = <475>;i2c-scl-falling-time-ns = <26>;@@ -568,6 +568,33 @@vbus-5v-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;status = "disabled";};
+
+	ov13850: ov13850@10 {
+		compatible = "ovti,ov13850";
+		status = "okay";
+		reg = <0x10>;
+		clocks = <&cru SCLK_CIF_OUT>;
+		clock-names = "xvclk";
+
+		/* conflict with csi-ctl-gpios */
+		reset-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
+		pwdn-gpios = <&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "rockchip,camera_default";
+		pinctrl-0 = <&cif_clkout>;	// pinctl 设置
+
+		rockchip,camera-module-index = <1>;	// 模组编号,该编号不要重复,因为xml文件中的moduleId="m01",所有设置1
+		rockchip,camera-module-facing = "front";	// 模组朝向,有"back"和"front"
+		rockchip,camera-module-name = "CMK-CT0116";	// 模组名
+		rockchip,camera-module-lens-name = "Largan-50013A1";	// lens 名
+		// 模组名和 lens 名被用来和 IQ xml 文件做匹配,使用的是hardware\rockchip\camera\etc\camera\rkisp1\ov13850_CMK-CT0116_Largan-50013A1.xml文件
+		//lens-focus = <&vm149c>; // vcm 驱动设置,支持 AF 时需要有这个设置
+		port {
+			ucam_out0: endpoint {
+				remote-endpoint = <&mipi_in_ucam0>;	// mipi dphy 端的 port 名
+				data-lanes = <1 2 3 4>;	// mipi lane 数
+			};
+		};
+	};};

相关文章:

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出&#xff0c;我们需要关心的&#xff0c;①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…...

学生个性化成长平台搭建随笔记

1.Vue的自定义指令 在 Vue.js 中&#xff0c;我们可以通过 Vue.directive() 方法来定义自定义指令。具体来说&#xff0c;我们需要传递两个参数&#xff1a; 指令名称&#xff1a;表示我们要定义的指令名称&#xff0c;可以是一个字符串值&#xff0c;例如&#xff1a;has-rol…...

XTuner InternLM-Chat 个人小助手认知微调实践

要解决的问题&#xff1a; 如何让模型知道自己做什么&#xff0c;是什么样身份。是谁创建了他&#xff01;&#xff01;&#xff01; 概述 目标&#xff1a;通过微调&#xff0c;帮助模型认清了解对自己身份弟位 方式&#xff1a;使用XTuner进行微调 微调前&#xff08;回答…...

编程笔记 Golang基础 025 列表

编程笔记 Golang基础 025 列表 一、列表的功能二、示例程序三、注意事项 在 Go 语言中&#xff0c;列表是一种数据结构&#xff0c;用于存储有序的元素集合&#xff0c;允许高效地进行插入和删除操作。Go 标准库中的 container/list 包提供了一个内置的双链表实现&#xff0c;它…...

Rollup + Ts

Rollup Ts RollupTs demo 一、文件配置 | - src | | - utils | | | - .ts | | - .babelrc | | - main.js | | - style.css | - package.json | - rollup.config.js | - tsconfig.json二、插件下载 rollup // rollup 基本的包 typescript // ts 包 rollup/plug…...

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板&#xff0c;适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题&#xff0c;适合用于搭建教育培训公司官方…...

【数据分享】2011-2023年我国地级市逐月二手房房价数据(Excel/Shp格式)

房价是一个城市发展程度的重要体现&#xff0c;一个城市的房价越高通常代表这个城市越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01; 本次我们为大家带来的是2011-2023年我国地级市的逐月二手…...

鸿蒙会成为安卓的终结者吗?

随着近期鸿蒙OS系统推送测试版的时间确定&#xff0c;关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统&#xff0c;鸿蒙给人的第一印象是具有颠覆性。 早在几年前&#xff0c;业内就开始流传鸿蒙可能会代替Android的传言。毕竟&#xff0c;Android作为开源系统&…...

Sora横空出世!AI将如何撬动未来?

近日&#xff0c;OpenAI 发布首个视频生成“Sora”模型&#xff0c;该模型通过接收文字指令&#xff0c;即可生成60秒的短视频。 而在2022年末&#xff0c;同样是OpenAI发布的AI语言模型ChatGPT&#xff0c;简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…...

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google C…...

XGB-11:随机森林

XGBoost通常用于训练梯度提升决策树和其他梯度提升模型。随机森林使用与梯度提升决策树相同的模型表示和推断&#xff0c;但使用不同的训练算法。可以使用XGBoost来训练独立的随机森林&#xff0c;或者将随机森林作为梯度提升的基模型。这里我们专注于训练独立的随机森林。 XG…...

超平面介绍

超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中&#xff0c;一条直线是一维的&#xff0c;它把平面分成了两部分&#xff1b;三维空间中&#xff0c;一个平面是二维的&#xff0c;它把空间分成了两部分。(2…...

【苍穹外卖】一些开发总结

1、DTO、VO的区别 DTO:如果前端返回的实体类和对应的实体类比较较大差别 使用DTO来封装数据 后面在使用 BeanUtils.copyProperties() 将熟悉复制到对应的实体类中 VO:主要用于展示数据,例如在控制器层和视图层之间。它通常包含一些与显示相关的属性,如标题、描述等。 2…...

Python 3 中,`asynchat`异步通信

在 Python 3 中&#xff0c;asynchat 是基于 asyncore 的一个高层抽象模块&#xff0c;用于处理异步通信协议。它提供了一种简单的方式来创建自定义的异步通信协议&#xff0c;并处理通信中的错误和异常。 asynchat 模块主要作用是将网络数据流分割成消息或者数据包&#xff0…...

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数&#xff0c;一般在 main函数的无限循环中调用&#xff0c;主要功能是为 LwIP各个模块提供…...

Oracle EBS FA折旧回滚的分录追溯

FA模块向子分类账和总账追溯分为两部分&#xff1a;事务表和折旧&#xff0c;但是FA相关表做其实关联计划外折旧的分录会被遗漏的原因&#xff1a; 如果已经当月折旧&#xff0c;运行完成折旧后&#xff0c;又进行了计划外折旧&#xff0c;因为计划折旧时又要区分【是否进行当月…...

sql注入 [极客大挑战 2019]FinalSQL1

打开题目 点击1到5号的结果 1号 2号 3号 4号 5号 这里直接令传入的id6 传入id1^1^1 逻辑符号|会被检测到&#xff0c;而&感觉成了注释符&#xff0c;&之后的内容都被替换掉了。 传入id1|1 直接盲注比较慢&#xff0c;还需要利用二分法来编写脚本 这里利用到大佬的脚…...

持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍

引言&#xff1a;上一期我们部署好了gitlab极狐网页版&#xff0c;今天我们介绍一下GitLabCI / CD 目录 一、为什么要 CI / CD 方法 1、持续集成 2、持续交付 3、持续部署 二、GitLab CI / CD简介 三、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 …...

[Java 项目亮点] 三层限流设计

思路来源&#xff1a;bilibili 河北王校长 文章目录 面试官可能会问你能详细介绍一下Nginx的http_limit_req_module模块吗&#xff1f;你能解释一下如何在Nginx中配置http_limit_req_module模块吗&#xff1f;你知道如何调整Nginx的http_limit_req_module模块以适应不同的业务需…...

GPT-SoVITS 快速声音克隆使用案例:webui、api接口

参考: https://github.com/RVC-Boss/GPT-SoVITS 环境: Python 3.10 PyTorch 2.1.2, CUDA 12.0 安装包: 1、使用: 1)下载项目 git clone https://github.com/RVC-Boss/GPT-SoVITS.git2)下载预训练模型 https://huggingface.co/lj1995/GPT-SoVITS 下载模型文件放到GPT…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...