?? usbehcdrhemulation.c
字號:
if (pURB->uTransferLength >= 7 + (uPortBytes * 2))
{
pURB->uTransferLength = 7 + (uPortBytes * 2);
}
/* Copy the data */
OS_MEMCPY(pURB->pTransferBuffer, pBuffer, pURB->uTransferLength);
/* Update the status */
pURB->nStatus = USBHST_SUCCESS;
/* Free memory allocated for the buffer */
OS_FREE(pBuffer);
OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhGetHubDescriptor - Exit\n",0,0,0,0);
return Status;
}
/* End of usbEhcdRhGetHubDescriptor() */
/***************************************************************************
*
* usbEhcdRhGetPortStatus - get the status of the port
*
* This routine gets the status of the port.
*
* RETURNS: USBHST_SUCCESS if the URB is submitted successfully.
* USBHST_INVALID_PARAMETER if the parameters are not valid.
*
* ERRNO:
* None.
*/
USBHST_STATUS usbEhcdRhGetPortStatus
(
pUSB_EHCD_DATA pHCDData, /* Ptr to HCD block */
pUSBHST_URB pURB /* Ptr to User Request Block */
)
{
/* To hold the request status */
USBHST_STATUS Status = USBHST_SUCCESS;
/* Pointer to the setup packet */
pUSBHST_SETUP_PACKET pSetup = NULL;
/* To hold the status of the hub port */
UINT32 uPortStatus = 0;
/*
* This holds the port status which is available in the
* root hub port status buffer
*/
UINT32 uPortStatusAvailable = 0;
OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhGetPortStatus - Entry\n",0,0,0,0);
/* Check the validity of the parameters */
if (NULL == pHCDData ||
NULL == pURB ||
NULL == pURB->pTransferSpecificData ||
NULL == pURB->pTransferBuffer)
{
OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhGetPortStatus - \
Invalid parameters\n",0,0,0,0);
pURB->nStatus = USBHST_INVALID_PARAMETER;
return USBHST_INVALID_PARAMETER;
}
/* Extract the setup packet */
pSetup = (pUSBHST_SETUP_PACKET)pURB->pTransferSpecificData;
/* Check whether the members are valid */
if (pSetup->wIndex >
pHCDData->RHData.uNumDownstreamPorts)
{
OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhGetPortStatus - \
Invalid port index\n",0,0,0,0);
pURB->nStatus = USBHST_INVALID_PARAMETER;
return USBHST_INVALID_PARAMETER;
}
/*
* The hub's port status contains 4 bytes of information, out of which
* the hub's port status is reported in the byte offsets 0 to 1
* and the hub's port status change in the byte offsets 2 to 3
*/
/* Update the port status change bytes - Start */
/*
* Following is the interpretation of the 16 bits of port status change
* Bit 5-15 Reserved
* Bit 4 - Reset change
* Bit 3 - Overcurrent indicator Change
* Bit 2 - Suspend Change
* Bit 1 - Port Enable/Disable change
* Bit 0 - Connect status change
*/
/* Update the overcurrent change bit */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
OVER_CURRENT_CHANGE);
uPortStatus <<= 1;
/*
* Update the suspend change bit
* (ie) 0 since there is no suspend-change indication in EHCI
*/
uPortStatus |= 0;
uPortStatus <<= 1;
/* Store enable/disable change bit */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_ENABLE_CHANGE);
uPortStatus <<= 1;
/* Store connect status change */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
CONNECT_STATUS_CHANGE);
uPortStatus <<= 1;
/* Update the port status change bytes - End */
/* Update the port status bytes - Start */
/*
* Following is the interpretation of the 16 bits of port status
* Bit 13-15 Reserved
* Bit 12- Port indicator displays software controller colour
* Bit 11- Port is in Port Test Mode
* Bit 10- High speed device is attached
* Bit 9 - Low speed device is attached
* Bit 8 - Port is powered on
* Bit 5-7 Reserved
* Bit 4 - Reset signalling asserted
* Bit 3 - An overcurrent condition exists on the port
* Bit 2 - Port is suspended
* Bit 1 - Port is enabled
* Bit 0 - Device is present on the port
*/
/* fill next 3 bits with 0 */
uPortStatus <<= 3;
/* Check whether the port indicator field is set and update the status */
if (0 != USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_INDICATOR_CONTROL))
{
uPortStatus |= 0x01;
}
uPortStatus <<= 1;
/* Check whether the port test mode field is set and update the status */
if (0 != USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_TEST_CONTROL))
{
uPortStatus |= 0x01;
}
uPortStatus <<= 1;
/* Check whether a high speed device is attached and update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_ENABLED_DISABLED);
uPortStatus <<= 1;
/* This cannot be updated as low/ full speed is not supported in Root hub */
if (USBHST_LOW_SPEED == USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
LINE_STATUS))
{
uPortStatus |= 0x01;
}
uPortStatus <<= 1;
/* Check whether the port is powered on and update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_POWER);
uPortStatus <<= 1;
/* Bits 5 to 7 are reserved */
uPortStatus <<= 3;
/* Read the bit indicating whether a reset is asserted. Update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_RESET);
uPortStatus <<= 1;
/*
* Check whether a over current is detected
* in the port and update the status
*/
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
OVER_CURRENT_ACTIVE);
uPortStatus <<= 1;
/* Check whether the port is suspended and update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
SUSPEND);
uPortStatus <<= 1;
/* Check whether the port is enabled and update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
PORT_ENABLED_DISABLED);
uPortStatus <<= 1;
/* Check whether a device is connected and update the status */
uPortStatus |= USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
CURRENT_CONNECT_STATUS);
/* Update the port status bytes - End */
/* Copy the data which is available in the port status */
OS_MEMCPY(&uPortStatusAvailable,
(pHCDData->RHData.pPortStatus + (pSetup->wIndex) - 1),
USB_EHCD_RH_PORT_STATUS_SIZE);
/* Swap the data to LE format */
uPortStatusAvailable = OS_UINT32_LE_TO_CPU(uPortStatusAvailable);
/* Update the port status value */
uPortStatus |= uPortStatusAvailable;
/* Swap the data to CPU format */
uPortStatus = OS_UINT32_CPU_TO_LE(uPortStatus);
/* Copy the port status */
OS_MEMCPY(pURB->pTransferBuffer, &uPortStatus, 4);
/* Update the status of URB */
pURB->nStatus = USBHST_SUCCESS;
OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhGetPortStatus - Exit\n",0,0,0,0);
return Status;
}
/* End of usbEhcdRhGetPortStatus() */
/***************************************************************************
*
* usbEhcdRhSetPortFeature - set the features of the port
*
* This routine sets the features of the port.
*
* RETURNS: USBHST_SUCCESS if the URB is submitted successfully.
* USBHST_INVALID_PARAMETER if the parameters are not valid.
*
* ERRNO:
* None.
*/
USBHST_STATUS usbEhcdRhSetPortFeature
(
pUSB_EHCD_DATA pHCDData, /* Ptr to HCD block */
pUSBHST_URB pURB /* Ptr to User Request Block */
)
{
/* To hold the request status */
USBHST_STATUS Status = USBHST_SUCCESS;
/* Pointer to the setup packet */
pUSBHST_SETUP_PACKET pSetup = NULL;
/* To hold the count value */
UINT32 uCount = 0;
/* WindView Instrumentation */
USB_HCD_LOG_EVENT(
USB_EHCI_WV_PORT_ROUTE,
"usbEhcdRhSetPortFeature() starts",
USB_EHCD_WV_FILTER);
OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhSetPortFeature - Entry\n",0,0,0,0);
/* Check the validity of the parameters */
if (NULL == pHCDData ||
NULL == pURB ||
NULL == pURB->pTransferSpecificData)
{
OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhSetPortFeature - \
Invalid parameters\n",0,0,0,0);
pURB->nStatus = USBHST_INVALID_PARAMETER;
return USBHST_INVALID_PARAMETER;
}
/* Extract the setup packet */
pSetup = (pUSBHST_SETUP_PACKET)pURB->pTransferSpecificData;
/* Switch on the feature to be selected */
switch(pSetup->wValue)
{
case USB_EHCD_RH_PORT_RESET:/* If port reset */
{
/* Attempt port reset only if HC is not halted */
if(0 == USB_EHCD_GET_FIELD(pHCDData,
USBSTS,
HCHALTED))
{
/*
* If a low speed device is detected, change the
* ownership of the port to the companion host controller
*/
if (USBHST_LOW_SPEED == USB_EHCD_GET_FIELD_PORT(pHCDData,
(pSetup->wIndex)- 1,
LINE_STATUS))
{
/* WindView Instrumentation */
USB_HCD_LOG_EVENT(
USB_EHCI_WV_PORT_ROUTE,
"SetPortFeature : Low speed device detected",
USB_EHCD_WV_FILTER);
OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhSetPortFeature - \
Port being handed over\n",0,0,0,0);
/*
* Release ownership of the port
* to the companion controller
*/
USB_EHCD_SET_BIT_PORT(pHCDData,
((pSetup->wIndex) -1),
PORT_OWNER);
}
/* A high/Full speed device is attached */
else
{
/*
* At this point, it is not known whether
* the connected device is a full/ high speed device.
* After giving a port reset, if the port is enabled,
* then a high speed device is connected. If it is
* not enabled, then a full speed device is
* connected.
*/
/*
* Give a settling time for the mechanical
* and electrical connections
* Check whether there is any performance issue with this
* wait.
*/
OS_DELAY_MS(100);
/* Disable the port */
USB_EHCD_CLR_BIT_PORT(pHCDData,
((pSetup->wIndex)- 1),
PORT_ENABLED_DISABLED);
/* Initiate a reset to the port */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -