STM32MP157驱动开发——USB设备驱动

news2024/11/16 17:38:38

STM32MP157驱动开发——USB设备驱动

  • 一、简介
    • 1.电气属性
    • 2.USB OTG
    • 3.STM32MP1 USB 接口简介
    • 4.Type-C 电气属性
  • 二、USB HOST 驱动开发
    • 1.USB HOST 驱动编写
    • 2.配置 PHY 控制器
    • 3.配置usbh_ehci
  • 三、USB HOST 测试
    • 1.鼠标键盘驱动使能
    • 2.U盘驱动
  • 四、USB OTG驱动开发
    • 1.USB OTG 控制器节点信息
    • 2.使能 usbotg_hs 节点
    • 3.使能 I2C1 节点
    • 4.FUSB302驱动移植
  • 五、USB OTG测试
    • 1.模拟U盘(开发板做从机)
    • 2.USB声卡
    • 3.开发板做OTG主机


参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux USB驱动

一、简介

  由于 USB 协议太过庞大和复杂,所以本节只对 STM32MP157 自带的 USB 驱动进行使能和测试。详细的 USB 接口和协议的介绍,可以参考原子哥的资料《USB2.0 协议中文版.pdf》和《USB3.0 协议中文版.pdf》。
  USB 全称为 Universal Serial Bus,翻译过来就是通用串行总线,用于规范电脑与外部设备的连接与通讯。接口部分,最新的智能手机均采用 USB Typec 取代了传统的 3.5mm 耳机接口,苹果最新的 MacBook 只有 USB Typec 接口,至于其他的 HDMI、网口等均可以通过 USB Typec 扩展坞来扩展。协议部分,USB 目前可以划分为 USB1.0、USB2.0、USB3.0 以及正在即将到来的 USB4.0。

1.电气属性

USB A 插头一般有四个触点,也就是 4 根线,从左到右线序依次为 1,2,3,4,第 1 根线为 VBUS,电压为 5V,第 2 根线为 D-,第 3 根线为 D+,第 4 根线为 GND。USB 采用差分信号来传输数据,因此有 D- 和 D+两根差分信号线。
Mini USB 插头一般有五个触点,第 1 根线为 VCC(5V),第 2 根线为 D-,第 3 根线为 D+,第 4 根线为 ID,第 5 根线为 GND。这个 ID 线用于实现 OTG 功能,通过 ID 线来判断当前连接的是主设备(HOST)还是从设备(SLAVE)。
在这里插入图片描述

2.USB OTG

USB 分为 HOST(主机)和从机(或 DEVICE),有些设备可能有时候需要做 HOST,有时候又需要做 DEVICE,USB OTG 应运而生,OTG 是 On-The-Go 的缩写,支持 USB OTG 功能的 USB 接口既可以做 HOST,也可以做 DEVICE。

ID=1:OTG 设备工作在从机模式。
ID=0:OTG 设备工作在主机模式。

支持 OTG 模式的 USB 接口一般都是 Mini USB、 Micro USB 等这些带有 ID 线的接口。正点原子的 STM32MP1 开发板 OTG 模式是使用 USB Type-C 接口,没有 ID 线。 USB Type C 有自己的识别方法。

3.STM32MP1 USB 接口简介

STM32MP157 提供了两个 USB2.0 接口,这两个 USB 接口都支持高速模式,也就是480Mbit / 秒,都内置了高速 PHY。其中 USB2 支持 OTG 功能, 正点原子 STM32MP157 开发板上的 USB OTG 接口就是连接到 USB2 接口上的。USB1 接口连接了一个 HUB 芯片,可以实现 USB Host 接口扩展。

4.Type-C 电气属性

