40 void USBIOClkConfig(
void )
43 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
49 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<14);
53 LPC_IOCON->PIO0_3 |= 0x08;
54 LPC_IOCON->PIO0_3 &= ~0x10;
55 LPC_GPIO0->DIR &= ~0x0008;
59 LPC_IOCON->PIO0_6 &= 0x0;
60 LPC_GPIO0->DIR |= 0x0040;
61 LPC_GPIO0->DATA &= ~0x0040;
71 void delay (uint32_t length ) {
74 for ( i = 0; i < length; i++ );
86 uint32_t EPAdr (uint32_t EPNum) {
89 val = (EPNum & 0x0F) << 1;
103 void WrCmd (uint32_t cmd) {
105 LPC_USB->DevIntClr = CCEMTY_INT;
106 LPC_USB->CmdCode = cmd;
107 while ((LPC_USB->DevIntSt & (CCEMTY_INT | DEV_STAT_INT)) == 0);
118 void WrCmdDat (uint32_t cmd, uint32_t val) {
132 void WrCmdEP (uint32_t EPNum, uint32_t cmd){
134 WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
145 uint32_t RdCmdDat (uint32_t cmd) {
147 LPC_USB->DevIntClr = CCEMTY_INT | CDFULL_INT;
148 LPC_USB->CmdCode = cmd;
149 while ((LPC_USB->DevIntSt & (CDFULL_INT | DEV_STAT_INT)) == 0);
150 return (LPC_USB->CmdData);
160 void USB_Init (
void) {
165 LPC_USB->DevFIQSel = 0x01;
168 NVIC_EnableIRQ(USB_FIQn);
172 NVIC_EnableIRQ(USB_IRQn);
187 void USB_Connect (uint32_t con) {
188 WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con ? DEV_CON : 0));
198 void USB_Reset (
void) {
200 LPC_USB->DevIntClr = 0x000FFFFF;
204 LPC_USB->DevIntEn = DEV_STAT_INT | (0xFF<<1) |
205 (USB_SOF_EVENT ? FRAME_INT : 0);
216 void USB_Suspend (
void) {
227 void USB_Resume (
void) {
238 void USB_WakeUp (
void) {
240 if (USB_DeviceStatus & USB_GETSTATUS_REMOTE_WAKEUP) {
241 WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON));
252 void USB_WakeUpCfg (uint32_t cfg) {
263 void USB_SetAddress (uint32_t adr) {
264 WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr));
265 WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr));
275 void USB_Configure (uint32_t cfg) {
277 WrCmdDat(CMD_CFG_DEV, DAT_WR_BYTE(cfg ? CONF_DVICE : 0));
288 void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD) {
299 void USB_DirCtrlEP (uint32_t dir) {
312 void USB_EnableEP (uint32_t EPNum) {
313 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
325 void USB_DisableEP (uint32_t EPNum) {
326 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_DA));
338 void USB_ResetEP (uint32_t EPNum) {
339 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
351 void USB_SetStallEP (uint32_t EPNum) {
352 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_ST));
364 void USB_ClrStallEP (uint32_t EPNum) {
365 WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
377 void USB_ClearEPBuf (uint32_t EPNum) {
378 WrCmdEP(EPNum, CMD_CLR_BUF);
391 uint32_t USB_ReadEP (uint32_t EPNum, uint8_t *pData) {
394 LPC_USB->Ctrl = ((EPNum & 0x0F) << 2) | CTRL_RD_EN;
399 cnt = LPC_USB->RxPLen;
400 }
while ((cnt & PKT_DV) == 0);
401 cnt &= PKT_LNGTH_MASK;
403 for (n = 0; n < (cnt + 3) / 4; n++) {
404 *((uint32_t
__attribute__((packed)) *)pData) = LPC_USB->RxData;
410 if ((EPNum & 0x80) != 0x04) {
411 WrCmdEP(EPNum, CMD_CLR_BUF);
428 uint32_t USB_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt) {
431 LPC_USB->Ctrl = ((EPNum & 0x0F) << 2) | CTRL_WR_EN;
434 LPC_USB->TxPLen = cnt;
436 for (n = 0; n < (cnt + 3) / 4; n++) {
437 LPC_USB->TxData = *((uint32_t
__attribute__((packed)) *)pData);
443 WrCmdEP(EPNum, CMD_VALID_BUF);
454 uint32_t USB_GetFrame (
void) {
458 val = RdCmdDat(DAT_RD_FRAME);
459 val = val | (RdCmdDat(DAT_RD_FRAME) << 8);
469 void USB_IRQHandler (
void)
471 uint32_t disr, val, n, m;
473 disr = LPC_USB->DevIntSt;
474 LPC_USB->DevIntClr = disr;
477 if (disr & DEV_STAT_INT) {
478 WrCmd(CMD_GET_DEV_STAT);
479 val = RdCmdDat(DAT_GET_DEV_STAT);
486 if (val & DEV_CON_CH) {
488 USB_Power_Event(val & DEV_CON);
491 if (val & DEV_SUS_CH) {
494 #if USB_SUSPEND_EVENT
509 if (disr & FRAME_INT) {
510 LPC_USB->DevIntClr = FRAME_INT;
520 if (disr & ERR_INT) {
521 WrCmd(CMD_RD_ERR_STAT);
522 val = RdCmdDat(DAT_RD_ERR_STAT);
523 USB_Error_Event(val);
528 if (disr & (0xFF<<1)) {
530 for (n = 0; n < USB_EP_NUM; n++) {
533 if ((disr>>1) & (1 << n)) {
536 WrCmd(CMD_SEL_EP_CLRI(n));
537 val = RdCmdDat(DAT_SEL_EP_CLRI(n));
540 if (val & EP_SEL_STP) {
542 USB_P_EP[0](USB_EVT_SETUP);
548 USB_P_EP[m](USB_EVT_OUT);
552 USB_P_EP[m](USB_EVT_IN);
566 uint32_t disr, val, n, m;
568 disr = LPC_USB->DevIntSt;
569 LPC_USB->DevIntClr = disr;
572 if (disr & DEV_STAT_INT) {
573 WrCmd(CMD_GET_DEV_STAT);
574 val = RdCmdDat(DAT_GET_DEV_STAT);
581 if (val & DEV_CON_CH) {
583 USB_Power_Event(val & DEV_CON);
586 if (val & DEV_SUS_CH) {
589 #if USB_SUSPEND_EVENT
604 if (disr & FRAME_INT) {
605 LPC_USB->DevIntClr = FRAME_INT;
615 if (disr & ERR_INT) {
616 WrCmd(CMD_RD_ERR_STAT);
617 val = RdCmdDat(DAT_RD_ERR_STAT);
618 USB_Error_Event(val);
623 if (disr & (0xFF<<1)) {
625 for (n = 0; n < USB_EP_NUM; n++) {
628 if ((disr>>1) & (1 << n)) {
631 WrCmd(CMD_SEL_EP_CLRI(n));
632 val = RdCmdDat(DAT_SEL_EP_CLRI(n));
635 if (val & EP_SEL_STP) {
637 USB_P_EP[0](USB_EVT_SETUP);
643 USB_P_EP[m](USB_EVT_OUT);
647 USB_P_EP[m](USB_EVT_IN);