Example #1
0
INLINE         HAL_USB_CALLBACK_RETURN_T
boot_UsbCallbackEp(UINT8                      ep,
                   HAL_USB_CALLBACK_EP_TYPE_T type,
                   HAL_USB_SETUP_T*           setup)
{
    UINT8                     epNum;

    epNum = HAL_USB_EP_NUM(ep);

    if(epNum < 16 &&
       epNum != 0)
    {
        if(HAL_USB_IS_EP_DIRECTION_IN(ep))
        {
            if(g_BootUsbVar.EpInCallback[epNum-1])
            {
                return(g_BootUsbVar.EpInCallback[epNum-1](type, setup));
            }
        }
        else
        {
            if(g_BootUsbVar.EpOutCallback[epNum-1])
            {
                return(g_BootUsbVar.EpOutCallback[epNum-1](type, setup));
            }
        }
    }
    return(HAL_USB_CALLBACK_RETURN_KO);
}
Example #2
0
PRIVATE VOID boot_UsbFlushTxFifo(UINT8 ep)
{
    UINT8 epNum;

    epNum              = HAL_USB_EP_NUM(ep);
    hwp_usbc->GRSTCTL &= ~USBC_TXFNUM_MASK;
    hwp_usbc->GRSTCTL |=  USBC_TXFNUM(epNum);
    hwp_usbc->GRSTCTL |=  USBC_TXFFLSH;
}
Example #3
0
PRIVATE VOID boot_UsbEnableEp(UINT8 ep, HAL_USB_EP_TYPE_T type)
{
    UINT8   epNum;
    UINT8   offset;
    REG32*  diepctl;
    REG32*  doepctl;
    REG32*  ctl;

    epNum = HAL_USB_EP_NUM(ep);

    // Select ctl register
    if(epNum == 0)
    {
        diepctl = &hwp_usbc->DIEPCTL0;
        doepctl = &hwp_usbc->DOEPCTL0;
    }
    else
    {
        diepctl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL;
        doepctl = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL;
    }

    // Select direction
    if(HAL_USB_IS_EP_DIRECTION_IN(ep))
    {
        offset = 0;
        ctl    = diepctl;
    }
    else
    {
        offset = 16;
        ctl    = doepctl;
    }

/*     if(*ctl & USBC_USBACTEP) */
/*     { */
        if(type == HAL_USB_EP_TYPE_ISO)
        {
            *ctl = USBC_EPN_MPS(HAL_USB_MPS) | USBC_EPTYPE(type) | USBC_USBACTEP
                | USBC_EPTXFNUM(epNum) | USBC_NEXTEP(epNum);
        }
        else
        {
            *ctl = USBC_EPN_MPS(HAL_USB_MPS) | USBC_EPTYPE(type) | USBC_USBACTEP
                | USBC_EPTXFNUM(epNum) | USBC_SETD0PID | USBC_NEXTEP(epNum);
        }
/*     } */
    hwp_usbc->DAINTMSK |= (1<<(epNum+offset));
}
Example #4
0
PRIVATE VOID boot_UsbDisableEp(UINT8 ep)
{
    UINT8   epNum;
    UINT8   offset;
    REG32*  diepctl;
    REG32*  doepctl;
    REG32*  ctl;

    epNum = HAL_USB_EP_NUM(ep);

    // Select ctl register
    if(epNum == 0)
    {
        diepctl = &hwp_usbc->DIEPCTL0;
        doepctl = &hwp_usbc->DOEPCTL0;
    }
    else
    {
        diepctl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL;
        doepctl = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL;
    }

    // Select direction
    if(HAL_USB_IS_EP_DIRECTION_IN(ep))
    {
        offset = 0;
        ctl    = diepctl;
    }
    else
    {
        offset = 16;
        ctl    = doepctl;
    }

    if(*ctl & USBC_EPENA)
    {
        *ctl             = USBC_EPDIS | USBC_SNAK;
    }
    else
    {
        *ctl             = USBC_SNAK;
    }

    boot_UsbFlushTxFifo(epNum);

    boot_UsbCancelTransfert(ep);

    hwp_usbc->DAINT &= ~(1<<(epNum+offset));
}
Example #5
0
PRIVATE VOID boot_UsbCancelTransfert(UINT8 ep)
{
    UINT8               epNum;

    epNum = HAL_USB_EP_NUM(ep);

    if(HAL_USB_IS_EP_DIRECTION_IN(ep))
    {
        g_BootUsbVar.InTransfert[epNum].size  = 0;
    }
    else
    {
        g_BootUsbVar.OutTransfert[epNum].size = 0;
    }
}
Example #6
0
PRIVATE VOID boot_UsbConfigureEp(HAL_USB_EP_DESCRIPTOR_T* ep)
{
    UINT8 epNum;

    epNum = HAL_USB_EP_NUM(ep->ep);

    if(HAL_USB_IS_EP_DIRECTION_IN(ep->ep))
    {
        g_BootUsbVar.EpInCallback[epNum-1]  = ep->callback;
        boot_UsbEnableEp(HAL_USB_EP_DIRECTION_IN(epNum), ep->type);
    }
    else
    {
        g_BootUsbVar.EpOutCallback[epNum-1] = ep->callback;
        boot_UsbEnableEp(HAL_USB_EP_DIRECTION_OUT(epNum), ep->type);
    }
}
Example #7
0
PUBLIC HAL_USB_EP_DESCRIPTOR_T*
hal_UsbDescriptorNewBulkEpDescriptor(UINT8 ep, HAL_USB_CALLBACK_T callback)
{
    UINT8 epNum;

    HAL_USB_EP_DESCRIPTOR_T* ep_desc;

    epNum   = HAL_USB_EP_NUM(ep);
    if(epNum >= 16 || epNum == 0)
    {
        return 0;
    }

    ep_desc = (HAL_USB_EP_DESCRIPTOR_T*)
        sxr_Malloc(sizeof(HAL_USB_EP_DESCRIPTOR_T));

    ep_desc->ep         = ep;
    ep_desc->interval   = 0;
    ep_desc->callback   = callback;
    ep_desc->type       = HAL_USB_EP_TYPE_BULK;

    return ep_desc;
}
Example #8
0
PRIVATE UINT8 boot_UsbContinueTransfert(UINT8 ep)
{
    UINT8               epNum;
    REG32*              regSize;
    REG32*              regCtl;

    epNum = HAL_USB_EP_NUM(ep);

    if(HAL_USB_IS_EP_DIRECTION_IN(ep))
    {
        if(g_BootUsbVar.InTransfert[epNum].size <= 0)
        {
            return(1);
        }
        if(!(g_BootUsbVar.EpFlag & (1<<epNum)))
        {
            if(g_BootUsbVar.InTransfert[epNum].size >= HAL_USB_MPS)
            {
                if(epNum == 0)
                {
                    regSize = &hwp_usbc->DIEPTSIZ0;
                    regCtl  = &hwp_usbc->DIEPCTL0;
                }
                else
                {
                    regSize = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPTSIZ;
                    regCtl  = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL;
                }

                *regSize = USBC_IEPXFERSIZE(g_BootUsbVar.InTransfert[epNum].size
                                            % HAL_USB_MPS) | USBC_IEPPKTCNT(1);
                *regCtl |= USBC_EPENA | USBC_CNAK;

                g_BootUsbVar.InTransfert[epNum].size = 1;
                return(0);
            }
        }
        g_BootUsbVar.InTransfert[epNum].size  = 0;
    }
    else
    {
        if(g_BootUsbVar.OutTransfert[epNum].size <= 0)
        {
            return(1);
        }

        if(epNum == 0)
        {
            regSize = &hwp_usbc->DOEPTSIZ0;
        }
        else
        {
            regSize = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPTSIZ;
        }

        g_BootUsbVar.OutTransfert[epNum].size -=
            GET_BITFIELD(*regSize, USBC_OEPXFERSIZE);
        g_BootUsbVar.OutTransfert[epNum].size  =
            -g_BootUsbVar.OutTransfert[epNum].size;
        if(g_BootUsbVar.OutTransfert[epNum].size > 0)
        {
            g_BootUsbVar.OutTransfert[epNum].size = 0;
        }
    }

    return(1);
}
Example #9
0
PRIVATE UINT8 boot_UsbStartTransfert(UINT8 ep, VOID *data, UINT16 size,
                                     UINT32 flag)
{
    UINT8               epNum;
    UINT16              nbPacket;
    REG32*              regDma;
    REG32*              regSize;
    REG32*              regCtl;

    epNum = HAL_USB_EP_NUM(ep);

    if(HAL_USB_IS_EP_DIRECTION_IN(ep))
    {
        if(g_BootUsbVar.InTransfert[epNum].size > 0)
        {
            return(1);
        }

        if(epNum == 0)
        {
            regDma  = &hwp_usbc->DIEPDMA0;
            regSize = &hwp_usbc->DIEPTSIZ0;
            regCtl  = &hwp_usbc->DIEPCTL0;
        }
        else
        {
            regDma  = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPDMA;
            regSize = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPTSIZ;
            regCtl  = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL;
        }

        g_BootUsbVar.EpFlag &= ~(1<<epNum);
        if(flag)
        {
            g_BootUsbVar.EpFlag |= 1<<epNum;
        }

        if(size < HAL_USB_MPS)
        {
            *regSize  = USBC_IEPXFERSIZE(size) | USBC_IEPPKTCNT(1);
        }
        else
        {
            nbPacket  = size/HAL_USB_MPS;
            *regSize  = USBC_IEPXFERSIZE(nbPacket*HAL_USB_MPS) |
                USBC_IEPPKTCNT(nbPacket);
        }
        g_BootUsbVar.InTransfert[epNum].size = size;
    }
    // Out
    else
    {
        if(g_BootUsbVar.OutTransfert[epNum].size > 0)
        {
            return(1);
        }
        g_BootUsbVar.OutTransfert[epNum].size = size;
        if(epNum == 0)
        {
            regDma  = &hwp_usbc->DOEPDMA0;
            regSize = &hwp_usbc->DOEPTSIZ0;
            regCtl  = &hwp_usbc->DOEPCTL0;
        }
        else
        {
            regDma  = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPDMA;
            regSize = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPTSIZ;
            regCtl  = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL;
        }
        *regSize = USBC_OEPXFERSIZE(size) | USBC_OEPPKTCNT(size/HAL_USB_MPS);
    }
    *regDma  = (REG32) data;
    *regCtl |= USBC_EPENA | USBC_CNAK;

    return(0);
}