void __SVC_1            (int ena) {
#else 
void USBD_Intr (int ena) {
#endif
  if (ena) {
    NVIC_EnableIRQ  (USB1_IRQn);        /* Enable USB interrupt               */
  } else {
    NVIC_DisableIRQ (USB1_IRQn);        /* Disable USB interrupt              */
  }
}


/*
 *  USB Device Initialize Function
 *   Called by the User to initialize USB Device
 *    Return Value:    None
 */

void USBD_Init (void) {

  USBD_Intr(0);

  /* BASE_USB1_CLK                                                            */
  LPC_CGU->BASE_USB1_CLK   = (0x01 << 11) |       /* Autoblock En             */
                             (0x0C << 24) ;       /* Clock source: IDIVA      */
  LPC_CCU1->CLK_M3_USB1_CFG |= 1;
  while (!(LPC_CCU1->CLK_M3_USB1_STAT & 1));
  LPC_CCU1->CLK_USB1_CFG |= 1;
  while (!(LPC_CCU1->CLK_USB1_STAT & 1));

  LPC_SCU->SFSP9_4 =      2;            /* USB1_IND0 function                 */
  LPC_SCU->SFSP9_3 =      2;            /* USB1_IND1 function                 */
  LPC_SCU->SFSP2_5 =     (2UL << 0 ) |  /* USB1_VBUS function                 */
                         (1UL << 3 ) |  /* enable pull down, repeater mode    */
                         (1UL << 6 );   /* input buffer enable                */

  LPC_USBx->USBCMD_D =   (1UL << 1 );   /* usb reset                          */
  while (LPC_USBx->USBCMD_D & 3);

  LPC_USBx->USBMODE_D  = (2UL << 0 ) |  /* device mode                        */
                         (1UL << 3 );   /* Setup lockout off                  */

  LPC_USBx->PORTSC1_D |= (1UL << 24) |  /* force full speed                   */
                         (3UL << 30);   /* 1.1 PHy (Full speed only)          */

  Ep[EP_OUT_IDX(0)].maxPacket = USBD_MAX_PACKET0;

  LPC_USBx->USBINTR_D  = (1UL << 0 ) |  /* usb int enable                     */
                         (1UL << 2 ) |  /* port change detect int enable      */
                         (1UL << 8 ) |  /* suspend int enable                 */
                         (1UL << 16) |  /* nak int enable                     */
                         (1UL << 6 ) |  /* reset int enable                   */
#ifdef __RTX
              ((USBD_RTX_DevTask   != 0) ? (1UL << 7) : 0) |   /* SOF         */
              ((USBD_RTX_DevTask   != 0) ? (1UL << 1) : 0) ;   /* Error       */
#else
              ((USBD_P_SOF_Event   != 0) ? (1UL << 7) : 0) |   /* SOF         */
              ((USBD_P_Error_Event != 0) ? (1UL << 1) : 0) ;   /* Error       */
#endif

  USBD_Reset();

  LPC_SCU->SFSUSB      = (1UL << 1 ) |  /* enable USB1                        */
                         (1UL << 4 );

  USBD_Intr(1);
}
Example #2
0
void __SVC_1(int ena)
{
#else
void USBD_Intr(int ena)
{
#endif

    if (ena) {
        NVIC_EnableIRQ(USB0_IRQn);          /* Enable USB interrupt */
    } else {
        NVIC_DisableIRQ(USB0_IRQn);         /* Disable USB interrupt */
    }
}


/*
 *  USB Device Initialize Function
 *   Called by the User to initialize USB Device
 *    Return Value:    None
 */

void USBD_Init(void)
{
    USBD_Intr(0);
    /* BASE_USB0_CLK */
    LPC_CGU->BASE_USB0_CLK =    (0x01 << 11) |       /* Autoblock En */
                                (0x07 << 24) ;       /* Clock source: PLL0 */
    LPC_CCU1->CLK_M4_USB0_CFG |= 1;

    while (!(LPC_CCU1->CLK_M4_USB0_STAT & 1));

    LPC_SCU->SFSP6_3 = 1;                 /* pwr en */
    LPC_SCU->SFSP6_6 = 3;                 /* pwr fault */
    LPC_SCU->SFSP8_1 = 1;                 /* port indicator LED control out 1 */
    LPC_SCU->SFSP8_2 = 1;                 /* port indicator LED control out 0 */
    LPC_USBx->USBCMD_D |= (1UL << 1);     /* usb reset */

    while (LPC_USBx->USBCMD_D & (1UL << 1));

    LPC_CREG->CREG0 &= ~(1 << 5);
    LPC_USBx->USBMODE_D  = 2 | (1UL << 3);/* device mode */
#if USBD_HS_ENABLE
    LPC_USBx->PORTSC1_D &= ~(1UL << 24);
#else
    LPC_USBx->PORTSC1_D |= (1UL << 24);
#endif
    LPC_USBx->OTGSC = 1 | (1UL << 3);
    Ep[EP_OUT_IDX(0)].maxPacket = USBD_MAX_PACKET0;
    LPC_USBx->USBINTR_D  = (1UL << 0) |   /* usb int enable */
                           (1UL << 2) |   /* port change detect int enable */
                           (1UL << 8) |   /* suspend int enable */
                           (1UL << 16) |  /* nak int enable */
                           (1UL << 6) |   /* reset int enable */
#ifdef __RTX
                           ((USBD_RTX_DevTask   != 0) ? (1UL << 7) : 0) |   /* SOF */
                           ((USBD_RTX_DevTask   != 0) ? (1UL << 1) : 0) ;   /* Error */
#else
                           ((USBD_P_SOF_Event   != 0) ? (1UL << 7) : 0) |   /* SOF */
                           ((USBD_P_Error_Event != 0) ? (1UL << 1) : 0) ;   /* Error */
#endif
    USBD_Reset();
    USBD_Intr(1);
}
Example #3
0
void USB_LP_CAN1_RX0_IRQHandler(void) {
  U32 istr, num, val;

  istr = ISTR;

  /* USB Reset Request                                                        */
  if (istr & ISTR_RESET) {
    USBD_Reset();
    usbd_reset_core();
#ifdef __RTX
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_RESET, USBD_RTX_DevTask);
    }
#else
    if (USBD_P_Reset_Event) {
      USBD_P_Reset_Event();
    }
#endif
    ISTR = ~ISTR_RESET;
  }

  /* USB Suspend Request                                                      */
  if (istr & ISTR_SUSP) {
    USBD_Suspend();
#ifdef __RTX
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_SUSPEND, USBD_RTX_DevTask);
    }
#else
    if (USBD_P_Suspend_Event) {
      USBD_P_Suspend_Event();
    }
#endif
    ISTR = ~ISTR_SUSP;
  }

  /* USB Wakeup                                                               */
  if (istr & ISTR_WKUP) {
    USBD_WakeUp();
#ifdef __RTX
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_RESUME,  USBD_RTX_DevTask);
    }
#else
    if (USBD_P_Resume_Event) {
      USBD_P_Resume_Event();
    }
#endif
    ISTR = ~ISTR_WKUP;
  }

  /* Start of Frame                                                           */
  if (istr & ISTR_SOF) {
#ifdef __RTX
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_SOF, USBD_RTX_DevTask);
    }
#else
    if (USBD_P_SOF_Event) {
      USBD_P_SOF_Event();
    }
#endif
    ISTR = ~ISTR_SOF;
  }

  /* PMA Over/underrun                                                        */
  if (istr & ISTR_PMAOVR) {
#ifdef __RTX
    LastError = 2;
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_ERROR, USBD_RTX_DevTask);
    }
#else
    if (USBD_P_Error_Event) {
      USBD_P_Error_Event(2);
    }
#endif
    ISTR = ~ISTR_PMAOVR;
  }

  /* Error: No Answer, CRC Error, Bit Stuff Error, Frame Format Error         */
  if (istr & ISTR_ERR) {
#ifdef __RTX
    LastError = 1;
    if (USBD_RTX_DevTask) {
      isr_evt_set(USBD_EVT_ERROR, USBD_RTX_DevTask);
    }
#else
    if (USBD_P_Error_Event) {
      USBD_P_Error_Event(1);
    }
#endif
    ISTR = ~ISTR_ERR;
  }

  /* Endpoint Interrupts                                                      */
  while ((istr = ISTR) & ISTR_CTR) {
    ISTR = ~ISTR_CTR;

    num = istr & ISTR_EP_ID;

    val = EPxREG(num);
    if (val & EP_CTR_RX) {
      EPxREG(num) = val & ~EP_CTR_RX & EP_MASK;
#ifdef __RTX
      if (USBD_RTX_EPTask[num]) {
        isr_evt_set((val & EP_SETUP) ? USBD_EVT_SETUP : USBD_EVT_OUT, USBD_RTX_EPTask[num]);
      }
#else
      if (USBD_P_EP[num]) {
        USBD_P_EP[num]((val & EP_SETUP) ? USBD_EVT_SETUP : USBD_EVT_OUT);
      }
#endif
    }
    if (val & EP_CTR_TX) {
      EPxREG(num) = val & ~EP_CTR_TX & EP_MASK;
#ifdef __RTX
      if (USBD_RTX_EPTask[num]) {
        isr_evt_set(USBD_EVT_IN,  USBD_RTX_EPTask[num]);
      }
#else
      if (USBD_P_EP[num]) {
        USBD_P_EP[num](USBD_EVT_IN);
      }
#endif
    }
  }

}