Beispiel #1
0
/*******************************************************************************
* Function Name  : Standard_GetStatus.
* Description    : Copy the device request data to "StatusInfo buffer".
* Input          : - Length - How many bytes are needed.
* Output         : None.
* Return         : Return 0, if the request is at end of data block,
*                  or is invalid when "Length" is 0.
*******************************************************************************/
u8 *Standard_GetStatus(u16 Length)
{
	if (Length == 0)
	{
		pInformation->Ctrl_Info.Usb_wLength = 2;
		return 0;
	}

	StatusInfo.w = 0;
	/* Reset Status Information */

	if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
	{
		u8 Feature = pInformation->Current_Feature;	/*Get Device Status */

		if (ValBit(Feature, 5))		/* Remote Wakeup enabled */
		{
			SetBit(StatusInfo0, 1);
		}

		if (ValBit(Feature, 6))		/* Bus-powered */
		{
			ClrBit(StatusInfo0, 0);
		}
		else
		{
			SetBit(StatusInfo0, 0);	/* Self-powered */
		}
	}
	else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
	{	/*Interface Status*/
		return (u8 *)&StatusInfo;
	}
	else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT))
	{	/*Get EndPoint Status*/
		u8 Related_Endpoint;
		u8 wIndex0 = pInformation->USBwIndex0;

		Related_Endpoint = (wIndex0 & 0x0f);
		if (ValBit(wIndex0, 7))
		{	/* IN endpoint */
			if (_GetTxStallStatus(Related_Endpoint))
			{
				SetBit(StatusInfo0, 0); /* IN Endpoint stalled */
			}
		}
		else
		{	/* OUT endpoint */
			if (_GetRxStallStatus(Related_Endpoint))
			{
				SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */
			}
		}
	}
	else
		return NULL;

	pUser_Standard_Requests->User_GetStatus();
	return (u8 *)&StatusInfo;
}
Beispiel #2
0
/*******************************************************************************
* Function Name  : Standard_SetEndPointFeature
* Description    : Set or enable a specific feature of EndPoint
* Input          : None.
* Output         : None.
* Return         : - Return USB_SUCCESS, if the request is performed.
*                  - Return USB_UNSUPPORT, if the request is invalid.
*******************************************************************************/
RESULT Standard_SetEndPointFeature(void) {
    uint32_t wIndex0;
    uint32_t Related_Endpoint;
    uint32_t rEP;
    uint32_t Status;

    wIndex0 = pInformation->USBwIndex0;
    rEP = wIndex0 & ~0x80;
    Related_Endpoint = ENDP0 + rEP;

    if(ValBit(pInformation->USBwIndex0, 7)) {
        /* get Status of endpoint & stall the request if the related_ENdpoint
        is Disabled*/
        Status = _GetEPTxStatus(Related_Endpoint);
    } else {
        Status = _GetEPRxStatus(Related_Endpoint);
    }

    if(Related_Endpoint >= Device_Table.Total_Endpoint || pInformation->USBwValue != 0 || Status == 0 ||
       pInformation->Current_Configuration == 0) {
        return USB_UNSUPPORT;
    } else {
        if(wIndex0 & 0x80) {
            /* IN endpoint */
            _SetEPTxStatus(Related_Endpoint, EP_TX_STALL);
        }

        else {
            /* OUT endpoint */
            _SetEPRxStatus(Related_Endpoint, EP_RX_STALL);
        }
    }
    pUser_Standard_Requests->User_SetEndPointFeature();
    return USB_SUCCESS;
}
Beispiel #3
0
/*
*	Draw a Char
*/
u8 DrawChar5x7(u8 x, u8 y, char character, u16 color, u16 bgcolor) {
	u16 fontHeight, i, j, fontWidth, fontPos = 0;	
		
	if ( character < 32 ) return;
	if ( character > 127 ) return;
	
	fontWidth = 5;
	fontHeight = 7;
	
	fontPos = ( character - 32 ) * fontWidth;
	
	LCD_SetArea(x, y, x + fontWidth + 1, y+fontHeight);
    LCD_SendCMD(RAMWR);
	for (i = 0; i < fontWidth; i++) {
		for (j = 0; j <= fontHeight; j++) {      
			if ( ValBit( Font5x7[ fontPos + i ], j ) ) {				
				LCD_SendDAT16(color);
			} else {
				LCD_SendDAT16(bgcolor);
			}
		}	   
	}
	for (j = 0; j <= fontHeight; j++) { 
		LCD_SendDAT16(bgcolor);
	}
	fontWidth++;
	return x + fontWidth;
}
Beispiel #4
0
/*
*	Draw a Char
*/
u8 DrawChar5x5(u8 x, u8 y, char character, u16 color, u16 bgcolor) {
	u16 fontIndex, i, j, fontWidth, fontPos = 0;	
	
	fontIndex = character-32;
	if ( character < 32 ) return;
	if ( fontIndex > 96 ) return;
	
	if ( fontIndex > 0 ) {
		fontPos = Font5x5WidthPos[ fontIndex - 1];
	}
	fontWidth = Font5x5WidthPos[ fontIndex ] - fontPos;
	
	LCD_SetArea(x, y, x+fontWidth+1, y+5);
    LCD_SendCMD(RAMWR);
	for (i = 0; i < fontWidth; i++) {
		for (j = 0; j <= 5; j++) {      
			if ( ValBit( Font5x5[ fontPos + i ], j ) ) {				
				LCD_SendDAT16(color);
			} else {
				LCD_SendDAT16(bgcolor);
			}
		}	   
	}
	for (j = 0; j <= 5; j++) { 
		LCD_SendDAT16(bgcolor);
	}
	fontWidth++;
	return x + fontWidth;
}
Beispiel #5
0
/*******************************************************************************
* Function Name  : Standard_ClearFeature.
* Description    : Clear or disable a specific feature.
* Input          : None.
* Output         : None.
* Return         : - Return USB_SUCCESS, if the request is performed.
*                  - Return USB_UNSUPPORT, if the request is invalid.
*******************************************************************************/
RESULT Standard_ClearFeature(void) {
	uint32_t Type_Rec = Type_Recipient;
	uint32_t Status;

	if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
		// Device Clear Feature
		ClrBit(pInformation->Current_Feature, 5);
		return USB_SUCCESS;
	} else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
		// EndPoint Clear Feature
		DEVICE* pDev;
		uint32_t Related_Endpoint;
		uint32_t wIndex0;
		uint32_t rEP;

		if ((pInformation->USBwValue != ENDPOINT_STALL) || (pInformation->USBwIndex1 != 0)) {
			return USB_UNSUPPORT;
		}
		pDev = &Device_Table;
		wIndex0 = pInformation->USBwIndex0;
		rEP = wIndex0 & ~0x80;
		Related_Endpoint = ENDP0 + rEP;
		if (ValBit(pInformation->USBwIndex0, 7)) {
			// Get Status of endpoint & stall the request if the related_ENdpoint is Disabled
			Status = GetEPTxStatus(Related_Endpoint);
		} else {
			Status = GetEPRxStatus(Related_Endpoint);
		}
		if ((rEP >= pDev->Total_Endpoint) || (Status == 0) || (pInformation->Current_Configuration == 0)) {
			return USB_UNSUPPORT;
		}
		if (wIndex0 & 0x80) {
			// IN endpoint
			if (GetTxStallStatus(Related_Endpoint )) {
				ClearDTOG_TX(Related_Endpoint);
				SetEPTxStatus(Related_Endpoint, EP_TX_VALID);
			}
		} else {
			// OUT endpoint
			if (GetRxStallStatus(Related_Endpoint)) {
				if (Related_Endpoint == ENDP0) {
					// After clear the STALL, enable the default endpoint receiver
					SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize);
					SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
				} else {
					ClearDTOG_RX(Related_Endpoint);
					SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
				}
			}
		}
		pUser_Standard_Requests->User_ClearFeature();

		return USB_SUCCESS;
	}

	return USB_UNSUPPORT;
}
Beispiel #6
0
/*******************************************************************************
* Function Name  : Standard_GetStatus.
* Description    : Copy the device request data to "StatusInfo buffer".
* Input          : - Length - How many bytes are needed.
* Output         : None.
* Return         : Return 0, if the request is at end of data block,
*                  or is invalid when "Length" is 0.
*******************************************************************************/
uint8_t *Standard_GetStatus(uint16_t Length) {
	if (Length == 0) {
		pInformation->Ctrl_Info.Usb_wLength = 2;

		return 0;
	}

	// Reset Status Information
	StatusInfo.w = 0;

	if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
		// Get Device Status
		uint8_t Feature = pInformation->Current_Feature;

		// Remote Wakeup enabled
		if (ValBit(Feature, 5)) SetBit(StatusInfo0,1); else ClrBit(StatusInfo0,1);

		// Bus-powered or self-powered
		if (ValBit(Feature, 6)) SetBit(StatusInfo0,0); else ClrBit(StatusInfo0,0);
	} else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
		// Interface Status

		return (uint8_t *)&StatusInfo;
	} else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
		// Get EndPoint Status
		uint8_t Related_Endpoint;
		uint8_t wIndex0 = pInformation->USBwIndex0;

		Related_Endpoint = (wIndex0 & 0x0f);
		if (ValBit(wIndex0,7)) {
			// IN endpoint
			if (GetTxStallStatus(Related_Endpoint)) SetBit(StatusInfo0,0); // IN Endpoint stalled
		} else {
			// OUT endpoint
			if (GetRxStallStatus(Related_Endpoint)) SetBit(StatusInfo0,0); // OUT Endpoint stalled
		}
	} else {
		return NULL;
	}

	pUser_Standard_Requests->User_GetStatus();

	return (uint8_t *)&StatusInfo;
}
Beispiel #7
0
/*******************************************************************************
* Function Name  : Data_Setup0.
* Description    : Proceed the processing of setup request with data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Data_Setup0(void) {
    uint8_t* (*CopyRoutine)(uint16_t);
    RESULT Result;
    uint32_t Request_No = pInformation->USBbRequest;

    uint32_t Related_Endpoint, Reserved;
    uint32_t wOffset, Status;


    CopyRoutine = NULL;
    wOffset = 0;

    /*GET DESCRIPTOR*/
    if(Request_No == GET_DESCRIPTOR) {
        if(Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
            uint8_t wValue1 = pInformation->USBwValue1;
            if(wValue1 == DEVICE_DESCRIPTOR) {
                CopyRoutine = pProperty->GetDeviceDescriptor;
            } else if(wValue1 == CONFIG_DESCRIPTOR) {
                CopyRoutine = pProperty->GetConfigDescriptor;
            } else if(wValue1 == STRING_DESCRIPTOR) {
                CopyRoutine = pProperty->GetStringDescriptor;
            } /* End of GET_DESCRIPTOR */
        }
    }

    /*GET STATUS*/
    else if((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) && (pInformation->USBwLength == 0x0002) &&
            (pInformation->USBwIndex1 == 0)) {
        /* GET STATUS for Device*/
        if((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) && (pInformation->USBwIndex == 0)) {
            CopyRoutine = Standard_GetStatus;
        }

        /* GET STATUS for Interface*/
        else if(Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
            if(((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) &&
               (pInformation->Current_Configuration != 0)) {
                CopyRoutine = Standard_GetStatus;
            }
        }

        /* GET STATUS for EndPoint*/
        else if(Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
            Related_Endpoint = (pInformation->USBwIndex0 & 0x0f);
            Reserved = pInformation->USBwIndex0 & 0x70;

            if(ValBit(pInformation->USBwIndex0, 7)) {
                /*Get Status of endpoint & stall the request if the related_ENdpoint
                is Disabled*/
                Status = _GetEPTxStatus(Related_Endpoint);
            } else {
                Status = _GetEPRxStatus(Related_Endpoint);
            }

            if((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) && (Status != 0)) {
                CopyRoutine = Standard_GetStatus;
            }
        }

    }

    /*GET CONFIGURATION*/
    else if(Request_No == GET_CONFIGURATION) {
        if(Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
            CopyRoutine = Standard_GetConfiguration;
        }
    }
    /*GET INTERFACE*/
    else if(Request_No == GET_INTERFACE) {
        if((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) && (pInformation->Current_Configuration != 0) &&
           (pInformation->USBwValue == 0) && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) &&
           ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) {
            CopyRoutine = Standard_GetInterface;
        }
    }

    if(CopyRoutine) {
        pInformation->Ctrl_Info.Usb_wOffset = wOffset;
        pInformation->Ctrl_Info.CopyData = CopyRoutine;
        /* sb in the original the cast to word was directly */
        /* now the cast is made step by step */
        (*CopyRoutine)(0);
        Result = USB_SUCCESS;
    } else {
        Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest);
        if(Result == USB_NOT_READY) {
            pInformation->ControlState = PAUSE;
            return;
        }
    }

    if(pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) {
        /* Data is not ready, wait it */
        pInformation->ControlState = PAUSE;
        return;
    }
    if((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) {
        /* Unsupported request */
        pInformation->ControlState = STALLED;
        return;
    }


    if(ValBit(pInformation->USBbmRequestType, 7)) {
        /* Device ==> Host */
        __IO uint32_t wLength = pInformation->USBwLength;

        /* Restrict the data length to be the one host asks for */
        if(pInformation->Ctrl_Info.Usb_wLength > wLength) {
            pInformation->Ctrl_Info.Usb_wLength = wLength;
        }

        else if(pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) {
            if(pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) {
                Data_Mul_MaxPacketSize = FALSE;
            } else if((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) {
                Data_Mul_MaxPacketSize = TRUE;
            }
        }

        pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize;
        DataStageIn();
    } else {
        pInformation->ControlState = OUT_DATA;
        vSetEPRxStatus(EP_RX_VALID); /* enable for next data reception */
    }

    return;
}
Beispiel #8
0
/*******************************************************************************
* Function Name  : NoData_Setup0.
* Description    : Proceed the processing of setup request without data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NoData_Setup0(void) {
    RESULT Result = USB_UNSUPPORT;
    uint32_t RequestNo = pInformation->USBbRequest;
    uint32_t ControlState;

    if(Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
        /* Device Request*/
        /* SET_CONFIGURATION*/
        if(RequestNo == SET_CONFIGURATION) {
            Result = Standard_SetConfiguration();
        }

        /*SET ADDRESS*/
        else if(RequestNo == SET_ADDRESS) {
            if((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) || (pInformation->USBwIndex != 0) ||
               (pInformation->Current_Configuration != 0))
            /* Device Address should be 127 or less*/
            {
                ControlState = STALLED;
                goto exit_NoData_Setup0;
            } else {
                Result = USB_SUCCESS;

#ifdef STM32F10X_CL
                SetDeviceAddress(pInformation->USBwValue0);
#endif /* STM32F10X_CL */
            }
        }
        /*SET FEATURE for Device*/
        else if(RequestNo == SET_FEATURE) {
            if((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) && (pInformation->USBwIndex == 0)) {
                Result = Standard_SetDeviceFeature();
            } else {
                Result = USB_UNSUPPORT;
            }
        }
        /*Clear FEATURE for Device */
        else if(RequestNo == CLEAR_FEATURE) {
            if(pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP && pInformation->USBwIndex == 0 &&
               ValBit(pInformation->Current_Feature, 5)) {
                Result = Standard_ClearFeature();
            } else {
                Result = USB_UNSUPPORT;
            }
        }

    }

    /* Interface Request*/
    else if(Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
        /*SET INTERFACE*/
        if(RequestNo == SET_INTERFACE) {
            Result = Standard_SetInterface();
        }
    }

    /* EndPoint Request*/
    else if(Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
        /*CLEAR FEATURE for EndPoint*/
        if(RequestNo == CLEAR_FEATURE) {
            Result = Standard_ClearFeature();
        }
        /* SET FEATURE for EndPoint*/
        else if(RequestNo == SET_FEATURE) {
            Result = Standard_SetEndPointFeature();
        }
    } else {
        Result = USB_UNSUPPORT;
    }


    if(Result != USB_SUCCESS) {
        Result = (*pProperty->Class_NoData_Setup)(RequestNo);
        if(Result == USB_NOT_READY) {
            ControlState = PAUSE;
            goto exit_NoData_Setup0;
        }
    }

    if(Result != USB_SUCCESS) {
        ControlState = STALLED;
        goto exit_NoData_Setup0;
    }

    ControlState = WAIT_STATUS_IN; /* After no data stage SETUP */

    USB_StatusIn();

