这篇文章我们介绍一下在安卓9、10、11的版本上,rk平台的hdmi-in功能是如何实现的,下篇文章我们再介绍安卓12之后的版本有了什么变化。希望对在rk平台调试hdmi-in功能的朋友有一些帮助。

目录

(1)概述

(2)基本功能流程实现原理

1.系统功能框图

2.系统功能流程

2.1 APK工作流程

2.2 热拔插

2.3 切换分辨率

(3)功能配置说明

1.驱动代码与配置

1.1 驱动代码

1.2 config配置

2.DTS配置

2.1 设备配置

2.2 图像链路配置

2.2.1 RK3399

2.2.2 RK3568

3.camera xml注册设备

3.1 设备名称与ID

3.2 分辨率配置

3.3 SOC模式

3.4 旋转角配置

4.APK适配

4.1 获取APK

4.2 APK 源码适配

5.EDID配置

(4)调试方法

1.查看设备是否注册camera

2.查看拓扑结构

3.v4l2抓取数据流

4.v4l2抓图

5.不同芯片平台接收能力

6.配置使用ISP CMA内存

7.配置RK3399 ISP超频

(5)总结

(1)概述

安卓9/10/11等版本一般对应的都是rk比较旧的主控芯片,例如rk3399、rk3568/6等等,这里呢,我们又可以分为两类,一类是rk3399等较久的主控,一类是RK3566/8两个平台。rk3399之类的主控芯片没有VICAP的图像模块,都是通过ISP接收HDMI-IN的图像数据,RK3566/68的平台有VICAP(RKCIF)模块,也有RKISP模块,可以两种方式实现。

在RK的主控芯片中只有RK3588拥有独立的HDMIRX模块,其他主控芯片都没有HDMI-RX模块,想要实现HDMI-IN 的功能只能通过外挂转接芯片的方式实现。比较常用的转接芯片有RK628、LT6911系列等等,这篇文章我们就介绍一下这种方式的实现以及调试指南

(2)基本功能流程实现原理

1.系统功能框图

系统框图如下图所示,RK628D作为类camera设备使用,基于V4L2框架实现相关驱动,HDMI信号源通过RK628的HDMIRX接口输入,经过RK628的内部模块处理将接收的图像数据处理为MIPI-CSI信号作为数据输出,同时图像格式也统一转换为YUV422格式输出,经MIPI lane接入到主控的MIPI接口,由主控接收图像并对图像进行处理显示,从而实现HDMI-IN的功能。

2.系统功能流程

HDMI IN video 部分的软件实现方案是将 RK628 模拟成一个 MIPI SOC camera 设备,通过 camera 框架接 收video 数据并在 APK 进行显示,同时基于 HDMI IN 的应用场景需要,增加 HDMI IN 热拔插和 HDMI IN 分辨率自适应支持。
2.1 APK工作流程

APK预览工作流程如下图所示:

2.2 热拔插

热拔插中断处理流程如下图所示

2.3 切换分辨率

切换分辨率流程如下图所示:

(3)功能配置说明

1.驱动代码与配置

1.1 驱动代码

转接芯片驱动代码如下:

drivers/media/i2c/rk628/
drivers/media/i2c/lt6911uxe.c
drivers/media/i2c/lt6911uxc.c
drivers/media/i2c/tc35874x.c
1.2 config配置

kernel的config配置如下:

CONFIG_VIDEO_LT6911UXC=y
CONFIG_VIDEO_LT6911UXE=y
CONFIG_VIDEO_RK628_CSI=y
CONFIG_VIDEO_TC35874X=y

2.DTS配置

以下介绍调试的时候的dts配置。主要有设备配置,链路配置,链路配置中,由于rk3566/68平台有两种场景,因此,我们分别介绍两种场景的配置。

2.1 设备配置

转接芯片一般都是i2c设备,需要配置到i2c总线下,参考如下配置:

&i2c5 {status = "okay";rk628_csi: rk628_csi@50 {reg = <0x50>;compatible = "rockchip,rk628-csi-v4l2";status = "okay";power-domains = <&power RK3588_PD_VI>;pinctrl-names = "default";pinctrl-0 = <&rk628_pin>;interrupt-parent = <&gpio2>;interrupts = <RK_PC4 IRQ_TYPE_EDGE_RISING>;enable-gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;reset-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;plugin-det-gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>;continues-clk = <1>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "HDMI-MIPI";rockchip,camera-module-lens-name = "RK628-CSI";port {hdmiin_out0: endpoint {remote-endpoint = <&hdmi_mipi0_in>;data-lanes = <1 2 3 4>;};};};
};
  • interrupt-parent/ interrupts:连接RK628中断的GPIO引脚;

  • enable-gpios:RK628供电控制GPIO引脚(若为常供电可不配置);

  • reset-gpios:RK628复位控制GPIO引脚

  • rockchip,camera-module相关的都是适配RK的camera框架平台私有配置,与camera类似。

2.2 图像链路配置

这里具体RK3399以及RK3568为例,RK3399代表的是RK旧的平台,RK3568代表的是引入VICAP之后的平台,在RK3568之后的芯片平台也没有基于安卓11的版本,都是基于安卓12以后得版本,我们后续在做详细的介绍。

2.2.1 RK3399

RK339平台只能使用ISP接收图像,链路我们可以描述为:转接芯片-->dphy_rx0 -->isp

其中dts配置可以参考如下配置。需要注意的是rk3399有两个isp,配置对应的是哪一路即可。

&i2c4 {clock-frequency = <400000>;status = "okay";rk628_csi_v4l2: rk628_csi_v4l2@50 {reg = <0x50>;compatible = "rockchip,rk628-csi-v4l2";interrupt-parent = <&gpio2>;interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;//enable-gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;reset-gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>;plugin-det-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_LOW>;//power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "RK628-CSI";rockchip,camera-module-lens-name = "NC";port {hdmiin_out0: endpoint {remote-endpoint = <&mipi_in>;data-lanes = <1 2 3 4>;};};};
};&mipi_dphy_rx0 {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_in: endpoint@1 {reg = <1>;remote-endpoint = <&hdmiin_out0>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;dphy_rx_out: endpoint@0 {reg = <0>;remote-endpoint = <&isp_mipi_in>;};};};
};&isp0 {status = "okay";port {#address-cells = <1>;#size-cells = <0>;isp_mipi_in: endpoint@0 {reg = <0>;remote-endpoint = <&dphy_rx_out>;};};
};&isp0_mmu {status = "okay";
};
2.2.2 RK3568

RK3568则有两种情况,一是使用isp接收,二是使用vicap模块接收图像,我们分别进行介绍。

rk3568使用isp的场景,对应的图像链路为:

对应的dts配置为:

&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: endpoint@1 {reg = <1>;remote-endpoint = <&hdmiin_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 = <&isp0_in>;};};};
};&i2c4 {clock-frequency = <400000>;status = "okay";rk628_csi_v4l2: rk628_csi_v4l2@50 {reg = <0x50>;compatible = "rockchip,rk628-csi-v4l2";interrupt-parent = <&gpio2>;interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;//enable-gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;reset-gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>;plugin-det-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_LOW>;//power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "RK628-CSI";rockchip,camera-module-lens-name = "NC";port {hdmiin_out0: endpoint {remote-endpoint = <&mipi_in>;data-lanes = <1 2 3 4>;};};};
};&rkisp {status = "okay";
};&rkisp_mmu {status = "okay";
};&rkisp_vir0 {status = "okay";port {#address-cells = <1>;#size-cells = <0>;isp0_in: endpoint@0 {reg = <0>;remote-endpoint = <&csidphy_out>;};};
};

RK3568使用VICap的场景,图像链路为:

对应的dts配置参考为:

&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>;hdmi_to_mipi_in: endpoint@1 {reg = <1>;remote-endpoint = <&lt6911uxc_out>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;csidphy_out: endpoint@1 {reg = <1>;remote-endpoint = <&mipi_csi2_input>;data-lanes = <1 2 3 4>;};};};
};&i2c3 {status = "okay";lt6911uxc: lt6911uxc@2b {status = "okay";reg = <0x2b>;compatible = "lontium,lt6911uxc";clocks = <&ext_cam_clk>;clock-names = "xvclk";interrupt-parent = <&gpio4>;interrupts = <16 IRQ_TYPE_LEVEL_LOW>;power-gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;reset-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;plugin-det-gpios = <&gpio0 30 GPIO_ACTIVE_LOW>;hpd-ctl-gpios = <&gpio3 27 GPIO_ACTIVE_LOW>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "LT6911UXC";rockchip,camera-module-lens-name = "NC";port {lt6911uxc_out: endpoint {remote-endpoint = <&hdmi_to_mipi_in>;data-lanes = <1 2 3 4>;};};};
};&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";port {cif_mipi_in: endpoint {remote-endpoint = <&mipi_csi2_output>;data-lanes = <1 2 3 4>;};};
};&rkcif_mmu {status = "okay";
};&rkcif {status = "okay";
};
3.camera xml注册设备

camera3_profiles.xml文件对应SDK目录下具体芯片平台的文件:

hardware/rockchip/camera/etc/camera/camera3_profiles_rk3xxx.xml

在设备上的路径为:

/vendor/etc/camera/camera3_profiles.xml

若是临时调试,可以采用adb替换文件的形式,但需要注意文件路径与文件名的正确性。

xml增加配置的时候可以参考其他已有的sensor,后续仅介绍关键的几个修改点。

3.1 设备名称与ID

xml中name参数与moduleid参数取决定着能否成功注册安卓camera设备,若该两项属性配置异常,则会导致

  • name:需要与驱动名称一致,有大小写区别;

  • moduleId:需要与驱动dts中配置的index一致;

3.2 分辨率配置

scaler.availableStreamConfigurations/scaler.availableMinFrameDurations/ scaler.availableStallDurations:需要正确配置预预览支持的分辨率以及帧率,此处的分辨率不能大于驱动实际输出的分辨率大小,如下所示:

            <scaler.availableStreamConfigurations value="BLOB,1920x1080,OUTPUT,BLOB,176x144,OUTPUT,YCbCr_420_888,1920x1080,OUTPUT,YCbCr_420_888,176x144,OUTPUT,IMPLEMENTATION_DEFINED,1920x1080,OUTPUT,IMPLEMENTATION_DEFINED,176x144,OUTPUT"/><scaler.availableMinFrameDurations value="BLOB,1920x1080,33333333,BLOB,176x144,33333333,YCbCr_420_888,1920x1080,33333333,YCbCr_420_888,176x144,33333333,IMPLEMENTATION_DEFINED,1920x1080,33333333,IMPLEMENTATION_DEFINED,176x144,33333333" /><scaler.availableStallDurations value="BLOB,1920x1080,33333333,
3.3 SOC模式

在<Sensor_info_RKISP1>中需要配置sensorType,一般SOC为YUVsensor,即不启动3A,RAW为RAW sensor,启动3A,HDMI-IN都是YUV的图像,因此需要设置为SOC模式。

<sensorType value="SENSOR_TYPE_SOC"/> <!-- SENSOR_TYPE_SOC or SENSOR_TYPE_RAW -->
3.4 旋转角配置
<sensor. Orientation value="0"/>

4.APK适配

4.1 获取APK

APK源码地址:

RKDocs/common/hdmi-in/apk/rkCamera2_based_on_CameraHal3_V1.3.tar.gz
4.2 APK 源码适配
APK 通过 ioctl 的方式访问 RK628D 设备节点,获取当前的连接状态和分辨率。 RK628D 设备节点在
isp1/isp2/vicap 链路上可能会差异。需要根据实际情况修改 APK 源码。
rkCamera2/jni/native.cpp

获取连接状态和分辨率的位置:

于在 APK 访问了设备节点,所以需要确认是否关闭了 selinux ,可通过 getenforce 命令查看:

5.EDID配置

若需要修改分辨率支持,可直接在驱动代码中修改 EDID。

(4)调试方法

1.查看设备是否注册camera

使用如下命令查看是否成功注册cameraID

dumpsys media.camera

2.查看拓扑结构

HDMI2MIPI驱动框架类似camera,需要保证pipeline的完整才可以正常工作,使用media-ctl查看pipeline,同时也可以查看转接芯片对应的subdev节点,以便于apk那边适配修改。

media-ctl -d /dev/mediaX -p      //X=0123...

3.v4l2抓取数据流

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4

4.v4l2抓图

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/3840x2160_nv12.yuv --stream-count=5 --stream-poll

5.不同芯片平台接收能力

由于各个芯片平台isp/vicap的性能不同,对图像的最大接收能力也不同。可参考下表

芯片平台控制器支持分辨率
RK3288/RK3326ISP1080P60
RK3399ISP4K30 超频
RK3568/6ISP/VICAP

ISP:1080P60

VICAP:4K30

6.配置使用ISP CMA内存

部分平台HDMI IN接收图像数据时,根据实际系统负载,可能会存在带宽不足导致丢帧或MIPI接收异常等问题。此时需要提高DDR频率,若仍无改善,可给ISP预留使用CMA内存,以改善解决此问题。

  • rockchip_defconfig 配置预留 CMA 内存 128MB
