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

📄 s3c2510usb.c

📁 VxWorks BSP for S3C2510A
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
}

/*******************************************************************************
*
* s3c2510UsbSetFeature - set feature.
*
* RETURNS : N/A
*/

void s3c2510UsbSetFeature(void)
{
    UINT16 feature = FROM_LITTLEW(usbSetup.wValue);
    UINT8 index = LSB(FROM_LITTLEW(usbSetup.wIndex));

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SetFeature, 0x%04X, 0x%02X\n", feature, index);
#endif  /* DEBUG_TRACE */

    switch (feature)
    {
    case USB_FEATURE_ENDPOINT_STALL:
#ifdef  DEBUG_TRACE
        printf("USB_FEATURE_ENDPOINT_STALL\n");
#endif  /* DEBUG_TRACE */
        switch (index & 0x7f)
        {
        case 0:
            ep0Status = USB_EP_STATUS_HALT;
            break;

        case 1:
            ep1Status = USB_EP_STATUS_HALT;
            break;

        case 2:
            ep2Status = USB_EP_STATUS_HALT;
            break;

        case 3:
            ep3Status = USB_EP_STATUS_HALT;
            break;

        case 4:
            ep4Status = USB_EP_STATUS_HALT;
            break;

        default:
            printf("s3c2510Usb Error: Unknown endpoint, 0x%02X\n", index);
            break;
        }
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
        break;

    case USB_FEATURE_REMOTE_WAKEUP:
#ifdef  DEBUG_TRACE
        printf("USB_FEATURE_REMOTE_WAKEUP\n");
#endif  /* DEBUG_TRACE */
        deviceStatus = USB_DEV_STATUS_REMOTE_WAKEUP;
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
        break;

    default:
        printf("s3c2510Usb Error: Unknown feature, 0x%04X\n", feature);
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
        break;
    }
}

/*******************************************************************************
*
* s3c2510UsbSetAddress - set address.
*
* RETURNS : N/A
*/

void s3c2510UsbSetAddress(void)
{
    UINT8 address = LSB(FROM_LITTLEW(usbSetup.wValue));

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SetAddress, 0x%02X\n", address);
#endif  /* DEBUG_TRACE */

    *S3C2510_USBFA = S3C2510_USBFA_UP | (address & S3C2510_USBFA_MASK);
    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;

    /* Endpoint 0 state is idle. */
    ep0State = EP0_STATE_IDLE;
}

/*******************************************************************************
*
* s3c2510UsbGetDescriptor - get descriptor.
*
* RETURNS : N/A
*/

void s3c2510UsbGetDescriptor(void)
{
    UINT8 type = MSB(FROM_LITTLEW(usbSetup.wValue));

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb GetDescriptor, 0x%02X\n", type);
#endif  /* DEBUG_TRACE */

    switch (type)
    {
    case USB_DESCRIPTOR_DEVICE:
#ifdef  DEBUG_TRACE
        printf("USB_DESCRIPTOR_DEVICE\n");
#endif  /* DEBUG_TRACE */
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        ep0State    = EP0_STATE_TRANSMIT;
        ep0TxBuffer = (UINT32 *)descrDevice;
        ep0TxLength = sizeof(descrDevice);
        ep0TxCount  = 0;
#ifdef  DEBUG_TRACE
        s3c2510UsbDump((UCHAR *)ep0TxBuffer, ep0TxLength);
#endif  /* DEBUG_TRACE */
        s3c2510UsbEp0Out();
        break;

    case USB_DESCRIPTOR_CONFIGURATION:
#ifdef  DEBUG_TRACE
        printf("USB_DESCRIPTOR_CONFIGURATION\n");
#endif  /* DEBUG_TRACE */
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        ep0State    = EP0_STATE_TRANSMIT;
        ep0TxBuffer = (UINT32 *)descrConfig;
        ep0TxLength = sizeof(descrConfig);
        ep0TxCount  = 0;
#ifdef  DEBUG_TRACE
        s3c2510UsbDump((UCHAR *)ep0TxBuffer, ep0TxLength);
#endif  /* DEBUG_TRACE */
        s3c2510UsbEp0Out();
        break;

    case USB_DESCRIPTOR_STRING:
#ifdef  DEBUG_TRACE
        printf("USB_DESCRIPTOR_STRING\n");
#endif  /* DEBUG_TRACE */
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
        break;

    case USB_DESCRIPTOR_INTERFACE:
#ifdef  DEBUG_TRACE
        printf("USB_DESCRIPTOR_INTERFACE\n");
#endif  /* DEBUG_TRACE */
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
        break;

    case USB_DESCRIPTOR_ENDPOINT:
#ifdef  DEBUG_TRACE
        printf("USB_DESCRIPTOR_ENDPOINT\n");
#endif  /* DEBUG_TRACE */
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
        break;

    default:
        printf("s3c2510Usb Error: Unknown descriptor type, 0x%02X\n", type);
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
        break;
    }
}

/*******************************************************************************
*
* s3c2510UsbSetDescriptor - set descriptor.
*
* RETURNS : N/A
*/

void s3c2510UsbSetDescriptor(void)
{
#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SetDescriptor\n");
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbGetConfig - get coniguration.
*
* RETURNS : N/A
*/

void s3c2510UsbGetConfig(void)
{
#ifdef  DEBUG_TRACE
    printf("s3c2510Usb GetConfig\n");
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
    *S3C2510_USBWCEP(0) = 2 << S3C2510_USBWCEP_CPUWRTCNT_SHIFT;
    *S3C2510_USBFIFO(0) = TO_LITTLEL(deviceConfig);
    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbSetConfig - set configuration.
*
* RETURNS : N/A
*/

void s3c2510UsbSetConfig(void)
{
    deviceConfig = FROM_LITTLEW(usbSetup.wValue);

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SetConfig, 0x%08X\n", deviceConfig);
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbGetInterface - get interface.
*
* RETURNS : N/A
*/

void s3c2510UsbGetInterface(void)
{
#ifdef  DEBUG_TRACE
    printf("s3c2510Usb GetInterface\n");
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY;
    *S3C2510_USBWCEP(0) = 2 << S3C2510_USBWCEP_CPUWRTCNT_SHIFT;
    *S3C2510_USBFIFO(0) = TO_LITTLEL(deviceInterface);
    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbSetInterface - set interface.
*
* RETURNS : N/A
*/

void s3c2510UsbSetInterface(void)
{
    deviceInterface = FROM_LITTLEW(usbSetup.wValue);

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SetInterface, 0x%08X\n", deviceInterface);
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbSyncFrame - synchronize frame.
*
* RETURNS : N/A
*/

void s3c2510UsbSyncFrame(void)
{
#ifdef  DEBUG_TRACE
    printf("s3c2510Usb SyncFrame\n");
#endif  /* DEBUG_TRACE */

    *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBSVORDY | S3C2510_USBEP0CSR_USBDEND;
}

/*******************************************************************************
*
* s3c2510UsbEp0Out - output to Endpoint 0.
*
* RETURNS : N/A
*/

void s3c2510UsbEp0Out()
{
    UINT32 length;
    UINT32 i;

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb Ep0Out\n");
#endif  /* DEBUG_TRACE */

    *S3C2510_USBWCEP(0) = ep0TxCount << S3C2510_USBWCEP_CPUWRTCNT_SHIFT;

    if ((!ep0TxBuffer) || (!ep0TxLength))
    {
        *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;

        printf("s3c2510Usb Error: no data, %08X, %d\n", (UINT32)ep0TxBuffer, (int)ep0TxLength);

        return;
    }

    if (!(*S3C2510_USBCSR(0) & S3C2510_USBEP0CSR_USBINRDY))
    {
        length = ep0TxLength - ep0TxCount;

        if (length > USB_EP0_MAXP_SIZE)
        {
            length = USB_EP0_MAXP_SIZE;
        }

        if (*S3C2510_USBINTR & S3C2510_USBINTR_RESET)
        {
            *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;

            ep0State    = EP0_STATE_IDLE;
            ep0TxLength = 0;
            ep0TxCount  = 0;
            ep0TxBuffer = NULL;

            printf("s3c2510Usb Error: Reset\n");

            return;
        }

        if (length > 0)
        {
#ifdef  DEBUG_TRACE
            printf("write %d bytes\n", (int)length);
#endif  /* DEBUG_TRACE */

            for (i=0; i<length; i+=4)
            {
                *S3C2510_USBFIFO(0) = *ep0TxBuffer++;
                ep0TxCount += 4;
            }
        }

        if (*S3C2510_USBINTR & S3C2510_USBINTR_RESET)
        {
            *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;

            ep0State    = EP0_STATE_IDLE;
            ep0TxLength = 0;
            ep0TxCount  = 0;
            ep0TxBuffer = NULL;

            printf("s3c2510Usb Error: Reset\n");

            return;
        }

        if (ep0TxCount >= ep0TxLength)
        {
            *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY | S3C2510_USBEP0CSR_USBDEND;

            ep0State    = EP0_STATE_IDLE;
            ep0TxLength = 0;
            ep0TxCount  = 0;
            ep0TxBuffer = NULL;

#ifdef  DEBUG_TRACE
            printf("done\n");
#endif  /* DEBUG_TRACE */
        }
        else
        {
            *S3C2510_USBCSR(0) |= S3C2510_USBEP0CSR_USBINRDY;
        }
    }
}

/*******************************************************************************
*
* s3c2510UsbEp0In - input from Endpoint 0.
*
* RETURNS : N/A
*/

void s3c2510UsbEp0In()
{
#ifdef  DEBUG_TRACE
    printf("s3c2510Usb Ep0In\n");
#endif  /* DEBUG_TRACE */
}

/*******************************************************************************
*
* s3c2510UsbDeviceRequestStandard - handle Standard Device Request.
*
* RETURNS : N/A
*/

void s3c2510UsbDeviceRequestStandard(void)
{
    UINT8 recipient = usbSetup.bmRequestType & USB_RT_RECIPIENT_MASK;

#ifdef  DEBUG_TRACE
    printf("s3c2510Usb DeviceRequestStandard, 0x%02X\n", recipient);
#endif  /* DEBUG_TRACE */

    switch (recipient)
    {
    case USB_RT_DEVICE:
#ifdef  DEBUG_TRACE
        printf("USB_RT_DEVICE\n");
#endif  /* DEBUG_TRACE */
        switch (usbSetup.bRequest)
        {
        case USB_REQUEST_GET_STATUS:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_GET_STATUS\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbGetStatus();
            break;

        case USB_REQUEST_CLEAR_FEATURE:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_CLEAR_FEATURE\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbClearFeature();
            break;

        case USB_REQUEST_SET_FEATURE:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_SET_FEATURE\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbSetFeature();
            break;

        case USB_REQUEST_SET_ADDRESS:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_SET_ADDRESS\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbSetAddress();
            break;

        case USB_REQUEST_GET_DESCRIPTOR:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_GET_DESCRIPTOR\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbGetDescriptor();
            break;

        case USB_REQUEST_SET_DESCRIPTOR:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_SET_DESCRIPTOR\n");
#endif  /* DEBUG_TRACE */
            s3c2510UsbSetDescriptor();
            break;

        case USB_REQUEST_GET_CONFIGURATION:
#ifdef  DEBUG_TRACE
            printf("USB_REQUEST_GET_CONFIGURATION\n");
#endif  /* DEBUG_TRACE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -