代码路径在 android\kernel\msm-5.4\drivers\usb\dwc3\dwc3-msm.c 分析outside LPM的原因
时间: 2023-07-24 17:16:21 浏览: 99
要分析 `dwc3-msm.c` 中 "outside LPM" 的原因,可以查看该文件中与 LPM(低功耗模式)相关的代码。
1. 首先,打开 `dwc3-msm.c` 文件,可以在路径 `android\kernel\msm-5.4\drivers\usb\dwc3` 下找到该文件。
2. 在文件中找到 `dwc3_msm_suspend()` 函数,该函数用于处理 USB 控制器的挂起操作。
3. 在该函数中,搜索与 LPM 相关的代码片段。这些代码通常涉及将控制器设置为低功耗模式以降低功耗。
4. 查找任何可能导致 "outside LPM" 的条件或错误检查。这可能包括检查外部设备的状态或特定的硬件限制。
5. 阅读相关代码和注释,以了解为什么 LPM 无法被启用或中止。这可能涉及到硬件兼容性问题、外部设备不支持 LPM、硬件配置错误等。
6. 如果在代码中找不到明确的解释,可以参考相关的硬件文档、内核文档或其他相关资料,以获取有关该问题的更多信息。
需要注意的是,分析与 LPM 相关的问题需要对代码和相关硬件有一定的了解。因此,在进行分析之前,请确保您对相关技术和概念有一定的了解,或者参考相关专业人士的建议和文档。
相关问题
代码路径在 android\kernel\msm-5.4\drivers\usb\dwc3\dwc3-msm.c 分析outside LPM的原因,dwc->in_lpm的值怎么理解
`dwc3-msm.c` 中的 `dwc->in_lpm` 是一个变量,用于表示 dwc3 控制器是否处于低功耗模式(LPM)。
要理解 `dwc->in_lpm` 的含义,可以按照以下步骤进行分析:
1. 打开 `dwc3-msm.c` 文件,该文件位于路径 `android\kernel\msm-5.4\drivers\usb\dwc3` 下。
2. 在文件中搜索 `dwc->in_lpm` 变量的引用。
3. 查看对该变量的赋值和使用。这可能涉及到在控制器的不同状态(如挂起、恢复等)下对该变量进行设置和更新。
4. 注意查看与 "outside LPM" 相关的代码段。这可能包括检查 `dwc->in_lpm` 的值以确定控制器是否处于 LPM 状态。
根据代码的上下文,可以推测 `dwc->in_lpm` 的可能取值和含义:
- 如果 `dwc->in_lpm` 的值为 0,则表示 dwc3 控制器当前不处于低功耗模式(outside LPM)。
- 如果 `dwc->in_lpm` 的值为 1,则表示 dwc3 控制器当前处于低功耗模式(inside LPM)。
根据您提供的错误消息 "`Abort PM suspend!! (USB is outside LPM)`",可以推断在执行电源管理挂起操作时,检测到 `dwc->in_lpm` 的值为 0,表示控制器不在 LPM 状态,导致挂起操作被中止。
需要注意的是,具体的实现可能因硬件、驱动程序版本或内核版本而有所不同。因此,为了更准确地理解 `dwc->in_lpm` 的含义和代码中 "outside LPM" 的原因,建议查阅相关的硬件文档、内核文档或其他相关资料,以获取更详细的信息。
struct dwc3_msm 结构体分析
`struct dwc3_msm` 是 Qualcomm 移动平台上用于 USB3.0 控制器的驱动程序中定义的结构体,其定义如下:
```c
struct dwc3_msm {
struct device *dev;
void __iomem *base;
struct reset_control *core_reset;
struct reset_control *iface_reset;
struct clk *iface_clk;
struct clk *iface_clk_ref;
struct regulator *vddio;
struct regulator *vdd;
struct gpio_desc *vbus_id_gpio;
struct gpio_desc *vbus_valid_gpio;
bool is_ulpi;
bool is_device;
bool is_host;
bool is_otg;
bool has_lpm_erratum;
bool has_lpm_exit_erratum;
bool has_req_exit_erratum;
bool has_lpm_nyet_erratum;
bool has_lpm_response_erratum;
bool has_lpm_retry_erratum;
bool has_lpm_ack_erratum;
bool has_lpm_sts_erratum;
bool has_lpm_incomplete_erratum;
u32 max_speed;
bool no_vbus;
bool no_p1u;
bool no_p2u;
bool no_p3u;
bool no_p3d;
bool no_hibernation;
bool no_lpm;
bool no_lpm_remote_wakeup;
bool no_lpm_erratum_wa;
bool no_lpm_exit_erratum_wa;
bool no_req_exit_erratum_wa;
bool no_lpm_nyet_erratum_wa;
bool no_lpm_response_erratum_wa;
bool no_lpm_retry_erratum_wa;
bool no_lpm_ack_erratum_wa;
bool no_lpm_sts_erratum_wa;
bool no_lpm_incomplete_erratum_wa;
bool no_lpm_erratum;
bool no_lpm_exit_erratum;
bool no_req_exit_erratum;
bool no_lpm_nyet_erratum;
bool no_lpm_response_erratum;
bool no_lpm_retry_erratum;
bool no_lpm_ack_erratum;
bool no_lpm_sts_erratum;
bool no_lpm_incomplete_erratum;
struct phy *phy;
struct dwc3_lpm_timing_parameters lpm_timing;
struct dwc3_lpm_parameters lpm_parameters;
bool force_b_host;
bool force_b_device;
bool force_b_srp;
};
```
其中,成员变量的含义如下:
- `struct device *dev`: 指向该设备的 struct device 结构体。
- `void __iomem *base`: USB3.0 控制器的寄存器基地址。
- `struct reset_control *core_reset`: 控制 USB3.0 核心复位的 reset 控制器。
- `struct reset_control *iface_reset`: 控制 USB3.0 接口复位的 reset 控制器。
- `struct clk *iface_clk`: USB3.0 接口时钟。
- `struct clk *iface_clk_ref`: USB3.0 接口参考时钟。
- `struct regulator *vddio`: 用于控制 USB3.0 VDDIO 电源的 regulator。
- `struct regulator *vdd`: 用于控制 USB3.0 VDD 电源的 regulator。
- `struct gpio_desc *vbus_id_gpio`: 用于检测 USB3.0 的 VBUS 和 ID 信号的 GPIO 描述符。
- `struct gpio_desc *vbus_valid_gpio`: 用于检测 USB3.0 的 VBUS_VALID 信号的 GPIO 描述符。
- `bool is_ulpi`: 表示 USB3.0 是否使用 ULPI 接口。
- `bool is_device`: 表示 USB3.0 是否为设备模式。
- `bool is_host`: 表示 USB3.0 是否为主机模式。
- `bool is_otg`: 表示 USB3.0 是否为 OTG 模式。
- `bool has_lpm_erratum`: 表示 USB3.0 控制器是否存在低功耗模式(LPM)的错误。
- `bool has_lpm_exit_erratum`: 表示 USB3.0 控制器是否存在 LPM 退出的错误。
- `bool has_req_exit_erratum`: 表示 USB3.0 控制器是否存在请求退出 LPM 的错误。
- `bool has_lpm_nyet_erratum`: 表示 USB3.0 控制器是否存在 LPM NYET 的错误。
- `bool has_lpm_response_erratum`: 表示 USB3.0 控制器是否存在 LPM 响应的错误。
- `bool has_lpm_retry_erratum`: 表示 USB3.0 控制器是否存在 LPM 重试的错误。
- `bool has_lpm_ack_erratum`: 表示 USB3.0 控制器是否存在 LPM ACK 的错误。
- `bool has_lpm_sts_erratum`: 表示 USB3.0 控制器是否存在 LPM 状态的错误。
- `bool has_lpm_incomplete_erratum`: 表示 USB3.0 控制器是否存在 LPM 不完整的错误。
- `u32 max_speed`: 表示 USB3.0 的最大速度。
- `bool no_vbus`: 表示 USB3.0 是否没有 VBUS。
- `bool no_p1u`: 表示 USB3.0 是否不支持 P1U。
- `bool no_p2u`: 表示 USB3.0 是否不支持 P2U。
- `bool no_p3u`: 表示 USB3.0 是否不支持 P3U。
- `bool no_p3d`: 表示 USB3.0 是否不支持 P3D。
- `bool no_hibernation`: 表示 USB3.0 是否不支持 Hibernation。
- `bool no_lpm`: 表示 USB3.0 是否不支持 LPM。
- `bool no_lpm_remote_wakeup`: 表示 USB3.0 是否不支持 LPM 远程唤醒。
- `bool no_lpm_erratum_wa`: 表示 USB3.0 是否不支持 LPM 错误的 Workaround。
- `bool no_lpm_exit_erratum_wa`: 表示 USB3.0 是否不支持 LPM 退出错误的 Workaround。
- `bool no_req_exit_erratum_wa`: 表示 USB3.0 是否不支持请求退出 LPM 的错误 Workaround。
- `bool no_lpm_nyet_erratum_wa`: 表示 USB3.0 是否不支持 LPM NYET 错误的 Workaround。
- `bool no_lpm_response_erratum_wa`: 表示 USB3.0 是否不支持 LPM 响应错误的 Workaround。
- `bool no_lpm_retry_erratum_wa`: 表示 USB3.0 是否不支持 LPM 重试错误的 Workaround。
- `bool no_lpm_ack_erratum_wa`: 表示 USB3.0 是否不支持 LPM ACK 错误的 Workaround。
- `bool no_lpm_sts_erratum_wa`: 表示 USB3.0 是否不支持 LPM 状态错误的 Workaround。
- `bool no_lpm_incomplete_erratum_wa`: 表示 USB3.0 是否不支持 LPM 不完整错误的 Workaround。
- `bool no_lpm_erratum`: 表示 USB3.0 是否不支持 LPM 错误。
- `bool no_lpm_exit_erratum`: 表示 USB3.0 是否不支持 LPM 退出错误。
- `bool no_req_exit_erratum`: 表示 USB3.0 是否不支持请求退出 LPM 的错误。
- `bool no_lpm_nyet_erratum`: 表示 USB3.0 是否不支持 LPM NYET 错误。
- `bool no_lpm_response_erratum`: 表示 USB3.0 是否不支持 LPM 响应错误。
- `bool no_lpm_retry_erratum`: 表示 USB3.0 是否不支持 LPM 重试错误。
- `bool no_lpm_ack_erratum`: 表示 USB3.0 是否不支持 LPM ACK 错误。
- `bool no_lpm_sts_erratum`: 表示 USB3.0 是否不支持 LPM 状态错误。
- `bool no_lpm_incomplete_erratum`: 表示 USB3.0 是否不支持 LPM 不完整错误。
- `struct phy *phy`: 指向 USB3.0 PHY 的结构体。
- `struct dwc3_lpm_timing_parameters lpm_timing`: LPM 时序参数。
- `struct dwc3_lpm_parameters lpm_parameters`: LPM 参数。
- `bool force_b_host`: 是否强制 USB3.0 为 B-Host。
- `bool force_b_device`: 是否强制 USB3.0 为 B-Device。
- `bool force_b_srp`: 是否强制 USB3.0 为 B-SRP。