Hi, I encounter a problem since 3 days with the RL- USB Host application. I try to acces to a memory stick through the USB PORT1 from the RDB4078 board (LPC4078 processor)
I modified the code from Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File to adapt it for the LPC4078
In the asm startup file (system_lpc407x_8x_177x_8x.s) I use 0x800 bytes for the Stack and for the Heap. In the C startup file (system_lpc407x_8x_177x_8x.s) I use the main oscillator (with a 12MHz crystal), the PLL0 multiplier value is 10 and the divider value 1 (the PLL0 output is 120MHz) The PLL1 multiplier is 4 and the PLL1 divider is 2, the PLL1 output is (48MHz) The USB clock is derived from the PLL1 and the divider value is 1 (=48MHz)
From usb_config.c, I use USB HOST 0 on OHCI mode and the class configuration is MSC From usbh_ohci_lpc177x_8x.c, the USB base address is 0x2008C000 (datasheet), the Root hub port is 1 (Port 1), the start address for USB data is 0x20000000 (peripheral SRAM)
My pins config function is :
BOOL usbh_ohci_hw_pins_config (BOOL on) { if (on) { /* Set pin functions */ LPC_IOCON->P0_29 = 1; /* USB_D+1 */ LPC_IOCON->P0_30 = 1; /* USB_D-1 */ LPC_IOCON->P1_18 = 1; /* USB_UP_LED1 */ LPC_IOCON->P1_19 = 2; /* !USB_PPWR1 */ LPC_IOCON->P1_22 = 2; /* USB_PWRD1 */ LPC_IOCON->P1_27 = 2; /* !USB_OVRCR1 */ } else { /* Reset pin functions */ LPC_IOCON->P1_18 = 0x30; LPC_IOCON->P1_19 = 0x30; LPC_IOCON->P1_22 = 0x30; LPC_IOCON->P1_27 = 0x30; LPC_IOCON->P0_29 = 0; LPC_IOCON->P0_30 = 0; } return (__TRUE); }
My USB init function is :
BOOL usbh_ohci_hw_init (BOOL on) { S32 tout; if (on) { usbh_ohci_hw_delay_ms (10); /* Calibrate delay */ /* Initialize memory pool for data */ if (!usbh_mem_init(0, (U32 *)&usbh_ohci_mpool, sizeof(usbh_ohci_mpool))) return (__FALSE); LPC_SC->PCONP |= (1UL << 31);/* Enable USB interface power/clock */ LPC_USB->OTGClkCtrl |= 0x19; /* Enable Host, OTG, AHB mster clk */ tout = 10100; while (!((LPC_USB->OTGClkSt & 0x19) == 0x19)) { /* Wait clock enable */ if (tout-- <= 100) { if (tout == 0) return (__FALSE); usbh_ohci_hw_delay_ms (10); /* Wait ~10 ms */ } } LPC_USB->StCtrl = 0x03; /* U1 = HOST */ NVIC_SetPriority (USB_IRQn, 0); /* Set USB interrupt highest priority */ } else { LPC_USB->StCtrl &= ~0x03; /* Deselect port function */ LPC_USB->OTGClkCtrl &= ~0x19; /* Disable Host,OTG, AHB mster clk*/ for (tout = 100; ; tout--) { if ((LPC_USB->OTGClkSt & 0x19) == 0)/* Wait for clocks disabled */ break; if (!tout) return (__FALSE); } LPC_SC->PCONP &= ~(1UL << 31);/* Disable USB interface power/clock */ } return (__TRUE); }
Where the host, OTG and AHB clock are enabled (by LPC_USB->OTGClkCtrl |= 0x19;) and USB1 is a host without using OTG (LPC_USB->StCtrl = 0x03;)
Finnally, my main program is something like this :
int main(void){ BOOL reslt; result = usbh_init(0); while(1){ usbh_engine(0); reslt = usbh_msc_status(0, 0); //(...) } }
the usbh_init(0); always returns true (as expected), and the usbh_msc_status(0, 0); always returns false (msc init failed) ..
What did I miss ? Thank you.
Hi, Personally I had to change the pins config in order to be able to use the library. I commented the line which config the overcurrent function (I haven't tried to make it work with this function yet). Hope this helps.
Okay... Even for me there's some problem with pins_config. I can now initialize OTG_HS but not OTG_FS. Have you faced this problem ever?
Sorry, I don't use the OTG function so I'm not able to help you for OTG initialization.