根据 USB 协议,USB TypeC 接口也叫做 USB3.1 接口。由于 TypeC 功能比较复杂,比如支持 PD 充电、显示、音频等,这里只关注 TypeC 的数据通信部分。母口的引脚定义如下:
在这里插入图片描述

  • A1、A12、B1、B12: 这 4 个引脚为 GND
  • A2、A3、B2、B3:这 4 个引脚是 USB3.1 特有的,为超高速差分发送信号线
  • A10、A11、B10、B11:这 4 个引脚也是 USB3.1 特有的,为超高速差分接收信号线
  • A4、A9、B4、B9: VBUS 引脚
  • A5、B5:CC1 和 CC2 这 2 个引脚为 USB3.1 特有的配置通道引脚。Type-C 的插座中有两个 CC 脚,USB 通信中的角色检测都是通过 CC 脚进行的。对于 TypeC 插头或者线缆,正常只有一个 CC 引脚,两个端口连接在一起之后,只存在一个 CC 引脚连接,通过检测哪一个 CC 有连接,就可以判断连接的方向。如果USB线缆中有需供电的器件,其中一个CC引脚将作为 VCONN 供电
  • A8、B8:SBU1 和 SBU2 引脚,这两个并不是 USB 信号,而是用作其他功能的,比如 TypeC 作为 DP 接口使用的时候 SBU 用作音频传输通道
  • A6、A7、B6、B7:就是 USB2.0 的 D+ 和 D-

标准的Type-C接口是有24个引脚的,也有简化的16P引脚,去掉了 8 根 USB3.1 高速差分收发数据线。也有6P封装的接口,与Micro USB的引脚相同,只是换了个接口。

二、USB HOST 驱动开发

正点原子的 STM32MP1 开发板 USB 部分原理图可以分为两部分:USB HUB 以及 USB OTG。由于 STM32MP157 芯片只提供了 USB2.0 的接口,所以虽然是 Type-C 接口,本质上还是 USB2.0 协议。另外,使用 TypeC 接口实现 OTG 功能需要外接 TypeC 芯片,通过专用的 TypeC 芯片来控制 CC 引脚实现 USB 的主从切换。所以具体的外接芯片需要根据实际情况选用。
USB HUB原理图:
在这里插入图片描述
使用 FE2.1 这个 HUB 芯片将 STM32MP1 的 USB2 扩展成了 7 路 HOST 接口,其中一路供 4G 模块使用(HUB_DP7/DM7)。
注:使用 FE2.1 扩展出来的 7 路 USB 接口只能用作 HOST
USB OTG 原理图:
在这里插入图片描述
V1.5版本使用 FUSB302MPX 做控制芯片,在 V1.4 及之前的版本里使用的是 STUSB1600 控制芯片。此控制器主要的功能就是负责切换主机和从机模式。
I2C1_SCL 和 I2C1_SDA 的引脚分别为:PF14 和 PF15。USB 属于热插拔设备。USB_INT 这个中断引脚主要是检测有没有设备接入,有设备接入电平就会被拉低,驱动进入中断函数,使用 I2C 去读取寄存器配置开发板的主从模式,USB_INT 的引脚为 PG2。
FUSB302PMX 版本中,还有一个MT9700HT5,是负载开关,用来控制 VBUS 输出。当 OTG_PWR_CTRL 输出高电平时 OUT 引脚就输出 5V 电压,也就是 VBUS 变为 5V。当 OTG_PWR_CTRL 输出低电平的时候 OUT 输出 0V,相当于 VBUS 关闭。
所以当开发板上的 TypeC 接口作为主设备时,OTG_PWR_CTRL 要输出高电平,VBUS 输出 5V,为外部 USB 设备供电。当 TypeC 接口作为从设备时,OTG_PWR_CTRL 输出低电平。OTG_PWR_CTRL 对应的 GPIO 引脚为 PZ6。

1.USB HOST 驱动编写

USB 子系统是一个标准和复杂的接口,不过好在 Linux 内核已经提供了相关的驱动,只需要在设备树中提供相应的节点即可。
ST 官方的 STM3MP157C-DK2 开发板已经配置好了 USBH 的节点信息,可以参考此节点进行修改。
在 stm32mp151.dtsi 文件中,可以找到“usbh_ohci”和“usbh_ehci”节点:
在这里插入图片描述
从代码中可以知道 USBH 是支持 USB2.0 和 USB1.1。使用 USB2.0 就要配置 usbh_ehci 节点,使用 USB1.1 就要配置 usbh_ohci 节点。根据 compitable 属性值,可以查找到驱动文件为 drivers/usb/host/ohci-platform.c 和 drivers/usb/host/ehciplatform.c。

2.配置 PHY 控制器

同样在 stm32mp151.dtsi 文件中,可以找到 phy 相关设备节点:
在这里插入图片描述
usbphyc 节点就是 STM32MP1 的 USB PHY,PHY 控制器有两个端口,对应两个子节点分别为:usbphyc_port0 和 usbphyc_port1,其中 usbphyc_port0 只能分配给 USB Host。“#phy-cells”属性值为 0 表示做 OTG 的 PHY 端口,1 表示做 USBH 的 PHY 端口。
将 “stm32mp15xx-dkx.dtsi” 中的 usb_phy_tuning 节点拷贝到自己的设备树中,usb_phy_tuning 此节点负责调整 PHY 的配置,相关的参考文档为 Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml。

usb_phy_tuning: usb-phy-tuning {
		st,hs-dc-level = <2>;
		st,fs-rftime-tuning;
		st,hs-rftime-reduction;
		st,hs-current-trim = <15>;
		st,hs-impedance-trim = <1>;
		st,squelch-level = <3>;
		st,hs-rx-offset = <2>;
		st,no-lsfs-sc;
};

接着在自己的设备树文件中继续追加内容,用来设置 usbphyc_port0 节点。

&usbphyc {
	status = "okay";
};

&usbphyc_port0 {
	phy-supply = <&v3v3>;
	st,phy-tuning = <&usb_phy_tuning>;
};

①将 usbphyc 的 status 属性修改为“okay”,使能 usbphyc
②给 usbphyc_port0 节点追加 phy-supply 属性,添加一个电源管理属性
③将要修改的 PHY 配置,添加到 usbphyc_port0 节点里

3.配置usbh_ehci

在自己的设备树中,使能 usbh_ehci 和指定 PHY 端口:

&usbh_ehci {
	phys = <&usbphyc_port0>;
	status = "okay";
};

修改完成后编译出新的设备树,用于启动开发板。终端会输出以下信息:
在这里插入图片描述

三、USB HOST 测试

1.鼠标键盘驱动使能

在 Linux 内核的 menuconfig 中选中以下选项,使能 HID 驱动:
在这里插入图片描述
然后使能 USB 键盘和鼠标驱动:
在这里插入图片描述
此选项对应配置项就是 CONFIG_USB_HID,也就是 USB 接口的 HID 设备。但是要注意,此驱动和 HIDBP(Boot Protocol)键盘、鼠标的驱动不能一起使用。
然后编译出新的内核镜像,启动开发板。启动以后插入 USB 鼠标,会出现以下信息:
在这里插入图片描述
并且会在/dev/input 目录下生成一个名为 eventX(X=0,1,2,3…)的文件,这个就是前面讲的输入子系统,鼠标和键盘都是作为输入子系统设备。
如果要测试 USB 键盘,可以将 LCD 作为默认终端控制台,在开发板的 /etc/inittab 中添加以下语句:

tty1::askfirst:-/bin/sh

然后就可以使用开发板屏幕作为终端控制,使用键盘进行输入。

2.U盘驱动

U 盘使用 SCSI 协议,所以要先使能 Linux 内核中的 SCSI 协议:
在这里插入图片描述
然后使能 USB Mass Storage,也就是 USB 接口的大容量存储设备:
在这里插入图片描述
然后就可以编译出内核镜像,启动开发板。注:U盘需要格式化为 Fat32 格式,NTFS 和 exFAT 由于版权问题所以在 Linux 下支持的不完善,可能会出现问题。例如我的U盘格式化为 NTFS 格式就无法写入。
在这里插入图片描述
成功挂载后,/dev 目录下会出现 sda 和 sda1 两个文件。/dev/sda 是整个 U 盘,/dev/sda1 是 U 盘的第一个分区,一般使用 U 盘的时候都是只有一个分区。要想访问 U 盘需要先对 U 盘进行挂载:

mkdir /mnt/usb_disk -p
mount /dev/sda1 /mnt/usb_disk/ -t vfat -o iocharset=utf8 

-t 指定挂载所使用的文件系统类型,这里设置为 vfat,也就是 FAT 文件系统,“-o iocharset”设置硬盘编码格式为 utf8,否则 U 盘里的中文会显示乱码。然后就可以对U盘中的数据进行读写操作了。
卸载U盘:

sync 	#同步
cd /	#退出U盘目录,否则可能会出现设备忙状态,卸载失败
umount /mnt/usb_disk #卸载

四、USB OTG驱动开发

1.USB OTG 控制器节点信息

在 arch/arm/boot/dts/stm32mp151.dtsi 设备树文件中,有一个 usbotg_hs 节点,此节点就是 USB OTG 控制器节点:
在这里插入图片描述
根据 compatible 属性可以找到驱动文件为 drivers/usb/dwc2/params.c。

2.使能 usbotg_hs 节点

首先在自己的设备树中,配置 PHY 接口,追加 usbphyc_port1 节点:
注:要先使能 usbphyc 节点
在这里插入图片描述
然后追加 usbotg_hs 的相关属性信息:

&usbotg_hs {
	phys = <&usbphyc_port1 0>;
	phy-names = "usb2-phy";
	usb-role-switch;
	status = "okay";
	port {
		usbotg_hs_ep: endpoint {
			remote-endpoint = <&con_usbotg_hs_ep>;
		};
	};
};

①配置 usbotg_hs 的 PHY 接口,这里 0 表示为 OTG USB 的 PHY 端口
②把 status 属性改为 okay,使能 usbotg_hs
③添加了一个 port 节点,指定 usbotg_hs 节点使用 con_usbotg_hs_ep 做控制器, con_usbotg_hs_ep 会在 USB 控制芯片对应的节点里创建

电源节点:

vdd_usb: regulator-vdd-usb {
	compatible = "regulator-fixed";
	regulator-name = "vdd_usb";
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-always-on;
	regulator-boot-on;
};

3.使能 I2C1 节点

控制 Typec 的芯片是 FUSB302MPX (或 STUSB1600),此芯片是使用 I2C 协议和 CPU 进行通讯,所以要使能 I2C1:

&i2c1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_pins_b>;
	pinctrl-1 = <&i2c1_pins_sleep_b>;
	status = "okay";
};

4.FUSB302驱动移植

配置 FUSB302 的中断电气属性,在 stm32mp15-pinctrl.dtsi 中添加以下内容:

fusb302_pins_a: fusb302-0 {
	pins {
		pinmux = <STM32_PINMUX('G', 2, ANALOG)>;
		bias-pull-up;
	};
};

然后在 stm32mp167d-atk.dts 文件中添加头文件“dt-bindings/usb/pd.h”。
接着配置 FUSB302 节点,此节点为 i2c1 节点的子节点:

fusb302@22 {
	compatible = "fcs,fusb302","fairchild,fusb302";
	reg = <0x22>;
	pinctrl-names = "default";
	pinctrl-0 = <&fusb302_pins_a>;
	int-n-gpios = <&gpiog 2 GPIO_ACTIVE_HIGH>;
	vbus-5v-gpios = <&gpioz 6 GPIO_ACTIVE_HIGH>;
	status = "okay";

	connector {
		compatible = "usb-c-connector";
		label = "USB-C";
		power-role = "dual";
		power-opmode = "default";

		try-power-role = "sink";
		source-pdos = <PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)>;
		sink-pdos = <PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)
					PDO_VAR(3000, 12000, 3000)
					PDO_PPS_APDO(3000, 11000, 3000)>;
		op-sink-microwatt = <10000000>;
		port {
			con_usbotg_hs_ep: endpoint {
				remote-endpoint = <&usbotg_hs_ep>;
			};
		};
	};
};

