int main(void) {
clk_Config();
comm_USBInit();
...
}
void clk_Config(void) {
int i;
LPC_SYSCON->PDRUNCFG &= ~(1 << 5); // Power-up System Osc
LPC_SYSCON->SYSOSCCTRL = 0;// not bypassed
for (i = 0; i < 200; i++) Nop();
LPC_SYSCON->SYSPLLCLKSEL = 1; // system oscillator
LPC_SYSCON->SYSPLLCLKUEN = 1; // Update Clock Source
LPC_SYSCON->SYSPLLCLKUEN = 0; // Toggle Update Register
LPC_SYSCON->SYSPLLCLKUEN = 1;
while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01)); // Wait Until Updated
LPC_SYSCON->SYSPLLCTRL = 0; // (out = sys_osc*1)/1
LPC_SYSCON->PDRUNCFG &= ~(1 << 7); // Power-up SYSPLL
while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); // Wait Until PLL Locked
LPC_SYSCON->MAINCLKSEL = 3; // sys_pll_out 3.5.15
LPC_SYSCON->MAINCLKUEN = 1; // Update MCLK Clock Source
LPC_SYSCON->MAINCLKUEN = 0; // Toggle Update Register
LPC_SYSCON->MAINCLKUEN = 1;
while (!(LPC_SYSCON->MAINCLKUEN & 0x01)); // Wait Until Updated
SystemCoreClock = 12000000;
}
void comm_USBInit(void) {
volatile int n;
HidDevInfo.idVendor = USB_VENDOR_ID;
HidDevInfo.idProduct = USB_PRODUCT_ID;
HidDevInfo.bcdDevice = USB_DEVICE;
HidDevInfo.StrDescPtr = (uint32_t)&USB_StringDescriptor[0];
HidDevInfo.InReportCount = GET_PKT_NBYTES;
HidDevInfo.OutReportCount = SET_PKT_NBYTES;
HidDevInfo.SampleInterval = GET_PKT_INTERVAL_MS;
HidDevInfo.InReport = GetInReport;
HidDevInfo.OutReport = SetOutReport;
DeviceInfo.DevType = USB_DEVICE_CLASS_HUMAN_INTERFACE;
DeviceInfo.DevDetailPtr = (uint32_t)&HidDevInfo;
// Enable Timer32_1, IOCON, and USB blocks (for USB ROM driver)
LPC_SYSCON->SYSAHBCLKCTRL |= (EN_TIMER32_1 | EN_IOCON | EN_USBREG);
// Setup USB clock
LPC_SYSCON->PDRUNCFG &= ~(1 << 10); // usb phy powered
LPC_SYSCON->PDRUNCFG &= ~(1 << 8); // usb pll powered
LPC_SYSCON->USBPLLCLKSEL = 1; // system oscillator
LPC_SYSCON->USBPLLCLKUEN = 1; // Update pll clock Source
LPC_SYSCON->USBPLLCLKUEN = 0; // toggle
LPC_SYSCON->USBPLLCLKUEN = 1;
while (!(LPC_SYSCON->USBPLLCLKUEN & 0x01)); // Wait Until Updated
LPC_SYSCON->USBPLLCTRL = 3; // (sys_osc * 4)/ 1 3.5.5
while (!(LPC_SYSCON->USBPLLSTAT & 1)); // Wait Until PLL Locked
LPC_SYSCON->USBCLKSEL = 0; // Select USB PLL out 3.5.23
// Set USB pin functions
LPC_IOCON->PIO0_1 &= ~0x07;
LPC_IOCON->PIO0_1 |= 0x03; // usb ftoggle
LPC_IOCON->PIO0_3 &= ~0x1F;
LPC_IOCON->PIO0_3 |= 0x01; // usb vbus, no pullup/dn
LPC_IOCON->PIO0_6 &= ~0x07;
LPC_IOCON->PIO0_6 |= 0x01; // usb soft connect
gGetPktCntr = 0;
gSetPktCntr = 0;
// clock PLL and pin init function in rom
// unused
//(*rom)->pUSBD->init_clk_pins();
// insert a delay between clk init and usb init
for (n = 0; n < 75; n++) {}
(*rom)->pUSBD->init(&DeviceInfo);
(*rom)->pUSBD->connect(TRUE);
}
|