📄 udc.patch
字号:
+ pEvt_mask);+ }+ }+ else if (IS_BIT_SET (OTG_STS_ID, uoc_status)) {++ /* ID pin not connected: disable */+ /* muxer -> neutral */++ if (OTG_STATE_NO_B_DEVICE_B !=+ otg->transceiver.state) {+ CHANGE_STATE (otg,+ OTG_STATE_NO_B_DEVICE_B,+ pEvt_mask);+ }+ }+ }+ else if ((OTG_STATE_NO_B_DEVICE_A ==+ otg->transceiver.state) ||+ (OTG_STATE_NO_B_DEVICE_B ==+ otg->transceiver.state)) {++ /* Exit "not ready" state */+ /* ---------------------- */++ RES_EVENT (OTG_GADGET_READY, event_code);+ CHANGE_STATE (otg, OTG_STATE_UNDEFINED, pEvt_mask);+ }++ /* ================================================== */++ else if (IS_BIT_RES (OTG_STS_ID, uoc_status)) {++ /* ID pin connected: A-device */+ /* muxer -> host */++ CHANGE_STATE (otg, OTG_STATE_A_IDLE, pEvt_mask);+ }+ else {++ /* ID pin is not connected: B-device */+ /* muxer -> device (peripheral) */++ RES_FLAG (otg, OTG_A_VBUS_FAILED);+ CHANGE_STATE (otg, OTG_STATE_B_IDLE, pEvt_mask);+ }+ break;++ /* A: ID pin is connected, A-device drives VBus */+ /* ============================================ */++ case OTG_STATE_A_IDLE :++ /* A_IDLE: start state for A-devices */+ /* no VBus, no device connect, no activity */++ CHECK_STATE (otg, OTG_STATE_A_IDLE, pEvt_mask);++ if (IS_BIT_SET (OTG_STS_ID, uoc_status)) {++ /* ID pin changed => B_IDLE */+ /* Switch muxer, set state */++ RES_EVENT (OTG_INT_IDC, event_code);+ RES_FLAG (otg, OTG_A_VBUS_FAILED);+ CHANGE_STATE (otg, OTG_STATE_B_IDLE, pEvt_mask);+ }+ else if (IS_FLAG_RES (otg, OTG_A_BUS_DROP) &&+ (IS_FLAG_SET (otg, OTG_A_BUS_REQ) ||+ detect_srp (otg, uoc_status,+ event_code, pEvt_mask))) {++ /* Srp detect | bus request => A_WAIT_VRISE */+ /* VBus on, start VRise timer, set state */++ SET_OTG_TIMER_LONG (otg, A_WAIT_VRISE);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_VRISE, pEvt_mask);+ }+ else if (IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ RES_FLAG (otg, OTG_A_BUS_DROP);+ }+ break;++ case OTG_STATE_A_WAIT_VRISE :++ /* A_WAIT_VRISE: A-device waits for VBus valid */+ /* drive VBus, no device connect, no activity */++ CHECK_STATE (otg, OTG_STATE_A_WAIT_VRISE, pEvt_mask);++ if (IS_BIT_SET ((OTG_STS_ID | OTG_STS_VBUSVLD), uoc_status) ||+ GOT_EVENT (OTG_INT_TMX, event_code) ||+ IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ /* ID change | VBus valid | VRise TO | Bus drop req */+ /* => A_WAIT_BCON */+ /* Start BCon timer, set state */++ RES_EVENT (OTG_INT_TMX, event_code);++ /* Spec notice: don`t need to have a TO condition */+ /* here, the host just waits for a */+ /* (#01) device connect or ID change */++ /* (#01) s...g (dev, OTG_TMR_A_WAIT_BCON); */+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON, pEvt_mask);+ }+ break;++ case OTG_STATE_A_WAIT_BCON :++ /* A_WAIT_BCON: A-device waits for B-device connect */+ /* drive VBus, no device connect, no activity */++ CHECK_STATE (otg, OTG_STATE_A_WAIT_BCON, pEvt_mask);++ if (IS_BIT_SET (OTG_STS_ID, uoc_status) ||+ GOT_EVENT (OTG_INT_TMX, event_code) ||+ IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ /* ID change | BCon TO | Bus drop req */+ /* => A_WAIT_VFALL */+ /* Stop timer, turn off VBus, set state */++ RES_EVENT ((OTG_INT_IDC | OTG_INT_TMX), event_code);+ RES_FLAG (otg, OTG_A_BUS_DROP);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_VFALL_DN,+ pEvt_mask);+ }+ else if (IS_BIT_RES (OTG_STS_VBUSVLD, uoc_status)) {++ RES_EVENT (OTG_INT_VBVC, event_code);+ if (OTG_STATE_A_WAIT_BCON_VB !=+ otg->transceiver.state) {++ /* VBus drop => start timer and re-check */++ RES_EVENT (OTG_INT_TMX, event_code);+ SET_OTG_TIMER (otg, A_BCON_VB);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON_VB,+ pEvt_mask);+ }+ else if (GOT_EVENT (OTG_INT_TMX, event_code)) {++ /* VBus drop => A_VBUS_ERR */+ /* Stop timer, turn off VBus, set state */++ RES_EVENT (OTG_INT_TMX, event_code);+ CHANGE_STATE (otg, OTG_STATE_A_VBUS_ERR,+ pEvt_mask);+ }+ }+ else if (IS_BIT_SET (OTG_STS_PCON, uoc_status)) {++ /* Port connect => A_HOST */+ /* Stop timer, set state */++ RES_EVENT (OTG_INT_PCC, event_code);+ CHANGE_STATE (otg, OTG_STATE_A_HOST, pEvt_mask);++ }+ else if (OTG_STATE_A_WAIT_BCON_VB ==+ otg->transceiver.state) {+ CHECK_STATE (otg, OTG_STATE_A_WAIT_BCON_VB, pEvt_mask);+ RES_EVENT (OTG_INT_TMX, event_code);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON, pEvt_mask);+ }+ break;++ case OTG_STATE_A_HOST :++ /* A_HOST: B-peripheral connected, ready for USB ops */+ /* drive VBus, bus is activ (SOF) */++ CHECK_STATE (otg, OTG_STATE_A_HOST, pEvt_mask);++ if (IS_BIT_RES (OTG_STS_VBUSVLD, uoc_status)) {++ /* VBus drop => A_VBUS_ERR */+ /* Turn off VBus, set state */+ + RES_EVENT (OTG_INT_VBVC, event_code);+ reset_b_hnp_enable (otg);+ CHANGE_STATE (otg, OTG_STATE_A_VBUS_ERR, pEvt_mask);+ }+ else if (IS_BIT_SET (OTG_STS_ID, uoc_status) ||+ IS_BIT_RES (OTG_STS_PCON, uoc_status) ||+ IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ /* ID change | Port dc => A_WAIT_BCON */+ /* Set state */++ RES_EVENT ((OTG_INT_IDC | OTG_INT_PCC), event_code);+ reset_b_hnp_enable (otg);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON, pEvt_mask);+ }+ /* Spec issue: don't want an immediate resume here so the */+ /* OTG_A_BUS_REQ flag can't be checked ! */+ /* (#02) suspend/resume handling should be under HC control */++ /* (#02) if (IS_BIT_SET (OTG_STS_PSUS, uoc_status) || */+ /* (#02) IS_BIT_RES (OTG_A_BUS_REQ, */+ /* otg->transceiver.params)) { */+ else if (IS_BIT_SET (OTG_STS_PSUS, uoc_status)) { /* (#02) */++ /* Port suspend | Bus drop req => A_SUSPEND */+ /* Start disconnect timer, set state */++ RES_EVENT (OTG_INT_PSC, event_code);+ /* (#02) RES_FLAG (otg, OTG_A_BUS_REQ); */++ /* Spec notice: load the disconnect wait timer only if HNP */+ /* is enabled, otherwise don't end the session */+ /* (#03) on A_AIDL_BDIS_TO */++#ifndef CONFIG_USB_OTG_ALWAYS_END_SESSION /* (#3) */+ if (is_b_hnp_enabled (otg)) /* (#3) */+#endif /* (#3) */+ SET_OTG_TIMER_LONG (otg, A_IDLE_BDIS); /* (#3) */++ CHANGE_STATE (otg, OTG_STATE_A_SUSPEND, pEvt_mask);+ }+#ifdef VERBOSE+ else {+ if (!(OTG_STS_PSPD & uoc_status)) {+ DBG (" port is in HIGH_SPEED\n");+ }+ else if (OTG_STS_PSPD_LS & uoc_status) {+ DBG (" port is in LOW_SPEED\n");+ }+ else {+ DBG (" port is in FULL_SPEED\n");+ }+ }+#endif+ break;++ case OTG_STATE_A_SUSPEND :++ /* A_SUSPEND: B-peripheral connected, port suspended */+ /* drive VBus, no bus activity */++ CHECK_STATE (otg, OTG_STATE_A_SUSPEND, pEvt_mask);++ if (IS_BIT_SET (OTG_STS_ID, uoc_status) ||+ IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ /* ID change | Bus drop req | B discon. TO */+ /* => A_WAIT_VFALL */+ /* Turn off VBus, stop timer, set state */++ RES_EVENT ((OTG_INT_IDC | OTG_INT_TMX), event_code);+ reset_b_hnp_enable (otg);+ RES_FLAG (otg, OTG_A_BUS_DROP);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_VFALL_DN,+ pEvt_mask);+ }+ else if (IS_BIT_RES (OTG_STS_VBUSVLD, uoc_status)) {++ /* VBus drop => A_VBUS_ERR */+ /* Turn off VBus, set state */++ RES_EVENT ((OTG_INT_VBVC | OTG_INT_TMX), event_code);+ reset_b_hnp_enable (otg);+ CHANGE_STATE (otg, OTG_STATE_A_VBUS_ERR,+ pEvt_mask);+ }+ else if (IS_BIT_RES (OTG_STS_PCON, uoc_status)) {++ if (is_b_hnp_enabled (otg)) {++ /* HNP enabled & B discon. => A_PERIPHERAL */+ /* Enable device, set state */++ RES_EVENT ((OTG_INT_PCC | OTG_INT_TMX),+ event_code);+ reset_b_hnp_enable (otg);+ CHANGE_STATE (otg, OTG_STATE_A_PERIPHERAL,+ pEvt_mask);+#ifndef CONFIG_TEST_MODE_ONLY+ if (otg_gadget_extension.notify) {+ otg_gadget_extension.notify (+ OTG_GADGET_EVT_SVALID);+ }+#endif+ }+ else {+ /* HNP disabled & B discon. => A_WAIT_BCON */+ /* Set state */++ RES_EVENT ((OTG_INT_PCC | OTG_INT_TMX),+ event_code);+ /* (#01) s...g (otg, OTG_TMR_A_WAIT_BCON); */+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON,+ pEvt_mask);+ }+ }+ /* (#02) if (IS_BIT_RES (OTG_STS_PSUS, uoc_status) || */+ /* (#02) IS_BIT_SET (OTG_A_BUS_REQ, */+ /* otg->transceiver.params)) { */+ else if (IS_BIT_RES (OTG_STS_PSUS, uoc_status)) { /* (#02) */++ /* Port resume => A_HOST */+ /* Set state */++ RES_EVENT ((OTG_INT_PSC | OTG_INT_TMX), event_code);+ CHANGE_STATE (otg, OTG_STATE_A_HOST, pEvt_mask);+ }+ else if (GOT_EVENT (OTG_INT_TMX, event_code)) {++ /* B discon. TO => A_WAIT_VFALL */+ /* Turn off VBus, set state */++ RES_EVENT (OTG_INT_TMX, event_code);+ reset_b_hnp_enable (otg);+ RES_FLAG (otg, OTG_A_BUS_DROP);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_VFALL_DN,+ pEvt_mask);+ }+ break;++ case OTG_STATE_A_PERIPHERAL :++ /* A_PERIPHERAL: connected to B-host, responding */+ /* drive VBus, remote bus activity */++ CHECK_STATE (otg, OTG_STATE_A_PERIPHERAL, pEvt_mask);++ if (IS_BIT_SET (OTG_STS_ID, uoc_status) ||+ IS_FLAG_SET (otg, OTG_A_BUS_DROP)) {++ /* ID on | Bus drop req => A_WAIT_VFALL */+ /* Turn off VBus, set state */++ RES_EVENT (OTG_INT_IDC, event_code);+ reset_b_hnp_enable (otg);+ RES_FLAG (otg, OTG_A_BUS_DROP);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_VFALL_DN,+ pEvt_mask);+#ifndef CONFIG_TEST_MODE_ONLY+ if (otg_gadget_extension.notify) {+ otg_gadget_extension.notify (+ OTG_GADGET_EVT_SVDROP);+ }+#endif+ }+ else if (IS_BIT_RES (OTG_STS_VBUSVLD, uoc_status) ||+ GOT_EVENT (OTG_INT_OCD, event_code)) {++ /* VBus off | over-current => A_VBUS_ERR */+ /* Turn off VBus, set state */++ RES_EVENT ((OTG_INT_VBVC | OTG_INT_OCD), event_code);+ reset_b_hnp_enable (otg);+ CHANGE_STATE (otg, OTG_STATE_A_VBUS_ERR, pEvt_mask);+#ifndef CONFIG_TEST_MODE_ONLY+ if (otg_gadget_extension.notify) {+ otg_gadget_extension.notify (+ OTG_GADGET_EVT_SVDROP);+ }+#endif+ }+ else if (OTG_STS_PSUS & uoc_status) {++ /* Port suspended => A_WAIT_BCON */+ /* Set state */++ RES_EVENT ((OTG_INT_PSC | OTG_INT_PCC), event_code);+ SET_OTG_TIMER_LONG (otg, A_WAIT_BCON);+ CHANGE_STATE (otg, OTG_STATE_A_WAIT_BCON, pEvt_mask);+#ifndef CONFIG_TEST_MODE_ONLY+ if (otg_gadget_extension.notify) {+ otg_gadget_extension.notify (+ OTG_GADGET_EVT_SVDROP);+ }+#endif+ }+#ifdef VERBOSE+ else {+ if (!(OTG_STS_PSPD & uoc_status)) {+ DBG (" port is in HIGH_SPEED\n");+ }+ else {+ DBG (" port is in FULL_SPEED\n");+ }+ }+#endif+ break;++ case OTG_STATE_A_WAIT_VFALL :++ /* A_WAIT_VFALL: A-device waits for Session end */+ /* no VBus, no connect, no activity */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -