一个usb设计调试记录

一个usb设计调试记录

需求:
客户板子通过一个gpio控制usb_id来切换host和device状态,通过vbus电压切换usb通路
要求没有vbus电压时候自动使用host模式,扩展hub分别连接usb鼠标、usb触屏、usb摄像头

问题:
device模式okay,host模式时候hub不能识别
一个usb设计调试记录_第1张图片

一个usb设计调试记录_第2张图片

Usb_hs_sel pin没有用到,切换芯片用vbus_usb电控制,现在插usb连电脑识别okay,拔usb后没有识别到鼠标和摄像头,量 pin 1 信号S,插拔usb电平0V和5V说明正常,

Host和device模式的切换根据电路设计打入下面patch:

diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index 6771195..fd2fb0b 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -2538,6 +2538,16 @@ static int dwc3_msm_power_get_property_usb(struct power_supply *psy,
        return 0;
 }
 
+static void set_gpio(int state)
+{
+       printk("xcz ==== enter ==== %d\n", state);
+       //msleep(2000);
+       if (!state)
+               gpio_direction_output(59, 0);
+       else
+               gpio_direction_output(59, 1);
+}
+
 static int dwc3_msm_power_set_property_usb(struct power_supply *psy,
                                  enum power_supply_property psp,
                                  const union power_supply_propval *val)
@@ -2581,7 +2591,7 @@ static int dwc3_msm_power_set_property_usb(struct power_supply *psy,
                break;
        /* Process PMIC notification in PRESENT prop */
        case POWER_SUPPLY_PROP_PRESENT:
-               dev_dbg(mdwc->dev, "%s: notify xceiv event with val:%d\n",
+               dev_err(mdwc->dev, "%s: notify xceiv event with val:%d\n",
                                                        __func__, val->intval);
                /*
                 * Now otg_sm_work() state machine waits for USB cable status.
@@ -2591,6 +2601,7 @@ static int dwc3_msm_power_set_property_usb(struct power_supply *psy,
                 */
                if (mdwc->otg_state == OTG_STATE_UNDEFINED) {
                        mdwc->vbus_active = val->intval;
+                       set_gpio(val->intval);
                        queue_delayed_work(mdwc->dwc3_resume_wq,
                                        &mdwc->resume_work, 0);
                        break;
@@ -2600,6 +2611,7 @@ static int dwc3_msm_power_set_property_usb(struct power_supply *psy,
                        break;
 
                mdwc->vbus_active = val->intval;
+               set_gpio(val->intval);
                if (dwc->is_drd && !mdwc->in_restart) {
                        dbg_event(0xFF, "Q RW (vbus)", val->intval);
                        dbg_event(0xFF, "stayVbus", 0);
@@ -2747,6 +2759,8 @@ static irqreturn_t id_det_irq_handle(int irq, void *data)
 {
        struct dwc3_msm *mdwc = data;
 
+       printk("xcz enter hahaha = %d\n", gpio_get_value(mdwc->id_det_pin));
+
        power_supply_set_usb_otg(&mdwc->usb_psy, gpio_get_value(mdwc->id_det_pin) ? 0 : 1);
        return IRQ_HANDLED;
 }

打入patch后还是有问题,怀疑hub线序不对,找硬件对了下没有问题
量信号:
通断正常
电压正常
问题应该出在hub端口和usb切换芯片中间,继续找原因
一个usb设计调试记录_第3张图片

中间通过了一个hub,怀疑这个hub问题
Hub芯片参考设计:
一个usb设计调试记录_第4张图片
Y1晶振没有电容,怀疑这个电容有影响,客户板子上去掉这个电容,还是无法识别usb 鼠标
一个usb设计调试记录_第5张图片

检查发现板子上面这个器件没有贴,短接这个地方,识别okay。
测试另外几个hub口,usb触屏和usb摄像头功能都正常了

你可能感兴趣的:(驱动开发)