CONFIG_CMA=y
CONFIG_CMA_SIZE_MBYTES=128
  • 在dts配置ISP关闭IOMMU,使用CMA内存
&rkisp_mmu {status = "disabled";
};

7.配置RK3399 ISP超频

配置RK3399超频625M,实现接收4K30图像。

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi
index 5ed8dac..e8f259d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi
@@ -148,7 +148,7 @@<50000000>, <100000000>,<75000000>, <75000000>,<816000000>, <816000000>,
-			 <600000000>, <200000000>,
+			 <625000000>, <200000000>,<800000000>, <150000000>,<75000000>, <37500000>,<300000000>, <100000000>,
diff --git a/drivers/media/platform/rockchip/isp1/dev.c b/drivers/media/platform/rockchip/isp1/dev.c
index 4e548f0..5aa9e13 100644
--- a/drivers/media/platform/rockchip/isp1/dev.c
+++ b/drivers/media/platform/rockchip/isp1/dev.c
@@ -757,7 +757,7 @@ static const unsigned int rk3368_isp_clk_rate[] = {/* isp clock adjustment table (MHz) */static const unsigned int rk3399_isp_clk_rate[] = {
-	300, 400, 600
+	300, 400, 625};static struct isp_irqs_data rk1808_isp_irqs[] = {

(5)总结

本文较长基本详细介绍了安卓9/10/11等平台hdmi-in功能的开发,可以看到hdmi-in与camera最大的不同在于增加了切换分辨率与热拔插的功能,而目前在安卓11的版本上面,都是使用apk轮询的方式实现的,而在安卓12之后的版本中,对这一方式有所优化,并且也增加了低延时送显示的应用框架,不再完全依赖于camera框架,后续我们在做介绍。

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

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

相关文章

MongoDB学习记录(快速入门)

MongoDB核心 基础概念 数据库 数据库是按照数据结构来组织、存储和管理数据的仓库。在内存中运行的&#xff0c;一旦程序运行结束或者计算机断电&#xff0c;程序运行中的数据都会丢失。我们需要将一些程序运行的数据持久化到硬盘之中&#xff0c;以确保数据的安全性。数据库…

阿里一面:微服务拆分需要考虑什么因素?

要拆分微服务&#xff0c;首先我们要了解微服务拆了会有什么问题&#xff1f;怎么合理拆服务&#xff1f; 拆分服务会带来什么问题&#xff1f; 举个电商系统下单扣库存的例子。 对于单体应用&#xff0c;通讯在进程内部进行&#xff0c;下单方法调用扣库存方法&#xff0c;…

3D高斯泼溅和4D高斯

1.高斯函数 想象你往平静的湖水里扔一块石头&#xff0c;水波会以石头落点为中心向外扩散&#xff0c;形成一个逐渐衰减的圆形波纹。高斯函数的形状就和这个波纹类似&#xff1a; 中心最高&#xff08;石头落点&#xff0c;波峰最强&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安装

mac comfyui安装包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后续官方有迭代&#xff0c;可以直接通过git更新源码升级 comfyui插件下载&#xff0c;解压放到custom_nodes目录下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;视频插件&#xff09; 和…

面试题SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服务注册与发现路由服务到服务的调用负载均衡断路器领导选举和集群状态分布式消息传递 SpringCloud核心组件&#xff1f; Eureka 注册中心Ribbon 客户端负载均衡Hystrix&#xff1a; 服务容错处理Feign:声明式Rest客户端Zu…

ASR-PRO语音识别可能出现的问题

ASR-PRO语音识别可能出现的问题 4月份有一天刷到牢大/爱丽丝语音自开关灯设备&#xff0c;心血来潮&#xff0c;博主也是浅尝了一下&#xff0c;由此也总结一下&#xff0c;实现此项目会出现的问题。 在实现爱丽丝开关灯模块时ASRPRO语音识别可能出现的问题如下&#xff1a; …

苍穹外卖--缓存菜品Spring Cache

Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

个人简历制作MarkDown模板

MarkDown制作个人简历的模板放在了github上&#xff0c;大家如有需求&#xff0c;请自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介绍一下此模板的特点&#xff1a; &#x1f338;个人面试期间使用的、整理的简历格式&#xff0c;现在分享给大家。 ⭐简历采…

【MySQL数据库 | 第五篇】DDL操作2

文章目录 当前数据库student的数据数据表操作 - 修改&删除&#x1f4d6;修改操作增加字段&#x1f44f;案例&#xff1a;向数据表student中添加字段 id修改字段的数据类型【只能修改字段的属性】&#x1f44f;案例&#xff1a;将student表中字段age的属性由tinyint unsigne…

【浏览器插件】如何开发一个Chrome浏览器插件

这篇文章来介绍一下,如何开发一个自己的Chrome浏览器插件程序。 Chrome浏览器插件,其实是让浏览器替我们执行我们自己写的代码,既然要让浏览器执行代码,那么首先,就需要定义一个规范,也就是说,需要让Chrome浏览器知道,你写的程序是一个插件。 这就需要介绍一下插件中…

详细讲解Redis为什么被设计成单线程

Redis 被设计成单线程的原因主要有以下几点&#xff0c;这些原因涉及性能优化、复杂性控制、数据一致性以及适用场景等多个方面&#xff1a; 1. 简化设计与实现 避免锁竞争&#xff1a;多线程环境下&#xff0c;多个线程访问共享资源时需要加锁来保证数据一致性。锁的使用会增…

Hive 逻辑优化器

Optimizer PointLookupOptimizer 作用&#xff1a;把符合条件的 OR 表达式转为 IN。 参数hive.optimize.point.lookup 设置是否开启 PointLookupOptimizer&#xff0c;默认为 true. 参数 hive.optimize.point.lookup.min 控制多少个 OR 表达式转为 IN&#xff0c;默认 31。 例…

ZYNQ Petalinux实战:PCIe直通NVMe固态硬盘,解锁存储性能新极限!

突破SD卡和SATA的速度枷锁!本文将手把手教你如何在ZYNQ平台上通过PCIe接口驱动NVMe固态硬盘。从硬件设计、Linux内核配置到创新性的DMA零拷贝优化,实现2000MB/s+ 的存储性能飞跃,附完整代码解析和性能实测对比。 一、为什么选择PCIe NVMe?存储性能革命 ZYNQ传统存储方案面…

05-mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server发布到PyPI官网

1前言 上期给大家介绍过mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server。当时部署的方式使用了一个私有云SSE的部署。当时缺少一个本地部署的方式&#xff0c;有的小伙伴给我留言能不能有一个本地话部署方式了。今天就给大家带来一个本地化部署的方案。 话不…

MCP Parameters 增加描述

场景&#xff1a;本地MCP开发完后是否发现CLINE上显示的Parameters 显示No description 方法1 &#xff1a;使用参数元数据 (Annotated) 可以使用 Pydantic 的with 类提供有关参数的其他元数据Annotated。这种方法更受欢迎&#xff0c;因为它更现代&#xff0c;并且将类型提示…

STM32 GPIO 寄存器开发

&#x1f527; ​一、核心寄存器概览​ ​寄存器​​功能​​位宽​​关键位域​​GPIOx_CRL/CRH​配置引脚模式&#xff08;输入/输出/复用/模拟&#xff09;和输出参数32位每4位控制1个引脚&#xff1a;CNF[1:0]&#xff08;模式&#xff09; MODE[1:0]&#xff08;速度&am…

powershell 获取 用户及进程列表

在PowerShell中获取用户的进程列表&#xff0c;可以通过几种方法实现。以下是一些常见的方法&#xff1a; 方法1&#xff1a;使用Get-WmiObject Get-WmiObject命令可以用来查询Windows Management Instrumentation (WMI)数据库&#xff0c;从而获取关于进程和用户的信息。 # …

量化面试绿皮书:15. 假币一

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 15. 假币一 有 10个袋子&#xff0c;每个袋子里有 100个相同的硬币。 在除一个以外的所有袋子中&#xff0c;每枚硬币重10 克。 然而&#x…

Java求职者面试:Spring AI、MCP、RAG、向量数据库与Embedding模型技术解析

Java求职者面试&#xff1a;Spring AI、MCP、RAG、向量数据库与Embedding模型技术解析 第一轮&#xff1a;基础概念问题 1. 请解释Spring AI是什么&#xff1f;它与传统Spring框架有何不同&#xff1f; Spring AI是Spring生态系统的一部分&#xff0c;专注于人工智能和机器学…

tp框架导出excel的时候报错:unexcepted identifier “Closure“,excepting variable

记录一个简单的错误。 背景 用的是PhpOffice/PhpSpreadsheet 在本地环境下是可以正常导出excel的。但是线上就不行。 就会报错unexcepted identifier “Closure”&#xff0c;好像是不能用匿名函数。 首先 本地可以正常导出&#xff0c;然后服务器上不可以。看了各种日志。ph…