USB Device ROM Stack API example program
LPC1549のROM APIを使ったRAMディスクです。PCからはUSBメモリとして見えます。
参考:
http://docs.lpcware.com/usbromlib/v1.0/
usbd_LPC1549.c@0:ef2c0c52abc4, 2014-03-14 (annotated)
- Committer:
- va009039
- Date:
- Fri Mar 14 09:14:16 2014 +0000
- Revision:
- 0:ef2c0c52abc4
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:ef2c0c52abc4 | 1 | #include <rl_usb.h> |
va009039 | 0:ef2c0c52abc4 | 2 | #include <LPC15xx.h> |
va009039 | 0:ef2c0c52abc4 | 3 | |
va009039 | 0:ef2c0c52abc4 | 4 | /* |
va009039 | 0:ef2c0c52abc4 | 5 | * USB Device Initialize Function |
va009039 | 0:ef2c0c52abc4 | 6 | * Called by the User to initialize USB Device |
va009039 | 0:ef2c0c52abc4 | 7 | * Return Value: None |
va009039 | 0:ef2c0c52abc4 | 8 | */ |
va009039 | 0:ef2c0c52abc4 | 9 | |
va009039 | 0:ef2c0c52abc4 | 10 | void USBD_Init (void) |
va009039 | 0:ef2c0c52abc4 | 11 | { |
va009039 | 0:ef2c0c52abc4 | 12 | /* Set USB PLL input to main oscillator */ |
va009039 | 0:ef2c0c52abc4 | 13 | LPC_SYSCON->USBPLLCLKSEL = 0x01; |
va009039 | 0:ef2c0c52abc4 | 14 | /* Setup USB PLL (FCLKIN = 12MHz) * 4 = 48MHz |
va009039 | 0:ef2c0c52abc4 | 15 | MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2) |
va009039 | 0:ef2c0c52abc4 | 16 | FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz |
va009039 | 0:ef2c0c52abc4 | 17 | FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */ |
va009039 | 0:ef2c0c52abc4 | 18 | LPC_SYSCON->USBPLLCTRL = 3|(1<<6); |
va009039 | 0:ef2c0c52abc4 | 19 | |
va009039 | 0:ef2c0c52abc4 | 20 | /* Powerup USB PLL */ |
va009039 | 0:ef2c0c52abc4 | 21 | LPC_SYSCON->PDRUNCFG &= ~(1<<23); |
va009039 | 0:ef2c0c52abc4 | 22 | |
va009039 | 0:ef2c0c52abc4 | 23 | /* Wait for PLL to lock */ |
va009039 | 0:ef2c0c52abc4 | 24 | while(!(LPC_SYSCON->USBPLLSTAT&0x01)); |
va009039 | 0:ef2c0c52abc4 | 25 | |
va009039 | 0:ef2c0c52abc4 | 26 | /* enable USB main clock */ |
va009039 | 0:ef2c0c52abc4 | 27 | LPC_SYSCON->USBCLKSEL = 0x02; |
va009039 | 0:ef2c0c52abc4 | 28 | LPC_SYSCON->USBCLKDIV = 1; |
va009039 | 0:ef2c0c52abc4 | 29 | /* Enable AHB clock to the USB block. */ |
va009039 | 0:ef2c0c52abc4 | 30 | LPC_SYSCON->SYSAHBCLKCTRL1 |= (1<<23); |
va009039 | 0:ef2c0c52abc4 | 31 | /* power UP USB Phy */ |
va009039 | 0:ef2c0c52abc4 | 32 | LPC_SYSCON->PDRUNCFG &= ~(1<<9); |
va009039 | 0:ef2c0c52abc4 | 33 | /* Reset USB block */ |
va009039 | 0:ef2c0c52abc4 | 34 | LPC_SYSCON->PRESETCTRL1 |= (1<23); |
va009039 | 0:ef2c0c52abc4 | 35 | } |
va009039 | 0:ef2c0c52abc4 | 36 | |
va009039 | 0:ef2c0c52abc4 | 37 | /* |
va009039 | 0:ef2c0c52abc4 | 38 | * USB Device Connect Function |
va009039 | 0:ef2c0c52abc4 | 39 | * Called by the User to Connect/Disconnect USB Device |
va009039 | 0:ef2c0c52abc4 | 40 | * Parameters: con: Connect/Disconnect |
va009039 | 0:ef2c0c52abc4 | 41 | * Return Value: None |
va009039 | 0:ef2c0c52abc4 | 42 | */ |
va009039 | 0:ef2c0c52abc4 | 43 | |
va009039 | 0:ef2c0c52abc4 | 44 | void USBD_Connect(uint8_t con) |
va009039 | 0:ef2c0c52abc4 | 45 | { |
va009039 | 0:ef2c0c52abc4 | 46 | if (con) { |
va009039 | 0:ef2c0c52abc4 | 47 | NVIC_EnableIRQ(USB_IRQ_IRQn); |
va009039 | 0:ef2c0c52abc4 | 48 | } else { |
va009039 | 0:ef2c0c52abc4 | 49 | NVIC_DisableIRQ(USB_IRQ_IRQn); |
va009039 | 0:ef2c0c52abc4 | 50 | } |
va009039 | 0:ef2c0c52abc4 | 51 | } |
va009039 | 0:ef2c0c52abc4 | 52 | |
va009039 | 0:ef2c0c52abc4 | 53 | /* |
va009039 | 0:ef2c0c52abc4 | 54 | * USB Device Interrupt Service Routine |
va009039 | 0:ef2c0c52abc4 | 55 | */ |
va009039 | 0:ef2c0c52abc4 | 56 | |
va009039 | 0:ef2c0c52abc4 | 57 | void USB_IRQ_IRQHandler(void) { |
va009039 | 0:ef2c0c52abc4 | 58 | pUsbApi->hw->ISR(hUsb); |
va009039 | 0:ef2c0c52abc4 | 59 | } |