exit_NoData_Setup0:
    pInformation->ControlState = ControlState;
    return;
}
Beispiel #9
0
/*******************************************************************************
* Function Name  : NoData_Setup0.
* Description    : Proceed the processing of setup request without data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NoData_Setup0(void) {
	RESULT Result = USB_UNSUPPORT;
	uint32_t RequestNo = pInformation->USBbRequest;
	uint32_t ControlState;

	if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
		// Device Request
		// SET_CONFIGURATION
		if (RequestNo == SET_CONFIGURATION) Result = Standard_SetConfiguration();
		// SET ADDRESS
		else if (RequestNo == SET_ADDRESS) {
			if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0)
					|| (pInformation->USBwIndex != 0)
					|| (pInformation->Current_Configuration != 0)) {
				// Device Address should be 127 or less
				ControlState = STALLED;
				pInformation->ControlState = ControlState;

				return;
			} else Result = USB_SUCCESS;
		} else if (RequestNo == SET_FEATURE) {
			// SET FEATURE for Device
			if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP)
					&& (pInformation->USBwIndex == 0)) {
				Result = Standard_SetDeviceFeature();
			} else {
				Result = USB_UNSUPPORT;
			}
		} else if (RequestNo == CLEAR_FEATURE) {
			// Clear FEATURE for Device
			if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP
					&& pInformation->USBwIndex == 0
					&& ValBit(pInformation->Current_Feature, 5)) {
				Result = Standard_ClearFeature();
			} else {
				Result = USB_UNSUPPORT;
			}
		}
	} else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
		// Interface Request
		// SET INTERFACE
		if (RequestNo == SET_INTERFACE) Result = Standard_SetInterface();
	} else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
		// EndPoint Request
		// CLEAR FEATURE for EndPoint
		if (RequestNo == CLEAR_FEATURE) {
			Result = Standard_ClearFeature();
		} else if (RequestNo == SET_FEATURE) {
		    // SET FEATURE for EndPoint
			Result = Standard_SetEndPointFeature();
		}
	} else Result = USB_UNSUPPORT;

	if (Result != USB_SUCCESS) {
		Result = (*pProperty->Class_NoData_Setup)(RequestNo);
		if (Result == USB_NOT_READY) {
			ControlState = PAUSE;
			pInformation->ControlState = ControlState;

			return;
		}
	}

	if (Result != USB_SUCCESS) {
		ControlState = STALLED;
		pInformation->ControlState = ControlState;

		return;
	}

	ControlState = WAIT_STATUS_IN; // After no data stage SETUP
	SetEPTxCount(ENDP0,0);
	SaveTState = EP_TX_VALID;
	pInformation->ControlState = ControlState;

	return;
}