Datasheet

Table Of Contents
Figure 54. USB
analyser trace of the
dev_lowlevel USB
device example. The
control transfers are
the device
enumeration. The first
bulk OUT (out from the
host) transfer,
highlighted in blue, is
the host sending
"Hello World" to the
device. The second
bulk transfer IN (in to
the host), is the device
returning "Hello World"
to the host.
4.1.3.2.1. Device controller initialisation
The following code initialises the USB device.
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/pre_release/usb/device/dev_lowlevel/dev_lowlevel.c Lines 183 - 218
183 void usb_device_init() {
184 // Reset usb controller
185 reset_block(RESETS_RESET_USBCTRL_BITS);
186 unreset_block_wait(RESETS_RESET_USBCTRL_BITS);
187
188 // Clear any previous state in dpram just in case
189 memset(usb_dpram, 0, sizeof(*usb_dpram));
190
191 // Enable USB interrupt at processor
192 irq_enable(USBCTRL_IRQ, true);
193
194 // Mux the controller to the onboard usb phy
195 usb_hw->muxing = USB_USB_MUXING_TO_PHY_BITS | USB_USB_MUXING_SOFTCON_BITS;
196
197 // Force VBUS detect so the device thinks it is plugged into a host
198 usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS;
199
200 // Enable the USB controller in device mode.
201 usb_hw->main_ctrl = USB_MAIN_CTRL_CONTROLLER_EN_BITS;
202
203 // Enable an interrupt per EP0 transaction
204 usb_hw->sie_ctrl = USB_SIE_CTRL_EP0_INT_1BUF_BITS;
205
206 // Enable interrupts for when a buffer is done, when the bus is reset,
207 // and when a setup packet is recieved
208 usb_hw->inte = USB_INTS_BUFF_STATUS_BITS |
209 USB_INTS_BUS_RESET_BITS |
210 USB_INTS_SETUP_REQ_BITS;
211
212 // Set up endpoints (endpoint control registers)
213 // described by device configuration
214 usb_setup_endpoints();
215
RP2040 Datasheet
4.1. USB 392