예제 #1
0
UINT8 CDC_InterfaceReq_Handler(void)
{
    UINT8 u8State=uSETUP;
    
    switch(Setup_Pkt->bRequest)
    {        
        case GET_INTERFACE:
            EP_IN_Transfer(EP0,&gu8Interface,1);
            break;

        case GET_LINE_CODING:
            EP_IN_Transfer(EP0,(UINT8*)&LineCoding,7);
            break;

        case SET_LINE_CODING:
            u8CDCState=SET_LINE_CODING;
            u8State=uDATA;
            break;

        case SET_CONTROL_LINE_STATE:
            u8CDCState=SET_CONTROL_LINE_STATE;
            u8State=uSETUP;
            break;


        case LOADER_MODE:
            Buffer_Init(CDC_OUT_Data,CDC_BUFFER_SIZE);
            FLAG_SET(LOADER,gu8USB_Flags);
            CDC_OUT_Data[0]=0xFF;
            break;


    }
    return(u8State);
}
예제 #2
0
void USB_Endpoint_Setup_Handler(void)
{
    UINT16 u16Status;
    

    switch(Setup_Pkt->bRequest)
    {        
        case GET_STATUS:
            if(FLAG_CHK(Setup_Pkt->wIndex_h,gu8HALT_EP))
                u16Status=0x0100;
            else
                u16Status=0x0000;
            
            EP_IN_Transfer(EP0,(UINT8*)&u16Status,2);
            break;

        case CLEAR_FEATURE:
            FLAG_CLR(Setup_Pkt->wIndex_h,gu8HALT_EP); 
            EP_IN_Transfer(EP0,0,0);
            break;

        case SET_FEATURE:
            FLAG_SET(Setup_Pkt->wIndex_h,gu8HALT_EP); 
            EP_IN_Transfer(EP0,0,0);
            break;

        default:
            break;
    }
}
예제 #3
0
/*!
 *  @brief      当前接口请求为CDC类请求 的 中断复位函数
 *  @note       在 USB_Setup_Handler 中断里调用
 *  @since      v5.0
 */
uint8 CDC_InterfaceReq_Handler(void)
{
    uint8 u8State = uSETUP;

    switch(Setup_Pkt->bRequest)
    {
    case GET_INTERFACE:
        EP_IN_Transfer(EP0, &gu8Interface, 1);
        break;

    case GET_LINE_CODING:
        EP_IN_Transfer(EP0, (uint8 *)&com_cfg, 7);
        break;

    case SET_LINE_CODING:
        u8CDCState = SET_LINE_CODING;
        u8State = uDATA;
        break;

    case SET_CONTROL_LINE_STATE:
        u8CDCState = SET_CONTROL_LINE_STATE;
        u8State = uSETUP;
        break;

    case LOADER_MODE:
        FLAG_SET(LOADER, gu8USB_Flags);
        CDC_OUT_Data[0] = 0xFF;
        break;
    default:
        break;
    }
    return(u8State);
}
예제 #4
0
void CDC_Engine(void)
{
    //uint16 u8RecData;
    /* control Stage */
    switch(u8CDCState)
    {
    case WAITING_FOR_ENUMERATION:
        /* 等待 USB 枚举 */
        while(gu8USB_State != uENUMERATED)
        {
            (void)u8CDCState;
        };


        u8CDCState = 0;
        break;

    case SET_LINE_CODING:
        if(FLAG_CHK(EP0, gu8USB_Flags))
        {
            FLAG_CLR(EP0, gu8USB_Flags);
            (void)EP_OUT_Transfer(EP0, (uint8 *)&com_cfg);
            EP_IN_Transfer(EP0, 0, 0);
        }
        break;

    case SET_CONTROL_LINE_STATE:
        EP_IN_Transfer(EP0, 0, 0);
        break;

    }
}
예제 #5
0
void CDC_Engine(void)
{
    //UINT16 u8RecData;
    /* control Stage */
    switch(u8CDCState)
    {
        case WAITING_FOR_ENUMERATION:
            /* Wait for USB Enumeration */
            //while(gu8USB_State!=uENUMERATED)
            {
                (void)u8CDCState;
                //__RESET_WATCHDOG();
                //USB_FLAGS=USB_ISTAT;
                //USB_ERROR_FLAGS=USB_ERRSTAT;
            };
            
            
            //u8CDCState=0;
            break;

        case SET_LINE_CODING:
            if(FLAG_CHK(EP0,gu8USB_Flags))
            {
                FLAG_CLR(EP0,gu8USB_Flags);
                (void)EP_OUT_Transfer(EP0,(UINT8*)&LineCoding);
                EP_IN_Transfer(EP0,0,0);       
                //vfnSCI1Init();
            }
            break;

        case SET_CONTROL_LINE_STATE:
            EP_IN_Transfer(EP0,0,0);       
            break;
       
    }

    /* Data stage */
/*
    if(FLAG_CHK(EP_OUT,gu8USB_Flags))
        {
            u8RecData=USB_EP_OUT_SizeCheck(EP_OUT);         // Check how many bytes from the PC
            usbEP_Reset(EP_OUT);
            usbSIE_CONTROL(EP_OUT);
            FLAG_CLR(EP_OUT,gu8USB_Flags);
            EP_IN_Transfer(EP2,CDC_OUTPointer,2);
            u8RecData=0;
        }
*/
}
예제 #6
0
void USB_EP0_IN_Handler(void)
{
    if(gu8USB_State==uADDRESS)
    {
        USB0_ADDR = Setup_Pkt->wValue_l;
        gu8USB_State=uREADY;
        FLAG_SET(fIN,gu8USBClearFlags);
    }
    EP_IN_Transfer(0,0,0);    
}
예제 #7
0
void USB_StdReq_Handler(void)
{

    switch(Setup_Pkt->bRequest)
    {
    case mSET_ADDRESS:
        EP_IN_Transfer(EP0,0,0);
        gu8USB_State=uADDRESS;
        break;

    case mGET_DESC:
        switch(Setup_Pkt->wValue_h)
        {
        case mDEVICE:
            EP_IN_Transfer(EP0,(uint8*)Device_Descriptor,sizeof(Device_Descriptor));
            break;

        case mCONFIGURATION:
            EP_IN_Transfer(EP0,(uint8*)Configuration_Descriptor,sizeof(Configuration_Descriptor));
            break;

        case mSTRING:
            EP_IN_Transfer(EP0,(uint8*)String_Table[Setup_Pkt->wValue_l],String_Table[Setup_Pkt->wValue_l][0]);
            gu8USB_State=uENUMERATED;
            break;

        default:
            USB_EP0_Stall();
            break;
        }
        break;

    case mSET_CONFIG:
        gu8Dummy=Setup_Pkt->wValue_h+Setup_Pkt->wValue_l;
        if(Setup_Pkt->wValue_h+Setup_Pkt->wValue_l)
        {
            USB_Set_Interface();
            EP_IN_Transfer(EP0,0,0);
            gu8USB_State=uENUMERATED;
        }
        break;

    case mGET_CONFIG:
        EP_IN_Transfer(EP0,(uint8*)&gu8Dummy,1);
        break;

    case mGET_STATUS:
        gu8Status=0;
        EP_IN_Transfer(EP0,(uint8*)&gu8Status,2);
        break;


    default:
        USB_EP0_Stall();
        break;
    }
}
예제 #8
0
void usb_service(void)
{
    // If data transfer arrives
    if(FLAG_CHK(EP_OUT,gu8USB_Flags))
    {
        (void)USB_EP_OUT_SizeCheck(EP_OUT);
        usbEP_Reset(EP_OUT);
        usbSIE_CONTROL(EP_OUT);
        FLAG_CLR(EP_OUT,gu8USB_Flags);

        // Send it back to the PC
        EP_IN_Transfer(EP2,CDC_OUTPointer,1);
    }
    if (!ti_print)
    {
        ti_print = 300;
        sprintf((char *)gu8USB_Buffer,"\rtsi %%= %03i ", AbsolutePercentegePosition);
        EP_IN_Transfer(EP2,gu8USB_Buffer,15);
    }
}
예제 #9
0
void CDC_Engine(void)
{
    //uint16 u8RecData;
	
	/** re-init CDC class if a VBUS HIGH event was detected */
	if (FLAG_CHK(VBUS_HIGH_EVENT,gu8ISR_Flags))
	{
          FLAG_SET(USB_CTL_USBENSOFEN_MASK,USB0_CTL);
          u8CDCState = WAITING_FOR_ENUMERATION;
          enum_msg = TRUE;
          CDC_Init();
          FLAG_CLR(VBUS_HIGH_EVENT,gu8ISR_Flags);
	}

    /* control Stage */
    switch(u8CDCState)
    {
        case WAITING_FOR_ENUMERATION:
            /* Wait for USB Enumeration */
            while(gu8USB_State!=uENUMERATED)
            {
                (void)u8CDCState;
            };
            
            if (enum_msg)
            {
               printf ("\nUSB Enumerated, check your COM ports ");
               enum_msg = FALSE;
            }
      
            u8CDCState=0;
            break;

        case SET_LINE_CODING:
            if(FLAG_CHK(EP0,gu8USB_Flags))
            {
                FLAG_CLR(EP0,gu8USB_Flags);
                (void)EP_OUT_Transfer(EP0,(uint8*)&LineCoding);
                EP_IN_Transfer(EP0,0,0);       
                //vfnSCI1Init();
            }
            break;

        case SET_CONTROL_LINE_STATE:
            EP_IN_Transfer(EP0,0,0);       
            break;
       
    }

    /* Data stage */
/*
    if(FLAG_CHK(EP_OUT,gu8USB_Flags))
        {
            u8RecData=USB_EP_OUT_SizeCheck(EP_OUT);         // Check how many bytes from the PC
            usbEP_Reset(EP_OUT);
            usbSIE_CONTROL(EP_OUT);
            FLAG_CLR(EP_OUT,gu8USB_Flags);
            EP_IN_Transfer(EP2,CDC_OUTPointer,2);
            u8RecData=0;
        }
*/
}