①reg 属性值为“0x22”,表示该芯片的 i2c 通讯地址为0x22
②定义一个 con_usbotg_hs_ep 端口,并指定此端口连接到 usbotg_hs 节点的 usbotg_hs_ep 端口
fusb302 的设备树没有使用电源管理,而是用 PZ6 引脚去控制电压。此外,Linux 内核提供的 fusb302 驱动不读取 connector 相关的属性,所以不能使用(旧版本代码,不知道新的有没有优化)。在 github 上有可用的驱动,或者使用正点原子提供的 fusb302.c 和 fusb302.h,覆盖掉 drivers/usb/typec/tcpm 目录下的原驱动文件。然后再使能内核的menuconfig中的相关配置。
在这里插入图片描述
然后编译出新的内核镜像和设备树,启动开发板。

五、USB OTG测试

终端打印以下信息,说明加载驱动成功。
在这里插入图片描述

1.模拟U盘(开发板做从机)

首先配置Linux内核,开发板当做一个 U 盘。(选择编译成模块,手动挂载)在这里插入图片描述
然后使用以下命令,编译内核、模块:

make uImage LOADADDR=0XC2000040 -j32
make modules -j32

编译完成之后会得到 3 个.ko 内核模块文件:

drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_mass_storage.ko
drivers/usb/gadget/legacy/g_mass_storage.ko

将三个文件拷贝到开发板 /lib/modules/5.4.31 目录,拷贝完成以后使用新编译出来的 uImage 启动开发板,在开发板上插入一个 U 盘。记下U盘挂载后的设备文件名。
使用 TypeC 数据线将开发板 OTG 口和电脑连接,连接好以后依次加载 libcomposite.ko、usb_f_mass_storage.ko 和 g_mass_storage.ko 这三个驱动文件,顺序不能错。命令如下:

depmod
modprobe libcomposite.ko
modprobe usb_f_mass_storage.ko
modprobe g_mass_storage.ko file=/dev/sda1(设备文件描述符) removable=1

然后就可以在电脑上对U盘进行读写操作。
在这里插入图片描述
操作完成后使用以下命令退出:

rmmod g_mass_storage.ko
rmmod usb_f_mass_storage.ko
rmmod libcomposite.ko

2.USB声卡

STM32MP1 开发板板载了音频解码芯片,因此可以将 STM32MP1 开发板作为一个外置 USB 声卡,配置 Linux 内核:
在这里插入图片描述
在这里插入图片描述
编译后会得到以下三个模块:

drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_uac1_legacy.ko
drivers/usb/gadget/legacy/g_audio.ko

然后启动开发板,按照之前的教程配置声卡,保证声卡正常播音。然后连接 OTG 口和电脑。最后依次加载 libcomposite.ko、usb_f_uac1_legacy.ko 和 g_audio.ko 这三个驱动模块:

depmod
modprobe libcomposite.ko
modprobe usb_f_uac1_legacy.ko
modprobe g_audio.ko

加载完成以后稍等一会虚拟出一个 USB 声卡,打开电脑的设备管理器,选择“声音、视频和游戏控制器”,会发现有一个名为“AC Interface”设备:
在这里插入图片描述
将该声卡作为电脑的扬声器,就可以使用开发板放音了:
在这里插入图片描述

3.开发板做OTG主机

做主机的话测试方法和上面的 USB HOST 测试一模一样,直接在正点原子的 USB_OTG 接口上连接一个拓展坞,然后接入鼠标键盘、U 盘等设备。

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

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

相关文章

系统设计实战一

文章目录前言一、服务幂等1.防止订单重复下单1.1 场景如下&#xff1a;当用户在提交订单的时候1.2 重复下单解决方案1.3案例一幂等性总结2 防止订单ABA问题2.1 场景如下&#xff1a;当在修改订单用户信息的时候发生服务器或者网络问题导致的重试2.2 ABA问题解决方案2.3 业务ABA…

Mac本地安装Mysql并配置

文章目录一、安装Mysql二、配置Mysql三、启动mysql四、SQL语法初步了解1.创建数据库2.建表3.查看表一、安装Mysql 笔者推荐采用安装包的方法安装Mysql&#xff0c;比较简单&#xff0c;适合新手。 首先在网上搜安装包&#xff1a; baidu按关键字搜即可&#xff1a;mysql mac安…

多兴趣向量重构用户向量

Re4: Learning to Re-contrast, Re-attend, Re-construct for Multi-interest Recommendation 论文地址&#xff1a;https://arxiv.org/pdf/2208.08011.pdf 一般的多兴趣建模过程是对用户序列进行编码&#xff0c;抽取出用户的多个兴趣向量&#xff0c;然后利用这些用户兴趣向…

【Vue中使用Echarts】echarts初体验

文章目录一、echarts简介二、初次体验echarts1.下载2.在vue中引入echarts①全局引入&#xff08;代码&#xff09;② 局部引入一、echarts简介 在大数据盛行的今天&#xff0c;数据可视化变得越来越广泛。而在前端工作中&#xff0c;数据可视化用得最多的&#xff0c;可能就是…

Usaco Training 刷怪旅 第三层 第四题 :Combination Lock

一个六年级博主写文章不容易&#xff0c;给个关注呗 &#xff08;点赞也行啊&#xff09; 本蒟蒻的bilibili账号 注&#xff1a;这种题当你看不懂的时候是可以把题目复制去洛谷看中文版的 Farmer Johns cows keep escaping from his farm and causing mischief. To try and pre…

如何通过 Python 与 ChatGPT 对话

文章目录简介安装 OpenAI API实例1预备条件: 1. 科学上网&#xff1b; 2. 注册 OpenAI 账号。 简介 ChatGPT 是 GPT-3 语言模型的变体&#xff0c;专为会话语言生成而设计。要在 Python 中使用 ChatGPT&#xff0c;您需要安装 OpenAI API 客户端并获取 API 密钥。当前提你需要…

前端工程师leetcode算法面试必备-二分搜索算法(中)

一、前言 二分搜索算法本身并不是特别复杂&#xff0c;核心点主要集中在&#xff1a; 有序数组&#xff1a;指的是一个递增或者递减的区间&#xff08;特殊情况如&#xff1a;【852. 山脉数组的峰顶索引】&#xff09;&#xff1b; 中间数&#xff1a;用来确定搜索目标落在左…

Pytorch学习笔记①——anaconda和jupyter环境的安装(小白教程)

一、安装Pytorch 1、首先找到anaconda命令端并点击进入。 2、输入如下命令创建子空间&#xff08;博主的命名是pytorch1.4.0&#xff0c;使用python3.6版本&#xff09; conda create -n pytorch1.4.0 python3.6对于下载速度慢的话&#xff0c;首先需要进行换源&#xff0c;换…

FastJson不出网rce

BCEL ClassLoader去哪了 0x01 BCEL从哪里来 首先&#xff0c;BCEL究竟是什么&#xff1f;它为什么会出现在JDK中&#xff1f; BCEL的全名应该是Apache Commons BCEL&#xff0c;属于Apache Commons项目下的一个子项目。Apache Commons大家应该不陌生&#xff0c;反序列化最著…

05 RS485

什么是RS485&#xff1f; RS485 是一种通用的通信标准&#xff0c;广泛用于数据采集和控制应用中。 它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上&#xff0c;这使得多个节点可以相互连接。 RS-485&#xff08;目前称为EIA/TIA-485&#xff09;是通信物理层的…

面试官:React怎么做性能优化

前言 最近一直在学习关于React方面的知识&#xff0c;并有幸正好得到一个机会将其用在了实际的项目中。所以我打算以博客的形式&#xff0c;将我在学习和开发&#xff08;React&#xff09;过程中遇到的问题记录下来。 这两天遇到了关于组件不必要的重复渲染问题&#xff0c;…

2022 年,我身上发生的几件大事

一晃2022互联网寒冬年就要结束了&#xff0c;在今年我的身上发生了好几件人生大事。因为这些事情对我的心态、思绪等产生了不同层次、不同方面的影响&#xff0c;所以很有必要做一次年终复盘。那么&#xff0c;接下来让我用拙略的写作手法&#xff0c;带大家走进我那特别的2022…

别等iPhone14了,苹果iPhone15变化很大

在去年的手机市场当中&#xff0c;苹果可以说是最大的赢家。因为去年iPhone13发布的时间段&#xff0c;恰好是高端旗舰的空档期&#xff0c;小米、OV在高端市场的销量表现一般&#xff0c;华为又没有能力发布新机&#xff0c;三星的Note系列在去年也暂停发布。所以不夸张的说&a…

SpringBoot整合ShardingJdbc实现数据库水平分表实战

(1)添加Maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

因果推断4--Causal ML(个人笔记)

目录 1 安装教程及官方文档 1.1 pip安装 1.2 API文档 1.3 代码仓库 2 Uplift模型与主要方法介绍 2.1 发放代金券 2.2 多treatment 2.3 实验方法 3 causalml.inference.tree module 3.1 UpliftTreeClassifier 3.2 UpliftRandomForestClassifier 3.3 CausalRandomFor…

sec7-可派生和非抽象类型

创建非抽象可派生类型比创建抽象类型更常见。本节介绍如何创建非抽象可派生类型对象。派生类型的例子是string的对象。它是TStr。它的子对象是一个数字字符串对象。数字字符串是表示数字的字符串。例如“0”、“-100”、“123.45”。子对象(数字字符串)将在下一节中解释。 我想…

前端框架搭建(九)搭建页面布局框架【vite】

## 1.创建目录BasicLayout——全局布局 components——布局组件 GlobalContent&#xff1a;全局内容GlobalHeader&#xff1a;全局头部页面 2.处理GlobalHeader 创建HeaderMenu——头部菜单 声明相关类型 在typings目录下创建system.d.ts declare namespace App {/** 全局…

Canadian Coding Competition(CCC) 2021 Junior 题解

目录 Problem J1: Boiling Water Problem J2: Silent Auction Problem J3: Secret Instructions Problem J4: Arranging Books Problem J5/S2: Modern Art Problem J1: Boiling Water Problem Description At sea level, atmospheric pressure is 100 kPa and water begi…

自动挂载USB和TF卡

转自链接https://zhuanlan.zhihu.com/p/443745437 ①创建用于挂载U盘的目录 mkdir /mnt/usb –p②在/etc/udev/rules.d目录下添加用于检测U盘插入规则&#xff08;add&#xff09;&#xff0c;终端下执行以下命令创建第一个U盘插入规则。 vim /etc/udev/rules.d/11-add-usb.r…

【ROS】—— ROS通信机制——服务通信(三)

文章目录前言1. 服务通信理论模型2. 服务通信自定义srv2.1 定义srv文件2.2 编辑配置文件2.3 编译3. 服务通信自定义srv调用(C)3.1 vscode配置3.2 服务端3.3 客户端3.4 配置 CMakeLists.txt4. 服务通信自定义srv调用(python)4.1 vscode配置4.2 服务端4.3 客户端4.4 配置 CMakeLi…