1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/auto_init/usb/auto_init_usb.c
Gunar Schorcht af0eaa99ce sys/auto_init/usb: add a check for the number EPs
Since `auto_init_usb` provides a static auto configuration for a single USBUS stack instance using a single USB device, a static assert can be used here to check whether the number of EPs required by the configuration does not exceed the number of EPs provided by the USB device.
2023-03-13 12:58:33 +01:00

128 lines
3.6 KiB
C

/*
* Copyright (C) 2018 Koen Zandberg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup sys_auto_init
* @{
* @file
* @brief initializes USBUS, usb devices and handlers
*
* This auto initialization for USBUS is designed to cover the common use case
* of a single USB peripheral. An USBUS instance is started with USB function
* handlers based on which module is compiled in.
*
* If this doesn't suit your use case, a different initialization function can
* to be created based on this initialization sequence.
*
* @author Koen Zandberg <koen@bergzand.net>
* @}
*/
#define USB_H_USER_IS_RIOT_INTERNAL
#include <assert.h>
#include "usb/usbus.h"
#include "usb/usbus/control.h"
#ifdef MODULE_USBUS_CDC_ECM
#include "usb/usbus/cdc/ecm.h"
usbus_cdcecm_device_t cdcecm;
#endif
#ifdef MODULE_USBUS_CDC_ACM
#include "usb/usbus/cdc/acm.h"
#endif
#ifdef MODULE_USBUS_DFU
#include "usb/usbus/dfu.h"
static usbus_dfu_device_t dfu;
#endif
#ifdef MODULE_USBUS_HID
#include "usb/usbus/hid.h"
#endif
#ifdef MODULE_USBUS_MSC
#include "usb/usbus/msc.h"
static usbus_msc_device_t msc;
#endif
#ifndef MODULE_USBUS_CDC_ACM
#define USBUS_CDC_ACM_EP_IN_REQUIRED_NUMOF 0
#define USBUS_CDC_ACM_EP_OUT_REQUIRED_NUMOF 0
#endif
#ifndef MODULE_USBUS_CDC_ECM
#define USBUS_CDC_ECM_EP_IN_REQUIRED_NUMOF 0
#define USBUS_CDC_ECM_EP_OUT_REQUIRED_NUMOF 0
#endif
#ifndef MODULE_USBUS_HID
#define USBUS_HID_EP_IN_REQUIRED_NUMOF 0
#define USBUS_HID_EP_OUT_REQUIRED_NUMOF 0
#endif
#ifndef MODULE_USBUS_MSC
#define USBUS_MSC_EP_IN_REQUIRED_NUMOF 0
#define USBUS_MSC_EP_OUT_REQUIRED_NUMOF 0
#endif
#define USBUS_EP_IN_REQUIRED_NUMOF (USBUS_CONTROL_EP_IN_REQUIRED_NUMOF + \
USBUS_CDC_ACM_EP_IN_REQUIRED_NUMOF + \
USBUS_CDC_ECM_EP_IN_REQUIRED_NUMOF + \
USBUS_HID_EP_IN_REQUIRED_NUMOF + \
USBUS_MSC_EP_IN_REQUIRED_NUMOF)
#define USBUS_EP_OUT_REQUIRED_NUMOF (USBUS_CONTROL_EP_OUT_REQUIRED_NUMOF + \
USBUS_CDC_ACM_EP_OUT_REQUIRED_NUMOF + \
USBUS_CDC_ECM_EP_OUT_REQUIRED_NUMOF + \
USBUS_HID_EP_OUT_REQUIRED_NUMOF + \
USBUS_MSC_EP_OUT_REQUIRED_NUMOF)
static_assert(USBUS_EP_IN_REQUIRED_NUMOF <= USBDEV_NUM_ENDPOINTS,
"Number of required IN endpoints exceeded");
static_assert(USBUS_EP_OUT_REQUIRED_NUMOF <= USBDEV_NUM_ENDPOINTS,
"Number of required OUT endpoints exceeded");
static char _stack[USBUS_STACKSIZE];
static usbus_t usbus;
void auto_init_usb(void)
{
/* Get driver context */
usbdev_t *usbdev = usbdev_get_ctx(0);
assert(usbdev);
/* Initialize basic usbus struct, don't start the thread yet */
usbus_init(&usbus, usbdev);
/* USBUS function handlers initialization */
#ifdef MODULE_STDIO_CDC_ACM
void usb_cdc_acm_stdio_init(usbus_t *usbus);
usb_cdc_acm_stdio_init(&usbus);
#endif
#ifdef MODULE_USBUS_CDC_ECM
usbus_cdcecm_init(&usbus, &cdcecm);
#endif
#ifdef MODULE_USBUS_DFU
usbus_dfu_init(&usbus, &dfu, USB_DFU_PROTOCOL_RUNTIME_MODE);
#endif
#ifdef MODULE_USBUS_MSC
/* Initialize Mass Storage Class */
usbus_msc_init(&usbus, &msc);
#endif
/* Finally initialize USBUS thread */
usbus_create(_stack, USBUS_STACKSIZE, USBUS_PRIO, USBUS_TNAME, &usbus);
}
usbus_t *usbus_auto_init_get(void)
{
return &usbus;
}