Dear Wolfgang, >> >> Signed-off-by: Vipin <vipin.ku...@st.com> >> --- >> common/main.c | 2 + >> drivers/serial/usbtty.h | 2 + >> drivers/usb/gadget/Makefile | 1 + >> drivers/usb/gadget/spr_udc.c | 996 >> +++++++++++++++++++++++++++++++++ >> include/asm-arm/arch-spear/spr_misc.h | 126 +++++ >> include/usb/spr_udc.h | 227 ++++++++ >> 6 files changed, 1354 insertions(+), 0 deletions(-) >> mode change 100644 => 100755 drivers/serial/usbtty.h >> mode change 100644 => 100755 drivers/usb/gadget/Makefile >> create mode 100755 drivers/usb/gadget/spr_udc.c >> create mode 100644 include/asm-arm/arch-spear/spr_misc.h >> create mode 100755 include/usb/spr_udc.h > > Please split into two patches: one with generic usbd driver, and the > second adding support for SPEAr. >
Ok. Accepted. patch-set v2 would contain the changes >> diff --git a/common/main.c b/common/main.c >> index 10d8904..79f3018 100644 >> --- a/common/main.c >> +++ b/common/main.c >> @@ -397,6 +397,7 @@ void main_loop (void) >> >> debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>"); >> >> +#if !defined(CONFIG_SPEAR_USBTTY) >> if (bootdelay >= 0 && s && !abortboot (bootdelay)) { >> # ifdef CONFIG_AUTOBOOT_KEYED >> int prev = disable_ctrlc(1); /* disable Control C checking >> */ >> @@ -413,6 +414,7 @@ void main_loop (void) >> disable_ctrlc(prev); /* restore Control C checking */ >> # endif >> } >> +# endif > > Why would this be needed? We also use u-boot as a firmware which runs on the board in a special mode in which the firmware fetches and burns images into NOR/NAND flashes. Under this mode, we would like to always jump to u-boot prompt. Also, the bootdelay variable should remain unchanged as we save default environment variables as well. > > >> diff --git a/drivers/usb/gadget/spr_udc.c b/drivers/usb/gadget/spr_udc.c >> new file mode 100755 >> index 0000000..5b135c7 >> --- /dev/null >> +++ b/drivers/usb/gadget/spr_udc.c > ... >> +/* Some kind of debugging output... */ >> +#if 1 >> +#define UDCDBG(str) >> +#define UDCDBGA(fmt, args...) >> +#else >> +#define UDCDBG(str) serial_printf(str "\n") >> +#define UDCDBGA(fmt, args...) serial_printf(fmt "\n", ##args) >> +#endif > > This looks wrong. Should that be a "#ifndef DEBUG" instead of "#if 1"? > > And cannot we use standard debug facilities? > Ok, changed to #ifndef DEBUG The standard debug facilities use printf and we also test and use this for usbtty feature. So, a serial_printf is required >> +static struct udc_endp_regs *const outep_regs_p = >> + &((struct udc_regs *const)CONFIG_SYS_USBD_BASE)->out_regs[0]; >> +static struct udc_endp_regs *const inep_regs_p = >> + &((struct udc_regs *const)CONFIG_SYS_USBD_BASE)->in_regs[0]; >> + >> +/* >> + * udc_state_transition - Write the next packet to TxFIFO. >> + * @initial: Initial state. >> + * @final: Final state. >> + * >> + * Helper function to implement device state changes. The device states and >> + * the events that transition between them are: >> + * >> + * STATE_ATTACHED >> + * || /\ >> + * \/ || >> + * DEVICE_HUB_CONFIGURED DEVICE_HUB_RESET >> + * || /\ >> + * \/ || >> + * STATE_POWERED >> + * || /\ >> + * \/ || >> + * DEVICE_RESET DEVICE_POWER_INTERRUPTION >> + * || /\ >> + * \/ || >> + * STATE_DEFAULT >> + * || /\ >> + * \/ || >> + * DEVICE_ADDRESS_ASSIGNED DEVICE_RESET >> + * || /\ >> + * \/ || >> + * STATE_ADDRESSED >> + * || /\ >> + * \/ || >> + * DEVICE_CONFIGURED DEVICE_DE_CONFIGURED >> + * || /\ >> + * \/ || >> + * STATE_CONFIGURED >> + * >> + * udc_state_transition transitions up (in the direction from STATE_ATTACHED >> + * to STATE_CONFIGURED) from the specified initial state to the specified >> final >> + * state, passing through each intermediate state on the way. If the initial >> + * state is at or above (i.e. nearer to STATE_CONFIGURED) the final state, >> then >> + * no state transitions will take place. >> + * >> + * udc_state_transition also transitions down (in the direction from >> + * STATE_CONFIGURED to STATE_ATTACHED) from the specified initial state to >> the >> + * specified final state, passing through each intermediate state on the >> way. >> + * If the initial state is at or below (i.e. nearer to STATE_ATTACHED) the >> final >> + * state, then no state transitions will take place. >> + * >> + * This function must only be called with interrupts disabled. >> + */ >> +static void udc_state_transition(usb_device_state_t initial, >> + usb_device_state_t final) > ... >> +/* Stall endpoint */ >> +static void udc_stall_ep(u32 ep_num) > ... >> +static void *get_fifo(int ep_num, int in) > ... >> +static short usbgetpckfromfifo(int epNum, u8 *bufp, u32 len) > ... >> +static void usbputpcktofifo(int epNum, u8 *bufp, u32 len) > ... > > So far this code looks pretty generic to me. No, this code is not generic. >> +/* >> + * spear_write_noniso_tx_fifo - Write the next packet to TxFIFO. >> + * @endpoint: Endpoint pointer. >> + * >> + * If the endpoint has an active tx_urb, then the next packet of data from >> the >> + * URB is written to the tx FIFO. The total amount of data in the urb is >> given >> + * by urb->actual_length. The maximum amount of data that can be sent in >> any >> + * one packet is given by endpoint->tx_packetSize. The number of data bytes >> + * from this URB that have already been transmitted is given by >> endpoint->sent. >> + * endpoint->last is updated by this routine with the number of data bytes >> + * transmitted in this packet. >> + * >> + */ >> +static void spear_write_noniso_tx_fifo(struct usb_endpoint_instance >> + *endpoint) > > Now her eit becomes clearly SPEAr-specific. Should this not be split > into separate source files to allow reuse of the common code by other > processors? > Again, all the code is spear specific. Probably, only the unction names are confusing >> + >> + /* This ensures that USBD packet fifo is accessed >> + :- through word aligned pointer or >> + :- through non word aligned pointer but only with a >> + max length to make the next packet word aligned */ > > Incorrect multiline comment style. > Ok. Corrected globally > Too long lines. > I assume line length of 80 is acceptable. Right? >> + /* This rx interrupt must be for a control write data >> + * stage packet. >> + * >> + * We don't support control write data stages. >> + * We should never end up here. >> + */ > > Incorrect multiline comment style. Please fix globally. Ok. Corrected globally > >> +struct misc_regs { > ... >> + u32 BIST5_RSLT_REG; /* 0x118 */ >> + u32 SYST_ERROR_REG; /* 0x11C */ > ... >> + u32 RAS_GPP1_IN; /* 0x8000 */ > > Variable names must be lower case. > Ok. Corrected globally Best Reagrds Vipin Kumar _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot