Commit 68cb7b3e authored by Paweł Zadrożniak's avatar Paweł Zadrożniak Committed by Carles Cufi
Browse files

drivers: usb: Add nRF52840 USBD driver



* Add usbd_dc_nrfx shim

The shim is based on the previous one usbd_dc_nrf5.
For handling the USBD hardware, tested nrfx_usbd driver from nRF SDK
was used.

Briefly tested examples:
* usb/cdc_acm
* usb/dfu (USB communication only due to flash handling issues)
* usb/hid-mouse
* bluetooth/hci_usb

Signed-off-by: default avatarPaweł Zadrożniak <pawel.zadrozniak@nordicsemi.no>
parent 0a3f6f0a
Loading
Loading
Loading
Loading
+6 −54
Original line number Diff line number Diff line
@@ -261,9 +261,9 @@ lf_already_started:
#if defined(CONFIG_USB) && defined(CONFIG_SOC_NRF52840)
static inline void power_event_cb(nrf_power_event_t event)
{
	extern void nrf5_usbd_power_event_callback(nrf_power_event_t event);
	extern void usb_dc_nrfx_power_event_callback(nrf_power_event_t event);

	nrf5_usbd_power_event_callback(event);
	usb_dc_nrfx_power_event_callback(event);
}
#endif

@@ -414,70 +414,22 @@ DEVICE_AND_API_INIT(clock_nrf5_k32src,
		    &_k32src_clock_control_api);

#if defined(CONFIG_USB) && defined(CONFIG_SOC_NRF52840)
static void power_int_enable(bool enable)

void nrf5_power_usb_power_int_enable(bool enable)
{
	u32_t mask;


	mask = NRF_POWER_INT_USBDETECTED_MASK |
	       NRF_POWER_INT_USBREMOVED_MASK |
	       NRF_POWER_INT_USBPWRRDY_MASK;

	if (enable) {
		nrf_power_int_enable(mask);
		irq_enable(POWER_CLOCK_IRQn);
	} else {
		nrf_power_int_disable(mask);
	}
}

static bool usbregstatus_vbusdet_get(void)
{
	return nrf_power_usbregstatus_vbusdet_get();
}

static bool usbregstatus_outrdy_get(void)
{
	return nrf_power_usbregstatus_outrdy_get();
}

static const struct usbd_power_nrf5_api usbd_power_api = {
	.usb_power_int_enable = power_int_enable,
	.vbusdet_get = usbregstatus_vbusdet_get,
	.outrdy_get = usbregstatus_outrdy_get,
};

static int usbd_power_init(struct device *dev)
{
	irq_enable(POWER_CLOCK_IRQn);

	return 0;
}

void nrf5_power_usb_power_int_enable(struct device *dev, bool enable)
{
	const struct usbd_power_nrf5_api *api = dev->driver_api;

	api->usb_power_int_enable(enable);
}

bool nrf5_power_clock_usb_vbusdet(struct device *dev)
{
	const struct usbd_power_nrf5_api *api = dev->driver_api;

	return api->vbusdet_get();
}

bool nrf5_power_clock_usb_outrdy(struct device *dev)
{
	const struct usbd_power_nrf5_api *api = dev->driver_api;

	return api->outrdy_get();
}

DEVICE_AND_API_INIT(usbd_power_nrf5,
		    CONFIG_USBD_NRF5_NAME,
		    usbd_power_init,
		    NULL, NULL,
		    PRE_KERNEL_2,
		    CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
		    &usbd_power_api);
#endif
+1 −1
Original line number Diff line number Diff line
zephyr_sources_ifdef(CONFIG_USB_DW       usb_dc_dw.c)
zephyr_sources_ifdef(CONFIG_USB_DC_STM32 usb_dc_stm32.c)
zephyr_sources_ifdef(CONFIG_USB_DC_SAM0  usb_dc_sam0.c)
zephyr_sources_ifdef(CONFIG_USB_NRF52840 usb_dc_nrf5.c)
zephyr_sources_ifdef(CONFIG_USB_NRF52840 usb_dc_nrfx.c)
zephyr_sources_ifdef(CONFIG_USB_KINETIS  usb_dc_kinetis.c)
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ config USB_NRF52840
	depends on SOC_NRF52840
	select USB_DEVICE_DRIVER
	select HAS_DTS_USB
	select NRFX_USBD
	help
	  nRF52840 USB Device Controller Driver

+1557 −0

File changed and moved.

Preview size limit exceeded, changes collapsed.

+1 −9
Original line number Diff line number Diff line
@@ -48,15 +48,7 @@
#endif

#if defined(CONFIG_USB) && defined(CONFIG_SOC_NRF52840)
struct usbd_power_nrf5_api {
	void (*usb_power_int_enable)(bool enable);
	bool (*vbusdet_get)(void);
	bool (*outrdy_get)(void);
};

void nrf5_power_usb_power_int_enable(struct device *dev, bool enable);
bool nrf5_power_clock_usb_vbusdet(struct device *dev);
bool nrf5_power_clock_usb_outrdy(struct device *dev);
void nrf5_power_usb_power_int_enable(bool enable);
#endif

#endif /* ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF5_CLOCK_CONTROL_H_ */
Loading