I2C1的潜在影响
在Digi官方的开发板上,I2C1并没有连接什么东西,而在viena中I2C1还接着STUSB1600AQTR,但一般无需用它控制更改参数,除非将来需要更改模式,比如U口供电。
USB HOST电路
官方开发板的USB HOST电路中,有用到5v_board,并通过它接到带保护和报告的电源开关MIC2026,生成的USB_3V3给USB2514BI-AEZG(Microchip USB/pcie集线器扩展芯片)供电。这种方案在uboot也是即插即用,不用担心时序。 Viena中改用CH334H这个USB Hub芯片,固定偏置PWR和Reset,在linux下由于芯恒驱动会兼容Linux标准而没有影响,但在uboot下不行,如果想在uboot下也能用(主要是用U盘升固件,替代用法很多),需要改uboot源码,为了避免不确定性,暂时不处理,因为主要用途在linux下,已经测过可用。 但我们多一种在UBoot下单独更新固件的方式,除了网口外,可以测一下SD卡,这个应该在驱动上已经适配(片选信号和开发板不同,但已针对改好)。 测试办法: 找一张TF/Micro Sd卡,容量在16G以下最合适,可用windows格式化(小容量默认格为FAT32),如果超过16G,可用guiformat32工具或其它磁盘工具格式化为FAT32。插入后停在UBoot下,然后打mmcinfo显示相关内容。
注:使用viena的uboot刷到dvk上,会造成dvk的uboot也不能用,可能和5v_board有实施负载开关有关,因为viena硬件上拉,这个负载开关控制的GPIO已经在之前移除,但可以加回去,不过需要反转控制电平(和SPI片选被gpio子系统反转一样的原因,这个坑已经处理过,可以完美避开)。 但需调查一下官方开发板的负载开关片选为何不受影响。
UBoot下的USB调试
参考下面官方开发板的调试命令
=> usb start
starting USB...
Bus usb@482f0000: USB EHCI 1.00
scanning bus usb@482f0000 for devices... 3 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found
=> usb info
1: Hub, USB Revision 2.0
- u-boot EHCI Host Controller
- Class: Hub
- PacketSize: 64 Configurations: 1
- Vendor: 0x0000 Product 0x0000 Version 1.0
Configuration: 1
- Interfaces: 1 Self Powered 0mA
Interface: 0
- Alternate Setting 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms
2: Hub, USB Revision 2.0
- Class: Hub
- PacketSize: 64 Configurations: 1
- Vendor: 0x0424 Product 0x2514 Version 11.179
Configuration: 1
- Interfaces: 1 Self Powered Remote Wakeup 2mA
Interface: 0
- Alternate Setting 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
- Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
3: Mass Storage, USB Revision 2.0
- Generic Mass Storage 5083A0CA
- Class: (from Interface) Mass Storage
- PacketSize: 64 Configurations: 1
- Vendor: 0x058f Product 0x6387 Version 1.3
Configuration: 1
- Interfaces: 1 Bus Powered 100mA
Interface: 0
- Alternate Setting 0, Endpoints: 2
- Class Mass Storage, Transp. SCSI, Bulk only
- Endpoint 1 Out Bulk MaxPacket 512
- Endpoint 2 In Bulk MaxPacket 512
=> usb tree
USB device tree:
1 Hub (480 Mb/s, 0mA)
| u-boot EHCI Host Controller
|
+-2 Hub (480 Mb/s, 2mA)
|
+-3 Mass Storage (480 Mb/s, 100mA)
Generic Mass Storage 5083A0CA
=> usb storage
Device 0: Vendor: Generic Rev: 8.07 Prod: Flash Disk
Type: Removable Hard Disk
Capacity: 4012.0 MB = 3.9 GB (8216576 x 512)
=> fatls usb 0:1
System Volume Information/
core-image-base-ccmp25-dvk-20251119164915.installer/
dfu-util/
core-image-base-ccmp25-viena-20260113014420.installer/
667422720 core-image-base-ccmp25-dvk.ext4
12887552 core-image-base-ccmp25-dvk.boot.vfat
2 file(s), 4 dir(s)
USB设备树片段
原始的USB接口定义在STM32MP251.dtsi中,包括:
/{
usb2_phy1: usb2-phy1 {
compatible = "st,stm32mp25-usb2phy";
#phy-cells = <0>;
#clock-cells = <0>;
st,syscfg = <&syscfg 0x2400>;
clocks = <&rcc CK_KER_USB2PHY1>;
resets = <&rcc USB2PHY1_R>;
status = "disabled";
};
usb2_phy2: usb2-phy2 {
compatible = "st,stm32mp25-usb2phy";
#phy-cells = <0>;
#clock-cells = <0>;
st,syscfg = <&syscfg 0x2800>;
clocks = <&rcc CK_KER_USB2PHY2EN>;
resets = <&rcc USB2PHY2_R>;
status = "disabled";
};
soc@0 {
combophy: phy@480c0000 {
compatible = "st,stm32mp25-combophy";
reg = <0x480c0000 0x1000>;
#phy-cells = <1>;
clocks = <&rcc CK_BUS_USB3PCIEPHY>, <&rcc CK_KER_USB3PCIEPHY>;
clock-names = "apb-clk", "ker-clk";
resets = <&rcc USB3PCIEPHY_R>;
reset-names = "phy-rst";
st,syscfg = <&syscfg>;
access-controllers = <&rifsc 67>;
power-domains = <&CLUSTER_PD>;
wakeup-source;
interrupts-extended = <&exti1 45 IRQ_TYPE_EDGE_FALLING>;
status = "disabled";
};
usbh: usb@482e0000 {
compatible = "st,stm32mp25-usbh";
st,syscfg = <&syscfg 0x2420>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x482e0000 0x482e0000 0x20000>;
access-controllers = <&rifsc 63>;
power-domains = <&CLUSTER_PD>;
wakeup-source;
interrupts-extended = <&exti1 43 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
usbh_ohci: usb@482e0000 {
compatible = "generic-ohci";
reg = <0x482e0000 0x1000>;
clocks = <&usb2_phy1>, <&rcc CK_BUS_USB2OHCI>;
resets = <&rcc USB2_R>;
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb2_phy1>;
phy-names = "usb";
wakeup-source;
status = "disabled";
};
usbh_ehci: usb@482f0000 {
compatible = "generic-ehci";
reg = <0x482f0000 0x1000>;
clocks = <&rcc CK_BUS_USB2EHCI>;
resets = <&rcc USB2_R>;
interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
companion = <&usbh_ohci>;
phys = <&usb2_phy1>;
phy-names = "usb";
wakeup-source;
status = "disabled";
};
};
usb3dr: usb@48300000 {
compatible = "st,stm32mp25-dwc3";
st,syscfg = <&syscfg 0x4800>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x48300000 0x48300000 0x100000>;
access-controllers = <&rifsc 66>;
power-domains = <&CLUSTER_PD>;
wakeup-source;
interrupts-extended = <&exti1 44 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
dwc3: usb@48300000 {
compatible = "snps,dwc3";
reg = <0x48300000 0x100000>;
interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>;
clock-names = "ref", "bus_early", "suspend";
clocks = <&rcc CK_KER_USB2PHY2>, <&rcc CK_BUS_USB3DR>,
<&rcc CK_KER_USB2PHY2>;
resets = <&rcc USB3DR_R>;
phys = <&usb2_phy2>;
phy-names = "usb2-phy";
wakeup-source;
};
};
}
}
在板级设备树中关键启用是:
&usbh {
status = "okay";
};
&usbh_ehci {
status = "okay";
};
&usb3dr {
status = "okay";
dwc3: usb@48300000 {
maximum-speed = "high-speed";
usb-role-switch;
role-switch-default-mode = "peripheral";
};
};
在PLC的板子上,usbh_ehci: usb@482f0000 这个用的是usb2_phy1,对应板子上的USB HOST接口,而usb3dr是用usb2_phy2,对应板子上的U21 type C接口。
ST开发板,默认的DTS中明确禁用了OHCI (usbh_ohci: usb@482e0000 { status = "disabled"; }😉,但板载了一个USB Hub芯片(compatible="usb424,2514",如USB2514系列)。这个Hub是高速度Hub,它可以作为中介处理FS/LS设备:即使OHCI禁用,Hub会将FS/LS信号转换为HS信号,再由EHCI处理。 因此,一些像伪ch343的USB转serial低速设备在能被识别(尽管DTS只启用了EHCI)——这是Hub的功劳,而不是直接依赖OHCI。
但单端USB的PLC板卡,对于FS设备如USB转serial,缺少OHCI会导致内核无法正确切换和处理低速信号。因此我们需要启用OHCI。
&usbh_ohci {
status = "okay";
};
USB硬件电路
ST的PLC参考设计板提供了最简的USB电路,但这个电路中的type C只是下载接口,而ST官方用STUSB1600来实现OTG功能,可能是一个正常的设计。