API GUIDE / USB_PHY / HAL
USB PHY HAL 接口
1. USB PHY HAL 接口规范
头文件:
#include "hal_usb_phy.h"
1.1 hal_usb_phy_init
void hal_usb_phy_init(void);
功能说明:
通过 CPM 和 PHY 寄存器执行 PHY POR、UTMI reset、默认 IDDIG 配置和基础 PHY 参数初始化。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
| 无 | - | - | 固定操作 USB_PHY 和 CPM。 |
返回值表:
| 返回值 | 说明 |
|---|---|
| 无 | 内部失败只记录日志,不向调用方返回。 |
当前实现顺序:
- 写 CPM
USBPCR1 = 0x00000000。 - 写 CPM
USBPCR = 0x00400000,置位POR[22]。 - 延时 10 us。
- 写 CPM
USBPCR = 0x00000000,释放 POR。 - 写 CPM
USBPCR1 = 0x30000000,置位DPPD_EN[29]和DMPD_EN[28]。 - 清除 CPM
USBRDT.UTMI_RST[27],assert UTMI reset。 - 延时 550 us。
- 置位
USBRDT.UTMI_RST[27],release UTMI reset。 - 根据编译期配置选择默认模式:
- 定义
CONFIG_USB_DUAL_ROLE或CONFIG_USB_PERIPHERAL时为 Peripheral; - 否则为 Host。
- 定义
- 延时 10 us。
- 设置 PHY
RX_SQUELCH_TRIGGER为USB_PHY_RX_SQUELCH_TRIGGER_125MV,字段值0x8。 - 置位
OTG_SESSION.IO_HIGH_Z[5]。 - 清除
PHY_DETECT.LEGACY_CONFIG[3]。 - 若定义
CONFIG_USB_DISABLE_VBUS,置位VBUS_CONTROL.DETECT_POWERDOWN[3]。
补充说明:
- 本接口执行 CPM
USBPCR/USBPCR1全寄存器写,不是字段读改写。 - 本接口不显式 ungated USB PHY 参考时钟;通过 MID 使用时,
phy_reset先于phy_init执行并完成 refclk ungated。 - 本接口失败时立即返回,前面已经写入的寄存器保持生效,可能留下部分初始化状态。
- 重复调用会重新执行 POR 和 UTMI reset,不能用于运行中无扰调整。
- 本接口不会配置 DWC2 控制器、OTG 门控、USB IRQ 或 VBUS 电源 GPIO。
1.2 hal_usb_phy_reset
void hal_usb_phy_reset(void);
功能说明:
ungated USB PHY 参考时钟、释放 CPM 强制 suspend,并等待 PHY 稳定。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
| 无 | - | - | 固定操作 CPM OPCR.GATE_USBPHY_CLK[23] 和 OPCR.SPENDN0[7]。 |
返回值表:
| 返回值 | 说明 |
|---|---|
| 无 | 失败只记录日志。 |
当前实现顺序:
- 清除
OPCR.GATE_USBPHY_CLK[23],ungated PHY 参考时钟。 - 置位
OPCR.SPENDN0[7],释放强制 suspend。 - 延时 550 ms。
补充说明:
- 函数名中的 “reset” 不表示执行 PHY POR、UTMI reset 或 DWC2 core reset;完整 PHY 初始化动作在
hal_usb_phy_init()。 - 本接口成功后不会重新 gate 参考时钟。
- 若释放 suspend 失败,会尝试重新 gate 参考时钟,然后返回。
- 本接口有 550 ms 阻塞延时,不得在中断上下文调用。
1.3 hal_usb_phy_suspend
void hal_usb_phy_suspend(int suspend, int wakeup);
功能说明:
根据 suspend 进入或退出 PHY 强制 suspend,并同步配置 VBUS detect 和 legacy receiver driver。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
suspend |
int |
输入 | 非 0 进入 suspend;0 恢复。 |
wakeup |
int |
输入 | 保留参数,当前实现完全忽略。 |
返回值表:
| 返回值 | 说明 |
|---|---|
| 无 | CPM 操作失败时记录 error log。 |
suspend != 0 时:
- 若未定义
CONFIG_USB_DISABLE_VBUS,置位VBUS_CONTROL.DETECT_POWERDOWN[3]。 - 清除
PLL_CONTROL0.LEGACY_RECEIVER_DRIVER[6]。 - 清除 CPM
OPCR.SPENDN0[7],强制 PHY suspend。
suspend == 0 时:
- 置位 CPM
OPCR.SPENDN0[7],释放强制 suspend。 - 若该步骤失败,立即返回,不恢复 receiver/VBUS detect。
- 置位
PLL_CONTROL0.LEGACY_RECEIVER_DRIVER[6]。 - 若未定义
CONFIG_USB_DISABLE_VBUS,清除VBUS_CONTROL.DETECT_POWERDOWN[3]。
补充说明:
wakeup当前不改变硬件行为。- 调用方应确保 USB Core 已停止或准备好停止总线活动。
- 本接口不管理 OTG 控制器门控;MID 在调用本接口后还会关闭/开启 OTG 时钟门。
1.4 hal_usb_phy_resume_status
int hal_usb_phy_resume_status(void);
功能说明:
兼容 MID 的 PHY resume 状态查询回调。
参数表:无。
返回值表:
| 返回值 | 说明 |
|---|---|
0 |
当前实现始终返回 0。 |
补充说明:
- 当前实现不读取 PHY、CPM 或 DWC2 的 resume 状态寄存器。
- 应用不能使用该接口判断 USB 是否完成 resume;应使用 DWC2
WKUPINT、DSTS或 USB MID 状态。 - 函数可在中断相关 MID 路径调用,因为当前仅返回常量。
1.5 hal_usb_phy_set_mode
int hal_usb_phy_set_mode(enum otg_phy_mode mode);
功能说明:
通过 CPM IDDIG override 选择 Peripheral、Host 或硬件 OTG 模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
mode |
enum otg_phy_mode |
输入 | OTG_PHY_MODE_PERIPHERAL、OTG_PHY_MODE_HOST 或 OTG_PHY_MODE_OTG。 |
返回值表:
| 返回值 | 说明 |
|---|---|
0 |
设置成功。 |
-1 |
mode 非法或 CPM 辅助函数返回错误。 |
模式映射:
| 模式 | CPM 操作 |
|---|---|
| Peripheral | 置位 IDDIG_EN[1],设置 IDDIG_REG[0]=1(mini-B)。 |
| Host | 置位 IDDIG_EN[1],设置 IDDIG_REG[0]=0(mini-A)。 |
| OTG | 清除 IDDIG_EN[1],由 PHY UTMI IDDIG 信号决定。 |
补充说明:
- 返回
-1不等同于某个标准 errno。 - 本接口只控制 IDDIG;DWC2 角色切换仍由控制器或 MID 完成。
- 不要在传输中调用。切换后应由上层等待实际模式生效。
1.6 hal_usb_phy_power_detect
enum usb_device_power hal_usb_phy_power_detect(void);
功能说明:
使用 PHY BC1.1 detect 控制执行 data contact、Primary 和 Secondary 检测。
参数表:无。
返回值表:
| 返回值 | 判定条件 |
|---|---|
USB_POWER_UNKNOWN |
20 ms 后未检测到 data contact。 |
USB_POWER_SDP |
data contact 成功,Primary 失败。 |
USB_POWER_DCP |
data contact、Primary、Secondary 全部成功。 |
USB_POWER_CDP |
data contact、Primary 成功,Secondary 失败。 |
当前实现顺序:
- 写
PLL_CONTROL1 = USB_PHY_BC_DETECT_CONTROL_DATA_CONTACT (0x60)。 - 延时 20 ms,读取
VBUS_VALID_CONTROL.BC_DATA_CONTACT_STATUS[5]。 - 数据接触成立后写
PLL_CONTROL1 = USB_PHY_BC_DETECT_CONTROL_PRIMARY (0x90)。 - 延时 20 ms,读取
SESSION_VALID_CONTROL.BC_PRIMARY_STATUS[1]。 - Primary 成立后写
PLL_CONTROL1 = USB_PHY_BC_DETECT_CONTROL_SECONDARY (0x0C)。 - 延时 20 ms,读取
SESSION_VALID_CONTROL.BC_SECONDARY_STATUS[0]。 - 无论结果如何,最后写
PLL_CONTROL1 = USB_PHY_BC_DETECT_CONTROL_IDLE (0x00)。
阻塞时间:
| 路径 | 最大阻塞时间 |
|---|---|
| data contact 失败 | 20 ms |
| Primary 失败 | 40 ms |
| 执行完整 Secondary 检测 | 60 ms |
补充说明:
- 本接口对
PLL_CONTROL1做全寄存器写。 - PHY 必须已上电、参考时钟有效并连接到可执行 BC1.1 检测的下游端口。
- 本接口不改变 USB 数据角色,也不判断主机是否开始枚举。
- 不应与
ll_usb_phy_write_bc_detect_control()或其他 BC detect 用户并发执行。
1.7 hal_usb_phy_regs_dump
error_code_t hal_usb_phy_regs_dump(void);
功能说明:
以 INFO 日志打印 USB PHY 地址和全部已命名寄存器。
参数表:无。
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
已输出寄存器。 |
IM_ERR_UNSUPPORTED |
两个 debug helper 开关未同时开启。 |
输出寄存器顺序:
0x030 TX_PRE_EMPHASIS
0x040 TX_HS_PRE_EMPHASIS
0x044 RX_CLOCK_PHASE
0x048 TX_CLOCK_PHASE
0x060 DISCONNECT_TRIGGER
0x064 RX_SQUELCH_TRIGGER
0x068 DISCONNECT_TRIGGER_EXT
0x070 PHY_DETECT
0x078 OTG_SESSION
0x0A0 BG_CONTROL
0x100 PLL_CONTROL0
0x104 PLL_CONTROL1
0x108 VBUS_CONTROL
0x10C SESSION_VALID_CONTROL
0x110 VBUS_VALID_CONTROL
0x114 CLOCK_ENABLE
0x11C HS_ODT_FSLS_STRENGTH
0x120 SQUELCH_SLEW_TUNING
0x124 HS_EYE_HEIGHT
0x1C0 DPDM_PULLDOWN_CONTROL
0x1C4 PLL_WAVE_FILTER
0x1CC SOF_DISCONNECT_CONTROL
补充说明:
- 需要同时定义非 0 的
CONFIG_SDK_ENABLE_DEBUG_HELPERS和CONFIG_USB_PHY_ENABLE_DEBUG_HELPERS。 - 本接口只读寄存器,不读取 FIFO 或修改硬件状态。
- 本接口是阻塞日志接口,不得在中断上下文调用。
2. CPM USB HAL 接口规范
头文件:
#include "hal_cpm_usb.h"
这些接口是 USB PHY 驱动的一部分,不是通用 CPM HAL 的全部接口。
2.1 参考时钟控制
2.1.1 hal_cpm_usb_phy_enable_refclk
error_code_t hal_cpm_usb_phy_enable_refclk(void);
功能说明:
清除 CPM OPCR.GATE_USBPHY_CLK[23],使能 24 MHz USB PHY 参考时钟。
参数表:无。
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
当前实现始终返回。 |
补充说明:该接口不等待时钟稳定,也不确认硬件门控状态。
2.1.2 hal_cpm_usb_phy_disable_refclk
error_code_t hal_cpm_usb_phy_disable_refclk(void);
功能说明:
置位 CPM OPCR.GATE_USBPHY_CLK[23],关闭 USB PHY 参考时钟。
参数表:无。
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
当前实现始终返回。 |
补充说明:PHY 寄存器访问期间或 PHY 仍需工作时不得 gate 参考时钟。
2.2 PHY 强制挂起
2.2.1 hal_cpm_usb_phy_set_suspend
error_code_t hal_cpm_usb_phy_set_suspend(bool suspend);
功能说明:
通过 CPM OPCR.SPENDN0[7] 强制或释放 USB PHY suspend。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
suspend |
bool |
输入 | true 强制 suspend;false 释放。 |
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
当前实现始终返回。 |
硬件电平:
| 参数 | SPENDN0[7] |
含义 |
|---|---|---|
true |
0 | USB PHY 被强制进入 suspend。 |
false |
1 | USB PHY 不处于强制 suspend。 |
2.3 USBPCR/USBPCR1 参数控制
2.3.1 hal_cpm_usb_phy_write_parameter_control
error_code_t hal_cpm_usb_phy_write_parameter_control(uint32_t value);
功能说明:
将 value 完整写入 CPM USBPCR (0x03C)。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
value |
uint32_t |
输入 | USBPCR 原始值。 |
返回值表:IM_OK。
补充说明:全寄存器写。除非明确知道全部字段值,否则应使用 CPM LL 的单 bit 接口。
2.3.2 hal_cpm_usb_phy_read_parameter_control
error_code_t hal_cpm_usb_phy_read_parameter_control(uint32_t *value_out);
功能说明:
读取 CPM USBPCR。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
value_out |
uint32_t * |
输出 | 原始值输出,不能为 NULL。 |
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
读取成功。 |
IM_ERR_INVALID_PARAM |
value_out == NULL。 |
2.3.3 hal_cpm_usb_phy_write_parameter_control1
error_code_t hal_cpm_usb_phy_write_parameter_control1(uint32_t value);
功能说明:
将 value 完整写入 CPM USBPCR1 (0x048)。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
value |
uint32_t |
输入 | USBPCR1 原始值。 |
返回值表:IM_OK。
补充说明:全寄存器写;hal_usb_phy_init() 使用该接口写入 0x30000000 和 0x00000000。
2.3.4 hal_cpm_usb_phy_read_parameter_control1
error_code_t hal_cpm_usb_phy_read_parameter_control1(uint32_t *value_out);
功能说明:
读取 CPM USBPCR1。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
value_out |
uint32_t * |
输出 | 原始值输出,不能为 NULL。 |
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
读取成功。 |
IM_ERR_INVALID_PARAM |
value_out == NULL。 |
2.4 UTMI 复位
2.4.1 hal_cpm_usb_phy_assert_utmi_reset
error_code_t hal_cpm_usb_phy_assert_utmi_reset(void);
功能说明:
清除 CPM USBRDT.UTMI_RST[27],assert UTMI reset。
参数表:无。
返回值表:IM_OK。
2.4.2 hal_cpm_usb_phy_release_utmi_reset
error_code_t hal_cpm_usb_phy_release_utmi_reset(void);
功能说明:
置位 CPM USBRDT.UTMI_RST[27],release UTMI reset。
参数表:无。
返回值表:IM_OK。
补充说明:UTMI_RST 为 0 时保持 reset,为 1 时释放 reset。调用方负责 assert/release 之间的 PHY 时序延时。
2.5 IDDIG 模式控制
2.5.1 hal_cpm_usb_phy_force_iddig
error_code_t hal_cpm_usb_phy_force_iddig(bool peripheral);
功能说明:
使能 CPM IDDIG override 并设置 IDDIG 电平。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
peripheral |
bool |
输入 | true 为 mini-B/peripheral;false 为 mini-A/host。 |
返回值表:IM_OK。
peripheral |
IDDIG_EN[1] |
IDDIG_REG[0] |
|---|---|---|
true |
1 | 1 |
false |
1 | 0 |
2.5.2 hal_cpm_usb_phy_release_iddig
error_code_t hal_cpm_usb_phy_release_iddig(void);
功能说明:
清除 CPM USBRDT.IDDIG_EN[1],释放 software override,使用 PHY UTMI IDDIG。
参数表:无。
返回值表:IM_OK。
2.6 CPM 寄存器调试输出
2.6.1 hal_cpm_usb_phy_regs_dump
error_code_t hal_cpm_usb_phy_regs_dump(void);
功能说明:
打印 USB PHY 控制相关的四个 CPM 寄存器。
参数表:无。
返回值表:
| 返回值 | 说明 |
|---|---|
IM_OK |
已输出寄存器。 |
IM_ERR_UNSUPPORTED |
Debug helper 未同时开启。 |
输出内容:
| 地址 | 寄存器 |
|---|---|
0x024 |
OPCR |
0x03C |
USBPCR |
0x040 |
USBRDT |
0x048 |
USBPCR1 |