⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udc.patch

📁 patches for linux-2.6.
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+					              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 + -